The signal-tree pane (edit mode) has its own inline "add local variable"
form, separate from the Logic-tab LocalVars form that gained array support
in the array-locals feature. This second entry point was missed, so the
type dropdown there only offered number/bool/string. Mirror the LogicEditor
form: add the array type option plus elem/sizing/capacity selects and a
JSON-validated initial value.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
subscribeRefs() walked node kinds to build the signal subscription set but
omitted the new action.array.push/set/remove nodes. Signal or local-var
references in their expr/index params were never subscribed, so the live
cache held no value and they resolved to NaN at run time (action.accumulate
was handled, its modern equivalent action.array.push was not). Add the
missing cases, including the comma-split index list for array.set.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>