Resource Source

Shipping
resource_source

Reference any workspace resource by handle, optionally narrowed to one column

Signature

Outputs

  • dataAnyThe referenced resource verbatim, or a single extracted column (Signal for numeric, single-column DataFrame for text).

Description

Resource Source is a terminal input node that references any entry in the workspace MEMORY_REGISTRY by a runtime handle id and re-emits it on its single data output. It is the generic cousin of signal_source: where signal_source forwards a registered handle verbatim, Resource Source adds an optional column selector so a user can drop just one column of a Table / DataFrame (or any tabularizable variant) onto the canvas and get a ready-to-use Signal — without first wiring a DataFrame → column-extraction chain.

The node does not generate data; it references an existing registry entry. One resource keeps one handle and one editable name no matter how many graphs reference it, so the registry stays the single source of truth. Both bindings are runtime bindings set by the Explorer drop / inspector, not user-facing schema — the node therefore declares no ParamSpecs (mirroring signal_source, audio_source, hardware_source). resource_handle_id is the registry UUID to forward (authored in Dart as resourceHandleId; the camel/snake lookup resolves either spelling), and column is an optional 0-based index or column name.

With column empty the whole resource is forwarded verbatim — only an Arc refcount bump for collection variants, exactly like signal_source. With column set, the resource is tabularized (works for Table, DataFrame, Signal, Matrix, …) and that single column is re-emitted: a numeric column becomes a Signal whose values are plotted against the row index (a uniform ramp at sample rate 1), while a text column becomes a single-column DataFrame so the labels survive losslessly.

Resolution is fault-tolerant: a handle that is unset or no longer in the registry yields an empty Signal rather than an error, matching every other idle source. A column that cannot be resolved, however, is a genuine authoring mistake and surfaces as a Backend exec error. The node is stateless — any apparent state lives in the referenced registry slot, not in the node.

Examples

Drop a whole table onto the canvas

Drag a workspace DataFrame from the Explorer onto the canvas: the resulting Resource Source binds its resource_handle_id and, with column empty, forwards the entire DataFrame verbatim to data — units, columns, and row count intact.

Extract one numeric column as a Signal

For a DataFrame with columns t, v [V], set column = v (or column = 1). Resource Source tabularizes the frame and re-emits column v as a Signal of values [10, 20, 30] in unit V, timestamped against the row index [0, 1, 2].

Text column stays a table

Selecting a string column (e.g. column = 0 on a label column of ["a", "b"]) returns a single-column DataFrame rather than a Signal, so the text labels are preserved instead of being coerced to numbers.

Applications

  • Dropping a single column of a captured/imported table onto the canvas as a Signal without building an extraction chain.
  • Referencing a shared workspace resource (Table, DataFrame, Matrix) across multiple graphs by one stable handle and name.
  • Bridging an imported file (via file_import's registry upsert) into a node graph by picking exactly the column you need.
  • Building parameterizable dashboards where rebinding one handle repoints many resource sources at different workspace entries.

Neat

The `column` selector accepts an index *or* a name interchangeably, and tabularizes any variant first — so it works uniformly on Tables, DataFrames, Signals, and Matrices.

Numeric columns become Signals plotted against a synthetic 0,1,2,… row-index axis, while text columns are kept as a single-column DataFrame so labels never get destroyed by numeric coercion.

Like the other registry sources it has empty param_specs: both the handle id and column are runtime bindings from the Explorer drop, so two identical-looking nodes can reference entirely different data.

Handle resolution accepts both the camelCase authoring spelling (resourceHandleId) and snake_case, so Dart-authored and engine-side ids both resolve.

Known issues

An unset or stale handle silently yields an empty Signal instead of an error, so a broken reference produces no output rather than a diagnostic — verify the binding if a chain is unexpectedly empty.

An unresolvable `column` (bad index or name) is a hard Backend error, unlike the tolerant handle behavior — the two failure modes differ.

Extracted numeric columns are timestamped against the row index at sample rate 1, not any real time axis, so downstream time-based nodes see a unit-index ramp, not seconds.

See also

sourceworkspaceregistryhandlecolumndataframeio