@xenolithengine/graph-plugin-runtime 0.7.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -0
  3. package/dist/editor/output-widget.d.ts +3 -0
  4. package/dist/editor/output-widget.d.ts.map +1 -0
  5. package/dist/editor/output-widget.js +43 -0
  6. package/dist/editor/output-widget.js.map +1 -0
  7. package/dist/editor/plugin.d.ts +3 -0
  8. package/dist/editor/plugin.d.ts.map +1 -0
  9. package/dist/editor/plugin.js +115 -0
  10. package/dist/editor/plugin.js.map +1 -0
  11. package/dist/editor/runtime-bridge.d.ts +6 -0
  12. package/dist/editor/runtime-bridge.d.ts.map +1 -0
  13. package/dist/editor/runtime-bridge.js +24 -0
  14. package/dist/editor/runtime-bridge.js.map +1 -0
  15. package/dist/editor/schema-sync.d.ts +28 -0
  16. package/dist/editor/schema-sync.d.ts.map +1 -0
  17. package/dist/editor/schema-sync.js +70 -0
  18. package/dist/editor/schema-sync.js.map +1 -0
  19. package/dist/editor/schemas.d.ts +28 -0
  20. package/dist/editor/schemas.d.ts.map +1 -0
  21. package/dist/editor/schemas.js +205 -0
  22. package/dist/editor/schemas.js.map +1 -0
  23. package/dist/editor/struct-widget.d.ts +37 -0
  24. package/dist/editor/struct-widget.d.ts.map +1 -0
  25. package/dist/editor/struct-widget.js +242 -0
  26. package/dist/editor/struct-widget.js.map +1 -0
  27. package/dist/index.d.ts +16 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +13 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/model/allocate-graph.d.ts +57 -0
  32. package/dist/model/allocate-graph.d.ts.map +1 -0
  33. package/dist/model/allocate-graph.js +209 -0
  34. package/dist/model/allocate-graph.js.map +1 -0
  35. package/dist/model/allocate.d.ts +3 -0
  36. package/dist/model/allocate.d.ts.map +1 -0
  37. package/dist/model/allocate.js +47 -0
  38. package/dist/model/allocate.js.map +1 -0
  39. package/dist/model/mandelbrot-graph.d.ts +8 -0
  40. package/dist/model/mandelbrot-graph.d.ts.map +1 -0
  41. package/dist/model/mandelbrot-graph.js +146 -0
  42. package/dist/model/mandelbrot-graph.js.map +1 -0
  43. package/dist/model/spawn-graph.d.ts +31 -0
  44. package/dist/model/spawn-graph.d.ts.map +1 -0
  45. package/dist/model/spawn-graph.js +117 -0
  46. package/dist/model/spawn-graph.js.map +1 -0
  47. package/dist/vm/codegen.d.ts +12 -0
  48. package/dist/vm/codegen.d.ts.map +1 -0
  49. package/dist/vm/codegen.js +303 -0
  50. package/dist/vm/codegen.js.map +1 -0
  51. package/dist/vm/collection.d.ts +8 -0
  52. package/dist/vm/collection.d.ts.map +1 -0
  53. package/dist/vm/collection.js +129 -0
  54. package/dist/vm/collection.js.map +1 -0
  55. package/dist/vm/compiler.bench.d.ts +2 -0
  56. package/dist/vm/compiler.bench.d.ts.map +1 -0
  57. package/dist/vm/compiler.bench.js +35 -0
  58. package/dist/vm/compiler.bench.js.map +1 -0
  59. package/dist/vm/compiler.d.ts +14 -0
  60. package/dist/vm/compiler.d.ts.map +1 -0
  61. package/dist/vm/compiler.js +190 -0
  62. package/dist/vm/compiler.js.map +1 -0
  63. package/dist/vm/interpreter.d.ts +87 -0
  64. package/dist/vm/interpreter.d.ts.map +1 -0
  65. package/dist/vm/interpreter.js +155 -0
  66. package/dist/vm/interpreter.js.map +1 -0
  67. package/dist/vm/primitives.d.ts +4 -0
  68. package/dist/vm/primitives.d.ts.map +1 -0
  69. package/dist/vm/primitives.js +436 -0
  70. package/dist/vm/primitives.js.map +1 -0
  71. package/dist/vm/value.d.ts +7 -0
  72. package/dist/vm/value.d.ts.map +1 -0
  73. package/dist/vm/value.js +28 -0
  74. package/dist/vm/value.js.map +1 -0
  75. package/dist/vm/wasm-codegen.bench.d.ts +2 -0
  76. package/dist/vm/wasm-codegen.bench.d.ts.map +1 -0
  77. package/dist/vm/wasm-codegen.bench.js +81 -0
  78. package/dist/vm/wasm-codegen.bench.js.map +1 -0
  79. package/dist/vm/wasm-codegen.d.ts +12 -0
  80. package/dist/vm/wasm-codegen.d.ts.map +1 -0
  81. package/dist/vm/wasm-codegen.js +352 -0
  82. package/dist/vm/wasm-codegen.js.map +1 -0
  83. package/package.json +57 -0
