Document array-valued local variables (statevar type=array with
elem/sizing/capacity), the value-polymorphic expression engine and array
functions, the array.* mutation nodes, accumulate/export unification, and
index-aligned CSV export in TECHNICAL_SPEC §3.8. Note in TODO that panel-logic
(Phase 1) array support is complete while the server-side control-logic port
(Phase 2) remains pending.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- PlotWidget: 1-D array values (local vars + EPICS waveforms) are
routed through the waveform rendering path regardless of configured
plotType; nested 2-D arrays are skipped gracefully. effectivePlotType
switches to 'waveform' whenever any waveforms[] slot is populated.
- TableWidget: new sourceMode:'array' option renders one <tr> per array
element (index in 'name' col, formatted value in 'value' col). For
2-D (elem:'array') rows, colIndices option maps column positions to
inner-array positions. Scalar/multi-signal mode unchanged.
- MultiLed: new sourceMode:'array' option (or auto-detect when value is
already an array) renders one LED per element with live-length tracking;
elem truthiness controls lit state; per-element label/color overrides
supported; meta.elem==='bool' awareness noted in code.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- LocalVars: add array type option with elem/sizing/capacity sub-fields
and JSON literal initial value with inline parse validation
- Palette + KIND_LABEL: register action.array.push/set/remove/pop/clear
- Inspector: array-node cases with array-local select, index and expr fields
- nodeLabel: compact summaries for all five array node kinds
- flowDebug: export fmtBadge() for compact array display [a,b,c,…](n=N);
formatBadge now delegates to fmtBadge for numbers and arrays
- EditMode: wrap both initLocalState calls with ensureArrayDecls so
array locals referenced only by logic nodes are auto-declared in preview
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add five action.array.push|set|remove|pop|clear node kinds; replace the
legacy {t,v} in-memory arrays store with array locals as single source of
truth; alias action.accumulate→push and action.clear→array.clear for
backward compat; rewrite action.export as index-aligned CSV with custom
header labels; add ensureArrayDecls() auto-declare migration wired via
Canvas.tsx so undeclared arrays referenced by logic nodes are initialised.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix redundant double-evaluation of n.a in the 'index' case by extracting
to a local const before use in both idx() call and array indexing.
- Add explicit <number> type argument to reduce() calls in sum and mean
functions to fix TypeScript TS2345 accumulator type error: the inferred
ArrVal union type was not compatible with numeric addition.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Approved design for first-class array-valued local variables across the
panel-logic (TS) and control-logic (Go) engines: array StateVar declarations
(dynamic/capped/fixed sizing), an array-aware expression language shared by
both engines, sizing-policy-aware mutation nodes (unifying the existing
accumulate/export/clear arrays), persistence, and widget binding.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add .gitignore rules for SQLite WAL/SHM sidecars, coverage output, and
the dev workspace/data storage dir (keeping the demo.xml/epics_test.xml
fixtures), completing the runtime-artifact cleanup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Untrack generated runtime state under workspace/data (SQLite audit db +
WAL/SHM, config/control-logic/synthetic versions, trash, acl) plus dev
logs and iocsh history; these are regenerated on each run. Curated
fixtures (demo.xml, epics_test.xml, the EPICS test IOC db, run.sh,
st.cmd) stay tracked. Extend .gitignore so they don't return.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds full array/waveform support through the synthetic DSP engine: a
dsp.Sample value model (scalar or []float64), array ops (index, slice,
sum, mean, min, max, length, fft) with an in-tree radix-2 FFT, and static
type propagation (OpOutputType) that the editor mirrors to colour wires by
data type and flag invalid wirings. Stateful filters and lua stay
scalar-only. Adds a waveform plot mode (x-vs-index trace).
Also: errored-node hover reasons, S/N add-signal/add-node HUD shortcuts in
the synthetic editor, and view-mode widgets that blend with the canvas
background (chrome kept in edit mode).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extend the panel logic editor with two capabilities:
- action.widget: drive a panel widget by id from a flow — enable/disable,
show/hide, and (for plot widgets) clear, pause, or resume the live plot.
Wired via a per-widget command store consumed by a Canvas WidgetView wrapper
(disable overlay / hide) and PlotWidget (pause/clear), reset on panel unmount.
- action.export now emits multiple named arrays as CSV columns with per-column
labels and an alignment mode (common/any/interpolate); dialogs support asking
for and displaying multiple values per dialog.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Introduce server-side control-logic flow graphs (cron/alarm triggers,
Lua blocks) with CRUD endpoints, panel-logic lifecycle triggers and
user-interaction dialog nodes, and a synthetic node-graph editor.
Add an optional logic-editor allowlist (server.logic_editors) gating who
may add/edit panel logic and control logic, surfaced via /api/v1/me and
enforced in the API; hide logic affordances in the UI accordingly.
Update README, example config, and functional/technical specs to cover
all current features (plot panels, panel/control logic, local variables,
access control) and refresh the in-app manual and contextual help.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>