@graphrefly/graphrefly 0.11.0 → 0.13.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 (69) hide show
  1. package/dist/{chunk-FMVFRP7L.js → chunk-5RN7NBNG.js} +5 -5
  2. package/dist/{chunk-UG2QZMRN.js → chunk-6B2ZCCNN.js} +40 -39
  3. package/dist/chunk-6B2ZCCNN.js.map +1 -0
  4. package/dist/{chunk-2VHNCFGG.js → chunk-H4UFM6WD.js} +46 -17
  5. package/dist/chunk-H4UFM6WD.js.map +1 -0
  6. package/dist/{chunk-PZCDQD2U.js → chunk-HA6QMDKQ.js} +4 -4
  7. package/dist/{chunk-5WXTWOD7.js → chunk-KNGOJEYP.js} +2 -2
  8. package/dist/{chunk-OHUECHWY.js → chunk-PFMXKG4Y.js} +2 -2
  9. package/dist/{chunk-U5HFZGAQ.js → chunk-QOGWU5K7.js} +3 -3
  10. package/dist/{chunk-3WACHRHV.js → chunk-UPC5OEB5.js} +17 -17
  11. package/dist/chunk-UPC5OEB5.js.map +1 -0
  12. package/dist/{chunk-2OTXEZQO.js → chunk-UQI4GAHD.js} +3 -3
  13. package/dist/compat/nestjs/index.cjs +37 -37
  14. package/dist/compat/nestjs/index.cjs.map +1 -1
  15. package/dist/compat/nestjs/index.d.cts +4 -4
  16. package/dist/compat/nestjs/index.d.ts +4 -4
  17. package/dist/compat/nestjs/index.js +7 -7
  18. package/dist/core/index.cjs +39 -39
  19. package/dist/core/index.cjs.map +1 -1
  20. package/dist/core/index.d.cts +2 -2
  21. package/dist/core/index.d.ts +2 -2
  22. package/dist/core/index.js +5 -5
  23. package/dist/extra/index.cjs +79 -51
  24. package/dist/extra/index.cjs.map +1 -1
  25. package/dist/extra/index.d.cts +4 -4
  26. package/dist/extra/index.d.ts +4 -4
  27. package/dist/extra/index.js +5 -5
  28. package/dist/graph/index.cjs +37 -37
  29. package/dist/graph/index.cjs.map +1 -1
  30. package/dist/graph/index.d.cts +3 -3
  31. package/dist/graph/index.d.ts +3 -3
  32. package/dist/graph/index.js +4 -4
  33. package/dist/{graph-DXT95WZ3.d.ts → graph-BXIK5Dq5.d.ts} +1 -1
  34. package/dist/{graph-BE10ujU9.d.cts → graph-BhADtuFU.d.cts} +1 -1
  35. package/dist/{index-QfbXNW1N.d.cts → index-BNB0KjKe.d.ts} +24 -21
  36. package/dist/{index-C0_7g9sj.d.ts → index-BkToATim.d.ts} +1 -1
  37. package/dist/{index-Bbgvinsi.d.ts → index-CKyYg4IP.d.ts} +17 -13
  38. package/dist/{index-CCvzN5GB.d.cts → index-DANO9Gg7.d.cts} +2 -2
  39. package/dist/{index-DpZozxaJ.d.cts → index-DBhLjWSV.d.cts} +17 -13
  40. package/dist/{index-Dzdm20sx.d.ts → index-DKIyo4Bq.d.cts} +24 -21
  41. package/dist/{index-53cDGX7F.d.ts → index-DSp5R3Xq.d.ts} +3 -3
  42. package/dist/{index-aBZ2RoP0.d.cts → index-Dqemj9q0.d.cts} +3 -3
  43. package/dist/{index-nRulwTr-.d.cts → index-Wa8jXne6.d.cts} +1 -1
  44. package/dist/{index-B10Q0sQB.d.ts → index-fYObbpUw.d.ts} +2 -2
  45. package/dist/index.cjs +283 -71
  46. package/dist/index.cjs.map +1 -1
  47. package/dist/index.d.cts +85 -15
  48. package/dist/index.d.ts +85 -15
  49. package/dist/index.js +200 -16
  50. package/dist/index.js.map +1 -1
  51. package/dist/{meta-BcuDhtwu.d.cts → meta-CrZUQAJ6.d.cts} +1 -1
  52. package/dist/{meta-BcuDhtwu.d.ts → meta-CrZUQAJ6.d.ts} +1 -1
  53. package/dist/patterns/reactive-layout/index.cjs +50 -50
  54. package/dist/patterns/reactive-layout/index.cjs.map +1 -1
  55. package/dist/patterns/reactive-layout/index.d.cts +3 -3
  56. package/dist/patterns/reactive-layout/index.d.ts +3 -3
  57. package/dist/patterns/reactive-layout/index.js +4 -4
  58. package/dist/{reactive-log-OULQssZg.d.cts → reactive-log-ChbpUrY2.d.cts} +2 -2
  59. package/dist/{reactive-log-Cu0VdqkT.d.ts → reactive-log-DV--7BWd.d.ts} +2 -2
  60. package/package.json +1 -1
  61. package/dist/chunk-2VHNCFGG.js.map +0 -1
  62. package/dist/chunk-3WACHRHV.js.map +0 -1
  63. package/dist/chunk-UG2QZMRN.js.map +0 -1
  64. /package/dist/{chunk-FMVFRP7L.js.map → chunk-5RN7NBNG.js.map} +0 -0
  65. /package/dist/{chunk-PZCDQD2U.js.map → chunk-HA6QMDKQ.js.map} +0 -0
  66. /package/dist/{chunk-5WXTWOD7.js.map → chunk-KNGOJEYP.js.map} +0 -0
  67. /package/dist/{chunk-OHUECHWY.js.map → chunk-PFMXKG4Y.js.map} +0 -0
  68. /package/dist/{chunk-U5HFZGAQ.js.map → chunk-QOGWU5K7.js.map} +0 -0
  69. /package/dist/{chunk-2OTXEZQO.js.map → chunk-UQI4GAHD.js.map} +0 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/compat/index.ts","../src/compat/jotai/index.ts","../src/compat/nanostores/index.ts","../src/compat/react/index.ts","../src/compat/signals/index.ts","../src/compat/solid/index.ts","../src/compat/svelte/index.ts","../src/compat/vue/index.ts","../src/compat/zustand/index.ts","../src/patterns/index.ts","../src/patterns/ai.ts","../src/patterns/memory.ts","../src/patterns/demo-shell.ts","../src/patterns/domain-templates.ts","../src/patterns/reduction.ts","../src/patterns/graphspec.ts","../src/patterns/messaging.ts","../src/patterns/orchestration.ts","../src/index.ts"],"sourcesContent":["/**\n * Compat layer: compatibility wrappers for other state management libraries (Phase 5.1b).\n *\n * Framework adapters are optional peers. Install only what you use:\n * - `@graphrefly/graphrefly-ts/compat/react` -> `react`, `react-dom`\n * - `@graphrefly/graphrefly-ts/compat/vue` -> `vue`\n * - `@graphrefly/graphrefly-ts/compat/svelte` -> `svelte`\n * - `@graphrefly/graphrefly-ts/compat/solid` -> `solid-js`\n */\nexport * as jotai from \"./jotai/index.js\";\nexport * as nanostores from \"./nanostores/index.js\";\nexport * as nestjs from \"./nestjs/index.js\";\nexport * as react from \"./react/index.js\";\nexport * as signals from \"./signals/index.js\";\nexport * as solid from \"./solid/index.js\";\nexport * as svelte from \"./svelte/index.js\";\nexport * as vue from \"./vue/index.js\";\nexport * as zustand from \"./zustand/index.js\";\n","import { dynamicNode } from \"../../core/dynamic-node.js\";\nimport { DATA, ERROR, type Messages } from \"../../core/messages.js\";\nimport type { Node } from \"../../core/node.js\";\nimport { state } from \"../../core/sugar.js\";\n\n/**\n * Options for creating an atom.\n *\n * @category compat\n */\nexport interface AtomOptions {\n\t/** Optional identifier for the underlying node. */\n\tname?: string;\n\t/** Optional companion meta nodes. */\n\tmeta?: Record<string, unknown>;\n}\n\n/**\n * A read-only Jotai-compatible atom.\n *\n * @category compat\n */\nexport interface ReadableAtom<T> {\n\t/** Returns the current cached value. */\n\tget(): T;\n\t/** Subscribes to value changes. Returns an unsubscribe function. */\n\tsubscribe(callback: (value: T) => void): () => void;\n\t/** Access to companion meta nodes. */\n\treadonly meta: Record<string, Node>;\n\t/** @internal The underlying GraphReFly node. */\n\t_node: Node<T>;\n}\n\n/**\n * A writable Jotai-compatible atom.\n *\n * @category compat\n */\nexport interface WritableAtom<T> extends ReadableAtom<T> {\n\t/** Sets a new value. */\n\tset(value: T): void;\n\t/** Updates the value using a transformation function. */\n\tupdate(fn: (current: T) => T): void;\n}\n\n/** Function type for reading other atoms inside a derived atom. */\nexport type GetFn = <V>(a: ReadableAtom<V>) => V;\n/** Function type for writing to other atoms inside a writable derived atom. */\nexport type SetFn = <V>(a: WritableAtom<V>, value: V) => void;\n\n/** Function that computes the atom's value. */\nexport type ReadFn<T> = (get: GetFn) => T;\n/** Function that handles writes to the atom. */\nexport type WriteFn<T> = (get: GetFn, set: SetFn, value: T) => void;\n\n/**\n * Creates a Jotai-compatible atom built on GraphReFly primitives.\n *\n * Supports three overloads:\n * 1. `atom(initial)` — Writable primitive atom (wraps `state()`).\n * 2. `atom(read)` — Read-only derived atom (wraps `dynamicNode()`).\n * 3. `atom(read, write)` — Writable derived atom.\n *\n * @param initialOrRead - Initial value or a read function.\n * @param writeOrOptions - Write function or options object.\n * @param options - Optional configuration.\n * @returns WritableAtom or ReadableAtom.\n *\n * @example\n * ```ts\n * const count = atom(0);\n * count.set(1);\n * const doubled = atom((get) => get(count)! * 2);\n * ```\n *\n * @category compat\n */\nexport function atom<T>(initial: T, options?: AtomOptions): WritableAtom<T>;\nexport function atom<T>(read: ReadFn<T>, options?: AtomOptions): ReadableAtom<T>;\nexport function atom<T>(read: ReadFn<T>, write: WriteFn<T>, options?: AtomOptions): WritableAtom<T>;\nexport function atom<T>(\n\tinitialOrRead: T | ReadFn<T>,\n\twriteOrOptions?: WriteFn<T> | AtomOptions,\n\toptions?: AtomOptions,\n): ReadableAtom<T> | WritableAtom<T> {\n\tif (typeof initialOrRead === \"function\") {\n\t\tconst read = initialOrRead as ReadFn<T>;\n\t\tif (typeof writeOrOptions === \"function\") {\n\t\t\treturn createDerivedAtom(read, writeOrOptions as WriteFn<T>, options);\n\t\t}\n\t\treturn createDerivedAtom(read, undefined, writeOrOptions as AtomOptions);\n\t}\n\n\treturn createPrimitiveAtom(initialOrRead as T, writeOrOptions as AtomOptions);\n}\n\nfunction pull<T>(n: Node<T>): T {\n\tlet val: T | undefined = n.get();\n\tlet err: any;\n\tconst unsub = n.subscribe((msgs: Messages) => {\n\t\tfor (const [t, v] of msgs) {\n\t\t\tif (t === DATA) val = v as T;\n\t\t\tif (t === ERROR) err = v;\n\t\t}\n\t});\n\tunsub();\n\tif (err) throw err;\n\treturn val as T;\n}\n\nfunction createPrimitiveAtom<T>(initial: T, options?: AtomOptions): WritableAtom<T> {\n\tconst n = state(initial, {\n\t\t...options,\n\t\tresubscribable: true,\n\t\tresetOnTeardown: true,\n\t});\n\treturn {\n\t\tget: () => {\n\t\t\tif (n.status === \"disconnected\") {\n\t\t\t\treturn pull(n);\n\t\t\t}\n\t\t\treturn n.get() as T;\n\t\t},\n\t\tset: (value: T) => n.down([[DATA, value]]),\n\t\tupdate: (fn: (current: T) => T) => {\n\t\t\tconst current = n.status === \"disconnected\" ? pull(n) : (n.get() as T);\n\t\t\tn.down([[DATA, fn(current)]]);\n\t\t},\n\t\tsubscribe: (cb: (value: T) => void) => {\n\t\t\treturn n.subscribe((msgs: Messages) => {\n\t\t\t\tfor (const [t, v] of msgs) {\n\t\t\t\t\tif (t === DATA) cb(v as T);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tmeta: n.meta,\n\t\t_node: n,\n\t};\n}\n\nfunction createDerivedAtom<T>(\n\tread: ReadFn<T>,\n\twrite?: WriteFn<T>,\n\toptions?: AtomOptions,\n): ReadableAtom<T> | WritableAtom<T> {\n\tconst n = dynamicNode(\n\t\t(get) =>\n\t\t\tread(<V>(a: ReadableAtom<V>) => {\n\t\t\t\tconst dn = a._node;\n\t\t\t\tif (dn.status === \"disconnected\") {\n\t\t\t\t\tpull(dn);\n\t\t\t\t}\n\t\t\t\treturn get(dn) as V;\n\t\t\t}),\n\t\t{\n\t\t\t...options,\n\t\t\tresubscribable: true,\n\t\t\tresetOnTeardown: true,\n\t\t},\n\t);\n\n\tconst result: ReadableAtom<T> = {\n\t\tget: () => {\n\t\t\tif (n.status === \"disconnected\") {\n\t\t\t\treturn pull(n);\n\t\t\t}\n\t\t\treturn n.get() as T;\n\t\t},\n\t\tsubscribe: (cb: (value: T) => void) => {\n\t\t\treturn n.subscribe((msgs: Messages) => {\n\t\t\t\tfor (const [t, v] of msgs) {\n\t\t\t\t\tif (t === DATA) cb(v as T);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tmeta: n.meta,\n\t\t_node: n,\n\t};\n\n\tif (write) {\n\t\tconst getFn: GetFn = <V>(a: ReadableAtom<V>) => a.get();\n\t\tconst setFn: SetFn = <V>(a: WritableAtom<V>, value: V) => a.set(value);\n\n\t\tconst writable = result as WritableAtom<T>;\n\t\twritable.set = (value: T) => write(getFn, setFn, value);\n\t\twritable.update = (fn: (current: T) => T) => {\n\t\t\tconst current = n.status === \"disconnected\" ? pull(n) : (n.get() as T);\n\t\t\treturn write(getFn, setFn, fn(current));\n\t\t};\n\t\treturn writable;\n\t}\n\n\treturn result;\n}\n","import { batch } from \"../../core/batch.js\";\nimport { type DynGet, dynamicNode } from \"../../core/dynamic-node.js\";\nimport { DATA, ERROR, type Messages } from \"../../core/messages.js\";\nimport type { Node } from \"../../core/node.js\";\nimport { state } from \"../../core/sugar.js\";\n\n/**\n * A Nanostores-compatible atom.\n *\n * @category compat\n */\nexport interface NanoAtom<T> {\n\t/** Get current value. */\n\tget(): T;\n\t/** Set a new value (writable atoms only). */\n\tset(value: T): void;\n\t/** Subscribe to value changes. Callback receives the new value.\n\t * Returns unsubscribe function. Called immediately with current value. */\n\tsubscribe(cb: (value: T) => void): () => void;\n\t/** Listen to value changes (no immediate call). Returns unsubscribe. */\n\tlisten(cb: (value: T) => void): () => void;\n\t/** The underlying GraphReFly node. */\n\treadonly _node: Node<T>;\n}\n\n/**\n * A Nanostores-compatible computed store.\n *\n * @category compat\n */\nexport interface NanoComputed<T> {\n\t/** Get current value. */\n\tget(): T;\n\t/** Subscribe to value changes. Called immediately with current value.\n\t * Returns unsubscribe function. */\n\tsubscribe(cb: (value: T) => void): () => void;\n\t/** Listen to value changes (no immediate call). Returns unsubscribe. */\n\tlisten(cb: (value: T) => void): () => void;\n\t/** The underlying GraphReFly node. */\n\treadonly _node: Node<T>;\n}\n\n/**\n * A Nanostores-compatible map.\n *\n * @category compat\n */\nexport interface NanoMap<T extends Record<string, unknown>> extends NanoAtom<T> {\n\t/** Set a single key. */\n\tsetKey<K extends keyof T>(key: K, value: T[K]): void;\n}\n\nconst START_LISTENERS = new WeakMap<Node<any>, Set<() => void>>();\nconst STOP_LISTENERS = new WeakMap<Node<any>, Set<() => void>>();\n\nfunction trigger(node: Node<any>, map: WeakMap<Node<any>, Set<() => void>>) {\n\tconst callbacks = map.get(node);\n\tif (callbacks) {\n\t\tfor (const cb of callbacks) cb();\n\t}\n}\n\nfunction createStore<T>(node: Node<T>, extra: any = {}): any {\n\tlet listeners = 0;\n\tconst store = {\n\t\t...extra,\n\t\tget: () => getVal(node),\n\t\tsubscribe: (cb: (value: T) => void) => {\n\t\t\tif (listeners === 0) trigger(node, START_LISTENERS);\n\t\t\tlisteners++;\n\t\t\tconst sub = node.subscribe((msgs: Messages) => {\n\t\t\t\tfor (const [t, v] of msgs) {\n\t\t\t\t\tif (t === DATA) cb(v as T);\n\t\t\t\t}\n\t\t\t});\n\t\t\tcb(getVal(node));\n\t\t\treturn () => {\n\t\t\t\tsub();\n\t\t\t\tlisteners--;\n\t\t\t\tif (listeners === 0) trigger(node, STOP_LISTENERS);\n\t\t\t};\n\t\t},\n\t\tlisten: (cb: (value: T) => void) => {\n\t\t\tif (listeners === 0) trigger(node, START_LISTENERS);\n\t\t\tlisteners++;\n\t\t\tconst sub = node.subscribe((msgs: Messages) => {\n\t\t\t\tfor (const [t, v] of msgs) {\n\t\t\t\t\tif (t === DATA) cb(v as T);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tsub();\n\t\t\t\tlisteners--;\n\t\t\t\tif (listeners === 0) trigger(node, STOP_LISTENERS);\n\t\t\t};\n\t\t},\n\t\t_node: node,\n\t};\n\treturn store;\n}\n\nfunction pull<T>(n: Node<T>): T {\n\tlet val: T | undefined = n.get();\n\tlet err: any;\n\tconst unsub = n.subscribe((msgs: Messages) => {\n\t\tfor (const [t, v] of msgs) {\n\t\t\tif (t === DATA) val = v as T;\n\t\t\tif (t === ERROR) err = v;\n\t\t}\n\t});\n\tunsub();\n\tif (err) throw err;\n\treturn val as T;\n}\n\nfunction getVal<T>(n: Node<T>): T {\n\tif (n.status === \"disconnected\") {\n\t\treturn pull(n);\n\t}\n\treturn n.get() as T;\n}\n\n/**\n * Creates a nanostores-compatible atom.\n *\n * @param initial - Initial value.\n * @returns `NanoAtom<T>`\n *\n * @category compat\n */\nexport function atom<T>(initial: T): NanoAtom<T> {\n\tconst n = state<T>(initial, {\n\t\tresubscribable: true,\n\t\tresetOnTeardown: true,\n\t});\n\n\treturn createStore(n, {\n\t\tset: (value: T) => n.down([[DATA, value]]),\n\t});\n}\n\n/**\n * Creates a nanostores-compatible computed store.\n *\n * @param stores - One or more atoms/computed stores.\n * @param fn - Compute function.\n * @returns `NanoComputed<T>`\n *\n * @category compat\n */\nexport function computed<T, A>(\n\tstoreA: NanoAtom<A> | NanoComputed<A>,\n\tfn: (a: A) => T,\n): NanoComputed<T>;\nexport function computed<T, A, B>(\n\tstores: [NanoAtom<A> | NanoComputed<A>, NanoAtom<B> | NanoComputed<B>],\n\tfn: (a: A, b: B) => T,\n): NanoComputed<T>;\nexport function computed<T, A, B, C>(\n\tstores: [\n\t\tNanoAtom<A> | NanoComputed<A>,\n\t\tNanoAtom<B> | NanoComputed<B>,\n\t\tNanoAtom<C> | NanoComputed<C>,\n\t],\n\tfn: (a: A, b: B, c: C) => T,\n): NanoComputed<T>;\nexport function computed<T>(stores: any, fn: (...args: any[]) => T): NanoComputed<T> {\n\tconst storeArray: Array<NanoAtom<any> | NanoComputed<any>> = Array.isArray(stores)\n\t\t? stores\n\t\t: [stores];\n\n\tconst n = dynamicNode(\n\t\t(get: DynGet) => {\n\t\t\tconst vals = storeArray.map((s) => {\n\t\t\t\tconst node = s._node;\n\t\t\t\tif (node.status === \"disconnected\") {\n\t\t\t\t\tpull(node);\n\t\t\t\t}\n\t\t\t\treturn get(node);\n\t\t\t});\n\t\t\treturn fn(...vals);\n\t\t},\n\t\t{\n\t\t\tresubscribable: true,\n\t\t\tresetOnTeardown: true,\n\t\t\tequals: Object.is as any,\n\t\t},\n\t);\n\n\treturn createStore(n);\n}\n\n/**\n * Creates a nanostores-compatible map.\n *\n * @param initial - Initial object value.\n * @returns `NanoMap<T>`\n *\n * @category compat\n */\nexport function map<T extends Record<string, unknown>>(initial: T): NanoMap<T> {\n\tconst n = state<T>(initial, {\n\t\tresubscribable: true,\n\t\tresetOnTeardown: true,\n\t\tequals: () => false,\n\t});\n\n\treturn createStore(n, {\n\t\tset: (value: T) => n.down([[DATA, value]]),\n\t\tsetKey: <K extends keyof T>(key: K, value: T[K]) => {\n\t\t\tconst current = getVal(n);\n\t\t\tn.down([[DATA, { ...current, [key]: value }]]);\n\t\t},\n\t});\n}\n\n/**\n * Returns the current value of the store.\n *\n * @category compat\n */\nexport function getValue<T>(store: NanoAtom<T> | NanoComputed<T>): T {\n\treturn store.get();\n}\n\n/**\n * Adds a listener for the store start (first listener connected).\n *\n * @category compat\n */\nexport function onStart(store: NanoAtom<any> | NanoComputed<any>, cb: () => void): void {\n\tconst node = store._node;\n\tlet callbacks = START_LISTENERS.get(node);\n\tif (!callbacks) {\n\t\tcallbacks = new Set();\n\t\tSTART_LISTENERS.set(node, callbacks);\n\t}\n\tcallbacks.add(cb);\n}\n\n/**\n * Adds a listener for the store stop (last listener disconnected).\n *\n * @category compat\n */\nexport function onStop(store: NanoAtom<any> | NanoComputed<any>, cb: () => void): void {\n\tconst node = store._node;\n\tlet callbacks = STOP_LISTENERS.get(node);\n\tif (!callbacks) {\n\t\tcallbacks = new Set();\n\t\tSTOP_LISTENERS.set(node, callbacks);\n\t}\n\tcallbacks.add(cb);\n}\n\n/**\n * Adds a listener for the store mount (first listener connected).\n *\n * @returns A cleanup function called when the last listener is removed.\n * @category compat\n */\nexport function onMount(\n\tstore: NanoAtom<any> | NanoComputed<any>,\n\tcb: () => (() => void) | undefined,\n): void {\n\tonStart(store, () => {\n\t\tconst stop = cb();\n\t\tif (typeof stop === \"function\") onStop(store, stop);\n\t});\n}\n\n/**\n * Batches multiple store updates.\n *\n * @category compat\n */\nexport function action<Args extends any[], Return>(\n\t_store: NanoAtom<any> | NanoComputed<any>,\n\t_name: string,\n\tfn: (...args: Args) => Return,\n): (...args: Args) => Return {\n\treturn (...args: Args) => {\n\t\tlet result: any;\n\t\tbatch(() => {\n\t\t\tresult = fn(...args);\n\t\t});\n\t\treturn result as Return;\n\t};\n}\n","// ---------------------------------------------------------------------------\n// React bindings — useStore / useSubscribe\n// ---------------------------------------------------------------------------\n// Bridges GraphReFly nodes into React via useSyncExternalStore.\n// Works with any Node<T>, including companion nodes (node.meta.status).\n//\n// Usage:\n// import { useStore, useSubscribe } from '@graphrefly/graphrefly-ts/compat/react';\n// // Optional peer install (only for this adapter): pnpm add react react-dom\n// const value = useSubscribe(myNode); // T | undefined (read-only)\n// const [count, setCount] = useStore(counter); // [T | undefined, setter]\n// ---------------------------------------------------------------------------\n\nimport { useCallback, useMemo, useRef, useSyncExternalStore } from \"react\";\nimport { DATA, DIRTY, type Messages, messageTier } from \"../../core/messages.js\";\nimport type { Node } from \"../../core/node.js\";\n\n/**\n * Subscribe to a read-only `Node<T>` as a React value. Re-renders on node value settlement.\n * Subscription lifecycle is tied to React mount/unmount (not node terminal messages).\n *\n * @param node - Any `Node<T>`.\n * @returns `T | undefined` — the current node value, kept in sync via `useSyncExternalStore`.\n */\nexport function useSubscribe<T>(node: Node<T>): T | undefined {\n\treturn useSyncExternalStore(\n\t\t(onStoreChange) => {\n\t\t\tlet disposed = false;\n\t\t\tconst unsub = node.subscribe(() => {\n\t\t\t\tif (!disposed) onStoreChange();\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tdisposed = true;\n\t\t\t\tunsub();\n\t\t\t};\n\t\t},\n\t\t() => node.get(),\n\t\t() => node.get(), // Server snapshot\n\t);\n}\n\n/**\n * Bind a writable `Node<T>` as a React `[value, setter]` tuple.\n * Setting the value always pushes `[[DIRTY], [DATA, value]]`, including `value === undefined`.\n * Subscription lifecycle is tied to React mount/unmount (not node terminal messages).\n *\n * @param node - A `Node<T>` (e.g. state node).\n * @returns `[T | undefined, (value: T) => void]` — current value and setter function.\n */\nexport function useStore<T>(node: Node<T>): [T | undefined, (value: T) => void] {\n\tconst value = useSubscribe(node);\n\tconst setter = useCallback(\n\t\t(v: T) => {\n\t\t\tnode.down([[DIRTY], [DATA, v]]);\n\t\t},\n\t\t[node],\n\t);\n\treturn [value, setter];\n}\n\n/** Maps a key to an object of nodes. Used by `useSubscribeRecord`. */\nexport type NodeFactory<K, R extends Record<string, any>> = (key: K) => {\n\t[P in keyof R]: Node<R[P]>;\n};\n\n/**\n * Subscribe to a dynamic set of keyed node records.\n * Re-subscribes all per-key fields whenever `keysNode` changes.\n * Key re-sync is gated to settled batches (`messageTier >= 2`) to avoid DIRTY-phase churn.\n * Guaranteed to clean up strictly with React hook lifecycle, utilizing no global mappings.\n *\n * @param keysNode - Node of current keys (e.g. node IDs)\n * @param factory - Function returning `{ [field]: Node<V> }` for each key.\n * @returns `Record<K, R>` — snapshot of resolved values for all keys.\n */\nexport function useSubscribeRecord<K extends string, R extends Record<string, any>>(\n\tkeysNode: Node<K[]>,\n\tfactory: NodeFactory<K, R>,\n): Record<K, R> {\n\tconst factoryRef = useRef(factory);\n\tfactoryRef.current = factory;\n\n\tconst store = useMemo(() => {\n\t\tconst computeSnap = () => {\n\t\t\tconst snap = {} as Record<K, R>;\n\t\t\tconst keys = keysNode.get() ?? [];\n\t\t\tfor (const key of keys) {\n\t\t\t\tconst nodes = factoryRef.current(key);\n\t\t\t\tconst values = {} as R;\n\t\t\t\tfor (const field of Object.keys(nodes) as (keyof R)[]) {\n\t\t\t\t\tvalues[field] = nodes[field].get() as R[keyof R];\n\t\t\t\t}\n\t\t\t\tsnap[key] = values;\n\t\t\t}\n\t\t\treturn snap;\n\t\t};\n\n\t\tlet currentSnapshot = computeSnap();\n\n\t\treturn {\n\t\t\tsubscribe: (onStoreChange: () => void) => {\n\t\t\t\tlet disposed = false;\n\t\t\t\tlet entrySubs: Array<() => void> = [];\n\n\t\t\t\tconst cleanupEntries = () => {\n\t\t\t\t\tfor (const unsub of entrySubs) unsub();\n\t\t\t\t\tentrySubs = [];\n\t\t\t\t};\n\n\t\t\t\tconst sync = (nextKeys: K[]) => {\n\t\t\t\t\tcleanupEntries();\n\t\t\t\t\tfor (const key of nextKeys) {\n\t\t\t\t\t\tconst nodes = factoryRef.current(key);\n\t\t\t\t\t\tfor (const field of Object.keys(nodes) as (keyof R)[]) {\n\t\t\t\t\t\t\tconst unsub = nodes[field].subscribe(() => {\n\t\t\t\t\t\t\t\tcurrentSnapshot = computeSnap();\n\t\t\t\t\t\t\t\tif (!disposed) onStoreChange();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tentrySubs.push(unsub);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcurrentSnapshot = computeSnap();\n\t\t\t\t\tif (!disposed) onStoreChange();\n\t\t\t\t};\n\n\t\t\t\tconst keysUnsub = keysNode.subscribe((msgs: Messages) => {\n\t\t\t\t\tconst hasSettled = msgs.some((m) => messageTier(m[0]) >= 2);\n\t\t\t\t\tif (!disposed && hasSettled) sync(keysNode.get() ?? []);\n\t\t\t\t});\n\t\t\t\tsync(keysNode.get() ?? []);\n\n\t\t\t\treturn () => {\n\t\t\t\t\tdisposed = true;\n\t\t\t\t\tkeysUnsub();\n\t\t\t\t\tcleanupEntries();\n\t\t\t\t};\n\t\t\t},\n\t\t\tgetSnapshot: () => currentSnapshot,\n\t\t};\n\t}, [keysNode]);\n\n\treturn useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);\n}\n","import { batch } from \"../../core/batch.js\";\nimport { type DynGet, dynamicNode } from \"../../core/dynamic-node.js\";\nimport { COMPLETE, DATA, DIRTY, ERROR, type Messages } from \"../../core/messages.js\";\nimport type { Node } from \"../../core/node.js\";\nimport { state } from \"../../core/sugar.js\";\n\n/**\n * Options for creating signals.\n *\n * @category compat\n */\nexport interface SignalOptions {\n\t/** Optional identifier for the underlying node. */\n\tname?: string;\n\t/** Custom equality function for change detection. */\n\tequals?: (a: any, b: any) => boolean;\n}\n\n/**\n * Common interface for all reactive signals.\n *\n * @category compat\n */\nexport interface AnySignal<T> {\n\t/** Returns the current value of the signal. */\n\tget(): T;\n\t/** @internal The underlying GraphReFly node. */\n\t_node: Node<T>;\n}\n\n/**\n * Global stack of active tracking contexts.\n * Since computation evaluation is fully synchronous, we push the tracking `get`\n * function before execution and pop it after. This prevents memory leaks without\n * needing WeakRefs, as the stack is always empty when idle.\n */\nconst trackingStack: DynGet[] = [];\n\n/**\n * Helper to pull a disconnected node, forcing a synchronous resolution\n * cycle so that `get()` returns a fresh value even if the signal is unmounted.\n */\nfunction pull<T>(n: Node<T>): T {\n\tlet val: T | undefined = n.get();\n\tconst unsub = n.subscribe((msgs: Messages) => {\n\t\tfor (const [t, v] of msgs) {\n\t\t\tif (t === DATA) val = v as T;\n\t\t}\n\t});\n\tunsub();\n\treturn val as T;\n}\n\n/**\n * TC39 `Signal.State` — a writable signal backed by a GraphReFly `state` node.\n * Automatically registers itself as a dependency if read inside a `Computed`.\n *\n * @example\n * ```ts\n * const count = new Signal.State(0);\n * count.get(); // 0\n * count.set(1);\n * count.get(); // 1\n * ```\n */\nclass SignalState<T> implements AnySignal<T> {\n\t/** @internal */\n\t_node: Node<T>;\n\tprivate readonly _equals: (a: T, b: T) => boolean;\n\n\tconstructor(initial: T, opts?: SignalOptions) {\n\t\tthis._equals = (opts?.equals ?? Object.is) as (a: T, b: T) => boolean;\n\t\tthis._node = state<T>(initial, {\n\t\t\t...opts,\n\t\t\tresubscribable: true,\n\t\t\tresetOnTeardown: true,\n\t\t});\n\t}\n\n\tget(): T {\n\t\t// If we are evaluating inside a computed node, track this read!\n\t\tconst tracker = trackingStack[trackingStack.length - 1];\n\t\tif (tracker) {\n\t\t\tif (this._node.status === \"disconnected\") {\n\t\t\t\tpull(this._node);\n\t\t\t}\n\t\t\treturn tracker(this._node) as T;\n\t\t}\n\n\t\tif (this._node.status === \"disconnected\") {\n\t\t\treturn pull(this._node);\n\t\t}\n\t\treturn this._node.get() as T;\n\t}\n\n\tset(value: T): void {\n\t\tif (this._equals(this.get(), value)) return;\n\t\tbatch(() => {\n\t\t\tthis._node.down([[DIRTY], [DATA, value]]);\n\t\t});\n\t}\n}\n\n/**\n * TC39 `Signal.Computed` — a read-only signal backed by `dynamicNode`.\n * Automatically tracks dependencies when `get()` is called on other signals\n * during its computation.\n *\n * @example\n * ```ts\n * const count = new Signal.State(0);\n * const doubled = new Signal.Computed(() => count.get() * 2);\n * ```\n */\nclass SignalComputed<T> implements AnySignal<T> {\n\t/** @internal */\n\t_node: Node<T>;\n\n\tconstructor(computation: () => T, opts?: SignalOptions) {\n\t\tthis._node = dynamicNode<T>(\n\t\t\t(get) => {\n\t\t\t\ttrackingStack.push(get);\n\t\t\t\ttry {\n\t\t\t\t\treturn computation();\n\t\t\t\t} finally {\n\t\t\t\t\ttrackingStack.pop();\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\t...opts,\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tresubscribable: true,\n\t\t\t\tresetOnTeardown: true,\n\t\t\t},\n\t\t);\n\t}\n\n\tget(): T {\n\t\t// Computed nodes can themselves be dependencies of other Computed nodes.\n\t\tconst tracker = trackingStack[trackingStack.length - 1];\n\t\tif (tracker) {\n\t\t\tif (this._node.status === \"disconnected\") {\n\t\t\t\tpull(this._node);\n\t\t\t}\n\t\t\treturn tracker(this._node) as T;\n\t\t}\n\n\t\tif (this._node.status === \"disconnected\") {\n\t\t\treturn pull(this._node);\n\t\t}\n\t\treturn this._node.get() as T;\n\t}\n}\n\n/**\n * TC39 Signals-compatible namespace. Wraps GraphReFly primitives.\n * Provides auto-tracking conforming to the TS39 signals proposal.\n *\n * @category compat\n */\nexport const Signal = {\n\tState: SignalState,\n\tComputed: SignalComputed,\n\n\t/**\n\t * Subscribes to changes on a signal.\n\t * Returns an unsubscribe callback.\n\t *\n\t * @example\n\t * ```ts\n\t * const count = new Signal.State(0);\n\t * const unsub = Signal.sub(count, v => console.log(v));\n\t * ```\n\t */\n\tsub: <T>(\n\t\tsignal: AnySignal<T>,\n\t\tcallback:\n\t\t\t| ((value: T) => void)\n\t\t\t| {\n\t\t\t\t\tdata?: (value: T) => void;\n\t\t\t\t\terror?: (err: unknown) => void;\n\t\t\t\t\tcomplete?: () => void;\n\t\t\t },\n\t): (() => void) => {\n\t\tconst handlers =\n\t\t\ttypeof callback === \"function\"\n\t\t\t\t? { data: callback as (value: T) => void, error: undefined, complete: undefined }\n\t\t\t\t: callback;\n\t\treturn signal._node.subscribe((msgs) => {\n\t\t\tfor (const [t, v] of msgs) {\n\t\t\t\tif (t === DATA) handlers.data?.(v as T);\n\t\t\t\tif (t === ERROR) handlers.error?.(v);\n\t\t\t\tif (t === COMPLETE) handlers.complete?.();\n\t\t\t}\n\t\t});\n\t},\n} as const;\n\nexport type { SignalComputed, SignalState };\n","// ---------------------------------------------------------------------------\n// Solid bindings — useSubscribe / useStore\n// ---------------------------------------------------------------------------\n// Bridges GraphReFly nodes into Solid reactivity via createSignal.\n// Works with any Node<T>, including companion nodes (node.meta.status).\n//\n// Usage:\n// import { useSubscribe, useStore } from '@graphrefly/graphrefly-ts/compat/solid';\n// // Optional peer install (only for this adapter): pnpm add solid-js\n// const status = useSubscribe(wsStatusNode); // Accessor<string | undefined>\n// const [count, setCount] = useStore(countNode); // [Accessor<number | undefined>, Setter]\n// ---------------------------------------------------------------------------\n\nimport { createSignal, getOwner, onCleanup } from \"solid-js\";\nimport { DATA, DIRTY, type Messages, messageTier } from \"../../core/messages.js\";\nimport type { Node } from \"../../core/node.js\";\n\n/** Solid accessor function — returns current value when called. */\nexport type Accessor<T> = () => T;\n\n/**\n * Subscribe to a `Node<T>` as a Solid signal. Auto-cleans up with the owning scope.\n * Subscription lifecycle is tied to Solid scope cleanup (not node terminal messages).\n */\nexport function useSubscribe<T>(node: Node<T>): Accessor<T | undefined> {\n\tconst [value, setValue] = createSignal(node.get(), { equals: false });\n\n\tconst unsub = node.subscribe(() => {\n\t\tsetValue(() => node.get());\n\t});\n\n\tif (getOwner()) {\n\t\tonCleanup(() => unsub());\n\t} else if (typeof console !== \"undefined\") {\n\t\tconsole.warn(\n\t\t\t\"[graphrefly-ts] useSubscribe called outside a Solid reactive owner — subscription will not be auto-disposed.\",\n\t\t);\n\t}\n\n\treturn value;\n}\n\n/**\n * Bind a writable `Node<T>` as a Solid resource tuple `[accessor, setter]`.\n * Setter always forwards `[[DIRTY], [DATA, value]]`, including `value === undefined`.\n * Subscription lifecycle is tied to Solid scope cleanup (not node terminal messages).\n */\nexport function useStore<T>(node: Node<T>): [Accessor<T | undefined>, (v: T) => void] {\n\tconst value = useSubscribe(node);\n\tconst setter = (v: T) => {\n\t\tnode.down([[DIRTY], [DATA, v]]);\n\t};\n\treturn [value, setter];\n}\n\n/** Maps a key to an object of nodes. Used by `useSubscribeRecord`. */\nexport type NodeFactory<K, R extends Record<string, any>> = (key: K) => {\n\t[P in keyof R]: Node<R[P]>;\n};\n\n/**\n * Subscribe to a dynamic set of keyed node records as a Solid accessor.\n * Re-subscribes all per-key fields whenever `keys` changes.\n * Key re-sync is gated to settled batches (`messageTier >= 2`) to avoid DIRTY-phase churn.\n */\nexport function useSubscribeRecord<K extends string, R extends Record<string, any>>(\n\tkeysNode: Node<K[]>,\n\tfactory: NodeFactory<K, R>,\n): Accessor<Record<K, R>> {\n\tconst [value, setValue] = createSignal({} as Record<K, R>, { equals: false });\n\tlet entrySubs: Array<() => void> = [];\n\n\tconst cleanupEntries = () => {\n\t\tfor (const unsub of entrySubs) unsub();\n\t\tentrySubs = [];\n\t};\n\n\tconst buildSnapshot = (): Record<K, R> => {\n\t\tconst snap = {} as Record<K, R>;\n\t\tfor (const key of keysNode.get() ?? []) {\n\t\t\tconst nodes = factory(key);\n\t\t\tconst values = {} as R;\n\t\t\tfor (const field of Object.keys(nodes) as (keyof R)[]) {\n\t\t\t\tvalues[field] = nodes[field].get() as R[keyof R];\n\t\t\t}\n\t\t\tsnap[key] = values;\n\t\t}\n\t\treturn snap;\n\t};\n\n\tconst sync = (nextKeys: K[]) => {\n\t\tcleanupEntries();\n\t\tfor (const key of nextKeys) {\n\t\t\tconst nodes = factory(key);\n\t\t\tfor (const field of Object.keys(nodes) as (keyof R)[]) {\n\t\t\t\tconst unsub = nodes[field].subscribe(() => {\n\t\t\t\t\tsetValue(() => buildSnapshot());\n\t\t\t\t});\n\t\t\t\tentrySubs.push(unsub);\n\t\t\t}\n\t\t}\n\t\tsetValue(() => buildSnapshot());\n\t};\n\n\tconst keysUnsub = keysNode.subscribe((msgs: Messages) => {\n\t\tif (msgs.some((m) => messageTier(m[0]) >= 2)) {\n\t\t\tsync(keysNode.get() ?? []);\n\t\t}\n\t});\n\tsync(keysNode.get() ?? []);\n\n\tif (getOwner()) {\n\t\tonCleanup(() => {\n\t\t\tkeysUnsub();\n\t\t\tcleanupEntries();\n\t\t});\n\t} else if (typeof console !== \"undefined\") {\n\t\tconsole.warn(\n\t\t\t\"[graphrefly-ts] useSubscribeRecord called outside a Solid reactive owner — subscription will not be auto-disposed.\",\n\t\t);\n\t}\n\n\treturn value;\n}\n","// ---------------------------------------------------------------------------\n// Svelte bindings — useSubscribe / useStore\n// ---------------------------------------------------------------------------\n// Bridges GraphReFly nodes into Svelte's store contract. Works with any\n// Node<T>, including companion nodes (node.meta.status).\n//\n// Usage:\n// import { useSubscribe, useStore } from '@graphrefly/graphrefly-ts/compat/svelte';\n// // Optional peer install (only for this adapter): pnpm add svelte\n// const status = useSubscribe(wsStatusNode); // Svelte readable store\n// const count = useStore(countNode); // Svelte writable store\n// // In template: $status, $count\n// // $count = 42\n// ---------------------------------------------------------------------------\n\nimport { DATA, DIRTY, type Messages, messageTier } from \"../../core/messages.js\";\nimport type { Node } from \"../../core/node.js\";\n\n/** Svelte store contract — implements the minimal `subscribe` method. */\nexport interface SvelteReadable<T> {\n\tsubscribe(run: (value: T) => void): () => void;\n}\n\n/** Svelte writable store contract. */\nexport interface SvelteWritable<T> extends SvelteReadable<T> {\n\tset(value: T): void;\n\tupdate(updater: (value: T) => T): void;\n}\n\n/**\n * Subscribe to a `Node<T>` as a Svelte readable store (implements Svelte store contract).\n * Subscription lifecycle is tied to Svelte store unsubscription (not node terminal messages).\n */\nexport function useSubscribe<T>(node: Node<T>): SvelteReadable<T | undefined> {\n\treturn {\n\t\tsubscribe(run: (value: T | undefined) => void): () => void {\n\t\t\tconst unsub = node.subscribe(() => {\n\t\t\t\trun(node.get());\n\t\t\t});\n\t\t\trun(node.get());\n\t\t\treturn unsub;\n\t\t},\n\t};\n}\n\n/**\n * Bind a writable `Node<T>` as a Svelte writable store.\n * Reads and writes adapt seamlessly.\n * Setter/update always forward `[[DIRTY], [DATA, value]]`, including `value === undefined`.\n * Subscription lifecycle is tied to Svelte store unsubscription (not node terminal messages).\n */\nexport function useStore<T>(node: Node<T>): SvelteWritable<T | undefined> {\n\treturn {\n\t\tsubscribe(run: (value: T | undefined) => void): () => void {\n\t\t\tconst unsub = node.subscribe(() => {\n\t\t\t\trun(node.get());\n\t\t\t});\n\t\t\trun(node.get());\n\t\t\treturn unsub;\n\t\t},\n\t\tset(value: T | undefined) {\n\t\t\tnode.down([[DIRTY], [DATA, value]]);\n\t\t},\n\t\tupdate(updater: (value: T | undefined) => T | undefined) {\n\t\t\tconst next = updater(node.get());\n\t\t\tnode.down([[DIRTY], [DATA, next]]);\n\t\t},\n\t};\n}\n\n/** Maps a key to an object of nodes. Used by `useSubscribeRecord`. */\nexport type NodeFactory<K, R extends Record<string, any>> = (key: K) => {\n\t[P in keyof R]: Node<R[P]>;\n};\n\n/**\n * Subscribe to a dynamic keyed record of nodes as a Svelte readable store.\n * Re-subscribes all per-key fields whenever `keysNode` changes.\n * Key re-sync is gated to settled batches (`messageTier >= 2`) to avoid DIRTY-phase churn.\n */\nexport function useSubscribeRecord<K extends string, R extends Record<string, any>>(\n\tkeysNode: Node<K[]>,\n\tfactory: NodeFactory<K, R>,\n): SvelteReadable<Record<K, R>> {\n\treturn {\n\t\tsubscribe(run: (value: Record<K, R>) => void): () => void {\n\t\t\tlet entrySubs: Array<() => void> = [];\n\n\t\t\tconst cleanupEntries = () => {\n\t\t\t\tfor (const unsub of entrySubs) unsub();\n\t\t\t\tentrySubs = [];\n\t\t\t};\n\n\t\t\tconst buildSnapshot = (): Record<K, R> => {\n\t\t\t\tconst snap = {} as Record<K, R>;\n\t\t\t\tfor (const key of keysNode.get() ?? []) {\n\t\t\t\t\tconst nodes = factory(key);\n\t\t\t\t\tconst values = {} as R;\n\t\t\t\t\tfor (const field of Object.keys(nodes) as (keyof R)[]) {\n\t\t\t\t\t\tvalues[field] = nodes[field].get() as R[keyof R];\n\t\t\t\t\t}\n\t\t\t\t\tsnap[key] = values;\n\t\t\t\t}\n\t\t\t\treturn snap;\n\t\t\t};\n\n\t\t\tconst sync = (nextKeys: K[]) => {\n\t\t\t\tcleanupEntries();\n\t\t\t\tfor (const key of nextKeys) {\n\t\t\t\t\tconst nodes = factory(key);\n\t\t\t\t\tfor (const field of Object.keys(nodes) as (keyof R)[]) {\n\t\t\t\t\t\tconst unsub = nodes[field].subscribe(() => {\n\t\t\t\t\t\t\trun(buildSnapshot());\n\t\t\t\t\t\t});\n\t\t\t\t\t\tentrySubs.push(unsub);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trun(buildSnapshot());\n\t\t\t};\n\n\t\t\tconst keysUnsub = keysNode.subscribe((msgs: Messages) => {\n\t\t\t\tif (msgs.some((m) => messageTier(m[0]) >= 2)) {\n\t\t\t\t\tsync(keysNode.get() ?? []);\n\t\t\t\t}\n\t\t\t});\n\t\t\tsync(keysNode.get() ?? []);\n\n\t\t\treturn () => {\n\t\t\t\tkeysUnsub();\n\t\t\t\tcleanupEntries();\n\t\t\t};\n\t\t},\n\t};\n}\n","// ---------------------------------------------------------------------------\n// Vue bindings — useStore / useSubscribe\n// ---------------------------------------------------------------------------\n// Bridges GraphReFly nodes into Vue reactivity. Works with any\n// Node<T>, including companion nodes (node.meta.status).\n//\n// Usage:\n// import { useStore, useSubscribe } from '@graphrefly/graphrefly-ts/compat/vue';\n// // Optional peer install (only for this adapter): pnpm add vue\n// const count = useStore(counterNode); // Ref<number | undefined> (read + write)\n// const status = useSubscribe(wsStatusNode); // Readonly<Ref<string | undefined>>\n// ---------------------------------------------------------------------------\n\nimport {\n\tcomputed,\n\tgetCurrentScope,\n\tisRef,\n\tonScopeDispose,\n\ttype Ref,\n\treadonly,\n\tshallowRef,\n\ttype WatchSource,\n\twatch,\n} from \"vue\";\nimport { DATA, DIRTY } from \"../../core/messages.js\";\nimport type { Node } from \"../../core/node.js\";\n\n/**\n * Subscribe to a read-only `Node<T>` as a Vue `Ref<T>`. Auto-unsubscribes on scope disposal.\n * Subscription lifecycle is tied to Vue scope disposal (not node terminal messages).\n */\nexport function useSubscribe<T>(node: Node<T>): Readonly<Ref<T | undefined>> {\n\tconst ref = shallowRef(node.get()) as Ref<T | undefined>;\n\n\tconst unsub = node.subscribe(() => {\n\t\tref.value = node.get();\n\t});\n\n\tif (getCurrentScope()) {\n\t\tonScopeDispose(() => unsub());\n\t} else if (typeof console !== \"undefined\") {\n\t\tconsole.warn(\n\t\t\t\"[graphrefly-ts] useSubscribe called outside a Vue scope — subscription will not be auto-disposed.\",\n\t\t);\n\t}\n\n\treturn readonly(ref) as Readonly<Ref<T | undefined>>;\n}\n\n/**\n * Bind a writable `Node<T>` as a Vue `Ref<T>`. Reads and writes are bidirectional.\n * Value sets always dispatch `[[DIRTY], [DATA, value]]`, including `value === undefined`.\n * Subscription lifecycle is tied to Vue scope disposal (not node terminal messages).\n */\nexport function useStore<T>(node: Node<T>): Ref<T | undefined> {\n\tconst inner = shallowRef(node.get()) as Ref<T | undefined>;\n\n\tconst unsub = node.subscribe(() => {\n\t\tinner.value = node.get();\n\t});\n\n\tif (getCurrentScope()) {\n\t\tonScopeDispose(() => unsub());\n\t} else if (typeof console !== \"undefined\") {\n\t\tconsole.warn(\n\t\t\t\"[graphrefly-ts] useStore called outside a Vue scope — subscription will not be auto-disposed.\",\n\t\t);\n\t}\n\n\treturn computed({\n\t\tget: () => inner.value,\n\t\tset: (v: T | undefined) => {\n\t\t\tnode.down([[DIRTY], [DATA, v]]);\n\t\t},\n\t});\n}\n\n/** Maps a key to an object of nodes. Used by `useSubscribeRecord` factory. */\nexport type NodeFactory<K, R extends Record<string, any>> = (key: K) => {\n\t[P in keyof R]: Node<R[P]>;\n};\n\n/**\n * Subscribe to a dynamic set of keyed node records. When keys change,\n * old subscriptions are torn down and new ones created automatically.\n * Must be called during Vue `setup()`.\n */\nexport function useSubscribeRecord<K extends string, R extends Record<string, any>>(\n\tkeys: WatchSource<K[] | undefined>,\n\tfactory: NodeFactory<K, R>,\n): Readonly<Ref<Record<K, R>>> {\n\tconst result = shallowRef<Record<K, R>>({} as Record<K, R>);\n\n\t// Track active subscriptions per key (strictly enclosed memory mapping)\n\tconst activeSubs = new Map<K, { subs: Array<() => void>; values: R }>();\n\tlet disposed = false;\n\n\tlet batchPending = false;\n\tfunction scheduleBatch() {\n\t\tif (batchPending) return;\n\t\tbatchPending = true;\n\t\tqueueMicrotask(() => {\n\t\t\tif (disposed) return;\n\t\t\tbatchPending = false;\n\t\t\tconst snap = {} as Record<K, R>;\n\t\t\tfor (const [key, entry] of activeSubs) {\n\t\t\t\tsnap[key] = { ...entry.values };\n\t\t\t}\n\t\t\tresult.value = snap;\n\t\t});\n\t}\n\n\tfunction sync(newKeys: K[]) {\n\t\tfor (const entry of activeSubs.values()) {\n\t\t\tfor (const unsub of entry.subs) unsub();\n\t\t}\n\t\tactiveSubs.clear();\n\n\t\tfor (const key of newKeys) {\n\t\t\tconst nodes = factory(key);\n\t\t\tconst fields = Object.keys(nodes) as (keyof R)[];\n\t\t\tconst values = {} as R;\n\t\t\tconst subs: Array<() => void> = [];\n\n\t\t\tfor (const field of fields) {\n\t\t\t\tconst node = nodes[field];\n\t\t\t\tvalues[field] = node.get() as R[keyof R];\n\t\t\t\tconst unsub = node.subscribe(() => {\n\t\t\t\t\tvalues[field] = node.get() as R[keyof R];\n\t\t\t\t\tscheduleBatch();\n\t\t\t\t});\n\t\t\t\tsubs.push(unsub);\n\t\t\t}\n\n\t\t\tactiveSubs.set(key, { subs, values });\n\t\t}\n\n\t\tconst snap = {} as Record<K, R>;\n\t\tfor (const [key, entry] of activeSubs) {\n\t\t\tsnap[key] = { ...entry.values };\n\t\t}\n\t\tresult.value = snap;\n\t}\n\n\tconst readKeys = (): K[] => {\n\t\tconst current = typeof keys === \"function\" ? keys() : isRef(keys) ? keys.value : keys;\n\t\treturn [...(current ?? [])];\n\t};\n\n\twatch(readKeys, (newKeys) => sync(newKeys ?? []), { immediate: true });\n\n\tif (getCurrentScope()) {\n\t\tonScopeDispose(() => {\n\t\t\tdisposed = true;\n\t\t\tfor (const entry of activeSubs.values()) {\n\t\t\t\tfor (const unsub of entry.subs) unsub();\n\t\t\t}\n\t\t\tactiveSubs.clear();\n\t\t});\n\t} else if (typeof console !== \"undefined\") {\n\t\tconsole.warn(\n\t\t\t\"[graphrefly-ts] useSubscribeRecord called outside a Vue scope — subscription will not be auto-disposed.\",\n\t\t);\n\t}\n\n\treturn readonly(result) as Readonly<Ref<Record<K, R>>>;\n}\n","import { DATA } from \"../../core/messages.js\";\nimport { state as stateNode } from \"../../core/sugar.js\";\nimport { Graph } from \"../../graph/graph.js\";\n\n/** Zustand-compatible Store API. */\nexport interface StoreApi<T> {\n\tgetState: () => T;\n\tsetState: (partial: T | Partial<T> | ((state: T) => T | Partial<T>), replace?: boolean) => void;\n\tgetInitialState: () => T;\n\tsubscribe: (listener: (state: T, prevState: T) => void) => () => void;\n\tdestroy: () => void;\n}\n\n/** Function type for initializing the store. */\nexport type StateCreator<T> = (\n\tset: StoreApi<T>[\"setState\"],\n\tget: StoreApi<T>[\"getState\"],\n\tapi: StoreApi<T>,\n) => T;\n\n/**\n * Creates a Zustand-compatible store backed by a GraphReFly state node.\n * returns an object that is both a Graph and a StoreApi.\n *\n * @example\n * ```ts\n * const store = create((set) => ({\n * count: 0,\n * inc: () => set((s) => ({ count: s.count + 1 }))\n * }));\n * store.getState().inc();\n * ```\n *\n * @category compat\n */\nexport function create<T extends object>(initializer: StateCreator<T>): Graph & StoreApi<T> {\n\tconst g = new Graph(\"zustand\");\n\tconst s = stateNode<T>(undefined as unknown as T, { name: \"state\" });\n\tg.add(\"state\", s);\n\n\tconst getState = () => s.get() as T;\n\tconst setState = (partial: any, replace?: boolean): void => {\n\t\tconst prev = getState();\n\t\tconst next = typeof partial === \"function\" ? partial(prev) : partial;\n\t\tconst nextState = replace ? next : { ...prev, ...next };\n\t\ts.down([[DATA, nextState]]);\n\t};\n\n\tconst api: StoreApi<T> = {\n\t\tgetState,\n\t\tsetState,\n\t\tgetInitialState: () => initialValue,\n\t\tsubscribe: (listener) => {\n\t\t\tlet prev = getState();\n\t\t\treturn s.subscribe((msgs) => {\n\t\t\t\tfor (const [t, v] of msgs) {\n\t\t\t\t\tif (t === DATA) {\n\t\t\t\t\t\tlistener(v as T, prev);\n\t\t\t\t\t\tprev = v as T;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tdestroy: g.destroy.bind(g),\n\t};\n\n\tconst initialValue = initializer(setState, getState, api);\n\ts.down([[DATA, initialValue]]);\n\n\treturn Object.assign(g, api);\n}\n","/**\n * Patterns layer: domain/solution helpers (Phase 4+).\n */\n\nexport * as ai from \"./ai.js\";\nexport * as cqrs from \"./cqrs.js\";\nexport * as demoShell from \"./demo-shell.js\";\nexport * as domainTemplates from \"./domain-templates.js\";\nexport * as graphspec from \"./graphspec.js\";\nexport * as memory from \"./memory.js\";\nexport * as messaging from \"./messaging.js\";\nexport * as orchestration from \"./orchestration.js\";\nexport * as layout from \"./reactive-layout/index.js\";\nexport * as reduction from \"./reduction.js\";\n","/**\n * AI surface patterns (roadmap §4.4).\n *\n * Domain-layer factories for LLM-backed agents, chat, tool registries, and\n * agentic memory. Composed from core + extra + Phase 3–4.3 primitives.\n */\n\nimport type { Actor } from \"../core/actor.js\";\nimport { batch } from \"../core/batch.js\";\nimport { monotonicNs } from \"../core/clock.js\";\nimport { COMPLETE, DATA, ERROR, TEARDOWN } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { derived, effect, producer, state } from \"../core/sugar.js\";\nimport {\n\ttype DistillBundle,\n\ttype DistillOptions,\n\tdistill,\n\ttype Extraction,\n} from \"../extra/composite.js\";\nimport { switchMap } from \"../extra/operators.js\";\nimport {\n\ttype ReactiveLogBundle,\n\ttype ReactiveLogSnapshot,\n\treactiveLog,\n} from \"../extra/reactive-log.js\";\nimport { fromAny, fromTimer, type NodeInput } from \"../extra/sources.js\";\nimport {\n\ttype AutoCheckpointAdapter,\n\tGraph,\n\ttype GraphAutoCheckpointHandle,\n\ttype GraphAutoCheckpointOptions,\n\ttype GraphOptions,\n\ttype GraphPersistSnapshot,\n} from \"../graph/graph.js\";\nimport {\n\tdecay,\n\ttype KnowledgeGraphGraph,\n\tknowledgeGraph,\n\ttype LightCollectionBundle,\n\tlightCollection,\n\ttype VectorIndexBundle,\n\ttype VectorSearchResult,\n\tvectorIndex,\n} from \"./memory.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A single chat message in a conversation. */\nexport type ChatMessage = {\n\treadonly role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n\treadonly content: string;\n\treadonly name?: string;\n\treadonly toolCallId?: string;\n\treadonly toolCalls?: readonly ToolCall[];\n\treadonly metadata?: Record<string, unknown>;\n};\n\n/** A tool invocation request from an LLM. */\nexport type ToolCall = {\n\treadonly id: string;\n\treadonly name: string;\n\treadonly arguments: Record<string, unknown>;\n};\n\n/** The response from an LLM invocation. */\nexport type LLMResponse = {\n\treadonly content: string;\n\treadonly toolCalls?: readonly ToolCall[];\n\treadonly usage?: { readonly inputTokens: number; readonly outputTokens: number };\n\treadonly finishReason?: string;\n\treadonly metadata?: Record<string, unknown>;\n};\n\n/** Provider-agnostic LLM client adapter protocol. */\nexport type LLMAdapter = {\n\tinvoke(messages: readonly ChatMessage[], opts?: LLMInvokeOptions): NodeInput<LLMResponse>;\n\tstream(messages: readonly ChatMessage[], opts?: LLMInvokeOptions): AsyncIterable<string>;\n};\n\nexport type LLMInvokeOptions = {\n\tmodel?: string;\n\ttemperature?: number;\n\tmaxTokens?: number;\n\ttools?: readonly ToolDefinition[];\n\tsystemPrompt?: string;\n\tsignal?: AbortSignal;\n};\n\n/** A tool definition for LLM consumption. */\nexport type ToolDefinition = {\n\treadonly name: string;\n\treadonly description: string;\n\treadonly parameters: Record<string, unknown>; // JSON Schema\n\treadonly handler: (args: Record<string, unknown>) => NodeInput<unknown>;\n\t/**\n\t * V0 version of the backing node at `knobsAsTools()` call time (§6.0b).\n\t * Snapshot — re-call `knobsAsTools()` to refresh.\n\t */\n\treadonly version?: { id: string; version: number };\n};\n\nexport type AgentLoopStatus = \"idle\" | \"thinking\" | \"acting\" | \"done\" | \"error\";\n\n// ---------------------------------------------------------------------------\n// Meta helpers\n// ---------------------------------------------------------------------------\n\ntype AIMeta = {\n\tai?: true;\n\tai_type?: string;\n};\n\nfunction aiMeta(kind: string, extra?: Record<string, unknown>): Record<string, unknown> {\n\treturn {\n\t\tai: true,\n\t\tai_type: kind,\n\t\t...(extra ?? {}),\n\t} satisfies AIMeta;\n}\n\nfunction keepalive(n: Node<unknown>): () => void {\n\treturn n.subscribe(() => undefined);\n}\n\nfunction isPromiseLike(x: unknown): x is PromiseLike<unknown> {\n\treturn x != null && typeof (x as PromiseLike<unknown>).then === \"function\";\n}\n\nfunction isNodeLike(x: unknown): x is Node<unknown> {\n\treturn (\n\t\ttypeof x === \"object\" &&\n\t\tx !== null &&\n\t\t\"subscribe\" in x &&\n\t\ttypeof (x as Node<unknown>).subscribe === \"function\" &&\n\t\t\"get\" in x &&\n\t\ttypeof (x as Node<unknown>).get === \"function\"\n\t);\n}\n\nfunction isAsyncIterableLike(x: unknown): x is AsyncIterable<unknown> {\n\treturn (\n\t\tx != null &&\n\t\ttypeof x === \"object\" &&\n\t\tSymbol.asyncIterator in x &&\n\t\ttypeof (x as AsyncIterable<unknown>)[Symbol.asyncIterator] === \"function\"\n\t);\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\n/** First settled `DATA` from a `Node` (do not pass plain strings — `fromAny` would iterate chars). */\nfunction firstDataFromNode(\n\tresolved: Node<unknown>,\n\topts?: { timeoutMs?: number },\n): Promise<unknown> {\n\t// Only trust get() when node is in settled state\n\tif ((resolved as { status?: string }).status === \"settled\") {\n\t\tconst immediate = resolved.get();\n\t\tif (immediate !== undefined) {\n\t\t\treturn Promise.resolve(immediate);\n\t\t}\n\t}\n\tconst timeoutMs = opts?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\treturn new Promise((resolve, reject) => {\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst cleanup = () => {\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t};\n\t\tconst unsub = resolved.subscribe((messages) => {\n\t\t\tfor (const msg of messages) {\n\t\t\t\tif (msg[0] === DATA) {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tunsub();\n\t\t\t\t\tresolve(msg[1]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === ERROR) {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tunsub();\n\t\t\t\t\treject(msg[1]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tunsub();\n\t\t\t\t\treject(new Error(\"firstDataFromNode: completed without producing a value\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\ttimer = setTimeout(() => {\n\t\t\tunsub();\n\t\t\treject(new Error(`firstDataFromNode: timed out after ${timeoutMs}ms`));\n\t\t}, timeoutMs);\n\t});\n}\n\n/** Await Promise-likes, then resolve `Node` / async-iterable inputs via `fromAny` + first `DATA`. */\nasync function resolveToolHandlerResult(value: unknown): Promise<unknown> {\n\tif (isPromiseLike(value)) {\n\t\treturn resolveToolHandlerResult(await value);\n\t}\n\tif (isNodeLike(value)) {\n\t\treturn firstDataFromNode(value);\n\t}\n\tif (isAsyncIterableLike(value)) {\n\t\treturn firstDataFromNode(fromAny(value as NodeInput<unknown>));\n\t}\n\treturn value;\n}\n\n// ---------------------------------------------------------------------------\n// fromLLM\n// ---------------------------------------------------------------------------\n\nexport type FromLLMOptions = {\n\tname?: string;\n\tmodel?: string;\n\ttemperature?: number;\n\tmaxTokens?: number;\n\ttools?: readonly ToolDefinition[];\n\tsystemPrompt?: string;\n};\n\n/**\n * Reactive LLM invocation adapter. Returns a derived node that re-invokes\n * the LLM whenever the messages dep changes.\n *\n * Uses `switchMap` internally — new invocations cancel stale in-flight ones.\n */\nexport function fromLLM(\n\tadapter: LLMAdapter,\n\tmessages: NodeInput<readonly ChatMessage[]>,\n\topts?: FromLLMOptions,\n): Node<LLMResponse | null> {\n\tconst msgsNode = fromAny(messages);\n\tconst result = switchMap(msgsNode, (msgs) => {\n\t\tif (!msgs || (msgs as readonly ChatMessage[]).length === 0) {\n\t\t\treturn state<LLMResponse | null>(null) as NodeInput<LLMResponse | null>;\n\t\t}\n\t\tconst tools = opts?.tools;\n\t\treturn adapter.invoke(msgs as readonly ChatMessage[], {\n\t\t\tmodel: opts?.model,\n\t\t\ttemperature: opts?.temperature,\n\t\t\tmaxTokens: opts?.maxTokens,\n\t\t\ttools,\n\t\t\tsystemPrompt: opts?.systemPrompt,\n\t\t}) as NodeInput<LLMResponse | null>;\n\t});\n\n\treturn result;\n}\n\n// ---------------------------------------------------------------------------\n// fromLLMStream\n// ---------------------------------------------------------------------------\n\nexport type FromLLMStreamOptions = FromLLMOptions;\n\n/**\n * Bundle returned by {@link fromLLMStream}. `node` is the reactive log of\n * token chunks; `dispose` tears down the internal effect and log.\n */\nexport type LLMStreamHandle = {\n\t/** Reactive log node accumulating token chunks. */\n\tnode: Node<ReactiveLogSnapshot<string>>;\n\t/** Tear down the internal effect, abort any in-flight stream, and release resources. */\n\tdispose: () => void;\n};\n\n/**\n * Streaming LLM invocation. Returns a `{ node, dispose }` bundle where\n * `node` is a `reactiveLog`-backed node that accumulates token chunks as\n * they arrive from `adapter.stream()`.\n *\n * An `effect` watches the messages input; new values abort the in-flight\n * stream and clear the log before starting a new one. Call `dispose()` to\n * tear down the effect and release resources.\n */\nexport function fromLLMStream(\n\tadapter: LLMAdapter,\n\tmessages: NodeInput<readonly ChatMessage[]>,\n\topts?: FromLLMStreamOptions,\n): LLMStreamHandle {\n\tconst msgsNode = fromAny(messages);\n\tlet controller: AbortController | undefined;\n\n\tconst log = reactiveLog<string>([], { name: opts?.name ?? \"llmStream\" });\n\n\tconst eff = effect([msgsNode], ([msgs]) => {\n\t\t// Abort any in-flight stream\n\t\tcontroller?.abort();\n\t\tlog.clear();\n\n\t\tconst chatMsgs = msgs as readonly ChatMessage[];\n\t\tif (!chatMsgs || chatMsgs.length === 0) return;\n\n\t\tcontroller = new AbortController();\n\t\tconst iter = adapter.stream(chatMsgs, {\n\t\t\tmodel: opts?.model,\n\t\t\ttemperature: opts?.temperature,\n\t\t\tmaxTokens: opts?.maxTokens,\n\t\t\ttools: opts?.tools,\n\t\t\tsystemPrompt: opts?.systemPrompt,\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tconst ctrl = controller;\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tfor await (const chunk of iter) {\n\t\t\t\t\tif (ctrl.signal.aborted) break;\n\t\t\t\t\tlog.append(chunk);\n\t\t\t\t}\n\t\t\t} catch (_err) {\n\t\t\t\t// Stream errors are silently absorbed when aborted.\n\t\t\t\t// Non-abort errors are also absorbed — surfacing ERROR on\n\t\t\t\t// a state node (log.entries) would violate terminal semantics.\n\t\t\t\t// Callers needing error visibility should wrap with a meta node.\n\t\t\t}\n\t\t})();\n\n\t\treturn () => {\n\t\t\tctrl.abort();\n\t\t};\n\t});\n\tconst unsub = keepalive(eff);\n\n\treturn {\n\t\tnode: log.entries,\n\t\tdispose() {\n\t\t\tcontroller?.abort();\n\t\t\tunsub();\n\t\t\teff.down([[TEARDOWN]]);\n\t\t},\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// chatStream\n// ---------------------------------------------------------------------------\n\nexport type ChatStreamOptions = {\n\tgraph?: GraphOptions;\n\tmaxMessages?: number;\n};\n\nexport class ChatStreamGraph extends Graph {\n\tprivate readonly _log: ReactiveLogBundle<ChatMessage>;\n\tprivate readonly _keepaliveSubs: Array<() => void> = [];\n\treadonly messages: Node<ReactiveLogSnapshot<ChatMessage>>;\n\treadonly latest: Node<ChatMessage | undefined>;\n\treadonly messageCount: Node<number>;\n\n\tconstructor(name: string, opts: ChatStreamOptions = {}) {\n\t\tsuper(name, opts.graph);\n\n\t\tthis._log = reactiveLog<ChatMessage>([], {\n\t\t\tname: \"messages\",\n\t\t\tmaxSize: opts.maxMessages,\n\t\t});\n\t\tthis.messages = this._log.entries;\n\t\tthis.add(\"messages\", this.messages);\n\n\t\tthis.latest = derived<ChatMessage | undefined>(\n\t\t\t[this.messages],\n\t\t\t([snapshot]) => {\n\t\t\t\tconst entries = (snapshot as ReactiveLogSnapshot<ChatMessage>).value.entries;\n\t\t\t\treturn entries.length === 0 ? undefined : entries[entries.length - 1];\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"latest\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: aiMeta(\"chat_latest\"),\n\t\t\t\tinitial: undefined,\n\t\t\t},\n\t\t);\n\t\tthis.add(\"latest\", this.latest);\n\t\tthis.connect(\"messages\", \"latest\");\n\t\tthis._keepaliveSubs.push(keepalive(this.latest));\n\n\t\tthis.messageCount = derived<number>(\n\t\t\t[this.messages],\n\t\t\t([snapshot]) => (snapshot as ReactiveLogSnapshot<ChatMessage>).value.entries.length,\n\t\t\t{\n\t\t\t\tname: \"messageCount\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: aiMeta(\"chat_message_count\"),\n\t\t\t\tinitial: 0,\n\t\t\t},\n\t\t);\n\t\tthis.add(\"messageCount\", this.messageCount);\n\t\tthis.connect(\"messages\", \"messageCount\");\n\t\tthis._keepaliveSubs.push(keepalive(this.messageCount));\n\t}\n\n\tappend(role: ChatMessage[\"role\"], content: string, extra?: Partial<ChatMessage>): void {\n\t\tthis._log.append({ role, content, ...extra });\n\t}\n\n\tappendToolResult(callId: string, content: string): void {\n\t\tthis._log.append({ role: \"tool\", content, toolCallId: callId });\n\t}\n\n\tclear(): void {\n\t\tthis._log.clear();\n\t}\n\n\tallMessages(): readonly ChatMessage[] {\n\t\treturn (this.messages.get() as ReactiveLogSnapshot<ChatMessage>).value.entries;\n\t}\n\n\toverride destroy(): void {\n\t\tfor (const unsub of this._keepaliveSubs) unsub();\n\t\tthis._keepaliveSubs.length = 0;\n\t\tsuper.destroy();\n\t}\n}\n\nexport function chatStream(name: string, opts?: ChatStreamOptions): ChatStreamGraph {\n\treturn new ChatStreamGraph(name, opts);\n}\n\n// ---------------------------------------------------------------------------\n// toolRegistry\n// ---------------------------------------------------------------------------\n\nexport type ToolRegistryOptions = {\n\tgraph?: GraphOptions;\n};\n\nexport class ToolRegistryGraph extends Graph {\n\treadonly definitions: Node<ReadonlyMap<string, ToolDefinition>>;\n\treadonly schemas: Node<readonly ToolDefinition[]>;\n\tprivate readonly _keepaliveSubs: Array<() => void> = [];\n\n\tconstructor(name: string, opts: ToolRegistryOptions = {}) {\n\t\tsuper(name, opts.graph);\n\n\t\tthis.definitions = state<ReadonlyMap<string, ToolDefinition>>(new Map(), {\n\t\t\tname: \"definitions\",\n\t\t\tdescribeKind: \"state\",\n\t\t\tmeta: aiMeta(\"tool_definitions\"),\n\t\t});\n\t\tthis.add(\"definitions\", this.definitions);\n\n\t\tthis.schemas = derived<readonly ToolDefinition[]>(\n\t\t\t[this.definitions],\n\t\t\t([defs]) => [...((defs ?? new Map()) as ReadonlyMap<string, ToolDefinition>).values()],\n\t\t\t{\n\t\t\t\tname: \"schemas\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: aiMeta(\"tool_schemas\"),\n\t\t\t\tinitial: [],\n\t\t\t},\n\t\t);\n\t\tthis.add(\"schemas\", this.schemas);\n\t\tthis.connect(\"definitions\", \"schemas\");\n\t\tthis._keepaliveSubs.push(keepalive(this.schemas));\n\t}\n\n\tregister(tool: ToolDefinition): void {\n\t\tconst current = this.definitions.get() as ReadonlyMap<string, ToolDefinition>;\n\t\tconst next = new Map(current);\n\t\tnext.set(tool.name, tool);\n\t\tthis.definitions.down([[DATA, next]]);\n\t}\n\n\tunregister(name: string): void {\n\t\tconst current = this.definitions.get() as ReadonlyMap<string, ToolDefinition>;\n\t\tif (!current.has(name)) return;\n\t\tconst next = new Map(current);\n\t\tnext.delete(name);\n\t\tthis.definitions.down([[DATA, next]]);\n\t}\n\n\tasync execute(name: string, args: Record<string, unknown>): Promise<unknown> {\n\t\tconst defs = this.definitions.get() as ReadonlyMap<string, ToolDefinition>;\n\t\tconst tool = defs.get(name);\n\t\tif (!tool) throw new Error(`toolRegistry: unknown tool \"${name}\"`);\n\t\tconst raw = tool.handler(args);\n\t\treturn resolveToolHandlerResult(raw);\n\t}\n\n\tgetDefinition(name: string): ToolDefinition | undefined {\n\t\treturn (this.definitions.get() as ReadonlyMap<string, ToolDefinition>).get(name);\n\t}\n\n\toverride destroy(): void {\n\t\tfor (const unsub of this._keepaliveSubs) unsub();\n\t\tthis._keepaliveSubs.length = 0;\n\t\tsuper.destroy();\n\t}\n}\n\nexport function toolRegistry(name: string, opts?: ToolRegistryOptions): ToolRegistryGraph {\n\treturn new ToolRegistryGraph(name, opts);\n}\n\n// ---------------------------------------------------------------------------\n// systemPromptBuilder\n// ---------------------------------------------------------------------------\n\n/**\n * Assembles a system prompt from reactive sections. Each section is a\n * `NodeInput<string>` — the prompt updates when any section changes.\n */\nexport type SystemPromptHandle = Node<string> & { dispose: () => void };\n\nexport function systemPromptBuilder(\n\tsections: readonly NodeInput<string>[],\n\topts?: { separator?: string; name?: string },\n): SystemPromptHandle {\n\tconst separator = opts?.separator ?? \"\\n\\n\";\n\tconst sectionNodes = sections.map((s) => (typeof s === \"string\" ? state(s) : fromAny(s)));\n\tconst prompt = derived(\n\t\tsectionNodes,\n\t\t(values) => (values as string[]).filter((v) => v != null && v !== \"\").join(separator),\n\t\t{\n\t\t\tname: opts?.name ?? \"systemPrompt\",\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: aiMeta(\"system_prompt\"),\n\t\t\tinitial: \"\",\n\t\t},\n\t);\n\tconst unsub = keepalive(prompt);\n\treturn Object.assign(prompt, { dispose: unsub });\n}\n\n// ---------------------------------------------------------------------------\n// llmExtractor / llmConsolidator\n// ---------------------------------------------------------------------------\n\nexport type LLMExtractorOptions = {\n\tadapter: LLMAdapter;\n\tmodel?: string;\n\ttemperature?: number;\n\tmaxTokens?: number;\n};\n\n/**\n * Returns an `extractFn` callback for `distill()` that invokes an LLM to\n * extract structured memories from raw input.\n *\n * The system prompt should instruct the LLM to return JSON matching\n * `Extraction<TMem>` shape: `{ upsert: [{ key, value }], remove?: [key] }`.\n */\nexport function llmExtractor<TRaw, TMem>(\n\tsystemPrompt: string,\n\topts: LLMExtractorOptions,\n): (raw: TRaw, existing: ReadonlyMap<string, TMem>) => NodeInput<Extraction<TMem>> {\n\treturn (raw: TRaw, existing: ReadonlyMap<string, TMem>) => {\n\t\tconst existingKeys = [...existing.keys()].slice(0, 100); // sample for dedup\n\t\tconst messages: ChatMessage[] = [\n\t\t\t{ role: \"system\", content: systemPrompt },\n\t\t\t{\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: JSON.stringify({\n\t\t\t\t\tinput: raw,\n\t\t\t\t\texistingKeys,\n\t\t\t\t}),\n\t\t\t},\n\t\t];\n\t\t// Wrap the adapter call in a producer that parses the JSON response\n\t\treturn producer<Extraction<TMem>>((_deps, actions) => {\n\t\t\tlet active = true;\n\t\t\tconst result = opts.adapter.invoke(messages, {\n\t\t\t\tmodel: opts.model,\n\t\t\t\ttemperature: opts.temperature ?? 0,\n\t\t\t\tmaxTokens: opts.maxTokens,\n\t\t\t});\n\t\t\t// result is NodeInput — could be a Promise, Node, etc.\n\t\t\tconst resolved = fromAny(result);\n\t\t\tconst unsub = resolved.subscribe((msgs) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tlet done = false;\n\t\t\t\tfor (const msg of msgs) {\n\t\t\t\t\tif (done) break;\n\t\t\t\t\tif (msg[0] === DATA) {\n\t\t\t\t\t\tconst response = msg[1] as LLMResponse;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst parsed = JSON.parse(response.content) as Extraction<TMem>;\n\t\t\t\t\t\t\tactions.emit(parsed);\n\t\t\t\t\t\t\tactions.down([[COMPLETE]]);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tactions.down([\n\t\t\t\t\t\t\t\t[ERROR, new Error(\"llmExtractor: failed to parse LLM response as JSON\")],\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t} else if (msg[0] === ERROR) {\n\t\t\t\t\t\tactions.down([[ERROR, msg[1]]]);\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t} else if (msg[0] === COMPLETE) {\n\t\t\t\t\t\tactions.down([[COMPLETE]]);\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Forward unknown message types (spec §1.3.6)\n\t\t\t\t\t\tactions.down([[msg[0], msg[1]]]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tunsub();\n\t\t\t\tactive = false;\n\t\t\t};\n\t\t});\n\t};\n}\n\nexport type LLMConsolidatorOptions = LLMExtractorOptions;\n\n/**\n * Returns a `consolidateFn` callback for `distill()` that invokes an LLM to\n * cluster and merge related memories.\n */\nexport function llmConsolidator<TMem>(\n\tsystemPrompt: string,\n\topts: LLMConsolidatorOptions,\n): (entries: ReadonlyMap<string, TMem>) => NodeInput<Extraction<TMem>> {\n\treturn (entries: ReadonlyMap<string, TMem>) => {\n\t\tconst entriesArray = [...entries.entries()].map(([key, value]) => ({ key, value }));\n\t\tconst messages: ChatMessage[] = [\n\t\t\t{ role: \"system\", content: systemPrompt },\n\t\t\t{ role: \"user\", content: JSON.stringify({ memories: entriesArray }) },\n\t\t];\n\t\treturn producer<Extraction<TMem>>((_deps, actions) => {\n\t\t\tlet active = true;\n\t\t\tconst result = opts.adapter.invoke(messages, {\n\t\t\t\tmodel: opts.model,\n\t\t\t\ttemperature: opts.temperature ?? 0,\n\t\t\t\tmaxTokens: opts.maxTokens,\n\t\t\t});\n\t\t\tconst resolved = fromAny(result);\n\t\t\tconst unsub = resolved.subscribe((msgs) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tlet done = false;\n\t\t\t\tfor (const msg of msgs) {\n\t\t\t\t\tif (done) break;\n\t\t\t\t\tif (msg[0] === DATA) {\n\t\t\t\t\t\tconst response = msg[1] as LLMResponse;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst parsed = JSON.parse(response.content) as Extraction<TMem>;\n\t\t\t\t\t\t\tactions.emit(parsed);\n\t\t\t\t\t\t\tactions.down([[COMPLETE]]);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tactions.down([\n\t\t\t\t\t\t\t\t[ERROR, new Error(\"llmConsolidator: failed to parse LLM response as JSON\")],\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t} else if (msg[0] === ERROR) {\n\t\t\t\t\t\tactions.down([[ERROR, msg[1]]]);\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t} else if (msg[0] === COMPLETE) {\n\t\t\t\t\t\tactions.down([[COMPLETE]]);\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Forward unknown message types (spec §1.3.6)\n\t\t\t\t\t\tactions.down([[msg[0], msg[1]]]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tunsub();\n\t\t\t\tactive = false;\n\t\t\t};\n\t\t});\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// 3D Admission Scoring\n// ---------------------------------------------------------------------------\n\n/** Scores for the three admission dimensions. Each 0–1. */\nexport type AdmissionScores = {\n\treadonly persistence: number;\n\treadonly structure: number;\n\treadonly personalValue: number;\n};\n\nexport type AdmissionScore3DOptions = {\n\t/** Custom scoring function. Default: rule-based (all dimensions 0.5). */\n\tscoreFn?: (raw: unknown) => AdmissionScores;\n\t/** Minimum persistence score to admit (default 0.3). */\n\tpersistenceThreshold?: number;\n\t/** Minimum personalValue score to admit (default 0.3). */\n\tpersonalValueThreshold?: number;\n\t/** Require structure score > 0 to admit (default false). */\n\trequireStructured?: boolean;\n};\n\n/**\n * Default 3D admission scorer. Returns middle scores for all dimensions.\n * Override with `scoreFn` for LLM-backed or domain-specific scoring.\n */\nfunction defaultAdmissionScorer(_raw: unknown): AdmissionScores {\n\treturn { persistence: 0.5, structure: 0.5, personalValue: 0.5 };\n}\n\n/**\n * Creates a 3D admission filter function compatible with `agentMemory`'s\n * `admissionFilter` option. Scores each candidate on persistence, structure,\n * and personalValue, then applies thresholds.\n */\nexport function admissionFilter3D(opts: AdmissionScore3DOptions = {}): (raw: unknown) => boolean {\n\tconst scoreFn = opts.scoreFn ?? defaultAdmissionScorer;\n\tconst pThresh = opts.persistenceThreshold ?? 0.3;\n\tconst pvThresh = opts.personalValueThreshold ?? 0.3;\n\tconst reqStructured = opts.requireStructured ?? false;\n\treturn (raw: unknown): boolean => {\n\t\tconst scores = scoreFn(raw);\n\t\tif (scores.persistence < pThresh) return false;\n\t\tif (scores.personalValue < pvThresh) return false;\n\t\tif (reqStructured && scores.structure <= 0) return false;\n\t\treturn true;\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// Memory Tiers\n// ---------------------------------------------------------------------------\n\nexport type MemoryTier = \"permanent\" | \"active\" | \"archived\";\n\nexport type MemoryTiersOptions<TMem> = {\n\t/** Exponential decay rate per second for active tier.\n\t * Default: 7-day half-life ≈ ln(2)/(7×86400) ≈ 0.00000114. */\n\tdecayRate?: number;\n\t/** Max entries in the active tier before archiving lowest-scored (default 1000). */\n\tmaxActive?: number;\n\t/** Score threshold below which active entries get archived (default 0.1). */\n\tarchiveThreshold?: number;\n\t/** Predicate: true → entry belongs in permanent tier (default: never). */\n\tpermanentFilter?: (key: string, mem: TMem) => boolean;\n\t/** Persistence adapter for the archive tier. Omit to disable archiving. */\n\tarchiveAdapter?: AutoCheckpointAdapter;\n\t/** Auto-checkpoint options for archive adapter. */\n\tarchiveCheckpointOptions?: GraphAutoCheckpointOptions;\n};\n\nconst DEFAULT_DECAY_RATE = Math.LN2 / (7 * 86_400); // 7-day half-life\n\nexport type MemoryTiersBundle<TMem> = {\n\t/** Permanent tier: never evicted. */\n\treadonly permanent: LightCollectionBundle<TMem>;\n\t/** Active entries node (reactive, holds ReactiveMapSnapshot). */\n\treadonly activeEntries: Node<unknown>;\n\t/** Archive checkpoint handle (null if no adapter). */\n\treadonly archiveHandle: GraphAutoCheckpointHandle | null;\n\t/** Classify a key into its current tier. */\n\ttierOf: (key: string) => MemoryTier;\n\t/** Move a key to the permanent tier. */\n\tmarkPermanent: (key: string, value: TMem) => void;\n};\n\n// ---------------------------------------------------------------------------\n// Retrieval Pipeline\n// ---------------------------------------------------------------------------\n\nexport type RetrievalQuery = {\n\treadonly text?: string;\n\treadonly vector?: readonly number[];\n\treadonly entityIds?: readonly string[];\n};\n\nexport type RetrievalPipelineOptions<TMem> = {\n\t/** Max candidates from vector search (default 20). */\n\ttopK?: number;\n\t/** KG expansion depth in hops (default 1). */\n\tgraphDepth?: number;\n\t/** Token budget for final packing (default 2000). */\n\tbudget?: number;\n\t/** Cost function for budget packing. */\n\tcost: (mem: TMem) => number;\n\t/** Score function for ranking. */\n\tscore: (mem: TMem, context: unknown) => number;\n};\n\n/** A single entry in the retrieval result, with causal trace metadata. */\nexport type RetrievalEntry<TMem> = {\n\treadonly key: string;\n\treadonly value: TMem;\n\treadonly score: number;\n\treadonly sources: ReadonlyArray<\"vector\" | \"graph\" | \"store\">;\n};\n\n/** Causal trace for a retrieval run. */\nexport type RetrievalTrace<TMem> = {\n\treadonly vectorCandidates: ReadonlyArray<VectorSearchResult<TMem>>;\n\treadonly graphExpanded: ReadonlyArray<string>;\n\treadonly ranked: ReadonlyArray<RetrievalEntry<TMem>>;\n\treadonly packed: ReadonlyArray<RetrievalEntry<TMem>>;\n};\n\n// ---------------------------------------------------------------------------\n// agentMemory\n// ---------------------------------------------------------------------------\n\nexport type AgentMemoryOptions<TMem = unknown> = {\n\tgraph?: GraphOptions;\n\t/** LLM adapter for extraction and consolidation. */\n\tadapter?: LLMAdapter;\n\t/** System prompt for the extractor LLM. */\n\textractPrompt?: string;\n\t/** Custom extractFn (overrides adapter + extractPrompt). */\n\textractFn?: (raw: unknown, existing: ReadonlyMap<string, TMem>) => NodeInput<Extraction<TMem>>;\n\t/** System prompt for the consolidation LLM. */\n\tconsolidatePrompt?: string;\n\t/** Custom consolidateFn (overrides adapter + consolidatePrompt). */\n\tconsolidateFn?: (entries: ReadonlyMap<string, TMem>) => NodeInput<Extraction<TMem>>;\n\t/** Reactive trigger for consolidation (caller supplies e.g. `fromTimer`). */\n\tconsolidateTrigger?: NodeInput<unknown>;\n\t/** Score function for budget packing (required). */\n\tscore: (mem: TMem, context: unknown) => number;\n\t/** Cost function for budget packing (required). */\n\tcost: (mem: TMem) => number;\n\t/** Token budget for compact view (default 2000). */\n\tbudget?: number;\n\t/** Context node for scoring. */\n\tcontext?: NodeInput<unknown>;\n\t/** Admission filter (default: admit all). */\n\tadmissionFilter?: (candidate: unknown) => boolean;\n\t/** Vector index dimensions (> 0 enables vector index for retrieval). */\n\tvectorDimensions?: number;\n\n\t// --- In-factory composition (new) ---\n\n\t/** Extract embedding vector from a memory entry (enables vector index). */\n\tembedFn?: (mem: TMem) => readonly number[] | undefined;\n\t/** Enable knowledge graph for entity/relation tracking. */\n\tenableKnowledgeGraph?: boolean;\n\t/** Extract entities and relations from a memory entry. */\n\tentityFn?: (\n\t\tkey: string,\n\t\tmem: TMem,\n\t) =>\n\t\t| {\n\t\t\t\tentities?: Array<{ id: string; value: unknown }>;\n\t\t\t\trelations?: Array<{ from: string; to: string; relation: string; weight?: number }>;\n\t\t }\n\t\t| undefined;\n\n\t/** 3-tier storage configuration. Omit to use single-tier (existing behavior). */\n\ttiers?: MemoryTiersOptions<TMem>;\n\n\t/** Retrieval pipeline configuration. Requires vector index or knowledge graph. */\n\tretrieval?: {\n\t\t/** Max candidates from vector search (default 20). */\n\t\ttopK?: number;\n\t\t/** KG expansion depth in hops (default 1). */\n\t\tgraphDepth?: number;\n\t};\n\n\t/** Periodic reflection/consolidation configuration. */\n\treflection?: {\n\t\t/** Interval in ms between consolidation runs (default 300_000 = 5 min). */\n\t\tinterval?: number;\n\t\t/** Enable/disable periodic reflection (default true when consolidateFn is available). */\n\t\tenabled?: boolean;\n\t};\n};\n\nexport type AgentMemoryGraph<TMem = unknown> = Graph & {\n\treadonly distillBundle: DistillBundle<TMem>;\n\treadonly compact: Node<Array<{ key: string; value: TMem; score: number }>>;\n\treadonly size: Node<number>;\n\t/** Vector index bundle (null if not enabled). */\n\treadonly vectors: VectorIndexBundle<TMem> | null;\n\t/** Knowledge graph (null if not enabled). */\n\treadonly kg: KnowledgeGraphGraph<unknown, string> | null;\n\t/** Memory tiers bundle (null if not configured). */\n\treadonly memoryTiers: MemoryTiersBundle<TMem> | null;\n\t/** Retrieval result node (null if no retrieval pipeline configured). */\n\treadonly retrieval: Node<ReadonlyArray<RetrievalEntry<TMem>>> | null;\n\t/** Latest retrieval trace for observability (null if no retrieval pipeline). */\n\treadonly retrievalTrace: Node<RetrievalTrace<TMem> | null> | null;\n\t/** Execute a retrieval query (null if no retrieval pipeline). */\n\treadonly retrieve: ((query: RetrievalQuery) => ReadonlyArray<RetrievalEntry<TMem>>) | null;\n};\n\n/**\n * Pre-wired agentic memory graph. Composes `distill()` with optional\n * `knowledgeGraph()`, `vectorIndex()`, `lightCollection()` (permanent tier),\n * `decay()`, and `autoCheckpoint()` (archive tier). Supports 3D admission\n * scoring, a default retrieval pipeline, periodic reflection, and\n * retrieval observability traces.\n */\n\n/** Extract the key→value map from a reactive_map snapshot. */\nfunction extractStoreMap<TMem>(snapshot: unknown): ReadonlyMap<string, TMem> {\n\tif (\n\t\tsnapshot &&\n\t\ttypeof snapshot === \"object\" &&\n\t\t\"value\" in (snapshot as object) &&\n\t\ttypeof (snapshot as { value?: unknown }).value === \"object\" &&\n\t\t(snapshot as { value?: unknown }).value !== null &&\n\t\t\"map\" in ((snapshot as { value: object }).value as object)\n\t) {\n\t\treturn (\n\t\t\t((snapshot as { value: { map: ReadonlyMap<string, TMem> } }).value.map as ReadonlyMap<\n\t\t\t\tstring,\n\t\t\t\tTMem\n\t\t\t>) ?? new Map<string, TMem>()\n\t\t);\n\t}\n\treturn new Map<string, TMem>();\n}\n\nexport function agentMemory<TMem = unknown>(\n\tname: string,\n\tsource: NodeInput<unknown>,\n\topts: AgentMemoryOptions<TMem>,\n): AgentMemoryGraph<TMem> {\n\tconst graph = new Graph(name, opts.graph);\n\tconst keepaliveSubs: Array<() => void> = [];\n\n\t// --- Extract function resolution ---\n\tlet rawExtractFn: (\n\t\traw: unknown,\n\t\texisting: ReadonlyMap<string, TMem>,\n\t) => NodeInput<Extraction<TMem>>;\n\tif (opts.extractFn) {\n\t\trawExtractFn = opts.extractFn;\n\t} else if (opts.adapter && opts.extractPrompt) {\n\t\trawExtractFn = llmExtractor<unknown, TMem>(opts.extractPrompt, { adapter: opts.adapter });\n\t} else {\n\t\tthrow new Error(\"agentMemory: provide either extractFn or adapter + extractPrompt\");\n\t}\n\tconst extractFn = (\n\t\traw: unknown,\n\t\texisting: ReadonlyMap<string, TMem>,\n\t): NodeInput<Extraction<TMem>> => {\n\t\tif (raw == null) return { upsert: [] };\n\t\treturn rawExtractFn(raw, existing);\n\t};\n\n\t// --- Admission filter ---\n\tlet filteredSource = source;\n\tif (opts.admissionFilter) {\n\t\tconst srcNode = fromAny(source);\n\t\tconst filter = opts.admissionFilter;\n\t\tfilteredSource = derived(\n\t\t\t[srcNode],\n\t\t\t([raw]) => {\n\t\t\t\tif (filter(raw)) return raw;\n\t\t\t\treturn undefined;\n\t\t\t},\n\t\t\t{ name: \"admissionFilter\", describeKind: \"derived\" },\n\t\t);\n\t}\n\n\t// --- Consolidation ---\n\tlet consolidateFn:\n\t\t| ((entries: ReadonlyMap<string, TMem>) => NodeInput<Extraction<TMem>>)\n\t\t| undefined;\n\tif (opts.consolidateFn) {\n\t\tconsolidateFn = opts.consolidateFn;\n\t} else if (opts.adapter && opts.consolidatePrompt) {\n\t\tconsolidateFn = llmConsolidator<TMem>(opts.consolidatePrompt, { adapter: opts.adapter });\n\t}\n\n\t// --- Reflection: default consolidateTrigger from fromTimer ---\n\tlet consolidateTrigger = opts.consolidateTrigger;\n\tif (!consolidateTrigger && consolidateFn && opts.reflection?.enabled !== false) {\n\t\tconst interval = opts.reflection?.interval ?? 300_000;\n\t\tconsolidateTrigger = fromTimer(interval, { period: interval });\n\t}\n\n\t// --- Build distill bundle ---\n\tconst distillOpts: DistillOptions<TMem> = {\n\t\tscore: opts.score,\n\t\tcost: opts.cost,\n\t\tbudget: opts.budget ?? 2000,\n\t\tcontext: opts.context,\n\t\tconsolidate: consolidateFn,\n\t\tconsolidateTrigger,\n\t};\n\tconst distillBundle = distill<unknown, TMem>(filteredSource, extractFn, distillOpts);\n\n\tgraph.add(\"store\", distillBundle.store.node);\n\tgraph.add(\"compact\", distillBundle.compact);\n\tgraph.add(\"size\", distillBundle.size);\n\tgraph.connect(\"store\", \"compact\");\n\tgraph.connect(\"store\", \"size\");\n\n\t// --- Vector index (optional) ---\n\tlet vectors: VectorIndexBundle<TMem> | null = null;\n\tif (opts.vectorDimensions && opts.vectorDimensions > 0 && opts.embedFn) {\n\t\tvectors = vectorIndex<TMem>({ dimension: opts.vectorDimensions });\n\t\tgraph.add(\"vectorIndex\", vectors.entries);\n\t}\n\n\t// --- Knowledge graph (optional) ---\n\tlet kg: KnowledgeGraphGraph<unknown, string> | null = null;\n\tif (opts.enableKnowledgeGraph) {\n\t\tkg = knowledgeGraph<unknown, string>(`${name}-kg`);\n\t\tgraph.mount(\"kg\", kg);\n\t}\n\n\t// --- 3-tier storage (optional) ---\n\tlet memoryTiersBundle: MemoryTiersBundle<TMem> | null = null;\n\tif (opts.tiers) {\n\t\tconst tiersOpts = opts.tiers;\n\t\tconst decayRate = tiersOpts.decayRate ?? DEFAULT_DECAY_RATE;\n\t\tconst maxActive = tiersOpts.maxActive ?? 1000;\n\t\tconst archiveThreshold = tiersOpts.archiveThreshold ?? 0.1;\n\t\tconst permanentFilter = tiersOpts.permanentFilter ?? (() => false);\n\n\t\t// Permanent tier\n\t\tconst permanent = lightCollection<TMem>({ name: \"permanent\" });\n\t\tgraph.add(\"permanent\", permanent.entries);\n\n\t\t// Track which keys are permanent\n\t\tconst permanentKeys = new Set<string>();\n\n\t\tconst tierOf = (key: string): MemoryTier => {\n\t\t\tif (permanentKeys.has(key)) return \"permanent\";\n\t\t\tconst storeMap = extractStoreMap<TMem>(distillBundle.store.node.get());\n\t\t\tif (storeMap.has(key)) return \"active\";\n\t\t\treturn \"archived\";\n\t\t};\n\n\t\tconst markPermanent = (key: string, value: TMem): void => {\n\t\t\tpermanentKeys.add(key);\n\t\t\tpermanent.upsert(key, value);\n\t\t};\n\n\t\t// Track entry creation times for accurate decay age calculation\n\t\tconst entryCreatedAtNs = new Map<string, number>();\n\n\t\t// Post-extraction hook: classify into tiers and archive low-scored entries\n\t\tconst storeNode = distillBundle.store.node;\n\t\tconst contextNode = opts.context ? fromAny(opts.context) : state<unknown>(null);\n\t\tconst tierClassifier = effect([storeNode, contextNode], ([snapshot, ctx]) => {\n\t\t\tconst storeMap = extractStoreMap<TMem>(snapshot);\n\t\t\tconst nowNs = monotonicNs();\n\t\t\tconst toArchive: string[] = [];\n\t\t\tconst toPermanent: Array<{ key: string; value: TMem }> = [];\n\n\t\t\tfor (const [key, mem] of storeMap) {\n\t\t\t\t// Track creation time for new entries\n\t\t\t\tif (!entryCreatedAtNs.has(key)) {\n\t\t\t\t\tentryCreatedAtNs.set(key, nowNs);\n\t\t\t\t}\n\n\t\t\t\t// Check permanent classification\n\t\t\t\tif (permanentFilter(key, mem)) {\n\t\t\t\t\ttoPermanent.push({ key, value: mem });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// Compute decayed score for active tier\n\t\t\t\tconst baseScore = opts.score(mem, ctx);\n\t\t\t\tconst createdNs = entryCreatedAtNs.get(key) ?? nowNs;\n\t\t\t\tconst ageSeconds = Number(nowNs - createdNs) / 1e9;\n\t\t\t\tconst decayed = decay(baseScore, ageSeconds, decayRate);\n\t\t\t\tif (decayed < archiveThreshold) {\n\t\t\t\t\ttoArchive.push(key);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Clean up creation times for removed entries\n\t\t\tfor (const key of entryCreatedAtNs.keys()) {\n\t\t\t\tif (!storeMap.has(key)) entryCreatedAtNs.delete(key);\n\t\t\t}\n\n\t\t\t// Move to permanent\n\t\t\tfor (const { key, value } of toPermanent) {\n\t\t\t\tif (!permanentKeys.has(key)) {\n\t\t\t\t\tmarkPermanent(key, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Archive and evict from active (respect maxActive, excluding permanent keys)\n\t\t\tconst activeCount = storeMap.size - permanentKeys.size;\n\t\t\tif (activeCount > maxActive) {\n\t\t\t\tconst scored = [...storeMap.entries()]\n\t\t\t\t\t.filter(([k]) => !permanentKeys.has(k))\n\t\t\t\t\t.map(([k, m]) => ({ key: k, score: opts.score(m, ctx) }))\n\t\t\t\t\t.sort((a, b) => a.score - b.score);\n\t\t\t\tconst excess = activeCount - maxActive;\n\t\t\t\tfor (let i = 0; i < excess && i < scored.length; i++) {\n\t\t\t\t\tconst sk = scored[i]!.key;\n\t\t\t\t\tif (!toArchive.includes(sk)) toArchive.push(sk);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Evict archived keys from active store\n\t\t\tif (toArchive.length > 0) {\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const key of toArchive) {\n\t\t\t\t\t\tdistillBundle.store.delete(key);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tkeepaliveSubs.push(tierClassifier.subscribe(() => undefined));\n\n\t\t// Archive checkpoint\n\t\tlet archiveHandle: GraphAutoCheckpointHandle | null = null;\n\t\tif (tiersOpts.archiveAdapter) {\n\t\t\tarchiveHandle = graph.autoCheckpoint(\n\t\t\t\ttiersOpts.archiveAdapter,\n\t\t\t\ttiersOpts.archiveCheckpointOptions,\n\t\t\t);\n\t\t}\n\n\t\tmemoryTiersBundle = {\n\t\t\tpermanent,\n\t\t\tactiveEntries: storeNode,\n\t\t\tarchiveHandle,\n\t\t\ttierOf,\n\t\t\tmarkPermanent,\n\t\t};\n\t}\n\n\t// --- Post-extraction hooks: vector + KG indexing ---\n\tif (vectors || kg) {\n\t\tconst embedFn = opts.embedFn;\n\t\tconst entityFn = opts.entityFn;\n\t\tconst storeNode = distillBundle.store.node;\n\n\t\tconst indexer = effect([storeNode], ([snapshot]) => {\n\t\t\tconst storeMap = extractStoreMap<TMem>(snapshot);\n\t\t\tfor (const [key, mem] of storeMap) {\n\t\t\t\t// Vector indexing\n\t\t\t\tif (vectors && embedFn) {\n\t\t\t\t\tconst vec = embedFn(mem);\n\t\t\t\t\tif (vec) vectors.upsert(key, vec, mem);\n\t\t\t\t}\n\t\t\t\t// Knowledge graph entity/relation extraction\n\t\t\t\tif (kg && entityFn) {\n\t\t\t\t\tconst extracted = entityFn(key, mem);\n\t\t\t\t\tif (extracted) {\n\t\t\t\t\t\tfor (const ent of extracted.entities ?? []) {\n\t\t\t\t\t\t\tkg.upsertEntity(ent.id, ent.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const rel of extracted.relations ?? []) {\n\t\t\t\t\t\t\tkg.link(rel.from, rel.to, rel.relation as string, rel.weight);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tkeepaliveSubs.push(indexer.subscribe(() => undefined));\n\t}\n\n\t// --- Retrieval pipeline (optional) ---\n\tlet retrievalNode: Node<ReadonlyArray<RetrievalEntry<TMem>>> | null = null;\n\tlet retrievalTraceNode: Node<RetrievalTrace<TMem> | null> | null = null;\n\tlet retrieveFn: ((query: RetrievalQuery) => ReadonlyArray<RetrievalEntry<TMem>>) | null = null;\n\n\tif (vectors || kg) {\n\t\tconst topK = opts.retrieval?.topK ?? 20;\n\t\tconst graphDepth = opts.retrieval?.graphDepth ?? 1;\n\t\tconst budget = opts.budget ?? 2000;\n\t\tconst costFn = opts.cost;\n\t\tconst scoreFn = opts.score;\n\n\t\t// Query input node — updated via retrieve()\n\t\tconst queryInput = state<RetrievalQuery | null>(null, {\n\t\t\tname: \"retrievalQuery\",\n\t\t\tdescribeKind: \"state\",\n\t\t});\n\t\tgraph.add(\"retrievalQuery\", queryInput);\n\n\t\tconst contextNode = opts.context ? fromAny(opts.context) : state<unknown>(null);\n\t\tconst traceState = state<RetrievalTrace<TMem> | null>(null, {\n\t\t\tname: \"retrievalTrace\",\n\t\t\tdescribeKind: \"state\",\n\t\t\tmeta: aiMeta(\"retrieval_trace\"),\n\t\t});\n\t\tgraph.add(\"retrievalTrace\", traceState);\n\t\tretrievalTraceNode = traceState;\n\n\t\tconst storeNode = distillBundle.store.node;\n\n\t\t// Last trace captured during retrieval (populated by retrieve())\n\t\tlet lastTrace: RetrievalTrace<TMem> | null = null;\n\n\t\tconst retrievalDerived = derived<ReadonlyArray<RetrievalEntry<TMem>>>(\n\t\t\t[queryInput, storeNode, contextNode],\n\t\t\t([query, snapshot, ctx]) => {\n\t\t\t\tif (!query) return [];\n\t\t\t\tconst q = query as RetrievalQuery;\n\t\t\t\tconst storeMap = extractStoreMap<TMem>(snapshot);\n\n\t\t\t\tconst candidateMap = new Map<\n\t\t\t\t\tstring,\n\t\t\t\t\t{ value: TMem; sources: Set<\"vector\" | \"graph\" | \"store\"> }\n\t\t\t\t>();\n\n\t\t\t\t// Stage 1: Vector search\n\t\t\t\tlet vectorCandidates: VectorSearchResult<TMem>[] = [];\n\t\t\t\tif (vectors && q.vector) {\n\t\t\t\t\tvectorCandidates = vectors.search(q.vector, topK) as VectorSearchResult<TMem>[];\n\t\t\t\t\tfor (const vc of vectorCandidates) {\n\t\t\t\t\t\tconst mem = storeMap.get(vc.id);\n\t\t\t\t\t\tif (mem) {\n\t\t\t\t\t\t\tcandidateMap.set(vc.id, { value: mem, sources: new Set([\"vector\"]) });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Stage 2: KG expansion\n\t\t\t\tconst graphExpanded: string[] = [];\n\t\t\t\tif (kg) {\n\t\t\t\t\tconst seedIds = [...(q.entityIds ?? []), ...[...candidateMap.keys()]];\n\t\t\t\t\tconst visited = new Set<string>();\n\t\t\t\t\tlet frontier = seedIds;\n\t\t\t\t\tfor (let depth = 0; depth < graphDepth; depth++) {\n\t\t\t\t\t\tconst nextFrontier: string[] = [];\n\t\t\t\t\t\tfor (const id of frontier) {\n\t\t\t\t\t\t\tif (visited.has(id)) continue;\n\t\t\t\t\t\t\tvisited.add(id);\n\t\t\t\t\t\t\tconst related = kg.related(id);\n\t\t\t\t\t\t\tfor (const edge of related) {\n\t\t\t\t\t\t\t\tconst targetId = edge.to;\n\t\t\t\t\t\t\t\tif (!visited.has(targetId)) {\n\t\t\t\t\t\t\t\t\tnextFrontier.push(targetId);\n\t\t\t\t\t\t\t\t\tconst mem = storeMap.get(targetId);\n\t\t\t\t\t\t\t\t\tif (mem) {\n\t\t\t\t\t\t\t\t\t\tconst existing = candidateMap.get(targetId);\n\t\t\t\t\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\t\t\t\t\texisting.sources.add(\"graph\");\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tcandidateMap.set(targetId, { value: mem, sources: new Set([\"graph\"]) });\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tgraphExpanded.push(targetId);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfrontier = nextFrontier;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Also include direct store matches not yet in candidates\n\t\t\t\tfor (const [key, mem] of storeMap) {\n\t\t\t\t\tif (!candidateMap.has(key)) {\n\t\t\t\t\t\tcandidateMap.set(key, { value: mem, sources: new Set([\"store\"]) });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Stage 3: Score and rank\n\t\t\t\tconst ranked: RetrievalEntry<TMem>[] = [];\n\t\t\t\tfor (const [key, { value, sources }] of candidateMap) {\n\t\t\t\t\tconst score = scoreFn(value, ctx);\n\t\t\t\t\tranked.push({ key, value, score, sources: [...sources] });\n\t\t\t\t}\n\t\t\t\tranked.sort((a, b) => b.score - a.score);\n\n\t\t\t\t// Stage 4: Budget packing\n\t\t\t\tconst packed: RetrievalEntry<TMem>[] = [];\n\t\t\t\tlet usedBudget = 0;\n\t\t\t\tfor (const entry of ranked) {\n\t\t\t\t\tconst c = costFn(entry.value);\n\t\t\t\t\tif (usedBudget + c > budget && packed.length > 0) break;\n\t\t\t\t\tpacked.push(entry);\n\t\t\t\t\tusedBudget += c;\n\t\t\t\t}\n\n\t\t\t\t// Capture trace (no side-effect — stored for retrieval by retrieve())\n\t\t\t\tlastTrace = { vectorCandidates, graphExpanded, ranked, packed };\n\n\t\t\t\treturn packed;\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"retrieval\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: aiMeta(\"retrieval_pipeline\"),\n\t\t\t\tinitial: [],\n\t\t\t},\n\t\t);\n\t\tgraph.add(\"retrieval\", retrievalDerived);\n\t\tgraph.connect(\"retrievalQuery\", \"retrieval\");\n\t\tgraph.connect(\"store\", \"retrieval\");\n\t\tkeepaliveSubs.push(retrievalDerived.subscribe(() => undefined));\n\t\tretrievalNode = retrievalDerived;\n\n\t\tretrieveFn = (query: RetrievalQuery): ReadonlyArray<RetrievalEntry<TMem>> => {\n\t\t\tqueryInput.down([[DATA, query]]);\n\t\t\tconst result = retrievalDerived.get() as ReadonlyArray<RetrievalEntry<TMem>>;\n\t\t\t// Update trace node outside derived callback (avoids reactive glitch)\n\t\t\tif (lastTrace) {\n\t\t\t\ttraceState.down([[DATA, lastTrace]]);\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t}\n\n\t// --- Cleanup ---\n\tconst origDestroy = graph.destroy.bind(graph);\n\tgraph.destroy = () => {\n\t\tfor (const unsub of keepaliveSubs) unsub();\n\t\tkeepaliveSubs.length = 0;\n\t\torigDestroy();\n\t};\n\n\treturn Object.assign(graph, {\n\t\tdistillBundle,\n\t\tcompact: distillBundle.compact,\n\t\tsize: distillBundle.size,\n\t\tvectors,\n\t\tkg,\n\t\tmemoryTiers: memoryTiersBundle,\n\t\tretrieval: retrievalNode,\n\t\tretrievalTrace: retrievalTraceNode,\n\t\tretrieve: retrieveFn,\n\t}) as AgentMemoryGraph<TMem>;\n}\n\n// ---------------------------------------------------------------------------\n// agentLoop\n// ---------------------------------------------------------------------------\n\nexport type AgentLoopOptions = {\n\tgraph?: GraphOptions;\n\tadapter: LLMAdapter;\n\ttools?: readonly ToolDefinition[];\n\tsystemPrompt?: string;\n\tmaxTurns?: number;\n\tstopWhen?: (response: LLMResponse) => boolean;\n\tonToolCall?: (call: ToolCall) => void;\n\tmaxMessages?: number;\n\tmodel?: string;\n\ttemperature?: number;\n\tmaxTokens?: number;\n};\n\nexport class AgentLoopGraph extends Graph {\n\treadonly chat: ChatStreamGraph;\n\treadonly tools: ToolRegistryGraph;\n\treadonly status: Node<AgentLoopStatus>;\n\treadonly turnCount: Node<number>;\n\treadonly lastResponse: Node<LLMResponse | null>;\n\tprivate readonly _statusState: Node<AgentLoopStatus>;\n\tprivate readonly _turnCountState: Node<number>;\n\tprivate readonly _adapter: LLMAdapter;\n\tprivate readonly _maxTurns: number;\n\tprivate readonly _stopWhen?: (response: LLMResponse) => boolean;\n\tprivate readonly _onToolCall?: (call: ToolCall) => void;\n\tprivate readonly _systemPrompt?: string;\n\tprivate readonly _model?: string;\n\tprivate readonly _temperature?: number;\n\tprivate readonly _maxTokens?: number;\n\tprivate _running = false;\n\tprivate _abortController: AbortController | null = null;\n\n\tconstructor(name: string, opts: AgentLoopOptions) {\n\t\tsuper(name, opts.graph);\n\n\t\tthis._adapter = opts.adapter;\n\t\tthis._maxTurns = opts.maxTurns ?? 10;\n\t\tthis._stopWhen = opts.stopWhen;\n\t\tthis._onToolCall = opts.onToolCall;\n\t\tthis._systemPrompt = opts.systemPrompt;\n\t\tthis._model = opts.model;\n\t\tthis._temperature = opts.temperature;\n\t\tthis._maxTokens = opts.maxTokens;\n\n\t\t// Mount chat subgraph\n\t\tthis.chat = chatStream(`${name}-chat`, { maxMessages: opts.maxMessages });\n\t\tthis.mount(\"chat\", this.chat);\n\n\t\t// Mount tool registry subgraph\n\t\tthis.tools = toolRegistry(`${name}-tools`);\n\t\tthis.mount(\"tools\", this.tools);\n\n\t\t// Register initial tools\n\t\tif (opts.tools) {\n\t\t\tfor (const tool of opts.tools) {\n\t\t\t\tthis.tools.register(tool);\n\t\t\t}\n\t\t}\n\n\t\t// Status state\n\t\tthis._statusState = state<AgentLoopStatus>(\"idle\", {\n\t\t\tname: \"status\",\n\t\t\tdescribeKind: \"state\",\n\t\t\tmeta: aiMeta(\"agent_status\"),\n\t\t});\n\t\tthis.status = this._statusState;\n\t\tthis.add(\"status\", this.status);\n\n\t\t// Turn count\n\t\tthis._turnCountState = state<number>(0, {\n\t\t\tname: \"turnCount\",\n\t\t\tdescribeKind: \"state\",\n\t\t\tmeta: aiMeta(\"agent_turn_count\"),\n\t\t});\n\t\tthis.turnCount = this._turnCountState;\n\t\tthis.add(\"turnCount\", this.turnCount);\n\n\t\t// Last LLM response\n\t\tthis.lastResponse = state<LLMResponse | null>(null, {\n\t\t\tname: \"lastResponse\",\n\t\t\tdescribeKind: \"state\",\n\t\t\tmeta: aiMeta(\"agent_last_response\"),\n\t\t});\n\t\tthis.add(\"lastResponse\", this.lastResponse);\n\t}\n\n\t/**\n\t * Start the agent loop with a user message. The loop runs reactively:\n\t * think (LLM call) → act (tool execution) → repeat until done.\n\t *\n\t * Messages accumulate across calls. Call `chat.clear()` before `run()`\n\t * to reset conversation history.\n\t */\n\tasync run(userMessage: string): Promise<LLMResponse | null> {\n\t\tif (this._running) throw new Error(\"agentLoop: already running\");\n\t\tthis._running = true;\n\t\tthis._abortController = new AbortController();\n\t\tconst { signal } = this._abortController;\n\n\t\tbatch(() => {\n\t\t\tthis._statusState.down([[DATA, \"idle\" as AgentLoopStatus]]);\n\t\t\tthis._turnCountState.down([[DATA, 0]]);\n\t\t});\n\t\tthis.chat.append(\"user\", userMessage);\n\n\t\ttry {\n\t\t\tlet turns = 0;\n\t\t\twhile (turns < this._maxTurns) {\n\t\t\t\tif (signal.aborted) throw new Error(\"agentLoop: aborted\");\n\t\t\t\tturns++;\n\t\t\t\tbatch(() => {\n\t\t\t\t\tthis._turnCountState.down([[DATA, turns]]);\n\t\t\t\t\tthis._statusState.down([[DATA, \"thinking\" as AgentLoopStatus]]);\n\t\t\t\t});\n\n\t\t\t\t// Invoke LLM\n\t\t\t\tconst msgs = this.chat.allMessages();\n\t\t\t\tconst toolSchemas = (this.tools.schemas.get() as readonly ToolDefinition[]) ?? [];\n\t\t\t\tconst response = await this._invokeLLM(msgs, toolSchemas, signal);\n\t\t\t\tif (signal.aborted) throw new Error(\"agentLoop: aborted\");\n\n\t\t\t\t(this.lastResponse as Node<LLMResponse | null>).down([[DATA, response]]);\n\n\t\t\t\t// Append assistant message\n\t\t\t\tthis.chat.append(\"assistant\", response.content, {\n\t\t\t\t\ttoolCalls: response.toolCalls,\n\t\t\t\t});\n\n\t\t\t\t// Check stop conditions\n\t\t\t\tif (this._shouldStop(response)) {\n\t\t\t\t\tthis._statusState.down([[DATA, \"done\" as AgentLoopStatus]]);\n\t\t\t\t\tthis._running = false;\n\t\t\t\t\tthis._abortController = null;\n\t\t\t\t\treturn response;\n\t\t\t\t}\n\n\t\t\t\t// Execute tool calls if present\n\t\t\t\tif (response.toolCalls && response.toolCalls.length > 0) {\n\t\t\t\t\tthis._statusState.down([[DATA, \"acting\" as AgentLoopStatus]]);\n\t\t\t\t\tfor (const call of response.toolCalls) {\n\t\t\t\t\t\tif (signal.aborted) throw new Error(\"agentLoop: aborted\");\n\t\t\t\t\t\tthis._onToolCall?.(call);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = await this.tools.execute(call.name, call.arguments);\n\t\t\t\t\t\t\tthis.chat.appendToolResult(call.id, JSON.stringify(result));\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tthis.chat.appendToolResult(call.id, JSON.stringify({ error: String(err) }));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// No tool calls and not explicitly stopped → done\n\t\t\t\t\tthis._statusState.down([[DATA, \"done\" as AgentLoopStatus]]);\n\t\t\t\t\tthis._running = false;\n\t\t\t\t\tthis._abortController = null;\n\t\t\t\t\treturn response;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Max turns reached\n\t\t\tthis._statusState.down([[DATA, \"done\" as AgentLoopStatus]]);\n\t\t\tthis._running = false;\n\t\t\tthis._abortController = null;\n\t\t\treturn this.lastResponse.get() as LLMResponse | null;\n\t\t} catch (err) {\n\t\t\tthis._statusState.down([[DATA, \"error\" as AgentLoopStatus]]);\n\t\t\tthis._running = false;\n\t\t\tthis._abortController = null;\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tprivate async _invokeLLM(\n\t\tmsgs: readonly ChatMessage[],\n\t\ttools: readonly ToolDefinition[],\n\t\tsignal?: AbortSignal,\n\t): Promise<LLMResponse> {\n\t\tconst result = this._adapter.invoke(msgs, {\n\t\t\ttools: tools.length > 0 ? tools : undefined,\n\t\t\tsystemPrompt: this._systemPrompt,\n\t\t\tmodel: this._model,\n\t\t\ttemperature: this._temperature,\n\t\t\tmaxTokens: this._maxTokens,\n\t\t\tsignal,\n\t\t});\n\t\t// Null/undefined guard\n\t\tif (result == null) {\n\t\t\tthrow new Error(\"_invokeLLM: adapter.invoke() returned null or undefined\");\n\t\t}\n\t\t// String guard — fromAny would iterate characters\n\t\tif (typeof result === \"string\") {\n\t\t\tthrow new Error(\"_invokeLLM: adapter.invoke() returned a string, expected LLMResponse\");\n\t\t}\n\t\t// If result is already an LLMResponse (sync adapter), return directly\n\t\tif (\n\t\t\ttypeof result === \"object\" &&\n\t\t\t\"content\" in result &&\n\t\t\t!(\"subscribe\" in result) &&\n\t\t\t!(\"then\" in result)\n\t\t) {\n\t\t\treturn result as LLMResponse;\n\t\t}\n\t\t// If result is a Promise, await it then check for LLMResponse\n\t\tif (isPromiseLike(result)) {\n\t\t\tconst awaited = await result;\n\t\t\tif (\n\t\t\t\ttypeof awaited === \"object\" &&\n\t\t\t\tawaited !== null &&\n\t\t\t\t\"content\" in awaited &&\n\t\t\t\t!(\"subscribe\" in awaited)\n\t\t\t) {\n\t\t\t\treturn awaited as LLMResponse;\n\t\t\t}\n\t\t\treturn firstDataFromNode(fromAny(awaited as NodeInput<LLMResponse>)) as Promise<LLMResponse>;\n\t\t}\n\t\t// If result is a Node or async iterable, resolve via fromAny + firstDataFromNode\n\t\treturn firstDataFromNode(fromAny(result)) as Promise<LLMResponse>;\n\t}\n\n\tprivate _shouldStop(response: LLMResponse): boolean {\n\t\tif (\n\t\t\tresponse.finishReason === \"end_turn\" &&\n\t\t\t(!response.toolCalls || response.toolCalls.length === 0)\n\t\t)\n\t\t\treturn true;\n\t\tif (this._stopWhen?.(response)) return true;\n\t\treturn false;\n\t}\n\n\toverride destroy(): void {\n\t\tif (this._abortController) {\n\t\t\tthis._abortController.abort();\n\t\t\tthis._abortController = null;\n\t\t}\n\t\tthis._running = false;\n\t\tsuper.destroy();\n\t}\n}\n\nexport function agentLoop(name: string, opts: AgentLoopOptions): AgentLoopGraph {\n\treturn new AgentLoopGraph(name, opts);\n}\n\n// ---------------------------------------------------------------------------\n// 5.4 — LLM tool integration\n// ---------------------------------------------------------------------------\n\n/** OpenAI function-calling tool schema. */\nexport type OpenAIToolSchema = {\n\treadonly type: \"function\";\n\treadonly function: {\n\t\treadonly name: string;\n\t\treadonly description: string;\n\t\treadonly parameters: Record<string, unknown>;\n\t};\n};\n\n/** MCP (Model Context Protocol) tool schema. */\nexport type McpToolSchema = {\n\treadonly name: string;\n\treadonly description: string;\n\treadonly inputSchema: Record<string, unknown>;\n};\n\n/** Result of {@link knobsAsTools}. */\nexport type KnobsAsToolsResult = {\n\t/** OpenAI function-calling tool schemas. */\n\treadonly openai: readonly OpenAIToolSchema[];\n\t/** MCP tool schemas. */\n\treadonly mcp: readonly McpToolSchema[];\n\t/** GraphReFly ToolDefinitions with handlers that call `graph.set()`. */\n\treadonly definitions: readonly ToolDefinition[];\n};\n\n/**\n * Build a JSON Schema `properties.value` descriptor from a node's meta fields.\n *\n * Maps `meta.type`, `meta.range`, `meta.values`, `meta.format`, and `meta.unit`\n * to a JSON Schema property definition.\n */\nfunction metaToJsonSchema(meta: Record<string, unknown>): Record<string, unknown> {\n\tconst schema: Record<string, unknown> = {};\n\n\tconst metaType = meta.type as string | undefined;\n\tif (metaType === \"enum\" && Array.isArray(meta.values)) {\n\t\tschema.type = \"string\";\n\t\tschema.enum = meta.values;\n\t} else if (metaType === \"integer\") {\n\t\tschema.type = \"integer\";\n\t} else if (metaType === \"number\") {\n\t\tschema.type = \"number\";\n\t} else if (metaType === \"boolean\") {\n\t\tschema.type = \"boolean\";\n\t} else if (metaType === \"string\") {\n\t\tschema.type = \"string\";\n\t} else {\n\t\t// Unknown or unspecified — accept anything\n\t\tschema.type = [\"string\", \"number\", \"boolean\"];\n\t}\n\n\tif (Array.isArray(meta.range) && meta.range.length === 2) {\n\t\tschema.minimum = meta.range[0];\n\t\tschema.maximum = meta.range[1];\n\t}\n\n\tif (typeof meta.format === \"string\") {\n\t\tschema.description = `Format: ${meta.format}`;\n\t}\n\n\tif (typeof meta.unit === \"string\") {\n\t\tif (schema.description) {\n\t\t\tschema.description += ` (${meta.unit})`;\n\t\t} else {\n\t\t\tschema.description = `Unit: ${meta.unit}`;\n\t\t}\n\t}\n\n\treturn schema;\n}\n\n/**\n * Derive tool schemas from a graph's writable (knob) nodes.\n *\n * Knobs are state nodes whose `meta.access` is `\"llm\"`, `\"both\"`, or absent\n * (default: writable). Each knob becomes a tool that calls `graph.set()`.\n *\n * Speaks **domain language** (spec §5.4): the returned schemas use node names\n * and meta descriptions — no protocol internals exposed.\n *\n * @param graph - The graph to introspect.\n * @param actor - Optional actor for guard-scoped describe.\n * @returns OpenAI, MCP, and GraphReFly tool schemas.\n */\nexport function knobsAsTools(graph: Graph, actor?: Actor): KnobsAsToolsResult {\n\tconst described = graph.describe({ actor, detail: \"full\" });\n\tconst openai: OpenAIToolSchema[] = [];\n\tconst mcp: McpToolSchema[] = [];\n\tconst definitions: ToolDefinition[] = [];\n\n\tfor (const [path, node] of Object.entries(described.nodes)) {\n\t\t// Only state nodes are writable knobs\n\t\tif (node.type !== \"state\") continue;\n\n\t\t// Skip meta companion nodes (§2.3)\n\t\tif (path.includes(\"::__meta__::\")) continue;\n\n\t\t// Skip terminal-state nodes (§1.3.4 — no further messages after COMPLETE/ERROR)\n\t\tif (node.status === \"completed\" || node.status === \"errored\") continue;\n\n\t\t// Skip if access explicitly excludes LLM\n\t\tconst meta = node.meta ?? {};\n\t\tconst access = meta.access as string | undefined;\n\t\tif (access === \"human\" || access === \"system\") continue;\n\n\t\tconst description = (meta.description as string) ?? `Set the value of ${path}`;\n\t\tconst valueSchema = metaToJsonSchema(meta);\n\n\t\tconst parameterSchema: Record<string, unknown> = {\n\t\t\ttype: \"object\",\n\t\t\trequired: [\"value\"],\n\t\t\tproperties: {\n\t\t\t\tvalue: valueSchema,\n\t\t\t},\n\t\t\tadditionalProperties: false,\n\t\t};\n\n\t\t// OpenAI requires [a-zA-Z0-9_-] in function names; sanitize :: separators\n\t\tconst sanitizedName = path.replace(/::/g, \"__\");\n\n\t\topenai.push({\n\t\t\ttype: \"function\",\n\t\t\tfunction: {\n\t\t\t\tname: sanitizedName,\n\t\t\t\tdescription,\n\t\t\t\tparameters: parameterSchema,\n\t\t\t},\n\t\t});\n\n\t\tmcp.push({\n\t\t\tname: path,\n\t\t\tdescription,\n\t\t\tinputSchema: parameterSchema,\n\t\t});\n\n\t\tconst graphRef = graph;\n\t\tconst actorRef = actor;\n\t\tconst nv = node.v;\n\t\tdefinitions.push({\n\t\t\tname: path,\n\t\t\tdescription,\n\t\t\tparameters: parameterSchema,\n\t\t\thandler(args: Record<string, unknown>) {\n\t\t\t\tgraphRef.set(path, args.value, actorRef ? { actor: actorRef } : undefined);\n\t\t\t\treturn args.value;\n\t\t\t},\n\t\t\t...(nv != null ? { version: { id: nv.id, version: nv.version } } : {}),\n\t\t});\n\t}\n\n\treturn { openai, mcp, definitions };\n}\n\n// ---------------------------------------------------------------------------\n// gaugesAsContext\n// ---------------------------------------------------------------------------\n\nexport type GaugesAsContextOptions = {\n\t/** Group gauges by `meta.tags` (default true). */\n\tgroupByTags?: boolean;\n\t/** Separator between gauge lines (default \"\\n\"). */\n\tseparator?: string;\n\t/**\n\t * V0 delta mode (§6.0b): only include nodes whose `v.version` exceeds\n\t * the corresponding entry in this map. Nodes without V0 or not in the\n\t * map are always included. Callers maintain this map across calls.\n\t *\n\t * The `id` field guards against node replacement: if a node is removed\n\t * and re-added under the same name (new id), it is always included.\n\t */\n\tsinceVersion?: ReadonlyMap<string, { id: string; version: number }>;\n};\n\n/**\n * Format a graph's readable (gauge) nodes as a context string for LLM\n * system prompts.\n *\n * Gauges are nodes with `meta.description` or `meta.format`. Values are\n * formatted using `meta.format` and `meta.unit` hints.\n *\n * @param graph - The graph to introspect.\n * @param actor - Optional actor for guard-scoped describe.\n * @param options - Formatting options.\n * @returns A formatted string ready for system prompt injection.\n */\nexport function gaugesAsContext(\n\tgraph: Graph,\n\tactor?: Actor,\n\toptions?: GaugesAsContextOptions,\n): string {\n\tconst described = graph.describe({ actor, detail: \"full\" });\n\tconst groupByTags = options?.groupByTags ?? true;\n\tconst separator = options?.separator ?? \"\\n\";\n\n\ttype GaugeEntry = { path: string; description: string; formatted: string };\n\tconst entries: GaugeEntry[] = [];\n\n\tconst sinceVersion = options?.sinceVersion;\n\tfor (const [path, node] of Object.entries(described.nodes)) {\n\t\tconst meta = node.meta ?? {};\n\t\tconst desc = meta.description as string | undefined;\n\t\tconst format = meta.format as string | undefined;\n\t\t// Must have description or format to be a gauge\n\t\tif (!desc && !format) continue;\n\t\t// V0 delta filter: skip nodes unchanged since last seen version (§6.0b).\n\t\tif (sinceVersion != null && node.v != null) {\n\t\t\tconst lastSeen = sinceVersion.get(path);\n\t\t\tif (lastSeen != null && lastSeen.id === node.v.id && node.v.version <= lastSeen.version)\n\t\t\t\tcontinue;\n\t\t}\n\n\t\tconst label = desc ?? path;\n\t\tconst value = node.value;\n\t\tconst unit = meta.unit as string | undefined;\n\n\t\tlet formatted: string;\n\t\tif (format === \"currency\" && typeof value === \"number\") {\n\t\t\tformatted = `$${value.toFixed(2)}`;\n\t\t} else if (format === \"percentage\" && typeof value === \"number\") {\n\t\t\tformatted = `${(value * 100).toFixed(1)}%`;\n\t\t} else if (value === undefined || value === null) {\n\t\t\tformatted = \"(no value)\";\n\t\t} else {\n\t\t\tformatted = String(value);\n\t\t}\n\n\t\tif (unit && format !== \"currency\" && format !== \"percentage\") {\n\t\t\tformatted = `${formatted} ${unit}`;\n\t\t}\n\n\t\tentries.push({ path, description: label, formatted });\n\t}\n\n\tif (entries.length === 0) return \"\";\n\n\tif (groupByTags) {\n\t\tconst tagGroups = new Map<string, GaugeEntry[]>();\n\t\tconst ungrouped: GaugeEntry[] = [];\n\n\t\tfor (const entry of entries) {\n\t\t\tconst node = described.nodes[entry.path]!;\n\t\t\tconst tags = node.meta?.tags as string[] | undefined;\n\t\t\tif (tags && tags.length > 0) {\n\t\t\t\t// Use first tag for grouping to avoid duplicating entries across groups\n\t\t\t\tconst tag = tags[0]!;\n\t\t\t\tlet group = tagGroups.get(tag);\n\t\t\t\tif (!group) {\n\t\t\t\t\tgroup = [];\n\t\t\t\t\ttagGroups.set(tag, group);\n\t\t\t\t}\n\t\t\t\tgroup.push(entry);\n\t\t\t} else {\n\t\t\t\tungrouped.push(entry);\n\t\t\t}\n\t\t}\n\n\t\tif (tagGroups.size === 0) {\n\t\t\treturn entries.map((e) => `- ${e.description}: ${e.formatted}`).join(separator);\n\t\t}\n\n\t\tconst sections: string[] = [];\n\t\tfor (const [tag, group] of [...tagGroups.entries()].sort((a, b) => a[0].localeCompare(b[0]))) {\n\t\t\tsections.push(\n\t\t\t\t`[${tag}]${separator}${group.map((e) => `- ${e.description}: ${e.formatted}`).join(separator)}`,\n\t\t\t);\n\t\t}\n\t\tif (ungrouped.length > 0) {\n\t\t\tsections.push(ungrouped.map((e) => `- ${e.description}: ${e.formatted}`).join(separator));\n\t\t}\n\t\treturn sections.join(separator + separator);\n\t}\n\n\treturn entries.map((e) => `- ${e.description}: ${e.formatted}`).join(separator);\n}\n\n// ---------------------------------------------------------------------------\n// validateGraphDef\n// ---------------------------------------------------------------------------\n\n/** Validation result from {@link validateGraphDef}. */\nexport type GraphDefValidation = {\n\treadonly valid: boolean;\n\treadonly errors: readonly string[];\n};\n\nconst VALID_NODE_TYPES = new Set([\"state\", \"derived\", \"producer\", \"operator\", \"effect\"]);\n\n/**\n * Validate an LLM-generated graph definition before passing to\n * `Graph.fromSnapshot()`.\n *\n * Checks:\n * - Required fields: `name`, `nodes`, `edges`\n * - Node types are valid enum values\n * - Edge `from`/`to` reference existing nodes\n * - No duplicate edge entries\n *\n * @param def - The graph definition to validate (parsed JSON).\n * @returns Validation result with errors array.\n */\nexport function validateGraphDef(def: unknown): GraphDefValidation {\n\tconst errors: string[] = [];\n\n\tif (def == null || typeof def !== \"object\") {\n\t\treturn { valid: false, errors: [\"Definition must be a non-null object\"] };\n\t}\n\n\tconst d = def as Record<string, unknown>;\n\n\tif (typeof d.name !== \"string\" || d.name.length === 0) {\n\t\terrors.push(\"Missing or empty 'name' field\");\n\t}\n\n\tif (d.nodes == null || typeof d.nodes !== \"object\" || Array.isArray(d.nodes)) {\n\t\terrors.push(\"Missing or invalid 'nodes' field (must be an object)\");\n\t\treturn { valid: false, errors };\n\t}\n\n\tconst nodeNames = new Set(Object.keys(d.nodes as object));\n\n\tfor (const [name, raw] of Object.entries(d.nodes as Record<string, unknown>)) {\n\t\tif (raw == null || typeof raw !== \"object\") {\n\t\t\terrors.push(`Node \"${name}\": must be an object`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst node = raw as Record<string, unknown>;\n\t\tif (typeof node.type !== \"string\" || !VALID_NODE_TYPES.has(node.type)) {\n\t\t\terrors.push(\n\t\t\t\t`Node \"${name}\": invalid type \"${String(node.type)}\" (expected: ${[...VALID_NODE_TYPES].join(\", \")})`,\n\t\t\t);\n\t\t}\n\t\tif (Array.isArray(node.deps)) {\n\t\t\tfor (const dep of node.deps) {\n\t\t\t\tif (typeof dep === \"string\" && !nodeNames.has(dep)) {\n\t\t\t\t\terrors.push(`Node \"${name}\": dep \"${dep}\" does not reference an existing node`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!Array.isArray(d.edges)) {\n\t\tif (d.edges !== undefined) {\n\t\t\terrors.push(\"'edges' must be an array\");\n\t\t}\n\t\t// edges are optional — no error if absent\n\t} else {\n\t\tconst seen = new Set<string>();\n\t\tfor (let i = 0; i < (d.edges as unknown[]).length; i++) {\n\t\t\tconst edge = (d.edges as unknown[])[i];\n\t\t\tif (edge == null || typeof edge !== \"object\") {\n\t\t\t\terrors.push(`Edge [${i}]: must be an object`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst e = edge as Record<string, unknown>;\n\t\t\tif (typeof e.from !== \"string\" || !nodeNames.has(e.from)) {\n\t\t\t\terrors.push(`Edge [${i}]: 'from' \"${String(e.from)}\" does not reference an existing node`);\n\t\t\t}\n\t\t\tif (typeof e.to !== \"string\" || !nodeNames.has(e.to)) {\n\t\t\t\terrors.push(`Edge [${i}]: 'to' \"${String(e.to)}\" does not reference an existing node`);\n\t\t\t}\n\t\t\tconst key = `${e.from}->${e.to}`;\n\t\t\tif (seen.has(key)) {\n\t\t\t\terrors.push(`Edge [${i}]: duplicate edge ${key}`);\n\t\t\t}\n\t\t\tseen.add(key);\n\t\t}\n\t}\n\n\treturn { valid: errors.length === 0, errors };\n}\n\n// ---------------------------------------------------------------------------\n// graphFromSpec\n// ---------------------------------------------------------------------------\n\nexport type GraphFromSpecOptions = {\n\tmodel?: string;\n\ttemperature?: number;\n\tmaxTokens?: number;\n\t/** Callback to construct topology before values are applied (passed to `Graph.fromSnapshot`). */\n\tbuild?: (g: Graph) => void;\n\t/** Extra instructions appended to the system prompt. */\n\tsystemPromptExtra?: string;\n};\n\n/** Strip markdown code fences, handling trailing commentary after closing fence. */\nfunction stripFences(text: string): string {\n\tconst match = text.match(/^```(?:json)?\\s*([\\s\\S]*?)\\s*```[\\s\\S]*$/);\n\treturn match ? match[1]! : text;\n}\n\nconst GRAPH_FROM_SPEC_SYSTEM_PROMPT = `You are a graph architect for GraphReFly, a reactive graph protocol.\n\nGiven a natural-language description, produce a JSON graph definition with this structure:\n\n{\n \"name\": \"<graph_name>\",\n \"nodes\": {\n \"<node_name>\": {\n \"type\": \"state\" | \"derived\" | \"producer\" | \"operator\" | \"effect\",\n \"value\": <initial_value_or_null>,\n \"deps\": [\"<dep_node_name>\", ...],\n \"meta\": {\n \"description\": \"<human-readable purpose>\",\n \"type\": \"string\" | \"number\" | \"boolean\" | \"integer\" | \"enum\",\n \"range\": [min, max],\n \"values\": [\"a\", \"b\"],\n \"format\": \"currency\" | \"percentage\" | \"status\",\n \"access\": \"human\" | \"llm\" | \"both\" | \"system\",\n \"unit\": \"<unit>\",\n \"tags\": [\"<tag>\"]\n }\n }\n },\n \"edges\": [\n { \"from\": \"<source_node>\", \"to\": \"<target_node>\" }\n ]\n}\n\nRules:\n- \"state\" nodes have no deps and hold user/LLM-writable values (knobs).\n- \"derived\" nodes have deps and compute from them.\n- \"effect\" nodes have deps but produce side effects (no return value).\n- \"producer\" nodes have no deps but generate values asynchronously.\n- Edges wire output of one node as input to another. They must match deps.\n- meta.description is required for every node.\n- Return ONLY valid JSON, no markdown fences or commentary.`;\n\n/**\n * Ask an LLM to compose a Graph from a natural-language description.\n *\n * The LLM returns a JSON graph definition which is validated and then\n * constructed via `Graph.fromSnapshot()`.\n *\n * @param naturalLanguage - The problem/use-case description.\n * @param adapter - LLM adapter for the generation call.\n * @param opts - Model options and optional `build` callback for node factories.\n * @returns A constructed Graph.\n * @throws On invalid LLM output or validation failure.\n */\nexport async function graphFromSpec(\n\tnaturalLanguage: string,\n\tadapter: LLMAdapter,\n\topts?: GraphFromSpecOptions,\n): Promise<Graph> {\n\tconst systemPrompt = opts?.systemPromptExtra\n\t\t? `${GRAPH_FROM_SPEC_SYSTEM_PROMPT}\\n\\n${opts.systemPromptExtra}`\n\t\t: GRAPH_FROM_SPEC_SYSTEM_PROMPT;\n\n\tconst messages: ChatMessage[] = [\n\t\t{ role: \"system\", content: systemPrompt },\n\t\t{ role: \"user\", content: naturalLanguage },\n\t];\n\n\tconst rawResult = adapter.invoke(messages, {\n\t\tmodel: opts?.model,\n\t\ttemperature: opts?.temperature ?? 0,\n\t\tmaxTokens: opts?.maxTokens,\n\t});\n\n\tconst response = (await resolveToolHandlerResult(rawResult)) as LLMResponse;\n\tlet content = response.content.trim();\n\n\t// Strip markdown fences if present (handles trailing commentary after ```)\n\tif (content.startsWith(\"```\")) {\n\t\tcontent = stripFences(content);\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(content);\n\t} catch {\n\t\tthrow new Error(`graphFromSpec: LLM response is not valid JSON: ${content.slice(0, 200)}`);\n\t}\n\n\tconst validation = validateGraphDef(parsed);\n\tif (!validation.valid) {\n\t\tthrow new Error(`graphFromSpec: invalid graph definition:\\n${validation.errors.join(\"\\n\")}`);\n\t}\n\n\tconst def = parsed as Record<string, unknown>;\n\t// Ensure version field is present for fromSnapshot envelope check\n\tif (def.version === undefined) def.version = 1;\n\tif (!Array.isArray(def.subgraphs)) def.subgraphs = [];\n\treturn Graph.fromSnapshot(def as GraphPersistSnapshot, opts?.build);\n}\n\n// ---------------------------------------------------------------------------\n// suggestStrategy\n// ---------------------------------------------------------------------------\n\n/** A single operation in a strategy plan. */\nexport type StrategyOperation =\n\t| {\n\t\t\treadonly type: \"add_node\";\n\t\t\treadonly name: string;\n\t\t\treadonly nodeType: string;\n\t\t\treadonly meta?: Record<string, unknown>;\n\t\t\treadonly initial?: unknown;\n\t }\n\t| { readonly type: \"remove_node\"; readonly name: string }\n\t| { readonly type: \"connect\"; readonly from: string; readonly to: string }\n\t| { readonly type: \"disconnect\"; readonly from: string; readonly to: string }\n\t| { readonly type: \"set_value\"; readonly name: string; readonly value: unknown }\n\t| {\n\t\t\treadonly type: \"update_meta\";\n\t\t\treadonly name: string;\n\t\t\treadonly key: string;\n\t\t\treadonly value: unknown;\n\t };\n\n/** Structured strategy plan returned by {@link suggestStrategy}. */\nexport type StrategyPlan = {\n\treadonly summary: string;\n\treadonly operations: readonly StrategyOperation[];\n\treadonly reasoning: string;\n};\n\nexport type SuggestStrategyOptions = {\n\tmodel?: string;\n\ttemperature?: number;\n\tmaxTokens?: number;\n\tactor?: Actor;\n};\n\nconst SUGGEST_STRATEGY_SYSTEM_PROMPT = `You are a reactive graph optimizer for GraphReFly.\n\nGiven a graph's current structure (from describe()) and a problem statement, suggest topology and parameter changes to solve the problem.\n\nReturn ONLY valid JSON with this structure:\n{\n \"summary\": \"<one-line summary of the strategy>\",\n \"reasoning\": \"<explanation of why these changes help>\",\n \"operations\": [\n { \"type\": \"add_node\", \"name\": \"<name>\", \"nodeType\": \"state|derived|effect|producer|operator\", \"meta\": {...}, \"initial\": <value> },\n { \"type\": \"remove_node\", \"name\": \"<name>\" },\n { \"type\": \"connect\", \"from\": \"<source>\", \"to\": \"<target>\" },\n { \"type\": \"disconnect\", \"from\": \"<source>\", \"to\": \"<target>\" },\n { \"type\": \"set_value\", \"name\": \"<name>\", \"value\": <new_value> },\n { \"type\": \"update_meta\", \"name\": \"<name>\", \"key\": \"<meta_key>\", \"value\": <new_value> }\n ]\n}\n\nRules:\n- Only suggest operations that reference existing nodes (for remove/disconnect/set_value/update_meta) or new nodes you define (for add_node).\n- Keep changes minimal — prefer the smallest set of operations that solves the problem.\n- Return ONLY valid JSON, no markdown fences or commentary.`;\n\n/**\n * Ask an LLM to analyze a graph and suggest topology/parameter changes\n * to solve a stated problem.\n *\n * Returns a structured plan — does NOT auto-apply. The caller reviews\n * and selectively applies operations.\n *\n * @param graph - The graph to analyze.\n * @param problem - Natural-language problem statement.\n * @param adapter - LLM adapter for the analysis call.\n * @param opts - Model and actor options.\n * @returns A structured strategy plan.\n * @throws On invalid LLM output.\n */\nexport async function suggestStrategy(\n\tgraph: Graph,\n\tproblem: string,\n\tadapter: LLMAdapter,\n\topts?: SuggestStrategyOptions,\n): Promise<StrategyPlan> {\n\tconst { expand: _, ...described } = graph.describe({ actor: opts?.actor, detail: \"standard\" });\n\n\tconst messages: ChatMessage[] = [\n\t\t{ role: \"system\", content: SUGGEST_STRATEGY_SYSTEM_PROMPT },\n\t\t{\n\t\t\trole: \"user\",\n\t\t\tcontent: JSON.stringify({\n\t\t\t\tgraph: described,\n\t\t\t\tproblem,\n\t\t\t}),\n\t\t},\n\t];\n\n\tconst rawResult = adapter.invoke(messages, {\n\t\tmodel: opts?.model,\n\t\ttemperature: opts?.temperature ?? 0,\n\t\tmaxTokens: opts?.maxTokens,\n\t});\n\n\tconst response = (await resolveToolHandlerResult(rawResult)) as LLMResponse;\n\tlet content = response.content.trim();\n\n\tif (content.startsWith(\"```\")) {\n\t\tcontent = content.replace(/^```(?:json)?\\s*/, \"\").replace(/\\s*```$/, \"\");\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(content);\n\t} catch {\n\t\tthrow new Error(`suggestStrategy: LLM response is not valid JSON: ${content.slice(0, 200)}`);\n\t}\n\n\tconst plan = parsed as Record<string, unknown>;\n\n\tif (typeof plan.summary !== \"string\") {\n\t\tthrow new Error(\"suggestStrategy: missing 'summary' in response\");\n\t}\n\tif (typeof plan.reasoning !== \"string\") {\n\t\tthrow new Error(\"suggestStrategy: missing 'reasoning' in response\");\n\t}\n\tif (!Array.isArray(plan.operations)) {\n\t\tthrow new Error(\"suggestStrategy: missing 'operations' array in response\");\n\t}\n\n\treturn {\n\t\tsummary: plan.summary,\n\t\treasoning: plan.reasoning,\n\t\toperations: plan.operations as readonly StrategyOperation[],\n\t};\n}\n","/**\n * Memory patterns (roadmap §4.3).\n *\n * Domain-layer helpers composed from GraphRefly primitives. `vectorIndex` uses\n * an exact-search backend by default; an HNSW adapter can be injected as an\n * optional dependency.\n */\n\nimport { monotonicNs } from \"../core/clock.js\";\nimport { DATA } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { derived, state } from \"../core/sugar.js\";\nimport { Graph } from \"../graph/graph.js\";\n\nexport type CollectionPolicy = \"fifo\" | \"lru\";\nexport type VectorBackend = \"flat\" | \"hnsw\";\n\nexport type LightCollectionEntry<T> = {\n\treadonly id: string;\n\treadonly value: T;\n\treadonly createdAtNs: number;\n\treadonly lastAccessNs: number;\n};\n\nexport type LightCollectionOptions = {\n\tname?: string;\n\tmaxSize?: number;\n\tpolicy?: CollectionPolicy;\n};\n\nexport type LightCollectionBundle<T> = {\n\treadonly entries: Node<ReadonlyMap<string, LightCollectionEntry<T>>>;\n\tupsert: (id: string, value: T) => void;\n\tremove: (id: string) => void;\n\tclear: () => void;\n\tget: (id: string) => T | undefined;\n\thas: (id: string) => boolean;\n};\n\nexport type CollectionEntry<T> = LightCollectionEntry<T> & {\n\treadonly baseScore: number;\n};\n\nexport type RankedCollectionEntry<T> = CollectionEntry<T> & {\n\treadonly score: number;\n};\n\nexport type CollectionOptions<T> = {\n\tmaxSize?: number;\n\tpolicy?: CollectionPolicy;\n\t/**\n\t * Produces a base score at insert/update time.\n\t */\n\tscore?: (value: T) => number;\n\t/**\n\t * Exponential decay rate per second. 0 disables decay.\n\t */\n\tdecayRate?: number;\n\t/**\n\t * Minimum score floor after decay.\n\t */\n\tminScore?: number;\n};\n\nexport type CollectionGraph<T> = Graph & {\n\tupsert: (id: string, value: T, opts?: { score?: number }) => void;\n\tremove: (id: string) => void;\n\tclear: () => void;\n\tgetItem: (id: string) => CollectionEntry<T> | undefined;\n};\n\nexport type VectorRecord<TMeta> = {\n\treadonly id: string;\n\treadonly vector: readonly number[];\n\treadonly meta?: TMeta;\n};\n\nexport type VectorSearchResult<TMeta> = {\n\treadonly id: string;\n\treadonly score: number;\n\treadonly meta?: TMeta;\n};\n\nexport type HnswAdapter<TMeta> = {\n\tupsert: (id: string, vector: readonly number[], meta?: TMeta) => void;\n\tremove: (id: string) => void;\n\tclear: () => void;\n\tsearch: (query: readonly number[], k: number) => ReadonlyArray<VectorSearchResult<TMeta>>;\n};\n\nexport type VectorIndexOptions<TMeta> = {\n\tbackend?: VectorBackend;\n\tdimension?: number;\n\t/**\n\t * Optional dependency seam for HNSW.\n\t */\n\thnswFactory?: () => HnswAdapter<TMeta>;\n};\n\nexport type VectorIndexBundle<TMeta> = {\n\treadonly backend: VectorBackend;\n\treadonly entries: Node<ReadonlyMap<string, VectorRecord<TMeta>>>;\n\tupsert: (id: string, vector: readonly number[], meta?: TMeta) => void;\n\tremove: (id: string) => void;\n\tclear: () => void;\n\tsearch: (query: readonly number[], k?: number) => ReadonlyArray<VectorSearchResult<TMeta>>;\n};\n\nexport type KnowledgeEdge<TRelation extends string = string> = {\n\treadonly from: string;\n\treadonly to: string;\n\treadonly relation: TRelation;\n\treadonly weight: number;\n};\n\nexport type KnowledgeGraphGraph<TEntity, TRelation extends string = string> = Graph & {\n\tupsertEntity: (id: string, value: TEntity) => void;\n\tremoveEntity: (id: string) => void;\n\tlink: (from: string, to: string, relation: TRelation, weight?: number) => void;\n\tunlink: (from: string, to: string, relation?: TRelation) => void;\n\trelated: (id: string, relation?: TRelation) => ReadonlyArray<KnowledgeEdge<TRelation>>;\n};\n\nexport function decay(\n\tbaseScore: number,\n\tageSeconds: number,\n\tratePerSecond: number,\n\tminScore = 0,\n): number {\n\tif (!Number.isFinite(baseScore)) return minScore;\n\tif (!Number.isFinite(ageSeconds) || ageSeconds <= 0) return Math.max(minScore, baseScore);\n\tif (!Number.isFinite(ratePerSecond) || ratePerSecond <= 0) return Math.max(minScore, baseScore);\n\tconst decayed = baseScore * Math.exp(-ratePerSecond * ageSeconds);\n\treturn Math.max(minScore, decayed);\n}\n\nfunction assertMaxSize(maxSize: number | undefined): void {\n\tif (maxSize !== undefined && maxSize < 1) {\n\t\tthrow new RangeError(\"maxSize must be >= 1\");\n\t}\n}\n\nfunction copyMap<K, V>(m: ReadonlyMap<K, V>): Map<K, V> {\n\treturn new Map(m);\n}\n\nfunction readMap<K, V>(node: Node<ReadonlyMap<K, V>>): ReadonlyMap<K, V> {\n\treturn node.get() ?? new Map<K, V>();\n}\n\nfunction readArray<T>(node: Node<ReadonlyArray<T>>): ReadonlyArray<T> {\n\treturn node.get() ?? [];\n}\n\nfunction cosineSimilarity(a: readonly number[], b: readonly number[]): number {\n\tconst n = Math.max(a.length, b.length);\n\tlet dot = 0;\n\tlet na = 0;\n\tlet nb = 0;\n\tfor (let i = 0; i < n; i += 1) {\n\t\tconst av = a[i] ?? 0;\n\t\tconst bv = b[i] ?? 0;\n\t\tdot += av * bv;\n\t\tna += av * av;\n\t\tnb += bv * bv;\n\t}\n\tif (na === 0 || nb === 0) return 0;\n\treturn dot / Math.sqrt(na * nb);\n}\n\nexport function lightCollection<T>(opts: LightCollectionOptions = {}): LightCollectionBundle<T> {\n\tconst maxSize = opts.maxSize;\n\tconst policy = opts.policy ?? \"fifo\";\n\tassertMaxSize(maxSize);\n\n\tconst entries = state<ReadonlyMap<string, LightCollectionEntry<T>>>(new Map(), {\n\t\tname: opts.name,\n\t\tdescribeKind: \"state\",\n\t});\n\n\tfunction evictIfNeeded(next: Map<string, LightCollectionEntry<T>>): void {\n\t\tif (maxSize === undefined) return;\n\t\twhile (next.size > maxSize) {\n\t\t\tlet victim: LightCollectionEntry<T> | undefined;\n\t\t\tfor (const entry of next.values()) {\n\t\t\t\tif (!victim) {\n\t\t\t\t\tvictim = entry;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst lhs = policy === \"lru\" ? entry.lastAccessNs : entry.createdAtNs;\n\t\t\t\tconst rhs = policy === \"lru\" ? victim.lastAccessNs : victim.createdAtNs;\n\t\t\t\tif (lhs < rhs) victim = entry;\n\t\t\t}\n\t\t\tif (!victim) break;\n\t\t\tnext.delete(victim.id);\n\t\t}\n\t}\n\n\tfunction commit(next: Map<string, LightCollectionEntry<T>>): void {\n\t\tentries.down([[DATA, next]]);\n\t}\n\n\treturn {\n\t\tentries,\n\t\tupsert(id, value) {\n\t\t\tconst now = monotonicNs();\n\t\t\tconst current = readMap(entries);\n\t\t\tconst prev = current.get(id);\n\t\t\tconst next = copyMap(current);\n\t\t\tnext.set(id, {\n\t\t\t\tid,\n\t\t\t\tvalue,\n\t\t\t\tcreatedAtNs: prev?.createdAtNs ?? now,\n\t\t\t\tlastAccessNs: now,\n\t\t\t});\n\t\t\tevictIfNeeded(next);\n\t\t\tcommit(next);\n\t\t},\n\t\tremove(id) {\n\t\t\tconst next = copyMap(readMap(entries));\n\t\t\tif (!next.delete(id)) return;\n\t\t\tcommit(next);\n\t\t},\n\t\tclear() {\n\t\t\tif (readMap(entries).size === 0) return;\n\t\t\tcommit(new Map());\n\t\t},\n\t\tget(id) {\n\t\t\tconst current = readMap(entries);\n\t\t\tconst found = current.get(id);\n\t\t\tif (!found) return undefined;\n\t\t\tif (policy === \"lru\") {\n\t\t\t\tconst now = monotonicNs();\n\t\t\t\tconst next = copyMap(current);\n\t\t\t\tnext.set(id, { ...found, lastAccessNs: now });\n\t\t\t\tcommit(next);\n\t\t\t}\n\t\t\treturn found.value;\n\t\t},\n\t\thas(id) {\n\t\t\treturn readMap(entries).has(id);\n\t\t},\n\t};\n}\n\nexport function collection<T>(name: string, opts: CollectionOptions<T> = {}): CollectionGraph<T> {\n\tconst maxSize = opts.maxSize;\n\tconst policy = opts.policy ?? \"lru\";\n\tconst decayRate = opts.decayRate ?? 0;\n\tconst minScore = opts.minScore ?? 0;\n\tconst scoreFn = opts.score ?? (() => 1);\n\tassertMaxSize(maxSize);\n\n\tconst graph = new Graph(name);\n\tconst items = state<ReadonlyMap<string, CollectionEntry<T>>>(new Map(), {\n\t\tname: \"items\",\n\t\tdescribeKind: \"state\",\n\t});\n\tconst ranked = derived(\n\t\t[items],\n\t\t([snapshot]) => {\n\t\t\tconst typed = (snapshot ?? new Map()) as ReadonlyMap<string, CollectionEntry<T>>;\n\t\t\tconst now = monotonicNs();\n\t\t\tconst out = [...typed.values()].map((entry) => {\n\t\t\t\tconst ageSeconds = (now - entry.lastAccessNs) / 1_000_000_000;\n\t\t\t\treturn {\n\t\t\t\t\t...entry,\n\t\t\t\t\tscore: decay(entry.baseScore, ageSeconds, decayRate, minScore),\n\t\t\t\t};\n\t\t\t});\n\t\t\tout.sort((a, b) => b.score - a.score || b.lastAccessNs - a.lastAccessNs);\n\t\t\treturn out;\n\t\t},\n\t\t{ name: \"ranked\", describeKind: \"derived\" },\n\t);\n\tconst size = derived(\n\t\t[items],\n\t\t([snapshot]) => ((snapshot ?? new Map()) as ReadonlyMap<string, CollectionEntry<T>>).size,\n\t\t{\n\t\t\tname: \"size\",\n\t\t\tdescribeKind: \"derived\",\n\t\t\tinitial: 0,\n\t\t},\n\t);\n\tvoid ranked.subscribe(() => undefined);\n\tvoid size.subscribe(() => undefined);\n\n\tgraph.add(\"items\", items);\n\tgraph.add(\"ranked\", ranked);\n\tgraph.add(\"size\", size);\n\tgraph.connect(\"items\", \"ranked\");\n\tgraph.connect(\"items\", \"size\");\n\n\tfunction effective(entry: CollectionEntry<T>, now: number): number {\n\t\tconst ageSeconds = (now - entry.lastAccessNs) / 1_000_000_000;\n\t\treturn decay(entry.baseScore, ageSeconds, decayRate, minScore);\n\t}\n\n\tfunction evictIfNeeded(next: Map<string, CollectionEntry<T>>): void {\n\t\tif (maxSize === undefined) return;\n\t\twhile (next.size > maxSize) {\n\t\t\tconst now = monotonicNs();\n\t\t\tlet victim: CollectionEntry<T> | undefined;\n\t\t\tlet victimScore = Number.POSITIVE_INFINITY;\n\t\t\tfor (const entry of next.values()) {\n\t\t\t\tconst score = effective(entry, now);\n\t\t\t\tif (score < victimScore) {\n\t\t\t\t\tvictim = entry;\n\t\t\t\t\tvictimScore = score;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (score === victimScore && victim) {\n\t\t\t\t\tconst lhs = policy === \"lru\" ? entry.lastAccessNs : entry.createdAtNs;\n\t\t\t\t\tconst rhs = policy === \"lru\" ? victim.lastAccessNs : victim.createdAtNs;\n\t\t\t\t\tif (lhs < rhs) victim = entry;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!victim) break;\n\t\t\tnext.delete(victim.id);\n\t\t}\n\t}\n\n\tfunction commit(next: Map<string, CollectionEntry<T>>): void {\n\t\titems.down([[DATA, next]]);\n\t}\n\n\tconst out = Object.assign(graph, {\n\t\tupsert(id: string, value: T, upsertOpts?: { score?: number }) {\n\t\t\tconst now = monotonicNs();\n\t\t\tconst current = readMap(items);\n\t\t\tconst prev = current.get(id);\n\t\t\tconst baseScore = upsertOpts?.score ?? scoreFn(value);\n\t\t\tconst next = copyMap(current);\n\t\t\tnext.set(id, {\n\t\t\t\tid,\n\t\t\t\tvalue,\n\t\t\t\tbaseScore,\n\t\t\t\tcreatedAtNs: prev?.createdAtNs ?? now,\n\t\t\t\tlastAccessNs: now,\n\t\t\t});\n\t\t\tevictIfNeeded(next);\n\t\t\tcommit(next);\n\t\t},\n\t\tremove(id: string) {\n\t\t\tconst next = copyMap(readMap(items));\n\t\t\tif (!next.delete(id)) return;\n\t\t\tcommit(next);\n\t\t},\n\t\tclear() {\n\t\t\tif (readMap(items).size === 0) return;\n\t\t\tcommit(new Map());\n\t\t},\n\t\tgetItem(id: string): CollectionEntry<T> | undefined {\n\t\t\tconst current = readMap(items);\n\t\t\tconst found = current.get(id);\n\t\t\tif (!found) return undefined;\n\t\t\tif (policy === \"lru\") {\n\t\t\t\tconst next = copyMap(current);\n\t\t\t\tnext.set(id, { ...found, lastAccessNs: monotonicNs() });\n\t\t\t\tcommit(next);\n\t\t\t}\n\t\t\treturn found;\n\t\t},\n\t}) as CollectionGraph<T>;\n\treturn out;\n}\n\nexport function vectorIndex<TMeta>(opts: VectorIndexOptions<TMeta> = {}): VectorIndexBundle<TMeta> {\n\tconst backend = opts.backend ?? \"flat\";\n\tconst dimension = opts.dimension;\n\tlet hnsw: HnswAdapter<TMeta> | undefined;\n\tif (backend === \"hnsw\") {\n\t\thnsw = opts.hnswFactory?.();\n\t\tif (!hnsw) {\n\t\t\tthrow new Error(\n\t\t\t\t'vectorIndex backend \"hnsw\" requires an optional dependency adapter; install your HNSW package and provide `hnswFactory`.',\n\t\t\t);\n\t\t}\n\t}\n\n\tconst entries = state<ReadonlyMap<string, VectorRecord<TMeta>>>(new Map(), {\n\t\tdescribeKind: \"state\",\n\t\tname: \"vector-index\",\n\t});\n\n\tfunction assertDimension(vector: readonly number[]): void {\n\t\tif (dimension !== undefined && vector.length !== dimension) {\n\t\t\tthrow new RangeError(\n\t\t\t\t`vector dimension mismatch: expected ${dimension}, got ${vector.length}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tfunction commit(next: Map<string, VectorRecord<TMeta>>): void {\n\t\tentries.down([[DATA, next]]);\n\t}\n\n\treturn {\n\t\tbackend,\n\t\tentries,\n\t\tupsert(id, vector, meta) {\n\t\t\tassertDimension(vector);\n\t\t\tconst next = copyMap(readMap(entries));\n\t\t\tnext.set(id, { id, vector: [...vector], meta });\n\t\t\tif (backend === \"hnsw\") hnsw!.upsert(id, vector, meta);\n\t\t\tcommit(next);\n\t\t},\n\t\tremove(id) {\n\t\t\tconst next = copyMap(readMap(entries));\n\t\t\tif (!next.delete(id)) return;\n\t\t\tif (backend === \"hnsw\") hnsw!.remove(id);\n\t\t\tcommit(next);\n\t\t},\n\t\tclear() {\n\t\t\tif (readMap(entries).size === 0) return;\n\t\t\tif (backend === \"hnsw\") hnsw!.clear();\n\t\t\tcommit(new Map());\n\t\t},\n\t\tsearch(query, k = 5) {\n\t\t\tassertDimension(query);\n\t\t\tif (k <= 0) return [];\n\t\t\tif (backend === \"hnsw\") return hnsw!.search(query, k);\n\t\t\tconst ranked = [...readMap(entries).values()]\n\t\t\t\t.map((row) => ({\n\t\t\t\t\tid: row.id,\n\t\t\t\t\tscore: cosineSimilarity(query, row.vector),\n\t\t\t\t\tmeta: row.meta,\n\t\t\t\t}))\n\t\t\t\t.sort((a, b) => b.score - a.score)\n\t\t\t\t.slice(0, k);\n\t\t\treturn ranked;\n\t\t},\n\t};\n}\n\nexport function knowledgeGraph<TEntity, TRelation extends string = string>(\n\tname: string,\n): KnowledgeGraphGraph<TEntity, TRelation> {\n\tconst graph = new Graph(name);\n\tconst entities = state<ReadonlyMap<string, TEntity>>(new Map(), {\n\t\tname: \"entities\",\n\t\tdescribeKind: \"state\",\n\t});\n\tconst edges = state<ReadonlyArray<KnowledgeEdge<TRelation>>>([], {\n\t\tname: \"edges\",\n\t\tdescribeKind: \"state\",\n\t});\n\tconst adjacency = derived(\n\t\t[edges],\n\t\t([rows]) => {\n\t\t\tconst typed = (rows ?? []) as ReadonlyArray<KnowledgeEdge<TRelation>>;\n\t\t\tconst out = new Map<string, ReadonlyArray<KnowledgeEdge<TRelation>>>();\n\t\t\tfor (const edge of typed) {\n\t\t\t\tconst prev = out.get(edge.from) ?? [];\n\t\t\t\tout.set(edge.from, Object.freeze([...prev, edge]));\n\t\t\t}\n\t\t\treturn out;\n\t\t},\n\t\t{ name: \"adjacency\", describeKind: \"derived\", initial: new Map() },\n\t);\n\tvoid adjacency.subscribe(() => undefined);\n\n\tgraph.add(\"entities\", entities);\n\tgraph.add(\"edges\", edges);\n\tgraph.add(\"adjacency\", adjacency);\n\tgraph.connect(\"edges\", \"adjacency\");\n\n\tfunction commitEntities(next: Map<string, TEntity>): void {\n\t\tentities.down([[DATA, next]]);\n\t}\n\n\tfunction commitEdges(next: ReadonlyArray<KnowledgeEdge<TRelation>>): void {\n\t\tedges.down([[DATA, next]]);\n\t}\n\n\tconst out = Object.assign(graph, {\n\t\tupsertEntity(id: string, value: TEntity) {\n\t\t\tconst next = copyMap(readMap(entities));\n\t\t\tnext.set(id, value);\n\t\t\tcommitEntities(next);\n\t\t},\n\t\tremoveEntity(id: string) {\n\t\t\tconst nextEntities = copyMap(readMap(entities));\n\t\t\tconst existed = nextEntities.delete(id);\n\t\t\tconst currentEdges = readArray(edges);\n\t\t\tconst nextEdges = currentEdges.filter((edge) => edge.from !== id && edge.to !== id);\n\t\t\tif (!existed && nextEdges.length === currentEdges.length) return;\n\t\t\tcommitEntities(nextEntities);\n\t\t\tcommitEdges(nextEdges);\n\t\t},\n\t\tlink(from: string, to: string, relation: TRelation, weight = 1) {\n\t\t\tconst key = `${from}\\u0000${to}\\u0000${relation}`;\n\t\t\tconst currentEdges = readArray(edges);\n\t\t\tconst existing = new Set(\n\t\t\t\tcurrentEdges.map((edge) => `${edge.from}\\u0000${edge.to}\\u0000${edge.relation}`),\n\t\t\t);\n\t\t\tconst next = [...currentEdges];\n\t\t\tif (existing.has(key)) {\n\t\t\t\tfor (let i = 0; i < next.length; i += 1) {\n\t\t\t\t\tconst edge = next[i]!;\n\t\t\t\t\tif (edge.from === from && edge.to === to && edge.relation === relation) {\n\t\t\t\t\t\tnext[i] = { ...edge, weight };\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnext.push({ from, to, relation, weight });\n\t\t\t}\n\t\t\tcommitEdges(next);\n\t\t},\n\t\tunlink(from: string, to: string, relation?: TRelation) {\n\t\t\tconst currentEdges = readArray(edges);\n\t\t\tconst next = currentEdges.filter((edge) =>\n\t\t\t\trelation === undefined\n\t\t\t\t\t? !(edge.from === from && edge.to === to)\n\t\t\t\t\t: !(edge.from === from && edge.to === to && edge.relation === relation),\n\t\t\t);\n\t\t\tif (next.length === currentEdges.length) return;\n\t\t\tcommitEdges(next);\n\t\t},\n\t\trelated(id: string, relation?: TRelation): ReadonlyArray<KnowledgeEdge<TRelation>> {\n\t\t\treturn readArray(edges).filter(\n\t\t\t\t(edge) =>\n\t\t\t\t\t(edge.from === id || edge.to === id) &&\n\t\t\t\t\t(relation === undefined || edge.relation === relation),\n\t\t\t);\n\t\t},\n\t}) as KnowledgeGraphGraph<TEntity, TRelation>;\n\treturn out;\n}\n","/**\n * Three-pane demo shell (roadmap §7.2).\n *\n * A `Graph(\"demo-shell\")` that dogfoods reactive coordination for the\n * main/side split layout with synchronized cross-highlighting.\n *\n * **Zero framework dependency** — framework bindings wrap pane components only.\n * The shell graph is headless and fully testable.\n */\n\nimport { batch } from \"../core/batch.js\";\nimport { describeNode, resolveDescribeFields } from \"../core/meta.js\";\nimport { derived, effect, state } from \"../core/sugar.js\";\nimport { Graph } from \"../graph/graph.js\";\nimport type { MeasurementAdapter } from \"./reactive-layout/reactive-layout.js\";\nimport { analyzeAndMeasure, computeLineBreaks } from \"./reactive-layout/reactive-layout.js\";\n\n// ——————————————————————————————————————————————————————————\n// Types\n// ——————————————————————————————————————————————————————————\n\n/** Identifies which pane is the source of a hover event. */\nexport type HoverPaneType = \"visual\" | \"graph\" | \"code\";\n\n/** Cross-highlighting hover target. `null` means nothing hovered. */\nexport type HoverTarget = { pane: HoverPaneType; id: string } | null;\n\n/** Which pane is full-screened (null = normal layout). */\nexport type FullscreenPane = \"main\" | \"graph\" | \"code\" | null;\n\n/**\n * Cross-referencing registry: maps node paths to code line numbers and\n * visual element selectors. Provided by each demo's `store.ts`.\n */\nexport type NodeRegistry = Map<string, { codeLine: number; visualSelector: string }>;\n\n/** Callbacks for cross-highlighting effect nodes. */\nexport type HighlightCallbacks = {\n\t/** Called when code-scroll highlight target changes. */\n\tcodeScroll?: (line: number | null) => void;\n\t/** Called when visual highlight target changes. */\n\tvisual?: (selector: string | null) => void;\n\t/** Called when graph highlight target changes. */\n\tgraph?: (nodeId: string | null) => void;\n};\n\n/** Label dimensions for graph node sizing. */\nexport type GraphLabelSize = { width: number; height: number };\n\n/** Options for {@link demoShell}. */\nexport type DemoShellOptions = {\n\t/** Initial main/side split ratio (0–1). Default: `0.65`. */\n\tmainRatio?: number;\n\t/** Initial graph/code vertical split in the side pane (0–1). Default: `0.5`. */\n\tsideSplit?: number;\n\t/** Initial viewport width in pixels. Default: `1280`. */\n\tviewportWidth?: number;\n\t/** Cross-referencing registry for hover→code/visual/graph mapping. */\n\tnodeRegistry?: NodeRegistry;\n\t/** Measurement adapter for layout engine integration. When provided, enables layout/* derived nodes. */\n\tadapter?: MeasurementAdapter;\n\t/** Font string for layout measurement. Default: `\"14px monospace\"`. */\n\tlayoutFont?: string;\n\t/** Callbacks for cross-highlighting effect nodes. When provided, creates effect nodes visible in describe(). */\n\tonHighlight?: HighlightCallbacks;\n};\n\n/** Return type of {@link demoShell}. */\nexport type DemoShellHandle = {\n\t/** The demo-shell graph. */\n\tgraph: Graph;\n\n\t// ── Convenience setters (shorthand for graph.set) ──────────\n\tsetMainRatio(ratio: number): void;\n\tsetSideSplit(ratio: number): void;\n\tsetFullscreen(pane: FullscreenPane): void;\n\tsetViewportWidth(width: number): void;\n\tsetHoverTarget(target: HoverTarget): void;\n\tsetDemoGraph(g: Graph | null): void;\n\tbumpGraphTick(): void;\n\tselectNode(path: string | null): void;\n\tsetMetaDebug(on: boolean): void;\n\t/** Set code text for layout/code-lines measurement (requires adapter). */\n\tsetCodeText(text: string): void;\n\t/** Atomic multi-set — wraps core `batch()` for glitch-free updates. */\n\tbatch(fn: () => void): void;\n\tdestroy(): void;\n};\n\n// ——————————————————————————————————————————————————————————\n// Helpers\n// ——————————————————————————————————————————————————————————\n\nfunction clamp01(v: number): number {\n\treturn Math.max(0, Math.min(1, v));\n}\n\n// ——————————————————————————————————————————————————————————\n// Factory\n// ——————————————————————————————————————————————————————————\n\n/**\n * Creates the three-pane demo shell graph (roadmap §7.2).\n *\n * All coordination is reactive — no polling, no imperative triggers.\n * Framework bindings subscribe to named nodes and drive `state` inputs.\n */\nexport function demoShell(opts?: DemoShellOptions): DemoShellHandle {\n\tconst mainRatioInit = clamp01(opts?.mainRatio ?? 0.65);\n\tconst sideSplitInit = clamp01(opts?.sideSplit ?? 0.5);\n\tconst viewportInit = Math.max(0, opts?.viewportWidth ?? 1280);\n\tconst registry = opts?.nodeRegistry ?? new Map();\n\tconst adapter = opts?.adapter ?? null;\n\tconst layoutFont = opts?.layoutFont ?? \"14px monospace\";\n\tconst onHighlight = opts?.onHighlight;\n\n\tconst g = new Graph(\"demo-shell\");\n\n\t// ── Layout state ─────────────────────────────────────\n\tconst paneMainRatio = state(mainRatioInit, { name: \"pane/main-ratio\" });\n\tconst paneSideSplit = state(sideSplitInit, { name: \"pane/side-split\" });\n\tconst paneFullscreen = state<FullscreenPane>(null, {\n\t\tname: \"pane/fullscreen\",\n\t});\n\tconst viewportWidth = state(viewportInit, { name: \"viewport/width\" });\n\n\tg.add(\"pane/main-ratio\", paneMainRatio);\n\tg.add(\"pane/side-split\", paneSideSplit);\n\tg.add(\"pane/fullscreen\", paneFullscreen);\n\tg.add(\"viewport/width\", viewportWidth);\n\n\t// ── Derived pane dimensions ──────────────────────────\n\tconst paneMainWidth = derived(\n\t\t[paneMainRatio, viewportWidth, paneFullscreen],\n\t\t([ratio, vw, fs]) => {\n\t\t\tconst r = ratio as number;\n\t\t\tconst w = vw as number;\n\t\t\tconst fullscreen = fs as FullscreenPane;\n\t\t\tif (fullscreen === \"main\") return w;\n\t\t\tif (fullscreen === \"graph\" || fullscreen === \"code\") return 0;\n\t\t\treturn Math.round(w * r);\n\t\t},\n\t\t{ name: \"pane/main-width\" },\n\t);\n\n\tconst paneSideWidth = derived(\n\t\t[paneMainWidth, viewportWidth, paneFullscreen],\n\t\t([main, vw, fs]) => {\n\t\t\tconst fullscreen = fs as FullscreenPane;\n\t\t\tconst w = vw as number;\n\t\t\tif (fullscreen === \"main\") return 0;\n\t\t\tif (fullscreen === \"graph\" || fullscreen === \"code\") return w;\n\t\t\treturn (w as number) - (main as number);\n\t\t},\n\t\t{ name: \"pane/side-width\" },\n\t);\n\n\tconst paneGraphHeight = derived(\n\t\t[paneSideSplit, paneFullscreen],\n\t\t([split, fs]) => {\n\t\t\tconst fullscreen = fs as FullscreenPane;\n\t\t\tif (fullscreen === \"graph\") return 1;\n\t\t\tif (fullscreen === \"code\") return 0;\n\t\t\tif (fullscreen === \"main\") return 0;\n\t\t\treturn clamp01(split as number);\n\t\t},\n\t\t{ name: \"pane/graph-height-ratio\" },\n\t);\n\n\tconst paneCodeHeight = derived(\n\t\t[paneGraphHeight, paneFullscreen],\n\t\t([graphH, fs]) => {\n\t\t\tconst fullscreen = fs as FullscreenPane;\n\t\t\tif (fullscreen === \"code\") return 1;\n\t\t\tif (fullscreen === \"graph\" || fullscreen === \"main\") return 0;\n\t\t\treturn 1 - (graphH as number);\n\t\t},\n\t\t{ name: \"pane/code-height-ratio\" },\n\t);\n\n\tg.add(\"pane/main-width\", paneMainWidth);\n\tg.add(\"pane/side-width\", paneSideWidth);\n\tg.add(\"pane/graph-height-ratio\", paneGraphHeight);\n\tg.add(\"pane/code-height-ratio\", paneCodeHeight);\n\n\t// ── External graph observation ───────────────────────\n\tconst demoGraphRef = state<Graph | null>(null, {\n\t\tname: \"demo/graph-ref\",\n\t});\n\tconst demoGraphTick = state(0, { name: \"demo/graph-tick\" });\n\n\tg.add(\"demo/graph-ref\", demoGraphRef);\n\tg.add(\"demo/graph-tick\", demoGraphTick);\n\n\tconst graphMermaid = derived(\n\t\t[demoGraphRef, demoGraphTick],\n\t\t([ref, _tick]) => {\n\t\t\tconst demo = ref as Graph | null;\n\t\t\tif (!demo) return \"\";\n\t\t\treturn demo.toMermaid();\n\t\t},\n\t\t{ name: \"graph/mermaid\" },\n\t);\n\n\tconst graphDescribe = derived(\n\t\t[demoGraphRef, demoGraphTick],\n\t\t([ref, _tick]) => {\n\t\t\tconst demo = ref as Graph | null;\n\t\t\tif (!demo) return null;\n\t\t\tconst { expand: _, ...snapshot } = demo.describe({ detail: \"standard\" });\n\t\t\treturn snapshot;\n\t\t},\n\t\t{ name: \"graph/describe\" },\n\t);\n\n\tg.add(\"graph/mermaid\", graphMermaid);\n\tg.add(\"graph/describe\", graphDescribe);\n\n\t// ── Cross-highlighting ───────────────────────────────\n\tconst hoverTarget = state<HoverTarget>(null, { name: \"hover/target\" });\n\tg.add(\"hover/target\", hoverTarget);\n\n\tconst highlightCodeScroll = derived(\n\t\t[hoverTarget],\n\t\t([target]) => {\n\t\t\tconst t = target as HoverTarget;\n\t\t\tif (!t) return null;\n\t\t\tconst entry = registry.get(t.id);\n\t\t\treturn entry ? entry.codeLine : null;\n\t\t},\n\t\t{ name: \"highlight/code-scroll\" },\n\t);\n\n\tconst highlightVisual = derived(\n\t\t[hoverTarget],\n\t\t([target]) => {\n\t\t\tconst t = target as HoverTarget;\n\t\t\tif (!t) return null;\n\t\t\tconst entry = registry.get(t.id);\n\t\t\treturn entry ? entry.visualSelector : null;\n\t\t},\n\t\t{ name: \"highlight/visual\" },\n\t);\n\n\tconst highlightGraph = derived(\n\t\t[hoverTarget],\n\t\t([target]) => {\n\t\t\tconst t = target as HoverTarget;\n\t\t\tif (!t) return null;\n\t\t\treturn t.id;\n\t\t},\n\t\t{ name: \"highlight/graph\" },\n\t);\n\n\tg.add(\"highlight/code-scroll\", highlightCodeScroll);\n\tg.add(\"highlight/visual\", highlightVisual);\n\tg.add(\"highlight/graph\", highlightGraph);\n\n\t// ── Cross-highlighting effect nodes (optional) ─────\n\t// Created when onHighlight callbacks are provided, making the full\n\t// source→derived→effect chain visible in describe()/toMermaid().\n\n\tif (onHighlight?.codeScroll) {\n\t\tconst cb = onHighlight.codeScroll;\n\t\tconst applyCodeScroll = effect([highlightCodeScroll], ([line]) => {\n\t\t\tcb(line as number | null);\n\t\t});\n\t\tg.add(\"highlight/apply-code-scroll\", applyCodeScroll);\n\t\tg.connect(\"highlight/code-scroll\", \"highlight/apply-code-scroll\");\n\t}\n\n\tif (onHighlight?.visual) {\n\t\tconst cb = onHighlight.visual;\n\t\tconst applyVisual = effect([highlightVisual], ([selector]) => {\n\t\t\tcb(selector as string | null);\n\t\t});\n\t\tg.add(\"highlight/apply-visual\", applyVisual);\n\t\tg.connect(\"highlight/visual\", \"highlight/apply-visual\");\n\t}\n\n\tif (onHighlight?.graph) {\n\t\tconst cb = onHighlight.graph;\n\t\tconst applyGraph = effect([highlightGraph], ([nodeId]) => {\n\t\t\tcb(nodeId as string | null);\n\t\t});\n\t\tg.add(\"highlight/apply-graph\", applyGraph);\n\t\tg.connect(\"highlight/graph\", \"highlight/apply-graph\");\n\t}\n\n\t// ── Inspect panel ────────────────────────────────────\n\tconst inspectSelected = state<string | null>(null, {\n\t\tname: \"inspect/selected-node\",\n\t});\n\tg.add(\"inspect/selected-node\", inspectSelected);\n\n\tconst standardFields = resolveDescribeFields(\"standard\");\n\n\tconst inspectNodeDetail = derived(\n\t\t[inspectSelected, demoGraphRef, demoGraphTick],\n\t\t([path, ref, _tick]) => {\n\t\t\tconst demo = ref as Graph | null;\n\t\t\tconst p = path as string | null;\n\t\t\tif (!demo || !p) return null;\n\t\t\ttry {\n\t\t\t\tconst nd = demo.resolve(p);\n\t\t\t\tconst nodeDesc = describeNode(nd, standardFields);\n\t\t\t\treturn { path: p, ...nodeDesc, value: nd.get() };\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\t{ name: \"inspect/node-detail\" },\n\t);\n\n\tconst inspectTraceLog = derived(\n\t\t[demoGraphRef, demoGraphTick],\n\t\t([ref, _tick]) => {\n\t\t\tconst demo = ref as Graph | null;\n\t\t\tif (!demo) return [];\n\t\t\treturn demo.traceLog();\n\t\t},\n\t\t{ name: \"inspect/trace-log\" },\n\t);\n\n\tg.add(\"inspect/node-detail\", inspectNodeDetail);\n\tg.add(\"inspect/trace-log\", inspectTraceLog);\n\n\t// ── Meta debug toggle ────────────────────────────────\n\tconst metaDebug = state(false, { name: \"meta/debug\" });\n\tg.add(\"meta/debug\", metaDebug);\n\n\tconst metaShellMermaid = derived(\n\t\t[metaDebug, demoGraphTick],\n\t\t([debug, _tick]) => {\n\t\t\tif (!(debug as boolean)) return \"\";\n\t\t\treturn g.toMermaid();\n\t\t},\n\t\t{ name: \"meta/shell-mermaid\" },\n\t);\n\tg.add(\"meta/shell-mermaid\", metaShellMermaid);\n\n\t// ── Layout engine integration (optional, requires adapter) ──\n\tconst codeTextNode = state(\"\", { name: \"layout/code-text\" });\n\tg.add(\"layout/code-text\", codeTextNode);\n\n\tif (adapter) {\n\t\tconst measureCache = new Map<string, Map<string, number>>();\n\n\t\tconst graphLabels = derived(\n\t\t\t[graphDescribe],\n\t\t\t([desc]) => {\n\t\t\t\tconst d = desc as { nodes: Record<string, { type: string }> } | null;\n\t\t\t\tif (!d) return new Map<string, GraphLabelSize>();\n\t\t\t\tconst result = new Map<string, GraphLabelSize>();\n\t\t\t\tfor (const [name] of Object.entries(d.nodes)) {\n\t\t\t\t\tconst segments = analyzeAndMeasure(name, layoutFont, adapter, measureCache);\n\t\t\t\t\tconst lb = computeLineBreaks(segments, Infinity, adapter, layoutFont, measureCache);\n\t\t\t\t\tconst width = lb.lines.reduce((max, l) => Math.max(max, l.width), 0);\n\t\t\t\t\tconst height = lb.lineCount * 20; // line-height approximation\n\t\t\t\t\tresult.set(name, { width, height });\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"layout/graph-labels\",\n\t\t\t\tequals: (a, b) => {\n\t\t\t\t\tif (a === b) return true;\n\t\t\t\t\tconst ma = a as Map<string, GraphLabelSize>;\n\t\t\t\t\tconst mb = b as Map<string, GraphLabelSize>;\n\t\t\t\t\tif (ma.size !== mb.size) return false;\n\t\t\t\t\tfor (const [k, v] of ma) {\n\t\t\t\t\t\tconst bv = mb.get(k);\n\t\t\t\t\t\tif (!bv || bv.width !== v.width || bv.height !== v.height) return false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\tconst codeLines = derived(\n\t\t\t[codeTextNode, paneSideWidth],\n\t\t\t([text, sideW]) => {\n\t\t\t\tconst t = text as string;\n\t\t\t\tif (!t) return { lineCount: 0, lines: [] };\n\t\t\t\tconst segments = analyzeAndMeasure(t, layoutFont, adapter, measureCache);\n\t\t\t\tconst maxW = (sideW as number) - 40; // side pane minus padding\n\t\t\t\treturn computeLineBreaks(segments, Math.max(100, maxW), adapter, layoutFont, measureCache);\n\t\t\t},\n\t\t\t{ name: \"layout/code-lines\" },\n\t\t);\n\n\t\tconst sideWidthHint = derived(\n\t\t\t[graphLabels],\n\t\t\t([labels]) => {\n\t\t\t\tconst m = labels as Map<string, GraphLabelSize>;\n\t\t\t\tif (m.size === 0) return 200; // minimum default\n\t\t\t\tlet maxW = 0;\n\t\t\t\tfor (const { width } of m.values()) {\n\t\t\t\t\tif (width > maxW) maxW = width;\n\t\t\t\t}\n\t\t\t\t// widest label + padding (node box chrome + margin)\n\t\t\t\treturn Math.max(200, Math.round(maxW + 80));\n\t\t\t},\n\t\t\t{ name: \"layout/side-width-hint\" },\n\t\t);\n\n\t\tg.add(\"layout/graph-labels\", graphLabels);\n\t\tg.add(\"layout/code-lines\", codeLines);\n\t\tg.add(\"layout/side-width-hint\", sideWidthHint);\n\n\t\tg.connect(\"graph/describe\", \"layout/graph-labels\");\n\t\tg.connect(\"layout/code-text\", \"layout/code-lines\");\n\t\tg.connect(\"pane/side-width\", \"layout/code-lines\");\n\t\tg.connect(\"layout/graph-labels\", \"layout/side-width-hint\");\n\t}\n\n\t// ── Edges (explicit wiring for describe/toMermaid) ───\n\tg.connect(\"pane/main-ratio\", \"pane/main-width\");\n\tg.connect(\"viewport/width\", \"pane/main-width\");\n\tg.connect(\"pane/fullscreen\", \"pane/main-width\");\n\tg.connect(\"pane/main-width\", \"pane/side-width\");\n\tg.connect(\"viewport/width\", \"pane/side-width\");\n\tg.connect(\"pane/fullscreen\", \"pane/side-width\");\n\tg.connect(\"pane/side-split\", \"pane/graph-height-ratio\");\n\tg.connect(\"pane/fullscreen\", \"pane/graph-height-ratio\");\n\tg.connect(\"pane/graph-height-ratio\", \"pane/code-height-ratio\");\n\tg.connect(\"pane/fullscreen\", \"pane/code-height-ratio\");\n\tg.connect(\"demo/graph-ref\", \"graph/mermaid\");\n\tg.connect(\"demo/graph-tick\", \"graph/mermaid\");\n\tg.connect(\"demo/graph-ref\", \"graph/describe\");\n\tg.connect(\"demo/graph-tick\", \"graph/describe\");\n\tg.connect(\"hover/target\", \"highlight/code-scroll\");\n\tg.connect(\"hover/target\", \"highlight/visual\");\n\tg.connect(\"hover/target\", \"highlight/graph\");\n\tg.connect(\"inspect/selected-node\", \"inspect/node-detail\");\n\tg.connect(\"demo/graph-ref\", \"inspect/node-detail\");\n\tg.connect(\"demo/graph-tick\", \"inspect/node-detail\");\n\tg.connect(\"demo/graph-ref\", \"inspect/trace-log\");\n\tg.connect(\"demo/graph-tick\", \"inspect/trace-log\");\n\tg.connect(\"meta/debug\", \"meta/shell-mermaid\");\n\tg.connect(\"demo/graph-tick\", \"meta/shell-mermaid\");\n\n\t// ── Handle ───────────────────────────────────────────\n\tlet tickCounter = 0;\n\treturn {\n\t\tgraph: g,\n\t\tsetMainRatio(ratio: number) {\n\t\t\tg.set(\"pane/main-ratio\", clamp01(ratio));\n\t\t},\n\t\tsetSideSplit(ratio: number) {\n\t\t\tg.set(\"pane/side-split\", clamp01(ratio));\n\t\t},\n\t\tsetFullscreen(pane: FullscreenPane) {\n\t\t\tg.set(\"pane/fullscreen\", pane);\n\t\t},\n\t\tsetViewportWidth(width: number) {\n\t\t\tg.set(\"viewport/width\", Math.max(0, width));\n\t\t},\n\t\tsetHoverTarget(target: HoverTarget) {\n\t\t\tg.set(\"hover/target\", target);\n\t\t},\n\t\tsetDemoGraph(demo: Graph | null) {\n\t\t\tg.set(\"demo/graph-ref\", demo);\n\t\t},\n\t\tbumpGraphTick() {\n\t\t\tg.set(\"demo/graph-tick\", ++tickCounter);\n\t\t},\n\t\tselectNode(path: string | null) {\n\t\t\tg.set(\"inspect/selected-node\", path);\n\t\t},\n\t\tsetMetaDebug(on: boolean) {\n\t\t\tg.set(\"meta/debug\", on);\n\t\t},\n\t\tsetCodeText(text: string) {\n\t\t\tg.set(\"layout/code-text\", text);\n\t\t},\n\t\tbatch(fn: () => void) {\n\t\t\tbatch(fn);\n\t\t},\n\t\tdestroy() {\n\t\t\tg.destroy();\n\t\t},\n\t};\n}\n","/**\n * Domain templates (roadmap §8.2).\n *\n * Opinionated Graph factories for common \"info → action\" domains.\n * Each template wires up §8.1 reduction primitives (stratify, funnel, feedback,\n * budgetGate, scorer) with domain-specific stages. Users fork/extend by\n * accessing named nodes and swapping stages.\n *\n * **Source injection (option B):** templates accept a `source` node, not a\n * hardcoded adapter. Pass `fromOTel(...)`, `fromGitHook(...)`, or a test\n * `state()` — the topology is the same.\n *\n * @module\n */\n\nimport { batch } from \"../core/batch.js\";\nimport { DATA } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { derived, effect, state } from \"../core/sugar.js\";\nimport { type ReactiveLogSnapshot, reactiveLog } from \"../extra/reactive-log.js\";\nimport { Graph, type GraphOptions } from \"../graph/graph.js\";\nimport { feedback, type StratifyRule, scorer, stratify } from \"./reduction.js\";\n\n// ---------------------------------------------------------------------------\n// Shared\n// ---------------------------------------------------------------------------\n\nfunction keepalive(n: Node<unknown>): () => void {\n\treturn n.subscribe(() => {});\n}\n\nfunction baseMeta(kind: string, extra?: Record<string, unknown>): Record<string, unknown> {\n\treturn { domain_template: true, template_type: kind, ...(extra ?? {}) };\n}\n\n// ---------------------------------------------------------------------------\n// 1. observabilityGraph\n// ---------------------------------------------------------------------------\n\n/** Stratification branch config for observability signals. */\nexport type ObservabilityBranch = {\n\tname: string;\n\tclassify: (value: unknown) => boolean;\n};\n\n/** Options for {@link observabilityGraph}. */\nexport type ObservabilityGraphOptions = GraphOptions & {\n\t/** Ingested signal source (e.g. fromOTel(...) or test state). */\n\tsource: Node<unknown>;\n\n\t/**\n\t * Classification rules for signal stratification.\n\t * Default: errors / traces / metrics branches.\n\t */\n\tbranches?: ObservabilityBranch[];\n\n\t/**\n\t * Correlation function: receives stratified branch values and produces\n\t * correlated insights. Default: identity pass-through.\n\t */\n\tcorrelate?: (values: unknown[]) => unknown;\n\n\t/**\n\t * SLO verification function: returns a verification result for a\n\t * correlated insight. Default: always passes.\n\t */\n\tsloCheck?: (value: unknown) => unknown;\n\n\t/**\n\t * Scorer weights for alert prioritization. One per branch.\n\t * Default: equal weights [1, 1, 1].\n\t */\n\tweights?: number[];\n\n\t/** Max feedback iterations for false-positive learning. Default: 5. */\n\tmaxFeedbackIterations?: number;\n};\n\n/**\n * OTel ingest → stratified reduction → correlation → SLO verification →\n * alert prioritization → output.\n *\n * Well-known node names:\n * - `\"source\"` — injected signal source\n * - `\"stratify::branch/<name>\"` — per-branch classification\n * - `\"correlate\"` — cross-branch correlation\n * - `\"slo_value\"`, `\"slo_verified\"` — SLO verification pair\n * - `\"alerts\"` — scored, prioritized output\n * - `\"output\"` — final output (alias for alerts)\n *\n * @category patterns\n */\nexport function observabilityGraph(name: string, opts: ObservabilityGraphOptions): Graph {\n\tconst g = new Graph(name, opts);\n\n\t// --- Source ---\n\tg.add(\"source\", opts.source);\n\n\t// --- Stratify ---\n\tconst defaultBranches: ObservabilityBranch[] = [\n\t\t{ name: \"errors\", classify: (v) => isTagged(v, \"error\") },\n\t\t{ name: \"traces\", classify: (v) => isTagged(v, \"trace\") },\n\t\t{ name: \"metrics\", classify: (v) => isTagged(v, \"metric\") },\n\t];\n\tconst branches = opts.branches ?? defaultBranches;\n\tconst rules: StratifyRule<unknown>[] = branches.map((b) => ({\n\t\tname: b.name,\n\t\tclassify: b.classify,\n\t}));\n\tconst strat = stratify(\"stratify\", opts.source, rules);\n\tg.mount(\"stratify\", strat);\n\n\t// --- Correlate ---\n\t// Collect latest value from each branch, produce correlated output.\n\tconst branchNodes = branches.map((b) => {\n\t\ttry {\n\t\t\treturn g.resolve(`stratify::branch/${b.name}`);\n\t\t} catch {\n\t\t\treturn state<unknown>(null);\n\t\t}\n\t});\n\tconst correlateFn = opts.correlate ?? ((vals: unknown[]) => vals);\n\tconst correlateNode = derived<unknown>(\n\t\tbranchNodes as Node[],\n\t\t(vals) => correlateFn(vals as unknown[]),\n\t\t{\n\t\t\tmeta: baseMeta(\"observability\", { stage: \"correlate\" }),\n\t\t},\n\t);\n\tg.add(\"correlate\", correlateNode);\n\tfor (const b of branches) {\n\t\ttry {\n\t\t\tg.connect(`stratify::branch/${b.name}`, \"correlate\");\n\t\t} catch {\n\t\t\t/* branch may not exist */\n\t\t}\n\t}\n\n\t// --- SLO verification ---\n\tconst sloCheckFn = opts.sloCheck ?? (() => ({ pass: true }));\n\tconst sloValue = derived<unknown>([correlateNode], (vals) => vals[0], {\n\t\tmeta: baseMeta(\"observability\", { stage: \"slo_value\" }),\n\t});\n\tconst sloVerified = derived<unknown>([sloValue], (vals) => sloCheckFn(vals[0]), {\n\t\tmeta: baseMeta(\"observability\", { stage: \"slo_verified\" }),\n\t});\n\tg.add(\"slo_value\", sloValue);\n\tg.add(\"slo_verified\", sloVerified);\n\tg.connect(\"correlate\", \"slo_value\");\n\tg.connect(\"slo_value\", \"slo_verified\");\n\n\t// --- Alert scorer ---\n\tconst weightValues = opts.weights ?? branches.map(() => 1);\n\tconst signalNodes = branchNodes.map((bn) =>\n\t\tderived<number>([bn], (vals) => (vals[0] != null ? 1 : 0)),\n\t);\n\tconst weightNodes = weightValues.map((w) => state<number>(w));\n\tfor (let i = 0; i < signalNodes.length; i++) {\n\t\tg.add(`__signal_${i}`, signalNodes[i] as Node<unknown>);\n\t\tg.add(`__weight_${i}`, weightNodes[i] as Node<unknown>);\n\t}\n\tconst alerts = scorer(\n\t\tsignalNodes as ReadonlyArray<Node<number>>,\n\t\tweightNodes as ReadonlyArray<Node<number>>,\n\t);\n\tg.add(\"alerts\", alerts as Node<unknown>);\n\n\t// --- Output alias ---\n\tconst output = derived<unknown>(\n\t\t[alerts as Node, sloVerified],\n\t\t(vals) => ({\n\t\t\tscored: vals[0],\n\t\t\tslo: vals[1],\n\t\t}),\n\t\t{\n\t\t\tmeta: baseMeta(\"observability\", { stage: \"output\" }),\n\t\t},\n\t);\n\tg.add(\"output\", output);\n\tg.connect(\"alerts\", \"output\");\n\tg.connect(\"slo_verified\", \"output\");\n\n\t// --- Feedback (false-positive learning) ---\n\t// SLO failures feed back to re-check with updated context.\n\tconst fbReentry = state<unknown>(null, {\n\t\tmeta: baseMeta(\"observability\", { stage: \"feedback_reentry\" }),\n\t});\n\tg.add(\"feedback_reentry\", fbReentry);\n\tconst fbCondition = derived<unknown>(\n\t\t[sloVerified],\n\t\t(vals) => {\n\t\t\tconst result = vals[0] as Record<string, unknown> | null;\n\t\t\tif (result && result.pass === false) return result;\n\t\t\treturn null;\n\t\t},\n\t\t{\n\t\t\tmeta: baseMeta(\"observability\", { stage: \"feedback_condition\" }),\n\t\t},\n\t);\n\tg.add(\"feedback_condition\", fbCondition as Node<unknown>);\n\tg.connect(\"slo_verified\", \"feedback_condition\");\n\tfeedback(g, \"feedback_condition\", \"feedback_reentry\", {\n\t\tmaxIterations: opts.maxFeedbackIterations ?? 5,\n\t});\n\n\treturn g;\n}\n\n// ---------------------------------------------------------------------------\n// 2. issueTrackerGraph\n// ---------------------------------------------------------------------------\n\n/** A structured issue extracted from raw findings. */\nexport type ExtractedIssue = {\n\tid: string;\n\ttitle: string;\n\tseverity: number;\n\tsource: string;\n\traw: unknown;\n};\n\n/** Options for {@link issueTrackerGraph}. */\nexport type IssueTrackerGraphOptions = GraphOptions & {\n\t/** Findings source (e.g. fromGitHook(...), fromFSWatch(...)). */\n\tsource: Node<unknown>;\n\n\t/**\n\t * Extract structured issues from raw findings.\n\t * Default: wraps raw value as a single issue.\n\t */\n\textract?: (raw: unknown) => ExtractedIssue;\n\n\t/**\n\t * Verify an extracted issue (assertion check).\n\t * Default: always valid.\n\t */\n\tverify?: (issue: ExtractedIssue) => unknown;\n\n\t/**\n\t * Detect regression by comparing against known patterns.\n\t * Receives (current issue, known patterns).\n\t * Default: no regression detected.\n\t */\n\tdetectRegression?: (issue: ExtractedIssue, known: unknown) => unknown;\n\n\t/** Max feedback iterations for re-scanning. Default: 3. */\n\tmaxFeedbackIterations?: number;\n};\n\n/**\n * Findings ingest → extraction → verification → regression detection →\n * distillation → prioritized queue.\n *\n * Well-known node names:\n * - `\"source\"` — injected findings source\n * - `\"extract\"` — structured issue extraction\n * - `\"verify\"` — issue verification\n * - `\"known_patterns\"` — accumulated known issue patterns (state)\n * - `\"regression\"` — regression detection\n * - `\"priority\"` — severity-based prioritization\n * - `\"output\"` — final prioritized output\n *\n * @category patterns\n */\nexport function issueTrackerGraph(name: string, opts: IssueTrackerGraphOptions): Graph {\n\tconst g = new Graph(name, opts);\n\n\t// --- Source ---\n\tg.add(\"source\", opts.source);\n\n\t// --- Extract ---\n\tlet _issueCounter = 0;\n\tconst defaultExtract = (raw: unknown): ExtractedIssue => ({\n\t\tid: `issue-${++_issueCounter}`,\n\t\ttitle: String(raw),\n\t\tseverity: 1,\n\t\tsource: \"unknown\",\n\t\traw,\n\t});\n\tconst extractFn = opts.extract ?? defaultExtract;\n\tconst extractNode = derived<ExtractedIssue>([opts.source], (vals) => extractFn(vals[0]), {\n\t\tmeta: baseMeta(\"issue_tracker\", { stage: \"extract\" }),\n\t});\n\tg.add(\"extract\", extractNode as Node<unknown>);\n\tg.connect(\"source\", \"extract\");\n\n\t// --- Verify ---\n\tconst verifyFn = opts.verify ?? (() => ({ valid: true }));\n\tconst verifyNode = derived<unknown>(\n\t\t[extractNode as Node],\n\t\t(vals) => {\n\t\t\tconst issue = vals[0] as ExtractedIssue;\n\t\t\treturn { issue, verification: verifyFn(issue) };\n\t\t},\n\t\t{\n\t\t\tmeta: baseMeta(\"issue_tracker\", { stage: \"verify\" }),\n\t\t},\n\t);\n\tg.add(\"verify\", verifyNode);\n\tg.connect(\"extract\", \"verify\");\n\n\t// --- Known patterns (memory / distillation state) ---\n\tconst knownPatterns = state<unknown[]>([], {\n\t\tmeta: baseMeta(\"issue_tracker\", { stage: \"known_patterns\" }),\n\t});\n\tg.add(\"known_patterns\", knownPatterns as Node<unknown>);\n\n\t// --- Regression detection ---\n\tconst detectFn = opts.detectRegression ?? (() => ({ regression: false }));\n\tconst regressionNode = derived<unknown>(\n\t\t[extractNode as Node, knownPatterns as Node],\n\t\t(vals) => {\n\t\t\tconst issue = vals[0] as ExtractedIssue;\n\t\t\tconst known = vals[1];\n\t\t\treturn { issue, regression: detectFn(issue, known) };\n\t\t},\n\t\t{ meta: baseMeta(\"issue_tracker\", { stage: \"regression\" }) },\n\t);\n\tg.add(\"regression\", regressionNode);\n\tg.connect(\"extract\", \"regression\");\n\tg.connect(\"known_patterns\", \"regression\");\n\n\t// --- Priority scoring ---\n\tconst severitySignal = derived<number>([extractNode as Node], (vals) => {\n\t\tconst issue = vals[0] as ExtractedIssue;\n\t\treturn issue?.severity ?? 0;\n\t});\n\tconst regressionSignal = derived<number>([regressionNode], (vals) => {\n\t\tconst r = vals[0] as Record<string, unknown> | null;\n\t\treturn r?.regression ? 2 : 0;\n\t});\n\tg.add(\"__severity_signal\", severitySignal as Node<unknown>);\n\tg.add(\"__regression_signal\", regressionSignal as Node<unknown>);\n\n\tconst severityWeight = state<number>(1);\n\tconst regressionWeight = state<number>(1.5);\n\tg.add(\"__severity_weight\", severityWeight as Node<unknown>);\n\tg.add(\"__regression_weight\", regressionWeight as Node<unknown>);\n\n\tconst priority = scorer([severitySignal, regressionSignal], [severityWeight, regressionWeight]);\n\tg.add(\"priority\", priority as Node<unknown>);\n\n\t// --- Output ---\n\tconst output = derived<unknown>(\n\t\t[verifyNode, regressionNode, priority as Node],\n\t\t(vals) => ({\n\t\t\tverified: vals[0],\n\t\t\tregression: vals[1],\n\t\t\tpriority: vals[2],\n\t\t}),\n\t\t{ meta: baseMeta(\"issue_tracker\", { stage: \"output\" }) },\n\t);\n\tg.add(\"output\", output);\n\tg.connect(\"verify\", \"output\");\n\tg.connect(\"regression\", \"output\");\n\tg.connect(\"priority\", \"output\");\n\n\t// --- Feedback (re-scan on verification failure) ---\n\tconst fbReentry = state<unknown>(null, {\n\t\tmeta: baseMeta(\"issue_tracker\", { stage: \"feedback_reentry\" }),\n\t});\n\tg.add(\"feedback_reentry\", fbReentry);\n\tconst fbCondition = derived<unknown>(\n\t\t[verifyNode],\n\t\t(vals) => {\n\t\t\tconst result = vals[0] as Record<string, unknown> | null;\n\t\t\tif (result) {\n\t\t\t\tconst v = result.verification as Record<string, unknown> | null;\n\t\t\t\tif (v && v.valid === false) return result;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\t{\n\t\t\tmeta: baseMeta(\"issue_tracker\", { stage: \"feedback_condition\" }),\n\t\t},\n\t);\n\tg.add(\"feedback_condition\", fbCondition as Node<unknown>);\n\tg.connect(\"verify\", \"feedback_condition\");\n\tfeedback(g, \"feedback_condition\", \"feedback_reentry\", {\n\t\tmaxIterations: opts.maxFeedbackIterations ?? 3,\n\t});\n\n\treturn g;\n}\n\n// ---------------------------------------------------------------------------\n// 3. contentModerationGraph\n// ---------------------------------------------------------------------------\n\n/** Classification result from LLM moderation. */\nexport type ModerationResult = {\n\tlabel: \"safe\" | \"review\" | \"block\";\n\tconfidence: number;\n\treason?: string;\n\toriginal: unknown;\n};\n\n/** Options for {@link contentModerationGraph}. */\nexport type ContentModerationGraphOptions = GraphOptions & {\n\t/** Content source (text/multimedia ingest). */\n\tsource: Node<unknown>;\n\n\t/**\n\t * Classification function: returns a ModerationResult.\n\t * Default: labels everything \"review\" with confidence 0.5.\n\t */\n\tclassify?: (content: unknown) => ModerationResult;\n\n\t/** System prompt for LLM classification. */\n\tsystemPrompt?: string;\n\n\t/** Scorer weights: [safe, review, block]. Default: [0.1, 1, 2]. */\n\tweights?: [number, number, number];\n\n\t/** Max feedback iterations for policy refinement. Default: 5. */\n\tmaxFeedbackIterations?: number;\n\n\t/** Max review queue size. When set, oldest entries are trimmed on overflow. */\n\tmaxQueueSize?: number;\n};\n\n/**\n * Content ingest → LLM/rule classification → stratified routing (safe/review/block) →\n * human review queue → scorer → feedback (false positives → policy refinement) → output.\n *\n * Well-known node names:\n * - `\"source\"` — content ingest\n * - `\"classify\"` — LLM or rule-based classification\n * - `\"stratify::branch/safe\"`, `\"stratify::branch/review\"`, `\"stratify::branch/block\"` — routed branches\n * - `\"review_queue\"` — state node for human review items\n * - `\"priority\"` — scored priority output\n * - `\"policy\"` — writable state for policy refinement\n * - `\"output\"` — final moderation output\n *\n * @category patterns\n */\nexport function contentModerationGraph(name: string, opts: ContentModerationGraphOptions): Graph {\n\tconst g = new Graph(name, opts);\n\n\t// --- Source ---\n\tg.add(\"source\", opts.source);\n\n\t// --- Classify ---\n\tconst defaultClassify = (content: unknown): ModerationResult => ({\n\t\tlabel: \"review\",\n\t\tconfidence: 0.5,\n\t\toriginal: content,\n\t});\n\tconst classifyFn = opts.classify ?? defaultClassify;\n\tconst classifyNode = derived<ModerationResult>([opts.source], (vals) => classifyFn(vals[0]), {\n\t\tmeta: baseMeta(\"content_moderation\", { stage: \"classify\" }),\n\t});\n\tg.add(\"classify\", classifyNode as Node<unknown>);\n\tg.connect(\"source\", \"classify\");\n\n\t// --- Stratify (safe / review / block) ---\n\tconst strat = stratify<ModerationResult>(\"stratify\", classifyNode, [\n\t\t{ name: \"safe\", classify: (v) => v.label === \"safe\" },\n\t\t{ name: \"review\", classify: (v) => v.label === \"review\" },\n\t\t{ name: \"block\", classify: (v) => v.label === \"block\" },\n\t]);\n\tg.mount(\"stratify\", strat);\n\n\t// --- Review queue (reactiveLog — O(1) append, bounded) ---\n\tconst reviewLog = reactiveLog<ModerationResult>([], {\n\t\tname: \"review_queue\",\n\t\tmaxSize: opts.maxQueueSize,\n\t});\n\tg.add(\"review_queue\", reviewLog.entries as Node<unknown>);\n\n\t// Bridge review branch → review queue accumulator\n\tlet reviewBranch: Node<unknown>;\n\ttry {\n\t\treviewBranch = g.resolve(\"stratify::branch/review\");\n\t} catch {\n\t\treviewBranch = state<unknown>(null);\n\t\tg.add(\"__review_fallback\", reviewBranch);\n\t}\n\tconst reviewAccumulator = effect([reviewBranch], (vals) => {\n\t\tconst item = vals[0] as ModerationResult | null;\n\t\tif (item) {\n\t\t\treviewLog.append(item);\n\t\t}\n\t});\n\tg.add(\"__review_accumulator\", reviewAccumulator as Node<unknown>);\n\tkeepalive(reviewAccumulator as Node<unknown>);\n\ttry {\n\t\tg.connect(\"stratify::branch/review\", \"__review_accumulator\");\n\t} catch {\n\t\t// fallback branch — no stratify edge to register\n\t}\n\n\t// --- Policy state (human/LLM writable) ---\n\tconst policy = state<Record<string, unknown>>(\n\t\t{},\n\t\t{\n\t\t\tmeta: baseMeta(\"content_moderation\", {\n\t\t\t\tstage: \"policy\",\n\t\t\t\taccess: \"both\",\n\t\t\t\tdescription: \"Moderation policy rules — updated via feedback\",\n\t\t\t}),\n\t\t},\n\t);\n\tg.add(\"policy\", policy as Node<unknown>);\n\n\t// --- Priority scorer ---\n\tconst weights = opts.weights ?? [0.1, 1, 2];\n\tconst confidenceSignal = derived<number>([classifyNode as Node], (vals) => {\n\t\tconst r = vals[0] as ModerationResult | null;\n\t\treturn r?.confidence ?? 0;\n\t});\n\tconst severitySignal = derived<number>([classifyNode as Node], (vals) => {\n\t\tconst r = vals[0] as ModerationResult | null;\n\t\tif (!r) return 0;\n\t\treturn r.label === \"block\" ? weights[2] : r.label === \"review\" ? weights[1] : weights[0];\n\t});\n\tg.add(\"__confidence_signal\", confidenceSignal as Node<unknown>);\n\tg.add(\"__severity_signal\", severitySignal as Node<unknown>);\n\n\tconst wConfidence = state<number>(1);\n\tconst wSeverity = state<number>(1);\n\tg.add(\"__w_confidence\", wConfidence as Node<unknown>);\n\tg.add(\"__w_severity\", wSeverity as Node<unknown>);\n\n\tconst priority = scorer([confidenceSignal, severitySignal], [wConfidence, wSeverity]);\n\tg.add(\"priority\", priority as Node<unknown>);\n\n\t// --- Output ---\n\tconst output = derived<unknown>(\n\t\t[classifyNode as Node, priority as Node],\n\t\t(vals) => ({\n\t\t\tclassification: vals[0],\n\t\t\tpriority: vals[1],\n\t\t}),\n\t\t{ meta: baseMeta(\"content_moderation\", { stage: \"output\" }) },\n\t);\n\tg.add(\"output\", output);\n\tg.connect(\"classify\", \"output\");\n\tg.connect(\"priority\", \"output\");\n\n\t// --- Feedback (false positive → policy refinement) ---\n\t// Feedback condition: human marks a review item as false positive.\n\t// When review_queue changes and policy exists, signal for update.\n\tconst fbCondition = derived<unknown>(\n\t\t[reviewLog.entries as Node, policy as Node],\n\t\t(vals) => {\n\t\t\tconst snap = vals[0] as ReactiveLogSnapshot<ModerationResult> | null;\n\t\t\tconst entries = snap?.value?.entries;\n\t\t\tif (entries && entries.length > 0) {\n\t\t\t\tconst latest = entries[entries.length - 1];\n\t\t\t\t// Items explicitly marked as false positive feed back\n\t\t\t\tif (latest && (latest as unknown as Record<string, unknown>).falsePositive) {\n\t\t\t\t\treturn latest;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\t{\n\t\t\tmeta: baseMeta(\"content_moderation\", { stage: \"feedback_condition\" }),\n\t\t},\n\t);\n\tg.add(\"feedback_condition\", fbCondition as Node<unknown>);\n\tfeedback(g, \"feedback_condition\", \"policy\", {\n\t\tmaxIterations: opts.maxFeedbackIterations ?? 5,\n\t});\n\n\treturn g;\n}\n\n// ---------------------------------------------------------------------------\n// 4. dataQualityGraph\n// ---------------------------------------------------------------------------\n\n/** Schema validation result. */\nexport type ValidationResult = {\n\tvalid: boolean;\n\terrors: string[];\n\trecord: unknown;\n};\n\n/** Anomaly detection result. */\nexport type AnomalyResult = {\n\tanomaly: boolean;\n\tscore: number;\n\tdetail?: string;\n\trecord: unknown;\n};\n\n/** Options for {@link dataQualityGraph}. */\nexport type DataQualityGraphOptions = GraphOptions & {\n\t/** Data source (e.g. fromPrisma(...), fromKysely(...)). */\n\tsource: Node<unknown>;\n\n\t/**\n\t * Schema validation function.\n\t * Default: always valid.\n\t */\n\tvalidate?: (record: unknown) => ValidationResult;\n\n\t/**\n\t * Anomaly detection function.\n\t * Default: no anomaly.\n\t */\n\tdetectAnomaly?: (record: unknown) => AnomalyResult;\n\n\t/**\n\t * Drift detection: compares current record against baseline.\n\t * Default: no drift.\n\t */\n\tdetectDrift?: (record: unknown, baseline: unknown) => unknown;\n\n\t/**\n\t * Remediation suggestion function.\n\t * Default: no suggestion.\n\t */\n\tsuggest?: (result: { validation: ValidationResult; anomaly: AnomalyResult }) => unknown;\n\n\t/** Max feedback iterations for rule refinement. Default: 3. */\n\tmaxFeedbackIterations?: number;\n};\n\n/**\n * Data ingest → schema validation → anomaly detection → drift alerting →\n * auto-remediation suggestions → output.\n *\n * Well-known node names:\n * - `\"source\"` — data ingest\n * - `\"validate\"` — schema validation\n * - `\"anomaly\"` — anomaly detection\n * - `\"baseline\"` — rolling baseline state\n * - `\"drift\"` — drift detection\n * - `\"remediate\"` — auto-remediation suggestions\n * - `\"output\"` — combined quality report\n *\n * @category patterns\n */\nexport function dataQualityGraph(name: string, opts: DataQualityGraphOptions): Graph {\n\tconst g = new Graph(name, opts);\n\n\t// --- Source ---\n\tg.add(\"source\", opts.source);\n\n\t// --- Schema validation ---\n\tconst validateFn =\n\t\topts.validate ??\n\t\t((record: unknown): ValidationResult => ({\n\t\t\tvalid: true,\n\t\t\terrors: [],\n\t\t\trecord,\n\t\t}));\n\tconst validateNode = derived<ValidationResult | undefined>(\n\t\t[opts.source],\n\t\t(vals) => (vals[0] != null ? validateFn(vals[0]) : undefined),\n\t\t{ meta: baseMeta(\"data_quality\", { stage: \"validate\" }) },\n\t);\n\tg.add(\"validate\", validateNode as Node<unknown>);\n\tg.connect(\"source\", \"validate\");\n\n\t// --- Anomaly detection ---\n\tconst detectAnomalyFn =\n\t\topts.detectAnomaly ??\n\t\t((record: unknown): AnomalyResult => ({\n\t\t\tanomaly: false,\n\t\t\tscore: 0,\n\t\t\trecord,\n\t\t}));\n\tconst anomalyNode = derived<AnomalyResult | undefined>(\n\t\t[opts.source],\n\t\t(vals) => (vals[0] != null ? detectAnomalyFn(vals[0]) : undefined),\n\t\t{ meta: baseMeta(\"data_quality\", { stage: \"anomaly\" }) },\n\t);\n\tg.add(\"anomaly\", anomalyNode as Node<unknown>);\n\tg.connect(\"source\", \"anomaly\");\n\n\t// --- Baseline (rolling state) ---\n\tconst baseline = state<unknown>(null, {\n\t\tmeta: baseMeta(\"data_quality\", {\n\t\t\tstage: \"baseline\",\n\t\t\tdescription: \"Rolling baseline for drift detection\",\n\t\t}),\n\t});\n\tg.add(\"baseline\", baseline);\n\n\t// Update baseline on valid records\n\tconst baselineUpdater = effect([validateNode as Node], (vals) => {\n\t\tconst result = vals[0] as ValidationResult;\n\t\tif (result?.valid) {\n\t\t\tbatch(() => {\n\t\t\t\tbaseline.down([[DATA, result.record]]);\n\t\t\t});\n\t\t}\n\t});\n\tg.add(\"__baseline_updater\", baselineUpdater as Node<unknown>);\n\tg.connect(\"validate\", \"__baseline_updater\");\n\tkeepalive(baselineUpdater as Node<unknown>);\n\n\t// --- Drift detection ---\n\tconst detectDriftFn = opts.detectDrift ?? (() => ({ drift: false }));\n\tconst driftNode = derived<unknown>(\n\t\t[opts.source, baseline],\n\t\t(vals) => detectDriftFn(vals[0], vals[1]),\n\t\t{ meta: baseMeta(\"data_quality\", { stage: \"drift\" }) },\n\t);\n\tg.add(\"drift\", driftNode);\n\tg.connect(\"source\", \"drift\");\n\tg.connect(\"baseline\", \"drift\");\n\n\t// --- Remediation suggestions ---\n\tconst suggestFn = opts.suggest ?? (() => null);\n\tconst remediateNode = derived<unknown>(\n\t\t[validateNode as Node, anomalyNode as Node],\n\t\t(vals) =>\n\t\t\tsuggestFn({\n\t\t\t\tvalidation: vals[0] as ValidationResult,\n\t\t\t\tanomaly: vals[1] as AnomalyResult,\n\t\t\t}),\n\t\t{ meta: baseMeta(\"data_quality\", { stage: \"remediate\" }) },\n\t);\n\tg.add(\"remediate\", remediateNode);\n\tg.connect(\"validate\", \"remediate\");\n\tg.connect(\"anomaly\", \"remediate\");\n\n\t// --- Output ---\n\tconst output = derived<unknown>(\n\t\t[validateNode as Node, anomalyNode as Node, driftNode, remediateNode],\n\t\t(vals) => ({\n\t\t\tvalidation: vals[0],\n\t\t\tanomaly: vals[1],\n\t\t\tdrift: vals[2],\n\t\t\tremediation: vals[3],\n\t\t}),\n\t\t{ meta: baseMeta(\"data_quality\", { stage: \"output\" }) },\n\t);\n\tg.add(\"output\", output);\n\tg.connect(\"validate\", \"output\");\n\tg.connect(\"anomaly\", \"output\");\n\tg.connect(\"drift\", \"output\");\n\tg.connect(\"remediate\", \"output\");\n\n\t// --- Feedback (anomaly → validation rule refinement) ---\n\tconst validationRules = state<unknown[]>([], {\n\t\tmeta: baseMeta(\"data_quality\", { stage: \"validation_rules\" }),\n\t});\n\tg.add(\"validation_rules\", validationRules as Node<unknown>);\n\n\tconst fbCondition = derived<unknown>(\n\t\t[anomalyNode as Node],\n\t\t(vals) => {\n\t\t\tconst a = vals[0] as AnomalyResult | null;\n\t\t\tif (a?.anomaly) return a;\n\t\t\treturn null;\n\t\t},\n\t\t{\n\t\t\tmeta: baseMeta(\"data_quality\", { stage: \"feedback_condition\" }),\n\t\t},\n\t);\n\tg.add(\"feedback_condition\", fbCondition as Node<unknown>);\n\tg.connect(\"anomaly\", \"feedback_condition\");\n\tfeedback(g, \"feedback_condition\", \"validation_rules\", {\n\t\tmaxIterations: opts.maxFeedbackIterations ?? 3,\n\t});\n\n\treturn g;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Check if a value has a `type` or `kind` tag matching the given label. */\nfunction isTagged(value: unknown, tag: string): boolean {\n\tif (value == null || typeof value !== \"object\") return false;\n\tconst v = value as Record<string, unknown>;\n\treturn v.type === tag || v.kind === tag;\n}\n","/**\n * Reduction primitives (roadmap §8.1).\n *\n * Composable building blocks for taking heterogeneous massive inputs and producing\n * prioritized, auditable, human-actionable output. Each primitive is either a Graph\n * factory or a Node factory, built on top of core + extra primitives.\n *\n * @module\n */\n\nimport { batch } from \"../core/batch.js\";\nimport { bridge, DEFAULT_DOWN } from \"../core/bridge.js\";\nimport {\n\tCOMPLETE,\n\tDATA,\n\tDIRTY,\n\tERROR,\n\ttype Message,\n\tPAUSE,\n\tRESOLVED,\n\tRESUME,\n\tTEARDOWN,\n} from \"../core/messages.js\";\nimport { type Node, type NodeActions, type NodeOptions, node } from \"../core/node.js\";\nimport { derived, state } from \"../core/sugar.js\";\nimport { merge } from \"../extra/operators.js\";\nimport { Graph, type GraphOptions } from \"../graph/graph.js\";\n\n// ---------------------------------------------------------------------------\n// Shared helpers (same pattern as orchestration.ts)\n// ---------------------------------------------------------------------------\n\nexport type StepRef = string | Node<unknown>;\n\nfunction baseMeta(kind: string, meta?: Record<string, unknown>): Record<string, unknown> {\n\treturn {\n\t\treduction: true,\n\t\treduction_type: kind,\n\t\t...(meta ?? {}),\n\t};\n}\n\n/** Force-activate a lazy node so it receives messages immediately. */\nfunction keepalive(n: Node<unknown>): () => void {\n\treturn n.subscribe(() => {});\n}\n\n// ---------------------------------------------------------------------------\n// stratify\n// ---------------------------------------------------------------------------\n\n/** A single routing rule for {@link stratify}. */\nexport type StratifyRule<T> = {\n\t/** Branch name (used as node name under `branch/<name>`). */\n\tname: string;\n\t/** Classifier: returns `true` if the value belongs to this branch. */\n\tclassify: (value: T) => boolean;\n\t/** Optional operator chain applied to the branch after classification. */\n\tops?: (n: Node<T>) => Node;\n};\n\n/** Options for {@link stratify}. */\nexport type StratifyOptions = GraphOptions & {\n\tmeta?: Record<string, unknown>;\n};\n\n/**\n * Route input to different reduction branches based on classifier functions.\n *\n * Each branch gets an independent operator chain. Rules are reactive — update\n * the `\"rules\"` state node to rewrite classification at runtime. Rule updates\n * affect **future items only** (streaming classification, not retroactive).\n *\n * Branch nodes are structural — created at construction time and persist for\n * the graph's lifetime. If a rule name is removed from the rules array, the\n * corresponding branch silently drops items (classifier not found). To tear\n * down a dead branch, call `graph.remove(\"branch/<name>\")`.\n *\n * @param name - Graph name.\n * @param source - Input node (registered externally or will be added as `\"source\"`).\n * @param rules - Initial routing rules.\n * @param opts - Optional graph/meta options.\n * @returns Graph with `\"source\"`, `\"rules\"`, and `\"branch/<name>\"` nodes.\n *\n * @category patterns\n */\nexport function stratify<T>(\n\tname: string,\n\tsource: Node<T>,\n\trules: ReadonlyArray<StratifyRule<T>>,\n\topts?: StratifyOptions,\n): Graph {\n\tconst g = new Graph(name, opts);\n\n\tg.add(\"source\", source as Node<unknown>);\n\tconst rulesNode = state<ReadonlyArray<StratifyRule<T>>>(rules, {\n\t\tmeta: baseMeta(\"stratify_rules\"),\n\t});\n\tg.add(\"rules\", rulesNode as Node<unknown>);\n\n\tfor (const rule of rules) {\n\t\t_addBranch(g, source, rulesNode, rule);\n\t}\n\n\treturn g;\n}\n\nfunction _addBranch<T>(\n\tgraph: Graph,\n\tsource: Node<T>,\n\trulesNode: Node<ReadonlyArray<StratifyRule<T>>>,\n\trule: StratifyRule<T>,\n): void {\n\tconst branchName = `branch/${rule.name}`;\n\n\t// Two-dep gating: intercepts messages from BOTH source (dep 0) and rules\n\t// (dep 1). Classification is deferred until all dirty deps have settled,\n\t// eliminating the stale-rules race when both are updated in the same batch().\n\t//\n\t// Protocol: DIRTY is buffered until DATA arrives. If the classifier matches,\n\t// emit [DIRTY, DATA]. If not, emit [DIRTY, RESOLVED] so downstream exits\n\t// dirty status cleanly (spec §1.3.1). Source RESOLVED forwards as RESOLVED.\n\t// Rules-only changes produce no downstream emission (\"future items only\").\n\tconst _noValue: unique symbol = Symbol(\"noValue\");\n\tlet sourceDirty = false;\n\tlet rulesDirty = false;\n\tlet sourcePhase2 = false; // source delivered DATA or RESOLVED this cycle\n\tlet sourceValue: T | typeof _noValue = _noValue; // DATA payload, or _noValue for RESOLVED\n\tlet pendingDirty = false; // owe downstream a DIRTY\n\n\tfunction resolve(actions: NodeActions): void {\n\t\tif (sourcePhase2) {\n\t\t\tsourcePhase2 = false;\n\t\t\tconst value = sourceValue;\n\t\t\tsourceValue = _noValue;\n\t\t\tif (value !== _noValue) {\n\t\t\t\t// Source emitted DATA — classify with settled rules\n\t\t\t\tconst currentRules = rulesNode.get() as ReadonlyArray<StratifyRule<T>>;\n\t\t\t\tconst currentRule = currentRules.find((r) => r.name === rule.name);\n\t\t\t\tlet matches = false;\n\t\t\t\ttry {\n\t\t\t\t\tmatches = currentRule?.classify(value) ?? false;\n\t\t\t\t} catch {\n\t\t\t\t\tmatches = false;\n\t\t\t\t}\n\t\t\t\tif (matches) {\n\t\t\t\t\tpendingDirty = false;\n\t\t\t\t\tactions.emit(value);\n\t\t\t\t} else {\n\t\t\t\t\tif (pendingDirty) {\n\t\t\t\t\t\tpendingDirty = false;\n\t\t\t\t\t\tactions.down([[DIRTY], [RESOLVED]]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Source RESOLVED (unchanged)\n\t\t\t\tif (pendingDirty) {\n\t\t\t\t\tpendingDirty = false;\n\t\t\t\t\tactions.down([[DIRTY], [RESOLVED]]);\n\t\t\t\t} else {\n\t\t\t\t\tactions.down([[RESOLVED]]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// else: rules-only change — no reclassification (\"future items only\")\n\t}\n\n\tconst filterNode = node<T>([source as Node, rulesNode as Node], () => undefined, {\n\t\tdescribeKind: \"operator\",\n\t\tmeta: baseMeta(\"stratify_branch\", { branch: rule.name }),\n\t\tonMessage(msg: Message, depIndex: number, actions: NodeActions): boolean {\n\t\t\tconst t = msg[0];\n\n\t\t\t// --- DIRTY (phase 1) ---\n\t\t\tif (t === DIRTY) {\n\t\t\t\tif (depIndex === 0) {\n\t\t\t\t\tsourceDirty = true;\n\t\t\t\t\tpendingDirty = true;\n\t\t\t\t} else {\n\t\t\t\t\trulesDirty = true;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// --- Phase 2 (DATA / RESOLVED) ---\n\t\t\tif (t === DATA || t === RESOLVED) {\n\t\t\t\tif (depIndex === 0) {\n\t\t\t\t\tsourceDirty = false;\n\t\t\t\t\tsourcePhase2 = true;\n\t\t\t\t\tsourceValue = t === DATA ? (msg[1] as T) : _noValue;\n\t\t\t\t} else {\n\t\t\t\t\trulesDirty = false;\n\t\t\t\t}\n\n\t\t\t\t// Wait for all dirty deps to settle\n\t\t\t\tif (sourceDirty || rulesDirty) return true;\n\n\t\t\t\tresolve(actions);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// --- Terminal ---\n\t\t\tif (t === COMPLETE || t === ERROR || t === TEARDOWN) {\n\t\t\t\tsourceDirty = false;\n\t\t\t\trulesDirty = false;\n\t\t\t\tsourcePhase2 = false;\n\t\t\t\tsourceValue = _noValue;\n\t\t\t\tpendingDirty = false;\n\t\t\t\tif (depIndex === 0) {\n\t\t\t\t\tactions.down([msg]);\n\t\t\t\t}\n\t\t\t\t// Rules terminal: swallow (branch stays alive)\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Swallow PAUSE/RESUME/INVALIDATE from rules dep (internal impl detail)\n\t\t\tif (depIndex === 1) return true;\n\n\t\t\treturn false;\n\t\t},\n\t\tcompleteWhenDepsComplete: false,\n\t});\n\n\tgraph.add(branchName, filterNode as Node<unknown>);\n\tgraph.connect(\"source\", branchName);\n\n\t// If the rule has an ops chain, apply it and connect the edge\n\tif (rule.ops) {\n\t\tconst transformed = rule.ops(filterNode);\n\t\tconst transformedName = `branch/${rule.name}/out`;\n\t\tgraph.add(transformedName, transformed as Node<unknown>);\n\t\tgraph.connect(branchName, transformedName);\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// funnel\n// ---------------------------------------------------------------------------\n\n/** A named stage for {@link funnel}. */\nexport type FunnelStage = {\n\t/** Stage name (mounted as subgraph). */\n\tname: string;\n\t/** Builder: receives a sub-graph, should add an `\"input\"` and `\"output\"` node. */\n\tbuild: (sub: Graph) => void;\n};\n\n/** Options for {@link funnel}. */\nexport type FunnelOptions = GraphOptions & {\n\tmeta?: Record<string, unknown>;\n};\n\n/**\n * Multi-source merge with sequential reduction stages.\n *\n * Sources are merged into a single stream. Each stage is a named subgraph\n * (mounted via `graph.mount()`). Stages connect linearly:\n * `merged → stage[0].input → stage[0].output → stage[1].input → ...`\n *\n * @param name - Graph name.\n * @param sources - Input nodes to merge.\n * @param stages - Sequential reduction stages.\n * @param opts - Optional graph/meta options.\n * @returns Graph with `\"merged\"` and mounted stage subgraphs.\n *\n * @category patterns\n */\nexport function funnel<T>(\n\tname: string,\n\tsources: ReadonlyArray<Node<T>>,\n\tstages: ReadonlyArray<FunnelStage>,\n\topts?: FunnelOptions,\n): Graph {\n\tif (sources.length === 0) throw new RangeError(\"funnel requires at least one source\");\n\tif (stages.length === 0) throw new RangeError(\"funnel requires at least one stage\");\n\n\tconst g = new Graph(name, opts);\n\n\t// Merge all sources\n\tconst merged = sources.length === 1 ? sources[0] : merge(...(sources as unknown as Node<T>[]));\n\tg.add(\"merged\", merged as Node<unknown>);\n\n\t// Build and mount each stage linearly.\n\t// Stage inputs are standalone state nodes, so we bridge via subscribe\n\t// (connect() requires constructor deps). Bridge effects forward DATA\n\t// from the previous output to the next stage's input.\n\tlet prevOutputPath = \"merged\";\n\tfor (let i = 0; i < stages.length; i++) {\n\t\tconst stage = stages[i];\n\t\tconst sub = new Graph(stage.name);\n\t\tstage.build(sub);\n\n\t\t// Validate that the stage has input and output nodes\n\t\ttry {\n\t\t\tsub.resolve(\"input\");\n\t\t} catch {\n\t\t\tthrow new Error(`funnel stage \"${stage.name}\" must define an \"input\" node`);\n\t\t}\n\t\ttry {\n\t\t\tsub.resolve(\"output\");\n\t\t} catch {\n\t\t\tthrow new Error(`funnel stage \"${stage.name}\" must define an \"output\" node`);\n\t\t}\n\n\t\tg.mount(stage.name, sub);\n\n\t\t// Graph-visible bridge: forwards all standard types except TEARDOWN\n\t\t// from the previous output to the next stage's input. TEARDOWN excluded\n\t\t// because stage lifecycle is managed by the parent graph, not the\n\t\t// upstream stage. Participates in two-phase push and shows up in describe().\n\t\tconst prevNode = g.resolve(prevOutputPath);\n\t\tconst stageInputPath = `${stage.name}::input`;\n\t\tconst stageInput = g.resolve(stageInputPath);\n\t\tconst bridgeName = `__bridge_${prevOutputPath}→${stage.name}_input`;\n\t\tconst br = bridge(prevNode, stageInput, {\n\t\t\tname: bridgeName,\n\t\t\tdown: DEFAULT_DOWN.filter((t) => t !== TEARDOWN),\n\t\t});\n\t\tg.add(bridgeName, br as Node<unknown>);\n\t\tg.connect(prevOutputPath, bridgeName);\n\t\tkeepalive(br);\n\n\t\tprevOutputPath = `${stage.name}::output`;\n\t}\n\n\treturn g;\n}\n\n// ---------------------------------------------------------------------------\n// feedback\n// ---------------------------------------------------------------------------\n\n/** Options for {@link feedback}. */\nexport type FeedbackOptions = {\n\t/** Maximum feedback iterations before stopping (default: 10). */\n\tmaxIterations?: number;\n\t/** Optional budget gate node path for cost-bounded iteration. */\n\tbudgetNode?: StepRef;\n\tmeta?: Record<string, unknown>;\n};\n\n/**\n * Introduce a bounded reactive cycle into an existing graph.\n *\n * When `condition` emits a non-null DATA value, the feedback effect routes it\n * back to the `reentry` state node — creating a cycle. Bounded by\n * `maxIterations` (default 10). The counter node (`__feedback_<condition>`)\n * is the source of truth — reset it to 0 to allow more iterations.\n *\n * To remove the feedback cycle, call `graph.remove(\"__feedback_<condition>\")`.\n *\n * @param graph - Existing graph to augment with a feedback cycle.\n * @param condition - Path to a node whose DATA triggers feedback.\n * @param reentry - Path to a state node that receives the feedback value.\n * @param opts - Iteration bounds and metadata.\n * @returns The same graph (mutated with feedback nodes added).\n *\n * @category patterns\n */\nexport function feedback(\n\tgraph: Graph,\n\tcondition: string,\n\treentry: string,\n\topts?: FeedbackOptions,\n): Graph {\n\tconst maxIter = opts?.maxIterations ?? 10;\n\n\t// Internal counter node — source of truth for iteration bound.\n\t// Reset to 0 to allow more iterations.\n\tconst counterName = `__feedback_${condition}`;\n\tconst counter = state<number>(0, {\n\t\tmeta: baseMeta(\"feedback_counter\", {\n\t\t\tmaxIterations: maxIter,\n\t\t\tfeedbackFrom: condition,\n\t\t\tfeedbackTo: reentry,\n\t\t}),\n\t});\n\tgraph.add(counterName, counter as Node<unknown>);\n\n\t// Resolve the condition and reentry nodes\n\tconst condNode = graph.resolve(condition);\n\tconst reentryNode = graph.resolve(reentry);\n\n\t// Graph-visible feedback effect: intercepts condition DATA, routes back to\n\t// reentry with iteration counting. Registered in the graph so it shows up\n\t// in describe() and cleans up on graph.destroy().\n\tconst feedbackEffectName = `__feedback_effect_${condition}`;\n\tconst feedbackEffect = node([condNode], undefined, {\n\t\tname: feedbackEffectName,\n\t\tdescribeKind: \"effect\",\n\t\tmeta: {\n\t\t\t...baseMeta(\"feedback_effect\", {\n\t\t\t\tfeedbackFrom: condition,\n\t\t\t\tfeedbackTo: reentry,\n\t\t\t}),\n\t\t\t_internal: true,\n\t\t},\n\t\tonMessage(msg: Message, _depIndex: number, _actions: NodeActions): boolean {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === DATA) {\n\t\t\t\tconst currentCount = counter.get() as number;\n\t\t\t\tif (currentCount >= maxIter) return true;\n\t\t\t\tconst condValue = msg[1];\n\t\t\t\tif (condValue == null) return true;\n\t\t\t\t// Batch counter + reentry so both arrive atomically — no\n\t\t\t\t// downstream listener sees the counter incremented while reentry\n\t\t\t\t// still holds the old value (or vice versa).\n\t\t\t\tbatch(() => {\n\t\t\t\t\tcounter.down([[DATA, currentCount + 1]]);\n\t\t\t\t\treentryNode.down([[DATA, condValue]]);\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE || t === ERROR) {\n\t\t\t\t// Terminal on condition — finalize the feedback cycle.\n\t\t\t\t// Forward terminal to counter so observers know the cycle is done.\n\t\t\t\tconst terminal: Message = t === ERROR && msg.length > 1 ? [ERROR, msg[1]] : [t];\n\t\t\t\tcounter.down([terminal]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\tgraph.add(feedbackEffectName, feedbackEffect as Node<unknown>);\n\tgraph.connect(condition, feedbackEffectName);\n\tkeepalive(feedbackEffect);\n\n\treturn graph;\n}\n\n// ---------------------------------------------------------------------------\n// budgetGate\n// ---------------------------------------------------------------------------\n\n/** A reactive constraint for {@link budgetGate}. */\nexport type BudgetConstraint<T = unknown> = {\n\t/** Constraint node whose value is checked. */\n\tnode: Node<T>;\n\t/** Returns `true` when the constraint is satisfied (budget available). */\n\tcheck: (value: T) => boolean;\n};\n\n/** Options for {@link budgetGate}. */\nexport type BudgetGateOptions = Omit<NodeOptions, \"describeKind\" | \"name\" | \"meta\"> & {\n\tmeta?: Record<string, unknown>;\n};\n\n/**\n * Pass-through that respects reactive constraint nodes.\n *\n * DATA flows through when all constraints are satisfied. When any constraint\n * is exceeded, PAUSE is sent upstream and DATA is buffered. When constraints\n * relax, RESUME is sent and buffered DATA flushes.\n *\n * @param source - Input node.\n * @param constraints - Reactive constraint checks.\n * @param opts - Optional node options.\n * @returns Gated node.\n *\n * @category patterns\n */\nexport function budgetGate<T>(\n\tsource: Node<T>,\n\tconstraints: ReadonlyArray<BudgetConstraint>,\n\topts?: BudgetGateOptions,\n): Node<T> {\n\tif (constraints.length === 0) throw new RangeError(\"budgetGate requires at least one constraint\");\n\n\tconst constraintNodes = constraints.map((c) => c.node);\n\tconst allDeps = [source as Node, ...constraintNodes] as Node[];\n\n\tlet buffer: T[] = [];\n\tlet paused = false;\n\tlet pendingResolved = false;\n\tconst lockId = Symbol(\"budget-gate\");\n\n\tfunction checkBudget(): boolean {\n\t\treturn constraints.every((c) => c.check(c.node.get()));\n\t}\n\n\tfunction flushBuffer(actions: NodeActions): void {\n\t\twhile (buffer.length > 0 && checkBudget()) {\n\t\t\tconst item = buffer[0]!;\n\t\t\tbuffer = buffer.slice(1);\n\t\t\tactions.emit(item);\n\t\t}\n\t\t// Drain deferred RESOLVED once buffer is empty\n\t\tif (buffer.length === 0 && pendingResolved) {\n\t\t\tpendingResolved = false;\n\t\t\tactions.down([[RESOLVED]]);\n\t\t}\n\t}\n\n\treturn node<T>(allDeps, () => undefined, {\n\t\t...opts,\n\t\tdescribeKind: \"operator\",\n\t\tmeta: baseMeta(\"budget_gate\", opts?.meta),\n\t\tonMessage(msg: Message, depIndex: number, actions: NodeActions): boolean {\n\t\t\tconst t = msg[0];\n\n\t\t\t// Source messages (dep 0)\n\t\t\tif (depIndex === 0) {\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tif (checkBudget() && buffer.length === 0) {\n\t\t\t\t\t\tactions.emit(msg[1] as T);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbuffer.push(msg[1] as T);\n\t\t\t\t\t\tif (!paused) {\n\t\t\t\t\t\t\tpaused = true;\n\t\t\t\t\t\t\tactions.up([[PAUSE, lockId]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\tactions.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\tif (buffer.length === 0) {\n\t\t\t\t\t\tactions.down([[RESOLVED]]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Buffer non-empty: defer RESOLVED until buffer drains\n\t\t\t\t\t\tpendingResolved = true;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE || t === ERROR) {\n\t\t\t\t\t// Force-flush all buffered items regardless of budget (terminal = done)\n\t\t\t\t\tfor (const item of buffer) {\n\t\t\t\t\t\tactions.emit(item);\n\t\t\t\t\t}\n\t\t\t\t\tbuffer = [];\n\t\t\t\t\tpendingResolved = false;\n\t\t\t\t\t// Release PAUSE lock before forwarding terminal\n\t\t\t\t\tif (paused) {\n\t\t\t\t\t\tpaused = false;\n\t\t\t\t\t\tactions.up([[RESUME, lockId]]);\n\t\t\t\t\t}\n\t\t\t\t\tactions.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Constraint node messages (dep 1+): re-check budget\n\t\t\tif (t === DATA || t === RESOLVED) {\n\t\t\t\tif (checkBudget() && buffer.length > 0) {\n\t\t\t\t\tflushBuffer(actions);\n\t\t\t\t\tif (buffer.length === 0 && paused) {\n\t\t\t\t\t\tpaused = false;\n\t\t\t\t\t\tactions.up([[RESUME, lockId]]);\n\t\t\t\t\t}\n\t\t\t\t} else if (!checkBudget() && !paused && buffer.length > 0) {\n\t\t\t\t\tpaused = true;\n\t\t\t\t\tactions.up([[PAUSE, lockId]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DIRTY) {\n\t\t\t\t// Don't propagate constraint DIRTY downstream\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\t// Constraint error → forward downstream\n\t\t\t\tactions.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\t// Constraint completed — locked at last value, no-op\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t// Unknown constraint types → default forwarding\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n// ---------------------------------------------------------------------------\n// scorer\n// ---------------------------------------------------------------------------\n\n/** A scored item with full breakdown. */\nexport type ScoredItem<T = unknown> = {\n\t/** Original value. */\n\tvalue: T;\n\t/** Final weighted score. */\n\tscore: number;\n\t/** Per-signal breakdown: signal index → weighted contribution. */\n\tbreakdown: number[];\n};\n\n/** Options for {@link scorer}. */\nexport type ScorerOptions = Omit<NodeOptions, \"describeKind\" | \"name\" | \"meta\"> & {\n\tmeta?: Record<string, unknown>;\n\t/** Custom scoring function per signal. Default: identity (signal value IS the score). */\n\tscoreFns?: ReadonlyArray<(value: unknown) => number>;\n};\n\n/**\n * Reactive multi-signal scoring with live weights.\n *\n * Each source emits items to score. Weights are reactive state nodes that\n * LLM or human can adjust live. Output is sorted scored items with full\n * breakdown.\n *\n * @param sources - Signal nodes (each emits a numeric score dimension).\n * @param weights - Reactive weight nodes (one per source).\n * @param opts - Optional node/meta options.\n * @returns Node emitting scored output.\n *\n * @category patterns\n */\nexport function scorer(\n\tsources: ReadonlyArray<Node<number>>,\n\tweights: ReadonlyArray<Node<number>>,\n\topts?: ScorerOptions,\n): Node<ScoredItem<number[]>> {\n\tif (sources.length === 0) throw new RangeError(\"scorer requires at least one source\");\n\tif (sources.length !== weights.length) {\n\t\tthrow new RangeError(\"scorer requires the same number of sources and weights\");\n\t}\n\n\tconst allDeps = [...(sources as unknown as Node[]), ...(weights as unknown as Node[])];\n\tconst n = sources.length;\n\tconst scoreFns = opts?.scoreFns;\n\n\treturn derived<ScoredItem<number[]>>(\n\t\tallDeps,\n\t\t(vals) => {\n\t\t\tconst signals = vals.slice(0, n) as number[];\n\t\t\tconst weightValues = vals.slice(n) as number[];\n\n\t\t\tconst breakdown: number[] = [];\n\t\t\tlet totalScore = 0;\n\n\t\t\tfor (let i = 0; i < n; i++) {\n\t\t\t\tconst sig = signals[i] ?? 0;\n\t\t\t\tconst wt = weightValues[i] ?? 0;\n\t\t\t\tconst rawScore = scoreFns?.[i] ? scoreFns[i](sig) : sig;\n\t\t\t\tconst weighted = (rawScore as number) * wt;\n\t\t\t\tbreakdown.push(weighted);\n\t\t\t\ttotalScore += weighted;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tvalue: signals,\n\t\t\t\tscore: totalScore,\n\t\t\t\tbreakdown,\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\t...opts,\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"scorer\", opts?.meta),\n\t\t},\n\t);\n}\n","/**\n * LLM graph composition (roadmap §8.3).\n *\n * Declarative GraphSpec schema + compiler/decompiler for graph topology.\n * The LLM designs graphs as JSON; compileSpec instantiates them; decompileGraph\n * extracts them back. Templates support reusable subgraph patterns. Feedback\n * edges express bounded cycles via §8.1 feedback().\n *\n * @module\n */\n\nimport { DATA } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { derived, effect, producer, state } from \"../core/sugar.js\";\nimport { GRAPH_META_SEGMENT, Graph } from \"../graph/graph.js\";\nimport type { ChatMessage, LLMAdapter, LLMResponse } from \"./ai.js\";\nimport { feedback as feedbackPrimitive } from \"./reduction.js\";\n\n// ---------------------------------------------------------------------------\n// GraphSpec types\n// ---------------------------------------------------------------------------\n\n/** A single node declaration in a GraphSpec. */\nexport type GraphSpecNode = {\n\t/** Node kind: state, producer, derived, effect, operator. */\n\ttype: \"state\" | \"producer\" | \"derived\" | \"effect\" | \"operator\";\n\t/** Dependency node names (for derived/effect/operator). */\n\tdeps?: string[];\n\t/** Named function from the catalog (for derived/effect/operator/producer). */\n\tfn?: string;\n\t/** Named source from the catalog (for producer). */\n\tsource?: string;\n\t/** Freeform config passed to the catalog fn/source factory. */\n\tconfig?: Record<string, unknown>;\n\t/** Initial value (for state nodes). */\n\tinitial?: unknown;\n\t/** Human/LLM-readable metadata. */\n\tmeta?: Record<string, unknown>;\n};\n\n/** Template instantiation node — expanded at compile time. */\nexport type GraphSpecTemplateRef = {\n\ttype: \"template\";\n\t/** Name of the template to instantiate. */\n\ttemplate: string;\n\t/** Parameter bindings: template param name → node name. */\n\tbind: Record<string, string>;\n};\n\n/** A reusable subgraph pattern with parameter substitution. */\nexport type GraphSpecTemplate = {\n\t/** Parameter names (prefixed with $ in node refs). */\n\tparams: string[];\n\t/** Node declarations within the template. */\n\tnodes: Record<string, GraphSpecNode>;\n\t/** Which node's output is the template's output. */\n\toutput: string;\n};\n\n/** A feedback edge: bounded cycle from condition to reentry. */\nexport type GraphSpecFeedbackEdge = {\n\t/** Node whose DATA triggers the feedback. */\n\tfrom: string;\n\t/** State node that receives the feedback value. */\n\tto: string;\n\t/** Max iterations before stopping (default: 10). */\n\tmaxIterations?: number;\n};\n\n/** Declarative graph topology for LLM composition (§8.3). */\nexport type GraphSpec = {\n\t/** Graph name. */\n\tname: string;\n\t/** Node declarations (keyed by node name). */\n\tnodes: Record<string, GraphSpecNode | GraphSpecTemplateRef>;\n\t/** Reusable subgraph templates. */\n\ttemplates?: Record<string, GraphSpecTemplate>;\n\t/** Feedback edges (bounded cycles). */\n\tfeedback?: GraphSpecFeedbackEdge[];\n};\n\n// ---------------------------------------------------------------------------\n// Catalog types\n// ---------------------------------------------------------------------------\n\n/**\n * Factory for creating a derived/effect/operator node from catalog.\n * Receives resolved dep nodes and the config from the spec.\n */\nexport type FnFactory = (deps: Node<unknown>[], config: Record<string, unknown>) => Node<unknown>;\n\n/**\n * Factory for creating a producer node from catalog.\n * Receives the config from the spec.\n */\nexport type SourceFactory = (config: Record<string, unknown>) => Node<unknown>;\n\n// ---------------------------------------------------------------------------\n// Rich catalog entries (§9.1b — auto-prompt, catalog-aware validation)\n// ---------------------------------------------------------------------------\n\n/** Simple config field descriptor for LLM prompt generation and validation. */\nexport type ConfigFieldSchema = {\n\t/** Human-readable type: \"string\", \"number\", \"boolean\", \"string[]\", etc. */\n\ttype: string;\n\t/** Whether this field is required (default: true). */\n\trequired?: boolean;\n\t/** Allowed values (enum constraint). */\n\tenum?: readonly (string | number | boolean)[];\n\t/** Human-readable description for LLM context. */\n\tdescription?: string;\n\t/** Default value if omitted. */\n\tdefault?: unknown;\n};\n\n/**\n * Rich catalog entry: bundles a runtime factory with LLM-facing metadata.\n *\n * The metadata is used to:\n * 1. Auto-generate prompt text for {@link llmCompose} (replaces manual `catalogDescription`)\n * 2. Validate LLM output in {@link validateSpec} (catch wrong fn names, invalid config)\n * 3. Provide actionable error messages for {@link llmRefine} feedback loops\n *\n * Developers register ONE object; the library handles prompt generation and validation.\n */\nexport type CatalogFnEntry = {\n\t/** Runtime factory. */\n\tfactory: FnFactory;\n\t/** One-line description for LLM prompt (what it does, not how). */\n\tdescription: string;\n\t/** Config field schemas. Keys are config field names. */\n\tconfigSchema?: Record<string, ConfigFieldSchema>;\n\t/** Example config objects (shown in prompt for complex fns). */\n\texamples?: Record<string, unknown>[];\n\t/** Category tags for grouping in prompt (e.g., \"resilience\", \"reduction\", \"ai\"). */\n\ttags?: string[];\n};\n\n/** Rich catalog entry for producer sources. */\nexport type CatalogSourceEntry = {\n\t/** Runtime factory. */\n\tfactory: SourceFactory;\n\t/** One-line description for LLM prompt. */\n\tdescription: string;\n\t/** Config field schemas. */\n\tconfigSchema?: Record<string, ConfigFieldSchema>;\n\t/** Example config objects. */\n\texamples?: Record<string, unknown>[];\n\t/** Category tags. */\n\ttags?: string[];\n};\n\n/**\n * Fn/source lookup table passed to compileSpec and llmCompose.\n *\n * Accepts both bare factories (backward-compatible) and rich {@link CatalogFnEntry}\n * / {@link CatalogSourceEntry} objects. When rich entries are provided, the library\n * auto-generates LLM prompts and validates LLM output against the catalog.\n */\nexport type GraphSpecCatalog = {\n\tfns?: Record<string, FnFactory | CatalogFnEntry>;\n\tsources?: Record<string, SourceFactory | CatalogSourceEntry>;\n};\n\n// ---------------------------------------------------------------------------\n// Catalog helpers\n// ---------------------------------------------------------------------------\n\n/** Type guard: is this a rich catalog fn entry (vs bare factory)? */\nexport function isRichFnEntry(entry: FnFactory | CatalogFnEntry): entry is CatalogFnEntry {\n\treturn typeof entry === \"object\" && entry !== null && \"factory\" in entry;\n}\n\n/** Type guard: is this a rich catalog source entry (vs bare factory)? */\nexport function isRichSourceEntry(\n\tentry: SourceFactory | CatalogSourceEntry,\n): entry is CatalogSourceEntry {\n\treturn typeof entry === \"object\" && entry !== null && \"factory\" in entry;\n}\n\n/** Extract the runtime factory from a catalog entry (rich or bare). */\nexport function extractFnFactory(entry: FnFactory | CatalogFnEntry): FnFactory {\n\treturn isRichFnEntry(entry) ? entry.factory : entry;\n}\n\n/** Extract the runtime factory from a catalog source entry (rich or bare). */\nexport function extractSourceFactory(entry: SourceFactory | CatalogSourceEntry): SourceFactory {\n\treturn isRichSourceEntry(entry) ? entry.factory : entry;\n}\n\n/**\n * Auto-generate catalog prompt text from rich catalog entries.\n *\n * Groups fns by tag, formats each as `- name: description. Config: { ... }`.\n * Falls back to listing names only for bare factories.\n */\nexport function generateCatalogPrompt(catalog: GraphSpecCatalog): string {\n\tconst sections: string[] = [];\n\n\tif (catalog.fns) {\n\t\t// Group by first tag (or \"Other\")\n\t\tconst groups = new Map<string, string[]>();\n\t\tfor (const [name, entry] of Object.entries(catalog.fns)) {\n\t\t\tconst tag = isRichFnEntry(entry) ? (entry.tags?.[0] ?? \"Other\") : \"Other\";\n\t\t\tif (!groups.has(tag)) groups.set(tag, []);\n\t\t\tgroups.get(tag)!.push(formatFnEntry(name, entry));\n\t\t}\n\t\tfor (const [tag, lines] of groups) {\n\t\t\tsections.push(`${tag}:\\n${lines.join(\"\\n\")}`);\n\t\t}\n\t}\n\n\tif (catalog.sources) {\n\t\tconst lines: string[] = [];\n\t\tfor (const [name, entry] of Object.entries(catalog.sources)) {\n\t\t\tlines.push(formatSourceEntry(name, entry));\n\t\t}\n\t\tif (lines.length > 0) {\n\t\t\tsections.push(`Sources:\\n${lines.join(\"\\n\")}`);\n\t\t}\n\t}\n\n\treturn sections.join(\"\\n\\n\");\n}\n\nfunction formatFnEntry(name: string, entry: FnFactory | CatalogFnEntry): string {\n\tif (!isRichFnEntry(entry)) return `- ${name}`;\n\tlet line = `- ${name}: ${entry.description}`;\n\tif (entry.configSchema) {\n\t\tconst fields = Object.entries(entry.configSchema).map(([k, v]) => {\n\t\t\tlet desc = `${k}: ${v.type}`;\n\t\t\tif (v.enum) desc += ` (${v.enum.join(\"|\")})`;\n\t\t\tif (v.required === false) desc += \"?\";\n\t\t\treturn desc;\n\t\t});\n\t\tline += `. Config: { ${fields.join(\", \")} }`;\n\t}\n\treturn line;\n}\n\nfunction formatSourceEntry(name: string, entry: SourceFactory | CatalogSourceEntry): string {\n\tif (!isRichSourceEntry(entry)) return `- ${name}`;\n\tlet line = `- ${name}: ${entry.description}`;\n\tif (entry.configSchema) {\n\t\tconst fields = Object.entries(entry.configSchema).map(([k, v]) => {\n\t\t\tlet desc = `${k}: ${v.type}`;\n\t\t\tif (v.required === false) desc += \"?\";\n\t\t\treturn desc;\n\t\t});\n\t\tline += `. Config: { ${fields.join(\", \")} }`;\n\t}\n\treturn line;\n}\n\n/**\n * Validate a GraphSpec against a catalog.\n *\n * Checks that fn/source names reference actual catalog entries, and validates\n * config fields against configSchema when rich entries are available.\n * Returns additional errors beyond structural {@link validateSpec} checks.\n */\nexport function validateSpecAgainstCatalog(\n\tspec: GraphSpec,\n\tcatalog: GraphSpecCatalog,\n): GraphSpecValidation {\n\tconst errors: string[] = [];\n\tconst fnNames = new Set(Object.keys(catalog.fns ?? {}));\n\tconst sourceNames = new Set(Object.keys(catalog.sources ?? {}));\n\n\tfor (const [nodeName, nodeRaw] of Object.entries(spec.nodes)) {\n\t\tif (nodeRaw.type === \"template\") continue;\n\t\tconst node = nodeRaw as GraphSpecNode;\n\n\t\t// Check fn name exists in catalog\n\t\tif (node.fn && fnNames.size > 0 && !fnNames.has(node.fn)) {\n\t\t\t// Check if they used a source name as fn\n\t\t\tif (sourceNames.has(node.fn)) {\n\t\t\t\terrors.push(\n\t\t\t\t\t`Node \"${nodeName}\": fn \"${node.fn}\" is a source, not a function. ` +\n\t\t\t\t\t\t`Use it as a producer source instead, or use a function from: ${[...fnNames].join(\", \")}`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst suggestion = findClosest(node.fn, fnNames);\n\t\t\t\terrors.push(\n\t\t\t\t\t`Node \"${nodeName}\": fn \"${node.fn}\" not found in catalog` +\n\t\t\t\t\t\t(suggestion ? `. Did you mean \"${suggestion}\"?` : \"\"),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Check source name exists in catalog\n\t\tif (node.source && sourceNames.size > 0 && !sourceNames.has(node.source)) {\n\t\t\tif (fnNames.has(node.source)) {\n\t\t\t\terrors.push(\n\t\t\t\t\t`Node \"${nodeName}\": source \"${node.source}\" is a function, not a source. ` +\n\t\t\t\t\t\t`Use it as fn instead, or use a source from: ${[...sourceNames].join(\", \")}`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst suggestion = findClosest(node.source, sourceNames);\n\t\t\t\terrors.push(\n\t\t\t\t\t`Node \"${nodeName}\": source \"${node.source}\" not found in catalog` +\n\t\t\t\t\t\t(suggestion ? `. Did you mean \"${suggestion}\"?` : \"\"),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Validate config against schema (if rich entry)\n\t\tif (node.fn && node.config && catalog.fns?.[node.fn]) {\n\t\t\tconst entry = catalog.fns[node.fn];\n\t\t\tif (isRichFnEntry(entry) && entry.configSchema) {\n\t\t\t\tfor (const [field, schema] of Object.entries(entry.configSchema)) {\n\t\t\t\t\tif (schema.required !== false && !(field in node.config)) {\n\t\t\t\t\t\terrors.push(`Node \"${nodeName}\": config missing required field \"${field}\"`);\n\t\t\t\t\t}\n\t\t\t\t\tif (field in node.config && schema.enum) {\n\t\t\t\t\t\tconst val = node.config[field];\n\t\t\t\t\t\tif (!schema.enum.includes(val as string | number | boolean)) {\n\t\t\t\t\t\t\terrors.push(\n\t\t\t\t\t\t\t\t`Node \"${nodeName}\": config.${field} = ${JSON.stringify(val)}, ` +\n\t\t\t\t\t\t\t\t\t`expected one of: ${schema.enum.join(\", \")}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Also check template inner nodes\n\tif (spec.templates) {\n\t\tfor (const [tName, template] of Object.entries(spec.templates)) {\n\t\t\tfor (const [nodeName, node] of Object.entries(template.nodes)) {\n\t\t\t\tif (node.fn && fnNames.size > 0 && !fnNames.has(node.fn)) {\n\t\t\t\t\tconst suggestion = findClosest(node.fn, fnNames);\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\t`Template \"${tName}\" node \"${nodeName}\": fn \"${node.fn}\" not found in catalog` +\n\t\t\t\t\t\t\t(suggestion ? `. Did you mean \"${suggestion}\"?` : \"\"),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { valid: errors.length === 0, errors };\n}\n\n/** Simple Levenshtein-based closest match for \"did you mean?\" suggestions. */\nfunction findClosest(input: string, candidates: Set<string>): string | null {\n\tlet best: string | null = null;\n\tlet bestDist = Infinity;\n\tconst lower = input.toLowerCase();\n\tfor (const c of candidates) {\n\t\tconst dist = levenshtein(lower, c.toLowerCase());\n\t\tif (dist < bestDist && dist <= Math.max(3, Math.floor(input.length / 2))) {\n\t\t\tbestDist = dist;\n\t\t\tbest = c;\n\t\t}\n\t}\n\treturn best;\n}\n\nfunction levenshtein(a: string, b: string): number {\n\tconst m = a.length;\n\tconst n = b.length;\n\tconst dp: number[][] = Array.from({ length: m + 1 }, (_, i) =>\n\t\tArray.from({ length: n + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0)),\n\t);\n\tfor (let i = 1; i <= m; i++) {\n\t\tfor (let j = 1; j <= n; j++) {\n\t\t\tdp[i][j] =\n\t\t\t\ta[i - 1] === b[j - 1]\n\t\t\t\t\t? dp[i - 1][j - 1]\n\t\t\t\t\t: 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);\n\t\t}\n\t}\n\treturn dp[m][n];\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\n/** Validation result from {@link validateSpec}. */\nexport type GraphSpecValidation = {\n\tvalid: boolean;\n\terrors: string[];\n};\n\nconst VALID_NODE_TYPES = new Set([\n\t\"state\",\n\t\"producer\",\n\t\"derived\",\n\t\"effect\",\n\t\"operator\",\n\t\"template\",\n]);\n\nconst INNER_NODE_TYPES = new Set([\"state\", \"producer\", \"derived\", \"effect\", \"operator\"]);\n\n/**\n * Validate a GraphSpec JSON object.\n *\n * Checks structural validity: required fields, node types, dep references,\n * template references, feedback edge targets, self-cycles, and bind completeness.\n */\nexport function validateSpec(spec: unknown): GraphSpecValidation {\n\tconst errors: string[] = [];\n\n\tif (spec == null || typeof spec !== \"object\") {\n\t\treturn { valid: false, errors: [\"GraphSpec must be a non-null object\"] };\n\t}\n\n\tconst s = spec as Record<string, unknown>;\n\n\tif (typeof s.name !== \"string\" || s.name.length === 0) {\n\t\terrors.push(\"Missing or empty 'name' field\");\n\t}\n\n\tif (s.nodes == null || typeof s.nodes !== \"object\" || Array.isArray(s.nodes)) {\n\t\terrors.push(\"Missing or invalid 'nodes' field (must be an object)\");\n\t\treturn { valid: false, errors };\n\t}\n\n\tconst nodeNames = new Set(Object.keys(s.nodes as object));\n\tconst nodeTypes = new Map<string, string>();\n\tconst templateDefs = new Map<string, { params: string[] }>();\n\n\t// Pre-scan template definitions for param validation\n\tif (s.templates != null && typeof s.templates === \"object\" && !Array.isArray(s.templates)) {\n\t\tfor (const [tName, tRaw] of Object.entries(s.templates as Record<string, unknown>)) {\n\t\t\tif (tRaw != null && typeof tRaw === \"object\") {\n\t\t\t\tconst t = tRaw as Record<string, unknown>;\n\t\t\t\ttemplateDefs.set(tName, {\n\t\t\t\t\tparams: Array.isArray(t.params) ? (t.params as string[]) : [],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Validate templates\n\tif (s.templates != null) {\n\t\tif (typeof s.templates !== \"object\" || Array.isArray(s.templates)) {\n\t\t\terrors.push(\"'templates' must be an object\");\n\t\t} else {\n\t\t\tfor (const [tName, tRaw] of Object.entries(s.templates as Record<string, unknown>)) {\n\t\t\t\tif (tRaw == null || typeof tRaw !== \"object\") {\n\t\t\t\t\terrors.push(`Template \"${tName}\": must be an object`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst t = tRaw as Record<string, unknown>;\n\t\t\t\tif (!Array.isArray(t.params)) {\n\t\t\t\t\terrors.push(`Template \"${tName}\": missing 'params' array`);\n\t\t\t\t}\n\t\t\t\tif (t.nodes == null || typeof t.nodes !== \"object\" || Array.isArray(t.nodes)) {\n\t\t\t\t\terrors.push(`Template \"${tName}\": missing or invalid 'nodes' object`);\n\t\t\t\t} else {\n\t\t\t\t\tconst paramSet = new Set(Array.isArray(t.params) ? (t.params as string[]) : []);\n\t\t\t\t\tconst innerNames = new Set(Object.keys(t.nodes as object));\n\t\t\t\t\tfor (const [nName, nRaw] of Object.entries(t.nodes as Record<string, unknown>)) {\n\t\t\t\t\t\tif (nRaw == null || typeof nRaw !== \"object\") {\n\t\t\t\t\t\t\terrors.push(`Template \"${tName}\" node \"${nName}\": must be an object`);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst n = nRaw as Record<string, unknown>;\n\t\t\t\t\t\tif (typeof n.type !== \"string\" || !INNER_NODE_TYPES.has(n.type)) {\n\t\t\t\t\t\t\terrors.push(`Template \"${tName}\" node \"${nName}\": invalid type`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (Array.isArray(n.deps)) {\n\t\t\t\t\t\t\tfor (const dep of n.deps as string[]) {\n\t\t\t\t\t\t\t\tif (!innerNames.has(dep) && !paramSet.has(dep)) {\n\t\t\t\t\t\t\t\t\terrors.push(\n\t\t\t\t\t\t\t\t\t\t`Template \"${tName}\" node \"${nName}\": dep \"${dep}\" is not an inner node or param`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof t.output !== \"string\") {\n\t\t\t\t\t\terrors.push(`Template \"${tName}\": missing 'output' string`);\n\t\t\t\t\t} else if (!(t.nodes as Record<string, unknown>)[t.output as string]) {\n\t\t\t\t\t\terrors.push(`Template \"${tName}\": output \"${t.output}\" is not a declared node`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Validate nodes\n\tfor (const [name, raw] of Object.entries(s.nodes as Record<string, unknown>)) {\n\t\tif (raw == null || typeof raw !== \"object\") {\n\t\t\terrors.push(`Node \"${name}\": must be an object`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst n = raw as Record<string, unknown>;\n\t\tif (typeof n.type !== \"string\" || !VALID_NODE_TYPES.has(n.type)) {\n\t\t\terrors.push(\n\t\t\t\t`Node \"${name}\": invalid type \"${String(n.type)}\" (expected: ${[...VALID_NODE_TYPES].join(\", \")})`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t\tnodeTypes.set(name, n.type);\n\n\t\tif (n.type === \"template\") {\n\t\t\tif (typeof n.template !== \"string\" || !templateDefs.has(n.template)) {\n\t\t\t\terrors.push(`Node \"${name}\": template \"${String(n.template)}\" not found in templates`);\n\t\t\t} else {\n\t\t\t\t// Check bind completeness: all template params must be bound\n\t\t\t\tif (n.bind == null || typeof n.bind !== \"object\" || Array.isArray(n.bind)) {\n\t\t\t\t\terrors.push(`Node \"${name}\": template ref requires 'bind' object`);\n\t\t\t\t} else {\n\t\t\t\t\tconst tmpl = templateDefs.get(n.template as string)!;\n\t\t\t\t\tconst bind = n.bind as Record<string, string>;\n\t\t\t\t\tfor (const param of tmpl.params) {\n\t\t\t\t\t\tif (!(param in bind)) {\n\t\t\t\t\t\t\terrors.push(\n\t\t\t\t\t\t\t\t`Node \"${name}\": template param \"${param}\" is not bound (template \"${n.template}\")`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (const [, target] of Object.entries(bind)) {\n\t\t\t\t\t\tif (typeof target === \"string\" && !nodeNames.has(target)) {\n\t\t\t\t\t\t\terrors.push(\n\t\t\t\t\t\t\t\t`Node \"${name}\": bind target \"${target}\" does not reference an existing node`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (Array.isArray(n.deps)) {\n\t\t\t\tfor (const dep of n.deps as string[]) {\n\t\t\t\t\t// Self-referencing dep\n\t\t\t\t\tif (dep === name) {\n\t\t\t\t\t\terrors.push(`Node \"${name}\": self-referencing dep`);\n\t\t\t\t\t} else if (!nodeNames.has(dep)) {\n\t\t\t\t\t\terrors.push(`Node \"${name}\": dep \"${dep}\" does not reference an existing node`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Warn: derived/effect/operator without deps\n\t\t\tif (\n\t\t\t\t(n.type === \"derived\" || n.type === \"effect\" || n.type === \"operator\") &&\n\t\t\t\t!Array.isArray(n.deps)\n\t\t\t) {\n\t\t\t\terrors.push(`Node \"${name}\": ${n.type} node should have a 'deps' array`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Validate feedback edges\n\tif (s.feedback != null) {\n\t\tif (!Array.isArray(s.feedback)) {\n\t\t\terrors.push(\"'feedback' must be an array\");\n\t\t} else {\n\t\t\tfor (let i = 0; i < (s.feedback as unknown[]).length; i++) {\n\t\t\t\tconst edge = (s.feedback as unknown[])[i];\n\t\t\t\tif (edge == null || typeof edge !== \"object\") {\n\t\t\t\t\terrors.push(`Feedback [${i}]: must be an object`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst e = edge as Record<string, unknown>;\n\t\t\t\tif (typeof e.from !== \"string\" || !nodeNames.has(e.from)) {\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\t`Feedback [${i}]: 'from' \"${String(e.from)}\" does not reference an existing node`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (typeof e.from === \"string\" && e.from === e.to) {\n\t\t\t\t\terrors.push(`Feedback [${i}]: 'from' and 'to' must be different nodes`);\n\t\t\t\t}\n\t\t\t\tif (typeof e.to !== \"string\" || !nodeNames.has(e.to)) {\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\t`Feedback [${i}]: 'to' \"${String(e.to)}\" does not reference an existing node`,\n\t\t\t\t\t);\n\t\t\t\t} else if (typeof e.to === \"string\" && nodeTypes.get(e.to) !== \"state\") {\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\t`Feedback [${i}]: 'to' node \"${e.to}\" must be a state node (got \"${nodeTypes.get(e.to) ?? \"unknown\"}\")`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { valid: errors.length === 0, errors };\n}\n\n// ---------------------------------------------------------------------------\n// compileSpec\n// ---------------------------------------------------------------------------\n\n/** Options for {@link compileSpec}. */\nexport type CompileSpecOptions = {\n\t/** Fn/source catalog for resolving named factories. */\n\tcatalog?: GraphSpecCatalog;\n};\n\n/**\n * Instantiate a Graph from a GraphSpec.\n *\n * Handles template expansion (mounted subgraphs), feedback wiring via §8.1\n * feedback(), node factory lookup from the catalog, and topology validation.\n *\n * @param spec - Declarative graph topology.\n * @param opts - Catalog and compile options.\n * @returns A running Graph.\n * @throws On validation failure, missing catalog entries, or unresolvable deps.\n *\n * @category patterns\n */\nexport function compileSpec(spec: GraphSpec, opts?: CompileSpecOptions): Graph {\n\tconst validation = validateSpec(spec);\n\tif (!validation.valid) {\n\t\tthrow new Error(`compileSpec: invalid GraphSpec:\\n${validation.errors.join(\"\\n\")}`);\n\t}\n\n\tconst catalog = opts?.catalog ?? {};\n\tconst g = new Graph(spec.name);\n\tconst templates = spec.templates ?? {};\n\n\t// Catalog-aware validation (when rich entries are available)\n\tconst catalogValidation = validateSpecAgainstCatalog(spec, catalog);\n\tif (!catalogValidation.valid) {\n\t\tthrow new Error(\n\t\t\t`compileSpec: catalog validation errors:\\n${catalogValidation.errors.join(\"\\n\")}`,\n\t\t);\n\t}\n\n\t// Helper: resolve fn/source factories from catalog (handles rich + bare entries)\n\tconst resolveFn = (fnName: string): FnFactory | undefined => {\n\t\tconst entry = catalog.fns?.[fnName];\n\t\treturn entry ? extractFnFactory(entry) : undefined;\n\t};\n\tconst resolveSource = (sourceName: string): SourceFactory | undefined => {\n\t\tconst entry = catalog.sources?.[sourceName];\n\t\treturn entry ? extractSourceFactory(entry) : undefined;\n\t};\n\n\t// Phase 1: Create non-template nodes (state/producer first, then derived/effect/operator)\n\tconst created = new Map<string, Node<unknown>>();\n\tconst deferred: [string, GraphSpecNode][] = [];\n\n\tfor (const [name, raw] of Object.entries(spec.nodes)) {\n\t\tif (raw.type === \"template\") continue; // handled in Phase 2\n\n\t\tconst n = raw as GraphSpecNode;\n\t\tif (n.type === \"state\") {\n\t\t\tconst nd = state(n.initial, {\n\t\t\t\tname,\n\t\t\t\tmeta: n.meta ? { ...n.meta } : undefined,\n\t\t\t});\n\t\t\tg.add(name, nd);\n\t\t\tcreated.set(name, nd);\n\t\t} else if (n.type === \"producer\") {\n\t\t\tconst sourceFactory = n.source ? resolveSource(n.source) : undefined;\n\t\t\tconst fnFactory = n.fn ? resolveFn(n.fn) : undefined;\n\t\t\tif (sourceFactory) {\n\t\t\t\tconst nd = sourceFactory(n.config ?? {});\n\t\t\t\tg.add(name, nd);\n\t\t\t\tcreated.set(name, nd);\n\t\t\t} else if (fnFactory) {\n\t\t\t\tconst nd = fnFactory([], n.config ?? {});\n\t\t\t\tg.add(name, nd);\n\t\t\t\tcreated.set(name, nd);\n\t\t\t} else {\n\t\t\t\t// No catalog entry — create a bare producer placeholder\n\t\t\t\tconst nd = producer(() => {}, {\n\t\t\t\t\tname,\n\t\t\t\t\tmeta: { ...n.meta, _specFn: n.fn, _specSource: n.source },\n\t\t\t\t});\n\t\t\t\tg.add(name, nd);\n\t\t\t\tcreated.set(name, nd);\n\t\t\t}\n\t\t} else {\n\t\t\tdeferred.push([name, n]);\n\t\t}\n\t}\n\n\t// Resolve deferred nodes (derived/effect/operator) in dependency order\n\tlet progressed = true;\n\tconst pending = new Map(deferred);\n\twhile (pending.size > 0 && progressed) {\n\t\tprogressed = false;\n\t\tfor (const [name, n] of [...pending.entries()]) {\n\t\t\tconst deps = n.deps ?? [];\n\t\t\tif (!deps.every((dep) => created.has(dep))) continue;\n\n\t\t\tconst resolvedDeps = deps.map((dep) => created.get(dep)!);\n\t\t\tconst fnFactory = n.fn ? resolveFn(n.fn) : undefined;\n\n\t\t\tlet nd: Node<unknown>;\n\t\t\tif (fnFactory) {\n\t\t\t\tnd = fnFactory(resolvedDeps, n.config ?? {});\n\t\t\t} else if (n.type === \"effect\") {\n\t\t\t\tnd = effect(resolvedDeps, () => {});\n\t\t\t} else {\n\t\t\t\t// derived/operator without catalog fn — identity passthrough\n\t\t\t\tnd = derived(resolvedDeps, (vals: readonly unknown[]) => vals[0]);\n\t\t\t}\n\t\t\tg.add(name, nd);\n\t\t\tcreated.set(name, nd);\n\t\t\tpending.delete(name);\n\t\t\tprogressed = true;\n\t\t}\n\t}\n\tif (pending.size > 0) {\n\t\tconst unresolved = [...pending.keys()].sort().join(\", \");\n\t\tthrow new Error(`compileSpec: unresolvable deps for nodes: ${unresolved}`);\n\t}\n\n\t// Phase 2: Expand template instantiations as mounted subgraphs\n\tfor (const [name, raw] of Object.entries(spec.nodes)) {\n\t\tif (raw.type !== \"template\") continue;\n\t\tconst ref = raw as GraphSpecTemplateRef;\n\t\tconst tmpl = templates[ref.template]!;\n\n\t\tconst sub = new Graph(name);\n\t\tconst subCreated = new Map<string, Node<unknown>>();\n\t\tconst subDeferred: [string, GraphSpecNode][] = [];\n\n\t\t// Create inner nodes, resolving $params to bound nodes\n\t\tfor (const [nName, nSpec] of Object.entries(tmpl.nodes)) {\n\t\t\tconst resolvedDeps = (nSpec.deps ?? []).map((dep) => {\n\t\t\t\tif (dep.startsWith(\"$\") && ref.bind[dep]) {\n\t\t\t\t\treturn ref.bind[dep];\n\t\t\t\t}\n\t\t\t\treturn dep;\n\t\t\t});\n\t\t\tconst specWithResolvedDeps = { ...nSpec, deps: resolvedDeps };\n\n\t\t\tif (nSpec.type === \"state\") {\n\t\t\t\tconst nd = state(nSpec.initial, {\n\t\t\t\t\tname: nName,\n\t\t\t\t\tmeta: nSpec.meta ? { ...nSpec.meta } : undefined,\n\t\t\t\t});\n\t\t\t\tsub.add(nName, nd);\n\t\t\t\tsubCreated.set(nName, nd);\n\t\t\t} else if (nSpec.type === \"producer\") {\n\t\t\t\t// Handle producer nodes inside templates\n\t\t\t\tconst sourceFactory = nSpec.source ? resolveSource(nSpec.source) : undefined;\n\t\t\t\tconst fnFactory = nSpec.fn ? resolveFn(nSpec.fn) : undefined;\n\t\t\t\tif (sourceFactory) {\n\t\t\t\t\tconst nd = sourceFactory(nSpec.config ?? {});\n\t\t\t\t\tsub.add(nName, nd);\n\t\t\t\t\tsubCreated.set(nName, nd);\n\t\t\t\t} else if (fnFactory) {\n\t\t\t\t\tconst nd = fnFactory([], nSpec.config ?? {});\n\t\t\t\t\tsub.add(nName, nd);\n\t\t\t\t\tsubCreated.set(nName, nd);\n\t\t\t\t} else {\n\t\t\t\t\tconst nd = producer(() => {}, {\n\t\t\t\t\t\tname: nName,\n\t\t\t\t\t\tmeta: { ...nSpec.meta, _specFn: nSpec.fn, _specSource: nSpec.source },\n\t\t\t\t\t});\n\t\t\t\t\tsub.add(nName, nd);\n\t\t\t\t\tsubCreated.set(nName, nd);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsubDeferred.push([nName, specWithResolvedDeps]);\n\t\t\t}\n\t\t}\n\n\t\t// Resolve deferred inner nodes\n\t\tlet subProgressed = true;\n\t\tconst subPending = new Map(subDeferred);\n\t\twhile (subPending.size > 0 && subProgressed) {\n\t\t\tsubProgressed = false;\n\t\t\tfor (const [nName, nSpec] of [...subPending.entries()]) {\n\t\t\t\tconst deps = nSpec.deps ?? [];\n\t\t\t\tconst allReady = deps.every((dep) => subCreated.has(dep) || created.has(dep));\n\t\t\t\tif (!allReady) continue;\n\n\t\t\t\tconst resolvedDeps = deps.map((dep) => subCreated.get(dep) ?? created.get(dep)!);\n\t\t\t\tconst fnFactory = nSpec.fn ? resolveFn(nSpec.fn) : undefined;\n\n\t\t\t\tlet nd: Node<unknown>;\n\t\t\t\tif (fnFactory) {\n\t\t\t\t\tnd = fnFactory(resolvedDeps, nSpec.config ?? {});\n\t\t\t\t} else if (nSpec.type === \"effect\") {\n\t\t\t\t\tnd = effect(resolvedDeps, () => {});\n\t\t\t\t} else {\n\t\t\t\t\tnd = derived(resolvedDeps, (vals: readonly unknown[]) => vals[0]);\n\t\t\t\t}\n\t\t\t\tsub.add(nName, nd);\n\t\t\t\tsubCreated.set(nName, nd);\n\t\t\t\tsubPending.delete(nName);\n\t\t\t\tsubProgressed = true;\n\t\t\t}\n\t\t}\n\t\tif (subPending.size > 0) {\n\t\t\tconst unresolved = [...subPending.keys()].sort().join(\", \");\n\t\t\tthrow new Error(\n\t\t\t\t`compileSpec: template \"${ref.template}\" has unresolvable deps: ${unresolved}`,\n\t\t\t);\n\t\t}\n\n\t\tg.mount(name, sub);\n\t\t// Register template output as a reachable node path\n\t\tconst outputPath = `${name}::${tmpl.output}`;\n\t\tcreated.set(name, g.resolve(outputPath));\n\n\t\t// Store template origin meta on the mounted subgraph's first node\n\t\t// so decompileGraph can recover it without structural fingerprinting.\n\t\ttry {\n\t\t\tconst outputNode = g.resolve(outputPath);\n\t\t\toutputNode.meta._templateName?.down([[DATA, ref.template]]);\n\t\t\toutputNode.meta._templateBind?.down([[DATA, ref.bind]]);\n\t\t} catch {\n\t\t\t/* meta nodes may not exist; template origin is best-effort */\n\t\t}\n\t}\n\n\t// Phase 3: Wire edges from deps (record explicit edges for describe())\n\tfor (const [name, raw] of Object.entries(spec.nodes)) {\n\t\tif (raw.type === \"template\") continue;\n\t\tconst n = raw as GraphSpecNode;\n\t\tfor (const dep of n.deps ?? []) {\n\t\t\ttry {\n\t\t\t\tg.connect(dep, name);\n\t\t\t} catch (err: unknown) {\n\t\t\t\t// Silently skip edges that are already implicit from constructor deps.\n\t\t\t\t// Re-throw unexpected errors.\n\t\t\t\tconst msg = err instanceof Error ? err.message : \"\";\n\t\t\t\tif (!msg.includes(\"constructor deps\") && !msg.includes(\"already\")) {\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Phase 4: Wire feedback edges via §8.1 feedback()\n\tfor (const fb of spec.feedback ?? []) {\n\t\tfeedbackPrimitive(g, fb.from, fb.to, {\n\t\t\tmaxIterations: fb.maxIterations,\n\t\t});\n\t}\n\n\treturn g;\n}\n\n// ---------------------------------------------------------------------------\n// decompileGraph\n// ---------------------------------------------------------------------------\n\n/** Internal meta keys used by compileSpec/feedback — stripped from output. */\nconst INTERNAL_META_KEYS = new Set([\n\t\"reduction\",\n\t\"reduction_type\",\n\t\"_specFn\",\n\t\"_specSource\",\n\t\"_templateName\",\n\t\"_templateBind\",\n\t\"feedbackFrom\",\n\t\"feedbackTo\",\n\t\"_internal\",\n]);\n\n/**\n * Extract a GraphSpec from a running graph.\n *\n * Uses `describe({ detail: \"standard\" })` as a starting point, then enriches:\n * - Feedback edges recovered from counter node meta (`feedbackFrom`/`feedbackTo`)\n * - Template refs recovered from output node meta (`_templateName`/`_templateBind`)\n * - Structural fingerprinting as fallback for 2+ identical mounted subgraphs\n *\n * @param graph - Running graph to decompile.\n * @returns A GraphSpec representation.\n *\n * @category patterns\n */\nexport function decompileGraph(graph: Graph): GraphSpec {\n\tconst desc = graph.describe({ detail: \"standard\" });\n\tconst nodes: Record<string, GraphSpecNode> = {};\n\tconst feedbackEdges: GraphSpecFeedbackEdge[] = [];\n\tconst metaSegment = `::${GRAPH_META_SEGMENT}::`;\n\n\t// Detect feedback counter nodes and extract feedback edges from meta\n\tconst feedbackCounterPattern = /^__feedback_(?!effect_)(.+)$/;\n\tconst feedbackConditions = new Set<string>();\n\n\tfor (const path of Object.keys(desc.nodes)) {\n\t\tif (path.includes(metaSegment)) continue;\n\t\tconst match = feedbackCounterPattern.exec(path);\n\t\tif (match) {\n\t\t\tfeedbackConditions.add(match[1]!);\n\t\t\tconst meta = desc.nodes[path]?.meta as Record<string, unknown> | undefined;\n\t\t\tif (meta?.feedbackFrom && meta?.feedbackTo) {\n\t\t\t\tfeedbackEdges.push({\n\t\t\t\t\tfrom: meta.feedbackFrom as string,\n\t\t\t\t\tto: meta.feedbackTo as string,\n\t\t\t\t\t...(meta.maxIterations ? { maxIterations: meta.maxIterations as number } : {}),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build nodes map, skipping meta, feedback internals, and bridge nodes\n\tfor (const [path, nodeDesc] of Object.entries(desc.nodes)) {\n\t\tif (path.includes(metaSegment)) continue;\n\t\tif (feedbackCounterPattern.test(path)) continue;\n\t\t// Skip internal infrastructure nodes (bridge, feedback effect) via meta tag\n\t\tif (nodeDesc.meta?._internal) continue;\n\t\t// Legacy fallback: skip by naming convention\n\t\tif (path.startsWith(\"__feedback_effect_\")) continue;\n\t\tif (path.startsWith(\"__bridge_\")) continue;\n\t\t// Skip subgraph-internal nodes (they belong to templates)\n\t\tif (path.includes(\"::\")) continue;\n\n\t\tconst specNode: GraphSpecNode = {\n\t\t\ttype: nodeDesc.type as GraphSpecNode[\"type\"],\n\t\t};\n\n\t\tif (nodeDesc.deps.length > 0) {\n\t\t\tspecNode.deps = nodeDesc.deps.filter((d) => !d.includes(\"::\"));\n\t\t}\n\n\t\tif (nodeDesc.type === \"state\" && nodeDesc.value !== undefined) {\n\t\t\tspecNode.initial = nodeDesc.value;\n\t\t}\n\n\t\tif (nodeDesc.meta && Object.keys(nodeDesc.meta).length > 0) {\n\t\t\tconst meta: Record<string, unknown> = {};\n\t\t\tfor (const [k, v] of Object.entries(nodeDesc.meta as Record<string, unknown>)) {\n\t\t\t\tif (!INTERNAL_META_KEYS.has(k)) meta[k] = v;\n\t\t\t}\n\t\t\tif (Object.keys(meta).length > 0) {\n\t\t\t\tspecNode.meta = meta;\n\t\t\t}\n\t\t}\n\n\t\tnodes[path] = specNode;\n\t}\n\n\t// Detect templates: first from compile-time meta (option B), then structural fallback\n\tconst templates: Record<string, GraphSpecTemplate> = {};\n\tconst templateRefs: Record<string, GraphSpecTemplateRef> = {};\n\tconst metaDetectedSubgraphs = new Set<string>();\n\n\t// Option B: recover template origin from meta stored by compileSpec\n\tfor (const subName of desc.subgraphs) {\n\t\tconst prefix = `${subName}::`;\n\t\tfor (const [path, nodeDesc] of Object.entries(desc.nodes)) {\n\t\t\tif (!path.startsWith(prefix)) continue;\n\t\t\tif (path.includes(metaSegment)) continue;\n\t\t\tconst meta = nodeDesc.meta as Record<string, unknown> | undefined;\n\t\t\tif (meta?._templateName && meta?._templateBind) {\n\t\t\t\tconst templateName = meta._templateName as string;\n\t\t\t\tconst bind = meta._templateBind as Record<string, string>;\n\n\t\t\t\t// Reconstruct template definition from the subgraph's nodes\n\t\t\t\tif (!templates[templateName]) {\n\t\t\t\t\tconst tmplNodes: Record<string, GraphSpecNode> = {};\n\t\t\t\t\tconst tmplInnerNames = new Set<string>();\n\t\t\t\t\tconst tmplPrefix = `${subName}::`;\n\t\t\t\t\tfor (const [p, nd] of Object.entries(desc.nodes)) {\n\t\t\t\t\t\tif (!p.startsWith(tmplPrefix) || p.includes(metaSegment)) continue;\n\t\t\t\t\t\tconst localName = p.slice(tmplPrefix.length);\n\t\t\t\t\t\tif (localName.includes(\"::\")) continue;\n\t\t\t\t\t\ttmplInnerNames.add(localName);\n\t\t\t\t\t\ttmplNodes[localName] = {\n\t\t\t\t\t\t\ttype: nd.type as GraphSpecNode[\"type\"],\n\t\t\t\t\t\t\t...(nd.deps.length > 0\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\tdeps: nd.deps.map((d) =>\n\t\t\t\t\t\t\t\t\t\t\td.startsWith(tmplPrefix) ? d.slice(tmplPrefix.length) : d,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\t// Detect params (external deps) and output\n\t\t\t\t\tconst tmplParams: string[] = [];\n\t\t\t\t\tconst tmplParamMap = new Map<string, string>();\n\t\t\t\t\tfor (const n of Object.values(tmplNodes)) {\n\t\t\t\t\t\tfor (const dep of n.deps ?? []) {\n\t\t\t\t\t\t\tif (!tmplInnerNames.has(dep) && !tmplParamMap.has(dep)) {\n\t\t\t\t\t\t\t\tconst param = `$${dep}`;\n\t\t\t\t\t\t\t\ttmplParams.push(param);\n\t\t\t\t\t\t\t\ttmplParamMap.set(dep, param);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Substitute external deps with $params\n\t\t\t\t\tfor (const n of Object.values(tmplNodes)) {\n\t\t\t\t\t\tif (n.deps) n.deps = n.deps.map((d) => tmplParamMap.get(d) ?? d);\n\t\t\t\t\t}\n\t\t\t\t\t// Find output\n\t\t\t\t\tconst depended = new Set<string>();\n\t\t\t\t\tfor (const n of Object.values(tmplNodes)) {\n\t\t\t\t\t\tfor (const dep of n.deps ?? []) {\n\t\t\t\t\t\t\tif (tmplInnerNames.has(dep)) depended.add(dep);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst outputCandidates = [...tmplInnerNames].filter((n) => !depended.has(n));\n\t\t\t\t\tconst tmplOutput = outputCandidates[0] ?? [...tmplInnerNames].pop()!;\n\n\t\t\t\t\ttemplates[templateName] = { params: tmplParams, nodes: tmplNodes, output: tmplOutput };\n\t\t\t\t}\n\n\t\t\t\tdelete nodes[subName];\n\t\t\t\ttemplateRefs[subName] = { type: \"template\", template: templateName, bind };\n\t\t\t\tmetaDetectedSubgraphs.add(subName);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Structural fallback: group remaining mounted subgraphs by fingerprint\n\tconst structureMap = new Map<string, { name: string; nodes: Record<string, GraphSpecNode> }[]>();\n\tfor (const subName of desc.subgraphs) {\n\t\tif (metaDetectedSubgraphs.has(subName)) continue;\n\t\tconst subNodes: Record<string, GraphSpecNode> = {};\n\t\tconst prefix = `${subName}::`;\n\t\tfor (const [path, nodeDesc] of Object.entries(desc.nodes)) {\n\t\t\tif (path.includes(metaSegment)) continue;\n\t\t\tif (!path.startsWith(prefix)) continue;\n\t\t\tconst localName = path.slice(prefix.length);\n\t\t\tif (localName.includes(\"::\")) continue;\n\t\t\tsubNodes[localName] = {\n\t\t\t\ttype: nodeDesc.type as GraphSpecNode[\"type\"],\n\t\t\t\t...(nodeDesc.deps.length > 0\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tdeps: nodeDesc.deps.map((d) => (d.startsWith(prefix) ? d.slice(prefix.length) : d)),\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t};\n\t\t}\n\t\tconst fingerprint = JSON.stringify(\n\t\t\tObject.fromEntries(\n\t\t\t\tObject.entries(subNodes)\n\t\t\t\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t\t\t\t.map(([k, v]) => [k, { type: v.type, deps: v.deps ?? [] }]),\n\t\t\t),\n\t\t);\n\t\tif (!structureMap.has(fingerprint)) {\n\t\t\tstructureMap.set(fingerprint, []);\n\t\t}\n\t\tstructureMap.get(fingerprint)!.push({ name: subName, nodes: subNodes });\n\t}\n\n\t// Subgraphs with identical structure (2+ instances) → templates\n\tfor (const [, group] of structureMap) {\n\t\tif (group.length < 2) continue;\n\t\tconst templateName = `${group[0]!.name}_template`;\n\t\tconst refNodes = group[0]!.nodes;\n\t\tconst innerNames = new Set(Object.keys(refNodes));\n\n\t\t// Detect external deps as params (from first member)\n\t\tconst params: string[] = [];\n\t\tconst baseParamMap = new Map<string, string>();\n\t\tfor (const n of Object.values(refNodes)) {\n\t\t\tfor (const dep of n.deps ?? []) {\n\t\t\t\tif (!innerNames.has(dep) && !baseParamMap.has(dep)) {\n\t\t\t\t\tconst param = `$${dep}`;\n\t\t\t\t\tparams.push(param);\n\t\t\t\t\tbaseParamMap.set(dep, param);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Find output node\n\t\tconst depended = new Set<string>();\n\t\tfor (const n of Object.values(refNodes)) {\n\t\t\tfor (const dep of n.deps ?? []) {\n\t\t\t\tif (innerNames.has(dep)) depended.add(dep);\n\t\t\t}\n\t\t}\n\t\tconst outputCandidates = [...innerNames].filter((n) => !depended.has(n));\n\t\tconst output = outputCandidates[0] ?? [...innerNames].pop()!;\n\n\t\t// Build template nodes with param-substituted deps\n\t\tconst tmplNodes: Record<string, GraphSpecNode> = {};\n\t\tfor (const [nName, nSpec] of Object.entries(refNodes)) {\n\t\t\ttmplNodes[nName] = {\n\t\t\t\t...nSpec,\n\t\t\t\tdeps: nSpec.deps?.map((d) => baseParamMap.get(d) ?? d),\n\t\t\t};\n\t\t}\n\n\t\ttemplates[templateName] = { params, nodes: tmplNodes, output };\n\n\t\t// Build per-member bind maps (each member may bind to different external nodes)\n\t\tfor (const member of group) {\n\t\t\tdelete nodes[member.name];\n\t\t\t// Build this member's own bind map by scanning its external deps\n\t\t\tconst memberBind: Record<string, string> = {};\n\t\t\tconst memberInnerNames = new Set(Object.keys(member.nodes));\n\t\t\tfor (const n of Object.values(member.nodes)) {\n\t\t\t\tfor (const dep of n.deps ?? []) {\n\t\t\t\t\tif (!memberInnerNames.has(dep)) {\n\t\t\t\t\t\t// Find which param this external dep maps to\n\t\t\t\t\t\tconst param = baseParamMap.get(dep) ?? `$${dep}`;\n\t\t\t\t\t\tmemberBind[param] = dep;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttemplateRefs[member.name] = {\n\t\t\t\ttype: \"template\",\n\t\t\t\ttemplate: templateName,\n\t\t\t\tbind: memberBind,\n\t\t\t};\n\t\t}\n\t}\n\n\tconst allNodes: Record<string, GraphSpecNode | GraphSpecTemplateRef> = {\n\t\t...nodes,\n\t\t...templateRefs,\n\t};\n\n\tconst result: GraphSpec = { name: desc.name, nodes: allNodes };\n\tif (Object.keys(templates).length > 0) result.templates = templates;\n\tif (feedbackEdges.length > 0) result.feedback = feedbackEdges;\n\n\treturn result;\n}\n\n// ---------------------------------------------------------------------------\n// specDiff\n// ---------------------------------------------------------------------------\n\n/** A single change in a spec diff. */\nexport type SpecDiffEntry = {\n\ttype: \"added\" | \"removed\" | \"changed\";\n\tpath: string;\n\tdetail?: string;\n};\n\n/** Structural diff between two GraphSpecs. */\nexport type SpecDiffResult = {\n\tentries: SpecDiffEntry[];\n\tsummary: string;\n};\n\n/**\n * Compute a structural diff between two GraphSpecs.\n *\n * Template-aware: reports \"changed template definition\" vs \"changed\n * instantiation bindings.\" No runtime needed — pure JSON comparison.\n *\n * @param specA - The \"before\" spec.\n * @param specB - The \"after\" spec.\n * @returns Diff entries and a human-readable summary.\n *\n * @category patterns\n */\nexport function specDiff(specA: GraphSpec, specB: GraphSpec): SpecDiffResult {\n\tconst entries: SpecDiffEntry[] = [];\n\n\t// Diff name\n\tif (specA.name !== specB.name) {\n\t\tentries.push({\n\t\t\ttype: \"changed\",\n\t\t\tpath: \"name\",\n\t\t\tdetail: `\"${specA.name}\" → \"${specB.name}\"`,\n\t\t});\n\t}\n\n\t// Diff nodes\n\tconst nodesA = new Set(Object.keys(specA.nodes));\n\tconst nodesB = new Set(Object.keys(specB.nodes));\n\n\tfor (const name of nodesB) {\n\t\tif (!nodesA.has(name)) {\n\t\t\tconst n = specB.nodes[name]!;\n\t\t\tentries.push({\n\t\t\t\ttype: \"added\",\n\t\t\t\tpath: `nodes.${name}`,\n\t\t\t\tdetail: `type: ${n.type}`,\n\t\t\t});\n\t\t}\n\t}\n\tfor (const name of nodesA) {\n\t\tif (!nodesB.has(name)) {\n\t\t\tentries.push({ type: \"removed\", path: `nodes.${name}` });\n\t\t}\n\t}\n\tfor (const name of nodesA) {\n\t\tif (!nodesB.has(name)) continue;\n\t\tconst a = specA.nodes[name]!;\n\t\tconst b = specB.nodes[name]!;\n\t\tif (JSON.stringify(a) !== JSON.stringify(b)) {\n\t\t\tconst details: string[] = [];\n\t\t\tif (a.type !== b.type) details.push(`type: ${a.type} → ${b.type}`);\n\t\t\tif (JSON.stringify((a as GraphSpecNode).deps) !== JSON.stringify((b as GraphSpecNode).deps)) {\n\t\t\t\tdetails.push(\"deps changed\");\n\t\t\t}\n\t\t\tif ((a as GraphSpecNode).fn !== (b as GraphSpecNode).fn) {\n\t\t\t\tdetails.push(`fn: ${(a as GraphSpecNode).fn} → ${(b as GraphSpecNode).fn}`);\n\t\t\t}\n\t\t\tif (\n\t\t\t\tJSON.stringify((a as GraphSpecNode).config) !== JSON.stringify((b as GraphSpecNode).config)\n\t\t\t) {\n\t\t\t\tdetails.push(\"config changed\");\n\t\t\t}\n\t\t\tentries.push({\n\t\t\t\ttype: \"changed\",\n\t\t\t\tpath: `nodes.${name}`,\n\t\t\t\tdetail: details.join(\"; \") || \"modified\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Diff templates\n\tconst tmplA = specA.templates ?? {};\n\tconst tmplB = specB.templates ?? {};\n\tconst tmplNamesA = new Set(Object.keys(tmplA));\n\tconst tmplNamesB = new Set(Object.keys(tmplB));\n\n\tfor (const name of tmplNamesB) {\n\t\tif (!tmplNamesA.has(name)) {\n\t\t\tentries.push({ type: \"added\", path: `templates.${name}` });\n\t\t}\n\t}\n\tfor (const name of tmplNamesA) {\n\t\tif (!tmplNamesB.has(name)) {\n\t\t\tentries.push({ type: \"removed\", path: `templates.${name}` });\n\t\t}\n\t}\n\tfor (const name of tmplNamesA) {\n\t\tif (!tmplNamesB.has(name)) continue;\n\t\tif (JSON.stringify(tmplA[name]) !== JSON.stringify(tmplB[name])) {\n\t\t\tentries.push({\n\t\t\t\ttype: \"changed\",\n\t\t\t\tpath: `templates.${name}`,\n\t\t\t\tdetail: \"template definition changed\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Diff feedback\n\tconst fbA = specA.feedback ?? [];\n\tconst fbB = specB.feedback ?? [];\n\tconst fbKeyA = new Set(fbA.map((e) => `${e.from}->${e.to}`));\n\tconst fbKeyB = new Set(fbB.map((e) => `${e.from}->${e.to}`));\n\n\tfor (const fb of fbB) {\n\t\tconst key = `${fb.from}->${fb.to}`;\n\t\tif (!fbKeyA.has(key)) {\n\t\t\tentries.push({\n\t\t\t\ttype: \"added\",\n\t\t\t\tpath: `feedback.${key}`,\n\t\t\t\tdetail: `maxIterations: ${fb.maxIterations ?? 10}`,\n\t\t\t});\n\t\t}\n\t}\n\tfor (const fb of fbA) {\n\t\tconst key = `${fb.from}->${fb.to}`;\n\t\tif (!fbKeyB.has(key)) {\n\t\t\tentries.push({ type: \"removed\", path: `feedback.${key}` });\n\t\t}\n\t}\n\tfor (const fb of fbA) {\n\t\tconst key = `${fb.from}->${fb.to}`;\n\t\tconst counterpart = fbB.find((b) => b.from === fb.from && b.to === fb.to);\n\t\tif (counterpart && JSON.stringify(fb) !== JSON.stringify(counterpart)) {\n\t\t\tentries.push({\n\t\t\t\ttype: \"changed\",\n\t\t\t\tpath: `feedback.${key}`,\n\t\t\t\tdetail: `maxIterations: ${fb.maxIterations ?? 10} → ${counterpart.maxIterations ?? 10}`,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Build summary\n\tconst added = entries.filter((e) => e.type === \"added\").length;\n\tconst removed = entries.filter((e) => e.type === \"removed\").length;\n\tconst changed = entries.filter((e) => e.type === \"changed\").length;\n\tconst parts: string[] = [];\n\tif (added) parts.push(`${added} added`);\n\tif (removed) parts.push(`${removed} removed`);\n\tif (changed) parts.push(`${changed} changed`);\n\tconst summary = parts.length > 0 ? parts.join(\", \") : \"no changes\";\n\n\treturn { entries, summary };\n}\n\n// ---------------------------------------------------------------------------\n// llmCompose\n// ---------------------------------------------------------------------------\n\n/** Options for {@link llmCompose}. */\nexport type LLMComposeOptions = {\n\tmodel?: string;\n\ttemperature?: number;\n\tmaxTokens?: number;\n\t/** Extra instructions appended to the system prompt. */\n\tsystemPromptExtra?: string;\n\t/**\n\t * Available fn/source catalog names for the LLM to reference.\n\t * When omitted and `catalog` contains rich {@link CatalogFnEntry} entries,\n\t * the prompt is auto-generated via {@link generateCatalogPrompt}.\n\t */\n\tcatalogDescription?: string;\n\t/**\n\t * Catalog for auto-prompt generation and catalog-aware validation.\n\t * When rich entries are provided, the catalog prompt is auto-generated\n\t * and LLM output is validated against fn/source names and config schemas.\n\t */\n\tcatalog?: GraphSpecCatalog;\n\t/**\n\t * Max auto-refine attempts when the LLM output fails catalog validation.\n\t * Each attempt feeds the validation errors back to the LLM via llmRefine.\n\t * Default: 0 (no auto-refine). Set to 2-3 for production use.\n\t */\n\tmaxAutoRefine?: number;\n};\n\nconst LLM_COMPOSE_SYSTEM_PROMPT = `You are a graph architect for GraphReFly, a reactive graph protocol.\n\nGiven a natural-language description, produce a JSON GraphSpec with this structure:\n\n{\n \"name\": \"<graph_name>\",\n \"nodes\": {\n \"<node_name>\": {\n \"type\": \"state\" | \"derived\" | \"producer\" | \"effect\" | \"operator\",\n \"deps\": [\"<dep_node_name>\", ...],\n \"fn\": \"<catalog_function_name>\",\n \"source\": \"<catalog_source_name>\",\n \"config\": { ... },\n \"initial\": <value>,\n \"meta\": { \"description\": \"<purpose>\" }\n },\n \"<template_instance>\": {\n \"type\": \"template\",\n \"template\": \"<template_name>\",\n \"bind\": { \"$param\": \"node_name\" }\n }\n },\n \"templates\": {\n \"<template_name>\": {\n \"params\": [\"$param1\", \"$param2\"],\n \"nodes\": { ... },\n \"output\": \"<output_node>\"\n }\n },\n \"feedback\": [\n { \"from\": \"<condition_node>\", \"to\": \"<state_node>\", \"maxIterations\": 10 }\n ]\n}\n\nRules:\n- \"state\" nodes hold user/LLM-writable values (knobs). Use \"initial\" for default values.\n- \"derived\" nodes compute from deps using a named \"fn\".\n- \"effect\" nodes produce side effects from deps.\n- \"producer\" nodes generate values from a named \"source\".\n- Use \"templates\" when the same subgraph pattern repeats (e.g., per-source resilience).\n- Use \"feedback\" for bounded cycles where a derived value writes back to a state node.\n- meta.description is required for every node.\n- Return ONLY valid JSON, no markdown fences or commentary.`;\n\n/** Strip markdown code fences. */\nfunction stripFences(text: string): string {\n\tconst match = text.match(/^```(?:json)?\\s*([\\s\\S]*?)\\s*```[\\s\\S]*$/);\n\treturn match ? match[1]! : text;\n}\n\n/**\n * Ask an LLM to compose a GraphSpec from a natural-language problem description.\n *\n * The LLM generates a GraphSpec (with templates + feedback), validated before\n * returning. The spec is for human review before compilation via compileSpec().\n *\n * @param problem - Natural language problem description.\n * @param adapter - LLM adapter for the generation call.\n * @param opts - Model options and catalog description.\n * @returns A validated GraphSpec.\n * @throws On invalid LLM output or validation failure.\n *\n * @category patterns\n */\nexport async function llmCompose(\n\tproblem: string,\n\tadapter: LLMAdapter,\n\topts?: LLMComposeOptions,\n): Promise<GraphSpec> {\n\tlet systemPrompt = LLM_COMPOSE_SYSTEM_PROMPT;\n\n\t// Auto-generate catalog prompt from rich entries, or use manual description\n\tconst catalogPrompt =\n\t\topts?.catalogDescription ?? (opts?.catalog ? generateCatalogPrompt(opts.catalog) : undefined);\n\tif (catalogPrompt) {\n\t\tsystemPrompt += `\\n\\nAvailable catalog (use ONLY these names):\\n${catalogPrompt}`;\n\t}\n\tif (opts?.systemPromptExtra) {\n\t\tsystemPrompt += `\\n\\n${opts.systemPromptExtra}`;\n\t}\n\n\tconst messages: ChatMessage[] = [\n\t\t{ role: \"system\", content: systemPrompt },\n\t\t{ role: \"user\", content: problem },\n\t];\n\n\tconst rawResult = adapter.invoke(messages, {\n\t\tmodel: opts?.model,\n\t\ttemperature: opts?.temperature ?? 0,\n\t\tmaxTokens: opts?.maxTokens,\n\t});\n\n\t// System boundary: await the adapter's response (Promise, plain value).\n\tconst response = (await rawResult) as LLMResponse;\n\tlet content = response.content.trim();\n\n\tif (content.startsWith(\"```\")) {\n\t\tcontent = stripFences(content);\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(content);\n\t} catch {\n\t\tthrow new Error(`llmCompose: LLM response is not valid JSON: ${content.slice(0, 200)}`);\n\t}\n\n\tconst validation = validateSpec(parsed);\n\tif (!validation.valid) {\n\t\tthrow new Error(`llmCompose: invalid GraphSpec:\\n${validation.errors.join(\"\\n\")}`);\n\t}\n\n\tlet spec = parsed as GraphSpec;\n\n\t// Catalog-aware validation + auto-refine loop\n\tif (opts?.catalog) {\n\t\tconst maxRefine = opts.maxAutoRefine ?? 0;\n\t\tfor (let attempt = 0; attempt <= maxRefine; attempt++) {\n\t\t\tconst catalogValidation = validateSpecAgainstCatalog(spec, opts.catalog);\n\t\t\tif (catalogValidation.valid) break;\n\n\t\t\tif (attempt === maxRefine) {\n\t\t\t\t// Last attempt failed — return with errors attached as meta\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`llmCompose: catalog validation failed after ${maxRefine} refine attempts:\\n${catalogValidation.errors.join(\"\\n\")}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Auto-refine: feed catalog errors back to LLM\n\t\t\tspec = await llmRefine(\n\t\t\t\tspec,\n\t\t\t\t`Fix these catalog errors:\\n${catalogValidation.errors.join(\"\\n\")}\\n\\nUse ONLY functions and sources from the catalog.`,\n\t\t\t\tadapter,\n\t\t\t\t{ ...opts, catalogDescription: catalogPrompt },\n\t\t\t);\n\t\t}\n\t}\n\n\treturn spec;\n}\n\n// ---------------------------------------------------------------------------\n// llmRefine\n// ---------------------------------------------------------------------------\n\n/** Options for {@link llmRefine}. */\nexport type LLMRefineOptions = LLMComposeOptions;\n\n/**\n * Ask an LLM to modify an existing GraphSpec based on feedback or changed requirements.\n *\n * @param currentSpec - The current GraphSpec to modify.\n * @param feedback - Natural language feedback or changed requirements.\n * @param adapter - LLM adapter for the generation call.\n * @param opts - Model options.\n * @returns A new GraphSpec incorporating the feedback.\n * @throws On invalid LLM output or validation failure.\n *\n * @category patterns\n */\nexport async function llmRefine(\n\tcurrentSpec: GraphSpec,\n\tfeedback: string,\n\tadapter: LLMAdapter,\n\topts?: LLMRefineOptions,\n): Promise<GraphSpec> {\n\tlet systemPrompt = LLM_COMPOSE_SYSTEM_PROMPT;\n\tif (opts?.catalogDescription) {\n\t\tsystemPrompt += `\\n\\nAvailable catalog:\\n${opts.catalogDescription}`;\n\t}\n\tif (opts?.systemPromptExtra) {\n\t\tsystemPrompt += `\\n\\n${opts.systemPromptExtra}`;\n\t}\n\n\tconst messages: ChatMessage[] = [\n\t\t{ role: \"system\", content: systemPrompt },\n\t\t{\n\t\t\trole: \"user\",\n\t\t\tcontent: `Current GraphSpec:\\n${JSON.stringify(currentSpec, null, 2)}\\n\\nModification request: ${feedback}\\n\\nReturn the complete modified GraphSpec as JSON.`,\n\t\t},\n\t];\n\n\tconst rawResult = adapter.invoke(messages, {\n\t\tmodel: opts?.model,\n\t\ttemperature: opts?.temperature ?? 0,\n\t\tmaxTokens: opts?.maxTokens,\n\t});\n\n\t// System boundary: await the adapter's response.\n\tconst response = (await rawResult) as LLMResponse;\n\tlet content = response.content.trim();\n\n\tif (content.startsWith(\"```\")) {\n\t\tcontent = stripFences(content);\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(content);\n\t} catch {\n\t\tthrow new Error(`llmRefine: LLM response is not valid JSON: ${content.slice(0, 200)}`);\n\t}\n\n\tconst validation = validateSpec(parsed);\n\tif (!validation.valid) {\n\t\tthrow new Error(`llmRefine: invalid GraphSpec:\\n${validation.errors.join(\"\\n\")}`);\n\t}\n\n\treturn parsed as GraphSpec;\n}\n","/**\n * Messaging patterns (roadmap §4.2).\n *\n * Pulsar-inspired messaging features modeled as graph factories:\n * - `topic()` for append-only topic streams\n * - `subscription()` for cursor-based consumers\n * - `jobQueue()` for queue claim/ack flow\n */\n\nimport { DATA, derived, type Node, node, state } from \"../core/index.js\";\nimport { type ReactiveListSnapshot, reactiveList } from \"../extra/reactive-list.js\";\nimport { type ReactiveLogSnapshot, reactiveLog } from \"../extra/reactive-log.js\";\nimport { type ReactiveMapSnapshot, reactiveMap } from \"../extra/reactive-map.js\";\nimport { Graph, type GraphOptions } from \"../graph/index.js\";\n\ntype MessagingMeta = {\n\tmessaging?: true;\n\tmessaging_type?: string;\n};\n\nconst DEFAULT_MAX_PER_PUMP = 2_147_483_647;\n\nfunction requireNonNegativeInt(value: number, label: string): number {\n\tif (!Number.isFinite(value) || !Number.isInteger(value) || value < 0) {\n\t\tthrow new Error(`${label} must be a non-negative integer`);\n\t}\n\treturn value;\n}\n\n/**\n * Keep a derived node's dep wiring alive for `get()` without a user sink.\n * Returns the unsubscribe handle so callers can clean up.\n */\nfunction keepalive(n: Node<unknown>): () => void {\n\treturn n.subscribe(() => {});\n}\n\nfunction messagingMeta(kind: string, extra?: Record<string, unknown>): Record<string, unknown> {\n\treturn {\n\t\tmessaging: true,\n\t\tmessaging_type: kind,\n\t\t...(extra ?? {}),\n\t} satisfies MessagingMeta;\n}\n\nexport type TopicOptions = {\n\tgraph?: GraphOptions;\n\tretainedLimit?: number;\n};\n\nexport class TopicGraph<T> extends Graph {\n\tprivate readonly _log;\n\tprivate readonly _keepaliveDisposers: Array<() => void> = [];\n\treadonly events: Node<ReactiveLogSnapshot<T>>;\n\treadonly latest: Node<T | undefined>;\n\n\tconstructor(name: string, opts: TopicOptions = {}) {\n\t\tsuper(name, opts.graph);\n\t\tthis._log = reactiveLog<T>([], { name: \"events\", maxSize: opts.retainedLimit });\n\t\tthis.events = this._log.entries;\n\t\tthis.add(\"events\", this.events);\n\t\tthis.latest = derived<T | undefined>(\n\t\t\t[this.events],\n\t\t\t([snapshot]) => {\n\t\t\t\tconst entries = (snapshot as ReactiveLogSnapshot<T>).value.entries;\n\t\t\t\treturn entries.length === 0 ? undefined : entries[entries.length - 1];\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"latest\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: messagingMeta(\"topic_latest\"),\n\t\t\t\tinitial: undefined,\n\t\t\t},\n\t\t);\n\t\tthis.add(\"latest\", this.latest);\n\t\tthis.connect(\"events\", \"latest\");\n\t\tthis._keepaliveDisposers.push(keepalive(this.latest));\n\t}\n\n\toverride destroy(): void {\n\t\tfor (const dispose of this._keepaliveDisposers) dispose();\n\t\tthis._keepaliveDisposers.length = 0;\n\t\tsuper.destroy();\n\t}\n\n\tpublish(value: T): void {\n\t\tthis._log.append(value);\n\t}\n\n\tretained(): readonly T[] {\n\t\tconst snapshot = this.events.get() as ReactiveLogSnapshot<T>;\n\t\treturn snapshot.value.entries;\n\t}\n}\n\nexport type SubscriptionOptions = {\n\tgraph?: GraphOptions;\n\tcursor?: number;\n};\n\nexport class SubscriptionGraph<T> extends Graph {\n\tprivate readonly _keepaliveDisposers: Array<() => void> = [];\n\treadonly source: Node<ReactiveLogSnapshot<T>>;\n\treadonly cursor: Node<number>;\n\treadonly available: Node<readonly T[]>;\n\n\tconstructor(name: string, topicGraph: TopicGraph<T>, opts: SubscriptionOptions = {}) {\n\t\tsuper(name, opts.graph);\n\t\tconst initialCursor = requireNonNegativeInt(opts.cursor ?? 0, \"subscription cursor\");\n\t\tthis.mount(\"topic\", topicGraph);\n\t\tconst topicEvents = topicGraph.events;\n\t\tthis.source = derived([topicEvents], ([snapshot]) => snapshot as ReactiveLogSnapshot<T>, {\n\t\t\tname: \"source\",\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: messagingMeta(\"subscription_source\"),\n\t\t\tinitial: topicEvents.get() as ReactiveLogSnapshot<T>,\n\t\t});\n\t\tthis.add(\"source\", this.source);\n\t\tthis.cursor = state(initialCursor, {\n\t\t\tname: \"cursor\",\n\t\t\tdescribeKind: \"state\",\n\t\t\tmeta: messagingMeta(\"subscription_cursor\"),\n\t\t});\n\t\tthis.add(\"cursor\", this.cursor);\n\t\tthis.available = derived(\n\t\t\t[this.source, this.cursor],\n\t\t\t([sourceSnapshot, cursor]) => {\n\t\t\t\tconst entries = (sourceSnapshot as ReactiveLogSnapshot<T>).value.entries;\n\t\t\t\tconst start = Math.max(0, Math.trunc((cursor as number) ?? 0));\n\t\t\t\treturn entries.slice(start);\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"available\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: messagingMeta(\"subscription_available\"),\n\t\t\t\tinitial: [],\n\t\t\t},\n\t\t);\n\t\tthis.add(\"available\", this.available);\n\t\tthis.connect(\"topic::events\", \"source\");\n\t\tthis.connect(\"source\", \"available\");\n\t\tthis.connect(\"cursor\", \"available\");\n\t\tthis._keepaliveDisposers.push(keepalive(this.source));\n\t\tthis._keepaliveDisposers.push(keepalive(this.available));\n\t}\n\n\toverride destroy(): void {\n\t\tfor (const dispose of this._keepaliveDisposers) dispose();\n\t\tthis._keepaliveDisposers.length = 0;\n\t\tsuper.destroy();\n\t}\n\n\tack(count?: number): number {\n\t\tconst available = this.available.get() as readonly T[];\n\t\tconst requested =\n\t\t\tcount === undefined\n\t\t\t\t? available.length\n\t\t\t\t: requireNonNegativeInt(count, \"subscription ack count\");\n\t\tconst step = Math.min(requested, available.length);\n\t\tif (step <= 0) return this.cursor.get() as number;\n\t\tconst next = (this.cursor.get() as number) + step;\n\t\tthis.cursor.down([[DATA, next]]);\n\t\treturn next;\n\t}\n\n\tpull(limit?: number, opts: { ack?: boolean } = {}): readonly T[] {\n\t\tconst available = this.available.get() as readonly T[];\n\t\tconst max =\n\t\t\tlimit === undefined\n\t\t\t\t? available.length\n\t\t\t\t: requireNonNegativeInt(limit, \"subscription pull limit\");\n\t\tconst out = available.slice(0, max);\n\t\tif (opts.ack && out.length > 0) this.ack(out.length);\n\t\treturn out;\n\t}\n}\n\nexport type JobState = \"queued\" | \"inflight\";\n\nexport type JobEnvelope<T> = {\n\tid: string;\n\tpayload: T;\n\tattempts: number;\n\tmetadata: Readonly<Record<string, unknown>>;\n\tstate: JobState;\n};\n\nexport type JobQueueOptions = {\n\tgraph?: GraphOptions;\n};\n\nexport class JobQueueGraph<T> extends Graph {\n\tprivate readonly _pending;\n\tprivate readonly _jobs;\n\tprivate readonly _keepaliveDisposers: Array<() => void> = [];\n\tprivate _seq = 0;\n\treadonly pending: Node<ReactiveListSnapshot<string>>;\n\treadonly jobs: Node<ReactiveMapSnapshot<string, JobEnvelope<T>>>;\n\treadonly depth: Node<number>;\n\n\tconstructor(name: string, opts: JobQueueOptions = {}) {\n\t\tsuper(name, opts.graph);\n\t\tthis._pending = reactiveList<string>([], { name: \"pending\" });\n\t\tthis._jobs = reactiveMap<string, JobEnvelope<T>>({ name: \"jobs\" });\n\t\tthis.pending = this._pending.items;\n\t\tthis.jobs = this._jobs.node;\n\t\tthis.add(\"pending\", this.pending);\n\t\tthis.add(\"jobs\", this.jobs);\n\t\tthis.depth = derived(\n\t\t\t[this.pending],\n\t\t\t([snapshot]) => (snapshot as ReactiveListSnapshot<string>).value.items.length,\n\t\t\t{\n\t\t\t\tname: \"depth\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: messagingMeta(\"queue_depth\"),\n\t\t\t\tinitial: 0,\n\t\t\t},\n\t\t);\n\t\tthis.add(\"depth\", this.depth);\n\t\tthis.connect(\"pending\", \"depth\");\n\t\tthis._keepaliveDisposers.push(keepalive(this.depth));\n\t}\n\n\toverride destroy(): void {\n\t\tfor (const dispose of this._keepaliveDisposers) dispose();\n\t\tthis._keepaliveDisposers.length = 0;\n\t\tsuper.destroy();\n\t}\n\n\tenqueue(payload: T, opts: { id?: string; metadata?: Record<string, unknown> } = {}): string {\n\t\tconst id = opts.id ?? `${this.name}-${++this._seq}`;\n\t\tif (this._jobs.get(id) !== undefined) {\n\t\t\tthrow new Error(`jobQueue(\"${this.name}\"): duplicate job id \"${id}\"`);\n\t\t}\n\t\tconst job: JobEnvelope<T> = {\n\t\t\tid,\n\t\t\tpayload,\n\t\t\tattempts: 0,\n\t\t\tmetadata: Object.freeze({ ...(opts.metadata ?? {}) }),\n\t\t\tstate: \"queued\",\n\t\t};\n\t\tthis._jobs.set(id, job);\n\t\tthis._pending.append(id);\n\t\treturn id;\n\t}\n\n\tclaim(limit = 1): readonly JobEnvelope<T>[] {\n\t\tconst max = requireNonNegativeInt(limit, \"job queue claim limit\");\n\t\tif (max === 0) return [];\n\t\tconst out: JobEnvelope<T>[] = [];\n\t\twhile (out.length < max) {\n\t\t\tconst snapshot = this.pending.get() as ReactiveListSnapshot<string>;\n\t\t\tconst ids = snapshot.value.items;\n\t\t\tif (ids.length === 0) break;\n\t\t\tconst id = this._pending.pop(0);\n\t\t\tconst job = this._jobs.get(id);\n\t\t\tif (!job || job.state !== \"queued\") continue;\n\t\t\tconst inflight: JobEnvelope<T> = {\n\t\t\t\t...job,\n\t\t\t\tstate: \"inflight\",\n\t\t\t\tattempts: job.attempts + 1,\n\t\t\t};\n\t\t\tthis._jobs.set(id, inflight);\n\t\t\tout.push(inflight);\n\t\t}\n\t\treturn out;\n\t}\n\n\tack(id: string): boolean {\n\t\tconst job = this._jobs.get(id);\n\t\tif (!job || job.state !== \"inflight\") return false;\n\t\tthis._jobs.delete(id);\n\t\treturn true;\n\t}\n\n\tnack(id: string, opts: { requeue?: boolean } = {}): boolean {\n\t\tconst job = this._jobs.get(id);\n\t\tif (!job || job.state !== \"inflight\") return false;\n\t\tif (opts.requeue ?? true) {\n\t\t\tthis._jobs.set(id, { ...job, state: \"queued\" });\n\t\t\tthis._pending.append(id);\n\t\t\treturn true;\n\t\t}\n\t\tthis._jobs.delete(id);\n\t\treturn true;\n\t}\n}\n\nexport type JobFlowOptions = {\n\tgraph?: GraphOptions;\n\tstages?: readonly string[];\n\tmaxPerPump?: number;\n};\n\nexport class JobFlowGraph<T> extends Graph {\n\tprivate readonly _stageNames: readonly string[];\n\tprivate readonly _queues = new Map<string, JobQueueGraph<T>>();\n\tprivate readonly _keepaliveDisposers: Array<() => void> = [];\n\tprivate readonly _completed;\n\treadonly completed: Node<ReactiveLogSnapshot<JobEnvelope<T>>>;\n\treadonly completedCount: Node<number>;\n\n\tconstructor(name: string, opts: JobFlowOptions = {}) {\n\t\tsuper(name, opts.graph);\n\t\tconst stages = (opts.stages ?? [\"incoming\", \"processing\", \"done\"]).map((v) => v.trim());\n\t\tif (stages.length < 2) {\n\t\t\tthrow new Error(`jobFlow(\"${name}\"): requires at least 2 stages`);\n\t\t}\n\t\tconst unique = new Set(stages);\n\t\tif (unique.size !== stages.length) {\n\t\t\tthrow new Error(`jobFlow(\"${name}\"): stage names must be unique`);\n\t\t}\n\t\tthis._stageNames = Object.freeze([...stages]);\n\t\tfor (const stage of this._stageNames) {\n\t\t\tconst q = jobQueue<T>(`${name}-${stage}`);\n\t\t\tthis._queues.set(stage, q);\n\t\t\tthis.mount(stage, q);\n\t\t}\n\t\tthis._completed = reactiveLog<JobEnvelope<T>>([], { name: \"completed\" });\n\t\tthis.completed = this._completed.entries;\n\t\tthis.add(\"completed\", this.completed);\n\t\tthis.completedCount = derived(\n\t\t\t[this.completed],\n\t\t\t([snapshot]) => (snapshot as ReactiveLogSnapshot<JobEnvelope<T>>).value.entries.length,\n\t\t\t{\n\t\t\t\tname: \"completedCount\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: messagingMeta(\"job_flow_completed_count\"),\n\t\t\t\tinitial: 0,\n\t\t\t},\n\t\t);\n\t\tthis.add(\"completedCount\", this.completedCount);\n\t\tthis.connect(\"completed\", \"completedCount\");\n\t\tthis._keepaliveDisposers.push(keepalive(this.completedCount));\n\n\t\tconst maxPerPump = Math.max(\n\t\t\t1,\n\t\t\trequireNonNegativeInt(opts.maxPerPump ?? DEFAULT_MAX_PER_PUMP, \"job flow maxPerPump\"),\n\t\t);\n\t\tfor (let i = 0; i < this._stageNames.length; i += 1) {\n\t\t\tconst stage = this._stageNames[i] as string;\n\t\t\tconst current = this.queue(stage);\n\t\t\tconst next =\n\t\t\t\ti + 1 < this._stageNames.length ? this.queue(this._stageNames[i + 1] as string) : null;\n\t\t\tconst pump = node<unknown>(\n\t\t\t\t[current.pending],\n\t\t\t\t() => {\n\t\t\t\t\tlet moved = 0;\n\t\t\t\t\twhile (moved < maxPerPump) {\n\t\t\t\t\t\tconst claim = current.claim(1);\n\t\t\t\t\t\tif (claim.length === 0) break;\n\t\t\t\t\t\tconst job = claim[0] as JobEnvelope<T>;\n\t\t\t\t\t\tif (!job) break;\n\t\t\t\t\t\tif (next) {\n\t\t\t\t\t\t\tnext.enqueue(job.payload, {\n\t\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\t...job.metadata,\n\t\t\t\t\t\t\t\t\tjob_flow_from: stage,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis._completed.append(job);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrent.ack(job.id);\n\t\t\t\t\t\tmoved += 1;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: `pump_${stage}`,\n\t\t\t\t\tdescribeKind: \"effect\",\n\t\t\t\t\tmeta: messagingMeta(\"job_flow_pump\"),\n\t\t\t\t},\n\t\t\t);\n\t\t\tthis.add(`pump_${stage}`, pump);\n\t\t\tthis.connect(`${stage}::pending`, `pump_${stage}`);\n\t\t\tthis._keepaliveDisposers.push(keepalive(pump));\n\t\t}\n\t}\n\n\toverride destroy(): void {\n\t\tfor (const dispose of this._keepaliveDisposers) dispose();\n\t\tthis._keepaliveDisposers.length = 0;\n\t\tsuper.destroy();\n\t}\n\n\tstages(): readonly string[] {\n\t\treturn this._stageNames;\n\t}\n\n\tqueue(stage: string): JobQueueGraph<T> {\n\t\tconst q = this._queues.get(stage);\n\t\tif (!q) throw new Error(`jobFlow(\"${this.name}\"): unknown stage \"${stage}\"`);\n\t\treturn q;\n\t}\n\n\tenqueue(payload: T, opts: { id?: string; metadata?: Record<string, unknown> } = {}): string {\n\t\treturn this.queue(this._stageNames[0] as string).enqueue(payload, opts);\n\t}\n\n\tretainedCompleted(): readonly JobEnvelope<T>[] {\n\t\tconst snapshot = this.completed.get() as ReactiveLogSnapshot<JobEnvelope<T>>;\n\t\treturn snapshot.value.entries;\n\t}\n}\n\nexport type TopicBridgeOptions<TIn, TOut> = {\n\tgraph?: GraphOptions;\n\tcursor?: number;\n\tmaxPerPump?: number;\n\tmap?: (value: TIn) => TOut | undefined;\n};\n\nexport class TopicBridgeGraph<TIn, TOut = TIn> extends Graph {\n\tprivate readonly _sourceSub;\n\tprivate readonly _target;\n\tprivate readonly _keepaliveDisposers: Array<() => void> = [];\n\treadonly bridgedCount: Node<number>;\n\n\tconstructor(\n\t\tname: string,\n\t\tsourceTopic: TopicGraph<TIn>,\n\t\ttargetTopic: TopicGraph<TOut>,\n\t\topts: TopicBridgeOptions<TIn, TOut> = {},\n\t) {\n\t\tsuper(name, opts.graph);\n\t\tthis._sourceSub = subscription<TIn>(`${name}-subscription`, sourceTopic, {\n\t\t\tcursor: opts.cursor,\n\t\t});\n\t\tthis._target = targetTopic;\n\t\tthis.mount(\"subscription\", this._sourceSub);\n\t\tthis.bridgedCount = state(0, {\n\t\t\tname: \"bridgedCount\",\n\t\t\tdescribeKind: \"state\",\n\t\t\tmeta: messagingMeta(\"topic_bridge_count\"),\n\t\t});\n\t\tthis.add(\"bridgedCount\", this.bridgedCount);\n\n\t\tconst maxPerPump = Math.max(\n\t\t\t1,\n\t\t\trequireNonNegativeInt(opts.maxPerPump ?? DEFAULT_MAX_PER_PUMP, \"topic bridge maxPerPump\"),\n\t\t);\n\t\tconst mapValue = opts.map ?? ((value: TIn) => value as unknown as TOut);\n\t\tconst pump = node<unknown>(\n\t\t\t[this._sourceSub.available],\n\t\t\t() => {\n\t\t\t\tconst available = this._sourceSub.pull(maxPerPump, { ack: true });\n\t\t\t\tif (available.length === 0) return;\n\t\t\t\tlet bridged = 0;\n\t\t\t\tfor (const value of available) {\n\t\t\t\t\tconst mapped = mapValue(value as TIn);\n\t\t\t\t\tif (mapped === undefined) continue;\n\t\t\t\t\tthis._target.publish(mapped);\n\t\t\t\t\tbridged += 1;\n\t\t\t\t}\n\t\t\t\tif (bridged > 0) {\n\t\t\t\t\tconst current = this.bridgedCount.get() as number;\n\t\t\t\t\tthis.bridgedCount.down([[DATA, current + bridged]]);\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"pump\",\n\t\t\t\tdescribeKind: \"effect\",\n\t\t\t\tmeta: messagingMeta(\"topic_bridge_pump\"),\n\t\t\t},\n\t\t);\n\t\tthis.add(\"pump\", pump);\n\t\tthis.connect(\"subscription::available\", \"pump\");\n\t\tthis._keepaliveDisposers.push(keepalive(pump));\n\t}\n\n\toverride destroy(): void {\n\t\tfor (const dispose of this._keepaliveDisposers) dispose();\n\t\tthis._keepaliveDisposers.length = 0;\n\t\tsuper.destroy();\n\t}\n}\n\n/**\n * Creates a Pulsar-inspired topic graph (append-only retained stream + latest value).\n */\nexport function topic<T>(name: string, opts?: TopicOptions): TopicGraph<T> {\n\treturn new TopicGraph<T>(name, opts);\n}\n\n/**\n * Creates a cursor-based subscription graph over a topic.\n */\nexport function subscription<T>(\n\tname: string,\n\ttopicGraph: TopicGraph<T>,\n\topts?: SubscriptionOptions,\n): SubscriptionGraph<T> {\n\treturn new SubscriptionGraph<T>(name, topicGraph, opts);\n}\n\n/**\n * Creates a Pulsar-inspired job queue graph with claim/ack/nack workflow.\n */\nexport function jobQueue<T>(name: string, opts?: JobQueueOptions): JobQueueGraph<T> {\n\treturn new JobQueueGraph<T>(name, opts);\n}\n\n/**\n * Creates an autonomous multi-stage queue chain graph.\n */\nexport function jobFlow<T>(name: string, opts?: JobFlowOptions): JobFlowGraph<T> {\n\treturn new JobFlowGraph<T>(name, opts);\n}\n\n/**\n * Creates an autonomous cursor-based topic relay graph.\n */\nexport function topicBridge<TIn, TOut = TIn>(\n\tname: string,\n\tsourceTopic: TopicGraph<TIn>,\n\ttargetTopic: TopicGraph<TOut>,\n\topts?: TopicBridgeOptions<TIn, TOut>,\n): TopicBridgeGraph<TIn, TOut> {\n\treturn new TopicBridgeGraph<TIn, TOut>(name, sourceTopic, targetTopic, opts);\n}\n","/**\n * Orchestration patterns (roadmap §4.1).\n *\n * Domain-layer helpers that build workflow shapes on top of core + extra primitives.\n * Exported under the `patterns.orchestration` namespace to avoid collisions with\n * Phase 2 operator names (for example `gate`, `forEach`).\n */\n\nimport { COMPLETE, DATA, ERROR, type Message, type Messages, RESOLVED } from \"../core/messages.js\";\nimport { type Node, type NodeActions, type NodeFn, type NodeOptions, node } from \"../core/node.js\";\nimport { GRAPH_META_SEGMENT, Graph, type GraphOptions } from \"../graph/graph.js\";\n\nexport type StepRef = string | Node<unknown>;\n\ntype OrchestrationMeta = {\n\torchestration?: true;\n\torchestration_type?: string;\n};\n\nexport type OrchestrationStepOptions = Omit<NodeOptions, \"describeKind\" | \"name\" | \"meta\"> & {\n\tdeps?: ReadonlyArray<StepRef>;\n\tmeta?: Record<string, unknown> & OrchestrationMeta;\n};\n\nexport type BranchResult<T> = {\n\tbranch: \"then\" | \"else\";\n\tvalue: T;\n};\n\nexport type SensorControls<T> = {\n\tnode: Node<T>;\n\tpush(value: T): void;\n\terror(err: unknown): void;\n\tcomplete(): void;\n};\n\nexport type LoopOptions = Omit<OrchestrationStepOptions, \"deps\"> & {\n\titerations?: number | StepRef;\n};\n\nexport type WaitOptions = Omit<OrchestrationStepOptions, \"deps\">;\n\nexport type SubPipelineBuilder = (sub: Graph) => void;\n\nfunction resolveDep(graph: Graph, dep: StepRef): { node: Node<unknown>; path?: string } {\n\tif (typeof dep === \"string\") {\n\t\treturn { node: graph.resolve(dep), path: dep };\n\t}\n\tconst path = findRegisteredNodePath(graph, dep);\n\tif (!path) {\n\t\tthrow new Error(\n\t\t\t\"orchestration dep node must already be registered in the graph so explicit edges can be recorded; pass a string path or register the node first\",\n\t\t);\n\t}\n\treturn { node: dep, path };\n}\n\nfunction findRegisteredNodePath(graph: Graph, target: Node<unknown>): string | undefined {\n\tconst described = graph.describe();\n\tconst metaSegment = `::${GRAPH_META_SEGMENT}::`;\n\tfor (const path of Object.keys(described.nodes).sort()) {\n\t\tif (path.includes(metaSegment)) continue;\n\t\ttry {\n\t\t\tif (graph.resolve(path) === target) return path;\n\t\t} catch {\n\t\t\t/* ignore stale path while scanning */\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction registerStep(\n\tgraph: Graph,\n\tname: string,\n\tstep: Node<unknown>,\n\tdepPaths: ReadonlyArray<string>,\n): void {\n\tgraph.add(name, step);\n\tfor (const path of depPaths) {\n\t\tgraph.connect(path, name);\n\t}\n}\n\nfunction baseMeta(kind: string, meta?: Record<string, unknown>): Record<string, unknown> {\n\treturn {\n\t\torchestration: true,\n\t\torchestration_type: kind,\n\t\t...(meta ?? {}),\n\t};\n}\n\nfunction coerceLoopIterations(raw: unknown): number {\n\tconst parseString = (value: string): number => {\n\t\tconst trimmed = value.trim();\n\t\tif (trimmed.length === 0) return 0;\n\t\treturn Number(trimmed);\n\t};\n\tlet parsed: number;\n\tif (typeof raw === \"string\") {\n\t\tparsed = parseString(raw);\n\t} else if (raw === null) {\n\t\tparsed = 0;\n\t} else {\n\t\tparsed = Number(raw);\n\t}\n\tif (!Number.isFinite(parsed)) return 1;\n\treturn Math.max(0, Math.trunc(parsed));\n}\n\n/**\n * Creates an orchestration graph container.\n */\nexport function pipeline(name: string, opts?: GraphOptions): Graph {\n\treturn new Graph(name, opts);\n}\n\n/**\n * Registers a workflow task node.\n */\nexport function task<T>(\n\tgraph: Graph,\n\tname: string,\n\trun: NodeFn<T>,\n\topts?: OrchestrationStepOptions,\n): Node<T> {\n\tconst depRefs = opts?.deps ?? [];\n\tconst deps = depRefs.map((dep) => resolveDep(graph, dep));\n\tconst { deps: _deps, ...nodeOpts } = opts ?? {};\n\tconst step = node<T>(\n\t\tdeps.map((d) => d.node),\n\t\trun,\n\t\t{\n\t\t\t...nodeOpts,\n\t\t\tname,\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"task\", opts?.meta),\n\t\t},\n\t);\n\tregisterStep(\n\t\tgraph,\n\t\tname,\n\t\tstep as unknown as Node<unknown>,\n\t\tdeps.flatMap((d) => (d.path ? [d.path] : [])),\n\t);\n\treturn step;\n}\n\n/**\n * Emits tagged branch outcomes (`then` / `else`) for each source value.\n */\nexport function branch<T>(\n\tgraph: Graph,\n\tname: string,\n\tsource: StepRef,\n\tpredicate: (value: T) => boolean,\n\topts?: Omit<OrchestrationStepOptions, \"deps\">,\n): Node<BranchResult<T>> {\n\tconst src = resolveDep(graph, source);\n\tconst step = node<BranchResult<T>>(\n\t\t[src.node],\n\t\t([value]) => ({\n\t\t\tbranch: predicate(value as T) ? \"then\" : \"else\",\n\t\t\tvalue: value as T,\n\t\t}),\n\t\t{\n\t\t\t...opts,\n\t\t\tname,\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"branch\", opts?.meta),\n\t\t},\n\t);\n\tregisterStep(graph, name, step as unknown as Node<unknown>, src.path ? [src.path] : []);\n\treturn step;\n}\n\n/**\n * Forwards source values only while `control` is truthy.\n */\nexport function gate<T>(\n\tgraph: Graph,\n\tname: string,\n\tsource: StepRef,\n\tcontrol: StepRef,\n\topts?: Omit<OrchestrationStepOptions, \"deps\">,\n): Node<T> {\n\tconst src = resolveDep(graph, source);\n\tconst ctrl = resolveDep(graph, control);\n\tconst step = node<T>(\n\t\t[src.node, ctrl.node],\n\t\t(_deps, actions) => {\n\t\t\tconst opened = ctrl.node.get();\n\t\t\tif (!opened) {\n\t\t\t\tactions.down([[RESOLVED]]);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn src.node.get() as T;\n\t\t},\n\t\t{\n\t\t\t...opts,\n\t\t\tname,\n\t\t\tdescribeKind: \"operator\",\n\t\t\tmeta: baseMeta(\"gate\", opts?.meta),\n\t\t},\n\t);\n\tregisterStep(\n\t\tgraph,\n\t\tname,\n\t\tstep as unknown as Node<unknown>,\n\t\t[src.path, ctrl.path].filter((v): v is string => typeof v === \"string\"),\n\t);\n\treturn step;\n}\n\nexport type ApprovalOptions = Omit<OrchestrationStepOptions, \"deps\"> & {\n\tisApproved?: (value: unknown) => boolean;\n};\n\n/**\n * Human/LLM approval gate over a source value.\n */\nexport function approval<T>(\n\tgraph: Graph,\n\tname: string,\n\tsource: StepRef,\n\tapprover: StepRef,\n\topts?: ApprovalOptions,\n): Node<T> {\n\tconst src = resolveDep(graph, source);\n\tconst ctrl = resolveDep(graph, approver);\n\tconst isApproved = opts?.isApproved ?? ((value: unknown) => Boolean(value));\n\tconst step = node<T>(\n\t\t[src.node, ctrl.node],\n\t\t(_deps, actions: NodeActions) => {\n\t\t\tif (!isApproved(ctrl.node.get())) {\n\t\t\t\tactions.down([[RESOLVED]]);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn src.node.get() as T;\n\t\t},\n\t\t{\n\t\t\t...opts,\n\t\t\tname,\n\t\t\tdescribeKind: \"operator\",\n\t\t\tmeta: baseMeta(\"approval\", opts?.meta),\n\t\t},\n\t);\n\tregisterStep(\n\t\tgraph,\n\t\tname,\n\t\tstep as unknown as Node<unknown>,\n\t\t[src.path, ctrl.path].filter((v): v is string => typeof v === \"string\"),\n\t);\n\treturn step;\n}\n\n/**\n * Registers a workflow side-effect step. The step remains graph-observable and forwards messages.\n */\nexport function forEach<T>(\n\tgraph: Graph,\n\tname: string,\n\tsource: StepRef,\n\trun: (value: T, actions: NodeActions) => void,\n\topts?: Omit<OrchestrationStepOptions, \"deps\">,\n): Node<T> {\n\tconst src = resolveDep(graph, source);\n\tlet terminated = false;\n\tconst step = node<T>([src.node], () => undefined, {\n\t\t...opts,\n\t\tname,\n\t\tdescribeKind: \"effect\",\n\t\tcompleteWhenDepsComplete: false,\n\t\tmeta: baseMeta(\"forEach\", opts?.meta),\n\t\tonMessage(msg: Message, depIndex: number, actions: NodeActions) {\n\t\t\tif (terminated) return true;\n\t\t\tif (depIndex !== 0) {\n\t\t\t\tactions.down([msg] satisfies Messages);\n\t\t\t\tif (msg[0] === COMPLETE || msg[0] === ERROR) terminated = true;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\ttry {\n\t\t\t\t\trun(msg[1] as T, actions);\n\t\t\t\t\tactions.down([msg] satisfies Messages);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tterminated = true;\n\t\t\t\t\tactions.down([[ERROR, err]] satisfies Messages);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tactions.down([msg] satisfies Messages);\n\t\t\tif (msg[0] === COMPLETE || msg[0] === ERROR) terminated = true;\n\t\t\treturn true;\n\t\t},\n\t});\n\tregisterStep(graph, name, step as unknown as Node<unknown>, src.path ? [src.path] : []);\n\treturn step;\n}\n\n/**\n * Registers a join step that emits a tuple of latest dependency values.\n */\nexport function join<T extends readonly unknown[]>(\n\tgraph: Graph,\n\tname: string,\n\tdeps: { [K in keyof T]: StepRef },\n\topts?: Omit<OrchestrationStepOptions, \"deps\">,\n): Node<T> {\n\tconst resolved = deps.map((dep) => resolveDep(graph, dep));\n\tconst step = node<T>(\n\t\tresolved.map((d) => d.node),\n\t\t(values) => values as T,\n\t\t{\n\t\t\t...opts,\n\t\t\tname,\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"join\", opts?.meta),\n\t\t},\n\t);\n\tregisterStep(\n\t\tgraph,\n\t\tname,\n\t\tstep as unknown as Node<unknown>,\n\t\tresolved.flatMap((d) => (d.path ? [d.path] : [])),\n\t);\n\treturn step;\n}\n\n/**\n * Registers a loop step that applies `iterate` to each source value N times.\n */\nexport function loop<T>(\n\tgraph: Graph,\n\tname: string,\n\tsource: StepRef,\n\titerate: (value: T, iteration: number, actions: NodeActions) => T,\n\topts?: LoopOptions,\n): Node<T> {\n\tconst src = resolveDep(graph, source);\n\tconst iterRef = opts?.iterations;\n\tconst iterDep =\n\t\ttypeof iterRef === \"number\" || iterRef === undefined ? undefined : resolveDep(graph, iterRef);\n\tconst staticIterations = typeof iterRef === \"number\" ? iterRef : undefined;\n\tconst step = node<T>(\n\t\titerDep ? [src.node, iterDep.node] : [src.node],\n\t\t(_deps, actions) => {\n\t\t\tlet current = src.node.get() as T;\n\t\t\tconst rawCount = staticIterations ?? iterDep?.node.get() ?? 1;\n\t\t\tconst count = coerceLoopIterations(rawCount);\n\t\t\tfor (let i = 0; i < count; i += 1) {\n\t\t\t\tcurrent = iterate(current, i, actions);\n\t\t\t}\n\t\t\treturn current;\n\t\t},\n\t\t{\n\t\t\t...opts,\n\t\t\tname,\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"loop\", opts?.meta),\n\t\t},\n\t);\n\tregisterStep(\n\t\tgraph,\n\t\tname,\n\t\tstep as unknown as Node<unknown>,\n\t\t[src.path, iterDep?.path].filter((v): v is string => typeof v === \"string\"),\n\t);\n\treturn step;\n}\n\n/**\n * Mounts and returns a child workflow graph.\n */\nexport function subPipeline(\n\tgraph: Graph,\n\tname: string,\n\tchildOrBuild?: Graph | SubPipelineBuilder,\n\topts?: GraphOptions,\n): Graph {\n\tconst child = childOrBuild instanceof Graph ? childOrBuild : pipeline(name, opts);\n\tif (typeof childOrBuild === \"function\") {\n\t\tchildOrBuild(child);\n\t}\n\tgraph.mount(name, child);\n\treturn child;\n}\n\n/**\n * Registers a producer-style sensor source and returns imperative controls.\n */\nexport function sensor<T>(\n\tgraph: Graph,\n\tname: string,\n\tinitial?: T,\n\topts?: Omit<NodeOptions, \"name\" | \"describeKind\" | \"meta\"> & {\n\t\tmeta?: Record<string, unknown>;\n\t},\n): SensorControls<T> {\n\tconst source = node<T>([], () => undefined, {\n\t\t...opts,\n\t\tname,\n\t\tinitial,\n\t\tdescribeKind: \"producer\",\n\t\tmeta: baseMeta(\"sensor\", opts?.meta),\n\t});\n\tregisterStep(graph, name, source as unknown as Node<unknown>, []);\n\treturn {\n\t\tnode: source,\n\t\tpush(value: T) {\n\t\t\tsource.down([[DATA, value]] satisfies Messages);\n\t\t},\n\t\terror(err: unknown) {\n\t\t\tsource.down([[ERROR, err]] satisfies Messages);\n\t\t},\n\t\tcomplete() {\n\t\t\tsource.down([[COMPLETE]] satisfies Messages);\n\t\t},\n\t};\n}\n\n/**\n * Registers a delayed-forwarding step (value-level wait).\n */\nexport function wait<T>(\n\tgraph: Graph,\n\tname: string,\n\tsource: StepRef,\n\tms: number,\n\topts?: WaitOptions,\n): Node<T> {\n\tconst src = resolveDep(graph, source);\n\tconst timers = new Set<ReturnType<typeof setTimeout>>();\n\tlet terminated = false;\n\tlet completed = false;\n\tconst step = node<T>(\n\t\t[src.node],\n\t\t() => {\n\t\t\tfor (const id of timers) clearTimeout(id);\n\t\t\ttimers.clear();\n\t\t\treturn () => {\n\t\t\t\tfor (const id of timers) clearTimeout(id);\n\t\t\t\ttimers.clear();\n\t\t\t\tterminated = true;\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\t...opts,\n\t\t\tname,\n\t\t\tinitial: src.node.get() as T,\n\t\t\tdescribeKind: \"operator\",\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tmeta: baseMeta(\"wait\", opts?.meta),\n\t\t\tonMessage(msg: Message, depIndex: number, actions: NodeActions) {\n\t\t\t\tif (terminated) return true;\n\t\t\t\tif (depIndex !== 0) {\n\t\t\t\t\tactions.down([msg] satisfies Messages);\n\t\t\t\t\tif (msg[0] === COMPLETE || msg[0] === ERROR) terminated = true;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === DATA) {\n\t\t\t\t\tconst id = setTimeout(() => {\n\t\t\t\t\t\ttimers.delete(id);\n\t\t\t\t\t\tactions.down([msg] satisfies Messages);\n\t\t\t\t\t\tif (completed && timers.size === 0) {\n\t\t\t\t\t\t\tactions.down([[COMPLETE]] satisfies Messages);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, ms);\n\t\t\t\t\ttimers.add(id);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\tterminated = true;\n\t\t\t\t\tcompleted = true;\n\t\t\t\t\tif (timers.size === 0) {\n\t\t\t\t\t\tactions.down([[COMPLETE]] satisfies Messages);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === ERROR) {\n\t\t\t\t\tterminated = true;\n\t\t\t\t\tfor (const id of timers) clearTimeout(id);\n\t\t\t\t\ttimers.clear();\n\t\t\t\t\tactions.down([msg] satisfies Messages);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tactions.down([msg] satisfies Messages);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t},\n\t);\n\tregisterStep(graph, name, step as unknown as Node<unknown>, src.path ? [src.path] : []);\n\treturn step;\n}\n\n/**\n * Registers an error-recovery step for a source.\n */\nexport function onFailure<T>(\n\tgraph: Graph,\n\tname: string,\n\tsource: StepRef,\n\trecover: (err: unknown, actions: NodeActions) => T,\n\topts?: Omit<OrchestrationStepOptions, \"deps\">,\n): Node<T> {\n\tconst src = resolveDep(graph, source);\n\tlet terminated = false;\n\tconst step = node<T>([src.node], () => undefined, {\n\t\t...opts,\n\t\tname,\n\t\tdescribeKind: \"operator\",\n\t\tcompleteWhenDepsComplete: false,\n\t\tmeta: baseMeta(\"onFailure\", opts?.meta),\n\t\tonMessage(msg: Message, _depIndex: number, actions: NodeActions) {\n\t\t\tif (terminated) return true;\n\t\t\tif (msg[0] === ERROR) {\n\t\t\t\ttry {\n\t\t\t\t\tactions.emit(recover(msg[1], actions));\n\t\t\t\t} catch (err) {\n\t\t\t\t\tterminated = true;\n\t\t\t\t\tactions.down([[ERROR, err]] satisfies Messages);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tactions.down([msg] satisfies Messages);\n\t\t\tif (msg[0] === COMPLETE) terminated = true;\n\t\t\treturn true;\n\t\t},\n\t});\n\tregisterStep(graph, name, step as unknown as Node<unknown>, src.path ? [src.path] : []);\n\treturn step;\n}\n","/**\n * GraphRefly — public API surface.\n */\nexport const version = \"0.0.0\";\n\nexport * from \"./compat/index.js\";\nexport * as compat from \"./compat/index.js\";\n// Named re-exports enable finer-grained tree-shaking for consumers.\nexport * from \"./core/index.js\";\n// Keep namespace exports for ergonomic grouped imports.\nexport * as core from \"./core/index.js\";\nexport * from \"./extra/index.js\";\nexport * as extra from \"./extra/index.js\";\nexport * from \"./graph/index.js\";\nexport * as graph from \"./graph/index.js\";\nexport * from \"./patterns/index.js\";\nexport * as patterns from \"./patterns/index.js\";\n"],"mappings":"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","names":["atom","map","node","map","pull","atom","node","pull","useStore","useSubscribe","useSubscribeRecord","useSubscribe","node","useStore","useSubscribeRecord","useStore","useSubscribe","useSubscribeRecord","useSubscribe","node","useStore","useSubscribeRecord","useStore","useSubscribe","useSubscribeRecord","computed","useSubscribe","node","useStore","computed","useSubscribeRecord","node","policy","out","filter","interval","node","keepalive","buffer","keepalive","baseMeta","policy","node","_","VALID_NODE_TYPES","stripFences","feedback","keepalive","forEach","gate","baseMeta","gate","forEach"]}
1
+ {"version":3,"sources":["../src/compat/index.ts","../src/compat/jotai/index.ts","../src/compat/nanostores/index.ts","../src/compat/react/index.ts","../src/compat/signals/index.ts","../src/compat/solid/index.ts","../src/compat/svelte/index.ts","../src/compat/vue/index.ts","../src/compat/zustand/index.ts","../src/patterns/index.ts","../src/patterns/ai.ts","../src/patterns/memory.ts","../src/patterns/demo-shell.ts","../src/patterns/domain-templates.ts","../src/patterns/reduction.ts","../src/patterns/graphspec.ts","../src/patterns/messaging.ts","../src/patterns/orchestration.ts","../src/index.ts"],"sourcesContent":["/**\n * Compat layer: compatibility wrappers for other state management libraries (Phase 5.1b).\n *\n * Framework adapters are optional peers. Install only what you use:\n * - `@graphrefly/graphrefly-ts/compat/react` -> `react`, `react-dom`\n * - `@graphrefly/graphrefly-ts/compat/vue` -> `vue`\n * - `@graphrefly/graphrefly-ts/compat/svelte` -> `svelte`\n * - `@graphrefly/graphrefly-ts/compat/solid` -> `solid-js`\n */\nexport * as jotai from \"./jotai/index.js\";\nexport * as nanostores from \"./nanostores/index.js\";\nexport * as nestjs from \"./nestjs/index.js\";\nexport * as react from \"./react/index.js\";\nexport * as signals from \"./signals/index.js\";\nexport * as solid from \"./solid/index.js\";\nexport * as svelte from \"./svelte/index.js\";\nexport * as vue from \"./vue/index.js\";\nexport * as zustand from \"./zustand/index.js\";\n","import { dynamicNode } from \"../../core/dynamic-node.js\";\nimport { DATA, ERROR, type Messages } from \"../../core/messages.js\";\nimport type { Node } from \"../../core/node.js\";\nimport { state } from \"../../core/sugar.js\";\n\n/**\n * Options for creating an atom.\n *\n * @category compat\n */\nexport interface AtomOptions {\n\t/** Optional identifier for the underlying node. */\n\tname?: string;\n\t/** Optional companion meta nodes. */\n\tmeta?: Record<string, unknown>;\n}\n\n/**\n * A read-only Jotai-compatible atom.\n *\n * @category compat\n */\nexport interface ReadableAtom<T> {\n\t/** Returns the current cached value. */\n\tget(): T;\n\t/** Subscribes to value changes. Returns an unsubscribe function. */\n\tsubscribe(callback: (value: T) => void): () => void;\n\t/** Access to companion meta nodes. */\n\treadonly meta: Record<string, Node>;\n\t/** @internal The underlying GraphReFly node. */\n\t_node: Node<T>;\n}\n\n/**\n * A writable Jotai-compatible atom.\n *\n * @category compat\n */\nexport interface WritableAtom<T> extends ReadableAtom<T> {\n\t/** Sets a new value. */\n\tset(value: T): void;\n\t/** Updates the value using a transformation function. */\n\tupdate(fn: (current: T) => T): void;\n}\n\n/** Function type for reading other atoms inside a derived atom. */\nexport type GetFn = <V>(a: ReadableAtom<V>) => V;\n/** Function type for writing to other atoms inside a writable derived atom. */\nexport type SetFn = <V>(a: WritableAtom<V>, value: V) => void;\n\n/** Function that computes the atom's value. */\nexport type ReadFn<T> = (get: GetFn) => T;\n/** Function that handles writes to the atom. */\nexport type WriteFn<T> = (get: GetFn, set: SetFn, value: T) => void;\n\n/**\n * Creates a Jotai-compatible atom built on GraphReFly primitives.\n *\n * Supports three overloads:\n * 1. `atom(initial)` — Writable primitive atom (wraps `state()`).\n * 2. `atom(read)` — Read-only derived atom (wraps `dynamicNode()`).\n * 3. `atom(read, write)` — Writable derived atom.\n *\n * @param initialOrRead - Initial value or a read function.\n * @param writeOrOptions - Write function or options object.\n * @param options - Optional configuration.\n * @returns WritableAtom or ReadableAtom.\n *\n * @example\n * ```ts\n * const count = atom(0);\n * count.set(1);\n * const doubled = atom((get) => get(count)! * 2);\n * ```\n *\n * @category compat\n */\nexport function atom<T>(initial: T, options?: AtomOptions): WritableAtom<T>;\nexport function atom<T>(read: ReadFn<T>, options?: AtomOptions): ReadableAtom<T>;\nexport function atom<T>(read: ReadFn<T>, write: WriteFn<T>, options?: AtomOptions): WritableAtom<T>;\nexport function atom<T>(\n\tinitialOrRead: T | ReadFn<T>,\n\twriteOrOptions?: WriteFn<T> | AtomOptions,\n\toptions?: AtomOptions,\n): ReadableAtom<T> | WritableAtom<T> {\n\tif (typeof initialOrRead === \"function\") {\n\t\tconst read = initialOrRead as ReadFn<T>;\n\t\tif (typeof writeOrOptions === \"function\") {\n\t\t\treturn createDerivedAtom(read, writeOrOptions as WriteFn<T>, options);\n\t\t}\n\t\treturn createDerivedAtom(read, undefined, writeOrOptions as AtomOptions);\n\t}\n\n\treturn createPrimitiveAtom(initialOrRead as T, writeOrOptions as AtomOptions);\n}\n\nfunction pull<T>(n: Node<T>): T {\n\tlet val: T | undefined = n.get();\n\tlet err: any;\n\tconst unsub = n.subscribe((msgs: Messages) => {\n\t\tfor (const [t, v] of msgs) {\n\t\t\tif (t === DATA) val = v as T;\n\t\t\tif (t === ERROR) err = v;\n\t\t}\n\t});\n\tunsub();\n\tif (err) throw err;\n\treturn val as T;\n}\n\nfunction createPrimitiveAtom<T>(initial: T, options?: AtomOptions): WritableAtom<T> {\n\tconst n = state(initial, {\n\t\t...options,\n\t\tresubscribable: true,\n\t\tresetOnTeardown: true,\n\t});\n\treturn {\n\t\tget: () => {\n\t\t\tif (n.status === \"disconnected\") {\n\t\t\t\treturn pull(n);\n\t\t\t}\n\t\t\treturn n.get() as T;\n\t\t},\n\t\tset: (value: T) => n.down([[DATA, value]]),\n\t\tupdate: (fn: (current: T) => T) => {\n\t\t\tconst current = n.status === \"disconnected\" ? pull(n) : (n.get() as T);\n\t\t\tn.down([[DATA, fn(current)]]);\n\t\t},\n\t\tsubscribe: (cb: (value: T) => void) => {\n\t\t\treturn n.subscribe((msgs: Messages) => {\n\t\t\t\tfor (const [t, v] of msgs) {\n\t\t\t\t\tif (t === DATA) cb(v as T);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tmeta: n.meta,\n\t\t_node: n,\n\t};\n}\n\nfunction createDerivedAtom<T>(\n\tread: ReadFn<T>,\n\twrite?: WriteFn<T>,\n\toptions?: AtomOptions,\n): ReadableAtom<T> | WritableAtom<T> {\n\tconst n = dynamicNode(\n\t\t(get) =>\n\t\t\tread(<V>(a: ReadableAtom<V>) => {\n\t\t\t\tconst dn = a._node;\n\t\t\t\tif (dn.status === \"disconnected\") {\n\t\t\t\t\tpull(dn);\n\t\t\t\t}\n\t\t\t\treturn get(dn) as V;\n\t\t\t}),\n\t\t{\n\t\t\t...options,\n\t\t\tresubscribable: true,\n\t\t\tresetOnTeardown: true,\n\t\t},\n\t);\n\n\tconst result: ReadableAtom<T> = {\n\t\tget: () => {\n\t\t\tif (n.status === \"disconnected\") {\n\t\t\t\treturn pull(n);\n\t\t\t}\n\t\t\treturn n.get() as T;\n\t\t},\n\t\tsubscribe: (cb: (value: T) => void) => {\n\t\t\treturn n.subscribe((msgs: Messages) => {\n\t\t\t\tfor (const [t, v] of msgs) {\n\t\t\t\t\tif (t === DATA) cb(v as T);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tmeta: n.meta,\n\t\t_node: n,\n\t};\n\n\tif (write) {\n\t\tconst getFn: GetFn = <V>(a: ReadableAtom<V>) => a.get();\n\t\tconst setFn: SetFn = <V>(a: WritableAtom<V>, value: V) => a.set(value);\n\n\t\tconst writable = result as WritableAtom<T>;\n\t\twritable.set = (value: T) => write(getFn, setFn, value);\n\t\twritable.update = (fn: (current: T) => T) => {\n\t\t\tconst current = n.status === \"disconnected\" ? pull(n) : (n.get() as T);\n\t\t\treturn write(getFn, setFn, fn(current));\n\t\t};\n\t\treturn writable;\n\t}\n\n\treturn result;\n}\n","import { batch } from \"../../core/batch.js\";\nimport { type DynGet, dynamicNode } from \"../../core/dynamic-node.js\";\nimport { DATA, ERROR, type Messages } from \"../../core/messages.js\";\nimport type { Node } from \"../../core/node.js\";\nimport { state } from \"../../core/sugar.js\";\n\n/**\n * A Nanostores-compatible atom.\n *\n * @category compat\n */\nexport interface NanoAtom<T> {\n\t/** Get current value. */\n\tget(): T;\n\t/** Set a new value (writable atoms only). */\n\tset(value: T): void;\n\t/** Subscribe to value changes. Callback receives the new value.\n\t * Returns unsubscribe function. Called immediately with current value. */\n\tsubscribe(cb: (value: T) => void): () => void;\n\t/** Listen to value changes (no immediate call). Returns unsubscribe. */\n\tlisten(cb: (value: T) => void): () => void;\n\t/** The underlying GraphReFly node. */\n\treadonly _node: Node<T>;\n}\n\n/**\n * A Nanostores-compatible computed store.\n *\n * @category compat\n */\nexport interface NanoComputed<T> {\n\t/** Get current value. */\n\tget(): T;\n\t/** Subscribe to value changes. Called immediately with current value.\n\t * Returns unsubscribe function. */\n\tsubscribe(cb: (value: T) => void): () => void;\n\t/** Listen to value changes (no immediate call). Returns unsubscribe. */\n\tlisten(cb: (value: T) => void): () => void;\n\t/** The underlying GraphReFly node. */\n\treadonly _node: Node<T>;\n}\n\n/**\n * A Nanostores-compatible map.\n *\n * @category compat\n */\nexport interface NanoMap<T extends Record<string, unknown>> extends NanoAtom<T> {\n\t/** Set a single key. */\n\tsetKey<K extends keyof T>(key: K, value: T[K]): void;\n}\n\nconst START_LISTENERS = new WeakMap<Node<any>, Set<() => void>>();\nconst STOP_LISTENERS = new WeakMap<Node<any>, Set<() => void>>();\n\nfunction trigger(node: Node<any>, map: WeakMap<Node<any>, Set<() => void>>) {\n\tconst callbacks = map.get(node);\n\tif (callbacks) {\n\t\tfor (const cb of callbacks) cb();\n\t}\n}\n\nfunction createStore<T>(node: Node<T>, extra: any = {}): any {\n\tlet listeners = 0;\n\tconst store = {\n\t\t...extra,\n\t\tget: () => getVal(node),\n\t\tsubscribe: (cb: (value: T) => void) => {\n\t\t\tif (listeners === 0) trigger(node, START_LISTENERS);\n\t\t\tlisteners++;\n\t\t\tconst sub = node.subscribe((msgs: Messages) => {\n\t\t\t\tfor (const [t, v] of msgs) {\n\t\t\t\t\tif (t === DATA) cb(v as T);\n\t\t\t\t}\n\t\t\t});\n\t\t\tcb(getVal(node));\n\t\t\treturn () => {\n\t\t\t\tsub();\n\t\t\t\tlisteners--;\n\t\t\t\tif (listeners === 0) trigger(node, STOP_LISTENERS);\n\t\t\t};\n\t\t},\n\t\tlisten: (cb: (value: T) => void) => {\n\t\t\tif (listeners === 0) trigger(node, START_LISTENERS);\n\t\t\tlisteners++;\n\t\t\tconst sub = node.subscribe((msgs: Messages) => {\n\t\t\t\tfor (const [t, v] of msgs) {\n\t\t\t\t\tif (t === DATA) cb(v as T);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tsub();\n\t\t\t\tlisteners--;\n\t\t\t\tif (listeners === 0) trigger(node, STOP_LISTENERS);\n\t\t\t};\n\t\t},\n\t\t_node: node,\n\t};\n\treturn store;\n}\n\nfunction pull<T>(n: Node<T>): T {\n\tlet val: T | undefined = n.get();\n\tlet err: any;\n\tconst unsub = n.subscribe((msgs: Messages) => {\n\t\tfor (const [t, v] of msgs) {\n\t\t\tif (t === DATA) val = v as T;\n\t\t\tif (t === ERROR) err = v;\n\t\t}\n\t});\n\tunsub();\n\tif (err) throw err;\n\treturn val as T;\n}\n\nfunction getVal<T>(n: Node<T>): T {\n\tif (n.status === \"disconnected\") {\n\t\treturn pull(n);\n\t}\n\treturn n.get() as T;\n}\n\n/**\n * Creates a nanostores-compatible atom.\n *\n * @param initial - Initial value.\n * @returns `NanoAtom<T>`\n *\n * @category compat\n */\nexport function atom<T>(initial: T): NanoAtom<T> {\n\tconst n = state<T>(initial, {\n\t\tresubscribable: true,\n\t\tresetOnTeardown: true,\n\t});\n\n\treturn createStore(n, {\n\t\tset: (value: T) => n.down([[DATA, value]]),\n\t});\n}\n\n/**\n * Creates a nanostores-compatible computed store.\n *\n * @param stores - One or more atoms/computed stores.\n * @param fn - Compute function.\n * @returns `NanoComputed<T>`\n *\n * @category compat\n */\nexport function computed<T, A>(\n\tstoreA: NanoAtom<A> | NanoComputed<A>,\n\tfn: (a: A) => T,\n): NanoComputed<T>;\nexport function computed<T, A, B>(\n\tstores: [NanoAtom<A> | NanoComputed<A>, NanoAtom<B> | NanoComputed<B>],\n\tfn: (a: A, b: B) => T,\n): NanoComputed<T>;\nexport function computed<T, A, B, C>(\n\tstores: [\n\t\tNanoAtom<A> | NanoComputed<A>,\n\t\tNanoAtom<B> | NanoComputed<B>,\n\t\tNanoAtom<C> | NanoComputed<C>,\n\t],\n\tfn: (a: A, b: B, c: C) => T,\n): NanoComputed<T>;\nexport function computed<T>(stores: any, fn: (...args: any[]) => T): NanoComputed<T> {\n\tconst storeArray: Array<NanoAtom<any> | NanoComputed<any>> = Array.isArray(stores)\n\t\t? stores\n\t\t: [stores];\n\n\tconst n = dynamicNode(\n\t\t(get: DynGet) => {\n\t\t\tconst vals = storeArray.map((s) => {\n\t\t\t\tconst node = s._node;\n\t\t\t\tif (node.status === \"disconnected\") {\n\t\t\t\t\tpull(node);\n\t\t\t\t}\n\t\t\t\treturn get(node);\n\t\t\t});\n\t\t\treturn fn(...vals);\n\t\t},\n\t\t{\n\t\t\tresubscribable: true,\n\t\t\tresetOnTeardown: true,\n\t\t\tequals: Object.is as any,\n\t\t},\n\t);\n\n\treturn createStore(n);\n}\n\n/**\n * Creates a nanostores-compatible map.\n *\n * @param initial - Initial object value.\n * @returns `NanoMap<T>`\n *\n * @category compat\n */\nexport function map<T extends Record<string, unknown>>(initial: T): NanoMap<T> {\n\tconst n = state<T>(initial, {\n\t\tresubscribable: true,\n\t\tresetOnTeardown: true,\n\t\tequals: () => false,\n\t});\n\n\treturn createStore(n, {\n\t\tset: (value: T) => n.down([[DATA, value]]),\n\t\tsetKey: <K extends keyof T>(key: K, value: T[K]) => {\n\t\t\tconst current = getVal(n);\n\t\t\tn.down([[DATA, { ...current, [key]: value }]]);\n\t\t},\n\t});\n}\n\n/**\n * Returns the current value of the store.\n *\n * @category compat\n */\nexport function getValue<T>(store: NanoAtom<T> | NanoComputed<T>): T {\n\treturn store.get();\n}\n\n/**\n * Adds a listener for the store start (first listener connected).\n *\n * @category compat\n */\nexport function onStart(store: NanoAtom<any> | NanoComputed<any>, cb: () => void): void {\n\tconst node = store._node;\n\tlet callbacks = START_LISTENERS.get(node);\n\tif (!callbacks) {\n\t\tcallbacks = new Set();\n\t\tSTART_LISTENERS.set(node, callbacks);\n\t}\n\tcallbacks.add(cb);\n}\n\n/**\n * Adds a listener for the store stop (last listener disconnected).\n *\n * @category compat\n */\nexport function onStop(store: NanoAtom<any> | NanoComputed<any>, cb: () => void): void {\n\tconst node = store._node;\n\tlet callbacks = STOP_LISTENERS.get(node);\n\tif (!callbacks) {\n\t\tcallbacks = new Set();\n\t\tSTOP_LISTENERS.set(node, callbacks);\n\t}\n\tcallbacks.add(cb);\n}\n\n/**\n * Adds a listener for the store mount (first listener connected).\n *\n * @returns A cleanup function called when the last listener is removed.\n * @category compat\n */\nexport function onMount(\n\tstore: NanoAtom<any> | NanoComputed<any>,\n\tcb: () => (() => void) | undefined,\n): void {\n\tonStart(store, () => {\n\t\tconst stop = cb();\n\t\tif (typeof stop === \"function\") onStop(store, stop);\n\t});\n}\n\n/**\n * Batches multiple store updates.\n *\n * @category compat\n */\nexport function action<Args extends any[], Return>(\n\t_store: NanoAtom<any> | NanoComputed<any>,\n\t_name: string,\n\tfn: (...args: Args) => Return,\n): (...args: Args) => Return {\n\treturn (...args: Args) => {\n\t\tlet result: any;\n\t\tbatch(() => {\n\t\t\tresult = fn(...args);\n\t\t});\n\t\treturn result as Return;\n\t};\n}\n","// ---------------------------------------------------------------------------\n// React bindings — useStore / useSubscribe\n// ---------------------------------------------------------------------------\n// Bridges GraphReFly nodes into React via useSyncExternalStore.\n// Works with any Node<T>, including companion nodes (node.meta.status).\n//\n// Usage:\n// import { useStore, useSubscribe } from '@graphrefly/graphrefly-ts/compat/react';\n// // Optional peer install (only for this adapter): pnpm add react react-dom\n// const value = useSubscribe(myNode); // T | undefined (read-only)\n// const [count, setCount] = useStore(counter); // [T | undefined, setter]\n// ---------------------------------------------------------------------------\n\nimport { useCallback, useMemo, useRef, useSyncExternalStore } from \"react\";\nimport { DATA, DIRTY, type Messages, messageTier } from \"../../core/messages.js\";\nimport type { Node } from \"../../core/node.js\";\n\n/**\n * Subscribe to a read-only `Node<T>` as a React value. Re-renders on node value settlement.\n * Subscription lifecycle is tied to React mount/unmount (not node terminal messages).\n *\n * @param node - Any `Node<T>`.\n * @returns `T | undefined` — the current node value, kept in sync via `useSyncExternalStore`.\n */\nexport function useSubscribe<T>(node: Node<T>): T | undefined {\n\treturn useSyncExternalStore(\n\t\t(onStoreChange) => {\n\t\t\tlet disposed = false;\n\t\t\tconst unsub = node.subscribe(() => {\n\t\t\t\tif (!disposed) onStoreChange();\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tdisposed = true;\n\t\t\t\tunsub();\n\t\t\t};\n\t\t},\n\t\t() => node.get(),\n\t\t() => node.get(), // Server snapshot\n\t);\n}\n\n/**\n * Bind a writable `Node<T>` as a React `[value, setter]` tuple.\n * Setting the value always pushes `[[DIRTY], [DATA, value]]`, including `value === undefined`.\n * Subscription lifecycle is tied to React mount/unmount (not node terminal messages).\n *\n * @param node - A `Node<T>` (e.g. state node).\n * @returns `[T | undefined, (value: T) => void]` — current value and setter function.\n */\nexport function useStore<T>(node: Node<T>): [T | undefined, (value: T) => void] {\n\tconst value = useSubscribe(node);\n\tconst setter = useCallback(\n\t\t(v: T) => {\n\t\t\tnode.down([[DIRTY], [DATA, v]]);\n\t\t},\n\t\t[node],\n\t);\n\treturn [value, setter];\n}\n\n/** Maps a key to an object of nodes. Used by `useSubscribeRecord`. */\nexport type NodeFactory<K, R extends Record<string, any>> = (key: K) => {\n\t[P in keyof R]: Node<R[P]>;\n};\n\n/**\n * Subscribe to a dynamic set of keyed node records.\n * Re-subscribes all per-key fields whenever `keysNode` changes.\n * Key re-sync is gated to settled batches (`messageTier >= 2`) to avoid DIRTY-phase churn.\n * Guaranteed to clean up strictly with React hook lifecycle, utilizing no global mappings.\n *\n * @param keysNode - Node of current keys (e.g. node IDs)\n * @param factory - Function returning `{ [field]: Node<V> }` for each key.\n * @returns `Record<K, R>` — snapshot of resolved values for all keys.\n */\nexport function useSubscribeRecord<K extends string, R extends Record<string, any>>(\n\tkeysNode: Node<K[]>,\n\tfactory: NodeFactory<K, R>,\n): Record<K, R> {\n\tconst factoryRef = useRef(factory);\n\tfactoryRef.current = factory;\n\n\tconst store = useMemo(() => {\n\t\tconst computeSnap = () => {\n\t\t\tconst snap = {} as Record<K, R>;\n\t\t\tconst keys = keysNode.get() ?? [];\n\t\t\tfor (const key of keys) {\n\t\t\t\tconst nodes = factoryRef.current(key);\n\t\t\t\tconst values = {} as R;\n\t\t\t\tfor (const field of Object.keys(nodes) as (keyof R)[]) {\n\t\t\t\t\tvalues[field] = nodes[field].get() as R[keyof R];\n\t\t\t\t}\n\t\t\t\tsnap[key] = values;\n\t\t\t}\n\t\t\treturn snap;\n\t\t};\n\n\t\tlet currentSnapshot = computeSnap();\n\n\t\treturn {\n\t\t\tsubscribe: (onStoreChange: () => void) => {\n\t\t\t\tlet disposed = false;\n\t\t\t\tlet entrySubs: Array<() => void> = [];\n\n\t\t\t\tconst cleanupEntries = () => {\n\t\t\t\t\tfor (const unsub of entrySubs) unsub();\n\t\t\t\t\tentrySubs = [];\n\t\t\t\t};\n\n\t\t\t\tconst sync = (nextKeys: K[]) => {\n\t\t\t\t\tcleanupEntries();\n\t\t\t\t\tfor (const key of nextKeys) {\n\t\t\t\t\t\tconst nodes = factoryRef.current(key);\n\t\t\t\t\t\tfor (const field of Object.keys(nodes) as (keyof R)[]) {\n\t\t\t\t\t\t\tconst unsub = nodes[field].subscribe(() => {\n\t\t\t\t\t\t\t\tcurrentSnapshot = computeSnap();\n\t\t\t\t\t\t\t\tif (!disposed) onStoreChange();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tentrySubs.push(unsub);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcurrentSnapshot = computeSnap();\n\t\t\t\t\tif (!disposed) onStoreChange();\n\t\t\t\t};\n\n\t\t\t\tconst keysUnsub = keysNode.subscribe((msgs: Messages) => {\n\t\t\t\t\tconst hasSettled = msgs.some((m) => messageTier(m[0]) >= 2);\n\t\t\t\t\tif (!disposed && hasSettled) sync(keysNode.get() ?? []);\n\t\t\t\t});\n\t\t\t\tsync(keysNode.get() ?? []);\n\n\t\t\t\treturn () => {\n\t\t\t\t\tdisposed = true;\n\t\t\t\t\tkeysUnsub();\n\t\t\t\t\tcleanupEntries();\n\t\t\t\t};\n\t\t\t},\n\t\t\tgetSnapshot: () => currentSnapshot,\n\t\t};\n\t}, [keysNode]);\n\n\treturn useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);\n}\n","import { batch } from \"../../core/batch.js\";\nimport { type DynGet, dynamicNode } from \"../../core/dynamic-node.js\";\nimport { COMPLETE, DATA, DIRTY, ERROR, type Messages } from \"../../core/messages.js\";\nimport type { Node } from \"../../core/node.js\";\nimport { state } from \"../../core/sugar.js\";\n\n/**\n * Options for creating signals.\n *\n * @category compat\n */\nexport interface SignalOptions {\n\t/** Optional identifier for the underlying node. */\n\tname?: string;\n\t/** Custom equality function for change detection. */\n\tequals?: (a: any, b: any) => boolean;\n}\n\n/**\n * Common interface for all reactive signals.\n *\n * @category compat\n */\nexport interface AnySignal<T> {\n\t/** Returns the current value of the signal. */\n\tget(): T;\n\t/** @internal The underlying GraphReFly node. */\n\t_node: Node<T>;\n}\n\n/**\n * Global stack of active tracking contexts.\n * Since computation evaluation is fully synchronous, we push the tracking `get`\n * function before execution and pop it after. This prevents memory leaks without\n * needing WeakRefs, as the stack is always empty when idle.\n */\nconst trackingStack: DynGet[] = [];\n\n/**\n * Helper to pull a disconnected node, forcing a synchronous resolution\n * cycle so that `get()` returns a fresh value even if the signal is unmounted.\n */\nfunction pull<T>(n: Node<T>): T {\n\tlet val: T | undefined = n.get();\n\tconst unsub = n.subscribe((msgs: Messages) => {\n\t\tfor (const [t, v] of msgs) {\n\t\t\tif (t === DATA) val = v as T;\n\t\t}\n\t});\n\tunsub();\n\treturn val as T;\n}\n\n/**\n * TC39 `Signal.State` — a writable signal backed by a GraphReFly `state` node.\n * Automatically registers itself as a dependency if read inside a `Computed`.\n *\n * @example\n * ```ts\n * const count = new Signal.State(0);\n * count.get(); // 0\n * count.set(1);\n * count.get(); // 1\n * ```\n */\nclass SignalState<T> implements AnySignal<T> {\n\t/** @internal */\n\t_node: Node<T>;\n\tprivate readonly _equals: (a: T, b: T) => boolean;\n\n\tconstructor(initial: T, opts?: SignalOptions) {\n\t\tthis._equals = (opts?.equals ?? Object.is) as (a: T, b: T) => boolean;\n\t\tthis._node = state<T>(initial, {\n\t\t\t...opts,\n\t\t\tresubscribable: true,\n\t\t\tresetOnTeardown: true,\n\t\t});\n\t}\n\n\tget(): T {\n\t\t// If we are evaluating inside a computed node, track this read!\n\t\tconst tracker = trackingStack[trackingStack.length - 1];\n\t\tif (tracker) {\n\t\t\tif (this._node.status === \"disconnected\") {\n\t\t\t\tpull(this._node);\n\t\t\t}\n\t\t\treturn tracker(this._node) as T;\n\t\t}\n\n\t\tif (this._node.status === \"disconnected\") {\n\t\t\treturn pull(this._node);\n\t\t}\n\t\treturn this._node.get() as T;\n\t}\n\n\tset(value: T): void {\n\t\tif (this._equals(this.get(), value)) return;\n\t\tbatch(() => {\n\t\t\tthis._node.down([[DIRTY], [DATA, value]]);\n\t\t});\n\t}\n}\n\n/**\n * TC39 `Signal.Computed` — a read-only signal backed by `dynamicNode`.\n * Automatically tracks dependencies when `get()` is called on other signals\n * during its computation.\n *\n * @example\n * ```ts\n * const count = new Signal.State(0);\n * const doubled = new Signal.Computed(() => count.get() * 2);\n * ```\n */\nclass SignalComputed<T> implements AnySignal<T> {\n\t/** @internal */\n\t_node: Node<T>;\n\n\tconstructor(computation: () => T, opts?: SignalOptions) {\n\t\tthis._node = dynamicNode<T>(\n\t\t\t(get) => {\n\t\t\t\ttrackingStack.push(get);\n\t\t\t\ttry {\n\t\t\t\t\treturn computation();\n\t\t\t\t} finally {\n\t\t\t\t\ttrackingStack.pop();\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\t...opts,\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tresubscribable: true,\n\t\t\t\tresetOnTeardown: true,\n\t\t\t},\n\t\t);\n\t}\n\n\tget(): T {\n\t\t// Computed nodes can themselves be dependencies of other Computed nodes.\n\t\tconst tracker = trackingStack[trackingStack.length - 1];\n\t\tif (tracker) {\n\t\t\tif (this._node.status === \"disconnected\") {\n\t\t\t\tpull(this._node);\n\t\t\t}\n\t\t\treturn tracker(this._node) as T;\n\t\t}\n\n\t\tif (this._node.status === \"disconnected\") {\n\t\t\treturn pull(this._node);\n\t\t}\n\t\treturn this._node.get() as T;\n\t}\n}\n\n/**\n * TC39 Signals-compatible namespace. Wraps GraphReFly primitives.\n * Provides auto-tracking conforming to the TS39 signals proposal.\n *\n * @category compat\n */\nexport const Signal = {\n\tState: SignalState,\n\tComputed: SignalComputed,\n\n\t/**\n\t * Subscribes to changes on a signal.\n\t * Returns an unsubscribe callback.\n\t *\n\t * @example\n\t * ```ts\n\t * const count = new Signal.State(0);\n\t * const unsub = Signal.sub(count, v => console.log(v));\n\t * ```\n\t */\n\tsub: <T>(\n\t\tsignal: AnySignal<T>,\n\t\tcallback:\n\t\t\t| ((value: T) => void)\n\t\t\t| {\n\t\t\t\t\tdata?: (value: T) => void;\n\t\t\t\t\terror?: (err: unknown) => void;\n\t\t\t\t\tcomplete?: () => void;\n\t\t\t },\n\t): (() => void) => {\n\t\tconst handlers =\n\t\t\ttypeof callback === \"function\"\n\t\t\t\t? { data: callback as (value: T) => void, error: undefined, complete: undefined }\n\t\t\t\t: callback;\n\t\treturn signal._node.subscribe((msgs) => {\n\t\t\tfor (const [t, v] of msgs) {\n\t\t\t\tif (t === DATA) handlers.data?.(v as T);\n\t\t\t\tif (t === ERROR) handlers.error?.(v);\n\t\t\t\tif (t === COMPLETE) handlers.complete?.();\n\t\t\t}\n\t\t});\n\t},\n} as const;\n\nexport type { SignalComputed, SignalState };\n","// ---------------------------------------------------------------------------\n// Solid bindings — useSubscribe / useStore\n// ---------------------------------------------------------------------------\n// Bridges GraphReFly nodes into Solid reactivity via createSignal.\n// Works with any Node<T>, including companion nodes (node.meta.status).\n//\n// Usage:\n// import { useSubscribe, useStore } from '@graphrefly/graphrefly-ts/compat/solid';\n// // Optional peer install (only for this adapter): pnpm add solid-js\n// const status = useSubscribe(wsStatusNode); // Accessor<string | undefined>\n// const [count, setCount] = useStore(countNode); // [Accessor<number | undefined>, Setter]\n// ---------------------------------------------------------------------------\n\nimport { createSignal, getOwner, onCleanup } from \"solid-js\";\nimport { DATA, DIRTY, type Messages, messageTier } from \"../../core/messages.js\";\nimport type { Node } from \"../../core/node.js\";\n\n/** Solid accessor function — returns current value when called. */\nexport type Accessor<T> = () => T;\n\n/**\n * Subscribe to a `Node<T>` as a Solid signal. Auto-cleans up with the owning scope.\n * Subscription lifecycle is tied to Solid scope cleanup (not node terminal messages).\n */\nexport function useSubscribe<T>(node: Node<T>): Accessor<T | undefined> {\n\tconst [value, setValue] = createSignal(node.get(), { equals: false });\n\n\tconst unsub = node.subscribe(() => {\n\t\tsetValue(() => node.get());\n\t});\n\n\tif (getOwner()) {\n\t\tonCleanup(() => unsub());\n\t} else if (typeof console !== \"undefined\") {\n\t\tconsole.warn(\n\t\t\t\"[graphrefly-ts] useSubscribe called outside a Solid reactive owner — subscription will not be auto-disposed.\",\n\t\t);\n\t}\n\n\treturn value;\n}\n\n/**\n * Bind a writable `Node<T>` as a Solid resource tuple `[accessor, setter]`.\n * Setter always forwards `[[DIRTY], [DATA, value]]`, including `value === undefined`.\n * Subscription lifecycle is tied to Solid scope cleanup (not node terminal messages).\n */\nexport function useStore<T>(node: Node<T>): [Accessor<T | undefined>, (v: T) => void] {\n\tconst value = useSubscribe(node);\n\tconst setter = (v: T) => {\n\t\tnode.down([[DIRTY], [DATA, v]]);\n\t};\n\treturn [value, setter];\n}\n\n/** Maps a key to an object of nodes. Used by `useSubscribeRecord`. */\nexport type NodeFactory<K, R extends Record<string, any>> = (key: K) => {\n\t[P in keyof R]: Node<R[P]>;\n};\n\n/**\n * Subscribe to a dynamic set of keyed node records as a Solid accessor.\n * Re-subscribes all per-key fields whenever `keys` changes.\n * Key re-sync is gated to settled batches (`messageTier >= 2`) to avoid DIRTY-phase churn.\n */\nexport function useSubscribeRecord<K extends string, R extends Record<string, any>>(\n\tkeysNode: Node<K[]>,\n\tfactory: NodeFactory<K, R>,\n): Accessor<Record<K, R>> {\n\tconst [value, setValue] = createSignal({} as Record<K, R>, { equals: false });\n\tlet entrySubs: Array<() => void> = [];\n\n\tconst cleanupEntries = () => {\n\t\tfor (const unsub of entrySubs) unsub();\n\t\tentrySubs = [];\n\t};\n\n\tconst buildSnapshot = (): Record<K, R> => {\n\t\tconst snap = {} as Record<K, R>;\n\t\tfor (const key of keysNode.get() ?? []) {\n\t\t\tconst nodes = factory(key);\n\t\t\tconst values = {} as R;\n\t\t\tfor (const field of Object.keys(nodes) as (keyof R)[]) {\n\t\t\t\tvalues[field] = nodes[field].get() as R[keyof R];\n\t\t\t}\n\t\t\tsnap[key] = values;\n\t\t}\n\t\treturn snap;\n\t};\n\n\tconst sync = (nextKeys: K[]) => {\n\t\tcleanupEntries();\n\t\tfor (const key of nextKeys) {\n\t\t\tconst nodes = factory(key);\n\t\t\tfor (const field of Object.keys(nodes) as (keyof R)[]) {\n\t\t\t\tconst unsub = nodes[field].subscribe(() => {\n\t\t\t\t\tsetValue(() => buildSnapshot());\n\t\t\t\t});\n\t\t\t\tentrySubs.push(unsub);\n\t\t\t}\n\t\t}\n\t\tsetValue(() => buildSnapshot());\n\t};\n\n\tconst keysUnsub = keysNode.subscribe((msgs: Messages) => {\n\t\tif (msgs.some((m) => messageTier(m[0]) >= 2)) {\n\t\t\tsync(keysNode.get() ?? []);\n\t\t}\n\t});\n\tsync(keysNode.get() ?? []);\n\n\tif (getOwner()) {\n\t\tonCleanup(() => {\n\t\t\tkeysUnsub();\n\t\t\tcleanupEntries();\n\t\t});\n\t} else if (typeof console !== \"undefined\") {\n\t\tconsole.warn(\n\t\t\t\"[graphrefly-ts] useSubscribeRecord called outside a Solid reactive owner — subscription will not be auto-disposed.\",\n\t\t);\n\t}\n\n\treturn value;\n}\n","// ---------------------------------------------------------------------------\n// Svelte bindings — useSubscribe / useStore\n// ---------------------------------------------------------------------------\n// Bridges GraphReFly nodes into Svelte's store contract. Works with any\n// Node<T>, including companion nodes (node.meta.status).\n//\n// Usage:\n// import { useSubscribe, useStore } from '@graphrefly/graphrefly-ts/compat/svelte';\n// // Optional peer install (only for this adapter): pnpm add svelte\n// const status = useSubscribe(wsStatusNode); // Svelte readable store\n// const count = useStore(countNode); // Svelte writable store\n// // In template: $status, $count\n// // $count = 42\n// ---------------------------------------------------------------------------\n\nimport { DATA, DIRTY, type Messages, messageTier } from \"../../core/messages.js\";\nimport type { Node } from \"../../core/node.js\";\n\n/** Svelte store contract — implements the minimal `subscribe` method. */\nexport interface SvelteReadable<T> {\n\tsubscribe(run: (value: T) => void): () => void;\n}\n\n/** Svelte writable store contract. */\nexport interface SvelteWritable<T> extends SvelteReadable<T> {\n\tset(value: T): void;\n\tupdate(updater: (value: T) => T): void;\n}\n\n/**\n * Subscribe to a `Node<T>` as a Svelte readable store (implements Svelte store contract).\n * Subscription lifecycle is tied to Svelte store unsubscription (not node terminal messages).\n */\nexport function useSubscribe<T>(node: Node<T>): SvelteReadable<T | undefined> {\n\treturn {\n\t\tsubscribe(run: (value: T | undefined) => void): () => void {\n\t\t\tconst unsub = node.subscribe(() => {\n\t\t\t\trun(node.get());\n\t\t\t});\n\t\t\trun(node.get());\n\t\t\treturn unsub;\n\t\t},\n\t};\n}\n\n/**\n * Bind a writable `Node<T>` as a Svelte writable store.\n * Reads and writes adapt seamlessly.\n * Setter/update always forward `[[DIRTY], [DATA, value]]`, including `value === undefined`.\n * Subscription lifecycle is tied to Svelte store unsubscription (not node terminal messages).\n */\nexport function useStore<T>(node: Node<T>): SvelteWritable<T | undefined> {\n\treturn {\n\t\tsubscribe(run: (value: T | undefined) => void): () => void {\n\t\t\tconst unsub = node.subscribe(() => {\n\t\t\t\trun(node.get());\n\t\t\t});\n\t\t\trun(node.get());\n\t\t\treturn unsub;\n\t\t},\n\t\tset(value: T | undefined) {\n\t\t\tnode.down([[DIRTY], [DATA, value]]);\n\t\t},\n\t\tupdate(updater: (value: T | undefined) => T | undefined) {\n\t\t\tconst next = updater(node.get());\n\t\t\tnode.down([[DIRTY], [DATA, next]]);\n\t\t},\n\t};\n}\n\n/** Maps a key to an object of nodes. Used by `useSubscribeRecord`. */\nexport type NodeFactory<K, R extends Record<string, any>> = (key: K) => {\n\t[P in keyof R]: Node<R[P]>;\n};\n\n/**\n * Subscribe to a dynamic keyed record of nodes as a Svelte readable store.\n * Re-subscribes all per-key fields whenever `keysNode` changes.\n * Key re-sync is gated to settled batches (`messageTier >= 2`) to avoid DIRTY-phase churn.\n */\nexport function useSubscribeRecord<K extends string, R extends Record<string, any>>(\n\tkeysNode: Node<K[]>,\n\tfactory: NodeFactory<K, R>,\n): SvelteReadable<Record<K, R>> {\n\treturn {\n\t\tsubscribe(run: (value: Record<K, R>) => void): () => void {\n\t\t\tlet entrySubs: Array<() => void> = [];\n\n\t\t\tconst cleanupEntries = () => {\n\t\t\t\tfor (const unsub of entrySubs) unsub();\n\t\t\t\tentrySubs = [];\n\t\t\t};\n\n\t\t\tconst buildSnapshot = (): Record<K, R> => {\n\t\t\t\tconst snap = {} as Record<K, R>;\n\t\t\t\tfor (const key of keysNode.get() ?? []) {\n\t\t\t\t\tconst nodes = factory(key);\n\t\t\t\t\tconst values = {} as R;\n\t\t\t\t\tfor (const field of Object.keys(nodes) as (keyof R)[]) {\n\t\t\t\t\t\tvalues[field] = nodes[field].get() as R[keyof R];\n\t\t\t\t\t}\n\t\t\t\t\tsnap[key] = values;\n\t\t\t\t}\n\t\t\t\treturn snap;\n\t\t\t};\n\n\t\t\tconst sync = (nextKeys: K[]) => {\n\t\t\t\tcleanupEntries();\n\t\t\t\tfor (const key of nextKeys) {\n\t\t\t\t\tconst nodes = factory(key);\n\t\t\t\t\tfor (const field of Object.keys(nodes) as (keyof R)[]) {\n\t\t\t\t\t\tconst unsub = nodes[field].subscribe(() => {\n\t\t\t\t\t\t\trun(buildSnapshot());\n\t\t\t\t\t\t});\n\t\t\t\t\t\tentrySubs.push(unsub);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trun(buildSnapshot());\n\t\t\t};\n\n\t\t\tconst keysUnsub = keysNode.subscribe((msgs: Messages) => {\n\t\t\t\tif (msgs.some((m) => messageTier(m[0]) >= 2)) {\n\t\t\t\t\tsync(keysNode.get() ?? []);\n\t\t\t\t}\n\t\t\t});\n\t\t\tsync(keysNode.get() ?? []);\n\n\t\t\treturn () => {\n\t\t\t\tkeysUnsub();\n\t\t\t\tcleanupEntries();\n\t\t\t};\n\t\t},\n\t};\n}\n","// ---------------------------------------------------------------------------\n// Vue bindings — useStore / useSubscribe\n// ---------------------------------------------------------------------------\n// Bridges GraphReFly nodes into Vue reactivity. Works with any\n// Node<T>, including companion nodes (node.meta.status).\n//\n// Usage:\n// import { useStore, useSubscribe } from '@graphrefly/graphrefly-ts/compat/vue';\n// // Optional peer install (only for this adapter): pnpm add vue\n// const count = useStore(counterNode); // Ref<number | undefined> (read + write)\n// const status = useSubscribe(wsStatusNode); // Readonly<Ref<string | undefined>>\n// ---------------------------------------------------------------------------\n\nimport {\n\tcomputed,\n\tgetCurrentScope,\n\tisRef,\n\tonScopeDispose,\n\ttype Ref,\n\treadonly,\n\tshallowRef,\n\ttype WatchSource,\n\twatch,\n} from \"vue\";\nimport { DATA, DIRTY } from \"../../core/messages.js\";\nimport type { Node } from \"../../core/node.js\";\n\n/**\n * Subscribe to a read-only `Node<T>` as a Vue `Ref<T>`. Auto-unsubscribes on scope disposal.\n * Subscription lifecycle is tied to Vue scope disposal (not node terminal messages).\n */\nexport function useSubscribe<T>(node: Node<T>): Readonly<Ref<T | undefined>> {\n\tconst ref = shallowRef(node.get()) as Ref<T | undefined>;\n\n\tconst unsub = node.subscribe(() => {\n\t\tref.value = node.get();\n\t});\n\n\tif (getCurrentScope()) {\n\t\tonScopeDispose(() => unsub());\n\t} else if (typeof console !== \"undefined\") {\n\t\tconsole.warn(\n\t\t\t\"[graphrefly-ts] useSubscribe called outside a Vue scope — subscription will not be auto-disposed.\",\n\t\t);\n\t}\n\n\treturn readonly(ref) as Readonly<Ref<T | undefined>>;\n}\n\n/**\n * Bind a writable `Node<T>` as a Vue `Ref<T>`. Reads and writes are bidirectional.\n * Value sets always dispatch `[[DIRTY], [DATA, value]]`, including `value === undefined`.\n * Subscription lifecycle is tied to Vue scope disposal (not node terminal messages).\n */\nexport function useStore<T>(node: Node<T>): Ref<T | undefined> {\n\tconst inner = shallowRef(node.get()) as Ref<T | undefined>;\n\n\tconst unsub = node.subscribe(() => {\n\t\tinner.value = node.get();\n\t});\n\n\tif (getCurrentScope()) {\n\t\tonScopeDispose(() => unsub());\n\t} else if (typeof console !== \"undefined\") {\n\t\tconsole.warn(\n\t\t\t\"[graphrefly-ts] useStore called outside a Vue scope — subscription will not be auto-disposed.\",\n\t\t);\n\t}\n\n\treturn computed({\n\t\tget: () => inner.value,\n\t\tset: (v: T | undefined) => {\n\t\t\tnode.down([[DIRTY], [DATA, v]]);\n\t\t},\n\t});\n}\n\n/** Maps a key to an object of nodes. Used by `useSubscribeRecord` factory. */\nexport type NodeFactory<K, R extends Record<string, any>> = (key: K) => {\n\t[P in keyof R]: Node<R[P]>;\n};\n\n/**\n * Subscribe to a dynamic set of keyed node records. When keys change,\n * old subscriptions are torn down and new ones created automatically.\n * Must be called during Vue `setup()`.\n */\nexport function useSubscribeRecord<K extends string, R extends Record<string, any>>(\n\tkeys: WatchSource<K[] | undefined>,\n\tfactory: NodeFactory<K, R>,\n): Readonly<Ref<Record<K, R>>> {\n\tconst result = shallowRef<Record<K, R>>({} as Record<K, R>);\n\n\t// Track active subscriptions per key (strictly enclosed memory mapping)\n\tconst activeSubs = new Map<K, { subs: Array<() => void>; values: R }>();\n\tlet disposed = false;\n\n\tlet batchPending = false;\n\tfunction scheduleBatch() {\n\t\tif (batchPending) return;\n\t\tbatchPending = true;\n\t\tqueueMicrotask(() => {\n\t\t\tif (disposed) return;\n\t\t\tbatchPending = false;\n\t\t\tconst snap = {} as Record<K, R>;\n\t\t\tfor (const [key, entry] of activeSubs) {\n\t\t\t\tsnap[key] = { ...entry.values };\n\t\t\t}\n\t\t\tresult.value = snap;\n\t\t});\n\t}\n\n\tfunction sync(newKeys: K[]) {\n\t\tfor (const entry of activeSubs.values()) {\n\t\t\tfor (const unsub of entry.subs) unsub();\n\t\t}\n\t\tactiveSubs.clear();\n\n\t\tfor (const key of newKeys) {\n\t\t\tconst nodes = factory(key);\n\t\t\tconst fields = Object.keys(nodes) as (keyof R)[];\n\t\t\tconst values = {} as R;\n\t\t\tconst subs: Array<() => void> = [];\n\n\t\t\tfor (const field of fields) {\n\t\t\t\tconst node = nodes[field];\n\t\t\t\tvalues[field] = node.get() as R[keyof R];\n\t\t\t\tconst unsub = node.subscribe(() => {\n\t\t\t\t\tvalues[field] = node.get() as R[keyof R];\n\t\t\t\t\tscheduleBatch();\n\t\t\t\t});\n\t\t\t\tsubs.push(unsub);\n\t\t\t}\n\n\t\t\tactiveSubs.set(key, { subs, values });\n\t\t}\n\n\t\tconst snap = {} as Record<K, R>;\n\t\tfor (const [key, entry] of activeSubs) {\n\t\t\tsnap[key] = { ...entry.values };\n\t\t}\n\t\tresult.value = snap;\n\t}\n\n\tconst readKeys = (): K[] => {\n\t\tconst current = typeof keys === \"function\" ? keys() : isRef(keys) ? keys.value : keys;\n\t\treturn [...(current ?? [])];\n\t};\n\n\twatch(readKeys, (newKeys) => sync(newKeys ?? []), { immediate: true });\n\n\tif (getCurrentScope()) {\n\t\tonScopeDispose(() => {\n\t\t\tdisposed = true;\n\t\t\tfor (const entry of activeSubs.values()) {\n\t\t\t\tfor (const unsub of entry.subs) unsub();\n\t\t\t}\n\t\t\tactiveSubs.clear();\n\t\t});\n\t} else if (typeof console !== \"undefined\") {\n\t\tconsole.warn(\n\t\t\t\"[graphrefly-ts] useSubscribeRecord called outside a Vue scope — subscription will not be auto-disposed.\",\n\t\t);\n\t}\n\n\treturn readonly(result) as Readonly<Ref<Record<K, R>>>;\n}\n","import { DATA } from \"../../core/messages.js\";\nimport { state as stateNode } from \"../../core/sugar.js\";\nimport { Graph } from \"../../graph/graph.js\";\n\n/** Zustand-compatible Store API. */\nexport interface StoreApi<T> {\n\tgetState: () => T;\n\tsetState: (partial: T | Partial<T> | ((state: T) => T | Partial<T>), replace?: boolean) => void;\n\tgetInitialState: () => T;\n\tsubscribe: (listener: (state: T, prevState: T) => void) => () => void;\n\tdestroy: () => void;\n}\n\n/** Function type for initializing the store. */\nexport type StateCreator<T> = (\n\tset: StoreApi<T>[\"setState\"],\n\tget: StoreApi<T>[\"getState\"],\n\tapi: StoreApi<T>,\n) => T;\n\n/**\n * Creates a Zustand-compatible store backed by a GraphReFly state node.\n * returns an object that is both a Graph and a StoreApi.\n *\n * @example\n * ```ts\n * const store = create((set) => ({\n * count: 0,\n * inc: () => set((s) => ({ count: s.count + 1 }))\n * }));\n * store.getState().inc();\n * ```\n *\n * @category compat\n */\nexport function create<T extends object>(initializer: StateCreator<T>): Graph & StoreApi<T> {\n\tconst g = new Graph(\"zustand\");\n\tconst s = stateNode<T>(undefined as unknown as T, { name: \"state\" });\n\tg.add(\"state\", s);\n\n\tconst getState = () => s.get() as T;\n\tconst setState = (partial: any, replace?: boolean): void => {\n\t\tconst prev = getState();\n\t\tconst next = typeof partial === \"function\" ? partial(prev) : partial;\n\t\tconst nextState = replace ? next : { ...prev, ...next };\n\t\ts.down([[DATA, nextState]]);\n\t};\n\n\tconst api: StoreApi<T> = {\n\t\tgetState,\n\t\tsetState,\n\t\tgetInitialState: () => initialValue,\n\t\tsubscribe: (listener) => {\n\t\t\tlet prev = getState();\n\t\t\treturn s.subscribe((msgs) => {\n\t\t\t\tfor (const [t, v] of msgs) {\n\t\t\t\t\tif (t === DATA) {\n\t\t\t\t\t\tlistener(v as T, prev);\n\t\t\t\t\t\tprev = v as T;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tdestroy: g.destroy.bind(g),\n\t};\n\n\tconst initialValue = initializer(setState, getState, api);\n\ts.down([[DATA, initialValue]]);\n\n\treturn Object.assign(g, api);\n}\n","/**\n * Patterns layer: domain/solution helpers (Phase 4+).\n */\n\nexport * as ai from \"./ai.js\";\nexport * as cqrs from \"./cqrs.js\";\nexport * as demoShell from \"./demo-shell.js\";\nexport * as domainTemplates from \"./domain-templates.js\";\nexport * as graphspec from \"./graphspec.js\";\nexport * as memory from \"./memory.js\";\nexport * as messaging from \"./messaging.js\";\nexport * as orchestration from \"./orchestration.js\";\nexport * as layout from \"./reactive-layout/index.js\";\nexport * as reduction from \"./reduction.js\";\n","/**\n * AI surface patterns (roadmap §4.4).\n *\n * Domain-layer factories for LLM-backed agents, chat, tool registries, and\n * agentic memory. Composed from core + extra + Phase 3–4.3 primitives.\n */\n\nimport type { Actor } from \"../core/actor.js\";\nimport { batch } from \"../core/batch.js\";\nimport { monotonicNs } from \"../core/clock.js\";\nimport { COMPLETE, DATA, ERROR, TEARDOWN } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { derived, effect, producer, state } from \"../core/sugar.js\";\nimport {\n\ttype DistillBundle,\n\ttype DistillOptions,\n\tdistill,\n\ttype Extraction,\n} from \"../extra/composite.js\";\nimport { switchMap } from \"../extra/operators.js\";\nimport {\n\ttype ReactiveLogBundle,\n\ttype ReactiveLogSnapshot,\n\treactiveLog,\n} from \"../extra/reactive-log.js\";\nimport { fromAny, fromTimer, type NodeInput } from \"../extra/sources.js\";\nimport {\n\ttype AutoCheckpointAdapter,\n\tGraph,\n\ttype GraphAutoCheckpointHandle,\n\ttype GraphAutoCheckpointOptions,\n\ttype GraphOptions,\n\ttype GraphPersistSnapshot,\n} from \"../graph/graph.js\";\nimport {\n\tdecay,\n\ttype KnowledgeGraphGraph,\n\tknowledgeGraph,\n\ttype LightCollectionBundle,\n\tlightCollection,\n\ttype VectorIndexBundle,\n\ttype VectorSearchResult,\n\tvectorIndex,\n} from \"./memory.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A single chat message in a conversation. */\nexport type ChatMessage = {\n\treadonly role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n\treadonly content: string;\n\treadonly name?: string;\n\treadonly toolCallId?: string;\n\treadonly toolCalls?: readonly ToolCall[];\n\treadonly metadata?: Record<string, unknown>;\n};\n\n/** A tool invocation request from an LLM. */\nexport type ToolCall = {\n\treadonly id: string;\n\treadonly name: string;\n\treadonly arguments: Record<string, unknown>;\n};\n\n/** The response from an LLM invocation. */\nexport type LLMResponse = {\n\treadonly content: string;\n\treadonly toolCalls?: readonly ToolCall[];\n\treadonly usage?: { readonly inputTokens: number; readonly outputTokens: number };\n\treadonly finishReason?: string;\n\treadonly metadata?: Record<string, unknown>;\n};\n\n/** Provider-agnostic LLM client adapter protocol. */\nexport type LLMAdapter = {\n\tinvoke(messages: readonly ChatMessage[], opts?: LLMInvokeOptions): NodeInput<LLMResponse>;\n\tstream(messages: readonly ChatMessage[], opts?: LLMInvokeOptions): AsyncIterable<string>;\n};\n\nexport type LLMInvokeOptions = {\n\tmodel?: string;\n\ttemperature?: number;\n\tmaxTokens?: number;\n\ttools?: readonly ToolDefinition[];\n\tsystemPrompt?: string;\n\tsignal?: AbortSignal;\n};\n\n/** A tool definition for LLM consumption. */\nexport type ToolDefinition = {\n\treadonly name: string;\n\treadonly description: string;\n\treadonly parameters: Record<string, unknown>; // JSON Schema\n\treadonly handler: (args: Record<string, unknown>) => NodeInput<unknown>;\n\t/**\n\t * V0 version of the backing node at `knobsAsTools()` call time (§6.0b).\n\t * Snapshot — re-call `knobsAsTools()` to refresh.\n\t */\n\treadonly version?: { id: string; version: number };\n};\n\nexport type AgentLoopStatus = \"idle\" | \"thinking\" | \"acting\" | \"done\" | \"error\";\n\n// ---------------------------------------------------------------------------\n// Meta helpers\n// ---------------------------------------------------------------------------\n\ntype AIMeta = {\n\tai?: true;\n\tai_type?: string;\n};\n\nfunction aiMeta(kind: string, extra?: Record<string, unknown>): Record<string, unknown> {\n\treturn {\n\t\tai: true,\n\t\tai_type: kind,\n\t\t...(extra ?? {}),\n\t} satisfies AIMeta;\n}\n\nfunction keepalive(n: Node<unknown>): () => void {\n\treturn n.subscribe(() => undefined);\n}\n\nfunction isPromiseLike(x: unknown): x is PromiseLike<unknown> {\n\treturn x != null && typeof (x as PromiseLike<unknown>).then === \"function\";\n}\n\nfunction isNodeLike(x: unknown): x is Node<unknown> {\n\treturn (\n\t\ttypeof x === \"object\" &&\n\t\tx !== null &&\n\t\t\"subscribe\" in x &&\n\t\ttypeof (x as Node<unknown>).subscribe === \"function\" &&\n\t\t\"get\" in x &&\n\t\ttypeof (x as Node<unknown>).get === \"function\"\n\t);\n}\n\nfunction isAsyncIterableLike(x: unknown): x is AsyncIterable<unknown> {\n\treturn (\n\t\tx != null &&\n\t\ttypeof x === \"object\" &&\n\t\tSymbol.asyncIterator in x &&\n\t\ttypeof (x as AsyncIterable<unknown>)[Symbol.asyncIterator] === \"function\"\n\t);\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\n/** First settled `DATA` from a `Node` (do not pass plain strings — `fromAny` would iterate chars). */\nfunction firstDataFromNode(\n\tresolved: Node<unknown>,\n\topts?: { timeoutMs?: number },\n): Promise<unknown> {\n\t// Only trust get() when node is in settled state\n\tif ((resolved as { status?: string }).status === \"settled\") {\n\t\tconst immediate = resolved.get();\n\t\tif (immediate !== undefined) {\n\t\t\treturn Promise.resolve(immediate);\n\t\t}\n\t}\n\tconst timeoutMs = opts?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\treturn new Promise((resolve, reject) => {\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst cleanup = () => {\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t};\n\t\tconst unsub = resolved.subscribe((messages) => {\n\t\t\tfor (const msg of messages) {\n\t\t\t\tif (msg[0] === DATA) {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tunsub();\n\t\t\t\t\tresolve(msg[1]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === ERROR) {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tunsub();\n\t\t\t\t\treject(msg[1]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tunsub();\n\t\t\t\t\treject(new Error(\"firstDataFromNode: completed without producing a value\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\ttimer = setTimeout(() => {\n\t\t\tunsub();\n\t\t\treject(new Error(`firstDataFromNode: timed out after ${timeoutMs}ms`));\n\t\t}, timeoutMs);\n\t});\n}\n\n/** Await Promise-likes, then resolve `Node` / async-iterable inputs via `fromAny` + first `DATA`. */\nasync function resolveToolHandlerResult(value: unknown): Promise<unknown> {\n\tif (isPromiseLike(value)) {\n\t\treturn resolveToolHandlerResult(await value);\n\t}\n\tif (isNodeLike(value)) {\n\t\treturn firstDataFromNode(value);\n\t}\n\tif (isAsyncIterableLike(value)) {\n\t\treturn firstDataFromNode(fromAny(value as NodeInput<unknown>));\n\t}\n\treturn value;\n}\n\n// ---------------------------------------------------------------------------\n// fromLLM\n// ---------------------------------------------------------------------------\n\nexport type FromLLMOptions = {\n\tname?: string;\n\tmodel?: string;\n\ttemperature?: number;\n\tmaxTokens?: number;\n\ttools?: readonly ToolDefinition[];\n\tsystemPrompt?: string;\n};\n\n/**\n * Reactive LLM invocation adapter. Returns a derived node that re-invokes\n * the LLM whenever the messages dep changes.\n *\n * Uses `switchMap` internally — new invocations cancel stale in-flight ones.\n */\nexport function fromLLM(\n\tadapter: LLMAdapter,\n\tmessages: NodeInput<readonly ChatMessage[]>,\n\topts?: FromLLMOptions,\n): Node<LLMResponse | null> {\n\tconst msgsNode = fromAny(messages);\n\tconst result = switchMap(msgsNode, (msgs) => {\n\t\tif (!msgs || (msgs as readonly ChatMessage[]).length === 0) {\n\t\t\treturn state<LLMResponse | null>(null) as NodeInput<LLMResponse | null>;\n\t\t}\n\t\tconst tools = opts?.tools;\n\t\treturn adapter.invoke(msgs as readonly ChatMessage[], {\n\t\t\tmodel: opts?.model,\n\t\t\ttemperature: opts?.temperature,\n\t\t\tmaxTokens: opts?.maxTokens,\n\t\t\ttools,\n\t\t\tsystemPrompt: opts?.systemPrompt,\n\t\t}) as NodeInput<LLMResponse | null>;\n\t});\n\n\treturn result;\n}\n\n// ---------------------------------------------------------------------------\n// fromLLMStream\n// ---------------------------------------------------------------------------\n\nexport type FromLLMStreamOptions = FromLLMOptions;\n\n/**\n * Bundle returned by {@link fromLLMStream}. `node` is the reactive log of\n * token chunks; `dispose` tears down the internal effect and log.\n */\nexport type LLMStreamHandle = {\n\t/** Reactive log node accumulating token chunks. */\n\tnode: Node<ReactiveLogSnapshot<string>>;\n\t/** Tear down the internal effect, abort any in-flight stream, and release resources. */\n\tdispose: () => void;\n};\n\n/**\n * Streaming LLM invocation. Returns a `{ node, dispose }` bundle where\n * `node` is a `reactiveLog`-backed node that accumulates token chunks as\n * they arrive from `adapter.stream()`.\n *\n * An `effect` watches the messages input; new values abort the in-flight\n * stream and clear the log before starting a new one. Call `dispose()` to\n * tear down the effect and release resources.\n */\nexport function fromLLMStream(\n\tadapter: LLMAdapter,\n\tmessages: NodeInput<readonly ChatMessage[]>,\n\topts?: FromLLMStreamOptions,\n): LLMStreamHandle {\n\tconst msgsNode = fromAny(messages);\n\tlet controller: AbortController | undefined;\n\n\tconst log = reactiveLog<string>([], { name: opts?.name ?? \"llmStream\" });\n\n\tconst eff = effect([msgsNode], ([msgs]) => {\n\t\t// Abort any in-flight stream\n\t\tcontroller?.abort();\n\t\tlog.clear();\n\n\t\tconst chatMsgs = msgs as readonly ChatMessage[];\n\t\tif (!chatMsgs || chatMsgs.length === 0) return;\n\n\t\tcontroller = new AbortController();\n\t\tconst iter = adapter.stream(chatMsgs, {\n\t\t\tmodel: opts?.model,\n\t\t\ttemperature: opts?.temperature,\n\t\t\tmaxTokens: opts?.maxTokens,\n\t\t\ttools: opts?.tools,\n\t\t\tsystemPrompt: opts?.systemPrompt,\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tconst ctrl = controller;\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tfor await (const chunk of iter) {\n\t\t\t\t\tif (ctrl.signal.aborted) break;\n\t\t\t\t\tlog.append(chunk);\n\t\t\t\t}\n\t\t\t} catch (_err) {\n\t\t\t\t// Stream errors are silently absorbed when aborted.\n\t\t\t\t// Non-abort errors are also absorbed — surfacing ERROR on\n\t\t\t\t// a state node (log.entries) would violate terminal semantics.\n\t\t\t\t// Callers needing error visibility should wrap with a meta node.\n\t\t\t}\n\t\t})();\n\n\t\treturn () => {\n\t\t\tctrl.abort();\n\t\t};\n\t});\n\tconst unsub = keepalive(eff);\n\n\treturn {\n\t\tnode: log.entries,\n\t\tdispose() {\n\t\t\tcontroller?.abort();\n\t\t\tunsub();\n\t\t\teff.down([[TEARDOWN]]);\n\t\t},\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// promptNode\n// ---------------------------------------------------------------------------\n\nexport type PromptNodeOptions = {\n\tname?: string;\n\tmodel?: string;\n\ttemperature?: number;\n\tmaxTokens?: number;\n\t/** Output format — `\"json\"` attempts JSON.parse on the response. Default: `\"text\"`. */\n\tformat?: \"text\" | \"json\";\n\t/** Number of retries on transient errors. Default: 0. */\n\tretries?: number;\n\t/** Cache LLM responses for identical inputs. Default: false. */\n\tcache?: boolean;\n\tsystemPrompt?: string;\n\tmeta?: Record<string, unknown>;\n};\n\n/** Extract text content from an LLM response, handling various response shapes. */\nfunction extractContent(resp: unknown): string {\n\tif (resp != null && typeof resp === \"object\" && \"content\" in resp) {\n\t\treturn String((resp as LLMResponse).content);\n\t}\n\tif (typeof resp === \"string\") return resp;\n\treturn String(resp);\n}\n\n/**\n * Universal LLM transform: wraps a prompt template + model adapter into a reactive derived node.\n * Re-invokes the LLM whenever any dep changes. Suitable for triage, QA, hypothesis, parity, etc.\n *\n * @param adapter - LLM adapter (provider-agnostic).\n * @param deps - Input nodes whose values feed the prompt.\n * @param prompt - Static string or template function receiving dep values.\n * @param opts - Optional configuration.\n * @returns `Node` emitting LLM responses (string or parsed JSON).\n */\nexport function promptNode<T = string>(\n\tadapter: LLMAdapter,\n\tdeps: readonly Node<unknown>[],\n\tprompt: string | ((...depValues: unknown[]) => string),\n\topts?: PromptNodeOptions,\n): Node<T | null> {\n\tconst format = opts?.format ?? \"text\";\n\tconst retries = opts?.retries ?? 0;\n\tconst useCache = opts?.cache ?? false;\n\tconst cache = useCache ? new Map<string, T>() : null;\n\n\tconst messagesNode = derived<readonly ChatMessage[]>(\n\t\tdeps as Node<unknown>[],\n\t\t(values) => {\n\t\t\tconst text = typeof prompt === \"string\" ? prompt : prompt(...values);\n\t\t\tconst msgs: ChatMessage[] = [];\n\t\t\tif (opts?.systemPrompt) msgs.push({ role: \"system\", content: opts.systemPrompt });\n\t\t\tmsgs.push({ role: \"user\", content: text });\n\t\t\treturn msgs;\n\t\t},\n\t\t{\n\t\t\tname: opts?.name ? `${opts.name}::messages` : \"prompt_node::messages\",\n\t\t\tmeta: aiMeta(\"prompt_node\"),\n\t\t},\n\t);\n\n\tconst result = switchMap<readonly ChatMessage[], T | null>(messagesNode, (msgs) => {\n\t\tif (!msgs || msgs.length === 0) {\n\t\t\treturn state<T | null>(null) as NodeInput<T | null>;\n\t\t}\n\n\t\tconst cacheKey = useCache ? JSON.stringify(msgs.map((m) => [m.role, m.content])) : \"\";\n\t\tif (cache?.has(cacheKey)) {\n\t\t\treturn state<T | null>(cache.get(cacheKey)!) as NodeInput<T | null>;\n\t\t}\n\n\t\tasync function attempt(remaining: number): Promise<T | null> {\n\t\t\ttry {\n\t\t\t\tconst resp = await new Promise<LLMResponse>((resolve, reject) => {\n\t\t\t\t\tconst input = adapter.invoke(msgs, {\n\t\t\t\t\t\tmodel: opts?.model,\n\t\t\t\t\t\ttemperature: opts?.temperature,\n\t\t\t\t\t\tmaxTokens: opts?.maxTokens,\n\t\t\t\t\t\tsystemPrompt: opts?.systemPrompt,\n\t\t\t\t\t});\n\t\t\t\t\t// NodeInput may be a Node, Promise, or raw value\n\t\t\t\t\tif (input && typeof (input as PromiseLike<LLMResponse>).then === \"function\") {\n\t\t\t\t\t\t(input as PromiseLike<LLMResponse>).then(resolve, reject);\n\t\t\t\t\t} else if (input && typeof (input as Node<LLMResponse>).get === \"function\") {\n\t\t\t\t\t\tresolve((input as Node<LLMResponse>).get() as LLMResponse);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolve(input as LLMResponse);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tconst content = extractContent(resp);\n\t\t\t\tlet parsed: T;\n\t\t\t\tif (format === \"json\") {\n\t\t\t\t\tparsed = JSON.parse(stripFences(content)) as T;\n\t\t\t\t} else {\n\t\t\t\t\tparsed = content as unknown as T;\n\t\t\t\t}\n\t\t\t\tcache?.set(cacheKey, parsed);\n\t\t\t\treturn parsed;\n\t\t\t} catch (err) {\n\t\t\t\tif (remaining > 0) return attempt(remaining - 1);\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\n\t\treturn attempt(retries) as NodeInput<T | null>;\n\t});\n\n\treturn result;\n}\n\n// ---------------------------------------------------------------------------\n// chatStream\n// ---------------------------------------------------------------------------\n\nexport type ChatStreamOptions = {\n\tgraph?: GraphOptions;\n\tmaxMessages?: number;\n};\n\nexport class ChatStreamGraph extends Graph {\n\tprivate readonly _log: ReactiveLogBundle<ChatMessage>;\n\tprivate readonly _keepaliveSubs: Array<() => void> = [];\n\treadonly messages: Node<ReactiveLogSnapshot<ChatMessage>>;\n\treadonly latest: Node<ChatMessage | undefined>;\n\treadonly messageCount: Node<number>;\n\n\tconstructor(name: string, opts: ChatStreamOptions = {}) {\n\t\tsuper(name, opts.graph);\n\n\t\tthis._log = reactiveLog<ChatMessage>([], {\n\t\t\tname: \"messages\",\n\t\t\tmaxSize: opts.maxMessages,\n\t\t});\n\t\tthis.messages = this._log.entries;\n\t\tthis.add(\"messages\", this.messages);\n\n\t\tthis.latest = derived<ChatMessage | undefined>(\n\t\t\t[this.messages],\n\t\t\t([snapshot]) => {\n\t\t\t\tconst entries = (snapshot as ReactiveLogSnapshot<ChatMessage>).value.entries;\n\t\t\t\treturn entries.length === 0 ? undefined : entries[entries.length - 1];\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"latest\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: aiMeta(\"chat_latest\"),\n\t\t\t\tinitial: undefined,\n\t\t\t},\n\t\t);\n\t\tthis.add(\"latest\", this.latest);\n\t\tthis.connect(\"messages\", \"latest\");\n\t\tthis._keepaliveSubs.push(keepalive(this.latest));\n\n\t\tthis.messageCount = derived<number>(\n\t\t\t[this.messages],\n\t\t\t([snapshot]) => (snapshot as ReactiveLogSnapshot<ChatMessage>).value.entries.length,\n\t\t\t{\n\t\t\t\tname: \"messageCount\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: aiMeta(\"chat_message_count\"),\n\t\t\t\tinitial: 0,\n\t\t\t},\n\t\t);\n\t\tthis.add(\"messageCount\", this.messageCount);\n\t\tthis.connect(\"messages\", \"messageCount\");\n\t\tthis._keepaliveSubs.push(keepalive(this.messageCount));\n\t}\n\n\tappend(role: ChatMessage[\"role\"], content: string, extra?: Partial<ChatMessage>): void {\n\t\tthis._log.append({ role, content, ...extra });\n\t}\n\n\tappendToolResult(callId: string, content: string): void {\n\t\tthis._log.append({ role: \"tool\", content, toolCallId: callId });\n\t}\n\n\tclear(): void {\n\t\tthis._log.clear();\n\t}\n\n\tallMessages(): readonly ChatMessage[] {\n\t\treturn (this.messages.get() as ReactiveLogSnapshot<ChatMessage>).value.entries;\n\t}\n\n\toverride destroy(): void {\n\t\tfor (const unsub of this._keepaliveSubs) unsub();\n\t\tthis._keepaliveSubs.length = 0;\n\t\tsuper.destroy();\n\t}\n}\n\nexport function chatStream(name: string, opts?: ChatStreamOptions): ChatStreamGraph {\n\treturn new ChatStreamGraph(name, opts);\n}\n\n// ---------------------------------------------------------------------------\n// toolRegistry\n// ---------------------------------------------------------------------------\n\nexport type ToolRegistryOptions = {\n\tgraph?: GraphOptions;\n};\n\nexport class ToolRegistryGraph extends Graph {\n\treadonly definitions: Node<ReadonlyMap<string, ToolDefinition>>;\n\treadonly schemas: Node<readonly ToolDefinition[]>;\n\tprivate readonly _keepaliveSubs: Array<() => void> = [];\n\n\tconstructor(name: string, opts: ToolRegistryOptions = {}) {\n\t\tsuper(name, opts.graph);\n\n\t\tthis.definitions = state<ReadonlyMap<string, ToolDefinition>>(new Map(), {\n\t\t\tname: \"definitions\",\n\t\t\tdescribeKind: \"state\",\n\t\t\tmeta: aiMeta(\"tool_definitions\"),\n\t\t});\n\t\tthis.add(\"definitions\", this.definitions);\n\n\t\tthis.schemas = derived<readonly ToolDefinition[]>(\n\t\t\t[this.definitions],\n\t\t\t([defs]) => [...((defs ?? new Map()) as ReadonlyMap<string, ToolDefinition>).values()],\n\t\t\t{\n\t\t\t\tname: \"schemas\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: aiMeta(\"tool_schemas\"),\n\t\t\t\tinitial: [],\n\t\t\t},\n\t\t);\n\t\tthis.add(\"schemas\", this.schemas);\n\t\tthis.connect(\"definitions\", \"schemas\");\n\t\tthis._keepaliveSubs.push(keepalive(this.schemas));\n\t}\n\n\tregister(tool: ToolDefinition): void {\n\t\tconst current = this.definitions.get() as ReadonlyMap<string, ToolDefinition>;\n\t\tconst next = new Map(current);\n\t\tnext.set(tool.name, tool);\n\t\tthis.definitions.down([[DATA, next]]);\n\t}\n\n\tunregister(name: string): void {\n\t\tconst current = this.definitions.get() as ReadonlyMap<string, ToolDefinition>;\n\t\tif (!current.has(name)) return;\n\t\tconst next = new Map(current);\n\t\tnext.delete(name);\n\t\tthis.definitions.down([[DATA, next]]);\n\t}\n\n\tasync execute(name: string, args: Record<string, unknown>): Promise<unknown> {\n\t\tconst defs = this.definitions.get() as ReadonlyMap<string, ToolDefinition>;\n\t\tconst tool = defs.get(name);\n\t\tif (!tool) throw new Error(`toolRegistry: unknown tool \"${name}\"`);\n\t\tconst raw = tool.handler(args);\n\t\treturn resolveToolHandlerResult(raw);\n\t}\n\n\tgetDefinition(name: string): ToolDefinition | undefined {\n\t\treturn (this.definitions.get() as ReadonlyMap<string, ToolDefinition>).get(name);\n\t}\n\n\toverride destroy(): void {\n\t\tfor (const unsub of this._keepaliveSubs) unsub();\n\t\tthis._keepaliveSubs.length = 0;\n\t\tsuper.destroy();\n\t}\n}\n\nexport function toolRegistry(name: string, opts?: ToolRegistryOptions): ToolRegistryGraph {\n\treturn new ToolRegistryGraph(name, opts);\n}\n\n// ---------------------------------------------------------------------------\n// systemPromptBuilder\n// ---------------------------------------------------------------------------\n\n/**\n * Assembles a system prompt from reactive sections. Each section is a\n * `NodeInput<string>` — the prompt updates when any section changes.\n */\nexport type SystemPromptHandle = Node<string> & { dispose: () => void };\n\nexport function systemPromptBuilder(\n\tsections: readonly NodeInput<string>[],\n\topts?: { separator?: string; name?: string },\n): SystemPromptHandle {\n\tconst separator = opts?.separator ?? \"\\n\\n\";\n\tconst sectionNodes = sections.map((s) => (typeof s === \"string\" ? state(s) : fromAny(s)));\n\tconst prompt = derived(\n\t\tsectionNodes,\n\t\t(values) => (values as string[]).filter((v) => v != null && v !== \"\").join(separator),\n\t\t{\n\t\t\tname: opts?.name ?? \"systemPrompt\",\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: aiMeta(\"system_prompt\"),\n\t\t\tinitial: \"\",\n\t\t},\n\t);\n\tconst unsub = keepalive(prompt);\n\treturn Object.assign(prompt, { dispose: unsub });\n}\n\n// ---------------------------------------------------------------------------\n// llmExtractor / llmConsolidator\n// ---------------------------------------------------------------------------\n\nexport type LLMExtractorOptions = {\n\tadapter: LLMAdapter;\n\tmodel?: string;\n\ttemperature?: number;\n\tmaxTokens?: number;\n};\n\n/**\n * Returns an `extractFn` callback for `distill()` that invokes an LLM to\n * extract structured memories from raw input.\n *\n * The system prompt should instruct the LLM to return JSON matching\n * `Extraction<TMem>` shape: `{ upsert: [{ key, value }], remove?: [key] }`.\n */\nexport function llmExtractor<TRaw, TMem>(\n\tsystemPrompt: string,\n\topts: LLMExtractorOptions,\n): (raw: TRaw, existing: ReadonlyMap<string, TMem>) => NodeInput<Extraction<TMem>> {\n\treturn (raw: TRaw, existing: ReadonlyMap<string, TMem>) => {\n\t\tconst existingKeys = [...existing.keys()].slice(0, 100); // sample for dedup\n\t\tconst messages: ChatMessage[] = [\n\t\t\t{ role: \"system\", content: systemPrompt },\n\t\t\t{\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: JSON.stringify({\n\t\t\t\t\tinput: raw,\n\t\t\t\t\texistingKeys,\n\t\t\t\t}),\n\t\t\t},\n\t\t];\n\t\t// Wrap the adapter call in a producer that parses the JSON response\n\t\treturn producer<Extraction<TMem>>((_deps, actions) => {\n\t\t\tlet active = true;\n\t\t\tconst result = opts.adapter.invoke(messages, {\n\t\t\t\tmodel: opts.model,\n\t\t\t\ttemperature: opts.temperature ?? 0,\n\t\t\t\tmaxTokens: opts.maxTokens,\n\t\t\t});\n\t\t\t// result is NodeInput — could be a Promise, Node, etc.\n\t\t\tconst resolved = fromAny(result);\n\t\t\tconst unsub = resolved.subscribe((msgs) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tlet done = false;\n\t\t\t\tfor (const msg of msgs) {\n\t\t\t\t\tif (done) break;\n\t\t\t\t\tif (msg[0] === DATA) {\n\t\t\t\t\t\tconst response = msg[1] as LLMResponse;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst parsed = JSON.parse(response.content) as Extraction<TMem>;\n\t\t\t\t\t\t\tactions.emit(parsed);\n\t\t\t\t\t\t\tactions.down([[COMPLETE]]);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tactions.down([\n\t\t\t\t\t\t\t\t[ERROR, new Error(\"llmExtractor: failed to parse LLM response as JSON\")],\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t} else if (msg[0] === ERROR) {\n\t\t\t\t\t\tactions.down([[ERROR, msg[1]]]);\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t} else if (msg[0] === COMPLETE) {\n\t\t\t\t\t\tactions.down([[COMPLETE]]);\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Forward unknown message types (spec §1.3.6)\n\t\t\t\t\t\tactions.down([[msg[0], msg[1]]]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tunsub();\n\t\t\t\tactive = false;\n\t\t\t};\n\t\t});\n\t};\n}\n\nexport type LLMConsolidatorOptions = LLMExtractorOptions;\n\n/**\n * Returns a `consolidateFn` callback for `distill()` that invokes an LLM to\n * cluster and merge related memories.\n */\nexport function llmConsolidator<TMem>(\n\tsystemPrompt: string,\n\topts: LLMConsolidatorOptions,\n): (entries: ReadonlyMap<string, TMem>) => NodeInput<Extraction<TMem>> {\n\treturn (entries: ReadonlyMap<string, TMem>) => {\n\t\tconst entriesArray = [...entries.entries()].map(([key, value]) => ({ key, value }));\n\t\tconst messages: ChatMessage[] = [\n\t\t\t{ role: \"system\", content: systemPrompt },\n\t\t\t{ role: \"user\", content: JSON.stringify({ memories: entriesArray }) },\n\t\t];\n\t\treturn producer<Extraction<TMem>>((_deps, actions) => {\n\t\t\tlet active = true;\n\t\t\tconst result = opts.adapter.invoke(messages, {\n\t\t\t\tmodel: opts.model,\n\t\t\t\ttemperature: opts.temperature ?? 0,\n\t\t\t\tmaxTokens: opts.maxTokens,\n\t\t\t});\n\t\t\tconst resolved = fromAny(result);\n\t\t\tconst unsub = resolved.subscribe((msgs) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tlet done = false;\n\t\t\t\tfor (const msg of msgs) {\n\t\t\t\t\tif (done) break;\n\t\t\t\t\tif (msg[0] === DATA) {\n\t\t\t\t\t\tconst response = msg[1] as LLMResponse;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst parsed = JSON.parse(response.content) as Extraction<TMem>;\n\t\t\t\t\t\t\tactions.emit(parsed);\n\t\t\t\t\t\t\tactions.down([[COMPLETE]]);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tactions.down([\n\t\t\t\t\t\t\t\t[ERROR, new Error(\"llmConsolidator: failed to parse LLM response as JSON\")],\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t} else if (msg[0] === ERROR) {\n\t\t\t\t\t\tactions.down([[ERROR, msg[1]]]);\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t} else if (msg[0] === COMPLETE) {\n\t\t\t\t\t\tactions.down([[COMPLETE]]);\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Forward unknown message types (spec §1.3.6)\n\t\t\t\t\t\tactions.down([[msg[0], msg[1]]]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tunsub();\n\t\t\t\tactive = false;\n\t\t\t};\n\t\t});\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// 3D Admission Scoring\n// ---------------------------------------------------------------------------\n\n/** Scores for the three admission dimensions. Each 0–1. */\nexport type AdmissionScores = {\n\treadonly persistence: number;\n\treadonly structure: number;\n\treadonly personalValue: number;\n};\n\nexport type AdmissionScore3DOptions = {\n\t/** Custom scoring function. Default: rule-based (all dimensions 0.5). */\n\tscoreFn?: (raw: unknown) => AdmissionScores;\n\t/** Minimum persistence score to admit (default 0.3). */\n\tpersistenceThreshold?: number;\n\t/** Minimum personalValue score to admit (default 0.3). */\n\tpersonalValueThreshold?: number;\n\t/** Require structure score > 0 to admit (default false). */\n\trequireStructured?: boolean;\n};\n\n/**\n * Default 3D admission scorer. Returns middle scores for all dimensions.\n * Override with `scoreFn` for LLM-backed or domain-specific scoring.\n */\nfunction defaultAdmissionScorer(_raw: unknown): AdmissionScores {\n\treturn { persistence: 0.5, structure: 0.5, personalValue: 0.5 };\n}\n\n/**\n * Creates a 3D admission filter function compatible with `agentMemory`'s\n * `admissionFilter` option. Scores each candidate on persistence, structure,\n * and personalValue, then applies thresholds.\n */\nexport function admissionFilter3D(opts: AdmissionScore3DOptions = {}): (raw: unknown) => boolean {\n\tconst scoreFn = opts.scoreFn ?? defaultAdmissionScorer;\n\tconst pThresh = opts.persistenceThreshold ?? 0.3;\n\tconst pvThresh = opts.personalValueThreshold ?? 0.3;\n\tconst reqStructured = opts.requireStructured ?? false;\n\treturn (raw: unknown): boolean => {\n\t\tconst scores = scoreFn(raw);\n\t\tif (scores.persistence < pThresh) return false;\n\t\tif (scores.personalValue < pvThresh) return false;\n\t\tif (reqStructured && scores.structure <= 0) return false;\n\t\treturn true;\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// Memory Tiers\n// ---------------------------------------------------------------------------\n\nexport type MemoryTier = \"permanent\" | \"active\" | \"archived\";\n\nexport type MemoryTiersOptions<TMem> = {\n\t/** Exponential decay rate per second for active tier.\n\t * Default: 7-day half-life ≈ ln(2)/(7×86400) ≈ 0.00000114. */\n\tdecayRate?: number;\n\t/** Max entries in the active tier before archiving lowest-scored (default 1000). */\n\tmaxActive?: number;\n\t/** Score threshold below which active entries get archived (default 0.1). */\n\tarchiveThreshold?: number;\n\t/** Predicate: true → entry belongs in permanent tier (default: never). */\n\tpermanentFilter?: (key: string, mem: TMem) => boolean;\n\t/** Persistence adapter for the archive tier. Omit to disable archiving. */\n\tarchiveAdapter?: AutoCheckpointAdapter;\n\t/** Auto-checkpoint options for archive adapter. */\n\tarchiveCheckpointOptions?: GraphAutoCheckpointOptions;\n};\n\nconst DEFAULT_DECAY_RATE = Math.LN2 / (7 * 86_400); // 7-day half-life\n\nexport type MemoryTiersBundle<TMem> = {\n\t/** Permanent tier: never evicted. */\n\treadonly permanent: LightCollectionBundle<TMem>;\n\t/** Active entries node (reactive, holds ReactiveMapSnapshot). */\n\treadonly activeEntries: Node<unknown>;\n\t/** Archive checkpoint handle (null if no adapter). */\n\treadonly archiveHandle: GraphAutoCheckpointHandle | null;\n\t/** Classify a key into its current tier. */\n\ttierOf: (key: string) => MemoryTier;\n\t/** Move a key to the permanent tier. */\n\tmarkPermanent: (key: string, value: TMem) => void;\n};\n\n// ---------------------------------------------------------------------------\n// Retrieval Pipeline\n// ---------------------------------------------------------------------------\n\nexport type RetrievalQuery = {\n\treadonly text?: string;\n\treadonly vector?: readonly number[];\n\treadonly entityIds?: readonly string[];\n};\n\nexport type RetrievalPipelineOptions<TMem> = {\n\t/** Max candidates from vector search (default 20). */\n\ttopK?: number;\n\t/** KG expansion depth in hops (default 1). */\n\tgraphDepth?: number;\n\t/** Token budget for final packing (default 2000). */\n\tbudget?: number;\n\t/** Cost function for budget packing. */\n\tcost: (mem: TMem) => number;\n\t/** Score function for ranking. */\n\tscore: (mem: TMem, context: unknown) => number;\n};\n\n/** A single entry in the retrieval result, with causal trace metadata. */\nexport type RetrievalEntry<TMem> = {\n\treadonly key: string;\n\treadonly value: TMem;\n\treadonly score: number;\n\treadonly sources: ReadonlyArray<\"vector\" | \"graph\" | \"store\">;\n};\n\n/** Causal trace for a retrieval run. */\nexport type RetrievalTrace<TMem> = {\n\treadonly vectorCandidates: ReadonlyArray<VectorSearchResult<TMem>>;\n\treadonly graphExpanded: ReadonlyArray<string>;\n\treadonly ranked: ReadonlyArray<RetrievalEntry<TMem>>;\n\treadonly packed: ReadonlyArray<RetrievalEntry<TMem>>;\n};\n\n// ---------------------------------------------------------------------------\n// agentMemory\n// ---------------------------------------------------------------------------\n\nexport type AgentMemoryOptions<TMem = unknown> = {\n\tgraph?: GraphOptions;\n\t/** LLM adapter for extraction and consolidation. */\n\tadapter?: LLMAdapter;\n\t/** System prompt for the extractor LLM. */\n\textractPrompt?: string;\n\t/** Custom extractFn (overrides adapter + extractPrompt). */\n\textractFn?: (raw: unknown, existing: ReadonlyMap<string, TMem>) => NodeInput<Extraction<TMem>>;\n\t/** System prompt for the consolidation LLM. */\n\tconsolidatePrompt?: string;\n\t/** Custom consolidateFn (overrides adapter + consolidatePrompt). */\n\tconsolidateFn?: (entries: ReadonlyMap<string, TMem>) => NodeInput<Extraction<TMem>>;\n\t/** Reactive trigger for consolidation (caller supplies e.g. `fromTimer`). */\n\tconsolidateTrigger?: NodeInput<unknown>;\n\t/** Score function for budget packing (required). */\n\tscore: (mem: TMem, context: unknown) => number;\n\t/** Cost function for budget packing (required). */\n\tcost: (mem: TMem) => number;\n\t/** Token budget for compact view (default 2000). */\n\tbudget?: number;\n\t/** Context node for scoring. */\n\tcontext?: NodeInput<unknown>;\n\t/** Admission filter (default: admit all). */\n\tadmissionFilter?: (candidate: unknown) => boolean;\n\t/** Vector index dimensions (> 0 enables vector index for retrieval). */\n\tvectorDimensions?: number;\n\n\t// --- In-factory composition (new) ---\n\n\t/** Extract embedding vector from a memory entry (enables vector index). */\n\tembedFn?: (mem: TMem) => readonly number[] | undefined;\n\t/** Enable knowledge graph for entity/relation tracking. */\n\tenableKnowledgeGraph?: boolean;\n\t/** Extract entities and relations from a memory entry. */\n\tentityFn?: (\n\t\tkey: string,\n\t\tmem: TMem,\n\t) =>\n\t\t| {\n\t\t\t\tentities?: Array<{ id: string; value: unknown }>;\n\t\t\t\trelations?: Array<{ from: string; to: string; relation: string; weight?: number }>;\n\t\t }\n\t\t| undefined;\n\n\t/** 3-tier storage configuration. Omit to use single-tier (existing behavior). */\n\ttiers?: MemoryTiersOptions<TMem>;\n\n\t/** Retrieval pipeline configuration. Requires vector index or knowledge graph. */\n\tretrieval?: {\n\t\t/** Max candidates from vector search (default 20). */\n\t\ttopK?: number;\n\t\t/** KG expansion depth in hops (default 1). */\n\t\tgraphDepth?: number;\n\t};\n\n\t/** Periodic reflection/consolidation configuration. */\n\treflection?: {\n\t\t/** Interval in ms between consolidation runs (default 300_000 = 5 min). */\n\t\tinterval?: number;\n\t\t/** Enable/disable periodic reflection (default true when consolidateFn is available). */\n\t\tenabled?: boolean;\n\t};\n};\n\nexport type AgentMemoryGraph<TMem = unknown> = Graph & {\n\treadonly distillBundle: DistillBundle<TMem>;\n\treadonly compact: Node<Array<{ key: string; value: TMem; score: number }>>;\n\treadonly size: Node<number>;\n\t/** Vector index bundle (null if not enabled). */\n\treadonly vectors: VectorIndexBundle<TMem> | null;\n\t/** Knowledge graph (null if not enabled). */\n\treadonly kg: KnowledgeGraphGraph<unknown, string> | null;\n\t/** Memory tiers bundle (null if not configured). */\n\treadonly memoryTiers: MemoryTiersBundle<TMem> | null;\n\t/** Retrieval result node (null if no retrieval pipeline configured). */\n\treadonly retrieval: Node<ReadonlyArray<RetrievalEntry<TMem>>> | null;\n\t/** Latest retrieval trace for observability (null if no retrieval pipeline). */\n\treadonly retrievalTrace: Node<RetrievalTrace<TMem> | null> | null;\n\t/** Execute a retrieval query (null if no retrieval pipeline). */\n\treadonly retrieve: ((query: RetrievalQuery) => ReadonlyArray<RetrievalEntry<TMem>>) | null;\n};\n\n/**\n * Pre-wired agentic memory graph. Composes `distill()` with optional\n * `knowledgeGraph()`, `vectorIndex()`, `lightCollection()` (permanent tier),\n * `decay()`, and `autoCheckpoint()` (archive tier). Supports 3D admission\n * scoring, a default retrieval pipeline, periodic reflection, and\n * retrieval observability traces.\n */\n\n/** Extract the key→value map from a reactive_map snapshot. */\nfunction extractStoreMap<TMem>(snapshot: unknown): ReadonlyMap<string, TMem> {\n\tif (\n\t\tsnapshot &&\n\t\ttypeof snapshot === \"object\" &&\n\t\t\"value\" in (snapshot as object) &&\n\t\ttypeof (snapshot as { value?: unknown }).value === \"object\" &&\n\t\t(snapshot as { value?: unknown }).value !== null &&\n\t\t\"map\" in ((snapshot as { value: object }).value as object)\n\t) {\n\t\treturn (\n\t\t\t((snapshot as { value: { map: ReadonlyMap<string, TMem> } }).value.map as ReadonlyMap<\n\t\t\t\tstring,\n\t\t\t\tTMem\n\t\t\t>) ?? new Map<string, TMem>()\n\t\t);\n\t}\n\treturn new Map<string, TMem>();\n}\n\nexport function agentMemory<TMem = unknown>(\n\tname: string,\n\tsource: NodeInput<unknown>,\n\topts: AgentMemoryOptions<TMem>,\n): AgentMemoryGraph<TMem> {\n\tconst graph = new Graph(name, opts.graph);\n\tconst keepaliveSubs: Array<() => void> = [];\n\n\t// --- Extract function resolution ---\n\tlet rawExtractFn: (\n\t\traw: unknown,\n\t\texisting: ReadonlyMap<string, TMem>,\n\t) => NodeInput<Extraction<TMem>>;\n\tif (opts.extractFn) {\n\t\trawExtractFn = opts.extractFn;\n\t} else if (opts.adapter && opts.extractPrompt) {\n\t\trawExtractFn = llmExtractor<unknown, TMem>(opts.extractPrompt, { adapter: opts.adapter });\n\t} else {\n\t\tthrow new Error(\"agentMemory: provide either extractFn or adapter + extractPrompt\");\n\t}\n\tconst extractFn = (\n\t\traw: unknown,\n\t\texisting: ReadonlyMap<string, TMem>,\n\t): NodeInput<Extraction<TMem>> => {\n\t\tif (raw == null) return { upsert: [] };\n\t\treturn rawExtractFn(raw, existing);\n\t};\n\n\t// --- Admission filter ---\n\tlet filteredSource = source;\n\tif (opts.admissionFilter) {\n\t\tconst srcNode = fromAny(source);\n\t\tconst filter = opts.admissionFilter;\n\t\tfilteredSource = derived(\n\t\t\t[srcNode],\n\t\t\t([raw]) => {\n\t\t\t\tif (filter(raw)) return raw;\n\t\t\t\treturn undefined;\n\t\t\t},\n\t\t\t{ name: \"admissionFilter\", describeKind: \"derived\" },\n\t\t);\n\t}\n\n\t// --- Consolidation ---\n\tlet consolidateFn:\n\t\t| ((entries: ReadonlyMap<string, TMem>) => NodeInput<Extraction<TMem>>)\n\t\t| undefined;\n\tif (opts.consolidateFn) {\n\t\tconsolidateFn = opts.consolidateFn;\n\t} else if (opts.adapter && opts.consolidatePrompt) {\n\t\tconsolidateFn = llmConsolidator<TMem>(opts.consolidatePrompt, { adapter: opts.adapter });\n\t}\n\n\t// --- Reflection: default consolidateTrigger from fromTimer ---\n\tlet consolidateTrigger = opts.consolidateTrigger;\n\tif (!consolidateTrigger && consolidateFn && opts.reflection?.enabled !== false) {\n\t\tconst interval = opts.reflection?.interval ?? 300_000;\n\t\tconsolidateTrigger = fromTimer(interval, { period: interval });\n\t}\n\n\t// --- Build distill bundle ---\n\tconst distillOpts: DistillOptions<TMem> = {\n\t\tscore: opts.score,\n\t\tcost: opts.cost,\n\t\tbudget: opts.budget ?? 2000,\n\t\tcontext: opts.context,\n\t\tconsolidate: consolidateFn,\n\t\tconsolidateTrigger,\n\t};\n\tconst distillBundle = distill<unknown, TMem>(filteredSource, extractFn, distillOpts);\n\n\tgraph.add(\"store\", distillBundle.store.node);\n\tgraph.add(\"compact\", distillBundle.compact);\n\tgraph.add(\"size\", distillBundle.size);\n\tgraph.connect(\"store\", \"compact\");\n\tgraph.connect(\"store\", \"size\");\n\n\t// --- Vector index (optional) ---\n\tlet vectors: VectorIndexBundle<TMem> | null = null;\n\tif (opts.vectorDimensions && opts.vectorDimensions > 0 && opts.embedFn) {\n\t\tvectors = vectorIndex<TMem>({ dimension: opts.vectorDimensions });\n\t\tgraph.add(\"vectorIndex\", vectors.entries);\n\t}\n\n\t// --- Knowledge graph (optional) ---\n\tlet kg: KnowledgeGraphGraph<unknown, string> | null = null;\n\tif (opts.enableKnowledgeGraph) {\n\t\tkg = knowledgeGraph<unknown, string>(`${name}-kg`);\n\t\tgraph.mount(\"kg\", kg);\n\t}\n\n\t// --- 3-tier storage (optional) ---\n\tlet memoryTiersBundle: MemoryTiersBundle<TMem> | null = null;\n\tif (opts.tiers) {\n\t\tconst tiersOpts = opts.tiers;\n\t\tconst decayRate = tiersOpts.decayRate ?? DEFAULT_DECAY_RATE;\n\t\tconst maxActive = tiersOpts.maxActive ?? 1000;\n\t\tconst archiveThreshold = tiersOpts.archiveThreshold ?? 0.1;\n\t\tconst permanentFilter = tiersOpts.permanentFilter ?? (() => false);\n\n\t\t// Permanent tier\n\t\tconst permanent = lightCollection<TMem>({ name: \"permanent\" });\n\t\tgraph.add(\"permanent\", permanent.entries);\n\n\t\t// Track which keys are permanent\n\t\tconst permanentKeys = new Set<string>();\n\n\t\tconst tierOf = (key: string): MemoryTier => {\n\t\t\tif (permanentKeys.has(key)) return \"permanent\";\n\t\t\tconst storeMap = extractStoreMap<TMem>(distillBundle.store.node.get());\n\t\t\tif (storeMap.has(key)) return \"active\";\n\t\t\treturn \"archived\";\n\t\t};\n\n\t\tconst markPermanent = (key: string, value: TMem): void => {\n\t\t\tpermanentKeys.add(key);\n\t\t\tpermanent.upsert(key, value);\n\t\t};\n\n\t\t// Track entry creation times for accurate decay age calculation\n\t\tconst entryCreatedAtNs = new Map<string, number>();\n\n\t\t// Post-extraction hook: classify into tiers and archive low-scored entries\n\t\tconst storeNode = distillBundle.store.node;\n\t\tconst contextNode = opts.context ? fromAny(opts.context) : state<unknown>(null);\n\t\tconst tierClassifier = effect([storeNode, contextNode], ([snapshot, ctx]) => {\n\t\t\tconst storeMap = extractStoreMap<TMem>(snapshot);\n\t\t\tconst nowNs = monotonicNs();\n\t\t\tconst toArchive: string[] = [];\n\t\t\tconst toPermanent: Array<{ key: string; value: TMem }> = [];\n\n\t\t\tfor (const [key, mem] of storeMap) {\n\t\t\t\t// Track creation time for new entries\n\t\t\t\tif (!entryCreatedAtNs.has(key)) {\n\t\t\t\t\tentryCreatedAtNs.set(key, nowNs);\n\t\t\t\t}\n\n\t\t\t\t// Check permanent classification\n\t\t\t\tif (permanentFilter(key, mem)) {\n\t\t\t\t\ttoPermanent.push({ key, value: mem });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// Compute decayed score for active tier\n\t\t\t\tconst baseScore = opts.score(mem, ctx);\n\t\t\t\tconst createdNs = entryCreatedAtNs.get(key) ?? nowNs;\n\t\t\t\tconst ageSeconds = Number(nowNs - createdNs) / 1e9;\n\t\t\t\tconst decayed = decay(baseScore, ageSeconds, decayRate);\n\t\t\t\tif (decayed < archiveThreshold) {\n\t\t\t\t\ttoArchive.push(key);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Clean up creation times for removed entries\n\t\t\tfor (const key of entryCreatedAtNs.keys()) {\n\t\t\t\tif (!storeMap.has(key)) entryCreatedAtNs.delete(key);\n\t\t\t}\n\n\t\t\t// Move to permanent\n\t\t\tfor (const { key, value } of toPermanent) {\n\t\t\t\tif (!permanentKeys.has(key)) {\n\t\t\t\t\tmarkPermanent(key, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Archive and evict from active (respect maxActive, excluding permanent keys)\n\t\t\tconst activeCount = storeMap.size - permanentKeys.size;\n\t\t\tif (activeCount > maxActive) {\n\t\t\t\tconst scored = [...storeMap.entries()]\n\t\t\t\t\t.filter(([k]) => !permanentKeys.has(k))\n\t\t\t\t\t.map(([k, m]) => ({ key: k, score: opts.score(m, ctx) }))\n\t\t\t\t\t.sort((a, b) => a.score - b.score);\n\t\t\t\tconst excess = activeCount - maxActive;\n\t\t\t\tfor (let i = 0; i < excess && i < scored.length; i++) {\n\t\t\t\t\tconst sk = scored[i]!.key;\n\t\t\t\t\tif (!toArchive.includes(sk)) toArchive.push(sk);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Evict archived keys from active store\n\t\t\tif (toArchive.length > 0) {\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const key of toArchive) {\n\t\t\t\t\t\tdistillBundle.store.delete(key);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tkeepaliveSubs.push(tierClassifier.subscribe(() => undefined));\n\n\t\t// Archive checkpoint\n\t\tlet archiveHandle: GraphAutoCheckpointHandle | null = null;\n\t\tif (tiersOpts.archiveAdapter) {\n\t\t\tarchiveHandle = graph.autoCheckpoint(\n\t\t\t\ttiersOpts.archiveAdapter,\n\t\t\t\ttiersOpts.archiveCheckpointOptions,\n\t\t\t);\n\t\t}\n\n\t\tmemoryTiersBundle = {\n\t\t\tpermanent,\n\t\t\tactiveEntries: storeNode,\n\t\t\tarchiveHandle,\n\t\t\ttierOf,\n\t\t\tmarkPermanent,\n\t\t};\n\t}\n\n\t// --- Post-extraction hooks: vector + KG indexing ---\n\tif (vectors || kg) {\n\t\tconst embedFn = opts.embedFn;\n\t\tconst entityFn = opts.entityFn;\n\t\tconst storeNode = distillBundle.store.node;\n\n\t\tconst indexer = effect([storeNode], ([snapshot]) => {\n\t\t\tconst storeMap = extractStoreMap<TMem>(snapshot);\n\t\t\tfor (const [key, mem] of storeMap) {\n\t\t\t\t// Vector indexing\n\t\t\t\tif (vectors && embedFn) {\n\t\t\t\t\tconst vec = embedFn(mem);\n\t\t\t\t\tif (vec) vectors.upsert(key, vec, mem);\n\t\t\t\t}\n\t\t\t\t// Knowledge graph entity/relation extraction\n\t\t\t\tif (kg && entityFn) {\n\t\t\t\t\tconst extracted = entityFn(key, mem);\n\t\t\t\t\tif (extracted) {\n\t\t\t\t\t\tfor (const ent of extracted.entities ?? []) {\n\t\t\t\t\t\t\tkg.upsertEntity(ent.id, ent.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const rel of extracted.relations ?? []) {\n\t\t\t\t\t\t\tkg.link(rel.from, rel.to, rel.relation as string, rel.weight);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tkeepaliveSubs.push(indexer.subscribe(() => undefined));\n\t}\n\n\t// --- Retrieval pipeline (optional) ---\n\tlet retrievalNode: Node<ReadonlyArray<RetrievalEntry<TMem>>> | null = null;\n\tlet retrievalTraceNode: Node<RetrievalTrace<TMem> | null> | null = null;\n\tlet retrieveFn: ((query: RetrievalQuery) => ReadonlyArray<RetrievalEntry<TMem>>) | null = null;\n\n\tif (vectors || kg) {\n\t\tconst topK = opts.retrieval?.topK ?? 20;\n\t\tconst graphDepth = opts.retrieval?.graphDepth ?? 1;\n\t\tconst budget = opts.budget ?? 2000;\n\t\tconst costFn = opts.cost;\n\t\tconst scoreFn = opts.score;\n\n\t\t// Query input node — updated via retrieve()\n\t\tconst queryInput = state<RetrievalQuery | null>(null, {\n\t\t\tname: \"retrievalQuery\",\n\t\t\tdescribeKind: \"state\",\n\t\t});\n\t\tgraph.add(\"retrievalQuery\", queryInput);\n\n\t\tconst contextNode = opts.context ? fromAny(opts.context) : state<unknown>(null);\n\t\tconst traceState = state<RetrievalTrace<TMem> | null>(null, {\n\t\t\tname: \"retrievalTrace\",\n\t\t\tdescribeKind: \"state\",\n\t\t\tmeta: aiMeta(\"retrieval_trace\"),\n\t\t});\n\t\tgraph.add(\"retrievalTrace\", traceState);\n\t\tretrievalTraceNode = traceState;\n\n\t\tconst storeNode = distillBundle.store.node;\n\n\t\t// Last trace captured during retrieval (populated by retrieve())\n\t\tlet lastTrace: RetrievalTrace<TMem> | null = null;\n\n\t\tconst retrievalDerived = derived<ReadonlyArray<RetrievalEntry<TMem>>>(\n\t\t\t[queryInput, storeNode, contextNode],\n\t\t\t([query, snapshot, ctx]) => {\n\t\t\t\tif (!query) return [];\n\t\t\t\tconst q = query as RetrievalQuery;\n\t\t\t\tconst storeMap = extractStoreMap<TMem>(snapshot);\n\n\t\t\t\tconst candidateMap = new Map<\n\t\t\t\t\tstring,\n\t\t\t\t\t{ value: TMem; sources: Set<\"vector\" | \"graph\" | \"store\"> }\n\t\t\t\t>();\n\n\t\t\t\t// Stage 1: Vector search\n\t\t\t\tlet vectorCandidates: VectorSearchResult<TMem>[] = [];\n\t\t\t\tif (vectors && q.vector) {\n\t\t\t\t\tvectorCandidates = vectors.search(q.vector, topK) as VectorSearchResult<TMem>[];\n\t\t\t\t\tfor (const vc of vectorCandidates) {\n\t\t\t\t\t\tconst mem = storeMap.get(vc.id);\n\t\t\t\t\t\tif (mem) {\n\t\t\t\t\t\t\tcandidateMap.set(vc.id, { value: mem, sources: new Set([\"vector\"]) });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Stage 2: KG expansion\n\t\t\t\tconst graphExpanded: string[] = [];\n\t\t\t\tif (kg) {\n\t\t\t\t\tconst seedIds = [...(q.entityIds ?? []), ...[...candidateMap.keys()]];\n\t\t\t\t\tconst visited = new Set<string>();\n\t\t\t\t\tlet frontier = seedIds;\n\t\t\t\t\tfor (let depth = 0; depth < graphDepth; depth++) {\n\t\t\t\t\t\tconst nextFrontier: string[] = [];\n\t\t\t\t\t\tfor (const id of frontier) {\n\t\t\t\t\t\t\tif (visited.has(id)) continue;\n\t\t\t\t\t\t\tvisited.add(id);\n\t\t\t\t\t\t\tconst related = kg.related(id);\n\t\t\t\t\t\t\tfor (const edge of related) {\n\t\t\t\t\t\t\t\tconst targetId = edge.to;\n\t\t\t\t\t\t\t\tif (!visited.has(targetId)) {\n\t\t\t\t\t\t\t\t\tnextFrontier.push(targetId);\n\t\t\t\t\t\t\t\t\tconst mem = storeMap.get(targetId);\n\t\t\t\t\t\t\t\t\tif (mem) {\n\t\t\t\t\t\t\t\t\t\tconst existing = candidateMap.get(targetId);\n\t\t\t\t\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\t\t\t\t\texisting.sources.add(\"graph\");\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tcandidateMap.set(targetId, { value: mem, sources: new Set([\"graph\"]) });\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tgraphExpanded.push(targetId);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfrontier = nextFrontier;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Also include direct store matches not yet in candidates\n\t\t\t\tfor (const [key, mem] of storeMap) {\n\t\t\t\t\tif (!candidateMap.has(key)) {\n\t\t\t\t\t\tcandidateMap.set(key, { value: mem, sources: new Set([\"store\"]) });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Stage 3: Score and rank\n\t\t\t\tconst ranked: RetrievalEntry<TMem>[] = [];\n\t\t\t\tfor (const [key, { value, sources }] of candidateMap) {\n\t\t\t\t\tconst score = scoreFn(value, ctx);\n\t\t\t\t\tranked.push({ key, value, score, sources: [...sources] });\n\t\t\t\t}\n\t\t\t\tranked.sort((a, b) => b.score - a.score);\n\n\t\t\t\t// Stage 4: Budget packing\n\t\t\t\tconst packed: RetrievalEntry<TMem>[] = [];\n\t\t\t\tlet usedBudget = 0;\n\t\t\t\tfor (const entry of ranked) {\n\t\t\t\t\tconst c = costFn(entry.value);\n\t\t\t\t\tif (usedBudget + c > budget && packed.length > 0) break;\n\t\t\t\t\tpacked.push(entry);\n\t\t\t\t\tusedBudget += c;\n\t\t\t\t}\n\n\t\t\t\t// Capture trace (no side-effect — stored for retrieval by retrieve())\n\t\t\t\tlastTrace = { vectorCandidates, graphExpanded, ranked, packed };\n\n\t\t\t\treturn packed;\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"retrieval\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: aiMeta(\"retrieval_pipeline\"),\n\t\t\t\tinitial: [],\n\t\t\t},\n\t\t);\n\t\tgraph.add(\"retrieval\", retrievalDerived);\n\t\tgraph.connect(\"retrievalQuery\", \"retrieval\");\n\t\tgraph.connect(\"store\", \"retrieval\");\n\t\tkeepaliveSubs.push(retrievalDerived.subscribe(() => undefined));\n\t\tretrievalNode = retrievalDerived;\n\n\t\tretrieveFn = (query: RetrievalQuery): ReadonlyArray<RetrievalEntry<TMem>> => {\n\t\t\tqueryInput.down([[DATA, query]]);\n\t\t\tconst result = retrievalDerived.get() as ReadonlyArray<RetrievalEntry<TMem>>;\n\t\t\t// Update trace node outside derived callback (avoids reactive glitch)\n\t\t\tif (lastTrace) {\n\t\t\t\ttraceState.down([[DATA, lastTrace]]);\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t}\n\n\t// --- Cleanup ---\n\tconst origDestroy = graph.destroy.bind(graph);\n\tgraph.destroy = () => {\n\t\tfor (const unsub of keepaliveSubs) unsub();\n\t\tkeepaliveSubs.length = 0;\n\t\torigDestroy();\n\t};\n\n\treturn Object.assign(graph, {\n\t\tdistillBundle,\n\t\tcompact: distillBundle.compact,\n\t\tsize: distillBundle.size,\n\t\tvectors,\n\t\tkg,\n\t\tmemoryTiers: memoryTiersBundle,\n\t\tretrieval: retrievalNode,\n\t\tretrievalTrace: retrievalTraceNode,\n\t\tretrieve: retrieveFn,\n\t}) as AgentMemoryGraph<TMem>;\n}\n\n// ---------------------------------------------------------------------------\n// agentLoop\n// ---------------------------------------------------------------------------\n\nexport type AgentLoopOptions = {\n\tgraph?: GraphOptions;\n\tadapter: LLMAdapter;\n\ttools?: readonly ToolDefinition[];\n\tsystemPrompt?: string;\n\tmaxTurns?: number;\n\tstopWhen?: (response: LLMResponse) => boolean;\n\tonToolCall?: (call: ToolCall) => void;\n\tmaxMessages?: number;\n\tmodel?: string;\n\ttemperature?: number;\n\tmaxTokens?: number;\n};\n\nexport class AgentLoopGraph extends Graph {\n\treadonly chat: ChatStreamGraph;\n\treadonly tools: ToolRegistryGraph;\n\treadonly status: Node<AgentLoopStatus>;\n\treadonly turnCount: Node<number>;\n\treadonly lastResponse: Node<LLMResponse | null>;\n\tprivate readonly _statusState: Node<AgentLoopStatus>;\n\tprivate readonly _turnCountState: Node<number>;\n\tprivate readonly _adapter: LLMAdapter;\n\tprivate readonly _maxTurns: number;\n\tprivate readonly _stopWhen?: (response: LLMResponse) => boolean;\n\tprivate readonly _onToolCall?: (call: ToolCall) => void;\n\tprivate readonly _systemPrompt?: string;\n\tprivate readonly _model?: string;\n\tprivate readonly _temperature?: number;\n\tprivate readonly _maxTokens?: number;\n\tprivate _running = false;\n\tprivate _abortController: AbortController | null = null;\n\n\tconstructor(name: string, opts: AgentLoopOptions) {\n\t\tsuper(name, opts.graph);\n\n\t\tthis._adapter = opts.adapter;\n\t\tthis._maxTurns = opts.maxTurns ?? 10;\n\t\tthis._stopWhen = opts.stopWhen;\n\t\tthis._onToolCall = opts.onToolCall;\n\t\tthis._systemPrompt = opts.systemPrompt;\n\t\tthis._model = opts.model;\n\t\tthis._temperature = opts.temperature;\n\t\tthis._maxTokens = opts.maxTokens;\n\n\t\t// Mount chat subgraph\n\t\tthis.chat = chatStream(`${name}-chat`, { maxMessages: opts.maxMessages });\n\t\tthis.mount(\"chat\", this.chat);\n\n\t\t// Mount tool registry subgraph\n\t\tthis.tools = toolRegistry(`${name}-tools`);\n\t\tthis.mount(\"tools\", this.tools);\n\n\t\t// Register initial tools\n\t\tif (opts.tools) {\n\t\t\tfor (const tool of opts.tools) {\n\t\t\t\tthis.tools.register(tool);\n\t\t\t}\n\t\t}\n\n\t\t// Status state\n\t\tthis._statusState = state<AgentLoopStatus>(\"idle\", {\n\t\t\tname: \"status\",\n\t\t\tdescribeKind: \"state\",\n\t\t\tmeta: aiMeta(\"agent_status\"),\n\t\t});\n\t\tthis.status = this._statusState;\n\t\tthis.add(\"status\", this.status);\n\n\t\t// Turn count\n\t\tthis._turnCountState = state<number>(0, {\n\t\t\tname: \"turnCount\",\n\t\t\tdescribeKind: \"state\",\n\t\t\tmeta: aiMeta(\"agent_turn_count\"),\n\t\t});\n\t\tthis.turnCount = this._turnCountState;\n\t\tthis.add(\"turnCount\", this.turnCount);\n\n\t\t// Last LLM response\n\t\tthis.lastResponse = state<LLMResponse | null>(null, {\n\t\t\tname: \"lastResponse\",\n\t\t\tdescribeKind: \"state\",\n\t\t\tmeta: aiMeta(\"agent_last_response\"),\n\t\t});\n\t\tthis.add(\"lastResponse\", this.lastResponse);\n\t}\n\n\t/**\n\t * Start the agent loop with a user message. The loop runs reactively:\n\t * think (LLM call) → act (tool execution) → repeat until done.\n\t *\n\t * Messages accumulate across calls. Call `chat.clear()` before `run()`\n\t * to reset conversation history.\n\t */\n\tasync run(userMessage: string): Promise<LLMResponse | null> {\n\t\tif (this._running) throw new Error(\"agentLoop: already running\");\n\t\tthis._running = true;\n\t\tthis._abortController = new AbortController();\n\t\tconst { signal } = this._abortController;\n\n\t\tbatch(() => {\n\t\t\tthis._statusState.down([[DATA, \"idle\" as AgentLoopStatus]]);\n\t\t\tthis._turnCountState.down([[DATA, 0]]);\n\t\t});\n\t\tthis.chat.append(\"user\", userMessage);\n\n\t\ttry {\n\t\t\tlet turns = 0;\n\t\t\twhile (turns < this._maxTurns) {\n\t\t\t\tif (signal.aborted) throw new Error(\"agentLoop: aborted\");\n\t\t\t\tturns++;\n\t\t\t\tbatch(() => {\n\t\t\t\t\tthis._turnCountState.down([[DATA, turns]]);\n\t\t\t\t\tthis._statusState.down([[DATA, \"thinking\" as AgentLoopStatus]]);\n\t\t\t\t});\n\n\t\t\t\t// Invoke LLM\n\t\t\t\tconst msgs = this.chat.allMessages();\n\t\t\t\tconst toolSchemas = (this.tools.schemas.get() as readonly ToolDefinition[]) ?? [];\n\t\t\t\tconst response = await this._invokeLLM(msgs, toolSchemas, signal);\n\t\t\t\tif (signal.aborted) throw new Error(\"agentLoop: aborted\");\n\n\t\t\t\t(this.lastResponse as Node<LLMResponse | null>).down([[DATA, response]]);\n\n\t\t\t\t// Append assistant message\n\t\t\t\tthis.chat.append(\"assistant\", response.content, {\n\t\t\t\t\ttoolCalls: response.toolCalls,\n\t\t\t\t});\n\n\t\t\t\t// Check stop conditions\n\t\t\t\tif (this._shouldStop(response)) {\n\t\t\t\t\tthis._statusState.down([[DATA, \"done\" as AgentLoopStatus]]);\n\t\t\t\t\tthis._running = false;\n\t\t\t\t\tthis._abortController = null;\n\t\t\t\t\treturn response;\n\t\t\t\t}\n\n\t\t\t\t// Execute tool calls if present\n\t\t\t\tif (response.toolCalls && response.toolCalls.length > 0) {\n\t\t\t\t\tthis._statusState.down([[DATA, \"acting\" as AgentLoopStatus]]);\n\t\t\t\t\tfor (const call of response.toolCalls) {\n\t\t\t\t\t\tif (signal.aborted) throw new Error(\"agentLoop: aborted\");\n\t\t\t\t\t\tthis._onToolCall?.(call);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = await this.tools.execute(call.name, call.arguments);\n\t\t\t\t\t\t\tthis.chat.appendToolResult(call.id, JSON.stringify(result));\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tthis.chat.appendToolResult(call.id, JSON.stringify({ error: String(err) }));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// No tool calls and not explicitly stopped → done\n\t\t\t\t\tthis._statusState.down([[DATA, \"done\" as AgentLoopStatus]]);\n\t\t\t\t\tthis._running = false;\n\t\t\t\t\tthis._abortController = null;\n\t\t\t\t\treturn response;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Max turns reached\n\t\t\tthis._statusState.down([[DATA, \"done\" as AgentLoopStatus]]);\n\t\t\tthis._running = false;\n\t\t\tthis._abortController = null;\n\t\t\treturn this.lastResponse.get() as LLMResponse | null;\n\t\t} catch (err) {\n\t\t\tthis._statusState.down([[DATA, \"error\" as AgentLoopStatus]]);\n\t\t\tthis._running = false;\n\t\t\tthis._abortController = null;\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tprivate async _invokeLLM(\n\t\tmsgs: readonly ChatMessage[],\n\t\ttools: readonly ToolDefinition[],\n\t\tsignal?: AbortSignal,\n\t): Promise<LLMResponse> {\n\t\tconst result = this._adapter.invoke(msgs, {\n\t\t\ttools: tools.length > 0 ? tools : undefined,\n\t\t\tsystemPrompt: this._systemPrompt,\n\t\t\tmodel: this._model,\n\t\t\ttemperature: this._temperature,\n\t\t\tmaxTokens: this._maxTokens,\n\t\t\tsignal,\n\t\t});\n\t\t// Null/undefined guard\n\t\tif (result == null) {\n\t\t\tthrow new Error(\"_invokeLLM: adapter.invoke() returned null or undefined\");\n\t\t}\n\t\t// String guard — fromAny would iterate characters\n\t\tif (typeof result === \"string\") {\n\t\t\tthrow new Error(\"_invokeLLM: adapter.invoke() returned a string, expected LLMResponse\");\n\t\t}\n\t\t// If result is already an LLMResponse (sync adapter), return directly\n\t\tif (\n\t\t\ttypeof result === \"object\" &&\n\t\t\t\"content\" in result &&\n\t\t\t!(\"subscribe\" in result) &&\n\t\t\t!(\"then\" in result)\n\t\t) {\n\t\t\treturn result as LLMResponse;\n\t\t}\n\t\t// If result is a Promise, await it then check for LLMResponse\n\t\tif (isPromiseLike(result)) {\n\t\t\tconst awaited = await result;\n\t\t\tif (\n\t\t\t\ttypeof awaited === \"object\" &&\n\t\t\t\tawaited !== null &&\n\t\t\t\t\"content\" in awaited &&\n\t\t\t\t!(\"subscribe\" in awaited)\n\t\t\t) {\n\t\t\t\treturn awaited as LLMResponse;\n\t\t\t}\n\t\t\treturn firstDataFromNode(fromAny(awaited as NodeInput<LLMResponse>)) as Promise<LLMResponse>;\n\t\t}\n\t\t// If result is a Node or async iterable, resolve via fromAny + firstDataFromNode\n\t\treturn firstDataFromNode(fromAny(result)) as Promise<LLMResponse>;\n\t}\n\n\tprivate _shouldStop(response: LLMResponse): boolean {\n\t\tif (\n\t\t\tresponse.finishReason === \"end_turn\" &&\n\t\t\t(!response.toolCalls || response.toolCalls.length === 0)\n\t\t)\n\t\t\treturn true;\n\t\tif (this._stopWhen?.(response)) return true;\n\t\treturn false;\n\t}\n\n\toverride destroy(): void {\n\t\tif (this._abortController) {\n\t\t\tthis._abortController.abort();\n\t\t\tthis._abortController = null;\n\t\t}\n\t\tthis._running = false;\n\t\tsuper.destroy();\n\t}\n}\n\nexport function agentLoop(name: string, opts: AgentLoopOptions): AgentLoopGraph {\n\treturn new AgentLoopGraph(name, opts);\n}\n\n// ---------------------------------------------------------------------------\n// 5.4 — LLM tool integration\n// ---------------------------------------------------------------------------\n\n/** OpenAI function-calling tool schema. */\nexport type OpenAIToolSchema = {\n\treadonly type: \"function\";\n\treadonly function: {\n\t\treadonly name: string;\n\t\treadonly description: string;\n\t\treadonly parameters: Record<string, unknown>;\n\t};\n};\n\n/** MCP (Model Context Protocol) tool schema. */\nexport type McpToolSchema = {\n\treadonly name: string;\n\treadonly description: string;\n\treadonly inputSchema: Record<string, unknown>;\n};\n\n/** Result of {@link knobsAsTools}. */\nexport type KnobsAsToolsResult = {\n\t/** OpenAI function-calling tool schemas. */\n\treadonly openai: readonly OpenAIToolSchema[];\n\t/** MCP tool schemas. */\n\treadonly mcp: readonly McpToolSchema[];\n\t/** GraphReFly ToolDefinitions with handlers that call `graph.set()`. */\n\treadonly definitions: readonly ToolDefinition[];\n};\n\n/**\n * Build a JSON Schema `properties.value` descriptor from a node's meta fields.\n *\n * Maps `meta.type`, `meta.range`, `meta.values`, `meta.format`, and `meta.unit`\n * to a JSON Schema property definition.\n */\nfunction metaToJsonSchema(meta: Record<string, unknown>): Record<string, unknown> {\n\tconst schema: Record<string, unknown> = {};\n\n\tconst metaType = meta.type as string | undefined;\n\tif (metaType === \"enum\" && Array.isArray(meta.values)) {\n\t\tschema.type = \"string\";\n\t\tschema.enum = meta.values;\n\t} else if (metaType === \"integer\") {\n\t\tschema.type = \"integer\";\n\t} else if (metaType === \"number\") {\n\t\tschema.type = \"number\";\n\t} else if (metaType === \"boolean\") {\n\t\tschema.type = \"boolean\";\n\t} else if (metaType === \"string\") {\n\t\tschema.type = \"string\";\n\t} else {\n\t\t// Unknown or unspecified — accept anything\n\t\tschema.type = [\"string\", \"number\", \"boolean\"];\n\t}\n\n\tif (Array.isArray(meta.range) && meta.range.length === 2) {\n\t\tschema.minimum = meta.range[0];\n\t\tschema.maximum = meta.range[1];\n\t}\n\n\tif (typeof meta.format === \"string\") {\n\t\tschema.description = `Format: ${meta.format}`;\n\t}\n\n\tif (typeof meta.unit === \"string\") {\n\t\tif (schema.description) {\n\t\t\tschema.description += ` (${meta.unit})`;\n\t\t} else {\n\t\t\tschema.description = `Unit: ${meta.unit}`;\n\t\t}\n\t}\n\n\treturn schema;\n}\n\n/**\n * Derive tool schemas from a graph's writable (knob) nodes.\n *\n * Knobs are state nodes whose `meta.access` is `\"llm\"`, `\"both\"`, or absent\n * (default: writable). Each knob becomes a tool that calls `graph.set()`.\n *\n * Speaks **domain language** (spec §5.4): the returned schemas use node names\n * and meta descriptions — no protocol internals exposed.\n *\n * @param graph - The graph to introspect.\n * @param actor - Optional actor for guard-scoped describe.\n * @returns OpenAI, MCP, and GraphReFly tool schemas.\n */\nexport function knobsAsTools(graph: Graph, actor?: Actor): KnobsAsToolsResult {\n\tconst described = graph.describe({ actor, detail: \"full\" });\n\tconst openai: OpenAIToolSchema[] = [];\n\tconst mcp: McpToolSchema[] = [];\n\tconst definitions: ToolDefinition[] = [];\n\n\tfor (const [path, node] of Object.entries(described.nodes)) {\n\t\t// Only state nodes are writable knobs\n\t\tif (node.type !== \"state\") continue;\n\n\t\t// Skip meta companion nodes (§2.3)\n\t\tif (path.includes(\"::__meta__::\")) continue;\n\n\t\t// Skip terminal-state nodes (§1.3.4 — no further messages after COMPLETE/ERROR)\n\t\tif (node.status === \"completed\" || node.status === \"errored\") continue;\n\n\t\t// Skip if access explicitly excludes LLM\n\t\tconst meta = node.meta ?? {};\n\t\tconst access = meta.access as string | undefined;\n\t\tif (access === \"human\" || access === \"system\") continue;\n\n\t\tconst description = (meta.description as string) ?? `Set the value of ${path}`;\n\t\tconst valueSchema = metaToJsonSchema(meta);\n\n\t\tconst parameterSchema: Record<string, unknown> = {\n\t\t\ttype: \"object\",\n\t\t\trequired: [\"value\"],\n\t\t\tproperties: {\n\t\t\t\tvalue: valueSchema,\n\t\t\t},\n\t\t\tadditionalProperties: false,\n\t\t};\n\n\t\t// OpenAI requires [a-zA-Z0-9_-] in function names; sanitize :: separators\n\t\tconst sanitizedName = path.replace(/::/g, \"__\");\n\n\t\topenai.push({\n\t\t\ttype: \"function\",\n\t\t\tfunction: {\n\t\t\t\tname: sanitizedName,\n\t\t\t\tdescription,\n\t\t\t\tparameters: parameterSchema,\n\t\t\t},\n\t\t});\n\n\t\tmcp.push({\n\t\t\tname: path,\n\t\t\tdescription,\n\t\t\tinputSchema: parameterSchema,\n\t\t});\n\n\t\tconst graphRef = graph;\n\t\tconst actorRef = actor;\n\t\tconst nv = node.v;\n\t\tdefinitions.push({\n\t\t\tname: path,\n\t\t\tdescription,\n\t\t\tparameters: parameterSchema,\n\t\t\thandler(args: Record<string, unknown>) {\n\t\t\t\tgraphRef.set(path, args.value, actorRef ? { actor: actorRef } : undefined);\n\t\t\t\treturn args.value;\n\t\t\t},\n\t\t\t...(nv != null ? { version: { id: nv.id, version: nv.version } } : {}),\n\t\t});\n\t}\n\n\treturn { openai, mcp, definitions };\n}\n\n// ---------------------------------------------------------------------------\n// gaugesAsContext\n// ---------------------------------------------------------------------------\n\nexport type GaugesAsContextOptions = {\n\t/** Group gauges by `meta.tags` (default true). */\n\tgroupByTags?: boolean;\n\t/** Separator between gauge lines (default \"\\n\"). */\n\tseparator?: string;\n\t/**\n\t * V0 delta mode (§6.0b): only include nodes whose `v.version` exceeds\n\t * the corresponding entry in this map. Nodes without V0 or not in the\n\t * map are always included. Callers maintain this map across calls.\n\t *\n\t * The `id` field guards against node replacement: if a node is removed\n\t * and re-added under the same name (new id), it is always included.\n\t */\n\tsinceVersion?: ReadonlyMap<string, { id: string; version: number }>;\n};\n\n/**\n * Format a graph's readable (gauge) nodes as a context string for LLM\n * system prompts.\n *\n * Gauges are nodes with `meta.description` or `meta.format`. Values are\n * formatted using `meta.format` and `meta.unit` hints.\n *\n * @param graph - The graph to introspect.\n * @param actor - Optional actor for guard-scoped describe.\n * @param options - Formatting options.\n * @returns A formatted string ready for system prompt injection.\n */\nexport function gaugesAsContext(\n\tgraph: Graph,\n\tactor?: Actor,\n\toptions?: GaugesAsContextOptions,\n): string {\n\tconst described = graph.describe({ actor, detail: \"full\" });\n\tconst groupByTags = options?.groupByTags ?? true;\n\tconst separator = options?.separator ?? \"\\n\";\n\n\ttype GaugeEntry = { path: string; description: string; formatted: string };\n\tconst entries: GaugeEntry[] = [];\n\n\tconst sinceVersion = options?.sinceVersion;\n\tfor (const [path, node] of Object.entries(described.nodes)) {\n\t\tconst meta = node.meta ?? {};\n\t\tconst desc = meta.description as string | undefined;\n\t\tconst format = meta.format as string | undefined;\n\t\t// Must have description or format to be a gauge\n\t\tif (!desc && !format) continue;\n\t\t// V0 delta filter: skip nodes unchanged since last seen version (§6.0b).\n\t\tif (sinceVersion != null && node.v != null) {\n\t\t\tconst lastSeen = sinceVersion.get(path);\n\t\t\tif (lastSeen != null && lastSeen.id === node.v.id && node.v.version <= lastSeen.version)\n\t\t\t\tcontinue;\n\t\t}\n\n\t\tconst label = desc ?? path;\n\t\tconst value = node.value;\n\t\tconst unit = meta.unit as string | undefined;\n\n\t\tlet formatted: string;\n\t\tif (format === \"currency\" && typeof value === \"number\") {\n\t\t\tformatted = `$${value.toFixed(2)}`;\n\t\t} else if (format === \"percentage\" && typeof value === \"number\") {\n\t\t\tformatted = `${(value * 100).toFixed(1)}%`;\n\t\t} else if (value === undefined || value === null) {\n\t\t\tformatted = \"(no value)\";\n\t\t} else {\n\t\t\tformatted = String(value);\n\t\t}\n\n\t\tif (unit && format !== \"currency\" && format !== \"percentage\") {\n\t\t\tformatted = `${formatted} ${unit}`;\n\t\t}\n\n\t\tentries.push({ path, description: label, formatted });\n\t}\n\n\tif (entries.length === 0) return \"\";\n\n\tif (groupByTags) {\n\t\tconst tagGroups = new Map<string, GaugeEntry[]>();\n\t\tconst ungrouped: GaugeEntry[] = [];\n\n\t\tfor (const entry of entries) {\n\t\t\tconst node = described.nodes[entry.path]!;\n\t\t\tconst tags = node.meta?.tags as string[] | undefined;\n\t\t\tif (tags && tags.length > 0) {\n\t\t\t\t// Use first tag for grouping to avoid duplicating entries across groups\n\t\t\t\tconst tag = tags[0]!;\n\t\t\t\tlet group = tagGroups.get(tag);\n\t\t\t\tif (!group) {\n\t\t\t\t\tgroup = [];\n\t\t\t\t\ttagGroups.set(tag, group);\n\t\t\t\t}\n\t\t\t\tgroup.push(entry);\n\t\t\t} else {\n\t\t\t\tungrouped.push(entry);\n\t\t\t}\n\t\t}\n\n\t\tif (tagGroups.size === 0) {\n\t\t\treturn entries.map((e) => `- ${e.description}: ${e.formatted}`).join(separator);\n\t\t}\n\n\t\tconst sections: string[] = [];\n\t\tfor (const [tag, group] of [...tagGroups.entries()].sort((a, b) => a[0].localeCompare(b[0]))) {\n\t\t\tsections.push(\n\t\t\t\t`[${tag}]${separator}${group.map((e) => `- ${e.description}: ${e.formatted}`).join(separator)}`,\n\t\t\t);\n\t\t}\n\t\tif (ungrouped.length > 0) {\n\t\t\tsections.push(ungrouped.map((e) => `- ${e.description}: ${e.formatted}`).join(separator));\n\t\t}\n\t\treturn sections.join(separator + separator);\n\t}\n\n\treturn entries.map((e) => `- ${e.description}: ${e.formatted}`).join(separator);\n}\n\n// ---------------------------------------------------------------------------\n// validateGraphDef\n// ---------------------------------------------------------------------------\n\n/** Validation result from {@link validateGraphDef}. */\nexport type GraphDefValidation = {\n\treadonly valid: boolean;\n\treadonly errors: readonly string[];\n};\n\nconst VALID_NODE_TYPES = new Set([\"state\", \"derived\", \"producer\", \"operator\", \"effect\"]);\n\n/**\n * Validate an LLM-generated graph definition before passing to\n * `Graph.fromSnapshot()`.\n *\n * Checks:\n * - Required fields: `name`, `nodes`, `edges`\n * - Node types are valid enum values\n * - Edge `from`/`to` reference existing nodes\n * - No duplicate edge entries\n *\n * @param def - The graph definition to validate (parsed JSON).\n * @returns Validation result with errors array.\n */\nexport function validateGraphDef(def: unknown): GraphDefValidation {\n\tconst errors: string[] = [];\n\n\tif (def == null || typeof def !== \"object\") {\n\t\treturn { valid: false, errors: [\"Definition must be a non-null object\"] };\n\t}\n\n\tconst d = def as Record<string, unknown>;\n\n\tif (typeof d.name !== \"string\" || d.name.length === 0) {\n\t\terrors.push(\"Missing or empty 'name' field\");\n\t}\n\n\tif (d.nodes == null || typeof d.nodes !== \"object\" || Array.isArray(d.nodes)) {\n\t\terrors.push(\"Missing or invalid 'nodes' field (must be an object)\");\n\t\treturn { valid: false, errors };\n\t}\n\n\tconst nodeNames = new Set(Object.keys(d.nodes as object));\n\n\tfor (const [name, raw] of Object.entries(d.nodes as Record<string, unknown>)) {\n\t\tif (raw == null || typeof raw !== \"object\") {\n\t\t\terrors.push(`Node \"${name}\": must be an object`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst node = raw as Record<string, unknown>;\n\t\tif (typeof node.type !== \"string\" || !VALID_NODE_TYPES.has(node.type)) {\n\t\t\terrors.push(\n\t\t\t\t`Node \"${name}\": invalid type \"${String(node.type)}\" (expected: ${[...VALID_NODE_TYPES].join(\", \")})`,\n\t\t\t);\n\t\t}\n\t\tif (Array.isArray(node.deps)) {\n\t\t\tfor (const dep of node.deps) {\n\t\t\t\tif (typeof dep === \"string\" && !nodeNames.has(dep)) {\n\t\t\t\t\terrors.push(`Node \"${name}\": dep \"${dep}\" does not reference an existing node`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!Array.isArray(d.edges)) {\n\t\tif (d.edges !== undefined) {\n\t\t\terrors.push(\"'edges' must be an array\");\n\t\t}\n\t\t// edges are optional — no error if absent\n\t} else {\n\t\tconst seen = new Set<string>();\n\t\tfor (let i = 0; i < (d.edges as unknown[]).length; i++) {\n\t\t\tconst edge = (d.edges as unknown[])[i];\n\t\t\tif (edge == null || typeof edge !== \"object\") {\n\t\t\t\terrors.push(`Edge [${i}]: must be an object`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst e = edge as Record<string, unknown>;\n\t\t\tif (typeof e.from !== \"string\" || !nodeNames.has(e.from)) {\n\t\t\t\terrors.push(`Edge [${i}]: 'from' \"${String(e.from)}\" does not reference an existing node`);\n\t\t\t}\n\t\t\tif (typeof e.to !== \"string\" || !nodeNames.has(e.to)) {\n\t\t\t\terrors.push(`Edge [${i}]: 'to' \"${String(e.to)}\" does not reference an existing node`);\n\t\t\t}\n\t\t\tconst key = `${e.from}->${e.to}`;\n\t\t\tif (seen.has(key)) {\n\t\t\t\terrors.push(`Edge [${i}]: duplicate edge ${key}`);\n\t\t\t}\n\t\t\tseen.add(key);\n\t\t}\n\t}\n\n\treturn { valid: errors.length === 0, errors };\n}\n\n// ---------------------------------------------------------------------------\n// graphFromSpec\n// ---------------------------------------------------------------------------\n\nexport type GraphFromSpecOptions = {\n\tmodel?: string;\n\ttemperature?: number;\n\tmaxTokens?: number;\n\t/** Callback to construct topology before values are applied (passed to `Graph.fromSnapshot`). */\n\tbuild?: (g: Graph) => void;\n\t/** Extra instructions appended to the system prompt. */\n\tsystemPromptExtra?: string;\n};\n\n/** Strip markdown code fences, handling trailing commentary after closing fence. */\nfunction stripFences(text: string): string {\n\tconst match = text.match(/^```(?:json)?\\s*([\\s\\S]*?)\\s*```[\\s\\S]*$/);\n\treturn match ? match[1]! : text;\n}\n\nconst GRAPH_FROM_SPEC_SYSTEM_PROMPT = `You are a graph architect for GraphReFly, a reactive graph protocol.\n\nGiven a natural-language description, produce a JSON graph definition with this structure:\n\n{\n \"name\": \"<graph_name>\",\n \"nodes\": {\n \"<node_name>\": {\n \"type\": \"state\" | \"derived\" | \"producer\" | \"operator\" | \"effect\",\n \"value\": <initial_value_or_null>,\n \"deps\": [\"<dep_node_name>\", ...],\n \"meta\": {\n \"description\": \"<human-readable purpose>\",\n \"type\": \"string\" | \"number\" | \"boolean\" | \"integer\" | \"enum\",\n \"range\": [min, max],\n \"values\": [\"a\", \"b\"],\n \"format\": \"currency\" | \"percentage\" | \"status\",\n \"access\": \"human\" | \"llm\" | \"both\" | \"system\",\n \"unit\": \"<unit>\",\n \"tags\": [\"<tag>\"]\n }\n }\n },\n \"edges\": [\n { \"from\": \"<source_node>\", \"to\": \"<target_node>\" }\n ]\n}\n\nRules:\n- \"state\" nodes have no deps and hold user/LLM-writable values (knobs).\n- \"derived\" nodes have deps and compute from them.\n- \"effect\" nodes have deps but produce side effects (no return value).\n- \"producer\" nodes have no deps but generate values asynchronously.\n- Edges wire output of one node as input to another. They must match deps.\n- meta.description is required for every node.\n- Return ONLY valid JSON, no markdown fences or commentary.`;\n\n/**\n * Ask an LLM to compose a Graph from a natural-language description.\n *\n * The LLM returns a JSON graph definition which is validated and then\n * constructed via `Graph.fromSnapshot()`.\n *\n * @param naturalLanguage - The problem/use-case description.\n * @param adapter - LLM adapter for the generation call.\n * @param opts - Model options and optional `build` callback for node factories.\n * @returns A constructed Graph.\n * @throws On invalid LLM output or validation failure.\n */\nexport async function graphFromSpec(\n\tnaturalLanguage: string,\n\tadapter: LLMAdapter,\n\topts?: GraphFromSpecOptions,\n): Promise<Graph> {\n\tconst systemPrompt = opts?.systemPromptExtra\n\t\t? `${GRAPH_FROM_SPEC_SYSTEM_PROMPT}\\n\\n${opts.systemPromptExtra}`\n\t\t: GRAPH_FROM_SPEC_SYSTEM_PROMPT;\n\n\tconst messages: ChatMessage[] = [\n\t\t{ role: \"system\", content: systemPrompt },\n\t\t{ role: \"user\", content: naturalLanguage },\n\t];\n\n\tconst rawResult = adapter.invoke(messages, {\n\t\tmodel: opts?.model,\n\t\ttemperature: opts?.temperature ?? 0,\n\t\tmaxTokens: opts?.maxTokens,\n\t});\n\n\tconst response = (await resolveToolHandlerResult(rawResult)) as LLMResponse;\n\tlet content = response.content.trim();\n\n\t// Strip markdown fences if present (handles trailing commentary after ```)\n\tif (content.startsWith(\"```\")) {\n\t\tcontent = stripFences(content);\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(content);\n\t} catch {\n\t\tthrow new Error(`graphFromSpec: LLM response is not valid JSON: ${content.slice(0, 200)}`);\n\t}\n\n\tconst validation = validateGraphDef(parsed);\n\tif (!validation.valid) {\n\t\tthrow new Error(`graphFromSpec: invalid graph definition:\\n${validation.errors.join(\"\\n\")}`);\n\t}\n\n\tconst def = parsed as Record<string, unknown>;\n\t// Ensure version field is present for fromSnapshot envelope check\n\tif (def.version === undefined) def.version = 1;\n\tif (!Array.isArray(def.subgraphs)) def.subgraphs = [];\n\treturn Graph.fromSnapshot(def as GraphPersistSnapshot, opts?.build);\n}\n\n// ---------------------------------------------------------------------------\n// suggestStrategy\n// ---------------------------------------------------------------------------\n\n/** A single operation in a strategy plan. */\nexport type StrategyOperation =\n\t| {\n\t\t\treadonly type: \"add_node\";\n\t\t\treadonly name: string;\n\t\t\treadonly nodeType: string;\n\t\t\treadonly meta?: Record<string, unknown>;\n\t\t\treadonly initial?: unknown;\n\t }\n\t| { readonly type: \"remove_node\"; readonly name: string }\n\t| { readonly type: \"connect\"; readonly from: string; readonly to: string }\n\t| { readonly type: \"disconnect\"; readonly from: string; readonly to: string }\n\t| { readonly type: \"set_value\"; readonly name: string; readonly value: unknown }\n\t| {\n\t\t\treadonly type: \"update_meta\";\n\t\t\treadonly name: string;\n\t\t\treadonly key: string;\n\t\t\treadonly value: unknown;\n\t };\n\n/** Structured strategy plan returned by {@link suggestStrategy}. */\nexport type StrategyPlan = {\n\treadonly summary: string;\n\treadonly operations: readonly StrategyOperation[];\n\treadonly reasoning: string;\n};\n\nexport type SuggestStrategyOptions = {\n\tmodel?: string;\n\ttemperature?: number;\n\tmaxTokens?: number;\n\tactor?: Actor;\n};\n\nconst SUGGEST_STRATEGY_SYSTEM_PROMPT = `You are a reactive graph optimizer for GraphReFly.\n\nGiven a graph's current structure (from describe()) and a problem statement, suggest topology and parameter changes to solve the problem.\n\nReturn ONLY valid JSON with this structure:\n{\n \"summary\": \"<one-line summary of the strategy>\",\n \"reasoning\": \"<explanation of why these changes help>\",\n \"operations\": [\n { \"type\": \"add_node\", \"name\": \"<name>\", \"nodeType\": \"state|derived|effect|producer|operator\", \"meta\": {...}, \"initial\": <value> },\n { \"type\": \"remove_node\", \"name\": \"<name>\" },\n { \"type\": \"connect\", \"from\": \"<source>\", \"to\": \"<target>\" },\n { \"type\": \"disconnect\", \"from\": \"<source>\", \"to\": \"<target>\" },\n { \"type\": \"set_value\", \"name\": \"<name>\", \"value\": <new_value> },\n { \"type\": \"update_meta\", \"name\": \"<name>\", \"key\": \"<meta_key>\", \"value\": <new_value> }\n ]\n}\n\nRules:\n- Only suggest operations that reference existing nodes (for remove/disconnect/set_value/update_meta) or new nodes you define (for add_node).\n- Keep changes minimal — prefer the smallest set of operations that solves the problem.\n- Return ONLY valid JSON, no markdown fences or commentary.`;\n\n/**\n * Ask an LLM to analyze a graph and suggest topology/parameter changes\n * to solve a stated problem.\n *\n * Returns a structured plan — does NOT auto-apply. The caller reviews\n * and selectively applies operations.\n *\n * @param graph - The graph to analyze.\n * @param problem - Natural-language problem statement.\n * @param adapter - LLM adapter for the analysis call.\n * @param opts - Model and actor options.\n * @returns A structured strategy plan.\n * @throws On invalid LLM output.\n */\nexport async function suggestStrategy(\n\tgraph: Graph,\n\tproblem: string,\n\tadapter: LLMAdapter,\n\topts?: SuggestStrategyOptions,\n): Promise<StrategyPlan> {\n\tconst { expand: _, ...described } = graph.describe({ actor: opts?.actor, detail: \"standard\" });\n\n\tconst messages: ChatMessage[] = [\n\t\t{ role: \"system\", content: SUGGEST_STRATEGY_SYSTEM_PROMPT },\n\t\t{\n\t\t\trole: \"user\",\n\t\t\tcontent: JSON.stringify({\n\t\t\t\tgraph: described,\n\t\t\t\tproblem,\n\t\t\t}),\n\t\t},\n\t];\n\n\tconst rawResult = adapter.invoke(messages, {\n\t\tmodel: opts?.model,\n\t\ttemperature: opts?.temperature ?? 0,\n\t\tmaxTokens: opts?.maxTokens,\n\t});\n\n\tconst response = (await resolveToolHandlerResult(rawResult)) as LLMResponse;\n\tlet content = response.content.trim();\n\n\tif (content.startsWith(\"```\")) {\n\t\tcontent = content.replace(/^```(?:json)?\\s*/, \"\").replace(/\\s*```$/, \"\");\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(content);\n\t} catch {\n\t\tthrow new Error(`suggestStrategy: LLM response is not valid JSON: ${content.slice(0, 200)}`);\n\t}\n\n\tconst plan = parsed as Record<string, unknown>;\n\n\tif (typeof plan.summary !== \"string\") {\n\t\tthrow new Error(\"suggestStrategy: missing 'summary' in response\");\n\t}\n\tif (typeof plan.reasoning !== \"string\") {\n\t\tthrow new Error(\"suggestStrategy: missing 'reasoning' in response\");\n\t}\n\tif (!Array.isArray(plan.operations)) {\n\t\tthrow new Error(\"suggestStrategy: missing 'operations' array in response\");\n\t}\n\n\treturn {\n\t\tsummary: plan.summary,\n\t\treasoning: plan.reasoning,\n\t\toperations: plan.operations as readonly StrategyOperation[],\n\t};\n}\n","/**\n * Memory patterns (roadmap §4.3).\n *\n * Domain-layer helpers composed from GraphRefly primitives. `vectorIndex` uses\n * an exact-search backend by default; an HNSW adapter can be injected as an\n * optional dependency.\n */\n\nimport { monotonicNs } from \"../core/clock.js\";\nimport { DATA } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { derived, state } from \"../core/sugar.js\";\nimport { Graph } from \"../graph/graph.js\";\n\nexport type CollectionPolicy = \"fifo\" | \"lru\";\nexport type VectorBackend = \"flat\" | \"hnsw\";\n\nexport type LightCollectionEntry<T> = {\n\treadonly id: string;\n\treadonly value: T;\n\treadonly createdAtNs: number;\n\treadonly lastAccessNs: number;\n};\n\nexport type LightCollectionOptions = {\n\tname?: string;\n\tmaxSize?: number;\n\tpolicy?: CollectionPolicy;\n};\n\nexport type LightCollectionBundle<T> = {\n\treadonly entries: Node<ReadonlyMap<string, LightCollectionEntry<T>>>;\n\tupsert: (id: string, value: T) => void;\n\tremove: (id: string) => void;\n\tclear: () => void;\n\tget: (id: string) => T | undefined;\n\thas: (id: string) => boolean;\n};\n\nexport type CollectionEntry<T> = LightCollectionEntry<T> & {\n\treadonly baseScore: number;\n};\n\nexport type RankedCollectionEntry<T> = CollectionEntry<T> & {\n\treadonly score: number;\n};\n\nexport type CollectionOptions<T> = {\n\tmaxSize?: number;\n\tpolicy?: CollectionPolicy;\n\t/**\n\t * Produces a base score at insert/update time.\n\t */\n\tscore?: (value: T) => number;\n\t/**\n\t * Exponential decay rate per second. 0 disables decay.\n\t */\n\tdecayRate?: number;\n\t/**\n\t * Minimum score floor after decay.\n\t */\n\tminScore?: number;\n};\n\nexport type CollectionGraph<T> = Graph & {\n\tupsert: (id: string, value: T, opts?: { score?: number }) => void;\n\tremove: (id: string) => void;\n\tclear: () => void;\n\tgetItem: (id: string) => CollectionEntry<T> | undefined;\n};\n\nexport type VectorRecord<TMeta> = {\n\treadonly id: string;\n\treadonly vector: readonly number[];\n\treadonly meta?: TMeta;\n};\n\nexport type VectorSearchResult<TMeta> = {\n\treadonly id: string;\n\treadonly score: number;\n\treadonly meta?: TMeta;\n};\n\nexport type HnswAdapter<TMeta> = {\n\tupsert: (id: string, vector: readonly number[], meta?: TMeta) => void;\n\tremove: (id: string) => void;\n\tclear: () => void;\n\tsearch: (query: readonly number[], k: number) => ReadonlyArray<VectorSearchResult<TMeta>>;\n};\n\nexport type VectorIndexOptions<TMeta> = {\n\tbackend?: VectorBackend;\n\tdimension?: number;\n\t/**\n\t * Optional dependency seam for HNSW.\n\t */\n\thnswFactory?: () => HnswAdapter<TMeta>;\n};\n\nexport type VectorIndexBundle<TMeta> = {\n\treadonly backend: VectorBackend;\n\treadonly entries: Node<ReadonlyMap<string, VectorRecord<TMeta>>>;\n\tupsert: (id: string, vector: readonly number[], meta?: TMeta) => void;\n\tremove: (id: string) => void;\n\tclear: () => void;\n\tsearch: (query: readonly number[], k?: number) => ReadonlyArray<VectorSearchResult<TMeta>>;\n};\n\nexport type KnowledgeEdge<TRelation extends string = string> = {\n\treadonly from: string;\n\treadonly to: string;\n\treadonly relation: TRelation;\n\treadonly weight: number;\n};\n\nexport type KnowledgeGraphGraph<TEntity, TRelation extends string = string> = Graph & {\n\tupsertEntity: (id: string, value: TEntity) => void;\n\tremoveEntity: (id: string) => void;\n\tlink: (from: string, to: string, relation: TRelation, weight?: number) => void;\n\tunlink: (from: string, to: string, relation?: TRelation) => void;\n\trelated: (id: string, relation?: TRelation) => ReadonlyArray<KnowledgeEdge<TRelation>>;\n};\n\nexport function decay(\n\tbaseScore: number,\n\tageSeconds: number,\n\tratePerSecond: number,\n\tminScore = 0,\n): number {\n\tif (!Number.isFinite(baseScore)) return minScore;\n\tif (!Number.isFinite(ageSeconds) || ageSeconds <= 0) return Math.max(minScore, baseScore);\n\tif (!Number.isFinite(ratePerSecond) || ratePerSecond <= 0) return Math.max(minScore, baseScore);\n\tconst decayed = baseScore * Math.exp(-ratePerSecond * ageSeconds);\n\treturn Math.max(minScore, decayed);\n}\n\nfunction assertMaxSize(maxSize: number | undefined): void {\n\tif (maxSize !== undefined && maxSize < 1) {\n\t\tthrow new RangeError(\"maxSize must be >= 1\");\n\t}\n}\n\nfunction copyMap<K, V>(m: ReadonlyMap<K, V>): Map<K, V> {\n\treturn new Map(m);\n}\n\nfunction readMap<K, V>(node: Node<ReadonlyMap<K, V>>): ReadonlyMap<K, V> {\n\treturn node.get() ?? new Map<K, V>();\n}\n\nfunction readArray<T>(node: Node<ReadonlyArray<T>>): ReadonlyArray<T> {\n\treturn node.get() ?? [];\n}\n\nfunction cosineSimilarity(a: readonly number[], b: readonly number[]): number {\n\tconst n = Math.max(a.length, b.length);\n\tlet dot = 0;\n\tlet na = 0;\n\tlet nb = 0;\n\tfor (let i = 0; i < n; i += 1) {\n\t\tconst av = a[i] ?? 0;\n\t\tconst bv = b[i] ?? 0;\n\t\tdot += av * bv;\n\t\tna += av * av;\n\t\tnb += bv * bv;\n\t}\n\tif (na === 0 || nb === 0) return 0;\n\treturn dot / Math.sqrt(na * nb);\n}\n\nexport function lightCollection<T>(opts: LightCollectionOptions = {}): LightCollectionBundle<T> {\n\tconst maxSize = opts.maxSize;\n\tconst policy = opts.policy ?? \"fifo\";\n\tassertMaxSize(maxSize);\n\n\tconst entries = state<ReadonlyMap<string, LightCollectionEntry<T>>>(new Map(), {\n\t\tname: opts.name,\n\t\tdescribeKind: \"state\",\n\t});\n\n\tfunction evictIfNeeded(next: Map<string, LightCollectionEntry<T>>): void {\n\t\tif (maxSize === undefined) return;\n\t\twhile (next.size > maxSize) {\n\t\t\tlet victim: LightCollectionEntry<T> | undefined;\n\t\t\tfor (const entry of next.values()) {\n\t\t\t\tif (!victim) {\n\t\t\t\t\tvictim = entry;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst lhs = policy === \"lru\" ? entry.lastAccessNs : entry.createdAtNs;\n\t\t\t\tconst rhs = policy === \"lru\" ? victim.lastAccessNs : victim.createdAtNs;\n\t\t\t\tif (lhs < rhs) victim = entry;\n\t\t\t}\n\t\t\tif (!victim) break;\n\t\t\tnext.delete(victim.id);\n\t\t}\n\t}\n\n\tfunction commit(next: Map<string, LightCollectionEntry<T>>): void {\n\t\tentries.down([[DATA, next]]);\n\t}\n\n\treturn {\n\t\tentries,\n\t\tupsert(id, value) {\n\t\t\tconst now = monotonicNs();\n\t\t\tconst current = readMap(entries);\n\t\t\tconst prev = current.get(id);\n\t\t\tconst next = copyMap(current);\n\t\t\tnext.set(id, {\n\t\t\t\tid,\n\t\t\t\tvalue,\n\t\t\t\tcreatedAtNs: prev?.createdAtNs ?? now,\n\t\t\t\tlastAccessNs: now,\n\t\t\t});\n\t\t\tevictIfNeeded(next);\n\t\t\tcommit(next);\n\t\t},\n\t\tremove(id) {\n\t\t\tconst next = copyMap(readMap(entries));\n\t\t\tif (!next.delete(id)) return;\n\t\t\tcommit(next);\n\t\t},\n\t\tclear() {\n\t\t\tif (readMap(entries).size === 0) return;\n\t\t\tcommit(new Map());\n\t\t},\n\t\tget(id) {\n\t\t\tconst current = readMap(entries);\n\t\t\tconst found = current.get(id);\n\t\t\tif (!found) return undefined;\n\t\t\tif (policy === \"lru\") {\n\t\t\t\tconst now = monotonicNs();\n\t\t\t\tconst next = copyMap(current);\n\t\t\t\tnext.set(id, { ...found, lastAccessNs: now });\n\t\t\t\tcommit(next);\n\t\t\t}\n\t\t\treturn found.value;\n\t\t},\n\t\thas(id) {\n\t\t\treturn readMap(entries).has(id);\n\t\t},\n\t};\n}\n\nexport function collection<T>(name: string, opts: CollectionOptions<T> = {}): CollectionGraph<T> {\n\tconst maxSize = opts.maxSize;\n\tconst policy = opts.policy ?? \"lru\";\n\tconst decayRate = opts.decayRate ?? 0;\n\tconst minScore = opts.minScore ?? 0;\n\tconst scoreFn = opts.score ?? (() => 1);\n\tassertMaxSize(maxSize);\n\n\tconst graph = new Graph(name);\n\tconst items = state<ReadonlyMap<string, CollectionEntry<T>>>(new Map(), {\n\t\tname: \"items\",\n\t\tdescribeKind: \"state\",\n\t});\n\tconst ranked = derived(\n\t\t[items],\n\t\t([snapshot]) => {\n\t\t\tconst typed = (snapshot ?? new Map()) as ReadonlyMap<string, CollectionEntry<T>>;\n\t\t\tconst now = monotonicNs();\n\t\t\tconst out = [...typed.values()].map((entry) => {\n\t\t\t\tconst ageSeconds = (now - entry.lastAccessNs) / 1_000_000_000;\n\t\t\t\treturn {\n\t\t\t\t\t...entry,\n\t\t\t\t\tscore: decay(entry.baseScore, ageSeconds, decayRate, minScore),\n\t\t\t\t};\n\t\t\t});\n\t\t\tout.sort((a, b) => b.score - a.score || b.lastAccessNs - a.lastAccessNs);\n\t\t\treturn out;\n\t\t},\n\t\t{ name: \"ranked\", describeKind: \"derived\" },\n\t);\n\tconst size = derived(\n\t\t[items],\n\t\t([snapshot]) => ((snapshot ?? new Map()) as ReadonlyMap<string, CollectionEntry<T>>).size,\n\t\t{\n\t\t\tname: \"size\",\n\t\t\tdescribeKind: \"derived\",\n\t\t\tinitial: 0,\n\t\t},\n\t);\n\tvoid ranked.subscribe(() => undefined);\n\tvoid size.subscribe(() => undefined);\n\n\tgraph.add(\"items\", items);\n\tgraph.add(\"ranked\", ranked);\n\tgraph.add(\"size\", size);\n\tgraph.connect(\"items\", \"ranked\");\n\tgraph.connect(\"items\", \"size\");\n\n\tfunction effective(entry: CollectionEntry<T>, now: number): number {\n\t\tconst ageSeconds = (now - entry.lastAccessNs) / 1_000_000_000;\n\t\treturn decay(entry.baseScore, ageSeconds, decayRate, minScore);\n\t}\n\n\tfunction evictIfNeeded(next: Map<string, CollectionEntry<T>>): void {\n\t\tif (maxSize === undefined) return;\n\t\twhile (next.size > maxSize) {\n\t\t\tconst now = monotonicNs();\n\t\t\tlet victim: CollectionEntry<T> | undefined;\n\t\t\tlet victimScore = Number.POSITIVE_INFINITY;\n\t\t\tfor (const entry of next.values()) {\n\t\t\t\tconst score = effective(entry, now);\n\t\t\t\tif (score < victimScore) {\n\t\t\t\t\tvictim = entry;\n\t\t\t\t\tvictimScore = score;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (score === victimScore && victim) {\n\t\t\t\t\tconst lhs = policy === \"lru\" ? entry.lastAccessNs : entry.createdAtNs;\n\t\t\t\t\tconst rhs = policy === \"lru\" ? victim.lastAccessNs : victim.createdAtNs;\n\t\t\t\t\tif (lhs < rhs) victim = entry;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!victim) break;\n\t\t\tnext.delete(victim.id);\n\t\t}\n\t}\n\n\tfunction commit(next: Map<string, CollectionEntry<T>>): void {\n\t\titems.down([[DATA, next]]);\n\t}\n\n\tconst out = Object.assign(graph, {\n\t\tupsert(id: string, value: T, upsertOpts?: { score?: number }) {\n\t\t\tconst now = monotonicNs();\n\t\t\tconst current = readMap(items);\n\t\t\tconst prev = current.get(id);\n\t\t\tconst baseScore = upsertOpts?.score ?? scoreFn(value);\n\t\t\tconst next = copyMap(current);\n\t\t\tnext.set(id, {\n\t\t\t\tid,\n\t\t\t\tvalue,\n\t\t\t\tbaseScore,\n\t\t\t\tcreatedAtNs: prev?.createdAtNs ?? now,\n\t\t\t\tlastAccessNs: now,\n\t\t\t});\n\t\t\tevictIfNeeded(next);\n\t\t\tcommit(next);\n\t\t},\n\t\tremove(id: string) {\n\t\t\tconst next = copyMap(readMap(items));\n\t\t\tif (!next.delete(id)) return;\n\t\t\tcommit(next);\n\t\t},\n\t\tclear() {\n\t\t\tif (readMap(items).size === 0) return;\n\t\t\tcommit(new Map());\n\t\t},\n\t\tgetItem(id: string): CollectionEntry<T> | undefined {\n\t\t\tconst current = readMap(items);\n\t\t\tconst found = current.get(id);\n\t\t\tif (!found) return undefined;\n\t\t\tif (policy === \"lru\") {\n\t\t\t\tconst next = copyMap(current);\n\t\t\t\tnext.set(id, { ...found, lastAccessNs: monotonicNs() });\n\t\t\t\tcommit(next);\n\t\t\t}\n\t\t\treturn found;\n\t\t},\n\t}) as CollectionGraph<T>;\n\treturn out;\n}\n\nexport function vectorIndex<TMeta>(opts: VectorIndexOptions<TMeta> = {}): VectorIndexBundle<TMeta> {\n\tconst backend = opts.backend ?? \"flat\";\n\tconst dimension = opts.dimension;\n\tlet hnsw: HnswAdapter<TMeta> | undefined;\n\tif (backend === \"hnsw\") {\n\t\thnsw = opts.hnswFactory?.();\n\t\tif (!hnsw) {\n\t\t\tthrow new Error(\n\t\t\t\t'vectorIndex backend \"hnsw\" requires an optional dependency adapter; install your HNSW package and provide `hnswFactory`.',\n\t\t\t);\n\t\t}\n\t}\n\n\tconst entries = state<ReadonlyMap<string, VectorRecord<TMeta>>>(new Map(), {\n\t\tdescribeKind: \"state\",\n\t\tname: \"vector-index\",\n\t});\n\n\tfunction assertDimension(vector: readonly number[]): void {\n\t\tif (dimension !== undefined && vector.length !== dimension) {\n\t\t\tthrow new RangeError(\n\t\t\t\t`vector dimension mismatch: expected ${dimension}, got ${vector.length}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tfunction commit(next: Map<string, VectorRecord<TMeta>>): void {\n\t\tentries.down([[DATA, next]]);\n\t}\n\n\treturn {\n\t\tbackend,\n\t\tentries,\n\t\tupsert(id, vector, meta) {\n\t\t\tassertDimension(vector);\n\t\t\tconst next = copyMap(readMap(entries));\n\t\t\tnext.set(id, { id, vector: [...vector], meta });\n\t\t\tif (backend === \"hnsw\") hnsw!.upsert(id, vector, meta);\n\t\t\tcommit(next);\n\t\t},\n\t\tremove(id) {\n\t\t\tconst next = copyMap(readMap(entries));\n\t\t\tif (!next.delete(id)) return;\n\t\t\tif (backend === \"hnsw\") hnsw!.remove(id);\n\t\t\tcommit(next);\n\t\t},\n\t\tclear() {\n\t\t\tif (readMap(entries).size === 0) return;\n\t\t\tif (backend === \"hnsw\") hnsw!.clear();\n\t\t\tcommit(new Map());\n\t\t},\n\t\tsearch(query, k = 5) {\n\t\t\tassertDimension(query);\n\t\t\tif (k <= 0) return [];\n\t\t\tif (backend === \"hnsw\") return hnsw!.search(query, k);\n\t\t\tconst ranked = [...readMap(entries).values()]\n\t\t\t\t.map((row) => ({\n\t\t\t\t\tid: row.id,\n\t\t\t\t\tscore: cosineSimilarity(query, row.vector),\n\t\t\t\t\tmeta: row.meta,\n\t\t\t\t}))\n\t\t\t\t.sort((a, b) => b.score - a.score)\n\t\t\t\t.slice(0, k);\n\t\t\treturn ranked;\n\t\t},\n\t};\n}\n\nexport function knowledgeGraph<TEntity, TRelation extends string = string>(\n\tname: string,\n): KnowledgeGraphGraph<TEntity, TRelation> {\n\tconst graph = new Graph(name);\n\tconst entities = state<ReadonlyMap<string, TEntity>>(new Map(), {\n\t\tname: \"entities\",\n\t\tdescribeKind: \"state\",\n\t});\n\tconst edges = state<ReadonlyArray<KnowledgeEdge<TRelation>>>([], {\n\t\tname: \"edges\",\n\t\tdescribeKind: \"state\",\n\t});\n\tconst adjacency = derived(\n\t\t[edges],\n\t\t([rows]) => {\n\t\t\tconst typed = (rows ?? []) as ReadonlyArray<KnowledgeEdge<TRelation>>;\n\t\t\tconst out = new Map<string, ReadonlyArray<KnowledgeEdge<TRelation>>>();\n\t\t\tfor (const edge of typed) {\n\t\t\t\tconst prev = out.get(edge.from) ?? [];\n\t\t\t\tout.set(edge.from, Object.freeze([...prev, edge]));\n\t\t\t}\n\t\t\treturn out;\n\t\t},\n\t\t{ name: \"adjacency\", describeKind: \"derived\", initial: new Map() },\n\t);\n\tvoid adjacency.subscribe(() => undefined);\n\n\tgraph.add(\"entities\", entities);\n\tgraph.add(\"edges\", edges);\n\tgraph.add(\"adjacency\", adjacency);\n\tgraph.connect(\"edges\", \"adjacency\");\n\n\tfunction commitEntities(next: Map<string, TEntity>): void {\n\t\tentities.down([[DATA, next]]);\n\t}\n\n\tfunction commitEdges(next: ReadonlyArray<KnowledgeEdge<TRelation>>): void {\n\t\tedges.down([[DATA, next]]);\n\t}\n\n\tconst out = Object.assign(graph, {\n\t\tupsertEntity(id: string, value: TEntity) {\n\t\t\tconst next = copyMap(readMap(entities));\n\t\t\tnext.set(id, value);\n\t\t\tcommitEntities(next);\n\t\t},\n\t\tremoveEntity(id: string) {\n\t\t\tconst nextEntities = copyMap(readMap(entities));\n\t\t\tconst existed = nextEntities.delete(id);\n\t\t\tconst currentEdges = readArray(edges);\n\t\t\tconst nextEdges = currentEdges.filter((edge) => edge.from !== id && edge.to !== id);\n\t\t\tif (!existed && nextEdges.length === currentEdges.length) return;\n\t\t\tcommitEntities(nextEntities);\n\t\t\tcommitEdges(nextEdges);\n\t\t},\n\t\tlink(from: string, to: string, relation: TRelation, weight = 1) {\n\t\t\tconst key = `${from}\\u0000${to}\\u0000${relation}`;\n\t\t\tconst currentEdges = readArray(edges);\n\t\t\tconst existing = new Set(\n\t\t\t\tcurrentEdges.map((edge) => `${edge.from}\\u0000${edge.to}\\u0000${edge.relation}`),\n\t\t\t);\n\t\t\tconst next = [...currentEdges];\n\t\t\tif (existing.has(key)) {\n\t\t\t\tfor (let i = 0; i < next.length; i += 1) {\n\t\t\t\t\tconst edge = next[i]!;\n\t\t\t\t\tif (edge.from === from && edge.to === to && edge.relation === relation) {\n\t\t\t\t\t\tnext[i] = { ...edge, weight };\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnext.push({ from, to, relation, weight });\n\t\t\t}\n\t\t\tcommitEdges(next);\n\t\t},\n\t\tunlink(from: string, to: string, relation?: TRelation) {\n\t\t\tconst currentEdges = readArray(edges);\n\t\t\tconst next = currentEdges.filter((edge) =>\n\t\t\t\trelation === undefined\n\t\t\t\t\t? !(edge.from === from && edge.to === to)\n\t\t\t\t\t: !(edge.from === from && edge.to === to && edge.relation === relation),\n\t\t\t);\n\t\t\tif (next.length === currentEdges.length) return;\n\t\t\tcommitEdges(next);\n\t\t},\n\t\trelated(id: string, relation?: TRelation): ReadonlyArray<KnowledgeEdge<TRelation>> {\n\t\t\treturn readArray(edges).filter(\n\t\t\t\t(edge) =>\n\t\t\t\t\t(edge.from === id || edge.to === id) &&\n\t\t\t\t\t(relation === undefined || edge.relation === relation),\n\t\t\t);\n\t\t},\n\t}) as KnowledgeGraphGraph<TEntity, TRelation>;\n\treturn out;\n}\n","/**\n * Three-pane demo shell (roadmap §7.2).\n *\n * A `Graph(\"demo-shell\")` that dogfoods reactive coordination for the\n * main/side split layout with synchronized cross-highlighting.\n *\n * **Zero framework dependency** — framework bindings wrap pane components only.\n * The shell graph is headless and fully testable.\n */\n\nimport { batch } from \"../core/batch.js\";\nimport { describeNode, resolveDescribeFields } from \"../core/meta.js\";\nimport { derived, effect, state } from \"../core/sugar.js\";\nimport { Graph } from \"../graph/graph.js\";\nimport type { MeasurementAdapter } from \"./reactive-layout/reactive-layout.js\";\nimport { analyzeAndMeasure, computeLineBreaks } from \"./reactive-layout/reactive-layout.js\";\n\n// ——————————————————————————————————————————————————————————\n// Types\n// ——————————————————————————————————————————————————————————\n\n/** Identifies which pane is the source of a hover event. */\nexport type HoverPaneType = \"visual\" | \"graph\" | \"code\";\n\n/** Cross-highlighting hover target. `null` means nothing hovered. */\nexport type HoverTarget = { pane: HoverPaneType; id: string } | null;\n\n/** Which pane is full-screened (null = normal layout). */\nexport type FullscreenPane = \"main\" | \"graph\" | \"code\" | null;\n\n/**\n * Cross-referencing registry: maps node paths to code line numbers and\n * visual element selectors. Provided by each demo's `store.ts`.\n */\nexport type NodeRegistry = Map<string, { codeLine: number; visualSelector: string }>;\n\n/** Callbacks for cross-highlighting effect nodes. */\nexport type HighlightCallbacks = {\n\t/** Called when code-scroll highlight target changes. */\n\tcodeScroll?: (line: number | null) => void;\n\t/** Called when visual highlight target changes. */\n\tvisual?: (selector: string | null) => void;\n\t/** Called when graph highlight target changes. */\n\tgraph?: (nodeId: string | null) => void;\n};\n\n/** Label dimensions for graph node sizing. */\nexport type GraphLabelSize = { width: number; height: number };\n\n/** Options for {@link demoShell}. */\nexport type DemoShellOptions = {\n\t/** Initial main/side split ratio (0–1). Default: `0.65`. */\n\tmainRatio?: number;\n\t/** Initial graph/code vertical split in the side pane (0–1). Default: `0.5`. */\n\tsideSplit?: number;\n\t/** Initial viewport width in pixels. Default: `1280`. */\n\tviewportWidth?: number;\n\t/** Cross-referencing registry for hover→code/visual/graph mapping. */\n\tnodeRegistry?: NodeRegistry;\n\t/** Measurement adapter for layout engine integration. When provided, enables layout/* derived nodes. */\n\tadapter?: MeasurementAdapter;\n\t/** Font string for layout measurement. Default: `\"14px monospace\"`. */\n\tlayoutFont?: string;\n\t/** Callbacks for cross-highlighting effect nodes. When provided, creates effect nodes visible in describe(). */\n\tonHighlight?: HighlightCallbacks;\n};\n\n/** Return type of {@link demoShell}. */\nexport type DemoShellHandle = {\n\t/** The demo-shell graph. */\n\tgraph: Graph;\n\n\t// ── Convenience setters (shorthand for graph.set) ──────────\n\tsetMainRatio(ratio: number): void;\n\tsetSideSplit(ratio: number): void;\n\tsetFullscreen(pane: FullscreenPane): void;\n\tsetViewportWidth(width: number): void;\n\tsetHoverTarget(target: HoverTarget): void;\n\tsetDemoGraph(g: Graph | null): void;\n\tbumpGraphTick(): void;\n\tselectNode(path: string | null): void;\n\tsetMetaDebug(on: boolean): void;\n\t/** Set code text for layout/code-lines measurement (requires adapter). */\n\tsetCodeText(text: string): void;\n\t/** Atomic multi-set — wraps core `batch()` for glitch-free updates. */\n\tbatch(fn: () => void): void;\n\tdestroy(): void;\n};\n\n// ——————————————————————————————————————————————————————————\n// Helpers\n// ——————————————————————————————————————————————————————————\n\nfunction clamp01(v: number): number {\n\treturn Math.max(0, Math.min(1, v));\n}\n\n// ——————————————————————————————————————————————————————————\n// Factory\n// ——————————————————————————————————————————————————————————\n\n/**\n * Creates the three-pane demo shell graph (roadmap §7.2).\n *\n * All coordination is reactive — no polling, no imperative triggers.\n * Framework bindings subscribe to named nodes and drive `state` inputs.\n */\nexport function demoShell(opts?: DemoShellOptions): DemoShellHandle {\n\tconst mainRatioInit = clamp01(opts?.mainRatio ?? 0.65);\n\tconst sideSplitInit = clamp01(opts?.sideSplit ?? 0.5);\n\tconst viewportInit = Math.max(0, opts?.viewportWidth ?? 1280);\n\tconst registry = opts?.nodeRegistry ?? new Map();\n\tconst adapter = opts?.adapter ?? null;\n\tconst layoutFont = opts?.layoutFont ?? \"14px monospace\";\n\tconst onHighlight = opts?.onHighlight;\n\n\tconst g = new Graph(\"demo-shell\");\n\n\t// ── Layout state ─────────────────────────────────────\n\tconst paneMainRatio = state(mainRatioInit, { name: \"pane/main-ratio\" });\n\tconst paneSideSplit = state(sideSplitInit, { name: \"pane/side-split\" });\n\tconst paneFullscreen = state<FullscreenPane>(null, {\n\t\tname: \"pane/fullscreen\",\n\t});\n\tconst viewportWidth = state(viewportInit, { name: \"viewport/width\" });\n\n\tg.add(\"pane/main-ratio\", paneMainRatio);\n\tg.add(\"pane/side-split\", paneSideSplit);\n\tg.add(\"pane/fullscreen\", paneFullscreen);\n\tg.add(\"viewport/width\", viewportWidth);\n\n\t// ── Derived pane dimensions ──────────────────────────\n\tconst paneMainWidth = derived(\n\t\t[paneMainRatio, viewportWidth, paneFullscreen],\n\t\t([ratio, vw, fs]) => {\n\t\t\tconst r = ratio as number;\n\t\t\tconst w = vw as number;\n\t\t\tconst fullscreen = fs as FullscreenPane;\n\t\t\tif (fullscreen === \"main\") return w;\n\t\t\tif (fullscreen === \"graph\" || fullscreen === \"code\") return 0;\n\t\t\treturn Math.round(w * r);\n\t\t},\n\t\t{ name: \"pane/main-width\" },\n\t);\n\n\tconst paneSideWidth = derived(\n\t\t[paneMainWidth, viewportWidth, paneFullscreen],\n\t\t([main, vw, fs]) => {\n\t\t\tconst fullscreen = fs as FullscreenPane;\n\t\t\tconst w = vw as number;\n\t\t\tif (fullscreen === \"main\") return 0;\n\t\t\tif (fullscreen === \"graph\" || fullscreen === \"code\") return w;\n\t\t\treturn (w as number) - (main as number);\n\t\t},\n\t\t{ name: \"pane/side-width\" },\n\t);\n\n\tconst paneGraphHeight = derived(\n\t\t[paneSideSplit, paneFullscreen],\n\t\t([split, fs]) => {\n\t\t\tconst fullscreen = fs as FullscreenPane;\n\t\t\tif (fullscreen === \"graph\") return 1;\n\t\t\tif (fullscreen === \"code\") return 0;\n\t\t\tif (fullscreen === \"main\") return 0;\n\t\t\treturn clamp01(split as number);\n\t\t},\n\t\t{ name: \"pane/graph-height-ratio\" },\n\t);\n\n\tconst paneCodeHeight = derived(\n\t\t[paneGraphHeight, paneFullscreen],\n\t\t([graphH, fs]) => {\n\t\t\tconst fullscreen = fs as FullscreenPane;\n\t\t\tif (fullscreen === \"code\") return 1;\n\t\t\tif (fullscreen === \"graph\" || fullscreen === \"main\") return 0;\n\t\t\treturn 1 - (graphH as number);\n\t\t},\n\t\t{ name: \"pane/code-height-ratio\" },\n\t);\n\n\tg.add(\"pane/main-width\", paneMainWidth);\n\tg.add(\"pane/side-width\", paneSideWidth);\n\tg.add(\"pane/graph-height-ratio\", paneGraphHeight);\n\tg.add(\"pane/code-height-ratio\", paneCodeHeight);\n\n\t// ── External graph observation ───────────────────────\n\tconst demoGraphRef = state<Graph | null>(null, {\n\t\tname: \"demo/graph-ref\",\n\t});\n\tconst demoGraphTick = state(0, { name: \"demo/graph-tick\" });\n\n\tg.add(\"demo/graph-ref\", demoGraphRef);\n\tg.add(\"demo/graph-tick\", demoGraphTick);\n\n\tconst graphMermaid = derived(\n\t\t[demoGraphRef, demoGraphTick],\n\t\t([ref, _tick]) => {\n\t\t\tconst demo = ref as Graph | null;\n\t\t\tif (!demo) return \"\";\n\t\t\treturn demo.toMermaid();\n\t\t},\n\t\t{ name: \"graph/mermaid\" },\n\t);\n\n\tconst graphDescribe = derived(\n\t\t[demoGraphRef, demoGraphTick],\n\t\t([ref, _tick]) => {\n\t\t\tconst demo = ref as Graph | null;\n\t\t\tif (!demo) return null;\n\t\t\tconst { expand: _, ...snapshot } = demo.describe({ detail: \"standard\" });\n\t\t\treturn snapshot;\n\t\t},\n\t\t{ name: \"graph/describe\" },\n\t);\n\n\tg.add(\"graph/mermaid\", graphMermaid);\n\tg.add(\"graph/describe\", graphDescribe);\n\n\t// ── Cross-highlighting ───────────────────────────────\n\tconst hoverTarget = state<HoverTarget>(null, { name: \"hover/target\" });\n\tg.add(\"hover/target\", hoverTarget);\n\n\tconst highlightCodeScroll = derived(\n\t\t[hoverTarget],\n\t\t([target]) => {\n\t\t\tconst t = target as HoverTarget;\n\t\t\tif (!t) return null;\n\t\t\tconst entry = registry.get(t.id);\n\t\t\treturn entry ? entry.codeLine : null;\n\t\t},\n\t\t{ name: \"highlight/code-scroll\" },\n\t);\n\n\tconst highlightVisual = derived(\n\t\t[hoverTarget],\n\t\t([target]) => {\n\t\t\tconst t = target as HoverTarget;\n\t\t\tif (!t) return null;\n\t\t\tconst entry = registry.get(t.id);\n\t\t\treturn entry ? entry.visualSelector : null;\n\t\t},\n\t\t{ name: \"highlight/visual\" },\n\t);\n\n\tconst highlightGraph = derived(\n\t\t[hoverTarget],\n\t\t([target]) => {\n\t\t\tconst t = target as HoverTarget;\n\t\t\tif (!t) return null;\n\t\t\treturn t.id;\n\t\t},\n\t\t{ name: \"highlight/graph\" },\n\t);\n\n\tg.add(\"highlight/code-scroll\", highlightCodeScroll);\n\tg.add(\"highlight/visual\", highlightVisual);\n\tg.add(\"highlight/graph\", highlightGraph);\n\n\t// ── Cross-highlighting effect nodes (optional) ─────\n\t// Created when onHighlight callbacks are provided, making the full\n\t// source→derived→effect chain visible in describe()/toMermaid().\n\n\tif (onHighlight?.codeScroll) {\n\t\tconst cb = onHighlight.codeScroll;\n\t\tconst applyCodeScroll = effect([highlightCodeScroll], ([line]) => {\n\t\t\tcb(line as number | null);\n\t\t});\n\t\tg.add(\"highlight/apply-code-scroll\", applyCodeScroll);\n\t\tg.connect(\"highlight/code-scroll\", \"highlight/apply-code-scroll\");\n\t}\n\n\tif (onHighlight?.visual) {\n\t\tconst cb = onHighlight.visual;\n\t\tconst applyVisual = effect([highlightVisual], ([selector]) => {\n\t\t\tcb(selector as string | null);\n\t\t});\n\t\tg.add(\"highlight/apply-visual\", applyVisual);\n\t\tg.connect(\"highlight/visual\", \"highlight/apply-visual\");\n\t}\n\n\tif (onHighlight?.graph) {\n\t\tconst cb = onHighlight.graph;\n\t\tconst applyGraph = effect([highlightGraph], ([nodeId]) => {\n\t\t\tcb(nodeId as string | null);\n\t\t});\n\t\tg.add(\"highlight/apply-graph\", applyGraph);\n\t\tg.connect(\"highlight/graph\", \"highlight/apply-graph\");\n\t}\n\n\t// ── Inspect panel ────────────────────────────────────\n\tconst inspectSelected = state<string | null>(null, {\n\t\tname: \"inspect/selected-node\",\n\t});\n\tg.add(\"inspect/selected-node\", inspectSelected);\n\n\tconst standardFields = resolveDescribeFields(\"standard\");\n\n\tconst inspectNodeDetail = derived(\n\t\t[inspectSelected, demoGraphRef, demoGraphTick],\n\t\t([path, ref, _tick]) => {\n\t\t\tconst demo = ref as Graph | null;\n\t\t\tconst p = path as string | null;\n\t\t\tif (!demo || !p) return null;\n\t\t\ttry {\n\t\t\t\tconst nd = demo.resolve(p);\n\t\t\t\tconst nodeDesc = describeNode(nd, standardFields);\n\t\t\t\treturn { path: p, ...nodeDesc, value: nd.get() };\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\t{ name: \"inspect/node-detail\" },\n\t);\n\n\tconst inspectTraceLog = derived(\n\t\t[demoGraphRef, demoGraphTick],\n\t\t([ref, _tick]) => {\n\t\t\tconst demo = ref as Graph | null;\n\t\t\tif (!demo) return [];\n\t\t\treturn demo.traceLog();\n\t\t},\n\t\t{ name: \"inspect/trace-log\" },\n\t);\n\n\tg.add(\"inspect/node-detail\", inspectNodeDetail);\n\tg.add(\"inspect/trace-log\", inspectTraceLog);\n\n\t// ── Meta debug toggle ────────────────────────────────\n\tconst metaDebug = state(false, { name: \"meta/debug\" });\n\tg.add(\"meta/debug\", metaDebug);\n\n\tconst metaShellMermaid = derived(\n\t\t[metaDebug, demoGraphTick],\n\t\t([debug, _tick]) => {\n\t\t\tif (!(debug as boolean)) return \"\";\n\t\t\treturn g.toMermaid();\n\t\t},\n\t\t{ name: \"meta/shell-mermaid\" },\n\t);\n\tg.add(\"meta/shell-mermaid\", metaShellMermaid);\n\n\t// ── Layout engine integration (optional, requires adapter) ──\n\tconst codeTextNode = state(\"\", { name: \"layout/code-text\" });\n\tg.add(\"layout/code-text\", codeTextNode);\n\n\tif (adapter) {\n\t\tconst measureCache = new Map<string, Map<string, number>>();\n\n\t\tconst graphLabels = derived(\n\t\t\t[graphDescribe],\n\t\t\t([desc]) => {\n\t\t\t\tconst d = desc as { nodes: Record<string, { type: string }> } | null;\n\t\t\t\tif (!d) return new Map<string, GraphLabelSize>();\n\t\t\t\tconst result = new Map<string, GraphLabelSize>();\n\t\t\t\tfor (const [name] of Object.entries(d.nodes)) {\n\t\t\t\t\tconst segments = analyzeAndMeasure(name, layoutFont, adapter, measureCache);\n\t\t\t\t\tconst lb = computeLineBreaks(segments, Infinity, adapter, layoutFont, measureCache);\n\t\t\t\t\tconst width = lb.lines.reduce((max, l) => Math.max(max, l.width), 0);\n\t\t\t\t\tconst height = lb.lineCount * 20; // line-height approximation\n\t\t\t\t\tresult.set(name, { width, height });\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"layout/graph-labels\",\n\t\t\t\tequals: (a, b) => {\n\t\t\t\t\tif (a === b) return true;\n\t\t\t\t\tconst ma = a as Map<string, GraphLabelSize>;\n\t\t\t\t\tconst mb = b as Map<string, GraphLabelSize>;\n\t\t\t\t\tif (ma.size !== mb.size) return false;\n\t\t\t\t\tfor (const [k, v] of ma) {\n\t\t\t\t\t\tconst bv = mb.get(k);\n\t\t\t\t\t\tif (!bv || bv.width !== v.width || bv.height !== v.height) return false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\tconst codeLines = derived(\n\t\t\t[codeTextNode, paneSideWidth],\n\t\t\t([text, sideW]) => {\n\t\t\t\tconst t = text as string;\n\t\t\t\tif (!t) return { lineCount: 0, lines: [] };\n\t\t\t\tconst segments = analyzeAndMeasure(t, layoutFont, adapter, measureCache);\n\t\t\t\tconst maxW = (sideW as number) - 40; // side pane minus padding\n\t\t\t\treturn computeLineBreaks(segments, Math.max(100, maxW), adapter, layoutFont, measureCache);\n\t\t\t},\n\t\t\t{ name: \"layout/code-lines\" },\n\t\t);\n\n\t\tconst sideWidthHint = derived(\n\t\t\t[graphLabels],\n\t\t\t([labels]) => {\n\t\t\t\tconst m = labels as Map<string, GraphLabelSize>;\n\t\t\t\tif (m.size === 0) return 200; // minimum default\n\t\t\t\tlet maxW = 0;\n\t\t\t\tfor (const { width } of m.values()) {\n\t\t\t\t\tif (width > maxW) maxW = width;\n\t\t\t\t}\n\t\t\t\t// widest label + padding (node box chrome + margin)\n\t\t\t\treturn Math.max(200, Math.round(maxW + 80));\n\t\t\t},\n\t\t\t{ name: \"layout/side-width-hint\" },\n\t\t);\n\n\t\tg.add(\"layout/graph-labels\", graphLabels);\n\t\tg.add(\"layout/code-lines\", codeLines);\n\t\tg.add(\"layout/side-width-hint\", sideWidthHint);\n\n\t\tg.connect(\"graph/describe\", \"layout/graph-labels\");\n\t\tg.connect(\"layout/code-text\", \"layout/code-lines\");\n\t\tg.connect(\"pane/side-width\", \"layout/code-lines\");\n\t\tg.connect(\"layout/graph-labels\", \"layout/side-width-hint\");\n\t}\n\n\t// ── Edges (explicit wiring for describe/toMermaid) ───\n\tg.connect(\"pane/main-ratio\", \"pane/main-width\");\n\tg.connect(\"viewport/width\", \"pane/main-width\");\n\tg.connect(\"pane/fullscreen\", \"pane/main-width\");\n\tg.connect(\"pane/main-width\", \"pane/side-width\");\n\tg.connect(\"viewport/width\", \"pane/side-width\");\n\tg.connect(\"pane/fullscreen\", \"pane/side-width\");\n\tg.connect(\"pane/side-split\", \"pane/graph-height-ratio\");\n\tg.connect(\"pane/fullscreen\", \"pane/graph-height-ratio\");\n\tg.connect(\"pane/graph-height-ratio\", \"pane/code-height-ratio\");\n\tg.connect(\"pane/fullscreen\", \"pane/code-height-ratio\");\n\tg.connect(\"demo/graph-ref\", \"graph/mermaid\");\n\tg.connect(\"demo/graph-tick\", \"graph/mermaid\");\n\tg.connect(\"demo/graph-ref\", \"graph/describe\");\n\tg.connect(\"demo/graph-tick\", \"graph/describe\");\n\tg.connect(\"hover/target\", \"highlight/code-scroll\");\n\tg.connect(\"hover/target\", \"highlight/visual\");\n\tg.connect(\"hover/target\", \"highlight/graph\");\n\tg.connect(\"inspect/selected-node\", \"inspect/node-detail\");\n\tg.connect(\"demo/graph-ref\", \"inspect/node-detail\");\n\tg.connect(\"demo/graph-tick\", \"inspect/node-detail\");\n\tg.connect(\"demo/graph-ref\", \"inspect/trace-log\");\n\tg.connect(\"demo/graph-tick\", \"inspect/trace-log\");\n\tg.connect(\"meta/debug\", \"meta/shell-mermaid\");\n\tg.connect(\"demo/graph-tick\", \"meta/shell-mermaid\");\n\n\t// ── Handle ───────────────────────────────────────────\n\tlet tickCounter = 0;\n\treturn {\n\t\tgraph: g,\n\t\tsetMainRatio(ratio: number) {\n\t\t\tg.set(\"pane/main-ratio\", clamp01(ratio));\n\t\t},\n\t\tsetSideSplit(ratio: number) {\n\t\t\tg.set(\"pane/side-split\", clamp01(ratio));\n\t\t},\n\t\tsetFullscreen(pane: FullscreenPane) {\n\t\t\tg.set(\"pane/fullscreen\", pane);\n\t\t},\n\t\tsetViewportWidth(width: number) {\n\t\t\tg.set(\"viewport/width\", Math.max(0, width));\n\t\t},\n\t\tsetHoverTarget(target: HoverTarget) {\n\t\t\tg.set(\"hover/target\", target);\n\t\t},\n\t\tsetDemoGraph(demo: Graph | null) {\n\t\t\tg.set(\"demo/graph-ref\", demo);\n\t\t},\n\t\tbumpGraphTick() {\n\t\t\tg.set(\"demo/graph-tick\", ++tickCounter);\n\t\t},\n\t\tselectNode(path: string | null) {\n\t\t\tg.set(\"inspect/selected-node\", path);\n\t\t},\n\t\tsetMetaDebug(on: boolean) {\n\t\t\tg.set(\"meta/debug\", on);\n\t\t},\n\t\tsetCodeText(text: string) {\n\t\t\tg.set(\"layout/code-text\", text);\n\t\t},\n\t\tbatch(fn: () => void) {\n\t\t\tbatch(fn);\n\t\t},\n\t\tdestroy() {\n\t\t\tg.destroy();\n\t\t},\n\t};\n}\n","/**\n * Domain templates (roadmap §8.2).\n *\n * Opinionated Graph factories for common \"info → action\" domains.\n * Each template wires up §8.1 reduction primitives (stratify, funnel, feedback,\n * budgetGate, scorer) with domain-specific stages. Users fork/extend by\n * accessing named nodes and swapping stages.\n *\n * **Source injection (option B):** templates accept a `source` node, not a\n * hardcoded adapter. Pass `fromOTel(...)`, `fromGitHook(...)`, or a test\n * `state()` — the topology is the same.\n *\n * @module\n */\n\nimport { batch } from \"../core/batch.js\";\nimport { DATA } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { derived, effect, state } from \"../core/sugar.js\";\nimport { type ReactiveLogSnapshot, reactiveLog } from \"../extra/reactive-log.js\";\nimport { Graph, type GraphOptions } from \"../graph/graph.js\";\nimport { feedback, type StratifyRule, scorer, stratify } from \"./reduction.js\";\n\n// ---------------------------------------------------------------------------\n// Shared\n// ---------------------------------------------------------------------------\n\nfunction keepalive(n: Node<unknown>): () => void {\n\treturn n.subscribe(() => {});\n}\n\nfunction baseMeta(kind: string, extra?: Record<string, unknown>): Record<string, unknown> {\n\treturn { domain_template: true, template_type: kind, ...(extra ?? {}) };\n}\n\n// ---------------------------------------------------------------------------\n// 1. observabilityGraph\n// ---------------------------------------------------------------------------\n\n/** Stratification branch config for observability signals. */\nexport type ObservabilityBranch = {\n\tname: string;\n\tclassify: (value: unknown) => boolean;\n};\n\n/** Options for {@link observabilityGraph}. */\nexport type ObservabilityGraphOptions = GraphOptions & {\n\t/** Ingested signal source (e.g. fromOTel(...) or test state). */\n\tsource: Node<unknown>;\n\n\t/**\n\t * Classification rules for signal stratification.\n\t * Default: errors / traces / metrics branches.\n\t */\n\tbranches?: ObservabilityBranch[];\n\n\t/**\n\t * Correlation function: receives stratified branch values and produces\n\t * correlated insights. Default: identity pass-through.\n\t */\n\tcorrelate?: (values: unknown[]) => unknown;\n\n\t/**\n\t * SLO verification function: returns a verification result for a\n\t * correlated insight. Default: always passes.\n\t */\n\tsloCheck?: (value: unknown) => unknown;\n\n\t/**\n\t * Scorer weights for alert prioritization. One per branch.\n\t * Default: equal weights [1, 1, 1].\n\t */\n\tweights?: number[];\n\n\t/** Max feedback iterations for false-positive learning. Default: 5. */\n\tmaxFeedbackIterations?: number;\n};\n\n/**\n * OTel ingest → stratified reduction → correlation → SLO verification →\n * alert prioritization → output.\n *\n * Well-known node names:\n * - `\"source\"` — injected signal source\n * - `\"stratify::branch/<name>\"` — per-branch classification\n * - `\"correlate\"` — cross-branch correlation\n * - `\"slo_value\"`, `\"slo_verified\"` — SLO verification pair\n * - `\"alerts\"` — scored, prioritized output\n * - `\"output\"` — final output (alias for alerts)\n *\n * @category patterns\n */\nexport function observabilityGraph(name: string, opts: ObservabilityGraphOptions): Graph {\n\tconst g = new Graph(name, opts);\n\n\t// --- Source ---\n\tg.add(\"source\", opts.source);\n\n\t// --- Stratify ---\n\tconst defaultBranches: ObservabilityBranch[] = [\n\t\t{ name: \"errors\", classify: (v) => isTagged(v, \"error\") },\n\t\t{ name: \"traces\", classify: (v) => isTagged(v, \"trace\") },\n\t\t{ name: \"metrics\", classify: (v) => isTagged(v, \"metric\") },\n\t];\n\tconst branches = opts.branches ?? defaultBranches;\n\tconst rules: StratifyRule<unknown>[] = branches.map((b) => ({\n\t\tname: b.name,\n\t\tclassify: b.classify,\n\t}));\n\tconst strat = stratify(\"stratify\", opts.source, rules);\n\tg.mount(\"stratify\", strat);\n\n\t// --- Correlate ---\n\t// Collect latest value from each branch, produce correlated output.\n\tconst branchNodes = branches.map((b) => {\n\t\ttry {\n\t\t\treturn g.resolve(`stratify::branch/${b.name}`);\n\t\t} catch {\n\t\t\treturn state<unknown>(null);\n\t\t}\n\t});\n\tconst correlateFn = opts.correlate ?? ((vals: unknown[]) => vals);\n\tconst correlateNode = derived<unknown>(\n\t\tbranchNodes as Node[],\n\t\t(vals) => correlateFn(vals as unknown[]),\n\t\t{\n\t\t\tmeta: baseMeta(\"observability\", { stage: \"correlate\" }),\n\t\t},\n\t);\n\tg.add(\"correlate\", correlateNode);\n\tfor (const b of branches) {\n\t\ttry {\n\t\t\tg.connect(`stratify::branch/${b.name}`, \"correlate\");\n\t\t} catch {\n\t\t\t/* branch may not exist */\n\t\t}\n\t}\n\n\t// --- SLO verification ---\n\tconst sloCheckFn = opts.sloCheck ?? (() => ({ pass: true }));\n\tconst sloValue = derived<unknown>([correlateNode], (vals) => vals[0], {\n\t\tmeta: baseMeta(\"observability\", { stage: \"slo_value\" }),\n\t});\n\tconst sloVerified = derived<unknown>([sloValue], (vals) => sloCheckFn(vals[0]), {\n\t\tmeta: baseMeta(\"observability\", { stage: \"slo_verified\" }),\n\t});\n\tg.add(\"slo_value\", sloValue);\n\tg.add(\"slo_verified\", sloVerified);\n\tg.connect(\"correlate\", \"slo_value\");\n\tg.connect(\"slo_value\", \"slo_verified\");\n\n\t// --- Alert scorer ---\n\tconst weightValues = opts.weights ?? branches.map(() => 1);\n\tconst signalNodes = branchNodes.map((bn) =>\n\t\tderived<number>([bn], (vals) => (vals[0] != null ? 1 : 0)),\n\t);\n\tconst weightNodes = weightValues.map((w) => state<number>(w));\n\tfor (let i = 0; i < signalNodes.length; i++) {\n\t\tg.add(`__signal_${i}`, signalNodes[i] as Node<unknown>);\n\t\tg.add(`__weight_${i}`, weightNodes[i] as Node<unknown>);\n\t}\n\tconst alerts = scorer(\n\t\tsignalNodes as ReadonlyArray<Node<number>>,\n\t\tweightNodes as ReadonlyArray<Node<number>>,\n\t);\n\tg.add(\"alerts\", alerts as Node<unknown>);\n\n\t// --- Output alias ---\n\tconst output = derived<unknown>(\n\t\t[alerts as Node, sloVerified],\n\t\t(vals) => ({\n\t\t\tscored: vals[0],\n\t\t\tslo: vals[1],\n\t\t}),\n\t\t{\n\t\t\tmeta: baseMeta(\"observability\", { stage: \"output\" }),\n\t\t},\n\t);\n\tg.add(\"output\", output);\n\tg.connect(\"alerts\", \"output\");\n\tg.connect(\"slo_verified\", \"output\");\n\n\t// --- Feedback (false-positive learning) ---\n\t// SLO failures feed back to re-check with updated context.\n\tconst fbReentry = state<unknown>(null, {\n\t\tmeta: baseMeta(\"observability\", { stage: \"feedback_reentry\" }),\n\t});\n\tg.add(\"feedback_reentry\", fbReentry);\n\tconst fbCondition = derived<unknown>(\n\t\t[sloVerified],\n\t\t(vals) => {\n\t\t\tconst result = vals[0] as Record<string, unknown> | null;\n\t\t\tif (result && result.pass === false) return result;\n\t\t\treturn null;\n\t\t},\n\t\t{\n\t\t\tmeta: baseMeta(\"observability\", { stage: \"feedback_condition\" }),\n\t\t},\n\t);\n\tg.add(\"feedback_condition\", fbCondition as Node<unknown>);\n\tg.connect(\"slo_verified\", \"feedback_condition\");\n\tfeedback(g, \"feedback_condition\", \"feedback_reentry\", {\n\t\tmaxIterations: opts.maxFeedbackIterations ?? 5,\n\t});\n\n\treturn g;\n}\n\n// ---------------------------------------------------------------------------\n// 2. issueTrackerGraph\n// ---------------------------------------------------------------------------\n\n/** A structured issue extracted from raw findings. */\nexport type ExtractedIssue = {\n\tid: string;\n\ttitle: string;\n\tseverity: number;\n\tsource: string;\n\traw: unknown;\n};\n\n/** Options for {@link issueTrackerGraph}. */\nexport type IssueTrackerGraphOptions = GraphOptions & {\n\t/** Findings source (e.g. fromGitHook(...), fromFSWatch(...)). */\n\tsource: Node<unknown>;\n\n\t/**\n\t * Extract structured issues from raw findings.\n\t * Default: wraps raw value as a single issue.\n\t */\n\textract?: (raw: unknown) => ExtractedIssue;\n\n\t/**\n\t * Verify an extracted issue (assertion check).\n\t * Default: always valid.\n\t */\n\tverify?: (issue: ExtractedIssue) => unknown;\n\n\t/**\n\t * Detect regression by comparing against known patterns.\n\t * Receives (current issue, known patterns).\n\t * Default: no regression detected.\n\t */\n\tdetectRegression?: (issue: ExtractedIssue, known: unknown) => unknown;\n\n\t/** Max feedback iterations for re-scanning. Default: 3. */\n\tmaxFeedbackIterations?: number;\n};\n\n/**\n * Findings ingest → extraction → verification → regression detection →\n * distillation → prioritized queue.\n *\n * Well-known node names:\n * - `\"source\"` — injected findings source\n * - `\"extract\"` — structured issue extraction\n * - `\"verify\"` — issue verification\n * - `\"known_patterns\"` — accumulated known issue patterns (state)\n * - `\"regression\"` — regression detection\n * - `\"priority\"` — severity-based prioritization\n * - `\"output\"` — final prioritized output\n *\n * @category patterns\n */\nexport function issueTrackerGraph(name: string, opts: IssueTrackerGraphOptions): Graph {\n\tconst g = new Graph(name, opts);\n\n\t// --- Source ---\n\tg.add(\"source\", opts.source);\n\n\t// --- Extract ---\n\tlet _issueCounter = 0;\n\tconst defaultExtract = (raw: unknown): ExtractedIssue => ({\n\t\tid: `issue-${++_issueCounter}`,\n\t\ttitle: String(raw),\n\t\tseverity: 1,\n\t\tsource: \"unknown\",\n\t\traw,\n\t});\n\tconst extractFn = opts.extract ?? defaultExtract;\n\tconst extractNode = derived<ExtractedIssue>([opts.source], (vals) => extractFn(vals[0]), {\n\t\tmeta: baseMeta(\"issue_tracker\", { stage: \"extract\" }),\n\t});\n\tg.add(\"extract\", extractNode as Node<unknown>);\n\tg.connect(\"source\", \"extract\");\n\n\t// --- Verify ---\n\tconst verifyFn = opts.verify ?? (() => ({ valid: true }));\n\tconst verifyNode = derived<unknown>(\n\t\t[extractNode as Node],\n\t\t(vals) => {\n\t\t\tconst issue = vals[0] as ExtractedIssue;\n\t\t\treturn { issue, verification: verifyFn(issue) };\n\t\t},\n\t\t{\n\t\t\tmeta: baseMeta(\"issue_tracker\", { stage: \"verify\" }),\n\t\t},\n\t);\n\tg.add(\"verify\", verifyNode);\n\tg.connect(\"extract\", \"verify\");\n\n\t// --- Known patterns (memory / distillation state) ---\n\tconst knownPatterns = state<unknown[]>([], {\n\t\tmeta: baseMeta(\"issue_tracker\", { stage: \"known_patterns\" }),\n\t});\n\tg.add(\"known_patterns\", knownPatterns as Node<unknown>);\n\n\t// --- Regression detection ---\n\tconst detectFn = opts.detectRegression ?? (() => ({ regression: false }));\n\tconst regressionNode = derived<unknown>(\n\t\t[extractNode as Node, knownPatterns as Node],\n\t\t(vals) => {\n\t\t\tconst issue = vals[0] as ExtractedIssue;\n\t\t\tconst known = vals[1];\n\t\t\treturn { issue, regression: detectFn(issue, known) };\n\t\t},\n\t\t{ meta: baseMeta(\"issue_tracker\", { stage: \"regression\" }) },\n\t);\n\tg.add(\"regression\", regressionNode);\n\tg.connect(\"extract\", \"regression\");\n\tg.connect(\"known_patterns\", \"regression\");\n\n\t// --- Priority scoring ---\n\tconst severitySignal = derived<number>([extractNode as Node], (vals) => {\n\t\tconst issue = vals[0] as ExtractedIssue;\n\t\treturn issue?.severity ?? 0;\n\t});\n\tconst regressionSignal = derived<number>([regressionNode], (vals) => {\n\t\tconst r = vals[0] as Record<string, unknown> | null;\n\t\treturn r?.regression ? 2 : 0;\n\t});\n\tg.add(\"__severity_signal\", severitySignal as Node<unknown>);\n\tg.add(\"__regression_signal\", regressionSignal as Node<unknown>);\n\n\tconst severityWeight = state<number>(1);\n\tconst regressionWeight = state<number>(1.5);\n\tg.add(\"__severity_weight\", severityWeight as Node<unknown>);\n\tg.add(\"__regression_weight\", regressionWeight as Node<unknown>);\n\n\tconst priority = scorer([severitySignal, regressionSignal], [severityWeight, regressionWeight]);\n\tg.add(\"priority\", priority as Node<unknown>);\n\n\t// --- Output ---\n\tconst output = derived<unknown>(\n\t\t[verifyNode, regressionNode, priority as Node],\n\t\t(vals) => ({\n\t\t\tverified: vals[0],\n\t\t\tregression: vals[1],\n\t\t\tpriority: vals[2],\n\t\t}),\n\t\t{ meta: baseMeta(\"issue_tracker\", { stage: \"output\" }) },\n\t);\n\tg.add(\"output\", output);\n\tg.connect(\"verify\", \"output\");\n\tg.connect(\"regression\", \"output\");\n\tg.connect(\"priority\", \"output\");\n\n\t// --- Feedback (re-scan on verification failure) ---\n\tconst fbReentry = state<unknown>(null, {\n\t\tmeta: baseMeta(\"issue_tracker\", { stage: \"feedback_reentry\" }),\n\t});\n\tg.add(\"feedback_reentry\", fbReentry);\n\tconst fbCondition = derived<unknown>(\n\t\t[verifyNode],\n\t\t(vals) => {\n\t\t\tconst result = vals[0] as Record<string, unknown> | null;\n\t\t\tif (result) {\n\t\t\t\tconst v = result.verification as Record<string, unknown> | null;\n\t\t\t\tif (v && v.valid === false) return result;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\t{\n\t\t\tmeta: baseMeta(\"issue_tracker\", { stage: \"feedback_condition\" }),\n\t\t},\n\t);\n\tg.add(\"feedback_condition\", fbCondition as Node<unknown>);\n\tg.connect(\"verify\", \"feedback_condition\");\n\tfeedback(g, \"feedback_condition\", \"feedback_reentry\", {\n\t\tmaxIterations: opts.maxFeedbackIterations ?? 3,\n\t});\n\n\treturn g;\n}\n\n// ---------------------------------------------------------------------------\n// 3. contentModerationGraph\n// ---------------------------------------------------------------------------\n\n/** Classification result from LLM moderation. */\nexport type ModerationResult = {\n\tlabel: \"safe\" | \"review\" | \"block\";\n\tconfidence: number;\n\treason?: string;\n\toriginal: unknown;\n};\n\n/** Options for {@link contentModerationGraph}. */\nexport type ContentModerationGraphOptions = GraphOptions & {\n\t/** Content source (text/multimedia ingest). */\n\tsource: Node<unknown>;\n\n\t/**\n\t * Classification function: returns a ModerationResult.\n\t * Default: labels everything \"review\" with confidence 0.5.\n\t */\n\tclassify?: (content: unknown) => ModerationResult;\n\n\t/** System prompt for LLM classification. */\n\tsystemPrompt?: string;\n\n\t/** Scorer weights: [safe, review, block]. Default: [0.1, 1, 2]. */\n\tweights?: [number, number, number];\n\n\t/** Max feedback iterations for policy refinement. Default: 5. */\n\tmaxFeedbackIterations?: number;\n\n\t/** Max review queue size. When set, oldest entries are trimmed on overflow. */\n\tmaxQueueSize?: number;\n};\n\n/**\n * Content ingest → LLM/rule classification → stratified routing (safe/review/block) →\n * human review queue → scorer → feedback (false positives → policy refinement) → output.\n *\n * Well-known node names:\n * - `\"source\"` — content ingest\n * - `\"classify\"` — LLM or rule-based classification\n * - `\"stratify::branch/safe\"`, `\"stratify::branch/review\"`, `\"stratify::branch/block\"` — routed branches\n * - `\"review_queue\"` — state node for human review items\n * - `\"priority\"` — scored priority output\n * - `\"policy\"` — writable state for policy refinement\n * - `\"output\"` — final moderation output\n *\n * @category patterns\n */\nexport function contentModerationGraph(name: string, opts: ContentModerationGraphOptions): Graph {\n\tconst g = new Graph(name, opts);\n\n\t// --- Source ---\n\tg.add(\"source\", opts.source);\n\n\t// --- Classify ---\n\tconst defaultClassify = (content: unknown): ModerationResult => ({\n\t\tlabel: \"review\",\n\t\tconfidence: 0.5,\n\t\toriginal: content,\n\t});\n\tconst classifyFn = opts.classify ?? defaultClassify;\n\tconst classifyNode = derived<ModerationResult>([opts.source], (vals) => classifyFn(vals[0]), {\n\t\tmeta: baseMeta(\"content_moderation\", { stage: \"classify\" }),\n\t});\n\tg.add(\"classify\", classifyNode as Node<unknown>);\n\tg.connect(\"source\", \"classify\");\n\n\t// --- Stratify (safe / review / block) ---\n\tconst strat = stratify<ModerationResult>(\"stratify\", classifyNode, [\n\t\t{ name: \"safe\", classify: (v) => v.label === \"safe\" },\n\t\t{ name: \"review\", classify: (v) => v.label === \"review\" },\n\t\t{ name: \"block\", classify: (v) => v.label === \"block\" },\n\t]);\n\tg.mount(\"stratify\", strat);\n\n\t// --- Review queue (reactiveLog — O(1) append, bounded) ---\n\tconst reviewLog = reactiveLog<ModerationResult>([], {\n\t\tname: \"review_queue\",\n\t\tmaxSize: opts.maxQueueSize,\n\t});\n\tg.add(\"review_queue\", reviewLog.entries as Node<unknown>);\n\n\t// Bridge review branch → review queue accumulator\n\tlet reviewBranch: Node<unknown>;\n\ttry {\n\t\treviewBranch = g.resolve(\"stratify::branch/review\");\n\t} catch {\n\t\treviewBranch = state<unknown>(null);\n\t\tg.add(\"__review_fallback\", reviewBranch);\n\t}\n\tconst reviewAccumulator = effect([reviewBranch], (vals) => {\n\t\tconst item = vals[0] as ModerationResult | null;\n\t\tif (item) {\n\t\t\treviewLog.append(item);\n\t\t}\n\t});\n\tg.add(\"__review_accumulator\", reviewAccumulator as Node<unknown>);\n\tkeepalive(reviewAccumulator as Node<unknown>);\n\ttry {\n\t\tg.connect(\"stratify::branch/review\", \"__review_accumulator\");\n\t} catch {\n\t\t// fallback branch — no stratify edge to register\n\t}\n\n\t// --- Policy state (human/LLM writable) ---\n\tconst policy = state<Record<string, unknown>>(\n\t\t{},\n\t\t{\n\t\t\tmeta: baseMeta(\"content_moderation\", {\n\t\t\t\tstage: \"policy\",\n\t\t\t\taccess: \"both\",\n\t\t\t\tdescription: \"Moderation policy rules — updated via feedback\",\n\t\t\t}),\n\t\t},\n\t);\n\tg.add(\"policy\", policy as Node<unknown>);\n\n\t// --- Priority scorer ---\n\tconst weights = opts.weights ?? [0.1, 1, 2];\n\tconst confidenceSignal = derived<number>([classifyNode as Node], (vals) => {\n\t\tconst r = vals[0] as ModerationResult | null;\n\t\treturn r?.confidence ?? 0;\n\t});\n\tconst severitySignal = derived<number>([classifyNode as Node], (vals) => {\n\t\tconst r = vals[0] as ModerationResult | null;\n\t\tif (!r) return 0;\n\t\treturn r.label === \"block\" ? weights[2] : r.label === \"review\" ? weights[1] : weights[0];\n\t});\n\tg.add(\"__confidence_signal\", confidenceSignal as Node<unknown>);\n\tg.add(\"__severity_signal\", severitySignal as Node<unknown>);\n\n\tconst wConfidence = state<number>(1);\n\tconst wSeverity = state<number>(1);\n\tg.add(\"__w_confidence\", wConfidence as Node<unknown>);\n\tg.add(\"__w_severity\", wSeverity as Node<unknown>);\n\n\tconst priority = scorer([confidenceSignal, severitySignal], [wConfidence, wSeverity]);\n\tg.add(\"priority\", priority as Node<unknown>);\n\n\t// --- Output ---\n\tconst output = derived<unknown>(\n\t\t[classifyNode as Node, priority as Node],\n\t\t(vals) => ({\n\t\t\tclassification: vals[0],\n\t\t\tpriority: vals[1],\n\t\t}),\n\t\t{ meta: baseMeta(\"content_moderation\", { stage: \"output\" }) },\n\t);\n\tg.add(\"output\", output);\n\tg.connect(\"classify\", \"output\");\n\tg.connect(\"priority\", \"output\");\n\n\t// --- Feedback (false positive → policy refinement) ---\n\t// Feedback condition: human marks a review item as false positive.\n\t// When review_queue changes and policy exists, signal for update.\n\tconst fbCondition = derived<unknown>(\n\t\t[reviewLog.entries as Node, policy as Node],\n\t\t(vals) => {\n\t\t\tconst snap = vals[0] as ReactiveLogSnapshot<ModerationResult> | null;\n\t\t\tconst entries = snap?.value?.entries;\n\t\t\tif (entries && entries.length > 0) {\n\t\t\t\tconst latest = entries[entries.length - 1];\n\t\t\t\t// Items explicitly marked as false positive feed back\n\t\t\t\tif (latest && (latest as unknown as Record<string, unknown>).falsePositive) {\n\t\t\t\t\treturn latest;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\t{\n\t\t\tmeta: baseMeta(\"content_moderation\", { stage: \"feedback_condition\" }),\n\t\t},\n\t);\n\tg.add(\"feedback_condition\", fbCondition as Node<unknown>);\n\tfeedback(g, \"feedback_condition\", \"policy\", {\n\t\tmaxIterations: opts.maxFeedbackIterations ?? 5,\n\t});\n\n\treturn g;\n}\n\n// ---------------------------------------------------------------------------\n// 4. dataQualityGraph\n// ---------------------------------------------------------------------------\n\n/** Schema validation result. */\nexport type ValidationResult = {\n\tvalid: boolean;\n\terrors: string[];\n\trecord: unknown;\n};\n\n/** Anomaly detection result. */\nexport type AnomalyResult = {\n\tanomaly: boolean;\n\tscore: number;\n\tdetail?: string;\n\trecord: unknown;\n};\n\n/** Options for {@link dataQualityGraph}. */\nexport type DataQualityGraphOptions = GraphOptions & {\n\t/** Data source (e.g. fromPrisma(...), fromKysely(...)). */\n\tsource: Node<unknown>;\n\n\t/**\n\t * Schema validation function.\n\t * Default: always valid.\n\t */\n\tvalidate?: (record: unknown) => ValidationResult;\n\n\t/**\n\t * Anomaly detection function.\n\t * Default: no anomaly.\n\t */\n\tdetectAnomaly?: (record: unknown) => AnomalyResult;\n\n\t/**\n\t * Drift detection: compares current record against baseline.\n\t * Default: no drift.\n\t */\n\tdetectDrift?: (record: unknown, baseline: unknown) => unknown;\n\n\t/**\n\t * Remediation suggestion function.\n\t * Default: no suggestion.\n\t */\n\tsuggest?: (result: { validation: ValidationResult; anomaly: AnomalyResult }) => unknown;\n\n\t/** Max feedback iterations for rule refinement. Default: 3. */\n\tmaxFeedbackIterations?: number;\n};\n\n/**\n * Data ingest → schema validation → anomaly detection → drift alerting →\n * auto-remediation suggestions → output.\n *\n * Well-known node names:\n * - `\"source\"` — data ingest\n * - `\"validate\"` — schema validation\n * - `\"anomaly\"` — anomaly detection\n * - `\"baseline\"` — rolling baseline state\n * - `\"drift\"` — drift detection\n * - `\"remediate\"` — auto-remediation suggestions\n * - `\"output\"` — combined quality report\n *\n * @category patterns\n */\nexport function dataQualityGraph(name: string, opts: DataQualityGraphOptions): Graph {\n\tconst g = new Graph(name, opts);\n\n\t// --- Source ---\n\tg.add(\"source\", opts.source);\n\n\t// --- Schema validation ---\n\tconst validateFn =\n\t\topts.validate ??\n\t\t((record: unknown): ValidationResult => ({\n\t\t\tvalid: true,\n\t\t\terrors: [],\n\t\t\trecord,\n\t\t}));\n\tconst validateNode = derived<ValidationResult | undefined>(\n\t\t[opts.source],\n\t\t(vals) => (vals[0] != null ? validateFn(vals[0]) : undefined),\n\t\t{ meta: baseMeta(\"data_quality\", { stage: \"validate\" }) },\n\t);\n\tg.add(\"validate\", validateNode as Node<unknown>);\n\tg.connect(\"source\", \"validate\");\n\n\t// --- Anomaly detection ---\n\tconst detectAnomalyFn =\n\t\topts.detectAnomaly ??\n\t\t((record: unknown): AnomalyResult => ({\n\t\t\tanomaly: false,\n\t\t\tscore: 0,\n\t\t\trecord,\n\t\t}));\n\tconst anomalyNode = derived<AnomalyResult | undefined>(\n\t\t[opts.source],\n\t\t(vals) => (vals[0] != null ? detectAnomalyFn(vals[0]) : undefined),\n\t\t{ meta: baseMeta(\"data_quality\", { stage: \"anomaly\" }) },\n\t);\n\tg.add(\"anomaly\", anomalyNode as Node<unknown>);\n\tg.connect(\"source\", \"anomaly\");\n\n\t// --- Baseline (rolling state) ---\n\tconst baseline = state<unknown>(null, {\n\t\tmeta: baseMeta(\"data_quality\", {\n\t\t\tstage: \"baseline\",\n\t\t\tdescription: \"Rolling baseline for drift detection\",\n\t\t}),\n\t});\n\tg.add(\"baseline\", baseline);\n\n\t// Update baseline on valid records\n\tconst baselineUpdater = effect([validateNode as Node], (vals) => {\n\t\tconst result = vals[0] as ValidationResult;\n\t\tif (result?.valid) {\n\t\t\tbatch(() => {\n\t\t\t\tbaseline.down([[DATA, result.record]]);\n\t\t\t});\n\t\t}\n\t});\n\tg.add(\"__baseline_updater\", baselineUpdater as Node<unknown>);\n\tg.connect(\"validate\", \"__baseline_updater\");\n\tkeepalive(baselineUpdater as Node<unknown>);\n\n\t// --- Drift detection ---\n\tconst detectDriftFn = opts.detectDrift ?? (() => ({ drift: false }));\n\tconst driftNode = derived<unknown>(\n\t\t[opts.source, baseline],\n\t\t(vals) => detectDriftFn(vals[0], vals[1]),\n\t\t{ meta: baseMeta(\"data_quality\", { stage: \"drift\" }) },\n\t);\n\tg.add(\"drift\", driftNode);\n\tg.connect(\"source\", \"drift\");\n\tg.connect(\"baseline\", \"drift\");\n\n\t// --- Remediation suggestions ---\n\tconst suggestFn = opts.suggest ?? (() => null);\n\tconst remediateNode = derived<unknown>(\n\t\t[validateNode as Node, anomalyNode as Node],\n\t\t(vals) =>\n\t\t\tsuggestFn({\n\t\t\t\tvalidation: vals[0] as ValidationResult,\n\t\t\t\tanomaly: vals[1] as AnomalyResult,\n\t\t\t}),\n\t\t{ meta: baseMeta(\"data_quality\", { stage: \"remediate\" }) },\n\t);\n\tg.add(\"remediate\", remediateNode);\n\tg.connect(\"validate\", \"remediate\");\n\tg.connect(\"anomaly\", \"remediate\");\n\n\t// --- Output ---\n\tconst output = derived<unknown>(\n\t\t[validateNode as Node, anomalyNode as Node, driftNode, remediateNode],\n\t\t(vals) => ({\n\t\t\tvalidation: vals[0],\n\t\t\tanomaly: vals[1],\n\t\t\tdrift: vals[2],\n\t\t\tremediation: vals[3],\n\t\t}),\n\t\t{ meta: baseMeta(\"data_quality\", { stage: \"output\" }) },\n\t);\n\tg.add(\"output\", output);\n\tg.connect(\"validate\", \"output\");\n\tg.connect(\"anomaly\", \"output\");\n\tg.connect(\"drift\", \"output\");\n\tg.connect(\"remediate\", \"output\");\n\n\t// --- Feedback (anomaly → validation rule refinement) ---\n\tconst validationRules = state<unknown[]>([], {\n\t\tmeta: baseMeta(\"data_quality\", { stage: \"validation_rules\" }),\n\t});\n\tg.add(\"validation_rules\", validationRules as Node<unknown>);\n\n\tconst fbCondition = derived<unknown>(\n\t\t[anomalyNode as Node],\n\t\t(vals) => {\n\t\t\tconst a = vals[0] as AnomalyResult | null;\n\t\t\tif (a?.anomaly) return a;\n\t\t\treturn null;\n\t\t},\n\t\t{\n\t\t\tmeta: baseMeta(\"data_quality\", { stage: \"feedback_condition\" }),\n\t\t},\n\t);\n\tg.add(\"feedback_condition\", fbCondition as Node<unknown>);\n\tg.connect(\"anomaly\", \"feedback_condition\");\n\tfeedback(g, \"feedback_condition\", \"validation_rules\", {\n\t\tmaxIterations: opts.maxFeedbackIterations ?? 3,\n\t});\n\n\treturn g;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Check if a value has a `type` or `kind` tag matching the given label. */\nfunction isTagged(value: unknown, tag: string): boolean {\n\tif (value == null || typeof value !== \"object\") return false;\n\tconst v = value as Record<string, unknown>;\n\treturn v.type === tag || v.kind === tag;\n}\n","/**\n * Reduction primitives (roadmap §8.1).\n *\n * Composable building blocks for taking heterogeneous massive inputs and producing\n * prioritized, auditable, human-actionable output. Each primitive is either a Graph\n * factory or a Node factory, built on top of core + extra primitives.\n *\n * @module\n */\n\nimport { batch } from \"../core/batch.js\";\nimport { bridge, DEFAULT_DOWN } from \"../core/bridge.js\";\nimport {\n\tCOMPLETE,\n\tDATA,\n\tDIRTY,\n\tERROR,\n\ttype Message,\n\tPAUSE,\n\tRESOLVED,\n\tRESUME,\n\tTEARDOWN,\n} from \"../core/messages.js\";\nimport { type Node, type NodeActions, type NodeOptions, node } from \"../core/node.js\";\nimport { derived, state } from \"../core/sugar.js\";\nimport { merge } from \"../extra/operators.js\";\nimport { Graph, type GraphOptions } from \"../graph/graph.js\";\n\n// ---------------------------------------------------------------------------\n// Shared helpers (same pattern as orchestration.ts)\n// ---------------------------------------------------------------------------\n\nexport type StepRef = string | Node<unknown>;\n\nfunction baseMeta(kind: string, meta?: Record<string, unknown>): Record<string, unknown> {\n\treturn {\n\t\treduction: true,\n\t\treduction_type: kind,\n\t\t...(meta ?? {}),\n\t};\n}\n\n/** Force-activate a lazy node so it receives messages immediately. */\nfunction keepalive(n: Node<unknown>): () => void {\n\treturn n.subscribe(() => {});\n}\n\n// ---------------------------------------------------------------------------\n// stratify\n// ---------------------------------------------------------------------------\n\n/** A single routing rule for {@link stratify}. */\nexport type StratifyRule<T> = {\n\t/** Branch name (used as node name under `branch/<name>`). */\n\tname: string;\n\t/** Classifier: returns `true` if the value belongs to this branch. */\n\tclassify: (value: T) => boolean;\n\t/** Optional operator chain applied to the branch after classification. */\n\tops?: (n: Node<T>) => Node;\n};\n\n/** Options for {@link stratify}. */\nexport type StratifyOptions = GraphOptions & {\n\tmeta?: Record<string, unknown>;\n};\n\n/**\n * Route input to different reduction branches based on classifier functions.\n *\n * Each branch gets an independent operator chain. Rules are reactive — update\n * the `\"rules\"` state node to rewrite classification at runtime. Rule updates\n * affect **future items only** (streaming classification, not retroactive).\n *\n * Branch nodes are structural — created at construction time and persist for\n * the graph's lifetime. If a rule name is removed from the rules array, the\n * corresponding branch silently drops items (classifier not found). To tear\n * down a dead branch, call `graph.remove(\"branch/<name>\")`.\n *\n * @param name - Graph name.\n * @param source - Input node (registered externally or will be added as `\"source\"`).\n * @param rules - Initial routing rules.\n * @param opts - Optional graph/meta options.\n * @returns Graph with `\"source\"`, `\"rules\"`, and `\"branch/<name>\"` nodes.\n *\n * @category patterns\n */\nexport function stratify<T>(\n\tname: string,\n\tsource: Node<T>,\n\trules: ReadonlyArray<StratifyRule<T>>,\n\topts?: StratifyOptions,\n): Graph {\n\tconst g = new Graph(name, opts);\n\n\tg.add(\"source\", source as Node<unknown>);\n\tconst rulesNode = state<ReadonlyArray<StratifyRule<T>>>(rules, {\n\t\tmeta: baseMeta(\"stratify_rules\"),\n\t});\n\tg.add(\"rules\", rulesNode as Node<unknown>);\n\n\tfor (const rule of rules) {\n\t\t_addBranch(g, source, rulesNode, rule);\n\t}\n\n\treturn g;\n}\n\nfunction _addBranch<T>(\n\tgraph: Graph,\n\tsource: Node<T>,\n\trulesNode: Node<ReadonlyArray<StratifyRule<T>>>,\n\trule: StratifyRule<T>,\n): void {\n\tconst branchName = `branch/${rule.name}`;\n\n\t// Two-dep gating: intercepts messages from BOTH source (dep 0) and rules\n\t// (dep 1). Classification is deferred until all dirty deps have settled,\n\t// eliminating the stale-rules race when both are updated in the same batch().\n\t//\n\t// Protocol: DIRTY is buffered until DATA arrives. If the classifier matches,\n\t// emit [DIRTY, DATA]. If not, emit [DIRTY, RESOLVED] so downstream exits\n\t// dirty status cleanly (spec §1.3.1). Source RESOLVED forwards as RESOLVED.\n\t// Rules-only changes produce no downstream emission (\"future items only\").\n\tconst _noValue: unique symbol = Symbol(\"noValue\");\n\tlet sourceDirty = false;\n\tlet rulesDirty = false;\n\tlet sourcePhase2 = false; // source delivered DATA or RESOLVED this cycle\n\tlet sourceValue: T | typeof _noValue = _noValue; // DATA payload, or _noValue for RESOLVED\n\tlet pendingDirty = false; // owe downstream a DIRTY\n\n\tfunction resolve(actions: NodeActions): void {\n\t\tif (sourcePhase2) {\n\t\t\tsourcePhase2 = false;\n\t\t\tconst value = sourceValue;\n\t\t\tsourceValue = _noValue;\n\t\t\tif (value !== _noValue) {\n\t\t\t\t// Source emitted DATA — classify with settled rules\n\t\t\t\tconst currentRules = rulesNode.get() as ReadonlyArray<StratifyRule<T>>;\n\t\t\t\tconst currentRule = currentRules.find((r) => r.name === rule.name);\n\t\t\t\tlet matches = false;\n\t\t\t\ttry {\n\t\t\t\t\tmatches = currentRule?.classify(value) ?? false;\n\t\t\t\t} catch {\n\t\t\t\t\tmatches = false;\n\t\t\t\t}\n\t\t\t\tif (matches) {\n\t\t\t\t\tpendingDirty = false;\n\t\t\t\t\tactions.emit(value);\n\t\t\t\t} else {\n\t\t\t\t\tif (pendingDirty) {\n\t\t\t\t\t\tpendingDirty = false;\n\t\t\t\t\t\tactions.down([[DIRTY], [RESOLVED]]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Source RESOLVED (unchanged)\n\t\t\t\tif (pendingDirty) {\n\t\t\t\t\tpendingDirty = false;\n\t\t\t\t\tactions.down([[DIRTY], [RESOLVED]]);\n\t\t\t\t} else {\n\t\t\t\t\tactions.down([[RESOLVED]]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// else: rules-only change — no reclassification (\"future items only\")\n\t}\n\n\tconst filterNode = node<T>([source as Node, rulesNode as Node], () => undefined, {\n\t\tdescribeKind: \"operator\",\n\t\tmeta: baseMeta(\"stratify_branch\", { branch: rule.name }),\n\t\tonMessage(msg: Message, depIndex: number, actions: NodeActions): boolean {\n\t\t\tconst t = msg[0];\n\n\t\t\t// --- DIRTY (phase 1) ---\n\t\t\tif (t === DIRTY) {\n\t\t\t\tif (depIndex === 0) {\n\t\t\t\t\tsourceDirty = true;\n\t\t\t\t\tpendingDirty = true;\n\t\t\t\t} else {\n\t\t\t\t\trulesDirty = true;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// --- Phase 2 (DATA / RESOLVED) ---\n\t\t\tif (t === DATA || t === RESOLVED) {\n\t\t\t\tif (depIndex === 0) {\n\t\t\t\t\tsourceDirty = false;\n\t\t\t\t\tsourcePhase2 = true;\n\t\t\t\t\tsourceValue = t === DATA ? (msg[1] as T) : _noValue;\n\t\t\t\t} else {\n\t\t\t\t\trulesDirty = false;\n\t\t\t\t}\n\n\t\t\t\t// Wait for all dirty deps to settle\n\t\t\t\tif (sourceDirty || rulesDirty) return true;\n\n\t\t\t\tresolve(actions);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// --- Terminal ---\n\t\t\tif (t === COMPLETE || t === ERROR || t === TEARDOWN) {\n\t\t\t\tsourceDirty = false;\n\t\t\t\trulesDirty = false;\n\t\t\t\tsourcePhase2 = false;\n\t\t\t\tsourceValue = _noValue;\n\t\t\t\tpendingDirty = false;\n\t\t\t\tif (depIndex === 0) {\n\t\t\t\t\tactions.down([msg]);\n\t\t\t\t}\n\t\t\t\t// Rules terminal: swallow (branch stays alive)\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Swallow PAUSE/RESUME/INVALIDATE from rules dep (internal impl detail)\n\t\t\tif (depIndex === 1) return true;\n\n\t\t\treturn false;\n\t\t},\n\t\tcompleteWhenDepsComplete: false,\n\t});\n\n\tgraph.add(branchName, filterNode as Node<unknown>);\n\tgraph.connect(\"source\", branchName);\n\n\t// If the rule has an ops chain, apply it and connect the edge\n\tif (rule.ops) {\n\t\tconst transformed = rule.ops(filterNode);\n\t\tconst transformedName = `branch/${rule.name}/out`;\n\t\tgraph.add(transformedName, transformed as Node<unknown>);\n\t\tgraph.connect(branchName, transformedName);\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// funnel\n// ---------------------------------------------------------------------------\n\n/** A named stage for {@link funnel}. */\nexport type FunnelStage = {\n\t/** Stage name (mounted as subgraph). */\n\tname: string;\n\t/** Builder: receives a sub-graph, should add an `\"input\"` and `\"output\"` node. */\n\tbuild: (sub: Graph) => void;\n};\n\n/** Options for {@link funnel}. */\nexport type FunnelOptions = GraphOptions & {\n\tmeta?: Record<string, unknown>;\n};\n\n/**\n * Multi-source merge with sequential reduction stages.\n *\n * Sources are merged into a single stream. Each stage is a named subgraph\n * (mounted via `graph.mount()`). Stages connect linearly:\n * `merged → stage[0].input → stage[0].output → stage[1].input → ...`\n *\n * @param name - Graph name.\n * @param sources - Input nodes to merge.\n * @param stages - Sequential reduction stages.\n * @param opts - Optional graph/meta options.\n * @returns Graph with `\"merged\"` and mounted stage subgraphs.\n *\n * @category patterns\n */\nexport function funnel<T>(\n\tname: string,\n\tsources: ReadonlyArray<Node<T>>,\n\tstages: ReadonlyArray<FunnelStage>,\n\topts?: FunnelOptions,\n): Graph {\n\tif (sources.length === 0) throw new RangeError(\"funnel requires at least one source\");\n\tif (stages.length === 0) throw new RangeError(\"funnel requires at least one stage\");\n\n\tconst g = new Graph(name, opts);\n\n\t// Merge all sources\n\tconst merged = sources.length === 1 ? sources[0] : merge(...(sources as unknown as Node<T>[]));\n\tg.add(\"merged\", merged as Node<unknown>);\n\n\t// Build and mount each stage linearly.\n\t// Stage inputs are standalone state nodes, so we bridge via subscribe\n\t// (connect() requires constructor deps). Bridge effects forward DATA\n\t// from the previous output to the next stage's input.\n\tlet prevOutputPath = \"merged\";\n\tfor (let i = 0; i < stages.length; i++) {\n\t\tconst stage = stages[i];\n\t\tconst sub = new Graph(stage.name);\n\t\tstage.build(sub);\n\n\t\t// Validate that the stage has input and output nodes\n\t\ttry {\n\t\t\tsub.resolve(\"input\");\n\t\t} catch {\n\t\t\tthrow new Error(`funnel stage \"${stage.name}\" must define an \"input\" node`);\n\t\t}\n\t\ttry {\n\t\t\tsub.resolve(\"output\");\n\t\t} catch {\n\t\t\tthrow new Error(`funnel stage \"${stage.name}\" must define an \"output\" node`);\n\t\t}\n\n\t\tg.mount(stage.name, sub);\n\n\t\t// Graph-visible bridge: forwards all standard types except TEARDOWN\n\t\t// from the previous output to the next stage's input. TEARDOWN excluded\n\t\t// because stage lifecycle is managed by the parent graph, not the\n\t\t// upstream stage. Participates in two-phase push and shows up in describe().\n\t\tconst prevNode = g.resolve(prevOutputPath);\n\t\tconst stageInputPath = `${stage.name}::input`;\n\t\tconst stageInput = g.resolve(stageInputPath);\n\t\tconst bridgeName = `__bridge_${prevOutputPath}→${stage.name}_input`;\n\t\tconst br = bridge(prevNode, stageInput, {\n\t\t\tname: bridgeName,\n\t\t\tdown: DEFAULT_DOWN.filter((t) => t !== TEARDOWN),\n\t\t});\n\t\tg.add(bridgeName, br as Node<unknown>);\n\t\tg.connect(prevOutputPath, bridgeName);\n\t\tkeepalive(br);\n\n\t\tprevOutputPath = `${stage.name}::output`;\n\t}\n\n\treturn g;\n}\n\n// ---------------------------------------------------------------------------\n// feedback\n// ---------------------------------------------------------------------------\n\n/** Options for {@link feedback}. */\nexport type FeedbackOptions = {\n\t/** Maximum feedback iterations before stopping (default: 10). */\n\tmaxIterations?: number;\n\t/** Optional budget gate node path for cost-bounded iteration. */\n\tbudgetNode?: StepRef;\n\tmeta?: Record<string, unknown>;\n};\n\n/**\n * Introduce a bounded reactive cycle into an existing graph.\n *\n * When `condition` emits a non-null DATA value, the feedback effect routes it\n * back to the `reentry` state node — creating a cycle. Bounded by\n * `maxIterations` (default 10). The counter node (`__feedback_<condition>`)\n * is the source of truth — reset it to 0 to allow more iterations.\n *\n * To remove the feedback cycle, call `graph.remove(\"__feedback_<condition>\")`.\n *\n * @param graph - Existing graph to augment with a feedback cycle.\n * @param condition - Path to a node whose DATA triggers feedback.\n * @param reentry - Path to a state node that receives the feedback value.\n * @param opts - Iteration bounds and metadata.\n * @returns The same graph (mutated with feedback nodes added).\n *\n * @category patterns\n */\nexport function feedback(\n\tgraph: Graph,\n\tcondition: string,\n\treentry: string,\n\topts?: FeedbackOptions,\n): Graph {\n\tconst maxIter = opts?.maxIterations ?? 10;\n\n\t// Internal counter node — source of truth for iteration bound.\n\t// Reset to 0 to allow more iterations.\n\tconst counterName = `__feedback_${condition}`;\n\tconst counter = state<number>(0, {\n\t\tmeta: baseMeta(\"feedback_counter\", {\n\t\t\tmaxIterations: maxIter,\n\t\t\tfeedbackFrom: condition,\n\t\t\tfeedbackTo: reentry,\n\t\t}),\n\t});\n\tgraph.add(counterName, counter as Node<unknown>);\n\n\t// Resolve the condition and reentry nodes\n\tconst condNode = graph.resolve(condition);\n\tconst reentryNode = graph.resolve(reentry);\n\n\t// Graph-visible feedback effect: intercepts condition DATA, routes back to\n\t// reentry with iteration counting. Registered in the graph so it shows up\n\t// in describe() and cleans up on graph.destroy().\n\tconst feedbackEffectName = `__feedback_effect_${condition}`;\n\tconst feedbackEffect = node([condNode], undefined, {\n\t\tname: feedbackEffectName,\n\t\tdescribeKind: \"effect\",\n\t\tmeta: {\n\t\t\t...baseMeta(\"feedback_effect\", {\n\t\t\t\tfeedbackFrom: condition,\n\t\t\t\tfeedbackTo: reentry,\n\t\t\t}),\n\t\t\t_internal: true,\n\t\t},\n\t\tonMessage(msg: Message, _depIndex: number, _actions: NodeActions): boolean {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === DATA) {\n\t\t\t\tconst currentCount = counter.get() as number;\n\t\t\t\tif (currentCount >= maxIter) return true;\n\t\t\t\tconst condValue = msg[1];\n\t\t\t\tif (condValue == null) return true;\n\t\t\t\t// Batch counter + reentry so both arrive atomically — no\n\t\t\t\t// downstream listener sees the counter incremented while reentry\n\t\t\t\t// still holds the old value (or vice versa).\n\t\t\t\tbatch(() => {\n\t\t\t\t\tcounter.down([[DATA, currentCount + 1]]);\n\t\t\t\t\treentryNode.down([[DATA, condValue]]);\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE || t === ERROR) {\n\t\t\t\t// Terminal on condition — finalize the feedback cycle.\n\t\t\t\t// Forward terminal to counter so observers know the cycle is done.\n\t\t\t\tconst terminal: Message = t === ERROR && msg.length > 1 ? [ERROR, msg[1]] : [t];\n\t\t\t\tcounter.down([terminal]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\tgraph.add(feedbackEffectName, feedbackEffect as Node<unknown>);\n\tgraph.connect(condition, feedbackEffectName);\n\tkeepalive(feedbackEffect);\n\n\treturn graph;\n}\n\n// ---------------------------------------------------------------------------\n// budgetGate\n// ---------------------------------------------------------------------------\n\n/** A reactive constraint for {@link budgetGate}. */\nexport type BudgetConstraint<T = unknown> = {\n\t/** Constraint node whose value is checked. */\n\tnode: Node<T>;\n\t/** Returns `true` when the constraint is satisfied (budget available). */\n\tcheck: (value: T) => boolean;\n};\n\n/** Options for {@link budgetGate}. */\nexport type BudgetGateOptions = Omit<NodeOptions, \"describeKind\" | \"name\" | \"meta\"> & {\n\tmeta?: Record<string, unknown>;\n};\n\n/**\n * Pass-through that respects reactive constraint nodes.\n *\n * DATA flows through when all constraints are satisfied. When any constraint\n * is exceeded, PAUSE is sent upstream and DATA is buffered. When constraints\n * relax, RESUME is sent and buffered DATA flushes.\n *\n * @param source - Input node.\n * @param constraints - Reactive constraint checks.\n * @param opts - Optional node options.\n * @returns Gated node.\n *\n * @category patterns\n */\nexport function budgetGate<T>(\n\tsource: Node<T>,\n\tconstraints: ReadonlyArray<BudgetConstraint>,\n\topts?: BudgetGateOptions,\n): Node<T> {\n\tif (constraints.length === 0) throw new RangeError(\"budgetGate requires at least one constraint\");\n\n\tconst constraintNodes = constraints.map((c) => c.node);\n\tconst allDeps = [source as Node, ...constraintNodes] as Node[];\n\n\tlet buffer: T[] = [];\n\tlet paused = false;\n\tlet pendingResolved = false;\n\tconst lockId = Symbol(\"budget-gate\");\n\n\tfunction checkBudget(): boolean {\n\t\treturn constraints.every((c) => c.check(c.node.get()));\n\t}\n\n\tfunction flushBuffer(actions: NodeActions): void {\n\t\twhile (buffer.length > 0 && checkBudget()) {\n\t\t\tconst item = buffer[0]!;\n\t\t\tbuffer = buffer.slice(1);\n\t\t\tactions.emit(item);\n\t\t}\n\t\t// Drain deferred RESOLVED once buffer is empty\n\t\tif (buffer.length === 0 && pendingResolved) {\n\t\t\tpendingResolved = false;\n\t\t\tactions.down([[RESOLVED]]);\n\t\t}\n\t}\n\n\treturn node<T>(allDeps, () => undefined, {\n\t\t...opts,\n\t\tdescribeKind: \"operator\",\n\t\tmeta: baseMeta(\"budget_gate\", opts?.meta),\n\t\tonMessage(msg: Message, depIndex: number, actions: NodeActions): boolean {\n\t\t\tconst t = msg[0];\n\n\t\t\t// Source messages (dep 0)\n\t\t\tif (depIndex === 0) {\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tif (checkBudget() && buffer.length === 0) {\n\t\t\t\t\t\tactions.emit(msg[1] as T);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbuffer.push(msg[1] as T);\n\t\t\t\t\t\tif (!paused) {\n\t\t\t\t\t\t\tpaused = true;\n\t\t\t\t\t\t\tactions.up([[PAUSE, lockId]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\tactions.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\tif (buffer.length === 0) {\n\t\t\t\t\t\tactions.down([[RESOLVED]]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Buffer non-empty: defer RESOLVED until buffer drains\n\t\t\t\t\t\tpendingResolved = true;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE || t === ERROR) {\n\t\t\t\t\t// Force-flush all buffered items regardless of budget (terminal = done)\n\t\t\t\t\tfor (const item of buffer) {\n\t\t\t\t\t\tactions.emit(item);\n\t\t\t\t\t}\n\t\t\t\t\tbuffer = [];\n\t\t\t\t\tpendingResolved = false;\n\t\t\t\t\t// Release PAUSE lock before forwarding terminal\n\t\t\t\t\tif (paused) {\n\t\t\t\t\t\tpaused = false;\n\t\t\t\t\t\tactions.up([[RESUME, lockId]]);\n\t\t\t\t\t}\n\t\t\t\t\tactions.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Constraint node messages (dep 1+): re-check budget\n\t\t\tif (t === DATA || t === RESOLVED) {\n\t\t\t\tif (checkBudget() && buffer.length > 0) {\n\t\t\t\t\tflushBuffer(actions);\n\t\t\t\t\tif (buffer.length === 0 && paused) {\n\t\t\t\t\t\tpaused = false;\n\t\t\t\t\t\tactions.up([[RESUME, lockId]]);\n\t\t\t\t\t}\n\t\t\t\t} else if (!checkBudget() && !paused && buffer.length > 0) {\n\t\t\t\t\tpaused = true;\n\t\t\t\t\tactions.up([[PAUSE, lockId]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DIRTY) {\n\t\t\t\t// Don't propagate constraint DIRTY downstream\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\t// Constraint error → forward downstream\n\t\t\t\tactions.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\t// Constraint completed — locked at last value, no-op\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t// Unknown constraint types → default forwarding\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n// ---------------------------------------------------------------------------\n// scorer\n// ---------------------------------------------------------------------------\n\n/** A scored item with full breakdown. */\nexport type ScoredItem<T = unknown> = {\n\t/** Original value. */\n\tvalue: T;\n\t/** Final weighted score. */\n\tscore: number;\n\t/** Per-signal breakdown: signal index → weighted contribution. */\n\tbreakdown: number[];\n};\n\n/** Options for {@link scorer}. */\nexport type ScorerOptions = Omit<NodeOptions, \"describeKind\" | \"name\" | \"meta\"> & {\n\tmeta?: Record<string, unknown>;\n\t/** Custom scoring function per signal. Default: identity (signal value IS the score). */\n\tscoreFns?: ReadonlyArray<(value: unknown) => number>;\n};\n\n/**\n * Reactive multi-signal scoring with live weights.\n *\n * Each source emits items to score. Weights are reactive state nodes that\n * LLM or human can adjust live. Output is sorted scored items with full\n * breakdown.\n *\n * @param sources - Signal nodes (each emits a numeric score dimension).\n * @param weights - Reactive weight nodes (one per source).\n * @param opts - Optional node/meta options.\n * @returns Node emitting scored output.\n *\n * @category patterns\n */\nexport function scorer(\n\tsources: ReadonlyArray<Node<number>>,\n\tweights: ReadonlyArray<Node<number>>,\n\topts?: ScorerOptions,\n): Node<ScoredItem<number[]>> {\n\tif (sources.length === 0) throw new RangeError(\"scorer requires at least one source\");\n\tif (sources.length !== weights.length) {\n\t\tthrow new RangeError(\"scorer requires the same number of sources and weights\");\n\t}\n\n\tconst allDeps = [...(sources as unknown as Node[]), ...(weights as unknown as Node[])];\n\tconst n = sources.length;\n\tconst scoreFns = opts?.scoreFns;\n\n\treturn derived<ScoredItem<number[]>>(\n\t\tallDeps,\n\t\t(vals) => {\n\t\t\tconst signals = vals.slice(0, n) as number[];\n\t\t\tconst weightValues = vals.slice(n) as number[];\n\n\t\t\tconst breakdown: number[] = [];\n\t\t\tlet totalScore = 0;\n\n\t\t\tfor (let i = 0; i < n; i++) {\n\t\t\t\tconst sig = signals[i] ?? 0;\n\t\t\t\tconst wt = weightValues[i] ?? 0;\n\t\t\t\tconst rawScore = scoreFns?.[i] ? scoreFns[i](sig) : sig;\n\t\t\t\tconst weighted = (rawScore as number) * wt;\n\t\t\t\tbreakdown.push(weighted);\n\t\t\t\ttotalScore += weighted;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tvalue: signals,\n\t\t\t\tscore: totalScore,\n\t\t\t\tbreakdown,\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\t...opts,\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"scorer\", opts?.meta),\n\t\t},\n\t);\n}\n","/**\n * LLM graph composition (roadmap §8.3).\n *\n * Declarative GraphSpec schema + compiler/decompiler for graph topology.\n * The LLM designs graphs as JSON; compileSpec instantiates them; decompileGraph\n * extracts them back. Templates support reusable subgraph patterns. Feedback\n * edges express bounded cycles via §8.1 feedback().\n *\n * @module\n */\n\nimport { DATA } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { derived, effect, producer, state } from \"../core/sugar.js\";\nimport { GRAPH_META_SEGMENT, Graph } from \"../graph/graph.js\";\nimport type { ChatMessage, LLMAdapter, LLMResponse } from \"./ai.js\";\nimport { feedback as feedbackPrimitive } from \"./reduction.js\";\n\n// ---------------------------------------------------------------------------\n// GraphSpec types\n// ---------------------------------------------------------------------------\n\n/** A single node declaration in a GraphSpec. */\nexport type GraphSpecNode = {\n\t/** Node kind: state, producer, derived, effect, operator. */\n\ttype: \"state\" | \"producer\" | \"derived\" | \"effect\" | \"operator\";\n\t/** Dependency node names (for derived/effect/operator). */\n\tdeps?: string[];\n\t/** Named function from the catalog (for derived/effect/operator/producer). */\n\tfn?: string;\n\t/** Named source from the catalog (for producer). */\n\tsource?: string;\n\t/** Freeform config passed to the catalog fn/source factory. */\n\tconfig?: Record<string, unknown>;\n\t/** Initial value (for state nodes). */\n\tinitial?: unknown;\n\t/** Human/LLM-readable metadata. */\n\tmeta?: Record<string, unknown>;\n};\n\n/** Template instantiation node — expanded at compile time. */\nexport type GraphSpecTemplateRef = {\n\ttype: \"template\";\n\t/** Name of the template to instantiate. */\n\ttemplate: string;\n\t/** Parameter bindings: template param name → node name. */\n\tbind: Record<string, string>;\n};\n\n/** A reusable subgraph pattern with parameter substitution. */\nexport type GraphSpecTemplate = {\n\t/** Parameter names (prefixed with $ in node refs). */\n\tparams: string[];\n\t/** Node declarations within the template. */\n\tnodes: Record<string, GraphSpecNode>;\n\t/** Which node's output is the template's output. */\n\toutput: string;\n};\n\n/** A feedback edge: bounded cycle from condition to reentry. */\nexport type GraphSpecFeedbackEdge = {\n\t/** Node whose DATA triggers the feedback. */\n\tfrom: string;\n\t/** State node that receives the feedback value. */\n\tto: string;\n\t/** Max iterations before stopping (default: 10). */\n\tmaxIterations?: number;\n};\n\n/** Declarative graph topology for LLM composition (§8.3). */\nexport type GraphSpec = {\n\t/** Graph name. */\n\tname: string;\n\t/** Node declarations (keyed by node name). */\n\tnodes: Record<string, GraphSpecNode | GraphSpecTemplateRef>;\n\t/** Reusable subgraph templates. */\n\ttemplates?: Record<string, GraphSpecTemplate>;\n\t/** Feedback edges (bounded cycles). */\n\tfeedback?: GraphSpecFeedbackEdge[];\n};\n\n// ---------------------------------------------------------------------------\n// Catalog types\n// ---------------------------------------------------------------------------\n\n/**\n * Factory for creating a derived/effect/operator node from catalog.\n * Receives resolved dep nodes and the config from the spec.\n */\nexport type FnFactory = (deps: Node<unknown>[], config: Record<string, unknown>) => Node<unknown>;\n\n/**\n * Factory for creating a producer node from catalog.\n * Receives the config from the spec.\n */\nexport type SourceFactory = (config: Record<string, unknown>) => Node<unknown>;\n\n// ---------------------------------------------------------------------------\n// Rich catalog entries (§9.1b — auto-prompt, catalog-aware validation)\n// ---------------------------------------------------------------------------\n\n/** Simple config field descriptor for LLM prompt generation and validation. */\nexport type ConfigFieldSchema = {\n\t/** Human-readable type: \"string\", \"number\", \"boolean\", \"string[]\", etc. */\n\ttype: string;\n\t/** Whether this field is required (default: true). */\n\trequired?: boolean;\n\t/** Allowed values (enum constraint). */\n\tenum?: readonly (string | number | boolean)[];\n\t/** Human-readable description for LLM context. */\n\tdescription?: string;\n\t/** Default value if omitted. */\n\tdefault?: unknown;\n};\n\n/**\n * Rich catalog entry: bundles a runtime factory with LLM-facing metadata.\n *\n * The metadata is used to:\n * 1. Auto-generate prompt text for {@link llmCompose} (replaces manual `catalogDescription`)\n * 2. Validate LLM output in {@link validateSpec} (catch wrong fn names, invalid config)\n * 3. Provide actionable error messages for {@link llmRefine} feedback loops\n *\n * Developers register ONE object; the library handles prompt generation and validation.\n */\nexport type CatalogFnEntry = {\n\t/** Runtime factory. */\n\tfactory: FnFactory;\n\t/** One-line description for LLM prompt (what it does, not how). */\n\tdescription: string;\n\t/** Config field schemas. Keys are config field names. */\n\tconfigSchema?: Record<string, ConfigFieldSchema>;\n\t/** Example config objects (shown in prompt for complex fns). */\n\texamples?: Record<string, unknown>[];\n\t/** Category tags for grouping in prompt (e.g., \"resilience\", \"reduction\", \"ai\"). */\n\ttags?: string[];\n};\n\n/** Rich catalog entry for producer sources. */\nexport type CatalogSourceEntry = {\n\t/** Runtime factory. */\n\tfactory: SourceFactory;\n\t/** One-line description for LLM prompt. */\n\tdescription: string;\n\t/** Config field schemas. */\n\tconfigSchema?: Record<string, ConfigFieldSchema>;\n\t/** Example config objects. */\n\texamples?: Record<string, unknown>[];\n\t/** Category tags. */\n\ttags?: string[];\n};\n\n/**\n * Fn/source lookup table passed to compileSpec and llmCompose.\n *\n * Accepts both bare factories (backward-compatible) and rich {@link CatalogFnEntry}\n * / {@link CatalogSourceEntry} objects. When rich entries are provided, the library\n * auto-generates LLM prompts and validates LLM output against the catalog.\n */\nexport type GraphSpecCatalog = {\n\tfns?: Record<string, FnFactory | CatalogFnEntry>;\n\tsources?: Record<string, SourceFactory | CatalogSourceEntry>;\n};\n\n// ---------------------------------------------------------------------------\n// Catalog helpers\n// ---------------------------------------------------------------------------\n\n/** Type guard: is this a rich catalog fn entry (vs bare factory)? */\nexport function isRichFnEntry(entry: FnFactory | CatalogFnEntry): entry is CatalogFnEntry {\n\treturn typeof entry === \"object\" && entry !== null && \"factory\" in entry;\n}\n\n/** Type guard: is this a rich catalog source entry (vs bare factory)? */\nexport function isRichSourceEntry(\n\tentry: SourceFactory | CatalogSourceEntry,\n): entry is CatalogSourceEntry {\n\treturn typeof entry === \"object\" && entry !== null && \"factory\" in entry;\n}\n\n/** Extract the runtime factory from a catalog entry (rich or bare). */\nexport function extractFnFactory(entry: FnFactory | CatalogFnEntry): FnFactory {\n\treturn isRichFnEntry(entry) ? entry.factory : entry;\n}\n\n/** Extract the runtime factory from a catalog source entry (rich or bare). */\nexport function extractSourceFactory(entry: SourceFactory | CatalogSourceEntry): SourceFactory {\n\treturn isRichSourceEntry(entry) ? entry.factory : entry;\n}\n\n/**\n * Auto-generate catalog prompt text from rich catalog entries.\n *\n * Groups fns by tag, formats each as `- name: description. Config: { ... }`.\n * Falls back to listing names only for bare factories.\n */\nexport function generateCatalogPrompt(catalog: GraphSpecCatalog): string {\n\tconst sections: string[] = [];\n\n\tif (catalog.fns) {\n\t\t// Group by first tag (or \"Other\")\n\t\tconst groups = new Map<string, string[]>();\n\t\tfor (const [name, entry] of Object.entries(catalog.fns)) {\n\t\t\tconst tag = isRichFnEntry(entry) ? (entry.tags?.[0] ?? \"Other\") : \"Other\";\n\t\t\tif (!groups.has(tag)) groups.set(tag, []);\n\t\t\tgroups.get(tag)!.push(formatFnEntry(name, entry));\n\t\t}\n\t\tfor (const [tag, lines] of groups) {\n\t\t\tsections.push(`${tag}:\\n${lines.join(\"\\n\")}`);\n\t\t}\n\t}\n\n\tif (catalog.sources) {\n\t\tconst lines: string[] = [];\n\t\tfor (const [name, entry] of Object.entries(catalog.sources)) {\n\t\t\tlines.push(formatSourceEntry(name, entry));\n\t\t}\n\t\tif (lines.length > 0) {\n\t\t\tsections.push(`Sources:\\n${lines.join(\"\\n\")}`);\n\t\t}\n\t}\n\n\treturn sections.join(\"\\n\\n\");\n}\n\nfunction formatFnEntry(name: string, entry: FnFactory | CatalogFnEntry): string {\n\tif (!isRichFnEntry(entry)) return `- ${name}`;\n\tlet line = `- ${name}: ${entry.description}`;\n\tif (entry.configSchema) {\n\t\tconst fields = Object.entries(entry.configSchema).map(([k, v]) => {\n\t\t\tlet desc = `${k}: ${v.type}`;\n\t\t\tif (v.enum) desc += ` (${v.enum.join(\"|\")})`;\n\t\t\tif (v.required === false) desc += \"?\";\n\t\t\treturn desc;\n\t\t});\n\t\tline += `. Config: { ${fields.join(\", \")} }`;\n\t}\n\treturn line;\n}\n\nfunction formatSourceEntry(name: string, entry: SourceFactory | CatalogSourceEntry): string {\n\tif (!isRichSourceEntry(entry)) return `- ${name}`;\n\tlet line = `- ${name}: ${entry.description}`;\n\tif (entry.configSchema) {\n\t\tconst fields = Object.entries(entry.configSchema).map(([k, v]) => {\n\t\t\tlet desc = `${k}: ${v.type}`;\n\t\t\tif (v.required === false) desc += \"?\";\n\t\t\treturn desc;\n\t\t});\n\t\tline += `. Config: { ${fields.join(\", \")} }`;\n\t}\n\treturn line;\n}\n\n/**\n * Validate a GraphSpec against a catalog.\n *\n * Checks that fn/source names reference actual catalog entries, and validates\n * config fields against configSchema when rich entries are available.\n * Returns additional errors beyond structural {@link validateSpec} checks.\n */\nexport function validateSpecAgainstCatalog(\n\tspec: GraphSpec,\n\tcatalog: GraphSpecCatalog,\n): GraphSpecValidation {\n\tconst errors: string[] = [];\n\tconst fnNames = new Set(Object.keys(catalog.fns ?? {}));\n\tconst sourceNames = new Set(Object.keys(catalog.sources ?? {}));\n\n\tfor (const [nodeName, nodeRaw] of Object.entries(spec.nodes)) {\n\t\tif (nodeRaw.type === \"template\") continue;\n\t\tconst node = nodeRaw as GraphSpecNode;\n\n\t\t// Check fn name exists in catalog\n\t\tif (node.fn && fnNames.size > 0 && !fnNames.has(node.fn)) {\n\t\t\t// Check if they used a source name as fn\n\t\t\tif (sourceNames.has(node.fn)) {\n\t\t\t\terrors.push(\n\t\t\t\t\t`Node \"${nodeName}\": fn \"${node.fn}\" is a source, not a function. ` +\n\t\t\t\t\t\t`Use it as a producer source instead, or use a function from: ${[...fnNames].join(\", \")}`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst suggestion = findClosest(node.fn, fnNames);\n\t\t\t\terrors.push(\n\t\t\t\t\t`Node \"${nodeName}\": fn \"${node.fn}\" not found in catalog` +\n\t\t\t\t\t\t(suggestion ? `. Did you mean \"${suggestion}\"?` : \"\"),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Check source name exists in catalog\n\t\tif (node.source && sourceNames.size > 0 && !sourceNames.has(node.source)) {\n\t\t\tif (fnNames.has(node.source)) {\n\t\t\t\terrors.push(\n\t\t\t\t\t`Node \"${nodeName}\": source \"${node.source}\" is a function, not a source. ` +\n\t\t\t\t\t\t`Use it as fn instead, or use a source from: ${[...sourceNames].join(\", \")}`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst suggestion = findClosest(node.source, sourceNames);\n\t\t\t\terrors.push(\n\t\t\t\t\t`Node \"${nodeName}\": source \"${node.source}\" not found in catalog` +\n\t\t\t\t\t\t(suggestion ? `. Did you mean \"${suggestion}\"?` : \"\"),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Validate config against schema (if rich entry)\n\t\tif (node.fn && node.config && catalog.fns?.[node.fn]) {\n\t\t\tconst entry = catalog.fns[node.fn];\n\t\t\tif (isRichFnEntry(entry) && entry.configSchema) {\n\t\t\t\tfor (const [field, schema] of Object.entries(entry.configSchema)) {\n\t\t\t\t\tif (schema.required !== false && !(field in node.config)) {\n\t\t\t\t\t\terrors.push(`Node \"${nodeName}\": config missing required field \"${field}\"`);\n\t\t\t\t\t}\n\t\t\t\t\tif (field in node.config && schema.enum) {\n\t\t\t\t\t\tconst val = node.config[field];\n\t\t\t\t\t\tif (!schema.enum.includes(val as string | number | boolean)) {\n\t\t\t\t\t\t\terrors.push(\n\t\t\t\t\t\t\t\t`Node \"${nodeName}\": config.${field} = ${JSON.stringify(val)}, ` +\n\t\t\t\t\t\t\t\t\t`expected one of: ${schema.enum.join(\", \")}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Also check template inner nodes\n\tif (spec.templates) {\n\t\tfor (const [tName, template] of Object.entries(spec.templates)) {\n\t\t\tfor (const [nodeName, node] of Object.entries(template.nodes)) {\n\t\t\t\tif (node.fn && fnNames.size > 0 && !fnNames.has(node.fn)) {\n\t\t\t\t\tconst suggestion = findClosest(node.fn, fnNames);\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\t`Template \"${tName}\" node \"${nodeName}\": fn \"${node.fn}\" not found in catalog` +\n\t\t\t\t\t\t\t(suggestion ? `. Did you mean \"${suggestion}\"?` : \"\"),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { valid: errors.length === 0, errors };\n}\n\n/** Simple Levenshtein-based closest match for \"did you mean?\" suggestions. */\nfunction findClosest(input: string, candidates: Set<string>): string | null {\n\tlet best: string | null = null;\n\tlet bestDist = Infinity;\n\tconst lower = input.toLowerCase();\n\tfor (const c of candidates) {\n\t\tconst dist = levenshtein(lower, c.toLowerCase());\n\t\tif (dist < bestDist && dist <= Math.max(3, Math.floor(input.length / 2))) {\n\t\t\tbestDist = dist;\n\t\t\tbest = c;\n\t\t}\n\t}\n\treturn best;\n}\n\nfunction levenshtein(a: string, b: string): number {\n\tconst m = a.length;\n\tconst n = b.length;\n\tconst dp: number[][] = Array.from({ length: m + 1 }, (_, i) =>\n\t\tArray.from({ length: n + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0)),\n\t);\n\tfor (let i = 1; i <= m; i++) {\n\t\tfor (let j = 1; j <= n; j++) {\n\t\t\tdp[i][j] =\n\t\t\t\ta[i - 1] === b[j - 1]\n\t\t\t\t\t? dp[i - 1][j - 1]\n\t\t\t\t\t: 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);\n\t\t}\n\t}\n\treturn dp[m][n];\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\n/** Validation result from {@link validateSpec}. */\nexport type GraphSpecValidation = {\n\tvalid: boolean;\n\terrors: string[];\n};\n\nconst VALID_NODE_TYPES = new Set([\n\t\"state\",\n\t\"producer\",\n\t\"derived\",\n\t\"effect\",\n\t\"operator\",\n\t\"template\",\n]);\n\nconst INNER_NODE_TYPES = new Set([\"state\", \"producer\", \"derived\", \"effect\", \"operator\"]);\n\n/**\n * Validate a GraphSpec JSON object.\n *\n * Checks structural validity: required fields, node types, dep references,\n * template references, feedback edge targets, self-cycles, and bind completeness.\n */\nexport function validateSpec(spec: unknown): GraphSpecValidation {\n\tconst errors: string[] = [];\n\n\tif (spec == null || typeof spec !== \"object\") {\n\t\treturn { valid: false, errors: [\"GraphSpec must be a non-null object\"] };\n\t}\n\n\tconst s = spec as Record<string, unknown>;\n\n\tif (typeof s.name !== \"string\" || s.name.length === 0) {\n\t\terrors.push(\"Missing or empty 'name' field\");\n\t}\n\n\tif (s.nodes == null || typeof s.nodes !== \"object\" || Array.isArray(s.nodes)) {\n\t\terrors.push(\"Missing or invalid 'nodes' field (must be an object)\");\n\t\treturn { valid: false, errors };\n\t}\n\n\tconst nodeNames = new Set(Object.keys(s.nodes as object));\n\tconst nodeTypes = new Map<string, string>();\n\tconst templateDefs = new Map<string, { params: string[] }>();\n\n\t// Pre-scan template definitions for param validation\n\tif (s.templates != null && typeof s.templates === \"object\" && !Array.isArray(s.templates)) {\n\t\tfor (const [tName, tRaw] of Object.entries(s.templates as Record<string, unknown>)) {\n\t\t\tif (tRaw != null && typeof tRaw === \"object\") {\n\t\t\t\tconst t = tRaw as Record<string, unknown>;\n\t\t\t\ttemplateDefs.set(tName, {\n\t\t\t\t\tparams: Array.isArray(t.params) ? (t.params as string[]) : [],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Validate templates\n\tif (s.templates != null) {\n\t\tif (typeof s.templates !== \"object\" || Array.isArray(s.templates)) {\n\t\t\terrors.push(\"'templates' must be an object\");\n\t\t} else {\n\t\t\tfor (const [tName, tRaw] of Object.entries(s.templates as Record<string, unknown>)) {\n\t\t\t\tif (tRaw == null || typeof tRaw !== \"object\") {\n\t\t\t\t\terrors.push(`Template \"${tName}\": must be an object`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst t = tRaw as Record<string, unknown>;\n\t\t\t\tif (!Array.isArray(t.params)) {\n\t\t\t\t\terrors.push(`Template \"${tName}\": missing 'params' array`);\n\t\t\t\t}\n\t\t\t\tif (t.nodes == null || typeof t.nodes !== \"object\" || Array.isArray(t.nodes)) {\n\t\t\t\t\terrors.push(`Template \"${tName}\": missing or invalid 'nodes' object`);\n\t\t\t\t} else {\n\t\t\t\t\tconst paramSet = new Set(Array.isArray(t.params) ? (t.params as string[]) : []);\n\t\t\t\t\tconst innerNames = new Set(Object.keys(t.nodes as object));\n\t\t\t\t\tfor (const [nName, nRaw] of Object.entries(t.nodes as Record<string, unknown>)) {\n\t\t\t\t\t\tif (nRaw == null || typeof nRaw !== \"object\") {\n\t\t\t\t\t\t\terrors.push(`Template \"${tName}\" node \"${nName}\": must be an object`);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst n = nRaw as Record<string, unknown>;\n\t\t\t\t\t\tif (typeof n.type !== \"string\" || !INNER_NODE_TYPES.has(n.type)) {\n\t\t\t\t\t\t\terrors.push(`Template \"${tName}\" node \"${nName}\": invalid type`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (Array.isArray(n.deps)) {\n\t\t\t\t\t\t\tfor (const dep of n.deps as string[]) {\n\t\t\t\t\t\t\t\tif (!innerNames.has(dep) && !paramSet.has(dep)) {\n\t\t\t\t\t\t\t\t\terrors.push(\n\t\t\t\t\t\t\t\t\t\t`Template \"${tName}\" node \"${nName}\": dep \"${dep}\" is not an inner node or param`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof t.output !== \"string\") {\n\t\t\t\t\t\terrors.push(`Template \"${tName}\": missing 'output' string`);\n\t\t\t\t\t} else if (!(t.nodes as Record<string, unknown>)[t.output as string]) {\n\t\t\t\t\t\terrors.push(`Template \"${tName}\": output \"${t.output}\" is not a declared node`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Validate nodes\n\tfor (const [name, raw] of Object.entries(s.nodes as Record<string, unknown>)) {\n\t\tif (raw == null || typeof raw !== \"object\") {\n\t\t\terrors.push(`Node \"${name}\": must be an object`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst n = raw as Record<string, unknown>;\n\t\tif (typeof n.type !== \"string\" || !VALID_NODE_TYPES.has(n.type)) {\n\t\t\terrors.push(\n\t\t\t\t`Node \"${name}\": invalid type \"${String(n.type)}\" (expected: ${[...VALID_NODE_TYPES].join(\", \")})`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t\tnodeTypes.set(name, n.type);\n\n\t\tif (n.type === \"template\") {\n\t\t\tif (typeof n.template !== \"string\" || !templateDefs.has(n.template)) {\n\t\t\t\terrors.push(`Node \"${name}\": template \"${String(n.template)}\" not found in templates`);\n\t\t\t} else {\n\t\t\t\t// Check bind completeness: all template params must be bound\n\t\t\t\tif (n.bind == null || typeof n.bind !== \"object\" || Array.isArray(n.bind)) {\n\t\t\t\t\terrors.push(`Node \"${name}\": template ref requires 'bind' object`);\n\t\t\t\t} else {\n\t\t\t\t\tconst tmpl = templateDefs.get(n.template as string)!;\n\t\t\t\t\tconst bind = n.bind as Record<string, string>;\n\t\t\t\t\tfor (const param of tmpl.params) {\n\t\t\t\t\t\tif (!(param in bind)) {\n\t\t\t\t\t\t\terrors.push(\n\t\t\t\t\t\t\t\t`Node \"${name}\": template param \"${param}\" is not bound (template \"${n.template}\")`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (const [, target] of Object.entries(bind)) {\n\t\t\t\t\t\tif (typeof target === \"string\" && !nodeNames.has(target)) {\n\t\t\t\t\t\t\terrors.push(\n\t\t\t\t\t\t\t\t`Node \"${name}\": bind target \"${target}\" does not reference an existing node`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (Array.isArray(n.deps)) {\n\t\t\t\tfor (const dep of n.deps as string[]) {\n\t\t\t\t\t// Self-referencing dep\n\t\t\t\t\tif (dep === name) {\n\t\t\t\t\t\terrors.push(`Node \"${name}\": self-referencing dep`);\n\t\t\t\t\t} else if (!nodeNames.has(dep)) {\n\t\t\t\t\t\terrors.push(`Node \"${name}\": dep \"${dep}\" does not reference an existing node`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Warn: derived/effect/operator without deps\n\t\t\tif (\n\t\t\t\t(n.type === \"derived\" || n.type === \"effect\" || n.type === \"operator\") &&\n\t\t\t\t!Array.isArray(n.deps)\n\t\t\t) {\n\t\t\t\terrors.push(`Node \"${name}\": ${n.type} node should have a 'deps' array`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Validate feedback edges\n\tif (s.feedback != null) {\n\t\tif (!Array.isArray(s.feedback)) {\n\t\t\terrors.push(\"'feedback' must be an array\");\n\t\t} else {\n\t\t\tfor (let i = 0; i < (s.feedback as unknown[]).length; i++) {\n\t\t\t\tconst edge = (s.feedback as unknown[])[i];\n\t\t\t\tif (edge == null || typeof edge !== \"object\") {\n\t\t\t\t\terrors.push(`Feedback [${i}]: must be an object`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst e = edge as Record<string, unknown>;\n\t\t\t\tif (typeof e.from !== \"string\" || !nodeNames.has(e.from)) {\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\t`Feedback [${i}]: 'from' \"${String(e.from)}\" does not reference an existing node`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (typeof e.from === \"string\" && e.from === e.to) {\n\t\t\t\t\terrors.push(`Feedback [${i}]: 'from' and 'to' must be different nodes`);\n\t\t\t\t}\n\t\t\t\tif (typeof e.to !== \"string\" || !nodeNames.has(e.to)) {\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\t`Feedback [${i}]: 'to' \"${String(e.to)}\" does not reference an existing node`,\n\t\t\t\t\t);\n\t\t\t\t} else if (typeof e.to === \"string\" && nodeTypes.get(e.to) !== \"state\") {\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\t`Feedback [${i}]: 'to' node \"${e.to}\" must be a state node (got \"${nodeTypes.get(e.to) ?? \"unknown\"}\")`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { valid: errors.length === 0, errors };\n}\n\n// ---------------------------------------------------------------------------\n// compileSpec\n// ---------------------------------------------------------------------------\n\n/** Options for {@link compileSpec}. */\nexport type CompileSpecOptions = {\n\t/** Fn/source catalog for resolving named factories. */\n\tcatalog?: GraphSpecCatalog;\n};\n\n/**\n * Instantiate a Graph from a GraphSpec.\n *\n * Handles template expansion (mounted subgraphs), feedback wiring via §8.1\n * feedback(), node factory lookup from the catalog, and topology validation.\n *\n * @param spec - Declarative graph topology.\n * @param opts - Catalog and compile options.\n * @returns A running Graph.\n * @throws On validation failure, missing catalog entries, or unresolvable deps.\n *\n * @category patterns\n */\nexport function compileSpec(spec: GraphSpec, opts?: CompileSpecOptions): Graph {\n\tconst validation = validateSpec(spec);\n\tif (!validation.valid) {\n\t\tthrow new Error(`compileSpec: invalid GraphSpec:\\n${validation.errors.join(\"\\n\")}`);\n\t}\n\n\tconst catalog = opts?.catalog ?? {};\n\tconst g = new Graph(spec.name);\n\tconst templates = spec.templates ?? {};\n\n\t// Catalog-aware validation (when rich entries are available)\n\tconst catalogValidation = validateSpecAgainstCatalog(spec, catalog);\n\tif (!catalogValidation.valid) {\n\t\tthrow new Error(\n\t\t\t`compileSpec: catalog validation errors:\\n${catalogValidation.errors.join(\"\\n\")}`,\n\t\t);\n\t}\n\n\t// Helper: resolve fn/source factories from catalog (handles rich + bare entries)\n\tconst resolveFn = (fnName: string): FnFactory | undefined => {\n\t\tconst entry = catalog.fns?.[fnName];\n\t\treturn entry ? extractFnFactory(entry) : undefined;\n\t};\n\tconst resolveSource = (sourceName: string): SourceFactory | undefined => {\n\t\tconst entry = catalog.sources?.[sourceName];\n\t\treturn entry ? extractSourceFactory(entry) : undefined;\n\t};\n\n\t// Phase 1: Create non-template nodes (state/producer first, then derived/effect/operator)\n\tconst created = new Map<string, Node<unknown>>();\n\tconst deferred: [string, GraphSpecNode][] = [];\n\n\tfor (const [name, raw] of Object.entries(spec.nodes)) {\n\t\tif (raw.type === \"template\") continue; // handled in Phase 2\n\n\t\tconst n = raw as GraphSpecNode;\n\t\tif (n.type === \"state\") {\n\t\t\tconst nd = state(n.initial, {\n\t\t\t\tname,\n\t\t\t\tmeta: n.meta ? { ...n.meta } : undefined,\n\t\t\t});\n\t\t\tg.add(name, nd);\n\t\t\tcreated.set(name, nd);\n\t\t} else if (n.type === \"producer\") {\n\t\t\tconst sourceFactory = n.source ? resolveSource(n.source) : undefined;\n\t\t\tconst fnFactory = n.fn ? resolveFn(n.fn) : undefined;\n\t\t\tif (sourceFactory) {\n\t\t\t\tconst nd = sourceFactory(n.config ?? {});\n\t\t\t\tg.add(name, nd);\n\t\t\t\tcreated.set(name, nd);\n\t\t\t} else if (fnFactory) {\n\t\t\t\tconst nd = fnFactory([], n.config ?? {});\n\t\t\t\tg.add(name, nd);\n\t\t\t\tcreated.set(name, nd);\n\t\t\t} else {\n\t\t\t\t// No catalog entry — create a bare producer placeholder\n\t\t\t\tconst nd = producer(() => {}, {\n\t\t\t\t\tname,\n\t\t\t\t\tmeta: { ...n.meta, _specFn: n.fn, _specSource: n.source },\n\t\t\t\t});\n\t\t\t\tg.add(name, nd);\n\t\t\t\tcreated.set(name, nd);\n\t\t\t}\n\t\t} else {\n\t\t\tdeferred.push([name, n]);\n\t\t}\n\t}\n\n\t// Resolve deferred nodes (derived/effect/operator) in dependency order\n\tlet progressed = true;\n\tconst pending = new Map(deferred);\n\twhile (pending.size > 0 && progressed) {\n\t\tprogressed = false;\n\t\tfor (const [name, n] of [...pending.entries()]) {\n\t\t\tconst deps = n.deps ?? [];\n\t\t\tif (!deps.every((dep) => created.has(dep))) continue;\n\n\t\t\tconst resolvedDeps = deps.map((dep) => created.get(dep)!);\n\t\t\tconst fnFactory = n.fn ? resolveFn(n.fn) : undefined;\n\n\t\t\tlet nd: Node<unknown>;\n\t\t\tif (fnFactory) {\n\t\t\t\tnd = fnFactory(resolvedDeps, n.config ?? {});\n\t\t\t} else if (n.type === \"effect\") {\n\t\t\t\tnd = effect(resolvedDeps, () => {});\n\t\t\t} else {\n\t\t\t\t// derived/operator without catalog fn — identity passthrough\n\t\t\t\tnd = derived(resolvedDeps, (vals: readonly unknown[]) => vals[0]);\n\t\t\t}\n\t\t\tg.add(name, nd);\n\t\t\tcreated.set(name, nd);\n\t\t\tpending.delete(name);\n\t\t\tprogressed = true;\n\t\t}\n\t}\n\tif (pending.size > 0) {\n\t\tconst unresolved = [...pending.keys()].sort().join(\", \");\n\t\tthrow new Error(`compileSpec: unresolvable deps for nodes: ${unresolved}`);\n\t}\n\n\t// Phase 2: Expand template instantiations as mounted subgraphs\n\tfor (const [name, raw] of Object.entries(spec.nodes)) {\n\t\tif (raw.type !== \"template\") continue;\n\t\tconst ref = raw as GraphSpecTemplateRef;\n\t\tconst tmpl = templates[ref.template]!;\n\n\t\tconst sub = new Graph(name);\n\t\tconst subCreated = new Map<string, Node<unknown>>();\n\t\tconst subDeferred: [string, GraphSpecNode][] = [];\n\n\t\t// Create inner nodes, resolving $params to bound nodes\n\t\tfor (const [nName, nSpec] of Object.entries(tmpl.nodes)) {\n\t\t\tconst resolvedDeps = (nSpec.deps ?? []).map((dep) => {\n\t\t\t\tif (dep.startsWith(\"$\") && ref.bind[dep]) {\n\t\t\t\t\treturn ref.bind[dep];\n\t\t\t\t}\n\t\t\t\treturn dep;\n\t\t\t});\n\t\t\tconst specWithResolvedDeps = { ...nSpec, deps: resolvedDeps };\n\n\t\t\tif (nSpec.type === \"state\") {\n\t\t\t\tconst nd = state(nSpec.initial, {\n\t\t\t\t\tname: nName,\n\t\t\t\t\tmeta: nSpec.meta ? { ...nSpec.meta } : undefined,\n\t\t\t\t});\n\t\t\t\tsub.add(nName, nd);\n\t\t\t\tsubCreated.set(nName, nd);\n\t\t\t} else if (nSpec.type === \"producer\") {\n\t\t\t\t// Handle producer nodes inside templates\n\t\t\t\tconst sourceFactory = nSpec.source ? resolveSource(nSpec.source) : undefined;\n\t\t\t\tconst fnFactory = nSpec.fn ? resolveFn(nSpec.fn) : undefined;\n\t\t\t\tif (sourceFactory) {\n\t\t\t\t\tconst nd = sourceFactory(nSpec.config ?? {});\n\t\t\t\t\tsub.add(nName, nd);\n\t\t\t\t\tsubCreated.set(nName, nd);\n\t\t\t\t} else if (fnFactory) {\n\t\t\t\t\tconst nd = fnFactory([], nSpec.config ?? {});\n\t\t\t\t\tsub.add(nName, nd);\n\t\t\t\t\tsubCreated.set(nName, nd);\n\t\t\t\t} else {\n\t\t\t\t\tconst nd = producer(() => {}, {\n\t\t\t\t\t\tname: nName,\n\t\t\t\t\t\tmeta: { ...nSpec.meta, _specFn: nSpec.fn, _specSource: nSpec.source },\n\t\t\t\t\t});\n\t\t\t\t\tsub.add(nName, nd);\n\t\t\t\t\tsubCreated.set(nName, nd);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsubDeferred.push([nName, specWithResolvedDeps]);\n\t\t\t}\n\t\t}\n\n\t\t// Resolve deferred inner nodes\n\t\tlet subProgressed = true;\n\t\tconst subPending = new Map(subDeferred);\n\t\twhile (subPending.size > 0 && subProgressed) {\n\t\t\tsubProgressed = false;\n\t\t\tfor (const [nName, nSpec] of [...subPending.entries()]) {\n\t\t\t\tconst deps = nSpec.deps ?? [];\n\t\t\t\tconst allReady = deps.every((dep) => subCreated.has(dep) || created.has(dep));\n\t\t\t\tif (!allReady) continue;\n\n\t\t\t\tconst resolvedDeps = deps.map((dep) => subCreated.get(dep) ?? created.get(dep)!);\n\t\t\t\tconst fnFactory = nSpec.fn ? resolveFn(nSpec.fn) : undefined;\n\n\t\t\t\tlet nd: Node<unknown>;\n\t\t\t\tif (fnFactory) {\n\t\t\t\t\tnd = fnFactory(resolvedDeps, nSpec.config ?? {});\n\t\t\t\t} else if (nSpec.type === \"effect\") {\n\t\t\t\t\tnd = effect(resolvedDeps, () => {});\n\t\t\t\t} else {\n\t\t\t\t\tnd = derived(resolvedDeps, (vals: readonly unknown[]) => vals[0]);\n\t\t\t\t}\n\t\t\t\tsub.add(nName, nd);\n\t\t\t\tsubCreated.set(nName, nd);\n\t\t\t\tsubPending.delete(nName);\n\t\t\t\tsubProgressed = true;\n\t\t\t}\n\t\t}\n\t\tif (subPending.size > 0) {\n\t\t\tconst unresolved = [...subPending.keys()].sort().join(\", \");\n\t\t\tthrow new Error(\n\t\t\t\t`compileSpec: template \"${ref.template}\" has unresolvable deps: ${unresolved}`,\n\t\t\t);\n\t\t}\n\n\t\tg.mount(name, sub);\n\t\t// Register template output as a reachable node path\n\t\tconst outputPath = `${name}::${tmpl.output}`;\n\t\tcreated.set(name, g.resolve(outputPath));\n\n\t\t// Store template origin meta on the mounted subgraph's first node\n\t\t// so decompileGraph can recover it without structural fingerprinting.\n\t\ttry {\n\t\t\tconst outputNode = g.resolve(outputPath);\n\t\t\toutputNode.meta._templateName?.down([[DATA, ref.template]]);\n\t\t\toutputNode.meta._templateBind?.down([[DATA, ref.bind]]);\n\t\t} catch {\n\t\t\t/* meta nodes may not exist; template origin is best-effort */\n\t\t}\n\t}\n\n\t// Phase 3: Wire edges from deps (record explicit edges for describe())\n\tfor (const [name, raw] of Object.entries(spec.nodes)) {\n\t\tif (raw.type === \"template\") continue;\n\t\tconst n = raw as GraphSpecNode;\n\t\tfor (const dep of n.deps ?? []) {\n\t\t\ttry {\n\t\t\t\tg.connect(dep, name);\n\t\t\t} catch (err: unknown) {\n\t\t\t\t// Silently skip edges that are already implicit from constructor deps.\n\t\t\t\t// Re-throw unexpected errors.\n\t\t\t\tconst msg = err instanceof Error ? err.message : \"\";\n\t\t\t\tif (!msg.includes(\"constructor deps\") && !msg.includes(\"already\")) {\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Phase 4: Wire feedback edges via §8.1 feedback()\n\tfor (const fb of spec.feedback ?? []) {\n\t\tfeedbackPrimitive(g, fb.from, fb.to, {\n\t\t\tmaxIterations: fb.maxIterations,\n\t\t});\n\t}\n\n\treturn g;\n}\n\n// ---------------------------------------------------------------------------\n// decompileGraph\n// ---------------------------------------------------------------------------\n\n/** Internal meta keys used by compileSpec/feedback — stripped from output. */\nconst INTERNAL_META_KEYS = new Set([\n\t\"reduction\",\n\t\"reduction_type\",\n\t\"_specFn\",\n\t\"_specSource\",\n\t\"_templateName\",\n\t\"_templateBind\",\n\t\"feedbackFrom\",\n\t\"feedbackTo\",\n\t\"_internal\",\n]);\n\n/**\n * Extract a GraphSpec from a running graph.\n *\n * Uses `describe({ detail: \"standard\" })` as a starting point, then enriches:\n * - Feedback edges recovered from counter node meta (`feedbackFrom`/`feedbackTo`)\n * - Template refs recovered from output node meta (`_templateName`/`_templateBind`)\n * - Structural fingerprinting as fallback for 2+ identical mounted subgraphs\n *\n * @param graph - Running graph to decompile.\n * @returns A GraphSpec representation.\n *\n * @category patterns\n */\nexport function decompileGraph(graph: Graph): GraphSpec {\n\tconst desc = graph.describe({ detail: \"standard\" });\n\tconst nodes: Record<string, GraphSpecNode> = {};\n\tconst feedbackEdges: GraphSpecFeedbackEdge[] = [];\n\tconst metaSegment = `::${GRAPH_META_SEGMENT}::`;\n\n\t// Detect feedback counter nodes and extract feedback edges from meta\n\tconst feedbackCounterPattern = /^__feedback_(?!effect_)(.+)$/;\n\tconst feedbackConditions = new Set<string>();\n\n\tfor (const path of Object.keys(desc.nodes)) {\n\t\tif (path.includes(metaSegment)) continue;\n\t\tconst match = feedbackCounterPattern.exec(path);\n\t\tif (match) {\n\t\t\tfeedbackConditions.add(match[1]!);\n\t\t\tconst meta = desc.nodes[path]?.meta as Record<string, unknown> | undefined;\n\t\t\tif (meta?.feedbackFrom && meta?.feedbackTo) {\n\t\t\t\tfeedbackEdges.push({\n\t\t\t\t\tfrom: meta.feedbackFrom as string,\n\t\t\t\t\tto: meta.feedbackTo as string,\n\t\t\t\t\t...(meta.maxIterations ? { maxIterations: meta.maxIterations as number } : {}),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build nodes map, skipping meta, feedback internals, and bridge nodes\n\tfor (const [path, nodeDesc] of Object.entries(desc.nodes)) {\n\t\tif (path.includes(metaSegment)) continue;\n\t\tif (feedbackCounterPattern.test(path)) continue;\n\t\t// Skip internal infrastructure nodes (bridge, feedback effect) via meta tag\n\t\tif (nodeDesc.meta?._internal) continue;\n\t\t// Legacy fallback: skip by naming convention\n\t\tif (path.startsWith(\"__feedback_effect_\")) continue;\n\t\tif (path.startsWith(\"__bridge_\")) continue;\n\t\t// Skip subgraph-internal nodes (they belong to templates)\n\t\tif (path.includes(\"::\")) continue;\n\n\t\tconst specNode: GraphSpecNode = {\n\t\t\ttype: nodeDesc.type as GraphSpecNode[\"type\"],\n\t\t};\n\n\t\tif (nodeDesc.deps.length > 0) {\n\t\t\tspecNode.deps = nodeDesc.deps.filter((d) => !d.includes(\"::\"));\n\t\t}\n\n\t\tif (nodeDesc.type === \"state\" && nodeDesc.value !== undefined) {\n\t\t\tspecNode.initial = nodeDesc.value;\n\t\t}\n\n\t\tif (nodeDesc.meta && Object.keys(nodeDesc.meta).length > 0) {\n\t\t\tconst meta: Record<string, unknown> = {};\n\t\t\tfor (const [k, v] of Object.entries(nodeDesc.meta as Record<string, unknown>)) {\n\t\t\t\tif (!INTERNAL_META_KEYS.has(k)) meta[k] = v;\n\t\t\t}\n\t\t\tif (Object.keys(meta).length > 0) {\n\t\t\t\tspecNode.meta = meta;\n\t\t\t}\n\t\t}\n\n\t\tnodes[path] = specNode;\n\t}\n\n\t// Detect templates: first from compile-time meta (option B), then structural fallback\n\tconst templates: Record<string, GraphSpecTemplate> = {};\n\tconst templateRefs: Record<string, GraphSpecTemplateRef> = {};\n\tconst metaDetectedSubgraphs = new Set<string>();\n\n\t// Option B: recover template origin from meta stored by compileSpec\n\tfor (const subName of desc.subgraphs) {\n\t\tconst prefix = `${subName}::`;\n\t\tfor (const [path, nodeDesc] of Object.entries(desc.nodes)) {\n\t\t\tif (!path.startsWith(prefix)) continue;\n\t\t\tif (path.includes(metaSegment)) continue;\n\t\t\tconst meta = nodeDesc.meta as Record<string, unknown> | undefined;\n\t\t\tif (meta?._templateName && meta?._templateBind) {\n\t\t\t\tconst templateName = meta._templateName as string;\n\t\t\t\tconst bind = meta._templateBind as Record<string, string>;\n\n\t\t\t\t// Reconstruct template definition from the subgraph's nodes\n\t\t\t\tif (!templates[templateName]) {\n\t\t\t\t\tconst tmplNodes: Record<string, GraphSpecNode> = {};\n\t\t\t\t\tconst tmplInnerNames = new Set<string>();\n\t\t\t\t\tconst tmplPrefix = `${subName}::`;\n\t\t\t\t\tfor (const [p, nd] of Object.entries(desc.nodes)) {\n\t\t\t\t\t\tif (!p.startsWith(tmplPrefix) || p.includes(metaSegment)) continue;\n\t\t\t\t\t\tconst localName = p.slice(tmplPrefix.length);\n\t\t\t\t\t\tif (localName.includes(\"::\")) continue;\n\t\t\t\t\t\ttmplInnerNames.add(localName);\n\t\t\t\t\t\ttmplNodes[localName] = {\n\t\t\t\t\t\t\ttype: nd.type as GraphSpecNode[\"type\"],\n\t\t\t\t\t\t\t...(nd.deps.length > 0\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\tdeps: nd.deps.map((d) =>\n\t\t\t\t\t\t\t\t\t\t\td.startsWith(tmplPrefix) ? d.slice(tmplPrefix.length) : d,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\t// Detect params (external deps) and output\n\t\t\t\t\tconst tmplParams: string[] = [];\n\t\t\t\t\tconst tmplParamMap = new Map<string, string>();\n\t\t\t\t\tfor (const n of Object.values(tmplNodes)) {\n\t\t\t\t\t\tfor (const dep of n.deps ?? []) {\n\t\t\t\t\t\t\tif (!tmplInnerNames.has(dep) && !tmplParamMap.has(dep)) {\n\t\t\t\t\t\t\t\tconst param = `$${dep}`;\n\t\t\t\t\t\t\t\ttmplParams.push(param);\n\t\t\t\t\t\t\t\ttmplParamMap.set(dep, param);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Substitute external deps with $params\n\t\t\t\t\tfor (const n of Object.values(tmplNodes)) {\n\t\t\t\t\t\tif (n.deps) n.deps = n.deps.map((d) => tmplParamMap.get(d) ?? d);\n\t\t\t\t\t}\n\t\t\t\t\t// Find output\n\t\t\t\t\tconst depended = new Set<string>();\n\t\t\t\t\tfor (const n of Object.values(tmplNodes)) {\n\t\t\t\t\t\tfor (const dep of n.deps ?? []) {\n\t\t\t\t\t\t\tif (tmplInnerNames.has(dep)) depended.add(dep);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst outputCandidates = [...tmplInnerNames].filter((n) => !depended.has(n));\n\t\t\t\t\tconst tmplOutput = outputCandidates[0] ?? [...tmplInnerNames].pop()!;\n\n\t\t\t\t\ttemplates[templateName] = { params: tmplParams, nodes: tmplNodes, output: tmplOutput };\n\t\t\t\t}\n\n\t\t\t\tdelete nodes[subName];\n\t\t\t\ttemplateRefs[subName] = { type: \"template\", template: templateName, bind };\n\t\t\t\tmetaDetectedSubgraphs.add(subName);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Structural fallback: group remaining mounted subgraphs by fingerprint\n\tconst structureMap = new Map<string, { name: string; nodes: Record<string, GraphSpecNode> }[]>();\n\tfor (const subName of desc.subgraphs) {\n\t\tif (metaDetectedSubgraphs.has(subName)) continue;\n\t\tconst subNodes: Record<string, GraphSpecNode> = {};\n\t\tconst prefix = `${subName}::`;\n\t\tfor (const [path, nodeDesc] of Object.entries(desc.nodes)) {\n\t\t\tif (path.includes(metaSegment)) continue;\n\t\t\tif (!path.startsWith(prefix)) continue;\n\t\t\tconst localName = path.slice(prefix.length);\n\t\t\tif (localName.includes(\"::\")) continue;\n\t\t\tsubNodes[localName] = {\n\t\t\t\ttype: nodeDesc.type as GraphSpecNode[\"type\"],\n\t\t\t\t...(nodeDesc.deps.length > 0\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tdeps: nodeDesc.deps.map((d) => (d.startsWith(prefix) ? d.slice(prefix.length) : d)),\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t};\n\t\t}\n\t\tconst fingerprint = JSON.stringify(\n\t\t\tObject.fromEntries(\n\t\t\t\tObject.entries(subNodes)\n\t\t\t\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t\t\t\t.map(([k, v]) => [k, { type: v.type, deps: v.deps ?? [] }]),\n\t\t\t),\n\t\t);\n\t\tif (!structureMap.has(fingerprint)) {\n\t\t\tstructureMap.set(fingerprint, []);\n\t\t}\n\t\tstructureMap.get(fingerprint)!.push({ name: subName, nodes: subNodes });\n\t}\n\n\t// Subgraphs with identical structure (2+ instances) → templates\n\tfor (const [, group] of structureMap) {\n\t\tif (group.length < 2) continue;\n\t\tconst templateName = `${group[0]!.name}_template`;\n\t\tconst refNodes = group[0]!.nodes;\n\t\tconst innerNames = new Set(Object.keys(refNodes));\n\n\t\t// Detect external deps as params (from first member)\n\t\tconst params: string[] = [];\n\t\tconst baseParamMap = new Map<string, string>();\n\t\tfor (const n of Object.values(refNodes)) {\n\t\t\tfor (const dep of n.deps ?? []) {\n\t\t\t\tif (!innerNames.has(dep) && !baseParamMap.has(dep)) {\n\t\t\t\t\tconst param = `$${dep}`;\n\t\t\t\t\tparams.push(param);\n\t\t\t\t\tbaseParamMap.set(dep, param);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Find output node\n\t\tconst depended = new Set<string>();\n\t\tfor (const n of Object.values(refNodes)) {\n\t\t\tfor (const dep of n.deps ?? []) {\n\t\t\t\tif (innerNames.has(dep)) depended.add(dep);\n\t\t\t}\n\t\t}\n\t\tconst outputCandidates = [...innerNames].filter((n) => !depended.has(n));\n\t\tconst output = outputCandidates[0] ?? [...innerNames].pop()!;\n\n\t\t// Build template nodes with param-substituted deps\n\t\tconst tmplNodes: Record<string, GraphSpecNode> = {};\n\t\tfor (const [nName, nSpec] of Object.entries(refNodes)) {\n\t\t\ttmplNodes[nName] = {\n\t\t\t\t...nSpec,\n\t\t\t\tdeps: nSpec.deps?.map((d) => baseParamMap.get(d) ?? d),\n\t\t\t};\n\t\t}\n\n\t\ttemplates[templateName] = { params, nodes: tmplNodes, output };\n\n\t\t// Build per-member bind maps (each member may bind to different external nodes)\n\t\tfor (const member of group) {\n\t\t\tdelete nodes[member.name];\n\t\t\t// Build this member's own bind map by scanning its external deps\n\t\t\tconst memberBind: Record<string, string> = {};\n\t\t\tconst memberInnerNames = new Set(Object.keys(member.nodes));\n\t\t\tfor (const n of Object.values(member.nodes)) {\n\t\t\t\tfor (const dep of n.deps ?? []) {\n\t\t\t\t\tif (!memberInnerNames.has(dep)) {\n\t\t\t\t\t\t// Find which param this external dep maps to\n\t\t\t\t\t\tconst param = baseParamMap.get(dep) ?? `$${dep}`;\n\t\t\t\t\t\tmemberBind[param] = dep;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttemplateRefs[member.name] = {\n\t\t\t\ttype: \"template\",\n\t\t\t\ttemplate: templateName,\n\t\t\t\tbind: memberBind,\n\t\t\t};\n\t\t}\n\t}\n\n\tconst allNodes: Record<string, GraphSpecNode | GraphSpecTemplateRef> = {\n\t\t...nodes,\n\t\t...templateRefs,\n\t};\n\n\tconst result: GraphSpec = { name: desc.name, nodes: allNodes };\n\tif (Object.keys(templates).length > 0) result.templates = templates;\n\tif (feedbackEdges.length > 0) result.feedback = feedbackEdges;\n\n\treturn result;\n}\n\n// ---------------------------------------------------------------------------\n// specDiff\n// ---------------------------------------------------------------------------\n\n/** A single change in a spec diff. */\nexport type SpecDiffEntry = {\n\ttype: \"added\" | \"removed\" | \"changed\";\n\tpath: string;\n\tdetail?: string;\n};\n\n/** Structural diff between two GraphSpecs. */\nexport type SpecDiffResult = {\n\tentries: SpecDiffEntry[];\n\tsummary: string;\n};\n\n/**\n * Compute a structural diff between two GraphSpecs.\n *\n * Template-aware: reports \"changed template definition\" vs \"changed\n * instantiation bindings.\" No runtime needed — pure JSON comparison.\n *\n * @param specA - The \"before\" spec.\n * @param specB - The \"after\" spec.\n * @returns Diff entries and a human-readable summary.\n *\n * @category patterns\n */\nexport function specDiff(specA: GraphSpec, specB: GraphSpec): SpecDiffResult {\n\tconst entries: SpecDiffEntry[] = [];\n\n\t// Diff name\n\tif (specA.name !== specB.name) {\n\t\tentries.push({\n\t\t\ttype: \"changed\",\n\t\t\tpath: \"name\",\n\t\t\tdetail: `\"${specA.name}\" → \"${specB.name}\"`,\n\t\t});\n\t}\n\n\t// Diff nodes\n\tconst nodesA = new Set(Object.keys(specA.nodes));\n\tconst nodesB = new Set(Object.keys(specB.nodes));\n\n\tfor (const name of nodesB) {\n\t\tif (!nodesA.has(name)) {\n\t\t\tconst n = specB.nodes[name]!;\n\t\t\tentries.push({\n\t\t\t\ttype: \"added\",\n\t\t\t\tpath: `nodes.${name}`,\n\t\t\t\tdetail: `type: ${n.type}`,\n\t\t\t});\n\t\t}\n\t}\n\tfor (const name of nodesA) {\n\t\tif (!nodesB.has(name)) {\n\t\t\tentries.push({ type: \"removed\", path: `nodes.${name}` });\n\t\t}\n\t}\n\tfor (const name of nodesA) {\n\t\tif (!nodesB.has(name)) continue;\n\t\tconst a = specA.nodes[name]!;\n\t\tconst b = specB.nodes[name]!;\n\t\tif (JSON.stringify(a) !== JSON.stringify(b)) {\n\t\t\tconst details: string[] = [];\n\t\t\tif (a.type !== b.type) details.push(`type: ${a.type} → ${b.type}`);\n\t\t\tif (JSON.stringify((a as GraphSpecNode).deps) !== JSON.stringify((b as GraphSpecNode).deps)) {\n\t\t\t\tdetails.push(\"deps changed\");\n\t\t\t}\n\t\t\tif ((a as GraphSpecNode).fn !== (b as GraphSpecNode).fn) {\n\t\t\t\tdetails.push(`fn: ${(a as GraphSpecNode).fn} → ${(b as GraphSpecNode).fn}`);\n\t\t\t}\n\t\t\tif (\n\t\t\t\tJSON.stringify((a as GraphSpecNode).config) !== JSON.stringify((b as GraphSpecNode).config)\n\t\t\t) {\n\t\t\t\tdetails.push(\"config changed\");\n\t\t\t}\n\t\t\tentries.push({\n\t\t\t\ttype: \"changed\",\n\t\t\t\tpath: `nodes.${name}`,\n\t\t\t\tdetail: details.join(\"; \") || \"modified\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Diff templates\n\tconst tmplA = specA.templates ?? {};\n\tconst tmplB = specB.templates ?? {};\n\tconst tmplNamesA = new Set(Object.keys(tmplA));\n\tconst tmplNamesB = new Set(Object.keys(tmplB));\n\n\tfor (const name of tmplNamesB) {\n\t\tif (!tmplNamesA.has(name)) {\n\t\t\tentries.push({ type: \"added\", path: `templates.${name}` });\n\t\t}\n\t}\n\tfor (const name of tmplNamesA) {\n\t\tif (!tmplNamesB.has(name)) {\n\t\t\tentries.push({ type: \"removed\", path: `templates.${name}` });\n\t\t}\n\t}\n\tfor (const name of tmplNamesA) {\n\t\tif (!tmplNamesB.has(name)) continue;\n\t\tif (JSON.stringify(tmplA[name]) !== JSON.stringify(tmplB[name])) {\n\t\t\tentries.push({\n\t\t\t\ttype: \"changed\",\n\t\t\t\tpath: `templates.${name}`,\n\t\t\t\tdetail: \"template definition changed\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Diff feedback\n\tconst fbA = specA.feedback ?? [];\n\tconst fbB = specB.feedback ?? [];\n\tconst fbKeyA = new Set(fbA.map((e) => `${e.from}->${e.to}`));\n\tconst fbKeyB = new Set(fbB.map((e) => `${e.from}->${e.to}`));\n\n\tfor (const fb of fbB) {\n\t\tconst key = `${fb.from}->${fb.to}`;\n\t\tif (!fbKeyA.has(key)) {\n\t\t\tentries.push({\n\t\t\t\ttype: \"added\",\n\t\t\t\tpath: `feedback.${key}`,\n\t\t\t\tdetail: `maxIterations: ${fb.maxIterations ?? 10}`,\n\t\t\t});\n\t\t}\n\t}\n\tfor (const fb of fbA) {\n\t\tconst key = `${fb.from}->${fb.to}`;\n\t\tif (!fbKeyB.has(key)) {\n\t\t\tentries.push({ type: \"removed\", path: `feedback.${key}` });\n\t\t}\n\t}\n\tfor (const fb of fbA) {\n\t\tconst key = `${fb.from}->${fb.to}`;\n\t\tconst counterpart = fbB.find((b) => b.from === fb.from && b.to === fb.to);\n\t\tif (counterpart && JSON.stringify(fb) !== JSON.stringify(counterpart)) {\n\t\t\tentries.push({\n\t\t\t\ttype: \"changed\",\n\t\t\t\tpath: `feedback.${key}`,\n\t\t\t\tdetail: `maxIterations: ${fb.maxIterations ?? 10} → ${counterpart.maxIterations ?? 10}`,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Build summary\n\tconst added = entries.filter((e) => e.type === \"added\").length;\n\tconst removed = entries.filter((e) => e.type === \"removed\").length;\n\tconst changed = entries.filter((e) => e.type === \"changed\").length;\n\tconst parts: string[] = [];\n\tif (added) parts.push(`${added} added`);\n\tif (removed) parts.push(`${removed} removed`);\n\tif (changed) parts.push(`${changed} changed`);\n\tconst summary = parts.length > 0 ? parts.join(\", \") : \"no changes\";\n\n\treturn { entries, summary };\n}\n\n// ---------------------------------------------------------------------------\n// llmCompose\n// ---------------------------------------------------------------------------\n\n/** Options for {@link llmCompose}. */\nexport type LLMComposeOptions = {\n\tmodel?: string;\n\ttemperature?: number;\n\tmaxTokens?: number;\n\t/** Extra instructions appended to the system prompt. */\n\tsystemPromptExtra?: string;\n\t/**\n\t * Available fn/source catalog names for the LLM to reference.\n\t * When omitted and `catalog` contains rich {@link CatalogFnEntry} entries,\n\t * the prompt is auto-generated via {@link generateCatalogPrompt}.\n\t */\n\tcatalogDescription?: string;\n\t/**\n\t * Catalog for auto-prompt generation and catalog-aware validation.\n\t * When rich entries are provided, the catalog prompt is auto-generated\n\t * and LLM output is validated against fn/source names and config schemas.\n\t */\n\tcatalog?: GraphSpecCatalog;\n\t/**\n\t * Max auto-refine attempts when the LLM output fails catalog validation.\n\t * Each attempt feeds the validation errors back to the LLM via llmRefine.\n\t * Default: 0 (no auto-refine). Set to 2-3 for production use.\n\t */\n\tmaxAutoRefine?: number;\n};\n\nconst LLM_COMPOSE_SYSTEM_PROMPT = `You are a graph architect for GraphReFly, a reactive graph protocol.\n\nGiven a natural-language description, produce a JSON GraphSpec with this structure:\n\n{\n \"name\": \"<graph_name>\",\n \"nodes\": {\n \"<node_name>\": {\n \"type\": \"state\" | \"derived\" | \"producer\" | \"effect\" | \"operator\",\n \"deps\": [\"<dep_node_name>\", ...],\n \"fn\": \"<catalog_function_name>\",\n \"source\": \"<catalog_source_name>\",\n \"config\": { ... },\n \"initial\": <value>,\n \"meta\": { \"description\": \"<purpose>\" }\n },\n \"<template_instance>\": {\n \"type\": \"template\",\n \"template\": \"<template_name>\",\n \"bind\": { \"$param\": \"node_name\" }\n }\n },\n \"templates\": {\n \"<template_name>\": {\n \"params\": [\"$param1\", \"$param2\"],\n \"nodes\": { ... },\n \"output\": \"<output_node>\"\n }\n },\n \"feedback\": [\n { \"from\": \"<condition_node>\", \"to\": \"<state_node>\", \"maxIterations\": 10 }\n ]\n}\n\nRules:\n- \"state\" nodes hold user/LLM-writable values (knobs). Use \"initial\" for default values.\n- \"derived\" nodes compute from deps using a named \"fn\".\n- \"effect\" nodes produce side effects from deps.\n- \"producer\" nodes generate values from a named \"source\".\n- Use \"templates\" when the same subgraph pattern repeats (e.g., per-source resilience).\n- Use \"feedback\" for bounded cycles where a derived value writes back to a state node.\n- meta.description is required for every node.\n- Return ONLY valid JSON, no markdown fences or commentary.`;\n\n/** Strip markdown code fences. */\nfunction stripFences(text: string): string {\n\tconst match = text.match(/^```(?:json)?\\s*([\\s\\S]*?)\\s*```[\\s\\S]*$/);\n\treturn match ? match[1]! : text;\n}\n\n/**\n * Ask an LLM to compose a GraphSpec from a natural-language problem description.\n *\n * The LLM generates a GraphSpec (with templates + feedback), validated before\n * returning. The spec is for human review before compilation via compileSpec().\n *\n * @param problem - Natural language problem description.\n * @param adapter - LLM adapter for the generation call.\n * @param opts - Model options and catalog description.\n * @returns A validated GraphSpec.\n * @throws On invalid LLM output or validation failure.\n *\n * @category patterns\n */\nexport async function llmCompose(\n\tproblem: string,\n\tadapter: LLMAdapter,\n\topts?: LLMComposeOptions,\n): Promise<GraphSpec> {\n\tlet systemPrompt = LLM_COMPOSE_SYSTEM_PROMPT;\n\n\t// Auto-generate catalog prompt from rich entries, or use manual description\n\tconst catalogPrompt =\n\t\topts?.catalogDescription ?? (opts?.catalog ? generateCatalogPrompt(opts.catalog) : undefined);\n\tif (catalogPrompt) {\n\t\tsystemPrompt += `\\n\\nAvailable catalog (use ONLY these names):\\n${catalogPrompt}`;\n\t}\n\tif (opts?.systemPromptExtra) {\n\t\tsystemPrompt += `\\n\\n${opts.systemPromptExtra}`;\n\t}\n\n\tconst messages: ChatMessage[] = [\n\t\t{ role: \"system\", content: systemPrompt },\n\t\t{ role: \"user\", content: problem },\n\t];\n\n\tconst rawResult = adapter.invoke(messages, {\n\t\tmodel: opts?.model,\n\t\ttemperature: opts?.temperature ?? 0,\n\t\tmaxTokens: opts?.maxTokens,\n\t});\n\n\t// System boundary: await the adapter's response (Promise, plain value).\n\tconst response = (await rawResult) as LLMResponse;\n\tlet content = response.content.trim();\n\n\tif (content.startsWith(\"```\")) {\n\t\tcontent = stripFences(content);\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(content);\n\t} catch {\n\t\tthrow new Error(`llmCompose: LLM response is not valid JSON: ${content.slice(0, 200)}`);\n\t}\n\n\tconst validation = validateSpec(parsed);\n\tif (!validation.valid) {\n\t\tthrow new Error(`llmCompose: invalid GraphSpec:\\n${validation.errors.join(\"\\n\")}`);\n\t}\n\n\tlet spec = parsed as GraphSpec;\n\n\t// Catalog-aware validation + auto-refine loop\n\tif (opts?.catalog) {\n\t\tconst maxRefine = opts.maxAutoRefine ?? 0;\n\t\tfor (let attempt = 0; attempt <= maxRefine; attempt++) {\n\t\t\tconst catalogValidation = validateSpecAgainstCatalog(spec, opts.catalog);\n\t\t\tif (catalogValidation.valid) break;\n\n\t\t\tif (attempt === maxRefine) {\n\t\t\t\t// Last attempt failed — return with errors attached as meta\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`llmCompose: catalog validation failed after ${maxRefine} refine attempts:\\n${catalogValidation.errors.join(\"\\n\")}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Auto-refine: feed catalog errors back to LLM\n\t\t\tspec = await llmRefine(\n\t\t\t\tspec,\n\t\t\t\t`Fix these catalog errors:\\n${catalogValidation.errors.join(\"\\n\")}\\n\\nUse ONLY functions and sources from the catalog.`,\n\t\t\t\tadapter,\n\t\t\t\t{ ...opts, catalogDescription: catalogPrompt },\n\t\t\t);\n\t\t}\n\t}\n\n\treturn spec;\n}\n\n// ---------------------------------------------------------------------------\n// llmRefine\n// ---------------------------------------------------------------------------\n\n/** Options for {@link llmRefine}. */\nexport type LLMRefineOptions = LLMComposeOptions;\n\n/**\n * Ask an LLM to modify an existing GraphSpec based on feedback or changed requirements.\n *\n * @param currentSpec - The current GraphSpec to modify.\n * @param feedback - Natural language feedback or changed requirements.\n * @param adapter - LLM adapter for the generation call.\n * @param opts - Model options.\n * @returns A new GraphSpec incorporating the feedback.\n * @throws On invalid LLM output or validation failure.\n *\n * @category patterns\n */\nexport async function llmRefine(\n\tcurrentSpec: GraphSpec,\n\tfeedback: string,\n\tadapter: LLMAdapter,\n\topts?: LLMRefineOptions,\n): Promise<GraphSpec> {\n\tlet systemPrompt = LLM_COMPOSE_SYSTEM_PROMPT;\n\tif (opts?.catalogDescription) {\n\t\tsystemPrompt += `\\n\\nAvailable catalog:\\n${opts.catalogDescription}`;\n\t}\n\tif (opts?.systemPromptExtra) {\n\t\tsystemPrompt += `\\n\\n${opts.systemPromptExtra}`;\n\t}\n\n\tconst messages: ChatMessage[] = [\n\t\t{ role: \"system\", content: systemPrompt },\n\t\t{\n\t\t\trole: \"user\",\n\t\t\tcontent: `Current GraphSpec:\\n${JSON.stringify(currentSpec, null, 2)}\\n\\nModification request: ${feedback}\\n\\nReturn the complete modified GraphSpec as JSON.`,\n\t\t},\n\t];\n\n\tconst rawResult = adapter.invoke(messages, {\n\t\tmodel: opts?.model,\n\t\ttemperature: opts?.temperature ?? 0,\n\t\tmaxTokens: opts?.maxTokens,\n\t});\n\n\t// System boundary: await the adapter's response.\n\tconst response = (await rawResult) as LLMResponse;\n\tlet content = response.content.trim();\n\n\tif (content.startsWith(\"```\")) {\n\t\tcontent = stripFences(content);\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(content);\n\t} catch {\n\t\tthrow new Error(`llmRefine: LLM response is not valid JSON: ${content.slice(0, 200)}`);\n\t}\n\n\tconst validation = validateSpec(parsed);\n\tif (!validation.valid) {\n\t\tthrow new Error(`llmRefine: invalid GraphSpec:\\n${validation.errors.join(\"\\n\")}`);\n\t}\n\n\treturn parsed as GraphSpec;\n}\n","/**\n * Messaging patterns (roadmap §4.2).\n *\n * Pulsar-inspired messaging features modeled as graph factories:\n * - `topic()` for append-only topic streams\n * - `subscription()` for cursor-based consumers\n * - `jobQueue()` for queue claim/ack flow\n */\n\nimport { DATA, derived, type Node, node, state } from \"../core/index.js\";\nimport { type ReactiveListSnapshot, reactiveList } from \"../extra/reactive-list.js\";\nimport { type ReactiveLogSnapshot, reactiveLog } from \"../extra/reactive-log.js\";\nimport { type ReactiveMapSnapshot, reactiveMap } from \"../extra/reactive-map.js\";\nimport { Graph, type GraphOptions } from \"../graph/index.js\";\n\ntype MessagingMeta = {\n\tmessaging?: true;\n\tmessaging_type?: string;\n};\n\nconst DEFAULT_MAX_PER_PUMP = 2_147_483_647;\n\nfunction requireNonNegativeInt(value: number, label: string): number {\n\tif (!Number.isFinite(value) || !Number.isInteger(value) || value < 0) {\n\t\tthrow new Error(`${label} must be a non-negative integer`);\n\t}\n\treturn value;\n}\n\n/**\n * Keep a derived node's dep wiring alive for `get()` without a user sink.\n * Returns the unsubscribe handle so callers can clean up.\n */\nfunction keepalive(n: Node<unknown>): () => void {\n\treturn n.subscribe(() => {});\n}\n\nfunction messagingMeta(kind: string, extra?: Record<string, unknown>): Record<string, unknown> {\n\treturn {\n\t\tmessaging: true,\n\t\tmessaging_type: kind,\n\t\t...(extra ?? {}),\n\t} satisfies MessagingMeta;\n}\n\nexport type TopicOptions = {\n\tgraph?: GraphOptions;\n\tretainedLimit?: number;\n};\n\nexport class TopicGraph<T> extends Graph {\n\tprivate readonly _log;\n\tprivate readonly _keepaliveDisposers: Array<() => void> = [];\n\treadonly events: Node<ReactiveLogSnapshot<T>>;\n\treadonly latest: Node<T | undefined>;\n\n\tconstructor(name: string, opts: TopicOptions = {}) {\n\t\tsuper(name, opts.graph);\n\t\tthis._log = reactiveLog<T>([], { name: \"events\", maxSize: opts.retainedLimit });\n\t\tthis.events = this._log.entries;\n\t\tthis.add(\"events\", this.events);\n\t\tthis.latest = derived<T | undefined>(\n\t\t\t[this.events],\n\t\t\t([snapshot]) => {\n\t\t\t\tconst entries = (snapshot as ReactiveLogSnapshot<T>).value.entries;\n\t\t\t\treturn entries.length === 0 ? undefined : entries[entries.length - 1];\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"latest\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: messagingMeta(\"topic_latest\"),\n\t\t\t\tinitial: undefined,\n\t\t\t},\n\t\t);\n\t\tthis.add(\"latest\", this.latest);\n\t\tthis.connect(\"events\", \"latest\");\n\t\tthis._keepaliveDisposers.push(keepalive(this.latest));\n\t}\n\n\toverride destroy(): void {\n\t\tfor (const dispose of this._keepaliveDisposers) dispose();\n\t\tthis._keepaliveDisposers.length = 0;\n\t\tsuper.destroy();\n\t}\n\n\tpublish(value: T): void {\n\t\tthis._log.append(value);\n\t}\n\n\tretained(): readonly T[] {\n\t\tconst snapshot = this.events.get() as ReactiveLogSnapshot<T>;\n\t\treturn snapshot.value.entries;\n\t}\n}\n\nexport type SubscriptionOptions = {\n\tgraph?: GraphOptions;\n\tcursor?: number;\n};\n\nexport class SubscriptionGraph<T> extends Graph {\n\tprivate readonly _keepaliveDisposers: Array<() => void> = [];\n\treadonly source: Node<ReactiveLogSnapshot<T>>;\n\treadonly cursor: Node<number>;\n\treadonly available: Node<readonly T[]>;\n\n\tconstructor(name: string, topicGraph: TopicGraph<T>, opts: SubscriptionOptions = {}) {\n\t\tsuper(name, opts.graph);\n\t\tconst initialCursor = requireNonNegativeInt(opts.cursor ?? 0, \"subscription cursor\");\n\t\tthis.mount(\"topic\", topicGraph);\n\t\tconst topicEvents = topicGraph.events;\n\t\tthis.source = derived([topicEvents], ([snapshot]) => snapshot as ReactiveLogSnapshot<T>, {\n\t\t\tname: \"source\",\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: messagingMeta(\"subscription_source\"),\n\t\t\tinitial: topicEvents.get() as ReactiveLogSnapshot<T>,\n\t\t});\n\t\tthis.add(\"source\", this.source);\n\t\tthis.cursor = state(initialCursor, {\n\t\t\tname: \"cursor\",\n\t\t\tdescribeKind: \"state\",\n\t\t\tmeta: messagingMeta(\"subscription_cursor\"),\n\t\t});\n\t\tthis.add(\"cursor\", this.cursor);\n\t\tthis.available = derived(\n\t\t\t[this.source, this.cursor],\n\t\t\t([sourceSnapshot, cursor]) => {\n\t\t\t\tconst entries = (sourceSnapshot as ReactiveLogSnapshot<T>).value.entries;\n\t\t\t\tconst start = Math.max(0, Math.trunc((cursor as number) ?? 0));\n\t\t\t\treturn entries.slice(start);\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"available\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: messagingMeta(\"subscription_available\"),\n\t\t\t\tinitial: [],\n\t\t\t},\n\t\t);\n\t\tthis.add(\"available\", this.available);\n\t\tthis.connect(\"topic::events\", \"source\");\n\t\tthis.connect(\"source\", \"available\");\n\t\tthis.connect(\"cursor\", \"available\");\n\t\tthis._keepaliveDisposers.push(keepalive(this.source));\n\t\tthis._keepaliveDisposers.push(keepalive(this.available));\n\t}\n\n\toverride destroy(): void {\n\t\tfor (const dispose of this._keepaliveDisposers) dispose();\n\t\tthis._keepaliveDisposers.length = 0;\n\t\tsuper.destroy();\n\t}\n\n\tack(count?: number): number {\n\t\tconst available = this.available.get() as readonly T[];\n\t\tconst requested =\n\t\t\tcount === undefined\n\t\t\t\t? available.length\n\t\t\t\t: requireNonNegativeInt(count, \"subscription ack count\");\n\t\tconst step = Math.min(requested, available.length);\n\t\tif (step <= 0) return this.cursor.get() as number;\n\t\tconst next = (this.cursor.get() as number) + step;\n\t\tthis.cursor.down([[DATA, next]]);\n\t\treturn next;\n\t}\n\n\tpull(limit?: number, opts: { ack?: boolean } = {}): readonly T[] {\n\t\tconst available = this.available.get() as readonly T[];\n\t\tconst max =\n\t\t\tlimit === undefined\n\t\t\t\t? available.length\n\t\t\t\t: requireNonNegativeInt(limit, \"subscription pull limit\");\n\t\tconst out = available.slice(0, max);\n\t\tif (opts.ack && out.length > 0) this.ack(out.length);\n\t\treturn out;\n\t}\n}\n\nexport type JobState = \"queued\" | \"inflight\";\n\nexport type JobEnvelope<T> = {\n\tid: string;\n\tpayload: T;\n\tattempts: number;\n\tmetadata: Readonly<Record<string, unknown>>;\n\tstate: JobState;\n};\n\nexport type JobQueueOptions = {\n\tgraph?: GraphOptions;\n};\n\nexport class JobQueueGraph<T> extends Graph {\n\tprivate readonly _pending;\n\tprivate readonly _jobs;\n\tprivate readonly _keepaliveDisposers: Array<() => void> = [];\n\tprivate _seq = 0;\n\treadonly pending: Node<ReactiveListSnapshot<string>>;\n\treadonly jobs: Node<ReactiveMapSnapshot<string, JobEnvelope<T>>>;\n\treadonly depth: Node<number>;\n\n\tconstructor(name: string, opts: JobQueueOptions = {}) {\n\t\tsuper(name, opts.graph);\n\t\tthis._pending = reactiveList<string>([], { name: \"pending\" });\n\t\tthis._jobs = reactiveMap<string, JobEnvelope<T>>({ name: \"jobs\" });\n\t\tthis.pending = this._pending.items;\n\t\tthis.jobs = this._jobs.node;\n\t\tthis.add(\"pending\", this.pending);\n\t\tthis.add(\"jobs\", this.jobs);\n\t\tthis.depth = derived(\n\t\t\t[this.pending],\n\t\t\t([snapshot]) => (snapshot as ReactiveListSnapshot<string>).value.items.length,\n\t\t\t{\n\t\t\t\tname: \"depth\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: messagingMeta(\"queue_depth\"),\n\t\t\t\tinitial: 0,\n\t\t\t},\n\t\t);\n\t\tthis.add(\"depth\", this.depth);\n\t\tthis.connect(\"pending\", \"depth\");\n\t\tthis._keepaliveDisposers.push(keepalive(this.depth));\n\t}\n\n\toverride destroy(): void {\n\t\tfor (const dispose of this._keepaliveDisposers) dispose();\n\t\tthis._keepaliveDisposers.length = 0;\n\t\tsuper.destroy();\n\t}\n\n\tenqueue(payload: T, opts: { id?: string; metadata?: Record<string, unknown> } = {}): string {\n\t\tconst id = opts.id ?? `${this.name}-${++this._seq}`;\n\t\tif (this._jobs.get(id) !== undefined) {\n\t\t\tthrow new Error(`jobQueue(\"${this.name}\"): duplicate job id \"${id}\"`);\n\t\t}\n\t\tconst job: JobEnvelope<T> = {\n\t\t\tid,\n\t\t\tpayload,\n\t\t\tattempts: 0,\n\t\t\tmetadata: Object.freeze({ ...(opts.metadata ?? {}) }),\n\t\t\tstate: \"queued\",\n\t\t};\n\t\tthis._jobs.set(id, job);\n\t\tthis._pending.append(id);\n\t\treturn id;\n\t}\n\n\tclaim(limit = 1): readonly JobEnvelope<T>[] {\n\t\tconst max = requireNonNegativeInt(limit, \"job queue claim limit\");\n\t\tif (max === 0) return [];\n\t\tconst out: JobEnvelope<T>[] = [];\n\t\twhile (out.length < max) {\n\t\t\tconst snapshot = this.pending.get() as ReactiveListSnapshot<string>;\n\t\t\tconst ids = snapshot.value.items;\n\t\t\tif (ids.length === 0) break;\n\t\t\tconst id = this._pending.pop(0);\n\t\t\tconst job = this._jobs.get(id);\n\t\t\tif (!job || job.state !== \"queued\") continue;\n\t\t\tconst inflight: JobEnvelope<T> = {\n\t\t\t\t...job,\n\t\t\t\tstate: \"inflight\",\n\t\t\t\tattempts: job.attempts + 1,\n\t\t\t};\n\t\t\tthis._jobs.set(id, inflight);\n\t\t\tout.push(inflight);\n\t\t}\n\t\treturn out;\n\t}\n\n\tack(id: string): boolean {\n\t\tconst job = this._jobs.get(id);\n\t\tif (!job || job.state !== \"inflight\") return false;\n\t\tthis._jobs.delete(id);\n\t\treturn true;\n\t}\n\n\tnack(id: string, opts: { requeue?: boolean } = {}): boolean {\n\t\tconst job = this._jobs.get(id);\n\t\tif (!job || job.state !== \"inflight\") return false;\n\t\tif (opts.requeue ?? true) {\n\t\t\tthis._jobs.set(id, { ...job, state: \"queued\" });\n\t\t\tthis._pending.append(id);\n\t\t\treturn true;\n\t\t}\n\t\tthis._jobs.delete(id);\n\t\treturn true;\n\t}\n}\n\nexport type JobFlowOptions = {\n\tgraph?: GraphOptions;\n\tstages?: readonly string[];\n\tmaxPerPump?: number;\n};\n\nexport class JobFlowGraph<T> extends Graph {\n\tprivate readonly _stageNames: readonly string[];\n\tprivate readonly _queues = new Map<string, JobQueueGraph<T>>();\n\tprivate readonly _keepaliveDisposers: Array<() => void> = [];\n\tprivate readonly _completed;\n\treadonly completed: Node<ReactiveLogSnapshot<JobEnvelope<T>>>;\n\treadonly completedCount: Node<number>;\n\n\tconstructor(name: string, opts: JobFlowOptions = {}) {\n\t\tsuper(name, opts.graph);\n\t\tconst stages = (opts.stages ?? [\"incoming\", \"processing\", \"done\"]).map((v) => v.trim());\n\t\tif (stages.length < 2) {\n\t\t\tthrow new Error(`jobFlow(\"${name}\"): requires at least 2 stages`);\n\t\t}\n\t\tconst unique = new Set(stages);\n\t\tif (unique.size !== stages.length) {\n\t\t\tthrow new Error(`jobFlow(\"${name}\"): stage names must be unique`);\n\t\t}\n\t\tthis._stageNames = Object.freeze([...stages]);\n\t\tfor (const stage of this._stageNames) {\n\t\t\tconst q = jobQueue<T>(`${name}-${stage}`);\n\t\t\tthis._queues.set(stage, q);\n\t\t\tthis.mount(stage, q);\n\t\t}\n\t\tthis._completed = reactiveLog<JobEnvelope<T>>([], { name: \"completed\" });\n\t\tthis.completed = this._completed.entries;\n\t\tthis.add(\"completed\", this.completed);\n\t\tthis.completedCount = derived(\n\t\t\t[this.completed],\n\t\t\t([snapshot]) => (snapshot as ReactiveLogSnapshot<JobEnvelope<T>>).value.entries.length,\n\t\t\t{\n\t\t\t\tname: \"completedCount\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: messagingMeta(\"job_flow_completed_count\"),\n\t\t\t\tinitial: 0,\n\t\t\t},\n\t\t);\n\t\tthis.add(\"completedCount\", this.completedCount);\n\t\tthis.connect(\"completed\", \"completedCount\");\n\t\tthis._keepaliveDisposers.push(keepalive(this.completedCount));\n\n\t\tconst maxPerPump = Math.max(\n\t\t\t1,\n\t\t\trequireNonNegativeInt(opts.maxPerPump ?? DEFAULT_MAX_PER_PUMP, \"job flow maxPerPump\"),\n\t\t);\n\t\tfor (let i = 0; i < this._stageNames.length; i += 1) {\n\t\t\tconst stage = this._stageNames[i] as string;\n\t\t\tconst current = this.queue(stage);\n\t\t\tconst next =\n\t\t\t\ti + 1 < this._stageNames.length ? this.queue(this._stageNames[i + 1] as string) : null;\n\t\t\tconst pump = node<unknown>(\n\t\t\t\t[current.pending],\n\t\t\t\t() => {\n\t\t\t\t\tlet moved = 0;\n\t\t\t\t\twhile (moved < maxPerPump) {\n\t\t\t\t\t\tconst claim = current.claim(1);\n\t\t\t\t\t\tif (claim.length === 0) break;\n\t\t\t\t\t\tconst job = claim[0] as JobEnvelope<T>;\n\t\t\t\t\t\tif (!job) break;\n\t\t\t\t\t\tif (next) {\n\t\t\t\t\t\t\tnext.enqueue(job.payload, {\n\t\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\t...job.metadata,\n\t\t\t\t\t\t\t\t\tjob_flow_from: stage,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis._completed.append(job);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrent.ack(job.id);\n\t\t\t\t\t\tmoved += 1;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: `pump_${stage}`,\n\t\t\t\t\tdescribeKind: \"effect\",\n\t\t\t\t\tmeta: messagingMeta(\"job_flow_pump\"),\n\t\t\t\t},\n\t\t\t);\n\t\t\tthis.add(`pump_${stage}`, pump);\n\t\t\tthis.connect(`${stage}::pending`, `pump_${stage}`);\n\t\t\tthis._keepaliveDisposers.push(keepalive(pump));\n\t\t}\n\t}\n\n\toverride destroy(): void {\n\t\tfor (const dispose of this._keepaliveDisposers) dispose();\n\t\tthis._keepaliveDisposers.length = 0;\n\t\tsuper.destroy();\n\t}\n\n\tstages(): readonly string[] {\n\t\treturn this._stageNames;\n\t}\n\n\tqueue(stage: string): JobQueueGraph<T> {\n\t\tconst q = this._queues.get(stage);\n\t\tif (!q) throw new Error(`jobFlow(\"${this.name}\"): unknown stage \"${stage}\"`);\n\t\treturn q;\n\t}\n\n\tenqueue(payload: T, opts: { id?: string; metadata?: Record<string, unknown> } = {}): string {\n\t\treturn this.queue(this._stageNames[0] as string).enqueue(payload, opts);\n\t}\n\n\tretainedCompleted(): readonly JobEnvelope<T>[] {\n\t\tconst snapshot = this.completed.get() as ReactiveLogSnapshot<JobEnvelope<T>>;\n\t\treturn snapshot.value.entries;\n\t}\n}\n\nexport type TopicBridgeOptions<TIn, TOut> = {\n\tgraph?: GraphOptions;\n\tcursor?: number;\n\tmaxPerPump?: number;\n\tmap?: (value: TIn) => TOut | undefined;\n};\n\nexport class TopicBridgeGraph<TIn, TOut = TIn> extends Graph {\n\tprivate readonly _sourceSub;\n\tprivate readonly _target;\n\tprivate readonly _keepaliveDisposers: Array<() => void> = [];\n\treadonly bridgedCount: Node<number>;\n\n\tconstructor(\n\t\tname: string,\n\t\tsourceTopic: TopicGraph<TIn>,\n\t\ttargetTopic: TopicGraph<TOut>,\n\t\topts: TopicBridgeOptions<TIn, TOut> = {},\n\t) {\n\t\tsuper(name, opts.graph);\n\t\tthis._sourceSub = subscription<TIn>(`${name}-subscription`, sourceTopic, {\n\t\t\tcursor: opts.cursor,\n\t\t});\n\t\tthis._target = targetTopic;\n\t\tthis.mount(\"subscription\", this._sourceSub);\n\t\tthis.bridgedCount = state(0, {\n\t\t\tname: \"bridgedCount\",\n\t\t\tdescribeKind: \"state\",\n\t\t\tmeta: messagingMeta(\"topic_bridge_count\"),\n\t\t});\n\t\tthis.add(\"bridgedCount\", this.bridgedCount);\n\n\t\tconst maxPerPump = Math.max(\n\t\t\t1,\n\t\t\trequireNonNegativeInt(opts.maxPerPump ?? DEFAULT_MAX_PER_PUMP, \"topic bridge maxPerPump\"),\n\t\t);\n\t\tconst mapValue = opts.map ?? ((value: TIn) => value as unknown as TOut);\n\t\tconst pump = node<unknown>(\n\t\t\t[this._sourceSub.available],\n\t\t\t() => {\n\t\t\t\tconst available = this._sourceSub.pull(maxPerPump, { ack: true });\n\t\t\t\tif (available.length === 0) return;\n\t\t\t\tlet bridged = 0;\n\t\t\t\tfor (const value of available) {\n\t\t\t\t\tconst mapped = mapValue(value as TIn);\n\t\t\t\t\tif (mapped === undefined) continue;\n\t\t\t\t\tthis._target.publish(mapped);\n\t\t\t\t\tbridged += 1;\n\t\t\t\t}\n\t\t\t\tif (bridged > 0) {\n\t\t\t\t\tconst current = this.bridgedCount.get() as number;\n\t\t\t\t\tthis.bridgedCount.down([[DATA, current + bridged]]);\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"pump\",\n\t\t\t\tdescribeKind: \"effect\",\n\t\t\t\tmeta: messagingMeta(\"topic_bridge_pump\"),\n\t\t\t},\n\t\t);\n\t\tthis.add(\"pump\", pump);\n\t\tthis.connect(\"subscription::available\", \"pump\");\n\t\tthis._keepaliveDisposers.push(keepalive(pump));\n\t}\n\n\toverride destroy(): void {\n\t\tfor (const dispose of this._keepaliveDisposers) dispose();\n\t\tthis._keepaliveDisposers.length = 0;\n\t\tsuper.destroy();\n\t}\n}\n\n/**\n * Creates a Pulsar-inspired topic graph (append-only retained stream + latest value).\n */\nexport function topic<T>(name: string, opts?: TopicOptions): TopicGraph<T> {\n\treturn new TopicGraph<T>(name, opts);\n}\n\n/**\n * Creates a cursor-based subscription graph over a topic.\n */\nexport function subscription<T>(\n\tname: string,\n\ttopicGraph: TopicGraph<T>,\n\topts?: SubscriptionOptions,\n): SubscriptionGraph<T> {\n\treturn new SubscriptionGraph<T>(name, topicGraph, opts);\n}\n\n/**\n * Creates a Pulsar-inspired job queue graph with claim/ack/nack workflow.\n */\nexport function jobQueue<T>(name: string, opts?: JobQueueOptions): JobQueueGraph<T> {\n\treturn new JobQueueGraph<T>(name, opts);\n}\n\n/**\n * Creates an autonomous multi-stage queue chain graph.\n */\nexport function jobFlow<T>(name: string, opts?: JobFlowOptions): JobFlowGraph<T> {\n\treturn new JobFlowGraph<T>(name, opts);\n}\n\n/**\n * Creates an autonomous cursor-based topic relay graph.\n */\nexport function topicBridge<TIn, TOut = TIn>(\n\tname: string,\n\tsourceTopic: TopicGraph<TIn>,\n\ttargetTopic: TopicGraph<TOut>,\n\topts?: TopicBridgeOptions<TIn, TOut>,\n): TopicBridgeGraph<TIn, TOut> {\n\treturn new TopicBridgeGraph<TIn, TOut>(name, sourceTopic, targetTopic, opts);\n}\n","/**\n * Orchestration patterns (roadmap §4.1).\n *\n * Domain-layer helpers that build workflow shapes on top of core + extra primitives.\n * Exported under the `patterns.orchestration` namespace to avoid collisions with\n * Phase 2 operator names (for example `gate`, `forEach`).\n */\n\nimport {\n\tCOMPLETE,\n\tDATA,\n\tERROR,\n\ttype Message,\n\ttype Messages,\n\tRESOLVED,\n\tTEARDOWN,\n} from \"../core/messages.js\";\nimport { type Node, type NodeActions, type NodeFn, type NodeOptions, node } from \"../core/node.js\";\nimport { state } from \"../core/sugar.js\";\nimport { GRAPH_META_SEGMENT, Graph, type GraphOptions } from \"../graph/graph.js\";\n\nexport type StepRef = string | Node<unknown>;\n\ntype OrchestrationMeta = {\n\torchestration?: true;\n\torchestration_type?: string;\n};\n\nexport type OrchestrationStepOptions = Omit<NodeOptions, \"describeKind\" | \"name\" | \"meta\"> & {\n\tdeps?: ReadonlyArray<StepRef>;\n\tmeta?: Record<string, unknown> & OrchestrationMeta;\n};\n\nexport type BranchResult<T> = {\n\tbranch: \"then\" | \"else\";\n\tvalue: T;\n};\n\nexport type SensorControls<T> = {\n\tnode: Node<T>;\n\tpush(value: T): void;\n\terror(err: unknown): void;\n\tcomplete(): void;\n};\n\nexport type LoopOptions = Omit<OrchestrationStepOptions, \"deps\"> & {\n\titerations?: number | StepRef;\n};\n\nexport type WaitOptions = Omit<OrchestrationStepOptions, \"deps\">;\n\nexport type SubPipelineBuilder = (sub: Graph) => void;\n\nfunction resolveDep(graph: Graph, dep: StepRef): { node: Node<unknown>; path?: string } {\n\tif (typeof dep === \"string\") {\n\t\treturn { node: graph.resolve(dep), path: dep };\n\t}\n\tconst path = findRegisteredNodePath(graph, dep);\n\tif (!path) {\n\t\tthrow new Error(\n\t\t\t\"orchestration dep node must already be registered in the graph so explicit edges can be recorded; pass a string path or register the node first\",\n\t\t);\n\t}\n\treturn { node: dep, path };\n}\n\nfunction findRegisteredNodePath(graph: Graph, target: Node<unknown>): string | undefined {\n\tconst described = graph.describe();\n\tconst metaSegment = `::${GRAPH_META_SEGMENT}::`;\n\tfor (const path of Object.keys(described.nodes).sort()) {\n\t\tif (path.includes(metaSegment)) continue;\n\t\ttry {\n\t\t\tif (graph.resolve(path) === target) return path;\n\t\t} catch {\n\t\t\t/* ignore stale path while scanning */\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction registerStep(\n\tgraph: Graph,\n\tname: string,\n\tstep: Node<unknown>,\n\tdepPaths: ReadonlyArray<string>,\n): void {\n\tgraph.add(name, step);\n\tfor (const path of depPaths) {\n\t\tgraph.connect(path, name);\n\t}\n}\n\nfunction baseMeta(kind: string, meta?: Record<string, unknown>): Record<string, unknown> {\n\treturn {\n\t\torchestration: true,\n\t\torchestration_type: kind,\n\t\t...(meta ?? {}),\n\t};\n}\n\nfunction coerceLoopIterations(raw: unknown): number {\n\tconst parseString = (value: string): number => {\n\t\tconst trimmed = value.trim();\n\t\tif (trimmed.length === 0) return 0;\n\t\treturn Number(trimmed);\n\t};\n\tlet parsed: number;\n\tif (typeof raw === \"string\") {\n\t\tparsed = parseString(raw);\n\t} else if (raw === null) {\n\t\tparsed = 0;\n\t} else {\n\t\tparsed = Number(raw);\n\t}\n\tif (!Number.isFinite(parsed)) return 1;\n\treturn Math.max(0, Math.trunc(parsed));\n}\n\n/**\n * Creates an orchestration graph container.\n */\nexport function pipeline(name: string, opts?: GraphOptions): Graph {\n\treturn new Graph(name, opts);\n}\n\n/**\n * Registers a workflow task node.\n */\nexport function task<T>(\n\tgraph: Graph,\n\tname: string,\n\trun: NodeFn<T>,\n\topts?: OrchestrationStepOptions,\n): Node<T> {\n\tconst depRefs = opts?.deps ?? [];\n\tconst deps = depRefs.map((dep) => resolveDep(graph, dep));\n\tconst { deps: _deps, ...nodeOpts } = opts ?? {};\n\tconst step = node<T>(\n\t\tdeps.map((d) => d.node),\n\t\trun,\n\t\t{\n\t\t\t...nodeOpts,\n\t\t\tname,\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"task\", opts?.meta),\n\t\t},\n\t);\n\tregisterStep(\n\t\tgraph,\n\t\tname,\n\t\tstep as unknown as Node<unknown>,\n\t\tdeps.flatMap((d) => (d.path ? [d.path] : [])),\n\t);\n\treturn step;\n}\n\n/**\n * Emits tagged branch outcomes (`then` / `else`) for each source value.\n */\nexport function branch<T>(\n\tgraph: Graph,\n\tname: string,\n\tsource: StepRef,\n\tpredicate: (value: T) => boolean,\n\topts?: Omit<OrchestrationStepOptions, \"deps\">,\n): Node<BranchResult<T>> {\n\tconst src = resolveDep(graph, source);\n\tconst step = node<BranchResult<T>>(\n\t\t[src.node],\n\t\t([value]) => ({\n\t\t\tbranch: predicate(value as T) ? \"then\" : \"else\",\n\t\t\tvalue: value as T,\n\t\t}),\n\t\t{\n\t\t\t...opts,\n\t\t\tname,\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"branch\", opts?.meta),\n\t\t},\n\t);\n\tregisterStep(graph, name, step as unknown as Node<unknown>, src.path ? [src.path] : []);\n\treturn step;\n}\n\n/**\n * Forwards source values only while `control` is truthy.\n */\nexport function valve<T>(\n\tgraph: Graph,\n\tname: string,\n\tsource: StepRef,\n\tcontrol: StepRef,\n\topts?: Omit<OrchestrationStepOptions, \"deps\">,\n): Node<T> {\n\tconst src = resolveDep(graph, source);\n\tconst ctrl = resolveDep(graph, control);\n\tconst step = node<T>(\n\t\t[src.node, ctrl.node],\n\t\t(_deps, actions) => {\n\t\t\tconst opened = ctrl.node.get();\n\t\t\tif (!opened) {\n\t\t\t\tactions.down([[RESOLVED]]);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn src.node.get() as T;\n\t\t},\n\t\t{\n\t\t\t...opts,\n\t\t\tname,\n\t\t\tdescribeKind: \"operator\",\n\t\t\tmeta: baseMeta(\"valve\", opts?.meta),\n\t\t},\n\t);\n\tregisterStep(\n\t\tgraph,\n\t\tname,\n\t\tstep as unknown as Node<unknown>,\n\t\t[src.path, ctrl.path].filter((v): v is string => typeof v === \"string\"),\n\t);\n\treturn step;\n}\n\nexport type ApprovalOptions = Omit<OrchestrationStepOptions, \"deps\"> & {\n\tisApproved?: (value: unknown) => boolean;\n};\n\n/**\n * Human/LLM approval gate over a source value.\n */\nexport function approval<T>(\n\tgraph: Graph,\n\tname: string,\n\tsource: StepRef,\n\tapprover: StepRef,\n\topts?: ApprovalOptions,\n): Node<T> {\n\tconst src = resolveDep(graph, source);\n\tconst ctrl = resolveDep(graph, approver);\n\tconst isApproved = opts?.isApproved ?? ((value: unknown) => Boolean(value));\n\tconst step = node<T>(\n\t\t[src.node, ctrl.node],\n\t\t(_deps, actions: NodeActions) => {\n\t\t\tif (!isApproved(ctrl.node.get())) {\n\t\t\t\tactions.down([[RESOLVED]]);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn src.node.get() as T;\n\t\t},\n\t\t{\n\t\t\t...opts,\n\t\t\tname,\n\t\t\tdescribeKind: \"operator\",\n\t\t\tmeta: baseMeta(\"approval\", opts?.meta),\n\t\t},\n\t);\n\tregisterStep(\n\t\tgraph,\n\t\tname,\n\t\tstep as unknown as Node<unknown>,\n\t\t[src.path, ctrl.path].filter((v): v is string => typeof v === \"string\"),\n\t);\n\treturn step;\n}\n\n// ---------------------------------------------------------------------------\n// gate — human-in-the-loop approval with pending queue\n// ---------------------------------------------------------------------------\n\nexport interface GateOptions {\n\t/** Maximum queue size. Oldest values are FIFO-dropped when exceeded. Default: Infinity. */\n\tmaxPending?: number;\n\t/** Start in open mode (auto-approve). Default: false. */\n\tstartOpen?: boolean;\n\tmeta?: Record<string, unknown>;\n}\n\n/** Control surface returned by {@link gate}. */\nexport interface GateController<T> {\n\t/** The output node registered in the graph (subscribe to receive approved values). */\n\tnode: Node<T>;\n\t/** Reactive queue of values waiting for approval. */\n\tpending: Node<T[]>;\n\t/** Derived count of pending items. */\n\tcount: Node<number>;\n\t/** Whether the gate is currently open (auto-approving). */\n\tisOpen: Node<boolean>;\n\t/** Approve and forward the next `count` pending values (default: 1). */\n\tapprove(count?: number): void;\n\t/** Reject (discard) the next `count` pending values (default: 1). */\n\treject(count?: number): void;\n\t/**\n\t * Transform and forward `count` pending values (default: 1).\n\t * `fn` receives `(value, index, pending)` — Array.map-style.\n\t */\n\tmodify(fn: (value: T, index: number, pending: readonly T[]) => T, count?: number): void;\n\t/** Flush all pending values and auto-approve future values. */\n\topen(): void;\n\t/** Re-enable manual gating (stop auto-approving). */\n\tclose(): void;\n}\n\n/**\n * Human-in-the-loop gate: queues incoming values from `source` and lets an external\n * controller {@link GateController.approve approve}, {@link GateController.reject reject},\n * or {@link GateController.modify modify} them before forwarding downstream.\n *\n * Observable surfaces (`pending`, `count`, `isOpen`) are reactive nodes registered in\n * the graph. The gate output node is also registered.\n */\nexport function gate<T>(\n\tgraph: Graph,\n\tname: string,\n\tsource: StepRef,\n\topts?: GateOptions,\n): GateController<T> {\n\tconst maxPending = opts?.maxPending ?? Infinity;\n\tif (maxPending < 1 && maxPending !== Infinity) {\n\t\tthrow new RangeError(\"gate: maxPending must be >= 1\");\n\t}\n\tconst startOpen = opts?.startOpen ?? false;\n\n\tconst src = resolveDep(graph, source);\n\n\t// Internal reactive state\n\tconst pendingNode = state<T[]>([], { name: \"pending\", equals: () => false });\n\tconst isOpenNode = state<boolean>(startOpen, { name: \"isOpen\" });\n\tconst countNode = node<number>([pendingNode], ([arr]) => (arr as T[]).length, {\n\t\tname: \"count\",\n\t\tdescribeKind: \"derived\",\n\t});\n\n\tlet queue: T[] = [];\n\tlet torn = false;\n\n\tfunction syncPending(): void {\n\t\tpendingNode.down([[DATA, [...queue]]]);\n\t}\n\n\tfunction enqueue(value: T): void {\n\t\tqueue.push(value);\n\t\tif (queue.length > maxPending) queue.shift();\n\t\tsyncPending();\n\t}\n\n\tfunction dequeue(n: number): T[] {\n\t\tconst items = queue.splice(0, n);\n\t\tsyncPending();\n\t\treturn items;\n\t}\n\n\tfunction guardTorn(method: string): void {\n\t\tif (torn) throw new Error(`gate: ${method}() called after gate was torn down`);\n\t}\n\n\t// The output node: a producer-like node that subscribes to source\n\tconst output = node<T>([src.node], () => undefined, {\n\t\tname,\n\t\tdescribeKind: \"operator\",\n\t\tmeta: baseMeta(\"gate\", opts?.meta),\n\t\tonMessage(msg: Message, _depIndex: number, actions: NodeActions) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tif (isOpenNode.get()) {\n\t\t\t\t\tactions.emit(msg[1] as T);\n\t\t\t\t} else {\n\t\t\t\t\tenqueue(msg[1] as T);\n\t\t\t\t\t// Settle downstream: source DIRTY was forwarded, so emit RESOLVED\n\t\t\t\t\t// to prevent downstream from staying stuck in dirty status.\n\t\t\t\t\tactions.down([[RESOLVED]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === TEARDOWN) {\n\t\t\t\ttorn = true;\n\t\t\t\tqueue = [];\n\t\t\t\tsyncPending();\n\t\t\t\tactions.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === COMPLETE || msg[0] === ERROR) {\n\t\t\t\ttorn = true;\n\t\t\t\tqueue = [];\n\t\t\t\tsyncPending();\n\t\t\t\tactions.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t// Forward DIRTY, RESOLVED, and unknown types\n\t\t\tactions.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n\n\tconst controller: GateController<T> = {\n\t\tnode: output,\n\t\tpending: pendingNode,\n\t\tcount: countNode,\n\t\tisOpen: isOpenNode,\n\t\tapprove(count = 1) {\n\t\t\tguardTorn(\"approve\");\n\t\t\tconst items = dequeue(count);\n\t\t\tfor (const item of items) {\n\t\t\t\tif (torn) break;\n\t\t\t\toutput.down([[DATA, item]]);\n\t\t\t}\n\t\t},\n\t\treject(count = 1) {\n\t\t\tguardTorn(\"reject\");\n\t\t\tdequeue(count);\n\t\t},\n\t\tmodify(fn, count = 1) {\n\t\t\tguardTorn(\"modify\");\n\t\t\tconst snapshot = [...queue] as readonly T[];\n\t\t\tconst items = dequeue(count);\n\t\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\t\tif (torn) break;\n\t\t\t\toutput.down([[DATA, fn(items[i], i, snapshot)]]);\n\t\t\t}\n\t\t},\n\t\topen() {\n\t\t\tguardTorn(\"open\");\n\t\t\tisOpenNode.down([[DATA, true]]);\n\t\t\t// Flush all pending\n\t\t\tconst items = dequeue(queue.length);\n\t\t\tfor (const item of items) {\n\t\t\t\tif (torn) break;\n\t\t\t\toutput.down([[DATA, item]]);\n\t\t\t}\n\t\t},\n\t\tclose() {\n\t\t\tguardTorn(\"close\");\n\t\t\tisOpenNode.down([[DATA, false]]);\n\t\t},\n\t};\n\n\t// Activate count so it stays reactive\n\tcountNode.subscribe(() => undefined);\n\n\t// Register output + internal state as a mounted subgraph (aligned with PY)\n\tregisterStep(graph, name, output as unknown as Node<unknown>, src.path ? [src.path] : []);\n\tconst internal = new Graph(`${name}_state`);\n\tinternal.add(\"pending\", pendingNode);\n\tinternal.add(\"isOpen\", isOpenNode);\n\tinternal.add(\"count\", countNode);\n\tinternal.connect(\"pending\", \"count\");\n\tgraph.mount(`${name}_state`, internal);\n\n\treturn controller;\n}\n\n/**\n * Registers a workflow side-effect step. The step remains graph-observable and forwards messages.\n */\nexport function forEach<T>(\n\tgraph: Graph,\n\tname: string,\n\tsource: StepRef,\n\trun: (value: T, actions: NodeActions) => void,\n\topts?: Omit<OrchestrationStepOptions, \"deps\">,\n): Node<T> {\n\tconst src = resolveDep(graph, source);\n\tlet terminated = false;\n\tconst step = node<T>([src.node], () => undefined, {\n\t\t...opts,\n\t\tname,\n\t\tdescribeKind: \"effect\",\n\t\tcompleteWhenDepsComplete: false,\n\t\tmeta: baseMeta(\"forEach\", opts?.meta),\n\t\tonMessage(msg: Message, depIndex: number, actions: NodeActions) {\n\t\t\tif (terminated) return true;\n\t\t\tif (depIndex !== 0) {\n\t\t\t\tactions.down([msg] satisfies Messages);\n\t\t\t\tif (msg[0] === COMPLETE || msg[0] === ERROR) terminated = true;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\ttry {\n\t\t\t\t\trun(msg[1] as T, actions);\n\t\t\t\t\tactions.down([msg] satisfies Messages);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tterminated = true;\n\t\t\t\t\tactions.down([[ERROR, err]] satisfies Messages);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tactions.down([msg] satisfies Messages);\n\t\t\tif (msg[0] === COMPLETE || msg[0] === ERROR) terminated = true;\n\t\t\treturn true;\n\t\t},\n\t});\n\tregisterStep(graph, name, step as unknown as Node<unknown>, src.path ? [src.path] : []);\n\treturn step;\n}\n\n/**\n * Registers a join step that emits a tuple of latest dependency values.\n */\nexport function join<T extends readonly unknown[]>(\n\tgraph: Graph,\n\tname: string,\n\tdeps: { [K in keyof T]: StepRef },\n\topts?: Omit<OrchestrationStepOptions, \"deps\">,\n): Node<T> {\n\tconst resolved = deps.map((dep) => resolveDep(graph, dep));\n\tconst step = node<T>(\n\t\tresolved.map((d) => d.node),\n\t\t(values) => values as T,\n\t\t{\n\t\t\t...opts,\n\t\t\tname,\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"join\", opts?.meta),\n\t\t},\n\t);\n\tregisterStep(\n\t\tgraph,\n\t\tname,\n\t\tstep as unknown as Node<unknown>,\n\t\tresolved.flatMap((d) => (d.path ? [d.path] : [])),\n\t);\n\treturn step;\n}\n\n/**\n * Registers a loop step that applies `iterate` to each source value N times.\n */\nexport function loop<T>(\n\tgraph: Graph,\n\tname: string,\n\tsource: StepRef,\n\titerate: (value: T, iteration: number, actions: NodeActions) => T,\n\topts?: LoopOptions,\n): Node<T> {\n\tconst src = resolveDep(graph, source);\n\tconst iterRef = opts?.iterations;\n\tconst iterDep =\n\t\ttypeof iterRef === \"number\" || iterRef === undefined ? undefined : resolveDep(graph, iterRef);\n\tconst staticIterations = typeof iterRef === \"number\" ? iterRef : undefined;\n\tconst step = node<T>(\n\t\titerDep ? [src.node, iterDep.node] : [src.node],\n\t\t(_deps, actions) => {\n\t\t\tlet current = src.node.get() as T;\n\t\t\tconst rawCount = staticIterations ?? iterDep?.node.get() ?? 1;\n\t\t\tconst count = coerceLoopIterations(rawCount);\n\t\t\tfor (let i = 0; i < count; i += 1) {\n\t\t\t\tcurrent = iterate(current, i, actions);\n\t\t\t}\n\t\t\treturn current;\n\t\t},\n\t\t{\n\t\t\t...opts,\n\t\t\tname,\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: baseMeta(\"loop\", opts?.meta),\n\t\t},\n\t);\n\tregisterStep(\n\t\tgraph,\n\t\tname,\n\t\tstep as unknown as Node<unknown>,\n\t\t[src.path, iterDep?.path].filter((v): v is string => typeof v === \"string\"),\n\t);\n\treturn step;\n}\n\n/**\n * Mounts and returns a child workflow graph.\n */\nexport function subPipeline(\n\tgraph: Graph,\n\tname: string,\n\tchildOrBuild?: Graph | SubPipelineBuilder,\n\topts?: GraphOptions,\n): Graph {\n\tconst child = childOrBuild instanceof Graph ? childOrBuild : pipeline(name, opts);\n\tif (typeof childOrBuild === \"function\") {\n\t\tchildOrBuild(child);\n\t}\n\tgraph.mount(name, child);\n\treturn child;\n}\n\n/**\n * Registers a producer-style sensor source and returns imperative controls.\n */\nexport function sensor<T>(\n\tgraph: Graph,\n\tname: string,\n\tinitial?: T,\n\topts?: Omit<NodeOptions, \"name\" | \"describeKind\" | \"meta\"> & {\n\t\tmeta?: Record<string, unknown>;\n\t},\n): SensorControls<T> {\n\tconst source = node<T>([], () => undefined, {\n\t\t...opts,\n\t\tname,\n\t\tinitial,\n\t\tdescribeKind: \"producer\",\n\t\tmeta: baseMeta(\"sensor\", opts?.meta),\n\t});\n\tregisterStep(graph, name, source as unknown as Node<unknown>, []);\n\treturn {\n\t\tnode: source,\n\t\tpush(value: T) {\n\t\t\tsource.down([[DATA, value]] satisfies Messages);\n\t\t},\n\t\terror(err: unknown) {\n\t\t\tsource.down([[ERROR, err]] satisfies Messages);\n\t\t},\n\t\tcomplete() {\n\t\t\tsource.down([[COMPLETE]] satisfies Messages);\n\t\t},\n\t};\n}\n\n/**\n * Registers a delayed-forwarding step (value-level wait).\n */\nexport function wait<T>(\n\tgraph: Graph,\n\tname: string,\n\tsource: StepRef,\n\tms: number,\n\topts?: WaitOptions,\n): Node<T> {\n\tconst src = resolveDep(graph, source);\n\tconst timers = new Set<ReturnType<typeof setTimeout>>();\n\tlet terminated = false;\n\tlet completed = false;\n\tconst step = node<T>(\n\t\t[src.node],\n\t\t() => {\n\t\t\tfor (const id of timers) clearTimeout(id);\n\t\t\ttimers.clear();\n\t\t\treturn () => {\n\t\t\t\tfor (const id of timers) clearTimeout(id);\n\t\t\t\ttimers.clear();\n\t\t\t\tterminated = true;\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\t...opts,\n\t\t\tname,\n\t\t\tinitial: src.node.get() as T,\n\t\t\tdescribeKind: \"operator\",\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tmeta: baseMeta(\"wait\", opts?.meta),\n\t\t\tonMessage(msg: Message, depIndex: number, actions: NodeActions) {\n\t\t\t\tif (terminated) return true;\n\t\t\t\tif (depIndex !== 0) {\n\t\t\t\t\tactions.down([msg] satisfies Messages);\n\t\t\t\t\tif (msg[0] === COMPLETE || msg[0] === ERROR) terminated = true;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === DATA) {\n\t\t\t\t\tconst id = setTimeout(() => {\n\t\t\t\t\t\ttimers.delete(id);\n\t\t\t\t\t\tactions.down([msg] satisfies Messages);\n\t\t\t\t\t\tif (completed && timers.size === 0) {\n\t\t\t\t\t\t\tactions.down([[COMPLETE]] satisfies Messages);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, ms);\n\t\t\t\t\ttimers.add(id);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\tterminated = true;\n\t\t\t\t\tcompleted = true;\n\t\t\t\t\tif (timers.size === 0) {\n\t\t\t\t\t\tactions.down([[COMPLETE]] satisfies Messages);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === ERROR) {\n\t\t\t\t\tterminated = true;\n\t\t\t\t\tfor (const id of timers) clearTimeout(id);\n\t\t\t\t\ttimers.clear();\n\t\t\t\t\tactions.down([msg] satisfies Messages);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tactions.down([msg] satisfies Messages);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t},\n\t);\n\tregisterStep(graph, name, step as unknown as Node<unknown>, src.path ? [src.path] : []);\n\treturn step;\n}\n\n/**\n * Registers an error-recovery step for a source.\n */\nexport function onFailure<T>(\n\tgraph: Graph,\n\tname: string,\n\tsource: StepRef,\n\trecover: (err: unknown, actions: NodeActions) => T,\n\topts?: Omit<OrchestrationStepOptions, \"deps\">,\n): Node<T> {\n\tconst src = resolveDep(graph, source);\n\tlet terminated = false;\n\tconst step = node<T>([src.node], () => undefined, {\n\t\t...opts,\n\t\tname,\n\t\tdescribeKind: \"operator\",\n\t\tcompleteWhenDepsComplete: false,\n\t\tmeta: baseMeta(\"onFailure\", opts?.meta),\n\t\tonMessage(msg: Message, _depIndex: number, actions: NodeActions) {\n\t\t\tif (terminated) return true;\n\t\t\tif (msg[0] === ERROR) {\n\t\t\t\ttry {\n\t\t\t\t\tactions.emit(recover(msg[1], actions));\n\t\t\t\t} catch (err) {\n\t\t\t\t\tterminated = true;\n\t\t\t\t\tactions.down([[ERROR, err]] satisfies Messages);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tactions.down([msg] satisfies Messages);\n\t\t\tif (msg[0] === COMPLETE) terminated = true;\n\t\t\treturn true;\n\t\t},\n\t});\n\tregisterStep(graph, name, step as unknown as Node<unknown>, src.path ? [src.path] : []);\n\treturn step;\n}\n","/**\n * GraphRefly — public API surface.\n */\nexport const version = \"0.0.0\";\n\nexport * from \"./compat/index.js\";\nexport * as compat from \"./compat/index.js\";\n// Named re-exports enable finer-grained tree-shaking for consumers.\nexport * from \"./core/index.js\";\n// Keep namespace exports for ergonomic grouped imports.\nexport * as core from \"./core/index.js\";\nexport * from \"./extra/index.js\";\nexport * as extra from \"./extra/index.js\";\nexport * from \"./graph/index.js\";\nexport * as graph from \"./graph/index.js\";\nexport * from \"./patterns/index.js\";\nexport * as patterns from \"./patterns/index.js\";\n"],"mappings":"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","names":["atom","map","node","map","pull","atom","node","pull","useStore","useSubscribe","useSubscribeRecord","useSubscribe","node","useStore","useSubscribeRecord","useStore","useSubscribe","useSubscribeRecord","useSubscribe","node","useStore","useSubscribeRecord","useStore","useSubscribe","useSubscribeRecord","computed","useSubscribe","node","useStore","computed","useSubscribeRecord","node","policy","out","cache","filter","interval","node","keepalive","buffer","keepalive","baseMeta","policy","node","_","VALID_NODE_TYPES","stripFences","feedback","keepalive","forEach","valve","baseMeta","valve","forEach"]}