@graphrefly/graphrefly 0.15.0 → 0.16.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-2ZICUAUJ.js → chunk-26A4E7J7.js} +10 -12
- package/dist/chunk-26A4E7J7.js.map +1 -0
- package/dist/{chunk-CRACCCJY.js → chunk-3BLRREFM.js} +29 -5
- package/dist/chunk-3BLRREFM.js.map +1 -0
- package/dist/{chunk-XQ4UMAU7.js → chunk-ITDVOCFO.js} +2 -2
- package/dist/{chunk-YW6LFCFS.js → chunk-LKP7IWRV.js} +3 -3
- package/dist/{chunk-4APC3AFN.js → chunk-RLVFZDCE.js} +22 -49
- package/dist/chunk-RLVFZDCE.js.map +1 -0
- package/dist/{chunk-GKRKDYNT.js → chunk-RZSQ7P2C.js} +3 -3
- package/dist/{chunk-ZHTHUX5D.js → chunk-SHRJH2DN.js} +3 -3
- package/dist/{chunk-H243FWYP.js → chunk-VZY2B2LU.js} +1 -1
- package/dist/{chunk-H243FWYP.js.map → chunk-VZY2B2LU.js.map} +1 -1
- package/dist/{chunk-QVYZD65U.js → chunk-YX263TXI.js} +10 -38
- package/dist/chunk-YX263TXI.js.map +1 -0
- package/dist/compat/nestjs/index.cjs +38 -41
- package/dist/compat/nestjs/index.cjs.map +1 -1
- package/dist/compat/nestjs/index.d.cts +4 -4
- package/dist/compat/nestjs/index.d.ts +4 -4
- package/dist/compat/nestjs/index.js +7 -7
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +2 -2
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js +3 -3
- package/dist/extra/index.cjs +27 -78
- package/dist/extra/index.cjs.map +1 -1
- package/dist/extra/index.d.cts +4 -4
- package/dist/extra/index.d.ts +4 -4
- package/dist/extra/index.js +3 -3
- package/dist/graph/index.cjs +26 -2
- package/dist/graph/index.cjs.map +1 -1
- package/dist/graph/index.d.cts +3 -3
- package/dist/graph/index.d.ts +3 -3
- package/dist/graph/index.js +4 -4
- package/dist/{graph-BXIK5Dq5.d.ts → graph-Dc-P9BVm.d.ts} +15 -3
- package/dist/{graph-BhADtuFU.d.cts → graph-fCsaaVIa.d.cts} +15 -3
- package/dist/{index-DSp5R3Xq.d.ts → index-BBVBYPxr.d.cts} +4 -4
- package/dist/{index-BkToATim.d.ts → index-BR19vQME.d.ts} +1 -1
- package/dist/{index-BNB0KjKe.d.ts → index-BmoUvOGN.d.ts} +1 -1
- package/dist/{index-DBhLjWSV.d.cts → index-ClaKZFPl.d.cts} +100 -31
- package/dist/{index-Dqemj9q0.d.cts → index-DWq0P9T6.d.ts} +4 -4
- package/dist/{index-Wa8jXne6.d.cts → index-Db27z6Ki.d.cts} +1 -1
- package/dist/{index-fYObbpUw.d.ts → index-DhXznWyH.d.ts} +2 -2
- package/dist/{index-DANO9Gg7.d.cts → index-DlGMf_Qe.d.cts} +2 -2
- package/dist/{index-CKyYg4IP.d.ts → index-N704txAA.d.ts} +100 -31
- package/dist/{index-DKIyo4Bq.d.cts → index-YlOH1Gw6.d.cts} +1 -1
- package/dist/index.cjs +109 -186
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +22 -35
- package/dist/index.d.ts +22 -35
- package/dist/index.js +63 -111
- package/dist/index.js.map +1 -1
- package/dist/{meta-CrZUQAJ6.d.cts → meta-BV4pj9ML.d.cts} +6 -0
- package/dist/{meta-CrZUQAJ6.d.ts → meta-BV4pj9ML.d.ts} +6 -0
- package/dist/observable-Cz-AWhwR.d.cts +42 -0
- package/dist/observable-DCqlwGyl.d.ts +42 -0
- package/dist/patterns/reactive-layout/index.cjs +26 -2
- package/dist/patterns/reactive-layout/index.cjs.map +1 -1
- package/dist/patterns/reactive-layout/index.d.cts +3 -3
- package/dist/patterns/reactive-layout/index.d.ts +3 -3
- package/dist/patterns/reactive-layout/index.js +4 -4
- package/package.json +1 -1
- package/dist/chunk-2ZICUAUJ.js.map +0 -1
- package/dist/chunk-4APC3AFN.js.map +0 -1
- package/dist/chunk-CRACCCJY.js.map +0 -1
- package/dist/chunk-QVYZD65U.js.map +0 -1
- package/dist/reactive-log-ChbpUrY2.d.cts +0 -137
- package/dist/reactive-log-DV--7BWd.d.ts +0 -137
- /package/dist/{chunk-XQ4UMAU7.js.map → chunk-ITDVOCFO.js.map} +0 -0
- /package/dist/{chunk-YW6LFCFS.js.map → chunk-LKP7IWRV.js.map} +0 -0
- /package/dist/{chunk-GKRKDYNT.js.map → chunk-RZSQ7P2C.js.map} +0 -0
- /package/dist/{chunk-ZHTHUX5D.js.map → chunk-SHRJH2DN.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/graph/graph.ts"],"sourcesContent":["import type { Actor } from \"../core/actor.js\";\nimport { isBatching } from \"../core/batch.js\";\nimport { monotonicNs } from \"../core/clock.js\";\nimport { GuardDenied } from \"../core/guard.js\";\nimport {\n\tCOMPLETE,\n\tDATA,\n\tDIRTY,\n\tERROR,\n\tINVALIDATE,\n\ttype Messages,\n\tmessageTier,\n\tRESOLVED,\n\tTEARDOWN,\n} from \"../core/messages.js\";\nimport {\n\ttype DescribeDetail,\n\ttype DescribeField,\n\ttype DescribeNodeOutput,\n\tdescribeNode,\n\tresolveDescribeFields,\n} from \"../core/meta.js\";\nimport {\n\ttype Node,\n\tNodeImpl,\n\ttype NodeInspectorHookEvent,\n\ttype NodeSink,\n\ttype NodeTransportOptions,\n} from \"../core/node.js\";\nimport { state as stateNode } from \"../core/sugar.js\";\nimport type { VersioningLevel } from \"../core/versioning.js\";\n\n/** The separator used for qualified paths in {@link Graph.resolve} et al. */\nconst PATH_SEP = \"::\";\n\n/**\n * Reserved segment for meta companion paths: `nodeName::__meta__::metaKey` (GRAPHREFLY-SPEC §3.6).\n * Forbidden as a local node or mount name.\n */\nexport const GRAPH_META_SEGMENT = \"__meta__\";\n\n/** Options for {@link Graph} (reserved for future hooks). */\nexport type GraphOptions = Record<string, unknown>;\n\n/** Filter for {@link Graph.describe} — object-style partial match or predicate. */\nexport type DescribeFilter =\n\t| Partial<Pick<DescribeNodeOutput, \"type\" | \"status\">>\n\t| {\n\t\t\ttype?: DescribeNodeOutput[\"type\"];\n\t\t\tstatus?: DescribeNodeOutput[\"status\"];\n\t\t\t/** Keep nodes whose `deps` includes this qualified path. */\n\t\t\tdepsIncludes?: string;\n\t\t\t/** Snake-case alias for `depsIncludes` (Python parity). */\n\t\t\tdeps_includes?: string;\n\t\t\t/** Keep nodes whose `meta` contains this key. */\n\t\t\tmetaHas?: string;\n\t\t\t/** Snake-case alias for `metaHas` (Python parity). */\n\t\t\tmeta_has?: string;\n\t }\n\t| ((node: DescribeNodeOutput) => boolean)\n\t| ((nodePath: string, node: DescribeNodeOutput) => boolean);\n\n/** Options for {@link Graph.signal} and {@link Graph.set} (actor context, internal lifecycle). */\nexport type GraphActorOptions = {\n\tactor?: Actor;\n\t/**\n\t * When `true`, skips node guards (graph lifecycle TEARDOWN, unmount teardown, etc.).\n\t */\n\tinternal?: boolean;\n};\n\n/** Options for {@link Graph.describe} (Phase 3.3b progressive disclosure). */\nexport type GraphDescribeOptions = {\n\tactor?: Actor;\n\t/**\n\t * Node filter. Filters operate on whatever fields the chosen `detail` level\n\t * provides. For `metaHas` and `status` filters, use `detail: \"standard\"` or\n\t * higher — at `\"minimal\"` those fields are absent and the filter silently\n\t * excludes all nodes.\n\t */\n\tfilter?: DescribeFilter;\n\t/**\n\t * Detail level (Phase 3.3b). Default: `\"minimal\"`.\n\t * - `\"minimal\"` — type + deps only\n\t * - `\"standard\"` — type, status, value, deps, meta, versioning (`v`)\n\t * - `\"full\"` — standard + guard, lastMutation\n\t */\n\tdetail?: DescribeDetail;\n\t/**\n\t * Explicit field selection (GraphQL-style). Overrides `detail` when provided.\n\t * Dotted paths like `\"meta.label\"` select specific meta keys.\n\t */\n\tfields?: DescribeField[];\n\t/**\n\t * Output format (Phase 3.3b).\n\t * - `undefined` — normal describe output\n\t * - `\"spec\"` — GraphSpec input format (no status, no value, deps as edges, type labels)\n\t */\n\tformat?: \"spec\";\n};\n\n/** JSON snapshot from {@link Graph.describe} (GRAPHREFLY-SPEC §3.6, Appendix B). */\nexport type GraphDescribeOutput = {\n\tname: string;\n\tnodes: Record<string, DescribeNodeOutput>;\n\tedges: ReadonlyArray<{ from: string; to: string }>;\n\tsubgraphs: string[];\n\t/**\n\t * Re-read the live graph with higher detail (Phase 3.3b).\n\t * Returns a new `GraphDescribeOutput`; the original remains a snapshot.\n\t * Present on live describe results; absent on deserialized snapshots.\n\t */\n\texpand?: (detailOrFields: DescribeDetail | DescribeField[]) => GraphDescribeOutput;\n};\n\n/**\n * Persisted graph snapshot: {@link GraphDescribeOutput} plus optional format version\n * ({@link Graph.snapshot}, {@link Graph.restore}, {@link Graph.fromSnapshot}, {@link Graph.toObject},\n * {@link Graph.toJSONString} — §3.8).\n */\nexport type GraphPersistSnapshot = GraphDescribeOutput & {\n\tversion?: number;\n};\n\nexport type GraphFactoryContext = {\n\tpath: string;\n\ttype: DescribeNodeOutput[\"type\"];\n\tvalue: unknown;\n\tmeta: Record<string, unknown>;\n\tdeps: readonly string[];\n\tresolvedDeps: readonly Node[];\n};\n\nexport type GraphNodeFactory = (name: string, context: GraphFactoryContext) => Node;\n\n/** @deprecated Use `CheckpointAdapter` from `extra/checkpoint` instead. */\nexport type AutoCheckpointAdapter = {\n\tsave(key: string, data: unknown): void;\n};\n\nexport type GraphCheckpointRecord =\n\t| { mode: \"full\"; snapshot: GraphPersistSnapshot; seq: number }\n\t| { mode: \"diff\"; diff: GraphDiffResult; snapshot: GraphPersistSnapshot; seq: number };\n\nexport type GraphAutoCheckpointOptions = {\n\tdebounceMs?: number;\n\tcompactEvery?: number;\n\tfilter?: (name: string, described: DescribeNodeOutput) => boolean;\n\tonError?: (error: unknown) => void;\n};\n\nexport type GraphAutoCheckpointHandle = {\n\tdispose(): void;\n};\n\n/** Direction options for diagram export helpers. */\nexport type GraphDiagramDirection = \"TD\" | \"LR\" | \"BT\" | \"RL\";\n\n/** Options for {@link Graph.toMermaid} / {@link Graph.toD2}. */\nexport type GraphDiagramOptions = {\n\t/**\n\t * Diagram flow direction.\n\t * - `TD`: top-down\n\t * - `LR`: left-right (default)\n\t * - `BT`: bottom-top\n\t * - `RL`: right-left\n\t */\n\tdirection?: GraphDiagramDirection;\n};\n\n/** Snapshot format version (§3.8). */\nconst SNAPSHOT_VERSION = 1;\n\n/**\n * Validate the snapshot envelope: version, required keys, types. Aligned with\n * Python `_parse_snapshot_envelope`. Throws on invalid data.\n */\nfunction parseSnapshotEnvelope(data: GraphPersistSnapshot): void {\n\tif (data.version !== SNAPSHOT_VERSION) {\n\t\tthrow new Error(\n\t\t\t`unsupported snapshot version ${String(data.version)} (expected ${SNAPSHOT_VERSION})`,\n\t\t);\n\t}\n\tfor (const key of [\"name\", \"nodes\", \"edges\", \"subgraphs\"] as const) {\n\t\tif (!(key in data)) {\n\t\t\tthrow new Error(`snapshot missing required key \"${key}\"`);\n\t\t}\n\t}\n\tif (typeof data.name !== \"string\") {\n\t\tthrow new TypeError(`snapshot 'name' must be a string`);\n\t}\n\tif (typeof data.nodes !== \"object\" || data.nodes === null || Array.isArray(data.nodes)) {\n\t\tthrow new TypeError(`snapshot 'nodes' must be an object`);\n\t}\n\tif (!Array.isArray(data.edges)) {\n\t\tthrow new TypeError(`snapshot 'edges' must be an array`);\n\t}\n\tif (!Array.isArray(data.subgraphs)) {\n\t\tthrow new TypeError(`snapshot 'subgraphs' must be an array`);\n\t}\n}\n\n/** Recursively sort object keys for deterministic JSON (git-diffable). */\nfunction sortJsonValue(value: unknown): unknown {\n\tif (value === null || typeof value !== \"object\") {\n\t\treturn value;\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn value.map(sortJsonValue);\n\t}\n\tconst obj = value as Record<string, unknown>;\n\tconst keys = Object.keys(obj).sort();\n\tconst out: Record<string, unknown> = {};\n\tfor (const k of keys) {\n\t\tout[k] = sortJsonValue(obj[k]);\n\t}\n\treturn out;\n}\n\nfunction stableJsonStringify(value: unknown): string {\n\treturn `${JSON.stringify(sortJsonValue(value))}\\n`;\n}\n\nfunction escapeMermaidLabel(value: string): string {\n\treturn value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"');\n}\n\nfunction escapeD2Label(value: string): string {\n\treturn value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"');\n}\n\nfunction d2DirectionFromGraphDirection(direction: GraphDiagramDirection): string {\n\tif (direction === \"TD\") return \"down\";\n\tif (direction === \"BT\") return \"up\";\n\tif (direction === \"RL\") return \"left\";\n\treturn \"right\";\n}\n\n/** Collect deduplicated (from, to) arrows from deps + edges. */\nfunction collectDiagramArrows(described: GraphDescribeOutput): [string, string][] {\n\tconst seen = new Set<string>();\n\tconst arrows: [string, string][] = [];\n\tfunction add(from: string, to: string): void {\n\t\tconst key = `${from}\\0${to}`;\n\t\tif (seen.has(key)) return;\n\t\tseen.add(key);\n\t\tarrows.push([from, to]);\n\t}\n\tfor (const [path, info] of Object.entries(described.nodes)) {\n\t\tconst deps: string[] | undefined = (info as Record<string, unknown>).deps as\n\t\t\t| string[]\n\t\t\t| undefined;\n\t\tif (deps) {\n\t\t\tfor (const dep of deps) add(dep, path);\n\t\t}\n\t}\n\tfor (const edge of described.edges) add(edge.from, edge.to);\n\treturn arrows;\n}\n\nfunction normalizeDiagramDirection(direction: unknown): GraphDiagramDirection {\n\tif (direction === undefined) return \"LR\";\n\tif (direction === \"TD\" || direction === \"LR\" || direction === \"BT\" || direction === \"RL\") {\n\t\treturn direction;\n\t}\n\tthrow new Error(\n\t\t`invalid diagram direction ${String(direction)}; expected one of: TD, LR, BT, RL`,\n\t);\n}\n\nfunction escapeRegexLiteral(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction globToRegex(pattern: string): RegExp {\n\tlet re = \"^\";\n\tfor (let i = 0; i < pattern.length; i += 1) {\n\t\tconst ch = pattern[i]!;\n\t\tif (ch === \"*\") {\n\t\t\tre += \".*\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"?\") {\n\t\t\tre += \".\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"[\") {\n\t\t\tconst end = pattern.indexOf(\"]\", i + 1);\n\t\t\tif (end <= i + 1) {\n\t\t\t\tre += \"\\\\[\";\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet cls = pattern.slice(i + 1, end);\n\t\t\tif (cls.startsWith(\"!\")) cls = `^${cls.slice(1)}`;\n\t\t\tcls = cls.replace(/\\\\/g, \"\\\\\\\\\");\n\t\t\tre += `[${cls}]`;\n\t\t\ti = end;\n\t\t\tcontinue;\n\t\t}\n\t\tre += escapeRegexLiteral(ch);\n\t}\n\tre += \"$\";\n\treturn new RegExp(re);\n}\n\n/** Fixed-capacity ring buffer — O(1) push and eviction. */\nclass RingBuffer<T> {\n\tprivate buf: (T | undefined)[];\n\tprivate head = 0;\n\tprivate _size = 0;\n\tconstructor(private capacity: number) {\n\t\tthis.buf = new Array(capacity);\n\t}\n\tget size(): number {\n\t\treturn this._size;\n\t}\n\tpush(item: T): void {\n\t\tconst idx = (this.head + this._size) % this.capacity;\n\t\tthis.buf[idx] = item;\n\t\tif (this._size < this.capacity) this._size++;\n\t\telse this.head = (this.head + 1) % this.capacity;\n\t}\n\ttoArray(): T[] {\n\t\tconst result: T[] = [];\n\t\tfor (let i = 0; i < this._size; i++) result.push(this.buf[(this.head + i) % this.capacity]!);\n\t\treturn result;\n\t}\n}\n\nconst SPY_ANSI_THEME: Required<GraphSpyTheme> = {\n\tdata: \"\\u001b[32m\",\n\tdirty: \"\\u001b[33m\",\n\tresolved: \"\\u001b[36m\",\n\tcomplete: \"\\u001b[34m\",\n\terror: \"\\u001b[31m\",\n\tderived: \"\\u001b[35m\",\n\tpath: \"\\u001b[90m\",\n\treset: \"\\u001b[0m\",\n};\n\nconst SPY_NO_COLOR_THEME: Required<GraphSpyTheme> = {\n\tdata: \"\",\n\tdirty: \"\",\n\tresolved: \"\",\n\tcomplete: \"\",\n\terror: \"\",\n\tderived: \"\",\n\tpath: \"\",\n\treset: \"\",\n};\n\nfunction describeData(value: unknown): string {\n\tif (typeof value === \"string\") return JSON.stringify(value);\n\tif (typeof value === \"number\" || typeof value === \"boolean\" || value == null)\n\t\treturn String(value);\n\ttry {\n\t\treturn JSON.stringify(value);\n\t} catch {\n\t\treturn \"[unserializable]\";\n\t}\n}\n\nfunction resolveSpyTheme(theme: GraphSpyOptions[\"theme\"]): Required<GraphSpyTheme> {\n\tif (theme === \"none\") return SPY_NO_COLOR_THEME;\n\tif (theme === \"ansi\" || theme == null) return SPY_ANSI_THEME;\n\treturn {\n\t\tdata: theme.data ?? \"\",\n\t\tdirty: theme.dirty ?? \"\",\n\t\tresolved: theme.resolved ?? \"\",\n\t\tcomplete: theme.complete ?? \"\",\n\t\terror: theme.error ?? \"\",\n\t\tderived: theme.derived ?? \"\",\n\t\tpath: theme.path ?? \"\",\n\t\treset: theme.reset ?? \"\",\n\t};\n}\n\n/** Resolve observe `detail` level into effective boolean flags. */\nfunction resolveObserveDetail(opts?: ObserveOptions): ObserveOptions {\n\tif (opts == null) return {};\n\tconst detail = opts.detail;\n\tif (detail === \"full\") {\n\t\treturn {\n\t\t\t...opts,\n\t\t\tstructured: opts.structured ?? true,\n\t\t\ttimeline: opts.timeline ?? true,\n\t\t\tcausal: opts.causal ?? true,\n\t\t\tderived: opts.derived ?? true,\n\t\t};\n\t}\n\tif (detail === \"minimal\") {\n\t\treturn { ...opts, structured: opts.structured ?? true };\n\t}\n\treturn opts;\n}\n\n/** {@link Graph.observe} on a single node or meta path — sink receives plain message batches. */\nexport type GraphObserveOne = {\n\tsubscribe(sink: NodeSink): () => void;\n\t/** Send messages upstream toward the observed node's sources (e.g. PAUSE/RESUME). */\n\tup(messages: Messages): void;\n};\n\n/**\n * {@link Graph.observe} on the whole graph — sink receives each batch with the qualified source path.\n * Subscription order follows code-point sort on paths (mounts-first walk, then sorted locals/meta).\n */\nexport type GraphObserveAll = {\n\tsubscribe(sink: (nodePath: string, messages: Messages) => void): () => void;\n\t/** Send messages upstream toward a specific observed node's sources (e.g. PAUSE/RESUME). */\n\tup(path: string, messages: Messages): void;\n};\n\n/**\n * Detail level for `observe()` progressive disclosure (Phase 3.3b).\n * - `\"minimal\"` — DATA events only, no timestamps, no causal info.\n * - `\"standard\"` — all message types (DATA, DIRTY, RESOLVED, COMPLETE, ERROR).\n * - `\"full\"` — standard + timeline + causal + derived.\n */\nexport type ObserveDetail = \"minimal\" | \"standard\" | \"full\";\n\n/** Options for structured observation modes on {@link Graph.observe}. */\nexport type ObserveOptions = {\n\tactor?: Actor;\n\t/** Return an {@link ObserveResult} accumulator instead of a raw stream. */\n\tstructured?: boolean;\n\t/** Include causal trace info (which dep triggered each recomputation). */\n\tcausal?: boolean;\n\t/** Include timestamps and batch context on each event. */\n\ttimeline?: boolean;\n\t/** Include per-evaluation dep snapshots for compute/derived nodes. */\n\tderived?: boolean;\n\t/**\n\t * Detail level (Phase 3.3b). Individual flags (`causal`, `timeline`, `derived`)\n\t * override. `\"full\"` implies all three plus structured.\n\t * `\"minimal\"` filters to DATA-only events.\n\t */\n\tdetail?: ObserveDetail;\n};\n\n/** Accumulated observation result (structured mode). */\nexport type ObserveResult<T = unknown> = {\n\t/** Latest DATA value by observed path. */\n\treadonly values: Record<string, T>;\n\t/** Number of DIRTY messages received. */\n\treadonly dirtyCount: number;\n\t/** Number of RESOLVED messages received. */\n\treadonly resolvedCount: number;\n\t/** All events in order. */\n\treadonly events: ObserveEvent[];\n\t/** True if COMPLETE received without prior ERROR. */\n\treadonly completedCleanly: boolean;\n\t/** True if ERROR received. */\n\treadonly errored: boolean;\n\t/** Stop observing. */\n\tdispose(): void;\n\t/**\n\t * Resubscribe with higher detail (Phase 3.3b).\n\t * Disposes current observation, returns new `ObserveResult` with merged options.\n\t */\n\texpand(\n\t\textra: Partial<Pick<ObserveOptions, \"causal\" | \"timeline\" | \"derived\">> | ObserveDetail,\n\t): ObserveResult<T>;\n};\n\n/** A single event in the structured observation log. */\nexport type ObserveEvent = {\n\ttype: \"data\" | \"dirty\" | \"resolved\" | \"complete\" | \"error\" | \"derived\";\n\tpath?: string;\n\tdata?: unknown;\n\ttimestamp_ns?: number;\n\tin_batch?: boolean;\n\ttrigger_dep_index?: number;\n\ttrigger_dep_name?: string;\n\t/**\n\t * V0 version of the triggering dep at observation time (§6.0b).\n\t * This is the dep's post-emission version (after its own `advanceVersion`),\n\t * not the pre-emission version that caused this node's recomputation.\n\t */\n\ttrigger_version?: { id: string; version: number };\n\tdep_values?: unknown[];\n};\n\n/** Built-in color presets for {@link Graph.spy}. */\nexport type GraphSpyThemeName = \"none\" | \"ansi\";\n\n/** ANSI/style overrides for {@link Graph.spy} event rendering. */\nexport type GraphSpyTheme = Partial<Record<ObserveEvent[\"type\"] | \"path\" | \"reset\", string>>;\n\n/** Options for {@link Graph.spy}. */\nexport type GraphSpyOptions = ObserveOptions & {\n\t/** Observe one path; omit for graph-wide mode. */\n\tpath?: string;\n\t/** Keep only these event types in spy output. */\n\tincludeTypes?: ObserveEvent[\"type\"][];\n\t/** Exclude these event types from spy output. */\n\texcludeTypes?: ObserveEvent[\"type\"][];\n\t/** Built-in color preset (`ansi` default) or explicit color tokens. */\n\ttheme?: GraphSpyThemeName | GraphSpyTheme;\n\t/** One-line `pretty` output (default) or JSON-per-event. */\n\tformat?: \"pretty\" | \"json\";\n\t/** Optional sink for rendered lines (`console.log` by default). */\n\tlogger?: (line: string, event: ObserveEvent) => void;\n};\n\n/** Handle returned by {@link Graph.spy}. */\nexport type GraphSpyHandle = {\n\treadonly result: ObserveResult;\n\tdispose(): void;\n};\n\n/** Options for {@link Graph.dumpGraph}. */\nexport type GraphDumpOptions = {\n\tactor?: Actor;\n\tfilter?: DescribeFilter;\n\tformat?: \"pretty\" | \"json\";\n\tindent?: number;\n\tincludeEdges?: boolean;\n\tincludeSubgraphs?: boolean;\n\tlogger?: (text: string) => void;\n};\n\nfunction assertLocalName(name: string, graphName: string, label: string): void {\n\tif (name === \"\") {\n\t\tthrow new Error(`Graph \"${graphName}\": ${label} name must be non-empty`);\n\t}\n}\n\nfunction assertNoPathSep(name: string, graphName: string, label: string): void {\n\tif (name.includes(PATH_SEP)) {\n\t\tthrow new Error(\n\t\t\t`Graph \"${graphName}\": ${label} \"${name}\" must not contain '${PATH_SEP}' (path separator)`,\n\t\t);\n\t}\n}\n\nfunction assertNotReservedMetaSegment(name: string, graphName: string, label: string): void {\n\tif (name === GRAPH_META_SEGMENT) {\n\t\tthrow new Error(\n\t\t\t`Graph \"${graphName}\": ${label} name \"${GRAPH_META_SEGMENT}\" is reserved for meta companion paths`,\n\t\t);\n\t}\n}\n\n/** `connect` / `disconnect` endpoints must be registered graph nodes, not meta paths (graphrefly-py parity). */\nfunction assertConnectPathNotMeta(path: string, graphName: string): void {\n\tif (path.split(PATH_SEP).includes(GRAPH_META_SEGMENT)) {\n\t\tthrow new Error(\n\t\t\t`Graph \"${graphName}\": connect/disconnect endpoints must be registered graph nodes, not meta paths (got \"${path}\")`,\n\t\t);\n\t}\n}\n\nfunction splitPath(path: string, graphName: string): string[] {\n\tif (path === \"\") {\n\t\tthrow new Error(`Graph \"${graphName}\": resolve path must be non-empty`);\n\t}\n\tconst segments = path.split(PATH_SEP);\n\tfor (const s of segments) {\n\t\tif (s === \"\") {\n\t\t\tthrow new Error(`Graph \"${graphName}\": resolve path has empty segment`);\n\t\t}\n\t}\n\treturn segments;\n}\n\n/** Canonical string key for an edge pair (deterministic, splittable). */\nfunction edgeKey(from: string, to: string): string {\n\treturn `${from}\\t${to}`;\n}\n\nfunction parseEdgeKey(key: string): [string, string] {\n\tconst i = key.indexOf(\"\\t\");\n\treturn [key.slice(0, i), key.slice(i + 1)];\n}\n\n/**\n * Lifecycle-destructive message types that meta companion nodes ignore\n * during graph-wide signal propagation (spec §2.3 Companion lifecycle).\n * TEARDOWN: parent already cascades explicitly.\n * INVALIDATE/COMPLETE/ERROR: meta stores outlive these lifecycle events.\n * To target a meta node directly, call `meta.down(...)` on it.\n */\nconst META_FILTERED_TYPES = new Set([TEARDOWN, INVALIDATE, COMPLETE, ERROR]);\n\n/** Strip lifecycle-destructive messages; returns empty array when nothing remains. */\nfunction filterMetaMessages(messages: Messages): Messages {\n\tconst kept = messages.filter((m) => !META_FILTERED_TYPES.has(m[0]));\n\treturn kept as unknown as Messages;\n}\n\n/** TEARDOWN every node in a mounted graph tree (depth-first into mounts). */\nfunction teardownMountedGraph(root: Graph): void {\n\tfor (const child of root._mounts.values()) {\n\t\tteardownMountedGraph(child);\n\t}\n\tfor (const n of root._nodes.values()) {\n\t\tn.down([[TEARDOWN]] satisfies Messages, { internal: true });\n\t}\n}\n\n/**\n * Named container for nodes and explicit edges (GRAPHREFLY-SPEC §3.1–§3.7).\n *\n * Qualified paths use `::` as the segment separator (for example `parent::child::node`).\n *\n * Edges are pure wires: `connect` only validates wiring — the target must already list the source in\n * its dependency array; no transforms run on the edge.\n *\n * @example\n * ```ts\n * import { Graph, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const g = new Graph(\"app\");\n * g.add(\"counter\", state(0));\n * ```\n *\n * @category graph\n */\nexport class Graph {\n\tprivate static readonly _factories: Array<{\n\t\tpattern: string;\n\t\tre: RegExp;\n\t\tfactory: GraphNodeFactory;\n\t}> = [];\n\n\treadonly name: string;\n\treadonly opts: Readonly<GraphOptions>;\n\t/** @internal — exposed for {@link teardownMountedGraph} and cross-graph helpers. */\n\treadonly _nodes = new Map<string, Node>();\n\tprivate readonly _edges = new Set<string>();\n\t/** @internal — exposed for {@link teardownMountedGraph}. */\n\treadonly _mounts = new Map<string, Graph>();\n\tprivate readonly _autoCheckpointDisposers = new Set<() => void>();\n\tprivate readonly _disposers = new Set<() => void>();\n\tprivate _defaultVersioningLevel: VersioningLevel | undefined;\n\n\tstatic registerFactory(pattern: string, factory: GraphNodeFactory): void {\n\t\tif (!pattern) {\n\t\t\tthrow new Error(\"Graph.registerFactory requires a non-empty pattern\");\n\t\t}\n\t\tGraph.unregisterFactory(pattern);\n\t\tGraph._factories.push({ pattern, re: globToRegex(pattern), factory });\n\t}\n\n\tstatic unregisterFactory(pattern: string): void {\n\t\tconst i = Graph._factories.findIndex((entry) => entry.pattern === pattern);\n\t\tif (i >= 0) Graph._factories.splice(i, 1);\n\t}\n\n\t/**\n\t * @param name - Non-empty graph id (must not contain `::`).\n\t * @param opts - Reserved for future hooks; currently unused.\n\t */\n\tconstructor(name: string, opts?: GraphOptions) {\n\t\tif (name === \"\") {\n\t\t\tthrow new Error(\"Graph name must be non-empty\");\n\t\t}\n\t\tif (name.includes(PATH_SEP)) {\n\t\t\tthrow new Error(`Graph name must not contain '${PATH_SEP}' (got \"${name}\")`);\n\t\t}\n\t\tthis.name = name;\n\t\tthis.opts = opts ?? {};\n\t}\n\n\tprivate static _factoryForPath(path: string): GraphNodeFactory | undefined {\n\t\tfor (let i = Graph._factories.length - 1; i >= 0; i -= 1) {\n\t\t\tconst entry = Graph._factories[i]!;\n\t\t\tif (entry.re.test(path)) return entry.factory;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate static _ownerForPath(root: Graph, path: string): [Graph, string] {\n\t\tconst segments = path.split(PATH_SEP);\n\t\tconst local = segments.pop();\n\t\tif (local == null || local.length === 0) {\n\t\t\tthrow new Error(`invalid snapshot path \"${path}\"`);\n\t\t}\n\t\tlet owner = root;\n\t\tfor (const seg of segments) {\n\t\t\tconst next = owner._mounts.get(seg);\n\t\t\tif (!next) throw new Error(`unknown mount \"${seg}\" in path \"${path}\"`);\n\t\t\towner = next;\n\t\t}\n\t\treturn [owner, local];\n\t}\n\n\t/**\n\t * Graphs reachable from this instance via nested {@link Graph.mount} (includes `this`).\n\t */\n\tprivate _graphsReachableViaMounts(seen = new Set<Graph>()): Set<Graph> {\n\t\tif (seen.has(this)) return seen;\n\t\tseen.add(this);\n\t\tfor (const child of this._mounts.values()) {\n\t\t\tchild._graphsReachableViaMounts(seen);\n\t\t}\n\t\treturn seen;\n\t}\n\n\t/**\n\t * Resolve an endpoint: returns `[owningGraph, localName, node]`.\n\t * Accepts both local names and `::` qualified paths.\n\t */\n\tprivate _resolveEndpoint(path: string): [Graph, string, Node] {\n\t\tif (!path.includes(PATH_SEP)) {\n\t\t\tconst n = this._nodes.get(path);\n\t\t\tif (!n) {\n\t\t\t\tthrow new Error(`Graph \"${this.name}\": unknown node \"${path}\"`);\n\t\t\t}\n\t\t\treturn [this, path, n];\n\t\t}\n\t\tconst segments = splitPath(path, this.name);\n\t\treturn this._resolveEndpointFromSegments(segments, path);\n\t}\n\n\tprivate _resolveEndpointFromSegments(\n\t\tsegments: readonly string[],\n\t\tfullPath: string,\n\t): [Graph, string, Node] {\n\t\tconst head = segments[0] as string;\n\t\tconst rest = segments.slice(1);\n\n\t\tif (rest.length === 0) {\n\t\t\tconst n = this._nodes.get(head);\n\t\t\tif (n) return [this, head, n];\n\t\t\tthrow new Error(`Graph \"${this.name}\": unknown node \"${head}\" (from path \"${fullPath}\")`);\n\t\t}\n\n\t\tconst localN = this._nodes.get(head);\n\t\tif (localN && rest.length > 0 && rest[0] === GRAPH_META_SEGMENT) {\n\t\t\treturn this._resolveMetaEndpointKeys(localN, head, rest, fullPath);\n\t\t}\n\n\t\tconst child = this._mounts.get(head);\n\t\tif (!child) {\n\t\t\tif (this._nodes.has(head)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Graph \"${this.name}\": \"${head}\" is a node; trailing path \"${rest.join(PATH_SEP)}\" is invalid`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(`Graph \"${this.name}\": unknown mount or node \"${head}\"`);\n\t\t}\n\t\treturn child._resolveEndpointFromSegments(rest, fullPath);\n\t}\n\n\t// ——————————————————————————————————————————————————————————————\n\t// Node registry\n\t// ——————————————————————————————————————————————————————————————\n\n\t/**\n\t * Registers a node under a local name. Fails if the name is already used,\n\t * reserved by a mount, or the same node instance is already registered.\n\t *\n\t * @param name - Local key (no `::`).\n\t * @param node - Node instance to own.\n\t */\n\tadd(name: string, node: Node): void {\n\t\tassertLocalName(name, this.name, \"add\");\n\t\tassertNoPathSep(name, this.name, \"add\");\n\t\tassertNotReservedMetaSegment(name, this.name, \"node\");\n\t\tif (this._mounts.has(name)) {\n\t\t\tthrow new Error(`Graph \"${this.name}\": name \"${name}\" is already a mount point`);\n\t\t}\n\t\tif (this._nodes.has(name)) {\n\t\t\tthrow new Error(`Graph \"${this.name}\": node \"${name}\" already exists`);\n\t\t}\n\t\tfor (const [existingName, existing] of this._nodes) {\n\t\t\tif (existing === node) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Graph \"${this.name}\": node instance already registered as \"${existingName}\"`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tthis._nodes.set(name, node);\n\t\tif (node instanceof NodeImpl) {\n\t\t\tnode._assignRegistryName(name);\n\t\t\tif (this._defaultVersioningLevel != null) {\n\t\t\t\tnode._applyVersioning(this._defaultVersioningLevel);\n\t\t\t}\n\t\t\t// Auto-register edges from constructor deps (eliminates dual-bookkeeping).\n\t\t\t// Forward: this node's deps → already-registered nodes.\n\t\t\tif (node._deps.length > 0) {\n\t\t\t\tfor (const dep of node._deps) {\n\t\t\t\t\tfor (const [depName, depNode] of this._nodes) {\n\t\t\t\t\t\tif (depNode === dep) {\n\t\t\t\t\t\t\tthis._edges.add(edgeKey(depName, name));\n\t\t\t\t\t\t\tbreak;\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\t// Reverse: already-registered nodes that depend on this newly added node.\n\t\t\tfor (const [otherName, otherNode] of this._nodes) {\n\t\t\t\tif (otherName === name) continue;\n\t\t\t\tif (otherNode instanceof NodeImpl && otherNode._deps.includes(node)) {\n\t\t\t\t\tthis._edges.add(edgeKey(name, otherName));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Set a default versioning level for all nodes added to this graph (roadmap §6.0).\n\t *\n\t * Nodes already registered are retroactively upgraded. Nodes added later via\n\t * {@link add} will inherit this level unless they already have versioning.\n\t *\n\t * **Scope:** Does not propagate to mounted subgraphs. Call `setVersioning`\n\t * on each child graph separately if needed.\n\t *\n\t * @param level - `0` for V0, `1` for V1, or `undefined` to clear.\n\t */\n\tsetVersioning(level: VersioningLevel | undefined): void {\n\t\tthis._defaultVersioningLevel = level;\n\t\tif (level == null) return;\n\t\tfor (const n of this._nodes.values()) {\n\t\t\tif (n instanceof NodeImpl) {\n\t\t\t\tn._applyVersioning(level);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Unregisters a node or unmounts a subgraph, drops incident edges, and sends\n\t * `[[TEARDOWN]]` to the removed node or recursively through the mounted subtree (§3.2).\n\t *\n\t * @param name - Local mount or node name.\n\t */\n\tremove(name: string): void {\n\t\tassertLocalName(name, this.name, \"remove\");\n\t\tassertNoPathSep(name, this.name, \"remove\");\n\n\t\t// Case 1: unmount a subgraph\n\t\tconst child = this._mounts.get(name);\n\t\tif (child) {\n\t\t\tthis._mounts.delete(name);\n\t\t\t// Drop edges touching this mount name or qualified paths under it.\n\t\t\tconst prefix = `${name}${PATH_SEP}`;\n\t\t\tfor (const key of [...this._edges]) {\n\t\t\t\tconst [from, to] = parseEdgeKey(key);\n\t\t\t\tif (from === name || to === name || from.startsWith(prefix) || to.startsWith(prefix)) {\n\t\t\t\t\tthis._edges.delete(key);\n\t\t\t\t}\n\t\t\t}\n\t\t\tteardownMountedGraph(child);\n\t\t\treturn;\n\t\t}\n\n\t\t// Case 2: remove a local node\n\t\tconst node = this._nodes.get(name);\n\t\tif (!node) {\n\t\t\tthrow new Error(`Graph \"${this.name}\": unknown node or mount \"${name}\"`);\n\t\t}\n\t\tthis._nodes.delete(name);\n\t\tfor (const key of [...this._edges]) {\n\t\t\tconst [from, to] = parseEdgeKey(key);\n\t\t\tif (from === name || to === name) this._edges.delete(key);\n\t\t}\n\t\tnode.down([[TEARDOWN]] satisfies Messages, { internal: true });\n\t}\n\n\t/**\n\t * Returns a node by local name or `::` qualified path.\n\t * Local names are looked up directly; paths with `::` delegate to {@link resolve}.\n\t *\n\t * @param name - Local name or qualified path.\n\t */\n\tnode(name: string): Node {\n\t\tif (name === \"\") {\n\t\t\tthrow new Error(`Graph \"${this.name}\": node name must be non-empty`);\n\t\t}\n\t\tif (name.includes(PATH_SEP)) {\n\t\t\treturn this.resolve(name);\n\t\t}\n\t\tconst n = this._nodes.get(name);\n\t\tif (!n) {\n\t\t\tthrow new Error(`Graph \"${this.name}\": unknown node \"${name}\"`);\n\t\t}\n\t\treturn n;\n\t}\n\n\t/**\n\t * Reads `graph.node(name).get()` — accepts `::` qualified paths (§3.2).\n\t *\n\t * @param name - Local name or qualified path.\n\t * @returns Cached value or `undefined`.\n\t */\n\tget(name: string): unknown {\n\t\treturn this.node(name).get();\n\t}\n\n\t/**\n\t * Shorthand for `graph.node(name).down([[DATA, value]], { actor })` — accepts `::` qualified paths (§3.2).\n\t *\n\t * @param name - Local name or qualified path.\n\t * @param value - Next `DATA` payload.\n\t * @param options - Optional `actor` and `internal` guard bypass.\n\t */\n\tset(name: string, value: unknown, options?: GraphActorOptions): void {\n\t\tconst internal = options?.internal === true;\n\t\tthis.node(name).down([[DATA, value]] satisfies Messages, {\n\t\t\tactor: options?.actor,\n\t\t\tinternal,\n\t\t\tdelivery: \"write\",\n\t\t});\n\t}\n\n\t// ——————————————————————————————————————————————————————————————\n\t// Edges\n\t// ——————————————————————————————————————————————————————————————\n\n\t/**\n\t * Record a wire from `fromPath` → `toPath` (§3.3). Accepts local names or\n\t * `::` qualified paths. The target must be a {@link NodeImpl} whose `_deps`\n\t * includes the source node (same reference). Idempotent.\n\t *\n\t * Same-owner edges are stored on the owning child graph; cross-subgraph edges\n\t * are stored on this (parent) graph's registry.\n\t *\n\t * @param fromPath - Source endpoint (local or qualified).\n\t * @param toPath - Target endpoint whose deps already include the source node.\n\t */\n\tconnect(fromPath: string, toPath: string): void {\n\t\tif (!fromPath || !toPath) {\n\t\t\tthrow new Error(`Graph \"${this.name}\": connect paths must be non-empty`);\n\t\t}\n\t\tassertConnectPathNotMeta(fromPath, this.name);\n\t\tassertConnectPathNotMeta(toPath, this.name);\n\n\t\tconst [fromGraph, fromLocal, fromNode] = this._resolveEndpoint(fromPath);\n\t\tconst [toGraph, toLocal, toNode] = this._resolveEndpoint(toPath);\n\n\t\tif (fromNode === toNode) {\n\t\t\tthrow new Error(`Graph \"${this.name}\": cannot connect a node to itself`);\n\t\t}\n\n\t\tif (!(toNode instanceof NodeImpl)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Graph \"${this.name}\": connect(${fromPath}, ${toPath}) requires the target to be a graphrefly NodeImpl so deps can be validated`,\n\t\t\t);\n\t\t}\n\t\tif (!toNode._deps.includes(fromNode)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Graph \"${this.name}\": connect(${fromPath}, ${toPath}) — target must include source in its constructor deps (same node reference)`,\n\t\t\t);\n\t\t}\n\n\t\tif (fromGraph === toGraph) {\n\t\t\t// Same-owner: store on the child graph\n\t\t\tconst key = edgeKey(fromLocal, toLocal);\n\t\t\tfromGraph._edges.add(key);\n\t\t} else {\n\t\t\t// Cross-subgraph: store on this (parent) graph\n\t\t\tconst key = edgeKey(fromPath, toPath);\n\t\t\tthis._edges.add(key);\n\t\t}\n\t}\n\n\t/**\n\t * Remove a registered edge (§3.3). Accepts local names or `::` qualified paths.\n\t *\n\t * **Registry-only (§C resolved):** This drops the edge from the graph's edge\n\t * registry only. It does **not** mutate the target node's constructor-time\n\t * dependency list, bitmasks, or upstream subscriptions. Message flow follows\n\t * constructor-time deps, not the edge registry. For runtime dep rewiring, use\n\t * {@link dynamicNode}.\n\t *\n\t * @param fromPath - Registered edge tail.\n\t * @param toPath - Registered edge head.\n\t */\n\tdisconnect(fromPath: string, toPath: string): void {\n\t\tif (!fromPath || !toPath) {\n\t\t\tthrow new Error(`Graph \"${this.name}\": disconnect paths must be non-empty`);\n\t\t}\n\t\tassertConnectPathNotMeta(fromPath, this.name);\n\t\tassertConnectPathNotMeta(toPath, this.name);\n\n\t\tconst [fromGraph, fromLocal] = this._resolveEndpoint(fromPath);\n\t\tconst [toGraph, toLocal] = this._resolveEndpoint(toPath);\n\n\t\tif (fromGraph === toGraph) {\n\t\t\tconst key = edgeKey(fromLocal, toLocal);\n\t\t\tif (!fromGraph._edges.delete(key)) {\n\t\t\t\tthrow new Error(`Graph \"${this.name}\": no registered edge ${fromPath} → ${toPath}`);\n\t\t\t}\n\t\t} else {\n\t\t\tconst key = edgeKey(fromPath, toPath);\n\t\t\tif (!this._edges.delete(key)) {\n\t\t\t\tthrow new Error(`Graph \"${this.name}\": no registered edge ${fromPath} → ${toPath}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns registered `[from, to]` edge pairs (read-only snapshot).\n\t *\n\t * @returns Edge pairs recorded on this graph instance’s local `_edges` set.\n\t */\n\tedges(): ReadonlyArray<[string, string]> {\n\t\tconst result: [string, string][] = [];\n\t\tfor (const key of this._edges) {\n\t\t\tresult.push(parseEdgeKey(key));\n\t\t}\n\t\treturn result;\n\t}\n\n\t// ——————————————————————————————————————————————————————————————\n\t// Composition\n\t// ——————————————————————————————————————————————————————————————\n\n\t/**\n\t * Embed a child graph at a local mount name (§3.4). Child nodes are reachable via\n\t * {@link Graph.resolve} using `::` delimited paths (§3.5). Lifecycle\n\t * {@link Graph.signal} visits mounted subgraphs recursively.\n\t *\n\t * Rejects: same name as existing node or mount, self-mount, mount cycles,\n\t * and the same child graph instance mounted twice on one parent.\n\t *\n\t * @param name - Local mount point.\n\t * @param child - Nested `Graph` instance.\n\t */\n\tmount(name: string, child: Graph): void {\n\t\tassertLocalName(name, this.name, \"mount\");\n\t\tassertNoPathSep(name, this.name, \"mount\");\n\t\tassertNotReservedMetaSegment(name, this.name, \"mount\");\n\t\tif (this._nodes.has(name)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Graph \"${this.name}\": cannot mount at \"${name}\" — node with that name exists`,\n\t\t\t);\n\t\t}\n\t\tif (this._mounts.has(name)) {\n\t\t\tthrow new Error(`Graph \"${this.name}\": mount \"${name}\" already exists`);\n\t\t}\n\t\tif (child === this) {\n\t\t\tthrow new Error(`Graph \"${this.name}\": cannot mount a graph into itself`);\n\t\t}\n\t\t// Reject same child instance mounted twice on this parent.\n\t\tfor (const existing of this._mounts.values()) {\n\t\t\tif (existing === child) {\n\t\t\t\tthrow new Error(`Graph \"${this.name}\": this child graph is already mounted on this graph`);\n\t\t\t}\n\t\t}\n\t\tif (child._graphsReachableViaMounts().has(this)) {\n\t\t\tthrow new Error(`Graph \"${this.name}\": mount(\"${name}\", …) would create a mount cycle`);\n\t\t}\n\t\tthis._mounts.set(name, child);\n\t}\n\n\t/**\n\t * Look up a node by qualified path (§3.5). Segments are separated by `::`.\n\t *\n\t * If the first segment equals this graph's {@link Graph.name}, it is stripped\n\t * (so `root.resolve(\"app::a\")` works when `root.name === \"app\"`).\n\t *\n\t * @param path - Qualified `::` path or local name.\n\t * @returns The resolved `Node`.\n\t */\n\tresolve(path: string): Node {\n\t\tlet segments = splitPath(path, this.name);\n\t\tif (segments[0] === this.name) {\n\t\t\tsegments = segments.slice(1);\n\t\t\tif (segments.length === 0) {\n\t\t\t\tthrow new Error(`Graph \"${this.name}\": resolve path ends at graph name only`);\n\t\t\t}\n\t\t}\n\t\treturn this._resolveFromSegments(segments);\n\t}\n\n\tprivate _resolveFromSegments(segments: readonly string[]): Node {\n\t\tconst head = segments[0] as string;\n\t\tconst rest = segments.slice(1);\n\n\t\tif (rest.length === 0) {\n\t\t\tconst n = this._nodes.get(head);\n\t\t\tif (n) return n;\n\t\t\tif (this._mounts.has(head)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Graph \"${this.name}\": path ends at subgraph \"${head}\" — not a node (GRAPHREFLY-SPEC §3.5)`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(`Graph \"${this.name}\": unknown name \"${head}\"`);\n\t\t}\n\n\t\tconst localN = this._nodes.get(head);\n\t\tif (localN && rest.length > 0 && rest[0] === GRAPH_META_SEGMENT) {\n\t\t\treturn this._resolveMetaChainFromNode(localN, rest, segments.join(PATH_SEP));\n\t\t}\n\n\t\tconst child = this._mounts.get(head);\n\t\tif (!child) {\n\t\t\tif (this._nodes.has(head)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Graph \"${this.name}\": \"${head}\" is a node; trailing path \"${rest.join(PATH_SEP)}\" is invalid`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(`Graph \"${this.name}\": unknown mount or node \"${head}\"`);\n\t\t}\n\n\t\treturn child.resolve(rest.join(PATH_SEP));\n\t}\n\n\t/**\n\t * Resolve `::__meta__::key` segments from a registered primary node (possibly chained).\n\t */\n\tprivate _resolveMetaChainFromNode(n: Node, parts: readonly string[], fullPath: string): Node {\n\t\tlet current = n;\n\t\tlet i = 0;\n\t\tconst p = [...parts];\n\t\twhile (i < p.length) {\n\t\t\tif (p[i] !== GRAPH_META_SEGMENT) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Graph \"${this.name}\": expected ${GRAPH_META_SEGMENT} segment in meta path \"${fullPath}\"`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (i + 1 >= p.length) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Graph \"${this.name}\": meta path requires a key after ${GRAPH_META_SEGMENT} in \"${fullPath}\"`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst key = p[i + 1] as string;\n\t\t\tconst next = current.meta[key];\n\t\t\tif (!next) {\n\t\t\t\tthrow new Error(`Graph \"${this.name}\": unknown meta \"${key}\" in path \"${fullPath}\"`);\n\t\t\t}\n\t\t\tcurrent = next;\n\t\t\ti += 2;\n\t\t}\n\t\treturn current;\n\t}\n\n\tprivate _resolveMetaEndpointKeys(\n\t\tbaseNode: Node,\n\t\tbaseLocalKey: string,\n\t\tparts: readonly string[],\n\t\tfullPath: string,\n\t): [Graph, string, Node] {\n\t\tlet current = baseNode;\n\t\tlet localKey = baseLocalKey;\n\t\tlet i = 0;\n\t\tconst p = [...parts];\n\t\twhile (i < p.length) {\n\t\t\tif (p[i] !== GRAPH_META_SEGMENT) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Graph \"${this.name}\": expected ${GRAPH_META_SEGMENT} segment in meta path \"${fullPath}\"`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (i + 1 >= p.length) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Graph \"${this.name}\": meta path requires a key after ${GRAPH_META_SEGMENT} in \"${fullPath}\"`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst metaKey = p[i + 1] as string;\n\t\t\tconst next = current.meta[metaKey];\n\t\t\tif (!next) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Graph \"${this.name}\": unknown meta \"${metaKey}\" on node (in \"${fullPath}\")`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlocalKey = `${localKey}${PATH_SEP}${GRAPH_META_SEGMENT}${PATH_SEP}${metaKey}`;\n\t\t\tcurrent = next;\n\t\t\ti += 2;\n\t\t}\n\t\treturn [this, localKey, current];\n\t}\n\n\t/**\n\t * Deliver a message batch to every registered node in this graph and, recursively,\n\t * in mounted child graphs (§3.7). Recurses into mounts first, then delivers to\n\t * local nodes (sorted by name). Each {@link Node} receives at most one delivery\n\t * per call (deduped by reference).\n\t *\n\t * Companion `meta` nodes receive the same batch for control-plane types (e.g.\n\t * PAUSE) that the primary does not forward. **TEARDOWN-only** batches skip the\n\t * extra meta pass — the primary’s `down()` already cascades TEARDOWN to meta.\n\t *\n\t * @param messages - Batch to deliver to every registered node (and mounts, recursively).\n\t * @param options - Optional `actor` / `internal` for transport.\n\t */\n\tsignal(messages: Messages, options?: GraphActorOptions): void {\n\t\tthis._signalDeliver(messages, options ?? {}, new Set());\n\t}\n\n\tprivate _signalDeliver(messages: Messages, opts: GraphActorOptions, vis: Set<Node>): void {\n\t\tfor (const sub of this._mounts.values()) {\n\t\t\tsub._signalDeliver(messages, opts, vis);\n\t\t}\n\t\tconst internal = opts.internal === true;\n\t\tconst downOpts: NodeTransportOptions = internal\n\t\t\t? { internal: true }\n\t\t\t: { actor: opts.actor, delivery: \"signal\" };\n\t\tconst metaMessages = filterMetaMessages(messages);\n\t\tfor (const localName of [...this._nodes.keys()].sort()) {\n\t\t\tconst n = this._nodes.get(localName)!;\n\t\t\tif (vis.has(n)) continue;\n\t\t\tvis.add(n);\n\t\t\tn.down(messages, downOpts);\n\t\t\tif (metaMessages.length === 0) continue;\n\t\t\tthis._signalMetaSubtree(n, metaMessages, vis, downOpts);\n\t\t}\n\t}\n\n\tprivate _signalMetaSubtree(\n\t\troot: Node,\n\t\tmessages: Messages,\n\t\tvis: Set<Node>,\n\t\tdownOpts: NodeTransportOptions,\n\t): void {\n\t\tfor (const mk of Object.keys(root.meta).sort()) {\n\t\t\tconst mnode = root.meta[mk];\n\t\t\tif (vis.has(mnode)) continue;\n\t\t\tvis.add(mnode);\n\t\t\tmnode.down(messages, downOpts);\n\t\t\tthis._signalMetaSubtree(mnode, messages, vis, downOpts);\n\t\t}\n\t}\n\n\t/**\n\t * Static structure snapshot: qualified node keys, edges, mount names (GRAPHREFLY-SPEC §3.6, Appendix B).\n\t *\n\t * @param options - Optional `actor` for guard-scoped visibility and/or `filter` for selective output.\n\t * @returns JSON-shaped describe payload for this graph tree.\n\t *\n\t * @example\n\t * ```ts\n\t * graph.describe() // full snapshot\n\t * graph.describe({ actor: llm }) // guard-scoped\n\t * graph.describe({ filter: { status: \"errored\" } }) // only errored nodes\n\t * graph.describe({ filter: (n) => n.type === \"state\" }) // predicate filter\n\t * ```\n\t */\n\tdescribe(options?: GraphDescribeOptions): GraphDescribeOutput {\n\t\tconst actor = options?.actor;\n\t\tconst filter = options?.filter;\n\t\tconst includeFields = resolveDescribeFields(options?.detail, options?.fields);\n\t\tconst isSpec = options?.format === \"spec\";\n\t\t// For spec format, force minimal fields (type + deps only, no status/value)\n\t\tconst effectiveFields = isSpec ? resolveDescribeFields(\"minimal\") : includeFields;\n\n\t\tconst targets: [string, Node][] = [];\n\t\tthis._collectObserveTargets(\"\", targets);\n\t\tconst nodeToPath = new Map<Node, string>();\n\t\tfor (const [p, n] of targets) {\n\t\t\tnodeToPath.set(n, p);\n\t\t}\n\t\tconst nodes: Record<string, DescribeNodeOutput> = {};\n\t\tfor (const [p, n] of targets) {\n\t\t\tif (actor != null && !n.allowsObserve(actor)) continue;\n\t\t\tconst raw = describeNode(n, effectiveFields);\n\t\t\tconst deps =\n\t\t\t\tn instanceof NodeImpl ? n._deps.map((d) => nodeToPath.get(d) ?? d.name ?? \"\") : [];\n\t\t\tconst { name: _name, ...rest } = raw;\n\t\t\tconst entry: DescribeNodeOutput = { ...rest, deps };\n\t\t\tif (filter != null) {\n\t\t\t\tif (typeof filter === \"function\") {\n\t\t\t\t\tconst fn = filter as\n\t\t\t\t\t\t| ((nodePath: string, node: DescribeNodeOutput) => boolean)\n\t\t\t\t\t\t| ((node: DescribeNodeOutput) => boolean);\n\t\t\t\t\tconst pass =\n\t\t\t\t\t\tfn.length >= 2\n\t\t\t\t\t\t\t? (fn as (nodePath: string, node: DescribeNodeOutput) => boolean)(p, entry)\n\t\t\t\t\t\t\t: (fn as (node: DescribeNodeOutput) => boolean)(entry);\n\t\t\t\t\tif (!pass) continue;\n\t\t\t\t} else {\n\t\t\t\t\tlet match = true;\n\t\t\t\t\tfor (const [fk, fv] of Object.entries(filter)) {\n\t\t\t\t\t\tconst normalizedKey =\n\t\t\t\t\t\t\tfk === \"deps_includes\" ? \"depsIncludes\" : fk === \"meta_has\" ? \"metaHas\" : fk;\n\t\t\t\t\t\tif (normalizedKey === \"depsIncludes\") {\n\t\t\t\t\t\t\tif (!entry.deps.includes(String(fv))) {\n\t\t\t\t\t\t\t\tmatch = false;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (normalizedKey === \"metaHas\") {\n\t\t\t\t\t\t\tif (!Object.hasOwn(entry.meta ?? {}, String(fv))) {\n\t\t\t\t\t\t\t\tmatch = false;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ((entry as Record<string, unknown>)[normalizedKey] !== fv) {\n\t\t\t\t\t\t\tmatch = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!match) continue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tnodes[p] = entry;\n\t\t}\n\t\tconst nodeKeys = new Set(Object.keys(nodes));\n\t\tlet edges = this._collectAllEdges(\"\");\n\t\tif (actor != null || filter != null) {\n\t\t\tedges = edges.filter((e) => nodeKeys.has(e.from) && nodeKeys.has(e.to));\n\t\t}\n\t\tedges.sort((a, b) => {\n\t\t\tif (a.from < b.from) return -1;\n\t\t\tif (a.from > b.from) return 1;\n\t\t\tif (a.to < b.to) return -1;\n\t\t\tif (a.to > b.to) return 1;\n\t\t\treturn 0;\n\t\t});\n\t\tconst allSubgraphs = this._collectSubgraphs(\"\");\n\t\tconst subgraphs =\n\t\t\tactor != null || filter != null\n\t\t\t\t? allSubgraphs.filter((sg) => {\n\t\t\t\t\t\tconst prefix = `${sg}${PATH_SEP}`;\n\t\t\t\t\t\treturn [...nodeKeys].some((k) => k === sg || k.startsWith(prefix));\n\t\t\t\t\t})\n\t\t\t\t: allSubgraphs;\n\n\t\t// Capture graph ref and base options for expand()\n\t\tconst graph = this;\n\t\tconst baseOpts = options;\n\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tnodes,\n\t\t\tedges,\n\t\t\tsubgraphs,\n\t\t\texpand(detailOrFields: DescribeDetail | DescribeField[]): GraphDescribeOutput {\n\t\t\t\tconst merged: GraphDescribeOptions = { ...baseOpts, format: undefined };\n\t\t\t\tif (Array.isArray(detailOrFields)) {\n\t\t\t\t\tmerged.fields = detailOrFields;\n\t\t\t\t\tmerged.detail = undefined;\n\t\t\t\t} else {\n\t\t\t\t\tmerged.detail = detailOrFields;\n\t\t\t\t\tmerged.fields = undefined;\n\t\t\t\t}\n\t\t\t\treturn graph.describe(merged);\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate _collectSubgraphs(prefix: string): string[] {\n\t\tconst out: string[] = [];\n\t\tfor (const m of [...this._mounts.keys()].sort()) {\n\t\t\tconst q = prefix === \"\" ? m : `${prefix}${m}`;\n\t\t\tout.push(q);\n\t\t\tout.push(...this._mounts.get(m)!._collectSubgraphs(`${q}${PATH_SEP}`));\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate _collectAllEdges(prefix: string): { from: string; to: string }[] {\n\t\tconst out: { from: string; to: string }[] = [];\n\t\tfor (const m of [...this._mounts.keys()].sort()) {\n\t\t\tconst p2 = prefix === \"\" ? m : `${prefix}${PATH_SEP}${m}`;\n\t\t\tout.push(...this._mounts.get(m)!._collectAllEdges(p2));\n\t\t}\n\t\tfor (const [f, t] of this.edges()) {\n\t\t\tout.push({\n\t\t\t\tfrom: this._qualifyEdgeEndpoint(f, prefix),\n\t\t\t\tto: this._qualifyEdgeEndpoint(t, prefix),\n\t\t\t});\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate _qualifyEdgeEndpoint(part: string, prefix: string): string {\n\t\tif (part.includes(PATH_SEP)) return part;\n\t\treturn prefix === \"\" ? part : `${prefix}${PATH_SEP}${part}`;\n\t}\n\n\tprivate _collectObserveTargets(prefix: string, out: [string, Node][]): void {\n\t\tfor (const m of [...this._mounts.keys()].sort()) {\n\t\t\tconst p2 = prefix === \"\" ? m : `${prefix}${PATH_SEP}${m}`;\n\t\t\tthis._mounts.get(m)!._collectObserveTargets(p2, out);\n\t\t}\n\t\tfor (const loc of [...this._nodes.keys()].sort()) {\n\t\t\tconst n = this._nodes.get(loc)!;\n\t\t\tconst p = prefix === \"\" ? loc : `${prefix}${PATH_SEP}${loc}`;\n\t\t\tout.push([p, n]);\n\t\t\tthis._appendMetaObserveTargets(p, n, out);\n\t\t}\n\t}\n\n\tprivate _appendMetaObserveTargets(basePath: string, n: Node, out: [string, Node][]): void {\n\t\tfor (const mk of Object.keys(n.meta).sort()) {\n\t\t\tconst m = n.meta[mk];\n\t\t\tconst mp = `${basePath}${PATH_SEP}${GRAPH_META_SEGMENT}${PATH_SEP}${mk}`;\n\t\t\tout.push([mp, m]);\n\t\t\tthis._appendMetaObserveTargets(mp, m, out);\n\t\t}\n\t}\n\n\t/**\n\t * Live message stream from one node (or meta path), or from the whole graph (§3.6).\n\t *\n\t * Overloads: `(path, options?)` for one node; `(options?)` for all nodes. Whole-graph mode\n\t * subscribes in **sorted path order** (code-point order). With structured options\n\t * (`structured`, `timeline`, `causal`, `derived`), returns an {@link ObserveResult}.\n\t * Inspector-gated extras (`causal` / `derived`) require {@link Graph.inspectorEnabled}.\n\t *\n\t * @param pathOrOpts - Qualified `path` string, or omit and pass only `options` for graph-wide observation.\n\t * @param options - Optional `actor`, `structured`, `causal`, `timeline` (inspector-gated).\n\t * @returns `GraphObserveOne`, `GraphObserveAll`, or `ObserveResult` depending on overload/options.\n\t */\n\tobserve(\n\t\tpath: string,\n\t\toptions?: ObserveOptions & {\n\t\t\tstructured?: true;\n\t\t\ttimeline?: true;\n\t\t\tcausal?: true;\n\t\t\tderived?: true;\n\t\t},\n\t): ObserveResult;\n\tobserve(path: string, options?: ObserveOptions): GraphObserveOne;\n\tobserve(\n\t\toptions: ObserveOptions & { structured?: true; timeline?: true; causal?: true; derived?: true },\n\t): ObserveResult;\n\tobserve(options?: ObserveOptions): GraphObserveAll;\n\tobserve(\n\t\tpathOrOpts?: string | ObserveOptions,\n\t\toptions?: ObserveOptions,\n\t): GraphObserveOne | GraphObserveAll | ObserveResult {\n\t\tif (typeof pathOrOpts === \"string\") {\n\t\t\tconst path = pathOrOpts;\n\t\t\tconst resolved = resolveObserveDetail(options);\n\t\t\tconst actor = resolved.actor;\n\t\t\tconst target = this.resolve(path);\n\t\t\tif (actor != null && !target.allowsObserve(actor)) {\n\t\t\t\tthrow new GuardDenied({ actor, action: \"observe\", nodeName: path });\n\t\t\t}\n\t\t\tconst wantsStructured =\n\t\t\t\tresolved.structured === true ||\n\t\t\t\tresolved.timeline === true ||\n\t\t\t\tresolved.causal === true ||\n\t\t\t\tresolved.derived === true ||\n\t\t\t\tresolved.detail === \"minimal\" ||\n\t\t\t\tresolved.detail === \"full\";\n\t\t\tif (wantsStructured && Graph.inspectorEnabled) {\n\t\t\t\treturn this._createObserveResult(path, target, resolved);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsubscribe(sink: NodeSink) {\n\t\t\t\t\treturn target.subscribe(sink);\n\t\t\t\t},\n\t\t\t\tup(messages: Messages) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\ttarget.up?.(messages);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tif (err instanceof GuardDenied) return; // silently drop — guard denied flow control\n\t\t\t\t\t\tthrow err;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tconst opts = resolveObserveDetail(pathOrOpts as ObserveOptions | undefined);\n\t\tconst actor = opts.actor;\n\t\tconst wantsStructured =\n\t\t\topts.structured === true ||\n\t\t\topts.timeline === true ||\n\t\t\topts.causal === true ||\n\t\t\topts.derived === true ||\n\t\t\topts.detail === \"minimal\" ||\n\t\t\topts.detail === \"full\";\n\t\tif (wantsStructured && Graph.inspectorEnabled) {\n\t\t\treturn this._createObserveResultForAll(opts);\n\t\t}\n\t\treturn {\n\t\t\tsubscribe: (sink: (nodePath: string, messages: Messages) => void) => {\n\t\t\t\tconst targets: [string, Node][] = [];\n\t\t\t\tthis._collectObserveTargets(\"\", targets);\n\t\t\t\ttargets.sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0));\n\t\t\t\tconst picked =\n\t\t\t\t\tactor == null ? targets : targets.filter(([, nd]) => nd.allowsObserve(actor));\n\t\t\t\tconst unsubs = picked.map(([p, nd]) =>\n\t\t\t\t\tnd.subscribe((msgs) => {\n\t\t\t\t\t\tsink(p, msgs);\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\treturn () => {\n\t\t\t\t\tfor (const u of unsubs) u();\n\t\t\t\t};\n\t\t\t},\n\t\t\tup: (upPath: string, messages: Messages) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst nd = this.resolve(upPath);\n\t\t\t\t\tnd.up?.(messages);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (err instanceof GuardDenied) return; // silently drop — guard denied flow control\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate _createObserveResult<T>(\n\t\tpath: string,\n\t\ttarget: Node<T>,\n\t\toptions: ObserveOptions,\n\t): ObserveResult<T> {\n\t\tconst timeline = options.timeline === true;\n\t\tconst causal = options.causal === true;\n\t\tconst derived = options.derived === true;\n\t\tconst minimal = options.detail === \"minimal\";\n\t\tconst result: {\n\t\t\tvalues: Record<string, T>;\n\t\t\tdirtyCount: number;\n\t\t\tresolvedCount: number;\n\t\t\tevents: ObserveEvent[];\n\t\t\tcompletedCleanly: boolean;\n\t\t\terrored: boolean;\n\t\t} = {\n\t\t\tvalues: {},\n\t\t\tdirtyCount: 0,\n\t\t\tresolvedCount: 0,\n\t\t\tevents: [],\n\t\t\tcompletedCleanly: false,\n\t\t\terrored: false,\n\t\t};\n\n\t\tlet lastTriggerDepIndex: number | undefined;\n\t\tlet lastRunDepValues: unknown[] | undefined;\n\t\tlet detachInspectorHook: (() => void) | undefined;\n\t\tif ((causal || derived) && target instanceof NodeImpl) {\n\t\t\tdetachInspectorHook = target._setInspectorHook((event: NodeInspectorHookEvent) => {\n\t\t\t\tif (event.kind === \"dep_message\") {\n\t\t\t\t\tlastTriggerDepIndex = event.depIndex;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlastRunDepValues = [...event.depValues];\n\t\t\t\tif (derived) {\n\t\t\t\t\tresult.events.push({\n\t\t\t\t\t\ttype: \"derived\",\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\tdep_values: [...event.depValues],\n\t\t\t\t\t\t...(timeline ? { timestamp_ns: monotonicNs(), in_batch: isBatching() } : {}),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconst unsub = target.subscribe((msgs) => {\n\t\t\tfor (const m of msgs) {\n\t\t\t\tconst t = m[0];\n\t\t\t\tconst base = timeline ? { timestamp_ns: monotonicNs(), in_batch: isBatching() } : {};\n\t\t\t\tconst withCausal =\n\t\t\t\t\tcausal && lastRunDepValues != null\n\t\t\t\t\t\t? (() => {\n\t\t\t\t\t\t\t\tconst triggerDep =\n\t\t\t\t\t\t\t\t\tlastTriggerDepIndex != null &&\n\t\t\t\t\t\t\t\t\tlastTriggerDepIndex >= 0 &&\n\t\t\t\t\t\t\t\t\ttarget instanceof NodeImpl\n\t\t\t\t\t\t\t\t\t\t? target._deps[lastTriggerDepIndex]\n\t\t\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\t\t\tconst tv = triggerDep?.v;\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttrigger_dep_index: lastTriggerDepIndex,\n\t\t\t\t\t\t\t\t\ttrigger_dep_name: triggerDep?.name,\n\t\t\t\t\t\t\t\t\t...(tv != null ? { trigger_version: { id: tv.id, version: tv.version } } : {}),\n\t\t\t\t\t\t\t\t\tdep_values: [...lastRunDepValues],\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\tif (t === DATA) {\n\t\t\t\t\tresult.values[path] = m[1] as T;\n\t\t\t\t\tresult.events.push({ type: \"data\", path, data: m[1], ...base, ...withCausal });\n\t\t\t\t} else if (minimal) {\n\t\t\t\t\t// minimal: track state but don't push non-DATA events\n\t\t\t\t\tif (t === DIRTY) result.dirtyCount++;\n\t\t\t\t\telse if (t === RESOLVED) result.resolvedCount++;\n\t\t\t\t\telse if (t === COMPLETE && !result.errored) result.completedCleanly = true;\n\t\t\t\t\telse if (t === ERROR) result.errored = true;\n\t\t\t\t} else if (t === DIRTY) {\n\t\t\t\t\tresult.dirtyCount++;\n\t\t\t\t\tresult.events.push({ type: \"dirty\", path, ...base });\n\t\t\t\t} else if (t === RESOLVED) {\n\t\t\t\t\tresult.resolvedCount++;\n\t\t\t\t\tresult.events.push({ type: \"resolved\", path, ...base, ...withCausal });\n\t\t\t\t} else if (t === COMPLETE) {\n\t\t\t\t\tif (!result.errored) result.completedCleanly = true;\n\t\t\t\t\tresult.events.push({ type: \"complete\", path, ...base });\n\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\tresult.errored = true;\n\t\t\t\t\tresult.events.push({ type: \"error\", path, data: m[1], ...base });\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tconst graph = this;\n\t\tconst basePath = path;\n\n\t\treturn {\n\t\t\tget values() {\n\t\t\t\treturn result.values;\n\t\t\t},\n\t\t\tget dirtyCount() {\n\t\t\t\treturn result.dirtyCount;\n\t\t\t},\n\t\t\tget resolvedCount() {\n\t\t\t\treturn result.resolvedCount;\n\t\t\t},\n\t\t\tget events() {\n\t\t\t\treturn result.events;\n\t\t\t},\n\t\t\tget completedCleanly() {\n\t\t\t\treturn result.completedCleanly;\n\t\t\t},\n\t\t\tget errored() {\n\t\t\t\treturn result.errored;\n\t\t\t},\n\t\t\tdispose() {\n\t\t\t\tunsub();\n\t\t\t\tdetachInspectorHook?.();\n\t\t\t},\n\t\t\texpand(\n\t\t\t\textra: Partial<Pick<ObserveOptions, \"causal\" | \"timeline\" | \"derived\">> | ObserveDetail,\n\t\t\t): ObserveResult<T> {\n\t\t\t\tunsub();\n\t\t\t\tdetachInspectorHook?.();\n\t\t\t\tconst merged: ObserveOptions = { ...options };\n\t\t\t\tif (typeof extra === \"string\") {\n\t\t\t\t\tmerged.detail = extra;\n\t\t\t\t} else {\n\t\t\t\t\tObject.assign(merged, extra);\n\t\t\t\t}\n\t\t\t\tconst resolvedTarget = graph.resolve(basePath);\n\t\t\t\treturn graph._createObserveResult<T>(\n\t\t\t\t\tbasePath,\n\t\t\t\t\tresolvedTarget as Node<T>,\n\t\t\t\t\tresolveObserveDetail(merged),\n\t\t\t\t);\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate _createObserveResultForAll(options: ObserveOptions): ObserveResult {\n\t\tconst timeline = options.timeline === true;\n\t\tconst minimal = options.detail === \"minimal\";\n\t\tconst result: {\n\t\t\tvalues: Record<string, unknown>;\n\t\t\tdirtyCount: number;\n\t\t\tresolvedCount: number;\n\t\t\tevents: ObserveEvent[];\n\t\t\tcompletedCleanly: boolean;\n\t\t\terrored: boolean;\n\t\t} = {\n\t\t\tvalues: {},\n\t\t\tdirtyCount: 0,\n\t\t\tresolvedCount: 0,\n\t\t\tevents: [],\n\t\t\tcompletedCleanly: false,\n\t\t\terrored: false,\n\t\t};\n\t\tconst actor = options.actor;\n\t\tconst targets: [string, Node][] = [];\n\t\tthis._collectObserveTargets(\"\", targets);\n\t\ttargets.sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0));\n\t\tconst picked = actor == null ? targets : targets.filter(([, nd]) => nd.allowsObserve(actor));\n\t\tconst unsubs = picked.map(([path, nd]) =>\n\t\t\tnd.subscribe((msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tconst t = m[0];\n\t\t\t\t\tconst base = timeline ? { timestamp_ns: monotonicNs(), in_batch: isBatching() } : {};\n\t\t\t\t\tif (t === DATA) {\n\t\t\t\t\t\tresult.values[path] = m[1];\n\t\t\t\t\t\tresult.events.push({ type: \"data\", path, data: m[1], ...base });\n\t\t\t\t\t} else if (minimal) {\n\t\t\t\t\t\tif (t === DIRTY) result.dirtyCount++;\n\t\t\t\t\t\telse if (t === RESOLVED) result.resolvedCount++;\n\t\t\t\t\t\telse if (t === COMPLETE && !result.errored) result.completedCleanly = true;\n\t\t\t\t\t\telse if (t === ERROR) result.errored = true;\n\t\t\t\t\t} else if (t === DIRTY) {\n\t\t\t\t\t\tresult.dirtyCount++;\n\t\t\t\t\t\tresult.events.push({ type: \"dirty\", path, ...base });\n\t\t\t\t\t} else if (t === RESOLVED) {\n\t\t\t\t\t\tresult.resolvedCount++;\n\t\t\t\t\t\tresult.events.push({ type: \"resolved\", path, ...base });\n\t\t\t\t\t} else if (t === COMPLETE) {\n\t\t\t\t\t\tif (!result.errored) result.completedCleanly = true;\n\t\t\t\t\t\tresult.events.push({ type: \"complete\", path, ...base });\n\t\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\t\tresult.errored = true;\n\t\t\t\t\t\tresult.events.push({ type: \"error\", path, data: m[1], ...base });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\n\t\tconst graph = this;\n\t\treturn {\n\t\t\tget values() {\n\t\t\t\treturn result.values;\n\t\t\t},\n\t\t\tget dirtyCount() {\n\t\t\t\treturn result.dirtyCount;\n\t\t\t},\n\t\t\tget resolvedCount() {\n\t\t\t\treturn result.resolvedCount;\n\t\t\t},\n\t\t\tget events() {\n\t\t\t\treturn result.events;\n\t\t\t},\n\t\t\tget completedCleanly() {\n\t\t\t\treturn result.completedCleanly;\n\t\t\t},\n\t\t\tget errored() {\n\t\t\t\treturn result.errored;\n\t\t\t},\n\t\t\tdispose() {\n\t\t\t\tfor (const u of unsubs) u();\n\t\t\t},\n\t\t\texpand(\n\t\t\t\textra: Partial<Pick<ObserveOptions, \"causal\" | \"timeline\" | \"derived\">> | ObserveDetail,\n\t\t\t): ObserveResult {\n\t\t\t\tfor (const u of unsubs) u();\n\t\t\t\tconst merged: ObserveOptions = { ...options };\n\t\t\t\tif (typeof extra === \"string\") {\n\t\t\t\t\tmerged.detail = extra;\n\t\t\t\t} else {\n\t\t\t\t\tObject.assign(merged, extra);\n\t\t\t\t}\n\t\t\t\treturn graph._createObserveResultForAll(resolveObserveDetail(merged));\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Convenience live debugger over {@link Graph.observe}. Logs protocol events as they flow.\n\t *\n\t * Supports one-node (`path`) and graph-wide modes, event filtering, and JSON/pretty rendering.\n\t * Color themes are built in (`ansi` / `none`) to avoid external dependencies.\n\t *\n\t * @param options - Spy configuration.\n\t * @returns Disposable handle plus a structured observation accumulator.\n\t */\n\tspy(options: GraphSpyOptions = {}): GraphSpyHandle {\n\t\tconst include = options.includeTypes ? new Set(options.includeTypes) : null;\n\t\tconst exclude = options.excludeTypes ? new Set(options.excludeTypes) : null;\n\t\tconst theme = resolveSpyTheme(options.theme);\n\t\tconst format = options.format ?? \"pretty\";\n\t\tconst logger = options.logger ?? ((line: string) => console.log(line));\n\n\t\tconst shouldLog = (type: ObserveEvent[\"type\"]): boolean => {\n\t\t\tif (include?.has(type) === false) return false;\n\t\t\tif (exclude?.has(type) === true) return false;\n\t\t\treturn true;\n\t\t};\n\n\t\tconst renderEvent = (event: ObserveEvent): string => {\n\t\t\tif (format === \"json\") {\n\t\t\t\ttry {\n\t\t\t\t\treturn JSON.stringify(event);\n\t\t\t\t} catch {\n\t\t\t\t\treturn JSON.stringify({\n\t\t\t\t\t\ttype: event.type,\n\t\t\t\t\t\tpath: event.path,\n\t\t\t\t\t\tdata: \"[unserializable]\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst color = theme[event.type] ?? \"\";\n\t\t\tconst pathPart = event.path ? `${theme.path}${event.path}${theme.reset} ` : \"\";\n\t\t\tconst dataPart = event.data !== undefined ? ` ${describeData(event.data)}` : \"\";\n\t\t\tconst triggerPart =\n\t\t\t\tevent.trigger_dep_name != null\n\t\t\t\t\t? ` <- ${event.trigger_dep_name}`\n\t\t\t\t\t: event.trigger_dep_index != null\n\t\t\t\t\t\t? ` <- #${event.trigger_dep_index}`\n\t\t\t\t\t\t: \"\";\n\t\t\tconst batchPart = event.in_batch ? \" [batch]\" : \"\";\n\t\t\treturn `${pathPart}${color}${event.type.toUpperCase()}${theme.reset}${dataPart}${triggerPart}${batchPart}`;\n\t\t};\n\n\t\tif (!Graph.inspectorEnabled) {\n\t\t\tconst timeline = options.timeline ?? true;\n\t\t\tconst acc: {\n\t\t\t\tvalues: Record<string, unknown>;\n\t\t\t\tdirtyCount: number;\n\t\t\t\tresolvedCount: number;\n\t\t\t\tevents: ObserveEvent[];\n\t\t\t\tcompletedCleanly: boolean;\n\t\t\t\terrored: boolean;\n\t\t\t} = {\n\t\t\t\tvalues: {},\n\t\t\t\tdirtyCount: 0,\n\t\t\t\tresolvedCount: 0,\n\t\t\t\tevents: [],\n\t\t\t\tcompletedCleanly: false,\n\t\t\t\terrored: false,\n\t\t\t};\n\t\t\tlet stop: () => void = () => {};\n\t\t\tconst result: ObserveResult = {\n\t\t\t\tget values() {\n\t\t\t\t\treturn acc.values;\n\t\t\t\t},\n\t\t\t\tget dirtyCount() {\n\t\t\t\t\treturn acc.dirtyCount;\n\t\t\t\t},\n\t\t\t\tget resolvedCount() {\n\t\t\t\t\treturn acc.resolvedCount;\n\t\t\t\t},\n\t\t\t\tget events() {\n\t\t\t\t\treturn acc.events;\n\t\t\t\t},\n\t\t\t\tget completedCleanly() {\n\t\t\t\t\treturn acc.completedCleanly;\n\t\t\t\t},\n\t\t\t\tget errored() {\n\t\t\t\t\treturn acc.errored;\n\t\t\t\t},\n\t\t\t\tdispose() {\n\t\t\t\t\tstop();\n\t\t\t\t},\n\t\t\t\texpand() {\n\t\t\t\t\tthrow new Error(\"expand() requires inspector mode (Graph.inspectorEnabled = true)\");\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst pushEvent = (path: string | undefined, message: Messages[number]) => {\n\t\t\t\tconst t = message[0];\n\t\t\t\tconst base = timeline ? { timestamp_ns: monotonicNs(), in_batch: isBatching() } : {};\n\t\t\t\tlet event: ObserveEvent | undefined;\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tif (path != null) acc.values[path] = message[1];\n\t\t\t\t\tevent = { type: \"data\", ...(path != null ? { path } : {}), data: message[1], ...base };\n\t\t\t\t} else if (t === DIRTY) {\n\t\t\t\t\tacc.dirtyCount += 1;\n\t\t\t\t\tevent = { type: \"dirty\", ...(path != null ? { path } : {}), ...base };\n\t\t\t\t} else if (t === RESOLVED) {\n\t\t\t\t\tacc.resolvedCount += 1;\n\t\t\t\t\tevent = { type: \"resolved\", ...(path != null ? { path } : {}), ...base };\n\t\t\t\t} else if (t === COMPLETE) {\n\t\t\t\t\tif (!acc.errored) acc.completedCleanly = true;\n\t\t\t\t\tevent = { type: \"complete\", ...(path != null ? { path } : {}), ...base };\n\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\tacc.errored = true;\n\t\t\t\t\tevent = {\n\t\t\t\t\t\ttype: \"error\",\n\t\t\t\t\t\t...(path != null ? { path } : {}),\n\t\t\t\t\t\tdata: message[1],\n\t\t\t\t\t\t...base,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (!event) return;\n\t\t\t\tacc.events.push(event);\n\t\t\t\tif (!shouldLog(event.type)) return;\n\t\t\t\tlogger(renderEvent(event), event);\n\t\t\t};\n\n\t\t\tif (options.path != null) {\n\t\t\t\tconst stream = this.observe(options.path, {\n\t\t\t\t\tactor: options.actor,\n\t\t\t\t\tstructured: false,\n\t\t\t\t});\n\t\t\t\tstop = stream.subscribe((messages) => {\n\t\t\t\t\tfor (const m of messages) {\n\t\t\t\t\t\tpushEvent(options.path, m);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst stream = this.observe({ actor: options.actor, structured: false });\n\t\t\t\tstop = stream.subscribe((path, messages) => {\n\t\t\t\t\tfor (const m of messages) {\n\t\t\t\t\t\tpushEvent(path, m);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tresult,\n\t\t\t\tdispose() {\n\t\t\t\t\tresult.dispose();\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst structuredObserveOptions = {\n\t\t\tactor: options.actor,\n\t\t\tstructured: true as const,\n\t\t\t...(options.timeline !== false ? { timeline: true as const } : {}),\n\t\t\t...(options.causal ? { causal: true as const } : {}),\n\t\t\t...(options.derived ? { derived: true as const } : {}),\n\t\t};\n\t\tconst result: ObserveResult =\n\t\t\toptions.path != null\n\t\t\t\t? this.observe(options.path, structuredObserveOptions)\n\t\t\t\t: this.observe(structuredObserveOptions);\n\n\t\tlet cursor = 0;\n\t\tconst flushNewEvents = () => {\n\t\t\tconst nextEvents = result.events.slice(cursor);\n\t\t\tcursor = result.events.length;\n\t\t\tfor (const event of nextEvents) {\n\t\t\t\tif (!shouldLog(event.type)) continue;\n\t\t\t\tlogger(renderEvent(event), event);\n\t\t\t}\n\t\t};\n\n\t\tconst stream =\n\t\t\toptions.path != null\n\t\t\t\t? this.observe(options.path, { actor: options.actor, structured: false })\n\t\t\t\t: this.observe({ actor: options.actor, structured: false });\n\n\t\tconst stop =\n\t\t\toptions.path != null\n\t\t\t\t? (stream as GraphObserveOne).subscribe((messages) => {\n\t\t\t\t\t\tif (messages.length > 0) {\n\t\t\t\t\t\t\tflushNewEvents();\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t: (stream as GraphObserveAll).subscribe((_path, messages) => {\n\t\t\t\t\t\tif (messages.length > 0) {\n\t\t\t\t\t\t\tflushNewEvents();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\treturn {\n\t\t\tresult,\n\t\t\tdispose() {\n\t\t\t\tstop();\n\t\t\t\tflushNewEvents();\n\t\t\t\tresult.dispose();\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * CLI/debug-friendly graph dump built on {@link Graph.describe}.\n\t *\n\t * @param options - Optional actor/filter/format toggles.\n\t * @returns Rendered graph text.\n\t */\n\tdumpGraph(options: GraphDumpOptions = {}): string {\n\t\tconst { expand: _, ...described } = this.describe({\n\t\t\tactor: options.actor,\n\t\t\tfilter: options.filter,\n\t\t\tdetail: \"standard\",\n\t\t});\n\t\tconst includeEdges = options.includeEdges ?? true;\n\t\tconst includeSubgraphs = options.includeSubgraphs ?? true;\n\t\tif (options.format === \"json\") {\n\t\t\tconst payload: GraphDescribeOutput = {\n\t\t\t\t...described,\n\t\t\t\tedges: includeEdges ? described.edges : [],\n\t\t\t\tsubgraphs: includeSubgraphs ? described.subgraphs : [],\n\t\t\t};\n\t\t\tconst text = JSON.stringify(sortJsonValue(payload), null, options.indent ?? 2);\n\t\t\toptions.logger?.(text);\n\t\t\treturn text;\n\t\t}\n\n\t\tconst lines: string[] = [];\n\t\tlines.push(`Graph ${described.name}`);\n\t\tlines.push(\"Nodes:\");\n\t\tfor (const path of Object.keys(described.nodes).sort()) {\n\t\t\tconst n = described.nodes[path]!;\n\t\t\tlines.push(`- ${path} (${n.type}/${n.status}): ${describeData(n.value)}`);\n\t\t}\n\t\tif (includeEdges) {\n\t\t\tlines.push(\"Edges:\");\n\t\t\tfor (const edge of described.edges) {\n\t\t\t\tlines.push(`- ${edge.from} -> ${edge.to}`);\n\t\t\t}\n\t\t}\n\t\tif (includeSubgraphs) {\n\t\t\tlines.push(\"Subgraphs:\");\n\t\t\tfor (const sg of described.subgraphs) {\n\t\t\t\tlines.push(`- ${sg}`);\n\t\t\t}\n\t\t}\n\t\tconst text = lines.join(\"\\n\");\n\t\toptions.logger?.(text);\n\t\treturn text;\n\t}\n\n\t// ——————————————————————————————————————————————————————————————\n\t// Lifecycle & persistence (§3.7–§3.8)\n\t// ——————————————————————————————————————————————————————————————\n\n\t/**\n\t * Register a cleanup function to be called on {@link Graph.destroy}.\n\t *\n\t * Factories use this to attach teardown logic for internal nodes, keepalive\n\t * subscriptions, or other resources that are not registered on the graph and\n\t * would otherwise leak on repeated create/destroy cycles.\n\t *\n\t * Returns a removal function — call it to unregister the disposer early.\n\t */\n\taddDisposer(fn: () => void): () => void {\n\t\tthis._disposers.add(fn);\n\t\treturn () => {\n\t\t\tthis._disposers.delete(fn);\n\t\t};\n\t}\n\n\t/**\n\t * Drains disposers (registered via {@link addDisposer}), then sends `[[TEARDOWN]]` to all\n\t * nodes and clears registries on this graph and every mounted subgraph (§3.7).\n\t * The instance is left empty and may be reused with {@link Graph.add}.\n\t */\n\tdestroy(): void {\n\t\t// Drain disposers (keepalive unsubs etc.) BEFORE TEARDOWN so that\n\t\t// internal effect nodes are disconnected before the cascade fires.\n\t\tfor (const dispose of [...this._disposers]) {\n\t\t\ttry {\n\t\t\t\tdispose();\n\t\t\t} catch {\n\t\t\t\t/* ignore */\n\t\t\t}\n\t\t}\n\t\tthis._disposers.clear();\n\t\tthis.signal([[TEARDOWN]] satisfies Messages, { internal: true });\n\t\tfor (const dispose of [...this._autoCheckpointDisposers]) {\n\t\t\ttry {\n\t\t\t\tdispose();\n\t\t\t} catch {\n\t\t\t\t/* ignore */\n\t\t\t}\n\t\t}\n\t\tthis._autoCheckpointDisposers.clear();\n\t\tfor (const child of [...this._mounts.values()]) {\n\t\t\tchild._destroyClearOnly();\n\t\t}\n\t\tthis._mounts.clear();\n\t\tthis._nodes.clear();\n\t\tthis._edges.clear();\n\t}\n\n\t/** Clear structure after parent already signaled TEARDOWN through this subtree. */\n\tprivate _destroyClearOnly(): void {\n\t\tfor (const child of [...this._mounts.values()]) {\n\t\t\tchild._destroyClearOnly();\n\t\t}\n\t\tthis._mounts.clear();\n\t\tthis._nodes.clear();\n\t\tthis._edges.clear();\n\t}\n\n\t/**\n\t * Serializes structure and current values to JSON-shaped data (§3.8). Same information\n\t * as {@link Graph.describe} plus a `version` field for format evolution.\n\t *\n\t * @returns Persistable snapshot with sorted keys.\n\t */\n\tsnapshot(): GraphPersistSnapshot {\n\t\tconst { expand: _, ...d } = this.describe({ detail: \"full\" });\n\t\t// Explicit key sorting for deterministic output — don't rely on\n\t\t// describe() iteration order (audit batch-3, §3.8).\n\t\t// Strip non-restorable fields (runtime attribution) so snapshot → restore → snapshot\n\t\t// is idempotent. Use describe({ detail: \"full\" }) for audit snapshots instead.\n\t\tconst sortedNodes: Record<string, DescribeNodeOutput> = {};\n\t\tfor (const key of Object.keys(d.nodes).sort()) {\n\t\t\tconst { lastMutation: _lm, guard: _g, ...node } = d.nodes[key]!;\n\t\t\tsortedNodes[key] = node;\n\t\t}\n\t\tconst sortedSubgraphs = [...d.subgraphs].sort();\n\t\treturn { ...d, version: 1, nodes: sortedNodes, subgraphs: sortedSubgraphs };\n\t}\n\n\t/**\n\t * Apply persisted values onto an existing graph whose topology matches the snapshot\n\t * (§3.8). Only {@link DescribeNodeOutput.type} `state` and `producer` entries with a\n\t * `value` field are written; `derived` / `operator` / `effect` are skipped so deps\n\t * drive recomputation. Unknown paths are ignored.\n\t *\n\t * @param data - Snapshot envelope with matching `name` and node slices.\n\t * @throws If `data.name` does not equal {@link Graph.name}.\n\t */\n\trestore(data: GraphPersistSnapshot, options?: { only?: string | readonly string[] }): void {\n\t\tparseSnapshotEnvelope(data);\n\t\tif (data.name !== this.name) {\n\t\t\tthrow new Error(\n\t\t\t\t`Graph \"${this.name}\": restore snapshot name \"${data.name}\" does not match this graph`,\n\t\t\t);\n\t\t}\n\t\tconst onlyPatterns =\n\t\t\toptions?.only == null\n\t\t\t\t? null\n\t\t\t\t: (Array.isArray(options.only) ? options.only : [options.only]).map((p) => globToRegex(p));\n\t\tfor (const path of Object.keys(data.nodes).sort()) {\n\t\t\tif (onlyPatterns !== null && !onlyPatterns.some((re) => re.test(path))) continue;\n\t\t\tconst slice = data.nodes[path];\n\t\t\tif (slice === undefined || slice.value === undefined) continue;\n\t\t\tif (slice.type === \"derived\" || slice.type === \"operator\" || slice.type === \"effect\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tthis.set(path, slice.value);\n\t\t\t} catch {\n\t\t\t\t/* missing path or set not applicable */\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Creates a graph named from the snapshot, optionally runs `build` to register nodes\n\t * and mounts, then {@link Graph.restore} values (§3.8).\n\t *\n\t * @param data - Snapshot envelope (`version` checked).\n\t * @param build - Optional callback to construct topology before values are applied.\n\t * @returns Hydrated `Graph` instance.\n\t */\n\tstatic fromSnapshot(data: GraphPersistSnapshot, build?: (g: Graph) => void): Graph {\n\t\tparseSnapshotEnvelope(data);\n\t\tconst g = new Graph(data.name);\n\t\tif (build) {\n\t\t\tbuild(g);\n\t\t\tg.restore(data);\n\t\t\treturn g;\n\t\t}\n\t\t// Auto-create mount hierarchy from subgraphs.\n\t\tfor (const mount of [...data.subgraphs].sort((a, b) => {\n\t\t\tconst da = a.split(PATH_SEP).length;\n\t\t\tconst db = b.split(PATH_SEP).length;\n\t\t\tif (da !== db) return da - db;\n\t\t\tif (a < b) return -1;\n\t\t\tif (a > b) return 1;\n\t\t\treturn 0;\n\t\t})) {\n\t\t\tconst parts = mount.split(PATH_SEP);\n\t\t\tlet target: Graph = g;\n\t\t\tfor (const seg of parts) {\n\t\t\t\tif (!target._mounts.has(seg)) {\n\t\t\t\t\ttarget.mount(seg, new Graph(seg));\n\t\t\t\t}\n\t\t\t\ttarget = target._mounts.get(seg)!;\n\t\t\t}\n\t\t}\n\n\t\tconst primaryEntries = Object.entries(data.nodes)\n\t\t\t.filter(([path]) => !path.includes(`${PATH_SEP}${GRAPH_META_SEGMENT}${PATH_SEP}`))\n\t\t\t.sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0));\n\t\tconst pending = new Map(primaryEntries);\n\t\tconst created = new Map<string, Node>();\n\n\t\tlet progressed = true;\n\t\twhile (pending.size > 0 && progressed) {\n\t\t\tprogressed = false;\n\t\t\tfor (const [path, slice] of [...pending.entries()]) {\n\t\t\t\tconst deps = slice?.deps ?? [];\n\t\t\t\tif (!deps.every((dep) => created.has(dep))) continue;\n\t\t\t\tconst [owner, localName] = Graph._ownerForPath(g, path);\n\t\t\t\tconst meta: Record<string, unknown> = { ...(slice?.meta ?? {}) };\n\t\t\t\tconst factory = Graph._factoryForPath(path);\n\t\t\t\tlet node: Node;\n\t\t\t\tif (slice?.type === \"state\") {\n\t\t\t\t\tnode = stateNode(slice.value, { meta });\n\t\t\t\t} else {\n\t\t\t\t\tif (factory == null) continue;\n\t\t\t\t\tnode = factory(localName, {\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\ttype: slice.type,\n\t\t\t\t\t\tvalue: slice.value,\n\t\t\t\t\t\tmeta,\n\t\t\t\t\t\tdeps,\n\t\t\t\t\t\tresolvedDeps: deps.map((dep) => created.get(dep)!),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\towner.add(localName, node);\n\t\t\t\tcreated.set(path, node);\n\t\t\t\tpending.delete(path);\n\t\t\t\tprogressed = true;\n\t\t\t}\n\t\t}\n\t\tif (pending.size > 0) {\n\t\t\tconst unresolved = [...pending.keys()].sort().join(\", \");\n\t\t\tthrow new Error(\n\t\t\t\t`Graph.fromSnapshot could not reconstruct nodes without build callback: ${unresolved}. ` +\n\t\t\t\t\t`Register matching factories with Graph.registerFactory(pattern, factory).`,\n\t\t\t);\n\t\t}\n\t\tfor (const edge of data.edges) {\n\t\t\ttry {\n\t\t\t\tg.connect(edge.from, edge.to);\n\t\t\t} catch {\n\t\t\t\t/* ignore malformed or non-reconstructable edge */\n\t\t\t}\n\t\t}\n\t\tg.restore(data);\n\t\treturn g;\n\t}\n\n\t/**\n\t * Plain snapshot object with **recursively sorted object keys** for deterministic serialization (§3.8).\n\t *\n\t * @remarks\n\t * For a single UTF-8 string with a trailing newline (convenient for git), use {@link Graph.toJSONString}.\n\t *\n\t * @returns Same object as {@link Graph.snapshot}.\n\t */\n\ttoObject(): GraphPersistSnapshot {\n\t\treturn this.snapshot();\n\t}\n\n\t/**\n\t * ECMAScript `JSON.stringify` hook — delegates to {@link Graph.toObject}.\n\t *\n\t * @remarks\n\t * Must return a plain object (not a string) so `JSON.stringify(graph)` works correctly\n\t * without double-encoding.\n\t */\n\ttoJSON(): GraphPersistSnapshot {\n\t\treturn this.toObject();\n\t}\n\n\t/**\n\t * Deterministic JSON **text**: `JSON.stringify` of {@link Graph.toObject} plus a trailing newline (§3.8).\n\t *\n\t * @returns Stable string suitable for diffs.\n\t */\n\ttoJSONString(): string {\n\t\treturn stableJsonStringify(this.snapshot());\n\t}\n\n\t/**\n\t * Debounced persistence wired to graph-wide observe stream (spec §3.8 auto-checkpoint).\n\t *\n\t * Checkpoint trigger uses {@link messageTier}: only batches containing tier >= 2 messages\n\t * schedule a save (`DATA`/`RESOLVED`/terminal/destruction), never pure tier-0/1 control waves.\n\t */\n\tautoCheckpoint(\n\t\tadapter: AutoCheckpointAdapter,\n\t\toptions: GraphAutoCheckpointOptions = {},\n\t): GraphAutoCheckpointHandle {\n\t\tconst debounceMs = Math.max(0, options.debounceMs ?? 500);\n\t\tconst compactEvery = Math.max(1, options.compactEvery ?? 10);\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\tlet seq = 0;\n\t\tlet pending = false;\n\t\tlet lastDescribe: GraphDescribeOutput | undefined;\n\n\t\tconst flush = () => {\n\t\t\ttimer = undefined;\n\t\t\tif (!pending) return;\n\t\t\tpending = false;\n\t\t\ttry {\n\t\t\t\tconst { expand: _expand, ...raw } = this.describe({ detail: \"full\" });\n\t\t\t\t// Strip non-restorable fields for persistence idempotency\n\t\t\t\tconst cleanNodes: Record<string, DescribeNodeOutput> = {};\n\t\t\t\tfor (const [p, n] of Object.entries(raw.nodes)) {\n\t\t\t\t\tconst { lastMutation: _lm, guard: _g, ...node } = n!;\n\t\t\t\t\tcleanNodes[p] = node;\n\t\t\t\t}\n\t\t\t\tconst described = { ...raw, nodes: cleanNodes };\n\t\t\t\tconst snapshot = { ...described, version: SNAPSHOT_VERSION };\n\t\t\t\tseq += 1;\n\t\t\t\tconst shouldCompact = lastDescribe == null || seq % compactEvery === 0;\n\t\t\t\tif (shouldCompact) {\n\t\t\t\t\tadapter.save(this.name, { mode: \"full\", snapshot, seq } satisfies GraphCheckpointRecord);\n\t\t\t\t} else {\n\t\t\t\t\tconst previous = lastDescribe;\n\t\t\t\t\tif (previous == null) return;\n\t\t\t\t\tadapter.save(this.name, {\n\t\t\t\t\t\tmode: \"diff\",\n\t\t\t\t\t\tdiff: Graph.diff(previous, described),\n\t\t\t\t\t\tsnapshot,\n\t\t\t\t\t\tseq,\n\t\t\t\t\t} satisfies GraphCheckpointRecord);\n\t\t\t\t}\n\t\t\t\tlastDescribe = described;\n\t\t\t} catch (error) {\n\t\t\t\toptions.onError?.(error);\n\t\t\t}\n\t\t};\n\n\t\tconst schedule = () => {\n\t\t\tpending = true;\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\ttimer = setTimeout(flush, debounceMs);\n\t\t};\n\n\t\tconst off = this.observe().subscribe((path, messages) => {\n\t\t\tconst triggeredByTier = messages.some((m) => messageTier(m[0]) >= 2);\n\t\t\tif (!triggeredByTier) return;\n\t\t\tif (options.filter) {\n\t\t\t\tconst nd = this.resolve(path);\n\t\t\t\tif (nd == null) return;\n\t\t\t\tconst described = describeNode(nd, resolveDescribeFields(\"standard\"));\n\t\t\t\tif (!options.filter(path, described)) return;\n\t\t\t}\n\t\t\tschedule();\n\t\t});\n\n\t\tconst dispose = () => {\n\t\t\toff();\n\t\t\tif (timer !== undefined) {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\ttimer = undefined;\n\t\t\t}\n\t\t\tthis._autoCheckpointDisposers.delete(dispose);\n\t\t};\n\t\tthis._autoCheckpointDisposers.add(dispose);\n\t\treturn { dispose };\n\t}\n\n\t/**\n\t * Export the current graph topology as Mermaid flowchart text.\n\t *\n\t * Renders qualified node paths and registered edges from {@link Graph.describe}.\n\t *\n\t * @param options - Optional diagram direction (`LR` by default).\n\t * @returns Mermaid flowchart source.\n\t */\n\ttoMermaid(options?: GraphDiagramOptions): string {\n\t\tconst direction = normalizeDiagramDirection(options?.direction);\n\t\tconst described = this.describe();\n\t\tconst paths = Object.keys(described.nodes).sort();\n\t\tconst ids = new Map<string, string>();\n\t\tfor (let i = 0; i < paths.length; i += 1) {\n\t\t\tids.set(paths[i]!, `n${i}`);\n\t\t}\n\t\tconst lines: string[] = [`flowchart ${direction}`];\n\t\tfor (const path of paths) {\n\t\t\tconst id = ids.get(path)!;\n\t\t\tlines.push(` ${id}[\"${escapeMermaidLabel(path)}\"]`);\n\t\t}\n\t\tfor (const [from, to] of collectDiagramArrows(described)) {\n\t\t\tconst fromId = ids.get(from);\n\t\t\tconst toId = ids.get(to);\n\t\t\tif (!fromId || !toId) continue;\n\t\t\tlines.push(` ${fromId} --> ${toId}`);\n\t\t}\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\t/**\n\t * Export the current graph topology as D2 diagram text.\n\t *\n\t * Renders qualified node paths, constructor deps, and registered edges from {@link Graph.describe}.\n\t *\n\t * @param options - Optional diagram direction (`LR` by default).\n\t * @returns D2 source text.\n\t */\n\ttoD2(options?: GraphDiagramOptions): string {\n\t\tconst direction = normalizeDiagramDirection(options?.direction);\n\t\tconst described = this.describe();\n\t\tconst paths = Object.keys(described.nodes).sort();\n\t\tconst ids = new Map<string, string>();\n\t\tfor (let i = 0; i < paths.length; i += 1) {\n\t\t\tids.set(paths[i]!, `n${i}`);\n\t\t}\n\t\tconst lines: string[] = [`direction: ${d2DirectionFromGraphDirection(direction)}`];\n\t\tfor (const path of paths) {\n\t\t\tconst id = ids.get(path)!;\n\t\t\tlines.push(`${id}: \"${escapeD2Label(path)}\"`);\n\t\t}\n\t\tfor (const [from, to] of collectDiagramArrows(described)) {\n\t\t\tconst fromId = ids.get(from);\n\t\t\tconst toId = ids.get(to);\n\t\t\tif (!fromId || !toId) continue;\n\t\t\tlines.push(`${fromId} -> ${toId}`);\n\t\t}\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\t// ——————————————————————————————————————————————————————————————\n\t// Inspector (roadmap 3.3) — reasoning trace, overhead gating\n\t// ——————————————————————————————————————————————————————————————\n\n\t/**\n\t * When `false`, structured observation options (`causal`, `timeline`),\n\t * `annotate()`, and `traceLog()` are no-ops. Raw `observe()` always works.\n\t *\n\t * Default: `true` outside production (`process.env.NODE_ENV !== \"production\"`).\n\t */\n\tstatic inspectorEnabled = !(\n\t\ttypeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\"\n\t);\n\n\tprivate _annotations = new Map<string, string>();\n\tprivate _traceRing = new RingBuffer<TraceEntry>(1000);\n\n\t/**\n\t * Attaches a reasoning annotation to a node — captures *why* an AI agent set a value.\n\t *\n\t * No-op when {@link Graph.inspectorEnabled} is `false`.\n\t *\n\t * @param path - Qualified node path.\n\t * @param reason - Free-text note stored in the trace ring buffer.\n\t */\n\tannotate(path: string, reason: string): void {\n\t\tif (!Graph.inspectorEnabled) return;\n\t\tthis.resolve(path); // validate path exists\n\t\tthis._annotations.set(path, reason);\n\t\tthis._traceRing.push({ path, reason, timestamp_ns: monotonicNs() });\n\t}\n\n\t/**\n\t * Returns a chronological log of all reasoning annotations (ring buffer).\n\t *\n\t * @returns `[]` when {@link Graph.inspectorEnabled} is `false`.\n\t */\n\ttraceLog(): readonly TraceEntry[] {\n\t\tif (!Graph.inspectorEnabled) return [];\n\t\treturn this._traceRing.toArray();\n\t}\n\n\t/**\n\t * Computes structural + value diff between two {@link Graph.describe} snapshots.\n\t *\n\t * @param a - Earlier describe output.\n\t * @param b - Later describe output.\n\t * @returns Added/removed nodes, changed fields, and edge deltas.\n\t */\n\tstatic diff(a: GraphDescribeOutput, b: GraphDescribeOutput): GraphDiffResult {\n\t\tconst aKeys = new Set(Object.keys(a.nodes));\n\t\tconst bKeys = new Set(Object.keys(b.nodes));\n\n\t\tconst nodesAdded = [...bKeys].filter((k) => !aKeys.has(k)).sort();\n\t\tconst nodesRemoved = [...aKeys].filter((k) => !bKeys.has(k)).sort();\n\t\tconst nodesChanged: GraphDiffChange[] = [];\n\n\t\tfor (const key of aKeys) {\n\t\t\tif (!bKeys.has(key)) continue;\n\t\t\tconst na = a.nodes[key];\n\t\t\tconst nb = b.nodes[key];\n\t\t\t// V0 optimization: skip value comparison when both nodes have matching versions.\n\t\t\tconst av = na.v;\n\t\t\tconst bv = nb.v;\n\t\t\tif (av != null && bv != null && av.id === bv.id && av.version === bv.version) {\n\t\t\t\t// Version unchanged — only check type/status (cheap string compare).\n\t\t\t\tfor (const field of [\"type\", \"status\"] as const) {\n\t\t\t\t\tconst va = (na as Record<string, unknown>)[field];\n\t\t\t\t\tconst vb = (nb as Record<string, unknown>)[field];\n\t\t\t\t\tif (va !== vb) {\n\t\t\t\t\t\tnodesChanged.push({ path: key, field, from: va, to: vb });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const field of [\"type\", \"status\", \"value\"] as const) {\n\t\t\t\tconst va = (na as Record<string, unknown>)[field];\n\t\t\t\tconst vb = (nb as Record<string, unknown>)[field];\n\t\t\t\tif (!Object.is(va, vb) && JSON.stringify(va) !== JSON.stringify(vb)) {\n\t\t\t\t\tnodesChanged.push({ path: key, field, from: va, to: vb });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst edgeKey = (e: { from: string; to: string }) => `${e.from}\\t${e.to}`;\n\t\tconst aEdges = new Set(a.edges.map(edgeKey));\n\t\tconst bEdges = new Set(b.edges.map(edgeKey));\n\n\t\tconst edgesAdded = b.edges.filter((e) => !aEdges.has(edgeKey(e)));\n\t\tconst edgesRemoved = a.edges.filter((e) => !bEdges.has(edgeKey(e)));\n\t\tconst aSubgraphs = new Set(a.subgraphs);\n\t\tconst bSubgraphs = new Set(b.subgraphs);\n\t\tconst subgraphsAdded = [...bSubgraphs].filter((s) => !aSubgraphs.has(s)).sort();\n\t\tconst subgraphsRemoved = [...aSubgraphs].filter((s) => !bSubgraphs.has(s)).sort();\n\n\t\treturn {\n\t\t\tnodesAdded,\n\t\t\tnodesRemoved,\n\t\t\tnodesChanged,\n\t\t\tedgesAdded,\n\t\t\tedgesRemoved,\n\t\t\tsubgraphsAdded,\n\t\t\tsubgraphsRemoved,\n\t\t};\n\t}\n}\n\n/** Entry in the reasoning trace ring buffer (roadmap 3.3). */\nexport type TraceEntry = {\n\tpath: string;\n\treason: string;\n\ttimestamp_ns: number;\n};\n\n/** Result of {@link Graph.diff}. */\nexport type GraphDiffResult = {\n\tnodesAdded: string[];\n\tnodesRemoved: string[];\n\tnodesChanged: GraphDiffChange[];\n\tedgesAdded: Array<{ from: string; to: string }>;\n\tedgesRemoved: Array<{ from: string; to: string }>;\n\tsubgraphsAdded: string[];\n\tsubgraphsRemoved: string[];\n};\n\n/** A single field change within a diff. */\nexport type GraphDiffChange = {\n\tpath: string;\n\tfield: string;\n\tfrom: unknown;\n\tto: unknown;\n};\n\n/** Direction for {@link reachable} graph traversal. */\nexport type ReachableDirection = \"upstream\" | \"downstream\";\n\n/** Options for {@link reachable}. */\nexport type ReachableOptions = {\n\t/** Maximum hop depth from `from` (0 returns `[]`). Omit for unbounded traversal. */\n\tmaxDepth?: number;\n};\n\n/**\n * Reachability query over a {@link Graph.describe} snapshot.\n *\n * Traversal combines dependency links (`deps`) and explicit graph edges (`edges`):\n * - `upstream`: follows `deps` plus incoming edges.\n * - `downstream`: follows reverse-`deps` plus outgoing edges.\n *\n * @param described - `graph.describe()` output to traverse.\n * @param from - Start path (qualified node path).\n * @param direction - Traversal direction.\n * @param options - Optional max depth bound.\n * @returns Sorted list of reachable paths (excluding `from`).\n *\n * @example\n * ```ts\n * import { Graph, reachable } from \"@graphrefly/graphrefly-ts\";\n *\n * const g = new Graph(\"app\");\n * const a = g.register(\"a\");\n * const b = g.register(\"b\", [a]);\n * const described = g.describe();\n *\n * reachable(described, \"app.a\", \"downstream\"); // [\"app.b\"]\n * reachable(described, \"app.b\", \"upstream\"); // [\"app.a\"]\n * ```\n */\nexport function reachable(\n\tdescribed: GraphDescribeOutput,\n\tfrom: string,\n\tdirection: ReachableDirection,\n\toptions: ReachableOptions = {},\n): string[] {\n\tif (!from) return [];\n\tif (direction !== \"upstream\" && direction !== \"downstream\") {\n\t\tthrow new Error(`reachable: direction must be \"upstream\" or \"downstream\"`);\n\t}\n\tconst maxDepth = options.maxDepth;\n\tif (maxDepth != null && (!Number.isInteger(maxDepth) || maxDepth < 0)) {\n\t\tthrow new Error(`reachable: maxDepth must be an integer >= 0`);\n\t}\n\tif (maxDepth === 0) return [];\n\n\tconst depsByPath = new Map<string, string[]>();\n\tconst reverseDeps = new Map<string, Set<string>>();\n\tconst incomingEdges = new Map<string, Set<string>>();\n\tconst outgoingEdges = new Map<string, Set<string>>();\n\tconst universe = new Set<string>();\n\n\tconst nodesRaw =\n\t\tdescribed != null &&\n\t\ttypeof described === \"object\" &&\n\t\t\"nodes\" in described &&\n\t\ttypeof (described as Record<string, unknown>).nodes === \"object\" &&\n\t\t(described as Record<string, unknown>).nodes !== null &&\n\t\t!Array.isArray((described as Record<string, unknown>).nodes)\n\t\t\t? ((described as Record<string, unknown>).nodes as Record<string, unknown>)\n\t\t\t: {};\n\tconst edgesRaw =\n\t\tdescribed != null &&\n\t\ttypeof described === \"object\" &&\n\t\t\"edges\" in described &&\n\t\tArray.isArray((described as Record<string, unknown>).edges)\n\t\t\t? ((described as Record<string, unknown>).edges as unknown[])\n\t\t\t: [];\n\n\tfor (const [path, node] of Object.entries(nodesRaw)) {\n\t\tif (!path) continue;\n\t\tuniverse.add(path);\n\t\tconst deps =\n\t\t\tnode != null && typeof node === \"object\" && Array.isArray((node as { deps?: unknown[] }).deps)\n\t\t\t\t? (node as { deps: unknown[] }).deps\n\t\t\t\t: [];\n\t\tconst cleanDeps = deps.filter((d): d is string => typeof d === \"string\" && d.length > 0);\n\t\tdepsByPath.set(path, cleanDeps);\n\t\tfor (const dep of cleanDeps) {\n\t\t\tuniverse.add(dep);\n\t\t\tif (!reverseDeps.has(dep)) reverseDeps.set(dep, new Set());\n\t\t\treverseDeps.get(dep)!.add(path);\n\t\t}\n\t}\n\tfor (const edge of edgesRaw) {\n\t\tif (edge == null || typeof edge !== \"object\") continue;\n\t\tconst edgeFrom =\n\t\t\t\"from\" in edge && typeof (edge as { from?: unknown }).from === \"string\"\n\t\t\t\t? ((edge as { from: string }).from as string)\n\t\t\t\t: \"\";\n\t\tconst edgeTo =\n\t\t\t\"to\" in edge && typeof (edge as { to?: unknown }).to === \"string\"\n\t\t\t\t? ((edge as { to: string }).to as string)\n\t\t\t\t: \"\";\n\t\tif (!edgeFrom || !edgeTo) continue;\n\t\tuniverse.add(edgeFrom);\n\t\tuniverse.add(edgeTo);\n\t\tif (!outgoingEdges.has(edgeFrom)) outgoingEdges.set(edgeFrom, new Set());\n\t\toutgoingEdges.get(edgeFrom)!.add(edgeTo);\n\t\tif (!incomingEdges.has(edgeTo)) incomingEdges.set(edgeTo, new Set());\n\t\tincomingEdges.get(edgeTo)!.add(edgeFrom);\n\t}\n\n\tif (!universe.has(from)) return [];\n\n\tconst neighbors = (path: string): string[] => {\n\t\tif (direction === \"upstream\") {\n\t\t\tconst depNeighbors = depsByPath.get(path) ?? [];\n\t\t\tconst edgeNeighbors = [...(incomingEdges.get(path) ?? [])];\n\t\t\treturn [...depNeighbors, ...edgeNeighbors];\n\t\t}\n\t\tconst depNeighbors = [...(reverseDeps.get(path) ?? [])];\n\t\tconst edgeNeighbors = [...(outgoingEdges.get(path) ?? [])];\n\t\treturn [...depNeighbors, ...edgeNeighbors];\n\t};\n\n\tconst visited = new Set<string>([from]);\n\tconst out = new Set<string>();\n\tconst queue: Array<{ path: string; depth: number }> = [{ path: from, depth: 0 }];\n\twhile (queue.length > 0) {\n\t\tconst next = queue.shift()!;\n\t\tif (maxDepth != null && next.depth >= maxDepth) continue;\n\t\tfor (const nb of neighbors(next.path)) {\n\t\t\tif (!nb || visited.has(nb)) continue;\n\t\t\tvisited.add(nb);\n\t\t\tout.add(nb);\n\t\t\tqueue.push({ path: nb, depth: next.depth + 1 });\n\t\t}\n\t}\n\n\treturn [...out].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n}\n"],"mappings":"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","names":["actor","wantsStructured","stop","result","stream","text","edgeKey","depNeighbors","edgeNeighbors"]}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
DynamicNodeImpl,
|
|
3
3
|
NodeImpl,
|
|
4
4
|
accessHintForGuard
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-VZY2B2LU.js";
|
|
6
6
|
|
|
7
7
|
// src/core/meta.ts
|
|
8
8
|
function resolveDescribeFields(detail, fields) {
|
|
@@ -102,4 +102,4 @@ export {
|
|
|
102
102
|
metaSnapshot,
|
|
103
103
|
describeNode
|
|
104
104
|
};
|
|
105
|
-
//# sourceMappingURL=chunk-
|
|
105
|
+
//# sourceMappingURL=chunk-ITDVOCFO.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
describeNode,
|
|
6
6
|
metaSnapshot,
|
|
7
7
|
resolveDescribeFields
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-ITDVOCFO.js";
|
|
9
9
|
import {
|
|
10
10
|
CLEANUP_RESULT,
|
|
11
11
|
COMPLETE,
|
|
@@ -49,7 +49,7 @@ import {
|
|
|
49
49
|
propagatesToMeta,
|
|
50
50
|
state,
|
|
51
51
|
wallClockNs
|
|
52
|
-
} from "./chunk-
|
|
52
|
+
} from "./chunk-VZY2B2LU.js";
|
|
53
53
|
|
|
54
54
|
// src/core/index.ts
|
|
55
55
|
var core_exports = {};
|
|
@@ -159,4 +159,4 @@ export {
|
|
|
159
159
|
bridge,
|
|
160
160
|
core_exports
|
|
161
161
|
};
|
|
162
|
-
//# sourceMappingURL=chunk-
|
|
162
|
+
//# sourceMappingURL=chunk-LKP7IWRV.js.map
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {
|
|
2
|
-
bumpVersion,
|
|
3
2
|
cached,
|
|
4
3
|
createWatermarkController,
|
|
5
4
|
empty,
|
|
@@ -27,12 +26,11 @@ import {
|
|
|
27
26
|
replay,
|
|
28
27
|
share,
|
|
29
28
|
shareReplay,
|
|
30
|
-
snapshotEqualsVersion,
|
|
31
29
|
throwError,
|
|
32
30
|
toArray,
|
|
33
31
|
toMessages$,
|
|
34
32
|
toObservable
|
|
35
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-YX263TXI.js";
|
|
36
34
|
import {
|
|
37
35
|
ResettableTimer
|
|
38
36
|
} from "./chunk-WZ2Z2CRV.js";
|
|
@@ -60,7 +58,7 @@ import {
|
|
|
60
58
|
producer,
|
|
61
59
|
state,
|
|
62
60
|
wallClockNs
|
|
63
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-VZY2B2LU.js";
|
|
64
62
|
|
|
65
63
|
// src/extra/index.ts
|
|
66
64
|
var extra_exports = {};
|
|
@@ -5241,9 +5239,6 @@ var throttleTime = throttle;
|
|
|
5241
5239
|
var catchError = rescue;
|
|
5242
5240
|
|
|
5243
5241
|
// src/extra/reactive-map.ts
|
|
5244
|
-
function emptySnapshot() {
|
|
5245
|
-
return { version: 0, value: { map: /* @__PURE__ */ new Map() } };
|
|
5246
|
-
}
|
|
5247
5242
|
function isExpired(e, now) {
|
|
5248
5243
|
return e.expiresAt !== void 0 && now >= e.expiresAt;
|
|
5249
5244
|
}
|
|
@@ -5257,12 +5252,12 @@ function buildMap(store, now) {
|
|
|
5257
5252
|
function reactiveMap(options = {}) {
|
|
5258
5253
|
const { name, maxSize, defaultTtl, ...nodeOpts } = options;
|
|
5259
5254
|
const store = /* @__PURE__ */ new Map();
|
|
5260
|
-
|
|
5261
|
-
const n = state(current, {
|
|
5255
|
+
const n = state(/* @__PURE__ */ new Map(), {
|
|
5262
5256
|
...nodeOpts,
|
|
5263
5257
|
name,
|
|
5264
5258
|
describeKind: "state",
|
|
5265
|
-
equals:
|
|
5259
|
+
equals: (a, b) => a === b
|
|
5260
|
+
// identity; pushSnapshot always creates a new Map
|
|
5266
5261
|
});
|
|
5267
5262
|
function pruneExpiredInternal() {
|
|
5268
5263
|
const now = monotonicNs();
|
|
@@ -5287,11 +5282,9 @@ function reactiveMap(options = {}) {
|
|
|
5287
5282
|
pruneExpiredInternal();
|
|
5288
5283
|
const now = monotonicNs();
|
|
5289
5284
|
const map2 = buildMap(store, now);
|
|
5290
|
-
const nv = n.v;
|
|
5291
|
-
current = bumpVersion(current, { map: map2 }, nv ? { id: nv.id, version: nv.version } : void 0);
|
|
5292
5285
|
batch(() => {
|
|
5293
5286
|
n.down([[DIRTY]]);
|
|
5294
|
-
n.down([[DATA,
|
|
5287
|
+
n.down([[DATA, map2]]);
|
|
5295
5288
|
});
|
|
5296
5289
|
}
|
|
5297
5290
|
function touchLru(key) {
|
|
@@ -5301,7 +5294,7 @@ function reactiveMap(options = {}) {
|
|
|
5301
5294
|
store.set(key, e);
|
|
5302
5295
|
}
|
|
5303
5296
|
const bundle = {
|
|
5304
|
-
|
|
5297
|
+
entries: n,
|
|
5305
5298
|
get(key) {
|
|
5306
5299
|
const now = monotonicNs();
|
|
5307
5300
|
const e = store.get(key);
|
|
@@ -5398,13 +5391,11 @@ function keepalive(node2) {
|
|
|
5398
5391
|
node2.subscribe(() => void 0);
|
|
5399
5392
|
}
|
|
5400
5393
|
function mapFromSnapshot(snapshot) {
|
|
5401
|
-
if (
|
|
5402
|
-
return snapshot.value.map ?? /* @__PURE__ */ new Map();
|
|
5403
|
-
}
|
|
5394
|
+
if (snapshot instanceof Map) return snapshot;
|
|
5404
5395
|
return /* @__PURE__ */ new Map();
|
|
5405
5396
|
}
|
|
5406
5397
|
function asReadonlyMap(store) {
|
|
5407
|
-
return mapFromSnapshot(store.
|
|
5398
|
+
return mapFromSnapshot(store.entries.get());
|
|
5408
5399
|
}
|
|
5409
5400
|
function applyExtraction(store, extraction) {
|
|
5410
5401
|
if (!Array.isArray(extraction.upsert)) {
|
|
@@ -5432,7 +5423,7 @@ function distill(source, extractFn, opts) {
|
|
|
5432
5423
|
if (opts.evict) {
|
|
5433
5424
|
const evictionKeys = dynamicNode((get) => {
|
|
5434
5425
|
const out = [];
|
|
5435
|
-
const snapshot = mapFromSnapshot(get(store.
|
|
5426
|
+
const snapshot = mapFromSnapshot(get(store.entries));
|
|
5436
5427
|
for (const [key, mem] of snapshot) {
|
|
5437
5428
|
const verdict = opts.evict(key, mem);
|
|
5438
5429
|
if (isNodeLike(verdict)) {
|
|
@@ -5462,7 +5453,7 @@ function distill(source, extractFn, opts) {
|
|
|
5462
5453
|
applyExtraction(store, extraction);
|
|
5463
5454
|
});
|
|
5464
5455
|
}
|
|
5465
|
-
const compact = derived([store.
|
|
5456
|
+
const compact = derived([store.entries, contextNode], ([snapshot, context]) => {
|
|
5466
5457
|
const entries = [...mapFromSnapshot(snapshot).entries()].map(([key, value]) => ({
|
|
5467
5458
|
key,
|
|
5468
5459
|
value,
|
|
@@ -5480,7 +5471,7 @@ function distill(source, extractFn, opts) {
|
|
|
5480
5471
|
}
|
|
5481
5472
|
return packed;
|
|
5482
5473
|
});
|
|
5483
|
-
const size = derived([store.
|
|
5474
|
+
const size = derived([store.entries], ([snapshot]) => mapFromSnapshot(snapshot).size);
|
|
5484
5475
|
keepalive(compact);
|
|
5485
5476
|
keepalive(size);
|
|
5486
5477
|
return { store, compact, size };
|
|
@@ -5517,9 +5508,6 @@ function pubsub() {
|
|
|
5517
5508
|
}
|
|
5518
5509
|
|
|
5519
5510
|
// src/extra/reactive-index.ts
|
|
5520
|
-
function emptySnapshot2() {
|
|
5521
|
-
return { version: 0, value: { rows: [] } };
|
|
5522
|
-
}
|
|
5523
5511
|
function rowKey(row) {
|
|
5524
5512
|
return [row.secondary, row.primary];
|
|
5525
5513
|
}
|
|
@@ -5565,31 +5553,25 @@ function keepaliveDerived(n) {
|
|
|
5565
5553
|
function reactiveIndex(options = {}) {
|
|
5566
5554
|
const { name } = options;
|
|
5567
5555
|
const buf = [];
|
|
5568
|
-
|
|
5569
|
-
const ordered = state(current, {
|
|
5556
|
+
const ordered = state([], {
|
|
5570
5557
|
name,
|
|
5571
5558
|
describeKind: "state",
|
|
5572
|
-
equals:
|
|
5559
|
+
equals: (a, b) => a === b
|
|
5573
5560
|
});
|
|
5574
5561
|
const byPrimary = derived(
|
|
5575
5562
|
[ordered],
|
|
5576
5563
|
([s]) => {
|
|
5577
|
-
const rows = s
|
|
5564
|
+
const rows = s;
|
|
5578
5565
|
return byPrimaryMap(rows);
|
|
5579
5566
|
},
|
|
5580
5567
|
{ initial: /* @__PURE__ */ new Map(), describeKind: "derived" }
|
|
5581
5568
|
);
|
|
5582
5569
|
keepaliveDerived(byPrimary);
|
|
5583
5570
|
function pushSnapshot() {
|
|
5584
|
-
const
|
|
5585
|
-
current = bumpVersion(
|
|
5586
|
-
current,
|
|
5587
|
-
{ rows: [...buf] },
|
|
5588
|
-
ov ? { id: ov.id, version: ov.version } : void 0
|
|
5589
|
-
);
|
|
5571
|
+
const snapshot = [...buf];
|
|
5590
5572
|
batch(() => {
|
|
5591
5573
|
ordered.down([[DIRTY]]);
|
|
5592
|
-
ordered.down([[DATA,
|
|
5574
|
+
ordered.down([[DATA, snapshot]]);
|
|
5593
5575
|
});
|
|
5594
5576
|
}
|
|
5595
5577
|
return {
|
|
@@ -5620,28 +5602,19 @@ function reactiveIndex(options = {}) {
|
|
|
5620
5602
|
}
|
|
5621
5603
|
|
|
5622
5604
|
// src/extra/reactive-list.ts
|
|
5623
|
-
function emptySnapshot3() {
|
|
5624
|
-
return { version: 0, value: { items: [] } };
|
|
5625
|
-
}
|
|
5626
5605
|
function reactiveList(initial, options = {}) {
|
|
5627
5606
|
const { name } = options;
|
|
5628
5607
|
const buf = initial ? [...initial] : [];
|
|
5629
|
-
|
|
5630
|
-
const items = state(current, {
|
|
5608
|
+
const items = state(buf.length > 0 ? [...buf] : [], {
|
|
5631
5609
|
name,
|
|
5632
5610
|
describeKind: "state",
|
|
5633
|
-
equals:
|
|
5611
|
+
equals: (a, b) => a === b
|
|
5634
5612
|
});
|
|
5635
5613
|
function pushSnapshot() {
|
|
5636
|
-
const
|
|
5637
|
-
current = bumpVersion(
|
|
5638
|
-
current,
|
|
5639
|
-
{ items: [...buf] },
|
|
5640
|
-
iv ? { id: iv.id, version: iv.version } : void 0
|
|
5641
|
-
);
|
|
5614
|
+
const snapshot = [...buf];
|
|
5642
5615
|
batch(() => {
|
|
5643
5616
|
items.down([[DIRTY]]);
|
|
5644
|
-
items.down([[DATA,
|
|
5617
|
+
items.down([[DATA, snapshot]]);
|
|
5645
5618
|
});
|
|
5646
5619
|
}
|
|
5647
5620
|
return {
|
|
@@ -6294,4 +6267,4 @@ export {
|
|
|
6294
6267
|
workerSelf,
|
|
6295
6268
|
extra_exports
|
|
6296
6269
|
};
|
|
6297
|
-
//# sourceMappingURL=chunk-
|
|
6270
|
+
//# sourceMappingURL=chunk-RLVFZDCE.js.map
|