@@ -0,0 +1,155 @@
1
+ // Headless interpreter for a Blueprint-style graph. Editor-agnostic: it consumes plain node/edge
2
+ // shapes (which core's Node/Edge satisfy structurally), so it unit-tests without PIXI or the editor.
3
+ //
4
+ // Pins are addressed BY INDEX (position among same-kind/direction pins), never by id — because the
5
+ // editor mints fresh pin ids when instantiating from a schema, so a node dropped from the palette
6
+ // has unpredictable ids. Edges still connect by pin id; the evaluator just maps "i-th input" → that
7
+ // pin's id → the incident edge.
8
+ //
9
+ // Execution model (UE K2):
10
+ // • DATA pins pulled lazily — pure subgraphs evaluated on demand (pure = no exec pins).
11
+ // • EXEC pins pushed from a `Tick` node along single exec wires (Branch picks, Sequence fires in
12
+ // order, ForEach runs a body per element then a completed wire).
13
+ // • STATE in `variables`, persisting across ticks — the ONLY cross-tick memory, so the data graph
14
+ // stays acyclic (feedback = read a var early, write it late). No graph cycles needed.
15
+ const MAX_PULL_DEPTH = 100_000;
16
+ const dataIns = (n) => n.pins.filter((p) => p.kind === 'data' && p.direction === 'in');
17
+ const dataOuts = (n) => n.pins.filter((p) => p.kind === 'data' && p.direction === 'out');
18
+ const execOuts = (n) => n.pins.filter((p) => p.kind === 'exec' && p.direction === 'out');
19
+ export class Runtime {
20
+ #defs;
21
+ #vars = new Map();
22
+ // Cross-tick latched exec-out values: an exec node's `setOutput(i, v)` survives to the NEXT tick
23
+ // so a pure-pull that reaches an exec node before its `run` has fired this tick returns the prior
24
+ // value rather than `undefined`. This is what makes feedback loops (e.g. `Scatter.oN → Struct.priority`)
25
+ // actually carry the previous tick's value into the next tick instead of always zero.
26
+ #latchedOutputs = new Map(); // `${node}:${dataOutIndex}` → last value
27
+ // Listeners fired after every `tick()` returns — used by the editor-bridge to mirror Output
28
+ // node values into widget state without each host having to re-write that loop.
29
+ #afterTickListeners = new Set();
30
+ #currentNodes = []; // the node set for the in-flight tick (for io.nodes())
31
+ constructor(defs) {
32
+ this.#defs = new Map(defs.map((d) => [d.type, d]));
33
+ }
34
+ getVar(name) { return this.#vars.get(name); }
35
+ setVar(name, value) { this.#vars.set(name, value); }
36
+ get variables() { return this.#vars; }
37
+ /** Subscribe to a "tick just finished" callback. Receives the same graph the tick ran on, so
38
+ * bridges (e.g. the editor's Output-widget mirror) can iterate nodes and read fresh VM vars
39
+ * without each host writing the same loop themselves. Returns an unsubscribe. */
40
+ onAfterTick(cb) {
41
+ this.#afterTickListeners.add(cb);
42
+ return () => { this.#afterTickListeners.delete(cb); };
43
+ }
44
+ /** Run one step: fire every entry node of `entryType` (default `Tick`) and walk the exec graph.
45
+ * Variables persist; per-tick output overrides are fresh. Use `entryType: 'Init'` once at start
46
+ * to run a construction flow that seeds variables. */
47
+ tick(graph, entryType = 'Tick') {
48
+ this.#currentNodes = graph.nodes;
49
+ const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));
50
+ const incoming = new Map();
51
+ const incomingAll = new Map(); // pin -> every source (multiple)
52
+ const execTarget = new Map(); // `${node}:${outPinId}` -> target node id
53
+ for (const e of graph.edges) {
54
+ const key = `${e.to.node}:${e.to.pin}`;
55
+ if (!incoming.has(key))
56
+ incoming.set(key, e.from);
57
+ (incomingAll.get(key) ?? incomingAll.set(key, []).get(key)).push(e.from);
58
+ execTarget.set(`${e.from.node}:${e.from.pin}`, e.to.node);
59
+ }
60
+ const overrides = new Map(); // `${node}:${dataOutIndex}` -> latched value
61
+ // Pull the value on a node's data-out (by output index): an override set this tick, else the
62
+ // node's pure evaluator, else its latched output from the PREVIOUS tick (for feedback loops).
63
+ const pullOut = (nodeId, outIndex, depth) => {
64
+ const key = `${nodeId}:${outIndex}`;
65
+ if (overrides.has(key))
66
+ return overrides.get(key);
67
+ if (depth > MAX_PULL_DEPTH)
68
+ throw new Error('Runtime: pure-pull depth exceeded (cycle?)');
69
+ const node = nodeById.get(nodeId);
70
+ if (!node)
71
+ return undefined;
72
+ const def = this.#defs.get(node.type);
73
+ if (def?.evalPure)
74
+ return def.evalPure(this.#pureIO(node, resolveInput, resolveInputAll, depth + 1))[outIndex];
75
+ // Source nodes without an evaluator (e.g. domain `Agent`/`Goodie`) expose their own `state`
76
+ // record on every data-out pin — lets a wire from `Agent.self` carry the agent's record.
77
+ if (!def && node.state)
78
+ return node.state;
79
+ // Exec nodes haven't fired yet this tick — return last tick's latched value (feedback path).
80
+ return this.#latchedOutputs.get(key);
81
+ };
82
+ const pullSrc = (src, depth) => {
83
+ const srcNode = nodeById.get(src.node);
84
+ if (!srcNode)
85
+ return undefined;
86
+ const outIndex = dataOuts(srcNode).findIndex((p) => p.id === src.pin);
87
+ return outIndex >= 0 ? pullOut(src.node, outIndex, depth) : undefined;
88
+ };
89
+ const resolveInput = (node, index, depth) => {
90
+ const pin = dataIns(node)[index];
91
+ if (!pin)
92
+ return undefined;
93
+ const src = incoming.get(`${node.id}:${pin.id}`);
94
+ return src ? pullSrc(src, depth) : pin.default;
95
+ };
96
+ const resolveInputAll = (node, index, depth) => {
97
+ const pin = dataIns(node)[index];
98
+ if (!pin)
99
+ return [];
100
+ const srcs = incomingAll.get(`${node.id}:${pin.id}`) ?? [];
101
+ return srcs.map((s) => pullSrc(s, depth)).filter((v) => v !== undefined);
102
+ };
103
+ const runExec = (nodeId) => {
104
+ const node = nodeById.get(nodeId);
105
+ const def = node && this.#defs.get(node.type);
106
+ if (!node || !def?.run)
107
+ return;
108
+ def.run({
109
+ ...this.#pureIO(node, resolveInput, resolveInputAll, 0),
110
+ setVar: (name, value) => this.#vars.set(name, value),
111
+ setOutput: (index, value) => overrides.set(`${node.id}:${index}`, value),
112
+ flow: (execOutIndex) => {
113
+ const pin = execOuts(node)[execOutIndex];
114
+ const target = pin && execTarget.get(`${node.id}:${pin.id}`);
115
+ if (target)
116
+ runExec(target);
117
+ },
118
+ });
119
+ };
120
+ // Pre-tick pass: fire `onTickBegin` for every node whose def declares one. Used by `Local` to
121
+ // reset its var slot to `state.initial` before any exec entry runs.
122
+ for (const node of graph.nodes) {
123
+ const def = this.#defs.get(node.type);
124
+ if (!def?.onTickBegin)
125
+ continue;
126
+ def.onTickBegin({
127
+ ...this.#pureIO(node, resolveInput, resolveInputAll, 0),
128
+ setVar: (name, value) => this.#vars.set(name, value),
129
+ setOutput: () => { },
130
+ flow: () => { },
131
+ });
132
+ }
133
+ for (const node of graph.nodes)
134
+ if (node.type === entryType)
135
+ runExec(node.id);
136
+ // Latch this tick's exec outputs so the NEXT tick's pure-pulls see them when reaching an exec
137
+ // node before its run fires (feedback loops). Keep growing — stale ids for nodes no longer
138
+ // in the graph don't hurt correctness (pullOut only queries them when wires still reference).
139
+ for (const [k, v] of overrides)
140
+ this.#latchedOutputs.set(k, v);
141
+ for (const cb of this.#afterTickListeners)
142
+ cb(graph);
143
+ }
144
+ #pureIO(node, resolveInput, resolveInputAll, depth) {
145
+ return {
146
+ node,
147
+ input: (index) => resolveInput(node, index, depth),
148
+ inputAll: (index) => resolveInputAll(node, index, depth),
149
+ state: (key) => node.state?.[key],
150
+ getVar: (name) => this.#vars.get(name),
151
+ nodes: () => this.#currentNodes,
152
+ };
153
+ }
154
+ }
155
+ //# sourceMappingURL=interpreter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpreter.js","sourceRoot":"","sources":["../../src/vm/interpreter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { NodeDef } from './interpreter.js';
2
+ /** The starter primitive set. */
3
+ export declare const BUILTIN_PRIMITIVES: NodeDef[];
4
+ //# sourceMappingURL=primitives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/vm/primitives.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAkb/C,iCAAiC;AACjC,eAAO,MAAM,kBAAkB,EAAE,OAAO,EAIvC,CAAA"}
@@ -0,0 +1,436 @@
1
+ // Tier-1 primitives (a starter subset of the UE-K2 vocabulary). Pins are addressed BY INDEX (see
2
+ // interpreter.ts), so the declared pin ORDER in a node's schema is the contract. Domain verbs
3
+ // (Allocate, …) are composed from these — they are NOT bespoke nodes.
4
+ import { asArray, asBool, asNumber } from './value.js';
5
+ // --- exec flow ---------------------------------------------------------------------------------
6
+ /** Entry point. The interpreter fires every Tick node each step; it just kicks the exec wire. */
7
+ const Tick = { type: 'Tick', run: (io) => io.flow(0) };
8
+ /** Construction entry — fired ONCE via `runtime.tick(graph, 'Init')` to seed variables before the
9
+ * first Tick. Identical shape to Tick; separate type so the host can run a one-off init flow. */
10
+ const Init = { type: 'Init', run: (io) => io.flow(0) };
11
+ /** Fractional spawner: input 0 = array of {type, rate}; emits an array of type-strings this tick by
12
+ * accumulating each rate and emitting one unit per whole crossed (0.1 ⇒ ~1 every 10 ticks). Keeps a
13
+ * per-node accumulator in a VM variable keyed by node id (Spawn is stateful across ticks). */
14
+ const Spawn = {
15
+ type: 'Spawn',
16
+ run: (io) => {
17
+ const specs = asArray(io.input(0));
18
+ const accKey = `__spawn:${io.node.id}`;
19
+ const acc = io.getVar(accKey) ?? {};
20
+ const out = [];
21
+ for (const s of specs) {
22
+ let a = (acc[s.type] ?? 0) + asNumber(s.rate);
23
+ while (a >= 1) {
24
+ out.push(s.type);
25
+ a -= 1;
26
+ }
27
+ acc[s.type] = a;
28
+ }
29
+ io.setVar(accKey, acc);
30
+ io.setOutput(0, out);
31
+ io.flow(0);
32
+ },
33
+ };
34
+ /** Fire each exec out-pin in declared order (then0, then1, …). */
35
+ const Sequence = {
36
+ type: 'Sequence',
37
+ run: (io) => {
38
+ const count = io.node.pins.filter((p) => p.kind === 'exec' && p.direction === 'out').length;
39
+ for (let i = 0; i < count; i++)
40
+ io.flow(i);
41
+ },
42
+ };
43
+ /** Branch on a boolean: exec-out 0 = true, 1 = false. */
44
+ const Branch = {
45
+ type: 'Branch',
46
+ run: (io) => io.flow(asBool(io.input(0)) ? 0 : 1),
47
+ };
48
+ /** For each element of input 0: publish data-out 0 = element, 1 = index; run exec-out 0 (body);
49
+ * then exec-out 1 (completed). */
50
+ const ForEach = {
51
+ type: 'ForEach',
52
+ run: (io) => {
53
+ const arr = asArray(io.input(0));
54
+ for (let i = 0; i < arr.length; i++) {
55
+ io.setOutput(0, arr[i]);
56
+ io.setOutput(1, i);
57
+ io.flow(0);
58
+ }
59
+ io.flow(1);
60
+ },
61
+ };
62
+ /** Counted loop with optional cond gate. Inputs: (max iterations, cond — re-evaluated per iter).
63
+ * Outputs: (index = current iteration). Exec-outs: body (per iter), done (after).
64
+ * Pseudocode: `for (i=0; i<max; i++) { if (!cond) break; emit(i); flow(body) }; flow(done)`.
65
+ * The cond is a DATA pin — its source is re-pulled (and any pure deps re-evaluated) every iter,
66
+ * so a cond reading vars/Output overrides reflects the body's writes. */
67
+ const Loop = {
68
+ type: 'Loop',
69
+ run: (io) => {
70
+ const max = Math.floor(asNumber(io.input(0)));
71
+ for (let i = 0; i < max; i++) {
72
+ // Re-pull cond each iter — picks up vars the body may have just written.
73
+ if (!asBool(io.input(1)))
74
+ break;
75
+ io.setOutput(0, i);
76
+ io.flow(0);
77
+ }
78
+ io.flow(1);
79
+ },
80
+ };
81
+ /** Write a variable (name from the `name` widget) = input 0; then continue (exec-out 0). */
82
+ const SetVar = {
83
+ type: 'SetVar',
84
+ run: (io) => {
85
+ const name = String(io.state('name') ?? '');
86
+ if (name)
87
+ io.setVar(name, io.input(0) ?? 0);
88
+ io.flow(0);
89
+ },
90
+ };
91
+ // --- pure --------------------------------------------------------------------------------------
92
+ const GetVar = {
93
+ type: 'GetVar',
94
+ pure: true,
95
+ evalPure: (io) => [io.getVar(String(io.state('name') ?? '')) ?? 0],
96
+ };
97
+ /** Declared graph input. Semantically identical to `GetVar` (reads the var named `state.name`) —
98
+ * the distinction lets the AS-WASM codegen auto-collect the graph's input list for `tickArgs(...)`
99
+ * without the caller having to populate `RtGraph.meta.inputs` by hand. Host can set the var
100
+ * before tick via `runtime.setVar(name, value)` exactly like GetVar; codegen path is unchanged. */
101
+ const GraphInput = {
102
+ type: 'GraphInput',
103
+ pure: true,
104
+ evalPure: (io) => [io.getVar(String(io.state('name') ?? '')) ?? 0],
105
+ };
106
+ /** Declared graph output. Semantically `SetVar` — writes input(0) to the var named `state.name`,
107
+ * then continues. AS-WASM codegen treats every GraphOutput as an entry in `meta.outputs`. */
108
+ const GraphOutput = {
109
+ type: 'GraphOutput',
110
+ run: (io) => {
111
+ const name = String(io.state('name') ?? '');
112
+ if (name)
113
+ io.setVar(name, io.input(0) ?? 0);
114
+ io.flow(0);
115
+ },
116
+ };
117
+ /** Tick-scoped state cell — one visible node that owns a named slot. Pure read pin + exec write
118
+ * pin live on the same node, so every read/write of `zx` (etc.) is wired to the SAME box, instead
119
+ * of being scattered across 8 `GetVar("zx")` nodes the reader has to mentally union.
120
+ *
121
+ * Resets to `state.initial ?? 0` at the start of every tick — semantics for loop-local accumulators
122
+ * (the common case). Use `SetVar`/`GetVar` if you need state that survives across ticks.
123
+ *
124
+ * Pin order (contract for index-addressed interpreter):
125
+ * 0: ein (exec write) 1: din 'set' (write value)
126
+ * 2: eo (continue) 3: dout 'value' (pure read) */
127
+ const Local = {
128
+ type: 'Local',
129
+ // Pre-tick: seed the var slot to `initial`. Runs once before any exec entry so the body of
130
+ // this tick sees a fresh cell — regardless of what was written last tick.
131
+ onTickBegin: (io) => {
132
+ const name = String(io.state('name') ?? '');
133
+ if (name)
134
+ io.setVar(name, Number(io.state('initial') ?? 0));
135
+ },
136
+ evalPure: (io) => {
137
+ const name = String(io.state('name') ?? '');
138
+ if (!name)
139
+ return [0];
140
+ return [io.getVar(name) ?? Number(io.state('initial') ?? 0)];
141
+ },
142
+ run: (io) => {
143
+ const name = String(io.state('name') ?? '');
144
+ if (name)
145
+ io.setVar(name, io.input(0) ?? 0);
146
+ io.flow(0);
147
+ },
148
+ };
149
+ /** Literal from the `value` widget. */
150
+ const Const = {
151
+ type: 'Const',
152
+ pure: true,
153
+ evalPure: (io) => [io.state('value') ?? 0],
154
+ };
155
+ /** Field name for a Struct's data-in pin: the suffix after the LAST `:` in the pin id, or the
156
+ * whole id when there's no separator. Lets per-instance pins use `${nodeId}:${field}` naming
157
+ * while staying unambiguous to the evaluator. */
158
+ function structFieldName(pinId) {
159
+ const i = pinId.lastIndexOf(':');
160
+ return i < 0 ? pinId : pinId.slice(i + 1);
161
+ }
162
+ /** Generic record carrier. Replaces bespoke domain nodes (Agent/Goodie/…) — a Struct is just a
163
+ * bag of typed fields, ONE PIN PER FIELD plus a `self` out emitting the assembled record.
164
+ * - field NAME = the pin id after the last `:` (see {@link structFieldName}).
165
+ * - field VALUE = `io.input(i)` when the pin is wired, else `io.state(field)` (so an in-node
166
+ * widget bound to that pin via `WidgetSpec.pinKey` editorialises the same key).
167
+ * - Multi-input pins (e.g. an Agent's `subscribe` collecting goodie records) DO NOT contribute
168
+ * a field — they're collection-style and a downstream primitive consumes them.
169
+ * - A Struct with no data-in pins emits `{}` — empty record. */
170
+ const Struct = {
171
+ type: 'Struct',
172
+ pure: true,
173
+ evalPure: (io) => {
174
+ const dataIns = io.node.pins.filter((p) => p.kind === 'data' && p.direction === 'in');
175
+ const out = {};
176
+ for (let i = 0; i < dataIns.length; i++) {
177
+ const pin = dataIns[i];
178
+ if (pin.multiple)
179
+ continue;
180
+ const field = structFieldName(String(pin.id));
181
+ const wired = io.input(i);
182
+ const value = wired !== undefined ? wired : io.state(field);
183
+ if (value !== undefined)
184
+ out[field] = value;
185
+ }
186
+ return [out];
187
+ },
188
+ };
189
+ /** Field definitions consumed by a Struct via its `schema` in-pin. `state.fields` is an object
190
+ * `{ fieldName: defaultValue }`; the Struct synthesizes one in-pin per key (with type inferred
191
+ * from the default's runtime type). Replaces hand-writing pins+widgets on every Struct instance. */
192
+ const Schema = {
193
+ type: 'Schema',
194
+ pure: true,
195
+ evalPure: (io) => [io.state('fields') ?? {}],
196
+ };
197
+ const binary = (type, op) => ({
198
+ type,
199
+ pure: true,
200
+ evalPure: (io) => [op(asNumber(io.input(0)), asNumber(io.input(1)))],
201
+ });
202
+ const Add = binary('Add', (a, b) => a + b);
203
+ const Sub = binary('Sub', (a, b) => a - b);
204
+ const Mul = binary('Mul', (a, b) => a * b);
205
+ // --- array math (elementwise; the collection plumbing for per-entity fields) -------------------
206
+ /** Elementwise add of two numeric arrays (input 0 + input 1; length = input 0). */
207
+ const ZipAdd = {
208
+ type: 'ZipAdd',
209
+ pure: true,
210
+ evalPure: (io) => {
211
+ const a = asArray(io.input(0));
212
+ const b = asArray(io.input(1));
213
+ return [a.map((v, i) => asNumber(v) + asNumber(b[i]))];
214
+ },
215
+ };
216
+ /** Multiply every element of input 0 (array) by input 1 (scalar k). */
217
+ const ScaleArray = {
218
+ type: 'ScaleArray',
219
+ pure: true,
220
+ evalPure: (io) => {
221
+ const k = asNumber(io.input(1));
222
+ return [asArray(io.input(0)).map((v) => asNumber(v) * k)];
223
+ },
224
+ };
225
+ const Length = {
226
+ type: 'Length',
227
+ pure: true,
228
+ evalPure: (io) => [asArray(io.input(0)).length],
229
+ };
230
+ /** Element at `idx` in `array`. Out-of-bounds and non-arrays → undefined (no Python wrap, no throw). */
231
+ const Index = {
232
+ type: 'Index',
233
+ pure: true,
234
+ evalPure: (io) => {
235
+ const arr = io.input(0);
236
+ const idx = asNumber(io.input(1));
237
+ if (!Array.isArray(arr))
238
+ return [undefined];
239
+ if (!Number.isInteger(idx) || idx < 0 || idx >= arr.length)
240
+ return [undefined];
241
+ return [arr[idx]];
242
+ },
243
+ };
244
+ /** Immutable replace: a NEW array with `array[idx] = value`. Out-of-bounds → array unchanged. */
245
+ const ArrayWrite = {
246
+ type: 'ArrayWrite',
247
+ pure: true,
248
+ evalPure: (io) => {
249
+ const arr = io.input(0);
250
+ const idx = asNumber(io.input(1));
251
+ const val = io.input(2);
252
+ if (!Array.isArray(arr))
253
+ return [[]];
254
+ if (!Number.isInteger(idx) || idx < 0 || idx >= arr.length)
255
+ return [[...arr]];
256
+ const out = [...arr];
257
+ out[idx] = val;
258
+ return [out];
259
+ },
260
+ };
261
+ /** `array.includes(item)`. Non-arrays → false. Strict equality. */
262
+ const Includes = {
263
+ type: 'Includes',
264
+ pure: true,
265
+ evalPure: (io) => {
266
+ const arr = io.input(0);
267
+ const item = io.input(1);
268
+ if (!Array.isArray(arr))
269
+ return [false];
270
+ return [arr.includes(item)];
271
+ },
272
+ };
273
+ /** Index of the max value (ties → first). Empty → -1. Non-array → -1. */
274
+ const ArgMax = {
275
+ type: 'ArgMax',
276
+ pure: true,
277
+ evalPure: (io) => {
278
+ const arr = io.input(0);
279
+ if (!Array.isArray(arr) || arr.length === 0)
280
+ return [-1];
281
+ let bestI = 0;
282
+ let bestV = asNumber(arr[0]);
283
+ for (let i = 1; i < arr.length; i++) {
284
+ const v = asNumber(arr[i]);
285
+ if (v > bestV) {
286
+ bestV = v;
287
+ bestI = i;
288
+ }
289
+ }
290
+ return [bestI];
291
+ },
292
+ };
293
+ /** Indices of sub-arrays containing `item`. `array` MUST be an array of arrays; sub-arrays that
294
+ * aren't arrays are treated as no-match (no throw). Used by Allocate-as-template to find which
295
+ * agents subscribe to a given unit type. */
296
+ const FilterIndices = {
297
+ type: 'FilterIndices',
298
+ pure: true,
299
+ evalPure: (io) => {
300
+ const arr = io.input(0);
301
+ const item = io.input(1);
302
+ if (!Array.isArray(arr))
303
+ return [[]];
304
+ const out = [];
305
+ for (let i = 0; i < arr.length; i++) {
306
+ const sub = arr[i];
307
+ if (Array.isArray(sub) && sub.includes(item))
308
+ out.push(i);
309
+ }
310
+ return [out];
311
+ },
312
+ };
313
+ /** Math.floor(n). Non-number → 0. */
314
+ const Floor = {
315
+ type: 'Floor',
316
+ pure: true,
317
+ evalPure: (io) => [Math.floor(asNumber(io.input(0)))],
318
+ };
319
+ /** Repeat `item` `count` times → array. Non-integer count is floored. Negative/zero → []. */
320
+ const Repeat = {
321
+ type: 'Repeat',
322
+ pure: true,
323
+ evalPure: (io) => {
324
+ const item = io.input(0);
325
+ const count = Math.floor(asNumber(io.input(1)));
326
+ if (count <= 0 || !Number.isFinite(count))
327
+ return [[]];
328
+ const out = new Array(count);
329
+ for (let i = 0; i < count; i++)
330
+ out[i] = item;
331
+ return [out];
332
+ },
333
+ };
334
+ /** Immutable `{...obj, [key]: value}`. Non-object → `{[key]: value}`. */
335
+ const ObjectSet = {
336
+ type: 'ObjectSet',
337
+ pure: true,
338
+ evalPure: (io) => {
339
+ const obj = io.input(0);
340
+ const key = io.input(1);
341
+ const value = io.input(2);
342
+ const k = String(key);
343
+ if (!obj || typeof obj !== 'object' || Array.isArray(obj))
344
+ return [{ [k]: value }];
345
+ return [{ ...obj, [k]: value }];
346
+ },
347
+ };
348
+ /** Concatenate two arrays. Non-array sides treated as empty. */
349
+ const Concat = {
350
+ type: 'Concat',
351
+ pure: true,
352
+ evalPure: (io) => {
353
+ const a = Array.isArray(io.input(0)) ? io.input(0) : [];
354
+ const b = Array.isArray(io.input(1)) ? io.input(1) : [];
355
+ return [[...a, ...b]];
356
+ },
357
+ };
358
+ /** a > b → bool. Numeric compare. */
359
+ const Gt = {
360
+ type: 'Gt',
361
+ pure: true,
362
+ evalPure: (io) => [asNumber(io.input(0)) > asNumber(io.input(1))],
363
+ };
364
+ /** a >= b → bool. */
365
+ const Gte = {
366
+ type: 'Gte',
367
+ pure: true,
368
+ evalPure: (io) => [asNumber(io.input(0)) >= asNumber(io.input(1))],
369
+ };
370
+ /** a == b → bool (strict equality). */
371
+ const Eq = {
372
+ type: 'Eq',
373
+ pure: true,
374
+ evalPure: (io) => [io.input(0) === io.input(1)],
375
+ };
376
+ /** Dynamic field lookup on an object: `obj[key]`. Non-object → undefined. */
377
+ const ObjectGet = {
378
+ type: 'ObjectGet',
379
+ pure: true,
380
+ evalPure: (io) => {
381
+ const obj = io.input(0);
382
+ const key = io.input(1);
383
+ if (!obj || typeof obj !== 'object' || Array.isArray(obj))
384
+ return [undefined];
385
+ if (key === undefined || key === null)
386
+ return [undefined];
387
+ const k = String(key);
388
+ return [obj[k]];
389
+ },
390
+ };
391
+ /** Subset of `array` at the given `indices` (in order). OOB indices yield `undefined` elements. */
392
+ const IndexAll = {
393
+ type: 'IndexAll',
394
+ pure: true,
395
+ evalPure: (io) => {
396
+ const arr = io.input(0);
397
+ const idxs = io.input(1);
398
+ if (!Array.isArray(arr) || !Array.isArray(idxs))
399
+ return [[]];
400
+ return [idxs.map((i) => arr[asNumber(i)])];
401
+ },
402
+ };
403
+ /** Immutable push: a NEW array with `item` appended. Non-array → `[item]`. */
404
+ const Append = {
405
+ type: 'Append',
406
+ pure: true,
407
+ evalPure: (io) => {
408
+ const arr = io.input(0);
409
+ const item = io.input(1);
410
+ if (!Array.isArray(arr))
411
+ return [[item]];
412
+ return [[...arr, item]];
413
+ },
414
+ };
415
+ /** Arithmetic mean of an input array. Empty array → 0 (not NaN — lets metrics widgets show 0
416
+ * cleanly before the simulation has produced any data). Elements coerced via `asNumber`. */
417
+ const Mean = {
418
+ type: 'Mean',
419
+ pure: true,
420
+ evalPure: (io) => {
421
+ const arr = asArray(io.input(0));
422
+ if (arr.length === 0)
423
+ return [0];
424
+ let sum = 0;
425
+ for (const v of arr)
426
+ sum += asNumber(v);
427
+ return [sum / arr.length];
428
+ },
429
+ };
430
+ /** The starter primitive set. */
431
+ export const BUILTIN_PRIMITIVES = [
432
+ Tick, Init, Spawn, Sequence, Branch, ForEach, Loop, SetVar, GetVar, Local, GraphInput, GraphOutput, Const, Struct, Schema, Add, Sub, Mul, ZipAdd, ScaleArray, Length, Mean,
433
+ Index, ArrayWrite, Includes, ArgMax, FilterIndices, ObjectGet, IndexAll, Append, Gt, Gte, Eq,
434
+ Floor, Repeat, ObjectSet, Concat,
435
+ ];
436
+ //# sourceMappingURL=primitives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/vm/primitives.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type VmValue = number | boolean | string | VmValue[] | {
2
+ [key: string]: VmValue;
3
+ };
4
+ export declare function asNumber(v: VmValue | undefined): number;
5
+ export declare function asBool(v: VmValue | undefined): boolean;
6
+ export declare function asArray(v: VmValue | undefined): VmValue[];
7
+ //# sourceMappingURL=value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value.d.ts","sourceRoot":"","sources":["../../src/vm/value.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAA;AAExF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAQvD;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAMtD;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,EAAE,CAEzD"}