@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,205 @@
1
+ // Editor-facing declarations: pin TYPES (colour/compatibility) and node SCHEMAS for the palette.
2
+ // Pure data — no editor import needed. Pin colours are semantic and chosen to read on BOTH themes
3
+ // (Xen dark/gold and Liquid Glass). Pin ORDER in each schema is the contract the index-addressed
4
+ // interpreter relies on (see vm/interpreter.ts) — keep it aligned with each primitive's evaluator.
5
+ export const PIN_TYPES = [
6
+ { id: 'exec', color: '#E8E8E8', shape: 'arrow' }, // control flow
7
+ { id: 'scalar', color: '#4FC08D', shape: 'circle' }, // number
8
+ { id: 'bool', color: '#E5484D', shape: 'circle' },
9
+ { id: 'array', color: '#5B9DFF', shape: 'circle' }, // collections (agents/units/…)
10
+ { id: 'object', color: '#C18CFF', shape: 'diamond' }, // records (e.g. costs map)
11
+ { id: 'any', color: '#9AA0A6', shape: 'circle' },
12
+ ];
13
+ // exec pins render as the arrow glyph — plain in/out carry NO text label (UE-style); only branching
14
+ // exec outs (Branch true/false, ForEach body/completed, Sequence then N) keep a meaningful label.
15
+ const ei = () => ({ kind: 'exec', direction: 'in', type: 'exec', label: '' });
16
+ const eo = (label = '') => ({ kind: 'exec', direction: 'out', type: 'exec', label });
17
+ const di = (label, type) => ({ kind: 'data', direction: 'in', type, label });
18
+ const dobj = (label, type) => ({ kind: 'data', direction: 'out', type, label });
19
+ // category → palette/header colour group (the loaded graph supplies the actual `categories` palette).
20
+ export const PRIMITIVE_SCHEMAS = [
21
+ // flow
22
+ { type: 'Tick', title: 'Tick', category: 'flow', description: 'Per-step entry point', pins: [eo()] },
23
+ { type: 'Init', title: 'Init', category: 'flow', description: 'Runs once at start (seed variables)', pins: [eo()] },
24
+ { type: 'Spawn', title: 'Spawn', category: 'domain', description: 'Fractional spawner: {type,rate}[] → units this tick', pins: [ei(), di('specs', 'array'), dobj('units', 'array'), eo()] },
25
+ { type: 'Sequence', title: 'Sequence', category: 'flow', description: 'Fire outputs in order', pins: [ei(), eo('then 0'), eo('then 1')] },
26
+ { type: 'Branch', title: 'Branch', category: 'flow', description: 'If / else on a bool', pins: [ei(), di('cond', 'bool'), eo('true'), eo('false')] },
27
+ { type: 'ForEach', title: 'For Each', category: 'flow', description: 'Loop over an array', pins: [ei(), di('array', 'array'), dobj('element', 'any'), dobj('index', 'scalar'), eo('body'), eo('completed')] },
28
+ { type: 'Loop', title: 'Loop', category: 'flow', description: 'Counted loop with cond — runs body while cond is true, up to `max` times', pins: [ei(), di('max', 'scalar'), di('cond', 'bool'), dobj('idx', 'scalar'), eo('body'), eo('done')] },
29
+ // state
30
+ // Every widget MUST be pinKey-bound (core's layout reserves no body band for non-bound widgets).
31
+ // KNOWN VISUAL ISSUE: widget rect spans the full row width, so it overlaps the bound pin's label
32
+ // (e.g. "warehouse" widget overlaps "value" pin label). Awaiting core fix
33
+ // (see docs/widget-pin-label-overlap.md); for now we accept the overlap.
34
+ { type: 'SetVar', title: 'Set Variable', category: 'state', description: 'Write a variable (persists across ticks)', pins: [ei(), di('value', 'any'), eo()], widgets: [{ id: 'name', type: 'text', key: 'name', label: '', pinKey: 'value', visibility: 'always' }] },
35
+ { type: 'GetVar', title: 'Get Variable', category: 'state', description: 'Read a variable', pure: true, pins: [dobj('value', 'any')], widgets: [{ id: 'name', type: 'text', key: 'name', label: '', pinKey: 'value', visibility: 'always' }] },
36
+ // First-class declared I/O — used by AS-WASM codegen to derive tickArgs signature automatically.
37
+ // Visually distinct (`io` category, amber) so a reader sees graph boundary at a glance.
38
+ { type: 'GraphInput', title: 'Input', category: 'io', description: 'Declared graph input — passed in as a tickArgs parameter.', pure: true, pins: [dobj('value', 'scalar')], widgets: [{ id: 'name', type: 'text', key: 'name', label: '', pinKey: 'value', visibility: 'always' }] },
39
+ { type: 'GraphOutput', title: 'Output', category: 'io', description: 'Declared graph output — returned by tickArgs (first Output) or read via getVar.', pins: [ei(), di('value', 'scalar'), eo()], widgets: [{ id: 'name', type: 'text', key: 'name', label: '', pinKey: 'value', visibility: 'always' }] },
40
+ // Tick-scoped state cell. ONE node = ONE physical storage slot. Reset to `initial` each tick.
41
+ // Reads via `value` pin (pure), writes via the exec path (`set` data-in + ein/eo). Multi-reader
42
+ // friendly — wire `value` to as many consumers as you like; the visual "all roads lead here"
43
+ // makes loop state legible without scattering 8 GetVar("zx") nodes.
44
+ { type: 'Local', title: 'Local', category: 'state', description: 'Tick-scoped state cell — read via `value`, write via `set`. Resets to `initial` each tick.',
45
+ pins: [ei(), di('set', 'scalar'), eo(), dobj('value', 'scalar')],
46
+ widgets: [
47
+ { id: 'name', type: 'text', key: 'name', label: '', pinKey: 'value', visibility: 'always' },
48
+ { id: 'initial', type: 'number', key: 'initial', label: 'init = ', pinKey: 'set', visibility: 'always' },
49
+ ],
50
+ },
51
+ { type: 'Const', title: 'Const', category: 'state', description: 'A literal number', pure: true, pins: [dobj('out', 'scalar')], widgets: [{ id: 'value', type: 'number', key: 'value', label: '', pinKey: 'out', visibility: 'always' }] },
52
+ {
53
+ type: 'Struct', title: 'Struct', category: 'state',
54
+ description: 'A configurable bag of fields. Wire a Schema into `schema` to synthesize one in-pin per field.',
55
+ pure: true,
56
+ pins: [
57
+ { kind: 'data', direction: 'in', type: 'object', label: 'schema' },
58
+ dobj('self', 'object'),
59
+ ],
60
+ },
61
+ {
62
+ type: 'Schema', title: 'Schema', category: 'state',
63
+ description: 'Field definitions ({fieldName: defaultValue}) consumed by a Struct via its schema pin.',
64
+ pure: true,
65
+ // Two pins:
66
+ // - `fields` IN — binding-only target for the struct DOM widget (key='fields' auto-binds
67
+ // via the editor's pin-key match). IN-pin rows host bound widgets cleanly;
68
+ // OUT-pin binding produces visual artifacts (pin + widget on separate rows).
69
+ // - `definition` OUT — emits `state.fields` to downstream Struct.schema pins.
70
+ pins: [di('fields', 'object'), { kind: 'data', direction: 'out', type: 'object', label: '' }],
71
+ widgets: [{ id: 'fields', type: 'custom', renderer: 'struct', key: 'fields', label: '', height: 110 }],
72
+ },
73
+ // math
74
+ { type: 'Add', title: 'Add', category: 'math', pure: true, pins: [di('a', 'scalar'), di('b', 'scalar'), dobj('out', 'scalar')] },
75
+ { type: 'Sub', title: 'Subtract', category: 'math', pure: true, pins: [di('a', 'scalar'), di('b', 'scalar'), dobj('out', 'scalar')] },
76
+ { type: 'Mul', title: 'Multiply', category: 'math', pure: true, pins: [di('a', 'scalar'), di('b', 'scalar'), dobj('out', 'scalar')] },
77
+ // array
78
+ { type: 'ZipAdd', title: 'Zip Add', category: 'array', description: 'Elementwise a + b', pure: true, pins: [di('a', 'array'), di('b', 'array'), dobj('out', 'array')] },
79
+ { type: 'ScaleArray', title: 'Scale Array', category: 'array', description: 'array × k', pure: true, pins: [di('array', 'array'), di('k', 'scalar'), dobj('out', 'array')] },
80
+ { type: 'Length', title: 'Length', category: 'array', pure: true, pins: [di('array', 'array'), dobj('out', 'scalar')] },
81
+ { type: 'Mean', title: 'Mean', category: 'array', description: 'Arithmetic mean of an array (empty → 0)', pure: true, pins: [di('array', 'array'), dobj('out', 'scalar')] },
82
+ { type: 'Index', title: 'Index', category: 'array', description: 'Element at index (oob → undefined)', pure: true, pins: [di('array', 'array'), di('idx', 'scalar'), dobj('out', 'any')] },
83
+ { type: 'ArrayWrite', title: 'Array Write', category: 'array', description: 'Immutable array.set(idx, value)', pure: true, pins: [di('array', 'array'), di('idx', 'scalar'), di('value', 'any'), dobj('out', 'array')] },
84
+ { type: 'Includes', title: 'Includes', category: 'array', description: 'array.includes(item) → bool', pure: true, pins: [di('array', 'array'), di('item', 'any'), dobj('out', 'bool')] },
85
+ { type: 'ArgMax', title: 'ArgMax', category: 'array', description: 'Index of max value (empty → -1)', pure: true, pins: [di('array', 'array'), dobj('out', 'scalar')] },
86
+ { type: 'FilterIndices', title: 'Filter Indices', category: 'array', description: 'Indices of subarrays containing item', pure: true, pins: [di('array', 'array'), di('item', 'any'), dobj('out', 'array')] },
87
+ { type: 'ObjectGet', title: 'Object Get', category: 'array', description: 'obj[key] — dynamic field lookup', pure: true, pins: [di('obj', 'object'), di('key', 'any'), dobj('out', 'any')] },
88
+ { type: 'IndexAll', title: 'Index All', category: 'array', description: 'array[indices] → subset', pure: true, pins: [di('array', 'array'), di('idxs', 'array'), dobj('out', 'array')] },
89
+ { type: 'Append', title: 'Append', category: 'array', description: 'Immutable array.push(item)', pure: true, pins: [di('array', 'array'), di('item', 'any'), dobj('out', 'array')] },
90
+ { type: 'Gt', title: 'Greater', category: 'math', description: 'a > b → bool', pure: true, pins: [di('a', 'scalar'), di('b', 'scalar'), dobj('out', 'bool')] },
91
+ { type: 'Gte', title: 'Greater or Eq', category: 'math', description: 'a >= b → bool', pure: true, pins: [di('a', 'scalar'), di('b', 'scalar'), dobj('out', 'bool')] },
92
+ { type: 'Eq', title: 'Equal', category: 'math', description: 'a === b → bool', pure: true, pins: [di('a', 'any'), di('b', 'any'), dobj('out', 'bool')] },
93
+ { type: 'Floor', title: 'Floor', category: 'math', description: 'Math.floor(n)', pure: true, pins: [di('n', 'scalar'), dobj('out', 'scalar')] },
94
+ { type: 'Repeat', title: 'Repeat', category: 'array', description: '[item, item, …] × count', pure: true, pins: [di('item', 'any'), di('count', 'scalar'), dobj('out', 'array')] },
95
+ { type: 'ObjectSet', title: 'Object Set', category: 'array', description: 'Immutable {...obj, [key]: value}', pure: true, pins: [di('obj', 'object'), di('key', 'any'), di('value', 'any'), dobj('out', 'object')] },
96
+ { type: 'Concat', title: 'Concat', category: 'array', description: 'Merge two arrays', pure: true, pins: [di('a', 'array'), di('b', 'array'), dobj('out', 'array')] },
97
+ // domain
98
+ {
99
+ type: 'Allocate', title: 'Allocate', category: 'domain',
100
+ description: 'Route each unit to the top-priority subscriber; cost is subtracted',
101
+ pins: [
102
+ ei(), di('priorities', 'array'), di('subs', 'array'), di('arrivals', 'array'), di('costs', 'object'),
103
+ dobj('priorities', 'array'), dobj('awards', 'array'), dobj('leftovers', 'array'), eo(),
104
+ ],
105
+ },
106
+ // collection bridge: domain nodes ↔ algorithm. `nodeType`/`field` widgets pick what to read/write.
107
+ {
108
+ type: 'Gather', title: 'Gather', category: 'domain', description: 'Read a field from every node of a type → array',
109
+ pure: true, pins: [dobj('values', 'array')],
110
+ widgets: [
111
+ { id: 'nodeType', type: 'text', key: 'nodeType', label: 'node type', pinKey: 'values', visibility: 'always' },
112
+ { id: 'field', type: 'text', key: 'field', label: 'field', pinKey: 'values', visibility: 'always' },
113
+ ],
114
+ },
115
+ {
116
+ type: 'Scatter', title: 'Scatter', category: 'domain', description: 'Write an array back onto each node of a type',
117
+ pins: [ei(), di('values', 'array'), eo()],
118
+ widgets: [
119
+ { id: 'nodeType', type: 'text', key: 'nodeType', label: 'node type', pinKey: 'values', visibility: 'always' },
120
+ { id: 'field', type: 'text', key: 'field', label: 'field', pinKey: 'values', visibility: 'always' },
121
+ ],
122
+ },
123
+ // Wire-driven gather/scatter: visible plumbing. One multi-input on Gather; one data-out per
124
+ // consumer on Scatter (the host adds pins via setNodePins as consumers connect).
125
+ {
126
+ type: 'GatherFromInputs', title: 'Gather', category: 'domain',
127
+ description: 'Collects wired inputs into an array (in edge order)',
128
+ pure: true,
129
+ pins: [di('items', 'any'), dobj('values', 'array')],
130
+ },
131
+ {
132
+ type: 'ScatterToOutputs', title: 'Scatter', category: 'domain',
133
+ description: 'Publishes array elements onto each declared data-out pin',
134
+ pins: [ei(), di('value', 'array'), eo()],
135
+ },
136
+ {
137
+ type: 'GatherRecords', title: 'Gather Records', category: 'domain', description: 'Read several fields from every node of a type → objects',
138
+ pure: true, pins: [dobj('records', 'array')],
139
+ widgets: [
140
+ { id: 'nodeType', type: 'text', key: 'nodeType', label: 'node type', pinKey: 'records', visibility: 'always' },
141
+ { id: 'fields', type: 'text', key: 'fields', label: 'fields', pinKey: 'records', visibility: 'always' },
142
+ ],
143
+ },
144
+ {
145
+ type: 'GetField', title: 'Get Field', category: 'array', description: 'Read a field from a record',
146
+ pure: true, pins: [di('record', 'object'), dobj('value', 'any')],
147
+ widgets: [{ id: 'field', type: 'text', key: 'field', label: '', pinKey: 'record', visibility: 'always' }],
148
+ },
149
+ {
150
+ type: 'MapField', title: 'Map Field', category: 'array', description: 'Pick the same field from every record → array',
151
+ pure: true, pins: [di('records', 'array'), dobj('values', 'array')],
152
+ widgets: [{ id: 'field', type: 'text', key: 'field', label: '', pinKey: 'records', visibility: 'always' }],
153
+ },
154
+ {
155
+ type: 'Output', title: 'Output', category: 'state',
156
+ description: 'Display the wired value in the node (host renders it as a widget)',
157
+ pins: [ei(), di('value', 'any'), eo()],
158
+ widgets: [{ id: 'value', type: 'custom', renderer: 'output', key: 'value', label: '', height: 40, pinKey: 'value' }],
159
+ },
160
+ {
161
+ type: 'ToMap', title: 'To Map', category: 'array', description: 'records[] → { key: value } object',
162
+ pure: true, pins: [di('records', 'array'), dobj('map', 'object')],
163
+ // Only the `key` widget is editable in-node — core's pin-row layout pairs the records IN and
164
+ // map OUT pins on the SAME row, so showing a second widget for `value` would overlap. The
165
+ // value-field is set programmatically via `state.value` (or by editing the V1 graph JSON).
166
+ // Resolves when core supports vertical widget stacking in a pin row (see issue doc).
167
+ widgets: [
168
+ { id: 'key', type: 'text', key: 'key', label: '', pinKey: 'records', visibility: 'always' },
169
+ ],
170
+ },
171
+ ];
172
+ /** Header glyph icon per primitive type (names from render-pixi's built-in Feather set). Hosts can
173
+ * apply these to node `glyph` so the generic nodes are visually distinguishable at a glance. */
174
+ export const PRIMITIVE_ICONS = {
175
+ Tick: 'play', Init: 'flag',
176
+ GetVar: 'database', SetVar: 'database', Const: 'square',
177
+ GraphInput: 'arrow-right', GraphOutput: 'arrow-right',
178
+ Local: 'box',
179
+ Add: 'cpu', Sub: 'cpu', Mul: 'cpu',
180
+ ZipAdd: 'layers', ScaleArray: 'layers', Length: 'layers', Mean: 'layers',
181
+ Index: 'layers', ArrayWrite: 'layers', Includes: 'layers', ArgMax: 'layers', FilterIndices: 'layers',
182
+ ObjectGet: 'layers', IndexAll: 'layers', Append: 'layers',
183
+ Gt: 'cpu', Gte: 'cpu', Eq: 'cpu',
184
+ Floor: 'cpu', Repeat: 'layers', ObjectSet: 'layers', Concat: 'layers',
185
+ Branch: 'branch', Sequence: 'code', ForEach: 'code', Loop: 'code',
186
+ Allocate: 'box', Spawn: 'zap',
187
+ Gather: 'database', Scatter: 'database',
188
+ GatherFromInputs: 'database', ScatterToOutputs: 'database',
189
+ GetField: 'layers', MapField: 'layers', GatherRecords: 'database', ToMap: 'layers',
190
+ Output: 'flag',
191
+ Struct: 'box',
192
+ Schema: 'layers',
193
+ };
194
+ for (const s of PRIMITIVE_SCHEMAS)
195
+ s.glyph = { icon: PRIMITIVE_ICONS[s.type] ?? 'circle', side: 'left' };
196
+ /** Colours for the primitive categories — declared in the runtime preset's `categories` palette. */
197
+ export const PRIMITIVE_CATEGORY_COLORS = {
198
+ flow: { color: '#E8E8E8' },
199
+ state: { color: '#5B9DFF' },
200
+ math: { color: '#4FC08D' },
201
+ array: { color: '#3FB6FF' },
202
+ domain: { color: '#FFB020' },
203
+ io: { color: '#E6C87A' }, // amber — graph boundary (Input/Output)
204
+ };
205
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/editor/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { DomWidgetController } from '@xenolithengine/graph-editor';
2
+ /** Supported field types in a Struct. Drives both the input element rendered in the widget and
3
+ * the cast applied by {@link structChangeType} when the user switches a field's type. */
4
+ export type StructKind = 'number' | 'boolean' | 'array' | 'text';
5
+ /** A row to render in the widget. */
6
+ export interface StructRow {
7
+ key: string;
8
+ value: unknown;
9
+ kind: StructKind;
10
+ }
11
+ /** Decompose `state.data` into one row per field. Non-object inputs decode to no rows (Struct's
12
+ * evaluator already coerces to `{}`). Key order matches `Object.keys`. */
13
+ export declare function structRows(data: unknown): StructRow[];
14
+ /** Parse a raw string back to the type implied by the original value. Arrays come back via
15
+ * comma-split + trim; numbers via `Number()` (NaN preserved as-is so the user sees their bad
16
+ * input rather than a silent 0); booleans via the checkbox path so this only handles primitives. */
17
+ export declare function structParseValue(raw: string, kind: StructRow['kind']): unknown;
18
+ /** Apply one field change to the data record. Pure — returns a new object so the editor can detect
19
+ * the mutation via reference equality. Unknown data shapes are normalised to {}. */
20
+ export declare function structSetField(data: unknown, key: string, value: unknown): Record<string, unknown>;
21
+ /** Append a new field with the type's default value. Existing fields keep their insertion order. */
22
+ export declare function structAddField(data: unknown, key: string, kind: StructKind): Record<string, unknown>;
23
+ /** Delete a field. No-op if the key is absent. */
24
+ export declare function structRemoveField(data: unknown, key: string): Record<string, unknown>;
25
+ /** Rename a key in place — same value, same position. No-op if old absent, new exists, or no-op. */
26
+ export declare function structRenameField(data: unknown, oldKey: string, newKey: string): Record<string, unknown>;
27
+ /** Re-cast a field's value to a new kind. Conversions:
28
+ * - text → number: `Number()`, NaN → 0
29
+ * - any → text: `String()` (arrays join with comma+space)
30
+ * - any → boolean: truthy-check (empty string / 0 → false)
31
+ * - text → array: comma-split + trim
32
+ * No-op if the key is absent. */
33
+ export declare function structChangeType(data: unknown, key: string, kind: StructKind): Record<string, unknown>;
34
+ /** Generate a fresh, non-colliding `fieldN` key (lowest N not yet used). */
35
+ export declare function structFreshKey(data: unknown): string;
36
+ export declare const structWidget: DomWidgetController;
37
+ //# sourceMappingURL=struct-widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"struct-widget.d.ts","sourceRoot":"","sources":["../../src/editor/struct-widget.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAEvE;0FAC0F;AAC1F,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAA;AAEhE,qCAAqC;AACrC,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,OAAO,CAAA;IACd,IAAI,EAAE,UAAU,CAAA;CACjB;AAqBD;2EAC2E;AAC3E,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,EAAE,CAIrD;AAED;;qGAEqG;AACrG,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,OAAO,CAI9E;AAED;qFACqF;AACrF,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAElG;AAED,oGAAoG;AACpG,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEpG;AAED,kDAAkD;AAClD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMrF;AAED,oGAAoG;AACpG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQxG;AAED;;;;;kCAKkC;AAClC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBtG;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAGpD;AA4BD,eAAO,MAAM,YAAY,EAAE,mBAwF1B,CAAA"}
@@ -0,0 +1,242 @@
1
+ // DOM widget for the `Struct` primitive — renders one row per field in `state.data` (an object) and
2
+ // commits edits back via setValue. The widget IS the field editor: the field LIST is derived from the
3
+ // data object itself (its keys), so adding/removing a field just means adding/removing a key.
4
+ //
5
+ // Field types are inferred from the current value: number → number input, boolean → checkbox, array
6
+ // → comma-separated text (cast back), everything else → text. This keeps the widget zero-config —
7
+ // the user just types values and the Struct emits the parsed record.
8
+ function classify(value) {
9
+ if (typeof value === 'number')
10
+ return 'number';
11
+ if (typeof value === 'boolean')
12
+ return 'boolean';
13
+ if (Array.isArray(value))
14
+ return 'array';
15
+ return 'text';
16
+ }
17
+ /** Default value emitted when a new field of the given kind is created. */
18
+ function defaultFor(kind) {
19
+ if (kind === 'number')
20
+ return 0;
21
+ if (kind === 'boolean')
22
+ return false;
23
+ if (kind === 'array')
24
+ return [];
25
+ return '';
26
+ }
27
+ function asRecord(data) {
28
+ return (data && typeof data === 'object' && !Array.isArray(data)) ? data : {};
29
+ }
30
+ /** Decompose `state.data` into one row per field. Non-object inputs decode to no rows (Struct's
31
+ * evaluator already coerces to `{}`). Key order matches `Object.keys`. */
32
+ export function structRows(data) {
33
+ if (!data || typeof data !== 'object' || Array.isArray(data))
34
+ return [];
35
+ const rec = data;
36
+ return Object.keys(rec).map((key) => ({ key, value: rec[key], kind: classify(rec[key]) }));
37
+ }
38
+ /** Parse a raw string back to the type implied by the original value. Arrays come back via
39
+ * comma-split + trim; numbers via `Number()` (NaN preserved as-is so the user sees their bad
40
+ * input rather than a silent 0); booleans via the checkbox path so this only handles primitives. */
41
+ export function structParseValue(raw, kind) {
42
+ if (kind === 'number')
43
+ return raw === '' ? 0 : Number(raw);
44
+ if (kind === 'array')
45
+ return raw === '' ? [] : raw.split(',').map((s) => s.trim()).filter(Boolean);
46
+ return raw;
47
+ }
48
+ /** Apply one field change to the data record. Pure — returns a new object so the editor can detect
49
+ * the mutation via reference equality. Unknown data shapes are normalised to {}. */
50
+ export function structSetField(data, key, value) {
51
+ return { ...asRecord(data), [key]: value };
52
+ }
53
+ /** Append a new field with the type's default value. Existing fields keep their insertion order. */
54
+ export function structAddField(data, key, kind) {
55
+ return { ...asRecord(data), [key]: defaultFor(kind) };
56
+ }
57
+ /** Delete a field. No-op if the key is absent. */
58
+ export function structRemoveField(data, key) {
59
+ const base = asRecord(data);
60
+ if (!(key in base))
61
+ return { ...base };
62
+ const out = {};
63
+ for (const k of Object.keys(base))
64
+ if (k !== key)
65
+ out[k] = base[k];
66
+ return out;
67
+ }
68
+ /** Rename a key in place — same value, same position. No-op if old absent, new exists, or no-op. */
69
+ export function structRenameField(data, oldKey, newKey) {
70
+ const base = asRecord(data);
71
+ if (oldKey === newKey)
72
+ return { ...base };
73
+ if (!(oldKey in base))
74
+ return { ...base };
75
+ if (newKey in base)
76
+ return { ...base }; // refuse to overwrite
77
+ const out = {};
78
+ for (const k of Object.keys(base))
79
+ out[k === oldKey ? newKey : k] = base[k];
80
+ return out;
81
+ }
82
+ /** Re-cast a field's value to a new kind. Conversions:
83
+ * - text → number: `Number()`, NaN → 0
84
+ * - any → text: `String()` (arrays join with comma+space)
85
+ * - any → boolean: truthy-check (empty string / 0 → false)
86
+ * - text → array: comma-split + trim
87
+ * No-op if the key is absent. */
88
+ export function structChangeType(data, key, kind) {
89
+ const base = asRecord(data);
90
+ if (!(key in base))
91
+ return { ...base };
92
+ const v = base[key];
93
+ let next;
94
+ if (kind === 'number') {
95
+ const n = typeof v === 'number' ? v : Number(typeof v === 'string' ? v : String(v));
96
+ next = Number.isFinite(n) ? n : 0;
97
+ }
98
+ else if (kind === 'boolean') {
99
+ next = !!v;
100
+ }
101
+ else if (kind === 'array') {
102
+ if (Array.isArray(v))
103
+ next = v;
104
+ else if (typeof v === 'string')
105
+ next = v === '' ? [] : v.split(',').map((s) => s.trim()).filter(Boolean);
106
+ else
107
+ next = [];
108
+ }
109
+ else {
110
+ // text
111
+ if (Array.isArray(v))
112
+ next = v.join(', ');
113
+ else
114
+ next = String(v ?? '');
115
+ }
116
+ return { ...base, [key]: next };
117
+ }
118
+ /** Generate a fresh, non-colliding `fieldN` key (lowest N not yet used). */
119
+ export function structFreshKey(data) {
120
+ const used = new Set(Object.keys(asRecord(data)));
121
+ for (let i = 1;; i++) {
122
+ const k = `field${i}`;
123
+ if (!used.has(k))
124
+ return k;
125
+ }
126
+ }
127
+ // Per-node re-render hook; `update()` from the editor re-paints the rows with the latest value.
128
+ // Keyed by node id — one Struct widget per node, so the key is unique.
129
+ const renderHooks = new Map();
130
+ const KIND_CHOICES = ['text', 'number', 'boolean', 'array'];
131
+ // `width:0;flex:1 1 0` is the standard trick to make a flex `<input>` actually shrink — without
132
+ // it the browser's intrinsic input width (~150px) wins over `min-width:0` and pushes the row.
133
+ const css = {
134
+ // Very compact rhythm: tiny font + minimal paddings keep each row ~18 px so a 4-field schema
135
+ // fits in ~96 px (declared `height` in the spec). Horizontal padding is 0 — the widget rect's
136
+ // x extent already equals the pin-label content column (core's pin-edge alignment), an extra
137
+ // inset would double-indent.
138
+ // Stretch to fill the rect the editor gave us; SCROLL inside when content (rows + add button)
139
+ // exceeds the declared widget `height` — otherwise the "+ add field" button slides off-screen
140
+ // as the user adds fields and there's no way to add more.
141
+ root: 'display:flex;flex-direction:column;gap:2px;font:10px Inter,sans-serif;padding:2px 0;box-sizing:border-box;width:100%;height:100%;overflow-y:auto',
142
+ row: 'display:flex;align-items:center;gap:3px;height:18px',
143
+ key: 'width:0;flex:1 1 0;min-width:40px;height:16px;background:transparent;color:var(--xeno-widget-label,#aaa);border:1px dashed transparent;border-radius:2px;padding:0 3px;font:inherit;cursor:text;box-sizing:border-box',
144
+ keyHov: 'border-color:var(--xeno-widget-border,#444)',
145
+ input: 'width:0;flex:2 1 0;min-width:30px;height:16px;background:var(--xeno-widget-bg,#222);color:var(--xeno-widget-text,#eee);border:1px solid var(--xeno-widget-border,#444);border-radius:2px;padding:0 3px;font:inherit;box-sizing:border-box',
146
+ kind: 'flex:0 0 auto;height:16px;background:var(--xeno-widget-bg,#222);color:var(--xeno-widget-text,#eee);border:1px solid var(--xeno-widget-border,#444);border-radius:2px;padding:0 2px;font:inherit;cursor:pointer;box-sizing:border-box',
147
+ drop: 'flex:0 0 14px;width:14px;height:16px;padding:0;background:transparent;color:var(--xeno-widget-label,#666);border:none;border-radius:2px;cursor:pointer;font:12px/1 monospace',
148
+ add: 'margin-top:1px;height:16px;padding:0 4px;background:transparent;color:var(--xeno-widget-label,#888);border:1px dashed var(--xeno-widget-border,#444);border-radius:2px;cursor:pointer;font:inherit;text-align:left;box-sizing:border-box',
149
+ };
150
+ export const structWidget = {
151
+ mount(el, { value, setValue, node }) {
152
+ const root = document.createElement('div');
153
+ root.style.cssText = css.root;
154
+ el.appendChild(root);
155
+ let current = value;
156
+ const render = (data) => {
157
+ current = data;
158
+ root.innerHTML = '';
159
+ for (const row of structRows(data)) {
160
+ const line = document.createElement('div');
161
+ line.style.cssText = css.row;
162
+ // Key (rename inline — contenteditable-ish text input that commits on blur).
163
+ const keyEl = document.createElement('input');
164
+ keyEl.value = row.key;
165
+ keyEl.style.cssText = css.key;
166
+ keyEl.title = 'rename field';
167
+ keyEl.addEventListener('focus', () => { keyEl.style.cssText = `${css.key};${css.keyHov}`; });
168
+ keyEl.addEventListener('blur', () => {
169
+ keyEl.style.cssText = css.key;
170
+ const next = keyEl.value.trim();
171
+ if (!next || next === row.key) {
172
+ keyEl.value = row.key;
173
+ return;
174
+ }
175
+ const result = structRenameField(current, row.key, next);
176
+ // structRenameField returns unchanged base when newKey collides; restore the input then.
177
+ if (!(next in result)) {
178
+ keyEl.value = row.key;
179
+ return;
180
+ }
181
+ setValue(result);
182
+ });
183
+ // Value input.
184
+ const input = (row.kind === 'boolean')
185
+ ? Object.assign(document.createElement('input'), { type: 'checkbox', checked: !!row.value })
186
+ : Object.assign(document.createElement('input'), {
187
+ type: row.kind === 'number' ? 'number' : 'text',
188
+ value: row.kind === 'array' ? row.value.join(', ') : String(row.value ?? ''),
189
+ });
190
+ input.style.cssText = css.input;
191
+ input.addEventListener('change', () => {
192
+ const next = (row.kind === 'boolean')
193
+ ? input.checked
194
+ : structParseValue(input.value, row.kind);
195
+ setValue(structSetField(current, row.key, next));
196
+ });
197
+ // Type picker (text/number/boolean/array).
198
+ const kindSel = document.createElement('select');
199
+ kindSel.style.cssText = css.kind;
200
+ kindSel.title = 'field type';
201
+ for (const k of KIND_CHOICES) {
202
+ const opt = document.createElement('option');
203
+ opt.value = k;
204
+ opt.textContent = k;
205
+ if (k === row.kind)
206
+ opt.selected = true;
207
+ kindSel.appendChild(opt);
208
+ }
209
+ kindSel.addEventListener('change', () => setValue(structChangeType(current, row.key, kindSel.value)));
210
+ // Delete button.
211
+ const del = document.createElement('button');
212
+ del.type = 'button';
213
+ del.textContent = '×';
214
+ del.title = 'remove field';
215
+ del.style.cssText = css.drop;
216
+ del.addEventListener('click', () => setValue(structRemoveField(current, row.key)));
217
+ line.appendChild(keyEl);
218
+ line.appendChild(input);
219
+ line.appendChild(kindSel);
220
+ line.appendChild(del);
221
+ root.appendChild(line);
222
+ }
223
+ // "+ add field" — appends a fresh text field; user immediately edits its key and type.
224
+ const add = document.createElement('button');
225
+ add.type = 'button';
226
+ add.textContent = '+ add field';
227
+ add.style.cssText = css.add;
228
+ add.addEventListener('click', () => setValue(structAddField(current, structFreshKey(current), 'text')));
229
+ root.appendChild(add);
230
+ };
231
+ const key = String(node.id);
232
+ renderHooks.set(key, render);
233
+ render(value);
234
+ return () => { renderHooks.delete(key); root.remove(); };
235
+ },
236
+ update({ value, node }) {
237
+ // The editor calls update on external changes (undo, programmatic setWidgetValue, scatter
238
+ // writeback). Find the per-node render hook stored at mount time.
239
+ renderHooks.get(String(node.id))?.(value);
240
+ },
241
+ };
242
+ //# sourceMappingURL=struct-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"struct-widget.js","sourceRoot":"","sources":["../../src/editor/struct-widget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare const VERSION = "0.0.0";
2
+ export { Runtime } from './vm/interpreter.js';
3
+ export type { NodeDef, PureIO, ExecIO, RtNode, RtPin, RtEdge, RtGraph } from './vm/interpreter.js';
4
+ export { BUILTIN_PRIMITIVES } from './vm/primitives.js';
5
+ export { COLLECTION_PRIMITIVES, domainNodes, SCATTER_VAR_PREFIX, OUTPUT_VAR_PREFIX } from './vm/collection.js';
6
+ export { asNumber, asBool, asArray } from './vm/value.js';
7
+ export type { VmValue } from './vm/value.js';
8
+ export { Allocate } from './model/allocate.js';
9
+ export { mandelbrotPixelGraph, mandelbrotPixelReference } from './model/mandelbrot-graph.js';
10
+ export { codegen } from './vm/codegen.js';
11
+ export { runtimePlugin } from './editor/plugin.js';
12
+ export { attachRuntimeBridge } from './editor/runtime-bridge.js';
13
+ export { PIN_TYPES, PRIMITIVE_SCHEMAS, PRIMITIVE_CATEGORY_COLORS, PRIMITIVE_ICONS } from './editor/schemas.js';
14
+ export { pinsFromSchemaFields, widgetsFromSchemaFields, schemaPinTypeFor } from './editor/schema-sync.js';
15
+ export type { SchemaExtraPin } from './editor/schema-sync.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAA;AAE9B,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClG,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC9G,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACzD,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAA;AAC5F,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC9G,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AACzG,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ export const VERSION = '0.0.0';
2
+ export { Runtime } from './vm/interpreter.js';
3
+ export { BUILTIN_PRIMITIVES } from './vm/primitives.js';
4
+ export { COLLECTION_PRIMITIVES, domainNodes, SCATTER_VAR_PREFIX, OUTPUT_VAR_PREFIX } from './vm/collection.js';
5
+ export { asNumber, asBool, asArray } from './vm/value.js';
6
+ export { Allocate } from './model/allocate.js';
7
+ export { mandelbrotPixelGraph, mandelbrotPixelReference } from './model/mandelbrot-graph.js';
8
+ export { codegen } from './vm/codegen.js';
9
+ export { runtimePlugin } from './editor/plugin.js';
10
+ export { attachRuntimeBridge } from './editor/runtime-bridge.js';
11
+ export { PIN_TYPES, PRIMITIVE_SCHEMAS, PRIMITIVE_CATEGORY_COLORS, PRIMITIVE_ICONS } from './editor/schemas.js';
12
+ export { pinsFromSchemaFields, widgetsFromSchemaFields, schemaPinTypeFor } from './editor/schema-sync.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAA;AAE9B,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC9G,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAGzD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAA;AAC5F,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC9G,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA"}