@graphrefly/graphrefly 0.5.0 → 0.6.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.
- package/dist/{chunk-ZERWUCGK.js → chunk-V3UACY6A.js} +87 -14
- package/dist/chunk-V3UACY6A.js.map +1 -0
- package/dist/compat/nestjs/index.js +1 -1
- package/dist/extra/index.cjs +86 -13
- package/dist/extra/index.cjs.map +1 -1
- package/dist/extra/index.d.cts +1 -1
- package/dist/extra/index.d.ts +1 -1
- package/dist/extra/index.js +5 -1
- package/dist/{index-C3LRU4jB.d.ts → index-B2jmzVxL.d.ts} +85 -2
- package/dist/{index-Cz8og7-L.d.cts → index-Bk_idZm1.d.cts} +85 -2
- package/dist/index.cjs +88 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-ZERWUCGK.js.map +0 -1
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/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 memory from \"./memory.js\";\nexport * as messaging from \"./messaging.js\";\nexport * as orchestration from \"./orchestration.js\";\nexport * as layout from \"./reactive-layout/index.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 });\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 access = node.meta.access as string | undefined;\n\t\tif (access === \"human\" || access === \"system\") continue;\n\n\t\tconst description = (node.meta.description as string) ?? `Set the value of ${path}`;\n\t\tconst valueSchema = metaToJsonSchema(node.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 });\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 desc = node.meta.description as string | undefined;\n\t\tconst format = node.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 = node.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 described = graph.describe({ actor: opts?.actor });\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 * 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","forEach","gate","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/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 memory from \"./memory.js\";\nexport * as messaging from \"./messaging.js\";\nexport * as orchestration from \"./orchestration.js\";\nexport * as layout from \"./reactive-layout/index.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 });\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 access = node.meta.access as string | undefined;\n\t\tif (access === \"human\" || access === \"system\") continue;\n\n\t\tconst description = (node.meta.description as string) ?? `Set the value of ${path}`;\n\t\tconst valueSchema = metaToJsonSchema(node.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 });\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 desc = node.meta.description as string | undefined;\n\t\tconst format = node.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 = node.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 described = graph.describe({ actor: opts?.actor });\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 * 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAgFO,SAAS,KACf,eACA,gBACA,SACoC;AACpC,MAAI,OAAO,kBAAkB,YAAY;AACxC,UAAM,OAAO;AACb,QAAI,OAAO,mBAAmB,YAAY;AACzC,aAAO,kBAAkB,MAAM,gBAA8B,OAAO;AAAA,IACrE;AACA,WAAO,kBAAkB,MAAM,QAAW,cAA6B;AAAA,EACxE;AAEA,SAAO,oBAAoB,eAAoB,cAA6B;AAC7E;AAEA,SAAS,KAAQ,GAAe;AAC/B,MAAI,MAAqB,EAAE,IAAI;AAC/B,MAAI;AACJ,QAAM,QAAQ,EAAE,UAAU,CAAC,SAAmB;AAC7C,eAAW,CAAC,GAAG,CAAC,KAAK,MAAM;AAC1B,UAAI,MAAM,KAAM,OAAM;AACtB,UAAI,MAAM,MAAO,OAAM;AAAA,IACxB;AAAA,EACD,CAAC;AACD,QAAM;AACN,MAAI,IAAK,OAAM;AACf,SAAO;AACR;AAEA,SAAS,oBAAuB,SAAY,SAAwC;AACnF,QAAM,IAAI,MAAM,SAAS;AAAA,IACxB,GAAG;AAAA,IACH,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,EAClB,CAAC;AACD,SAAO;AAAA,IACN,KAAK,MAAM;AACV,UAAI,EAAE,WAAW,gBAAgB;AAChC,eAAO,KAAK,CAAC;AAAA,MACd;AACA,aAAO,EAAE,IAAI;AAAA,IACd;AAAA,IACA,KAAK,CAAC,UAAa,EAAE,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAAA,IACzC,QAAQ,CAAC,OAA0B;AAClC,YAAM,UAAU,EAAE,WAAW,iBAAiB,KAAK,CAAC,IAAK,EAAE,IAAI;AAC/D,QAAE,KAAK,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;AAAA,IAC7B;AAAA,IACA,WAAW,CAAC,OAA2B;AACtC,aAAO,EAAE,UAAU,CAAC,SAAmB;AACtC,mBAAW,CAAC,GAAG,CAAC,KAAK,MAAM;AAC1B,cAAI,MAAM,KAAM,IAAG,CAAM;AAAA,QAC1B;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IACA,MAAM,EAAE;AAAA,IACR,OAAO;AAAA,EACR;AACD;AAEA,SAAS,kBACR,MACA,OACA,SACoC;AACpC,QAAM,IAAI;AAAA,IACT,CAAC,QACA,KAAK,CAAI,MAAuB;AAC/B,YAAM,KAAK,EAAE;AACb,UAAI,GAAG,WAAW,gBAAgB;AACjC,aAAK,EAAE;AAAA,MACR;AACA,aAAO,IAAI,EAAE;AAAA,IACd,CAAC;AAAA,IACF;AAAA,MACC,GAAG;AAAA,MACH,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,IAClB;AAAA,EACD;AAEA,QAAM,SAA0B;AAAA,IAC/B,KAAK,MAAM;AACV,UAAI,EAAE,WAAW,gBAAgB;AAChC,eAAO,KAAK,CAAC;AAAA,MACd;AACA,aAAO,EAAE,IAAI;AAAA,IACd;AAAA,IACA,WAAW,CAAC,OAA2B;AACtC,aAAO,EAAE,UAAU,CAAC,SAAmB;AACtC,mBAAW,CAAC,GAAG,CAAC,KAAK,MAAM;AAC1B,cAAI,MAAM,KAAM,IAAG,CAAM;AAAA,QAC1B;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IACA,MAAM,EAAE;AAAA,IACR,OAAO;AAAA,EACR;AAEA,MAAI,OAAO;AACV,UAAM,QAAe,CAAI,MAAuB,EAAE,IAAI;AACtD,UAAM,QAAe,CAAI,GAAoB,UAAa,EAAE,IAAI,KAAK;AAErE,UAAM,WAAW;AACjB,aAAS,MAAM,CAAC,UAAa,MAAM,OAAO,OAAO,KAAK;AACtD,aAAS,SAAS,CAAC,OAA0B;AAC5C,YAAM,UAAU,EAAE,WAAW,iBAAiB,KAAK,CAAC,IAAK,EAAE,IAAI;AAC/D,aAAO,MAAM,OAAO,OAAO,GAAG,OAAO,CAAC;AAAA,IACvC;AACA,WAAO;AAAA,EACR;AAEA,SAAO;AACR;;;ACjMA;AAAA;AAAA;AAAA,cAAAA;AAAA,EAAA;AAAA;AAAA,aAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAoDA,IAAM,kBAAkB,oBAAI,QAAoC;AAChE,IAAM,iBAAiB,oBAAI,QAAoC;AAE/D,SAAS,QAAQC,OAAiBC,MAA0C;AAC3E,QAAM,YAAYA,KAAI,IAAID,KAAI;AAC9B,MAAI,WAAW;AACd,eAAW,MAAM,UAAW,IAAG;AAAA,EAChC;AACD;AAEA,SAAS,YAAeA,OAAe,QAAa,CAAC,GAAQ;AAC5D,MAAI,YAAY;AAChB,QAAM,QAAQ;AAAA,IACb,GAAG;AAAA,IACH,KAAK,MAAM,OAAOA,KAAI;AAAA,IACtB,WAAW,CAAC,OAA2B;AACtC,UAAI,cAAc,EAAG,SAAQA,OAAM,eAAe;AAClD;AACA,YAAM,MAAMA,MAAK,UAAU,CAAC,SAAmB;AAC9C,mBAAW,CAAC,GAAG,CAAC,KAAK,MAAM;AAC1B,cAAI,MAAM,KAAM,IAAG,CAAM;AAAA,QAC1B;AAAA,MACD,CAAC;AACD,SAAG,OAAOA,KAAI,CAAC;AACf,aAAO,MAAM;AACZ,YAAI;AACJ;AACA,YAAI,cAAc,EAAG,SAAQA,OAAM,cAAc;AAAA,MAClD;AAAA,IACD;AAAA,IACA,QAAQ,CAAC,OAA2B;AACnC,UAAI,cAAc,EAAG,SAAQA,OAAM,eAAe;AAClD;AACA,YAAM,MAAMA,MAAK,UAAU,CAAC,SAAmB;AAC9C,mBAAW,CAAC,GAAG,CAAC,KAAK,MAAM;AAC1B,cAAI,MAAM,KAAM,IAAG,CAAM;AAAA,QAC1B;AAAA,MACD,CAAC;AACD,aAAO,MAAM;AACZ,YAAI;AACJ;AACA,YAAI,cAAc,EAAG,SAAQA,OAAM,cAAc;AAAA,MAClD;AAAA,IACD;AAAA,IACA,OAAOA;AAAA,EACR;AACA,SAAO;AACR;AAEA,SAASE,MAAQ,GAAe;AAC/B,MAAI,MAAqB,EAAE,IAAI;AAC/B,MAAI;AACJ,QAAM,QAAQ,EAAE,UAAU,CAAC,SAAmB;AAC7C,eAAW,CAAC,GAAG,CAAC,KAAK,MAAM;AAC1B,UAAI,MAAM,KAAM,OAAM;AACtB,UAAI,MAAM,MAAO,OAAM;AAAA,IACxB;AAAA,EACD,CAAC;AACD,QAAM;AACN,MAAI,IAAK,OAAM;AACf,SAAO;AACR;AAEA,SAAS,OAAU,GAAe;AACjC,MAAI,EAAE,WAAW,gBAAgB;AAChC,WAAOA,MAAK,CAAC;AAAA,EACd;AACA,SAAO,EAAE,IAAI;AACd;AAUO,SAASC,MAAQ,SAAyB;AAChD,QAAM,IAAI,MAAS,SAAS;AAAA,IAC3B,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,EAClB,CAAC;AAED,SAAO,YAAY,GAAG;AAAA,IACrB,KAAK,CAAC,UAAa,EAAE,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAAA,EAC1C,CAAC;AACF;AA2BO,SAAS,SAAY,QAAa,IAA4C;AACpF,QAAM,aAAuD,MAAM,QAAQ,MAAM,IAC9E,SACA,CAAC,MAAM;AAEV,QAAM,IAAI;AAAA,IACT,CAAC,QAAgB;AAChB,YAAM,OAAO,WAAW,IAAI,CAAC,MAAM;AAClC,cAAMH,QAAO,EAAE;AACf,YAAIA,MAAK,WAAW,gBAAgB;AACnC,UAAAE,MAAKF,KAAI;AAAA,QACV;AACA,eAAO,IAAIA,KAAI;AAAA,MAChB,CAAC;AACD,aAAO,GAAG,GAAG,IAAI;AAAA,IAClB;AAAA,IACA;AAAA,MACC,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,QAAQ,OAAO;AAAA,IAChB;AAAA,EACD;AAEA,SAAO,YAAY,CAAC;AACrB;AAUO,SAASC,KAAuC,SAAwB;AAC9E,QAAM,IAAI,MAAS,SAAS;AAAA,IAC3B,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,QAAQ,MAAM;AAAA,EACf,CAAC;AAED,SAAO,YAAY,GAAG;AAAA,IACrB,KAAK,CAAC,UAAa,EAAE,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAAA,IACzC,QAAQ,CAAoB,KAAQ,UAAgB;AACnD,YAAM,UAAU,OAAO,CAAC;AACxB,QAAE,KAAK,CAAC,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC;AAAA,IAC9C;AAAA,EACD,CAAC;AACF;AAOO,SAAS,SAAY,OAAyC;AACpE,SAAO,MAAM,IAAI;AAClB;AAOO,SAAS,QAAQ,OAA0C,IAAsB;AACvF,QAAMD,QAAO,MAAM;AACnB,MAAI,YAAY,gBAAgB,IAAIA,KAAI;AACxC,MAAI,CAAC,WAAW;AACf,gBAAY,oBAAI,IAAI;AACpB,oBAAgB,IAAIA,OAAM,SAAS;AAAA,EACpC;AACA,YAAU,IAAI,EAAE;AACjB;AAOO,SAAS,OAAO,OAA0C,IAAsB;AACtF,QAAMA,QAAO,MAAM;AACnB,MAAI,YAAY,eAAe,IAAIA,KAAI;AACvC,MAAI,CAAC,WAAW;AACf,gBAAY,oBAAI,IAAI;AACpB,mBAAe,IAAIA,OAAM,SAAS;AAAA,EACnC;AACA,YAAU,IAAI,EAAE;AACjB;AAQO,SAAS,QACf,OACA,IACO;AACP,UAAQ,OAAO,MAAM;AACpB,UAAM,OAAO,GAAG;AAChB,QAAI,OAAO,SAAS,WAAY,QAAO,OAAO,IAAI;AAAA,EACnD,CAAC;AACF;AAOO,SAAS,OACf,QACA,OACA,IAC4B;AAC5B,SAAO,IAAI,SAAe;AACzB,QAAI;AACJ,UAAM,MAAM;AACX,eAAS,GAAG,GAAG,IAAI;AAAA,IACpB,CAAC;AACD,WAAO;AAAA,EACR;AACD;;;AChSA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,SAAS,aAAa,SAAS,QAAQ,4BAA4B;AAW5D,SAAS,aAAgBI,OAA8B;AAC7D,SAAO;AAAA,IACN,CAAC,kBAAkB;AAClB,UAAI,WAAW;AACf,YAAM,QAAQA,MAAK,UAAU,MAAM;AAClC,YAAI,CAAC,SAAU,eAAc;AAAA,MAC9B,CAAC;AACD,aAAO,MAAM;AACZ,mBAAW;AACX,cAAM;AAAA,MACP;AAAA,IACD;AAAA,IACA,MAAMA,MAAK,IAAI;AAAA,IACf,MAAMA,MAAK,IAAI;AAAA;AAAA,EAChB;AACD;AAUO,SAAS,SAAYA,OAAoD;AAC/E,QAAM,QAAQ,aAAaA,KAAI;AAC/B,QAAM,SAAS;AAAA,IACd,CAAC,MAAS;AACT,MAAAA,MAAK,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAAA,IAC/B;AAAA,IACA,CAACA,KAAI;AAAA,EACN;AACA,SAAO,CAAC,OAAO,MAAM;AACtB;AAiBO,SAAS,mBACf,UACA,SACe;AACf,QAAM,aAAa,OAAO,OAAO;AACjC,aAAW,UAAU;AAErB,QAAM,QAAQ,QAAQ,MAAM;AAC3B,UAAM,cAAc,MAAM;AACzB,YAAM,OAAO,CAAC;AACd,YAAM,OAAO,SAAS,IAAI,KAAK,CAAC;AAChC,iBAAW,OAAO,MAAM;AACvB,cAAM,QAAQ,WAAW,QAAQ,GAAG;AACpC,cAAM,SAAS,CAAC;AAChB,mBAAW,SAAS,OAAO,KAAK,KAAK,GAAkB;AACtD,iBAAO,KAAK,IAAI,MAAM,KAAK,EAAE,IAAI;AAAA,QAClC;AACA,aAAK,GAAG,IAAI;AAAA,MACb;AACA,aAAO;AAAA,IACR;AAEA,QAAI,kBAAkB,YAAY;AAElC,WAAO;AAAA,MACN,WAAW,CAAC,kBAA8B;AACzC,YAAI,WAAW;AACf,YAAI,YAA+B,CAAC;AAEpC,cAAM,iBAAiB,MAAM;AAC5B,qBAAW,SAAS,UAAW,OAAM;AACrC,sBAAY,CAAC;AAAA,QACd;AAEA,cAAM,OAAO,CAAC,aAAkB;AAC/B,yBAAe;AACf,qBAAW,OAAO,UAAU;AAC3B,kBAAM,QAAQ,WAAW,QAAQ,GAAG;AACpC,uBAAW,SAAS,OAAO,KAAK,KAAK,GAAkB;AACtD,oBAAM,QAAQ,MAAM,KAAK,EAAE,UAAU,MAAM;AAC1C,kCAAkB,YAAY;AAC9B,oBAAI,CAAC,SAAU,eAAc;AAAA,cAC9B,CAAC;AACD,wBAAU,KAAK,KAAK;AAAA,YACrB;AAAA,UACD;AACA,4BAAkB,YAAY;AAC9B,cAAI,CAAC,SAAU,eAAc;AAAA,QAC9B;AAEA,cAAM,YAAY,SAAS,UAAU,CAAC,SAAmB;AACxD,gBAAM,aAAa,KAAK,KAAK,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC;AAC1D,cAAI,CAAC,YAAY,WAAY,MAAK,SAAS,IAAI,KAAK,CAAC,CAAC;AAAA,QACvD,CAAC;AACD,aAAK,SAAS,IAAI,KAAK,CAAC,CAAC;AAEzB,eAAO,MAAM;AACZ,qBAAW;AACX,oBAAU;AACV,yBAAe;AAAA,QAChB;AAAA,MACD;AAAA,MACA,aAAa,MAAM;AAAA,IACpB;AAAA,EACD,GAAG,CAAC,QAAQ,CAAC;AAEb,SAAO,qBAAqB,MAAM,WAAW,MAAM,aAAa,MAAM,WAAW;AAClF;;;AC9IA;AAAA;AAAA;AAAA;AAoCA,IAAM,gBAA0B,CAAC;AAMjC,SAASC,MAAQ,GAAe;AAC/B,MAAI,MAAqB,EAAE,IAAI;AAC/B,QAAM,QAAQ,EAAE,UAAU,CAAC,SAAmB;AAC7C,eAAW,CAAC,GAAG,CAAC,KAAK,MAAM;AAC1B,UAAI,MAAM,KAAM,OAAM;AAAA,IACvB;AAAA,EACD,CAAC;AACD,QAAM;AACN,SAAO;AACR;AAcA,IAAM,cAAN,MAA6C;AAAA;AAAA,EAE5C;AAAA,EACiB;AAAA,EAEjB,YAAY,SAAY,MAAsB;AAC7C,SAAK,UAAW,MAAM,UAAU,OAAO;AACvC,SAAK,QAAQ,MAAS,SAAS;AAAA,MAC9B,GAAG;AAAA,MACH,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,IAClB,CAAC;AAAA,EACF;AAAA,EAEA,MAAS;AAER,UAAM,UAAU,cAAc,cAAc,SAAS,CAAC;AACtD,QAAI,SAAS;AACZ,UAAI,KAAK,MAAM,WAAW,gBAAgB;AACzC,QAAAA,MAAK,KAAK,KAAK;AAAA,MAChB;AACA,aAAO,QAAQ,KAAK,KAAK;AAAA,IAC1B;AAEA,QAAI,KAAK,MAAM,WAAW,gBAAgB;AACzC,aAAOA,MAAK,KAAK,KAAK;AAAA,IACvB;AACA,WAAO,KAAK,MAAM,IAAI;AAAA,EACvB;AAAA,EAEA,IAAI,OAAgB;AACnB,QAAI,KAAK,QAAQ,KAAK,IAAI,GAAG,KAAK,EAAG;AACrC,UAAM,MAAM;AACX,WAAK,MAAM,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC;AAAA,IACzC,CAAC;AAAA,EACF;AACD;AAaA,IAAM,iBAAN,MAAgD;AAAA;AAAA,EAE/C;AAAA,EAEA,YAAY,aAAsB,MAAsB;AACvD,SAAK,QAAQ;AAAA,MACZ,CAAC,QAAQ;AACR,sBAAc,KAAK,GAAG;AACtB,YAAI;AACH,iBAAO,YAAY;AAAA,QACpB,UAAE;AACD,wBAAc,IAAI;AAAA,QACnB;AAAA,MACD;AAAA,MACA;AAAA,QACC,GAAG;AAAA,QACH,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,MAClB;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAS;AAER,UAAM,UAAU,cAAc,cAAc,SAAS,CAAC;AACtD,QAAI,SAAS;AACZ,UAAI,KAAK,MAAM,WAAW,gBAAgB;AACzC,QAAAA,MAAK,KAAK,KAAK;AAAA,MAChB;AACA,aAAO,QAAQ,KAAK,KAAK;AAAA,IAC1B;AAEA,QAAI,KAAK,MAAM,WAAW,gBAAgB;AACzC,aAAOA,MAAK,KAAK,KAAK;AAAA,IACvB;AACA,WAAO,KAAK,MAAM,IAAI;AAAA,EACvB;AACD;AAQO,IAAM,SAAS;AAAA,EACrB,OAAO;AAAA,EACP,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYV,KAAK,CACJ,QACA,aAOkB;AAClB,UAAM,WACL,OAAO,aAAa,aACjB,EAAE,MAAM,UAAgC,OAAO,QAAW,UAAU,OAAU,IAC9E;AACJ,WAAO,OAAO,MAAM,UAAU,CAAC,SAAS;AACvC,iBAAW,CAAC,GAAG,CAAC,KAAK,MAAM;AAC1B,YAAI,MAAM,KAAM,UAAS,OAAO,CAAM;AACtC,YAAI,MAAM,MAAO,UAAS,QAAQ,CAAC;AACnC,YAAI,MAAM,SAAU,UAAS,WAAW;AAAA,MACzC;AAAA,IACD,CAAC;AAAA,EACF;AACD;;;ACpMA;AAAA;AAAA,kBAAAC;AAAA,EAAA,oBAAAC;AAAA,EAAA,0BAAAC;AAAA;AAaA,SAAS,cAAc,UAAU,iBAAiB;AAW3C,SAASC,cAAgBC,OAAwC;AACvE,QAAM,CAAC,OAAO,QAAQ,IAAI,aAAaA,MAAK,IAAI,GAAG,EAAE,QAAQ,MAAM,CAAC;AAEpE,QAAM,QAAQA,MAAK,UAAU,MAAM;AAClC,aAAS,MAAMA,MAAK,IAAI,CAAC;AAAA,EAC1B,CAAC;AAED,MAAI,SAAS,GAAG;AACf,cAAU,MAAM,MAAM,CAAC;AAAA,EACxB,WAAW,OAAO,YAAY,aAAa;AAC1C,YAAQ;AAAA,MACP;AAAA,IACD;AAAA,EACD;AAEA,SAAO;AACR;AAOO,SAASC,UAAYD,OAA0D;AACrF,QAAM,QAAQD,cAAaC,KAAI;AAC/B,QAAM,SAAS,CAAC,MAAS;AACxB,IAAAA,MAAK,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAAA,EAC/B;AACA,SAAO,CAAC,OAAO,MAAM;AACtB;AAYO,SAASE,oBACf,UACA,SACyB;AACzB,QAAM,CAAC,OAAO,QAAQ,IAAI,aAAa,CAAC,GAAmB,EAAE,QAAQ,MAAM,CAAC;AAC5E,MAAI,YAA+B,CAAC;AAEpC,QAAM,iBAAiB,MAAM;AAC5B,eAAW,SAAS,UAAW,OAAM;AACrC,gBAAY,CAAC;AAAA,EACd;AAEA,QAAM,gBAAgB,MAAoB;AACzC,UAAM,OAAO,CAAC;AACd,eAAW,OAAO,SAAS,IAAI,KAAK,CAAC,GAAG;AACvC,YAAM,QAAQ,QAAQ,GAAG;AACzB,YAAM,SAAS,CAAC;AAChB,iBAAW,SAAS,OAAO,KAAK,KAAK,GAAkB;AACtD,eAAO,KAAK,IAAI,MAAM,KAAK,EAAE,IAAI;AAAA,MAClC;AACA,WAAK,GAAG,IAAI;AAAA,IACb;AACA,WAAO;AAAA,EACR;AAEA,QAAM,OAAO,CAAC,aAAkB;AAC/B,mBAAe;AACf,eAAW,OAAO,UAAU;AAC3B,YAAM,QAAQ,QAAQ,GAAG;AACzB,iBAAW,SAAS,OAAO,KAAK,KAAK,GAAkB;AACtD,cAAM,QAAQ,MAAM,KAAK,EAAE,UAAU,MAAM;AAC1C,mBAAS,MAAM,cAAc,CAAC;AAAA,QAC/B,CAAC;AACD,kBAAU,KAAK,KAAK;AAAA,MACrB;AAAA,IACD;AACA,aAAS,MAAM,cAAc,CAAC;AAAA,EAC/B;AAEA,QAAM,YAAY,SAAS,UAAU,CAAC,SAAmB;AACxD,QAAI,KAAK,KAAK,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG;AAC7C,WAAK,SAAS,IAAI,KAAK,CAAC,CAAC;AAAA,IAC1B;AAAA,EACD,CAAC;AACD,OAAK,SAAS,IAAI,KAAK,CAAC,CAAC;AAEzB,MAAI,SAAS,GAAG;AACf,cAAU,MAAM;AACf,gBAAU;AACV,qBAAe;AAAA,IAChB,CAAC;AAAA,EACF,WAAW,OAAO,YAAY,aAAa;AAC1C,YAAQ;AAAA,MACP;AAAA,IACD;AAAA,EACD;AAEA,SAAO;AACR;;;AC3HA;AAAA;AAAA,kBAAAC;AAAA,EAAA,oBAAAC;AAAA,EAAA,0BAAAC;AAAA;AAiCO,SAASC,cAAgBC,OAA8C;AAC7E,SAAO;AAAA,IACN,UAAU,KAAiD;AAC1D,YAAM,QAAQA,MAAK,UAAU,MAAM;AAClC,YAAIA,MAAK,IAAI,CAAC;AAAA,MACf,CAAC;AACD,UAAIA,MAAK,IAAI,CAAC;AACd,aAAO;AAAA,IACR;AAAA,EACD;AACD;AAQO,SAASC,UAAYD,OAA8C;AACzE,SAAO;AAAA,IACN,UAAU,KAAiD;AAC1D,YAAM,QAAQA,MAAK,UAAU,MAAM;AAClC,YAAIA,MAAK,IAAI,CAAC;AAAA,MACf,CAAC;AACD,UAAIA,MAAK,IAAI,CAAC;AACd,aAAO;AAAA,IACR;AAAA,IACA,IAAI,OAAsB;AACzB,MAAAA,MAAK,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC;AAAA,IACnC;AAAA,IACA,OAAO,SAAkD;AACxD,YAAM,OAAO,QAAQA,MAAK,IAAI,CAAC;AAC/B,MAAAA,MAAK,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;AAAA,IAClC;AAAA,EACD;AACD;AAYO,SAASE,oBACf,UACA,SAC+B;AAC/B,SAAO;AAAA,IACN,UAAU,KAAgD;AACzD,UAAI,YAA+B,CAAC;AAEpC,YAAM,iBAAiB,MAAM;AAC5B,mBAAW,SAAS,UAAW,OAAM;AACrC,oBAAY,CAAC;AAAA,MACd;AAEA,YAAM,gBAAgB,MAAoB;AACzC,cAAM,OAAO,CAAC;AACd,mBAAW,OAAO,SAAS,IAAI,KAAK,CAAC,GAAG;AACvC,gBAAM,QAAQ,QAAQ,GAAG;AACzB,gBAAM,SAAS,CAAC;AAChB,qBAAW,SAAS,OAAO,KAAK,KAAK,GAAkB;AACtD,mBAAO,KAAK,IAAI,MAAM,KAAK,EAAE,IAAI;AAAA,UAClC;AACA,eAAK,GAAG,IAAI;AAAA,QACb;AACA,eAAO;AAAA,MACR;AAEA,YAAM,OAAO,CAAC,aAAkB;AAC/B,uBAAe;AACf,mBAAW,OAAO,UAAU;AAC3B,gBAAM,QAAQ,QAAQ,GAAG;AACzB,qBAAW,SAAS,OAAO,KAAK,KAAK,GAAkB;AACtD,kBAAM,QAAQ,MAAM,KAAK,EAAE,UAAU,MAAM;AAC1C,kBAAI,cAAc,CAAC;AAAA,YACpB,CAAC;AACD,sBAAU,KAAK,KAAK;AAAA,UACrB;AAAA,QACD;AACA,YAAI,cAAc,CAAC;AAAA,MACpB;AAEA,YAAM,YAAY,SAAS,UAAU,CAAC,SAAmB;AACxD,YAAI,KAAK,KAAK,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG;AAC7C,eAAK,SAAS,IAAI,KAAK,CAAC,CAAC;AAAA,QAC1B;AAAA,MACD,CAAC;AACD,WAAK,SAAS,IAAI,KAAK,CAAC,CAAC;AAEzB,aAAO,MAAM;AACZ,kBAAU;AACV,uBAAe;AAAA,MAChB;AAAA,IACD;AAAA,EACD;AACD;;;ACrIA;AAAA;AAAA,kBAAAC;AAAA,EAAA,oBAAAC;AAAA,EAAA,0BAAAC;AAAA;AAaA;AAAA,EACC,YAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,OACM;AAQA,SAASC,cAAgBC,OAA6C;AAC5E,QAAM,MAAM,WAAWA,MAAK,IAAI,CAAC;AAEjC,QAAM,QAAQA,MAAK,UAAU,MAAM;AAClC,QAAI,QAAQA,MAAK,IAAI;AAAA,EACtB,CAAC;AAED,MAAI,gBAAgB,GAAG;AACtB,mBAAe,MAAM,MAAM,CAAC;AAAA,EAC7B,WAAW,OAAO,YAAY,aAAa;AAC1C,YAAQ;AAAA,MACP;AAAA,IACD;AAAA,EACD;AAEA,SAAO,SAAS,GAAG;AACpB;AAOO,SAASC,UAAYD,OAAmC;AAC9D,QAAM,QAAQ,WAAWA,MAAK,IAAI,CAAC;AAEnC,QAAM,QAAQA,MAAK,UAAU,MAAM;AAClC,UAAM,QAAQA,MAAK,IAAI;AAAA,EACxB,CAAC;AAED,MAAI,gBAAgB,GAAG;AACtB,mBAAe,MAAM,MAAM,CAAC;AAAA,EAC7B,WAAW,OAAO,YAAY,aAAa;AAC1C,YAAQ;AAAA,MACP;AAAA,IACD;AAAA,EACD;AAEA,SAAOE,UAAS;AAAA,IACf,KAAK,MAAM,MAAM;AAAA,IACjB,KAAK,CAAC,MAAqB;AAC1B,MAAAF,MAAK,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAAA,IAC/B;AAAA,EACD,CAAC;AACF;AAYO,SAASG,oBACf,MACA,SAC8B;AAC9B,QAAM,SAAS,WAAyB,CAAC,CAAiB;AAG1D,QAAM,aAAa,oBAAI,IAA+C;AACtE,MAAI,WAAW;AAEf,MAAI,eAAe;AACnB,WAAS,gBAAgB;AACxB,QAAI,aAAc;AAClB,mBAAe;AACf,mBAAe,MAAM;AACpB,UAAI,SAAU;AACd,qBAAe;AACf,YAAM,OAAO,CAAC;AACd,iBAAW,CAAC,KAAK,KAAK,KAAK,YAAY;AACtC,aAAK,GAAG,IAAI,EAAE,GAAG,MAAM,OAAO;AAAA,MAC/B;AACA,aAAO,QAAQ;AAAA,IAChB,CAAC;AAAA,EACF;AAEA,WAAS,KAAK,SAAc;AAC3B,eAAW,SAAS,WAAW,OAAO,GAAG;AACxC,iBAAW,SAAS,MAAM,KAAM,OAAM;AAAA,IACvC;AACA,eAAW,MAAM;AAEjB,eAAW,OAAO,SAAS;AAC1B,YAAM,QAAQ,QAAQ,GAAG;AACzB,YAAM,SAAS,OAAO,KAAK,KAAK;AAChC,YAAM,SAAS,CAAC;AAChB,YAAM,OAA0B,CAAC;AAEjC,iBAAW,SAAS,QAAQ;AAC3B,cAAMH,QAAO,MAAM,KAAK;AACxB,eAAO,KAAK,IAAIA,MAAK,IAAI;AACzB,cAAM,QAAQA,MAAK,UAAU,MAAM;AAClC,iBAAO,KAAK,IAAIA,MAAK,IAAI;AACzB,wBAAc;AAAA,QACf,CAAC;AACD,aAAK,KAAK,KAAK;AAAA,MAChB;AAEA,iBAAW,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC;AAAA,IACrC;AAEA,UAAM,OAAO,CAAC;AACd,eAAW,CAAC,KAAK,KAAK,KAAK,YAAY;AACtC,WAAK,GAAG,IAAI,EAAE,GAAG,MAAM,OAAO;AAAA,IAC/B;AACA,WAAO,QAAQ;AAAA,EAChB;AAEA,QAAM,WAAW,MAAW;AAC3B,UAAM,UAAU,OAAO,SAAS,aAAa,KAAK,IAAI,MAAM,IAAI,IAAI,KAAK,QAAQ;AACjF,WAAO,CAAC,GAAI,WAAW,CAAC,CAAE;AAAA,EAC3B;AAEA,QAAM,UAAU,CAAC,YAAY,KAAK,WAAW,CAAC,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAErE,MAAI,gBAAgB,GAAG;AACtB,mBAAe,MAAM;AACpB,iBAAW;AACX,iBAAW,SAAS,WAAW,OAAO,GAAG;AACxC,mBAAW,SAAS,MAAM,KAAM,OAAM;AAAA,MACvC;AACA,iBAAW,MAAM;AAAA,IAClB,CAAC;AAAA,EACF,WAAW,OAAO,YAAY,aAAa;AAC1C,YAAQ;AAAA,MACP;AAAA,IACD;AAAA,EACD;AAEA,SAAO,SAAS,MAAM;AACvB;;;ACtKA;AAAA;AAAA;AAAA;AAmCO,SAAS,OAAyB,aAAmD;AAC3F,QAAM,IAAI,IAAI,MAAM,SAAS;AAC7B,QAAM,IAAI,MAAa,QAA2B,EAAE,MAAM,QAAQ,CAAC;AACnE,IAAE,IAAI,SAAS,CAAC;AAEhB,QAAM,WAAW,MAAM,EAAE,IAAI;AAC7B,QAAM,WAAW,CAAC,SAAc,YAA4B;AAC3D,UAAM,OAAO,SAAS;AACtB,UAAM,OAAO,OAAO,YAAY,aAAa,QAAQ,IAAI,IAAI;AAC7D,UAAM,YAAY,UAAU,OAAO,EAAE,GAAG,MAAM,GAAG,KAAK;AACtD,MAAE,KAAK,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC;AAAA,EAC3B;AAEA,QAAM,MAAmB;AAAA,IACxB;AAAA,IACA;AAAA,IACA,iBAAiB,MAAM;AAAA,IACvB,WAAW,CAAC,aAAa;AACxB,UAAI,OAAO,SAAS;AACpB,aAAO,EAAE,UAAU,CAAC,SAAS;AAC5B,mBAAW,CAAC,GAAG,CAAC,KAAK,MAAM;AAC1B,cAAI,MAAM,MAAM;AACf,qBAAS,GAAQ,IAAI;AACrB,mBAAO;AAAA,UACR;AAAA,QACD;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IACA,SAAS,EAAE,QAAQ,KAAK,CAAC;AAAA,EAC1B;AAEA,QAAM,eAAe,YAAY,UAAU,UAAU,GAAG;AACxD,IAAE,KAAK,CAAC,CAAC,MAAM,YAAY,CAAC,CAAC;AAE7B,SAAO,OAAO,OAAO,GAAG,GAAG;AAC5B;;;ACtEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2HO,SAAS,MACf,WACA,YACA,eACA,WAAW,GACF;AACT,MAAI,CAAC,OAAO,SAAS,SAAS,EAAG,QAAO;AACxC,MAAI,CAAC,OAAO,SAAS,UAAU,KAAK,cAAc,EAAG,QAAO,KAAK,IAAI,UAAU,SAAS;AACxF,MAAI,CAAC,OAAO,SAAS,aAAa,KAAK,iBAAiB,EAAG,QAAO,KAAK,IAAI,UAAU,SAAS;AAC9F,QAAM,UAAU,YAAY,KAAK,IAAI,CAAC,gBAAgB,UAAU;AAChE,SAAO,KAAK,IAAI,UAAU,OAAO;AAClC;AAEA,SAAS,cAAc,SAAmC;AACzD,MAAI,YAAY,UAAa,UAAU,GAAG;AACzC,UAAM,IAAI,WAAW,sBAAsB;AAAA,EAC5C;AACD;AAEA,SAAS,QAAc,GAAiC;AACvD,SAAO,IAAI,IAAI,CAAC;AACjB;AAEA,SAAS,QAAcI,OAAkD;AACxE,SAAOA,MAAK,IAAI,KAAK,oBAAI,IAAU;AACpC;AAEA,SAAS,UAAaA,OAAgD;AACrE,SAAOA,MAAK,IAAI,KAAK,CAAC;AACvB;AAEA,SAAS,iBAAiB,GAAsB,GAA8B;AAC7E,QAAM,IAAI,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM;AACrC,MAAI,MAAM;AACV,MAAI,KAAK;AACT,MAAI,KAAK;AACT,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;AAC9B,UAAM,KAAK,EAAE,CAAC,KAAK;AACnB,UAAM,KAAK,EAAE,CAAC,KAAK;AACnB,WAAO,KAAK;AACZ,UAAM,KAAK;AACX,UAAM,KAAK;AAAA,EACZ;AACA,MAAI,OAAO,KAAK,OAAO,EAAG,QAAO;AACjC,SAAO,MAAM,KAAK,KAAK,KAAK,EAAE;AAC/B;AAEO,SAAS,gBAAmB,OAA+B,CAAC,GAA6B;AAC/F,QAAM,UAAU,KAAK;AACrB,QAAMC,UAAS,KAAK,UAAU;AAC9B,gBAAc,OAAO;AAErB,QAAM,UAAU,MAAoD,oBAAI,IAAI,GAAG;AAAA,IAC9E,MAAM,KAAK;AAAA,IACX,cAAc;AAAA,EACf,CAAC;AAED,WAAS,cAAc,MAAkD;AACxE,QAAI,YAAY,OAAW;AAC3B,WAAO,KAAK,OAAO,SAAS;AAC3B,UAAI;AACJ,iBAAW,SAAS,KAAK,OAAO,GAAG;AAClC,YAAI,CAAC,QAAQ;AACZ,mBAAS;AACT;AAAA,QACD;AACA,cAAM,MAAMA,YAAW,QAAQ,MAAM,eAAe,MAAM;AAC1D,cAAM,MAAMA,YAAW,QAAQ,OAAO,eAAe,OAAO;AAC5D,YAAI,MAAM,IAAK,UAAS;AAAA,MACzB;AACA,UAAI,CAAC,OAAQ;AACb,WAAK,OAAO,OAAO,EAAE;AAAA,IACtB;AAAA,EACD;AAEA,WAAS,OAAO,MAAkD;AACjE,YAAQ,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;AAAA,EAC5B;AAEA,SAAO;AAAA,IACN;AAAA,IACA,OAAO,IAAI,OAAO;AACjB,YAAM,MAAM,YAAY;AACxB,YAAM,UAAU,QAAQ,OAAO;AAC/B,YAAM,OAAO,QAAQ,IAAI,EAAE;AAC3B,YAAM,OAAO,QAAQ,OAAO;AAC5B,WAAK,IAAI,IAAI;AAAA,QACZ;AAAA,QACA;AAAA,QACA,aAAa,MAAM,eAAe;AAAA,QAClC,cAAc;AAAA,MACf,CAAC;AACD,oBAAc,IAAI;AAClB,aAAO,IAAI;AAAA,IACZ;AAAA,IACA,OAAO,IAAI;AACV,YAAM,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACrC,UAAI,CAAC,KAAK,OAAO,EAAE,EAAG;AACtB,aAAO,IAAI;AAAA,IACZ;AAAA,IACA,QAAQ;AACP,UAAI,QAAQ,OAAO,EAAE,SAAS,EAAG;AACjC,aAAO,oBAAI,IAAI,CAAC;AAAA,IACjB;AAAA,IACA,IAAI,IAAI;AACP,YAAM,UAAU,QAAQ,OAAO;AAC/B,YAAM,QAAQ,QAAQ,IAAI,EAAE;AAC5B,UAAI,CAAC,MAAO,QAAO;AACnB,UAAIA,YAAW,OAAO;AACrB,cAAM,MAAM,YAAY;AACxB,cAAM,OAAO,QAAQ,OAAO;AAC5B,aAAK,IAAI,IAAI,EAAE,GAAG,OAAO,cAAc,IAAI,CAAC;AAC5C,eAAO,IAAI;AAAA,MACZ;AACA,aAAO,MAAM;AAAA,IACd;AAAA,IACA,IAAI,IAAI;AACP,aAAO,QAAQ,OAAO,EAAE,IAAI,EAAE;AAAA,IAC/B;AAAA,EACD;AACD;AAEO,SAAS,WAAc,MAAc,OAA6B,CAAC,GAAuB;AAChG,QAAM,UAAU,KAAK;AACrB,QAAMA,UAAS,KAAK,UAAU;AAC9B,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,WAAW,KAAK,YAAY;AAClC,QAAM,UAAU,KAAK,UAAU,MAAM;AACrC,gBAAc,OAAO;AAErB,QAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,QAAM,QAAQ,MAA+C,oBAAI,IAAI,GAAG;AAAA,IACvE,MAAM;AAAA,IACN,cAAc;AAAA,EACf,CAAC;AACD,QAAM,SAAS;AAAA,IACd,CAAC,KAAK;AAAA,IACN,CAAC,CAAC,QAAQ,MAAM;AACf,YAAM,QAAS,YAAY,oBAAI,IAAI;AACnC,YAAM,MAAM,YAAY;AACxB,YAAMC,OAAM,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC,UAAU;AAC9C,cAAM,cAAc,MAAM,MAAM,gBAAgB;AAChD,eAAO;AAAA,UACN,GAAG;AAAA,UACH,OAAO,MAAM,MAAM,WAAW,YAAY,WAAW,QAAQ;AAAA,QAC9D;AAAA,MACD,CAAC;AACD,MAAAA,KAAI,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY;AACvE,aAAOA;AAAA,IACR;AAAA,IACA,EAAE,MAAM,UAAU,cAAc,UAAU;AAAA,EAC3C;AACA,QAAM,OAAO;AAAA,IACZ,CAAC,KAAK;AAAA,IACN,CAAC,CAAC,QAAQ,OAAQ,YAAY,oBAAI,IAAI,GAA+C;AAAA,IACrF;AAAA,MACC,MAAM;AAAA,MACN,cAAc;AAAA,MACd,SAAS;AAAA,IACV;AAAA,EACD;AACA,OAAK,OAAO,UAAU,MAAM,MAAS;AACrC,OAAK,KAAK,UAAU,MAAM,MAAS;AAEnC,QAAM,IAAI,SAAS,KAAK;AACxB,QAAM,IAAI,UAAU,MAAM;AAC1B,QAAM,IAAI,QAAQ,IAAI;AACtB,QAAM,QAAQ,SAAS,QAAQ;AAC/B,QAAM,QAAQ,SAAS,MAAM;AAE7B,WAAS,UAAU,OAA2B,KAAqB;AAClE,UAAM,cAAc,MAAM,MAAM,gBAAgB;AAChD,WAAO,MAAM,MAAM,WAAW,YAAY,WAAW,QAAQ;AAAA,EAC9D;AAEA,WAAS,cAAc,MAA6C;AACnE,QAAI,YAAY,OAAW;AAC3B,WAAO,KAAK,OAAO,SAAS;AAC3B,YAAM,MAAM,YAAY;AACxB,UAAI;AACJ,UAAI,cAAc,OAAO;AACzB,iBAAW,SAAS,KAAK,OAAO,GAAG;AAClC,cAAM,QAAQ,UAAU,OAAO,GAAG;AAClC,YAAI,QAAQ,aAAa;AACxB,mBAAS;AACT,wBAAc;AACd;AAAA,QACD;AACA,YAAI,UAAU,eAAe,QAAQ;AACpC,gBAAM,MAAMD,YAAW,QAAQ,MAAM,eAAe,MAAM;AAC1D,gBAAM,MAAMA,YAAW,QAAQ,OAAO,eAAe,OAAO;AAC5D,cAAI,MAAM,IAAK,UAAS;AAAA,QACzB;AAAA,MACD;AACA,UAAI,CAAC,OAAQ;AACb,WAAK,OAAO,OAAO,EAAE;AAAA,IACtB;AAAA,EACD;AAEA,WAAS,OAAO,MAA6C;AAC5D,UAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;AAAA,EAC1B;AAEA,QAAM,MAAM,OAAO,OAAO,OAAO;AAAA,IAChC,OAAO,IAAY,OAAU,YAAiC;AAC7D,YAAM,MAAM,YAAY;AACxB,YAAM,UAAU,QAAQ,KAAK;AAC7B,YAAM,OAAO,QAAQ,IAAI,EAAE;AAC3B,YAAM,YAAY,YAAY,SAAS,QAAQ,KAAK;AACpD,YAAM,OAAO,QAAQ,OAAO;AAC5B,WAAK,IAAI,IAAI;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa,MAAM,eAAe;AAAA,QAClC,cAAc;AAAA,MACf,CAAC;AACD,oBAAc,IAAI;AAClB,aAAO,IAAI;AAAA,IACZ;AAAA,IACA,OAAO,IAAY;AAClB,YAAM,OAAO,QAAQ,QAAQ,KAAK,CAAC;AACnC,UAAI,CAAC,KAAK,OAAO,EAAE,EAAG;AACtB,aAAO,IAAI;AAAA,IACZ;AAAA,IACA,QAAQ;AACP,UAAI,QAAQ,KAAK,EAAE,SAAS,EAAG;AAC/B,aAAO,oBAAI,IAAI,CAAC;AAAA,IACjB;AAAA,IACA,QAAQ,IAA4C;AACnD,YAAM,UAAU,QAAQ,KAAK;AAC7B,YAAM,QAAQ,QAAQ,IAAI,EAAE;AAC5B,UAAI,CAAC,MAAO,QAAO;AACnB,UAAIA,YAAW,OAAO;AACrB,cAAM,OAAO,QAAQ,OAAO;AAC5B,aAAK,IAAI,IAAI,EAAE,GAAG,OAAO,cAAc,YAAY,EAAE,CAAC;AACtD,eAAO,IAAI;AAAA,MACZ;AACA,aAAO;AAAA,IACR;AAAA,EACD,CAAC;AACD,SAAO;AACR;AAEO,SAAS,YAAmB,OAAkC,CAAC,GAA6B;AAClG,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,YAAY,KAAK;AACvB,MAAI;AACJ,MAAI,YAAY,QAAQ;AACvB,WAAO,KAAK,cAAc;AAC1B,QAAI,CAAC,MAAM;AACV,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,QAAM,UAAU,MAAgD,oBAAI,IAAI,GAAG;AAAA,IAC1E,cAAc;AAAA,IACd,MAAM;AAAA,EACP,CAAC;AAED,WAAS,gBAAgB,QAAiC;AACzD,QAAI,cAAc,UAAa,OAAO,WAAW,WAAW;AAC3D,YAAM,IAAI;AAAA,QACT,uCAAuC,SAAS,SAAS,OAAO,MAAM;AAAA,MACvE;AAAA,IACD;AAAA,EACD;AAEA,WAAS,OAAO,MAA8C;AAC7D,YAAQ,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;AAAA,EAC5B;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,OAAO,IAAI,QAAQ,MAAM;AACxB,sBAAgB,MAAM;AACtB,YAAM,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACrC,WAAK,IAAI,IAAI,EAAE,IAAI,QAAQ,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC;AAC9C,UAAI,YAAY,OAAQ,MAAM,OAAO,IAAI,QAAQ,IAAI;AACrD,aAAO,IAAI;AAAA,IACZ;AAAA,IACA,OAAO,IAAI;AACV,YAAM,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACrC,UAAI,CAAC,KAAK,OAAO,EAAE,EAAG;AACtB,UAAI,YAAY,OAAQ,MAAM,OAAO,EAAE;AACvC,aAAO,IAAI;AAAA,IACZ;AAAA,IACA,QAAQ;AACP,UAAI,QAAQ,OAAO,EAAE,SAAS,EAAG;AACjC,UAAI,YAAY,OAAQ,MAAM,MAAM;AACpC,aAAO,oBAAI,IAAI,CAAC;AAAA,IACjB;AAAA,IACA,OAAO,OAAO,IAAI,GAAG;AACpB,sBAAgB,KAAK;AACrB,UAAI,KAAK,EAAG,QAAO,CAAC;AACpB,UAAI,YAAY,OAAQ,QAAO,KAAM,OAAO,OAAO,CAAC;AACpD,YAAM,SAAS,CAAC,GAAG,QAAQ,OAAO,EAAE,OAAO,CAAC,EAC1C,IAAI,CAAC,SAAS;AAAA,QACd,IAAI,IAAI;AAAA,QACR,OAAO,iBAAiB,OAAO,IAAI,MAAM;AAAA,QACzC,MAAM,IAAI;AAAA,MACX,EAAE,EACD,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,CAAC;AACZ,aAAO;AAAA,IACR;AAAA,EACD;AACD;AAEO,SAAS,eACf,MAC0C;AAC1C,QAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,QAAM,WAAW,MAAoC,oBAAI,IAAI,GAAG;AAAA,IAC/D,MAAM;AAAA,IACN,cAAc;AAAA,EACf,CAAC;AACD,QAAM,QAAQ,MAA+C,CAAC,GAAG;AAAA,IAChE,MAAM;AAAA,IACN,cAAc;AAAA,EACf,CAAC;AACD,QAAM,YAAY;AAAA,IACjB,CAAC,KAAK;AAAA,IACN,CAAC,CAAC,IAAI,MAAM;AACX,YAAM,QAAS,QAAQ,CAAC;AACxB,YAAMC,OAAM,oBAAI,IAAqD;AACrE,iBAAW,QAAQ,OAAO;AACzB,cAAM,OAAOA,KAAI,IAAI,KAAK,IAAI,KAAK,CAAC;AACpC,QAAAA,KAAI,IAAI,KAAK,MAAM,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;AAAA,MAClD;AACA,aAAOA;AAAA,IACR;AAAA,IACA,EAAE,MAAM,aAAa,cAAc,WAAW,SAAS,oBAAI,IAAI,EAAE;AAAA,EAClE;AACA,OAAK,UAAU,UAAU,MAAM,MAAS;AAExC,QAAM,IAAI,YAAY,QAAQ;AAC9B,QAAM,IAAI,SAAS,KAAK;AACxB,QAAM,IAAI,aAAa,SAAS;AAChC,QAAM,QAAQ,SAAS,WAAW;AAElC,WAAS,eAAe,MAAkC;AACzD,aAAS,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;AAAA,EAC7B;AAEA,WAAS,YAAY,MAAqD;AACzE,UAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;AAAA,EAC1B;AAEA,QAAM,MAAM,OAAO,OAAO,OAAO;AAAA,IAChC,aAAa,IAAY,OAAgB;AACxC,YAAM,OAAO,QAAQ,QAAQ,QAAQ,CAAC;AACtC,WAAK,IAAI,IAAI,KAAK;AAClB,qBAAe,IAAI;AAAA,IACpB;AAAA,IACA,aAAa,IAAY;AACxB,YAAM,eAAe,QAAQ,QAAQ,QAAQ,CAAC;AAC9C,YAAM,UAAU,aAAa,OAAO,EAAE;AACtC,YAAM,eAAe,UAAU,KAAK;AACpC,YAAM,YAAY,aAAa,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,KAAK,OAAO,EAAE;AAClF,UAAI,CAAC,WAAW,UAAU,WAAW,aAAa,OAAQ;AAC1D,qBAAe,YAAY;AAC3B,kBAAY,SAAS;AAAA,IACtB;AAAA,IACA,KAAK,MAAc,IAAY,UAAqB,SAAS,GAAG;AAC/D,YAAM,MAAM,GAAG,IAAI,KAAS,EAAE,KAAS,QAAQ;AAC/C,YAAM,eAAe,UAAU,KAAK;AACpC,YAAM,WAAW,IAAI;AAAA,QACpB,aAAa,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,KAAS,KAAK,EAAE,KAAS,KAAK,QAAQ,EAAE;AAAA,MAChF;AACA,YAAM,OAAO,CAAC,GAAG,YAAY;AAC7B,UAAI,SAAS,IAAI,GAAG,GAAG;AACtB,iBAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACxC,gBAAM,OAAO,KAAK,CAAC;AACnB,cAAI,KAAK,SAAS,QAAQ,KAAK,OAAO,MAAM,KAAK,aAAa,UAAU;AACvE,iBAAK,CAAC,IAAI,EAAE,GAAG,MAAM,OAAO;AAC5B;AAAA,UACD;AAAA,QACD;AAAA,MACD,OAAO;AACN,aAAK,KAAK,EAAE,MAAM,IAAI,UAAU,OAAO,CAAC;AAAA,MACzC;AACA,kBAAY,IAAI;AAAA,IACjB;AAAA,IACA,OAAO,MAAc,IAAY,UAAsB;AACtD,YAAM,eAAe,UAAU,KAAK;AACpC,YAAM,OAAO,aAAa;AAAA,QAAO,CAAC,SACjC,aAAa,SACV,EAAE,KAAK,SAAS,QAAQ,KAAK,OAAO,MACpC,EAAE,KAAK,SAAS,QAAQ,KAAK,OAAO,MAAM,KAAK,aAAa;AAAA,MAChE;AACA,UAAI,KAAK,WAAW,aAAa,OAAQ;AACzC,kBAAY,IAAI;AAAA,IACjB;AAAA,IACA,QAAQ,IAAY,UAA+D;AAClF,aAAO,UAAU,KAAK,EAAE;AAAA,QACvB,CAAC,UACC,KAAK,SAAS,MAAM,KAAK,OAAO,QAChC,aAAa,UAAa,KAAK,aAAa;AAAA,MAC/C;AAAA,IACD;AAAA,EACD,CAAC;AACD,SAAO;AACR;;;AD/ZA,SAAS,OAAO,MAAc,OAA0D;AACvF,SAAO;AAAA,IACN,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,GAAI,SAAS,CAAC;AAAA,EACf;AACD;AAEA,SAAS,UAAU,GAA8B;AAChD,SAAO,EAAE,UAAU,MAAM,MAAS;AACnC;AAEA,SAAS,cAAc,GAAuC;AAC7D,SAAO,KAAK,QAAQ,OAAQ,EAA2B,SAAS;AACjE;AAEA,SAAS,WAAW,GAAgC;AACnD,SACC,OAAO,MAAM,YACb,MAAM,QACN,eAAe,KACf,OAAQ,EAAoB,cAAc,cAC1C,SAAS,KACT,OAAQ,EAAoB,QAAQ;AAEtC;AAEA,SAAS,oBAAoB,GAAyC;AACrE,SACC,KAAK,QACL,OAAO,MAAM,YACb,OAAO,iBAAiB,KACxB,OAAQ,EAA6B,OAAO,aAAa,MAAM;AAEjE;AAEA,IAAM,qBAAqB;AAG3B,SAAS,kBACR,UACA,MACmB;AAEnB,MAAK,SAAiC,WAAW,WAAW;AAC3D,UAAM,YAAY,SAAS,IAAI;AAC/B,QAAI,cAAc,QAAW;AAC5B,aAAO,QAAQ,QAAQ,SAAS;AAAA,IACjC;AAAA,EACD;AACA,QAAM,YAAY,MAAM,aAAa;AACrC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACvC,QAAI;AACJ,UAAM,UAAU,MAAM;AACrB,UAAI,UAAU,OAAW,cAAa,KAAK;AAAA,IAC5C;AACA,UAAM,QAAQ,SAAS,UAAU,CAAC,aAAa;AAC9C,iBAAW,OAAO,UAAU;AAC3B,YAAI,IAAI,CAAC,MAAM,MAAM;AACpB,kBAAQ;AACR,gBAAM;AACN,kBAAQ,IAAI,CAAC,CAAC;AACd;AAAA,QACD;AACA,YAAI,IAAI,CAAC,MAAM,OAAO;AACrB,kBAAQ;AACR,gBAAM;AACN,iBAAO,IAAI,CAAC,CAAC;AACb;AAAA,QACD;AACA,YAAI,IAAI,CAAC,MAAM,UAAU;AACxB,kBAAQ;AACR,gBAAM;AACN,iBAAO,IAAI,MAAM,wDAAwD,CAAC;AAC1E;AAAA,QACD;AAAA,MACD;AAAA,IACD,CAAC;AACD,YAAQ,WAAW,MAAM;AACxB,YAAM;AACN,aAAO,IAAI,MAAM,sCAAsC,SAAS,IAAI,CAAC;AAAA,IACtE,GAAG,SAAS;AAAA,EACb,CAAC;AACF;AAGA,eAAe,yBAAyB,OAAkC;AACzE,MAAI,cAAc,KAAK,GAAG;AACzB,WAAO,yBAAyB,MAAM,KAAK;AAAA,EAC5C;AACA,MAAI,WAAW,KAAK,GAAG;AACtB,WAAO,kBAAkB,KAAK;AAAA,EAC/B;AACA,MAAI,oBAAoB,KAAK,GAAG;AAC/B,WAAO,kBAAkB,QAAQ,KAA2B,CAAC;AAAA,EAC9D;AACA,SAAO;AACR;AAqBO,SAAS,QACf,SACA,UACA,MAC2B;AAC3B,QAAM,WAAW,QAAQ,QAAQ;AACjC,QAAM,SAAS,UAAU,UAAU,CAAC,SAAS;AAC5C,QAAI,CAAC,QAAS,KAAgC,WAAW,GAAG;AAC3D,aAAO,MAA0B,IAAI;AAAA,IACtC;AACA,UAAM,QAAQ,MAAM;AACpB,WAAO,QAAQ,OAAO,MAAgC;AAAA,MACrD,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,WAAW,MAAM;AAAA,MACjB;AAAA,MACA,cAAc,MAAM;AAAA,IACrB,CAAC;AAAA,EACF,CAAC;AAED,SAAO;AACR;AA4BO,SAAS,cACf,SACA,UACA,MACkB;AAClB,QAAM,WAAW,QAAQ,QAAQ;AACjC,MAAI;AAEJ,QAAM,MAAM,YAAoB,CAAC,GAAG,EAAE,MAAM,MAAM,QAAQ,YAAY,CAAC;AAEvE,QAAM,MAAM,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,MAAM;AAE1C,gBAAY,MAAM;AAClB,QAAI,MAAM;AAEV,UAAM,WAAW;AACjB,QAAI,CAAC,YAAY,SAAS,WAAW,EAAG;AAExC,iBAAa,IAAI,gBAAgB;AACjC,UAAM,OAAO,QAAQ,OAAO,UAAU;AAAA,MACrC,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,WAAW,MAAM;AAAA,MACjB,OAAO,MAAM;AAAA,MACb,cAAc,MAAM;AAAA,MACpB,QAAQ,WAAW;AAAA,IACpB,CAAC;AACD,UAAM,OAAO;AACb,KAAC,YAAY;AACZ,UAAI;AACH,yBAAiB,SAAS,MAAM;AAC/B,cAAI,KAAK,OAAO,QAAS;AACzB,cAAI,OAAO,KAAK;AAAA,QACjB;AAAA,MACD,SAAS,MAAM;AAAA,MAKf;AAAA,IACD,GAAG;AAEH,WAAO,MAAM;AACZ,WAAK,MAAM;AAAA,IACZ;AAAA,EACD,CAAC;AACD,QAAM,QAAQ,UAAU,GAAG;AAE3B,SAAO;AAAA,IACN,MAAM,IAAI;AAAA,IACV,UAAU;AACT,kBAAY,MAAM;AAClB,YAAM;AACN,UAAI,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;AAAA,IACtB;AAAA,EACD;AACD;AAWO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzB;AAAA,EACA,iBAAoC,CAAC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,MAAc,OAA0B,CAAC,GAAG;AACvD,UAAM,MAAM,KAAK,KAAK;AAEtB,SAAK,OAAO,YAAyB,CAAC,GAAG;AAAA,MACxC,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,IACf,CAAC;AACD,SAAK,WAAW,KAAK,KAAK;AAC1B,SAAK,IAAI,YAAY,KAAK,QAAQ;AAElC,SAAK,SAAS;AAAA,MACb,CAAC,KAAK,QAAQ;AAAA,MACd,CAAC,CAAC,QAAQ,MAAM;AACf,cAAM,UAAW,SAA8C,MAAM;AACrE,eAAO,QAAQ,WAAW,IAAI,SAAY,QAAQ,QAAQ,SAAS,CAAC;AAAA,MACrE;AAAA,MACA;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd,MAAM,OAAO,aAAa;AAAA,QAC1B,SAAS;AAAA,MACV;AAAA,IACD;AACA,SAAK,IAAI,UAAU,KAAK,MAAM;AAC9B,SAAK,QAAQ,YAAY,QAAQ;AACjC,SAAK,eAAe,KAAK,UAAU,KAAK,MAAM,CAAC;AAE/C,SAAK,eAAe;AAAA,MACnB,CAAC,KAAK,QAAQ;AAAA,MACd,CAAC,CAAC,QAAQ,MAAO,SAA8C,MAAM,QAAQ;AAAA,MAC7E;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd,MAAM,OAAO,oBAAoB;AAAA,QACjC,SAAS;AAAA,MACV;AAAA,IACD;AACA,SAAK,IAAI,gBAAgB,KAAK,YAAY;AAC1C,SAAK,QAAQ,YAAY,cAAc;AACvC,SAAK,eAAe,KAAK,UAAU,KAAK,YAAY,CAAC;AAAA,EACtD;AAAA,EAEA,OAAO,MAA2B,SAAiB,OAAoC;AACtF,SAAK,KAAK,OAAO,EAAE,MAAM,SAAS,GAAG,MAAM,CAAC;AAAA,EAC7C;AAAA,EAEA,iBAAiB,QAAgB,SAAuB;AACvD,SAAK,KAAK,OAAO,EAAE,MAAM,QAAQ,SAAS,YAAY,OAAO,CAAC;AAAA,EAC/D;AAAA,EAEA,QAAc;AACb,SAAK,KAAK,MAAM;AAAA,EACjB;AAAA,EAEA,cAAsC;AACrC,WAAQ,KAAK,SAAS,IAAI,EAAuC,MAAM;AAAA,EACxE;AAAA,EAES,UAAgB;AACxB,eAAW,SAAS,KAAK,eAAgB,OAAM;AAC/C,SAAK,eAAe,SAAS;AAC7B,UAAM,QAAQ;AAAA,EACf;AACD;AAEO,SAAS,WAAW,MAAc,MAA2C;AACnF,SAAO,IAAI,gBAAgB,MAAM,IAAI;AACtC;AAUO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EACnC;AAAA,EACA;AAAA,EACQ,iBAAoC,CAAC;AAAA,EAEtD,YAAY,MAAc,OAA4B,CAAC,GAAG;AACzD,UAAM,MAAM,KAAK,KAAK;AAEtB,SAAK,cAAc,MAA2C,oBAAI,IAAI,GAAG;AAAA,MACxE,MAAM;AAAA,MACN,cAAc;AAAA,MACd,MAAM,OAAO,kBAAkB;AAAA,IAChC,CAAC;AACD,SAAK,IAAI,eAAe,KAAK,WAAW;AAExC,SAAK,UAAU;AAAA,MACd,CAAC,KAAK,WAAW;AAAA,MACjB,CAAC,CAAC,IAAI,MAAM,CAAC,IAAK,QAAQ,oBAAI,IAAI,GAA2C,OAAO,CAAC;AAAA,MACrF;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd,MAAM,OAAO,cAAc;AAAA,QAC3B,SAAS,CAAC;AAAA,MACX;AAAA,IACD;AACA,SAAK,IAAI,WAAW,KAAK,OAAO;AAChC,SAAK,QAAQ,eAAe,SAAS;AACrC,SAAK,eAAe,KAAK,UAAU,KAAK,OAAO,CAAC;AAAA,EACjD;AAAA,EAEA,SAAS,MAA4B;AACpC,UAAM,UAAU,KAAK,YAAY,IAAI;AACrC,UAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,SAAK,IAAI,KAAK,MAAM,IAAI;AACxB,SAAK,YAAY,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;AAAA,EACrC;AAAA,EAEA,WAAW,MAAoB;AAC9B,UAAM,UAAU,KAAK,YAAY,IAAI;AACrC,QAAI,CAAC,QAAQ,IAAI,IAAI,EAAG;AACxB,UAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,SAAK,OAAO,IAAI;AAChB,SAAK,YAAY,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;AAAA,EACrC;AAAA,EAEA,MAAM,QAAQ,MAAc,MAAiD;AAC5E,UAAM,OAAO,KAAK,YAAY,IAAI;AAClC,UAAM,OAAO,KAAK,IAAI,IAAI;AAC1B,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,+BAA+B,IAAI,GAAG;AACjE,UAAM,MAAM,KAAK,QAAQ,IAAI;AAC7B,WAAO,yBAAyB,GAAG;AAAA,EACpC;AAAA,EAEA,cAAc,MAA0C;AACvD,WAAQ,KAAK,YAAY,IAAI,EAA0C,IAAI,IAAI;AAAA,EAChF;AAAA,EAES,UAAgB;AACxB,eAAW,SAAS,KAAK,eAAgB,OAAM;AAC/C,SAAK,eAAe,SAAS;AAC7B,UAAM,QAAQ;AAAA,EACf;AACD;AAEO,SAAS,aAAa,MAAc,MAA+C;AACzF,SAAO,IAAI,kBAAkB,MAAM,IAAI;AACxC;AAYO,SAAS,oBACf,UACA,MACqB;AACrB,QAAM,YAAY,MAAM,aAAa;AACrC,QAAM,eAAe,SAAS,IAAI,CAAC,MAAO,OAAO,MAAM,WAAW,MAAM,CAAC,IAAI,QAAQ,CAAC,CAAE;AACxF,QAAM,SAAS;AAAA,IACd;AAAA,IACA,CAAC,WAAY,OAAoB,OAAO,CAAC,MAAM,KAAK,QAAQ,MAAM,EAAE,EAAE,KAAK,SAAS;AAAA,IACpF;AAAA,MACC,MAAM,MAAM,QAAQ;AAAA,MACpB,cAAc;AAAA,MACd,MAAM,OAAO,eAAe;AAAA,MAC5B,SAAS;AAAA,IACV;AAAA,EACD;AACA,QAAM,QAAQ,UAAU,MAAM;AAC9B,SAAO,OAAO,OAAO,QAAQ,EAAE,SAAS,MAAM,CAAC;AAChD;AAoBO,SAAS,aACf,cACA,MACkF;AAClF,SAAO,CAAC,KAAW,aAAwC;AAC1D,UAAM,eAAe,CAAC,GAAG,SAAS,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG;AACtD,UAAM,WAA0B;AAAA,MAC/B,EAAE,MAAM,UAAU,SAAS,aAAa;AAAA,MACxC;AAAA,QACC,MAAM;AAAA,QACN,SAAS,KAAK,UAAU;AAAA,UACvB,OAAO;AAAA,UACP;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD;AAEA,WAAO,SAA2B,CAAC,OAAO,YAAY;AACrD,UAAI,SAAS;AACb,YAAM,SAAS,KAAK,QAAQ,OAAO,UAAU;AAAA,QAC5C,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK,eAAe;AAAA,QACjC,WAAW,KAAK;AAAA,MACjB,CAAC;AAED,YAAM,WAAW,QAAQ,MAAM;AAC/B,YAAM,QAAQ,SAAS,UAAU,CAAC,SAAS;AAC1C,YAAI,CAAC,OAAQ;AACb,YAAI,OAAO;AACX,mBAAW,OAAO,MAAM;AACvB,cAAI,KAAM;AACV,cAAI,IAAI,CAAC,MAAM,MAAM;AACpB,kBAAM,WAAW,IAAI,CAAC;AACtB,gBAAI;AACH,oBAAM,SAAS,KAAK,MAAM,SAAS,OAAO;AAC1C,sBAAQ,KAAK,MAAM;AACnB,sBAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;AAAA,YAC1B,QAAQ;AACP,sBAAQ,KAAK;AAAA,gBACZ,CAAC,OAAO,IAAI,MAAM,oDAAoD,CAAC;AAAA,cACxE,CAAC;AAAA,YACF;AACA,mBAAO;AAAA,UACR,WAAW,IAAI,CAAC,MAAM,OAAO;AAC5B,oBAAQ,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9B,mBAAO;AAAA,UACR,WAAW,IAAI,CAAC,MAAM,UAAU;AAC/B,oBAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;AACzB,mBAAO;AAAA,UACR,OAAO;AAEN,oBAAQ,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAAA,UAChC;AAAA,QACD;AAAA,MACD,CAAC;AACD,aAAO,MAAM;AACZ,cAAM;AACN,iBAAS;AAAA,MACV;AAAA,IACD,CAAC;AAAA,EACF;AACD;AAQO,SAAS,gBACf,cACA,MACsE;AACtE,SAAO,CAAC,YAAuC;AAC9C,UAAM,eAAe,CAAC,GAAG,QAAQ,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE;AAClF,UAAM,WAA0B;AAAA,MAC/B,EAAE,MAAM,UAAU,SAAS,aAAa;AAAA,MACxC,EAAE,MAAM,QAAQ,SAAS,KAAK,UAAU,EAAE,UAAU,aAAa,CAAC,EAAE;AAAA,IACrE;AACA,WAAO,SAA2B,CAAC,OAAO,YAAY;AACrD,UAAI,SAAS;AACb,YAAM,SAAS,KAAK,QAAQ,OAAO,UAAU;AAAA,QAC5C,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK,eAAe;AAAA,QACjC,WAAW,KAAK;AAAA,MACjB,CAAC;AACD,YAAM,WAAW,QAAQ,MAAM;AAC/B,YAAM,QAAQ,SAAS,UAAU,CAAC,SAAS;AAC1C,YAAI,CAAC,OAAQ;AACb,YAAI,OAAO;AACX,mBAAW,OAAO,MAAM;AACvB,cAAI,KAAM;AACV,cAAI,IAAI,CAAC,MAAM,MAAM;AACpB,kBAAM,WAAW,IAAI,CAAC;AACtB,gBAAI;AACH,oBAAM,SAAS,KAAK,MAAM,SAAS,OAAO;AAC1C,sBAAQ,KAAK,MAAM;AACnB,sBAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;AAAA,YAC1B,QAAQ;AACP,sBAAQ,KAAK;AAAA,gBACZ,CAAC,OAAO,IAAI,MAAM,uDAAuD,CAAC;AAAA,cAC3E,CAAC;AAAA,YACF;AACA,mBAAO;AAAA,UACR,WAAW,IAAI,CAAC,MAAM,OAAO;AAC5B,oBAAQ,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9B,mBAAO;AAAA,UACR,WAAW,IAAI,CAAC,MAAM,UAAU;AAC/B,oBAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;AACzB,mBAAO;AAAA,UACR,OAAO;AAEN,oBAAQ,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAAA,UAChC;AAAA,QACD;AAAA,MACD,CAAC;AACD,aAAO,MAAM;AACZ,cAAM;AACN,iBAAS;AAAA,MACV;AAAA,IACD,CAAC;AAAA,EACF;AACD;AA4BA,SAAS,uBAAuB,MAAgC;AAC/D,SAAO,EAAE,aAAa,KAAK,WAAW,KAAK,eAAe,IAAI;AAC/D;AAOO,SAAS,kBAAkB,OAAgC,CAAC,GAA8B;AAChG,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,UAAU,KAAK,wBAAwB;AAC7C,QAAM,WAAW,KAAK,0BAA0B;AAChD,QAAM,gBAAgB,KAAK,qBAAqB;AAChD,SAAO,CAAC,QAA0B;AACjC,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,OAAO,cAAc,QAAS,QAAO;AACzC,QAAI,OAAO,gBAAgB,SAAU,QAAO;AAC5C,QAAI,iBAAiB,OAAO,aAAa,EAAG,QAAO;AACnD,WAAO;AAAA,EACR;AACD;AAwBA,IAAM,qBAAqB,KAAK,OAAO,IAAI;AAqJ3C,SAAS,gBAAsB,UAA8C;AAC5E,MACC,YACA,OAAO,aAAa,YACpB,WAAY,YACZ,OAAQ,SAAiC,UAAU,YAClD,SAAiC,UAAU,QAC5C,SAAW,SAA+B,OACzC;AACD,WACG,SAA2D,MAAM,OAG7D,oBAAI,IAAkB;AAAA,EAE9B;AACA,SAAO,oBAAI,IAAkB;AAC9B;AAEO,SAAS,YACf,MACA,QACA,MACyB;AACzB,QAAM,QAAQ,IAAI,MAAM,MAAM,KAAK,KAAK;AACxC,QAAM,gBAAmC,CAAC;AAG1C,MAAI;AAIJ,MAAI,KAAK,WAAW;AACnB,mBAAe,KAAK;AAAA,EACrB,WAAW,KAAK,WAAW,KAAK,eAAe;AAC9C,mBAAe,aAA4B,KAAK,eAAe,EAAE,SAAS,KAAK,QAAQ,CAAC;AAAA,EACzF,OAAO;AACN,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACnF;AACA,QAAM,YAAY,CACjB,KACA,aACiC;AACjC,QAAI,OAAO,KAAM,QAAO,EAAE,QAAQ,CAAC,EAAE;AACrC,WAAO,aAAa,KAAK,QAAQ;AAAA,EAClC;AAGA,MAAI,iBAAiB;AACrB,MAAI,KAAK,iBAAiB;AACzB,UAAM,UAAU,QAAQ,MAAM;AAC9B,UAAMC,UAAS,KAAK;AACpB,qBAAiB;AAAA,MAChB,CAAC,OAAO;AAAA,MACR,CAAC,CAAC,GAAG,MAAM;AACV,YAAIA,QAAO,GAAG,EAAG,QAAO;AACxB,eAAO;AAAA,MACR;AAAA,MACA,EAAE,MAAM,mBAAmB,cAAc,UAAU;AAAA,IACpD;AAAA,EACD;AAGA,MAAI;AAGJ,MAAI,KAAK,eAAe;AACvB,oBAAgB,KAAK;AAAA,EACtB,WAAW,KAAK,WAAW,KAAK,mBAAmB;AAClD,oBAAgB,gBAAsB,KAAK,mBAAmB,EAAE,SAAS,KAAK,QAAQ,CAAC;AAAA,EACxF;AAGA,MAAI,qBAAqB,KAAK;AAC9B,MAAI,CAAC,sBAAsB,iBAAiB,KAAK,YAAY,YAAY,OAAO;AAC/E,UAAMC,YAAW,KAAK,YAAY,YAAY;AAC9C,yBAAqB,UAAUA,WAAU,EAAE,QAAQA,UAAS,CAAC;AAAA,EAC9D;AAGA,QAAM,cAAoC;AAAA,IACzC,OAAO,KAAK;AAAA,IACZ,MAAM,KAAK;AAAA,IACX,QAAQ,KAAK,UAAU;AAAA,IACvB,SAAS,KAAK;AAAA,IACd,aAAa;AAAA,IACb;AAAA,EACD;AACA,QAAM,gBAAgB,QAAuB,gBAAgB,WAAW,WAAW;AAEnF,QAAM,IAAI,SAAS,cAAc,MAAM,IAAI;AAC3C,QAAM,IAAI,WAAW,cAAc,OAAO;AAC1C,QAAM,IAAI,QAAQ,cAAc,IAAI;AACpC,QAAM,QAAQ,SAAS,SAAS;AAChC,QAAM,QAAQ,SAAS,MAAM;AAG7B,MAAI,UAA0C;AAC9C,MAAI,KAAK,oBAAoB,KAAK,mBAAmB,KAAK,KAAK,SAAS;AACvE,cAAU,YAAkB,EAAE,WAAW,KAAK,iBAAiB,CAAC;AAChE,UAAM,IAAI,eAAe,QAAQ,OAAO;AAAA,EACzC;AAGA,MAAI,KAAkD;AACtD,MAAI,KAAK,sBAAsB;AAC9B,SAAK,eAAgC,GAAG,IAAI,KAAK;AACjD,UAAM,MAAM,MAAM,EAAE;AAAA,EACrB;AAGA,MAAI,oBAAoD;AACxD,MAAI,KAAK,OAAO;AACf,UAAM,YAAY,KAAK;AACvB,UAAM,YAAY,UAAU,aAAa;AACzC,UAAM,YAAY,UAAU,aAAa;AACzC,UAAM,mBAAmB,UAAU,oBAAoB;AACvD,UAAM,kBAAkB,UAAU,oBAAoB,MAAM;AAG5D,UAAM,YAAY,gBAAsB,EAAE,MAAM,YAAY,CAAC;AAC7D,UAAM,IAAI,aAAa,UAAU,OAAO;AAGxC,UAAM,gBAAgB,oBAAI,IAAY;AAEtC,UAAM,SAAS,CAAC,QAA4B;AAC3C,UAAI,cAAc,IAAI,GAAG,EAAG,QAAO;AACnC,YAAM,WAAW,gBAAsB,cAAc,MAAM,KAAK,IAAI,CAAC;AACrE,UAAI,SAAS,IAAI,GAAG,EAAG,QAAO;AAC9B,aAAO;AAAA,IACR;AAEA,UAAM,gBAAgB,CAAC,KAAa,UAAsB;AACzD,oBAAc,IAAI,GAAG;AACrB,gBAAU,OAAO,KAAK,KAAK;AAAA,IAC5B;AAGA,UAAM,mBAAmB,oBAAI,IAAoB;AAGjD,UAAM,YAAY,cAAc,MAAM;AACtC,UAAM,cAAc,KAAK,UAAU,QAAQ,KAAK,OAAO,IAAI,MAAe,IAAI;AAC9E,UAAM,iBAAiB,OAAO,CAAC,WAAW,WAAW,GAAG,CAAC,CAAC,UAAU,GAAG,MAAM;AAC5E,YAAM,WAAW,gBAAsB,QAAQ;AAC/C,YAAM,QAAQ,YAAY;AAC1B,YAAM,YAAsB,CAAC;AAC7B,YAAM,cAAmD,CAAC;AAE1D,iBAAW,CAAC,KAAK,GAAG,KAAK,UAAU;AAElC,YAAI,CAAC,iBAAiB,IAAI,GAAG,GAAG;AAC/B,2BAAiB,IAAI,KAAK,KAAK;AAAA,QAChC;AAGA,YAAI,gBAAgB,KAAK,GAAG,GAAG;AAC9B,sBAAY,KAAK,EAAE,KAAK,OAAO,IAAI,CAAC;AACpC;AAAA,QACD;AAEA,cAAM,YAAY,KAAK,MAAM,KAAK,GAAG;AACrC,cAAM,YAAY,iBAAiB,IAAI,GAAG,KAAK;AAC/C,cAAM,aAAa,OAAO,QAAQ,SAAS,IAAI;AAC/C,cAAM,UAAU,MAAM,WAAW,YAAY,SAAS;AACtD,YAAI,UAAU,kBAAkB;AAC/B,oBAAU,KAAK,GAAG;AAAA,QACnB;AAAA,MACD;AAGA,iBAAW,OAAO,iBAAiB,KAAK,GAAG;AAC1C,YAAI,CAAC,SAAS,IAAI,GAAG,EAAG,kBAAiB,OAAO,GAAG;AAAA,MACpD;AAGA,iBAAW,EAAE,KAAK,MAAM,KAAK,aAAa;AACzC,YAAI,CAAC,cAAc,IAAI,GAAG,GAAG;AAC5B,wBAAc,KAAK,KAAK;AAAA,QACzB;AAAA,MACD;AAGA,YAAM,cAAc,SAAS,OAAO,cAAc;AAClD,UAAI,cAAc,WAAW;AAC5B,cAAM,SAAS,CAAC,GAAG,SAAS,QAAQ,CAAC,EACnC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC,EACrC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,GAAG,OAAO,KAAK,MAAM,GAAG,GAAG,EAAE,EAAE,EACvD,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAClC,cAAM,SAAS,cAAc;AAC7B,iBAAS,IAAI,GAAG,IAAI,UAAU,IAAI,OAAO,QAAQ,KAAK;AACrD,gBAAM,KAAK,OAAO,CAAC,EAAG;AACtB,cAAI,CAAC,UAAU,SAAS,EAAE,EAAG,WAAU,KAAK,EAAE;AAAA,QAC/C;AAAA,MACD;AAGA,UAAI,UAAU,SAAS,GAAG;AACzB,cAAM,MAAM;AACX,qBAAW,OAAO,WAAW;AAC5B,0BAAc,MAAM,OAAO,GAAG;AAAA,UAC/B;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD,CAAC;AACD,kBAAc,KAAK,eAAe,UAAU,MAAM,MAAS,CAAC;AAG5D,QAAI,gBAAkD;AACtD,QAAI,UAAU,gBAAgB;AAC7B,sBAAgB,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,UAAU;AAAA,MACX;AAAA,IACD;AAEA,wBAAoB;AAAA,MACnB;AAAA,MACA,eAAe;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAGA,MAAI,WAAW,IAAI;AAClB,UAAM,UAAU,KAAK;AACrB,UAAM,WAAW,KAAK;AACtB,UAAM,YAAY,cAAc,MAAM;AAEtC,UAAM,UAAU,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,QAAQ,MAAM;AACnD,YAAM,WAAW,gBAAsB,QAAQ;AAC/C,iBAAW,CAAC,KAAK,GAAG,KAAK,UAAU;AAElC,YAAI,WAAW,SAAS;AACvB,gBAAM,MAAM,QAAQ,GAAG;AACvB,cAAI,IAAK,SAAQ,OAAO,KAAK,KAAK,GAAG;AAAA,QACtC;AAEA,YAAI,MAAM,UAAU;AACnB,gBAAM,YAAY,SAAS,KAAK,GAAG;AACnC,cAAI,WAAW;AACd,uBAAW,OAAO,UAAU,YAAY,CAAC,GAAG;AAC3C,iBAAG,aAAa,IAAI,IAAI,IAAI,KAAK;AAAA,YAClC;AACA,uBAAW,OAAO,UAAU,aAAa,CAAC,GAAG;AAC5C,iBAAG,KAAK,IAAI,MAAM,IAAI,IAAI,IAAI,UAAoB,IAAI,MAAM;AAAA,YAC7D;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD,CAAC;AACD,kBAAc,KAAK,QAAQ,UAAU,MAAM,MAAS,CAAC;AAAA,EACtD;AAGA,MAAI,gBAAkE;AACtE,MAAI,qBAA+D;AACnE,MAAI,aAAsF;AAE1F,MAAI,WAAW,IAAI;AAClB,UAAM,OAAO,KAAK,WAAW,QAAQ;AACrC,UAAM,aAAa,KAAK,WAAW,cAAc;AACjD,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,SAAS,KAAK;AACpB,UAAM,UAAU,KAAK;AAGrB,UAAM,aAAa,MAA6B,MAAM;AAAA,MACrD,MAAM;AAAA,MACN,cAAc;AAAA,IACf,CAAC;AACD,UAAM,IAAI,kBAAkB,UAAU;AAEtC,UAAM,cAAc,KAAK,UAAU,QAAQ,KAAK,OAAO,IAAI,MAAe,IAAI;AAC9E,UAAM,aAAa,MAAmC,MAAM;AAAA,MAC3D,MAAM;AAAA,MACN,cAAc;AAAA,MACd,MAAM,OAAO,iBAAiB;AAAA,IAC/B,CAAC;AACD,UAAM,IAAI,kBAAkB,UAAU;AACtC,yBAAqB;AAErB,UAAM,YAAY,cAAc,MAAM;AAGtC,QAAI,YAAyC;AAE7C,UAAM,mBAAmB;AAAA,MACxB,CAAC,YAAY,WAAW,WAAW;AAAA,MACnC,CAAC,CAAC,OAAO,UAAU,GAAG,MAAM;AAC3B,YAAI,CAAC,MAAO,QAAO,CAAC;AACpB,cAAM,IAAI;AACV,cAAM,WAAW,gBAAsB,QAAQ;AAE/C,cAAM,eAAe,oBAAI,IAGvB;AAGF,YAAI,mBAA+C,CAAC;AACpD,YAAI,WAAW,EAAE,QAAQ;AACxB,6BAAmB,QAAQ,OAAO,EAAE,QAAQ,IAAI;AAChD,qBAAW,MAAM,kBAAkB;AAClC,kBAAM,MAAM,SAAS,IAAI,GAAG,EAAE;AAC9B,gBAAI,KAAK;AACR,2BAAa,IAAI,GAAG,IAAI,EAAE,OAAO,KAAK,SAAS,oBAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;AAAA,YACrE;AAAA,UACD;AAAA,QACD;AAGA,cAAM,gBAA0B,CAAC;AACjC,YAAI,IAAI;AACP,gBAAM,UAAU,CAAC,GAAI,EAAE,aAAa,CAAC,GAAI,GAAG,CAAC,GAAG,aAAa,KAAK,CAAC,CAAC;AACpE,gBAAM,UAAU,oBAAI,IAAY;AAChC,cAAI,WAAW;AACf,mBAAS,QAAQ,GAAG,QAAQ,YAAY,SAAS;AAChD,kBAAM,eAAyB,CAAC;AAChC,uBAAW,MAAM,UAAU;AAC1B,kBAAI,QAAQ,IAAI,EAAE,EAAG;AACrB,sBAAQ,IAAI,EAAE;AACd,oBAAM,UAAU,GAAG,QAAQ,EAAE;AAC7B,yBAAW,QAAQ,SAAS;AAC3B,sBAAM,WAAW,KAAK;AACtB,oBAAI,CAAC,QAAQ,IAAI,QAAQ,GAAG;AAC3B,+BAAa,KAAK,QAAQ;AAC1B,wBAAM,MAAM,SAAS,IAAI,QAAQ;AACjC,sBAAI,KAAK;AACR,0BAAM,WAAW,aAAa,IAAI,QAAQ;AAC1C,wBAAI,UAAU;AACb,+BAAS,QAAQ,IAAI,OAAO;AAAA,oBAC7B,OAAO;AACN,mCAAa,IAAI,UAAU,EAAE,OAAO,KAAK,SAAS,oBAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;AAAA,oBACvE;AACA,kCAAc,KAAK,QAAQ;AAAA,kBAC5B;AAAA,gBACD;AAAA,cACD;AAAA,YACD;AACA,uBAAW;AAAA,UACZ;AAAA,QACD;AAGA,mBAAW,CAAC,KAAK,GAAG,KAAK,UAAU;AAClC,cAAI,CAAC,aAAa,IAAI,GAAG,GAAG;AAC3B,yBAAa,IAAI,KAAK,EAAE,OAAO,KAAK,SAAS,oBAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;AAAA,UAClE;AAAA,QACD;AAGA,cAAM,SAAiC,CAAC;AACxC,mBAAW,CAAC,KAAK,EAAE,OAAO,QAAQ,CAAC,KAAK,cAAc;AACrD,gBAAM,QAAQ,QAAQ,OAAO,GAAG;AAChC,iBAAO,KAAK,EAAE,KAAK,OAAO,OAAO,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,QACzD;AACA,eAAO,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAGvC,cAAM,SAAiC,CAAC;AACxC,YAAI,aAAa;AACjB,mBAAW,SAAS,QAAQ;AAC3B,gBAAM,IAAI,OAAO,MAAM,KAAK;AAC5B,cAAI,aAAa,IAAI,UAAU,OAAO,SAAS,EAAG;AAClD,iBAAO,KAAK,KAAK;AACjB,wBAAc;AAAA,QACf;AAGA,oBAAY,EAAE,kBAAkB,eAAe,QAAQ,OAAO;AAE9D,eAAO;AAAA,MACR;AAAA,MACA;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd,MAAM,OAAO,oBAAoB;AAAA,QACjC,SAAS,CAAC;AAAA,MACX;AAAA,IACD;AACA,UAAM,IAAI,aAAa,gBAAgB;AACvC,UAAM,QAAQ,kBAAkB,WAAW;AAC3C,UAAM,QAAQ,SAAS,WAAW;AAClC,kBAAc,KAAK,iBAAiB,UAAU,MAAM,MAAS,CAAC;AAC9D,oBAAgB;AAEhB,iBAAa,CAAC,UAA+D;AAC5E,iBAAW,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAC/B,YAAM,SAAS,iBAAiB,IAAI;AAEpC,UAAI,WAAW;AACd,mBAAW,KAAK,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC;AAAA,MACpC;AACA,aAAO;AAAA,IACR;AAAA,EACD;AAGA,QAAM,cAAc,MAAM,QAAQ,KAAK,KAAK;AAC5C,QAAM,UAAU,MAAM;AACrB,eAAW,SAAS,cAAe,OAAM;AACzC,kBAAc,SAAS;AACvB,gBAAY;AAAA,EACb;AAEA,SAAO,OAAO,OAAO,OAAO;AAAA,IAC3B;AAAA,IACA,SAAS,cAAc;AAAA,IACvB,MAAM,cAAc;AAAA,IACpB;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,EACX,CAAC;AACF;AAoBO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,WAAW;AAAA,EACX,mBAA2C;AAAA,EAEnD,YAAY,MAAc,MAAwB;AACjD,UAAM,MAAM,KAAK,KAAK;AAEtB,SAAK,WAAW,KAAK;AACrB,SAAK,YAAY,KAAK,YAAY;AAClC,SAAK,YAAY,KAAK;AACtB,SAAK,cAAc,KAAK;AACxB,SAAK,gBAAgB,KAAK;AAC1B,SAAK,SAAS,KAAK;AACnB,SAAK,eAAe,KAAK;AACzB,SAAK,aAAa,KAAK;AAGvB,SAAK,OAAO,WAAW,GAAG,IAAI,SAAS,EAAE,aAAa,KAAK,YAAY,CAAC;AACxE,SAAK,MAAM,QAAQ,KAAK,IAAI;AAG5B,SAAK,QAAQ,aAAa,GAAG,IAAI,QAAQ;AACzC,SAAK,MAAM,SAAS,KAAK,KAAK;AAG9B,QAAI,KAAK,OAAO;AACf,iBAAW,QAAQ,KAAK,OAAO;AAC9B,aAAK,MAAM,SAAS,IAAI;AAAA,MACzB;AAAA,IACD;AAGA,SAAK,eAAe,MAAuB,QAAQ;AAAA,MAClD,MAAM;AAAA,MACN,cAAc;AAAA,MACd,MAAM,OAAO,cAAc;AAAA,IAC5B,CAAC;AACD,SAAK,SAAS,KAAK;AACnB,SAAK,IAAI,UAAU,KAAK,MAAM;AAG9B,SAAK,kBAAkB,MAAc,GAAG;AAAA,MACvC,MAAM;AAAA,MACN,cAAc;AAAA,MACd,MAAM,OAAO,kBAAkB;AAAA,IAChC,CAAC;AACD,SAAK,YAAY,KAAK;AACtB,SAAK,IAAI,aAAa,KAAK,SAAS;AAGpC,SAAK,eAAe,MAA0B,MAAM;AAAA,MACnD,MAAM;AAAA,MACN,cAAc;AAAA,MACd,MAAM,OAAO,qBAAqB;AAAA,IACnC,CAAC;AACD,SAAK,IAAI,gBAAgB,KAAK,YAAY;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,IAAI,aAAkD;AAC3D,QAAI,KAAK,SAAU,OAAM,IAAI,MAAM,4BAA4B;AAC/D,SAAK,WAAW;AAChB,SAAK,mBAAmB,IAAI,gBAAgB;AAC5C,UAAM,EAAE,OAAO,IAAI,KAAK;AAExB,UAAM,MAAM;AACX,WAAK,aAAa,KAAK,CAAC,CAAC,MAAM,MAAyB,CAAC,CAAC;AAC1D,WAAK,gBAAgB,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAAA,IACtC,CAAC;AACD,SAAK,KAAK,OAAO,QAAQ,WAAW;AAEpC,QAAI;AACH,UAAI,QAAQ;AACZ,aAAO,QAAQ,KAAK,WAAW;AAC9B,YAAI,OAAO,QAAS,OAAM,IAAI,MAAM,oBAAoB;AACxD;AACA,cAAM,MAAM;AACX,eAAK,gBAAgB,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AACzC,eAAK,aAAa,KAAK,CAAC,CAAC,MAAM,UAA6B,CAAC,CAAC;AAAA,QAC/D,CAAC;AAGD,cAAM,OAAO,KAAK,KAAK,YAAY;AACnC,cAAM,cAAe,KAAK,MAAM,QAAQ,IAAI,KAAmC,CAAC;AAChF,cAAM,WAAW,MAAM,KAAK,WAAW,MAAM,aAAa,MAAM;AAChE,YAAI,OAAO,QAAS,OAAM,IAAI,MAAM,oBAAoB;AAExD,QAAC,KAAK,aAA0C,KAAK,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC;AAGvE,aAAK,KAAK,OAAO,aAAa,SAAS,SAAS;AAAA,UAC/C,WAAW,SAAS;AAAA,QACrB,CAAC;AAGD,YAAI,KAAK,YAAY,QAAQ,GAAG;AAC/B,eAAK,aAAa,KAAK,CAAC,CAAC,MAAM,MAAyB,CAAC,CAAC;AAC1D,eAAK,WAAW;AAChB,eAAK,mBAAmB;AACxB,iBAAO;AAAA,QACR;AAGA,YAAI,SAAS,aAAa,SAAS,UAAU,SAAS,GAAG;AACxD,eAAK,aAAa,KAAK,CAAC,CAAC,MAAM,QAA2B,CAAC,CAAC;AAC5D,qBAAW,QAAQ,SAAS,WAAW;AACtC,gBAAI,OAAO,QAAS,OAAM,IAAI,MAAM,oBAAoB;AACxD,iBAAK,cAAc,IAAI;AACvB,gBAAI;AACH,oBAAM,SAAS,MAAM,KAAK,MAAM,QAAQ,KAAK,MAAM,KAAK,SAAS;AACjE,mBAAK,KAAK,iBAAiB,KAAK,IAAI,KAAK,UAAU,MAAM,CAAC;AAAA,YAC3D,SAAS,KAAK;AACb,mBAAK,KAAK,iBAAiB,KAAK,IAAI,KAAK,UAAU,EAAE,OAAO,OAAO,GAAG,EAAE,CAAC,CAAC;AAAA,YAC3E;AAAA,UACD;AAAA,QACD,OAAO;AAEN,eAAK,aAAa,KAAK,CAAC,CAAC,MAAM,MAAyB,CAAC,CAAC;AAC1D,eAAK,WAAW;AAChB,eAAK,mBAAmB;AACxB,iBAAO;AAAA,QACR;AAAA,MACD;AAGA,WAAK,aAAa,KAAK,CAAC,CAAC,MAAM,MAAyB,CAAC,CAAC;AAC1D,WAAK,WAAW;AAChB,WAAK,mBAAmB;AACxB,aAAO,KAAK,aAAa,IAAI;AAAA,IAC9B,SAAS,KAAK;AACb,WAAK,aAAa,KAAK,CAAC,CAAC,MAAM,OAA0B,CAAC,CAAC;AAC3D,WAAK,WAAW;AAChB,WAAK,mBAAmB;AACxB,YAAM;AAAA,IACP;AAAA,EACD;AAAA,EAEA,MAAc,WACb,MACA,OACA,QACuB;AACvB,UAAM,SAAS,KAAK,SAAS,OAAO,MAAM;AAAA,MACzC,OAAO,MAAM,SAAS,IAAI,QAAQ;AAAA,MAClC,cAAc,KAAK;AAAA,MACnB,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,MAChB;AAAA,IACD,CAAC;AAED,QAAI,UAAU,MAAM;AACnB,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC1E;AAEA,QAAI,OAAO,WAAW,UAAU;AAC/B,YAAM,IAAI,MAAM,sEAAsE;AAAA,IACvF;AAEA,QACC,OAAO,WAAW,YAClB,aAAa,UACb,EAAE,eAAe,WACjB,EAAE,UAAU,SACX;AACD,aAAO;AAAA,IACR;AAEA,QAAI,cAAc,MAAM,GAAG;AAC1B,YAAM,UAAU,MAAM;AACtB,UACC,OAAO,YAAY,YACnB,YAAY,QACZ,aAAa,WACb,EAAE,eAAe,UAChB;AACD,eAAO;AAAA,MACR;AACA,aAAO,kBAAkB,QAAQ,OAAiC,CAAC;AAAA,IACpE;AAEA,WAAO,kBAAkB,QAAQ,MAAM,CAAC;AAAA,EACzC;AAAA,EAEQ,YAAY,UAAgC;AACnD,QACC,SAAS,iBAAiB,eACzB,CAAC,SAAS,aAAa,SAAS,UAAU,WAAW;AAEtD,aAAO;AACR,QAAI,KAAK,YAAY,QAAQ,EAAG,QAAO;AACvC,WAAO;AAAA,EACR;AAAA,EAES,UAAgB;AACxB,QAAI,KAAK,kBAAkB;AAC1B,WAAK,iBAAiB,MAAM;AAC5B,WAAK,mBAAmB;AAAA,IACzB;AACA,SAAK,WAAW;AAChB,UAAM,QAAQ;AAAA,EACf;AACD;AAEO,SAAS,UAAU,MAAc,MAAwC;AAC/E,SAAO,IAAI,eAAe,MAAM,IAAI;AACrC;AAuCA,SAAS,iBAAiB,MAAwD;AACjF,QAAM,SAAkC,CAAC;AAEzC,QAAM,WAAW,KAAK;AACtB,MAAI,aAAa,UAAU,MAAM,QAAQ,KAAK,MAAM,GAAG;AACtD,WAAO,OAAO;AACd,WAAO,OAAO,KAAK;AAAA,EACpB,WAAW,aAAa,WAAW;AAClC,WAAO,OAAO;AAAA,EACf,WAAW,aAAa,UAAU;AACjC,WAAO,OAAO;AAAA,EACf,WAAW,aAAa,WAAW;AAClC,WAAO,OAAO;AAAA,EACf,WAAW,aAAa,UAAU;AACjC,WAAO,OAAO;AAAA,EACf,OAAO;AAEN,WAAO,OAAO,CAAC,UAAU,UAAU,SAAS;AAAA,EAC7C;AAEA,MAAI,MAAM,QAAQ,KAAK,KAAK,KAAK,KAAK,MAAM,WAAW,GAAG;AACzD,WAAO,UAAU,KAAK,MAAM,CAAC;AAC7B,WAAO,UAAU,KAAK,MAAM,CAAC;AAAA,EAC9B;AAEA,MAAI,OAAO,KAAK,WAAW,UAAU;AACpC,WAAO,cAAc,WAAW,KAAK,MAAM;AAAA,EAC5C;AAEA,MAAI,OAAO,KAAK,SAAS,UAAU;AAClC,QAAI,OAAO,aAAa;AACvB,aAAO,eAAe,KAAK,KAAK,IAAI;AAAA,IACrC,OAAO;AACN,aAAO,cAAc,SAAS,KAAK,IAAI;AAAA,IACxC;AAAA,EACD;AAEA,SAAO;AACR;AAeO,SAAS,aAAa,OAAc,OAAmC;AAC7E,QAAM,YAAY,MAAM,SAAS,EAAE,MAAM,CAAC;AAC1C,QAAM,SAA6B,CAAC;AACpC,QAAM,MAAuB,CAAC;AAC9B,QAAM,cAAgC,CAAC;AAEvC,aAAW,CAAC,MAAMC,KAAI,KAAK,OAAO,QAAQ,UAAU,KAAK,GAAG;AAE3D,QAAIA,MAAK,SAAS,QAAS;AAG3B,QAAI,KAAK,SAAS,cAAc,EAAG;AAGnC,QAAIA,MAAK,WAAW,eAAeA,MAAK,WAAW,UAAW;AAG9D,UAAM,SAASA,MAAK,KAAK;AACzB,QAAI,WAAW,WAAW,WAAW,SAAU;AAE/C,UAAM,cAAeA,MAAK,KAAK,eAA0B,oBAAoB,IAAI;AACjF,UAAM,cAAc,iBAAiBA,MAAK,IAAI;AAE9C,UAAM,kBAA2C;AAAA,MAChD,MAAM;AAAA,MACN,UAAU,CAAC,OAAO;AAAA,MAClB,YAAY;AAAA,QACX,OAAO;AAAA,MACR;AAAA,MACA,sBAAsB;AAAA,IACvB;AAGA,UAAM,gBAAgB,KAAK,QAAQ,OAAO,IAAI;AAE9C,WAAO,KAAK;AAAA,MACX,MAAM;AAAA,MACN,UAAU;AAAA,QACT,MAAM;AAAA,QACN;AAAA,QACA,YAAY;AAAA,MACb;AAAA,IACD,CAAC;AAED,QAAI,KAAK;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA,aAAa;AAAA,IACd,CAAC;AAED,UAAM,WAAW;AACjB,UAAM,WAAW;AACjB,UAAM,KAAKA,MAAK;AAChB,gBAAY,KAAK;AAAA,MAChB,MAAM;AAAA,MACN;AAAA,MACA,YAAY;AAAA,MACZ,QAAQ,MAA+B;AACtC,iBAAS,IAAI,MAAM,KAAK,OAAO,WAAW,EAAE,OAAO,SAAS,IAAI,MAAS;AACzE,eAAO,KAAK;AAAA,MACb;AAAA,MACA,GAAI,MAAM,OAAO,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,SAAS,GAAG,QAAQ,EAAE,IAAI,CAAC;AAAA,IACrE,CAAC;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,KAAK,YAAY;AACnC;AAkCO,SAAS,gBACf,OACA,OACA,SACS;AACT,QAAM,YAAY,MAAM,SAAS,EAAE,MAAM,CAAC;AAC1C,QAAM,cAAc,SAAS,eAAe;AAC5C,QAAM,YAAY,SAAS,aAAa;AAGxC,QAAM,UAAwB,CAAC;AAE/B,QAAM,eAAe,SAAS;AAC9B,aAAW,CAAC,MAAMA,KAAI,KAAK,OAAO,QAAQ,UAAU,KAAK,GAAG;AAC3D,UAAM,OAAOA,MAAK,KAAK;AACvB,UAAM,SAASA,MAAK,KAAK;AAEzB,QAAI,CAAC,QAAQ,CAAC,OAAQ;AAEtB,QAAI,gBAAgB,QAAQA,MAAK,KAAK,MAAM;AAC3C,YAAM,WAAW,aAAa,IAAI,IAAI;AACtC,UAAI,YAAY,QAAQ,SAAS,OAAOA,MAAK,EAAE,MAAMA,MAAK,EAAE,WAAW,SAAS;AAC/E;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ;AACtB,UAAM,QAAQA,MAAK;AACnB,UAAM,OAAOA,MAAK,KAAK;AAEvB,QAAI;AACJ,QAAI,WAAW,cAAc,OAAO,UAAU,UAAU;AACvD,kBAAY,IAAI,MAAM,QAAQ,CAAC,CAAC;AAAA,IACjC,WAAW,WAAW,gBAAgB,OAAO,UAAU,UAAU;AAChE,kBAAY,IAAI,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAAA,IACxC,WAAW,UAAU,UAAa,UAAU,MAAM;AACjD,kBAAY;AAAA,IACb,OAAO;AACN,kBAAY,OAAO,KAAK;AAAA,IACzB;AAEA,QAAI,QAAQ,WAAW,cAAc,WAAW,cAAc;AAC7D,kBAAY,GAAG,SAAS,IAAI,IAAI;AAAA,IACjC;AAEA,YAAQ,KAAK,EAAE,MAAM,aAAa,OAAO,UAAU,CAAC;AAAA,EACrD;AAEA,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,MAAI,aAAa;AAChB,UAAM,YAAY,oBAAI,IAA0B;AAChD,UAAM,YAA0B,CAAC;AAEjC,eAAW,SAAS,SAAS;AAC5B,YAAMA,QAAO,UAAU,MAAM,MAAM,IAAI;AACvC,YAAM,OAAOA,MAAK,KAAK;AACvB,UAAI,QAAQ,KAAK,SAAS,GAAG;AAE5B,cAAM,MAAM,KAAK,CAAC;AAClB,YAAI,QAAQ,UAAU,IAAI,GAAG;AAC7B,YAAI,CAAC,OAAO;AACX,kBAAQ,CAAC;AACT,oBAAU,IAAI,KAAK,KAAK;AAAA,QACzB;AACA,cAAM,KAAK,KAAK;AAAA,MACjB,OAAO;AACN,kBAAU,KAAK,KAAK;AAAA,MACrB;AAAA,IACD;AAEA,QAAI,UAAU,SAAS,GAAG;AACzB,aAAO,QAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,WAAW,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,SAAS;AAAA,IAC/E;AAEA,UAAM,WAAqB,CAAC;AAC5B,eAAW,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,UAAU,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,GAAG;AAC7F,eAAS;AAAA,QACR,IAAI,GAAG,IAAI,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,KAAK,EAAE,WAAW,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,SAAS,CAAC;AAAA,MAC9F;AAAA,IACD;AACA,QAAI,UAAU,SAAS,GAAG;AACzB,eAAS,KAAK,UAAU,IAAI,CAAC,MAAM,KAAK,EAAE,WAAW,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,SAAS,CAAC;AAAA,IACzF;AACA,WAAO,SAAS,KAAK,YAAY,SAAS;AAAA,EAC3C;AAEA,SAAO,QAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,WAAW,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,SAAS;AAC/E;AAYA,IAAM,mBAAmB,oBAAI,IAAI,CAAC,SAAS,WAAW,YAAY,YAAY,QAAQ,CAAC;AAehF,SAAS,iBAAiB,KAAkC;AAClE,QAAM,SAAmB,CAAC;AAE1B,MAAI,OAAO,QAAQ,OAAO,QAAQ,UAAU;AAC3C,WAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,sCAAsC,EAAE;AAAA,EACzE;AAEA,QAAM,IAAI;AAEV,MAAI,OAAO,EAAE,SAAS,YAAY,EAAE,KAAK,WAAW,GAAG;AACtD,WAAO,KAAK,+BAA+B;AAAA,EAC5C;AAEA,MAAI,EAAE,SAAS,QAAQ,OAAO,EAAE,UAAU,YAAY,MAAM,QAAQ,EAAE,KAAK,GAAG;AAC7E,WAAO,KAAK,sDAAsD;AAClE,WAAO,EAAE,OAAO,OAAO,OAAO;AAAA,EAC/B;AAEA,QAAM,YAAY,IAAI,IAAI,OAAO,KAAK,EAAE,KAAe,CAAC;AAExD,aAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,EAAE,KAAgC,GAAG;AAC7E,QAAI,OAAO,QAAQ,OAAO,QAAQ,UAAU;AAC3C,aAAO,KAAK,SAAS,IAAI,sBAAsB;AAC/C;AAAA,IACD;AACA,UAAMA,QAAO;AACb,QAAI,OAAOA,MAAK,SAAS,YAAY,CAAC,iBAAiB,IAAIA,MAAK,IAAI,GAAG;AACtE,aAAO;AAAA,QACN,SAAS,IAAI,oBAAoB,OAAOA,MAAK,IAAI,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,EAAE,KAAK,IAAI,CAAC;AAAA,MACnG;AAAA,IACD;AACA,QAAI,MAAM,QAAQA,MAAK,IAAI,GAAG;AAC7B,iBAAW,OAAOA,MAAK,MAAM;AAC5B,YAAI,OAAO,QAAQ,YAAY,CAAC,UAAU,IAAI,GAAG,GAAG;AACnD,iBAAO,KAAK,SAAS,IAAI,WAAW,GAAG,uCAAuC;AAAA,QAC/E;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,MAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,GAAG;AAC5B,QAAI,EAAE,UAAU,QAAW;AAC1B,aAAO,KAAK,0BAA0B;AAAA,IACvC;AAAA,EAED,OAAO;AACN,UAAM,OAAO,oBAAI,IAAY;AAC7B,aAAS,IAAI,GAAG,IAAK,EAAE,MAAoB,QAAQ,KAAK;AACvD,YAAM,OAAQ,EAAE,MAAoB,CAAC;AACrC,UAAI,QAAQ,QAAQ,OAAO,SAAS,UAAU;AAC7C,eAAO,KAAK,SAAS,CAAC,sBAAsB;AAC5C;AAAA,MACD;AACA,YAAM,IAAI;AACV,UAAI,OAAO,EAAE,SAAS,YAAY,CAAC,UAAU,IAAI,EAAE,IAAI,GAAG;AACzD,eAAO,KAAK,SAAS,CAAC,cAAc,OAAO,EAAE,IAAI,CAAC,uCAAuC;AAAA,MAC1F;AACA,UAAI,OAAO,EAAE,OAAO,YAAY,CAAC,UAAU,IAAI,EAAE,EAAE,GAAG;AACrD,eAAO,KAAK,SAAS,CAAC,YAAY,OAAO,EAAE,EAAE,CAAC,uCAAuC;AAAA,MACtF;AACA,YAAM,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,EAAE;AAC9B,UAAI,KAAK,IAAI,GAAG,GAAG;AAClB,eAAO,KAAK,SAAS,CAAC,qBAAqB,GAAG,EAAE;AAAA,MACjD;AACA,WAAK,IAAI,GAAG;AAAA,IACb;AAAA,EACD;AAEA,SAAO,EAAE,OAAO,OAAO,WAAW,GAAG,OAAO;AAC7C;AAiBA,SAAS,YAAY,MAAsB;AAC1C,QAAM,QAAQ,KAAK,MAAM,0CAA0C;AACnE,SAAO,QAAQ,MAAM,CAAC,IAAK;AAC5B;AAEA,IAAM,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiDtC,eAAsB,cACrB,iBACA,SACA,MACiB;AACjB,QAAM,eAAe,MAAM,oBACxB,GAAG,6BAA6B;AAAA;AAAA,EAAO,KAAK,iBAAiB,KAC7D;AAEH,QAAM,WAA0B;AAAA,IAC/B,EAAE,MAAM,UAAU,SAAS,aAAa;AAAA,IACxC,EAAE,MAAM,QAAQ,SAAS,gBAAgB;AAAA,EAC1C;AAEA,QAAM,YAAY,QAAQ,OAAO,UAAU;AAAA,IAC1C,OAAO,MAAM;AAAA,IACb,aAAa,MAAM,eAAe;AAAA,IAClC,WAAW,MAAM;AAAA,EAClB,CAAC;AAED,QAAM,WAAY,MAAM,yBAAyB,SAAS;AAC1D,MAAI,UAAU,SAAS,QAAQ,KAAK;AAGpC,MAAI,QAAQ,WAAW,KAAK,GAAG;AAC9B,cAAU,YAAY,OAAO;AAAA,EAC9B;AAEA,MAAI;AACJ,MAAI;AACH,aAAS,KAAK,MAAM,OAAO;AAAA,EAC5B,QAAQ;AACP,UAAM,IAAI,MAAM,kDAAkD,QAAQ,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,EAC1F;AAEA,QAAM,aAAa,iBAAiB,MAAM;AAC1C,MAAI,CAAC,WAAW,OAAO;AACtB,UAAM,IAAI,MAAM;AAAA,EAA6C,WAAW,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,EAC5F;AAEA,QAAM,MAAM;AAEZ,MAAI,IAAI,YAAY,OAAW,KAAI,UAAU;AAC7C,MAAI,CAAC,MAAM,QAAQ,IAAI,SAAS,EAAG,KAAI,YAAY,CAAC;AACpD,SAAO,MAAM,aAAa,KAA6B,MAAM,KAAK;AACnE;AAwCA,IAAM,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqCvC,eAAsB,gBACrB,OACA,SACA,SACA,MACwB;AACxB,QAAM,YAAY,MAAM,SAAS,EAAE,OAAO,MAAM,MAAM,CAAC;AAEvD,QAAM,WAA0B;AAAA,IAC/B,EAAE,MAAM,UAAU,SAAS,+BAA+B;AAAA,IAC1D;AAAA,MACC,MAAM;AAAA,MACN,SAAS,KAAK,UAAU;AAAA,QACvB,OAAO;AAAA,QACP;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD;AAEA,QAAM,YAAY,QAAQ,OAAO,UAAU;AAAA,IAC1C,OAAO,MAAM;AAAA,IACb,aAAa,MAAM,eAAe;AAAA,IAClC,WAAW,MAAM;AAAA,EAClB,CAAC;AAED,QAAM,WAAY,MAAM,yBAAyB,SAAS;AAC1D,MAAI,UAAU,SAAS,QAAQ,KAAK;AAEpC,MAAI,QAAQ,WAAW,KAAK,GAAG;AAC9B,cAAU,QAAQ,QAAQ,oBAAoB,EAAE,EAAE,QAAQ,WAAW,EAAE;AAAA,EACxE;AAEA,MAAI;AACJ,MAAI;AACH,aAAS,KAAK,MAAM,OAAO;AAAA,EAC5B,QAAQ;AACP,UAAM,IAAI,MAAM,oDAAoD,QAAQ,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,EAC5F;AAEA,QAAM,OAAO;AAEb,MAAI,OAAO,KAAK,YAAY,UAAU;AACrC,UAAM,IAAI,MAAM,gDAAgD;AAAA,EACjE;AACA,MAAI,OAAO,KAAK,cAAc,UAAU;AACvC,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACnE;AACA,MAAI,CAAC,MAAM,QAAQ,KAAK,UAAU,GAAG;AACpC,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC1E;AAEA,SAAO;AAAA,IACN,SAAS,KAAK;AAAA,IACd,WAAW,KAAK;AAAA,IAChB,YAAY,KAAK;AAAA,EAClB;AACD;;;AEvoEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBA,IAAM,uBAAuB;AAE7B,SAAS,sBAAsB,OAAe,OAAuB;AACpE,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG;AACrE,UAAM,IAAI,MAAM,GAAG,KAAK,iCAAiC;AAAA,EAC1D;AACA,SAAO;AACR;AAMA,SAASC,WAAU,GAA8B;AAChD,SAAO,EAAE,UAAU,MAAM;AAAA,EAAC,CAAC;AAC5B;AAEA,SAAS,cAAc,MAAc,OAA0D;AAC9F,SAAO;AAAA,IACN,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,GAAI,SAAS,CAAC;AAAA,EACf;AACD;AAOO,IAAM,aAAN,cAA4B,MAAM;AAAA,EACvB;AAAA,EACA,sBAAyC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EAET,YAAY,MAAc,OAAqB,CAAC,GAAG;AAClD,UAAM,MAAM,KAAK,KAAK;AACtB,SAAK,OAAO,YAAe,CAAC,GAAG,EAAE,MAAM,UAAU,SAAS,KAAK,cAAc,CAAC;AAC9E,SAAK,SAAS,KAAK,KAAK;AACxB,SAAK,IAAI,UAAU,KAAK,MAAM;AAC9B,SAAK,SAAS;AAAA,MACb,CAAC,KAAK,MAAM;AAAA,MACZ,CAAC,CAAC,QAAQ,MAAM;AACf,cAAM,UAAW,SAAoC,MAAM;AAC3D,eAAO,QAAQ,WAAW,IAAI,SAAY,QAAQ,QAAQ,SAAS,CAAC;AAAA,MACrE;AAAA,MACA;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd,MAAM,cAAc,cAAc;AAAA,QAClC,SAAS;AAAA,MACV;AAAA,IACD;AACA,SAAK,IAAI,UAAU,KAAK,MAAM;AAC9B,SAAK,QAAQ,UAAU,QAAQ;AAC/B,SAAK,oBAAoB,KAAKA,WAAU,KAAK,MAAM,CAAC;AAAA,EACrD;AAAA,EAES,UAAgB;AACxB,eAAW,WAAW,KAAK,oBAAqB,SAAQ;AACxD,SAAK,oBAAoB,SAAS;AAClC,UAAM,QAAQ;AAAA,EACf;AAAA,EAEA,QAAQ,OAAgB;AACvB,SAAK,KAAK,OAAO,KAAK;AAAA,EACvB;AAAA,EAEA,WAAyB;AACxB,UAAM,WAAW,KAAK,OAAO,IAAI;AACjC,WAAO,SAAS,MAAM;AAAA,EACvB;AACD;AAOO,IAAM,oBAAN,cAAmC,MAAM;AAAA,EAC9B,sBAAyC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,MAAc,YAA2B,OAA4B,CAAC,GAAG;AACpF,UAAM,MAAM,KAAK,KAAK;AACtB,UAAM,gBAAgB,sBAAsB,KAAK,UAAU,GAAG,qBAAqB;AACnF,SAAK,MAAM,SAAS,UAAU;AAC9B,UAAM,cAAc,WAAW;AAC/B,SAAK,SAAS,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC,QAAQ,MAAM,UAAoC;AAAA,MACxF,MAAM;AAAA,MACN,cAAc;AAAA,MACd,MAAM,cAAc,qBAAqB;AAAA,MACzC,SAAS,YAAY,IAAI;AAAA,IAC1B,CAAC;AACD,SAAK,IAAI,UAAU,KAAK,MAAM;AAC9B,SAAK,SAAS,MAAM,eAAe;AAAA,MAClC,MAAM;AAAA,MACN,cAAc;AAAA,MACd,MAAM,cAAc,qBAAqB;AAAA,IAC1C,CAAC;AACD,SAAK,IAAI,UAAU,KAAK,MAAM;AAC9B,SAAK,YAAY;AAAA,MAChB,CAAC,KAAK,QAAQ,KAAK,MAAM;AAAA,MACzB,CAAC,CAAC,gBAAgB,MAAM,MAAM;AAC7B,cAAM,UAAW,eAA0C,MAAM;AACjE,cAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAO,UAAqB,CAAC,CAAC;AAC7D,eAAO,QAAQ,MAAM,KAAK;AAAA,MAC3B;AAAA,MACA;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd,MAAM,cAAc,wBAAwB;AAAA,QAC5C,SAAS,CAAC;AAAA,MACX;AAAA,IACD;AACA,SAAK,IAAI,aAAa,KAAK,SAAS;AACpC,SAAK,QAAQ,iBAAiB,QAAQ;AACtC,SAAK,QAAQ,UAAU,WAAW;AAClC,SAAK,QAAQ,UAAU,WAAW;AAClC,SAAK,oBAAoB,KAAKA,WAAU,KAAK,MAAM,CAAC;AACpD,SAAK,oBAAoB,KAAKA,WAAU,KAAK,SAAS,CAAC;AAAA,EACxD;AAAA,EAES,UAAgB;AACxB,eAAW,WAAW,KAAK,oBAAqB,SAAQ;AACxD,SAAK,oBAAoB,SAAS;AAClC,UAAM,QAAQ;AAAA,EACf;AAAA,EAEA,IAAI,OAAwB;AAC3B,UAAM,YAAY,KAAK,UAAU,IAAI;AACrC,UAAM,YACL,UAAU,SACP,UAAU,SACV,sBAAsB,OAAO,wBAAwB;AACzD,UAAM,OAAO,KAAK,IAAI,WAAW,UAAU,MAAM;AACjD,QAAI,QAAQ,EAAG,QAAO,KAAK,OAAO,IAAI;AACtC,UAAM,OAAQ,KAAK,OAAO,IAAI,IAAe;AAC7C,SAAK,OAAO,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;AAC/B,WAAO;AAAA,EACR;AAAA,EAEA,KAAK,OAAgB,OAA0B,CAAC,GAAiB;AAChE,UAAM,YAAY,KAAK,UAAU,IAAI;AACrC,UAAM,MACL,UAAU,SACP,UAAU,SACV,sBAAsB,OAAO,yBAAyB;AAC1D,UAAM,MAAM,UAAU,MAAM,GAAG,GAAG;AAClC,QAAI,KAAK,OAAO,IAAI,SAAS,EAAG,MAAK,IAAI,IAAI,MAAM;AACnD,WAAO;AAAA,EACR;AACD;AAgBO,IAAM,gBAAN,cAA+B,MAAM;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,sBAAyC,CAAC;AAAA,EACnD,OAAO;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,MAAc,OAAwB,CAAC,GAAG;AACrD,UAAM,MAAM,KAAK,KAAK;AACtB,SAAK,WAAW,aAAqB,CAAC,GAAG,EAAE,MAAM,UAAU,CAAC;AAC5D,SAAK,QAAQ,YAAoC,EAAE,MAAM,OAAO,CAAC;AACjE,SAAK,UAAU,KAAK,SAAS;AAC7B,SAAK,OAAO,KAAK,MAAM;AACvB,SAAK,IAAI,WAAW,KAAK,OAAO;AAChC,SAAK,IAAI,QAAQ,KAAK,IAAI;AAC1B,SAAK,QAAQ;AAAA,MACZ,CAAC,KAAK,OAAO;AAAA,MACb,CAAC,CAAC,QAAQ,MAAO,SAA0C,MAAM,MAAM;AAAA,MACvE;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd,MAAM,cAAc,aAAa;AAAA,QACjC,SAAS;AAAA,MACV;AAAA,IACD;AACA,SAAK,IAAI,SAAS,KAAK,KAAK;AAC5B,SAAK,QAAQ,WAAW,OAAO;AAC/B,SAAK,oBAAoB,KAAKA,WAAU,KAAK,KAAK,CAAC;AAAA,EACpD;AAAA,EAES,UAAgB;AACxB,eAAW,WAAW,KAAK,oBAAqB,SAAQ;AACxD,SAAK,oBAAoB,SAAS;AAClC,UAAM,QAAQ;AAAA,EACf;AAAA,EAEA,QAAQ,SAAY,OAA4D,CAAC,GAAW;AAC3F,UAAM,KAAK,KAAK,MAAM,GAAG,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI;AACjD,QAAI,KAAK,MAAM,IAAI,EAAE,MAAM,QAAW;AACrC,YAAM,IAAI,MAAM,aAAa,KAAK,IAAI,yBAAyB,EAAE,GAAG;AAAA,IACrE;AACA,UAAM,MAAsB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,UAAU,OAAO,OAAO,EAAE,GAAI,KAAK,YAAY,CAAC,EAAG,CAAC;AAAA,MACpD,OAAO;AAAA,IACR;AACA,SAAK,MAAM,IAAI,IAAI,GAAG;AACtB,SAAK,SAAS,OAAO,EAAE;AACvB,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,QAAQ,GAA8B;AAC3C,UAAM,MAAM,sBAAsB,OAAO,uBAAuB;AAChE,QAAI,QAAQ,EAAG,QAAO,CAAC;AACvB,UAAM,MAAwB,CAAC;AAC/B,WAAO,IAAI,SAAS,KAAK;AACxB,YAAM,WAAW,KAAK,QAAQ,IAAI;AAClC,YAAM,MAAM,SAAS,MAAM;AAC3B,UAAI,IAAI,WAAW,EAAG;AACtB,YAAM,KAAK,KAAK,SAAS,IAAI,CAAC;AAC9B,YAAM,MAAM,KAAK,MAAM,IAAI,EAAE;AAC7B,UAAI,CAAC,OAAO,IAAI,UAAU,SAAU;AACpC,YAAM,WAA2B;AAAA,QAChC,GAAG;AAAA,QACH,OAAO;AAAA,QACP,UAAU,IAAI,WAAW;AAAA,MAC1B;AACA,WAAK,MAAM,IAAI,IAAI,QAAQ;AAC3B,UAAI,KAAK,QAAQ;AAAA,IAClB;AACA,WAAO;AAAA,EACR;AAAA,EAEA,IAAI,IAAqB;AACxB,UAAM,MAAM,KAAK,MAAM,IAAI,EAAE;AAC7B,QAAI,CAAC,OAAO,IAAI,UAAU,WAAY,QAAO;AAC7C,SAAK,MAAM,OAAO,EAAE;AACpB,WAAO;AAAA,EACR;AAAA,EAEA,KAAK,IAAY,OAA8B,CAAC,GAAY;AAC3D,UAAM,MAAM,KAAK,MAAM,IAAI,EAAE;AAC7B,QAAI,CAAC,OAAO,IAAI,UAAU,WAAY,QAAO;AAC7C,QAAI,KAAK,WAAW,MAAM;AACzB,WAAK,MAAM,IAAI,IAAI,EAAE,GAAG,KAAK,OAAO,SAAS,CAAC;AAC9C,WAAK,SAAS,OAAO,EAAE;AACvB,aAAO;AAAA,IACR;AACA,SAAK,MAAM,OAAO,EAAE;AACpB,WAAO;AAAA,EACR;AACD;AAQO,IAAM,eAAN,cAA8B,MAAM;AAAA,EACzB;AAAA,EACA,UAAU,oBAAI,IAA8B;AAAA,EAC5C,sBAAyC,CAAC;AAAA,EAC1C;AAAA,EACR;AAAA,EACA;AAAA,EAET,YAAY,MAAc,OAAuB,CAAC,GAAG;AACpD,UAAM,MAAM,KAAK,KAAK;AACtB,UAAM,UAAU,KAAK,UAAU,CAAC,YAAY,cAAc,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACtF,QAAI,OAAO,SAAS,GAAG;AACtB,YAAM,IAAI,MAAM,YAAY,IAAI,gCAAgC;AAAA,IACjE;AACA,UAAM,SAAS,IAAI,IAAI,MAAM;AAC7B,QAAI,OAAO,SAAS,OAAO,QAAQ;AAClC,YAAM,IAAI,MAAM,YAAY,IAAI,gCAAgC;AAAA,IACjE;AACA,SAAK,cAAc,OAAO,OAAO,CAAC,GAAG,MAAM,CAAC;AAC5C,eAAW,SAAS,KAAK,aAAa;AACrC,YAAM,IAAI,SAAY,GAAG,IAAI,IAAI,KAAK,EAAE;AACxC,WAAK,QAAQ,IAAI,OAAO,CAAC;AACzB,WAAK,MAAM,OAAO,CAAC;AAAA,IACpB;AACA,SAAK,aAAa,YAA4B,CAAC,GAAG,EAAE,MAAM,YAAY,CAAC;AACvE,SAAK,YAAY,KAAK,WAAW;AACjC,SAAK,IAAI,aAAa,KAAK,SAAS;AACpC,SAAK,iBAAiB;AAAA,MACrB,CAAC,KAAK,SAAS;AAAA,MACf,CAAC,CAAC,QAAQ,MAAO,SAAiD,MAAM,QAAQ;AAAA,MAChF;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd,MAAM,cAAc,0BAA0B;AAAA,QAC9C,SAAS;AAAA,MACV;AAAA,IACD;AACA,SAAK,IAAI,kBAAkB,KAAK,cAAc;AAC9C,SAAK,QAAQ,aAAa,gBAAgB;AAC1C,SAAK,oBAAoB,KAAKA,WAAU,KAAK,cAAc,CAAC;AAE5D,UAAM,aAAa,KAAK;AAAA,MACvB;AAAA,MACA,sBAAsB,KAAK,cAAc,sBAAsB,qBAAqB;AAAA,IACrF;AACA,aAAS,IAAI,GAAG,IAAI,KAAK,YAAY,QAAQ,KAAK,GAAG;AACpD,YAAM,QAAQ,KAAK,YAAY,CAAC;AAChC,YAAM,UAAU,KAAK,MAAM,KAAK;AAChC,YAAM,OACL,IAAI,IAAI,KAAK,YAAY,SAAS,KAAK,MAAM,KAAK,YAAY,IAAI,CAAC,CAAW,IAAI;AACnF,YAAM,OAAO;AAAA,QACZ,CAAC,QAAQ,OAAO;AAAA,QAChB,MAAM;AACL,cAAI,QAAQ;AACZ,iBAAO,QAAQ,YAAY;AAC1B,kBAAM,QAAQ,QAAQ,MAAM,CAAC;AAC7B,gBAAI,MAAM,WAAW,EAAG;AACxB,kBAAM,MAAM,MAAM,CAAC;AACnB,gBAAI,CAAC,IAAK;AACV,gBAAI,MAAM;AACT,mBAAK,QAAQ,IAAI,SAAS;AAAA,gBACzB,UAAU;AAAA,kBACT,GAAG,IAAI;AAAA,kBACP,eAAe;AAAA,gBAChB;AAAA,cACD,CAAC;AAAA,YACF,OAAO;AACN,mBAAK,WAAW,OAAO,GAAG;AAAA,YAC3B;AACA,oBAAQ,IAAI,IAAI,EAAE;AAClB,qBAAS;AAAA,UACV;AAAA,QACD;AAAA,QACA;AAAA,UACC,MAAM,QAAQ,KAAK;AAAA,UACnB,cAAc;AAAA,UACd,MAAM,cAAc,eAAe;AAAA,QACpC;AAAA,MACD;AACA,WAAK,IAAI,QAAQ,KAAK,IAAI,IAAI;AAC9B,WAAK,QAAQ,GAAG,KAAK,aAAa,QAAQ,KAAK,EAAE;AACjD,WAAK,oBAAoB,KAAKA,WAAU,IAAI,CAAC;AAAA,IAC9C;AAAA,EACD;AAAA,EAES,UAAgB;AACxB,eAAW,WAAW,KAAK,oBAAqB,SAAQ;AACxD,SAAK,oBAAoB,SAAS;AAClC,UAAM,QAAQ;AAAA,EACf;AAAA,EAEA,SAA4B;AAC3B,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,MAAM,OAAiC;AACtC,UAAM,IAAI,KAAK,QAAQ,IAAI,KAAK;AAChC,QAAI,CAAC,EAAG,OAAM,IAAI,MAAM,YAAY,KAAK,IAAI,sBAAsB,KAAK,GAAG;AAC3E,WAAO;AAAA,EACR;AAAA,EAEA,QAAQ,SAAY,OAA4D,CAAC,GAAW;AAC3F,WAAO,KAAK,MAAM,KAAK,YAAY,CAAC,CAAW,EAAE,QAAQ,SAAS,IAAI;AAAA,EACvE;AAAA,EAEA,oBAA+C;AAC9C,UAAM,WAAW,KAAK,UAAU,IAAI;AACpC,WAAO,SAAS,MAAM;AAAA,EACvB;AACD;AASO,IAAM,mBAAN,cAAgD,MAAM;AAAA,EAC3C;AAAA,EACA;AAAA,EACA,sBAAyC,CAAC;AAAA,EAClD;AAAA,EAET,YACC,MACA,aACA,aACA,OAAsC,CAAC,GACtC;AACD,UAAM,MAAM,KAAK,KAAK;AACtB,SAAK,aAAa,aAAkB,GAAG,IAAI,iBAAiB,aAAa;AAAA,MACxE,QAAQ,KAAK;AAAA,IACd,CAAC;AACD,SAAK,UAAU;AACf,SAAK,MAAM,gBAAgB,KAAK,UAAU;AAC1C,SAAK,eAAe,MAAM,GAAG;AAAA,MAC5B,MAAM;AAAA,MACN,cAAc;AAAA,MACd,MAAM,cAAc,oBAAoB;AAAA,IACzC,CAAC;AACD,SAAK,IAAI,gBAAgB,KAAK,YAAY;AAE1C,UAAM,aAAa,KAAK;AAAA,MACvB;AAAA,MACA,sBAAsB,KAAK,cAAc,sBAAsB,yBAAyB;AAAA,IACzF;AACA,UAAM,WAAW,KAAK,QAAQ,CAAC,UAAe;AAC9C,UAAM,OAAO;AAAA,MACZ,CAAC,KAAK,WAAW,SAAS;AAAA,MAC1B,MAAM;AACL,cAAM,YAAY,KAAK,WAAW,KAAK,YAAY,EAAE,KAAK,KAAK,CAAC;AAChE,YAAI,UAAU,WAAW,EAAG;AAC5B,YAAI,UAAU;AACd,mBAAW,SAAS,WAAW;AAC9B,gBAAM,SAAS,SAAS,KAAY;AACpC,cAAI,WAAW,OAAW;AAC1B,eAAK,QAAQ,QAAQ,MAAM;AAC3B,qBAAW;AAAA,QACZ;AACA,YAAI,UAAU,GAAG;AAChB,gBAAM,UAAU,KAAK,aAAa,IAAI;AACtC,eAAK,aAAa,KAAK,CAAC,CAAC,MAAM,UAAU,OAAO,CAAC,CAAC;AAAA,QACnD;AAAA,MACD;AAAA,MACA;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd,MAAM,cAAc,mBAAmB;AAAA,MACxC;AAAA,IACD;AACA,SAAK,IAAI,QAAQ,IAAI;AACrB,SAAK,QAAQ,2BAA2B,MAAM;AAC9C,SAAK,oBAAoB,KAAKA,WAAU,IAAI,CAAC;AAAA,EAC9C;AAAA,EAES,UAAgB;AACxB,eAAW,WAAW,KAAK,oBAAqB,SAAQ;AACxD,SAAK,oBAAoB,SAAS;AAClC,UAAM,QAAQ;AAAA,EACf;AACD;AAKO,SAAS,MAAS,MAAc,MAAoC;AAC1E,SAAO,IAAI,WAAc,MAAM,IAAI;AACpC;AAKO,SAAS,aACf,MACA,YACA,MACuB;AACvB,SAAO,IAAI,kBAAqB,MAAM,YAAY,IAAI;AACvD;AAKO,SAAS,SAAY,MAAc,MAA0C;AACnF,SAAO,IAAI,cAAiB,MAAM,IAAI;AACvC;AAKO,SAAS,QAAW,MAAc,MAAwC;AAChF,SAAO,IAAI,aAAgB,MAAM,IAAI;AACtC;AAKO,SAAS,YACf,MACA,aACA,aACA,MAC8B;AAC9B,SAAO,IAAI,iBAA4B,MAAM,aAAa,aAAa,IAAI;AAC5E;;;ACvgBA;AAAA;AAAA;AAAA;AAAA,iBAAAC;AAAA,EAAA,YAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4CA,SAAS,WAAW,OAAc,KAAsD;AACvF,MAAI,OAAO,QAAQ,UAAU;AAC5B,WAAO,EAAE,MAAM,MAAM,QAAQ,GAAG,GAAG,MAAM,IAAI;AAAA,EAC9C;AACA,QAAM,OAAO,uBAAuB,OAAO,GAAG;AAC9C,MAAI,CAAC,MAAM;AACV,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AACA,SAAO,EAAE,MAAM,KAAK,KAAK;AAC1B;AAEA,SAAS,uBAAuB,OAAc,QAA2C;AACxF,QAAM,YAAY,MAAM,SAAS;AACjC,QAAM,cAAc,KAAK,kBAAkB;AAC3C,aAAW,QAAQ,OAAO,KAAK,UAAU,KAAK,EAAE,KAAK,GAAG;AACvD,QAAI,KAAK,SAAS,WAAW,EAAG;AAChC,QAAI;AACH,UAAI,MAAM,QAAQ,IAAI,MAAM,OAAQ,QAAO;AAAA,IAC5C,QAAQ;AAAA,IAER;AAAA,EACD;AACA,SAAO;AACR;AAEA,SAAS,aACR,OACA,MACA,MACA,UACO;AACP,QAAM,IAAI,MAAM,IAAI;AACpB,aAAW,QAAQ,UAAU;AAC5B,UAAM,QAAQ,MAAM,IAAI;AAAA,EACzB;AACD;AAEA,SAAS,SAAS,MAAc,MAAyD;AACxF,SAAO;AAAA,IACN,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,GAAI,QAAQ,CAAC;AAAA,EACd;AACD;AAEA,SAAS,qBAAqB,KAAsB;AACnD,QAAM,cAAc,CAAC,UAA0B;AAC9C,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,WAAO,OAAO,OAAO;AAAA,EACtB;AACA,MAAI;AACJ,MAAI,OAAO,QAAQ,UAAU;AAC5B,aAAS,YAAY,GAAG;AAAA,EACzB,WAAW,QAAQ,MAAM;AACxB,aAAS;AAAA,EACV,OAAO;AACN,aAAS,OAAO,GAAG;AAAA,EACpB;AACA,MAAI,CAAC,OAAO,SAAS,MAAM,EAAG,QAAO;AACrC,SAAO,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC;AACtC;AAKO,SAAS,SAAS,MAAc,MAA4B;AAClE,SAAO,IAAI,MAAM,MAAM,IAAI;AAC5B;AAKO,SAAS,KACf,OACA,MACA,KACA,MACU;AACV,QAAM,UAAU,MAAM,QAAQ,CAAC;AAC/B,QAAM,OAAO,QAAQ,IAAI,CAAC,QAAQ,WAAW,OAAO,GAAG,CAAC;AACxD,QAAM,EAAE,MAAM,OAAO,GAAG,SAAS,IAAI,QAAQ,CAAC;AAC9C,QAAM,OAAO;AAAA,IACZ,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IACtB;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH;AAAA,MACA,cAAc;AAAA,MACd,MAAM,SAAS,QAAQ,MAAM,IAAI;AAAA,IAClC;AAAA,EACD;AACA;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,QAAQ,CAAC,MAAO,EAAE,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,CAAE;AAAA,EAC7C;AACA,SAAO;AACR;AAKO,SAAS,OACf,OACA,MACA,QACA,WACA,MACwB;AACxB,QAAM,MAAM,WAAW,OAAO,MAAM;AACpC,QAAM,OAAO;AAAA,IACZ,CAAC,IAAI,IAAI;AAAA,IACT,CAAC,CAAC,KAAK,OAAO;AAAA,MACb,QAAQ,UAAU,KAAU,IAAI,SAAS;AAAA,MACzC;AAAA,IACD;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH;AAAA,MACA,cAAc;AAAA,MACd,MAAM,SAAS,UAAU,MAAM,IAAI;AAAA,IACpC;AAAA,EACD;AACA,eAAa,OAAO,MAAM,MAAkC,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AACtF,SAAO;AACR;AAKO,SAASC,MACf,OACA,MACA,QACA,SACA,MACU;AACV,QAAM,MAAM,WAAW,OAAO,MAAM;AACpC,QAAM,OAAO,WAAW,OAAO,OAAO;AACtC,QAAM,OAAO;AAAA,IACZ,CAAC,IAAI,MAAM,KAAK,IAAI;AAAA,IACpB,CAAC,OAAO,YAAY;AACnB,YAAM,SAAS,KAAK,KAAK,IAAI;AAC7B,UAAI,CAAC,QAAQ;AACZ,gBAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;AACzB,eAAO;AAAA,MACR;AACA,aAAO,IAAI,KAAK,IAAI;AAAA,IACrB;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH;AAAA,MACA,cAAc;AAAA,MACd,MAAM,SAAS,QAAQ,MAAM,IAAI;AAAA,IAClC;AAAA,EACD;AACA;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,IAAI,MAAM,KAAK,IAAI,EAAE,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AAAA,EACvE;AACA,SAAO;AACR;AASO,SAAS,SACf,OACA,MACA,QACA,UACA,MACU;AACV,QAAM,MAAM,WAAW,OAAO,MAAM;AACpC,QAAM,OAAO,WAAW,OAAO,QAAQ;AACvC,QAAM,aAAa,MAAM,eAAe,CAAC,UAAmB,QAAQ,KAAK;AACzE,QAAM,OAAO;AAAA,IACZ,CAAC,IAAI,MAAM,KAAK,IAAI;AAAA,IACpB,CAAC,OAAO,YAAyB;AAChC,UAAI,CAAC,WAAW,KAAK,KAAK,IAAI,CAAC,GAAG;AACjC,gBAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;AACzB,eAAO;AAAA,MACR;AACA,aAAO,IAAI,KAAK,IAAI;AAAA,IACrB;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH;AAAA,MACA,cAAc;AAAA,MACd,MAAM,SAAS,YAAY,MAAM,IAAI;AAAA,IACtC;AAAA,EACD;AACA;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,IAAI,MAAM,KAAK,IAAI,EAAE,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AAAA,EACvE;AACA,SAAO;AACR;AAKO,SAASC,SACf,OACA,MACA,QACA,KACA,MACU;AACV,QAAM,MAAM,WAAW,OAAO,MAAM;AACpC,MAAI,aAAa;AACjB,QAAM,OAAO,KAAQ,CAAC,IAAI,IAAI,GAAG,MAAM,QAAW;AAAA,IACjD,GAAG;AAAA,IACH;AAAA,IACA,cAAc;AAAA,IACd,0BAA0B;AAAA,IAC1B,MAAM,SAAS,WAAW,MAAM,IAAI;AAAA,IACpC,UAAU,KAAc,UAAkB,SAAsB;AAC/D,UAAI,WAAY,QAAO;AACvB,UAAI,aAAa,GAAG;AACnB,gBAAQ,KAAK,CAAC,GAAG,CAAoB;AACrC,YAAI,IAAI,CAAC,MAAM,YAAY,IAAI,CAAC,MAAM,MAAO,cAAa;AAC1D,eAAO;AAAA,MACR;AACA,UAAI,IAAI,CAAC,MAAM,MAAM;AACpB,YAAI;AACH,cAAI,IAAI,CAAC,GAAQ,OAAO;AACxB,kBAAQ,KAAK,CAAC,GAAG,CAAoB;AAAA,QACtC,SAAS,KAAK;AACb,uBAAa;AACb,kBAAQ,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAoB;AAAA,QAC/C;AACA,eAAO;AAAA,MACR;AACA,cAAQ,KAAK,CAAC,GAAG,CAAoB;AACrC,UAAI,IAAI,CAAC,MAAM,YAAY,IAAI,CAAC,MAAM,MAAO,cAAa;AAC1D,aAAO;AAAA,IACR;AAAA,EACD,CAAC;AACD,eAAa,OAAO,MAAM,MAAkC,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AACtF,SAAO;AACR;AAKO,SAAS,KACf,OACA,MACA,MACA,MACU;AACV,QAAM,WAAW,KAAK,IAAI,CAAC,QAAQ,WAAW,OAAO,GAAG,CAAC;AACzD,QAAM,OAAO;AAAA,IACZ,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAC1B,CAAC,WAAW;AAAA,IACZ;AAAA,MACC,GAAG;AAAA,MACH;AAAA,MACA,cAAc;AAAA,MACd,MAAM,SAAS,QAAQ,MAAM,IAAI;AAAA,IAClC;AAAA,EACD;AACA;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,QAAQ,CAAC,MAAO,EAAE,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,CAAE;AAAA,EACjD;AACA,SAAO;AACR;AAKO,SAAS,KACf,OACA,MACA,QACA,SACA,MACU;AACV,QAAM,MAAM,WAAW,OAAO,MAAM;AACpC,QAAM,UAAU,MAAM;AACtB,QAAM,UACL,OAAO,YAAY,YAAY,YAAY,SAAY,SAAY,WAAW,OAAO,OAAO;AAC7F,QAAM,mBAAmB,OAAO,YAAY,WAAW,UAAU;AACjE,QAAM,OAAO;AAAA,IACZ,UAAU,CAAC,IAAI,MAAM,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI;AAAA,IAC9C,CAAC,OAAO,YAAY;AACnB,UAAI,UAAU,IAAI,KAAK,IAAI;AAC3B,YAAM,WAAW,oBAAoB,SAAS,KAAK,IAAI,KAAK;AAC5D,YAAM,QAAQ,qBAAqB,QAAQ;AAC3C,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK,GAAG;AAClC,kBAAU,QAAQ,SAAS,GAAG,OAAO;AAAA,MACtC;AACA,aAAO;AAAA,IACR;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH;AAAA,MACA,cAAc;AAAA,MACd,MAAM,SAAS,QAAQ,MAAM,IAAI;AAAA,IAClC;AAAA,EACD;AACA;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,IAAI,MAAM,SAAS,IAAI,EAAE,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AAAA,EAC3E;AACA,SAAO;AACR;AAKO,SAAS,YACf,OACA,MACA,cACA,MACQ;AACR,QAAM,QAAQ,wBAAwB,QAAQ,eAAe,SAAS,MAAM,IAAI;AAChF,MAAI,OAAO,iBAAiB,YAAY;AACvC,iBAAa,KAAK;AAAA,EACnB;AACA,QAAM,MAAM,MAAM,KAAK;AACvB,SAAO;AACR;AAKO,SAAS,OACf,OACA,MACA,SACA,MAGoB;AACpB,QAAM,SAAS,KAAQ,CAAC,GAAG,MAAM,QAAW;AAAA,IAC3C,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,MAAM,SAAS,UAAU,MAAM,IAAI;AAAA,EACpC,CAAC;AACD,eAAa,OAAO,MAAM,QAAoC,CAAC,CAAC;AAChE,SAAO;AAAA,IACN,MAAM;AAAA,IACN,KAAK,OAAU;AACd,aAAO,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAoB;AAAA,IAC/C;AAAA,IACA,MAAM,KAAc;AACnB,aAAO,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAoB;AAAA,IAC9C;AAAA,IACA,WAAW;AACV,aAAO,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAoB;AAAA,IAC5C;AAAA,EACD;AACD;AAKO,SAAS,KACf,OACA,MACA,QACA,IACA,MACU;AACV,QAAM,MAAM,WAAW,OAAO,MAAM;AACpC,QAAM,SAAS,oBAAI,IAAmC;AACtD,MAAI,aAAa;AACjB,MAAI,YAAY;AAChB,QAAM,OAAO;AAAA,IACZ,CAAC,IAAI,IAAI;AAAA,IACT,MAAM;AACL,iBAAW,MAAM,OAAQ,cAAa,EAAE;AACxC,aAAO,MAAM;AACb,aAAO,MAAM;AACZ,mBAAW,MAAM,OAAQ,cAAa,EAAE;AACxC,eAAO,MAAM;AACb,qBAAa;AAAA,MACd;AAAA,IACD;AAAA,IACA;AAAA,MACC,GAAG;AAAA,MACH;AAAA,MACA,SAAS,IAAI,KAAK,IAAI;AAAA,MACtB,cAAc;AAAA,MACd,0BAA0B;AAAA,MAC1B,MAAM,SAAS,QAAQ,MAAM,IAAI;AAAA,MACjC,UAAU,KAAc,UAAkB,SAAsB;AAC/D,YAAI,WAAY,QAAO;AACvB,YAAI,aAAa,GAAG;AACnB,kBAAQ,KAAK,CAAC,GAAG,CAAoB;AACrC,cAAI,IAAI,CAAC,MAAM,YAAY,IAAI,CAAC,MAAM,MAAO,cAAa;AAC1D,iBAAO;AAAA,QACR;AACA,YAAI,IAAI,CAAC,MAAM,MAAM;AACpB,gBAAM,KAAK,WAAW,MAAM;AAC3B,mBAAO,OAAO,EAAE;AAChB,oBAAQ,KAAK,CAAC,GAAG,CAAoB;AACrC,gBAAI,aAAa,OAAO,SAAS,GAAG;AACnC,sBAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAoB;AAAA,YAC7C;AAAA,UACD,GAAG,EAAE;AACL,iBAAO,IAAI,EAAE;AACb,iBAAO;AAAA,QACR;AACA,YAAI,IAAI,CAAC,MAAM,UAAU;AACxB,uBAAa;AACb,sBAAY;AACZ,cAAI,OAAO,SAAS,GAAG;AACtB,oBAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAoB;AAAA,UAC7C;AACA,iBAAO;AAAA,QACR;AACA,YAAI,IAAI,CAAC,MAAM,OAAO;AACrB,uBAAa;AACb,qBAAW,MAAM,OAAQ,cAAa,EAAE;AACxC,iBAAO,MAAM;AACb,kBAAQ,KAAK,CAAC,GAAG,CAAoB;AACrC,iBAAO;AAAA,QACR;AACA,gBAAQ,KAAK,CAAC,GAAG,CAAoB;AACrC,eAAO;AAAA,MACR;AAAA,IACD;AAAA,EACD;AACA,eAAa,OAAO,MAAM,MAAkC,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AACtF,SAAO;AACR;AAKO,SAAS,UACf,OACA,MACA,QACA,SACA,MACU;AACV,QAAM,MAAM,WAAW,OAAO,MAAM;AACpC,MAAI,aAAa;AACjB,QAAM,OAAO,KAAQ,CAAC,IAAI,IAAI,GAAG,MAAM,QAAW;AAAA,IACjD,GAAG;AAAA,IACH;AAAA,IACA,cAAc;AAAA,IACd,0BAA0B;AAAA,IAC1B,MAAM,SAAS,aAAa,MAAM,IAAI;AAAA,IACtC,UAAU,KAAc,WAAmB,SAAsB;AAChE,UAAI,WAAY,QAAO;AACvB,UAAI,IAAI,CAAC,MAAM,OAAO;AACrB,YAAI;AACH,kBAAQ,KAAK,QAAQ,IAAI,CAAC,GAAG,OAAO,CAAC;AAAA,QACtC,SAAS,KAAK;AACb,uBAAa;AACb,kBAAQ,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAoB;AAAA,QAC/C;AACA,eAAO;AAAA,MACR;AACA,cAAQ,KAAK,CAAC,GAAG,CAAoB;AACrC,UAAI,IAAI,CAAC,MAAM,SAAU,cAAa;AACtC,aAAO;AAAA,IACR;AAAA,EACD,CAAC;AACD,eAAa,OAAO,MAAM,MAAkC,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AACtF,SAAO;AACR;;;AC/gBO,IAAM,UAAU;","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","forEach","gate","gate","forEach"]}
|