@graphrefly/graphrefly 0.4.0 → 0.5.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-VPS7L64N.js → chunk-ZERWUCGK.js} +824 -1
- package/dist/chunk-ZERWUCGK.js.map +1 -0
- package/dist/compat/nestjs/index.js +1 -1
- package/dist/extra/index.cjs +823 -0
- package/dist/extra/index.cjs.map +1 -1
- package/dist/extra/index.d.cts +1 -1
- package/dist/extra/index.d.ts +1 -1
- package/dist/extra/index.js +33 -1
- package/dist/{index-BHUvlQ3v.d.ts → index-C3LRU4jB.d.ts} +625 -4
- package/dist/{index-B6SsZs2h.d.cts → index-Cz8og7-L.d.cts} +625 -4
- package/dist/index.cjs +839 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +41 -9
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
- package/dist/chunk-VPS7L64N.js.map +0 -1
package/dist/extra/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/extra/index.ts","../../src/core/messages.ts","../../src/core/batch.ts","../../src/core/clock.ts","../../src/core/actor.ts","../../src/core/guard.ts","../../src/core/versioning.ts","../../src/core/node.ts","../../src/core/sugar.ts","../../src/extra/backoff.ts","../../src/extra/resilience.ts","../../src/extra/sources.ts","../../src/extra/cron.ts","../../src/extra/adapters.ts","../../src/extra/backpressure.ts","../../src/extra/checkpoint.ts","../../src/core/dynamic-node.ts","../../src/extra/operators.ts","../../src/extra/reactive-base.ts","../../src/extra/reactive-map.ts","../../src/extra/composite.ts","../../src/extra/observable.ts","../../src/extra/pubsub.ts","../../src/extra/reactive-index.ts","../../src/extra/reactive-list.ts","../../src/extra/reactive-log.ts","../../src/extra/worker/protocol.ts","../../src/extra/worker/transport.ts","../../src/extra/worker/bridge.ts","../../src/extra/worker/self.ts"],"sourcesContent":["/**\n * Extra layer: operators, sources, sinks (Phase 2+).\n */\n\nexport * from \"./adapters.js\";\nexport * from \"./backoff.js\";\nexport * from \"./backpressure.js\";\nexport * from \"./checkpoint.js\";\nexport * from \"./composite.js\";\nexport * from \"./cron.js\";\nexport * from \"./observable.js\";\nexport * from \"./operators.js\";\nexport * from \"./pubsub.js\";\nexport * from \"./reactive-index.js\";\nexport * from \"./reactive-list.js\";\nexport * from \"./reactive-log.js\";\nexport * from \"./reactive-map.js\";\nexport * from \"./resilience.js\";\nexport * from \"./sources.js\";\nexport * from \"./worker/index.js\";\n","/**\n * GraphReFly message protocol — §1 `~/src/graphrefly/GRAPHREFLY-SPEC.md`.\n * Emissions are always `[[Type, Data?], ...]` (no single-tuple shorthand).\n *\n * ## Canonical message ordering (within a composite batch)\n *\n * When multiple message types appear in a single `down()` call, the canonical\n * delivery order is determined by **signal tier**:\n *\n * | Tier | Signals | Role | Batch behavior |\n * |------|------------------------|-------------------|-------------------------------------|\n * | 0 | DIRTY, INVALIDATE | Notification | Immediate (never deferred) |\n * | 1 | PAUSE, RESUME | Flow control | Immediate (never deferred) |\n * | 2 | DATA, RESOLVED | Value settlement | Deferred inside `batch()` |\n * | 3 | COMPLETE, ERROR | Terminal lifecycle | Deferred to after phase-2 |\n * | 4 | TEARDOWN | Destruction | Immediate (usually sent alone) |\n *\n * **Rule:** Within `emitWithBatch`, messages are partitioned by tier and delivered\n * in tier order. This ensures phase-2 values (DATA/RESOLVED) reach sinks before\n * terminal signals (COMPLETE/ERROR) mark the node as done, preventing the\n * \"COMPLETE-before-DATA\" class of bugs. Sources that emit in canonical order\n * naturally partition correctly with zero overhead.\n *\n * Unknown message types (forward-compat) are tier 0 (immediate).\n *\n * ## Meta node bypass rules (centralized — GRAPHREFLY-SPEC §2.3)\n *\n * - **INVALIDATE** via `graph.signal()` — no-op on meta nodes (cached values preserved).\n * - **COMPLETE / ERROR** — not propagated from parent to meta (meta outlives terminal\n * state for post-mortem writes like setting `meta.error` after ERROR).\n * - **TEARDOWN** — propagated from parent to meta, releasing meta resources.\n */\n\n/** Value delivery (`DATA`, value). Tier 2 — deferred inside `batch()`. */\nexport const DATA = Symbol.for(\"graphrefly/DATA\");\n/** Phase 1: value about to change. Tier 0 — immediate. */\nexport const DIRTY = Symbol.for(\"graphrefly/DIRTY\");\n/** Phase 2: dirty pass completed, value unchanged. Tier 2 — deferred inside `batch()`. */\nexport const RESOLVED = Symbol.for(\"graphrefly/RESOLVED\");\n/** Clear cached state; do not auto-emit. Tier 0 — immediate. */\nexport const INVALIDATE = Symbol.for(\"graphrefly/INVALIDATE\");\n/** Suspend activity. Tier 1 — immediate. */\nexport const PAUSE = Symbol.for(\"graphrefly/PAUSE\");\n/** Resume after pause. Tier 1 — immediate. */\nexport const RESUME = Symbol.for(\"graphrefly/RESUME\");\n/** Permanent cleanup. Tier 4 — immediate (usually sent alone). */\nexport const TEARDOWN = Symbol.for(\"graphrefly/TEARDOWN\");\n/** Clean termination. Tier 3 — delivered after phase-2 in the same batch. */\nexport const COMPLETE = Symbol.for(\"graphrefly/COMPLETE\");\n/** Error termination. Tier 3 — delivered after phase-2 in the same batch. */\nexport const ERROR = Symbol.for(\"graphrefly/ERROR\");\n\n/** Known protocol type symbols (open set — other symbols are valid and forward). */\nexport const knownMessageTypes: readonly symbol[] = [\n\tDATA,\n\tDIRTY,\n\tRESOLVED,\n\tINVALIDATE,\n\tPAUSE,\n\tRESUME,\n\tTEARDOWN,\n\tCOMPLETE,\n\tERROR,\n];\n\n/** One protocol tuple: `[Type, optional payload]`. */\nexport type Message = readonly [symbol, unknown?];\n\n/**\n * A batch of tuples — the wire shape for `node.down()` / `node.up()`.\n */\nexport type Messages = readonly Message[];\n\n/**\n * Whether `t` is one of the built-in protocol symbols in this module.\n *\n * @param t — Message type symbol (unknown types are still valid; they must forward).\n * @returns `true` for `DATA`, `DIRTY`, `RESOLVED`, etc.\n *\n * @example\n * ```ts\n * import { DATA, DIRTY, isKnownMessageType } from \"@graphrefly/graphrefly-ts\";\n *\n * isKnownMessageType(DATA); // true\n * isKnownMessageType(Symbol(\"custom\")); // false\n * ```\n */\nexport function isKnownMessageType(t: symbol): boolean {\n\treturn knownMessageTypes.includes(t);\n}\n\n/**\n * Returns the signal tier for a message type (see module-level ordering table).\n *\n * - 0: notification (DIRTY, INVALIDATE) — immediate\n * - 1: flow control (PAUSE, RESUME) — immediate\n * - 2: value (DATA, RESOLVED) — deferred inside `batch()`\n * - 3: terminal (COMPLETE, ERROR) — delivered after phase-2\n * - 4: destruction (TEARDOWN) — immediate, usually alone\n * - 0 for unknown types (forward-compat: immediate)\n *\n * @param t — Message type symbol.\n * @returns Tier number (0–4).\n *\n * @example\n * ```ts\n * import { DATA, DIRTY, COMPLETE, TEARDOWN, messageTier } from \"@graphrefly/graphrefly-ts\";\n *\n * messageTier(DIRTY); // 0\n * messageTier(DATA); // 2\n * messageTier(COMPLETE); // 3\n * messageTier(TEARDOWN); // 4\n * ```\n */\nexport function messageTier(t: symbol): number {\n\tif (t === DIRTY || t === INVALIDATE) return 0;\n\tif (t === PAUSE || t === RESUME) return 1;\n\tif (t === DATA || t === RESOLVED) return 2;\n\tif (t === COMPLETE || t === ERROR) return 3;\n\tif (t === TEARDOWN) return 4;\n\treturn 0; // unknown → immediate\n}\n\n/**\n * Returns whether this tuple is deferred by `batch()` (phase 2: `DATA` or `RESOLVED`).\n *\n * @param msg — Single message tuple.\n * @returns `true` if `msg` is `DATA` or `RESOLVED`.\n *\n * @example\n * ```ts\n * import { DATA, RESOLVED, DIRTY, isPhase2Message } from \"@graphrefly/graphrefly-ts\";\n *\n * isPhase2Message([DATA, 42]); // true\n * isPhase2Message([RESOLVED]); // true\n * isPhase2Message([DIRTY]); // false\n * ```\n */\nexport function isPhase2Message(msg: Message): boolean {\n\tconst t = msg[0];\n\treturn t === DATA || t === RESOLVED;\n}\n\n/**\n * Returns whether this message type is terminal (COMPLETE or ERROR).\n * Terminal messages are delivered after phase-2 in the same batch to prevent\n * the node from becoming terminal before value messages reach sinks.\n *\n * @param t — Message type symbol.\n * @returns `true` for `COMPLETE` or `ERROR`.\n *\n * @example\n * ```ts\n * import { COMPLETE, ERROR, DATA, isTerminalMessage } from \"@graphrefly/graphrefly-ts\";\n *\n * isTerminalMessage(COMPLETE); // true\n * isTerminalMessage(ERROR); // true\n * isTerminalMessage(DATA); // false\n * ```\n */\nexport function isTerminalMessage(t: symbol): boolean {\n\treturn t === COMPLETE || t === ERROR;\n}\n\n/**\n * Whether `t` should be propagated from a parent node to its companion meta nodes.\n * Only TEARDOWN propagates; COMPLETE/ERROR/INVALIDATE do not (meta outlives parent\n * terminal state for post-mortem writes).\n *\n * @param t — Message type symbol.\n * @returns `true` if the signal should reach meta nodes.\n *\n * @example\n * ```ts\n * import { TEARDOWN, COMPLETE, ERROR, propagatesToMeta } from \"@graphrefly/graphrefly-ts\";\n *\n * propagatesToMeta(TEARDOWN); // true\n * propagatesToMeta(COMPLETE); // false\n * propagatesToMeta(ERROR); // false\n * ```\n */\nexport function propagatesToMeta(t: symbol): boolean {\n\treturn t === TEARDOWN;\n}\n","import {\n\tDATA,\n\tisPhase2Message,\n\tisTerminalMessage,\n\ttype Message,\n\ttype Messages,\n\tRESOLVED,\n} from \"./messages.js\";\n\n/**\n * §1.3.7 — Inside a batch, DIRTY propagates immediately; DATA and RESOLVED are\n * deferred until the outermost `batch()` callback returns. Terminal signals\n * (COMPLETE, ERROR) are delivered after phase-2 messages in the same batch\n * (see canonical ordering in `messages.ts`).\n */\n\nconst MAX_DRAIN_ITERATIONS = 1000;\n\nlet batchDepth = 0;\nlet flushInProgress = false;\nconst pendingPhase2: Array<() => void> = [];\nconst pendingPhase3: Array<() => void> = [];\n\n/**\n * Returns whether the current call stack is inside a batch scope **or** while\n * deferred phase-2 work is draining.\n *\n * Matching Python's `is_batching()` semantics: nested emissions during drain\n * are deferred until the current drain pass completes, preventing ordering\n * bugs when callbacks trigger further DATA/RESOLVED.\n *\n * @returns `true` while inside `batch()` or while the drain loop is running.\n *\n * @example\n * ```ts\n * import { batch, isBatching } from \"@graphrefly/graphrefly-ts\";\n *\n * batch(() => {\n * console.log(isBatching()); // true\n * });\n * ```\n *\n * @category core\n */\nexport function isBatching(): boolean {\n\treturn batchDepth > 0 || flushInProgress;\n}\n\n/**\n * Runs `fn` inside a batch scope. Nested `batch()` calls share one deferral queue.\n * If `fn` throws (including from a nested `batch`), deferred DATA/RESOLVED for\n * that **outer** `batch` frame are discarded — phase-2 is not flushed after an\n * error. While the drain loop is running (`flushInProgress`), a nested `batch`\n * that throws must **not** clear the global queue (cross-language decision A4).\n *\n * During the drain loop, `isBatching()` remains true so nested `emitWithBatch`\n * calls still defer phase-2 messages. The drain loop runs until the queue is\n * quiescent (no pending work remains). Per-emission try/catch ensures one\n * throwing callback does not orphan remaining emissions; the first error is\n * re-thrown after all emissions drain. Callbacks that ran before the throw may\n * have applied phase-2 — partial graph state is intentional (decision C1).\n *\n * @param fn — Synchronous work that may call `emitWithBatch` / `node.down()`.\n * @returns `void` — all side-effects happen through `emitWithBatch` and the\n * phase-2 drain that runs after `fn` returns.\n *\n * @example\n * ```ts\n * import { core } from \"@graphrefly/graphrefly-ts\";\n *\n * core.batch(() => {\n * core.emitWithBatch(sink, [[core.DATA, 1]]);\n * });\n * ```\n *\n * @category core\n */\nexport function batch(fn: () => void): void {\n\tbatchDepth += 1;\n\tlet threw = false;\n\ttry {\n\t\tfn();\n\t} catch (e) {\n\t\tthrew = true;\n\t\tthrow e;\n\t} finally {\n\t\tbatchDepth -= 1;\n\t\tif (batchDepth === 0) {\n\t\t\tif (threw) {\n\t\t\t\t// Do not wipe the outer drain's queue (decision A4).\n\t\t\t\tif (!flushInProgress) {\n\t\t\t\t\tpendingPhase2.length = 0;\n\t\t\t\t\tpendingPhase3.length = 0;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdrainPending();\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction drainPending(): void {\n\tconst ownsFlush = !flushInProgress;\n\tif (ownsFlush) {\n\t\tflushInProgress = true;\n\t}\n\tlet firstError: unknown;\n\tlet hasError = false;\n\ttry {\n\t\tlet iterations = 0;\n\t\t// Drain phase-2 first, then phase-3. If phase-3 callbacks enqueue new\n\t\t// phase-2 work, the outer loop catches it and drains phase-2 again\n\t\t// before re-entering phase-3.\n\t\twhile (pendingPhase2.length > 0 || pendingPhase3.length > 0) {\n\t\t\t// Phase-2 (DATA/RESOLVED) — parent node values settle here.\n\t\t\twhile (pendingPhase2.length > 0) {\n\t\t\t\titerations += 1;\n\t\t\t\tif (iterations > MAX_DRAIN_ITERATIONS) {\n\t\t\t\t\tpendingPhase2.length = 0;\n\t\t\t\t\tpendingPhase3.length = 0;\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`batch drain exceeded ${MAX_DRAIN_ITERATIONS} iterations — likely a reactive cycle`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst ops = pendingPhase2.splice(0);\n\t\t\t\tfor (const run of ops) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\trun();\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (!hasError) {\n\t\t\t\t\t\t\tfirstError = e;\n\t\t\t\t\t\t\thasError = true;\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// Phase-3 — meta companion emissions that must follow parent settlement.\n\t\t\tif (pendingPhase3.length > 0) {\n\t\t\t\titerations += 1;\n\t\t\t\tif (iterations > MAX_DRAIN_ITERATIONS) {\n\t\t\t\t\tpendingPhase2.length = 0;\n\t\t\t\t\tpendingPhase3.length = 0;\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`batch drain exceeded ${MAX_DRAIN_ITERATIONS} iterations — likely a reactive cycle`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst ops = pendingPhase3.splice(0);\n\t\t\t\tfor (const run of ops) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\trun();\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (!hasError) {\n\t\t\t\t\t\t\tfirstError = e;\n\t\t\t\t\t\t\thasError = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} finally {\n\t\tif (ownsFlush) {\n\t\t\tflushInProgress = false;\n\t\t}\n\t}\n\tif (hasError) {\n\t\tthrow firstError;\n\t}\n}\n\n/**\n * Splits a message array into three groups by signal tier (see `messages.ts`):\n *\n * - **immediate** — tier 0–1: DIRTY, INVALIDATE, PAUSE, RESUME, TEARDOWN, unknown\n * - **deferred** — tier 2: DATA, RESOLVED (phase-2, deferred inside `batch()`)\n * - **terminal** — tier 3: COMPLETE, ERROR (delivered after phase-2)\n *\n * Order within each group is preserved.\n *\n * @param messages — One `down()` payload.\n * @returns Three groups in canonical delivery order.\n *\n * @example\n * ```ts\n * import { DATA, DIRTY, COMPLETE, partitionForBatch } from \"@graphrefly/graphrefly-ts\";\n *\n * partitionForBatch([[DIRTY], [DATA, 1], [COMPLETE]]);\n * // { immediate: [[DIRTY]], deferred: [[DATA, 1]], terminal: [[COMPLETE]] }\n * ```\n *\n * @category core\n */\nexport function partitionForBatch(messages: Messages): {\n\timmediate: Messages;\n\tdeferred: Messages;\n\tterminal: Messages;\n} {\n\tconst immediate: Message[] = [];\n\tconst deferred: Message[] = [];\n\tconst terminal: Message[] = [];\n\tfor (const m of messages) {\n\t\tif (isPhase2Message(m)) {\n\t\t\tdeferred.push(m);\n\t\t} else if (isTerminalMessage(m[0])) {\n\t\t\tterminal.push(m);\n\t\t} else {\n\t\t\timmediate.push(m);\n\t\t}\n\t}\n\treturn { immediate, deferred, terminal };\n}\n\n/**\n * Delivers messages through `emit`, applying batch semantics and canonical\n * tier-based ordering (see `messages.ts`):\n *\n * 1. **Immediate** (tier 0–1, 4): DIRTY, INVALIDATE, PAUSE, RESUME, TEARDOWN,\n * unknown — emitted synchronously.\n * 2. **Phase-2** (tier 2): DATA, RESOLVED — deferred while `isBatching()`.\n * 3. **Terminal** (tier 3): COMPLETE, ERROR — always delivered after phase-2.\n * When batching, terminal is queued after deferred phase-2 in the pending list.\n * When not batching, terminal is emitted after phase-2 synchronously.\n *\n * This ordering prevents the \"COMPLETE-before-DATA\" class of bugs: terminal\n * signals never make a node terminal before phase-2 values reach sinks,\n * regardless of how the source assembled the message array.\n *\n * @param emit — Sink callback. May be called up to three times per invocation\n * (immediate, deferred, terminal) when not batching.\n * @param messages — Full `[[Type, Data?], ...]` array for one emission.\n * @returns `void` — delivery is performed through `emit` callbacks, synchronously\n * or deferred into the active batch queue.\n *\n * @example\n * ```ts\n * import { core } from \"@graphrefly/graphrefly-ts\";\n *\n * core.emitWithBatch((msgs) => console.log(msgs), [[core.DIRTY], [core.DATA, 42]]);\n * ```\n *\n * @category core\n */\nexport function emitWithBatch(\n\temit: (messages: Messages) => void,\n\tmessages: Messages,\n\tphase: 2 | 3 = 2,\n): void {\n\tif (messages.length === 0) {\n\t\treturn;\n\t}\n\tconst queue = phase === 3 ? pendingPhase3 : pendingPhase2;\n\n\t// Fast path: single-message batches (most common in graph-internal propagation)\n\t// skip partitionForBatch allocation entirely.\n\tif (messages.length === 1) {\n\t\tconst t = messages[0][0];\n\t\tif (t === DATA || t === RESOLVED) {\n\t\t\tif (isBatching()) {\n\t\t\t\tqueue.push(() => emit(messages));\n\t\t\t} else {\n\t\t\t\temit(messages);\n\t\t\t}\n\t\t} else if (isTerminalMessage(t)) {\n\t\t\t// Terminal single message: defer when batching so any preceding\n\t\t\t// phase-2 in the queue flushes first.\n\t\t\tif (isBatching()) {\n\t\t\t\tqueue.push(() => emit(messages));\n\t\t\t} else {\n\t\t\t\temit(messages);\n\t\t\t}\n\t\t} else {\n\t\t\t// Immediate: emit synchronously.\n\t\t\temit(messages);\n\t\t}\n\t\treturn;\n\t}\n\t// Multi-message: three-way partition by tier.\n\tconst { immediate, deferred, terminal } = partitionForBatch(messages);\n\n\t// 1. Immediate signals (tier 0–1, 4) — emit synchronously now.\n\tif (immediate.length > 0) {\n\t\temit(immediate);\n\t}\n\n\t// 2. Deferred (tier 2) + Terminal (tier 3) — canonical order preserved.\n\tif (isBatching()) {\n\t\tif (deferred.length > 0) {\n\t\t\tqueue.push(() => emit(deferred));\n\t\t}\n\t\tif (terminal.length > 0) {\n\t\t\tqueue.push(() => emit(terminal));\n\t\t}\n\t} else {\n\t\tif (deferred.length > 0) {\n\t\t\temit(deferred);\n\t\t}\n\t\tif (terminal.length > 0) {\n\t\t\temit(terminal);\n\t\t}\n\t}\n}\n","/**\n * Centralised timestamp utilities.\n *\n * Convention: all graphrefly-ts timestamps use nanoseconds (`_ns` suffix).\n *\n * - {@link monotonicNs} — monotonic clock (ordering, durations, timeline events).\n * - {@link wallClockNs} — wall-clock (mutation attribution, cron emission).\n *\n * **Precision limits (JS platform):**\n *\n * - `monotonicNs`: effective ~microsecond precision. `performance.now()` returns\n * milliseconds with ~5µs resolution; the last 3 digits of the nanosecond value\n * are always zero. Python's `time.monotonic_ns()` gives true nanoseconds.\n *\n * - `wallClockNs`: ~256ns precision loss at current epoch. `Date.now() * 1e6`\n * produces values around 1.8×10¹⁸ which exceed IEEE 754's 2⁵³ safe integer\n * limit. Python's `time.time_ns()` (arbitrary-precision `int`) has no loss.\n * In practice this is irrelevant — JS is single-threaded, so sub-microsecond\n * timestamp collisions cannot occur.\n */\n\n/** Monotonic nanosecond timestamp via `performance.now()`. */\nexport function monotonicNs(): number {\n\treturn Math.trunc(performance.now() * 1_000_000);\n}\n\n/** Wall-clock nanosecond timestamp via `Date.now()`. */\nexport function wallClockNs(): number {\n\treturn Date.now() * 1_000_000;\n}\n","/**\n * Who is performing an operation (attribution + ABAC input).\n *\n * @see GRAPHREFLY-SPEC — roadmap Phase 1.5 (Actor & Guard).\n */\nexport type Actor = {\n\ttype: \"human\" | \"llm\" | \"wallet\" | \"system\" | string;\n\tid: string;\n} & Record<string, unknown>;\n\n/** Default actor when none is passed ({@link normalizeActor}). */\nexport const DEFAULT_ACTOR: Actor = { type: \"system\", id: \"\" };\n\n/**\n * Fills missing `type` / `id` on an actor and returns {@link DEFAULT_ACTOR} when input is undefined.\n *\n * @param actor - Optional partial actor from a transport hint.\n * @returns A normalized `Actor` safe to pass to guards and graph APIs.\n *\n * @example\n * ```ts\n * import { normalizeActor } from \"@graphrefly/graphrefly-ts\";\n *\n * normalizeActor({ type: \"human\", id: \"u1\" });\n * ```\n */\nexport function normalizeActor(actor?: Actor): Actor {\n\tif (actor == null) return DEFAULT_ACTOR;\n\tconst { type, id, ...rest } = actor;\n\treturn {\n\t\ttype: type ?? \"system\",\n\t\tid: id ?? \"\",\n\t\t...rest,\n\t} as Actor;\n}\n","import type { Actor } from \"./actor.js\";\n\n/**\n * Actions checked by {@link NodeGuard}. `write` covers both {@link Node.down} and\n * {@link Node.up} today; finer-grained strings may be added later (e.g. `\"write.data\"`).\n */\nexport type GuardAction = \"write\" | \"signal\" | \"observe\" | (string & {});\n\nexport type NodeGuard = (actor: Actor, action: GuardAction) => boolean;\n\nexport type GuardDeniedDetails = {\n\tactor: Actor;\n\taction: GuardAction;\n\t/** Registry or options name when known */\n\tnodeName?: string;\n};\n\n/**\n * Thrown when a {@link NodeGuard} denies an action for a given actor.\n *\n * Carries the rejected `actor`, `action`, and optional `nodeName` for diagnostic\n * messages and middleware error handling.\n *\n * @example\n * ```ts\n * import { GuardDenied, policy } from \"@graphrefly/graphrefly-ts\";\n *\n * const guard = policy((allow) => { allow(\"observe\"); });\n * try {\n * if (!guard({ type: \"llm\", id: \"agent-1\" }, \"write\")) {\n * throw new GuardDenied(\n * { actor: { type: \"llm\", id: \"agent-1\" }, action: \"write\", nodeName: \"userInput\" },\n * );\n * }\n * } catch (e) {\n * if (e instanceof GuardDenied) console.error(e.action, e.actor.type); // \"write\" \"llm\"\n * }\n * ```\n */\nexport class GuardDenied extends Error {\n\treadonly actor: Actor;\n\treadonly action: GuardAction;\n\treadonly nodeName?: string;\n\n\t/**\n\t * @param details - Actor, action, and optional node name for the denial.\n\t * @param message - Optional override for the default error message.\n\t */\n\tconstructor(details: GuardDeniedDetails, message?: string) {\n\t\tsuper(\n\t\t\tmessage ??\n\t\t\t\t`GuardDenied: action \"${String(details.action)}\" denied for actor type \"${String(details.actor.type)}\"`,\n\t\t);\n\t\tthis.name = \"GuardDenied\";\n\t\tthis.actor = details.actor;\n\t\tthis.action = details.action;\n\t\tthis.nodeName = details.nodeName;\n\t}\n\n\t/** Qualified registry path when known (roadmap diagnostics: same as {@link nodeName}). */\n\tget node(): string | undefined {\n\t\treturn this.nodeName;\n\t}\n}\n\ntype Where = (actor: Actor) => boolean;\n\ntype Rule = {\n\tkind: \"allow\" | \"deny\";\n\tactions: Set<GuardAction>;\n\twhere: Where;\n};\n\nfunction normalizeActions(action: GuardAction | readonly GuardAction[]): GuardAction[] {\n\tif (Array.isArray(action)) {\n\t\treturn [...action];\n\t}\n\treturn [action as GuardAction];\n}\n\nfunction matchesActions(set: Set<GuardAction>, action: GuardAction): boolean {\n\treturn set.has(action) || set.has(\"*\" as GuardAction);\n}\n\nexport type PolicyAllow = (\n\taction: GuardAction | readonly GuardAction[],\n\topts?: { where?: Where },\n) => void;\n\nexport type PolicyDeny = (\n\taction: GuardAction | readonly GuardAction[],\n\topts?: { where?: Where },\n) => void;\n\nexport type PolicyRuleData = {\n\teffect: \"allow\" | \"deny\";\n\taction: GuardAction | readonly GuardAction[];\n\tactorType?: string | readonly string[];\n\tactorId?: string | readonly string[];\n\tclaims?: Record<string, unknown>;\n};\n\n/**\n * Declarative guard builder. Precedence: any matching **deny** blocks even if an allow also matches.\n * If no rule matches, the guard returns `false` (deny-by-default). Aligned with graphrefly-py `policy()`.\n *\n * @param build - Callback that registers `allow(...)` / `deny(...)` rules in order.\n * @returns A `NodeGuard` for use as `node({ guard })`.\n *\n * @example\n * ```ts\n * const guard = policy((allow, deny) => {\n * allow(\"observe\");\n * deny(\"write\", { where: (a) => a.type === \"llm\" });\n * });\n * ```\n */\nexport function policy(build: (allow: PolicyAllow, deny: PolicyDeny) => void): NodeGuard {\n\tconst rules: Rule[] = [];\n\tconst allow: PolicyAllow = (action, opts) => {\n\t\trules.push({\n\t\t\tkind: \"allow\",\n\t\t\tactions: new Set(normalizeActions(action)),\n\t\t\twhere: opts?.where ?? (() => true),\n\t\t});\n\t};\n\tconst deny: PolicyDeny = (action, opts) => {\n\t\trules.push({\n\t\t\tkind: \"deny\",\n\t\t\tactions: new Set(normalizeActions(action)),\n\t\t\twhere: opts?.where ?? (() => true),\n\t\t});\n\t};\n\tbuild(allow, deny);\n\treturn (actor, action) => {\n\t\tlet denied = false;\n\t\tlet allowed = false;\n\t\tfor (const r of rules) {\n\t\t\tif (!matchesActions(r.actions, action)) continue;\n\t\t\tif (!r.where(actor)) continue;\n\t\t\tif (r.kind === \"deny\") {\n\t\t\t\tdenied = true;\n\t\t\t} else {\n\t\t\t\tallowed = true;\n\t\t\t}\n\t\t}\n\t\tif (denied) return false;\n\t\treturn allowed;\n\t};\n}\n\n/**\n * Rebuild a declarative guard from persisted policy data (snapshot-safe).\n *\n * Rules are deny-overrides, same semantics as {@link policy}.\n */\nexport function policyFromRules(rules: readonly PolicyRuleData[]): NodeGuard {\n\treturn policy((allow, deny) => {\n\t\tfor (const rule of rules) {\n\t\t\tconst actorTypes =\n\t\t\t\trule.actorType == null\n\t\t\t\t\t? null\n\t\t\t\t\t: new Set(Array.isArray(rule.actorType) ? rule.actorType : [rule.actorType]);\n\t\t\tconst actorIds =\n\t\t\t\trule.actorId == null\n\t\t\t\t\t? null\n\t\t\t\t\t: new Set(Array.isArray(rule.actorId) ? rule.actorId : [rule.actorId]);\n\t\t\tconst claimEntries = Object.entries(rule.claims ?? {});\n\t\t\tconst where: Where = (actor) => {\n\t\t\t\tif (actorTypes !== null && !actorTypes.has(String(actor.type))) return false;\n\t\t\t\tif (actorIds !== null && !actorIds.has(String(actor.id ?? \"\"))) return false;\n\t\t\t\tfor (const [key, value] of claimEntries) {\n\t\t\t\t\tif ((actor as Record<string, unknown>)[key] !== value) return false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t};\n\t\t\tif (rule.effect === \"deny\") {\n\t\t\t\tdeny(rule.action, { where });\n\t\t\t} else {\n\t\t\t\tallow(rule.action, { where });\n\t\t\t}\n\t\t}\n\t});\n}\n\nconst STANDARD_WRITE_TYPES = [\"human\", \"llm\", \"wallet\", \"system\"] as const;\n\n/**\n * Derives a best-effort `meta.access` hint string by probing `guard` with the\n * standard actor types `human`, `llm`, `wallet`, `system` for the `\"write\"` action\n * (roadmap 1.5). Aligned with graphrefly-py `access_hint_for_guard`.\n *\n * @param guard - Guard function to probe (typically from {@link policy}).\n * @returns `\"restricted\"` when no standard type is allowed; `\"both\"` when both\n * `human` and `llm` are allowed (plus optionally `system`); the single allowed\n * type name when only one passes; or a `\"+\"` joined list otherwise.\n *\n * @example\n * ```ts\n * import { policy, accessHintForGuard } from \"@graphrefly/graphrefly-ts\";\n *\n * const guardBoth = policy((allow) => { allow(\"write\"); });\n * accessHintForGuard(guardBoth); // \"both\"\n *\n * const guardHuman = policy((allow) => {\n * allow(\"write\", { where: (a) => a.type === \"human\" });\n * });\n * accessHintForGuard(guardHuman); // \"human\"\n * ```\n */\nexport function accessHintForGuard(guard: NodeGuard): string {\n\tconst allowed = STANDARD_WRITE_TYPES.filter((t) => guard({ type: t, id: \"\" }, \"write\"));\n\tif (allowed.length === 0) return \"restricted\";\n\tif (\n\t\tallowed.includes(\"human\") &&\n\t\tallowed.includes(\"llm\") &&\n\t\tallowed.every((t) => t === \"human\" || t === \"llm\" || t === \"system\")\n\t) {\n\t\treturn \"both\";\n\t}\n\tif (allowed.length === 1) return allowed[0];\n\treturn allowed.join(\"+\");\n}\n","/**\n * Node versioning — GRAPHREFLY-SPEC §7.\n *\n * Progressive, optional versioning for node identity and change tracking.\n *\n * - **V0**: `id` + `version` — identity & change detection (~16 bytes overhead)\n * - **V1**: + `cid` + `prev` — content addressing & linked history (~60 bytes overhead)\n *\n * **Lifecycle notes:**\n * - Version advances only on DATA (not RESOLVED, INVALIDATE, or TEARDOWN).\n * - `resetOnTeardown` clears the cached value but does NOT reset versioning state.\n * After teardown, `v.cid` still reflects the last DATA value, not the cleared cache.\n * The invariant `hash(node.get()) === v.cid` only holds in `settled`/`resolved` status.\n * - Resubscribable nodes preserve versioning across subscription lifetimes (monotonic counter).\n */\n\nimport { createHash, randomUUID } from \"node:crypto\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** V0: identity + monotonic version counter. */\nexport type V0 = {\n\treadonly id: string;\n\tversion: number;\n};\n\n/** V1: V0 + content-addressed identifier + previous cid link. */\nexport type V1 = V0 & {\n\tcid: string;\n\tprev: string | null;\n};\n\n/** Union of all versioning info shapes. */\nexport type NodeVersionInfo = V0 | V1;\n\n/** Supported versioning levels (extensible to 2, 3 later). */\nexport type VersioningLevel = 0 | 1;\n\n/** Function that hashes a value to a hex string (for V1 cid). */\nexport type HashFn = (value: unknown) => string;\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface VersioningOptions {\n\t/** Override auto-generated id. */\n\tid?: string;\n\t/** Custom hash function for V1 cid (default: SHA-256 truncated to 16 hex chars). */\n\thash?: HashFn;\n}\n\n// ---------------------------------------------------------------------------\n// Default hash\n// ---------------------------------------------------------------------------\n\n/**\n * Canonicalize a value for deterministic cross-language hashing.\n *\n * - Integer-valued floats normalize to integer strings (`1.0` → `1`).\n * - `NaN`, `Infinity`, `-Infinity` are rejected (no JSON equivalent).\n * - `undefined` normalizes to `null`.\n * - Object keys are sorted lexicographically.\n *\n * This ensures TS `JSON.stringify` and Python `json.dumps(sort_keys=True)`\n * produce identical output for the same logical value.\n */\nexport function canonicalizeForHash(value: unknown): unknown {\n\tif (value === undefined) return null;\n\tif (typeof value === \"number\") {\n\t\tif (!Number.isFinite(value)) {\n\t\t\tthrow new TypeError(`Cannot hash non-finite number: ${value}`);\n\t\t}\n\t\tif (Number.isInteger(value) && !Number.isSafeInteger(value)) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Cannot hash integer outside safe range (|n| > 2^53-1): ${value}. ` +\n\t\t\t\t\t\"Cross-language cid parity is not guaranteed for unsafe integers.\",\n\t\t\t);\n\t\t}\n\t\treturn value;\n\t}\n\tif (typeof value === \"string\" || typeof value === \"boolean\" || value === null) {\n\t\treturn value;\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn value.map(canonicalizeForHash);\n\t}\n\tif (typeof value === \"object\" && value !== null) {\n\t\tconst sorted: Record<string, unknown> = {};\n\t\tfor (const k of Object.keys(value as Record<string, unknown>).sort()) {\n\t\t\tsorted[k] = canonicalizeForHash((value as Record<string, unknown>)[k]);\n\t\t}\n\t\treturn sorted;\n\t}\n\t// Fallback: coerce to null (bigint, symbol, function)\n\treturn null;\n}\n\n/**\n * Default content hash: SHA-256 of deterministic JSON, truncated to 16 hex chars (~64-bit).\n * Uses {@link canonicalizeForHash} for cross-language parity with Python `default_hash`.\n */\nexport function defaultHash(value: unknown): string {\n\tconst canonical = canonicalizeForHash(value ?? null);\n\tconst json = JSON.stringify(canonical);\n\treturn createHash(\"sha256\").update(json).digest(\"hex\").slice(0, 16);\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create initial versioning state for a node.\n *\n * @param level - 0 for V0, 1 for V1.\n * @param initialValue - The node's initial cached value (used for V1 cid).\n * @param opts - Optional overrides (id, hash).\n */\nexport function createVersioning(\n\tlevel: VersioningLevel,\n\tinitialValue: unknown,\n\topts?: VersioningOptions,\n): NodeVersionInfo {\n\tconst id = opts?.id ?? randomUUID();\n\tif (level === 0) {\n\t\treturn { id, version: 0 } satisfies V0;\n\t}\n\tconst hash = opts?.hash ?? defaultHash;\n\tconst cid = hash(initialValue);\n\treturn { id, version: 0, cid, prev: null } satisfies V1;\n}\n\n// ---------------------------------------------------------------------------\n// Advance\n// ---------------------------------------------------------------------------\n\n/**\n * Advance versioning state after a DATA emission (value changed).\n *\n * Mutates `info` in place for performance (called on every DATA).\n * Only call when the cached value has actually changed (not on RESOLVED).\n *\n * @param info - The node's current versioning state.\n * @param newValue - The new cached value.\n * @param hashFn - Hash function (only used for V1).\n */\nexport function advanceVersion(info: NodeVersionInfo, newValue: unknown, hashFn: HashFn): void {\n\tinfo.version += 1;\n\tif (\"cid\" in info) {\n\t\t(info as V1).prev = (info as V1).cid;\n\t\t(info as V1).cid = hashFn(newValue);\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Guards\n// ---------------------------------------------------------------------------\n\n/** Type guard: is this V1 versioning info? */\nexport function isV1(info: NodeVersionInfo): info is V1 {\n\treturn \"cid\" in info;\n}\n","import type { Actor } from \"./actor.js\";\nimport { normalizeActor } from \"./actor.js\";\nimport { emitWithBatch } from \"./batch.js\";\nimport { wallClockNs } from \"./clock.js\";\nimport type { GuardAction, NodeGuard } from \"./guard.js\";\nimport { GuardDenied } from \"./guard.js\";\nimport {\n\tCOMPLETE,\n\tDATA,\n\tDIRTY,\n\tERROR,\n\tINVALIDATE,\n\ttype Message,\n\ttype Messages,\n\tPAUSE,\n\tpropagatesToMeta,\n\tRESOLVED,\n\tRESUME,\n\tTEARDOWN,\n} from \"./messages.js\";\nimport type { HashFn, NodeVersionInfo, VersioningLevel } from \"./versioning.js\";\nimport { advanceVersion, createVersioning, defaultHash } from \"./versioning.js\";\n\n/** Lifecycle status of a node. */\nexport type NodeStatus =\n\t| \"disconnected\"\n\t| \"dirty\"\n\t| \"settled\"\n\t| \"resolved\"\n\t| \"completed\"\n\t| \"errored\";\n\n/** Callback that receives downstream message batches. */\nexport type NodeSink = (messages: Messages) => void;\n\n/**\n * Compute function passed to `node()`.\n *\n * @returns A value to emit, `undefined` to skip emission, or a cleanup\n * function invoked before the next run or on teardown.\n */\nexport type NodeFn<T = unknown> = (\n\tdeps: readonly unknown[],\n\tactions: NodeActions,\n) => T | undefined | (() => void);\n\n/** Imperative actions available inside a {@link NodeFn}. */\nexport interface NodeActions {\n\t/** Emit raw messages downstream. */\n\tdown(messages: Messages): void;\n\t/** Emit a single value (auto-wraps in DIRTY/DATA or DIRTY/RESOLVED). */\n\temit(value: unknown): void;\n\t/** Send messages upstream toward sources. */\n\tup(messages: Messages): void;\n}\n\n/**\n * Callback for intercepting messages before the default dispatch.\n *\n * Called for every message from every dep. Return `true` to consume the\n * message (skip default handling), or `false` to let default dispatch run.\n *\n * @param msg — The message tuple `[Type, Data?]`.\n * @param depIndex — Which dep sent it (index into the deps array).\n * @param actions — `{ down(), emit(), up() }` — same as `NodeFn` receives.\n */\nexport type OnMessageHandler = (msg: Message, depIndex: number, actions: NodeActions) => boolean;\n\n/**\n * Internal inspector hook (opt-in): emits dependency message and run events\n * for graph-level observability features (`observe(..., { causal|derived })`).\n */\nexport type NodeInspectorHookEvent =\n\t| { kind: \"dep_message\"; depIndex: number; message: Message }\n\t| { kind: \"run\"; depValues: readonly unknown[] };\n\nexport type NodeInspectorHook = (event: NodeInspectorHookEvent) => void;\n\n/** Explicit describe `type` for {@link Graph.describe} / {@link describeNode} (GRAPHREFLY-SPEC Appendix B). */\nexport type NodeDescribeKind = \"state\" | \"derived\" | \"producer\" | \"operator\" | \"effect\";\n\n/** Options for {@link node}. */\nexport interface NodeOptions {\n\tname?: string;\n\t/**\n\t * Overrides inferred `type` in describe output. Sugar constructors set this;\n\t * omit to infer from deps / fn / manual emit usage.\n\t */\n\tdescribeKind?: NodeDescribeKind;\n\t/** Equality check for RESOLVED detection. Defaults to `Object.is`. */\n\tequals?: (a: unknown, b: unknown) => boolean;\n\tinitial?: unknown;\n\t/**\n\t * Each key becomes an independently subscribable companion node.\n\t * Meta nodes outlive the parent's subscription lifecycle: when all sinks\n\t * unsubscribe the parent disconnects upstream but meta nodes stay alive.\n\t * Send `[[TEARDOWN]]` to the parent to release meta node resources.\n\t */\n\tmeta?: Record<string, unknown>;\n\t/** Allow fresh subscriptions after COMPLETE/ERROR. */\n\tresubscribable?: boolean;\n\t/**\n\t * Invoked when a new {@link Node.subscribe} clears a terminal state on a\n\t * resubscribable node — reset operator-local counters/accumulators here.\n\t */\n\tonResubscribe?: () => void;\n\t/** Clear cached value on TEARDOWN. */\n\tresetOnTeardown?: boolean;\n\t/**\n\t * When `true` (default), auto-emit `[[COMPLETE]]` when all deps complete\n\t * (spec §1.3.5). Set `false` for derived/operator nodes that should not\n\t * auto-complete.\n\t */\n\tcompleteWhenDepsComplete?: boolean;\n\t/**\n\t * Intercept messages before the default dispatch (spec §2.6).\n\t *\n\t * Return `true` to consume the message (skip default handling),\n\t * or `false` to let the default dispatch run.\n\t */\n\tonMessage?: OnMessageHandler;\n\t/**\n\t * ABAC: `(actor, action) => boolean`. `write` applies to both {@link Node.down} and {@link Node.up}.\n\t * Companion {@link NodeOptions.meta | meta} nodes inherit this guard from the primary.\n\t */\n\tguard?: NodeGuard;\n\t/**\n\t * Opt-in versioning level (GRAPHREFLY-SPEC §7).\n\t * - `0` (V0): `id` + `version` — identity & change detection.\n\t * - `1` (V1): + `cid` + `prev` — content addressing & linked history.\n\t */\n\tversioning?: VersioningLevel;\n\t/** Override auto-generated versioning id. */\n\tversioningId?: string;\n\t/** Custom hash function for V1 cid computation. */\n\tversioningHash?: HashFn;\n}\n\n/**\n * Options for {@link Node.down} / {@link Node.up} (actor context, graph delivery mode, internal bypass).\n */\nexport type NodeTransportOptions = {\n\tactor?: Actor;\n\t/**\n\t * When `true`, skips guard checks (reactive internals, graph lifecycle TEARDOWN, etc.).\n\t * Not for untrusted call sites.\n\t */\n\tinternal?: boolean;\n\t/**\n\t * `signal` for {@link Graph.signal} deliveries; default `write` for {@link Graph.set} and direct `down`.\n\t */\n\tdelivery?: \"write\" | \"signal\";\n};\n\n/**\n * Optional hints passed to {@link Node.subscribe} to enable per-sink\n * optimizations.\n */\nexport interface SubscribeHints {\n\t/**\n\t * Subscriber has exactly one dep with `fn` — the source may skip DIRTY\n\t * dispatch when this is the sole subscriber. The subscriber synthesizes\n\t * dirty state locally via `onDepSettled`.\n\t */\n\tsingleDep?: boolean;\n\t/**\n\t * Actor to check against the node's `observe` guard.\n\t * When set, `subscribe()` throws {@link GuardDenied} if the actor is not\n\t * permitted to observe this node. Aligned with graphrefly-py `subscribe(actor=)`.\n\t */\n\tactor?: Actor;\n}\n\n/** A reactive node in the GraphReFly protocol. */\nexport interface Node<T = unknown> {\n\treadonly name?: string;\n\treadonly status: NodeStatus;\n\treadonly meta: Record<string, Node>;\n\t/** Returns the current cached value. */\n\tget(): T | undefined;\n\t/** Push messages downstream. */\n\tdown(messages: Messages, options?: NodeTransportOptions): void;\n\t/**\n\t * Registers a sink to receive downstream messages.\n\t *\n\t * @param sink - Callback receiving message batches.\n\t * @param hints - Optional optimization hints (e.g. `{ singleDep: true }`).\n\t * @returns An unsubscribe function (idempotent).\n\t */\n\tsubscribe(sink: NodeSink, hints?: SubscribeHints): () => void;\n\t/** Send messages upstream (present on nodes with deps). */\n\tup?: (messages: Messages, options?: NodeTransportOptions) => void;\n\t/** Disconnect from upstream deps (present on nodes with deps). */\n\tunsubscribe?: () => void;\n\t/** Last successful guarded `down` / `up` (not set for `internal` deliveries). */\n\treadonly lastMutation?: Readonly<{ actor: Actor; timestamp_ns: number }>;\n\t/** Whether {@link NodeTransportOptions.actor | actor} may {@link Graph.observe | observe} this node. */\n\tallowsObserve(actor: Actor): boolean;\n\t/** Whether a {@link NodeOptions.guard | guard} is installed. */\n\thasGuard(): boolean;\n\t/** Versioning info (GRAPHREFLY-SPEC §7). `undefined` when versioning is not enabled. */\n\treadonly v: Readonly<NodeVersionInfo> | undefined;\n}\n\n// --- Bitmask helpers: integer for <=31 deps, Uint32Array for >31 ---\n\ninterface BitSet {\n\tset(index: number): void;\n\tclear(index: number): void;\n\thas(index: number): boolean;\n\t/**\n\t * True when all bits in `other` are also set in `this`.\n\t * IMPORTANT: `other` must be the same concrete type (both IntBitSet or both\n\t * ArrayBitSet). Cross-type calls will crash. Within `node()`, all masks for\n\t * a given node share the same `createBitSet(deps.length)` factory, so this\n\t * is always satisfied.\n\t */\n\tcovers(other: BitSet): boolean;\n\t/** True when at least one bit is set. */\n\tany(): boolean;\n\treset(): void;\n}\n\nfunction createIntBitSet(): BitSet {\n\tlet bits = 0;\n\treturn {\n\t\tset(i: number) {\n\t\t\tbits |= 1 << i;\n\t\t},\n\t\tclear(i: number) {\n\t\t\tbits &= ~(1 << i);\n\t\t},\n\t\thas(i: number) {\n\t\t\treturn (bits & (1 << i)) !== 0;\n\t\t},\n\t\tcovers(other: BitSet) {\n\t\t\treturn (\n\t\t\t\t(bits & (other as unknown as { _bits(): number })._bits()) ===\n\t\t\t\t(other as unknown as { _bits(): number })._bits()\n\t\t\t);\n\t\t},\n\t\tany() {\n\t\t\treturn bits !== 0;\n\t\t},\n\t\treset() {\n\t\t\tbits = 0;\n\t\t},\n\t\t_bits() {\n\t\t\treturn bits;\n\t\t},\n\t} as BitSet & { _bits(): number };\n}\n\nfunction createArrayBitSet(size: number): BitSet {\n\tconst words = new Uint32Array(Math.ceil(size / 32));\n\treturn {\n\t\tset(i: number) {\n\t\t\twords[i >>> 5] |= 1 << (i & 31);\n\t\t},\n\t\tclear(i: number) {\n\t\t\twords[i >>> 5] &= ~(1 << (i & 31));\n\t\t},\n\t\thas(i: number) {\n\t\t\treturn (words[i >>> 5] & (1 << (i & 31))) !== 0;\n\t\t},\n\t\tcovers(other: BitSet) {\n\t\t\tconst ow = (other as unknown as { _words: Uint32Array })._words;\n\t\t\tfor (let w = 0; w < words.length; w++) {\n\t\t\t\tif ((words[w] & ow[w]) >>> 0 !== ow[w]) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\tany() {\n\t\t\tfor (let w = 0; w < words.length; w++) {\n\t\t\t\tif (words[w] !== 0) return true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\treset() {\n\t\t\twords.fill(0);\n\t\t},\n\t\t_words: words,\n\t} as unknown as BitSet;\n}\n\nfunction createBitSet(size: number): BitSet {\n\treturn size <= 31 ? createIntBitSet() : createArrayBitSet(size);\n}\n\nconst isNodeArray = (value: unknown): value is readonly Node[] => Array.isArray(value);\n\nconst isNodeOptions = (value: unknown): value is NodeOptions =>\n\ttypeof value === \"object\" && value != null && !Array.isArray(value);\n\nconst isCleanupFn = (value: unknown): value is () => void => typeof value === \"function\";\n\nconst statusAfterMessage = (status: NodeStatus, msg: Message): NodeStatus => {\n\tconst t = msg[0];\n\tif (t === DIRTY) return \"dirty\";\n\tif (t === DATA) return \"settled\";\n\tif (t === RESOLVED) return \"resolved\";\n\tif (t === COMPLETE) return \"completed\";\n\tif (t === ERROR) return \"errored\";\n\tif (t === INVALIDATE) return \"dirty\";\n\tif (t === TEARDOWN) return \"disconnected\";\n\treturn status;\n};\n\n// --- NodeImpl: class-based for V8 hidden class optimization and prototype method sharing ---\n\n/**\n * Class-based implementation of the {@link Node} interface.\n *\n * All internal state lives on instance fields (`_` prefix, private by convention)\n * so that introspection (e.g. {@link describeNode}) can read them directly via\n * `instanceof NodeImpl` — no side-channel registry needed.\n *\n * Follows callbag-recharge's `ProducerImpl` pattern: V8 hidden class stability,\n * prototype method sharing, selective binding for commonly detached methods.\n */\nexport class NodeImpl<T = unknown> implements Node<T> {\n\t// --- Configuration (set once, never reassigned) ---\n\tprivate readonly _optsName: string | undefined;\n\tprivate _registryName: string | undefined;\n\t/** @internal — read by {@link describeNode} before inference. */\n\treadonly _describeKind: NodeDescribeKind | undefined;\n\treadonly meta: Record<string, Node>;\n\t_deps: readonly Node[];\n\t_fn: NodeFn<T> | undefined;\n\t_opts: NodeOptions;\n\t_equals: (a: unknown, b: unknown) => boolean;\n\t_onMessage: OnMessageHandler | undefined;\n\t/** @internal — read by {@link describeNode} for `accessHintForGuard`. */\n\treadonly _guard: NodeGuard | undefined;\n\tprivate _lastMutation: { actor: Actor; timestamp_ns: number } | undefined;\n\t_hasDeps: boolean;\n\t_autoComplete: boolean;\n\t_isSingleDep: boolean;\n\n\t// --- Mutable state ---\n\t_cached: T | undefined;\n\t_status: NodeStatus;\n\t_terminal = false;\n\t_connected = false;\n\t_producerStarted = false;\n\t_connecting = false;\n\t_manualEmitUsed = false;\n\t_sinkCount = 0;\n\t_singleDepSinkCount = 0;\n\n\t// --- Object/collection state ---\n\t_depDirtyMask: BitSet;\n\t_depSettledMask: BitSet;\n\t_depCompleteMask: BitSet;\n\t_allDepsCompleteMask: BitSet;\n\t_lastDepValues: readonly unknown[] | undefined;\n\t_cleanup: (() => void) | undefined;\n\t_sinks: NodeSink | Set<NodeSink> | null = null;\n\t_singleDepSinks = new WeakSet<NodeSink>();\n\t_upstreamUnsubs: Array<() => void> = [];\n\t_actions: NodeActions;\n\t_boundEmitToSinks: (messages: Messages) => void;\n\tprivate _inspectorHook: NodeInspectorHook | undefined;\n\tprivate _versioning: NodeVersionInfo | undefined;\n\tprivate _hashFn: HashFn;\n\n\tconstructor(deps: readonly Node[], fn: NodeFn<T> | undefined, opts: NodeOptions) {\n\t\tthis._deps = deps;\n\t\tthis._fn = fn;\n\t\tthis._opts = opts;\n\t\tthis._optsName = opts.name;\n\t\tthis._describeKind = opts.describeKind;\n\t\tthis._equals = opts.equals ?? Object.is;\n\t\tthis._onMessage = opts.onMessage;\n\t\tthis._guard = opts.guard;\n\t\tthis._hasDeps = deps.length > 0;\n\t\tthis._autoComplete = opts.completeWhenDepsComplete ?? true;\n\t\tthis._isSingleDep = deps.length === 1 && fn != null;\n\n\t\tthis._cached = opts.initial as T | undefined;\n\t\tthis._status = this._hasDeps ? \"disconnected\" : \"settled\";\n\n\t\t// Versioning (GRAPHREFLY-SPEC §7)\n\t\tthis._hashFn = opts.versioningHash ?? defaultHash;\n\t\tthis._versioning =\n\t\t\topts.versioning != null\n\t\t\t\t? createVersioning(opts.versioning, this._cached, {\n\t\t\t\t\t\tid: opts.versioningId,\n\t\t\t\t\t\thash: this._hashFn,\n\t\t\t\t\t})\n\t\t\t\t: undefined;\n\n\t\tthis._depDirtyMask = createBitSet(deps.length);\n\t\tthis._depSettledMask = createBitSet(deps.length);\n\t\tthis._depCompleteMask = createBitSet(deps.length);\n\t\tthis._allDepsCompleteMask = createBitSet(deps.length);\n\t\tfor (let i = 0; i < deps.length; i++) this._allDepsCompleteMask.set(i);\n\n\t\t// Build companion meta nodes\n\t\tconst meta: Record<string, Node> = {};\n\t\tfor (const [k, v] of Object.entries(opts.meta ?? {})) {\n\t\t\tmeta[k] = node({\n\t\t\t\tinitial: v,\n\t\t\t\tname: `${opts.name ?? \"node\"}:meta:${k}`,\n\t\t\t\tdescribeKind: \"state\",\n\t\t\t\t...(opts.guard != null ? { guard: opts.guard } : {}),\n\t\t\t});\n\t\t}\n\t\tObject.freeze(meta);\n\t\tthis.meta = meta;\n\n\t\t// Actions object: created once, references `this` methods.\n\t\t// Captures `this` via arrow-in-object so manualEmitUsed is set on the instance.\n\t\tconst self = this;\n\t\tthis._actions = {\n\t\t\tdown(messages): void {\n\t\t\t\tself._manualEmitUsed = true;\n\t\t\t\tself._downInternal(messages);\n\t\t\t},\n\t\t\temit(value): void {\n\t\t\t\tself._manualEmitUsed = true;\n\t\t\t\tself._emitAutoValue(value);\n\t\t\t},\n\t\t\tup(messages): void {\n\t\t\t\tself._upInternal(messages);\n\t\t\t},\n\t\t};\n\n\t\t// Bind commonly detached protocol methods\n\t\tthis.down = this.down.bind(this);\n\t\tthis.up = this.up.bind(this);\n\t\tthis._boundEmitToSinks = this._emitToSinks.bind(this);\n\t}\n\n\tget name(): string | undefined {\n\t\treturn this._registryName ?? this._optsName;\n\t}\n\n\t/**\n\t * When a node is registered with {@link Graph.add} without an options `name`,\n\t * the graph assigns the registry local name for introspection (parity with graphrefly-py).\n\t */\n\t_assignRegistryName(localName: string): void {\n\t\tif (this._optsName !== undefined || this._registryName !== undefined) return;\n\t\tthis._registryName = localName;\n\t}\n\n\t/**\n\t * @internal Attach/remove inspector hook for graph-level observability.\n\t * Returns a disposer that restores the previous hook.\n\t */\n\t_setInspectorHook(hook?: NodeInspectorHook): () => void {\n\t\tconst prev = this._inspectorHook;\n\t\tthis._inspectorHook = hook;\n\t\treturn () => {\n\t\t\tif (this._inspectorHook === hook) {\n\t\t\t\tthis._inspectorHook = prev;\n\t\t\t}\n\t\t};\n\t}\n\n\t// --- Public interface (Node<T>) ---\n\n\tget status(): NodeStatus {\n\t\treturn this._status;\n\t}\n\n\tget lastMutation(): Readonly<{ actor: Actor; timestamp_ns: number }> | undefined {\n\t\treturn this._lastMutation;\n\t}\n\n\tget v(): Readonly<NodeVersionInfo> | undefined {\n\t\treturn this._versioning;\n\t}\n\n\t/**\n\t * Retroactively apply versioning to a node that was created without it.\n\t * No-op if versioning is already enabled.\n\t *\n\t * Version starts at 0 regardless of prior DATA emissions — it tracks\n\t * changes from the moment versioning is enabled, not historical ones.\n\t *\n\t * @internal — used by {@link Graph.setVersioning}.\n\t */\n\t_applyVersioning(level: VersioningLevel, opts?: { id?: string; hash?: HashFn }): void {\n\t\tif (this._versioning != null) return;\n\t\tthis._hashFn = opts?.hash ?? this._hashFn;\n\t\tthis._versioning = createVersioning(level, this._cached, {\n\t\t\tid: opts?.id,\n\t\t\thash: this._hashFn,\n\t\t});\n\t}\n\n\thasGuard(): boolean {\n\t\treturn this._guard != null;\n\t}\n\n\tallowsObserve(actor: Actor): boolean {\n\t\tif (this._guard == null) return true;\n\t\treturn this._guard(normalizeActor(actor), \"observe\");\n\t}\n\n\tget(): T | undefined {\n\t\treturn this._cached;\n\t}\n\n\tdown(messages: Messages, options?: NodeTransportOptions): void {\n\t\tif (messages.length === 0) return;\n\t\tif (!options?.internal && this._guard != null) {\n\t\t\tconst actor = normalizeActor(options?.actor);\n\t\t\tconst delivery = options?.delivery ?? \"write\";\n\t\t\tconst action: GuardAction = delivery === \"signal\" ? \"signal\" : \"write\";\n\t\t\tif (!this._guard(actor, action)) {\n\t\t\t\tthrow new GuardDenied({ actor, action, nodeName: this.name });\n\t\t\t}\n\t\t\tthis._lastMutation = { actor, timestamp_ns: wallClockNs() };\n\t\t}\n\t\tthis._downInternal(messages);\n\t}\n\n\tprivate _downInternal(messages: Messages): void {\n\t\tif (messages.length === 0) return;\n\t\tlet lifecycleMessages = messages;\n\t\tlet sinkMessages = messages;\n\t\tif (this._terminal && !this._opts.resubscribable) {\n\t\t\tconst terminalPassthrough = messages.filter((m) => m[0] === TEARDOWN || m[0] === INVALIDATE);\n\t\t\tif (terminalPassthrough.length === 0) return;\n\t\t\tlifecycleMessages = terminalPassthrough;\n\t\t\tsinkMessages = terminalPassthrough;\n\t\t}\n\t\tthis._handleLocalLifecycle(lifecycleMessages);\n\t\t// Single-dep optimization: skip DIRTY to sinks when sole subscriber is single-dep\n\t\t// AND the batch contains a phase-2 message (DATA/RESOLVED). Standalone DIRTY\n\t\t// (without follow-up) must pass through so downstream is notified.\n\t\tif (this._canSkipDirty()) {\n\t\t\t// Inline check: does the batch contain DATA or RESOLVED?\n\t\t\tlet hasPhase2 = false;\n\t\t\tfor (let i = 0; i < sinkMessages.length; i++) {\n\t\t\t\tconst t = sinkMessages[i][0];\n\t\t\t\tif (t === DATA || t === RESOLVED) {\n\t\t\t\t\thasPhase2 = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (hasPhase2) {\n\t\t\t\t// Inline filter: remove DIRTY messages\n\t\t\t\tconst filtered: Message[] = [];\n\t\t\t\tfor (let i = 0; i < sinkMessages.length; i++) {\n\t\t\t\t\tif (sinkMessages[i][0] !== DIRTY) filtered.push(sinkMessages[i]);\n\t\t\t\t}\n\t\t\t\tif (filtered.length > 0) {\n\t\t\t\t\temitWithBatch(this._boundEmitToSinks, filtered);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\temitWithBatch(this._boundEmitToSinks, sinkMessages);\n\t}\n\n\tsubscribe(sink: NodeSink, hints?: SubscribeHints): () => void {\n\t\tif (hints?.actor != null && this._guard != null) {\n\t\t\tconst actor = normalizeActor(hints.actor);\n\t\t\tif (!this._guard(actor, \"observe\")) {\n\t\t\t\tthrow new GuardDenied({ actor, action: \"observe\", nodeName: this.name });\n\t\t\t}\n\t\t}\n\n\t\tif (this._terminal && this._opts.resubscribable) {\n\t\t\tthis._terminal = false;\n\t\t\tthis._status = this._hasDeps ? \"disconnected\" : \"settled\";\n\t\t\tthis._opts.onResubscribe?.();\n\t\t}\n\n\t\tthis._sinkCount += 1;\n\t\tif (hints?.singleDep) {\n\t\t\tthis._singleDepSinkCount += 1;\n\t\t\tthis._singleDepSinks.add(sink);\n\t\t}\n\n\t\tif (this._sinks == null) {\n\t\t\tthis._sinks = sink;\n\t\t} else if (typeof this._sinks === \"function\") {\n\t\t\tthis._sinks = new Set<NodeSink>([this._sinks, sink]);\n\t\t} else {\n\t\t\tthis._sinks.add(sink);\n\t\t}\n\n\t\tif (this._hasDeps) {\n\t\t\tthis._connectUpstream();\n\t\t} else if (this._fn) {\n\t\t\tthis._startProducer();\n\t\t}\n\n\t\tlet removed = false;\n\t\treturn () => {\n\t\t\tif (removed) return;\n\t\t\tremoved = true;\n\t\t\tthis._sinkCount -= 1;\n\t\t\tif (this._singleDepSinks.has(sink)) {\n\t\t\t\tthis._singleDepSinkCount -= 1;\n\t\t\t\tthis._singleDepSinks.delete(sink);\n\t\t\t}\n\t\t\tif (this._sinks == null) return;\n\t\t\tif (typeof this._sinks === \"function\") {\n\t\t\t\tif (this._sinks === sink) this._sinks = null;\n\t\t\t} else {\n\t\t\t\tthis._sinks.delete(sink);\n\t\t\t\tif (this._sinks.size === 1) {\n\t\t\t\t\tconst [only] = this._sinks;\n\t\t\t\t\tthis._sinks = only;\n\t\t\t\t} else if (this._sinks.size === 0) {\n\t\t\t\t\tthis._sinks = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this._sinks == null) {\n\t\t\t\tthis._disconnectUpstream();\n\t\t\t\tthis._stopProducer();\n\t\t\t}\n\t\t};\n\t}\n\n\tup(messages: Messages, options?: NodeTransportOptions): void {\n\t\tif (!this._hasDeps) return;\n\t\tif (!options?.internal && this._guard != null) {\n\t\t\tconst actor = normalizeActor(options?.actor);\n\t\t\tif (!this._guard(actor, \"write\")) {\n\t\t\t\tthrow new GuardDenied({ actor, action: \"write\", nodeName: this.name });\n\t\t\t}\n\t\t\tthis._lastMutation = { actor, timestamp_ns: wallClockNs() };\n\t\t}\n\t\tfor (const dep of this._deps) {\n\t\t\tif (options === undefined) {\n\t\t\t\tdep.up?.(messages);\n\t\t\t} else {\n\t\t\t\tdep.up?.(messages, options);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _upInternal(messages: Messages): void {\n\t\tif (!this._hasDeps) return;\n\t\tfor (const dep of this._deps) {\n\t\t\tdep.up?.(messages, { internal: true });\n\t\t}\n\t}\n\n\tunsubscribe(): void {\n\t\tif (!this._hasDeps) return;\n\t\tthis._disconnectUpstream();\n\t}\n\n\t// --- Private methods (prototype, _ prefix) ---\n\n\t_emitToSinks(messages: Messages): void {\n\t\tif (this._sinks == null) return;\n\t\tif (typeof this._sinks === \"function\") {\n\t\t\tthis._sinks(messages);\n\t\t\treturn;\n\t\t}\n\t\t// Snapshot: a sink callback may unsubscribe itself or others mid-iteration.\n\t\t// Iterating the live Set would skip not-yet-visited sinks that were removed.\n\t\tconst snapshot = [...this._sinks];\n\t\tfor (const sink of snapshot) {\n\t\t\tsink(messages);\n\t\t}\n\t}\n\n\t_handleLocalLifecycle(messages: Messages): void {\n\t\tfor (const m of messages) {\n\t\t\tconst t = m[0];\n\t\t\tif (t === DATA) {\n\t\t\t\tthis._cached = m[1] as T;\n\t\t\t\tif (this._versioning != null) {\n\t\t\t\t\tadvanceVersion(this._versioning, m[1], this._hashFn);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (t === INVALIDATE) {\n\t\t\t\t// GRAPHREFLY-SPEC §1.2: clear cached state; do not auto-emit from here.\n\t\t\t\tconst cleanupFn = this._cleanup;\n\t\t\t\tthis._cleanup = undefined;\n\t\t\t\tcleanupFn?.();\n\t\t\t\tthis._cached = undefined;\n\t\t\t\tthis._lastDepValues = undefined;\n\t\t\t}\n\t\t\tthis._status = statusAfterMessage(this._status, m);\n\t\t\tif (t === COMPLETE || t === ERROR) {\n\t\t\t\tthis._terminal = true;\n\t\t\t}\n\t\t\tif (t === TEARDOWN) {\n\t\t\t\tif (this._opts.resetOnTeardown) {\n\t\t\t\t\tthis._cached = undefined;\n\t\t\t\t}\n\t\t\t\t// Invoke cleanup for compute nodes (deps+fn) — spec §2.4\n\t\t\t\t// requires cleanup on teardown, not just before next invocation.\n\t\t\t\t// _stopProducer handles cleanup for producer nodes separately.\n\t\t\t\tconst teardownCleanup = this._cleanup;\n\t\t\t\tthis._cleanup = undefined;\n\t\t\t\tteardownCleanup?.();\n\t\t\t\ttry {\n\t\t\t\t\tthis._propagateToMeta(t);\n\t\t\t\t} finally {\n\t\t\t\t\tthis._disconnectUpstream();\n\t\t\t\t\tthis._stopProducer();\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Propagate other meta-eligible signals (centralized in messages.ts).\n\t\t\tif (t !== TEARDOWN && propagatesToMeta(t)) {\n\t\t\t\tthis._propagateToMeta(t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Propagate a signal to all companion meta nodes (best-effort). */\n\t_propagateToMeta(t: symbol): void {\n\t\tfor (const metaNode of Object.values(this.meta)) {\n\t\t\ttry {\n\t\t\t\t(metaNode as NodeImpl)._downInternal([[t]]);\n\t\t\t} catch {\n\t\t\t\t/* best-effort: other meta nodes still receive the signal */\n\t\t\t}\n\t\t}\n\t}\n\n\t_canSkipDirty(): boolean {\n\t\treturn this._sinkCount === 1 && this._singleDepSinkCount === 1;\n\t}\n\n\t_emitAutoValue(value: unknown): void {\n\t\tconst wasDirty = this._status === \"dirty\";\n\t\tconst unchanged = this._equals(this._cached, value);\n\t\tif (unchanged) {\n\t\t\tthis._downInternal(wasDirty ? [[RESOLVED]] : [[DIRTY], [RESOLVED]]);\n\t\t\treturn;\n\t\t}\n\t\tthis._cached = value as T;\n\t\tthis._downInternal(wasDirty ? [[DATA, value]] : [[DIRTY], [DATA, value]]);\n\t}\n\n\t_runFn(): void {\n\t\tif (!this._fn) return;\n\t\tif (this._terminal && !this._opts.resubscribable) return;\n\t\tif (this._connecting) return;\n\n\t\ttry {\n\t\t\tconst n = this._deps.length;\n\t\t\tconst depValues = new Array(n);\n\t\t\tfor (let i = 0; i < n; i++) depValues[i] = this._deps[i].get();\n\t\t\t// Identity check BEFORE cleanup: if all dep values are unchanged,\n\t\t\t// skip cleanup+fn entirely so effect nodes don't teardown/restart on no-op.\n\t\t\tconst prev = this._lastDepValues;\n\t\t\tif (n > 0 && prev != null && prev.length === n) {\n\t\t\t\tlet allSame = true;\n\t\t\t\tfor (let i = 0; i < n; i++) {\n\t\t\t\t\tif (!Object.is(depValues[i], prev[i])) {\n\t\t\t\t\t\tallSame = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (allSame) {\n\t\t\t\t\tif (this._status === \"dirty\") {\n\t\t\t\t\t\tthis._downInternal([[RESOLVED]]);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst prevCleanup = this._cleanup;\n\t\t\tthis._cleanup = undefined;\n\t\t\tprevCleanup?.();\n\t\t\tthis._manualEmitUsed = false;\n\t\t\tthis._lastDepValues = depValues;\n\t\t\tthis._inspectorHook?.({ kind: \"run\", depValues });\n\t\t\tconst out = this._fn(depValues, this._actions);\n\t\t\tif (isCleanupFn(out)) {\n\t\t\t\tthis._cleanup = out;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this._manualEmitUsed) return;\n\t\t\tif (out === undefined) return;\n\t\t\tthis._emitAutoValue(out);\n\t\t} catch (err) {\n\t\t\tthis._downInternal([[ERROR, err]]);\n\t\t}\n\t}\n\n\t_onDepDirty(index: number): void {\n\t\tconst wasDirty = this._depDirtyMask.has(index);\n\t\tthis._depDirtyMask.set(index);\n\t\tthis._depSettledMask.clear(index);\n\t\tif (!wasDirty) {\n\t\t\tthis._downInternal([[DIRTY]]);\n\t\t}\n\t}\n\n\t_onDepSettled(index: number): void {\n\t\tif (!this._depDirtyMask.has(index)) {\n\t\t\tthis._onDepDirty(index);\n\t\t}\n\t\tthis._depSettledMask.set(index);\n\t\tif (this._depDirtyMask.any() && this._depSettledMask.covers(this._depDirtyMask)) {\n\t\t\tthis._depDirtyMask.reset();\n\t\t\tthis._depSettledMask.reset();\n\t\t\tthis._runFn();\n\t\t}\n\t}\n\n\t_maybeCompleteFromDeps(): void {\n\t\tif (\n\t\t\tthis._autoComplete &&\n\t\t\tthis._deps.length > 0 &&\n\t\t\tthis._depCompleteMask.covers(this._allDepsCompleteMask)\n\t\t) {\n\t\t\tthis._downInternal([[COMPLETE]]);\n\t\t}\n\t}\n\n\t_handleDepMessages(index: number, messages: Messages): void {\n\t\tfor (const msg of messages) {\n\t\t\tthis._inspectorHook?.({ kind: \"dep_message\", depIndex: index, message: msg });\n\t\t\tconst t = msg[0];\n\t\t\t// User-defined message handler gets first look (spec §2.6).\n\t\t\tif (this._onMessage) {\n\t\t\t\ttry {\n\t\t\t\t\tif (this._onMessage(msg, index, this._actions)) continue;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthis._downInternal([[ERROR, err]]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!this._fn) {\n\t\t\t\t// Passthrough: forward all messages except COMPLETE when multi-dep.\n\t\t\t\t// Multi-dep passthrough must wait for ALL deps to complete (§1.3.5).\n\t\t\t\tif (t === COMPLETE && this._deps.length > 1) {\n\t\t\t\t\tthis._depCompleteMask.set(index);\n\t\t\t\t\tthis._maybeCompleteFromDeps();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthis._downInternal([msg]);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === DIRTY) {\n\t\t\t\tthis._onDepDirty(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === DATA || t === RESOLVED) {\n\t\t\t\tthis._onDepSettled(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\tthis._depCompleteMask.set(index);\n\t\t\t\t// Complete implies no longer pending — clear dirty/settled bits\n\t\t\t\t// so a preceding DIRTY from this dep doesn't block settlement.\n\t\t\t\tthis._depDirtyMask.clear(index);\n\t\t\t\tthis._depSettledMask.clear(index);\n\t\t\t\tif (this._depDirtyMask.any() && this._depSettledMask.covers(this._depDirtyMask)) {\n\t\t\t\t\tthis._depDirtyMask.reset();\n\t\t\t\t\tthis._depSettledMask.reset();\n\t\t\t\t\tthis._runFn();\n\t\t\t\t} else if (!this._depDirtyMask.any() && this._status === \"dirty\") {\n\t\t\t\t\t// D2: dep went DIRTY→COMPLETE without DATA — node was marked\n\t\t\t\t\t// dirty but no settlement came. Recompute so downstream\n\t\t\t\t\t// gets RESOLVED (value unchanged) or DATA (value changed).\n\t\t\t\t\tthis._depSettledMask.reset();\n\t\t\t\t\tthis._runFn();\n\t\t\t\t}\n\t\t\t\tthis._maybeCompleteFromDeps();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\tthis._downInternal([msg]);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === INVALIDATE || t === TEARDOWN || t === PAUSE || t === RESUME) {\n\t\t\t\tthis._downInternal([msg]);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Forward unknown message types\n\t\t\tthis._downInternal([msg]);\n\t\t}\n\t}\n\n\t_connectUpstream(): void {\n\t\tif (!this._hasDeps || this._connected) return;\n\t\tthis._connected = true;\n\t\tthis._depDirtyMask.reset();\n\t\tthis._depSettledMask.reset();\n\t\tthis._depCompleteMask.reset();\n\t\tthis._status = \"settled\";\n\t\tconst subHints: SubscribeHints | undefined = this._isSingleDep\n\t\t\t? { singleDep: true }\n\t\t\t: undefined;\n\t\tthis._connecting = true;\n\t\ttry {\n\t\t\tfor (let i = 0; i < this._deps.length; i += 1) {\n\t\t\t\tconst dep = this._deps[i];\n\t\t\t\tthis._upstreamUnsubs.push(\n\t\t\t\t\tdep.subscribe((msgs) => this._handleDepMessages(i, msgs), subHints),\n\t\t\t\t);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis._connecting = false;\n\t\t}\n\t\tif (this._fn) {\n\t\t\tthis._runFn();\n\t\t}\n\t}\n\n\t_stopProducer(): void {\n\t\tif (!this._producerStarted) return;\n\t\tthis._producerStarted = false;\n\t\tconst producerCleanup = this._cleanup;\n\t\tthis._cleanup = undefined;\n\t\tproducerCleanup?.();\n\t}\n\n\t_startProducer(): void {\n\t\tif (this._deps.length !== 0 || !this._fn || this._producerStarted) return;\n\t\tthis._producerStarted = true;\n\t\tthis._runFn();\n\t}\n\n\t_disconnectUpstream(): void {\n\t\tif (!this._connected) return;\n\t\tfor (const unsub of this._upstreamUnsubs.splice(0)) {\n\t\t\tunsub();\n\t\t}\n\t\tthis._connected = false;\n\t\tthis._depDirtyMask.reset();\n\t\tthis._depSettledMask.reset();\n\t\tthis._depCompleteMask.reset();\n\t\tthis._status = \"disconnected\";\n\t}\n}\n\n/**\n * Creates a reactive {@link Node} — the single GraphReFly primitive (GRAPHREFLY-SPEC §2).\n *\n * Typical shapes: `node([])` / `node([], opts)` for a manual source; `node(producerFn, opts)` for a\n * producer; `node(deps, computeFn, opts)` for derived nodes and operators.\n *\n * @param depsOrFn - Dependency nodes, a {@link NodeFn} (producer), or {@link NodeOptions} alone.\n * @param fnOrOpts - With deps: compute function or options. Omitted for producer-only form.\n * @param optsArg - Options when both `deps` and `fn` are provided.\n * @returns `Node<T>` - Configured node instance (lazy until subscribed).\n *\n * @remarks\n * **Protocol:** DIRTY / DATA / RESOLVED ordering, completion, and batch deferral follow `~/src/graphrefly/GRAPHREFLY-SPEC.md`.\n *\n * @example\n * ```ts\n * import { node, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const a = state(1);\n * const b = node([a], ([x]) => (x as number) + 1);\n * ```\n *\n * @seeAlso [Specification](/spec)\n *\n * @category core\n */\nexport function node<T = unknown>(\n\tdepsOrFn?: readonly Node[] | NodeFn<T> | NodeOptions,\n\tfnOrOpts?: NodeFn<T> | NodeOptions,\n\toptsArg?: NodeOptions,\n): Node<T> {\n\tconst deps: readonly Node[] = isNodeArray(depsOrFn) ? depsOrFn : [];\n\tconst fn: NodeFn<T> | undefined =\n\t\ttypeof depsOrFn === \"function\"\n\t\t\t? depsOrFn\n\t\t\t: typeof fnOrOpts === \"function\"\n\t\t\t\t? fnOrOpts\n\t\t\t\t: undefined;\n\tlet opts: NodeOptions = {};\n\tif (isNodeArray(depsOrFn)) {\n\t\topts = (isNodeOptions(fnOrOpts) ? fnOrOpts : optsArg) ?? {};\n\t} else if (isNodeOptions(depsOrFn)) {\n\t\topts = depsOrFn;\n\t} else {\n\t\topts = (isNodeOptions(fnOrOpts) ? fnOrOpts : optsArg) ?? {};\n\t}\n\n\treturn new NodeImpl<T>(deps, fn, opts);\n}\n","import { type Node, type NodeFn, type NodeOptions, node } from \"./node.js\";\n\n/**\n * Creates a manual source with no upstream deps. Emit values with {@link Node.down}.\n *\n * Spec: `state(initial, opts?)` is `node([], { initial, ...opts })` (GRAPHREFLY-SPEC §2.7).\n *\n * @param initial - Initial cached value.\n * @param opts - Optional {@link NodeOptions} (excluding `initial`).\n * @returns `Node<T>` - Stateful node you drive imperatively.\n *\n * @example\n * ```ts\n * import { DATA, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = state(0);\n * n.down([[DATA, 1]]);\n * ```\n *\n * @category core\n */\nexport function state<T>(initial: T, opts?: Omit<NodeOptions, \"initial\">): Node<T> {\n\treturn node<T>([], { ...opts, initial });\n}\n\n/**\n * Creates a producer node with no deps; `fn` runs when the first subscriber connects.\n *\n * @param fn - Receives deps (empty) and {@link NodeActions}; use `emit` / `down` to push.\n * @param opts - Optional {@link NodeOptions}.\n * @returns `Node<T>` - Producer node.\n *\n * @example\n * ```ts\n * import { producer } from \"@graphrefly/graphrefly-ts\";\n *\n * const tick = producer((_d, a) => {\n * a.emit(1);\n * });\n * ```\n *\n * @category core\n */\nexport function producer<T = unknown>(fn: NodeFn<T>, opts?: NodeOptions): Node<T> {\n\treturn node<T>(fn, { describeKind: \"producer\", ...opts });\n}\n\n/**\n * Creates a derived node from dependencies and a compute function (same primitive as operators).\n *\n * @param deps - Upstream nodes.\n * @param fn - Compute function; return value is emitted, or use `actions` explicitly.\n * @param opts - Optional {@link NodeOptions}.\n * @returns `Node<T>` - Derived node.\n *\n * @example\n * ```ts\n * import { derived, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const a = state(1);\n * const b = derived([a], ([x]) => (x as number) * 2);\n * ```\n *\n * @category core\n */\nexport function derived<T = unknown>(\n\tdeps: readonly Node[],\n\tfn: NodeFn<T>,\n\topts?: NodeOptions,\n): Node<T> {\n\treturn node<T>(deps, fn, { describeKind: \"derived\", ...opts });\n}\n\n/**\n * Runs a side-effect when deps settle; return value is not auto-emitted.\n *\n * @param deps - Nodes to watch.\n * @param fn - Side-effect body.\n * @returns `Node<unknown>` - Effect node.\n *\n * @example\n * ```ts\n * import { effect, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = state(1);\n * effect([n], ([v]) => {\n * console.log(v);\n * });\n * ```\n *\n * @category core\n */\nexport function effect(deps: readonly Node[], fn: NodeFn<unknown>): Node<unknown> {\n\treturn node(deps, fn, { describeKind: \"effect\" });\n}\n\n/** Unary transform used by {@link pipe} (typically returns a new node wrapping `n`). */\nexport type PipeOperator = (n: Node) => Node;\n\n/**\n * Composes unary operators left-to-right; returns the final node. Does not register a {@link Graph}.\n *\n * @param source - Starting node.\n * @param ops - Each operator maps `Node` to `Node` (curried operators from `extra` use a factory pattern — wrap or use direct calls).\n * @returns `Node` - Result of the last operator.\n *\n * @example\n * ```ts\n * import { filter, map, pipe, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const src = state(1);\n * const out = pipe(\n * src,\n * (n) => map(n, (x) => x + 1),\n * (n) => filter(n, (x) => x > 0),\n * );\n * ```\n *\n * @category core\n */\nexport function pipe(source: Node, ...ops: PipeOperator[]): Node {\n\tlet current = source;\n\tfor (const op of ops) {\n\t\tcurrent = op(current);\n\t}\n\treturn current;\n}\n","/**\n * Backoff strategies for {@link retry} (roadmap §3.1). Delays are in **nanoseconds**.\n *\n * Convention: all graphrefly-ts timestamps and durations use nanoseconds (`_ns` suffix).\n * 1 second = 1_000_000_000 ns, 1 ms = 1_000_000 ns.\n */\n\nexport const NS_PER_MS = 1_000_000;\nexport const NS_PER_SEC = 1_000_000_000;\n\nexport type JitterMode = \"none\" | \"full\" | \"equal\";\n\nexport type BackoffPreset =\n\t| \"constant\"\n\t| \"linear\"\n\t| \"exponential\"\n\t| \"fibonacci\"\n\t| \"decorrelatedJitter\";\n\n/** `(attempt, error?, previousDelayNs?) => delayNs | null` — `null` means zero delay. */\nexport type BackoffStrategy = (\n\tattempt: number,\n\terror?: unknown,\n\tprevDelayNs?: number | null,\n) => number | null;\n\nfunction clampNonNegative(value: number): number {\n\treturn value < 0 ? 0 : value;\n}\n\nfunction applyJitter(delay: number, jitter: JitterMode): number {\n\tif (jitter === \"none\") return delay;\n\tif (jitter === \"full\") return Math.random() * delay;\n\treturn delay / 2 + Math.random() * (delay / 2);\n}\n\nfunction randomBetween(min: number, max: number): number {\n\treturn min + Math.random() * (max - min);\n}\n\n/**\n * Builds a strategy that always returns the same delay in nanoseconds.\n *\n * @param delayNs - Non-negative delay in nanoseconds; values below zero are clamped to zero.\n * @returns `BackoffStrategy` for use with {@link retry} or custom timers.\n *\n * @example\n * ```ts\n * import { constant, retry, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * const out = retry(source, { count: 3, backoff: constant(0.25 * NS_PER_SEC) });\n * ```\n *\n * @category extra\n */\nexport function constant(delayNs: number): BackoffStrategy {\n\tconst safe = clampNonNegative(delayNs);\n\treturn () => safe;\n}\n\n/**\n * Builds linear backoff: `baseNs + stepNs * attempt` (`stepNs` defaults to `baseNs`).\n *\n * @param baseNs - Base delay in nanoseconds (clamped non-negative).\n * @param stepNs - Added per retry attempt in nanoseconds (clamped non-negative).\n * @returns `BackoffStrategy` for {@link retry}.\n *\n * @example\n * ```ts\n * import { linear, retry, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * // Attempt 0 → 1 s, attempt 1 → 2 s, attempt 2 → 3 s …\n * const out = retry(source, { count: 4, backoff: linear(NS_PER_SEC) });\n * ```\n *\n * @category extra\n */\nexport function linear(baseNs: number, stepNs?: number): BackoffStrategy {\n\tconst safeBase = clampNonNegative(baseNs);\n\tconst safeStep = stepNs === undefined ? safeBase : clampNonNegative(stepNs);\n\treturn (attempt: number) => safeBase + safeStep * Math.max(0, attempt);\n}\n\nexport type ExponentialBackoffOptions = {\n\tbaseNs?: number;\n\tfactor?: number;\n\tmaxDelayNs?: number;\n\tjitter?: JitterMode;\n};\n\n/**\n * Builds exponential backoff in nanoseconds, capped by `maxDelayNs`, with optional jitter.\n *\n * @param options - Base, factor, cap, and jitter mode.\n * @returns `BackoffStrategy` for {@link retry}.\n *\n * @remarks\n * **Jitter:** `\"full\"` spreads delay across `[0, delay]`; `\"equal\"` uses `[delay/2, delay]`.\n *\n * @example\n * ```ts\n * import { exponential, retry, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * // 100 ms → 200 ms → 400 ms … capped at 30 s, with full jitter\n * const out = retry(source, {\n * count: 5,\n * backoff: exponential({ baseNs: 100 * NS_PER_SEC / 1000, jitter: \"full\" }),\n * });\n * ```\n *\n * @category extra\n */\nexport function exponential(options?: ExponentialBackoffOptions): BackoffStrategy {\n\tconst baseNs = clampNonNegative(options?.baseNs ?? 100 * NS_PER_MS);\n\tconst factor = options?.factor !== undefined && options.factor < 1 ? 1 : (options?.factor ?? 2);\n\tconst maxDelayNs = clampNonNegative(options?.maxDelayNs ?? 30 * NS_PER_SEC);\n\tconst jitter = options?.jitter ?? \"none\";\n\n\treturn (attempt: number) => {\n\t\tlet delay: number;\n\t\tif (baseNs === 0) {\n\t\t\tdelay = 0;\n\t\t} else if (factor === 1) {\n\t\t\tdelay = baseNs;\n\t\t} else {\n\t\t\tconst capRatio = maxDelayNs / baseNs;\n\t\t\tlet growth = 1;\n\t\t\tfor (let i = 0; i < Math.max(0, attempt); i++) {\n\t\t\t\tif (growth >= capRatio) {\n\t\t\t\t\tgrowth = capRatio;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tgrowth *= factor;\n\t\t\t}\n\t\t\tdelay = baseNs * growth;\n\t\t\tif (delay > maxDelayNs) delay = maxDelayNs;\n\t\t}\n\t\treturn applyJitter(delay, jitter);\n\t};\n}\n\n/**\n * Builds Fibonacci-scaled delays: `1, 2, 3, 5, … × baseNs`, capped at `maxDelayNs`.\n *\n * @param baseNs - Multiplier applied to the Fibonacci unit (default `100ms` in nanoseconds).\n * @param maxDelayNs - Upper bound in nanoseconds (default `30s`).\n * @returns `BackoffStrategy` for {@link retry}.\n *\n * @example\n * ```ts\n * import { fibonacci, retry, NS_PER_MS } from \"@graphrefly/graphrefly-ts\";\n *\n * // Delays: 100 ms, 200 ms, 300 ms, 500 ms, 800 ms … (× 100 ms base)\n * const out = retry(source, { count: 5, backoff: fibonacci(100 * NS_PER_MS) });\n * ```\n *\n * @category extra\n */\nexport function fibonacci(baseNs = 100 * NS_PER_MS, maxDelayNs = 30 * NS_PER_SEC): BackoffStrategy {\n\tconst safeBase = clampNonNegative(baseNs);\n\tconst safeMax = clampNonNegative(maxDelayNs);\n\n\tfunction fibUnit(attempt: number): number {\n\t\tif (attempt <= 0) return 1;\n\t\tlet prev = 1;\n\t\tlet cur = 2;\n\t\tfor (let i = 1; i < attempt; i++) {\n\t\t\tconst next = prev + cur;\n\t\t\tprev = cur;\n\t\t\tcur = next;\n\t\t}\n\t\treturn cur;\n\t}\n\n\treturn (attempt: number) => {\n\t\tconst raw = fibUnit(attempt) * safeBase;\n\t\treturn raw <= safeMax ? raw : safeMax;\n\t};\n}\n\n/**\n * Decorrelated jitter (AWS-recommended): `random(baseNs, min(maxNs, lastDelay * 3))`.\n *\n * Stateless — uses `prevDelayNs` (passed by the consumer) instead of closure state.\n * Safe to share across concurrent retry sequences.\n *\n * @param baseNs - Floor of the random range (default `100ms` in nanoseconds).\n * @param maxNs - Ceiling cap (default `30s` in nanoseconds).\n * @returns `BackoffStrategy` for {@link retry}.\n *\n * @example\n * ```ts\n * import { decorrelatedJitter, retry, NS_PER_MS, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * const out = retry(source, {\n * count: 6,\n * backoff: decorrelatedJitter(100 * NS_PER_MS, 10 * NS_PER_SEC),\n * });\n * ```\n *\n * @category extra\n */\nexport function decorrelatedJitter(\n\tbaseNs = 100 * NS_PER_MS,\n\tmaxNs = 30 * NS_PER_SEC,\n): BackoffStrategy {\n\treturn (_attempt, _error, prevDelayNs) => {\n\t\tconst last = prevDelayNs ?? baseNs;\n\t\tconst ceiling = Math.min(maxNs, last * 3);\n\t\treturn randomBetween(baseNs, ceiling);\n\t};\n}\n\n/**\n * Decorator that caps any strategy at `maxAttempts`. Returns `null` (stop retrying) after the cap.\n *\n * @param strategy - Inner strategy to wrap.\n * @param maxAttempts - Maximum number of attempts (inclusive).\n * @returns Wrapped `BackoffStrategy`.\n *\n * @example\n * ```ts\n * import { withMaxAttempts, exponential } from \"@graphrefly/graphrefly-ts\";\n *\n * const capped = withMaxAttempts(exponential(), 3);\n * capped(3); // null — no more retries beyond attempt 3\n * ```\n *\n * @category extra\n */\nexport function withMaxAttempts(strategy: BackoffStrategy, maxAttempts: number): BackoffStrategy {\n\treturn (attempt, error, prevDelayNs) => {\n\t\tif (attempt >= maxAttempts) return null;\n\t\treturn strategy(attempt, error, prevDelayNs);\n\t};\n}\n\n/**\n * Maps a preset name to a concrete {@link BackoffStrategy} with library-default parameters.\n *\n * @param name - One of `constant`, `linear`, `exponential`, `fibonacci`, or `decorrelatedJitter`.\n * @returns Configured strategy with default parameters.\n * @throws Error when `name` is not a known preset.\n *\n * @example\n * ```ts\n * import { resolveBackoffPreset, retry } from \"@graphrefly/graphrefly-ts\";\n *\n * const out = retry(source, { count: 3, backoff: resolveBackoffPreset(\"exponential\") });\n * // Equivalent to retry(source, { count: 3, backoff: exponential() })\n * ```\n *\n * @category extra\n */\nexport function resolveBackoffPreset(name: BackoffPreset): BackoffStrategy {\n\tif (name === \"constant\") return constant(1 * NS_PER_SEC);\n\tif (name === \"linear\") return linear(1 * NS_PER_SEC);\n\tif (name === \"exponential\") return exponential();\n\tif (name === \"fibonacci\") return fibonacci();\n\tif (name === \"decorrelatedJitter\") return decorrelatedJitter();\n\tthrow new Error(\n\t\t`Unknown backoff preset: \"${String(name)}\". Use one of: constant, linear, exponential, fibonacci, decorrelatedJitter`,\n\t);\n}\n","/**\n * Resilience utilities — roadmap §3.1 (retry, breaker, rate limit, status companions).\n */\nimport { batch } from \"../core/batch.js\";\nimport { monotonicNs } from \"../core/clock.js\";\nimport { COMPLETE, DATA, DIRTY, ERROR, type Message, RESOLVED } from \"../core/messages.js\";\nimport { type Node, type NodeOptions, node } from \"../core/node.js\";\nimport { producer } from \"../core/sugar.js\";\nimport {\n\ttype BackoffPreset,\n\ttype BackoffStrategy,\n\tNS_PER_MS,\n\tNS_PER_SEC,\n\tresolveBackoffPreset,\n} from \"./backoff.js\";\n\ntype ExtraOpts = Omit<NodeOptions, \"describeKind\">;\n\nfunction operatorOpts(opts?: ExtraOpts): NodeOptions {\n\treturn { describeKind: \"operator\", ...opts };\n}\n\nfunction clampNonNegative(value: number): number {\n\treturn value < 0 ? 0 : value;\n}\n\nfunction msgVal(m: Message): unknown {\n\treturn m[1];\n}\n\nfunction coerceDelayNs(raw: number | null): number {\n\tif (raw === null) return 0;\n\tif (typeof raw !== \"number\" || !Number.isFinite(raw)) {\n\t\tthrow new TypeError(\"backoff strategy must return a finite number or null\");\n\t}\n\treturn raw < 0 ? 0 : raw;\n}\n\nexport type RetryOptions = {\n\t/** Max retry attempts after each terminal `ERROR` (not counting the first failure). */\n\tcount?: number;\n\t/** Delay between attempts; strategies use **nanoseconds**. */\n\tbackoff?: BackoffStrategy | BackoffPreset;\n};\n\n/**\n * Resubscribes to the upstream node after each terminal `ERROR`, after an optional delay.\n *\n * @param source - Upstream node (should use `resubscribable: true`).\n * @param opts - `count` caps attempts; `backoff` supplies delay in **nanoseconds** (or a preset name).\n * @returns Node that retries on error.\n *\n * @remarks\n * **Resubscribable sources:** The upstream should use `resubscribable: true` if it must emit again after `ERROR`.\n * **Protocol:** Forwards unknown message tuples unchanged; handles `DIRTY`, `DATA`, `RESOLVED`, `COMPLETE`, `ERROR`.\n *\n * @example\n * ```ts\n * import { ERROR, NS_PER_SEC, pipe, producer, retry, constant } from \"@graphrefly/graphrefly-ts\";\n *\n * const src = producer(\n * (_d, a) => {\n * a.down([[ERROR, new Error(\"x\")]]);\n * },\n * { resubscribable: true },\n * );\n * const out = retry(src, { count: 2, backoff: constant(0.25 * NS_PER_SEC) });\n * ```\n *\n * @category extra\n */\nexport function retry<T>(source: Node<T>, opts?: RetryOptions): Node<T> {\n\tconst count = opts?.count;\n\tconst backoffOpt = opts?.backoff;\n\tconst maxRetries = count !== undefined ? count : backoffOpt === undefined ? 0 : 0x7fffffff;\n\tif (maxRetries < 0) throw new RangeError(\"retry count must be >= 0\");\n\n\tconst strategy: BackoffStrategy | null =\n\t\tbackoffOpt === undefined\n\t\t\t? null\n\t\t\t: typeof backoffOpt === \"string\"\n\t\t\t\t? resolveBackoffPreset(backoffOpt)\n\t\t\t\t: backoffOpt;\n\n\treturn producer<T>(\n\t\t(_d, a) => {\n\t\t\tlet attempt = 0;\n\t\t\tlet stopped = false;\n\t\t\tlet prevDelay: number | null = null;\n\t\t\tlet unsub: (() => void) | undefined;\n\t\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\t\tlet timerGen = 0;\n\n\t\t\tfunction cancelTimer(): void {\n\t\t\t\tif (timer !== undefined) {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction disconnectUpstream(): void {\n\t\t\t\tunsub?.();\n\t\t\t\tunsub = undefined;\n\t\t\t}\n\n\t\t\tfunction scheduleRetryOrFinish(err: unknown): void {\n\t\t\t\tif (stopped) return;\n\t\t\t\tif (attempt >= maxRetries) {\n\t\t\t\t\tdisconnectUpstream();\n\t\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst raw = strategy === null ? 0 : strategy(attempt, err, prevDelay);\n\t\t\t\tconst delayNs = coerceDelayNs(raw === undefined ? null : raw);\n\t\t\t\tprevDelay = delayNs;\n\t\t\t\tattempt += 1;\n\t\t\t\ttimerGen += 1;\n\t\t\t\tconst gen = timerGen;\n\t\t\t\tdisconnectUpstream();\n\t\t\t\tconst delayMs = delayNs > 0 ? delayNs / NS_PER_MS : 1;\n\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t\tif (stopped || gen !== timerGen) return;\n\t\t\t\t\tconnect();\n\t\t\t\t}, delayMs);\n\t\t\t}\n\n\t\t\tfunction connect(): void {\n\t\t\t\tcancelTimer();\n\t\t\t\tdisconnectUpstream();\n\t\t\t\tunsub = source.subscribe((msgs) => {\n\t\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\t\tconst t = m[0];\n\t\t\t\t\t\tif (t === DIRTY) a.down([[DIRTY]]);\n\t\t\t\t\t\telse if (t === DATA) {\n\t\t\t\t\t\t\tattempt = 0;\n\t\t\t\t\t\t\tprevDelay = null;\n\t\t\t\t\t\t\ta.emit(m[1] as T);\n\t\t\t\t\t\t} else if (t === RESOLVED) a.down([[RESOLVED]]);\n\t\t\t\t\t\telse if (t === COMPLETE) {\n\t\t\t\t\t\t\tdisconnectUpstream();\n\t\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\t\t\tscheduleRetryOrFinish(msgVal(m));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t} else a.down([m]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconnect();\n\n\t\t\treturn () => {\n\t\t\t\tstopped = true;\n\t\t\t\ttimerGen += 1;\n\t\t\t\tcancelTimer();\n\t\t\t\tdisconnectUpstream();\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(),\n\t\t\tinitial: source.get(),\n\t\t},\n\t);\n}\n\nexport type CircuitState = \"closed\" | \"open\" | \"half-open\";\n\n/**\n * Thrown when {@link withBreaker} is configured with `onOpen: \"error\"` and the breaker rejects work.\n *\n * @category extra\n */\nexport class CircuitOpenError extends Error {\n\toverride name = \"CircuitOpenError\";\n\tconstructor() {\n\t\tsuper(\"Circuit breaker is open\");\n\t}\n}\n\nexport interface CircuitBreakerOptions {\n\t/** Number of consecutive failures before opening. Default: 5. */\n\tfailureThreshold?: number;\n\t/** Base cooldown in nanoseconds before transitioning to half-open. Default: 30s. */\n\tcooldownNs?: number;\n\t/** Backoff strategy for cooldown escalation across consecutive open cycles. Overrides `cooldownNs` when provided. */\n\tcooldown?: BackoffStrategy;\n\t/** Max trial requests allowed in half-open state. Default: 1. */\n\thalfOpenMax?: number;\n\t/** Clock function returning nanoseconds (for testability). Default: `monotonicNs`. */\n\tnow?: () => number;\n}\n\nexport interface CircuitBreaker {\n\t/** Whether a request should be allowed through. Triggers open→half-open transition when cooldown expires. */\n\tcanExecute(): boolean;\n\t/** Record a successful execution. Resets to closed. */\n\trecordSuccess(): void;\n\t/** Record a failed execution. May transition to open. */\n\trecordFailure(error?: unknown): void;\n\t/** Current circuit state (read-only, does not trigger transitions). */\n\treadonly state: CircuitState;\n\t/** Number of consecutive failures in the current closed period. */\n\treadonly failureCount: number;\n\t/** Manually reset to closed state, clearing all counters. */\n\treset(): void;\n}\n\n/**\n * Factory for a synchronous circuit breaker with `closed`, `open`, and `half-open` states.\n *\n * Supports escalating cooldown via an optional {@link BackoffStrategy} — each consecutive\n * open→half-open→open cycle increments the backoff attempt.\n *\n * @param options - Threshold, cooldown, half-open limit, and optional clock override.\n * @returns {@link CircuitBreaker} instance.\n *\n * @remarks\n * **Timing:** Uses `monotonicNs()` by default (nanoseconds). Override `now` for tests.\n *\n * @example\n * ```ts\n * import { circuitBreaker, exponential, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * const b = circuitBreaker({\n * failureThreshold: 3,\n * cooldown: exponential({ baseNs: 1 * NS_PER_SEC }),\n * });\n * ```\n *\n * @category extra\n */\nexport function circuitBreaker(options?: CircuitBreakerOptions): CircuitBreaker {\n\tconst threshold = Math.max(1, options?.failureThreshold ?? 5);\n\tconst baseCooldownNs = clampNonNegative(options?.cooldownNs ?? 30 * NS_PER_SEC);\n\tconst cooldownStrategy = options?.cooldown ?? null;\n\tconst halfOpenMax = Math.max(1, options?.halfOpenMax ?? 1);\n\tconst now = options?.now ?? monotonicNs;\n\n\tlet _state: CircuitState = \"closed\";\n\tlet _failureCount = 0;\n\tlet _openCycle = 0;\n\tlet _lastOpenedAt = 0;\n\tlet _lastCooldownNs = baseCooldownNs;\n\tlet _halfOpenAttempts = 0;\n\n\tfunction getCooldownNs(): number {\n\t\tif (!cooldownStrategy) return baseCooldownNs;\n\t\tconst delayNs = cooldownStrategy(_openCycle);\n\t\treturn delayNs !== null ? delayNs : baseCooldownNs;\n\t}\n\n\tfunction transitionToOpen(): void {\n\t\t_state = \"open\";\n\t\t_lastCooldownNs = getCooldownNs();\n\t\t_lastOpenedAt = now();\n\t\t_halfOpenAttempts = 0;\n\t}\n\n\tconst breaker: CircuitBreaker = {\n\t\tcanExecute(): boolean {\n\t\t\tif (_state === \"closed\") return true;\n\n\t\t\tif (_state === \"open\") {\n\t\t\t\tconst elapsed = now() - _lastOpenedAt;\n\t\t\t\tif (elapsed >= _lastCooldownNs) {\n\t\t\t\t\t_state = \"half-open\";\n\t\t\t\t\t_halfOpenAttempts = 1;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (_halfOpenAttempts < halfOpenMax) {\n\t\t\t\t_halfOpenAttempts++;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\trecordSuccess(): void {\n\t\t\tif (_state === \"half-open\") {\n\t\t\t\t_state = \"closed\";\n\t\t\t\t_failureCount = 0;\n\t\t\t\t_openCycle = 0;\n\t\t\t} else if (_state === \"closed\") {\n\t\t\t\t_failureCount = 0;\n\t\t\t}\n\t\t},\n\n\t\trecordFailure(_error?: unknown): void {\n\t\t\tif (_state === \"half-open\") {\n\t\t\t\t_openCycle++;\n\t\t\t\ttransitionToOpen();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (_state === \"closed\") {\n\t\t\t\t_failureCount++;\n\t\t\t\tif (_failureCount >= threshold) {\n\t\t\t\t\ttransitionToOpen();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tget state(): CircuitState {\n\t\t\treturn _state;\n\t\t},\n\n\t\tget failureCount(): number {\n\t\t\treturn _failureCount;\n\t\t},\n\n\t\treset(): void {\n\t\t\t_state = \"closed\";\n\t\t\t_failureCount = 0;\n\t\t\t_openCycle = 0;\n\t\t\t_halfOpenAttempts = 0;\n\t\t},\n\t};\n\n\treturn breaker;\n}\n\nexport type WithBreakerBundle<T> = {\n\tnode: Node<T>;\n\tbreakerState: Node<CircuitState>;\n};\n\n/**\n * Returns a unary wrapper that gates upstream `DATA` through a {@link CircuitBreaker}.\n *\n * @param breaker - Shared breaker instance (typically one per resource).\n * @param options - `onOpen: \"skip\"` emits `RESOLVED` when open; `\"error\"` emits {@link CircuitOpenError}.\n * @returns Function mapping `Node<T>` to `{ node, breakerState }` companion nodes.\n *\n * @remarks\n * **Success path:** `COMPLETE` calls {@link CircuitBreaker.recordSuccess}. **Failure path:** upstream `ERROR` calls {@link CircuitBreaker.recordFailure} and is forwarded.\n *\n * @example\n * ```ts\n * import { state, withBreaker, circuitBreaker } from \"@graphrefly/graphrefly-ts\";\n *\n * const b = circuitBreaker({ failureThreshold: 2 });\n * const s = state(1);\n * const { node, breakerState } = withBreaker(b)(s);\n * ```\n *\n * @category extra\n */\nexport function withBreaker<T>(\n\tbreaker: CircuitBreaker,\n\toptions?: { onOpen?: \"skip\" | \"error\" },\n): (source: Node<T>) => WithBreakerBundle<T> {\n\tconst onOpen = options?.onOpen ?? \"skip\";\n\n\treturn (source: Node<T>): WithBreakerBundle<T> => {\n\t\tconst wrapped = node<T>(\n\t\t\t[],\n\t\t\t(_deps, a) => {\n\t\t\t\tfunction syncState(): void {\n\t\t\t\t\twrapped.meta.breakerState.down([[DATA, breaker.state]]);\n\t\t\t\t}\n\n\t\t\t\tconst unsub = source.subscribe((msgs) => {\n\t\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\t\tconst t = m[0];\n\t\t\t\t\t\tif (t === DIRTY) a.down([[DIRTY]]);\n\t\t\t\t\t\telse if (t === DATA) {\n\t\t\t\t\t\t\tif (breaker.canExecute()) {\n\t\t\t\t\t\t\t\tsyncState();\n\t\t\t\t\t\t\t\ta.emit(m[1] as T);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsyncState();\n\t\t\t\t\t\t\t\tif (onOpen === \"error\") a.down([[ERROR, new CircuitOpenError()]]);\n\t\t\t\t\t\t\t\telse a.down([[RESOLVED]]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (t === RESOLVED) a.down([[RESOLVED]]);\n\t\t\t\t\t\telse if (t === COMPLETE) {\n\t\t\t\t\t\t\tbreaker.recordSuccess();\n\t\t\t\t\t\t\tsyncState();\n\t\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\t\t\tbreaker.recordFailure(msgVal(m));\n\t\t\t\t\t\t\tsyncState();\n\t\t\t\t\t\t\ta.down([m]);\n\t\t\t\t\t\t} else a.down([m]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tsyncState();\n\t\t\t\treturn unsub;\n\t\t\t},\n\t\t\t{\n\t\t\t\t...operatorOpts(),\n\t\t\t\tmeta: { breakerState: breaker.state },\n\t\t\t\tcompleteWhenDepsComplete: false,\n\t\t\t\tinitial: source.get(),\n\t\t\t},\n\t\t);\n\n\t\treturn { node: wrapped, breakerState: wrapped.meta.breakerState as Node<CircuitState> };\n\t};\n}\n\nexport interface TokenBucket {\n\t/** Number of tokens currently available (after refill). */\n\tavailable(): number;\n\t/** Try to consume `cost` tokens. Returns `true` if successful. */\n\ttryConsume(cost?: number): boolean;\n}\n\n/**\n * Token-bucket meter (capacity + refill rate per second). Use with {@link rateLimiter} or custom gates.\n *\n * @param capacity - Maximum tokens (must be positive).\n * @param refillPerSecond - Tokens added per elapsed second (non-negative).\n * @returns {@link TokenBucket} instance.\n *\n * @example\n * ```ts\n * import { tokenBucket } from \"@graphrefly/graphrefly-ts\";\n *\n * const bucket = tokenBucket(10, 2); // capacity 10, refill 2 tokens/sec\n * bucket.tryConsume(3); // true — 7 tokens remaining\n * bucket.available(); // ~7 (plus any elapsed refill)\n * ```\n *\n * @category extra\n */\nexport function tokenBucket(capacity: number, refillPerSecond: number): TokenBucket {\n\tif (capacity <= 0) throw new RangeError(\"capacity must be > 0\");\n\tif (refillPerSecond < 0) throw new RangeError(\"refillPerSecond must be >= 0\");\n\n\tlet tokens = capacity;\n\tlet updatedAt = monotonicNs();\n\n\tfunction refill(now: number): void {\n\t\tif (refillPerSecond > 0) {\n\t\t\tconst elapsedNs = now - updatedAt;\n\t\t\ttokens = Math.min(capacity, tokens + (elapsedNs / NS_PER_SEC) * refillPerSecond);\n\t\t}\n\t\tupdatedAt = now;\n\t}\n\n\treturn {\n\t\tavailable(): number {\n\t\t\trefill(monotonicNs());\n\t\t\treturn tokens;\n\t\t},\n\t\ttryConsume(cost = 1): boolean {\n\t\t\tif (cost <= 0) return true;\n\t\t\tconst now = monotonicNs();\n\t\t\trefill(now);\n\t\t\tif (tokens >= cost) {\n\t\t\t\ttokens -= cost;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t};\n}\n\n/**\n * Same behavior as {@link tokenBucket}. Exposed for naming parity with graphrefly-py (`token_tracker`).\n *\n * @param capacity - Maximum tokens (must be positive).\n * @param refillPerSecond - Tokens added per elapsed second (non-negative).\n * @returns A {@link TokenBucket} instance.\n *\n * @example\n * ```ts\n * import { tokenTracker } from \"@graphrefly/graphrefly-ts\";\n *\n * const tracker = tokenTracker(100, 10); // 100-token capacity, 10/sec refill\n * tracker.tryConsume(5); // true\n * ```\n *\n * @category extra\n */\nexport function tokenTracker(capacity: number, refillPerSecond: number): TokenBucket {\n\treturn tokenBucket(capacity, refillPerSecond);\n}\n\n/**\n * Enforces a sliding window: at most `maxEvents` `DATA` values per `windowNs`.\n *\n * @param source - Upstream node.\n * @param maxEvents - Maximum `DATA` emissions per window (must be positive).\n * @param windowNs - Window length in nanoseconds (must be positive).\n * @returns Node that queues excess values FIFO until a slot frees.\n *\n * @remarks\n * **Terminal:** `COMPLETE` / `ERROR` cancel timers, drop pending queue, and clear window state.\n *\n * @example\n * ```ts\n * import { rateLimiter, state, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * const src = state(0);\n * // Allow at most 5 DATA values per second\n * const limited = rateLimiter(src, 5, NS_PER_SEC);\n * limited.subscribe((msgs) => console.log(msgs));\n * ```\n *\n * @category extra\n */\nexport function rateLimiter<T>(source: Node<T>, maxEvents: number, windowNs: number): Node<T> {\n\tif (maxEvents <= 0) throw new RangeError(\"maxEvents must be > 0\");\n\tif (windowNs <= 0) throw new RangeError(\"windowNs must be > 0\");\n\treturn producer<T>(\n\t\t(_d, a) => {\n\t\t\tconst times: number[] = [];\n\t\t\tconst pending: T[] = [];\n\t\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\t\tlet timerGen = 0;\n\n\t\t\tfunction cancelTimer(): void {\n\t\t\t\tif (timer !== undefined) {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction prune(now: number): void {\n\t\t\t\tconst boundary = now - windowNs;\n\t\t\t\twhile (times.length > 0 && times[0] <= boundary) times.shift();\n\t\t\t}\n\n\t\t\tfunction tryEmit(): void {\n\t\t\t\twhile (pending.length > 0) {\n\t\t\t\t\tconst now = monotonicNs();\n\t\t\t\t\tprune(now);\n\t\t\t\t\tif (times.length < maxEvents) {\n\t\t\t\t\t\ttimes.push(now);\n\t\t\t\t\t\ta.emit(pending.shift() as T);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst oldest = times[0];\n\t\t\t\t\t\tcancelTimer();\n\t\t\t\t\t\ttimerGen += 1;\n\t\t\t\t\t\tconst gen = timerGen;\n\t\t\t\t\t\tconst delayNs = Math.max(0, oldest + windowNs - monotonicNs());\n\t\t\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\t\t\ttimer = undefined;\n\t\t\t\t\t\t\tif (gen !== timerGen) return;\n\t\t\t\t\t\t\ttryEmit();\n\t\t\t\t\t\t}, delayNs / NS_PER_MS);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst unsub = source.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\tif (t === DIRTY) a.down([[DIRTY]]);\n\t\t\t\t\telse if (t === DATA) {\n\t\t\t\t\t\tpending.push(m[1] as T);\n\t\t\t\t\t\ttryEmit();\n\t\t\t\t\t} else if (t === RESOLVED) a.down([[RESOLVED]]);\n\t\t\t\t\telse if (t === COMPLETE) {\n\t\t\t\t\t\ttimerGen += 1;\n\t\t\t\t\t\tcancelTimer();\n\t\t\t\t\t\tpending.length = 0;\n\t\t\t\t\t\ttimes.length = 0;\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\t\ttimerGen += 1;\n\t\t\t\t\t\tcancelTimer();\n\t\t\t\t\t\tpending.length = 0;\n\t\t\t\t\t\ttimes.length = 0;\n\t\t\t\t\t\ta.down([m]);\n\t\t\t\t\t} else a.down([m]);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn () => {\n\t\t\t\ttimerGen += 1;\n\t\t\t\tcancelTimer();\n\t\t\t\tunsub();\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(),\n\t\t\tinitial: source.get(),\n\t\t},\n\t);\n}\n\nexport type StatusValue = \"pending\" | \"active\" | \"completed\" | \"errored\";\n\nexport type WithStatusBundle<T> = {\n\tnode: Node<T>;\n\tstatus: Node<StatusValue>;\n\terror: Node<unknown | null>;\n};\n\n/**\n * Wraps `src` with `status` and `error` {@link state} companions for UI or meta snapshots.\n *\n * @param src - Upstream node to mirror.\n * @param options - `initialStatus` defaults to `\"pending\"`.\n * @returns `{ node, status, error }` where `error` holds the last `ERROR` payload.\n *\n * @remarks\n * **Recovery:** After `errored`, the next `DATA` clears `error` and sets `active` inside {@link batch} (matches graphrefly-py).\n *\n * @example\n * ```ts\n * import { withStatus, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const src = state<number>(0);\n * const { node, status, error } = withStatus(src);\n *\n * status.subscribe((msgs) => console.log(\"status:\", msgs));\n * src.down([[DATA, 42]]); // status → \"active\"\n * ```\n *\n * @category extra\n */\nexport function withStatus<T>(\n\tsrc: Node<T>,\n\toptions?: { initialStatus?: StatusValue },\n): WithStatusBundle<T> {\n\tconst initialStatus = options?.initialStatus ?? \"pending\";\n\n\tconst out = node<T>(\n\t\t[],\n\t\t(_deps, a) => {\n\t\t\tout.meta.status.down([[DATA, initialStatus]]);\n\t\t\tout.meta.error.down([[DATA, null]]);\n\n\t\t\tconst unsub = src.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\tif (t === DIRTY) a.down([[DIRTY]]);\n\t\t\t\t\telse if (t === DATA) {\n\t\t\t\t\t\tif (out.meta.status.get() === \"errored\") {\n\t\t\t\t\t\t\tbatch(() => {\n\t\t\t\t\t\t\t\tout.meta.error.down([[DATA, null]]);\n\t\t\t\t\t\t\t\tout.meta.status.down([[DATA, \"active\"]]);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tout.meta.status.down([[DATA, \"active\"]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ta.emit(m[1] as T);\n\t\t\t\t\t} else if (t === RESOLVED) a.down([[RESOLVED]]);\n\t\t\t\t\telse if (t === COMPLETE) {\n\t\t\t\t\t\tout.meta.status.down([[DATA, \"completed\"]]);\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\t\tconst err = msgVal(m);\n\t\t\t\t\t\tbatch(() => {\n\t\t\t\t\t\t\tout.meta.error.down([[DATA, err]]);\n\t\t\t\t\t\t\tout.meta.status.down([[DATA, \"errored\"]]);\n\t\t\t\t\t\t});\n\t\t\t\t\t\ta.down([m]);\n\t\t\t\t\t} else a.down([m]);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn unsub;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(),\n\t\t\tmeta: { status: initialStatus, error: null },\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tresubscribable: true,\n\t\t\tinitial: src.get(),\n\t\t},\n\t);\n\n\treturn {\n\t\tnode: out,\n\t\tstatus: out.meta.status as Node<StatusValue>,\n\t\terror: out.meta.error as Node<unknown | null>,\n\t};\n}\n","/**\n * Core reactive sources, sinks, and utilities (roadmap §2.3).\n *\n * Each API returns a {@link Node} built with {@link node}, {@link producer},\n * {@link derived}, or {@link effect} — no second protocol.\n *\n * Protocol/system/ingest adapters (fromHTTP, fromWebSocket, fromKafka, etc.)\n * live in {@link ./adapters.ts}.\n */\n\nimport { existsSync, watch } from \"node:fs\";\nimport { resolve as resolvePath } from \"node:path\";\nimport { wallClockNs } from \"../core/clock.js\";\nimport { COMPLETE, DATA, ERROR, type Message } from \"../core/messages.js\";\nimport { type Node, type NodeOptions, type NodeSink, node } from \"../core/node.js\";\nimport { producer } from \"../core/sugar.js\";\nimport { type CronSchedule, matchesCron, parseCron } from \"./cron.js\";\n\ntype ExtraOpts = Omit<NodeOptions, \"describeKind\">;\n\nfunction sourceOpts(opts?: ExtraOpts): NodeOptions {\n\treturn { describeKind: \"producer\", ...opts };\n}\n\n/** @internal kept for toArray which is an operator, not a producer */\nfunction operatorOpts(opts?: ExtraOpts): NodeOptions {\n\treturn { describeKind: \"operator\", ...opts };\n}\n\n/** Options for {@link fromTimer} / {@link fromPromise} / {@link fromAsyncIter}. */\nexport type AsyncSourceOpts = ExtraOpts & { signal?: AbortSignal };\n\n/**\n * Values accepted by {@link fromAny}.\n *\n * @category extra\n */\nexport type NodeInput<T> = Node<T> | PromiseLike<T> | AsyncIterable<T> | Iterable<T> | T;\n\n/** Options for {@link fromCron}. */\nexport type FromCronOptions = ExtraOpts & {\n\t/** Polling interval in ms. Default `60_000`. */\n\ttickMs?: number;\n\t/** Output format: `\"timestamp_ns\"` (default) emits wall-clock nanoseconds; `\"date\"` emits a `Date` object. */\n\toutput?: \"timestamp_ns\" | \"date\";\n};\n\n/** DOM-style event target (browser or `node:events`). */\nexport type EventTargetLike = {\n\taddEventListener(\n\t\ttype: string,\n\t\tlistener: (ev: unknown) => void,\n\t\toptions?: boolean | { capture?: boolean; passive?: boolean; once?: boolean },\n\t): void;\n\tremoveEventListener(\n\t\ttype: string,\n\t\tlistener: (ev: unknown) => void,\n\t\toptions?: boolean | { capture?: boolean; passive?: boolean; once?: boolean },\n\t): void;\n};\n\nexport type FSEventType = \"change\" | \"rename\" | \"create\" | \"delete\";\nexport type FSEvent = {\n\ttype: FSEventType;\n\tpath: string;\n\troot: string;\n\trelative_path: string;\n\tsrc_path?: string;\n\tdest_path?: string;\n\ttimestamp_ns: number;\n};\n\nexport type FromFSWatchOptions = ExtraOpts & {\n\trecursive?: boolean;\n\tdebounce?: number;\n\tinclude?: string[];\n\texclude?: string[];\n};\n\n/** @internal Shared with adapters.ts for glob matching in fromFSWatch / fromGitHook. */\nexport function escapeRegexChar(ch: string): string {\n\treturn /[\\\\^$+?.()|[\\]{}]/.test(ch) ? `\\\\${ch}` : ch;\n}\n\n/** @internal */\nexport function globToRegExp(glob: string): RegExp {\n\tlet out = \"^\";\n\tfor (let i = 0; i < glob.length; i += 1) {\n\t\tconst ch = glob[i];\n\t\tif (ch === \"*\") {\n\t\t\tconst next = glob[i + 1];\n\t\t\tif (next === \"*\") {\n\t\t\t\tout += \".*\";\n\t\t\t\ti += 1;\n\t\t\t} else {\n\t\t\t\tout += \"[^/]*\";\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tout += escapeRegexChar(ch);\n\t}\n\tout += \"$\";\n\treturn new RegExp(out);\n}\n\n/** @internal */\nexport function matchesAnyPattern(path: string, patterns: RegExp[]): boolean {\n\tfor (const pattern of patterns) {\n\t\tif (pattern.test(path)) return true;\n\t}\n\treturn false;\n}\n\nfunction wrapSubscribeHook<T>(inner: Node<T>, before: (sink: NodeSink) => void): Node<T> {\n\tconst wrapper = node<T>([inner], ([val]) => val as T, {\n\t\tdescribeKind: \"operator\",\n\t\tinitial: inner.get(),\n\t});\n\tconst origSubscribe = wrapper.subscribe.bind(wrapper);\n\t(wrapper as { subscribe: typeof wrapper.subscribe }).subscribe = (sink, hints) => {\n\t\tbefore(sink);\n\t\treturn origSubscribe(sink, hints);\n\t};\n\treturn wrapper;\n}\n\n/**\n * Builds a timer-driven source: one-shot (first tick then `COMPLETE`) or periodic (`0`, `1`, `2`, …).\n *\n * @param ms - Milliseconds before the first emission.\n * @param opts - Producer options plus optional `period` for repeating ticks and optional `signal` (`AbortSignal`) to cancel with `ERROR`.\n * @returns `Node<number>` — tick counter from `0`; teardown clears timers.\n *\n * @example\n * ```ts\n * import { fromTimer } from \"@graphrefly/graphrefly-ts\";\n *\n * fromTimer(250, { period: 1_000 });\n * ```\n *\n * @category extra\n */\nexport function fromTimer(ms: number, opts?: AsyncSourceOpts & { period?: number }): Node<number> {\n\tconst { signal, period, ...rest } = opts ?? {};\n\treturn producer<number>((_d, a) => {\n\t\tlet done = false;\n\t\tlet count = 0;\n\t\tlet t: ReturnType<typeof setTimeout> | undefined;\n\t\tlet iv: ReturnType<typeof setInterval> | undefined;\n\t\tconst cleanup = () => {\n\t\t\tdone = true;\n\t\t\tif (t !== undefined) clearTimeout(t);\n\t\t\tif (iv !== undefined) clearInterval(iv);\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t};\n\t\tconst finish = () => {\n\t\t\tif (done) return;\n\t\t\ta.emit(count++);\n\t\t\tif (period != null) {\n\t\t\t\tiv = setInterval(() => {\n\t\t\t\t\tif (done) return;\n\t\t\t\t\ta.emit(count++);\n\t\t\t\t}, period);\n\t\t\t} else {\n\t\t\t\tdone = true;\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tqueueMicrotask(() => a.down([[COMPLETE]]));\n\t\t\t}\n\t\t};\n\t\tconst onAbort = () => {\n\t\t\tif (done) return;\n\t\t\tcleanup();\n\t\t\ta.down([[ERROR, signal!.reason]]);\n\t\t};\n\t\tif (signal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn;\n\t\t}\n\t\tt = setTimeout(finish, ms);\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\treturn cleanup;\n\t}, sourceOpts(rest));\n}\n\n/**\n * Polls on an interval; when the current minute matches a 5-field cron expression, emits once (see {@link parseCron}).\n *\n * @param expr - Cron string (`min hour dom month dow`).\n * @param opts - Producer options plus `tickMs` (default `60_000`) and `output` (`timestamp_ns` default, or `date` for `Date` values).\n * @returns `Node<number>` (nanosecond timestamp) or `Node<Date>` when `output: \"date\"`.\n *\n * @example\n * ```ts\n * import { fromCron } from \"@graphrefly/graphrefly-ts\";\n *\n * fromCron(\"0 9 * * 1\");\n * ```\n *\n * @category extra\n */\nexport function fromCron(expr: string, opts?: FromCronOptions & { output: \"date\" }): Node<Date>;\nexport function fromCron(expr: string, opts?: FromCronOptions): Node<number>;\nexport function fromCron(expr: string, opts?: FromCronOptions): Node<number | Date> {\n\tconst schedule: CronSchedule = parseCron(expr);\n\tconst { tickMs: tickOpt, output, ...rest } = opts ?? {};\n\tconst tickMs = tickOpt ?? 60_000;\n\tconst emitDate = output === \"date\";\n\treturn producer<number | Date>(\n\t\t(_d, a) => {\n\t\t\tlet lastFiredKey = -1;\n\t\t\tconst check = () => {\n\t\t\t\tconst now = new Date();\n\t\t\t\tconst key =\n\t\t\t\t\tnow.getFullYear() * 100_000_000 +\n\t\t\t\t\t(now.getMonth() + 1) * 1_000_000 +\n\t\t\t\t\tnow.getDate() * 10_000 +\n\t\t\t\t\tnow.getHours() * 100 +\n\t\t\t\t\tnow.getMinutes();\n\t\t\t\tif (key !== lastFiredKey && matchesCron(schedule, now)) {\n\t\t\t\t\tlastFiredKey = key;\n\t\t\t\t\ta.emit(emitDate ? now : wallClockNs());\n\t\t\t\t}\n\t\t\t};\n\t\t\tcheck();\n\t\t\tconst id = setInterval(check, tickMs);\n\t\t\treturn () => clearInterval(id);\n\t\t},\n\t\t{ ...sourceOpts(rest), name: rest.name ?? `cron:${expr}` },\n\t);\n}\n\n/**\n * Wraps a DOM-style `addEventListener` target; each event becomes a `DATA` emission.\n *\n * @param target - Object with `addEventListener` / `removeEventListener`.\n * @param type - Event name (e.g. `\"click\"`).\n * @param opts - Producer options plus listener options (`capture`, `passive`, `once`).\n * @returns `Node<T>` — event payloads; teardown removes the listener.\n *\n * @example\n * ```ts\n * import { fromEvent } from \"@graphrefly/graphrefly-ts\";\n *\n * fromEvent(document.body, \"click\");\n * ```\n *\n * @category extra\n */\nexport function fromEvent<T = unknown>(\n\ttarget: EventTargetLike,\n\ttype: string,\n\topts?: ExtraOpts & { capture?: boolean; passive?: boolean; once?: boolean },\n): Node<T> {\n\tconst { capture, passive, once, ...rest } = opts ?? {};\n\treturn producer<T>((_d, a) => {\n\t\tconst handler = (e: unknown) => {\n\t\t\ta.emit(e as T);\n\t\t};\n\t\tconst options = { capture, passive, once };\n\t\ttarget.addEventListener(type, handler, options);\n\t\treturn () => target.removeEventListener(type, handler, options);\n\t}, sourceOpts(rest));\n}\n\n/**\n * Watches filesystem paths and emits debounced change events.\n *\n * Uses `fs.watch` only (no polling fallback). Teardown closes all watchers.\n *\n * @category extra\n */\nexport function fromFSWatch(paths: string | string[], opts?: FromFSWatchOptions): Node<FSEvent> {\n\tconst list = Array.isArray(paths) ? paths : [paths];\n\tif (list.length === 0) {\n\t\tthrow new RangeError(\"fromFSWatch expects at least one path\");\n\t}\n\tconst { recursive = true, debounce = 100, include, exclude, ...rest } = opts ?? {};\n\tconst includePatterns = include?.map(globToRegExp) ?? [];\n\tconst excludePatterns = (exclude ?? [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\"]).map(\n\t\tglobToRegExp,\n\t);\n\treturn producer<FSEvent>((_d, a) => {\n\t\tconst pending = new Map<string, FSEvent>();\n\t\tconst watchers: ReturnType<typeof watch>[] = [];\n\t\tlet stopped = false;\n\t\tlet terminalEmitted = false;\n\t\tlet generation = 0;\n\t\tconst closeWatchers = () => {\n\t\t\tfor (const watcher of watchers.splice(0)) watcher.close();\n\t\t};\n\t\tconst emitError = (err: unknown) => {\n\t\t\tif (terminalEmitted) return;\n\t\t\tterminalEmitted = true;\n\t\t\tstopped = true;\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t\tpending.clear();\n\t\t\tcloseWatchers();\n\t\t\ta.down([[ERROR, err]]);\n\t\t};\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst flush = (token: number) => {\n\t\t\ttimer = undefined;\n\t\t\tif (stopped || terminalEmitted) return;\n\t\t\tif (pending.size === 0) return;\n\t\t\tconst batchMessages: Message[] = [];\n\t\t\tfor (const evt of pending.values()) batchMessages.push([DATA, evt]);\n\t\t\tpending.clear();\n\t\t\tif (stopped || terminalEmitted || token !== generation) return;\n\t\t\ta.down(batchMessages);\n\t\t};\n\t\ttry {\n\t\t\tfor (const basePath of list) {\n\t\t\t\tconst watcher = watch(\n\t\t\t\t\tbasePath,\n\t\t\t\t\t{ recursive },\n\t\t\t\t\t(eventType: \"rename\" | \"change\", fileName: string | Buffer | null) => {\n\t\t\t\t\t\tif (stopped || terminalEmitted) return;\n\t\t\t\t\t\tif (fileName == null) return;\n\t\t\t\t\t\tconst rel = String(fileName).replaceAll(\"\\\\\", \"/\");\n\t\t\t\t\t\tconst abs = resolvePath(basePath, String(fileName));\n\t\t\t\t\t\tconst normalized = abs.replaceAll(\"\\\\\", \"/\");\n\t\t\t\t\t\tconst root = resolvePath(basePath).replaceAll(\"\\\\\", \"/\");\n\t\t\t\t\t\tconst relForMatch = rel.startsWith(\"./\") ? rel.slice(2) : rel;\n\t\t\t\t\t\tconst included =\n\t\t\t\t\t\t\tincludePatterns.length === 0 ||\n\t\t\t\t\t\t\tmatchesAnyPattern(normalized, includePatterns) ||\n\t\t\t\t\t\t\tmatchesAnyPattern(relForMatch, includePatterns);\n\t\t\t\t\t\tif (!included) return;\n\t\t\t\t\t\tconst excluded =\n\t\t\t\t\t\t\tmatchesAnyPattern(normalized, excludePatterns) ||\n\t\t\t\t\t\t\tmatchesAnyPattern(relForMatch, excludePatterns);\n\t\t\t\t\t\tif (excluded) return;\n\t\t\t\t\t\tlet kind: FSEventType = \"change\";\n\t\t\t\t\t\tif (eventType === \"rename\") {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tkind = existsSync(normalized) ? \"create\" : \"delete\";\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\tkind = \"rename\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpending.set(normalized, {\n\t\t\t\t\t\t\ttype: kind,\n\t\t\t\t\t\t\tpath: normalized,\n\t\t\t\t\t\t\troot,\n\t\t\t\t\t\t\trelative_path: relForMatch,\n\t\t\t\t\t\t\ttimestamp_ns: wallClockNs(),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\t\t\t\tconst token = generation;\n\t\t\t\t\t\ttimer = setTimeout(() => flush(token), debounce);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\twatcher.on(\"error\", (err) => emitError(err));\n\t\t\t\twatchers.push(watcher);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\temitError(err);\n\t\t}\n\t\treturn () => {\n\t\t\tstopped = true;\n\t\t\tgeneration += 1;\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t\tcloseWatchers();\n\t\t\tpending.clear();\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/**\n * Drains a synchronous iterable; each item is `DATA`, then `COMPLETE`, or `ERROR` if iteration throws.\n *\n * @param iterable - Values to emit in order.\n * @param opts - Optional producer options.\n * @returns `Node<T>` — one emission per element.\n *\n * @example\n * ```ts\n * import { fromIter } from \"@graphrefly/graphrefly-ts\";\n *\n * fromIter([1, 2, 3]);\n * ```\n *\n * @category extra\n */\nexport function fromIter<T>(iterable: Iterable<T>, opts?: ExtraOpts): Node<T> {\n\treturn producer<T>((_d, a) => {\n\t\tlet cancelled = false;\n\t\ttry {\n\t\t\tfor (const x of iterable) {\n\t\t\t\tif (cancelled) return;\n\t\t\t\ta.emit(x);\n\t\t\t}\n\t\t\tif (!cancelled) a.down([[COMPLETE]]);\n\t\t} catch (e) {\n\t\t\tif (!cancelled) a.down([[ERROR, e]]);\n\t\t}\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, sourceOpts(opts));\n}\n\nfunction isThenable(x: unknown): x is PromiseLike<unknown> {\n\treturn x != null && typeof (x as PromiseLike<unknown>).then === \"function\";\n}\n\n/**\n * Lifts a Promise (or thenable) to a single-value stream: one `DATA` then `COMPLETE`, or `ERROR` on rejection.\n *\n * @param p - Promise to await.\n * @param opts - Producer options plus optional `signal` for abort → `ERROR` with reason.\n * @returns `Node<T>` — settles once.\n *\n * @example\n * ```ts\n * import { fromPromise } from \"@graphrefly/graphrefly-ts\";\n *\n * fromPromise(Promise.resolve(42));\n * ```\n *\n * @category extra\n */\nexport function fromPromise<T>(p: Promise<T> | PromiseLike<T>, opts?: AsyncSourceOpts): Node<T> {\n\tconst { signal, ...rest } = opts ?? {};\n\treturn producer<T>((_d, a) => {\n\t\tlet settled = false;\n\t\tconst onAbort = () => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\ta.down([[ERROR, signal!.reason]]);\n\t\t};\n\t\tif (signal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn;\n\t\t}\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tvoid Promise.resolve(p).then(\n\t\t\t(v) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\ta.emit(v as T);\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t},\n\t\t\t(e) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\ta.down([[ERROR, e]]);\n\t\t\t},\n\t\t);\n\t\treturn () => {\n\t\t\tsettled = true;\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/**\n * Reads an async iterable; each `next()` value becomes `DATA`; `COMPLETE` when done; `ERROR` on failure.\n *\n * @param iterable - Async source (`for await` shape).\n * @param opts - Producer options plus optional `signal` to abort the pump.\n * @returns `Node<T>` — async pull stream.\n *\n * @example\n * ```ts\n * import { fromAsyncIter } from \"@graphrefly/graphrefly-ts\";\n *\n * async function* gen() {\n * yield 1;\n * }\n * fromAsyncIter(gen());\n * ```\n *\n * @category extra\n */\nexport function fromAsyncIter<T>(iterable: AsyncIterable<T>, opts?: AsyncSourceOpts): Node<T> {\n\tconst { signal: outerSignal, ...rest } = opts ?? {};\n\treturn producer<T>((_d, a) => {\n\t\tconst ac = new AbortController();\n\t\tconst onOuterAbort = () => ac.abort(outerSignal?.reason);\n\t\tif (outerSignal?.aborted) {\n\t\t\tac.abort(outerSignal.reason);\n\t\t} else {\n\t\t\touterSignal?.addEventListener(\"abort\", onOuterAbort, { once: true });\n\t\t}\n\t\tconst signal = outerSignal ?? ac.signal;\n\t\tlet cancelled = false;\n\t\tconst it = iterable[Symbol.asyncIterator]();\n\t\tconst pump = (): void => {\n\t\t\tif (cancelled || signal.aborted) return;\n\t\t\tvoid Promise.resolve(it.next()).then(\n\t\t\t\t(step) => {\n\t\t\t\t\tif (cancelled || signal.aborted) return;\n\t\t\t\t\tif (step.done) {\n\t\t\t\t\t\tqueueMicrotask(() => a.down([[COMPLETE]]));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ta.emit(step.value as T);\n\t\t\t\t\tqueueMicrotask(pump);\n\t\t\t\t},\n\t\t\t\t(e) => {\n\t\t\t\t\tif (!cancelled && !signal.aborted) a.down([[ERROR, e]]);\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t\tqueueMicrotask(pump);\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t\touterSignal?.removeEventListener(\"abort\", onOuterAbort);\n\t\t\tac.abort();\n\t\t\tvoid Promise.resolve(it.return?.()).catch(() => undefined);\n\t\t};\n\t}, sourceOpts(rest));\n}\n\nfunction isNode(x: unknown): x is Node {\n\treturn (\n\t\tx != null &&\n\t\ttypeof (x as Node).subscribe === \"function\" &&\n\t\ttypeof (x as Node).get === \"function\"\n\t);\n}\n\n/**\n * Coerces a value to a `Node` by shape: existing `Node` passthrough, thenable → {@link fromPromise},\n * async iterable → {@link fromAsyncIter}, sync iterable → {@link fromIter}, else scalar → {@link of}.\n *\n * @param input - Any value to wrap.\n * @param opts - Passed through when a Promise/async path is chosen.\n * @returns `Node` of the inferred element type.\n *\n * @example\n * ```ts\n * import { fromAny, state } from \"@graphrefly/graphrefly-ts\";\n *\n * fromAny(state(1));\n * fromAny(Promise.resolve(2));\n * ```\n *\n * @category extra\n */\nexport function fromAny<T>(input: NodeInput<T>, opts?: AsyncSourceOpts): Node<T> {\n\tif (isNode(input)) {\n\t\treturn input as Node<T>;\n\t}\n\tif (isThenable(input)) {\n\t\treturn fromPromise(input as PromiseLike<T>, opts);\n\t}\n\tif (input !== null && input !== undefined) {\n\t\tconst candidate = input as { [Symbol.asyncIterator]?: unknown; [Symbol.iterator]?: unknown };\n\t\tif (typeof candidate[Symbol.asyncIterator] === \"function\") {\n\t\t\treturn fromAsyncIter(input as AsyncIterable<T>, opts);\n\t\t}\n\t\tif (typeof candidate[Symbol.iterator] === \"function\") {\n\t\t\treturn fromIter(input as Iterable<T>, opts);\n\t\t}\n\t}\n\t// scalar fallback\n\treturn of(input as T);\n}\n\n/**\n * Emits each argument as `DATA` in order, then `COMPLETE` (implemented via {@link fromIter}).\n *\n * @param values - Values to emit.\n * @returns `Node<T>` — finite sequence.\n *\n * @example\n * ```ts\n * import { of } from \"@graphrefly/graphrefly-ts\";\n *\n * of(1, 2, 3);\n * ```\n *\n * @category extra\n */\nexport function of<T>(...values: T[]): Node<T> {\n\treturn fromIter(values, undefined);\n}\n\n/**\n * Completes immediately with no `DATA` (cold `EMPTY` analogue).\n *\n * @param opts - Optional producer options.\n * @returns `Node<T>` — terminal `COMPLETE` only.\n *\n * @example\n * ```ts\n * import { empty } from \"@graphrefly/graphrefly-ts\";\n *\n * empty();\n * ```\n *\n * @category extra\n */\nexport function empty<T = never>(opts?: ExtraOpts): Node<T> {\n\treturn producer<T>((_d, a) => {\n\t\ta.down([[COMPLETE]]);\n\t\treturn undefined;\n\t}, sourceOpts(opts));\n}\n\n/**\n * Never emits and never completes until teardown (cold `NEVER` analogue).\n *\n * @param opts - Optional producer options.\n * @returns `Node<T>` — silent until unsubscribed.\n *\n * @example\n * ```ts\n * import { never } from \"@graphrefly/graphrefly-ts\";\n *\n * never();\n * ```\n *\n * @category extra\n */\nexport function never<T = never>(opts?: ExtraOpts): Node<T> {\n\treturn producer<T>(() => undefined, sourceOpts(opts));\n}\n\n/**\n * Emits `ERROR` as soon as the producer starts (cold error source).\n *\n * @param err - Error payload forwarded as `ERROR` data.\n * @param opts - Optional producer options.\n * @returns `Node<never>` — terminates with `ERROR`.\n *\n * @example\n * ```ts\n * import { throwError } from \"@graphrefly/graphrefly-ts\";\n *\n * throwError(new Error(\"fail\"));\n * ```\n *\n * @category extra\n */\nexport function throwError(err: unknown, opts?: ExtraOpts): Node<never> {\n\treturn producer<never>((_d, a) => {\n\t\ta.down([[ERROR, err]]);\n\t\treturn undefined;\n\t}, sourceOpts(opts));\n}\n\n/**\n * Subscribes immediately and runs `fn` for each upstream `DATA`; returns unsubscribe.\n *\n * @param source - Upstream node.\n * @param fn - Side effect per value.\n * @param opts - Effect node options.\n * @returns Unsubscribe function (idempotent).\n *\n * @example\n * ```ts\n * import { forEach, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const u = forEach(state(1), (v) => console.log(v));\n * u();\n * ```\n *\n * @category extra\n */\nexport function forEach<T>(source: Node<T>, fn: (value: T) => void, opts?: ExtraOpts): () => void {\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...opts,\n\t\tonMessage(msg: Message, _i, _a) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tfn(msg[1] as T);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n/**\n * Buffers every `DATA`; on upstream `COMPLETE` emits one `DATA` with the full array then `COMPLETE`.\n *\n * @param source - Upstream node.\n * @param opts - Optional node options (operator describe kind).\n * @returns `Node<T[]>` — single array emission before completion.\n *\n * @example\n * ```ts\n * import { of, toArray } from \"@graphrefly/graphrefly-ts\";\n *\n * toArray(of(1, 2, 3));\n * ```\n *\n * @category extra\n */\nexport function toArray<T>(source: Node<T>, opts?: ExtraOpts): Node<T[]> {\n\tconst acc: T[] = [];\n\treturn node<T[]>([source as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg: Message, _i, a) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tacc.push(msg[1] as T);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\ta.emit([...acc]);\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n/**\n * Multicasts upstream: one subscription to `source` while this wrapper has subscribers (via {@link producer}).\n *\n * @param source - Upstream node to share.\n * @param opts - Producer options; `initial` seeds from `source.get()` when set by factory.\n * @returns `Node<T>` — hot ref-counted bridge.\n *\n * @example\n * ```ts\n * import { share, state } from \"@graphrefly/graphrefly-ts\";\n *\n * share(state(0));\n * ```\n *\n * @category extra\n */\nexport function share<T>(source: Node<T>, opts?: ExtraOpts): Node<T> {\n\treturn producer<T>(\n\t\t(_d, a) =>\n\t\t\tsource.subscribe((msgs) => {\n\t\t\t\ta.down(msgs);\n\t\t\t}),\n\t\t{ ...sourceOpts(opts), initial: source.get() },\n\t);\n}\n\n/**\n * Like {@link share} with a bounded replay buffer: new subscribers receive the last `bufferSize`\n * `DATA` payloads (as separate batches) before live updates.\n *\n * @param source - Upstream node.\n * @param bufferSize - Maximum past values to replay (≥ 1).\n * @param opts - Producer options.\n * @returns `Node<T>` — multicast with replay on subscribe.\n *\n * @example\n * ```ts\n * import { replay, state } from \"@graphrefly/graphrefly-ts\";\n *\n * replay(state(0), 3);\n * ```\n *\n * @category extra\n */\nexport function replay<T>(source: Node<T>, bufferSize: number, opts?: ExtraOpts): Node<T> {\n\tif (bufferSize < 1) throw new RangeError(\"replay expects bufferSize >= 1\");\n\tconst buf: T[] = [];\n\tconst inner = producer<T>(\n\t\t(_d, a) =>\n\t\t\tsource.subscribe((msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === DATA) {\n\t\t\t\t\t\tbuf.push(m[1] as T);\n\t\t\t\t\t\tif (buf.length > bufferSize) buf.shift();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ta.down(msgs);\n\t\t\t}),\n\t\t{ ...sourceOpts(opts), initial: source.get() },\n\t);\n\treturn wrapSubscribeHook(inner, (sink) => {\n\t\tfor (const v of buf) {\n\t\t\tsink([[DATA, v]]);\n\t\t}\n\t});\n}\n\n/**\n * {@link replay} with `bufferSize === 1` — replays the latest `DATA` to new subscribers.\n *\n * @param source - Upstream node.\n * @param opts - Producer options.\n * @returns `Node<T>` — share + last-value replay.\n *\n * @example\n * ```ts\n * import { cached, state } from \"@graphrefly/graphrefly-ts\";\n *\n * cached(state(0));\n * ```\n *\n * @category extra\n */\nexport function cached<T>(source: Node<T>, opts?: ExtraOpts): Node<T> {\n\treturn replay(source, 1, opts);\n}\n\n/**\n * Converts the first `DATA` on `source` into a Promise; rejects on `ERROR` or `COMPLETE` without data.\n *\n * @param source - Node to read once.\n * @returns Promise of the first value.\n *\n * @example\n * ```ts\n * import { firstValueFrom, of } from \"@graphrefly/graphrefly-ts\";\n *\n * await firstValueFrom(of(42));\n * ```\n *\n * @category extra\n */\nexport function firstValueFrom<T>(source: Node<T>): Promise<T> {\n\treturn new Promise<T>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tconst unsub = source.subscribe((msgs) => {\n\t\t\tfor (const m of msgs) {\n\t\t\t\tif (settled) return;\n\t\t\t\tif (m[0] === DATA) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tresolve(m[1] as T);\n\t\t\t\t\tqueueMicrotask(() => unsub());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (m[0] === ERROR) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\treject(m[1]);\n\t\t\t\t\tqueueMicrotask(() => unsub());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (m[0] === COMPLETE) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\treject(new Error(\"completed without DATA\"));\n\t\t\t\t\tqueueMicrotask(() => unsub());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n// ——————————————————————————————————————————————————————————————\n// RxJS-compatible aliases\n// ——————————————————————————————————————————————————————————————\n\n/**\n * RxJS-named alias for {@link replay} — multicast with a replay buffer of size `bufferSize`.\n *\n * @param source - Upstream node.\n * @param bufferSize - Replay depth (≥ 1).\n * @param opts - Producer options.\n * @returns Same behavior as `replay`.\n *\n * @example\n * ```ts\n * import { shareReplay, state } from \"@graphrefly/graphrefly-ts\";\n *\n * shareReplay(state(0), 5);\n * ```\n *\n * @category extra\n */\nexport const shareReplay = replay;\n","/**\n * Minimal 5-field cron parser and matcher (minute hour day-of-month month day-of-week).\n * Ported from callbag-recharge `extra/cron.ts` for `fromCron` (roadmap §2.3).\n */\nexport interface CronSchedule {\n\tminutes: Set<number>;\n\thours: Set<number>;\n\tdaysOfMonth: Set<number>;\n\tmonths: Set<number>;\n\tdaysOfWeek: Set<number>;\n}\n\nfunction parseField(field: string, min: number, max: number): Set<number> {\n\tconst result = new Set<number>();\n\tfor (const part of field.split(\",\")) {\n\t\tconst [range, stepStr] = part.split(\"/\");\n\t\tconst step = stepStr ? Number.parseInt(stepStr, 10) : 1;\n\t\tif (Number.isNaN(step) || step < 1) throw new Error(`Invalid cron step: ${part}`);\n\t\tlet start: number;\n\t\tlet end: number;\n\t\tif (range === \"*\") {\n\t\t\tstart = min;\n\t\t\tend = max;\n\t\t} else if (range.includes(\"-\")) {\n\t\t\tconst [a, b] = range.split(\"-\");\n\t\t\tstart = Number.parseInt(a, 10);\n\t\t\tend = Number.parseInt(b, 10);\n\t\t} else {\n\t\t\tstart = Number.parseInt(range, 10);\n\t\t\tend = start;\n\t\t}\n\t\tif (Number.isNaN(start) || Number.isNaN(end)) throw new Error(`Invalid cron field: ${field}`);\n\t\tif (start < min || end > max)\n\t\t\tthrow new Error(`Cron field out of range: ${field} (${min}-${max})`);\n\t\tif (start > end) throw new Error(`Invalid cron range: ${start}-${end} in ${field}`);\n\t\tfor (let i = start; i <= end; i += step) result.add(i);\n\t}\n\treturn result;\n}\n\n/**\n * Parses a standard 5-field cron expression into a {@link CronSchedule}.\n *\n * Supports `*`, ranges (`1-5`), steps (`*\\/5`, `0-30/10`), and comma-separated\n * lists. Fields are: minute (0–59), hour (0–23), day-of-month (1–31),\n * month (1–12), day-of-week (0–6, Sunday = 0).\n *\n * @param expr - Five-field whitespace-separated cron string (e.g. `\"0 9 * * 1-5\"`).\n * @returns Parsed {@link CronSchedule} with one `Set<number>` per field.\n * @throws Error when the expression does not have exactly 5 fields, contains\n * out-of-range values, or uses an invalid step.\n *\n * @example\n * ```ts\n * import { parseCron } from \"@graphrefly/graphrefly-ts\";\n *\n * const sched = parseCron(\"0 9 * * 1-5\"); // weekdays at 09:00\n * sched.hours; // Set { 9 }\n * sched.daysOfWeek; // Set { 1, 2, 3, 4, 5 }\n * ```\n */\nexport function parseCron(expr: string): CronSchedule {\n\tconst parts = expr.trim().split(/\\s+/);\n\tif (parts.length !== 5) throw new Error(`Invalid cron: expected 5 fields, got ${parts.length}`);\n\treturn {\n\t\tminutes: parseField(parts[0], 0, 59),\n\t\thours: parseField(parts[1], 0, 23),\n\t\tdaysOfMonth: parseField(parts[2], 1, 31),\n\t\tmonths: parseField(parts[3], 1, 12),\n\t\tdaysOfWeek: parseField(parts[4], 0, 6),\n\t};\n}\n\n/**\n * Returns `true` if `date` satisfies every field of `schedule`.\n *\n * @param schedule - Parsed schedule from {@link parseCron}.\n * @param date - Moment to test (local time via `getMinutes`, `getHours`, etc.).\n * @returns `true` when all five cron fields match the given date.\n *\n * @example\n * ```ts\n * import { parseCron, matchesCron } from \"@graphrefly/graphrefly-ts\";\n *\n * const sched = parseCron(\"30 8 * * 1\"); // Mondays at 08:30\n * const monday = new Date(\"2026-03-30T08:30:00\"); // a Monday\n * matchesCron(sched, monday); // true\n * ```\n */\nexport function matchesCron(schedule: CronSchedule, date: Date): boolean {\n\treturn (\n\t\tschedule.minutes.has(date.getMinutes()) &&\n\t\tschedule.hours.has(date.getHours()) &&\n\t\tschedule.daysOfMonth.has(date.getDate()) &&\n\t\tschedule.months.has(date.getMonth() + 1) &&\n\t\tschedule.daysOfWeek.has(date.getDay())\n\t);\n}\n","/**\n * Protocol, system, and ingest adapters (roadmap §5.2, §5.2c).\n *\n * Each adapter wraps an external protocol or system as a reactive {@link Node}\n * built on {@link producer} / {@link node} — no second protocol.\n *\n * **Moved from sources.ts:** fromHTTP, fromWebSocket/toWebSocket, fromWebhook,\n * toSSE, fromMCP, fromGitHook.\n *\n * **New (5.2c):** fromOTel, fromSyslog, fromStatsD, fromPrometheus,\n * fromKafka/toKafka, fromRedisStream/toRedisStream, fromCSV, fromNDJSON,\n * fromClickHouseWatch.\n */\n\nimport { batch } from \"../core/batch.js\";\nimport { wallClockNs } from \"../core/clock.js\";\nimport { COMPLETE, DATA, DIRTY, ERROR, type Message, RESOLVED } from \"../core/messages.js\";\nimport { type Node, type NodeOptions, node } from \"../core/node.js\";\nimport { producer, state } from \"../core/sugar.js\";\nimport { NS_PER_MS, NS_PER_SEC } from \"./backoff.js\";\nimport { type WithStatusBundle, withStatus } from \"./resilience.js\";\nimport type { AsyncSourceOpts } from \"./sources.js\";\nimport { globToRegExp, matchesAnyPattern } from \"./sources.js\";\n\n/** Structured callback for sink transport failures (Kafka, Redis, etc.). */\nexport type SinkTransportError = {\n\tstage: \"serialize\" | \"send\";\n\terror: Error;\n\tvalue: unknown;\n};\n\ntype ExtraOpts = Omit<NodeOptions, \"describeKind\">;\n\nfunction sourceOpts(opts?: ExtraOpts): NodeOptions {\n\treturn { describeKind: \"producer\", ...opts };\n}\n\n// ——————————————————————————————————————————————————————————————\n// WebSocket adapter (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/** WebSocket-like transport accepted by {@link fromWebSocket} / {@link toWebSocket}. */\nexport type WebSocketLike = {\n\tsend(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;\n\tclose(code?: number, reason?: string): void;\n\taddEventListener(type: \"message\" | \"error\" | \"close\", listener: (ev: unknown) => void): void;\n\tremoveEventListener(type: \"message\" | \"error\" | \"close\", listener: (ev: unknown) => void): void;\n};\n\nexport type WebSocketMessageEventLike = { data: unknown };\nexport type WebSocketRegister<T> = (\n\temit: (payload: T) => void,\n\terror: (err: unknown) => void,\n\tcomplete: () => void,\n) => () => void;\n\n/**\n * Wraps a WebSocket as a GraphReFly producer source.\n *\n * Incoming socket messages are emitted as `DATA`; socket `error` emits `ERROR`; socket `close`\n * emits `COMPLETE`. Teardown detaches listeners and optionally closes the socket.\n *\n * @category extra\n */\nexport function fromWebSocket<T = unknown>(\n\tsocket: WebSocketLike,\n\topts?: ExtraOpts & {\n\t\tparse?: (payload: unknown, event: unknown) => T;\n\t\tcloseOnTeardown?: boolean;\n\t},\n): Node<T>;\nexport function fromWebSocket<T = unknown>(\n\tregister: WebSocketRegister<T>,\n\topts?: ExtraOpts & {\n\t\tparse?: (payload: unknown, event: unknown) => T;\n\t\tcloseOnTeardown?: boolean;\n\t},\n): Node<T>;\nexport function fromWebSocket<T = unknown>(\n\tsocketOrRegister: WebSocketLike | WebSocketRegister<T>,\n\topts?: ExtraOpts & {\n\t\tparse?: (payload: unknown, event: unknown) => T;\n\t\tcloseOnTeardown?: boolean;\n\t},\n): Node<T> {\n\tconst { parse, closeOnTeardown = false, ...rest } = opts ?? {};\n\treturn producer<T>((_d, a) => {\n\t\tlet active = true;\n\t\tlet cleanup: (() => void) | undefined;\n\t\tconst runCleanup = () => {\n\t\t\tconst fn = cleanup;\n\t\t\tcleanup = undefined;\n\t\t\tfn?.();\n\t\t};\n\t\tconst terminate = (message: Message) => {\n\t\t\tif (!active) return;\n\t\t\tactive = false;\n\t\t\ta.down([message]);\n\t\t\trunCleanup();\n\t\t};\n\t\tconst emit = (raw: unknown, event: unknown = raw) => {\n\t\t\tif (!active) return;\n\t\t\ttry {\n\t\t\t\tconst payload =\n\t\t\t\t\traw !== null && typeof raw === \"object\" && \"data\" in (raw as Record<string, unknown>)\n\t\t\t\t\t\t? (raw as WebSocketMessageEventLike).data\n\t\t\t\t\t\t: raw;\n\t\t\t\tconst parsed = parse ? parse(payload, event) : (payload as T);\n\t\t\t\ta.emit(parsed);\n\t\t\t} catch (err) {\n\t\t\t\tterminate([ERROR, err]);\n\t\t\t}\n\t\t};\n\t\tconst error = (err: unknown) => {\n\t\t\tterminate([ERROR, err]);\n\t\t};\n\t\tconst complete = () => {\n\t\t\tterminate([COMPLETE]);\n\t\t};\n\t\tif (typeof socketOrRegister === \"function\") {\n\t\t\ttry {\n\t\t\t\tcleanup = socketOrRegister(emit, error, complete);\n\t\t\t\tif (typeof cleanup !== \"function\") {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"fromWebSocket register contract violation: register must return cleanup callable\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tterminate([ERROR, err]);\n\t\t\t}\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t\trunCleanup();\n\t\t\t};\n\t\t}\n\n\t\tconst ws = socketOrRegister;\n\t\tconst onMessage = (event: unknown) => emit(event, event);\n\t\tconst onError = (event: unknown) => error(event);\n\t\tconst onClose = () => complete();\n\t\tws.addEventListener(\"message\", onMessage);\n\t\tws.addEventListener(\"error\", onError);\n\t\tws.addEventListener(\"close\", onClose);\n\t\tcleanup = () => {\n\t\t\tws.removeEventListener(\"message\", onMessage);\n\t\t\tws.removeEventListener(\"error\", onError);\n\t\t\tws.removeEventListener(\"close\", onClose);\n\t\t\tif (closeOnTeardown) ws.close();\n\t\t};\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\trunCleanup();\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n// ——————————————————————————————————————————————————————————————\n// Webhook adapter (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/** Registration callback for {@link fromWebhook}. */\nexport type WebhookRegister<T> = (handlers: {\n\t/** Push one webhook payload downstream as `[[DATA, payload]]`. */\n\temit: (payload: T) => void;\n\t/** Push terminal error as `[[ERROR, err]]`. */\n\terror: (err: unknown) => void;\n\t/** Push terminal completion as `[[COMPLETE]]`. */\n\tcomplete: () => void;\n}) => (() => void) | undefined;\n\n/**\n * Bridges HTTP webhook callbacks into a GraphReFly source.\n *\n * The `register` callback wires your runtime/framework callback to GraphReFly and may return a\n * cleanup function. This keeps the adapter runtime-agnostic while following the same producer\n * pattern as {@link fromEvent}.\n *\n * @param register - Registers webhook handlers (`emit`, `error`, `complete`) and optionally returns cleanup.\n * @param opts - Optional producer options.\n * @returns `Node<T>` — webhook payloads as `DATA`; teardown runs returned cleanup.\n *\n * @example\n * ```ts\n * import express from \"express\";\n * import { fromWebhook } from \"@graphrefly/graphrefly-ts\";\n *\n * type HookPayload = { event: string; data: unknown };\n * const app = express();\n * app.use(express.json());\n *\n * const hook$ = fromWebhook<HookPayload>(({ emit, error }) => {\n * const handler = (req: express.Request, res: express.Response) => {\n * try {\n * emit(req.body as HookPayload);\n * res.status(200).send(\"ok\");\n * } catch (e) {\n * error(e);\n * res.status(500).send(\"error\");\n * }\n * };\n * app.post(\"/webhook\", handler);\n * return () => {\n * // Express has no direct route-removal API in common use.\n * };\n * });\n * ```\n *\n * @example Fastify\n * ```ts\n * import Fastify from \"fastify\";\n * import { fromWebhook } from \"@graphrefly/graphrefly-ts\";\n *\n * const fastify = Fastify();\n * const hook$ = fromWebhook<any>(({ emit, error }) => {\n * const handler = async (req: any, reply: any) => {\n * try {\n * emit(req.body);\n * reply.code(200).send({ ok: true });\n * } catch (e) {\n * error(e);\n * reply.code(500).send({ ok: false });\n * }\n * };\n * fastify.post(\"/webhook\", handler);\n * return () => {};\n * });\n * ```\n *\n * @category extra\n */\nexport function fromWebhook<T = unknown>(register: WebhookRegister<T>, opts?: ExtraOpts): Node<T> {\n\treturn producer<T>((_d, a) => {\n\t\tlet active = true;\n\t\tconst emit = (payload: T) => {\n\t\t\tif (!active) return;\n\t\t\ta.emit(payload);\n\t\t};\n\t\tconst error = (err: unknown) => {\n\t\t\tif (!active) return;\n\t\t\tactive = false;\n\t\t\ta.down([[ERROR, err]]);\n\t\t};\n\t\tconst complete = () => {\n\t\t\tif (!active) return;\n\t\t\tactive = false;\n\t\t\ta.down([[COMPLETE]]);\n\t\t};\n\n\t\ttry {\n\t\t\tconst cleanup = register({ emit, error, complete });\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t\tcleanup?.();\n\t\t\t};\n\t\t} catch (err) {\n\t\t\terror(err);\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t};\n\t\t}\n\t}, sourceOpts(opts));\n}\n\n// ——————————————————————————————————————————————————————————————\n// HTTP adapter (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/**\n * Options for {@link fromHTTP}.\n *\n * @category extra\n */\nexport interface FromHTTPOptions extends AsyncSourceOpts {\n\t/** HTTP method. Default: `\"GET\"`. */\n\tmethod?: string;\n\t/** Request headers. */\n\theaders?: Record<string, string>;\n\t/** Request body (for POST/PUT/PATCH). */\n\tbody?: any;\n\t/** Transform the Response before emitting. Default: `response.json()`. */\n\ttransform?: (response: Response) => any | Promise<any>;\n\t/** Request timeout in **nanoseconds**. Default: `30s` (30 * NS_PER_SEC). */\n\ttimeoutNs?: number;\n}\n\n/**\n * Result of {@link fromHTTP}: main source plus status, error, and fetch count companions.\n *\n * @category extra\n */\nexport type HTTPBundle<T> = WithStatusBundle<T> & {\n\t/** Number of successful fetches. */\n\tfetchCount: Node<number>;\n\t/** Nanosecond wall-clock timestamp of the last successful fetch. */\n\tlastUpdated: Node<number>;\n};\n\n/**\n * Creates a one-shot fetch-based HTTP source with lifecycle tracking.\n *\n * @category extra\n */\nexport function fromHTTP<T = any>(url: string, opts?: FromHTTPOptions): HTTPBundle<T> {\n\tconst {\n\t\tmethod = \"GET\",\n\t\theaders,\n\t\tbody: bodyOpt,\n\t\ttransform = (r: Response) => r.json(),\n\t\ttimeoutNs = 30 * NS_PER_SEC,\n\t\tsignal: externalSignal,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst fetchCount = state(0, { name: `${rest.name ?? \"http\"}/fetchCount` });\n\tconst lastUpdated = state(0, { name: `${rest.name ?? \"http\"}/lastUpdated` });\n\n\tconst sourceNode = producer<T>((_d, a) => {\n\t\tlet active = true;\n\t\tconst abort = new AbortController();\n\n\t\tif (externalSignal?.aborted) {\n\t\t\ta.down([[ERROR, externalSignal.reason ?? new Error(\"Aborted\")]]);\n\t\t\treturn () => {};\n\t\t}\n\t\texternalSignal?.addEventListener(\"abort\", () => abort.abort(externalSignal.reason), {\n\t\t\tonce: true,\n\t\t});\n\n\t\tconst timeoutId = setTimeout(\n\t\t\t() => abort.abort(new Error(\"Request timeout\")),\n\t\t\tMath.ceil(timeoutNs / NS_PER_MS),\n\t\t);\n\n\t\tconst body =\n\t\t\tbodyOpt !== undefined\n\t\t\t\t? typeof bodyOpt === \"string\"\n\t\t\t\t\t? bodyOpt\n\t\t\t\t\t: JSON.stringify(bodyOpt)\n\t\t\t\t: undefined;\n\n\t\tfetch(url, { method, headers, body, signal: abort.signal })\n\t\t\t.then(async (res) => {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tif (!active) return;\n\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tthrow new Error(`HTTP ${res.status}: ${res.statusText}`);\n\t\t\t\t}\n\n\t\t\t\tconst data = await transform(res);\n\t\t\t\tif (!active) return;\n\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfetchCount.down([[DATA, (fetchCount.get() ?? 0) + 1]]);\n\t\t\t\t\tlastUpdated.down([[DATA, wallClockNs()]]);\n\t\t\t\t\ta.emit(data as T);\n\t\t\t\t});\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tif (!active) return;\n\t\t\t\tif (err.name === \"AbortError\") return;\n\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t});\n\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\tabort.abort();\n\t\t};\n\t}, sourceOpts(rest));\n\n\tconst tracked = withStatus(sourceNode);\n\n\treturn {\n\t\t...tracked,\n\t\tfetchCount,\n\t\tlastUpdated,\n\t};\n}\n\n// ——————————————————————————————————————————————————————————————\n// SSE sink (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/** Options for {@link toSSE}. */\nexport type ToSSEOptions = {\n\t/** Custom payload serializer for non-string payloads. Default: `JSON.stringify` fallback to `String(value)`. */\n\tserialize?: (value: unknown) => string;\n\t/** Event name for DATA tuples. Default: `\"data\"`. */\n\tdataEvent?: string;\n\t/** Event name for ERROR tuples. Default: `\"error\"`. */\n\terrorEvent?: string;\n\t/** Event name for COMPLETE tuples. Default: `\"complete\"`. */\n\tcompleteEvent?: string;\n\t/** Emit `event: resolved` when RESOLVED arrives. Default: `false`. */\n\tincludeResolved?: boolean;\n\t/** Emit `event: dirty` when DIRTY arrives. Default: `false`. */\n\tincludeDirty?: boolean;\n\t/** Add SSE comment keepalive frames (`: keepalive`) on an interval. Disabled when unset. */\n\tkeepAliveMs?: number;\n\t/** Optional abort signal to terminate the stream early. */\n\tsignal?: AbortSignal;\n\t/** Maps custom message types to SSE event names. */\n\teventNameResolver?: (type: symbol) => string;\n};\n\nfunction messageTypeLabel(t: symbol): string {\n\treturn Symbol.keyFor(t) ?? t.description ?? \"message\";\n}\n\nfunction serializeSseData(value: unknown, serialize: (value: unknown) => string): string {\n\tif (typeof value === \"string\") return value;\n\treturn serialize(value);\n}\n\nfunction sseFrame(event: string, data?: string): string {\n\tlet out = `event: ${event}\\n`;\n\tif (data !== undefined) {\n\t\tconst lines = data.split(/\\r?\\n/);\n\t\tfor (const line of lines) {\n\t\t\tout += `data: ${line}\\n`;\n\t\t}\n\t}\n\treturn `${out}\\n`;\n}\n\n/**\n * Creates a standard Server-Sent Events stream from node messages.\n *\n * @category extra\n */\nexport function toSSE<T>(source: Node<T>, opts?: ToSSEOptions): ReadableStream<Uint8Array> {\n\tconst {\n\t\tserialize = (value: unknown) => {\n\t\t\tif (value instanceof Error) return value.message;\n\t\t\ttry {\n\t\t\t\treturn JSON.stringify(value);\n\t\t\t} catch {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t},\n\t\tdataEvent = \"data\",\n\t\terrorEvent = \"error\",\n\t\tcompleteEvent = \"complete\",\n\t\tincludeResolved = false,\n\t\tincludeDirty = false,\n\t\tkeepAliveMs,\n\t\tsignal,\n\t\teventNameResolver = messageTypeLabel,\n\t} = opts ?? {};\n\tconst encoder = new TextEncoder();\n\tlet stop: (() => void) | undefined;\n\n\treturn new ReadableStream<Uint8Array>({\n\t\tstart(controller) {\n\t\t\tlet closed = false;\n\t\t\tlet keepAlive: ReturnType<typeof setInterval> | undefined;\n\t\t\tlet unsub: () => void = () => {};\n\t\t\tconst close = () => {\n\t\t\t\tif (closed) return;\n\t\t\t\tclosed = true;\n\t\t\t\tif (keepAlive !== undefined) clearInterval(keepAlive);\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tunsub();\n\t\t\t\tcontroller.close();\n\t\t\t};\n\t\t\tstop = close;\n\t\t\tconst write = (event: string, data?: string) => {\n\t\t\t\tif (closed) return;\n\t\t\t\tcontroller.enqueue(encoder.encode(sseFrame(event, data)));\n\t\t\t};\n\t\t\tconst onAbort = () => {\n\t\t\t\tif (closed) return;\n\t\t\t\tclose();\n\t\t\t};\n\t\t\tunsub = source.subscribe((msgs) => {\n\t\t\t\tfor (const msg of msgs) {\n\t\t\t\t\tconst t = msg[0];\n\t\t\t\t\tif (t === DATA) {\n\t\t\t\t\t\twrite(dataEvent, serializeSseData(msg[1], serialize));\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (t === ERROR) {\n\t\t\t\t\t\twrite(errorEvent, serializeSseData(msg[1], serialize));\n\t\t\t\t\t\tclose();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\t\twrite(completeEvent);\n\t\t\t\t\t\tclose();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (!includeResolved && t === RESOLVED) continue;\n\t\t\t\t\tif (!includeDirty && t === DIRTY) continue;\n\t\t\t\t\twrite(\n\t\t\t\t\t\teventNameResolver(t),\n\t\t\t\t\t\tmsg.length > 1 ? serializeSseData(msg[1], serialize) : undefined,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (keepAliveMs !== undefined && keepAliveMs > 0) {\n\t\t\t\tkeepAlive = setInterval(() => {\n\t\t\t\t\tif (closed) return;\n\t\t\t\t\tcontroller.enqueue(encoder.encode(\": keepalive\\n\\n\"));\n\t\t\t\t}, keepAliveMs);\n\t\t\t}\n\t\t\tif (signal?.aborted) onAbort();\n\t\t\telse signal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\t},\n\t\tcancel() {\n\t\t\tstop?.();\n\t\t},\n\t});\n}\n\n// ——————————————————————————————————————————————————————————————\n// WebSocket sink (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/** Options for {@link toWebSocket}. */\nexport type ToWebSocketOptions<T> = {\n\t/** Serialize DATA payloads before `socket.send(...)`. */\n\tserialize?: (value: T) => string | ArrayBufferLike | Blob | ArrayBufferView;\n\t/** Close socket when upstream emits COMPLETE. Default: `true`. */\n\tcloseOnComplete?: boolean;\n\t/** Close socket when upstream emits ERROR. Default: `true`. */\n\tcloseOnError?: boolean;\n\t/** Optional close code used when close is triggered by terminal tuples. */\n\tcloseCode?: number;\n\t/** Optional close reason used when close is triggered by terminal tuples. */\n\tcloseReason?: string;\n\t/** Structured callback for serialize/send/close transport failures. */\n\tonTransportError?: (event: ToWebSocketTransportError) => void;\n};\n\nexport type ToWebSocketTransportError = {\n\tstage: \"serialize\" | \"send\" | \"close\";\n\terror: Error;\n\tmessage: Message | undefined;\n};\n\n/**\n * Forwards upstream `DATA` payloads to a WebSocket via `send`.\n *\n * @category extra\n */\nexport function toWebSocket<T>(\n\tsource: Node<T>,\n\tsocket: WebSocketLike,\n\topts?: ToWebSocketOptions<T>,\n): () => void {\n\tconst {\n\t\tserialize = (value: T) => {\n\t\t\tif (\n\t\t\t\ttypeof value === \"string\" ||\n\t\t\t\tvalue instanceof Blob ||\n\t\t\t\tvalue instanceof ArrayBuffer ||\n\t\t\t\tArrayBuffer.isView(value)\n\t\t\t) {\n\t\t\t\treturn value as string | ArrayBufferLike | Blob | ArrayBufferView;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn JSON.stringify(value);\n\t\t\t} catch {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t},\n\t\tcloseOnComplete = true,\n\t\tcloseOnError = true,\n\t\tcloseCode,\n\t\tcloseReason,\n\t\tonTransportError,\n\t} = opts ?? {};\n\tlet closed = false;\n\tconst toError = (err: unknown): Error => (err instanceof Error ? err : new Error(String(err)));\n\tconst reportTransportError = (\n\t\tstage: \"serialize\" | \"send\" | \"close\",\n\t\terror: unknown,\n\t\tmessage: Message | undefined,\n\t) => {\n\t\tif (!onTransportError) return;\n\t\ttry {\n\t\t\tonTransportError({ stage, error: toError(error), message });\n\t\t} catch {\n\t\t\t/* user-provided hook should not throw into graph path */\n\t\t}\n\t};\n\tconst closeSocket = (message: Message) => {\n\t\tif (closed) return;\n\t\tclosed = true;\n\t\ttry {\n\t\t\tsocket.close(closeCode, closeReason);\n\t\t} catch (err) {\n\t\t\treportTransportError(\"close\", err, message);\n\t\t}\n\t};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tlet serialized: string | ArrayBufferLike | Blob | ArrayBufferView;\n\t\t\t\ttry {\n\t\t\t\t\tserialized = serialize(msg[1] as T);\n\t\t\t\t} catch (err) {\n\t\t\t\t\treportTransportError(\"serialize\", err, msg);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tsocket.send(serialized === undefined ? String(msg[1] as T) : serialized);\n\t\t\t\t} catch (err) {\n\t\t\t\t\treportTransportError(\"send\", err, msg);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === COMPLETE && closeOnComplete) {\n\t\t\t\tcloseSocket(msg);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === ERROR && closeOnError) {\n\t\t\t\tcloseSocket(msg);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——————————————————————————————————————————————————————————————\n// MCP adapter (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/**\n * Duck-typed MCP (Model Context Protocol) client — only the notification\n * registration surface is required so callers are not coupled to a specific SDK.\n */\nexport type MCPClientLike = {\n\tsetNotificationHandler(method: string, handler: (notification: unknown) => void): void;\n};\n\n/** Options for {@link fromMCP}. */\nexport type FromMCPOptions = ExtraOpts & {\n\t/** MCP notification method to subscribe to. Default `\"notifications/message\"`. */\n\tmethod?: string;\n\tonDisconnect?: (cb: (err?: unknown) => void) => void;\n};\n\n/**\n * Wraps an MCP client's server-push notifications as a reactive source.\n *\n * @category extra\n */\nexport function fromMCP<T = unknown>(client: MCPClientLike, opts?: FromMCPOptions): Node<T> {\n\tconst { method = \"notifications/message\", onDisconnect, ...rest } = opts ?? {};\n\treturn producer<T>((_d, a) => {\n\t\tlet active = true;\n\t\tclient.setNotificationHandler(method, (notification) => {\n\t\t\tif (!active) return;\n\t\t\ta.emit(notification as T);\n\t\t});\n\t\tif (onDisconnect) {\n\t\t\tonDisconnect((err?: unknown) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tactive = false;\n\t\t\t\ta.down([[ERROR, err ?? new Error(\"MCP client disconnected\")]]);\n\t\t\t});\n\t\t}\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\tclient.setNotificationHandler(method, () => {});\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n// ——————————————————————————————————————————————————————————————\n// Git adapter (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/** Git hook type for {@link fromGitHook}. */\nexport type GitHookType = \"post-commit\" | \"post-merge\" | \"post-checkout\" | \"post-rewrite\";\n\n/** Structured git event emitted by {@link fromGitHook}. */\nexport type GitEvent = {\n\thook: GitHookType;\n\tcommit: string;\n\tfiles: string[];\n\tmessage: string;\n\tauthor: string;\n\ttimestamp_ns: number;\n};\n\n/** Options for {@link fromGitHook}. */\nexport type FromGitHookOptions = ExtraOpts & {\n\tpollMs?: number;\n\tinclude?: string[];\n\texclude?: string[];\n};\n\n// globToRegExp, matchesAnyPattern imported from ./sources.js\n\n/**\n * Git change detection as a reactive source.\n *\n * @category extra\n */\nexport function fromGitHook(repoPath: string, opts?: FromGitHookOptions): Node<GitEvent> {\n\tconst { pollMs = 5000, include, exclude, ...rest } = opts ?? {};\n\tconst includePatterns = include?.map(globToRegExp) ?? [];\n\tconst excludePatterns = exclude?.map(globToRegExp) ?? [];\n\n\treturn producer<GitEvent>((_d, a) => {\n\t\tlet active = true;\n\t\tlet lastSeen: string;\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\n\t\tconst { execFileSync } = require(\"node:child_process\") as typeof import(\"node:child_process\");\n\n\t\tconst git = (...args: string[]): string => {\n\t\t\ttry {\n\t\t\t\treturn execFileSync(\"git\", args, { cwd: repoPath, encoding: \"utf-8\" }).trim();\n\t\t\t} catch (err) {\n\t\t\t\tif (!active) return \"\";\n\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t\tcleanup();\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t};\n\n\t\tconst cleanup = () => {\n\t\t\tactive = false;\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t};\n\n\t\tlastSeen = git(\"rev-parse\", \"HEAD\");\n\t\tif (!active) return () => {};\n\n\t\tconst schedule = () => {\n\t\t\tif (!active) return;\n\t\t\ttimer = setTimeout(check, pollMs);\n\t\t};\n\n\t\tconst check = () => {\n\t\t\tif (!active) return;\n\t\t\tconst head = git(\"rev-parse\", \"HEAD\");\n\t\t\tif (!active || !head || head === lastSeen) {\n\t\t\t\tschedule();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet files = git(\"diff\", \"--name-only\", `${lastSeen}..${head}`).split(\"\\n\").filter(Boolean);\n\t\t\tif (!active) {\n\t\t\t\tschedule();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (includePatterns.length > 0) {\n\t\t\t\tfiles = files.filter((f) => matchesAnyPattern(f, includePatterns));\n\t\t\t}\n\t\t\tif (excludePatterns.length > 0) {\n\t\t\t\tfiles = files.filter((f) => !matchesAnyPattern(f, excludePatterns));\n\t\t\t}\n\n\t\t\tconst message = git(\"log\", \"-1\", \"--format=%s\", head);\n\t\t\tif (!active) {\n\t\t\t\tschedule();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst author = git(\"log\", \"-1\", \"--format=%an\", head);\n\t\t\tif (!active) {\n\t\t\t\tschedule();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ta.emit({\n\t\t\t\thook: \"post-commit\" as GitHookType,\n\t\t\t\tcommit: head,\n\t\t\t\tfiles,\n\t\t\t\tmessage,\n\t\t\t\tauthor,\n\t\t\t\ttimestamp_ns: wallClockNs(),\n\t\t\t});\n\t\t\tlastSeen = head;\n\t\t\tschedule();\n\t\t};\n\n\t\tschedule();\n\t\treturn cleanup;\n\t}, sourceOpts(rest));\n}\n\n// ——————————————————————————————————————————————————————————————\n// 5.2c — Ingest adapters (universal source layer)\n// ——————————————————————————————————————————————————————————————\n\n// ——— Shared helpers ———\n\n/** Standard handler triple for adapters that accept injected registrations. */\nexport type AdapterHandlers<T> = {\n\temit: (payload: T) => void;\n\terror: (err: unknown) => void;\n\tcomplete: () => void;\n};\n\n// ——— OpenTelemetry (OTLP/HTTP) ———\n\n/** Structured OTel span. */\nexport type OTelSpan = {\n\ttraceId: string;\n\tspanId: string;\n\toperationName: string;\n\tserviceName: string;\n\tstartTimeNs: number;\n\tendTimeNs: number;\n\tstatus: \"OK\" | \"ERROR\" | \"UNSET\";\n\tattributes: Record<string, unknown>;\n\tevents: Array<{ name: string; timestampNs: number; attributes?: Record<string, unknown> }>;\n};\n\n/** Structured OTel metric data point. */\nexport type OTelMetric = {\n\tname: string;\n\tdescription?: string;\n\tunit?: string;\n\ttype: \"gauge\" | \"sum\" | \"histogram\" | \"summary\";\n\tvalue: number;\n\tattributes: Record<string, unknown>;\n\ttimestampNs: number;\n};\n\n/** Structured OTel log record. */\nexport type OTelLog = {\n\ttimestampNs: number;\n\tseverityNumber?: number;\n\tseverityText?: string;\n\tbody: unknown;\n\tattributes: Record<string, unknown>;\n\ttraceId?: string;\n\tspanId?: string;\n};\n\n/** Registration callback for the OTLP/HTTP receiver. */\nexport type OTelRegister = (handlers: {\n\tonTraces: (spans: OTelSpan[]) => void;\n\tonMetrics: (metrics: OTelMetric[]) => void;\n\tonLogs: (logs: OTelLog[]) => void;\n\tonError: (err: unknown) => void;\n}) => (() => void) | undefined;\n\n/** Options for {@link fromOTel}. */\nexport type FromOTelOptions = ExtraOpts & {};\n\n/** Bundle returned by {@link fromOTel}. */\nexport type OTelBundle = {\n\ttraces: Node<OTelSpan>;\n\tmetrics: Node<OTelMetric>;\n\tlogs: Node<OTelLog>;\n};\n\n/**\n * OTLP/HTTP receiver — accepts traces, metrics, and logs as separate reactive nodes.\n *\n * The caller owns the HTTP server. `fromOTel` receives a `register` callback that\n * wires OTLP POST endpoints to the three signal handlers. Each signal type gets\n * its own `Node` so downstream can subscribe selectively.\n *\n * @param register - Wires OTLP HTTP routes to `onTraces`, `onMetrics`, `onLogs` handlers.\n * @param opts - Optional producer options.\n * @returns {@link OTelBundle} — `{ traces, metrics, logs }` nodes.\n *\n * @example\n * ```ts\n * import express from \"express\";\n * import { fromOTel } from \"@graphrefly/graphrefly-ts\";\n *\n * const app = express();\n * app.use(express.json());\n *\n * const otel = fromOTel(({ onTraces, onMetrics, onLogs }) => {\n * app.post(\"/v1/traces\", (req, res) => { onTraces(req.body.resourceSpans ?? []); res.sendStatus(200); });\n * app.post(\"/v1/metrics\", (req, res) => { onMetrics(req.body.resourceMetrics ?? []); res.sendStatus(200); });\n * app.post(\"/v1/logs\", (req, res) => { onLogs(req.body.resourceLogs ?? []); res.sendStatus(200); });\n * return () => {};\n * });\n * ```\n *\n * @category extra\n */\nexport function fromOTel(register: OTelRegister, opts?: FromOTelOptions): OTelBundle {\n\tlet registerCleanup: (() => void) | undefined;\n\tlet active = true;\n\tlet teardownCount = 0;\n\n\tconst teardownOne = () => {\n\t\tteardownCount++;\n\t\tif (teardownCount >= 3 && registerCleanup) {\n\t\t\tregisterCleanup();\n\t\t\tregisterCleanup = undefined;\n\t\t}\n\t};\n\n\tconst traces = producer<OTelSpan>(\n\t\t(_d, _a) => () => {\n\t\t\tactive = false;\n\t\t\tteardownOne();\n\t\t},\n\t\tsourceOpts(opts),\n\t);\n\tconst metrics = producer<OTelMetric>(\n\t\t(_d, _a) => () => {\n\t\t\tactive = false;\n\t\t\tteardownOne();\n\t\t},\n\t\tsourceOpts(opts),\n\t);\n\tconst logs = producer<OTelLog>(\n\t\t(_d, _a) => () => {\n\t\t\tactive = false;\n\t\t\tteardownOne();\n\t\t},\n\t\tsourceOpts(opts),\n\t);\n\n\t// Wire registration — each handler batch-emits into the corresponding node.\n\tregisterCleanup =\n\t\tregister({\n\t\t\tonTraces: (spans) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const span of spans) traces.down([[DATA, span]]);\n\t\t\t\t});\n\t\t\t},\n\t\t\tonMetrics: (ms) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const m of ms) metrics.down([[DATA, m]]);\n\t\t\t\t});\n\t\t\t},\n\t\t\tonLogs: (ls) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const l of ls) logs.down([[DATA, l]]);\n\t\t\t\t});\n\t\t\t},\n\t\t\tonError: (err) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tactive = false;\n\t\t\t\ttraces.down([[ERROR, err]]);\n\t\t\t\tmetrics.down([[ERROR, err]]);\n\t\t\t\tlogs.down([[ERROR, err]]);\n\t\t\t},\n\t\t}) ?? undefined;\n\n\treturn { traces, metrics, logs };\n}\n\n// ——— Syslog (RFC 5424) ———\n\n/** Parsed syslog message (RFC 5424). */\nexport type SyslogMessage = {\n\tfacility: number;\n\tseverity: number;\n\ttimestamp: string;\n\thostname: string;\n\tappName: string;\n\tprocId: string;\n\tmsgId: string;\n\tmessage: string;\n\ttimestampNs: number;\n};\n\n/** Registration callback for syslog receiver. */\nexport type SyslogRegister = (handlers: AdapterHandlers<SyslogMessage>) => (() => void) | undefined;\n\n/** Options for {@link fromSyslog}. */\nexport type FromSyslogOptions = ExtraOpts & {};\n\n/**\n * RFC 5424 syslog receiver as a reactive source.\n *\n * The caller owns the UDP/TCP socket. `fromSyslog` receives a `register` callback\n * that wires socket data events to the `emit` handler with parsed syslog messages.\n *\n * @param register - Wires socket to emit/error/complete handlers.\n * @param opts - Optional producer options.\n * @returns `Node<SyslogMessage>` — one `DATA` per syslog message.\n *\n * @example\n * ```ts\n * import dgram from \"node:dgram\";\n * import { fromSyslog, parseSyslog } from \"@graphrefly/graphrefly-ts\";\n *\n * const server = dgram.createSocket(\"udp4\");\n * const syslog$ = fromSyslog(({ emit, error }) => {\n * server.on(\"message\", (buf) => {\n * try { emit(parseSyslog(buf.toString())); }\n * catch (e) { error(e); }\n * });\n * server.bind(514);\n * return () => server.close();\n * });\n * ```\n *\n * @category extra\n */\nexport function fromSyslog(\n\tregister: SyslogRegister,\n\topts?: FromSyslogOptions,\n): Node<SyslogMessage> {\n\treturn fromWebhook<SyslogMessage>(register as WebhookRegister<SyslogMessage>, opts);\n}\n\n/**\n * Parses a raw RFC 5424 syslog line into a structured {@link SyslogMessage}.\n *\n * Format: `<PRI>VERSION TIMESTAMP HOSTNAME APP-NAME PROCID MSGID MSG`\n *\n * @category extra\n */\nexport function parseSyslog(raw: string): SyslogMessage {\n\tconst match = raw.match(/^<(\\d{1,3})>\\d?\\s*(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s*(.*)/s);\n\tif (!match) {\n\t\tconst nowNs = wallClockNs();\n\t\treturn {\n\t\t\tfacility: 1,\n\t\t\tseverity: 6,\n\t\t\ttimestamp: new Date(Math.floor(nowNs / 1_000_000)).toISOString(),\n\t\t\thostname: \"-\",\n\t\t\tappName: \"-\",\n\t\t\tprocId: \"-\",\n\t\t\tmsgId: \"-\",\n\t\t\tmessage: raw.trim(),\n\t\t\ttimestampNs: nowNs,\n\t\t};\n\t}\n\tconst pri = Number(match[1]);\n\treturn {\n\t\tfacility: pri >> 3,\n\t\tseverity: pri & 7,\n\t\ttimestamp: match[2],\n\t\thostname: match[3],\n\t\tappName: match[4],\n\t\tprocId: match[5],\n\t\tmsgId: match[6],\n\t\tmessage: (match[7] ?? \"\").trim(),\n\t\ttimestampNs: wallClockNs(),\n\t};\n}\n\n// ——— StatsD / DogStatsD ———\n\n/** Parsed StatsD metric. */\nexport type StatsDMetric = {\n\tname: string;\n\tvalue: number;\n\ttype: \"counter\" | \"gauge\" | \"timer\" | \"histogram\" | \"set\" | \"distribution\";\n\tsampleRate?: number;\n\ttags: Record<string, string>;\n\ttimestampNs: number;\n};\n\n/** Registration callback for StatsD receiver. */\nexport type StatsDRegister = (handlers: AdapterHandlers<StatsDMetric>) => (() => void) | undefined;\n\n/** Options for {@link fromStatsD}. */\nexport type FromStatsDOptions = ExtraOpts & {};\n\n/**\n * StatsD/DogStatsD UDP receiver as a reactive source.\n *\n * The caller owns the UDP socket. `fromStatsD` receives a `register` callback\n * that wires datagrams to the `emit` handler with parsed metrics.\n *\n * @param register - Wires socket to emit/error/complete handlers.\n * @param opts - Optional producer options.\n * @returns `Node<StatsDMetric>` — one `DATA` per metric line.\n *\n * @example\n * ```ts\n * import dgram from \"node:dgram\";\n * import { fromStatsD, parseStatsD } from \"@graphrefly/graphrefly-ts\";\n *\n * const server = dgram.createSocket(\"udp4\");\n * const stats$ = fromStatsD(({ emit, error }) => {\n * server.on(\"message\", (buf) => {\n * for (const line of buf.toString().split(\"\\\\n\")) {\n * if (line.trim()) {\n * try { emit(parseStatsD(line)); }\n * catch (e) { error(e); }\n * }\n * }\n * });\n * server.bind(8125);\n * return () => server.close();\n * });\n * ```\n *\n * @category extra\n */\nexport function fromStatsD(register: StatsDRegister, opts?: FromStatsDOptions): Node<StatsDMetric> {\n\treturn fromWebhook<StatsDMetric>(register as WebhookRegister<StatsDMetric>, opts);\n}\n\nconst STATSD_TYPES: Record<string, StatsDMetric[\"type\"]> = {\n\tc: \"counter\",\n\tg: \"gauge\",\n\tms: \"timer\",\n\th: \"histogram\",\n\ts: \"set\",\n\td: \"distribution\",\n};\n\n/**\n * Parses a raw StatsD/DogStatsD line into a structured {@link StatsDMetric}.\n *\n * Format: `metric.name:value|type|@sampleRate|#tag1:val1,tag2:val2`\n *\n * @category extra\n */\nexport function parseStatsD(line: string): StatsDMetric {\n\tconst parts = line.split(\"|\");\n\tconst [name, valueStr] = (parts[0] ?? \"\").split(\":\");\n\tif (!name || valueStr === undefined) {\n\t\tthrow new Error(`Invalid StatsD line: ${line}`);\n\t}\n\tconst typeCode = parts[1]?.trim() ?? \"c\";\n\tconst type = STATSD_TYPES[typeCode] ?? \"counter\";\n\t// Set type uses string identifiers (e.g. unique user IDs), not numeric values.\n\tconst value = type === \"set\" ? 0 : Number(valueStr);\n\n\tlet sampleRate: number | undefined;\n\tconst tags: Record<string, string> = {};\n\n\tfor (let i = 2; i < parts.length; i++) {\n\t\tconst part = parts[i].trim();\n\t\tif (part.startsWith(\"@\")) {\n\t\t\tsampleRate = Number(part.slice(1));\n\t\t} else if (part.startsWith(\"#\")) {\n\t\t\tfor (const tag of part.slice(1).split(\",\")) {\n\t\t\t\tconst [k, v] = tag.split(\":\");\n\t\t\t\tif (k) tags[k] = v ?? \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { name: name.trim(), value, type, sampleRate, tags, timestampNs: wallClockNs() };\n}\n\n// ——— Prometheus scrape ———\n\n/** Parsed Prometheus metric. */\nexport type PrometheusMetric = {\n\tname: string;\n\tlabels: Record<string, string>;\n\tvalue: number;\n\ttimestampMs?: number;\n\ttype?: \"counter\" | \"gauge\" | \"histogram\" | \"summary\" | \"untyped\";\n\thelp?: string;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromPrometheus}. */\nexport type FromPrometheusOptions = AsyncSourceOpts & {\n\t/** Scrape interval in nanoseconds. Default `15 * NS_PER_SEC` (15s). */\n\tintervalNs?: number;\n\t/** Request headers for the scrape. */\n\theaders?: Record<string, string>;\n\t/** Request timeout in nanoseconds. Default `10 * NS_PER_SEC` (10s). */\n\ttimeoutNs?: number;\n};\n\n/**\n * Scrapes a Prometheus `/metrics` endpoint on a reactive timer interval.\n *\n * Each scrape parses the exposition format and emits one `DATA` per metric line.\n * Uses `fromTimer` semantics internally (reactive timer source, not polling).\n *\n * @param endpoint - URL of the Prometheus metrics endpoint.\n * @param opts - Scrape interval, headers, timeout.\n * @returns `Node<PrometheusMetric>` — one `DATA` per metric per scrape.\n *\n * @example\n * ```ts\n * import { fromPrometheus } from \"@graphrefly/graphrefly-ts\";\n *\n * const prom$ = fromPrometheus(\"http://localhost:9090/metrics\", { intervalNs: 30 * NS_PER_SEC });\n * ```\n *\n * @category extra\n */\nexport function fromPrometheus(\n\tendpoint: string,\n\topts?: FromPrometheusOptions,\n): Node<PrometheusMetric> {\n\tconst {\n\t\tintervalNs = 15 * NS_PER_SEC,\n\t\theaders,\n\t\ttimeoutNs = 10 * NS_PER_SEC,\n\t\tsignal: externalSignal,\n\t\t...rest\n\t} = opts ?? {};\n\tconst intervalMs = Math.ceil(intervalNs / NS_PER_MS);\n\n\treturn producer<PrometheusMetric>((_d, a) => {\n\t\tlet active = true;\n\t\tlet running = false;\n\t\tlet timer: ReturnType<typeof setInterval> | undefined;\n\n\t\tconst cleanup = () => {\n\t\t\tactive = false;\n\t\t\tif (timer !== undefined) {\n\t\t\t\tclearInterval(timer);\n\t\t\t\ttimer = undefined;\n\t\t\t}\n\t\t};\n\n\t\tconst scrape = async () => {\n\t\t\tif (!active || running) return;\n\t\t\trunning = true;\n\t\t\tconst abort = new AbortController();\n\t\t\tconst timeoutId = setTimeout(\n\t\t\t\t() => abort.abort(new Error(\"Scrape timeout\")),\n\t\t\t\tMath.ceil(timeoutNs / NS_PER_MS),\n\t\t\t);\n\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(endpoint, {\n\t\t\t\t\theaders: { Accept: \"text/plain\", ...headers },\n\t\t\t\t\tsignal: abort.signal,\n\t\t\t\t});\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tif (!active) return;\n\t\t\t\tif (!res.ok) throw new Error(`Prometheus scrape ${res.status}: ${res.statusText}`);\n\n\t\t\t\tconst text = await res.text();\n\t\t\t\tif (!active) return;\n\n\t\t\t\tconst metrics = parsePrometheusText(text);\n\t\t\t\tfor (const m of metrics) a.emit(m);\n\t\t\t} catch (err) {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tif (!active) return;\n\t\t\t\tif (err instanceof Error && err.name === \"AbortError\") return;\n\t\t\t\tcleanup();\n\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t} finally {\n\t\t\t\trunning = false;\n\t\t\t}\n\t\t};\n\n\t\tconst onAbort = () => {\n\t\t\tif (!active) return;\n\t\t\tcleanup();\n\t\t\ta.down([[ERROR, externalSignal?.reason ?? new Error(\"Aborted\")]]);\n\t\t};\n\n\t\tif (externalSignal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn () => {};\n\t\t}\n\t\texternalSignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t// Initial scrape + periodic.\n\t\tvoid scrape();\n\t\ttimer = setInterval(() => void scrape(), intervalMs);\n\n\t\treturn () => {\n\t\t\tcleanup();\n\t\t\texternalSignal?.removeEventListener(\"abort\", onAbort);\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/**\n * Parses Prometheus exposition format text into structured metrics.\n *\n * @category extra\n */\nexport function parsePrometheusText(text: string): PrometheusMetric[] {\n\tconst results: PrometheusMetric[] = [];\n\tconst types = new Map<string, string>();\n\tconst helps = new Map<string, string>();\n\n\tfor (const rawLine of text.split(\"\\n\")) {\n\t\tconst line = rawLine.trim();\n\t\tif (!line) continue;\n\n\t\tif (line.startsWith(\"# TYPE \")) {\n\t\t\tconst rest = line.slice(7);\n\t\t\tconst spaceIdx = rest.indexOf(\" \");\n\t\t\tif (spaceIdx > 0) {\n\t\t\t\ttypes.set(rest.slice(0, spaceIdx), rest.slice(spaceIdx + 1).trim());\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (line.startsWith(\"# HELP \")) {\n\t\t\tconst rest = line.slice(7);\n\t\t\tconst spaceIdx = rest.indexOf(\" \");\n\t\t\tif (spaceIdx > 0) {\n\t\t\t\thelps.set(rest.slice(0, spaceIdx), rest.slice(spaceIdx + 1).trim());\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (line.startsWith(\"#\")) continue;\n\n\t\t// metric_name{label=\"value\"} 123 timestamp?\n\t\tlet name: string;\n\t\tlet labels: Record<string, string> = {};\n\t\tlet valueStr: string;\n\t\tlet tsStr: string | undefined;\n\n\t\tconst braceIdx = line.indexOf(\"{\");\n\t\tif (braceIdx >= 0) {\n\t\t\tname = line.slice(0, braceIdx);\n\t\t\tconst closeBrace = line.indexOf(\"}\", braceIdx);\n\t\t\tif (closeBrace < 0) continue;\n\t\t\tconst labelStr = line.slice(braceIdx + 1, closeBrace);\n\t\t\tlabels = parsePrometheusLabels(labelStr);\n\t\t\tconst after = line\n\t\t\t\t.slice(closeBrace + 1)\n\t\t\t\t.trim()\n\t\t\t\t.split(/\\s+/);\n\t\t\tvalueStr = after[0] ?? \"\";\n\t\t\ttsStr = after[1];\n\t\t} else {\n\t\t\tconst parts = line.split(/\\s+/);\n\t\t\tname = parts[0] ?? \"\";\n\t\t\tvalueStr = parts[1] ?? \"\";\n\t\t\ttsStr = parts[2];\n\t\t}\n\n\t\tif (!name || !valueStr) continue;\n\n\t\tconst baseName = name.replace(/(_total|_count|_sum|_bucket|_created|_info)$/, \"\");\n\t\tresults.push({\n\t\t\tname,\n\t\t\tlabels,\n\t\t\tvalue: Number(valueStr),\n\t\t\ttimestampMs: tsStr ? Number(tsStr) : undefined,\n\t\t\ttype: (types.get(baseName) ?? types.get(name)) as PrometheusMetric[\"type\"],\n\t\t\thelp: helps.get(baseName) ?? helps.get(name),\n\t\t\ttimestampNs: wallClockNs(),\n\t\t});\n\t}\n\n\treturn results;\n}\n\nfunction parsePrometheusLabels(str: string): Record<string, string> {\n\tconst labels: Record<string, string> = {};\n\tconst re = /(\\w+)=\"((?:[^\"\\\\]|\\\\.)*)\"/g;\n\tlet m: RegExpExecArray | null = re.exec(str);\n\twhile (m !== null) {\n\t\tlabels[m[1]] = m[2].replace(/\\\\(.)/g, \"$1\");\n\t\tm = re.exec(str);\n\t}\n\treturn labels;\n}\n\n// ——— Kafka ———\n\n/** Duck-typed Kafka consumer (compatible with kafkajs, confluent-kafka, Pulsar KoP). */\nexport type KafkaConsumerLike = {\n\tsubscribe(opts: { topic: string; fromBeginning?: boolean }): Promise<void>;\n\trun(opts: {\n\t\teachMessage: (payload: {\n\t\t\ttopic: string;\n\t\t\tpartition: number;\n\t\t\tmessage: {\n\t\t\t\tkey: Buffer | null;\n\t\t\t\tvalue: Buffer | null;\n\t\t\t\theaders?: Record<string, Buffer | string | undefined>;\n\t\t\t\toffset: string;\n\t\t\t\ttimestamp: string;\n\t\t\t};\n\t\t}) => Promise<void>;\n\t}): Promise<void>;\n\tdisconnect(): Promise<void>;\n};\n\n/** Duck-typed Kafka producer. */\nexport type KafkaProducerLike = {\n\tsend(record: {\n\t\ttopic: string;\n\t\tmessages: Array<{\n\t\t\tkey?: string | Buffer | null;\n\t\t\tvalue: string | Buffer | null;\n\t\t\theaders?: Record<string, string | Buffer>;\n\t\t}>;\n\t}): Promise<void>;\n\tdisconnect(): Promise<void>;\n};\n\n/** Structured Kafka message. */\nexport type KafkaMessage<T = unknown> = {\n\ttopic: string;\n\tpartition: number;\n\tkey: string | null;\n\tvalue: T;\n\theaders: Record<string, string>;\n\toffset: string;\n\ttimestamp: string;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromKafka}. */\nexport type FromKafkaOptions = ExtraOpts & {\n\t/** Start from beginning of topic. Default: `false`. */\n\tfromBeginning?: boolean;\n\t/** Deserialize message value. Default: `JSON.parse(buffer.toString())`. */\n\tdeserialize?: (value: Buffer | null) => unknown;\n};\n\n/**\n * Kafka consumer as a reactive source.\n *\n * Wraps a KafkaJS-compatible consumer. Each message becomes a `DATA` emission.\n * Compatible with Pulsar via KoP (Kafka-on-Pulsar).\n *\n * @param consumer - KafkaJS-compatible consumer instance (caller owns connect/disconnect lifecycle).\n * @param topic - Topic to consume from.\n * @param opts - Deserialization and source options.\n * @returns `Node<KafkaMessage<T>>` — one `DATA` per Kafka message.\n *\n * @example\n * ```ts\n * import { Kafka } from \"kafkajs\";\n * import { fromKafka } from \"@graphrefly/graphrefly-ts\";\n *\n * const kafka = new Kafka({ brokers: [\"localhost:9092\"] });\n * const consumer = kafka.consumer({ groupId: \"my-group\" });\n * await consumer.connect();\n *\n * const events$ = fromKafka(consumer, \"events\", { deserialize: (buf) => JSON.parse(buf!.toString()) });\n * ```\n *\n * @category extra\n */\nexport function fromKafka<T = unknown>(\n\tconsumer: KafkaConsumerLike,\n\ttopic: string,\n\topts?: FromKafkaOptions,\n): Node<KafkaMessage<T>> {\n\tconst {\n\t\tfromBeginning = false,\n\t\tdeserialize = (buf: Buffer | null) => {\n\t\t\tif (buf === null) return null;\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(buf.toString());\n\t\t\t} catch {\n\t\t\t\treturn buf.toString();\n\t\t\t}\n\t\t},\n\t\t...rest\n\t} = opts ?? {};\n\n\treturn producer<KafkaMessage<T>>((_d, a) => {\n\t\tlet active = true;\n\n\t\tconst start = async () => {\n\t\t\ttry {\n\t\t\t\tawait consumer.subscribe({ topic, fromBeginning });\n\t\t\t\tawait consumer.run({\n\t\t\t\t\teachMessage: async ({ topic: t, partition, message: msg }) => {\n\t\t\t\t\t\tif (!active) return;\n\t\t\t\t\t\tconst headers: Record<string, string> = {};\n\t\t\t\t\t\tif (msg.headers) {\n\t\t\t\t\t\t\tfor (const [k, v] of Object.entries(msg.headers)) {\n\t\t\t\t\t\t\t\tif (v !== undefined) headers[k] = typeof v === \"string\" ? v : v.toString();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\ta.emit({\n\t\t\t\t\t\t\ttopic: t,\n\t\t\t\t\t\t\tpartition,\n\t\t\t\t\t\t\tkey: msg.key?.toString() ?? null,\n\t\t\t\t\t\t\tvalue: deserialize(msg.value) as T,\n\t\t\t\t\t\t\theaders,\n\t\t\t\t\t\t\toffset: msg.offset,\n\t\t\t\t\t\t\ttimestamp: msg.timestamp,\n\t\t\t\t\t\t\ttimestampNs: wallClockNs(),\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tif (active) a.down([[ERROR, err]]);\n\t\t\t}\n\t\t};\n\n\t\tvoid start();\n\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/** Options for {@link toKafka}. */\nexport type ToKafkaOptions<T> = ExtraOpts & {\n\t/** Serialize value for Kafka. Default: `JSON.stringify`. */\n\tserialize?: (value: T) => string | Buffer;\n\t/** Extract message key from value. Default: `null` (no key). */\n\tkeyExtractor?: (value: T) => string | null;\n\t/** Called on serialization or send failures. */\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * Kafka producer sink — forwards upstream `DATA` to a Kafka topic.\n *\n * @param source - Upstream node to forward.\n * @param kafkaProducer - KafkaJS-compatible producer instance.\n * @param topic - Target topic.\n * @param opts - Serialization and key extraction options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toKafka<T>(\n\tsource: Node<T>,\n\tkafkaProducer: KafkaProducerLike,\n\ttopic: string,\n\topts?: ToKafkaOptions<T>,\n): () => void {\n\tconst {\n\t\tserialize = (v: T) => JSON.stringify(v),\n\t\tkeyExtractor,\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tconst key = keyExtractor?.(value) ?? null;\n\t\t\t\tlet serialized: string | Buffer;\n\t\t\t\ttry {\n\t\t\t\t\tserialized = serialize(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tvoid kafkaProducer\n\t\t\t\t\t.send({\n\t\t\t\t\t\ttopic,\n\t\t\t\t\t\tmessages: [{ key, value: Buffer.from(serialized as string) }],\n\t\t\t\t\t})\n\t\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— Redis Streams ———\n\n/** Duck-typed Redis client (compatible with ioredis, redis). */\nexport type RedisClientLike = {\n\txadd(key: string, id: string, ...fieldsAndValues: string[]): Promise<string>;\n\txread(\n\t\t...args: Array<string | number>\n\t): Promise<Array<[string, Array<[string, string[]]>]> | null>;\n\tdisconnect(): void;\n};\n\n/** Structured Redis Stream entry. */\nexport type RedisStreamEntry<T = unknown> = {\n\tid: string;\n\tkey: string;\n\tdata: T;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromRedisStream}. */\nexport type FromRedisStreamOptions = ExtraOpts & {\n\t/** Block timeout in ms for XREAD. Default: `5000`. */\n\tblockMs?: number;\n\t/** Start ID. Default: `\"$\"` (new entries only). */\n\tstartId?: string;\n\t/** Parse raw Redis hash fields to structured data. Default: parses `data` field as JSON. */\n\tparse?: (fields: string[]) => unknown;\n};\n\n/**\n * Redis Streams consumer as a reactive source.\n *\n * Uses XREAD with BLOCK to reactively consume stream entries.\n *\n * @param client - ioredis/redis-compatible client (caller owns connection).\n * @param key - Redis stream key.\n * @param opts - Block timeout, start ID, and parsing options.\n * @returns `Node<RedisStreamEntry<T>>` — one `DATA` per stream entry.\n *\n * @category extra\n */\nexport function fromRedisStream<T = unknown>(\n\tclient: RedisClientLike,\n\tkey: string,\n\topts?: FromRedisStreamOptions,\n): Node<RedisStreamEntry<T>> {\n\tconst {\n\t\tblockMs = 5000,\n\t\tstartId = \"$\",\n\t\tparse = (fields: string[]) => {\n\t\t\t// Redis returns flat [field, value, field, value, ...] arrays.\n\t\t\tfor (let i = 0; i < fields.length; i += 2) {\n\t\t\t\tif (fields[i] === \"data\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn JSON.parse(fields[i + 1]);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn fields[i + 1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Return as object if no \"data\" field.\n\t\t\tconst obj: Record<string, string> = {};\n\t\t\tfor (let i = 0; i < fields.length; i += 2) {\n\t\t\t\tobj[fields[i]] = fields[i + 1];\n\t\t\t}\n\t\t\treturn obj;\n\t\t},\n\t\t...rest\n\t} = opts ?? {};\n\n\treturn producer<RedisStreamEntry<T>>((_d, a) => {\n\t\tlet active = true;\n\t\tlet lastId = startId;\n\n\t\tconst poll = async () => {\n\t\t\twhile (active) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await client.xread(\"BLOCK\", blockMs, \"STREAMS\", key, lastId);\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\tif (result) {\n\t\t\t\t\t\tfor (const [_streamKey, entries] of result) {\n\t\t\t\t\t\t\tfor (const [id, fields] of entries) {\n\t\t\t\t\t\t\t\tlastId = id;\n\t\t\t\t\t\t\t\ta.emit({\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\t\t\tdata: parse(fields) as T,\n\t\t\t\t\t\t\t\t\ttimestampNs: wallClockNs(),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvoid poll();\n\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/** Options for {@link toRedisStream}. */\nexport type ToRedisStreamOptions<T> = ExtraOpts & {\n\t/** Serialize value to Redis hash fields. Default: `[\"data\", JSON.stringify(value)]`. */\n\tserialize?: (value: T) => string[];\n\t/** Max stream length (MAXLEN ~). Default: no trimming. */\n\tmaxLen?: number;\n\t/** Called on serialization or send failures. */\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * Redis Streams producer sink — forwards upstream `DATA` to a Redis stream.\n *\n * @param source - Upstream node to forward.\n * @param client - ioredis/redis-compatible client.\n * @param key - Redis stream key.\n * @param opts - Serialization options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toRedisStream<T>(\n\tsource: Node<T>,\n\tclient: RedisClientLike,\n\tkey: string,\n\topts?: ToRedisStreamOptions<T>,\n): () => void {\n\tconst {\n\t\tserialize = (v: T) => [\"data\", JSON.stringify(v)],\n\t\tmaxLen,\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet fields: string[];\n\t\t\t\ttry {\n\t\t\t\t\tfields = serialize(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tconst send =\n\t\t\t\t\tmaxLen !== undefined\n\t\t\t\t\t\t? client.xadd(key, \"MAXLEN\", \"~\", String(maxLen), \"*\", ...fields)\n\t\t\t\t\t\t: client.xadd(key, \"*\", ...fields);\n\t\t\t\tvoid send.catch((err: unknown) => {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— CSV ingest ———\n\n/** Parsed CSV row. */\nexport type CSVRow = Record<string, string>;\n\n/** Options for {@link fromCSV}. */\nexport type FromCSVOptions = ExtraOpts & {\n\t/** Column delimiter. Default: `\",\"`. */\n\tdelimiter?: string;\n\t/** Whether the first row is a header. Default: `true`. */\n\thasHeader?: boolean;\n\t/** Explicit column names (overrides header row). */\n\tcolumns?: string[];\n\t/** Custom line parser (e.g. wrapping a library like `csv-parse`). Overrides built-in parser + delimiter. */\n\tparseLine?: (line: string) => string[];\n};\n\n/**\n * CSV file/stream ingest for batch replay.\n *\n * Reads a CSV from a `ReadableStream<string>` or an `AsyncIterable<string>` of lines,\n * emitting one `DATA` per row. `COMPLETE` after all rows are emitted.\n *\n * @param source - Async iterable of CSV text chunks (lines or multi-line chunks).\n * @param opts - Delimiter, header, and column options.\n * @returns `Node<CSVRow>` — one `DATA` per parsed row.\n *\n * @example\n * ```ts\n * import { createReadStream } from \"node:fs\";\n * import { fromCSV } from \"@graphrefly/graphrefly-ts\";\n *\n * const csv$ = fromCSV(createReadStream(\"data.csv\", \"utf-8\"));\n * ```\n *\n * @category extra\n */\nexport function fromCSV(source: AsyncIterable<string>, opts?: FromCSVOptions): Node<CSVRow> {\n\tconst {\n\t\tdelimiter = \",\",\n\t\thasHeader = true,\n\t\tcolumns: explicitColumns,\n\t\tparseLine,\n\t\t...rest\n\t} = opts ?? {};\n\tconst parse = parseLine ?? ((line: string) => parseCSVLine(line, delimiter));\n\n\treturn producer<CSVRow>((_d, a) => {\n\t\tlet cancelled = false;\n\n\t\tconst run = async () => {\n\t\t\ttry {\n\t\t\t\tlet headers: string[] | undefined = explicitColumns;\n\t\t\t\tlet buffer = \"\";\n\n\t\t\t\tfor await (const chunk of source) {\n\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\tbuffer += chunk;\n\n\t\t\t\t\tconst lines = buffer.split(/\\r?\\n/);\n\t\t\t\t\t// Keep last partial line in buffer.\n\t\t\t\t\tbuffer = lines.pop() ?? \"\";\n\n\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\t\tif (!line.trim()) continue;\n\n\t\t\t\t\t\tconst values = parse(line);\n\n\t\t\t\t\t\tif (!headers && hasHeader) {\n\t\t\t\t\t\t\theaders = values;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!headers) {\n\t\t\t\t\t\t\theaders = values.map((_, i) => `col${i}`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst row: CSVRow = {};\n\t\t\t\t\t\tfor (let i = 0; i < headers.length; i++) {\n\t\t\t\t\t\t\trow[headers[i]] = values[i] ?? \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\ta.emit(row);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Process remaining buffer.\n\t\t\t\tif (!cancelled && buffer.trim()) {\n\t\t\t\t\tconst values = parse(buffer);\n\t\t\t\t\tif (headers) {\n\t\t\t\t\t\tconst row: CSVRow = {};\n\t\t\t\t\t\tfor (let i = 0; i < headers.length; i++) {\n\t\t\t\t\t\t\trow[headers[i]] = values[i] ?? \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\ta.emit(row);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!cancelled) a.down([[COMPLETE]]);\n\t\t\t} catch (err) {\n\t\t\t\tif (!cancelled) a.down([[ERROR, err]]);\n\t\t\t}\n\t\t};\n\n\t\tvoid run();\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, sourceOpts(rest));\n}\n\nfunction parseCSVLine(line: string, delimiter: string): string[] {\n\tconst values: string[] = [];\n\tlet current = \"\";\n\tlet inQuotes = false;\n\n\tfor (let i = 0; i < line.length; i++) {\n\t\tconst ch = line[i];\n\t\tif (inQuotes) {\n\t\t\tif (ch === '\"') {\n\t\t\t\tif (line[i + 1] === '\"') {\n\t\t\t\t\tcurrent += '\"';\n\t\t\t\t\ti++;\n\t\t\t\t} else {\n\t\t\t\t\tinQuotes = false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcurrent += ch;\n\t\t\t}\n\t\t} else if (ch === '\"') {\n\t\t\tinQuotes = true;\n\t\t} else if (ch === delimiter) {\n\t\t\tvalues.push(current);\n\t\t\tcurrent = \"\";\n\t\t} else {\n\t\t\tcurrent += ch;\n\t\t}\n\t}\n\tvalues.push(current);\n\treturn values;\n}\n\n// ——— NDJSON ingest ———\n\n/** Options for {@link fromNDJSON}. */\nexport type FromNDJSONOptions = ExtraOpts & {};\n\n/**\n * Newline-delimited JSON stream ingest for batch replay.\n *\n * Reads an async iterable of text chunks, splits by newline, parses each line\n * as JSON, and emits one `DATA` per parsed object. `COMPLETE` after stream ends.\n *\n * @param source - Async iterable of NDJSON text chunks.\n * @param opts - Optional producer options.\n * @returns `Node<T>` — one `DATA` per JSON line.\n *\n * @example\n * ```ts\n * import { createReadStream } from \"node:fs\";\n * import { fromNDJSON } from \"@graphrefly/graphrefly-ts\";\n *\n * const logs$ = fromNDJSON(createReadStream(\"logs.ndjson\", \"utf-8\"));\n * ```\n *\n * @category extra\n */\nexport function fromNDJSON<T = unknown>(\n\tsource: AsyncIterable<string>,\n\topts?: FromNDJSONOptions,\n): Node<T> {\n\treturn producer<T>((_d, a) => {\n\t\tlet cancelled = false;\n\n\t\tconst run = async () => {\n\t\t\ttry {\n\t\t\t\tlet buffer = \"\";\n\n\t\t\t\tfor await (const chunk of source) {\n\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\tbuffer += chunk;\n\n\t\t\t\t\tconst lines = buffer.split(/\\r?\\n/);\n\t\t\t\t\tbuffer = lines.pop() ?? \"\";\n\n\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\t\tconst trimmed = line.trim();\n\t\t\t\t\t\tif (!trimmed) continue;\n\t\t\t\t\t\ta.emit(JSON.parse(trimmed) as T);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Process remaining buffer.\n\t\t\t\tif (!cancelled && buffer.trim()) {\n\t\t\t\t\ta.emit(JSON.parse(buffer.trim()) as T);\n\t\t\t\t}\n\n\t\t\t\tif (!cancelled) a.down([[COMPLETE]]);\n\t\t\t} catch (err) {\n\t\t\t\tif (!cancelled) a.down([[ERROR, err]]);\n\t\t\t}\n\t\t};\n\n\t\tvoid run();\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, sourceOpts(opts));\n}\n\n// ——— ClickHouse live materialized view ———\n\n/** Structured ClickHouse query result row. */\nexport type ClickHouseRow = Record<string, unknown>;\n\n/** Duck-typed ClickHouse client. */\nexport type ClickHouseClientLike = {\n\tquery(opts: { query: string; format?: string }): Promise<{\n\t\tjson<T = unknown>(): Promise<T[]>;\n\t}>;\n};\n\n/** Options for {@link fromClickHouseWatch}. */\nexport type FromClickHouseWatchOptions = AsyncSourceOpts & {\n\t/** Polling interval in nanoseconds. Default: `5 * NS_PER_SEC` (5s). */\n\tintervalNs?: number;\n\t/** JSON format to request. Default: `\"JSONEachRow\"`. */\n\tformat?: string;\n};\n\n/**\n * ClickHouse live materialized view as a reactive source.\n *\n * Polls a ClickHouse query on a reactive timer interval and emits new/changed rows.\n * Uses a timer-driven approach (not busy-wait polling).\n *\n * @param client - ClickHouse client instance (caller owns connection).\n * @param query - SQL query to execute on each interval.\n * @param opts - Polling interval and format options.\n * @returns `Node<ClickHouseRow>` — one `DATA` per result row per scrape.\n *\n * @example\n * ```ts\n * import { createClient } from \"@clickhouse/client\";\n * import { fromClickHouseWatch } from \"@graphrefly/graphrefly-ts\";\n *\n * const client = createClient({ url: \"http://localhost:8123\" });\n * const rows$ = fromClickHouseWatch(client, \"SELECT * FROM errors_mv ORDER BY timestamp DESC LIMIT 100\");\n * ```\n *\n * @category extra\n */\nexport function fromClickHouseWatch(\n\tclient: ClickHouseClientLike,\n\tquery: string,\n\topts?: FromClickHouseWatchOptions,\n): Node<ClickHouseRow> {\n\tconst {\n\t\tintervalNs = 5 * NS_PER_SEC,\n\t\tformat = \"JSONEachRow\",\n\t\tsignal: externalSignal,\n\t\t...rest\n\t} = opts ?? {};\n\tconst intervalMs = Math.ceil(intervalNs / NS_PER_MS);\n\n\treturn producer<ClickHouseRow>((_d, a) => {\n\t\tlet active = true;\n\t\tlet running = false;\n\t\tlet timer: ReturnType<typeof setInterval> | undefined;\n\n\t\tconst cleanup = () => {\n\t\t\tactive = false;\n\t\t\tif (timer !== undefined) {\n\t\t\t\tclearInterval(timer);\n\t\t\t\ttimer = undefined;\n\t\t\t}\n\t\t};\n\n\t\tconst execute = async () => {\n\t\t\tif (!active || running) return;\n\t\t\trunning = true;\n\t\t\ttry {\n\t\t\t\tconst result = await client.query({ query, format });\n\t\t\t\tif (!active) return;\n\t\t\t\tconst rows = await result.json<ClickHouseRow>();\n\t\t\t\tif (!active) return;\n\t\t\t\tfor (const row of rows) a.emit(row);\n\t\t\t} catch (err) {\n\t\t\t\tif (!active) return;\n\t\t\t\tcleanup();\n\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t} finally {\n\t\t\t\trunning = false;\n\t\t\t}\n\t\t};\n\n\t\tconst onAbort = () => {\n\t\t\tif (!active) return;\n\t\t\tcleanup();\n\t\t\ta.down([[ERROR, externalSignal?.reason ?? new Error(\"Aborted\")]]);\n\t\t};\n\n\t\tif (externalSignal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn () => {};\n\t\t}\n\t\texternalSignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\tvoid execute();\n\t\ttimer = setInterval(() => void execute(), intervalMs);\n\n\t\treturn () => {\n\t\t\tcleanup();\n\t\t\texternalSignal?.removeEventListener(\"abort\", onAbort);\n\t\t};\n\t}, sourceOpts(rest));\n}\n","/**\n * Watermark-based backpressure controller — reactive PAUSE/RESUME flow control.\n *\n * Purely synchronous, event-driven. No timers, no polling, no Promises.\n * Each controller instance uses a unique lockId so multiple controllers\n * on the same upstream node do not collide.\n *\n * @module\n */\n\nimport { type Messages, PAUSE, RESUME } from \"../core/messages.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type WatermarkOptions = {\n\t/** Pending count at which PAUSE is sent upstream. */\n\thighWaterMark: number;\n\t/** Pending count at which RESUME is sent upstream (after being paused). */\n\tlowWaterMark: number;\n};\n\nexport type WatermarkController = {\n\t/** Call when a DATA message is buffered/enqueued. Returns `true` if PAUSE was just sent. */\n\tonEnqueue(): boolean;\n\t/** Call when a buffered item is consumed. Returns `true` if RESUME was just sent. */\n\tonDequeue(): boolean;\n\t/** Current un-consumed item count. */\n\treadonly pending: number;\n\t/** Whether upstream is currently paused by this controller. */\n\treadonly paused: boolean;\n\t/** Dispose: if paused, sends RESUME to unblock upstream. */\n\tdispose(): void;\n};\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nlet nextLockId = 0;\n\n/**\n * Creates a watermark-based backpressure controller.\n *\n * @param sendUp - Callback that delivers messages upstream (typically `handle.up`).\n * @param opts - High/low watermark thresholds (item counts).\n * @returns A {@link WatermarkController}.\n *\n * @example\n * ```ts\n * const handle = graph.observe(\"fast-source\");\n * const wm = createWatermarkController(\n * (msgs) => handle.up(msgs),\n * { highWaterMark: 64, lowWaterMark: 16 },\n * );\n *\n * // In sink callback:\n * handle.subscribe((msgs) => {\n * for (const msg of msgs) {\n * if (msg[0] === DATA) {\n * buffer.push(msg[1]);\n * wm.onEnqueue();\n * }\n * }\n * });\n *\n * // When consumer drains:\n * const item = buffer.shift();\n * wm.onDequeue();\n * ```\n *\n * @category extra\n */\nexport function createWatermarkController(\n\tsendUp: (messages: Messages) => void,\n\topts: WatermarkOptions,\n): WatermarkController {\n\tif (opts.highWaterMark < 1) throw new RangeError(\"highWaterMark must be >= 1\");\n\tif (opts.lowWaterMark < 0) throw new RangeError(\"lowWaterMark must be >= 0\");\n\tif (opts.lowWaterMark >= opts.highWaterMark)\n\t\tthrow new RangeError(\"lowWaterMark must be < highWaterMark\");\n\tconst lockId = Symbol(`bp-${++nextLockId}`);\n\tlet pending = 0;\n\tlet paused = false;\n\n\treturn {\n\t\tonEnqueue(): boolean {\n\t\t\tpending += 1;\n\t\t\tif (!paused && pending >= opts.highWaterMark) {\n\t\t\t\tpaused = true;\n\t\t\t\tsendUp([[PAUSE, lockId]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tonDequeue(): boolean {\n\t\t\tif (pending > 0) pending -= 1;\n\t\t\tif (paused && pending <= opts.lowWaterMark) {\n\t\t\t\tpaused = false;\n\t\t\t\tsendUp([[RESUME, lockId]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tget pending() {\n\t\t\treturn pending;\n\t\t},\n\t\tget paused() {\n\t\t\treturn paused;\n\t\t},\n\t\tdispose() {\n\t\t\tif (paused) {\n\t\t\t\tpaused = false;\n\t\t\t\tsendUp([[RESUME, lockId]]);\n\t\t\t}\n\t\t},\n\t};\n}\n","/**\n * Checkpoint adapters and {@link Graph} save/restore helpers (roadmap §3.1).\n */\n/// <reference lib=\"dom\" />\n\nimport { randomBytes } from \"node:crypto\";\nimport { mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\nimport { COMPLETE, DATA, ERROR } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { producer } from \"../core/sugar.js\";\nimport type { Graph, GraphPersistSnapshot } from \"../graph/graph.js\";\n\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 warnNonJsonValues(data: GraphPersistSnapshot): void {\n\tfor (const [path, node] of Object.entries(data.nodes)) {\n\t\tconst v = node.value;\n\t\tif (v === undefined || v === null) continue;\n\t\tif (typeof v === \"function\" || typeof v === \"symbol\" || typeof v === \"bigint\") {\n\t\t\tconsole.warn(\n\t\t\t\t`checkpoint: node \"${path}\" has non-JSON-serializable value (${typeof v}); it will be lost on round-trip`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction stableSnapshotJson(data: GraphPersistSnapshot): string {\n\twarnNonJsonValues(data);\n\treturn `${JSON.stringify(sortJsonValue(data), undefined, 0)}\\n`;\n}\n\n/**\n * Persists {@link GraphPersistSnapshot} blobs (single save/load contract, roadmap §3.1).\n */\nexport interface CheckpointAdapter {\n\tsave(data: GraphPersistSnapshot): void;\n\tload(): GraphPersistSnapshot | null;\n}\n\n/**\n * In-memory adapter (process-local; useful for tests).\n *\n * @category extra\n */\nexport class MemoryCheckpointAdapter implements CheckpointAdapter {\n\t#data: GraphPersistSnapshot | null = null;\n\n\tsave(data: GraphPersistSnapshot): void {\n\t\tthis.#data = JSON.parse(JSON.stringify(data)) as GraphPersistSnapshot;\n\t}\n\n\tload(): GraphPersistSnapshot | null {\n\t\treturn this.#data === null\n\t\t\t? null\n\t\t\t: (JSON.parse(JSON.stringify(this.#data)) as GraphPersistSnapshot);\n\t}\n}\n\n/**\n * Stores JSON-cloned snapshots under a key inside a caller-owned record (tests / embedding).\n *\n * @category extra\n */\nexport class DictCheckpointAdapter implements CheckpointAdapter {\n\treadonly #storage: Record<string, unknown>;\n\treadonly #key: string;\n\n\tconstructor(storage: Record<string, unknown>, key = \"graphrefly_checkpoint\") {\n\t\tthis.#storage = storage;\n\t\tthis.#key = key;\n\t}\n\n\tsave(data: GraphPersistSnapshot): void {\n\t\tthis.#storage[this.#key] = JSON.parse(JSON.stringify(data)) as Record<string, unknown>;\n\t}\n\n\tload(): GraphPersistSnapshot | null {\n\t\tconst raw = this.#storage[this.#key];\n\t\treturn raw !== null && typeof raw === \"object\" && !Array.isArray(raw)\n\t\t\t? (JSON.parse(JSON.stringify(raw)) as GraphPersistSnapshot)\n\t\t\t: null;\n\t}\n}\n\n/**\n * Atomic JSON file persistence (temp file in the target directory, then `rename`).\n *\n * @remarks\n * **Errors:** `load()` returns `null` for missing files, empty files, or invalid JSON (no throw).\n *\n * @category extra\n */\nexport class FileCheckpointAdapter implements CheckpointAdapter {\n\treadonly #path: string;\n\n\tconstructor(path: string) {\n\t\tthis.#path = path;\n\t}\n\n\tsave(data: GraphPersistSnapshot): void {\n\t\tconst dir = dirname(this.#path);\n\t\tmkdirSync(dir, { recursive: true });\n\t\tconst payload = stableSnapshotJson(data);\n\t\tconst base = basename(this.#path);\n\t\tconst tmp = join(dir, `.${base}.${randomBytes(8).toString(\"hex\")}.tmp`);\n\t\ttry {\n\t\t\twriteFileSync(tmp, payload, \"utf8\");\n\t\t\trenameSync(tmp, this.#path);\n\t\t} catch (e) {\n\t\t\ttry {\n\t\t\t\tunlinkSync(tmp);\n\t\t\t} catch {\n\t\t\t\t/* ignore */\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\tload(): GraphPersistSnapshot | null {\n\t\ttry {\n\t\t\tconst text = readFileSync(this.#path, \"utf8\").trim();\n\t\t\tif (!text) return null;\n\t\t\tconst data = JSON.parse(text) as unknown;\n\t\t\treturn data !== null && typeof data === \"object\" && !Array.isArray(data)\n\t\t\t\t? (data as GraphPersistSnapshot)\n\t\t\t\t: null;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n/**\n * Persists one JSON blob under a fixed key using Node.js `node:sqlite` ({@link DatabaseSync}).\n *\n * @remarks\n * **Runtime:** Requires Node 22.5+ with `node:sqlite` enabled (experimental in some releases). Call `close()` when discarding the adapter.\n *\n * @category extra\n */\nexport class SqliteCheckpointAdapter implements CheckpointAdapter {\n\treadonly #db: DatabaseSync;\n\treadonly #key: string;\n\n\tconstructor(path: string, key = \"graphrefly_checkpoint\") {\n\t\tthis.#db = new DatabaseSync(path);\n\t\tthis.#key = key;\n\t\tthis.#db.exec(\n\t\t\t`CREATE TABLE IF NOT EXISTS graphrefly_checkpoint (k TEXT PRIMARY KEY, v TEXT NOT NULL)`,\n\t\t);\n\t}\n\n\tsave(data: GraphPersistSnapshot): void {\n\t\tconst payload = stableSnapshotJson(data).trimEnd();\n\t\tthis.#db\n\t\t\t.prepare(`INSERT OR REPLACE INTO graphrefly_checkpoint (k, v) VALUES (?, ?)`)\n\t\t\t.run(this.#key, payload);\n\t}\n\n\tload(): GraphPersistSnapshot | null {\n\t\tconst row = this.#db\n\t\t\t.prepare(`SELECT v FROM graphrefly_checkpoint WHERE k = ?`)\n\t\t\t.get(this.#key) as { v: string } | undefined;\n\t\tif (row === undefined || typeof row.v !== \"string\" || row.v.trim() === \"\") return null;\n\t\tconst parsed = JSON.parse(row.v) as unknown;\n\t\treturn parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed)\n\t\t\t? (parsed as GraphPersistSnapshot)\n\t\t\t: null;\n\t}\n\n\t/** Close the underlying SQLite connection (safe to call more than once). */\n\tclose(): void {\n\t\ttry {\n\t\t\tthis.#db.close();\n\t\t} catch {\n\t\t\t/* ignore if already closed */\n\t\t}\n\t}\n}\n\n/**\n * Writes {@link Graph.snapshot} through `adapter.save`.\n *\n * @param graph - Target graph instance.\n * @param adapter - Sync persistence backend.\n * @returns `void` — side-effect only; the snapshot is written to `adapter`.\n *\n * @example\n * ```ts\n * import { saveGraphCheckpoint, MemoryCheckpointAdapter, Graph } from \"@graphrefly/graphrefly-ts\";\n *\n * const g = new Graph(\"app\");\n * const adapter = new MemoryCheckpointAdapter();\n * saveGraphCheckpoint(g, adapter);\n * ```\n *\n * @category extra\n */\nexport function saveGraphCheckpoint(graph: Graph, adapter: CheckpointAdapter): void {\n\tadapter.save(graph.snapshot());\n}\n\n/**\n * Loads a snapshot via `adapter.load` and applies {@link Graph.restore} when data exists.\n *\n * @param graph - Graph whose topology matches the snapshot.\n * @param adapter - Sync persistence backend.\n * @returns `true` if data was present and `restore` ran; `false` if `load()` returned `null`.\n *\n * @example\n * ```ts\n * import {\n * saveGraphCheckpoint,\n * restoreGraphCheckpoint,\n * MemoryCheckpointAdapter,\n * Graph,\n * } from \"@graphrefly/graphrefly-ts\";\n *\n * const g = new Graph(\"app\");\n * const adapter = new MemoryCheckpointAdapter();\n * saveGraphCheckpoint(g, adapter);\n *\n * const g2 = new Graph(\"app\");\n * restoreGraphCheckpoint(g2, adapter); // true\n * ```\n *\n * @category extra\n */\nexport function restoreGraphCheckpoint(graph: Graph, adapter: CheckpointAdapter): boolean {\n\tconst data = adapter.load();\n\tif (data === null) return false;\n\tgraph.restore(data);\n\treturn true;\n}\n\n/**\n * Minimal JSON-shaped payload for a single node's cached value (custom adapters).\n *\n * @param n - Any {@link Node}.\n * @returns `{ version: 1, value }` from {@link Node.get}.\n *\n * @example\n * ```ts\n * import { checkpointNodeValue, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const s = state(42);\n * checkpointNodeValue(s); // { version: 1, value: 42 }\n * ```\n *\n * @category extra\n */\nexport function checkpointNodeValue<T>(n: Node<T>): { version: number; value: T | undefined } {\n\treturn { version: 1, value: n.get() };\n}\n\nexport type IndexedDbCheckpointSpec = {\n\tdbName: string;\n\tstoreName: string;\n\t/** @default \"graphrefly_checkpoint\" */\n\tkey?: string;\n\tversion?: number;\n};\n\n/**\n * Wraps an `IDBRequest` as a one-shot reactive source.\n *\n * @param req - Request whose callbacks are converted to protocol messages.\n * @returns `Node<T>` that emits `DATA` once on success, then `COMPLETE`; emits `ERROR` on failure.\n *\n * @example\n * ```ts\n * import { fromIDBRequest } from \"@graphrefly/graphrefly-ts\";\n *\n * const req = indexedDB.open(\"myDb\", 1);\n * fromIDBRequest(req).subscribe((msgs) => console.log(msgs));\n * // Emits [[DATA, IDBDatabase], [COMPLETE]] on success\n * ```\n *\n * @category extra\n */\nexport function fromIDBRequest<T>(req: IDBRequest<T>): Node<T> {\n\treturn producer<T>((_d, a) => {\n\t\tlet done = false;\n\t\tconst clear = () => {\n\t\t\treq.onsuccess = null;\n\t\t\treq.onerror = null;\n\t\t};\n\t\treq.onsuccess = () => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t\ta.down([[DATA, req.result], [COMPLETE]]);\n\t\t};\n\t\treq.onerror = () => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t\ta.down([[ERROR, req.error ?? new Error(\"IndexedDB request failed\")]]);\n\t\t};\n\t\treturn () => {\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t};\n\t});\n}\n\n/**\n * Wraps an `IDBTransaction` terminal lifecycle as a one-shot reactive source.\n *\n * @param tx - Transaction to observe.\n * @returns `Node<void>` that emits `DATA` (`undefined`) then `COMPLETE` on success; emits `ERROR` on `error`/`abort`.\n *\n * @example\n * ```ts\n * import { fromIDBTransaction } from \"@graphrefly/graphrefly-ts\";\n *\n * const db: IDBDatabase = ...; // obtained from indexedDB.open\n * const tx = db.transaction(\"store\", \"readwrite\");\n * fromIDBTransaction(tx).subscribe((msgs) => console.log(msgs));\n * // Emits [[DATA, undefined], [COMPLETE]] when the transaction commits\n * ```\n *\n * @category extra\n */\nexport function fromIDBTransaction(tx: IDBTransaction): Node<void> {\n\treturn producer<void>((_d, a) => {\n\t\tlet done = false;\n\t\tconst clear = () => {\n\t\t\ttx.oncomplete = null;\n\t\t\ttx.onerror = null;\n\t\t\ttx.onabort = null;\n\t\t};\n\t\ttx.oncomplete = () => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t\ta.down([[DATA, undefined], [COMPLETE]]);\n\t\t};\n\t\ttx.onerror = () => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t\ta.down([[ERROR, tx.error ?? new Error(\"IndexedDB transaction failed\")]]);\n\t\t};\n\t\ttx.onabort = () => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t\ta.down([[ERROR, tx.error ?? new Error(\"IndexedDB transaction aborted\")]]);\n\t\t};\n\t\treturn () => {\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t};\n\t});\n}\n\nfunction openIdbNode(dbName: string, storeName: string, version: number): Node<IDBDatabase> {\n\treturn producer<IDBDatabase>((_d, a) => {\n\t\tif (typeof indexedDB === \"undefined\") {\n\t\t\ta.down([[ERROR, new TypeError(\"indexedDB is not available in this environment\")]]);\n\t\t\treturn undefined;\n\t\t}\n\t\tconst req = indexedDB.open(dbName, version);\n\t\treq.onupgradeneeded = () => {\n\t\t\tconst db = req.result;\n\t\t\tif (!db.objectStoreNames.contains(storeName)) {\n\t\t\t\tdb.createObjectStore(storeName);\n\t\t\t}\n\t\t};\n\t\tconst unsub = fromIDBRequest(req).subscribe((msgs) => a.down(msgs));\n\t\treturn () => {\n\t\t\tunsub();\n\t\t};\n\t});\n}\n\n/**\n * Persists {@link Graph.snapshot} under `spec.key` (browser IndexedDB).\n *\n * @param graph - Graph to snapshot.\n * @param spec - Database name, object store name, optional `key` and schema `version`.\n * @returns A reactive `Node<void>` that emits `DATA` (`undefined`) then `COMPLETE` on success, or `ERROR` on failure.\n *\n * @remarks\n * **Environment:** Emits `ERROR` if `indexedDB` is undefined (e.g. Node without a polyfill).\n *\n * @example\n * ```ts\n * import { saveGraphCheckpointIndexedDb, Graph } from \"@graphrefly/graphrefly-ts\";\n *\n * const g = new Graph(\"app\");\n * const save$ = saveGraphCheckpointIndexedDb(g, {\n * dbName: \"myApp\",\n * storeName: \"checkpoints\",\n * });\n * save$.subscribe((msgs) => console.log(\"saved:\", msgs));\n * ```\n *\n * @category extra\n */\nexport function saveGraphCheckpointIndexedDb(\n\tgraph: Graph,\n\tspec: IndexedDbCheckpointSpec,\n): Node<void> {\n\tconst key = spec.key ?? \"graphrefly_checkpoint\";\n\treturn producer<void>((_d, a) => {\n\t\tlet db: IDBDatabase | undefined;\n\t\tlet opUnsub: (() => void) | undefined;\n\t\tlet done = false;\n\t\tconst close = () => {\n\t\t\tif (db === undefined) return;\n\t\t\tdb.close();\n\t\t\tdb = undefined;\n\t\t};\n\t\tconst finishWith = (msgs: [symbol, unknown?][]) => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\ta.down(msgs);\n\t\t\topUnsub?.();\n\t\t\topUnsub = undefined;\n\t\t\topenUnsub();\n\t\t\tclose();\n\t\t};\n\t\tconst startWrite = () => {\n\t\t\tif (db === undefined || opUnsub !== undefined) return;\n\t\t\tconst tx = db.transaction(spec.storeName, \"readwrite\");\n\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\tlet reqDone = false;\n\t\t\tlet txDone = false;\n\t\t\tlet reqError: unknown;\n\t\t\tlet unsubReq: (() => void) | undefined;\n\t\t\tlet unsubTx: (() => void) | undefined;\n\t\t\tconst maybeFinish = () => {\n\t\t\t\tif (reqError !== undefined) {\n\t\t\t\t\tfinishWith([[ERROR, reqError]]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!reqDone || !txDone) return;\n\t\t\t\tfinishWith([[DATA, undefined], [COMPLETE]]);\n\t\t\t};\n\t\t\tunsubReq = fromIDBRequest(store.put(graph.snapshot(), key)).subscribe((msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === ERROR) reqError = m[1];\n\t\t\t\t\tif (m[0] === COMPLETE || m[0] === ERROR) reqDone = true;\n\t\t\t\t}\n\t\t\t\tmaybeFinish();\n\t\t\t});\n\t\t\tunsubTx = fromIDBTransaction(tx).subscribe((msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === ERROR) {\n\t\t\t\t\t\tfinishWith([[ERROR, m[1]]]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (m[0] === COMPLETE) txDone = true;\n\t\t\t\t}\n\t\t\t\tmaybeFinish();\n\t\t\t});\n\t\t\topUnsub = () => {\n\t\t\t\tunsubReq?.();\n\t\t\t\tunsubReq = undefined;\n\t\t\t\tunsubTx?.();\n\t\t\t\tunsubTx = undefined;\n\t\t\t};\n\t\t};\n\t\tconst openUnsub = openIdbNode(spec.dbName, spec.storeName, spec.version ?? 1).subscribe(\n\t\t\t(msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === DATA) {\n\t\t\t\t\t\tdb = m[1] as IDBDatabase;\n\t\t\t\t\t\tstartWrite();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (m[0] === ERROR) {\n\t\t\t\t\t\tfinishWith([[ERROR, m[1]]]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t\treturn () => {\n\t\t\topUnsub?.();\n\t\t\topUnsub = undefined;\n\t\t\topenUnsub();\n\t\t\tclose();\n\t\t};\n\t});\n}\n\n/**\n * Loads a snapshot from IndexedDB and applies {@link Graph.restore} when present.\n *\n * @param graph - Graph whose topology matches the stored snapshot.\n * @param spec - Same `dbName` / `storeName` / `key` / `version` as save.\n * @returns A reactive `Node<boolean>`: emits `true` if a snapshot was restored, `false` if missing or not a plain object, then `COMPLETE`; or `ERROR` on I/O failure.\n *\n * @example\n * ```ts\n * import { restoreGraphCheckpointIndexedDb, Graph } from \"@graphrefly/graphrefly-ts\";\n *\n * const g = new Graph(\"app\");\n * const restore$ = restoreGraphCheckpointIndexedDb(g, {\n * dbName: \"myApp\",\n * storeName: \"checkpoints\",\n * });\n * restore$.subscribe((msgs) => console.log(\"restored:\", msgs));\n * // Emits [[DATA, true], [COMPLETE]] if a snapshot was found and applied\n * ```\n *\n * @category extra\n */\nexport function restoreGraphCheckpointIndexedDb(\n\tgraph: Graph,\n\tspec: IndexedDbCheckpointSpec,\n): Node<boolean> {\n\tconst key = spec.key ?? \"graphrefly_checkpoint\";\n\treturn producer<boolean>((_d, a) => {\n\t\tlet db: IDBDatabase | undefined;\n\t\tlet reqUnsub: (() => void) | undefined;\n\t\tlet txUnsub: (() => void) | undefined;\n\t\tlet done = false;\n\t\tlet txDone = false;\n\t\tlet requestDone = false;\n\t\tlet requestValue: unknown;\n\t\tlet requestError: unknown;\n\t\tconst close = () => {\n\t\t\tif (db === undefined) return;\n\t\t\tdb.close();\n\t\t\tdb = undefined;\n\t\t};\n\t\tconst finishWith = (msgs: [symbol, unknown?][]) => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\ta.down(msgs);\n\t\t\treqUnsub?.();\n\t\t\treqUnsub = undefined;\n\t\t\ttxUnsub?.();\n\t\t\ttxUnsub = undefined;\n\t\t\topenUnsub();\n\t\t\tclose();\n\t\t};\n\t\tconst maybeEmitResult = () => {\n\t\t\tif (!requestDone || !txDone) return;\n\t\t\tif (requestError !== undefined) {\n\t\t\t\tfinishWith([[ERROR, requestError]]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (requestValue === undefined || requestValue === null) {\n\t\t\t\tfinishWith([[DATA, false], [COMPLETE]]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (typeof requestValue !== \"object\" || Array.isArray(requestValue)) {\n\t\t\t\tfinishWith([[DATA, false], [COMPLETE]]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgraph.restore(requestValue as GraphPersistSnapshot);\n\t\t\tfinishWith([[DATA, true], [COMPLETE]]);\n\t\t};\n\t\tconst startRead = () => {\n\t\t\tif (db === undefined || reqUnsub !== undefined || txUnsub !== undefined) return;\n\t\t\tconst tx = db.transaction(spec.storeName, \"readonly\");\n\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\treqUnsub = fromIDBRequest(store.get(key)).subscribe((msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === DATA) requestValue = m[1];\n\t\t\t\t\tif (m[0] === ERROR) requestError = m[1];\n\t\t\t\t\tif (m[0] === COMPLETE || m[0] === ERROR) requestDone = true;\n\t\t\t\t}\n\t\t\t\tmaybeEmitResult();\n\t\t\t});\n\t\t\ttxUnsub = fromIDBTransaction(tx).subscribe((msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === ERROR) {\n\t\t\t\t\t\tfinishWith([[ERROR, m[1]]]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (m[0] === COMPLETE) txDone = true;\n\t\t\t\t}\n\t\t\t\tmaybeEmitResult();\n\t\t\t});\n\t\t};\n\t\tconst openUnsub = openIdbNode(spec.dbName, spec.storeName, spec.version ?? 1).subscribe(\n\t\t\t(msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === DATA) {\n\t\t\t\t\t\tdb = m[1] as IDBDatabase;\n\t\t\t\t\t\tstartRead();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (m[0] === ERROR) {\n\t\t\t\t\t\tfinishWith([[ERROR, m[1]]]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t\treturn () => {\n\t\t\treqUnsub?.();\n\t\t\treqUnsub = undefined;\n\t\t\ttxUnsub?.();\n\t\t\ttxUnsub = undefined;\n\t\t\topenUnsub();\n\t\t\tclose();\n\t\t};\n\t});\n}\n","/**\n * `dynamicNode` — runtime dep tracking with diamond resolution (Phase 0.3b).\n *\n * Unlike `node()` where deps are fixed at construction, `dynamicNode` discovers\n * deps at runtime via a tracking `get()` proxy. After each recompute, deps are\n * diffed: new deps are connected, removed deps are disconnected, and bitmasks\n * are rebuilt. Kept deps retain their subscriptions (no teardown/reconnect churn).\n *\n * This ports callbag-recharge's `dynamicDerived` pattern to GraphReFly's protocol.\n */\nimport type { Actor } from \"./actor.js\";\nimport { normalizeActor } from \"./actor.js\";\nimport { emitWithBatch } from \"./batch.js\";\nimport { wallClockNs } from \"./clock.js\";\nimport type { GuardAction, NodeGuard } from \"./guard.js\";\nimport { GuardDenied } from \"./guard.js\";\nimport {\n\tCOMPLETE,\n\tDATA,\n\tDIRTY,\n\tERROR,\n\tINVALIDATE,\n\ttype Message,\n\ttype Messages,\n\tPAUSE,\n\tpropagatesToMeta,\n\tRESOLVED,\n\tRESUME,\n\tTEARDOWN,\n} from \"./messages.js\";\nimport {\n\tnode as createNode,\n\ttype Node,\n\ttype NodeActions,\n\ttype NodeDescribeKind,\n\ttype NodeInspectorHook,\n\ttype NodeOptions,\n\ttype NodeSink,\n\ttype NodeStatus,\n\ttype NodeTransportOptions,\n\ttype OnMessageHandler,\n\ttype SubscribeHints,\n} from \"./node.js\";\n\n/**\n * The tracking `get` function passed to `dynamicNode`'s compute function.\n * Each call to `get(dep)` reads the dep's current value and records it as a dependency.\n */\nexport type DynGet = <V>(dep: Node<V>) => V | undefined;\n\n/**\n * Compute function for `dynamicNode`. Receives a tracking `get` proxy.\n * Deps are discovered by which nodes are passed to `get()` during execution.\n */\nexport type DynamicNodeFn<T> = (get: DynGet) => T;\n\n/** Options for `dynamicNode`. */\nexport type DynamicNodeOptions = Pick<\n\tNodeOptions,\n\t| \"name\"\n\t| \"equals\"\n\t| \"meta\"\n\t| \"resubscribable\"\n\t| \"resetOnTeardown\"\n\t| \"guard\"\n\t| \"onMessage\"\n\t| \"onResubscribe\"\n\t| \"completeWhenDepsComplete\"\n\t| \"describeKind\"\n>;\n\n/**\n * Creates a node with runtime dep tracking. Deps are discovered each time the\n * compute function runs by tracking which nodes are passed to the `get()` proxy.\n *\n * After each recompute:\n * - New deps (not in previous set) are subscribed\n * - Removed deps (not in current set) are unsubscribed\n * - Kept deps retain their existing subscriptions\n * - Bitmasks are rebuilt to match the new dep set\n *\n * The node participates fully in diamond resolution via the standard two-phase\n * DIRTY/RESOLVED protocol across all dynamically-tracked deps.\n *\n * @param fn - Compute function receiving a tracking `get` proxy.\n * @param opts - Optional configuration.\n * @returns `Node<T>` with dynamic dep tracking.\n *\n * @example\n * ```ts\n * import { dynamicNode, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const cond = state(true);\n * const a = state(1);\n * const b = state(2);\n *\n * // Deps change based on cond's value\n * const d = dynamicNode((get) => {\n * const useA = get(cond);\n * return useA ? get(a) : get(b);\n * });\n * ```\n *\n * @category core\n */\nexport function dynamicNode<T = unknown>(fn: DynamicNodeFn<T>, opts?: DynamicNodeOptions): Node<T> {\n\treturn new DynamicNodeImpl<T>(fn, opts ?? {});\n}\n\n/** @internal — exported for {@link describeNode} `instanceof` check. */\nexport class DynamicNodeImpl<T = unknown> implements Node<T> {\n\tprivate readonly _optsName: string | undefined;\n\tprivate _registryName: string | undefined;\n\treadonly _describeKind: NodeDescribeKind | undefined;\n\treadonly meta: Record<string, Node>;\n\tprivate readonly _fn: DynamicNodeFn<T>;\n\tprivate readonly _equals: (a: unknown, b: unknown) => boolean;\n\tprivate readonly _resubscribable: boolean;\n\tprivate readonly _resetOnTeardown: boolean;\n\tprivate readonly _autoComplete: boolean;\n\tprivate readonly _onMessage: OnMessageHandler | undefined;\n\tprivate readonly _onResubscribe: (() => void) | undefined;\n\t/** @internal — read by {@link describeNode} for `accessHintForGuard`. */\n\treadonly _guard: NodeGuard | undefined;\n\tprivate _lastMutation: { actor: Actor; timestamp_ns: number } | undefined;\n\tprivate _inspectorHook: NodeInspectorHook | undefined;\n\n\t// Sink tracking\n\tprivate _sinkCount = 0;\n\tprivate _singleDepSinkCount = 0;\n\tprivate _singleDepSinks = new WeakSet<NodeSink>();\n\n\t// Actions object (for onMessage handler)\n\tprivate readonly _actions: NodeActions;\n\tprivate readonly _boundEmitToSinks: (messages: Messages) => void;\n\n\t// Mutable state\n\tprivate _cached: T | undefined;\n\tprivate _status: NodeStatus = \"disconnected\";\n\tprivate _terminal = false;\n\tprivate _connected = false;\n\tprivate _rewiring = false; // re-entrancy guard\n\n\t// Dynamic deps tracking\n\tprivate _deps: Node[] = [];\n\tprivate _depUnsubs: Array<() => void> = [];\n\tprivate _depIndexMap = new Map<Node, number>(); // node → index in _deps\n\tprivate _dirtyBits = new Set<number>();\n\tprivate _settledBits = new Set<number>();\n\tprivate _completeBits = new Set<number>();\n\n\t// Sinks\n\tprivate _sinks: NodeSink | Set<NodeSink> | null = null;\n\n\tconstructor(fn: DynamicNodeFn<T>, opts: DynamicNodeOptions) {\n\t\tthis._fn = fn;\n\t\tthis._optsName = opts.name;\n\t\tthis._describeKind = opts.describeKind;\n\t\tthis._equals = opts.equals ?? Object.is;\n\t\tthis._resubscribable = opts.resubscribable ?? false;\n\t\tthis._resetOnTeardown = opts.resetOnTeardown ?? false;\n\t\tthis._autoComplete = opts.completeWhenDepsComplete ?? true;\n\t\tthis._onMessage = opts.onMessage;\n\t\tthis._onResubscribe = opts.onResubscribe;\n\t\tthis._guard = opts.guard;\n\t\tthis._inspectorHook = undefined;\n\n\t\t// Build companion meta nodes (same pattern as NodeImpl)\n\t\tconst meta: Record<string, Node> = {};\n\t\tfor (const [k, v] of Object.entries(opts.meta ?? {})) {\n\t\t\tmeta[k] = createNode({\n\t\t\t\tinitial: v,\n\t\t\t\tname: `${opts.name ?? \"dynamicNode\"}:meta:${k}`,\n\t\t\t\tdescribeKind: \"state\",\n\t\t\t\t...(opts.guard != null ? { guard: opts.guard } : {}),\n\t\t\t});\n\t\t}\n\t\tObject.freeze(meta);\n\t\tthis.meta = meta;\n\n\t\t// Actions object: created once, references `this` methods.\n\t\tconst self = this;\n\t\tthis._actions = {\n\t\t\tdown(messages): void {\n\t\t\t\tself._downInternal(messages);\n\t\t\t},\n\t\t\temit(value): void {\n\t\t\t\tself._emitAutoValue(value);\n\t\t\t},\n\t\t\tup(messages): void {\n\t\t\t\tfor (const dep of self._deps) {\n\t\t\t\t\tdep.up?.(messages, { internal: true });\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\n\t\t// Bind commonly detached protocol methods\n\t\tthis._boundEmitToSinks = this._emitToSinks.bind(this);\n\t}\n\n\tget name(): string | undefined {\n\t\treturn this._registryName ?? this._optsName;\n\t}\n\n\t/** @internal */\n\t_assignRegistryName(localName: string): void {\n\t\tif (this._optsName !== undefined || this._registryName !== undefined) return;\n\t\tthis._registryName = localName;\n\t}\n\n\t/**\n\t * @internal Attach/remove inspector hook for graph-level observability.\n\t * Returns a disposer that restores the previous hook.\n\t */\n\t_setInspectorHook(hook?: NodeInspectorHook): () => void {\n\t\tconst prev = this._inspectorHook;\n\t\tthis._inspectorHook = hook;\n\t\treturn () => {\n\t\t\tif (this._inspectorHook === hook) {\n\t\t\t\tthis._inspectorHook = prev;\n\t\t\t}\n\t\t};\n\t}\n\n\tget status(): NodeStatus {\n\t\treturn this._status;\n\t}\n\n\tget lastMutation(): Readonly<{ actor: Actor; timestamp_ns: number }> | undefined {\n\t\treturn this._lastMutation;\n\t}\n\n\t/** Versioning not yet supported on DynamicNodeImpl. */\n\tget v(): undefined {\n\t\treturn undefined;\n\t}\n\n\thasGuard(): boolean {\n\t\treturn this._guard != null;\n\t}\n\n\tallowsObserve(actor: Actor): boolean {\n\t\tif (this._guard == null) return true;\n\t\treturn this._guard(normalizeActor(actor), \"observe\");\n\t}\n\n\tget(): T | undefined {\n\t\treturn this._cached;\n\t}\n\n\tdown(messages: Messages, options?: NodeTransportOptions): void {\n\t\tif (messages.length === 0) return;\n\t\tif (!options?.internal && this._guard != null) {\n\t\t\tconst actor = normalizeActor(options?.actor);\n\t\t\tconst delivery = options?.delivery ?? \"write\";\n\t\t\tconst action: GuardAction = delivery === \"signal\" ? \"signal\" : \"write\";\n\t\t\tif (!this._guard(actor, action)) {\n\t\t\t\tthrow new GuardDenied({ actor, action, nodeName: this.name });\n\t\t\t}\n\t\t\tthis._lastMutation = { actor, timestamp_ns: wallClockNs() };\n\t\t}\n\t\tthis._downInternal(messages);\n\t}\n\n\tprivate _downInternal(messages: Messages): void {\n\t\tif (messages.length === 0) return;\n\t\tlet sinkMessages = messages;\n\t\tif (this._terminal && !this._resubscribable) {\n\t\t\tconst pass = messages.filter((m) => m[0] === TEARDOWN || m[0] === INVALIDATE);\n\t\t\tif (pass.length === 0) return;\n\t\t\tsinkMessages = pass as Messages;\n\t\t}\n\t\tthis._handleLocalLifecycle(sinkMessages);\n\t\t// Single-dep optimization: skip DIRTY to sinks when sole subscriber is single-dep\n\t\t// AND the batch contains a phase-2 message (DATA/RESOLVED). Standalone DIRTY\n\t\t// (without follow-up) must pass through so downstream is notified.\n\t\tif (this._canSkipDirty()) {\n\t\t\t// Inline check: does the batch contain DATA or RESOLVED?\n\t\t\tlet hasPhase2 = false;\n\t\t\tfor (let i = 0; i < sinkMessages.length; i++) {\n\t\t\t\tconst t = sinkMessages[i][0];\n\t\t\t\tif (t === DATA || t === RESOLVED) {\n\t\t\t\t\thasPhase2 = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (hasPhase2) {\n\t\t\t\t// Inline filter: remove DIRTY messages\n\t\t\t\tconst filtered: Message[] = [];\n\t\t\t\tfor (let i = 0; i < sinkMessages.length; i++) {\n\t\t\t\t\tif (sinkMessages[i][0] !== DIRTY) filtered.push(sinkMessages[i]);\n\t\t\t\t}\n\t\t\t\tif (filtered.length > 0) {\n\t\t\t\t\temitWithBatch(this._boundEmitToSinks, filtered);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\temitWithBatch(this._boundEmitToSinks, sinkMessages);\n\t}\n\n\tprivate _canSkipDirty(): boolean {\n\t\treturn this._sinkCount === 1 && this._singleDepSinkCount === 1;\n\t}\n\n\tsubscribe(sink: NodeSink, hints?: SubscribeHints): () => void {\n\t\tif (hints?.actor != null && this._guard != null) {\n\t\t\tconst actor = normalizeActor(hints.actor);\n\t\t\tif (!this._guard(actor, \"observe\")) {\n\t\t\t\tthrow new GuardDenied({ actor, action: \"observe\", nodeName: this.name });\n\t\t\t}\n\t\t}\n\n\t\tif (this._terminal && this._resubscribable) {\n\t\t\tthis._terminal = false;\n\t\t\tthis._status = \"disconnected\";\n\t\t\tthis._onResubscribe?.();\n\t\t}\n\n\t\tthis._sinkCount += 1;\n\t\tif (hints?.singleDep) {\n\t\t\tthis._singleDepSinkCount += 1;\n\t\t\tthis._singleDepSinks.add(sink);\n\t\t}\n\n\t\tif (this._sinks == null) {\n\t\t\tthis._sinks = sink;\n\t\t} else if (typeof this._sinks === \"function\") {\n\t\t\tthis._sinks = new Set<NodeSink>([this._sinks, sink]);\n\t\t} else {\n\t\t\tthis._sinks.add(sink);\n\t\t}\n\n\t\tif (!this._connected) {\n\t\t\tthis._connect();\n\t\t}\n\n\t\tlet removed = false;\n\t\treturn () => {\n\t\t\tif (removed) return;\n\t\t\tremoved = true;\n\t\t\tthis._sinkCount -= 1;\n\t\t\tif (this._singleDepSinks.has(sink)) {\n\t\t\t\tthis._singleDepSinkCount -= 1;\n\t\t\t\tthis._singleDepSinks.delete(sink);\n\t\t\t}\n\t\t\tif (this._sinks == null) return;\n\t\t\tif (typeof this._sinks === \"function\") {\n\t\t\t\tif (this._sinks === sink) this._sinks = null;\n\t\t\t} else {\n\t\t\t\tthis._sinks.delete(sink);\n\t\t\t\tif (this._sinks.size === 1) {\n\t\t\t\t\tconst [only] = this._sinks;\n\t\t\t\t\tthis._sinks = only;\n\t\t\t\t} else if (this._sinks.size === 0) {\n\t\t\t\t\tthis._sinks = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this._sinks == null) {\n\t\t\t\tthis._disconnect();\n\t\t\t}\n\t\t};\n\t}\n\n\tup(messages: Messages, options?: NodeTransportOptions): void {\n\t\tif (this._deps.length === 0) return;\n\t\tif (!options?.internal && this._guard != null) {\n\t\t\tconst actor = normalizeActor(options?.actor);\n\t\t\tif (!this._guard(actor, \"write\")) {\n\t\t\t\tthrow new GuardDenied({ actor, action: \"write\", nodeName: this.name });\n\t\t\t}\n\t\t\tthis._lastMutation = { actor, timestamp_ns: wallClockNs() };\n\t\t}\n\t\tfor (const dep of this._deps) {\n\t\t\tdep.up?.(messages, options);\n\t\t}\n\t}\n\n\tunsubscribe(): void {\n\t\tthis._disconnect();\n\t}\n\n\t// --- Private methods ---\n\n\tprivate _emitToSinks(messages: Messages): void {\n\t\tif (this._sinks == null) return;\n\t\tif (typeof this._sinks === \"function\") {\n\t\t\tthis._sinks(messages);\n\t\t\treturn;\n\t\t}\n\t\tconst snapshot = [...this._sinks];\n\t\tfor (const sink of snapshot) {\n\t\t\tsink(messages);\n\t\t}\n\t}\n\n\tprivate _handleLocalLifecycle(messages: Messages): void {\n\t\tfor (const m of messages) {\n\t\t\tconst t = m[0];\n\t\t\tif (t === DATA) this._cached = m[1] as T;\n\t\t\tif (t === INVALIDATE) {\n\t\t\t\tthis._cached = undefined;\n\t\t\t}\n\t\t\tif (t === DATA || t === RESOLVED) {\n\t\t\t\tthis._status = \"settled\";\n\t\t\t} else if (t === DIRTY) {\n\t\t\t\tthis._status = \"dirty\";\n\t\t\t} else if (t === COMPLETE) {\n\t\t\t\tthis._status = \"completed\";\n\t\t\t\tthis._terminal = true;\n\t\t\t} else if (t === ERROR) {\n\t\t\t\tthis._status = \"errored\";\n\t\t\t\tthis._terminal = true;\n\t\t\t}\n\t\t\tif (t === TEARDOWN) {\n\t\t\t\tif (this._resetOnTeardown) this._cached = undefined;\n\t\t\t\ttry {\n\t\t\t\t\tthis._propagateToMeta(t);\n\t\t\t\t} finally {\n\t\t\t\t\tthis._disconnect();\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Propagate other meta-eligible signals (centralized in messages.ts).\n\t\t\tif (t !== TEARDOWN && propagatesToMeta(t)) {\n\t\t\t\tthis._propagateToMeta(t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Propagate a signal to all companion meta nodes (best-effort). */\n\tprivate _propagateToMeta(t: symbol): void {\n\t\tfor (const metaNode of Object.values(this.meta)) {\n\t\t\ttry {\n\t\t\t\tmetaNode.down([[t]], { internal: true });\n\t\t\t} catch {\n\t\t\t\t/* best-effort: other meta nodes still receive the signal */\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _emitAutoValue(value: unknown): void {\n\t\tconst wasDirty = this._status === \"dirty\";\n\t\tconst unchanged = this._equals(this._cached, value);\n\t\tif (unchanged) {\n\t\t\tthis._downInternal(wasDirty ? [[RESOLVED]] : [[DIRTY], [RESOLVED]]);\n\t\t\treturn;\n\t\t}\n\t\tthis._cached = value as T;\n\t\tthis._downInternal(wasDirty ? [[DATA, value]] : [[DIRTY], [DATA, value]]);\n\t}\n\n\tprivate _connect(): void {\n\t\tif (this._connected) return;\n\t\tthis._connected = true;\n\t\tthis._status = \"settled\";\n\t\tthis._dirtyBits.clear();\n\t\tthis._settledBits.clear();\n\t\tthis._completeBits.clear();\n\t\tthis._runFn();\n\t}\n\n\tprivate _disconnect(): void {\n\t\tif (!this._connected) return;\n\t\tfor (const unsub of this._depUnsubs) unsub();\n\t\tthis._depUnsubs = [];\n\t\tthis._deps = [];\n\t\tthis._depIndexMap.clear();\n\t\tthis._dirtyBits.clear();\n\t\tthis._settledBits.clear();\n\t\tthis._completeBits.clear();\n\t\tthis._connected = false;\n\t\tthis._status = \"disconnected\";\n\t}\n\n\tprivate _runFn(): void {\n\t\tif (this._terminal && !this._resubscribable) return;\n\t\tif (this._rewiring) return;\n\n\t\t// Track deps during fn execution\n\t\tconst trackedDeps: Node[] = [];\n\t\tconst trackedSet = new Set<Node>();\n\n\t\tconst get: DynGet = <V>(dep: Node<V>): V | undefined => {\n\t\t\tif (!trackedSet.has(dep)) {\n\t\t\t\ttrackedSet.add(dep);\n\t\t\t\ttrackedDeps.push(dep);\n\t\t\t}\n\t\t\treturn dep.get();\n\t\t};\n\n\t\ttry {\n\t\t\t// Collect dep values for inspector hook\n\t\t\tconst depValues: unknown[] = [];\n\t\t\tfor (const dep of this._deps) {\n\t\t\t\tdepValues.push(dep.get());\n\t\t\t}\n\t\t\tthis._inspectorHook?.({ kind: \"run\", depValues });\n\n\t\t\tconst result = this._fn(get);\n\t\t\tthis._rewire(trackedDeps);\n\t\t\tif (result === undefined) return;\n\t\t\tthis._emitAutoValue(result);\n\t\t} catch (err) {\n\t\t\tthis._downInternal([[ERROR, err]]);\n\t\t}\n\t}\n\n\tprivate _rewire(newDeps: Node[]): void {\n\t\tthis._rewiring = true;\n\t\ttry {\n\t\t\tconst oldMap = this._depIndexMap;\n\t\t\tconst newMap = new Map<Node, number>();\n\t\t\tconst newUnsubs: Array<() => void> = [];\n\n\t\t\t// Reuse or create subscriptions\n\t\t\tfor (let i = 0; i < newDeps.length; i++) {\n\t\t\t\tconst dep = newDeps[i];\n\t\t\t\tnewMap.set(dep, i);\n\t\t\t\tconst oldIdx = oldMap.get(dep);\n\t\t\t\tif (oldIdx !== undefined) {\n\t\t\t\t\t// Kept dep — reuse subscription but update index\n\t\t\t\t\tnewUnsubs.push(this._depUnsubs[oldIdx]);\n\t\t\t\t\t// Mark old unsub as consumed\n\t\t\t\t\tthis._depUnsubs[oldIdx] = () => {};\n\t\t\t\t} else {\n\t\t\t\t\t// New dep — subscribe\n\t\t\t\t\tconst idx = i;\n\t\t\t\t\tconst unsub = dep.subscribe((msgs) => this._handleDepMessages(idx, msgs));\n\t\t\t\t\tnewUnsubs.push(unsub);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Disconnect removed deps\n\t\t\tfor (const [dep, oldIdx] of oldMap) {\n\t\t\t\tif (!newMap.has(dep)) {\n\t\t\t\t\tthis._depUnsubs[oldIdx]();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._deps = newDeps;\n\t\t\tthis._depUnsubs = newUnsubs;\n\t\t\tthis._depIndexMap = newMap;\n\t\t\tthis._dirtyBits.clear();\n\t\t\tthis._settledBits.clear();\n\t\t\t// Preserve complete bits for deps that are still present\n\t\t\tconst newCompleteBits = new Set<number>();\n\t\t\tfor (const oldIdx of this._completeBits) {\n\t\t\t\tconst dep = [...oldMap.entries()].find(([, idx]) => idx === oldIdx)?.[0];\n\t\t\t\tif (dep && newMap.has(dep)) {\n\t\t\t\t\tnewCompleteBits.add(newMap.get(dep)!);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._completeBits = newCompleteBits;\n\t\t} finally {\n\t\t\tthis._rewiring = false;\n\t\t}\n\t}\n\n\tprivate _handleDepMessages(index: number, messages: Messages): void {\n\t\tif (this._rewiring) return; // suppress signals during rewire\n\n\t\tfor (const msg of messages) {\n\t\t\tthis._inspectorHook?.({ kind: \"dep_message\", depIndex: index, message: msg });\n\t\t\tconst t = msg[0];\n\t\t\t// User-defined message handler gets first look (spec §2.6).\n\t\t\tif (this._onMessage) {\n\t\t\t\ttry {\n\t\t\t\t\tif (this._onMessage(msg, index, this._actions)) continue;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthis._downInternal([[ERROR, err]]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (t === DIRTY) {\n\t\t\t\tthis._dirtyBits.add(index);\n\t\t\t\tthis._settledBits.delete(index);\n\t\t\t\tif (this._dirtyBits.size === 1) {\n\t\t\t\t\t// First dirty — propagate\n\t\t\t\t\temitWithBatch(this._boundEmitToSinks, [[DIRTY]]);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === DATA || t === RESOLVED) {\n\t\t\t\tif (!this._dirtyBits.has(index)) {\n\t\t\t\t\tthis._dirtyBits.add(index);\n\t\t\t\t\temitWithBatch(this._boundEmitToSinks, [[DIRTY]]);\n\t\t\t\t}\n\t\t\t\tthis._settledBits.add(index);\n\t\t\t\tif (this._allDirtySettled()) {\n\t\t\t\t\tthis._dirtyBits.clear();\n\t\t\t\t\tthis._settledBits.clear();\n\t\t\t\t\tthis._runFn();\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\tthis._completeBits.add(index);\n\t\t\t\tthis._dirtyBits.delete(index);\n\t\t\t\tthis._settledBits.delete(index);\n\t\t\t\tif (this._allDirtySettled()) {\n\t\t\t\t\tthis._dirtyBits.clear();\n\t\t\t\t\tthis._settledBits.clear();\n\t\t\t\t\tthis._runFn();\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tthis._autoComplete &&\n\t\t\t\t\tthis._completeBits.size >= this._deps.length &&\n\t\t\t\t\tthis._deps.length > 0\n\t\t\t\t) {\n\t\t\t\t\tthis._downInternal([[COMPLETE]]);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\tthis._downInternal([msg]);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === INVALIDATE || t === TEARDOWN || t === PAUSE || t === RESUME) {\n\t\t\t\tthis._downInternal([msg]);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis._downInternal([msg]);\n\t\t}\n\t}\n\n\tprivate _allDirtySettled(): boolean {\n\t\tif (this._dirtyBits.size === 0) return false;\n\t\tfor (const idx of this._dirtyBits) {\n\t\t\tif (!this._settledBits.has(idx)) return false;\n\t\t}\n\t\treturn true;\n\t}\n}\n","/**\n * Tier 1 sync operators (roadmap §2.1) and Tier 2 async/dynamic operators (roadmap §2.2) —\n * each returns a {@link Node} built with {@link node} (or {@link producer} for cold sources).\n */\n\nimport { monotonicNs } from \"../core/clock.js\";\nimport {\n\tCOMPLETE,\n\tDATA,\n\tDIRTY,\n\tERROR,\n\ttype Message,\n\ttype Messages,\n\tPAUSE,\n\tRESOLVED,\n\tRESUME,\n} from \"../core/messages.js\";\nimport { type Node, type NodeActions, type NodeOptions, node } from \"../core/node.js\";\nimport { derived, producer } from \"../core/sugar.js\";\nimport { NS_PER_MS } from \"./backoff.js\";\nimport { fromAny, type NodeInput } from \"./sources.js\";\n\ntype ExtraOpts = Omit<NodeOptions, \"describeKind\">;\n\nfunction operatorOpts(opts?: ExtraOpts): NodeOptions {\n\treturn { describeKind: \"operator\", ...opts };\n}\n\n/**\n * Maps each settled value from `source` through `project`.\n *\n * @param source - Upstream node.\n * @param project - Transform for each value.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Derived node emitting mapped values.\n *\n * @example\n * ```ts\n * import { map, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = map(state(2), (x) => x * 3);\n * ```\n *\n * @category extra\n */\nexport function map<T, R>(source: Node<T>, project: (value: T) => R, opts?: ExtraOpts): Node<R> {\n\treturn derived([source as Node], ([v]) => project(v as T), operatorOpts(opts));\n}\n\n/**\n * Forwards values that satisfy `predicate`; otherwise emits `RESOLVED` with no `DATA` (two-phase semantics).\n *\n * @param source - Upstream node.\n * @param predicate - Inclusion test.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Filtered node.\n *\n * @example\n * ```ts\n * import { filter, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = filter(state(1), (x) => x > 0);\n * ```\n *\n * @category extra\n */\nexport function filter<T>(\n\tsource: Node<T>,\n\tpredicate: (value: T) => boolean,\n\topts?: ExtraOpts,\n): Node<T> {\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (predicate(v as T)) return v as T;\n\t\t\ta.down([[RESOLVED]]);\n\t\t\treturn undefined;\n\t\t},\n\t\toperatorOpts(opts),\n\t);\n}\n\n/**\n * Folds each upstream value into an accumulator; emits the new accumulator every time.\n *\n * Unlike RxJS, `seed` is always required — there is no seedless mode where the first\n * value silently becomes the accumulator.\n *\n * @param source - Upstream node.\n * @param reducer - `(acc, value) => nextAcc`.\n * @param seed - Initial accumulator (required).\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Scan node.\n *\n * @example\n * ```ts\n * import { scan, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = scan(state(1), (a, x) => a + x, 0);\n * ```\n *\n * @category extra\n */\nexport function scan<T, R>(\n\tsource: Node<T>,\n\treducer: (acc: R, value: T) => R,\n\tseed: R,\n\topts?: ExtraOpts,\n): Node<R> {\n\tlet acc = seed;\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v]) => {\n\t\t\tacc = reducer(acc, v as T);\n\t\t\treturn acc;\n\t\t},\n\t\t{ ...operatorOpts(opts), initial: seed, resetOnTeardown: true },\n\t);\n}\n\n/**\n * Reduces to one value emitted when `source` completes; if no `DATA` arrived, emits `seed`.\n *\n * Unlike RxJS, `seed` is always required. If the source completes without emitting\n * DATA, the seed value is emitted (RxJS would throw without a seed).\n *\n * @param source - Upstream node.\n * @param reducer - `(acc, value) => nextAcc`.\n * @param seed - Empty-completion default and initial accumulator (required).\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Node that emits once on completion.\n *\n * @example\n * ```ts\n * import { reduce, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = reduce(state(1), (a, x) => a + x, 0);\n * ```\n *\n * @category extra\n */\nexport function reduce<T, R>(\n\tsource: Node<T>,\n\treducer: (acc: R, value: T) => R,\n\tseed: R,\n\topts?: ExtraOpts,\n): Node<R> {\n\tlet acc = seed;\n\tlet sawData = false;\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v]) => {\n\t\t\tsawData = true;\n\t\t\tacc = reducer(acc, v as T);\n\t\t\treturn undefined;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonResubscribe:\n\t\t\t\topts?.resubscribable === true\n\t\t\t\t\t? () => {\n\t\t\t\t\t\t\tacc = seed;\n\t\t\t\t\t\t\tsawData = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\tonMessage(msg: Message, _i: number, a) {\n\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\tif (!sawData) acc = seed;\n\t\t\t\t\ta.emit(acc);\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Emits at most `count` **`DATA`** values, then **`COMPLETE`**. `RESOLVED` does not advance the counter.\n *\n * @param source - Upstream node.\n * @param count - Maximum `DATA` emissions (≤0 completes immediately).\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Limited stream.\n *\n * @example\n * ```ts\n * import { take, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = take(state(0), 3);\n * ```\n *\n * @category extra\n */\nexport function take<T>(source: Node<T>, count: number, opts?: ExtraOpts): Node<T> {\n\tif (count <= 0) {\n\t\treturn node<T>(\n\t\t\t[source as Node],\n\t\t\t(_d, a) => {\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\treturn undefined;\n\t\t\t},\n\t\t\t{\n\t\t\t\t...operatorOpts(opts),\n\t\t\t\tcompleteWhenDepsComplete: false,\n\t\t\t\tonMessage(msg, _i, a) {\n\t\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t}\n\tlet taken = 0;\n\tlet done = false;\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v]) => {\n\t\t\tif (done) return undefined;\n\t\t\treturn v as T;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonResubscribe:\n\t\t\t\topts?.resubscribable === true\n\t\t\t\t\t? () => {\n\t\t\t\t\t\t\ttaken = 0;\n\t\t\t\t\t\t\tdone = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tif (msg[0] === DIRTY) return false;\n\t\t\t\tif (done) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === DATA) {\n\t\t\t\t\ttaken += 1;\n\t\t\t\t\tif (taken >= count) {\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t\ta.emit(source.get() as T);\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === RESOLVED) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\tdone = true;\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === ERROR) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Skips the first `count` **`DATA`** emissions. `RESOLVED` does not advance the counter.\n *\n * @param source - Upstream node.\n * @param count - Number of `DATA` values to drop.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Skipped stream.\n *\n * @example\n * ```ts\n * import { skip, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = skip(state(0), 2);\n * ```\n *\n * @category extra\n */\nexport function skip<T>(source: Node<T>, count: number, opts?: ExtraOpts): Node<T> {\n\tlet skipped = 0;\n\treturn node<T>([source as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === DIRTY) {\n\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tskipped += 1;\n\t\t\t\tif (skipped <= count) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t} else {\n\t\t\t\t\ta.emit(msg[1]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n/**\n * Emits while `predicate` holds; on first false, sends **`COMPLETE`**.\n *\n * @param source - Upstream node.\n * @param predicate - Continuation test.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Truncated stream.\n *\n * @example\n * ```ts\n * import { takeWhile, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = takeWhile(state(1), (x) => x < 10);\n * ```\n *\n * @category extra\n */\nexport function takeWhile<T>(\n\tsource: Node<T>,\n\tpredicate: (value: T) => boolean,\n\topts?: ExtraOpts,\n): Node<T> {\n\tlet done = false;\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (done) return undefined;\n\t\t\tif (!predicate(v as T)) {\n\t\t\t\tdone = true;\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn v as T;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tif (done) {\n\t\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Forwards `source` until `notifier` matches `predicate` (default: notifier **`DATA`**), then **`COMPLETE`**.\n *\n * @param source - Main upstream.\n * @param notifier - Triggers completion when `predicate(msg)` is true.\n * @param opts - Optional {@link NodeOptions}, plus `predicate` for custom notifier matching.\n * @returns `Node<T>` - Truncated stream.\n *\n * @example\n * ```ts\n * import { producer, takeUntil, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const src = state(1);\n * const stop = producer((_d, a) => a.emit(undefined));\n * const n = takeUntil(src, stop);\n * ```\n *\n * @category extra\n */\nexport function takeUntil<T>(\n\tsource: Node<T>,\n\tnotifier: Node,\n\topts?: ExtraOpts & { predicate?: (msg: Message) => boolean },\n): Node<T> {\n\tconst pred = opts?.predicate ?? ((m: Message) => m[0] === DATA);\n\tconst { predicate: _, ...restOpts } = opts ?? {};\n\tlet stopped = false;\n\treturn node<T>(\n\t\t[source as Node, notifier],\n\t\t([v]) => {\n\t\t\tif (stopped) return undefined;\n\t\t\treturn v as T;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(restOpts as ExtraOpts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, i, a) {\n\t\t\t\tif (stopped) {\n\t\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (i === 1) {\n\t\t\t\t\tif (pred(msg)) {\n\t\t\t\t\t\tstopped = true;\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Emits the first **`DATA`** then **`COMPLETE`** (same as `take(source, 1)`).\n *\n * @param source - Upstream node.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Single-value stream.\n *\n * @example\n * ```ts\n * import { first, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = first(state(42));\n * ```\n *\n * @category extra\n */\nexport function first<T>(source: Node<T>, opts?: ExtraOpts): Node<T> {\n\treturn take(source, 1, opts);\n}\n\n/**\n * Buffers values and emits the last **`DATA`** on **`COMPLETE`**; optional `defaultValue` if none arrived.\n *\n * @param source - Upstream node.\n * @param options - Optional {@link NodeOptions} and `defaultValue` when empty.\n * @returns `Node<T>` - Last-or-default node.\n *\n * @example\n * ```ts\n * import { last, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = last(state(1), { defaultValue: 0 });\n * ```\n *\n * @category extra\n */\nexport function last<T>(source: Node<T>, options?: ExtraOpts & { defaultValue?: T }): Node<T> {\n\tconst { defaultValue, ...rest } = options ?? {};\n\tconst useDefault = options != null && Object.hasOwn(options, \"defaultValue\");\n\tlet lastVal: T | undefined;\n\tlet has = false;\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v]) => {\n\t\t\tlastVal = v as T;\n\t\t\thas = true;\n\t\t\treturn undefined;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(rest),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\tif (has) {\n\t\t\t\t\t\ta.emit(lastVal as T);\n\t\t\t\t\t} else if (useDefault) {\n\t\t\t\t\t\ta.emit(defaultValue as T);\n\t\t\t\t\t}\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Emits the first value matching `predicate`, then **`COMPLETE`**.\n *\n * @param source - Upstream node.\n * @param predicate - Match test.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - First-match stream.\n *\n * @example\n * ```ts\n * import { find, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = find(state(1), (x) => x > 0);\n * ```\n *\n * @category extra\n */\nexport function find<T>(\n\tsource: Node<T>,\n\tpredicate: (value: T) => boolean,\n\topts?: ExtraOpts,\n): Node<T> {\n\treturn take(filter(source, predicate, opts), 1, opts);\n}\n\n/**\n * Emits the `index`th **`DATA`** (zero-based), then **`COMPLETE`**.\n *\n * @param source - Upstream node.\n * @param index - Zero-based emission index.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Single indexed value.\n *\n * @example\n * ```ts\n * import { elementAt, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = elementAt(state(0), 2);\n * ```\n *\n * @category extra\n */\nexport function elementAt<T>(source: Node<T>, index: number, opts?: ExtraOpts): Node<T> {\n\treturn take(skip(source, index, opts), 1, opts);\n}\n\n/**\n * Prepends `initial` as **`DATA`**, then forwards every value from `source`.\n *\n * @param source - Upstream node.\n * @param initial - Value emitted before upstream.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Prefixed stream.\n *\n * @example\n * ```ts\n * import { startWith, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = startWith(state(2), 0);\n * ```\n *\n * @category extra\n */\nexport function startWith<T>(source: Node<T>, initial: T, opts?: ExtraOpts): Node<T> {\n\tlet prepended = false;\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (!prepended) {\n\t\t\t\tprepended = true;\n\t\t\t\ta.emit(initial);\n\t\t\t}\n\t\t\ta.emit(v as T);\n\t\t\treturn undefined;\n\t\t},\n\t\toperatorOpts(opts),\n\t);\n}\n\n/**\n * Observer shape for {@link tap} — side effects for data, error, and/or complete.\n */\nexport type TapObserver<T> = {\n\tdata?: (value: T) => void;\n\terror?: (err: unknown) => void;\n\tcomplete?: () => void;\n};\n\n/**\n * Invokes side effects; values pass through unchanged.\n *\n * Accepts either a function (called on each DATA) or an observer object\n * `{ data?, error?, complete? }` for lifecycle-aware side effects.\n *\n * @param source - Upstream node.\n * @param fnOrObserver - Side effect function or observer object.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Passthrough node.\n *\n * @example\n * ```ts\n * import { tap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * // Function form (DATA only)\n * tap(state(1), (x) => console.log(x));\n *\n * // Observer form (DATA + ERROR + COMPLETE)\n * tap(state(1), { data: console.log, error: console.error, complete: () => console.log(\"done\") });\n * ```\n *\n * @category extra\n */\nexport function tap<T>(\n\tsource: Node<T>,\n\tfnOrObserver: ((value: T) => void) | TapObserver<T>,\n\topts?: ExtraOpts,\n): Node<T> {\n\tif (typeof fnOrObserver === \"function\") {\n\t\treturn derived(\n\t\t\t[source as Node],\n\t\t\t([v]) => {\n\t\t\t\tfnOrObserver(v as T);\n\t\t\t\treturn v as T;\n\t\t\t},\n\t\t\toperatorOpts(opts),\n\t\t);\n\t}\n\tconst obs = fnOrObserver;\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v]) => {\n\t\t\tobs.data?.(v as T);\n\t\t\treturn v as T;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tobs.error?.(msg[1]);\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tobs.complete?.();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Suppresses adjacent duplicates using `equals` (default `Object.is`).\n *\n * @param source - Upstream node.\n * @param equals - Optional equality for consecutive values.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Deduped stream.\n *\n * @example\n * ```ts\n * import { distinctUntilChanged, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = distinctUntilChanged(state(1));\n * ```\n *\n * @category extra\n */\nexport function distinctUntilChanged<T>(\n\tsource: Node<T>,\n\tequals: (a: T, b: T) => boolean = Object.is,\n\topts?: ExtraOpts,\n): Node<T> {\n\treturn node<T>([source as Node], ([v]) => v as T, {\n\t\t...operatorOpts(opts),\n\t\tequals: equals as (a: unknown, b: unknown) => boolean,\n\t});\n}\n\n/**\n * Emits `[previous, current]` pairs starting after the second value (first pair uses `RESOLVED` only).\n *\n * @param source - Upstream node.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<readonly [T, T]>` - Pair stream.\n *\n * @example\n * ```ts\n * import { pairwise, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = pairwise(state(0));\n * ```\n *\n * @category extra\n */\nexport function pairwise<T>(source: Node<T>, opts?: ExtraOpts): Node<readonly [T, T]> {\n\tlet prev: T | undefined;\n\tlet hasPrev = false;\n\treturn node<readonly [T, T]>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tconst x = v as T;\n\t\t\tif (!hasPrev) {\n\t\t\t\tprev = x;\n\t\t\t\thasPrev = true;\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst pair = [prev as T, x] as const;\n\t\t\tprev = x;\n\t\t\treturn pair;\n\t\t},\n\t\toperatorOpts(opts),\n\t);\n}\n\n/**\n * Combines the latest value from each dependency whenever any dep settles (combineLatest).\n *\n * @param sources - Nodes to combine (variadic).\n * @returns `Node<T>` - Tuple of latest values.\n *\n * @example\n * ```ts\n * import { combine, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = combine(state(1), state(\"a\"));\n * ```\n *\n * @remarks\n * Unlike RxJS `combineLatest`, this is named `combine`. Use the {@link combineLatest} alias\n * if you prefer the RxJS name. Seed is always required for `scan`/`reduce` (no seedless mode).\n *\n * @category extra\n */\nexport function combine<const T extends readonly unknown[]>(\n\t...sources: { [K in keyof T]: Node<T[K]> }\n): Node<T> {\n\tconst deps = [...sources] as unknown as Node[];\n\treturn node<T>(deps, (vals) => vals as unknown as T, operatorOpts());\n}\n\n/**\n * When `primary` settles, emits `[primary, latestSecondary]`. `secondary` alone updates cache only.\n *\n * @param primary - Main stream.\n * @param secondary - Latest value is paired on each primary emission.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<readonly [A, B]>` - Paired stream.\n *\n * @example\n * ```ts\n * import { state, withLatestFrom } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = withLatestFrom(state(1), state(\"x\"));\n * ```\n *\n * @category extra\n */\nexport function withLatestFrom<A, B>(\n\tprimary: Node<A>,\n\tsecondary: Node<B>,\n\topts?: ExtraOpts,\n): Node<readonly [A, B]> {\n\tlet latestB: B | undefined;\n\tlet hasB = false;\n\treturn node<readonly [A, B]>([primary as Node, secondary as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tonMessage(msg, i, a) {\n\t\t\tif (i === 1 && (msg[0] === DATA || msg[0] === RESOLVED)) {\n\t\t\t\tlatestB = secondary.get() as B;\n\t\t\t\thasB = true;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0 && (msg[0] === DATA || msg[0] === RESOLVED)) {\n\t\t\t\tif (!hasB) {\n\t\t\t\t\tlatestB = secondary.get() as B;\n\t\t\t\t\thasB = true;\n\t\t\t\t}\n\t\t\t\ta.emit([primary.get() as A, latestB as B]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0 && msg[0] === DIRTY) {\n\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && msg[0] === DIRTY) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === COMPLETE || msg[0] === ERROR) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Merges **`DATA`** from any source with correct two-phase dirty tracking. **`COMPLETE`** after **all** sources complete (spec §1.3.5).\n *\n * @param sources - Nodes to merge (variadic; empty completes immediately).\n * @returns `Node<T>` - Merged stream.\n *\n * @remarks\n * **Ordering:** DIRTY/RESOLVED rules follow multi-source semantics in `~/src/graphrefly/GRAPHREFLY-SPEC.md`.\n *\n * @example\n * ```ts\n * import { merge, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = merge(state(1), state(2));\n * ```\n *\n * @category extra\n */\nexport function merge<T>(...sources: readonly Node<T>[]): Node<T> {\n\tif (sources.length === 0) {\n\t\treturn producer<T>((_d, a) => {\n\t\t\ta.down([[COMPLETE]]);\n\t\t\treturn undefined;\n\t\t}, operatorOpts());\n\t}\n\tconst deps = sources as unknown as Node[];\n\tconst n = deps.length;\n\tlet completed = 0;\n\tlet dirtyMask = 0n;\n\tlet anyData = false;\n\treturn node<T>(deps, () => undefined, {\n\t\t...operatorOpts(),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tconst bit = 1n << BigInt(i);\n\t\t\tif (t === DIRTY) {\n\t\t\t\tconst wasClean = dirtyMask === 0n;\n\t\t\t\tdirtyMask |= bit;\n\t\t\t\tif (wasClean) {\n\t\t\t\t\tanyData = false;\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\tif (dirtyMask & bit) {\n\t\t\t\t\tdirtyMask &= ~bit;\n\t\t\t\t\tif (dirtyMask === 0n && !anyData) {\n\t\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tdirtyMask &= ~bit;\n\t\t\t\tanyData = true;\n\t\t\t\ta.emit(msg[1]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\tdirtyMask &= ~bit;\n\t\t\t\tcompleted += 1;\n\t\t\t\tif (completed >= n) {\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Zips one **`DATA`** from each source per cycle into a tuple. Only **`DATA`** enqueues (spec §1.3.3).\n *\n * @param sources - Nodes to zip (variadic).\n * @returns `Node<T>` - Zipped tuples.\n *\n * @example\n * ```ts\n * import { state, zip } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = zip(state(1), state(2));\n * ```\n *\n * @category extra\n */\nexport function zip<const T extends readonly unknown[]>(\n\t...sources: { [K in keyof T]: Node<T[K]> }\n): Node<T> {\n\tconst n = sources.length;\n\tif (n === 0) {\n\t\treturn node<T>([], () => [] as unknown as T, operatorOpts());\n\t}\n\tconst deps = [...sources] as unknown as Node[];\n\tconst queues: unknown[][] = Array.from({ length: n }, () => []);\n\tlet dirtyMask = 0n;\n\tlet anyData = false;\n\tlet active = n;\n\n\tfunction tryEmit(a: { emit(v: T): void }) {\n\t\twhile (queues.every((q) => q.length > 0)) {\n\t\t\tconst tuple = queues.map((q) => q.shift()!) as unknown as T;\n\t\t\ta.emit(tuple);\n\t\t}\n\t}\n\n\treturn node<T>(deps, () => undefined, {\n\t\t...operatorOpts(),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tconst bit = 1n << BigInt(i);\n\t\t\tif (t === DIRTY) {\n\t\t\t\tconst wasClean = dirtyMask === 0n;\n\t\t\t\tdirtyMask |= bit;\n\t\t\t\tif (wasClean) {\n\t\t\t\t\tanyData = false;\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\tif (dirtyMask & bit) {\n\t\t\t\t\tdirtyMask &= ~bit;\n\t\t\t\t\tif (dirtyMask === 0n) {\n\t\t\t\t\t\tif (anyData) {\n\t\t\t\t\t\t\ttryEmit(a);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tdirtyMask &= ~bit;\n\t\t\t\tqueues[i].push(msg[1]);\n\t\t\t\tanyData = true;\n\t\t\t\tif (dirtyMask === 0n) {\n\t\t\t\t\ttryEmit(a);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\tactive -= 1;\n\t\t\t\tif (active === 0 || queues[i].length === 0) {\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Plays all of `firstSrc`, then all of `secondSrc`. **`DATA`** from `secondSrc` during phase one is buffered until handoff.\n *\n * @param firstSrc - First segment.\n * @param secondSrc - Second segment.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Concatenated stream.\n *\n * @example\n * ```ts\n * import { concat, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = concat(state(1), state(2));\n * ```\n *\n * @category extra\n */\nexport function concat<T>(firstSrc: Node<T>, secondSrc: Node<T>, opts?: ExtraOpts): Node<T> {\n\tlet phase: 0 | 1 = 0;\n\tconst pending: unknown[] = [];\n\treturn node<T>([firstSrc as Node, secondSrc as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (phase === 0 && i === 1) {\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tpending.push(msg[1]);\n\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (phase === 0 && i === 0) {\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tphase = 1;\n\t\t\t\t\tfor (const v of pending) {\n\t\t\t\t\t\ta.emit(v as T);\n\t\t\t\t\t}\n\t\t\t\t\tpending.length = 0;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (phase === 1 && i === 0) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (phase === 1 && i === 1) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * First source to emit **`DATA`** wins; later traffic follows only the winner (Rx-style `race`).\n *\n * @param sources - Contestants (variadic; empty completes immediately; one node is identity).\n * @returns `Node<T>` - Winning stream.\n *\n * @example\n * ```ts\n * import { race, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = race(state(1), state(2));\n * ```\n *\n * @category extra\n */\nexport function race<T>(...sources: readonly Node<T>[]): Node<T> {\n\tif (sources.length === 0) {\n\t\treturn producer<T>((_d, a) => {\n\t\t\ta.down([[COMPLETE]]);\n\t\t\treturn undefined;\n\t\t}, operatorOpts());\n\t}\n\tif (sources.length === 1) {\n\t\treturn node<T>([sources[0] as Node], ([v]) => v as T, operatorOpts());\n\t}\n\tconst deps = sources as unknown as Node[];\n\tlet winner: number | null = null;\n\treturn node<T>(deps, () => undefined, {\n\t\t...operatorOpts(),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (winner !== null && i !== winner) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA && winner === null) {\n\t\t\t\twinner = i;\n\t\t\t\ta.emit(msg[1]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (winner !== null && i === winner) {\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\ta.emit(msg[1]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (winner === null) {\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE || t === ERROR) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n// --- Tier 2: async / dynamic (roadmap §2.2), all on `node` / `producer` ---\n\nfunction forwardInner<R>(inner: Node<R>, a: NodeActions, onInnerComplete: () => void): () => void {\n\tlet unsub: (() => void) | undefined;\n\tlet finished = false;\n\tlet emitted = false;\n\tconst finish = (): void => {\n\t\tif (finished) return;\n\t\tfinished = true;\n\t\tonInnerComplete();\n\t};\n\tunsub = inner.subscribe((msgs) => {\n\t\tlet sawComplete = false;\n\t\tlet sawError = false;\n\t\tconst out: Message[] = [];\n\t\tfor (const m of msgs) {\n\t\t\tif (m[0] === DATA) emitted = true;\n\t\t\tif (m[0] === COMPLETE) sawComplete = true;\n\t\t\telse {\n\t\t\t\tif (m[0] === ERROR) sawError = true;\n\t\t\t\tout.push(m);\n\t\t\t}\n\t\t}\n\t\tif (out.length > 0) a.down(out as unknown as Messages);\n\t\tif (sawError) {\n\t\t\tunsub?.();\n\t\t\tunsub = undefined;\n\t\t\tfinish();\n\t\t} else if (sawComplete) {\n\t\t\tfinish();\n\t\t}\n\t});\n\tif (!emitted && (inner.status === \"settled\" || inner.status === \"resolved\")) {\n\t\ta.emit(inner.get() as R);\n\t}\n\tif (inner.status === \"completed\" || inner.status === \"errored\") {\n\t\tfinish();\n\t}\n\treturn () => {\n\t\tunsub?.();\n\t\tunsub = undefined;\n\t};\n}\n\n/**\n * Maps each settled value to an inner node; unsubscribes the previous inner (Rx-style `switchMap`).\n *\n * @param source - Upstream node.\n * @param project - Maps each outer value to an inner source shape (`Node`, scalar, `PromiseLike`, `Iterable`, or `AsyncIterable`) coerced via {@link fromAny}.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Emissions from the active inner subscription.\n * @example\n * ```ts\n * import { switchMap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const src = state(0);\n * switchMap(src, (n) => state((n as number) * 2));\n * ```\n *\n * @category extra\n */\nexport function switchMap<T, R>(\n\tsource: Node<T>,\n\tproject: (value: T) => NodeInput<R>,\n\topts?: ExtraOpts,\n): Node<R> {\n\tlet innerUnsub: (() => void) | undefined;\n\tlet sourceDone = false;\n\tlet attached = false;\n\n\tfunction clearInner(): void {\n\t\tinnerUnsub?.();\n\t\tinnerUnsub = undefined;\n\t}\n\n\tfunction attach(v: T, a: NodeActions): void {\n\t\tattached = true;\n\t\tclearInner();\n\t\tinnerUnsub = forwardInner(fromAny(project(v)), a, () => {\n\t\t\tclearInner();\n\t\t\tif (sourceDone) a.down([[COMPLETE]]);\n\t\t});\n\t}\n\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\t// Skip if onMessage already handled the initial DATA during connect.\n\t\t\tif (!attached) attach(v as T, a);\n\t\t\treturn clearInner;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tclearInner();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tsourceDone = true;\n\t\t\t\t\tif (innerUnsub === undefined) a.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tattach(msg[1] as T, a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Like {@link switchMap}, but ignores outer `DATA` while an inner subscription is active (`exhaustMap`).\n *\n * @param source - Upstream node.\n * @param project - Maps each outer value to an inner source shape (`Node`, scalar, `PromiseLike`, `Iterable`, or `AsyncIterable`) coerced via {@link fromAny}.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Emissions from the active inner while it runs.\n * @example\n * ```ts\n * import { exhaustMap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * exhaustMap(state(0), () => state(1));\n * ```\n *\n * @category extra\n */\nexport function exhaustMap<T, R>(\n\tsource: Node<T>,\n\tproject: (value: T) => NodeInput<R>,\n\topts?: ExtraOpts,\n): Node<R> {\n\tlet innerUnsub: (() => void) | undefined;\n\tlet sourceDone = false;\n\tlet attached = false;\n\n\tfunction clearInner(): void {\n\t\tinnerUnsub?.();\n\t\tinnerUnsub = undefined;\n\t}\n\n\tfunction attach(v: T, a: NodeActions): void {\n\t\tattached = true;\n\t\tinnerUnsub = forwardInner(fromAny(project(v)), a, () => {\n\t\t\tclearInner();\n\t\t\tif (sourceDone) a.down([[COMPLETE]]);\n\t\t});\n\t}\n\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (!attached && innerUnsub === undefined) attach(v as T, a);\n\t\t\treturn clearInner;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tclearInner();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tsourceDone = true;\n\t\t\t\t\tif (innerUnsub === undefined) a.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tif (innerUnsub !== undefined) {\n\t\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tattach(msg[1] as T, a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Enqueues each outer value and subscribes to inners one at a time (`concatMap`).\n *\n * @param source - Upstream node.\n * @param project - Maps each outer value to an inner source shape (`Node`, scalar, `PromiseLike`, `Iterable`, or `AsyncIterable`) coerced via {@link fromAny}.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Sequential concatenation of inner streams.\n * @example\n * ```ts\n * import { concatMap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * concatMap(state(0), (n) => state((n as number) + 1));\n * ```\n *\n * @category extra\n */\nexport function concatMap<T, R>(\n\tsource: Node<T>,\n\tproject: (value: T) => NodeInput<R>,\n\topts?: ExtraOpts & { maxBuffer?: number },\n): Node<R> {\n\tconst { maxBuffer: maxBuf, ...concatNodeOpts } = opts ?? {};\n\tconst queue: T[] = [];\n\tlet innerUnsub: (() => void) | undefined;\n\tlet sourceDone = false;\n\tlet attached = false;\n\n\tfunction clearInner(): void {\n\t\tinnerUnsub?.();\n\t\tinnerUnsub = undefined;\n\t}\n\n\tfunction tryPump(a: NodeActions): void {\n\t\tif (innerUnsub !== undefined) return;\n\t\tif (queue.length === 0) {\n\t\t\tif (sourceDone) a.down([[COMPLETE]]);\n\t\t\treturn;\n\t\t}\n\t\tconst v = queue.shift()!;\n\t\tinnerUnsub = forwardInner(fromAny(project(v)), a, () => {\n\t\t\tclearInner();\n\t\t\ttryPump(a);\n\t\t});\n\t}\n\n\tfunction enqueue(v: T, a: NodeActions): void {\n\t\tattached = true;\n\t\tif (maxBuf && maxBuf > 0 && queue.length >= maxBuf) queue.shift();\n\t\tqueue.push(v);\n\t\ttryPump(a);\n\t}\n\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (!attached) enqueue(v as T, a);\n\t\t\treturn clearInner;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(concatNodeOpts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tclearInner();\n\t\t\t\t\tqueue.length = 0;\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tsourceDone = true;\n\t\t\t\t\ttryPump(a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tenqueue(msg[1] as T, a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/** Options for {@link mergeMap}. */\nexport type MergeMapOptions = ExtraOpts & {\n\t/** Maximum number of concurrent inner subscriptions. Default: `Infinity` (unbounded). */\n\tconcurrent?: number;\n};\n\n/**\n * Subscribes to inner nodes in parallel (up to `concurrent`) and merges outputs (`mergeMap` / `flatMap`).\n *\n * @param source - Upstream node.\n * @param project - Maps each outer value to an inner source shape (`Node`, scalar, `PromiseLike`, `Iterable`, or `AsyncIterable`) coerced via {@link fromAny}.\n * @param opts - Optional options including `concurrent` limit.\n * @returns `Node<R>` - Merged output of all active inners; completes when the outer and every inner complete.\n * @example\n * ```ts\n * import { mergeMap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * // Unbounded (default)\n * mergeMap(state(0), (n) => state((n as number) + 1));\n *\n * // Limited concurrency\n * mergeMap(state(0), (n) => state((n as number) + 1), { concurrent: 3 });\n * ```\n *\n * @category extra\n */\nexport function mergeMap<T, R>(\n\tsource: Node<T>,\n\tproject: (value: T) => NodeInput<R>,\n\topts?: MergeMapOptions,\n): Node<R> {\n\tconst { concurrent: concurrentOpt, ...mergeNodeOpts } = opts ?? {};\n\tconst maxConcurrent =\n\t\tconcurrentOpt != null && concurrentOpt > 0 ? concurrentOpt : Number.POSITIVE_INFINITY;\n\tlet active = 0;\n\tlet sourceDone = false;\n\tconst innerStops = new Set<() => void>();\n\tconst buffer: T[] = [];\n\n\tfunction tryComplete(a: NodeActions): void {\n\t\tif (sourceDone && active === 0 && buffer.length === 0) a.down([[COMPLETE]]);\n\t}\n\n\tfunction spawn(v: T, a: NodeActions): void {\n\t\tactive++;\n\t\tconst inner = fromAny(project(v));\n\t\tlet stop: (() => void) | undefined;\n\t\tconst runStop = (): void => {\n\t\t\tstop?.();\n\t\t\tif (stop !== undefined) innerStops.delete(stop);\n\t\t\tstop = undefined;\n\t\t};\n\t\tstop = inner.subscribe((msgs) => {\n\t\t\tlet sawComplete = false;\n\t\t\tconst out: Message[] = [];\n\t\t\tfor (const m of msgs) {\n\t\t\t\tif (m[0] === COMPLETE) sawComplete = true;\n\t\t\t\telse out.push(m);\n\t\t\t}\n\t\t\tif (out.length > 0) a.down(out as unknown as Messages);\n\t\t\tif (sawComplete) {\n\t\t\t\trunStop();\n\t\t\t\tactive--;\n\t\t\t\tdrainBuffer(a);\n\t\t\t\ttryComplete(a);\n\t\t\t}\n\t\t});\n\t\tinnerStops.add(stop);\n\t}\n\n\tfunction drainBuffer(a: NodeActions): void {\n\t\twhile (buffer.length > 0 && active < maxConcurrent) {\n\t\t\tspawn(buffer.shift()!, a);\n\t\t}\n\t}\n\n\tfunction enqueue(v: T, a: NodeActions): void {\n\t\tif (active < maxConcurrent) {\n\t\t\tspawn(v, a);\n\t\t} else {\n\t\t\tbuffer.push(v);\n\t\t}\n\t}\n\n\tfunction clearAll(): void {\n\t\tfor (const u of innerStops) u();\n\t\tinnerStops.clear();\n\t\tactive = 0;\n\t\tbuffer.length = 0;\n\t}\n\n\tlet attached = false;\n\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (!attached) {\n\t\t\t\tattached = true;\n\t\t\t\tenqueue(v as T, a);\n\t\t\t}\n\t\t\treturn clearAll;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(mergeNodeOpts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tclearAll();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tsourceDone = true;\n\t\t\t\t\ttryComplete(a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tenqueue(msg[1] as T, a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * RxJS-named alias for {@link mergeMap} — projects each `DATA` to an inner node and merges outputs.\n *\n * @param source - Upstream node.\n * @param project - Returns an inner `Node<R>` per value.\n * @param opts - Optional concurrency cap and node options (excluding `describeKind`).\n * @returns Merged projection; behavior matches `mergeMap`.\n *\n * @example\n * ```ts\n * import { flatMap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * flatMap(state(0), (n) => state(n));\n * ```\n *\n * @category extra\n */\nexport const flatMap = mergeMap;\n\n/**\n * Delays phase-2 emissions by `ms` (timers). `DIRTY` still forwards immediately.\n *\n * @param source - Upstream node.\n * @param ms - Delay in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Same values, shifted in time.\n * @example\n * ```ts\n * import { delay, state } from \"@graphrefly/graphrefly-ts\";\n *\n * delay(state(1), 100);\n * ```\n *\n * @category extra\n */\nexport function delay<T>(source: Node<T>, ms: number, opts?: ExtraOpts): Node<T> {\n\tconst timers = new Set<ReturnType<typeof setTimeout>>();\n\tfunction clearAll(): void {\n\t\tfor (const id of timers) clearTimeout(id);\n\t\ttimers.clear();\n\t}\n\treturn node<T>([source as Node], () => clearAll, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === DIRTY || t === ERROR || t === COMPLETE || t === PAUSE || t === RESUME) {\n\t\t\t\tif (t === COMPLETE) clearAll();\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tconst id = setTimeout(() => {\n\t\t\t\t\ttimers.delete(id);\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t}, ms);\n\t\t\t\ttimers.add(id);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Emits the latest value only after `ms` quiet time since the last trigger (`debounce`).\n *\n * @param source - Upstream node.\n * @param ms - Quiet window in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Debounced stream.\n * @example\n * ```ts\n * import { debounce, state } from \"@graphrefly/graphrefly-ts\";\n *\n * debounce(state(0), 50);\n * ```\n *\n * @category extra\n */\nexport function debounce<T>(source: Node<T>, ms: number, opts?: ExtraOpts): Node<T> {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet pending: T | undefined;\n\tfunction clearTimer(): void {\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t}\n\treturn node<T>([source as Node], () => clearTimer, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === ERROR || t === PAUSE || t === RESUME) {\n\t\t\t\tclearTimer();\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\tif (timer !== undefined) {\n\t\t\t\t\tclearTimer();\n\t\t\t\t\ta.emit(pending as T);\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DIRTY) {\n\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tclearTimer();\n\t\t\t\tpending = msg[1] as T;\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t\ta.emit(pending as T);\n\t\t\t\t}, ms);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\nexport type ThrottleOptions = { leading?: boolean; trailing?: boolean };\n\n/**\n * Rate-limits emissions to at most once per `ms` window (`throttleTime`).\n *\n * @param source - Upstream node.\n * @param ms - Minimum spacing in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`) plus `leading` / `trailing`.\n * @returns `Node<T>` - Throttled stream.\n * @example\n * ```ts\n * import { throttle, state } from \"@graphrefly/graphrefly-ts\";\n *\n * throttle(state(0), 1_000, { trailing: false });\n * ```\n *\n * @category extra\n */\nexport function throttle<T>(\n\tsource: Node<T>,\n\tms: number,\n\topts?: ExtraOpts & ThrottleOptions,\n): Node<T> {\n\tconst { leading: leadingOpt, trailing: trailingOpt, ...throttleNodeOpts } = opts ?? {};\n\tconst leading = leadingOpt !== false;\n\tconst trailing = trailingOpt === true;\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tconst windowNs = ms * NS_PER_MS;\n\tlet lastEmitNs = -Infinity;\n\tlet pending: T | undefined;\n\tlet hasPending = false;\n\n\tfunction clearTimer(): void {\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t}\n\n\treturn node<T>(\n\t\t[source as Node],\n\t\t() => {\n\t\t\tclearTimer();\n\t\t\treturn undefined;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(throttleNodeOpts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR || t === COMPLETE || t === PAUSE || t === RESUME) {\n\t\t\t\t\tclearTimer();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tconst v = msg[1] as T;\n\t\t\t\t\tconst nowNs = monotonicNs();\n\t\t\t\t\tif (leading && nowNs - lastEmitNs >= windowNs) {\n\t\t\t\t\t\tlastEmitNs = nowNs;\n\t\t\t\t\t\ta.emit(v);\n\t\t\t\t\t\tclearTimer();\n\t\t\t\t\t\tif (trailing) {\n\t\t\t\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\t\t\t\ttimer = undefined;\n\t\t\t\t\t\t\t\tif (hasPending) {\n\t\t\t\t\t\t\t\t\tlastEmitNs = monotonicNs();\n\t\t\t\t\t\t\t\t\ta.emit(pending as T);\n\t\t\t\t\t\t\t\t\thasPending = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, ms);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (trailing) {\n\t\t\t\t\t\tpending = v;\n\t\t\t\t\t\thasPending = true;\n\t\t\t\t\t\tif (timer === undefined) {\n\t\t\t\t\t\t\tconst elapsedMs = (nowNs - lastEmitNs) / NS_PER_MS;\n\t\t\t\t\t\t\ttimer = setTimeout(\n\t\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\t\ttimer = undefined;\n\t\t\t\t\t\t\t\t\tif (hasPending) {\n\t\t\t\t\t\t\t\t\t\tlastEmitNs = monotonicNs();\n\t\t\t\t\t\t\t\t\t\ta.emit(pending as T);\n\t\t\t\t\t\t\t\t\t\thasPending = false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tMath.max(0, ms - elapsedMs),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Emits the most recent source value whenever `notifier` settles (`sample`).\n *\n * @param source - Node whose latest value is sampled.\n * @param notifier - When this node settles (`DATA` / `RESOLVED`), a sample is taken.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Sampled snapshots of `source`.\n * @remarks **Undefined payload:** If `T` includes `undefined`, `get() === undefined` is treated as “no snapshot” and the operator emits `RESOLVED` instead of `DATA`.\n * @example\n * ```ts\n * import { sample, state } from \"@graphrefly/graphrefly-ts\";\n *\n * sample(state(1), state(0));\n * ```\n *\n * @category extra\n */\nexport function sample<T>(source: Node<T>, notifier: Node<unknown>, opts?: ExtraOpts): Node<T> {\n\treturn node<T>([source as Node, notifier as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === ERROR) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === DATA) {\n\t\t\t\t// Emit the latest source value when notifier fires.\n\t\t\t\t// `undefined` is a valid value (Node<void>); always emit.\n\t\t\t\ta.emit((source as Node<T>).get() as T);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === RESOLVED) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n/**\n * After each source `DATA`, waits `ms` then emits the latest value if another `DATA` has not arrived (`auditTime` / trailing window).\n *\n * @param source - Upstream node.\n * @param ms - Window in milliseconds after each `DATA`.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Trailing-edge sampled stream.\n * @example\n * ```ts\n * import { audit, state } from \"@graphrefly/graphrefly-ts\";\n *\n * audit(state(0), 100);\n * ```\n *\n * @category extra\n */\nexport function audit<T>(source: Node<T>, ms: number, opts?: ExtraOpts): Node<T> {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet latest: T | undefined;\n\tlet has = false;\n\n\tfunction clearTimer(): void {\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t}\n\n\treturn node<T>([source as Node], () => clearTimer, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === ERROR || t === COMPLETE || t === PAUSE || t === RESUME) {\n\t\t\t\tclearTimer();\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DIRTY) {\n\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tlatest = msg[1] as T;\n\t\t\t\thas = true;\n\t\t\t\tclearTimer();\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t\tif (has) {\n\t\t\t\t\t\thas = false;\n\t\t\t\t\t\ta.emit(latest as T);\n\t\t\t\t\t}\n\t\t\t\t}, ms);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Errors if no `DATA` arrives within `ms` after subscribe or after the previous `DATA`.\n *\n * @param source - Upstream node.\n * @param ms - Idle budget in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`) and `with` for a custom error payload.\n * @returns `Node<T>` - Pass-through with idle watchdog.\n * @example\n * ```ts\n * import { timeout, state } from \"@graphrefly/graphrefly-ts\";\n *\n * timeout(state(0), 5_000);\n * ```\n *\n * @category extra\n */\nexport function timeout<T>(\n\tsource: Node<T>,\n\tms: number,\n\topts?: ExtraOpts & { with?: unknown },\n): Node<T> {\n\tconst { with: withPayload, ...timeoutNodeOpts } = opts ?? {};\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tconst err = withPayload ?? new Error(\"timeout\");\n\n\tfunction arm(a: NodeActions): void {\n\t\tclearTimeout(timer);\n\t\ttimer = setTimeout(() => {\n\t\t\ttimer = undefined;\n\t\t\ta.down([[ERROR, err]]);\n\t\t}, ms);\n\t}\n\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([_v], a) => {\n\t\t\tarm(a);\n\t\t\treturn () => clearTimeout(timer);\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(timeoutNodeOpts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tarm(a);\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE || t === ERROR) {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY || t === RESOLVED) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Buffers source `DATA` values; flushes an array when `notifier` settles (`buffer`).\n *\n * @param source - Upstream node.\n * @param notifier - Flush trigger on each settlement.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T[]>` - Emits buffered arrays (may be empty-handled via `RESOLVED` when nothing buffered).\n * @example\n * ```ts\n * import { buffer, state } from \"@graphrefly/graphrefly-ts\";\n *\n * buffer(state(0), state(0));\n * ```\n *\n * @category extra\n */\nexport function buffer<T>(source: Node<T>, notifier: Node<unknown>, opts?: ExtraOpts): Node<T[]> {\n\tconst buf: T[] = [];\n\treturn node<T[]>([source as Node, notifier as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === ERROR) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE && i === 0) {\n\t\t\t\tif (buf.length > 0) a.emit([...buf]);\n\t\t\t\tbuf.length = 0;\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE && i === 1) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0 && t === DATA) {\n\t\t\t\tbuf.push(msg[1] as T);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === DATA) {\n\t\t\t\tif (buf.length > 0) {\n\t\t\t\t\ta.emit([...buf]);\n\t\t\t\t\tbuf.length = 0;\n\t\t\t\t} else {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === RESOLVED) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0 && (t === DIRTY || t === RESOLVED)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n/**\n * Batches consecutive `DATA` values into arrays of length `count` (`bufferCount` / `windowCount`).\n *\n * @param source - Upstream node.\n * @param count - Buffer size before emit; must be > 0.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T[]>` - Emits fixed-size arrays; remainder flushes on `COMPLETE`.\n * @example\n * ```ts\n * import { bufferCount, state } from \"@graphrefly/graphrefly-ts\";\n *\n * bufferCount(state(0), 3);\n * ```\n *\n * @category extra\n */\nexport function bufferCount<T>(source: Node<T>, count: number, opts?: ExtraOpts): Node<T[]> {\n\tif (count <= 0) throw new RangeError(\"bufferCount expects count > 0\");\n\tconst buf: T[] = [];\n\tlet started = false;\n\treturn node<T[]>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\t// onMessage intercepts subsequent DATA; compute fn only runs on initial connect.\n\t\t\tif (!started) {\n\t\t\t\tstarted = true;\n\t\t\t\tbuf.push(v as T);\n\t\t\t\tif (buf.length >= count) {\n\t\t\t\t\ta.emit(buf.splice(0, buf.length));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tif (buf.length > 0) a.emit([...buf]);\n\t\t\t\t\tbuf.length = 0;\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tbuf.push(msg[1] as T);\n\t\t\t\t\tif (buf.length >= count) {\n\t\t\t\t\t\ta.emit(buf.splice(0, buf.length));\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Splits source `DATA` into sub-nodes of `count` values each. Each sub-node completes after `count` items or when source completes.\n *\n * @param source - Upstream node.\n * @param count - Items per window.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<Node<T>>` - Each emission is a sub-node carrying that window's values.\n *\n * @example\n * ```ts\n * import { windowCount, state } from \"@graphrefly/graphrefly-ts\";\n *\n * windowCount(state(0), 3);\n * ```\n *\n * @category extra\n */\nexport function windowCount<T>(source: Node<T>, count: number, opts?: ExtraOpts): Node<Node<T>> {\n\tif (count <= 0) throw new RangeError(\"windowCount expects count > 0\");\n\tlet win: Node<T> | undefined;\n\tlet winDown: ((msgs: Messages) => void) | undefined;\n\tlet n = 0;\n\n\tfunction openWindow(a: NodeActions): void {\n\t\tconst s = producer<T>((_d, actions) => {\n\t\t\twinDown = actions.down.bind(actions);\n\t\t\treturn () => {\n\t\t\t\twinDown = undefined;\n\t\t\t};\n\t\t}, operatorOpts());\n\t\twin = s;\n\t\tn = 0;\n\t\ta.emit(s);\n\t}\n\n\treturn node<Node<T>>([source as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === DATA) {\n\t\t\t\tif (!win) openWindow(a);\n\t\t\t\twinDown?.([[DATA, msg[1]]]);\n\t\t\t\tn += 1;\n\t\t\t\tif (n >= count) {\n\t\t\t\t\twinDown?.([[COMPLETE]]);\n\t\t\t\t\twin = undefined;\n\t\t\t\t\twinDown = undefined;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\twinDown?.([[COMPLETE]]);\n\t\t\t\twin = undefined;\n\t\t\t\twinDown = undefined;\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\twinDown?.([msg]);\n\t\t\t\twin = undefined;\n\t\t\t\twinDown = undefined;\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DIRTY) {\n\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n/**\n * Flushes buffered `DATA` values every `ms` (`bufferTime` / `windowTime`).\n *\n * @param source - Upstream node.\n * @param ms - Flush interval in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T[]>` - Time-windowed batches.\n * @example\n * ```ts\n * import { bufferTime, state } from \"@graphrefly/graphrefly-ts\";\n *\n * bufferTime(state(0), 250);\n * ```\n *\n * @category extra\n */\nexport function bufferTime<T>(source: Node<T>, ms: number, opts?: ExtraOpts): Node<T[]> {\n\tconst buf: T[] = [];\n\tlet iv: ReturnType<typeof setInterval> | undefined;\n\treturn node<T[]>(\n\t\t[source as Node],\n\t\t(_deps, a) => {\n\t\t\tiv = setInterval(() => {\n\t\t\t\tif (buf.length > 0) {\n\t\t\t\t\ta.emit([...buf]);\n\t\t\t\t\tbuf.length = 0;\n\t\t\t\t}\n\t\t\t}, ms);\n\t\t\treturn () => {\n\t\t\t\tif (iv !== undefined) clearInterval(iv);\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tif (iv !== undefined) clearInterval(iv);\n\t\t\t\t\tif (buf.length > 0) a.emit([...buf]);\n\t\t\t\t\tbuf.length = 0;\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tbuf.push(msg[1] as T);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Splits source `DATA` into time-windowed sub-nodes; each window lasts `ms`.\n *\n * @param source - Upstream node.\n * @param ms - Window duration in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<Node<T>>` - Each emission is a sub-node carrying that window's values.\n *\n * @example\n * ```ts\n * import { windowTime, state } from \"@graphrefly/graphrefly-ts\";\n *\n * windowTime(state(0), 500);\n * ```\n *\n * @category extra\n */\nexport function windowTime<T>(source: Node<T>, ms: number, opts?: ExtraOpts): Node<Node<T>> {\n\tlet winDown: ((msgs: Messages) => void) | undefined;\n\tlet iv: ReturnType<typeof setInterval> | undefined;\n\n\tfunction closeWindow(): void {\n\t\twinDown?.([[COMPLETE]]);\n\t\twinDown = undefined;\n\t}\n\n\treturn node<Node<T>>(\n\t\t[source as Node],\n\t\t(_deps, a) => {\n\t\t\tfunction openWindow(): void {\n\t\t\t\tconst s = producer<T>((_d, actions) => {\n\t\t\t\t\twinDown = actions.down.bind(actions);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\twinDown = undefined;\n\t\t\t\t\t};\n\t\t\t\t}, operatorOpts());\n\t\t\t\ta.emit(s);\n\t\t\t}\n\t\t\topenWindow();\n\t\t\tiv = setInterval(() => {\n\t\t\t\tcloseWindow();\n\t\t\t\topenWindow();\n\t\t\t}, ms);\n\t\t\treturn () => {\n\t\t\t\tif (iv !== undefined) clearInterval(iv);\n\t\t\t\tcloseWindow();\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\twinDown?.([[DATA, msg[1]]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tif (iv !== undefined) clearInterval(iv);\n\t\t\t\t\tcloseWindow();\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tif (iv !== undefined) clearInterval(iv);\n\t\t\t\t\twinDown?.([msg]);\n\t\t\t\t\tcloseWindow();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Splits source `DATA` into sub-nodes, opening a new window each time `notifier` emits `DATA`.\n *\n * @param source - Upstream node.\n * @param notifier - Each `DATA` from `notifier` closes the current window and opens a new one.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<Node<T>>` - Each emission is a sub-node carrying that window's values.\n *\n * @example\n * ```ts\n * import { state, window } from \"@graphrefly/graphrefly-ts\";\n *\n * window(state(0), state(0));\n * ```\n *\n * @category extra\n */\nexport function window<T>(\n\tsource: Node<T>,\n\tnotifier: Node<unknown>,\n\topts?: ExtraOpts,\n): Node<Node<T>> {\n\tlet win: Node<T> | undefined;\n\tlet winDown: ((msgs: Messages) => void) | undefined;\n\n\tfunction closeWindow(): void {\n\t\twinDown?.([[COMPLETE]]);\n\t\twin = undefined;\n\t\twinDown = undefined;\n\t}\n\n\treturn node<Node<T>>([source as Node, notifier as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (i === 0 && t === DATA) {\n\t\t\t\tif (!win) {\n\t\t\t\t\tconst s = producer<T>((_d, actions) => {\n\t\t\t\t\t\twinDown = actions.down.bind(actions);\n\t\t\t\t\t\treturn () => {\n\t\t\t\t\t\t\twinDown = undefined;\n\t\t\t\t\t\t};\n\t\t\t\t\t}, operatorOpts());\n\t\t\t\t\twin = s;\n\t\t\t\t\ta.emit(s);\n\t\t\t\t}\n\t\t\t\twinDown?.([[DATA, msg[1]]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === DATA) {\n\t\t\t\tcloseWindow();\n\t\t\t\tconst s = producer<T>((_d, actions) => {\n\t\t\t\t\twinDown = actions.down.bind(actions);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\twinDown = undefined;\n\t\t\t\t\t};\n\t\t\t\t}, operatorOpts());\n\t\t\t\twin = s;\n\t\t\t\ta.emit(s);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE && i === 0) {\n\t\t\t\tcloseWindow();\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE && i === 1) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\twinDown?.([msg]);\n\t\t\t\twin = undefined;\n\t\t\t\twinDown = undefined;\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0 && (t === DIRTY || t === RESOLVED)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === RESOLVED) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n/**\n * Increments on each tick (`interval`); uses `setInterval` via {@link producer}.\n *\n * @param periodMs - Time between ticks.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<number>` - Emits `0`, `1`, `2`, … while subscribed.\n * @example\n * ```ts\n * import { interval } from \"@graphrefly/graphrefly-ts\";\n *\n * interval(1_000);\n * ```\n *\n * @category extra\n */\nexport function interval(periodMs: number, opts?: ExtraOpts): Node<number> {\n\tlet n = 0;\n\treturn producer<number>((_d, a) => {\n\t\tconst id = setInterval(() => {\n\t\t\ta.emit(n);\n\t\t\tn += 1;\n\t\t}, periodMs);\n\t\treturn () => clearInterval(id);\n\t}, operatorOpts(opts));\n}\n\n/**\n * Subscribes to `source` repeatedly (`count` times, sequentially). Best with a fresh or `resubscribable` source.\n *\n * @param source - Upstream node to replay.\n * @param count - Number of subscription rounds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Forwards each round then completes after the last inner `COMPLETE`.\n * @example\n * ```ts\n * import { repeat, state } from \"@graphrefly/graphrefly-ts\";\n *\n * repeat(state(1, { resubscribable: true }), 2);\n * ```\n *\n * @category extra\n */\nexport function repeat<T>(source: Node<T>, count: number, opts?: ExtraOpts): Node<T> {\n\tif (count <= 0) throw new RangeError(\"repeat expects count > 0\");\n\treturn producer<T>((_d, a) => {\n\t\tlet remaining = count;\n\t\tlet innerU: (() => void) | undefined;\n\n\t\tconst start = (): void => {\n\t\t\tinnerU?.();\n\t\t\tinnerU = source.subscribe((msgs) => {\n\t\t\t\tlet completed = false;\n\t\t\t\tconst fwd: Message[] = [];\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === COMPLETE) completed = true;\n\t\t\t\t\telse fwd.push(m);\n\t\t\t\t}\n\t\t\t\tif (fwd.length > 0) a.down(fwd as unknown as Messages);\n\t\t\t\tif (completed) {\n\t\t\t\t\tinnerU?.();\n\t\t\t\t\tinnerU = undefined;\n\t\t\t\t\tremaining -= 1;\n\t\t\t\t\tif (remaining > 0) start();\n\t\t\t\t\telse a.down([[COMPLETE]]);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tstart();\n\t\treturn () => {\n\t\t\tinnerU?.();\n\t\t};\n\t}, operatorOpts(opts));\n}\n\n/**\n * While `PAUSE` is in effect, buffers `DIRTY` / `DATA` / `RESOLVED`; flushes on `RESUME`.\n *\n * @param source - Upstream node.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Pass-through with pause buffering.\n * @example\n * ```ts\n * import { pausable, state, PAUSE, RESUME } from \"@graphrefly/graphrefly-ts\";\n *\n * const s = state(0);\n * pausable(s);\n * s.down([[PAUSE]]);\n * s.down([[RESUME]]);\n * ```\n *\n * @category extra\n */\nexport function pausable<T>(source: Node<T>, opts?: ExtraOpts): Node<T> {\n\tlet paused = false;\n\tconst backlog: Message[] = [];\n\n\treturn node<T>([source as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === PAUSE) {\n\t\t\t\tpaused = true;\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESUME) {\n\t\t\t\tpaused = false;\n\t\t\t\ta.down([msg]);\n\t\t\t\tfor (const m of backlog) a.down([m]);\n\t\t\t\tbacklog.length = 0;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (paused && (t === DIRTY || t === DATA || t === RESOLVED)) {\n\t\t\t\tbacklog.push(msg);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Replaces an upstream `ERROR` with a recovered value (`catchError`-style).\n *\n * @param source - Upstream node.\n * @param recover - Maps the error payload to a replacement value; if it throws, `ERROR` is forwarded.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Recovered stream.\n * @example\n * ```ts\n * import { rescue, state } from \"@graphrefly/graphrefly-ts\";\n *\n * rescue(state(0), () => 0);\n * ```\n *\n * @category extra\n */\nexport function rescue<T>(\n\tsource: Node<T>,\n\trecover: (err: unknown) => T,\n\topts?: ExtraOpts,\n): Node<T> {\n\treturn node<T>([source as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tif (msg[0] === ERROR) {\n\t\t\t\ttry {\n\t\t\t\t\ta.emit(recover(msg[1]));\n\t\t\t\t} catch (err) {\n\t\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Forwards upstream `DATA` only while `control.get()` is truthy; when closed, emits `RESOLVED`\n * instead of repeating the last value (value-level gate). For protocol pause/resume, use {@link pausable}.\n *\n * @param source - Upstream value node.\n * @param control - Boolean node; when falsy, output stays “closed” for that tick.\n * @param opts - Optional node options (excluding `describeKind`).\n * @returns `Node<T>` gated by `control`.\n *\n * @example\n * ```ts\n * import { gate, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const data = state(1);\n * const open = state(true);\n * gate(data, open);\n * ```\n *\n * @category extra\n */\nexport function gate<T>(source: Node<T>, control: Node<boolean>, opts?: ExtraOpts): Node<T> {\n\treturn node<T>(\n\t\t[source as Node, control as Node],\n\t\t(_deps, a) => {\n\t\t\tconst v = (source as Node).get();\n\t\t\tconst c = (control as Node).get();\n\t\t\tif (!c) {\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn v as T;\n\t\t},\n\t\toperatorOpts(opts),\n\t);\n}\n\n// ——————————————————————————————————————————————————————————————\n// RxJS-compatible aliases — improve AI code-generation accuracy\n// ——————————————————————————————————————————————————————————————\n\n/**\n * RxJS-named alias for {@link combine} — emits when any dep updates with latest tuple of values.\n *\n * @param sources - Upstream nodes as separate arguments (same calling shape as `combine`).\n * @returns Combined node; signature matches `combine`.\n *\n * @example\n * ```ts\n * import { combineLatest, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = combineLatest(state(1), state(\"a\"));\n * ```\n *\n * @category extra\n */\nexport const combineLatest = combine;\n\n/**\n * RxJS-named alias for {@link debounce} — drops rapid `DATA` until `ms` of quiet.\n *\n * @param source - Upstream node.\n * @param ms - Quiet period in milliseconds.\n * @param opts - Optional node options (excluding `describeKind`).\n * @returns Debounced node; behavior matches `debounce`.\n *\n * @example\n * ```ts\n * import { debounceTime, state } from \"@graphrefly/graphrefly-ts\";\n *\n * debounceTime(state(0), 100);\n * ```\n *\n * @category extra\n */\nexport const debounceTime = debounce;\n\n/**\n * RxJS-named alias for {@link throttle} — emits on leading/trailing edges within `ms`.\n *\n * @param source - Upstream node.\n * @param ms - Minimum spacing in milliseconds.\n * @param opts - Optional throttle shape (`leading` / `trailing`) and node options.\n * @returns Throttled node; behavior matches `throttle`.\n *\n * @example\n * ```ts\n * import { throttleTime, state } from \"@graphrefly/graphrefly-ts\";\n *\n * throttleTime(state(0), 100);\n * ```\n *\n * @category extra\n */\nexport const throttleTime = throttle;\n\n/**\n * RxJS-named alias for {@link rescue} — replaces upstream `ERROR` with a recovered value.\n *\n * @param source - Upstream node.\n * @param recover - Maps error payload to replacement value.\n * @param opts - Optional node options (excluding `describeKind`).\n * @returns Recovered stream; behavior matches `rescue`.\n *\n * @example\n * ```ts\n * import { catchError, state } from \"@graphrefly/graphrefly-ts\";\n *\n * catchError(state(0), () => 0);\n * ```\n *\n * @category extra\n */\nexport const catchError = rescue;\n","/**\n * Shared internals for roadmap §3.2 data structures (option B — versioned snapshots).\n *\n * @remarks\n * Not re-exported from the package barrel; consumers use concrete factories\n * (`reactiveMap`, …). Keeps `equals` / snapshot wiring consistent across\n * collections without exposing a second public protocol.\n *\n * @packageDocumentation\n * @internal\n */\n\n/**\n * Immutable value paired with a monotonic version for {@link NodeOptions.equals}.\n * Downstream nodes can treat unchanged versions as `RESOLVED`-eligible via `equals`.\n *\n * When the backing node has V0 versioning (GRAPHREFLY-SPEC §7), `v0` carries\n * the node's identity (`id`) and version counter for diff-friendly observation\n * and cross-snapshot dedup (roadmap §6.0b).\n */\nexport type Versioned<T> = {\n\treadonly version: number;\n\treadonly value: T;\n\t/** V0 identity from the backing node, when versioning is enabled. */\n\treadonly v0?: { readonly id: string; readonly version: number };\n};\n\n/**\n * `NodeOptions.equals` helper: compares only `version` on {@link Versioned} snapshots.\n */\nexport function snapshotEqualsVersion(a: unknown, b: unknown): boolean {\n\tif (typeof a !== \"object\" || a == null || typeof b !== \"object\" || b == null) {\n\t\treturn Object.is(a, b);\n\t}\n\tif (!(\"version\" in a) || !(\"version\" in b)) return Object.is(a, b);\n\treturn (a as Versioned<unknown>).version === (b as Versioned<unknown>).version;\n}\n\n/**\n * Returns the next snapshot with an incremented version (pure).\n * When `v0` is provided, it is included in the snapshot for V0-aware consumers.\n *\n * **Note:** `v0` is captured before the backing node's DATA emission (which\n * advances the node's version counter). The embedded `v0.version` is therefore\n * one behind the node's post-emission `node.v.version`. This is intentional —\n * `v0` records the node's version at snapshot construction time.\n */\nexport function bumpVersion<T>(\n\tcurrent: Versioned<T>,\n\tnextValue: T,\n\tv0?: { id: string; version: number },\n): Versioned<T> {\n\tif (v0 != null) {\n\t\treturn { version: current.version + 1, value: nextValue, v0 };\n\t}\n\treturn { version: current.version + 1, value: nextValue };\n}\n","/**\n * Reactive key–value map (roadmap §3.2) — versioned snapshots (`reactive-base`) and a manual\n * {@link state} node.\n */\nimport { batch } from \"../core/batch.js\";\nimport { monotonicNs } from \"../core/clock.js\";\nimport { DATA, DIRTY } from \"../core/messages.js\";\nimport type { Node, NodeOptions } from \"../core/node.js\";\nimport { state } from \"../core/sugar.js\";\nimport { bumpVersion, snapshotEqualsVersion, type Versioned } from \"./reactive-base.js\";\n\ntype MapEntry<V> = { value: V; expiresAt?: number };\n\nexport type ReactiveMapSnapshot<K, V> = Versioned<{ map: ReadonlyMap<K, V> }>;\n\nexport type ReactiveMapOptions = {\n\t/** Optional registry name for `describe()` / debugging. */\n\tname?: string;\n\t/** When set, evicts least-recently-used keys after inserts that exceed this size. */\n\tmaxSize?: number;\n\t/** Default TTL in seconds. Used when `set` omits per-call `ttl`. */\n\tdefaultTtl?: number;\n} & Omit<NodeOptions, \"initial\" | \"describeKind\" | \"equals\">;\n\nexport type ReactiveMapBundle<K, V> = {\n\t/** Emits {@link ReactiveMapSnapshot} on each structural change (two-phase). */\n\tnode: Node<ReactiveMapSnapshot<K, V>>;\n\tget: (key: K) => V | undefined;\n\tset: (key: K, value: V, opts?: { ttl?: number }) => void;\n\tdelete: (key: K) => void;\n\tclear: () => void;\n\thas: (key: K) => boolean;\n\treadonly size: number;\n\t/** Removes expired entries (monotonic clock), emitting if the visible map changes. */\n\tpruneExpired: () => void;\n};\n\nfunction emptySnapshot<K, V>(): ReactiveMapSnapshot<K, V> {\n\treturn { version: 0, value: { map: new Map() } };\n}\n\nfunction isExpired(e: MapEntry<unknown>, now: number): boolean {\n\treturn e.expiresAt !== undefined && now >= e.expiresAt;\n}\n\nfunction buildMap<K, V>(store: Map<K, MapEntry<V>>, now: number): Map<K, V> {\n\tconst out = new Map<K, V>();\n\tfor (const [k, e] of store) {\n\t\tif (!isExpired(e, now)) out.set(k, e.value);\n\t}\n\treturn out;\n}\n\n/**\n * Creates a reactive `Map` with optional per-key TTL and optional LRU max size.\n *\n * @param options - Node options plus `maxSize` / `defaultTtl` (seconds).\n * @returns `ReactiveMapBundle` — imperative `get` / `set` / `delete` / `clear` / `pruneExpired` and a `node` emitting versioned readonly map snapshots.\n *\n * @remarks\n * **TTL:** Expiry is checked on `get`, `has`, `size`, `pruneExpired`, and before each\n * snapshot emission (expired keys are pruned first). There is no\n * background timer; monotonic-clock–expired keys may still appear in the last-emitted\n * snapshot on `node` until a read or `pruneExpired` removes them.\n * Uses `monotonicNs()` — immune to wall-clock adjustments.\n *\n * **LRU:** Uses native `Map` insertion order — `get` / `has` refreshes position; under\n * `maxSize` pressure the first key in iteration order is evicted. When `maxSize` is\n * omitted or is less than 1, no size-based eviction runs.\n *\n * @example\n * ```ts\n * import { reactiveMap } from \"@graphrefly/graphrefly-ts\";\n *\n * const m = reactiveMap<string, number>({ name: \"cache\", maxSize: 100, defaultTtl: 60 });\n * m.set(\"x\", 1);\n * m.node.subscribe((msgs) => {\n * console.log(msgs);\n * });\n * ```\n *\n * @category extra\n */\nexport function reactiveMap<K, V>(options: ReactiveMapOptions = {}): ReactiveMapBundle<K, V> {\n\tconst { name, maxSize, defaultTtl, ...nodeOpts } = options;\n\tconst store = new Map<K, MapEntry<V>>();\n\n\tlet current = emptySnapshot<K, V>();\n\n\tconst n = state<ReactiveMapSnapshot<K, V>>(current, {\n\t\t...nodeOpts,\n\t\tname,\n\t\tdescribeKind: \"state\",\n\t\tequals: snapshotEqualsVersion,\n\t});\n\n\tfunction pruneExpiredInternal(): boolean {\n\t\tconst now = monotonicNs();\n\t\tlet removed = false;\n\t\tfor (const [k, e] of store) {\n\t\t\tif (isExpired(e, now)) {\n\t\t\t\tstore.delete(k);\n\t\t\t\tremoved = true;\n\t\t\t}\n\t\t}\n\t\treturn removed;\n\t}\n\n\tfunction evictLruWhileOver(): void {\n\t\tif (maxSize === undefined || maxSize < 1) return;\n\t\twhile (store.size > maxSize) {\n\t\t\tconst first = store.keys().next().value as K | undefined;\n\t\t\tif (first === undefined) break;\n\t\t\tstore.delete(first);\n\t\t}\n\t}\n\n\tfunction pushSnapshot(): void {\n\t\tpruneExpiredInternal();\n\t\tconst now = monotonicNs();\n\t\tconst map = buildMap(store, now) as ReadonlyMap<K, V>;\n\t\tconst nv = n.v;\n\t\tcurrent = bumpVersion(current, { map }, nv ? { id: nv.id, version: nv.version } : undefined);\n\t\tbatch(() => {\n\t\t\tn.down([[DIRTY]]);\n\t\t\tn.down([[DATA, current]]);\n\t\t});\n\t}\n\n\tfunction touchLru(key: K): void {\n\t\tconst e = store.get(key);\n\t\tif (e === undefined) return;\n\t\tstore.delete(key);\n\t\tstore.set(key, e);\n\t}\n\n\tconst bundle: ReactiveMapBundle<K, V> = {\n\t\tnode: n,\n\n\t\tget(key: K): V | undefined {\n\t\t\tconst now = monotonicNs();\n\t\t\tconst e = store.get(key);\n\t\t\tif (e === undefined) return undefined;\n\t\t\tif (isExpired(e, now)) {\n\t\t\t\tstore.delete(key);\n\t\t\t\tpushSnapshot();\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\ttouchLru(key);\n\t\t\treturn e.value;\n\t\t},\n\n\t\tset(key: K, value: V, setOpts?: { ttl?: number }): void {\n\t\t\tpruneExpiredInternal();\n\t\t\tconst ttlSec = setOpts?.ttl ?? defaultTtl;\n\t\t\tif (ttlSec !== undefined && ttlSec <= 0) {\n\t\t\t\tthrow new RangeError(`reactiveMap: ttl must be positive (got ${ttlSec})`);\n\t\t\t}\n\t\t\tconst expiresAt = ttlSec !== undefined ? monotonicNs() + ttlSec * 1_000_000_000 : undefined;\n\t\t\tif (store.has(key)) store.delete(key);\n\t\t\tstore.set(key, { value, expiresAt });\n\t\t\tevictLruWhileOver();\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tdelete(key: K): void {\n\t\t\tif (!store.delete(key)) return;\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tclear(): void {\n\t\t\tif (store.size === 0) return;\n\t\t\tstore.clear();\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\thas(key: K): boolean {\n\t\t\tconst now = monotonicNs();\n\t\t\tconst e = store.get(key);\n\t\t\tif (e === undefined) return false;\n\t\t\tif (isExpired(e, now)) {\n\t\t\t\tstore.delete(key);\n\t\t\t\tpushSnapshot();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ttouchLru(key);\n\t\t\treturn true;\n\t\t},\n\n\t\tget size(): number {\n\t\t\tpruneExpiredInternal();\n\t\t\treturn store.size;\n\t\t},\n\n\t\tpruneExpired(): void {\n\t\t\tif (!pruneExpiredInternal()) return;\n\t\t\tpushSnapshot();\n\t\t},\n\t};\n\n\treturn bundle;\n}\n","/**\n * Composite data patterns (roadmap §3.2b).\n *\n * These helpers compose existing primitives (`node`, `switchMap`, `reactiveMap`,\n * `dynamicNode`, `fromAny`) without introducing new protocol semantics.\n */\n\nimport { batch } from \"../core/batch.js\";\nimport { dynamicNode } from \"../core/dynamic-node.js\";\nimport { DATA } from \"../core/messages.js\";\nimport type { Node, NodeOptions } from \"../core/node.js\";\nimport { derived, state } from \"../core/sugar.js\";\nimport { merge, switchMap } from \"./operators.js\";\nimport { type ReactiveMapBundle, type ReactiveMapOptions, reactiveMap } from \"./reactive-map.js\";\nimport { forEach, fromAny, type NodeInput } from \"./sources.js\";\n\nfunction isNodeLike<T>(value: unknown): value is Node<T> {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\ttypeof (value as Node<T>).get === \"function\" &&\n\t\ttypeof (value as Node<T>).subscribe === \"function\"\n\t);\n}\n\n/**\n * Verification payload shape is intentionally user-defined.\n */\nexport type VerifyValue = unknown;\n\nexport type VerifiableOptions<TVerify = VerifyValue> = Omit<\n\tNodeOptions,\n\t\"describeKind\" | \"initial\"\n> & {\n\t/** Reactive re-verification trigger. */\n\ttrigger?: NodeInput<unknown>;\n\t/** Re-run verification whenever `source` settles. */\n\tautoVerify?: boolean;\n\t/** Initial verification companion value. */\n\tinitialVerified?: TVerify | null;\n};\n\nexport type VerifiableBundle<T, TVerify = VerifyValue> = {\n\t/** Coerced source node. */\n\tnode: Node<T>;\n\t/** Latest verification result (`null` before first verification). */\n\tverified: Node<TVerify | null>;\n\t/** Effective trigger node used for verification, if any. */\n\ttrigger: Node<unknown> | null;\n};\n\n/**\n * Composes a value node with a reactive verification companion.\n *\n * Uses `switchMap` so newer triggers cancel stale in-flight verification work.\n */\nexport function verifiable<T, TVerify = VerifyValue>(\n\tsource: NodeInput<T>,\n\tverifyFn: (value: T) => NodeInput<TVerify>,\n\topts?: VerifiableOptions<TVerify>,\n): VerifiableBundle<T, TVerify> {\n\tconst sourceNode = fromAny(source);\n\tconst hasSourceVersioning = sourceNode.v != null;\n\tconst verified = state<TVerify | null>(opts?.initialVerified ?? null, {\n\t\t...(hasSourceVersioning ? { meta: { sourceVersion: null } } : {}),\n\t});\n\tconst hasTrigger = opts?.trigger !== undefined && opts.trigger !== null;\n\n\tlet triggerNode: Node<unknown> | null = null;\n\tif (hasTrigger && opts?.autoVerify) {\n\t\ttriggerNode = merge(fromAny(opts.trigger) as Node<unknown>, sourceNode as Node<unknown>);\n\t} else if (hasTrigger) {\n\t\ttriggerNode = fromAny(opts.trigger);\n\t} else if (opts?.autoVerify) {\n\t\ttriggerNode = sourceNode as Node<unknown>;\n\t}\n\n\tif (triggerNode !== null) {\n\t\tconst verifyStream = switchMap(triggerNode, () => verifyFn(sourceNode.get() as T));\n\t\tforEach(verifyStream, (value) => {\n\t\t\tbatch(() => {\n\t\t\t\tverified.down([[DATA, value]]);\n\t\t\t\t// V0 backfill: stamp which source version was verified (§6.0b).\n\t\t\t\tif (hasSourceVersioning) {\n\t\t\t\t\tconst sv = sourceNode.v;\n\t\t\t\t\tif (sv != null) {\n\t\t\t\t\t\tverified.meta.sourceVersion.down([[DATA, { id: sv.id, version: sv.version }]]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\treturn { node: sourceNode, verified, trigger: triggerNode };\n}\n\nexport type Extraction<TMem> = {\n\tupsert: Array<{ key: string; value: TMem }>;\n\tremove?: string[];\n};\n\nexport type DistillOptions<TMem> = {\n\tscore: (mem: TMem, context: unknown) => number;\n\tcost: (mem: TMem) => number;\n\tbudget?: number;\n\tevict?: (key: string, mem: TMem) => boolean | Node<boolean>;\n\tconsolidate?: (entries: ReadonlyMap<string, TMem>) => NodeInput<Extraction<TMem>>;\n\tconsolidateTrigger?: NodeInput<unknown>;\n\tcontext?: NodeInput<unknown>;\n\tmapOptions?: ReactiveMapOptions;\n};\n\nexport type DistillBundle<TMem> = {\n\tstore: ReactiveMapBundle<string, TMem>;\n\tcompact: Node<Array<{ key: string; value: TMem; score: number }>>;\n\tsize: Node<number>;\n};\n\nfunction keepalive(node: Node): void {\n\tnode.subscribe(() => undefined);\n}\n\nfunction mapFromSnapshot<TMem>(snapshot: unknown): ReadonlyMap<string, TMem> {\n\tif (\n\t\ttypeof snapshot === \"object\" &&\n\t\tsnapshot !== null &&\n\t\t\"value\" in snapshot &&\n\t\ttypeof (snapshot as { value?: unknown }).value === \"object\" &&\n\t\t(snapshot as { value?: unknown }).value !== null &&\n\t\t\"map\" in ((snapshot as { value?: unknown }).value as object)\n\t) {\n\t\treturn ((snapshot as { value: { map: ReadonlyMap<string, TMem> } }).value.map ??\n\t\t\tnew Map<string, TMem>()) as ReadonlyMap<string, TMem>;\n\t}\n\treturn new Map<string, TMem>();\n}\n\nfunction asReadonlyMap<TMem>(store: ReactiveMapBundle<string, TMem>): ReadonlyMap<string, TMem> {\n\treturn mapFromSnapshot<TMem>(store.node.get());\n}\n\nfunction applyExtraction<TMem>(\n\tstore: ReactiveMapBundle<string, TMem>,\n\textraction: Extraction<TMem>,\n): void {\n\tif (!Array.isArray(extraction.upsert)) {\n\t\tthrow new TypeError(\"distill extraction requires upsert: Array<{ key, value }>\");\n\t}\n\tbatch(() => {\n\t\tfor (const { key, value } of extraction.upsert) {\n\t\t\tstore.set(key, value);\n\t\t}\n\t\tfor (const key of extraction.remove ?? []) {\n\t\t\tstore.delete(key);\n\t\t}\n\t});\n}\n\n/**\n * Budget-constrained reactive memory composition.\n */\nexport function distill<TRaw, TMem>(\n\tsource: NodeInput<TRaw>,\n\textractFn: (raw: TRaw, existing: ReadonlyMap<string, TMem>) => NodeInput<Extraction<TMem>>,\n\topts: DistillOptions<TMem>,\n): DistillBundle<TMem> {\n\tconst sourceNode = fromAny(source);\n\tconst store = reactiveMap<string, TMem>(opts.mapOptions ?? {});\n\tconst budget = opts.budget ?? 2000;\n\tconst hasContext = opts.context !== undefined && opts.context !== null;\n\tconst contextNode = hasContext ? fromAny(opts.context) : state<unknown>(null);\n\n\tconst extractionStream = switchMap(sourceNode, (raw) => extractFn(raw, asReadonlyMap(store)));\n\tforEach(extractionStream, (extraction) => {\n\t\tapplyExtraction(store, extraction);\n\t});\n\n\tif (opts.evict) {\n\t\tconst evictionKeys = dynamicNode((get) => {\n\t\t\tconst out: string[] = [];\n\t\t\tconst snapshot = mapFromSnapshot<TMem>(get(store.node));\n\t\t\tfor (const [key, mem] of snapshot) {\n\t\t\t\tconst verdict = opts.evict!(key, mem);\n\t\t\t\tif (isNodeLike<boolean>(verdict)) {\n\t\t\t\t\tif (get(verdict) === true) out.push(key);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (typeof verdict === \"boolean\") {\n\t\t\t\t\tif (verdict) out.push(key);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthrow new TypeError(\"distill evict() must return boolean or Node<boolean>\");\n\t\t\t}\n\t\t\treturn out;\n\t\t});\n\t\tforEach(evictionKeys, (keys) => {\n\t\t\tfor (const key of keys) store.delete(key);\n\t\t});\n\t}\n\n\tconst hasConsolidateTrigger =\n\t\topts.consolidateTrigger !== undefined && opts.consolidateTrigger !== null;\n\tif (opts.consolidate && hasConsolidateTrigger) {\n\t\tconst consolidateTriggerNode = fromAny(opts.consolidateTrigger);\n\t\tconst consolidationStream = switchMap(consolidateTriggerNode, () =>\n\t\t\topts.consolidate!(asReadonlyMap(store)),\n\t\t);\n\t\tforEach(consolidationStream, (extraction) => {\n\t\t\tapplyExtraction(store, extraction);\n\t\t});\n\t}\n\n\tconst compact = derived([store.node, contextNode], ([snapshot, context]) => {\n\t\tconst entries = [...mapFromSnapshot<TMem>(snapshot).entries()].map(([key, value]) => ({\n\t\t\tkey,\n\t\t\tvalue,\n\t\t\tscore: opts.score(value, context),\n\t\t\tcost: opts.cost(value),\n\t\t}));\n\t\tentries.sort((a, b) => b.score - a.score);\n\n\t\tconst packed: Array<{ key: string; value: TMem; score: number }> = [];\n\t\tlet remaining = budget;\n\t\tfor (const item of entries) {\n\t\t\tif (item.cost <= remaining) {\n\t\t\t\tpacked.push({ key: item.key, value: item.value, score: item.score });\n\t\t\t\tremaining -= item.cost;\n\t\t\t}\n\t\t}\n\t\treturn packed;\n\t});\n\n\tconst size = derived([store.node], ([snapshot]) => mapFromSnapshot<TMem>(snapshot).size);\n\tkeepalive(compact);\n\tkeepalive(size);\n\n\treturn { store, compact, size };\n}\n","// ---------------------------------------------------------------------------\n// RxJS bridge — reactive interop between GraphReFly nodes and RxJS Observables.\n// ---------------------------------------------------------------------------\n// Generic utilities for bridging GraphReFly's message protocol to RxJS\n// Observables. Works anywhere RxJS is available (NestJS, Angular, standalone).\n//\n// Usage:\n// import { toObservable, observeNode$ } from '@graphrefly/graphrefly-ts/extra';\n// const values$ = toObservable(myNode); // Observable<T>\n// const msgs$ = toMessages$(myNode); // Observable<Messages>\n// const node$ = observeNode$(graph, \"path\"); // Observable<T> via graph.observe\n// const all$ = observeGraph$(graph); // Observable<{ path, messages }>\n// ---------------------------------------------------------------------------\n\nimport { Observable } from \"rxjs\";\nimport { COMPLETE, DATA, ERROR, type Messages } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport type { Graph, GraphObserveAll, GraphObserveOne, ObserveOptions } from \"../graph/graph.js\";\n\n/**\n * Bridge a `Node<T>` to an RxJS `Observable<T>`.\n *\n * Emits the node's value on each `DATA` message. Maps `ERROR` to\n * `subscriber.error()` and `COMPLETE` to `subscriber.complete()`.\n * Protocol-internal signals (DIRTY, RESOLVED, PAUSE, etc.) are skipped.\n *\n * Unsubscribing the Observable unsubscribes the node.\n */\nexport function toObservable<T>(node: Node<T>): Observable<T> {\n\treturn new Observable<T>((subscriber) => {\n\t\tconst unsub = node.subscribe((msgs) => {\n\t\t\tfor (const m of msgs) {\n\t\t\t\tif (subscriber.closed) return;\n\t\t\t\tif (m[0] === DATA) {\n\t\t\t\t\tsubscriber.next(m[1] as T);\n\t\t\t\t} else if (m[0] === ERROR) {\n\t\t\t\t\tsubscriber.error(m[1]);\n\t\t\t\t\treturn;\n\t\t\t\t} else if (m[0] === COMPLETE) {\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn unsub;\n\t});\n}\n\n/**\n * Bridge a `Node<T>` to an `Observable<Messages>` — raw message batches.\n *\n * Each emission is a full `[[Type, Data?], ...]` batch. The Observable\n * terminates on ERROR or COMPLETE (the terminal batch is still emitted\n * as the final `next()` before the Observable signal).\n */\nexport function toMessages$<T>(node: Node<T>): Observable<Messages> {\n\treturn new Observable<Messages>((subscriber) => {\n\t\tconst unsub = node.subscribe((msgs) => {\n\t\t\tif (subscriber.closed) return;\n\t\t\tsubscriber.next(msgs);\n\t\t\tfor (const m of msgs) {\n\t\t\t\tif (m[0] === ERROR) {\n\t\t\t\t\tsubscriber.error(m[1]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (m[0] === COMPLETE) {\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn unsub;\n\t});\n}\n\n/**\n * Observe a single node in a `Graph` as an `Observable<T>`.\n *\n * Equivalent to `toObservable(graph.resolve(path))` but routes through\n * `graph.observe()` so actor guards are respected when provided.\n */\nexport function observeNode$<T>(\n\tgraph: Graph,\n\tpath: string,\n\toptions?: ObserveOptions,\n): Observable<T> {\n\treturn new Observable<T>((subscriber) => {\n\t\tconst handle: GraphObserveOne = graph.observe(path, options);\n\t\tconst unsub = handle.subscribe((msgs) => {\n\t\t\tfor (const m of msgs) {\n\t\t\t\tif (subscriber.closed) return;\n\t\t\t\tif (m[0] === DATA) {\n\t\t\t\t\tsubscriber.next(m[1] as T);\n\t\t\t\t} else if (m[0] === ERROR) {\n\t\t\t\t\tsubscriber.error(m[1]);\n\t\t\t\t\treturn;\n\t\t\t\t} else if (m[0] === COMPLETE) {\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn unsub;\n\t});\n}\n\n/**\n * Observe all nodes in a `Graph` as an `Observable<{ path, messages }>`.\n *\n * Each emission carries the qualified node path and the raw message batch.\n * The Observable never self-completes (graphs are long-lived); dispose by\n * unsubscribing.\n */\nexport function observeGraph$(\n\tgraph: Graph,\n\toptions?: ObserveOptions,\n): Observable<{ path: string; messages: Messages }> {\n\treturn new Observable((subscriber) => {\n\t\tconst handle: GraphObserveAll = graph.observe(options);\n\t\tconst unsub = handle.subscribe((nodePath, messages) => {\n\t\t\tif (subscriber.closed) return;\n\t\t\tsubscriber.next({ path: nodePath, messages });\n\t\t});\n\t\treturn unsub;\n\t});\n}\n","/**\n * Lazy per-topic manual nodes (roadmap §3.2) — create topics on first access, publish with two-phase push.\n */\n\nimport { batch } from \"../core/batch.js\";\nimport { DATA, DIRTY, TEARDOWN } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { state } from \"../core/sugar.js\";\n\n/**\n * In-memory lazy topic registry: each topic is an independent {@link state} node.\n *\n * @category extra\n */\nexport interface PubSubHub {\n\t/**\n\t * Returns the topic node, creating it on first use.\n\t *\n\t * @param name - Topic key.\n\t * @returns `Node` whose value is the last published payload (initially `undefined`).\n\t */\n\ttopic(name: string): Node<unknown>;\n\n\t/**\n\t * Pushes a value to the topic (two-phase `DIRTY` then `DATA`, matching other manual sources here).\n\t *\n\t * @param name - Topic key.\n\t * @param value - Payload.\n\t */\n\tpublish(name: string, value: unknown): void;\n\n\t/**\n\t * Removes a topic and tears down its node. Returns `true` if the topic existed.\n\t *\n\t * @param name - Topic key.\n\t */\n\tremoveTopic(name: string): boolean;\n}\n\nclass PubSubHubImpl implements PubSubHub {\n\tprivate readonly topics = new Map<string, Node<unknown>>();\n\n\ttopic(name: string): Node<unknown> {\n\t\tlet n = this.topics.get(name);\n\t\tif (n === undefined) {\n\t\t\tn = state(undefined, { describeKind: \"state\" });\n\t\t\tthis.topics.set(name, n);\n\t\t}\n\t\treturn n;\n\t}\n\n\tpublish(name: string, value: unknown): void {\n\t\tconst t = this.topic(name);\n\t\tbatch(() => {\n\t\t\tt.down([[DIRTY]]);\n\t\t\tt.down([[DATA, value]]);\n\t\t});\n\t}\n\n\tremoveTopic(name: string): boolean {\n\t\tconst n = this.topics.get(name);\n\t\tif (n === undefined) return false;\n\t\tn.down([[TEARDOWN]]);\n\t\tthis.topics.delete(name);\n\t\treturn true;\n\t}\n}\n\n/**\n * Creates an empty {@link PubSubHub} for lazy topic nodes.\n *\n * @returns A new hub with no topics until {@link PubSubHub.topic} or {@link PubSubHub.publish} runs.\n *\n * @example\n * ```ts\n * import { pubsub } from \"@graphrefly/graphrefly-ts\";\n *\n * const hub = pubsub();\n * const t = hub.topic(\"events\");\n * t.subscribe((msgs) => console.log(msgs));\n * hub.publish(\"events\", { ok: true });\n * hub.removeTopic(\"events\"); // tears down the node\n * ```\n *\n * @category extra\n */\nexport function pubsub(): PubSubHub {\n\treturn new PubSubHubImpl();\n}\n","/**\n * Dual-key sorted index (roadmap §3.2) — unique primary key, rows ordered by `(secondary, primary)`.\n */\nimport { batch } from \"../core/batch.js\";\nimport { DATA, DIRTY } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { derived, state } from \"../core/sugar.js\";\nimport { bumpVersion, snapshotEqualsVersion, type Versioned } from \"./reactive-base.js\";\n\nexport type IndexRow<K, V = unknown> = {\n\treadonly primary: K;\n\treadonly secondary: unknown;\n\treadonly value: V;\n};\n\nexport type ReactiveIndexSnapshot<K, V = unknown> = Versioned<{ rows: readonly IndexRow<K, V>[] }>;\n\nexport type ReactiveIndexOptions = {\n\tname?: string;\n};\n\nexport type ReactiveIndexBundle<K, V = unknown> = {\n\t/** Rows sorted by `(secondary, primary)`; versioned snapshots. */\n\treadonly ordered: Node<ReactiveIndexSnapshot<K, V>>;\n\t/** Map from primary key to stored value. */\n\treadonly byPrimary: Node<ReadonlyMap<K, V>>;\n\tupsert: (primary: K, secondary: unknown, value: V) => void;\n\tdelete: (primary: K) => void;\n\tclear: () => void;\n};\n\nfunction emptySnapshot<K, V>(): ReactiveIndexSnapshot<K, V> {\n\treturn { version: 0, value: { rows: [] } };\n}\n\nfunction rowKey<K, V>(row: IndexRow<K, V>): [unknown, K] {\n\treturn [row.secondary, row.primary];\n}\n\n/** Lexicographic ordering for index keys (mirrors Python tuple compare for typical primitives). */\nfunction cmpOrd(a: unknown, b: unknown): number {\n\tif (a === b) return 0;\n\tconst ta = typeof a;\n\tconst tb = typeof b;\n\tif (ta === tb && (ta === \"number\" || ta === \"string\" || ta === \"boolean\" || ta === \"bigint\")) {\n\t\tconst ax = a as number | string | boolean | bigint;\n\t\tconst bx = b as number | string | boolean | bigint;\n\t\tif (ax < bx) return -1;\n\t\tif (ax > bx) return 1;\n\t\treturn 0;\n\t}\n\treturn String(a).localeCompare(String(b));\n}\n\nfunction compareKeys<K>(a: [unknown, K], b: [unknown, K]): number {\n\tlet c = cmpOrd(a[0], b[0]);\n\tif (c !== 0) return c;\n\tc = cmpOrd(a[1], b[1]);\n\treturn c;\n}\n\nfunction bisectLeft<K, V>(rows: readonly IndexRow<K, V>[], row: IndexRow<K, V>): number {\n\tconst k = rowKey(row);\n\tlet lo = 0;\n\tlet hi = rows.length;\n\twhile (lo < hi) {\n\t\tconst mid = (lo + hi) >> 1;\n\t\tif (compareKeys(k, rowKey(rows[mid]!)) > 0) lo = mid + 1;\n\t\telse hi = mid;\n\t}\n\treturn lo;\n}\n\nfunction byPrimaryMap<K, V>(rows: readonly IndexRow<K, V>[]): Map<K, V> {\n\tconst m = new Map<K, V>();\n\tfor (const r of rows) m.set(r.primary, r.value);\n\treturn m;\n}\n\nfunction keepaliveDerived(n: Node<unknown>): void {\n\tvoid n.subscribe(() => {});\n}\n\n/**\n * Creates a reactive index: unique primary key per row, rows sorted by `(secondary, primary)` for ordered scans.\n *\n * @param options - Optional `name` for `describe()` / debugging.\n * @returns Bundle with `ordered` (versioned rows), `byPrimary` (map), and imperative `upsert` / `delete` / `clear`.\n *\n * @remarks\n * **Ordering:** `secondary` and `primary` are compared via a small total order: same primitive `typeof` uses\n * numeric/string/boolean/bigint comparison; mixed or object keys fall back to `String(a).localeCompare(String(b))`\n * (not identical to Python’s rich comparison for exotic types).\n *\n * @example\n * ```ts\n * import { reactiveIndex } from \"@graphrefly/graphrefly-ts\";\n *\n * const idx = reactiveIndex<string, string>();\n * idx.upsert(\"id1\", 10, \"row-a\");\n * idx.upsert(\"id2\", 5, \"row-b\");\n * ```\n *\n * @category extra\n */\nexport function reactiveIndex<K, V = unknown>(\n\toptions: ReactiveIndexOptions = {},\n): ReactiveIndexBundle<K, V> {\n\tconst { name } = options;\n\tconst buf: IndexRow<K, V>[] = [];\n\tlet current = emptySnapshot<K, V>();\n\n\tconst ordered = state<ReactiveIndexSnapshot<K, V>>(current, {\n\t\tname,\n\t\tdescribeKind: \"state\",\n\t\tequals: snapshotEqualsVersion,\n\t});\n\n\tconst byPrimary = derived(\n\t\t[ordered],\n\t\t([s]) => {\n\t\t\tconst rows = (s as ReactiveIndexSnapshot<K, V>).value.rows;\n\t\t\treturn byPrimaryMap(rows);\n\t\t},\n\t\t{ initial: new Map<K, V>(), describeKind: \"derived\" },\n\t);\n\tkeepaliveDerived(byPrimary);\n\n\tfunction pushSnapshot(): void {\n\t\tconst ov = ordered.v;\n\t\tcurrent = bumpVersion(\n\t\t\tcurrent,\n\t\t\t{ rows: [...buf] },\n\t\t\tov ? { id: ov.id, version: ov.version } : undefined,\n\t\t);\n\t\tbatch(() => {\n\t\t\tordered.down([[DIRTY]]);\n\t\t\tordered.down([[DATA, current]]);\n\t\t});\n\t}\n\n\treturn {\n\t\tordered,\n\t\tbyPrimary,\n\n\t\tupsert(primary: K, secondary: unknown, value: V): void {\n\t\t\tconst next = buf.filter((r) => r.primary !== primary);\n\t\t\tconst row: IndexRow<K, V> = { primary, secondary, value };\n\t\t\tconst pos = bisectLeft(next, row);\n\t\t\tnext.splice(pos, 0, row);\n\t\t\tbuf.length = 0;\n\t\t\tbuf.push(...next);\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tdelete(primary: K): void {\n\t\t\tconst next = buf.filter((r) => r.primary !== primary);\n\t\t\tif (next.length === buf.length) return;\n\t\t\tbuf.length = 0;\n\t\t\tbuf.push(...next);\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tclear(): void {\n\t\t\tif (buf.length === 0) return;\n\t\t\tbuf.length = 0;\n\t\t\tpushSnapshot();\n\t\t},\n\t};\n}\n","/**\n * Reactive positional list (roadmap §3.2) — tuple snapshot with append / insert / pop / clear.\n */\nimport { batch } from \"../core/batch.js\";\nimport { DATA, DIRTY } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { state } from \"../core/sugar.js\";\nimport { bumpVersion, snapshotEqualsVersion, type Versioned } from \"./reactive-base.js\";\n\nexport type ReactiveListSnapshot<T> = Versioned<{ items: readonly T[] }>;\n\nexport type ReactiveListOptions = {\n\tname?: string;\n};\n\nexport type ReactiveListBundle<T> = {\n\t/** Emits {@link ReactiveListSnapshot} on each structural change (two-phase). */\n\treadonly items: Node<ReactiveListSnapshot<T>>;\n\tappend: (value: T) => void;\n\tinsert: (index: number, value: T) => void;\n\tpop: (index?: number) => T;\n\tclear: () => void;\n};\n\nfunction emptySnapshot<T>(): ReactiveListSnapshot<T> {\n\treturn { version: 0, value: { items: [] } };\n}\n\n/**\n * Creates a reactive list with versioned immutable array snapshots.\n *\n * @param initial - Optional initial items (copied).\n * @param options - Optional `name` for `describe()` / debugging.\n * @returns Bundle with `items` (state node) and `append` / `insert` / `pop` / `clear`.\n *\n * @example\n * ```ts\n * import { reactiveList } from \"@graphrefly/graphrefly-ts\";\n *\n * const list = reactiveList<string>([\"a\"], { name: \"queue\" });\n * list.append(\"b\");\n * ```\n *\n * @category extra\n */\nexport function reactiveList<T>(\n\tinitial?: readonly T[],\n\toptions: ReactiveListOptions = {},\n): ReactiveListBundle<T> {\n\tconst { name } = options;\n\tconst buf: T[] = initial ? [...initial] : [];\n\tlet current: ReactiveListSnapshot<T> =\n\t\tbuf.length > 0 ? { version: 1, value: { items: [...buf] } } : emptySnapshot();\n\n\tconst items = state<ReactiveListSnapshot<T>>(current, {\n\t\tname,\n\t\tdescribeKind: \"state\",\n\t\tequals: snapshotEqualsVersion,\n\t});\n\n\tfunction pushSnapshot(): void {\n\t\tconst iv = items.v;\n\t\tcurrent = bumpVersion(\n\t\t\tcurrent,\n\t\t\t{ items: [...buf] },\n\t\t\tiv ? { id: iv.id, version: iv.version } : undefined,\n\t\t);\n\t\tbatch(() => {\n\t\t\titems.down([[DIRTY]]);\n\t\t\titems.down([[DATA, current]]);\n\t\t});\n\t}\n\n\treturn {\n\t\titems,\n\n\t\tappend(value: T): void {\n\t\t\tbuf.push(value);\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tinsert(index: number, value: T): void {\n\t\t\tif (index < 0 || index > buf.length) {\n\t\t\t\tthrow new RangeError(\"index out of range\");\n\t\t\t}\n\t\t\tbuf.splice(index, 0, value);\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tpop(index = -1): T {\n\t\t\tif (buf.length === 0) {\n\t\t\t\tthrow new RangeError(\"pop from empty list\");\n\t\t\t}\n\t\t\tconst i = index >= 0 ? index : buf.length + index;\n\t\t\tif (i < 0 || i >= buf.length) {\n\t\t\t\tthrow new RangeError(\"index out of range\");\n\t\t\t}\n\t\t\tconst [v] = buf.splice(i, 1);\n\t\t\tpushSnapshot();\n\t\t\treturn v as T;\n\t\t},\n\n\t\tclear(): void {\n\t\t\tif (buf.length === 0) return;\n\t\t\tbuf.length = 0;\n\t\t\tpushSnapshot();\n\t\t},\n\t};\n}\n","/**\n * Reactive append-only log (roadmap §3.2) — versioned snapshots and derived tail / slice views.\n */\nimport { batch } from \"../core/batch.js\";\nimport { DATA, DIRTY } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { derived, state } from \"../core/sugar.js\";\nimport { bumpVersion, snapshotEqualsVersion, type Versioned } from \"./reactive-base.js\";\n\nexport type ReactiveLogSnapshot<T> = Versioned<{ entries: readonly T[] }>;\n\nexport type ReactiveLogOptions = {\n\tname?: string;\n\tmaxSize?: number;\n};\n\nexport type ReactiveLogBundle<T> = {\n\t/** Emits {@link ReactiveLogSnapshot} on each append/clear (two-phase). */\n\treadonly entries: Node<ReactiveLogSnapshot<T>>;\n\tappend: (value: T) => void;\n\t/** Push all values, trim once, emit one snapshot. */\n\tappendMany: (values: readonly T[]) => void;\n\tclear: () => void;\n\t/** Remove the first `n` entries; emits snapshot. */\n\ttrimHead: (n: number) => void;\n\t/** Last `n` entries (or fewer); updates when the log changes. */\n\ttail: (n: number) => Node<readonly T[]>;\n};\n\nfunction emptySnapshot<T>(): ReactiveLogSnapshot<T> {\n\treturn { version: 0, value: { entries: [] } };\n}\n\n/**\n * Keep a derived node's dep wiring alive for `get()` without a user sink.\n * Returns the unsubscribe handle so callers can clean up.\n *\n * @remarks Derived views (`tail`, `logSlice`) install this so `get()` stays\n * wired without an external sink. The returned disposer is currently not\n * exposed on the bundle — subscriptions are released when the log bundle\n * becomes unreachable and the GC collects the closure.\n */\nfunction keepaliveDerived(n: Node<unknown>): () => void {\n\treturn n.subscribe(() => {});\n}\n\n/**\n * Creates an append-only reactive log with versioned tuple snapshots.\n *\n * @param initial - Optional seed entries (copied).\n * @param options - Optional `name` for `describe()` / debugging.\n * @returns Bundle with `entries` (state node), `append`, `clear`, and {@link ReactiveLogBundle.tail}.\n *\n * @remarks\n * **Derived views:** {@link tail} and {@link logSlice} install an internal noop subscription so\n * `get()` stays wired without an external sink; creating very many disposable derived nodes can\n * retain subscriptions until the log bundle is unreachable.\n *\n * @example\n * ```ts\n * import { reactiveLog } from \"@graphrefly/graphrefly-ts\";\n *\n * const lg = reactiveLog<number>([1, 2], { name: \"audit\" });\n * lg.append(3);\n * lg.entries.subscribe((msgs) => console.log(msgs));\n * ```\n *\n * @category extra\n */\nexport function reactiveLog<T>(\n\tinitial?: readonly T[],\n\toptions: ReactiveLogOptions = {},\n): ReactiveLogBundle<T> {\n\tconst { name, maxSize } = options;\n\tif (maxSize !== undefined && maxSize < 1) {\n\t\tthrow new RangeError(\"maxSize must be >= 1\");\n\t}\n\tconst buf: T[] = initial ? [...initial] : [];\n\tif (maxSize !== undefined && buf.length > maxSize) {\n\t\tbuf.splice(0, buf.length - maxSize);\n\t}\n\tlet current: ReactiveLogSnapshot<T> =\n\t\tbuf.length > 0 ? { version: 1, value: { entries: [...buf] } } : emptySnapshot();\n\n\tconst entries = state<ReactiveLogSnapshot<T>>(current, {\n\t\tname,\n\t\tdescribeKind: \"state\",\n\t\tequals: snapshotEqualsVersion,\n\t});\n\n\tfunction pushSnapshot(): void {\n\t\tconst ev = entries.v;\n\t\tcurrent = bumpVersion(\n\t\t\tcurrent,\n\t\t\t{ entries: [...buf] },\n\t\t\tev ? { id: ev.id, version: ev.version } : undefined,\n\t\t);\n\t\tbatch(() => {\n\t\t\tentries.down([[DIRTY]]);\n\t\t\tentries.down([[DATA, current]]);\n\t\t});\n\t}\n\n\tfunction trimBuf(): void {\n\t\tif (maxSize !== undefined && buf.length > maxSize) {\n\t\t\tbuf.splice(0, buf.length - maxSize);\n\t\t}\n\t}\n\n\tconst bundle: ReactiveLogBundle<T> = {\n\t\tentries,\n\n\t\tappend(value: T): void {\n\t\t\tbuf.push(value);\n\t\t\ttrimBuf();\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tappendMany(values: readonly T[]): void {\n\t\t\tif (values.length === 0) return;\n\t\t\tbuf.push(...values);\n\t\t\ttrimBuf();\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tclear(): void {\n\t\t\tif (buf.length === 0) return;\n\t\t\tbuf.length = 0;\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\ttrimHead(n: number): void {\n\t\t\tif (n < 0) {\n\t\t\t\tthrow new RangeError(\"n must be >= 0\");\n\t\t\t}\n\t\t\tif (n === 0) return;\n\t\t\tif (n >= buf.length) {\n\t\t\t\tif (buf.length === 0) return;\n\t\t\t\tbuf.length = 0;\n\t\t\t} else {\n\t\t\t\tbuf.splice(0, n);\n\t\t\t}\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\ttail(n: number): Node<readonly T[]> {\n\t\t\tif (n < 0) {\n\t\t\t\tthrow new RangeError(\"n must be >= 0\");\n\t\t\t}\n\t\t\tconst snap = entries.get() as ReactiveLogSnapshot<T>;\n\t\t\tconst e = snap.value.entries;\n\t\t\tconst init = n === 0 ? [] : e.slice(Math.max(0, e.length - n));\n\t\t\tconst out = derived(\n\t\t\t\t[entries],\n\t\t\t\t([s]) => {\n\t\t\t\t\tconst list = (s as ReactiveLogSnapshot<T>).value.entries;\n\t\t\t\t\treturn n === 0 ? [] : list.slice(Math.max(0, list.length - n));\n\t\t\t\t},\n\t\t\t\t{ initial: init, describeKind: \"derived\" },\n\t\t\t);\n\t\t\tkeepaliveDerived(out);\n\t\t\treturn out;\n\t\t},\n\t};\n\n\treturn bundle;\n}\n\n/**\n * Builds a derived node for `entries.slice(start, stop)` (same semantics as `Array.prototype.slice`; `stop` exclusive).\n *\n * @param log - Log from {@link reactiveLog}.\n * @param start - Start index (must be `>= 0`).\n * @param stop - End index (exclusive); omit to slice to the end.\n * @returns Derived node emitting the sliced readonly array.\n *\n * @example\n * ```ts\n * import { reactiveLog, logSlice } from \"@graphrefly/graphrefly-ts\";\n *\n * const lg = reactiveLog<number>([10, 20, 30, 40, 50]);\n * const slice$ = logSlice(lg, 1, 4); // reactive view of [20, 30, 40]\n * slice$.subscribe((msgs) => console.log(msgs));\n *\n * lg.append(60); // slice$ now reflects [20, 30, 40] (indices 1–3 of updated log)\n * ```\n *\n * @category extra\n */\nexport function logSlice<T>(\n\tlog: ReactiveLogBundle<T>,\n\tstart: number,\n\tstop?: number,\n): Node<readonly T[]> {\n\tif (start < 0) {\n\t\tthrow new RangeError(\"start must be >= 0\");\n\t}\n\tconst snap = log.entries.get() as ReactiveLogSnapshot<T>;\n\tconst e = snap.value.entries;\n\tconst init = stop === undefined ? e.slice(start) : e.slice(start, stop);\n\tconst out = derived(\n\t\t[log.entries],\n\t\t([s]) => {\n\t\t\tconst list = (s as ReactiveLogSnapshot<T>).value.entries;\n\t\t\treturn stop === undefined ? list.slice(start) : list.slice(start, stop);\n\t\t},\n\t\t{ initial: init, describeKind: \"derived\" },\n\t);\n\tkeepaliveDerived(out);\n\treturn out;\n}\n","/**\n * Wire protocol for worker bridge communication.\n *\n * Messages with {@link messageTier} >= 2 cross the wire (DATA values via\n * coalescing, RESOLVED/COMPLETE/TEARDOWN as signals, ERROR as serialized\n * payloads). Tier 0–1 (DIRTY, INVALIDATE, PAUSE, RESUME) stay local to\n * each side's reactive graph.\n *\n * Lifecycle signals serialize as string names since Symbols can't survive\n * structured clone. Unknown {@link Symbol.for} symbols are round-tripped\n * via their registered key.\n */\n\nimport { COMPLETE, ERROR, INVALIDATE, PAUSE, RESUME, TEARDOWN } from \"../../core/messages.js\";\n\n// ---------------------------------------------------------------------------\n// Wire message types\n// ---------------------------------------------------------------------------\n\n/** Value update — one node changed. */\nexport interface ValueMessage {\n\tt: \"v\";\n\t/** Node name. */\n\ts: string;\n\t/** Serialized value. */\n\td: unknown;\n}\n\n/** Lifecycle signal — serialized symbol name. */\nexport interface SignalMessage {\n\tt: \"s\";\n\t/** Node name, or `\"*\"` for bridge-wide. */\n\ts: string;\n\t/** Signal name string (e.g. \"TEARDOWN\"). */\n\tsig: string;\n\t/** Optional payload for custom symbols (spec §1.3.6 forward unchanged). */\n\td?: unknown;\n}\n\n/** Ready — worker declares its exported nodes with initial values. */\nexport interface ReadyMessage {\n\tt: \"r\";\n\tstores: Record<string, unknown>;\n}\n\n/** Init — main sends initial values of its exposed nodes. */\nexport interface InitMessage {\n\tt: \"i\";\n\tstores: Record<string, unknown>;\n}\n\n/** Batch value update — multiple nodes changed in one reactive cycle. */\nexport interface BatchMessage {\n\tt: \"b\";\n\tu: Record<string, unknown>;\n\t/** V0 versions per node for delta sync — peer skips if version <= lastSeen (§6.0b). */\n\tv?: Record<string, number>;\n}\n\n/** Error payload — serialized since Error objects don't survive structured clone. */\nexport interface ErrorMessage {\n\tt: \"e\";\n\t/** Node name. */\n\ts: string;\n\t/** Serialized error. */\n\terr: { message: string; name: string; stack?: string };\n}\n\nexport type BridgeMessage =\n\t| ValueMessage\n\t| SignalMessage\n\t| ReadyMessage\n\t| InitMessage\n\t| BatchMessage\n\t| ErrorMessage;\n\n// ---------------------------------------------------------------------------\n// Signal serialization — Symbol <-> string for structured clone\n// ---------------------------------------------------------------------------\n\nconst signalToNameMap = new Map<symbol, string>([\n\t[INVALIDATE, \"INVALIDATE\"],\n\t[PAUSE, \"PAUSE\"],\n\t[RESUME, \"RESUME\"],\n\t[TEARDOWN, \"TEARDOWN\"],\n\t[COMPLETE, \"COMPLETE\"],\n\t[ERROR, \"ERROR\"],\n]);\n\nconst nameToSignalMap = new Map<string, symbol>([\n\t[\"INVALIDATE\", INVALIDATE],\n\t[\"PAUSE\", PAUSE],\n\t[\"RESUME\", RESUME],\n\t[\"TEARDOWN\", TEARDOWN],\n\t[\"COMPLETE\", COMPLETE],\n\t[\"ERROR\", ERROR],\n]);\n\n/**\n * Serialize a message type symbol to a string for structured clone transfer.\n *\n * Known GraphReFly symbols map to their canonical names. Unknown symbols\n * registered via {@link Symbol.for} use their registered key. Unregistered\n * symbols return `\"UNKNOWN\"`.\n */\nexport function signalToName(s: symbol): string {\n\tconst known = signalToNameMap.get(s);\n\tif (known) return known;\n\tconst key = Symbol.keyFor(s);\n\treturn key ?? \"UNKNOWN\";\n}\n\n/**\n * Deserialize a string back to a message type symbol.\n *\n * Known GraphReFly names map to their canonical symbols. Other non-empty\n * strings are reconstructed via {@link Symbol.for} (round-trip safe for\n * custom message types). Returns `undefined` for `\"UNKNOWN\"`.\n */\nexport function nameToSignal(name: string): symbol | undefined {\n\tconst known = nameToSignalMap.get(name);\n\tif (known) return known;\n\tif (name && name !== \"UNKNOWN\") return Symbol.for(name);\n\treturn undefined;\n}\n\n/** Serialize an error for structured clone transfer. */\nexport function serializeError(err: unknown): { message: string; name: string; stack?: string } {\n\tif (err instanceof Error) {\n\t\treturn { message: err.message, name: err.name, stack: err.stack };\n\t}\n\treturn { message: String(err), name: \"Error\" };\n}\n\n/** Deserialize an error payload back to an Error object. */\nexport function deserializeError(payload: {\n\tmessage: string;\n\tname: string;\n\tstack?: string;\n}): Error {\n\tconst err = new Error(payload.message);\n\terr.name = payload.name;\n\tif (payload.stack) err.stack = payload.stack;\n\treturn err;\n}\n","/**\n * WorkerTransport — normalized message channel for all worker types.\n *\n * Abstracts Worker, SharedWorker, ServiceWorker, BroadcastChannel, and\n * MessagePort behind a uniform post/listen/terminate interface.\n */\n\n/** Normalized bidirectional message channel. */\nexport interface WorkerTransport {\n\t/** Send data to the other side. Optional transferables for zero-copy. */\n\tpost(data: unknown, transfer?: Transferable[]): void;\n\t/** Listen for incoming messages. Returns unsubscribe function. */\n\tlisten(handler: (data: unknown) => void): () => void;\n\t/** Terminate the connection (if supported by the underlying transport). */\n\tterminate?(): void;\n}\n\n/**\n * Auto-detect transport type and create a normalized WorkerTransport.\n *\n * Supports:\n * - `Worker` — direct postMessage/onmessage\n * - `SharedWorker` — port-based postMessage/onmessage\n * - `ServiceWorker` — postMessage via controller, listen via navigator.serviceWorker\n * - `BroadcastChannel` — postMessage/onmessage (no Transferable support)\n * - `MessagePort` — direct postMessage/onmessage (worker-side SharedWorker port)\n */\nexport function createTransport(target: unknown): WorkerTransport {\n\t// MessagePort (SharedWorker port from inside the worker, or raw MessagePort)\n\tif (typeof MessagePort !== \"undefined\" && target instanceof MessagePort) {\n\t\treturn {\n\t\t\tpost(data, transfer) {\n\t\t\t\ttarget.postMessage(data, transfer ?? []);\n\t\t\t},\n\t\t\tlisten(handler) {\n\t\t\t\tconst h = (e: MessageEvent) => handler(e.data);\n\t\t\t\ttarget.addEventListener(\"message\", h);\n\t\t\t\ttarget.start();\n\t\t\t\treturn () => target.removeEventListener(\"message\", h);\n\t\t\t},\n\t\t\tterminate() {\n\t\t\t\ttarget.close();\n\t\t\t},\n\t\t};\n\t}\n\n\t// SharedWorker — use its port\n\tif (typeof SharedWorker !== \"undefined\" && target instanceof SharedWorker) {\n\t\treturn createTransport(target.port);\n\t}\n\n\t// Web Worker\n\tif (typeof Worker !== \"undefined\" && target instanceof Worker) {\n\t\treturn {\n\t\t\tpost(data, transfer) {\n\t\t\t\ttarget.postMessage(data, transfer ?? []);\n\t\t\t},\n\t\t\tlisten(handler) {\n\t\t\t\tconst h = (e: MessageEvent) => handler(e.data);\n\t\t\t\ttarget.addEventListener(\"message\", h);\n\t\t\t\treturn () => target.removeEventListener(\"message\", h);\n\t\t\t},\n\t\t\tterminate() {\n\t\t\t\ttarget.terminate();\n\t\t\t},\n\t\t};\n\t}\n\n\t// BroadcastChannel — no Transferable support\n\tif (typeof BroadcastChannel !== \"undefined\" && target instanceof BroadcastChannel) {\n\t\treturn {\n\t\t\tpost(data, transfer?) {\n\t\t\t\tif (transfer && transfer.length > 0) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\"[graphrefly] WorkerTransport: BroadcastChannel does not support Transferable objects. The transfer argument is ignored and objects will be cloned instead.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\ttarget.postMessage(data);\n\t\t\t},\n\t\t\tlisten(handler) {\n\t\t\t\tconst h = (e: MessageEvent) => handler(e.data);\n\t\t\t\ttarget.addEventListener(\"message\", h);\n\t\t\t\treturn () => target.removeEventListener(\"message\", h);\n\t\t\t},\n\t\t\tterminate() {\n\t\t\t\ttarget.close();\n\t\t\t},\n\t\t};\n\t}\n\n\t// ServiceWorker\n\tif (typeof ServiceWorker !== \"undefined\" && target instanceof ServiceWorker) {\n\t\treturn {\n\t\t\tpost(data, transfer) {\n\t\t\t\ttarget.postMessage(data, transfer ?? []);\n\t\t\t},\n\t\t\tlisten(handler) {\n\t\t\t\tconst h = (e: MessageEvent) => {\n\t\t\t\t\tif (e.source === target) handler(e.data);\n\t\t\t\t};\n\t\t\t\tnavigator.serviceWorker.addEventListener(\"message\", h);\n\t\t\t\treturn () => navigator.serviceWorker.removeEventListener(\"message\", h);\n\t\t\t},\n\t\t};\n\t}\n\n\tthrow new Error(\n\t\t\"createTransport: unsupported target type. Expected Worker, SharedWorker, ServiceWorker, BroadcastChannel, or MessagePort.\",\n\t);\n}\n","/**\n * workerBridge — main-thread reactive node bridge to a worker.\n *\n * Creates proxy nodes for imported worker nodes, subscribes to exposed\n * nodes and sends values across the wire. Uses derived() + effect() for\n * natural batch coalescing via two-phase push + bitmask resolution.\n *\n * Wire filtering: messages with {@link messageTier} >= 2 cross the wire.\n * DATA values go through the coalescing path; RESOLVED, COMPLETE, ERROR,\n * TEARDOWN, and unknown {@link Symbol.for} types go through the signal\n * subscription. Tier 0–1 (DIRTY, INVALIDATE, PAUSE, RESUME) stay local.\n *\n * Handshake:\n * 1. Main creates bridge, starts listening\n * 2. Worker sends { t: 'r', stores: { name: initialValue, ... } }\n * 3. Main creates proxy nodes, marks meta.status \"connected\"\n * 4. Main sends { t: 'i', stores: { name: currentValue, ... } }\n * 5. Bidirectional value flow begins\n */\n\nimport { batch } from \"../../core/batch.js\";\nimport {\n\tDATA,\n\tERROR,\n\tknownMessageTypes,\n\ttype Messages,\n\tmessageTier,\n\tTEARDOWN,\n} from \"../../core/messages.js\";\nimport type { Node, NodeSink } from \"../../core/node.js\";\nimport { derived, effect, state } from \"../../core/sugar.js\";\nimport type { BatchMessage, BridgeMessage } from \"./protocol.js\";\nimport { deserializeError, nameToSignal, serializeError, signalToName } from \"./protocol.js\";\nimport type { WorkerTransport } from \"./transport.js\";\nimport { createTransport } from \"./transport.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface WorkerBridgeOptions<\n\tTExpose extends Record<string, Node<any>>,\n\tTImport extends readonly string[],\n> {\n\t/** Nodes to send to the worker. */\n\texpose?: TExpose;\n\t/** Node names the worker will provide. */\n\timport?: TImport;\n\t/** Per-node transferable extractors for zero-copy ArrayBuffer passing. */\n\ttransfer?: Partial<Record<keyof TExpose, (value: any) => Transferable[]>>;\n\t/** Debug name. */\n\tname?: string;\n\t/**\n\t * Handshake timeout in milliseconds. If the worker doesn't send READY\n\t * within this window, `meta.status` transitions to `\"closed\"` and\n\t * `meta.error` is set. Default: no timeout.\n\t */\n\ttimeoutMs?: number;\n}\n\n/** Proxy nodes created from imported worker node names. */\ntype ImportedNodes<T extends readonly string[]> = {\n\treadonly [K in T[number]]: Node<any>;\n};\n\nexport type WorkerBridge<\n\t_TExpose extends Record<string, Node<any>>,\n\tTImport extends readonly string[],\n> = ImportedNodes<TImport> & {\n\t/** Connection status meta node. */\n\tmeta: {\n\t\tstatus: Node<\"connecting\" | \"connected\" | \"closed\">;\n\t\terror: Node<Error | null>;\n\t};\n\t/** Destroy the bridge: sends TEARDOWN, disconnects, terminates worker. */\n\tdestroy(): void;\n};\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nfunction isTransport(t: unknown): t is WorkerTransport {\n\treturn (\n\t\ttypeof t === \"object\" &&\n\t\tt !== null &&\n\t\ttypeof (t as any).post === \"function\" &&\n\t\ttypeof (t as any).listen === \"function\"\n\t);\n}\n\nexport function workerBridge<\n\tTExpose extends Record<string, Node<any>>,\n\tTImport extends readonly string[],\n>(\n\ttarget: unknown | WorkerTransport,\n\topts: WorkerBridgeOptions<TExpose, TImport>,\n): WorkerBridge<TExpose, TImport> {\n\tconst transport = isTransport(target) ? target : createTransport(target);\n\tconst bridgeName = opts.name ?? \"workerBridge\";\n\tconst exposeEntries = Object.entries(opts.expose ?? {});\n\tconst importNames = (opts.import ?? []) as readonly string[];\n\tconst transferFns = opts.transfer ?? {};\n\n\t// -- Meta: connection status -----------------------------------------------\n\tconst statusNode = state<\"connecting\" | \"connected\" | \"closed\">(\"connecting\", {\n\t\tname: `${bridgeName}::meta::status`,\n\t});\n\tconst errorNode = state<Error | null>(null, {\n\t\tname: `${bridgeName}::meta::error`,\n\t});\n\n\t// -- Proxy nodes for imports (worker -> main) ------------------------------\n\tconst proxyNodes = new Map<string, Node<any>>();\n\tconst lastSeenImportVersions = new Map<string, number>();\n\tfor (const name of importNames) {\n\t\tconst proxy = state(undefined, { name: `${bridgeName}::${name}` });\n\t\tproxyNodes.set(name, proxy);\n\t}\n\n\t// -- Send coalescing via derived + effect ----------------------------------\n\tconst lastSent = new Map<string, unknown>();\n\tlet effectUnsub: (() => void) | undefined;\n\n\tif (exposeEntries.length > 0) {\n\t\tconst exposedNodes = exposeEntries.map(([, n]) => n);\n\n\t\tconst aggregated = derived(\n\t\t\texposedNodes,\n\t\t\t() => {\n\t\t\t\tconst updates: Record<string, unknown> = {};\n\t\t\t\tfor (const [name, n] of exposeEntries) {\n\t\t\t\t\tconst v = n.get();\n\t\t\t\t\tif (v !== lastSent.get(name)) {\n\t\t\t\t\t\tupdates[name] = v;\n\t\t\t\t\t\tlastSent.set(name, v);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn updates;\n\t\t\t},\n\t\t\t{ equals: () => false, name: `${bridgeName}::aggregated` },\n\t\t);\n\n\t\tconst effectNode = effect([aggregated], () => {\n\t\t\tconst updates = aggregated.get() as Record<string, unknown>;\n\t\t\tif (Object.keys(updates).length === 0) return;\n\n\t\t\tconst transferList: Transferable[] = [];\n\t\t\tfor (const name of Object.keys(updates)) {\n\t\t\t\tconst fn = (transferFns as any)[name];\n\t\t\t\tif (fn) transferList.push(...fn(updates[name]));\n\t\t\t}\n\n\t\t\t// V0 delta sync: include version counters when available (§6.0b).\n\t\t\tlet versions: Record<string, number> | undefined;\n\t\t\tfor (const [name, n] of exposeEntries) {\n\t\t\t\tif (name in updates && n.v != null) {\n\t\t\t\t\tif (versions == null) versions = {};\n\t\t\t\t\tversions[name] = n.v.version;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst msg: BatchMessage = { t: \"b\", u: updates, ...(versions ? { v: versions } : {}) };\n\t\t\ttry {\n\t\t\t\ttransport.post(msg, transferList.length > 0 ? transferList : undefined);\n\t\t\t} catch (err) {\n\t\t\t\terrorNode.down([[DATA, err instanceof Error ? err : new Error(String(err))]]);\n\t\t\t}\n\t\t});\n\t\t// Effect nodes are lazy — subscribe to activate the chain\n\t\teffectUnsub = effectNode.subscribe(() => {});\n\t}\n\n\t// -- Receive handler -------------------------------------------------------\n\tlet destroyed = false;\n\n\tconst unlisten = transport.listen((data) => {\n\t\tif (destroyed) return;\n\t\tconst msg = data as BridgeMessage;\n\n\t\tswitch (msg.t) {\n\t\t\t// Worker ready — set proxy nodes with initial values\n\t\t\tcase \"r\": {\n\t\t\t\tif (handshakeTimer !== undefined) clearTimeout(handshakeTimer);\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const [name, value] of Object.entries(msg.stores)) {\n\t\t\t\t\t\tconst proxy = proxyNodes.get(name);\n\t\t\t\t\t\tif (proxy) proxy.down([[DATA, value]]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tstatusNode.down([[DATA, \"connected\"]]);\n\n\t\t\t\t// Send initial values of exposed nodes\n\t\t\t\tconst initValues: Record<string, unknown> = {};\n\t\t\t\tfor (const [name, n] of exposeEntries) {\n\t\t\t\t\tinitValues[name] = n.get();\n\t\t\t\t\tlastSent.set(name, initValues[name]);\n\t\t\t\t}\n\t\t\t\ttransport.post({ t: \"i\", stores: initValues } satisfies BridgeMessage);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Single value update from worker\n\t\t\tcase \"v\": {\n\t\t\t\tconst proxy = proxyNodes.get(msg.s);\n\t\t\t\tif (proxy) proxy.down([[DATA, msg.d]]);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Batch value update from worker\n\t\t\tcase \"b\": {\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const [name, value] of Object.entries(msg.u)) {\n\t\t\t\t\t\tconst incomingVersion = msg.v?.[name];\n\t\t\t\t\t\tif (incomingVersion != null) {\n\t\t\t\t\t\t\tconst lastSeen = lastSeenImportVersions.get(name);\n\t\t\t\t\t\t\tif (lastSeen != null && incomingVersion <= lastSeen) continue;\n\t\t\t\t\t\t\tlastSeenImportVersions.set(name, incomingVersion);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst proxy = proxyNodes.get(name);\n\t\t\t\t\t\tif (proxy) proxy.down([[DATA, value]]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Error from worker node\n\t\t\tcase \"e\": {\n\t\t\t\tconst proxy = proxyNodes.get(msg.s);\n\t\t\t\tif (proxy) proxy.down([[ERROR, deserializeError(msg.err)]]);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Lifecycle signal from worker\n\t\t\tcase \"s\": {\n\t\t\t\tconst sig = nameToSignal(msg.sig);\n\t\t\t\tif (!sig) break;\n\n\t\t\t\tconst targets: Node<any>[] =\n\t\t\t\t\tmsg.s === \"*\"\n\t\t\t\t\t\t? [...proxyNodes.values()]\n\t\t\t\t\t\t: proxyNodes.has(msg.s)\n\t\t\t\t\t\t\t? [proxyNodes.get(msg.s)!]\n\t\t\t\t\t\t\t: [];\n\n\t\t\t\tfor (const proxy of targets) {\n\t\t\t\t\tproxy.down((msg.d === undefined ? [[sig]] : [[sig, msg.d]]) as Messages);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t});\n\n\t// -- Subscribe to exposed nodes: forward tier >= 2 messages -----------------\n\tconst exposeUnsubs: Array<() => void> = [];\n\tfor (const [name, n] of exposeEntries) {\n\t\tconst unsub = n.subscribe(((msgs: Messages) => {\n\t\t\tif (destroyed) return;\n\t\t\tfor (const m of msgs) {\n\t\t\t\tconst type = m[0] as symbol;\n\t\t\t\t// DATA goes through the coalescing path — skip here\n\t\t\t\tif (type === DATA) continue;\n\t\t\t\t// Block known tier 0/1 (DIRTY, INVALIDATE, PAUSE, RESUME) — local only.\n\t\t\t\t// Unknown types (not in knownMessageTypes) always forward (spec §1.3.6).\n\t\t\t\tif (knownMessageTypes.includes(type) && messageTier(type) < 2) continue;\n\t\t\t\t// ERROR: serialize payload\n\t\t\t\tif (type === ERROR) {\n\t\t\t\t\ttransport.post({\n\t\t\t\t\t\tt: \"e\",\n\t\t\t\t\t\ts: name,\n\t\t\t\t\t\terr: serializeError(m[1]),\n\t\t\t\t\t} satisfies BridgeMessage);\n\t\t\t\t} else {\n\t\t\t\t\t// RESOLVED, COMPLETE, TEARDOWN, and unknown Symbol.for types\n\t\t\t\t\ttransport.post({\n\t\t\t\t\t\tt: \"s\",\n\t\t\t\t\t\ts: name,\n\t\t\t\t\t\tsig: signalToName(type),\n\t\t\t\t\t\td: m.length > 1 ? m[1] : undefined,\n\t\t\t\t\t} satisfies BridgeMessage);\n\t\t\t\t}\n\t\t\t}\n\t\t}) as NodeSink);\n\t\texposeUnsubs.push(unsub);\n\t}\n\n\t// -- Handshake timeout -----------------------------------------------------\n\tlet handshakeTimer: ReturnType<typeof setTimeout> | undefined;\n\tif (opts.timeoutMs != null && opts.timeoutMs > 0) {\n\t\thandshakeTimer = setTimeout(() => {\n\t\t\tif (statusNode.get() === \"connecting\") {\n\t\t\t\terrorNode.down([[DATA, new Error(\"Worker bridge handshake timeout\")]]);\n\t\t\t\tdestroy();\n\t\t\t}\n\t\t}, opts.timeoutMs);\n\t}\n\n\t// -- Build result object ---------------------------------------------------\n\tfunction destroy() {\n\t\tif (destroyed) return;\n\t\tdestroyed = true;\n\n\t\tif (handshakeTimer !== undefined) clearTimeout(handshakeTimer);\n\n\t\t// Send bridge-level TEARDOWN to worker\n\t\ttransport.post({\n\t\t\tt: \"s\",\n\t\t\ts: \"*\",\n\t\t\tsig: signalToName(TEARDOWN),\n\t\t} satisfies BridgeMessage);\n\n\t\t// Cleanup: unsub effect first (stops sending), then unsub expose\n\t\t// listeners, then unlisten on transport\n\t\tif (effectUnsub) effectUnsub();\n\t\tfor (const unsub of exposeUnsubs) unsub();\n\t\texposeUnsubs.length = 0;\n\t\tunlisten();\n\n\t\tstatusNode.down([[DATA, \"closed\"]]);\n\n\t\tlastSent.clear();\n\t\tlastSeenImportVersions.clear();\n\t\tproxyNodes.clear();\n\t}\n\n\tconst result: any = {\n\t\tmeta: { status: statusNode, error: errorNode },\n\t\tdestroy,\n\t};\n\n\t// Attach proxy nodes as properties\n\tfor (const [name, proxy] of proxyNodes) {\n\t\tresult[name] = proxy;\n\t}\n\n\treturn result as WorkerBridge<TExpose, TImport>;\n}\n","/**\n * workerSelf — worker-side reactive node bridge.\n *\n * Mirror of workerBridge() for the worker side. Creates proxy nodes for\n * imports from main thread, exposes local nodes via the same wire protocol.\n * Uses derived() + effect() for batch coalescing.\n *\n * Wire filtering: messages with {@link messageTier} >= 2 cross the wire.\n * DATA values go through the coalescing path; RESOLVED, COMPLETE, ERROR,\n * TEARDOWN, and unknown {@link Symbol.for} types go through the signal\n * subscription. Tier 0–1 (DIRTY, INVALIDATE, PAUSE, RESUME) stay local.\n *\n * Handshake (worker perspective):\n * 1. workerSelf() called — creates proxy nodes for imports\n * 2. Runs expose factory with proxy nodes -> gets nodes to expose\n * 3. Sends { t: 'r', stores: { name: initialValue, ... } } to main\n * 4. Receives { t: 'i', stores: { name: value, ... } } from main\n * 5. Updates proxy nodes -> triggers local effects\n */\n\nimport { batch } from \"../../core/batch.js\";\nimport {\n\tDATA,\n\tERROR,\n\tknownMessageTypes,\n\ttype Messages,\n\tmessageTier,\n\tTEARDOWN,\n} from \"../../core/messages.js\";\nimport type { Node, NodeSink } from \"../../core/node.js\";\nimport { derived, effect, state } from \"../../core/sugar.js\";\nimport type { BatchMessage, BridgeMessage } from \"./protocol.js\";\nimport { deserializeError, nameToSignal, serializeError, signalToName } from \"./protocol.js\";\nimport type { WorkerTransport } from \"./transport.js\";\nimport { createTransport } from \"./transport.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface WorkerSelfOptions<TImport extends readonly string[]> {\n\t/** Node names that the main thread will provide. */\n\timport?: TImport;\n\t/** Factory that receives imported proxy nodes and returns nodes to expose. */\n\texpose: (imported: WorkerImported<TImport>) => Record<string, Node<any>>;\n\t/** Per-node transferable extractors for zero-copy ArrayBuffer passing. */\n\ttransfer?: Record<string, (value: any) => Transferable[]>;\n}\n\n/** Proxy nodes available inside the worker from main-thread exposed nodes. */\ntype WorkerImported<T extends readonly string[]> = {\n\treadonly [K in T[number]]: Node<any>;\n};\n\nexport interface WorkerSelfHandle {\n\t/** Dispose all subscriptions and stop the bridge. */\n\tdestroy(): void;\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nfunction isTransport(t: unknown): t is WorkerTransport {\n\treturn (\n\t\ttypeof t === \"object\" &&\n\t\tt !== null &&\n\t\ttypeof (t as any).post === \"function\" &&\n\t\ttypeof (t as any).listen === \"function\"\n\t);\n}\n\nexport function workerSelf<TImport extends readonly string[]>(\n\ttarget: unknown | WorkerTransport,\n\topts: WorkerSelfOptions<TImport>,\n): WorkerSelfHandle {\n\tconst transport = isTransport(target) ? target : createTransport(target);\n\tconst importNames = (opts.import ?? []) as readonly string[];\n\tconst transferFns = opts.transfer ?? {};\n\n\t// -- Proxy nodes for imports (main -> worker) ------------------------------\n\tconst proxyNodes = new Map<string, Node<any>>();\n\tconst lastSeenImportVersions = new Map<string, number>();\n\tconst importedObj: any = {};\n\tfor (const name of importNames) {\n\t\tconst s = state(undefined, { name: `worker::${name}` });\n\t\tproxyNodes.set(name, s);\n\t\timportedObj[name] = s;\n\t}\n\n\t// -- Run expose factory ----------------------------------------------------\n\tconst exposedNodes = opts.expose(importedObj as WorkerImported<TImport>);\n\tconst exposeEntries = Object.entries(exposedNodes);\n\n\t// -- Send coalescing via derived + effect ----------------------------------\n\tconst lastSent = new Map<string, unknown>();\n\tlet effectUnsub: (() => void) | undefined;\n\tlet destroyed = false;\n\n\tif (exposeEntries.length > 0) {\n\t\tconst nodes = exposeEntries.map(([, n]) => n);\n\n\t\tconst aggregated = derived(\n\t\t\tnodes,\n\t\t\t() => {\n\t\t\t\tconst updates: Record<string, unknown> = {};\n\t\t\t\tfor (const [name, n] of exposeEntries) {\n\t\t\t\t\tconst v = n.get();\n\t\t\t\t\tif (v !== lastSent.get(name)) {\n\t\t\t\t\t\tupdates[name] = v;\n\t\t\t\t\t\tlastSent.set(name, v);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn updates;\n\t\t\t},\n\t\t\t{ equals: () => false, name: \"workerSelf::aggregated\" },\n\t\t);\n\n\t\tconst effectNode = effect([aggregated], () => {\n\t\t\tif (destroyed) return;\n\t\t\tconst updates = aggregated.get() as Record<string, unknown>;\n\t\t\tif (Object.keys(updates).length === 0) return;\n\n\t\t\tconst transferList: Transferable[] = [];\n\t\t\tfor (const name of Object.keys(updates)) {\n\t\t\t\tconst fn = (transferFns as any)[name];\n\t\t\t\tif (fn) transferList.push(...fn(updates[name]));\n\t\t\t}\n\n\t\t\t// V0 delta sync: include version counters when available (§6.0b).\n\t\t\tlet versions: Record<string, number> | undefined;\n\t\t\tfor (const [name, n] of exposeEntries) {\n\t\t\t\tif (name in updates && n.v != null) {\n\t\t\t\t\tif (versions == null) versions = {};\n\t\t\t\t\tversions[name] = n.v.version;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst msg: BatchMessage = { t: \"b\", u: updates, ...(versions ? { v: versions } : {}) };\n\t\t\ttry {\n\t\t\t\ttransport.post(msg, transferList.length > 0 ? transferList : undefined);\n\t\t\t} catch (_err) {\n\t\t\t\t// Transport failure — bridge is likely destroyed; swallow\n\t\t\t}\n\t\t});\n\t\t// Effect nodes are lazy — subscribe to activate the chain\n\t\teffectUnsub = effectNode.subscribe(() => {});\n\t}\n\n\t// -- Subscribe to exposed nodes: forward tier >= 2 messages -----------------\n\tconst exposeUnsubs: Array<() => void> = [];\n\tfor (const [name, n] of exposeEntries) {\n\t\tconst unsub = n.subscribe(((msgs: Messages) => {\n\t\t\tif (destroyed) return;\n\t\t\tfor (const m of msgs) {\n\t\t\t\tconst type = m[0] as symbol;\n\t\t\t\t// DATA goes through the coalescing path — skip here\n\t\t\t\tif (type === DATA) continue;\n\t\t\t\t// Block known tier 0/1 (DIRTY, INVALIDATE, PAUSE, RESUME) — local only.\n\t\t\t\t// Unknown types (not in knownMessageTypes) always forward (spec §1.3.6).\n\t\t\t\tif (knownMessageTypes.includes(type) && messageTier(type) < 2) continue;\n\t\t\t\t// ERROR: serialize payload\n\t\t\t\tif (type === ERROR) {\n\t\t\t\t\ttransport.post({\n\t\t\t\t\t\tt: \"e\",\n\t\t\t\t\t\ts: name,\n\t\t\t\t\t\terr: serializeError(m[1]),\n\t\t\t\t\t} satisfies BridgeMessage);\n\t\t\t\t} else {\n\t\t\t\t\t// RESOLVED, COMPLETE, TEARDOWN, and unknown Symbol.for types\n\t\t\t\t\ttransport.post({\n\t\t\t\t\t\tt: \"s\",\n\t\t\t\t\t\ts: name,\n\t\t\t\t\t\tsig: signalToName(type),\n\t\t\t\t\t\td: m.length > 1 ? m[1] : undefined,\n\t\t\t\t\t} satisfies BridgeMessage);\n\t\t\t\t}\n\t\t\t}\n\t\t}) as NodeSink);\n\t\texposeUnsubs.push(unsub);\n\t}\n\n\t// -- Receive handler -------------------------------------------------------\n\tconst unlisten = transport.listen((data) => {\n\t\tif (destroyed) return;\n\t\tconst msg = data as BridgeMessage;\n\n\t\tswitch (msg.t) {\n\t\t\t// Init from main — set proxy node values\n\t\t\tcase \"i\": {\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const [name, value] of Object.entries(msg.stores)) {\n\t\t\t\t\t\tconst proxy = proxyNodes.get(name);\n\t\t\t\t\t\tif (proxy) proxy.down([[DATA, value]]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Single value update from main\n\t\t\tcase \"v\": {\n\t\t\t\tconst proxy = proxyNodes.get(msg.s);\n\t\t\t\tif (proxy) proxy.down([[DATA, msg.d]]);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Batch value update from main\n\t\t\tcase \"b\": {\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const [name, value] of Object.entries(msg.u)) {\n\t\t\t\t\t\tconst incomingVersion = msg.v?.[name];\n\t\t\t\t\t\tif (incomingVersion != null) {\n\t\t\t\t\t\t\tconst lastSeen = lastSeenImportVersions.get(name);\n\t\t\t\t\t\t\tif (lastSeen != null && incomingVersion <= lastSeen) continue;\n\t\t\t\t\t\t\tlastSeenImportVersions.set(name, incomingVersion);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst proxy = proxyNodes.get(name);\n\t\t\t\t\t\tif (proxy) proxy.down([[DATA, value]]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Error from main node\n\t\t\tcase \"e\": {\n\t\t\t\tconst proxy = proxyNodes.get(msg.s);\n\t\t\t\tif (proxy) proxy.down([[ERROR, deserializeError(msg.err)]]);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Lifecycle signal from main\n\t\t\tcase \"s\": {\n\t\t\t\tconst sig = nameToSignal(msg.sig);\n\t\t\t\tif (!sig) break;\n\n\t\t\t\tif (sig === TEARDOWN && msg.s === \"*\") {\n\t\t\t\t\tdestroy();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst targets: Node<any>[] =\n\t\t\t\t\tmsg.s === \"*\"\n\t\t\t\t\t\t? [...proxyNodes.values()]\n\t\t\t\t\t\t: proxyNodes.has(msg.s)\n\t\t\t\t\t\t\t? [proxyNodes.get(msg.s)!]\n\t\t\t\t\t\t\t: [];\n\n\t\t\t\tfor (const proxy of targets) {\n\t\t\t\t\tproxy.down((msg.d === undefined ? [[sig]] : [[sig, msg.d]]) as Messages);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t});\n\n\t// -- Send ready message ----------------------------------------------------\n\tconst readyValues: Record<string, unknown> = {};\n\tfor (const [name, n] of exposeEntries) {\n\t\treadyValues[name] = n.get();\n\t\tlastSent.set(name, readyValues[name]);\n\t}\n\ttransport.post({ t: \"r\", stores: readyValues } satisfies BridgeMessage);\n\n\t// -- Destroy ---------------------------------------------------------------\n\tfunction destroy() {\n\t\tif (destroyed) return;\n\t\tdestroyed = true;\n\n\t\t// Cleanup: unsub effect first (stops sending), then expose listeners,\n\t\t// then unlisten on transport\n\t\tif (effectUnsub) effectUnsub();\n\t\tfor (const unsub of exposeUnsubs) unsub();\n\t\texposeUnsubs.length = 0;\n\t\tunlisten();\n\t\ttransport.terminate?.();\n\n\t\tlastSent.clear();\n\t\tlastSeenImportVersions.clear();\n\t\tproxyNodes.clear();\n\t}\n\n\treturn { destroy };\n}\n"],"mappings":"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","names":["delay","last","clampNonNegative","operatorOpts","debounce","resolvePath","sourceOpts","buffer","import_node_crypto","import_node_fs","import_node_path","node","operatorOpts","buffer","first","map","node","node","emptySnapshot","emptySnapshot","emptySnapshot","keepaliveDerived","isTransport"]}
|
|
1
|
+
{"version":3,"sources":["../../src/extra/index.ts","../../src/core/messages.ts","../../src/core/batch.ts","../../src/core/clock.ts","../../src/core/actor.ts","../../src/core/guard.ts","../../src/core/versioning.ts","../../src/core/node.ts","../../src/core/sugar.ts","../../src/extra/backoff.ts","../../src/extra/resilience.ts","../../src/extra/sources.ts","../../src/extra/cron.ts","../../src/extra/adapters.ts","../../src/extra/backpressure.ts","../../src/extra/checkpoint.ts","../../src/core/dynamic-node.ts","../../src/extra/operators.ts","../../src/extra/reactive-base.ts","../../src/extra/reactive-map.ts","../../src/extra/composite.ts","../../src/extra/observable.ts","../../src/extra/pubsub.ts","../../src/extra/reactive-index.ts","../../src/extra/reactive-list.ts","../../src/extra/reactive-log.ts","../../src/extra/worker/protocol.ts","../../src/extra/worker/transport.ts","../../src/extra/worker/bridge.ts","../../src/extra/worker/self.ts"],"sourcesContent":["/**\n * Extra layer: operators, sources, sinks (Phase 2+).\n */\n\nexport * from \"./adapters.js\";\nexport * from \"./backoff.js\";\nexport * from \"./backpressure.js\";\nexport * from \"./checkpoint.js\";\nexport * from \"./composite.js\";\nexport * from \"./cron.js\";\nexport * from \"./observable.js\";\nexport * from \"./operators.js\";\nexport * from \"./pubsub.js\";\nexport * from \"./reactive-index.js\";\nexport * from \"./reactive-list.js\";\nexport * from \"./reactive-log.js\";\nexport * from \"./reactive-map.js\";\nexport * from \"./resilience.js\";\nexport * from \"./sources.js\";\nexport * from \"./worker/index.js\";\n","/**\n * GraphReFly message protocol — §1 `~/src/graphrefly/GRAPHREFLY-SPEC.md`.\n * Emissions are always `[[Type, Data?], ...]` (no single-tuple shorthand).\n *\n * ## Canonical message ordering (within a composite batch)\n *\n * When multiple message types appear in a single `down()` call, the canonical\n * delivery order is determined by **signal tier**:\n *\n * | Tier | Signals | Role | Batch behavior |\n * |------|------------------------|-------------------|-------------------------------------|\n * | 0 | DIRTY, INVALIDATE | Notification | Immediate (never deferred) |\n * | 1 | PAUSE, RESUME | Flow control | Immediate (never deferred) |\n * | 2 | DATA, RESOLVED | Value settlement | Deferred inside `batch()` |\n * | 3 | COMPLETE, ERROR | Terminal lifecycle | Deferred to after phase-2 |\n * | 4 | TEARDOWN | Destruction | Immediate (usually sent alone) |\n *\n * **Rule:** Within `emitWithBatch`, messages are partitioned by tier and delivered\n * in tier order. This ensures phase-2 values (DATA/RESOLVED) reach sinks before\n * terminal signals (COMPLETE/ERROR) mark the node as done, preventing the\n * \"COMPLETE-before-DATA\" class of bugs. Sources that emit in canonical order\n * naturally partition correctly with zero overhead.\n *\n * Unknown message types (forward-compat) are tier 0 (immediate).\n *\n * ## Meta node bypass rules (centralized — GRAPHREFLY-SPEC §2.3)\n *\n * - **INVALIDATE** via `graph.signal()` — no-op on meta nodes (cached values preserved).\n * - **COMPLETE / ERROR** — not propagated from parent to meta (meta outlives terminal\n * state for post-mortem writes like setting `meta.error` after ERROR).\n * - **TEARDOWN** — propagated from parent to meta, releasing meta resources.\n */\n\n/** Value delivery (`DATA`, value). Tier 2 — deferred inside `batch()`. */\nexport const DATA = Symbol.for(\"graphrefly/DATA\");\n/** Phase 1: value about to change. Tier 0 — immediate. */\nexport const DIRTY = Symbol.for(\"graphrefly/DIRTY\");\n/** Phase 2: dirty pass completed, value unchanged. Tier 2 — deferred inside `batch()`. */\nexport const RESOLVED = Symbol.for(\"graphrefly/RESOLVED\");\n/** Clear cached state; do not auto-emit. Tier 0 — immediate. */\nexport const INVALIDATE = Symbol.for(\"graphrefly/INVALIDATE\");\n/** Suspend activity. Tier 1 — immediate. */\nexport const PAUSE = Symbol.for(\"graphrefly/PAUSE\");\n/** Resume after pause. Tier 1 — immediate. */\nexport const RESUME = Symbol.for(\"graphrefly/RESUME\");\n/** Permanent cleanup. Tier 4 — immediate (usually sent alone). */\nexport const TEARDOWN = Symbol.for(\"graphrefly/TEARDOWN\");\n/** Clean termination. Tier 3 — delivered after phase-2 in the same batch. */\nexport const COMPLETE = Symbol.for(\"graphrefly/COMPLETE\");\n/** Error termination. Tier 3 — delivered after phase-2 in the same batch. */\nexport const ERROR = Symbol.for(\"graphrefly/ERROR\");\n\n/** Known protocol type symbols (open set — other symbols are valid and forward). */\nexport const knownMessageTypes: readonly symbol[] = [\n\tDATA,\n\tDIRTY,\n\tRESOLVED,\n\tINVALIDATE,\n\tPAUSE,\n\tRESUME,\n\tTEARDOWN,\n\tCOMPLETE,\n\tERROR,\n];\n\n/** One protocol tuple: `[Type, optional payload]`. */\nexport type Message = readonly [symbol, unknown?];\n\n/**\n * A batch of tuples — the wire shape for `node.down()` / `node.up()`.\n */\nexport type Messages = readonly Message[];\n\n/**\n * Whether `t` is one of the built-in protocol symbols in this module.\n *\n * @param t — Message type symbol (unknown types are still valid; they must forward).\n * @returns `true` for `DATA`, `DIRTY`, `RESOLVED`, etc.\n *\n * @example\n * ```ts\n * import { DATA, DIRTY, isKnownMessageType } from \"@graphrefly/graphrefly-ts\";\n *\n * isKnownMessageType(DATA); // true\n * isKnownMessageType(Symbol(\"custom\")); // false\n * ```\n */\nexport function isKnownMessageType(t: symbol): boolean {\n\treturn knownMessageTypes.includes(t);\n}\n\n/**\n * Returns the signal tier for a message type (see module-level ordering table).\n *\n * - 0: notification (DIRTY, INVALIDATE) — immediate\n * - 1: flow control (PAUSE, RESUME) — immediate\n * - 2: value (DATA, RESOLVED) — deferred inside `batch()`\n * - 3: terminal (COMPLETE, ERROR) — delivered after phase-2\n * - 4: destruction (TEARDOWN) — immediate, usually alone\n * - 0 for unknown types (forward-compat: immediate)\n *\n * @param t — Message type symbol.\n * @returns Tier number (0–4).\n *\n * @example\n * ```ts\n * import { DATA, DIRTY, COMPLETE, TEARDOWN, messageTier } from \"@graphrefly/graphrefly-ts\";\n *\n * messageTier(DIRTY); // 0\n * messageTier(DATA); // 2\n * messageTier(COMPLETE); // 3\n * messageTier(TEARDOWN); // 4\n * ```\n */\nexport function messageTier(t: symbol): number {\n\tif (t === DIRTY || t === INVALIDATE) return 0;\n\tif (t === PAUSE || t === RESUME) return 1;\n\tif (t === DATA || t === RESOLVED) return 2;\n\tif (t === COMPLETE || t === ERROR) return 3;\n\tif (t === TEARDOWN) return 4;\n\treturn 0; // unknown → immediate\n}\n\n/**\n * Returns whether this tuple is deferred by `batch()` (phase 2: `DATA` or `RESOLVED`).\n *\n * @param msg — Single message tuple.\n * @returns `true` if `msg` is `DATA` or `RESOLVED`.\n *\n * @example\n * ```ts\n * import { DATA, RESOLVED, DIRTY, isPhase2Message } from \"@graphrefly/graphrefly-ts\";\n *\n * isPhase2Message([DATA, 42]); // true\n * isPhase2Message([RESOLVED]); // true\n * isPhase2Message([DIRTY]); // false\n * ```\n */\nexport function isPhase2Message(msg: Message): boolean {\n\tconst t = msg[0];\n\treturn t === DATA || t === RESOLVED;\n}\n\n/**\n * Returns whether this message type is terminal (COMPLETE or ERROR).\n * Terminal messages are delivered after phase-2 in the same batch to prevent\n * the node from becoming terminal before value messages reach sinks.\n *\n * @param t — Message type symbol.\n * @returns `true` for `COMPLETE` or `ERROR`.\n *\n * @example\n * ```ts\n * import { COMPLETE, ERROR, DATA, isTerminalMessage } from \"@graphrefly/graphrefly-ts\";\n *\n * isTerminalMessage(COMPLETE); // true\n * isTerminalMessage(ERROR); // true\n * isTerminalMessage(DATA); // false\n * ```\n */\nexport function isTerminalMessage(t: symbol): boolean {\n\treturn t === COMPLETE || t === ERROR;\n}\n\n/**\n * Whether `t` should be propagated from a parent node to its companion meta nodes.\n * Only TEARDOWN propagates; COMPLETE/ERROR/INVALIDATE do not (meta outlives parent\n * terminal state for post-mortem writes).\n *\n * @param t — Message type symbol.\n * @returns `true` if the signal should reach meta nodes.\n *\n * @example\n * ```ts\n * import { TEARDOWN, COMPLETE, ERROR, propagatesToMeta } from \"@graphrefly/graphrefly-ts\";\n *\n * propagatesToMeta(TEARDOWN); // true\n * propagatesToMeta(COMPLETE); // false\n * propagatesToMeta(ERROR); // false\n * ```\n */\nexport function propagatesToMeta(t: symbol): boolean {\n\treturn t === TEARDOWN;\n}\n","import {\n\tDATA,\n\tisPhase2Message,\n\tisTerminalMessage,\n\ttype Message,\n\ttype Messages,\n\tRESOLVED,\n} from \"./messages.js\";\n\n/**\n * §1.3.7 — Inside a batch, DIRTY propagates immediately; DATA and RESOLVED are\n * deferred until the outermost `batch()` callback returns. Terminal signals\n * (COMPLETE, ERROR) are delivered after phase-2 messages in the same batch\n * (see canonical ordering in `messages.ts`).\n */\n\nconst MAX_DRAIN_ITERATIONS = 1000;\n\nlet batchDepth = 0;\nlet flushInProgress = false;\nconst pendingPhase2: Array<() => void> = [];\nconst pendingPhase3: Array<() => void> = [];\n\n/**\n * Returns whether the current call stack is inside a batch scope **or** while\n * deferred phase-2 work is draining.\n *\n * Matching Python's `is_batching()` semantics: nested emissions during drain\n * are deferred until the current drain pass completes, preventing ordering\n * bugs when callbacks trigger further DATA/RESOLVED.\n *\n * @returns `true` while inside `batch()` or while the drain loop is running.\n *\n * @example\n * ```ts\n * import { batch, isBatching } from \"@graphrefly/graphrefly-ts\";\n *\n * batch(() => {\n * console.log(isBatching()); // true\n * });\n * ```\n *\n * @category core\n */\nexport function isBatching(): boolean {\n\treturn batchDepth > 0 || flushInProgress;\n}\n\n/**\n * Runs `fn` inside a batch scope. Nested `batch()` calls share one deferral queue.\n * If `fn` throws (including from a nested `batch`), deferred DATA/RESOLVED for\n * that **outer** `batch` frame are discarded — phase-2 is not flushed after an\n * error. While the drain loop is running (`flushInProgress`), a nested `batch`\n * that throws must **not** clear the global queue (cross-language decision A4).\n *\n * During the drain loop, `isBatching()` remains true so nested `emitWithBatch`\n * calls still defer phase-2 messages. The drain loop runs until the queue is\n * quiescent (no pending work remains). Per-emission try/catch ensures one\n * throwing callback does not orphan remaining emissions; the first error is\n * re-thrown after all emissions drain. Callbacks that ran before the throw may\n * have applied phase-2 — partial graph state is intentional (decision C1).\n *\n * @param fn — Synchronous work that may call `emitWithBatch` / `node.down()`.\n * @returns `void` — all side-effects happen through `emitWithBatch` and the\n * phase-2 drain that runs after `fn` returns.\n *\n * @example\n * ```ts\n * import { core } from \"@graphrefly/graphrefly-ts\";\n *\n * core.batch(() => {\n * core.emitWithBatch(sink, [[core.DATA, 1]]);\n * });\n * ```\n *\n * @category core\n */\nexport function batch(fn: () => void): void {\n\tbatchDepth += 1;\n\tlet threw = false;\n\ttry {\n\t\tfn();\n\t} catch (e) {\n\t\tthrew = true;\n\t\tthrow e;\n\t} finally {\n\t\tbatchDepth -= 1;\n\t\tif (batchDepth === 0) {\n\t\t\tif (threw) {\n\t\t\t\t// Do not wipe the outer drain's queue (decision A4).\n\t\t\t\tif (!flushInProgress) {\n\t\t\t\t\tpendingPhase2.length = 0;\n\t\t\t\t\tpendingPhase3.length = 0;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdrainPending();\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction drainPending(): void {\n\tconst ownsFlush = !flushInProgress;\n\tif (ownsFlush) {\n\t\tflushInProgress = true;\n\t}\n\tlet firstError: unknown;\n\tlet hasError = false;\n\ttry {\n\t\tlet iterations = 0;\n\t\t// Drain phase-2 first, then phase-3. If phase-3 callbacks enqueue new\n\t\t// phase-2 work, the outer loop catches it and drains phase-2 again\n\t\t// before re-entering phase-3.\n\t\twhile (pendingPhase2.length > 0 || pendingPhase3.length > 0) {\n\t\t\t// Phase-2 (DATA/RESOLVED) — parent node values settle here.\n\t\t\twhile (pendingPhase2.length > 0) {\n\t\t\t\titerations += 1;\n\t\t\t\tif (iterations > MAX_DRAIN_ITERATIONS) {\n\t\t\t\t\tpendingPhase2.length = 0;\n\t\t\t\t\tpendingPhase3.length = 0;\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`batch drain exceeded ${MAX_DRAIN_ITERATIONS} iterations — likely a reactive cycle`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst ops = pendingPhase2.splice(0);\n\t\t\t\tfor (const run of ops) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\trun();\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (!hasError) {\n\t\t\t\t\t\t\tfirstError = e;\n\t\t\t\t\t\t\thasError = true;\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// Phase-3 — meta companion emissions that must follow parent settlement.\n\t\t\tif (pendingPhase3.length > 0) {\n\t\t\t\titerations += 1;\n\t\t\t\tif (iterations > MAX_DRAIN_ITERATIONS) {\n\t\t\t\t\tpendingPhase2.length = 0;\n\t\t\t\t\tpendingPhase3.length = 0;\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`batch drain exceeded ${MAX_DRAIN_ITERATIONS} iterations — likely a reactive cycle`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst ops = pendingPhase3.splice(0);\n\t\t\t\tfor (const run of ops) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\trun();\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (!hasError) {\n\t\t\t\t\t\t\tfirstError = e;\n\t\t\t\t\t\t\thasError = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} finally {\n\t\tif (ownsFlush) {\n\t\t\tflushInProgress = false;\n\t\t}\n\t}\n\tif (hasError) {\n\t\tthrow firstError;\n\t}\n}\n\n/**\n * Splits a message array into three groups by signal tier (see `messages.ts`):\n *\n * - **immediate** — tier 0–1: DIRTY, INVALIDATE, PAUSE, RESUME, TEARDOWN, unknown\n * - **deferred** — tier 2: DATA, RESOLVED (phase-2, deferred inside `batch()`)\n * - **terminal** — tier 3: COMPLETE, ERROR (delivered after phase-2)\n *\n * Order within each group is preserved.\n *\n * @param messages — One `down()` payload.\n * @returns Three groups in canonical delivery order.\n *\n * @example\n * ```ts\n * import { DATA, DIRTY, COMPLETE, partitionForBatch } from \"@graphrefly/graphrefly-ts\";\n *\n * partitionForBatch([[DIRTY], [DATA, 1], [COMPLETE]]);\n * // { immediate: [[DIRTY]], deferred: [[DATA, 1]], terminal: [[COMPLETE]] }\n * ```\n *\n * @category core\n */\nexport function partitionForBatch(messages: Messages): {\n\timmediate: Messages;\n\tdeferred: Messages;\n\tterminal: Messages;\n} {\n\tconst immediate: Message[] = [];\n\tconst deferred: Message[] = [];\n\tconst terminal: Message[] = [];\n\tfor (const m of messages) {\n\t\tif (isPhase2Message(m)) {\n\t\t\tdeferred.push(m);\n\t\t} else if (isTerminalMessage(m[0])) {\n\t\t\tterminal.push(m);\n\t\t} else {\n\t\t\timmediate.push(m);\n\t\t}\n\t}\n\treturn { immediate, deferred, terminal };\n}\n\n/**\n * Delivers messages through `emit`, applying batch semantics and canonical\n * tier-based ordering (see `messages.ts`):\n *\n * 1. **Immediate** (tier 0–1, 4): DIRTY, INVALIDATE, PAUSE, RESUME, TEARDOWN,\n * unknown — emitted synchronously.\n * 2. **Phase-2** (tier 2): DATA, RESOLVED — deferred while `isBatching()`.\n * 3. **Terminal** (tier 3): COMPLETE, ERROR — always delivered after phase-2.\n * When batching, terminal is queued after deferred phase-2 in the pending list.\n * When not batching, terminal is emitted after phase-2 synchronously.\n *\n * This ordering prevents the \"COMPLETE-before-DATA\" class of bugs: terminal\n * signals never make a node terminal before phase-2 values reach sinks,\n * regardless of how the source assembled the message array.\n *\n * @param emit — Sink callback. May be called up to three times per invocation\n * (immediate, deferred, terminal) when not batching.\n * @param messages — Full `[[Type, Data?], ...]` array for one emission.\n * @returns `void` — delivery is performed through `emit` callbacks, synchronously\n * or deferred into the active batch queue.\n *\n * @example\n * ```ts\n * import { core } from \"@graphrefly/graphrefly-ts\";\n *\n * core.emitWithBatch((msgs) => console.log(msgs), [[core.DIRTY], [core.DATA, 42]]);\n * ```\n *\n * @category core\n */\nexport function emitWithBatch(\n\temit: (messages: Messages) => void,\n\tmessages: Messages,\n\tphase: 2 | 3 = 2,\n): void {\n\tif (messages.length === 0) {\n\t\treturn;\n\t}\n\tconst queue = phase === 3 ? pendingPhase3 : pendingPhase2;\n\n\t// Fast path: single-message batches (most common in graph-internal propagation)\n\t// skip partitionForBatch allocation entirely.\n\tif (messages.length === 1) {\n\t\tconst t = messages[0][0];\n\t\tif (t === DATA || t === RESOLVED) {\n\t\t\tif (isBatching()) {\n\t\t\t\tqueue.push(() => emit(messages));\n\t\t\t} else {\n\t\t\t\temit(messages);\n\t\t\t}\n\t\t} else if (isTerminalMessage(t)) {\n\t\t\t// Terminal single message: defer when batching so any preceding\n\t\t\t// phase-2 in the queue flushes first.\n\t\t\tif (isBatching()) {\n\t\t\t\tqueue.push(() => emit(messages));\n\t\t\t} else {\n\t\t\t\temit(messages);\n\t\t\t}\n\t\t} else {\n\t\t\t// Immediate: emit synchronously.\n\t\t\temit(messages);\n\t\t}\n\t\treturn;\n\t}\n\t// Multi-message: three-way partition by tier.\n\tconst { immediate, deferred, terminal } = partitionForBatch(messages);\n\n\t// 1. Immediate signals (tier 0–1, 4) — emit synchronously now.\n\tif (immediate.length > 0) {\n\t\temit(immediate);\n\t}\n\n\t// 2. Deferred (tier 2) + Terminal (tier 3) — canonical order preserved.\n\tif (isBatching()) {\n\t\tif (deferred.length > 0) {\n\t\t\tqueue.push(() => emit(deferred));\n\t\t}\n\t\tif (terminal.length > 0) {\n\t\t\tqueue.push(() => emit(terminal));\n\t\t}\n\t} else {\n\t\tif (deferred.length > 0) {\n\t\t\temit(deferred);\n\t\t}\n\t\tif (terminal.length > 0) {\n\t\t\temit(terminal);\n\t\t}\n\t}\n}\n","/**\n * Centralised timestamp utilities.\n *\n * Convention: all graphrefly-ts timestamps use nanoseconds (`_ns` suffix).\n *\n * - {@link monotonicNs} — monotonic clock (ordering, durations, timeline events).\n * - {@link wallClockNs} — wall-clock (mutation attribution, cron emission).\n *\n * **Precision limits (JS platform):**\n *\n * - `monotonicNs`: effective ~microsecond precision. `performance.now()` returns\n * milliseconds with ~5µs resolution; the last 3 digits of the nanosecond value\n * are always zero. Python's `time.monotonic_ns()` gives true nanoseconds.\n *\n * - `wallClockNs`: ~256ns precision loss at current epoch. `Date.now() * 1e6`\n * produces values around 1.8×10¹⁸ which exceed IEEE 754's 2⁵³ safe integer\n * limit. Python's `time.time_ns()` (arbitrary-precision `int`) has no loss.\n * In practice this is irrelevant — JS is single-threaded, so sub-microsecond\n * timestamp collisions cannot occur.\n */\n\n/** Monotonic nanosecond timestamp via `performance.now()`. */\nexport function monotonicNs(): number {\n\treturn Math.trunc(performance.now() * 1_000_000);\n}\n\n/** Wall-clock nanosecond timestamp via `Date.now()`. */\nexport function wallClockNs(): number {\n\treturn Date.now() * 1_000_000;\n}\n","/**\n * Who is performing an operation (attribution + ABAC input).\n *\n * @see GRAPHREFLY-SPEC — roadmap Phase 1.5 (Actor & Guard).\n */\nexport type Actor = {\n\ttype: \"human\" | \"llm\" | \"wallet\" | \"system\" | string;\n\tid: string;\n} & Record<string, unknown>;\n\n/** Default actor when none is passed ({@link normalizeActor}). */\nexport const DEFAULT_ACTOR: Actor = { type: \"system\", id: \"\" };\n\n/**\n * Fills missing `type` / `id` on an actor and returns {@link DEFAULT_ACTOR} when input is undefined.\n *\n * @param actor - Optional partial actor from a transport hint.\n * @returns A normalized `Actor` safe to pass to guards and graph APIs.\n *\n * @example\n * ```ts\n * import { normalizeActor } from \"@graphrefly/graphrefly-ts\";\n *\n * normalizeActor({ type: \"human\", id: \"u1\" });\n * ```\n */\nexport function normalizeActor(actor?: Actor): Actor {\n\tif (actor == null) return DEFAULT_ACTOR;\n\tconst { type, id, ...rest } = actor;\n\treturn {\n\t\ttype: type ?? \"system\",\n\t\tid: id ?? \"\",\n\t\t...rest,\n\t} as Actor;\n}\n","import type { Actor } from \"./actor.js\";\n\n/**\n * Actions checked by {@link NodeGuard}. `write` covers both {@link Node.down} and\n * {@link Node.up} today; finer-grained strings may be added later (e.g. `\"write.data\"`).\n */\nexport type GuardAction = \"write\" | \"signal\" | \"observe\" | (string & {});\n\nexport type NodeGuard = (actor: Actor, action: GuardAction) => boolean;\n\nexport type GuardDeniedDetails = {\n\tactor: Actor;\n\taction: GuardAction;\n\t/** Registry or options name when known */\n\tnodeName?: string;\n};\n\n/**\n * Thrown when a {@link NodeGuard} denies an action for a given actor.\n *\n * Carries the rejected `actor`, `action`, and optional `nodeName` for diagnostic\n * messages and middleware error handling.\n *\n * @example\n * ```ts\n * import { GuardDenied, policy } from \"@graphrefly/graphrefly-ts\";\n *\n * const guard = policy((allow) => { allow(\"observe\"); });\n * try {\n * if (!guard({ type: \"llm\", id: \"agent-1\" }, \"write\")) {\n * throw new GuardDenied(\n * { actor: { type: \"llm\", id: \"agent-1\" }, action: \"write\", nodeName: \"userInput\" },\n * );\n * }\n * } catch (e) {\n * if (e instanceof GuardDenied) console.error(e.action, e.actor.type); // \"write\" \"llm\"\n * }\n * ```\n */\nexport class GuardDenied extends Error {\n\treadonly actor: Actor;\n\treadonly action: GuardAction;\n\treadonly nodeName?: string;\n\n\t/**\n\t * @param details - Actor, action, and optional node name for the denial.\n\t * @param message - Optional override for the default error message.\n\t */\n\tconstructor(details: GuardDeniedDetails, message?: string) {\n\t\tsuper(\n\t\t\tmessage ??\n\t\t\t\t`GuardDenied: action \"${String(details.action)}\" denied for actor type \"${String(details.actor.type)}\"`,\n\t\t);\n\t\tthis.name = \"GuardDenied\";\n\t\tthis.actor = details.actor;\n\t\tthis.action = details.action;\n\t\tthis.nodeName = details.nodeName;\n\t}\n\n\t/** Qualified registry path when known (roadmap diagnostics: same as {@link nodeName}). */\n\tget node(): string | undefined {\n\t\treturn this.nodeName;\n\t}\n}\n\ntype Where = (actor: Actor) => boolean;\n\ntype Rule = {\n\tkind: \"allow\" | \"deny\";\n\tactions: Set<GuardAction>;\n\twhere: Where;\n};\n\nfunction normalizeActions(action: GuardAction | readonly GuardAction[]): GuardAction[] {\n\tif (Array.isArray(action)) {\n\t\treturn [...action];\n\t}\n\treturn [action as GuardAction];\n}\n\nfunction matchesActions(set: Set<GuardAction>, action: GuardAction): boolean {\n\treturn set.has(action) || set.has(\"*\" as GuardAction);\n}\n\nexport type PolicyAllow = (\n\taction: GuardAction | readonly GuardAction[],\n\topts?: { where?: Where },\n) => void;\n\nexport type PolicyDeny = (\n\taction: GuardAction | readonly GuardAction[],\n\topts?: { where?: Where },\n) => void;\n\nexport type PolicyRuleData = {\n\teffect: \"allow\" | \"deny\";\n\taction: GuardAction | readonly GuardAction[];\n\tactorType?: string | readonly string[];\n\tactorId?: string | readonly string[];\n\tclaims?: Record<string, unknown>;\n};\n\n/**\n * Declarative guard builder. Precedence: any matching **deny** blocks even if an allow also matches.\n * If no rule matches, the guard returns `false` (deny-by-default). Aligned with graphrefly-py `policy()`.\n *\n * @param build - Callback that registers `allow(...)` / `deny(...)` rules in order.\n * @returns A `NodeGuard` for use as `node({ guard })`.\n *\n * @example\n * ```ts\n * const guard = policy((allow, deny) => {\n * allow(\"observe\");\n * deny(\"write\", { where: (a) => a.type === \"llm\" });\n * });\n * ```\n */\nexport function policy(build: (allow: PolicyAllow, deny: PolicyDeny) => void): NodeGuard {\n\tconst rules: Rule[] = [];\n\tconst allow: PolicyAllow = (action, opts) => {\n\t\trules.push({\n\t\t\tkind: \"allow\",\n\t\t\tactions: new Set(normalizeActions(action)),\n\t\t\twhere: opts?.where ?? (() => true),\n\t\t});\n\t};\n\tconst deny: PolicyDeny = (action, opts) => {\n\t\trules.push({\n\t\t\tkind: \"deny\",\n\t\t\tactions: new Set(normalizeActions(action)),\n\t\t\twhere: opts?.where ?? (() => true),\n\t\t});\n\t};\n\tbuild(allow, deny);\n\treturn (actor, action) => {\n\t\tlet denied = false;\n\t\tlet allowed = false;\n\t\tfor (const r of rules) {\n\t\t\tif (!matchesActions(r.actions, action)) continue;\n\t\t\tif (!r.where(actor)) continue;\n\t\t\tif (r.kind === \"deny\") {\n\t\t\t\tdenied = true;\n\t\t\t} else {\n\t\t\t\tallowed = true;\n\t\t\t}\n\t\t}\n\t\tif (denied) return false;\n\t\treturn allowed;\n\t};\n}\n\n/**\n * Rebuild a declarative guard from persisted policy data (snapshot-safe).\n *\n * Rules are deny-overrides, same semantics as {@link policy}.\n */\nexport function policyFromRules(rules: readonly PolicyRuleData[]): NodeGuard {\n\treturn policy((allow, deny) => {\n\t\tfor (const rule of rules) {\n\t\t\tconst actorTypes =\n\t\t\t\trule.actorType == null\n\t\t\t\t\t? null\n\t\t\t\t\t: new Set(Array.isArray(rule.actorType) ? rule.actorType : [rule.actorType]);\n\t\t\tconst actorIds =\n\t\t\t\trule.actorId == null\n\t\t\t\t\t? null\n\t\t\t\t\t: new Set(Array.isArray(rule.actorId) ? rule.actorId : [rule.actorId]);\n\t\t\tconst claimEntries = Object.entries(rule.claims ?? {});\n\t\t\tconst where: Where = (actor) => {\n\t\t\t\tif (actorTypes !== null && !actorTypes.has(String(actor.type))) return false;\n\t\t\t\tif (actorIds !== null && !actorIds.has(String(actor.id ?? \"\"))) return false;\n\t\t\t\tfor (const [key, value] of claimEntries) {\n\t\t\t\t\tif ((actor as Record<string, unknown>)[key] !== value) return false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t};\n\t\t\tif (rule.effect === \"deny\") {\n\t\t\t\tdeny(rule.action, { where });\n\t\t\t} else {\n\t\t\t\tallow(rule.action, { where });\n\t\t\t}\n\t\t}\n\t});\n}\n\nconst STANDARD_WRITE_TYPES = [\"human\", \"llm\", \"wallet\", \"system\"] as const;\n\n/**\n * Derives a best-effort `meta.access` hint string by probing `guard` with the\n * standard actor types `human`, `llm`, `wallet`, `system` for the `\"write\"` action\n * (roadmap 1.5). Aligned with graphrefly-py `access_hint_for_guard`.\n *\n * @param guard - Guard function to probe (typically from {@link policy}).\n * @returns `\"restricted\"` when no standard type is allowed; `\"both\"` when both\n * `human` and `llm` are allowed (plus optionally `system`); the single allowed\n * type name when only one passes; or a `\"+\"` joined list otherwise.\n *\n * @example\n * ```ts\n * import { policy, accessHintForGuard } from \"@graphrefly/graphrefly-ts\";\n *\n * const guardBoth = policy((allow) => { allow(\"write\"); });\n * accessHintForGuard(guardBoth); // \"both\"\n *\n * const guardHuman = policy((allow) => {\n * allow(\"write\", { where: (a) => a.type === \"human\" });\n * });\n * accessHintForGuard(guardHuman); // \"human\"\n * ```\n */\nexport function accessHintForGuard(guard: NodeGuard): string {\n\tconst allowed = STANDARD_WRITE_TYPES.filter((t) => guard({ type: t, id: \"\" }, \"write\"));\n\tif (allowed.length === 0) return \"restricted\";\n\tif (\n\t\tallowed.includes(\"human\") &&\n\t\tallowed.includes(\"llm\") &&\n\t\tallowed.every((t) => t === \"human\" || t === \"llm\" || t === \"system\")\n\t) {\n\t\treturn \"both\";\n\t}\n\tif (allowed.length === 1) return allowed[0];\n\treturn allowed.join(\"+\");\n}\n","/**\n * Node versioning — GRAPHREFLY-SPEC §7.\n *\n * Progressive, optional versioning for node identity and change tracking.\n *\n * - **V0**: `id` + `version` — identity & change detection (~16 bytes overhead)\n * - **V1**: + `cid` + `prev` — content addressing & linked history (~60 bytes overhead)\n *\n * **Lifecycle notes:**\n * - Version advances only on DATA (not RESOLVED, INVALIDATE, or TEARDOWN).\n * - `resetOnTeardown` clears the cached value but does NOT reset versioning state.\n * After teardown, `v.cid` still reflects the last DATA value, not the cleared cache.\n * The invariant `hash(node.get()) === v.cid` only holds in `settled`/`resolved` status.\n * - Resubscribable nodes preserve versioning across subscription lifetimes (monotonic counter).\n */\n\nimport { createHash, randomUUID } from \"node:crypto\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** V0: identity + monotonic version counter. */\nexport type V0 = {\n\treadonly id: string;\n\tversion: number;\n};\n\n/** V1: V0 + content-addressed identifier + previous cid link. */\nexport type V1 = V0 & {\n\tcid: string;\n\tprev: string | null;\n};\n\n/** Union of all versioning info shapes. */\nexport type NodeVersionInfo = V0 | V1;\n\n/** Supported versioning levels (extensible to 2, 3 later). */\nexport type VersioningLevel = 0 | 1;\n\n/** Function that hashes a value to a hex string (for V1 cid). */\nexport type HashFn = (value: unknown) => string;\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface VersioningOptions {\n\t/** Override auto-generated id. */\n\tid?: string;\n\t/** Custom hash function for V1 cid (default: SHA-256 truncated to 16 hex chars). */\n\thash?: HashFn;\n}\n\n// ---------------------------------------------------------------------------\n// Default hash\n// ---------------------------------------------------------------------------\n\n/**\n * Canonicalize a value for deterministic cross-language hashing.\n *\n * - Integer-valued floats normalize to integer strings (`1.0` → `1`).\n * - `NaN`, `Infinity`, `-Infinity` are rejected (no JSON equivalent).\n * - `undefined` normalizes to `null`.\n * - Object keys are sorted lexicographically.\n *\n * This ensures TS `JSON.stringify` and Python `json.dumps(sort_keys=True)`\n * produce identical output for the same logical value.\n */\nexport function canonicalizeForHash(value: unknown): unknown {\n\tif (value === undefined) return null;\n\tif (typeof value === \"number\") {\n\t\tif (!Number.isFinite(value)) {\n\t\t\tthrow new TypeError(`Cannot hash non-finite number: ${value}`);\n\t\t}\n\t\tif (Number.isInteger(value) && !Number.isSafeInteger(value)) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Cannot hash integer outside safe range (|n| > 2^53-1): ${value}. ` +\n\t\t\t\t\t\"Cross-language cid parity is not guaranteed for unsafe integers.\",\n\t\t\t);\n\t\t}\n\t\treturn value;\n\t}\n\tif (typeof value === \"string\" || typeof value === \"boolean\" || value === null) {\n\t\treturn value;\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn value.map(canonicalizeForHash);\n\t}\n\tif (typeof value === \"object\" && value !== null) {\n\t\tconst sorted: Record<string, unknown> = {};\n\t\tfor (const k of Object.keys(value as Record<string, unknown>).sort()) {\n\t\t\tsorted[k] = canonicalizeForHash((value as Record<string, unknown>)[k]);\n\t\t}\n\t\treturn sorted;\n\t}\n\t// Fallback: coerce to null (bigint, symbol, function)\n\treturn null;\n}\n\n/**\n * Default content hash: SHA-256 of deterministic JSON, truncated to 16 hex chars (~64-bit).\n * Uses {@link canonicalizeForHash} for cross-language parity with Python `default_hash`.\n */\nexport function defaultHash(value: unknown): string {\n\tconst canonical = canonicalizeForHash(value ?? null);\n\tconst json = JSON.stringify(canonical);\n\treturn createHash(\"sha256\").update(json).digest(\"hex\").slice(0, 16);\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create initial versioning state for a node.\n *\n * @param level - 0 for V0, 1 for V1.\n * @param initialValue - The node's initial cached value (used for V1 cid).\n * @param opts - Optional overrides (id, hash).\n */\nexport function createVersioning(\n\tlevel: VersioningLevel,\n\tinitialValue: unknown,\n\topts?: VersioningOptions,\n): NodeVersionInfo {\n\tconst id = opts?.id ?? randomUUID();\n\tif (level === 0) {\n\t\treturn { id, version: 0 } satisfies V0;\n\t}\n\tconst hash = opts?.hash ?? defaultHash;\n\tconst cid = hash(initialValue);\n\treturn { id, version: 0, cid, prev: null } satisfies V1;\n}\n\n// ---------------------------------------------------------------------------\n// Advance\n// ---------------------------------------------------------------------------\n\n/**\n * Advance versioning state after a DATA emission (value changed).\n *\n * Mutates `info` in place for performance (called on every DATA).\n * Only call when the cached value has actually changed (not on RESOLVED).\n *\n * @param info - The node's current versioning state.\n * @param newValue - The new cached value.\n * @param hashFn - Hash function (only used for V1).\n */\nexport function advanceVersion(info: NodeVersionInfo, newValue: unknown, hashFn: HashFn): void {\n\tinfo.version += 1;\n\tif (\"cid\" in info) {\n\t\t(info as V1).prev = (info as V1).cid;\n\t\t(info as V1).cid = hashFn(newValue);\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Guards\n// ---------------------------------------------------------------------------\n\n/** Type guard: is this V1 versioning info? */\nexport function isV1(info: NodeVersionInfo): info is V1 {\n\treturn \"cid\" in info;\n}\n","import type { Actor } from \"./actor.js\";\nimport { normalizeActor } from \"./actor.js\";\nimport { emitWithBatch } from \"./batch.js\";\nimport { wallClockNs } from \"./clock.js\";\nimport type { GuardAction, NodeGuard } from \"./guard.js\";\nimport { GuardDenied } from \"./guard.js\";\nimport {\n\tCOMPLETE,\n\tDATA,\n\tDIRTY,\n\tERROR,\n\tINVALIDATE,\n\ttype Message,\n\ttype Messages,\n\tPAUSE,\n\tpropagatesToMeta,\n\tRESOLVED,\n\tRESUME,\n\tTEARDOWN,\n} from \"./messages.js\";\nimport type { HashFn, NodeVersionInfo, VersioningLevel } from \"./versioning.js\";\nimport { advanceVersion, createVersioning, defaultHash } from \"./versioning.js\";\n\n/** Lifecycle status of a node. */\nexport type NodeStatus =\n\t| \"disconnected\"\n\t| \"dirty\"\n\t| \"settled\"\n\t| \"resolved\"\n\t| \"completed\"\n\t| \"errored\";\n\n/** Callback that receives downstream message batches. */\nexport type NodeSink = (messages: Messages) => void;\n\n/**\n * Compute function passed to `node()`.\n *\n * @returns A value to emit, `undefined` to skip emission, or a cleanup\n * function invoked before the next run or on teardown.\n */\nexport type NodeFn<T = unknown> = (\n\tdeps: readonly unknown[],\n\tactions: NodeActions,\n) => T | undefined | (() => void);\n\n/** Imperative actions available inside a {@link NodeFn}. */\nexport interface NodeActions {\n\t/** Emit raw messages downstream. */\n\tdown(messages: Messages): void;\n\t/** Emit a single value (auto-wraps in DIRTY/DATA or DIRTY/RESOLVED). */\n\temit(value: unknown): void;\n\t/** Send messages upstream toward sources. */\n\tup(messages: Messages): void;\n}\n\n/**\n * Callback for intercepting messages before the default dispatch.\n *\n * Called for every message from every dep. Return `true` to consume the\n * message (skip default handling), or `false` to let default dispatch run.\n *\n * @param msg — The message tuple `[Type, Data?]`.\n * @param depIndex — Which dep sent it (index into the deps array).\n * @param actions — `{ down(), emit(), up() }` — same as `NodeFn` receives.\n */\nexport type OnMessageHandler = (msg: Message, depIndex: number, actions: NodeActions) => boolean;\n\n/**\n * Internal inspector hook (opt-in): emits dependency message and run events\n * for graph-level observability features (`observe(..., { causal|derived })`).\n */\nexport type NodeInspectorHookEvent =\n\t| { kind: \"dep_message\"; depIndex: number; message: Message }\n\t| { kind: \"run\"; depValues: readonly unknown[] };\n\nexport type NodeInspectorHook = (event: NodeInspectorHookEvent) => void;\n\n/** Explicit describe `type` for {@link Graph.describe} / {@link describeNode} (GRAPHREFLY-SPEC Appendix B). */\nexport type NodeDescribeKind = \"state\" | \"derived\" | \"producer\" | \"operator\" | \"effect\";\n\n/** Options for {@link node}. */\nexport interface NodeOptions {\n\tname?: string;\n\t/**\n\t * Overrides inferred `type` in describe output. Sugar constructors set this;\n\t * omit to infer from deps / fn / manual emit usage.\n\t */\n\tdescribeKind?: NodeDescribeKind;\n\t/** Equality check for RESOLVED detection. Defaults to `Object.is`. */\n\tequals?: (a: unknown, b: unknown) => boolean;\n\tinitial?: unknown;\n\t/**\n\t * Each key becomes an independently subscribable companion node.\n\t * Meta nodes outlive the parent's subscription lifecycle: when all sinks\n\t * unsubscribe the parent disconnects upstream but meta nodes stay alive.\n\t * Send `[[TEARDOWN]]` to the parent to release meta node resources.\n\t */\n\tmeta?: Record<string, unknown>;\n\t/** Allow fresh subscriptions after COMPLETE/ERROR. */\n\tresubscribable?: boolean;\n\t/**\n\t * Invoked when a new {@link Node.subscribe} clears a terminal state on a\n\t * resubscribable node — reset operator-local counters/accumulators here.\n\t */\n\tonResubscribe?: () => void;\n\t/** Clear cached value on TEARDOWN. */\n\tresetOnTeardown?: boolean;\n\t/**\n\t * When `true` (default), auto-emit `[[COMPLETE]]` when all deps complete\n\t * (spec §1.3.5). Set `false` for derived/operator nodes that should not\n\t * auto-complete.\n\t */\n\tcompleteWhenDepsComplete?: boolean;\n\t/**\n\t * Intercept messages before the default dispatch (spec §2.6).\n\t *\n\t * Return `true` to consume the message (skip default handling),\n\t * or `false` to let the default dispatch run.\n\t */\n\tonMessage?: OnMessageHandler;\n\t/**\n\t * ABAC: `(actor, action) => boolean`. `write` applies to both {@link Node.down} and {@link Node.up}.\n\t * Companion {@link NodeOptions.meta | meta} nodes inherit this guard from the primary.\n\t */\n\tguard?: NodeGuard;\n\t/**\n\t * Opt-in versioning level (GRAPHREFLY-SPEC §7).\n\t * - `0` (V0): `id` + `version` — identity & change detection.\n\t * - `1` (V1): + `cid` + `prev` — content addressing & linked history.\n\t */\n\tversioning?: VersioningLevel;\n\t/** Override auto-generated versioning id. */\n\tversioningId?: string;\n\t/** Custom hash function for V1 cid computation. */\n\tversioningHash?: HashFn;\n}\n\n/**\n * Options for {@link Node.down} / {@link Node.up} (actor context, graph delivery mode, internal bypass).\n */\nexport type NodeTransportOptions = {\n\tactor?: Actor;\n\t/**\n\t * When `true`, skips guard checks (reactive internals, graph lifecycle TEARDOWN, etc.).\n\t * Not for untrusted call sites.\n\t */\n\tinternal?: boolean;\n\t/**\n\t * `signal` for {@link Graph.signal} deliveries; default `write` for {@link Graph.set} and direct `down`.\n\t */\n\tdelivery?: \"write\" | \"signal\";\n};\n\n/**\n * Optional hints passed to {@link Node.subscribe} to enable per-sink\n * optimizations.\n */\nexport interface SubscribeHints {\n\t/**\n\t * Subscriber has exactly one dep with `fn` — the source may skip DIRTY\n\t * dispatch when this is the sole subscriber. The subscriber synthesizes\n\t * dirty state locally via `onDepSettled`.\n\t */\n\tsingleDep?: boolean;\n\t/**\n\t * Actor to check against the node's `observe` guard.\n\t * When set, `subscribe()` throws {@link GuardDenied} if the actor is not\n\t * permitted to observe this node. Aligned with graphrefly-py `subscribe(actor=)`.\n\t */\n\tactor?: Actor;\n}\n\n/** A reactive node in the GraphReFly protocol. */\nexport interface Node<T = unknown> {\n\treadonly name?: string;\n\treadonly status: NodeStatus;\n\treadonly meta: Record<string, Node>;\n\t/** Returns the current cached value. */\n\tget(): T | undefined;\n\t/** Push messages downstream. */\n\tdown(messages: Messages, options?: NodeTransportOptions): void;\n\t/**\n\t * Registers a sink to receive downstream messages.\n\t *\n\t * @param sink - Callback receiving message batches.\n\t * @param hints - Optional optimization hints (e.g. `{ singleDep: true }`).\n\t * @returns An unsubscribe function (idempotent).\n\t */\n\tsubscribe(sink: NodeSink, hints?: SubscribeHints): () => void;\n\t/** Send messages upstream (present on nodes with deps). */\n\tup?: (messages: Messages, options?: NodeTransportOptions) => void;\n\t/** Disconnect from upstream deps (present on nodes with deps). */\n\tunsubscribe?: () => void;\n\t/** Last successful guarded `down` / `up` (not set for `internal` deliveries). */\n\treadonly lastMutation?: Readonly<{ actor: Actor; timestamp_ns: number }>;\n\t/** Whether {@link NodeTransportOptions.actor | actor} may {@link Graph.observe | observe} this node. */\n\tallowsObserve(actor: Actor): boolean;\n\t/** Whether a {@link NodeOptions.guard | guard} is installed. */\n\thasGuard(): boolean;\n\t/** Versioning info (GRAPHREFLY-SPEC §7). `undefined` when versioning is not enabled. */\n\treadonly v: Readonly<NodeVersionInfo> | undefined;\n}\n\n// --- Bitmask helpers: integer for <=31 deps, Uint32Array for >31 ---\n\ninterface BitSet {\n\tset(index: number): void;\n\tclear(index: number): void;\n\thas(index: number): boolean;\n\t/**\n\t * True when all bits in `other` are also set in `this`.\n\t * IMPORTANT: `other` must be the same concrete type (both IntBitSet or both\n\t * ArrayBitSet). Cross-type calls will crash. Within `node()`, all masks for\n\t * a given node share the same `createBitSet(deps.length)` factory, so this\n\t * is always satisfied.\n\t */\n\tcovers(other: BitSet): boolean;\n\t/** True when at least one bit is set. */\n\tany(): boolean;\n\treset(): void;\n}\n\nfunction createIntBitSet(): BitSet {\n\tlet bits = 0;\n\treturn {\n\t\tset(i: number) {\n\t\t\tbits |= 1 << i;\n\t\t},\n\t\tclear(i: number) {\n\t\t\tbits &= ~(1 << i);\n\t\t},\n\t\thas(i: number) {\n\t\t\treturn (bits & (1 << i)) !== 0;\n\t\t},\n\t\tcovers(other: BitSet) {\n\t\t\treturn (\n\t\t\t\t(bits & (other as unknown as { _bits(): number })._bits()) ===\n\t\t\t\t(other as unknown as { _bits(): number })._bits()\n\t\t\t);\n\t\t},\n\t\tany() {\n\t\t\treturn bits !== 0;\n\t\t},\n\t\treset() {\n\t\t\tbits = 0;\n\t\t},\n\t\t_bits() {\n\t\t\treturn bits;\n\t\t},\n\t} as BitSet & { _bits(): number };\n}\n\nfunction createArrayBitSet(size: number): BitSet {\n\tconst words = new Uint32Array(Math.ceil(size / 32));\n\treturn {\n\t\tset(i: number) {\n\t\t\twords[i >>> 5] |= 1 << (i & 31);\n\t\t},\n\t\tclear(i: number) {\n\t\t\twords[i >>> 5] &= ~(1 << (i & 31));\n\t\t},\n\t\thas(i: number) {\n\t\t\treturn (words[i >>> 5] & (1 << (i & 31))) !== 0;\n\t\t},\n\t\tcovers(other: BitSet) {\n\t\t\tconst ow = (other as unknown as { _words: Uint32Array })._words;\n\t\t\tfor (let w = 0; w < words.length; w++) {\n\t\t\t\tif ((words[w] & ow[w]) >>> 0 !== ow[w]) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\tany() {\n\t\t\tfor (let w = 0; w < words.length; w++) {\n\t\t\t\tif (words[w] !== 0) return true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\treset() {\n\t\t\twords.fill(0);\n\t\t},\n\t\t_words: words,\n\t} as unknown as BitSet;\n}\n\nfunction createBitSet(size: number): BitSet {\n\treturn size <= 31 ? createIntBitSet() : createArrayBitSet(size);\n}\n\nconst isNodeArray = (value: unknown): value is readonly Node[] => Array.isArray(value);\n\nconst isNodeOptions = (value: unknown): value is NodeOptions =>\n\ttypeof value === \"object\" && value != null && !Array.isArray(value);\n\nconst isCleanupFn = (value: unknown): value is () => void => typeof value === \"function\";\n\nconst statusAfterMessage = (status: NodeStatus, msg: Message): NodeStatus => {\n\tconst t = msg[0];\n\tif (t === DIRTY) return \"dirty\";\n\tif (t === DATA) return \"settled\";\n\tif (t === RESOLVED) return \"resolved\";\n\tif (t === COMPLETE) return \"completed\";\n\tif (t === ERROR) return \"errored\";\n\tif (t === INVALIDATE) return \"dirty\";\n\tif (t === TEARDOWN) return \"disconnected\";\n\treturn status;\n};\n\n// --- NodeImpl: class-based for V8 hidden class optimization and prototype method sharing ---\n\n/**\n * Class-based implementation of the {@link Node} interface.\n *\n * All internal state lives on instance fields (`_` prefix, private by convention)\n * so that introspection (e.g. {@link describeNode}) can read them directly via\n * `instanceof NodeImpl` — no side-channel registry needed.\n *\n * Follows callbag-recharge's `ProducerImpl` pattern: V8 hidden class stability,\n * prototype method sharing, selective binding for commonly detached methods.\n */\nexport class NodeImpl<T = unknown> implements Node<T> {\n\t// --- Configuration (set once, never reassigned) ---\n\tprivate readonly _optsName: string | undefined;\n\tprivate _registryName: string | undefined;\n\t/** @internal — read by {@link describeNode} before inference. */\n\treadonly _describeKind: NodeDescribeKind | undefined;\n\treadonly meta: Record<string, Node>;\n\t_deps: readonly Node[];\n\t_fn: NodeFn<T> | undefined;\n\t_opts: NodeOptions;\n\t_equals: (a: unknown, b: unknown) => boolean;\n\t_onMessage: OnMessageHandler | undefined;\n\t/** @internal — read by {@link describeNode} for `accessHintForGuard`. */\n\treadonly _guard: NodeGuard | undefined;\n\tprivate _lastMutation: { actor: Actor; timestamp_ns: number } | undefined;\n\t_hasDeps: boolean;\n\t_autoComplete: boolean;\n\t_isSingleDep: boolean;\n\n\t// --- Mutable state ---\n\t_cached: T | undefined;\n\t_status: NodeStatus;\n\t_terminal = false;\n\t_connected = false;\n\t_producerStarted = false;\n\t_connecting = false;\n\t_manualEmitUsed = false;\n\t_sinkCount = 0;\n\t_singleDepSinkCount = 0;\n\n\t// --- Object/collection state ---\n\t_depDirtyMask: BitSet;\n\t_depSettledMask: BitSet;\n\t_depCompleteMask: BitSet;\n\t_allDepsCompleteMask: BitSet;\n\t_lastDepValues: readonly unknown[] | undefined;\n\t_cleanup: (() => void) | undefined;\n\t_sinks: NodeSink | Set<NodeSink> | null = null;\n\t_singleDepSinks = new WeakSet<NodeSink>();\n\t_upstreamUnsubs: Array<() => void> = [];\n\t_actions: NodeActions;\n\t_boundEmitToSinks: (messages: Messages) => void;\n\tprivate _inspectorHook: NodeInspectorHook | undefined;\n\tprivate _versioning: NodeVersionInfo | undefined;\n\tprivate _hashFn: HashFn;\n\n\tconstructor(deps: readonly Node[], fn: NodeFn<T> | undefined, opts: NodeOptions) {\n\t\tthis._deps = deps;\n\t\tthis._fn = fn;\n\t\tthis._opts = opts;\n\t\tthis._optsName = opts.name;\n\t\tthis._describeKind = opts.describeKind;\n\t\tthis._equals = opts.equals ?? Object.is;\n\t\tthis._onMessage = opts.onMessage;\n\t\tthis._guard = opts.guard;\n\t\tthis._hasDeps = deps.length > 0;\n\t\tthis._autoComplete = opts.completeWhenDepsComplete ?? true;\n\t\tthis._isSingleDep = deps.length === 1 && fn != null;\n\n\t\tthis._cached = opts.initial as T | undefined;\n\t\tthis._status = this._hasDeps ? \"disconnected\" : \"settled\";\n\n\t\t// Versioning (GRAPHREFLY-SPEC §7)\n\t\tthis._hashFn = opts.versioningHash ?? defaultHash;\n\t\tthis._versioning =\n\t\t\topts.versioning != null\n\t\t\t\t? createVersioning(opts.versioning, this._cached, {\n\t\t\t\t\t\tid: opts.versioningId,\n\t\t\t\t\t\thash: this._hashFn,\n\t\t\t\t\t})\n\t\t\t\t: undefined;\n\n\t\tthis._depDirtyMask = createBitSet(deps.length);\n\t\tthis._depSettledMask = createBitSet(deps.length);\n\t\tthis._depCompleteMask = createBitSet(deps.length);\n\t\tthis._allDepsCompleteMask = createBitSet(deps.length);\n\t\tfor (let i = 0; i < deps.length; i++) this._allDepsCompleteMask.set(i);\n\n\t\t// Build companion meta nodes\n\t\tconst meta: Record<string, Node> = {};\n\t\tfor (const [k, v] of Object.entries(opts.meta ?? {})) {\n\t\t\tmeta[k] = node({\n\t\t\t\tinitial: v,\n\t\t\t\tname: `${opts.name ?? \"node\"}:meta:${k}`,\n\t\t\t\tdescribeKind: \"state\",\n\t\t\t\t...(opts.guard != null ? { guard: opts.guard } : {}),\n\t\t\t});\n\t\t}\n\t\tObject.freeze(meta);\n\t\tthis.meta = meta;\n\n\t\t// Actions object: created once, references `this` methods.\n\t\t// Captures `this` via arrow-in-object so manualEmitUsed is set on the instance.\n\t\tconst self = this;\n\t\tthis._actions = {\n\t\t\tdown(messages): void {\n\t\t\t\tself._manualEmitUsed = true;\n\t\t\t\tself._downInternal(messages);\n\t\t\t},\n\t\t\temit(value): void {\n\t\t\t\tself._manualEmitUsed = true;\n\t\t\t\tself._emitAutoValue(value);\n\t\t\t},\n\t\t\tup(messages): void {\n\t\t\t\tself._upInternal(messages);\n\t\t\t},\n\t\t};\n\n\t\t// Bind commonly detached protocol methods\n\t\tthis.down = this.down.bind(this);\n\t\tthis.up = this.up.bind(this);\n\t\tthis._boundEmitToSinks = this._emitToSinks.bind(this);\n\t}\n\n\tget name(): string | undefined {\n\t\treturn this._registryName ?? this._optsName;\n\t}\n\n\t/**\n\t * When a node is registered with {@link Graph.add} without an options `name`,\n\t * the graph assigns the registry local name for introspection (parity with graphrefly-py).\n\t */\n\t_assignRegistryName(localName: string): void {\n\t\tif (this._optsName !== undefined || this._registryName !== undefined) return;\n\t\tthis._registryName = localName;\n\t}\n\n\t/**\n\t * @internal Attach/remove inspector hook for graph-level observability.\n\t * Returns a disposer that restores the previous hook.\n\t */\n\t_setInspectorHook(hook?: NodeInspectorHook): () => void {\n\t\tconst prev = this._inspectorHook;\n\t\tthis._inspectorHook = hook;\n\t\treturn () => {\n\t\t\tif (this._inspectorHook === hook) {\n\t\t\t\tthis._inspectorHook = prev;\n\t\t\t}\n\t\t};\n\t}\n\n\t// --- Public interface (Node<T>) ---\n\n\tget status(): NodeStatus {\n\t\treturn this._status;\n\t}\n\n\tget lastMutation(): Readonly<{ actor: Actor; timestamp_ns: number }> | undefined {\n\t\treturn this._lastMutation;\n\t}\n\n\tget v(): Readonly<NodeVersionInfo> | undefined {\n\t\treturn this._versioning;\n\t}\n\n\t/**\n\t * Retroactively apply versioning to a node that was created without it.\n\t * No-op if versioning is already enabled.\n\t *\n\t * Version starts at 0 regardless of prior DATA emissions — it tracks\n\t * changes from the moment versioning is enabled, not historical ones.\n\t *\n\t * @internal — used by {@link Graph.setVersioning}.\n\t */\n\t_applyVersioning(level: VersioningLevel, opts?: { id?: string; hash?: HashFn }): void {\n\t\tif (this._versioning != null) return;\n\t\tthis._hashFn = opts?.hash ?? this._hashFn;\n\t\tthis._versioning = createVersioning(level, this._cached, {\n\t\t\tid: opts?.id,\n\t\t\thash: this._hashFn,\n\t\t});\n\t}\n\n\thasGuard(): boolean {\n\t\treturn this._guard != null;\n\t}\n\n\tallowsObserve(actor: Actor): boolean {\n\t\tif (this._guard == null) return true;\n\t\treturn this._guard(normalizeActor(actor), \"observe\");\n\t}\n\n\tget(): T | undefined {\n\t\treturn this._cached;\n\t}\n\n\tdown(messages: Messages, options?: NodeTransportOptions): void {\n\t\tif (messages.length === 0) return;\n\t\tif (!options?.internal && this._guard != null) {\n\t\t\tconst actor = normalizeActor(options?.actor);\n\t\t\tconst delivery = options?.delivery ?? \"write\";\n\t\t\tconst action: GuardAction = delivery === \"signal\" ? \"signal\" : \"write\";\n\t\t\tif (!this._guard(actor, action)) {\n\t\t\t\tthrow new GuardDenied({ actor, action, nodeName: this.name });\n\t\t\t}\n\t\t\tthis._lastMutation = { actor, timestamp_ns: wallClockNs() };\n\t\t}\n\t\tthis._downInternal(messages);\n\t}\n\n\tprivate _downInternal(messages: Messages): void {\n\t\tif (messages.length === 0) return;\n\t\tlet lifecycleMessages = messages;\n\t\tlet sinkMessages = messages;\n\t\tif (this._terminal && !this._opts.resubscribable) {\n\t\t\tconst terminalPassthrough = messages.filter((m) => m[0] === TEARDOWN || m[0] === INVALIDATE);\n\t\t\tif (terminalPassthrough.length === 0) return;\n\t\t\tlifecycleMessages = terminalPassthrough;\n\t\t\tsinkMessages = terminalPassthrough;\n\t\t}\n\t\tthis._handleLocalLifecycle(lifecycleMessages);\n\t\t// Single-dep optimization: skip DIRTY to sinks when sole subscriber is single-dep\n\t\t// AND the batch contains a phase-2 message (DATA/RESOLVED). Standalone DIRTY\n\t\t// (without follow-up) must pass through so downstream is notified.\n\t\tif (this._canSkipDirty()) {\n\t\t\t// Inline check: does the batch contain DATA or RESOLVED?\n\t\t\tlet hasPhase2 = false;\n\t\t\tfor (let i = 0; i < sinkMessages.length; i++) {\n\t\t\t\tconst t = sinkMessages[i][0];\n\t\t\t\tif (t === DATA || t === RESOLVED) {\n\t\t\t\t\thasPhase2 = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (hasPhase2) {\n\t\t\t\t// Inline filter: remove DIRTY messages\n\t\t\t\tconst filtered: Message[] = [];\n\t\t\t\tfor (let i = 0; i < sinkMessages.length; i++) {\n\t\t\t\t\tif (sinkMessages[i][0] !== DIRTY) filtered.push(sinkMessages[i]);\n\t\t\t\t}\n\t\t\t\tif (filtered.length > 0) {\n\t\t\t\t\temitWithBatch(this._boundEmitToSinks, filtered);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\temitWithBatch(this._boundEmitToSinks, sinkMessages);\n\t}\n\n\tsubscribe(sink: NodeSink, hints?: SubscribeHints): () => void {\n\t\tif (hints?.actor != null && this._guard != null) {\n\t\t\tconst actor = normalizeActor(hints.actor);\n\t\t\tif (!this._guard(actor, \"observe\")) {\n\t\t\t\tthrow new GuardDenied({ actor, action: \"observe\", nodeName: this.name });\n\t\t\t}\n\t\t}\n\n\t\tif (this._terminal && this._opts.resubscribable) {\n\t\t\tthis._terminal = false;\n\t\t\tthis._status = this._hasDeps ? \"disconnected\" : \"settled\";\n\t\t\tthis._opts.onResubscribe?.();\n\t\t}\n\n\t\tthis._sinkCount += 1;\n\t\tif (hints?.singleDep) {\n\t\t\tthis._singleDepSinkCount += 1;\n\t\t\tthis._singleDepSinks.add(sink);\n\t\t}\n\n\t\tif (this._sinks == null) {\n\t\t\tthis._sinks = sink;\n\t\t} else if (typeof this._sinks === \"function\") {\n\t\t\tthis._sinks = new Set<NodeSink>([this._sinks, sink]);\n\t\t} else {\n\t\t\tthis._sinks.add(sink);\n\t\t}\n\n\t\tif (this._hasDeps) {\n\t\t\tthis._connectUpstream();\n\t\t} else if (this._fn) {\n\t\t\tthis._startProducer();\n\t\t}\n\n\t\tlet removed = false;\n\t\treturn () => {\n\t\t\tif (removed) return;\n\t\t\tremoved = true;\n\t\t\tthis._sinkCount -= 1;\n\t\t\tif (this._singleDepSinks.has(sink)) {\n\t\t\t\tthis._singleDepSinkCount -= 1;\n\t\t\t\tthis._singleDepSinks.delete(sink);\n\t\t\t}\n\t\t\tif (this._sinks == null) return;\n\t\t\tif (typeof this._sinks === \"function\") {\n\t\t\t\tif (this._sinks === sink) this._sinks = null;\n\t\t\t} else {\n\t\t\t\tthis._sinks.delete(sink);\n\t\t\t\tif (this._sinks.size === 1) {\n\t\t\t\t\tconst [only] = this._sinks;\n\t\t\t\t\tthis._sinks = only;\n\t\t\t\t} else if (this._sinks.size === 0) {\n\t\t\t\t\tthis._sinks = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this._sinks == null) {\n\t\t\t\tthis._disconnectUpstream();\n\t\t\t\tthis._stopProducer();\n\t\t\t}\n\t\t};\n\t}\n\n\tup(messages: Messages, options?: NodeTransportOptions): void {\n\t\tif (!this._hasDeps) return;\n\t\tif (!options?.internal && this._guard != null) {\n\t\t\tconst actor = normalizeActor(options?.actor);\n\t\t\tif (!this._guard(actor, \"write\")) {\n\t\t\t\tthrow new GuardDenied({ actor, action: \"write\", nodeName: this.name });\n\t\t\t}\n\t\t\tthis._lastMutation = { actor, timestamp_ns: wallClockNs() };\n\t\t}\n\t\tfor (const dep of this._deps) {\n\t\t\tif (options === undefined) {\n\t\t\t\tdep.up?.(messages);\n\t\t\t} else {\n\t\t\t\tdep.up?.(messages, options);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _upInternal(messages: Messages): void {\n\t\tif (!this._hasDeps) return;\n\t\tfor (const dep of this._deps) {\n\t\t\tdep.up?.(messages, { internal: true });\n\t\t}\n\t}\n\n\tunsubscribe(): void {\n\t\tif (!this._hasDeps) return;\n\t\tthis._disconnectUpstream();\n\t}\n\n\t// --- Private methods (prototype, _ prefix) ---\n\n\t_emitToSinks(messages: Messages): void {\n\t\tif (this._sinks == null) return;\n\t\tif (typeof this._sinks === \"function\") {\n\t\t\tthis._sinks(messages);\n\t\t\treturn;\n\t\t}\n\t\t// Snapshot: a sink callback may unsubscribe itself or others mid-iteration.\n\t\t// Iterating the live Set would skip not-yet-visited sinks that were removed.\n\t\tconst snapshot = [...this._sinks];\n\t\tfor (const sink of snapshot) {\n\t\t\tsink(messages);\n\t\t}\n\t}\n\n\t_handleLocalLifecycle(messages: Messages): void {\n\t\tfor (const m of messages) {\n\t\t\tconst t = m[0];\n\t\t\tif (t === DATA) {\n\t\t\t\tthis._cached = m[1] as T;\n\t\t\t\tif (this._versioning != null) {\n\t\t\t\t\tadvanceVersion(this._versioning, m[1], this._hashFn);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (t === INVALIDATE) {\n\t\t\t\t// GRAPHREFLY-SPEC §1.2: clear cached state; do not auto-emit from here.\n\t\t\t\tconst cleanupFn = this._cleanup;\n\t\t\t\tthis._cleanup = undefined;\n\t\t\t\tcleanupFn?.();\n\t\t\t\tthis._cached = undefined;\n\t\t\t\tthis._lastDepValues = undefined;\n\t\t\t}\n\t\t\tthis._status = statusAfterMessage(this._status, m);\n\t\t\tif (t === COMPLETE || t === ERROR) {\n\t\t\t\tthis._terminal = true;\n\t\t\t}\n\t\t\tif (t === TEARDOWN) {\n\t\t\t\tif (this._opts.resetOnTeardown) {\n\t\t\t\t\tthis._cached = undefined;\n\t\t\t\t}\n\t\t\t\t// Invoke cleanup for compute nodes (deps+fn) — spec §2.4\n\t\t\t\t// requires cleanup on teardown, not just before next invocation.\n\t\t\t\t// _stopProducer handles cleanup for producer nodes separately.\n\t\t\t\tconst teardownCleanup = this._cleanup;\n\t\t\t\tthis._cleanup = undefined;\n\t\t\t\tteardownCleanup?.();\n\t\t\t\ttry {\n\t\t\t\t\tthis._propagateToMeta(t);\n\t\t\t\t} finally {\n\t\t\t\t\tthis._disconnectUpstream();\n\t\t\t\t\tthis._stopProducer();\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Propagate other meta-eligible signals (centralized in messages.ts).\n\t\t\tif (t !== TEARDOWN && propagatesToMeta(t)) {\n\t\t\t\tthis._propagateToMeta(t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Propagate a signal to all companion meta nodes (best-effort). */\n\t_propagateToMeta(t: symbol): void {\n\t\tfor (const metaNode of Object.values(this.meta)) {\n\t\t\ttry {\n\t\t\t\t(metaNode as NodeImpl)._downInternal([[t]]);\n\t\t\t} catch {\n\t\t\t\t/* best-effort: other meta nodes still receive the signal */\n\t\t\t}\n\t\t}\n\t}\n\n\t_canSkipDirty(): boolean {\n\t\treturn this._sinkCount === 1 && this._singleDepSinkCount === 1;\n\t}\n\n\t_emitAutoValue(value: unknown): void {\n\t\tconst wasDirty = this._status === \"dirty\";\n\t\tconst unchanged = this._equals(this._cached, value);\n\t\tif (unchanged) {\n\t\t\tthis._downInternal(wasDirty ? [[RESOLVED]] : [[DIRTY], [RESOLVED]]);\n\t\t\treturn;\n\t\t}\n\t\tthis._cached = value as T;\n\t\tthis._downInternal(wasDirty ? [[DATA, value]] : [[DIRTY], [DATA, value]]);\n\t}\n\n\t_runFn(): void {\n\t\tif (!this._fn) return;\n\t\tif (this._terminal && !this._opts.resubscribable) return;\n\t\tif (this._connecting) return;\n\n\t\ttry {\n\t\t\tconst n = this._deps.length;\n\t\t\tconst depValues = new Array(n);\n\t\t\tfor (let i = 0; i < n; i++) depValues[i] = this._deps[i].get();\n\t\t\t// Identity check BEFORE cleanup: if all dep values are unchanged,\n\t\t\t// skip cleanup+fn entirely so effect nodes don't teardown/restart on no-op.\n\t\t\tconst prev = this._lastDepValues;\n\t\t\tif (n > 0 && prev != null && prev.length === n) {\n\t\t\t\tlet allSame = true;\n\t\t\t\tfor (let i = 0; i < n; i++) {\n\t\t\t\t\tif (!Object.is(depValues[i], prev[i])) {\n\t\t\t\t\t\tallSame = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (allSame) {\n\t\t\t\t\tif (this._status === \"dirty\") {\n\t\t\t\t\t\tthis._downInternal([[RESOLVED]]);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst prevCleanup = this._cleanup;\n\t\t\tthis._cleanup = undefined;\n\t\t\tprevCleanup?.();\n\t\t\tthis._manualEmitUsed = false;\n\t\t\tthis._lastDepValues = depValues;\n\t\t\tthis._inspectorHook?.({ kind: \"run\", depValues });\n\t\t\tconst out = this._fn(depValues, this._actions);\n\t\t\tif (isCleanupFn(out)) {\n\t\t\t\tthis._cleanup = out;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this._manualEmitUsed) return;\n\t\t\tif (out === undefined) return;\n\t\t\tthis._emitAutoValue(out);\n\t\t} catch (err) {\n\t\t\tthis._downInternal([[ERROR, err]]);\n\t\t}\n\t}\n\n\t_onDepDirty(index: number): void {\n\t\tconst wasDirty = this._depDirtyMask.has(index);\n\t\tthis._depDirtyMask.set(index);\n\t\tthis._depSettledMask.clear(index);\n\t\tif (!wasDirty) {\n\t\t\tthis._downInternal([[DIRTY]]);\n\t\t}\n\t}\n\n\t_onDepSettled(index: number): void {\n\t\tif (!this._depDirtyMask.has(index)) {\n\t\t\tthis._onDepDirty(index);\n\t\t}\n\t\tthis._depSettledMask.set(index);\n\t\tif (this._depDirtyMask.any() && this._depSettledMask.covers(this._depDirtyMask)) {\n\t\t\tthis._depDirtyMask.reset();\n\t\t\tthis._depSettledMask.reset();\n\t\t\tthis._runFn();\n\t\t}\n\t}\n\n\t_maybeCompleteFromDeps(): void {\n\t\tif (\n\t\t\tthis._autoComplete &&\n\t\t\tthis._deps.length > 0 &&\n\t\t\tthis._depCompleteMask.covers(this._allDepsCompleteMask)\n\t\t) {\n\t\t\tthis._downInternal([[COMPLETE]]);\n\t\t}\n\t}\n\n\t_handleDepMessages(index: number, messages: Messages): void {\n\t\tfor (const msg of messages) {\n\t\t\tthis._inspectorHook?.({ kind: \"dep_message\", depIndex: index, message: msg });\n\t\t\tconst t = msg[0];\n\t\t\t// User-defined message handler gets first look (spec §2.6).\n\t\t\tif (this._onMessage) {\n\t\t\t\ttry {\n\t\t\t\t\tif (this._onMessage(msg, index, this._actions)) continue;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthis._downInternal([[ERROR, err]]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!this._fn) {\n\t\t\t\t// Passthrough: forward all messages except COMPLETE when multi-dep.\n\t\t\t\t// Multi-dep passthrough must wait for ALL deps to complete (§1.3.5).\n\t\t\t\tif (t === COMPLETE && this._deps.length > 1) {\n\t\t\t\t\tthis._depCompleteMask.set(index);\n\t\t\t\t\tthis._maybeCompleteFromDeps();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthis._downInternal([msg]);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === DIRTY) {\n\t\t\t\tthis._onDepDirty(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === DATA || t === RESOLVED) {\n\t\t\t\tthis._onDepSettled(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\tthis._depCompleteMask.set(index);\n\t\t\t\t// Complete implies no longer pending — clear dirty/settled bits\n\t\t\t\t// so a preceding DIRTY from this dep doesn't block settlement.\n\t\t\t\tthis._depDirtyMask.clear(index);\n\t\t\t\tthis._depSettledMask.clear(index);\n\t\t\t\tif (this._depDirtyMask.any() && this._depSettledMask.covers(this._depDirtyMask)) {\n\t\t\t\t\tthis._depDirtyMask.reset();\n\t\t\t\t\tthis._depSettledMask.reset();\n\t\t\t\t\tthis._runFn();\n\t\t\t\t} else if (!this._depDirtyMask.any() && this._status === \"dirty\") {\n\t\t\t\t\t// D2: dep went DIRTY→COMPLETE without DATA — node was marked\n\t\t\t\t\t// dirty but no settlement came. Recompute so downstream\n\t\t\t\t\t// gets RESOLVED (value unchanged) or DATA (value changed).\n\t\t\t\t\tthis._depSettledMask.reset();\n\t\t\t\t\tthis._runFn();\n\t\t\t\t}\n\t\t\t\tthis._maybeCompleteFromDeps();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\tthis._downInternal([msg]);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === INVALIDATE || t === TEARDOWN || t === PAUSE || t === RESUME) {\n\t\t\t\tthis._downInternal([msg]);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Forward unknown message types\n\t\t\tthis._downInternal([msg]);\n\t\t}\n\t}\n\n\t_connectUpstream(): void {\n\t\tif (!this._hasDeps || this._connected) return;\n\t\tthis._connected = true;\n\t\tthis._depDirtyMask.reset();\n\t\tthis._depSettledMask.reset();\n\t\tthis._depCompleteMask.reset();\n\t\tthis._status = \"settled\";\n\t\tconst subHints: SubscribeHints | undefined = this._isSingleDep\n\t\t\t? { singleDep: true }\n\t\t\t: undefined;\n\t\tthis._connecting = true;\n\t\ttry {\n\t\t\tfor (let i = 0; i < this._deps.length; i += 1) {\n\t\t\t\tconst dep = this._deps[i];\n\t\t\t\tthis._upstreamUnsubs.push(\n\t\t\t\t\tdep.subscribe((msgs) => this._handleDepMessages(i, msgs), subHints),\n\t\t\t\t);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis._connecting = false;\n\t\t}\n\t\tif (this._fn) {\n\t\t\tthis._runFn();\n\t\t}\n\t}\n\n\t_stopProducer(): void {\n\t\tif (!this._producerStarted) return;\n\t\tthis._producerStarted = false;\n\t\tconst producerCleanup = this._cleanup;\n\t\tthis._cleanup = undefined;\n\t\tproducerCleanup?.();\n\t}\n\n\t_startProducer(): void {\n\t\tif (this._deps.length !== 0 || !this._fn || this._producerStarted) return;\n\t\tthis._producerStarted = true;\n\t\tthis._runFn();\n\t}\n\n\t_disconnectUpstream(): void {\n\t\tif (!this._connected) return;\n\t\tfor (const unsub of this._upstreamUnsubs.splice(0)) {\n\t\t\tunsub();\n\t\t}\n\t\tthis._connected = false;\n\t\tthis._depDirtyMask.reset();\n\t\tthis._depSettledMask.reset();\n\t\tthis._depCompleteMask.reset();\n\t\tthis._status = \"disconnected\";\n\t}\n}\n\n/**\n * Creates a reactive {@link Node} — the single GraphReFly primitive (GRAPHREFLY-SPEC §2).\n *\n * Typical shapes: `node([])` / `node([], opts)` for a manual source; `node(producerFn, opts)` for a\n * producer; `node(deps, computeFn, opts)` for derived nodes and operators.\n *\n * @param depsOrFn - Dependency nodes, a {@link NodeFn} (producer), or {@link NodeOptions} alone.\n * @param fnOrOpts - With deps: compute function or options. Omitted for producer-only form.\n * @param optsArg - Options when both `deps` and `fn` are provided.\n * @returns `Node<T>` - Configured node instance (lazy until subscribed).\n *\n * @remarks\n * **Protocol:** DIRTY / DATA / RESOLVED ordering, completion, and batch deferral follow `~/src/graphrefly/GRAPHREFLY-SPEC.md`.\n *\n * @example\n * ```ts\n * import { node, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const a = state(1);\n * const b = node([a], ([x]) => (x as number) + 1);\n * ```\n *\n * @seeAlso [Specification](/spec)\n *\n * @category core\n */\nexport function node<T = unknown>(\n\tdepsOrFn?: readonly Node[] | NodeFn<T> | NodeOptions,\n\tfnOrOpts?: NodeFn<T> | NodeOptions,\n\toptsArg?: NodeOptions,\n): Node<T> {\n\tconst deps: readonly Node[] = isNodeArray(depsOrFn) ? depsOrFn : [];\n\tconst fn: NodeFn<T> | undefined =\n\t\ttypeof depsOrFn === \"function\"\n\t\t\t? depsOrFn\n\t\t\t: typeof fnOrOpts === \"function\"\n\t\t\t\t? fnOrOpts\n\t\t\t\t: undefined;\n\tlet opts: NodeOptions = {};\n\tif (isNodeArray(depsOrFn)) {\n\t\topts = (isNodeOptions(fnOrOpts) ? fnOrOpts : optsArg) ?? {};\n\t} else if (isNodeOptions(depsOrFn)) {\n\t\topts = depsOrFn;\n\t} else {\n\t\topts = (isNodeOptions(fnOrOpts) ? fnOrOpts : optsArg) ?? {};\n\t}\n\n\treturn new NodeImpl<T>(deps, fn, opts);\n}\n","import { type Node, type NodeFn, type NodeOptions, node } from \"./node.js\";\n\n/**\n * Creates a manual source with no upstream deps. Emit values with {@link Node.down}.\n *\n * Spec: `state(initial, opts?)` is `node([], { initial, ...opts })` (GRAPHREFLY-SPEC §2.7).\n *\n * @param initial - Initial cached value.\n * @param opts - Optional {@link NodeOptions} (excluding `initial`).\n * @returns `Node<T>` - Stateful node you drive imperatively.\n *\n * @example\n * ```ts\n * import { DATA, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = state(0);\n * n.down([[DATA, 1]]);\n * ```\n *\n * @category core\n */\nexport function state<T>(initial: T, opts?: Omit<NodeOptions, \"initial\">): Node<T> {\n\treturn node<T>([], { ...opts, initial });\n}\n\n/**\n * Creates a producer node with no deps; `fn` runs when the first subscriber connects.\n *\n * @param fn - Receives deps (empty) and {@link NodeActions}; use `emit` / `down` to push.\n * @param opts - Optional {@link NodeOptions}.\n * @returns `Node<T>` - Producer node.\n *\n * @example\n * ```ts\n * import { producer } from \"@graphrefly/graphrefly-ts\";\n *\n * const tick = producer((_d, a) => {\n * a.emit(1);\n * });\n * ```\n *\n * @category core\n */\nexport function producer<T = unknown>(fn: NodeFn<T>, opts?: NodeOptions): Node<T> {\n\treturn node<T>(fn, { describeKind: \"producer\", ...opts });\n}\n\n/**\n * Creates a derived node from dependencies and a compute function (same primitive as operators).\n *\n * @param deps - Upstream nodes.\n * @param fn - Compute function; return value is emitted, or use `actions` explicitly.\n * @param opts - Optional {@link NodeOptions}.\n * @returns `Node<T>` - Derived node.\n *\n * @example\n * ```ts\n * import { derived, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const a = state(1);\n * const b = derived([a], ([x]) => (x as number) * 2);\n * ```\n *\n * @category core\n */\nexport function derived<T = unknown>(\n\tdeps: readonly Node[],\n\tfn: NodeFn<T>,\n\topts?: NodeOptions,\n): Node<T> {\n\treturn node<T>(deps, fn, { describeKind: \"derived\", ...opts });\n}\n\n/**\n * Runs a side-effect when deps settle; return value is not auto-emitted.\n *\n * @param deps - Nodes to watch.\n * @param fn - Side-effect body.\n * @returns `Node<unknown>` - Effect node.\n *\n * @example\n * ```ts\n * import { effect, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = state(1);\n * effect([n], ([v]) => {\n * console.log(v);\n * });\n * ```\n *\n * @category core\n */\nexport function effect(deps: readonly Node[], fn: NodeFn<unknown>): Node<unknown> {\n\treturn node(deps, fn, { describeKind: \"effect\" });\n}\n\n/** Unary transform used by {@link pipe} (typically returns a new node wrapping `n`). */\nexport type PipeOperator = (n: Node) => Node;\n\n/**\n * Composes unary operators left-to-right; returns the final node. Does not register a {@link Graph}.\n *\n * @param source - Starting node.\n * @param ops - Each operator maps `Node` to `Node` (curried operators from `extra` use a factory pattern — wrap or use direct calls).\n * @returns `Node` - Result of the last operator.\n *\n * @example\n * ```ts\n * import { filter, map, pipe, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const src = state(1);\n * const out = pipe(\n * src,\n * (n) => map(n, (x) => x + 1),\n * (n) => filter(n, (x) => x > 0),\n * );\n * ```\n *\n * @category core\n */\nexport function pipe(source: Node, ...ops: PipeOperator[]): Node {\n\tlet current = source;\n\tfor (const op of ops) {\n\t\tcurrent = op(current);\n\t}\n\treturn current;\n}\n","/**\n * Backoff strategies for {@link retry} (roadmap §3.1). Delays are in **nanoseconds**.\n *\n * Convention: all graphrefly-ts timestamps and durations use nanoseconds (`_ns` suffix).\n * 1 second = 1_000_000_000 ns, 1 ms = 1_000_000 ns.\n */\n\nexport const NS_PER_MS = 1_000_000;\nexport const NS_PER_SEC = 1_000_000_000;\n\nexport type JitterMode = \"none\" | \"full\" | \"equal\";\n\nexport type BackoffPreset =\n\t| \"constant\"\n\t| \"linear\"\n\t| \"exponential\"\n\t| \"fibonacci\"\n\t| \"decorrelatedJitter\";\n\n/** `(attempt, error?, previousDelayNs?) => delayNs | null` — `null` means zero delay. */\nexport type BackoffStrategy = (\n\tattempt: number,\n\terror?: unknown,\n\tprevDelayNs?: number | null,\n) => number | null;\n\nfunction clampNonNegative(value: number): number {\n\treturn value < 0 ? 0 : value;\n}\n\nfunction applyJitter(delay: number, jitter: JitterMode): number {\n\tif (jitter === \"none\") return delay;\n\tif (jitter === \"full\") return Math.random() * delay;\n\treturn delay / 2 + Math.random() * (delay / 2);\n}\n\nfunction randomBetween(min: number, max: number): number {\n\treturn min + Math.random() * (max - min);\n}\n\n/**\n * Builds a strategy that always returns the same delay in nanoseconds.\n *\n * @param delayNs - Non-negative delay in nanoseconds; values below zero are clamped to zero.\n * @returns `BackoffStrategy` for use with {@link retry} or custom timers.\n *\n * @example\n * ```ts\n * import { constant, retry, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * const out = retry(source, { count: 3, backoff: constant(0.25 * NS_PER_SEC) });\n * ```\n *\n * @category extra\n */\nexport function constant(delayNs: number): BackoffStrategy {\n\tconst safe = clampNonNegative(delayNs);\n\treturn () => safe;\n}\n\n/**\n * Builds linear backoff: `baseNs + stepNs * attempt` (`stepNs` defaults to `baseNs`).\n *\n * @param baseNs - Base delay in nanoseconds (clamped non-negative).\n * @param stepNs - Added per retry attempt in nanoseconds (clamped non-negative).\n * @returns `BackoffStrategy` for {@link retry}.\n *\n * @example\n * ```ts\n * import { linear, retry, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * // Attempt 0 → 1 s, attempt 1 → 2 s, attempt 2 → 3 s …\n * const out = retry(source, { count: 4, backoff: linear(NS_PER_SEC) });\n * ```\n *\n * @category extra\n */\nexport function linear(baseNs: number, stepNs?: number): BackoffStrategy {\n\tconst safeBase = clampNonNegative(baseNs);\n\tconst safeStep = stepNs === undefined ? safeBase : clampNonNegative(stepNs);\n\treturn (attempt: number) => safeBase + safeStep * Math.max(0, attempt);\n}\n\nexport type ExponentialBackoffOptions = {\n\tbaseNs?: number;\n\tfactor?: number;\n\tmaxDelayNs?: number;\n\tjitter?: JitterMode;\n};\n\n/**\n * Builds exponential backoff in nanoseconds, capped by `maxDelayNs`, with optional jitter.\n *\n * @param options - Base, factor, cap, and jitter mode.\n * @returns `BackoffStrategy` for {@link retry}.\n *\n * @remarks\n * **Jitter:** `\"full\"` spreads delay across `[0, delay]`; `\"equal\"` uses `[delay/2, delay]`.\n *\n * @example\n * ```ts\n * import { exponential, retry, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * // 100 ms → 200 ms → 400 ms … capped at 30 s, with full jitter\n * const out = retry(source, {\n * count: 5,\n * backoff: exponential({ baseNs: 100 * NS_PER_SEC / 1000, jitter: \"full\" }),\n * });\n * ```\n *\n * @category extra\n */\nexport function exponential(options?: ExponentialBackoffOptions): BackoffStrategy {\n\tconst baseNs = clampNonNegative(options?.baseNs ?? 100 * NS_PER_MS);\n\tconst factor = options?.factor !== undefined && options.factor < 1 ? 1 : (options?.factor ?? 2);\n\tconst maxDelayNs = clampNonNegative(options?.maxDelayNs ?? 30 * NS_PER_SEC);\n\tconst jitter = options?.jitter ?? \"none\";\n\n\treturn (attempt: number) => {\n\t\tlet delay: number;\n\t\tif (baseNs === 0) {\n\t\t\tdelay = 0;\n\t\t} else if (factor === 1) {\n\t\t\tdelay = baseNs;\n\t\t} else {\n\t\t\tconst capRatio = maxDelayNs / baseNs;\n\t\t\tlet growth = 1;\n\t\t\tfor (let i = 0; i < Math.max(0, attempt); i++) {\n\t\t\t\tif (growth >= capRatio) {\n\t\t\t\t\tgrowth = capRatio;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tgrowth *= factor;\n\t\t\t}\n\t\t\tdelay = baseNs * growth;\n\t\t\tif (delay > maxDelayNs) delay = maxDelayNs;\n\t\t}\n\t\treturn applyJitter(delay, jitter);\n\t};\n}\n\n/**\n * Builds Fibonacci-scaled delays: `1, 2, 3, 5, … × baseNs`, capped at `maxDelayNs`.\n *\n * @param baseNs - Multiplier applied to the Fibonacci unit (default `100ms` in nanoseconds).\n * @param maxDelayNs - Upper bound in nanoseconds (default `30s`).\n * @returns `BackoffStrategy` for {@link retry}.\n *\n * @example\n * ```ts\n * import { fibonacci, retry, NS_PER_MS } from \"@graphrefly/graphrefly-ts\";\n *\n * // Delays: 100 ms, 200 ms, 300 ms, 500 ms, 800 ms … (× 100 ms base)\n * const out = retry(source, { count: 5, backoff: fibonacci(100 * NS_PER_MS) });\n * ```\n *\n * @category extra\n */\nexport function fibonacci(baseNs = 100 * NS_PER_MS, maxDelayNs = 30 * NS_PER_SEC): BackoffStrategy {\n\tconst safeBase = clampNonNegative(baseNs);\n\tconst safeMax = clampNonNegative(maxDelayNs);\n\n\tfunction fibUnit(attempt: number): number {\n\t\tif (attempt <= 0) return 1;\n\t\tlet prev = 1;\n\t\tlet cur = 2;\n\t\tfor (let i = 1; i < attempt; i++) {\n\t\t\tconst next = prev + cur;\n\t\t\tprev = cur;\n\t\t\tcur = next;\n\t\t}\n\t\treturn cur;\n\t}\n\n\treturn (attempt: number) => {\n\t\tconst raw = fibUnit(attempt) * safeBase;\n\t\treturn raw <= safeMax ? raw : safeMax;\n\t};\n}\n\n/**\n * Decorrelated jitter (AWS-recommended): `random(baseNs, min(maxNs, lastDelay * 3))`.\n *\n * Stateless — uses `prevDelayNs` (passed by the consumer) instead of closure state.\n * Safe to share across concurrent retry sequences.\n *\n * @param baseNs - Floor of the random range (default `100ms` in nanoseconds).\n * @param maxNs - Ceiling cap (default `30s` in nanoseconds).\n * @returns `BackoffStrategy` for {@link retry}.\n *\n * @example\n * ```ts\n * import { decorrelatedJitter, retry, NS_PER_MS, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * const out = retry(source, {\n * count: 6,\n * backoff: decorrelatedJitter(100 * NS_PER_MS, 10 * NS_PER_SEC),\n * });\n * ```\n *\n * @category extra\n */\nexport function decorrelatedJitter(\n\tbaseNs = 100 * NS_PER_MS,\n\tmaxNs = 30 * NS_PER_SEC,\n): BackoffStrategy {\n\treturn (_attempt, _error, prevDelayNs) => {\n\t\tconst last = prevDelayNs ?? baseNs;\n\t\tconst ceiling = Math.min(maxNs, last * 3);\n\t\treturn randomBetween(baseNs, ceiling);\n\t};\n}\n\n/**\n * Decorator that caps any strategy at `maxAttempts`. Returns `null` (stop retrying) after the cap.\n *\n * @param strategy - Inner strategy to wrap.\n * @param maxAttempts - Maximum number of attempts (inclusive).\n * @returns Wrapped `BackoffStrategy`.\n *\n * @example\n * ```ts\n * import { withMaxAttempts, exponential } from \"@graphrefly/graphrefly-ts\";\n *\n * const capped = withMaxAttempts(exponential(), 3);\n * capped(3); // null — no more retries beyond attempt 3\n * ```\n *\n * @category extra\n */\nexport function withMaxAttempts(strategy: BackoffStrategy, maxAttempts: number): BackoffStrategy {\n\treturn (attempt, error, prevDelayNs) => {\n\t\tif (attempt >= maxAttempts) return null;\n\t\treturn strategy(attempt, error, prevDelayNs);\n\t};\n}\n\n/**\n * Maps a preset name to a concrete {@link BackoffStrategy} with library-default parameters.\n *\n * @param name - One of `constant`, `linear`, `exponential`, `fibonacci`, or `decorrelatedJitter`.\n * @returns Configured strategy with default parameters.\n * @throws Error when `name` is not a known preset.\n *\n * @example\n * ```ts\n * import { resolveBackoffPreset, retry } from \"@graphrefly/graphrefly-ts\";\n *\n * const out = retry(source, { count: 3, backoff: resolveBackoffPreset(\"exponential\") });\n * // Equivalent to retry(source, { count: 3, backoff: exponential() })\n * ```\n *\n * @category extra\n */\nexport function resolveBackoffPreset(name: BackoffPreset): BackoffStrategy {\n\tif (name === \"constant\") return constant(1 * NS_PER_SEC);\n\tif (name === \"linear\") return linear(1 * NS_PER_SEC);\n\tif (name === \"exponential\") return exponential();\n\tif (name === \"fibonacci\") return fibonacci();\n\tif (name === \"decorrelatedJitter\") return decorrelatedJitter();\n\tthrow new Error(\n\t\t`Unknown backoff preset: \"${String(name)}\". Use one of: constant, linear, exponential, fibonacci, decorrelatedJitter`,\n\t);\n}\n","/**\n * Resilience utilities — roadmap §3.1 (retry, breaker, rate limit, status companions).\n */\nimport { batch } from \"../core/batch.js\";\nimport { monotonicNs } from \"../core/clock.js\";\nimport { COMPLETE, DATA, DIRTY, ERROR, type Message, RESOLVED } from \"../core/messages.js\";\nimport { type Node, type NodeOptions, node } from \"../core/node.js\";\nimport { producer } from \"../core/sugar.js\";\nimport {\n\ttype BackoffPreset,\n\ttype BackoffStrategy,\n\tNS_PER_MS,\n\tNS_PER_SEC,\n\tresolveBackoffPreset,\n} from \"./backoff.js\";\n\ntype ExtraOpts = Omit<NodeOptions, \"describeKind\">;\n\nfunction operatorOpts(opts?: ExtraOpts): NodeOptions {\n\treturn { describeKind: \"operator\", ...opts };\n}\n\nfunction clampNonNegative(value: number): number {\n\treturn value < 0 ? 0 : value;\n}\n\nfunction msgVal(m: Message): unknown {\n\treturn m[1];\n}\n\nfunction coerceDelayNs(raw: number | null): number {\n\tif (raw === null) return 0;\n\tif (typeof raw !== \"number\" || !Number.isFinite(raw)) {\n\t\tthrow new TypeError(\"backoff strategy must return a finite number or null\");\n\t}\n\treturn raw < 0 ? 0 : raw;\n}\n\nexport type RetryOptions = {\n\t/** Max retry attempts after each terminal `ERROR` (not counting the first failure). */\n\tcount?: number;\n\t/** Delay between attempts; strategies use **nanoseconds**. */\n\tbackoff?: BackoffStrategy | BackoffPreset;\n};\n\n/**\n * Resubscribes to the upstream node after each terminal `ERROR`, after an optional delay.\n *\n * @param source - Upstream node (should use `resubscribable: true`).\n * @param opts - `count` caps attempts; `backoff` supplies delay in **nanoseconds** (or a preset name).\n * @returns Node that retries on error.\n *\n * @remarks\n * **Resubscribable sources:** The upstream should use `resubscribable: true` if it must emit again after `ERROR`.\n * **Protocol:** Forwards unknown message tuples unchanged; handles `DIRTY`, `DATA`, `RESOLVED`, `COMPLETE`, `ERROR`.\n *\n * @example\n * ```ts\n * import { ERROR, NS_PER_SEC, pipe, producer, retry, constant } from \"@graphrefly/graphrefly-ts\";\n *\n * const src = producer(\n * (_d, a) => {\n * a.down([[ERROR, new Error(\"x\")]]);\n * },\n * { resubscribable: true },\n * );\n * const out = retry(src, { count: 2, backoff: constant(0.25 * NS_PER_SEC) });\n * ```\n *\n * @category extra\n */\nexport function retry<T>(source: Node<T>, opts?: RetryOptions): Node<T> {\n\tconst count = opts?.count;\n\tconst backoffOpt = opts?.backoff;\n\tconst maxRetries = count !== undefined ? count : backoffOpt === undefined ? 0 : 0x7fffffff;\n\tif (maxRetries < 0) throw new RangeError(\"retry count must be >= 0\");\n\n\tconst strategy: BackoffStrategy | null =\n\t\tbackoffOpt === undefined\n\t\t\t? null\n\t\t\t: typeof backoffOpt === \"string\"\n\t\t\t\t? resolveBackoffPreset(backoffOpt)\n\t\t\t\t: backoffOpt;\n\n\treturn producer<T>(\n\t\t(_d, a) => {\n\t\t\tlet attempt = 0;\n\t\t\tlet stopped = false;\n\t\t\tlet prevDelay: number | null = null;\n\t\t\tlet unsub: (() => void) | undefined;\n\t\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\t\tlet timerGen = 0;\n\n\t\t\tfunction cancelTimer(): void {\n\t\t\t\tif (timer !== undefined) {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction disconnectUpstream(): void {\n\t\t\t\tunsub?.();\n\t\t\t\tunsub = undefined;\n\t\t\t}\n\n\t\t\tfunction scheduleRetryOrFinish(err: unknown): void {\n\t\t\t\tif (stopped) return;\n\t\t\t\tif (attempt >= maxRetries) {\n\t\t\t\t\tdisconnectUpstream();\n\t\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst raw = strategy === null ? 0 : strategy(attempt, err, prevDelay);\n\t\t\t\tconst delayNs = coerceDelayNs(raw === undefined ? null : raw);\n\t\t\t\tprevDelay = delayNs;\n\t\t\t\tattempt += 1;\n\t\t\t\ttimerGen += 1;\n\t\t\t\tconst gen = timerGen;\n\t\t\t\tdisconnectUpstream();\n\t\t\t\tconst delayMs = delayNs > 0 ? delayNs / NS_PER_MS : 1;\n\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t\tif (stopped || gen !== timerGen) return;\n\t\t\t\t\tconnect();\n\t\t\t\t}, delayMs);\n\t\t\t}\n\n\t\t\tfunction connect(): void {\n\t\t\t\tcancelTimer();\n\t\t\t\tdisconnectUpstream();\n\t\t\t\tunsub = source.subscribe((msgs) => {\n\t\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\t\tconst t = m[0];\n\t\t\t\t\t\tif (t === DIRTY) a.down([[DIRTY]]);\n\t\t\t\t\t\telse if (t === DATA) {\n\t\t\t\t\t\t\tattempt = 0;\n\t\t\t\t\t\t\tprevDelay = null;\n\t\t\t\t\t\t\ta.emit(m[1] as T);\n\t\t\t\t\t\t} else if (t === RESOLVED) a.down([[RESOLVED]]);\n\t\t\t\t\t\telse if (t === COMPLETE) {\n\t\t\t\t\t\t\tdisconnectUpstream();\n\t\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\t\t\tscheduleRetryOrFinish(msgVal(m));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t} else a.down([m]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconnect();\n\n\t\t\treturn () => {\n\t\t\t\tstopped = true;\n\t\t\t\ttimerGen += 1;\n\t\t\t\tcancelTimer();\n\t\t\t\tdisconnectUpstream();\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(),\n\t\t\tinitial: source.get(),\n\t\t},\n\t);\n}\n\nexport type CircuitState = \"closed\" | \"open\" | \"half-open\";\n\n/**\n * Thrown when {@link withBreaker} is configured with `onOpen: \"error\"` and the breaker rejects work.\n *\n * @category extra\n */\nexport class CircuitOpenError extends Error {\n\toverride name = \"CircuitOpenError\";\n\tconstructor() {\n\t\tsuper(\"Circuit breaker is open\");\n\t}\n}\n\nexport interface CircuitBreakerOptions {\n\t/** Number of consecutive failures before opening. Default: 5. */\n\tfailureThreshold?: number;\n\t/** Base cooldown in nanoseconds before transitioning to half-open. Default: 30s. */\n\tcooldownNs?: number;\n\t/** Backoff strategy for cooldown escalation across consecutive open cycles. Overrides `cooldownNs` when provided. */\n\tcooldown?: BackoffStrategy;\n\t/** Max trial requests allowed in half-open state. Default: 1. */\n\thalfOpenMax?: number;\n\t/** Clock function returning nanoseconds (for testability). Default: `monotonicNs`. */\n\tnow?: () => number;\n}\n\nexport interface CircuitBreaker {\n\t/** Whether a request should be allowed through. Triggers open→half-open transition when cooldown expires. */\n\tcanExecute(): boolean;\n\t/** Record a successful execution. Resets to closed. */\n\trecordSuccess(): void;\n\t/** Record a failed execution. May transition to open. */\n\trecordFailure(error?: unknown): void;\n\t/** Current circuit state (read-only, does not trigger transitions). */\n\treadonly state: CircuitState;\n\t/** Number of consecutive failures in the current closed period. */\n\treadonly failureCount: number;\n\t/** Manually reset to closed state, clearing all counters. */\n\treset(): void;\n}\n\n/**\n * Factory for a synchronous circuit breaker with `closed`, `open`, and `half-open` states.\n *\n * Supports escalating cooldown via an optional {@link BackoffStrategy} — each consecutive\n * open→half-open→open cycle increments the backoff attempt.\n *\n * @param options - Threshold, cooldown, half-open limit, and optional clock override.\n * @returns {@link CircuitBreaker} instance.\n *\n * @remarks\n * **Timing:** Uses `monotonicNs()` by default (nanoseconds). Override `now` for tests.\n *\n * @example\n * ```ts\n * import { circuitBreaker, exponential, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * const b = circuitBreaker({\n * failureThreshold: 3,\n * cooldown: exponential({ baseNs: 1 * NS_PER_SEC }),\n * });\n * ```\n *\n * @category extra\n */\nexport function circuitBreaker(options?: CircuitBreakerOptions): CircuitBreaker {\n\tconst threshold = Math.max(1, options?.failureThreshold ?? 5);\n\tconst baseCooldownNs = clampNonNegative(options?.cooldownNs ?? 30 * NS_PER_SEC);\n\tconst cooldownStrategy = options?.cooldown ?? null;\n\tconst halfOpenMax = Math.max(1, options?.halfOpenMax ?? 1);\n\tconst now = options?.now ?? monotonicNs;\n\n\tlet _state: CircuitState = \"closed\";\n\tlet _failureCount = 0;\n\tlet _openCycle = 0;\n\tlet _lastOpenedAt = 0;\n\tlet _lastCooldownNs = baseCooldownNs;\n\tlet _halfOpenAttempts = 0;\n\n\tfunction getCooldownNs(): number {\n\t\tif (!cooldownStrategy) return baseCooldownNs;\n\t\tconst delayNs = cooldownStrategy(_openCycle);\n\t\treturn delayNs !== null ? delayNs : baseCooldownNs;\n\t}\n\n\tfunction transitionToOpen(): void {\n\t\t_state = \"open\";\n\t\t_lastCooldownNs = getCooldownNs();\n\t\t_lastOpenedAt = now();\n\t\t_halfOpenAttempts = 0;\n\t}\n\n\tconst breaker: CircuitBreaker = {\n\t\tcanExecute(): boolean {\n\t\t\tif (_state === \"closed\") return true;\n\n\t\t\tif (_state === \"open\") {\n\t\t\t\tconst elapsed = now() - _lastOpenedAt;\n\t\t\t\tif (elapsed >= _lastCooldownNs) {\n\t\t\t\t\t_state = \"half-open\";\n\t\t\t\t\t_halfOpenAttempts = 1;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (_halfOpenAttempts < halfOpenMax) {\n\t\t\t\t_halfOpenAttempts++;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\trecordSuccess(): void {\n\t\t\tif (_state === \"half-open\") {\n\t\t\t\t_state = \"closed\";\n\t\t\t\t_failureCount = 0;\n\t\t\t\t_openCycle = 0;\n\t\t\t} else if (_state === \"closed\") {\n\t\t\t\t_failureCount = 0;\n\t\t\t}\n\t\t},\n\n\t\trecordFailure(_error?: unknown): void {\n\t\t\tif (_state === \"half-open\") {\n\t\t\t\t_openCycle++;\n\t\t\t\ttransitionToOpen();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (_state === \"closed\") {\n\t\t\t\t_failureCount++;\n\t\t\t\tif (_failureCount >= threshold) {\n\t\t\t\t\ttransitionToOpen();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tget state(): CircuitState {\n\t\t\treturn _state;\n\t\t},\n\n\t\tget failureCount(): number {\n\t\t\treturn _failureCount;\n\t\t},\n\n\t\treset(): void {\n\t\t\t_state = \"closed\";\n\t\t\t_failureCount = 0;\n\t\t\t_openCycle = 0;\n\t\t\t_halfOpenAttempts = 0;\n\t\t},\n\t};\n\n\treturn breaker;\n}\n\nexport type WithBreakerBundle<T> = {\n\tnode: Node<T>;\n\tbreakerState: Node<CircuitState>;\n};\n\n/**\n * Returns a unary wrapper that gates upstream `DATA` through a {@link CircuitBreaker}.\n *\n * @param breaker - Shared breaker instance (typically one per resource).\n * @param options - `onOpen: \"skip\"` emits `RESOLVED` when open; `\"error\"` emits {@link CircuitOpenError}.\n * @returns Function mapping `Node<T>` to `{ node, breakerState }` companion nodes.\n *\n * @remarks\n * **Success path:** `COMPLETE` calls {@link CircuitBreaker.recordSuccess}. **Failure path:** upstream `ERROR` calls {@link CircuitBreaker.recordFailure} and is forwarded.\n *\n * @example\n * ```ts\n * import { state, withBreaker, circuitBreaker } from \"@graphrefly/graphrefly-ts\";\n *\n * const b = circuitBreaker({ failureThreshold: 2 });\n * const s = state(1);\n * const { node, breakerState } = withBreaker(b)(s);\n * ```\n *\n * @category extra\n */\nexport function withBreaker<T>(\n\tbreaker: CircuitBreaker,\n\toptions?: { onOpen?: \"skip\" | \"error\" },\n): (source: Node<T>) => WithBreakerBundle<T> {\n\tconst onOpen = options?.onOpen ?? \"skip\";\n\n\treturn (source: Node<T>): WithBreakerBundle<T> => {\n\t\tconst wrapped = node<T>(\n\t\t\t[],\n\t\t\t(_deps, a) => {\n\t\t\t\tfunction syncState(): void {\n\t\t\t\t\twrapped.meta.breakerState.down([[DATA, breaker.state]]);\n\t\t\t\t}\n\n\t\t\t\tconst unsub = source.subscribe((msgs) => {\n\t\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\t\tconst t = m[0];\n\t\t\t\t\t\tif (t === DIRTY) a.down([[DIRTY]]);\n\t\t\t\t\t\telse if (t === DATA) {\n\t\t\t\t\t\t\tif (breaker.canExecute()) {\n\t\t\t\t\t\t\t\tsyncState();\n\t\t\t\t\t\t\t\ta.emit(m[1] as T);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsyncState();\n\t\t\t\t\t\t\t\tif (onOpen === \"error\") a.down([[ERROR, new CircuitOpenError()]]);\n\t\t\t\t\t\t\t\telse a.down([[RESOLVED]]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (t === RESOLVED) a.down([[RESOLVED]]);\n\t\t\t\t\t\telse if (t === COMPLETE) {\n\t\t\t\t\t\t\tbreaker.recordSuccess();\n\t\t\t\t\t\t\tsyncState();\n\t\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\t\t\tbreaker.recordFailure(msgVal(m));\n\t\t\t\t\t\t\tsyncState();\n\t\t\t\t\t\t\ta.down([m]);\n\t\t\t\t\t\t} else a.down([m]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tsyncState();\n\t\t\t\treturn unsub;\n\t\t\t},\n\t\t\t{\n\t\t\t\t...operatorOpts(),\n\t\t\t\tmeta: { breakerState: breaker.state },\n\t\t\t\tcompleteWhenDepsComplete: false,\n\t\t\t\tinitial: source.get(),\n\t\t\t},\n\t\t);\n\n\t\treturn { node: wrapped, breakerState: wrapped.meta.breakerState as Node<CircuitState> };\n\t};\n}\n\nexport interface TokenBucket {\n\t/** Number of tokens currently available (after refill). */\n\tavailable(): number;\n\t/** Try to consume `cost` tokens. Returns `true` if successful. */\n\ttryConsume(cost?: number): boolean;\n}\n\n/**\n * Token-bucket meter (capacity + refill rate per second). Use with {@link rateLimiter} or custom gates.\n *\n * @param capacity - Maximum tokens (must be positive).\n * @param refillPerSecond - Tokens added per elapsed second (non-negative).\n * @returns {@link TokenBucket} instance.\n *\n * @example\n * ```ts\n * import { tokenBucket } from \"@graphrefly/graphrefly-ts\";\n *\n * const bucket = tokenBucket(10, 2); // capacity 10, refill 2 tokens/sec\n * bucket.tryConsume(3); // true — 7 tokens remaining\n * bucket.available(); // ~7 (plus any elapsed refill)\n * ```\n *\n * @category extra\n */\nexport function tokenBucket(capacity: number, refillPerSecond: number): TokenBucket {\n\tif (capacity <= 0) throw new RangeError(\"capacity must be > 0\");\n\tif (refillPerSecond < 0) throw new RangeError(\"refillPerSecond must be >= 0\");\n\n\tlet tokens = capacity;\n\tlet updatedAt = monotonicNs();\n\n\tfunction refill(now: number): void {\n\t\tif (refillPerSecond > 0) {\n\t\t\tconst elapsedNs = now - updatedAt;\n\t\t\ttokens = Math.min(capacity, tokens + (elapsedNs / NS_PER_SEC) * refillPerSecond);\n\t\t}\n\t\tupdatedAt = now;\n\t}\n\n\treturn {\n\t\tavailable(): number {\n\t\t\trefill(monotonicNs());\n\t\t\treturn tokens;\n\t\t},\n\t\ttryConsume(cost = 1): boolean {\n\t\t\tif (cost <= 0) return true;\n\t\t\tconst now = monotonicNs();\n\t\t\trefill(now);\n\t\t\tif (tokens >= cost) {\n\t\t\t\ttokens -= cost;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t};\n}\n\n/**\n * Same behavior as {@link tokenBucket}. Exposed for naming parity with graphrefly-py (`token_tracker`).\n *\n * @param capacity - Maximum tokens (must be positive).\n * @param refillPerSecond - Tokens added per elapsed second (non-negative).\n * @returns A {@link TokenBucket} instance.\n *\n * @example\n * ```ts\n * import { tokenTracker } from \"@graphrefly/graphrefly-ts\";\n *\n * const tracker = tokenTracker(100, 10); // 100-token capacity, 10/sec refill\n * tracker.tryConsume(5); // true\n * ```\n *\n * @category extra\n */\nexport function tokenTracker(capacity: number, refillPerSecond: number): TokenBucket {\n\treturn tokenBucket(capacity, refillPerSecond);\n}\n\n/**\n * Enforces a sliding window: at most `maxEvents` `DATA` values per `windowNs`.\n *\n * @param source - Upstream node.\n * @param maxEvents - Maximum `DATA` emissions per window (must be positive).\n * @param windowNs - Window length in nanoseconds (must be positive).\n * @returns Node that queues excess values FIFO until a slot frees.\n *\n * @remarks\n * **Terminal:** `COMPLETE` / `ERROR` cancel timers, drop pending queue, and clear window state.\n *\n * @example\n * ```ts\n * import { rateLimiter, state, NS_PER_SEC } from \"@graphrefly/graphrefly-ts\";\n *\n * const src = state(0);\n * // Allow at most 5 DATA values per second\n * const limited = rateLimiter(src, 5, NS_PER_SEC);\n * limited.subscribe((msgs) => console.log(msgs));\n * ```\n *\n * @category extra\n */\nexport function rateLimiter<T>(source: Node<T>, maxEvents: number, windowNs: number): Node<T> {\n\tif (maxEvents <= 0) throw new RangeError(\"maxEvents must be > 0\");\n\tif (windowNs <= 0) throw new RangeError(\"windowNs must be > 0\");\n\treturn producer<T>(\n\t\t(_d, a) => {\n\t\t\tconst times: number[] = [];\n\t\t\tconst pending: T[] = [];\n\t\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\t\tlet timerGen = 0;\n\n\t\t\tfunction cancelTimer(): void {\n\t\t\t\tif (timer !== undefined) {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction prune(now: number): void {\n\t\t\t\tconst boundary = now - windowNs;\n\t\t\t\twhile (times.length > 0 && times[0] <= boundary) times.shift();\n\t\t\t}\n\n\t\t\tfunction tryEmit(): void {\n\t\t\t\twhile (pending.length > 0) {\n\t\t\t\t\tconst now = monotonicNs();\n\t\t\t\t\tprune(now);\n\t\t\t\t\tif (times.length < maxEvents) {\n\t\t\t\t\t\ttimes.push(now);\n\t\t\t\t\t\ta.emit(pending.shift() as T);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst oldest = times[0];\n\t\t\t\t\t\tcancelTimer();\n\t\t\t\t\t\ttimerGen += 1;\n\t\t\t\t\t\tconst gen = timerGen;\n\t\t\t\t\t\tconst delayNs = Math.max(0, oldest + windowNs - monotonicNs());\n\t\t\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\t\t\ttimer = undefined;\n\t\t\t\t\t\t\tif (gen !== timerGen) return;\n\t\t\t\t\t\t\ttryEmit();\n\t\t\t\t\t\t}, delayNs / NS_PER_MS);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst unsub = source.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\tif (t === DIRTY) a.down([[DIRTY]]);\n\t\t\t\t\telse if (t === DATA) {\n\t\t\t\t\t\tpending.push(m[1] as T);\n\t\t\t\t\t\ttryEmit();\n\t\t\t\t\t} else if (t === RESOLVED) a.down([[RESOLVED]]);\n\t\t\t\t\telse if (t === COMPLETE) {\n\t\t\t\t\t\ttimerGen += 1;\n\t\t\t\t\t\tcancelTimer();\n\t\t\t\t\t\tpending.length = 0;\n\t\t\t\t\t\ttimes.length = 0;\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\t\ttimerGen += 1;\n\t\t\t\t\t\tcancelTimer();\n\t\t\t\t\t\tpending.length = 0;\n\t\t\t\t\t\ttimes.length = 0;\n\t\t\t\t\t\ta.down([m]);\n\t\t\t\t\t} else a.down([m]);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn () => {\n\t\t\t\ttimerGen += 1;\n\t\t\t\tcancelTimer();\n\t\t\t\tunsub();\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(),\n\t\t\tinitial: source.get(),\n\t\t},\n\t);\n}\n\nexport type StatusValue = \"pending\" | \"active\" | \"completed\" | \"errored\";\n\nexport type WithStatusBundle<T> = {\n\tnode: Node<T>;\n\tstatus: Node<StatusValue>;\n\terror: Node<unknown | null>;\n};\n\n/**\n * Wraps `src` with `status` and `error` {@link state} companions for UI or meta snapshots.\n *\n * @param src - Upstream node to mirror.\n * @param options - `initialStatus` defaults to `\"pending\"`.\n * @returns `{ node, status, error }` where `error` holds the last `ERROR` payload.\n *\n * @remarks\n * **Recovery:** After `errored`, the next `DATA` clears `error` and sets `active` inside {@link batch} (matches graphrefly-py).\n *\n * @example\n * ```ts\n * import { withStatus, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const src = state<number>(0);\n * const { node, status, error } = withStatus(src);\n *\n * status.subscribe((msgs) => console.log(\"status:\", msgs));\n * src.down([[DATA, 42]]); // status → \"active\"\n * ```\n *\n * @category extra\n */\nexport function withStatus<T>(\n\tsrc: Node<T>,\n\toptions?: { initialStatus?: StatusValue },\n): WithStatusBundle<T> {\n\tconst initialStatus = options?.initialStatus ?? \"pending\";\n\n\tconst out = node<T>(\n\t\t[],\n\t\t(_deps, a) => {\n\t\t\tout.meta.status.down([[DATA, initialStatus]]);\n\t\t\tout.meta.error.down([[DATA, null]]);\n\n\t\t\tconst unsub = src.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\tif (t === DIRTY) a.down([[DIRTY]]);\n\t\t\t\t\telse if (t === DATA) {\n\t\t\t\t\t\tif (out.meta.status.get() === \"errored\") {\n\t\t\t\t\t\t\tbatch(() => {\n\t\t\t\t\t\t\t\tout.meta.error.down([[DATA, null]]);\n\t\t\t\t\t\t\t\tout.meta.status.down([[DATA, \"active\"]]);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tout.meta.status.down([[DATA, \"active\"]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ta.emit(m[1] as T);\n\t\t\t\t\t} else if (t === RESOLVED) a.down([[RESOLVED]]);\n\t\t\t\t\telse if (t === COMPLETE) {\n\t\t\t\t\t\tout.meta.status.down([[DATA, \"completed\"]]);\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\t\tconst err = msgVal(m);\n\t\t\t\t\t\tbatch(() => {\n\t\t\t\t\t\t\tout.meta.error.down([[DATA, err]]);\n\t\t\t\t\t\t\tout.meta.status.down([[DATA, \"errored\"]]);\n\t\t\t\t\t\t});\n\t\t\t\t\t\ta.down([m]);\n\t\t\t\t\t} else a.down([m]);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn unsub;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(),\n\t\t\tmeta: { status: initialStatus, error: null },\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tresubscribable: true,\n\t\t\tinitial: src.get(),\n\t\t},\n\t);\n\n\treturn {\n\t\tnode: out,\n\t\tstatus: out.meta.status as Node<StatusValue>,\n\t\terror: out.meta.error as Node<unknown | null>,\n\t};\n}\n","/**\n * Core reactive sources, sinks, and utilities (roadmap §2.3).\n *\n * Each API returns a {@link Node} built with {@link node}, {@link producer},\n * {@link derived}, or {@link effect} — no second protocol.\n *\n * Protocol/system/ingest adapters (fromHTTP, fromWebSocket, fromKafka, etc.)\n * live in {@link ./adapters.ts}.\n */\n\nimport { existsSync, watch } from \"node:fs\";\nimport { resolve as resolvePath } from \"node:path\";\nimport { wallClockNs } from \"../core/clock.js\";\nimport { COMPLETE, DATA, ERROR, type Message } from \"../core/messages.js\";\nimport { type Node, type NodeOptions, type NodeSink, node } from \"../core/node.js\";\nimport { producer } from \"../core/sugar.js\";\nimport { type CronSchedule, matchesCron, parseCron } from \"./cron.js\";\n\ntype ExtraOpts = Omit<NodeOptions, \"describeKind\">;\n\nfunction sourceOpts(opts?: ExtraOpts): NodeOptions {\n\treturn { describeKind: \"producer\", ...opts };\n}\n\n/** @internal kept for toArray which is an operator, not a producer */\nfunction operatorOpts(opts?: ExtraOpts): NodeOptions {\n\treturn { describeKind: \"operator\", ...opts };\n}\n\n/** Options for {@link fromTimer} / {@link fromPromise} / {@link fromAsyncIter}. */\nexport type AsyncSourceOpts = ExtraOpts & { signal?: AbortSignal };\n\n/**\n * Values accepted by {@link fromAny}.\n *\n * @category extra\n */\nexport type NodeInput<T> = Node<T> | PromiseLike<T> | AsyncIterable<T> | Iterable<T> | T;\n\n/** Options for {@link fromCron}. */\nexport type FromCronOptions = ExtraOpts & {\n\t/** Polling interval in ms. Default `60_000`. */\n\ttickMs?: number;\n\t/** Output format: `\"timestamp_ns\"` (default) emits wall-clock nanoseconds; `\"date\"` emits a `Date` object. */\n\toutput?: \"timestamp_ns\" | \"date\";\n};\n\n/** DOM-style event target (browser or `node:events`). */\nexport type EventTargetLike = {\n\taddEventListener(\n\t\ttype: string,\n\t\tlistener: (ev: unknown) => void,\n\t\toptions?: boolean | { capture?: boolean; passive?: boolean; once?: boolean },\n\t): void;\n\tremoveEventListener(\n\t\ttype: string,\n\t\tlistener: (ev: unknown) => void,\n\t\toptions?: boolean | { capture?: boolean; passive?: boolean; once?: boolean },\n\t): void;\n};\n\nexport type FSEventType = \"change\" | \"rename\" | \"create\" | \"delete\";\nexport type FSEvent = {\n\ttype: FSEventType;\n\tpath: string;\n\troot: string;\n\trelative_path: string;\n\tsrc_path?: string;\n\tdest_path?: string;\n\ttimestamp_ns: number;\n};\n\nexport type FromFSWatchOptions = ExtraOpts & {\n\trecursive?: boolean;\n\tdebounce?: number;\n\tinclude?: string[];\n\texclude?: string[];\n};\n\n/** @internal Shared with adapters.ts for glob matching in fromFSWatch / fromGitHook. */\nexport function escapeRegexChar(ch: string): string {\n\treturn /[\\\\^$+?.()|[\\]{}]/.test(ch) ? `\\\\${ch}` : ch;\n}\n\n/** @internal */\nexport function globToRegExp(glob: string): RegExp {\n\tlet out = \"^\";\n\tfor (let i = 0; i < glob.length; i += 1) {\n\t\tconst ch = glob[i];\n\t\tif (ch === \"*\") {\n\t\t\tconst next = glob[i + 1];\n\t\t\tif (next === \"*\") {\n\t\t\t\tout += \".*\";\n\t\t\t\ti += 1;\n\t\t\t} else {\n\t\t\t\tout += \"[^/]*\";\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tout += escapeRegexChar(ch);\n\t}\n\tout += \"$\";\n\treturn new RegExp(out);\n}\n\n/** @internal */\nexport function matchesAnyPattern(path: string, patterns: RegExp[]): boolean {\n\tfor (const pattern of patterns) {\n\t\tif (pattern.test(path)) return true;\n\t}\n\treturn false;\n}\n\nfunction wrapSubscribeHook<T>(inner: Node<T>, before: (sink: NodeSink) => void): Node<T> {\n\tconst wrapper = node<T>([inner], ([val]) => val as T, {\n\t\tdescribeKind: \"operator\",\n\t\tinitial: inner.get(),\n\t});\n\tconst origSubscribe = wrapper.subscribe.bind(wrapper);\n\t(wrapper as { subscribe: typeof wrapper.subscribe }).subscribe = (sink, hints) => {\n\t\tbefore(sink);\n\t\treturn origSubscribe(sink, hints);\n\t};\n\treturn wrapper;\n}\n\n/**\n * Builds a timer-driven source: one-shot (first tick then `COMPLETE`) or periodic (`0`, `1`, `2`, …).\n *\n * @param ms - Milliseconds before the first emission.\n * @param opts - Producer options plus optional `period` for repeating ticks and optional `signal` (`AbortSignal`) to cancel with `ERROR`.\n * @returns `Node<number>` — tick counter from `0`; teardown clears timers.\n *\n * @example\n * ```ts\n * import { fromTimer } from \"@graphrefly/graphrefly-ts\";\n *\n * fromTimer(250, { period: 1_000 });\n * ```\n *\n * @category extra\n */\nexport function fromTimer(ms: number, opts?: AsyncSourceOpts & { period?: number }): Node<number> {\n\tconst { signal, period, ...rest } = opts ?? {};\n\treturn producer<number>((_d, a) => {\n\t\tlet done = false;\n\t\tlet count = 0;\n\t\tlet t: ReturnType<typeof setTimeout> | undefined;\n\t\tlet iv: ReturnType<typeof setInterval> | undefined;\n\t\tconst cleanup = () => {\n\t\t\tdone = true;\n\t\t\tif (t !== undefined) clearTimeout(t);\n\t\t\tif (iv !== undefined) clearInterval(iv);\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t};\n\t\tconst finish = () => {\n\t\t\tif (done) return;\n\t\t\ta.emit(count++);\n\t\t\tif (period != null) {\n\t\t\t\tiv = setInterval(() => {\n\t\t\t\t\tif (done) return;\n\t\t\t\t\ta.emit(count++);\n\t\t\t\t}, period);\n\t\t\t} else {\n\t\t\t\tdone = true;\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tqueueMicrotask(() => a.down([[COMPLETE]]));\n\t\t\t}\n\t\t};\n\t\tconst onAbort = () => {\n\t\t\tif (done) return;\n\t\t\tcleanup();\n\t\t\ta.down([[ERROR, signal!.reason]]);\n\t\t};\n\t\tif (signal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn;\n\t\t}\n\t\tt = setTimeout(finish, ms);\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\treturn cleanup;\n\t}, sourceOpts(rest));\n}\n\n/**\n * Polls on an interval; when the current minute matches a 5-field cron expression, emits once (see {@link parseCron}).\n *\n * @param expr - Cron string (`min hour dom month dow`).\n * @param opts - Producer options plus `tickMs` (default `60_000`) and `output` (`timestamp_ns` default, or `date` for `Date` values).\n * @returns `Node<number>` (nanosecond timestamp) or `Node<Date>` when `output: \"date\"`.\n *\n * @example\n * ```ts\n * import { fromCron } from \"@graphrefly/graphrefly-ts\";\n *\n * fromCron(\"0 9 * * 1\");\n * ```\n *\n * @category extra\n */\nexport function fromCron(expr: string, opts?: FromCronOptions & { output: \"date\" }): Node<Date>;\nexport function fromCron(expr: string, opts?: FromCronOptions): Node<number>;\nexport function fromCron(expr: string, opts?: FromCronOptions): Node<number | Date> {\n\tconst schedule: CronSchedule = parseCron(expr);\n\tconst { tickMs: tickOpt, output, ...rest } = opts ?? {};\n\tconst tickMs = tickOpt ?? 60_000;\n\tconst emitDate = output === \"date\";\n\treturn producer<number | Date>(\n\t\t(_d, a) => {\n\t\t\tlet lastFiredKey = -1;\n\t\t\tconst check = () => {\n\t\t\t\tconst now = new Date();\n\t\t\t\tconst key =\n\t\t\t\t\tnow.getFullYear() * 100_000_000 +\n\t\t\t\t\t(now.getMonth() + 1) * 1_000_000 +\n\t\t\t\t\tnow.getDate() * 10_000 +\n\t\t\t\t\tnow.getHours() * 100 +\n\t\t\t\t\tnow.getMinutes();\n\t\t\t\tif (key !== lastFiredKey && matchesCron(schedule, now)) {\n\t\t\t\t\tlastFiredKey = key;\n\t\t\t\t\ta.emit(emitDate ? now : wallClockNs());\n\t\t\t\t}\n\t\t\t};\n\t\t\tcheck();\n\t\t\tconst id = setInterval(check, tickMs);\n\t\t\treturn () => clearInterval(id);\n\t\t},\n\t\t{ ...sourceOpts(rest), name: rest.name ?? `cron:${expr}` },\n\t);\n}\n\n/**\n * Wraps a DOM-style `addEventListener` target; each event becomes a `DATA` emission.\n *\n * @param target - Object with `addEventListener` / `removeEventListener`.\n * @param type - Event name (e.g. `\"click\"`).\n * @param opts - Producer options plus listener options (`capture`, `passive`, `once`).\n * @returns `Node<T>` — event payloads; teardown removes the listener.\n *\n * @example\n * ```ts\n * import { fromEvent } from \"@graphrefly/graphrefly-ts\";\n *\n * fromEvent(document.body, \"click\");\n * ```\n *\n * @category extra\n */\nexport function fromEvent<T = unknown>(\n\ttarget: EventTargetLike,\n\ttype: string,\n\topts?: ExtraOpts & { capture?: boolean; passive?: boolean; once?: boolean },\n): Node<T> {\n\tconst { capture, passive, once, ...rest } = opts ?? {};\n\treturn producer<T>((_d, a) => {\n\t\tconst handler = (e: unknown) => {\n\t\t\ta.emit(e as T);\n\t\t};\n\t\tconst options = { capture, passive, once };\n\t\ttarget.addEventListener(type, handler, options);\n\t\treturn () => target.removeEventListener(type, handler, options);\n\t}, sourceOpts(rest));\n}\n\n/**\n * Watches filesystem paths and emits debounced change events.\n *\n * Uses `fs.watch` only (no polling fallback). Teardown closes all watchers.\n *\n * @category extra\n */\nexport function fromFSWatch(paths: string | string[], opts?: FromFSWatchOptions): Node<FSEvent> {\n\tconst list = Array.isArray(paths) ? paths : [paths];\n\tif (list.length === 0) {\n\t\tthrow new RangeError(\"fromFSWatch expects at least one path\");\n\t}\n\tconst { recursive = true, debounce = 100, include, exclude, ...rest } = opts ?? {};\n\tconst includePatterns = include?.map(globToRegExp) ?? [];\n\tconst excludePatterns = (exclude ?? [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\"]).map(\n\t\tglobToRegExp,\n\t);\n\treturn producer<FSEvent>((_d, a) => {\n\t\tconst pending = new Map<string, FSEvent>();\n\t\tconst watchers: ReturnType<typeof watch>[] = [];\n\t\tlet stopped = false;\n\t\tlet terminalEmitted = false;\n\t\tlet generation = 0;\n\t\tconst closeWatchers = () => {\n\t\t\tfor (const watcher of watchers.splice(0)) watcher.close();\n\t\t};\n\t\tconst emitError = (err: unknown) => {\n\t\t\tif (terminalEmitted) return;\n\t\t\tterminalEmitted = true;\n\t\t\tstopped = true;\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t\tpending.clear();\n\t\t\tcloseWatchers();\n\t\t\ta.down([[ERROR, err]]);\n\t\t};\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst flush = (token: number) => {\n\t\t\ttimer = undefined;\n\t\t\tif (stopped || terminalEmitted) return;\n\t\t\tif (pending.size === 0) return;\n\t\t\tconst batchMessages: Message[] = [];\n\t\t\tfor (const evt of pending.values()) batchMessages.push([DATA, evt]);\n\t\t\tpending.clear();\n\t\t\tif (stopped || terminalEmitted || token !== generation) return;\n\t\t\ta.down(batchMessages);\n\t\t};\n\t\ttry {\n\t\t\tfor (const basePath of list) {\n\t\t\t\tconst watcher = watch(\n\t\t\t\t\tbasePath,\n\t\t\t\t\t{ recursive },\n\t\t\t\t\t(eventType: \"rename\" | \"change\", fileName: string | Buffer | null) => {\n\t\t\t\t\t\tif (stopped || terminalEmitted) return;\n\t\t\t\t\t\tif (fileName == null) return;\n\t\t\t\t\t\tconst rel = String(fileName).replaceAll(\"\\\\\", \"/\");\n\t\t\t\t\t\tconst abs = resolvePath(basePath, String(fileName));\n\t\t\t\t\t\tconst normalized = abs.replaceAll(\"\\\\\", \"/\");\n\t\t\t\t\t\tconst root = resolvePath(basePath).replaceAll(\"\\\\\", \"/\");\n\t\t\t\t\t\tconst relForMatch = rel.startsWith(\"./\") ? rel.slice(2) : rel;\n\t\t\t\t\t\tconst included =\n\t\t\t\t\t\t\tincludePatterns.length === 0 ||\n\t\t\t\t\t\t\tmatchesAnyPattern(normalized, includePatterns) ||\n\t\t\t\t\t\t\tmatchesAnyPattern(relForMatch, includePatterns);\n\t\t\t\t\t\tif (!included) return;\n\t\t\t\t\t\tconst excluded =\n\t\t\t\t\t\t\tmatchesAnyPattern(normalized, excludePatterns) ||\n\t\t\t\t\t\t\tmatchesAnyPattern(relForMatch, excludePatterns);\n\t\t\t\t\t\tif (excluded) return;\n\t\t\t\t\t\tlet kind: FSEventType = \"change\";\n\t\t\t\t\t\tif (eventType === \"rename\") {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tkind = existsSync(normalized) ? \"create\" : \"delete\";\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\tkind = \"rename\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpending.set(normalized, {\n\t\t\t\t\t\t\ttype: kind,\n\t\t\t\t\t\t\tpath: normalized,\n\t\t\t\t\t\t\troot,\n\t\t\t\t\t\t\trelative_path: relForMatch,\n\t\t\t\t\t\t\ttimestamp_ns: wallClockNs(),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\t\t\t\tconst token = generation;\n\t\t\t\t\t\ttimer = setTimeout(() => flush(token), debounce);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\twatcher.on(\"error\", (err) => emitError(err));\n\t\t\t\twatchers.push(watcher);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\temitError(err);\n\t\t}\n\t\treturn () => {\n\t\t\tstopped = true;\n\t\t\tgeneration += 1;\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t\tcloseWatchers();\n\t\t\tpending.clear();\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/**\n * Drains a synchronous iterable; each item is `DATA`, then `COMPLETE`, or `ERROR` if iteration throws.\n *\n * @param iterable - Values to emit in order.\n * @param opts - Optional producer options.\n * @returns `Node<T>` — one emission per element.\n *\n * @example\n * ```ts\n * import { fromIter } from \"@graphrefly/graphrefly-ts\";\n *\n * fromIter([1, 2, 3]);\n * ```\n *\n * @category extra\n */\nexport function fromIter<T>(iterable: Iterable<T>, opts?: ExtraOpts): Node<T> {\n\treturn producer<T>((_d, a) => {\n\t\tlet cancelled = false;\n\t\ttry {\n\t\t\tfor (const x of iterable) {\n\t\t\t\tif (cancelled) return;\n\t\t\t\ta.emit(x);\n\t\t\t}\n\t\t\tif (!cancelled) a.down([[COMPLETE]]);\n\t\t} catch (e) {\n\t\t\tif (!cancelled) a.down([[ERROR, e]]);\n\t\t}\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, sourceOpts(opts));\n}\n\nfunction isThenable(x: unknown): x is PromiseLike<unknown> {\n\treturn x != null && typeof (x as PromiseLike<unknown>).then === \"function\";\n}\n\n/**\n * Lifts a Promise (or thenable) to a single-value stream: one `DATA` then `COMPLETE`, or `ERROR` on rejection.\n *\n * @param p - Promise to await.\n * @param opts - Producer options plus optional `signal` for abort → `ERROR` with reason.\n * @returns `Node<T>` — settles once.\n *\n * @example\n * ```ts\n * import { fromPromise } from \"@graphrefly/graphrefly-ts\";\n *\n * fromPromise(Promise.resolve(42));\n * ```\n *\n * @category extra\n */\nexport function fromPromise<T>(p: Promise<T> | PromiseLike<T>, opts?: AsyncSourceOpts): Node<T> {\n\tconst { signal, ...rest } = opts ?? {};\n\treturn producer<T>((_d, a) => {\n\t\tlet settled = false;\n\t\tconst onAbort = () => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\ta.down([[ERROR, signal!.reason]]);\n\t\t};\n\t\tif (signal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn;\n\t\t}\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tvoid Promise.resolve(p).then(\n\t\t\t(v) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\ta.emit(v as T);\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t},\n\t\t\t(e) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\ta.down([[ERROR, e]]);\n\t\t\t},\n\t\t);\n\t\treturn () => {\n\t\t\tsettled = true;\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/**\n * Reads an async iterable; each `next()` value becomes `DATA`; `COMPLETE` when done; `ERROR` on failure.\n *\n * @param iterable - Async source (`for await` shape).\n * @param opts - Producer options plus optional `signal` to abort the pump.\n * @returns `Node<T>` — async pull stream.\n *\n * @example\n * ```ts\n * import { fromAsyncIter } from \"@graphrefly/graphrefly-ts\";\n *\n * async function* gen() {\n * yield 1;\n * }\n * fromAsyncIter(gen());\n * ```\n *\n * @category extra\n */\nexport function fromAsyncIter<T>(iterable: AsyncIterable<T>, opts?: AsyncSourceOpts): Node<T> {\n\tconst { signal: outerSignal, ...rest } = opts ?? {};\n\treturn producer<T>((_d, a) => {\n\t\tconst ac = new AbortController();\n\t\tconst onOuterAbort = () => ac.abort(outerSignal?.reason);\n\t\tif (outerSignal?.aborted) {\n\t\t\tac.abort(outerSignal.reason);\n\t\t} else {\n\t\t\touterSignal?.addEventListener(\"abort\", onOuterAbort, { once: true });\n\t\t}\n\t\tconst signal = outerSignal ?? ac.signal;\n\t\tlet cancelled = false;\n\t\tconst it = iterable[Symbol.asyncIterator]();\n\t\tconst pump = (): void => {\n\t\t\tif (cancelled || signal.aborted) return;\n\t\t\tvoid Promise.resolve(it.next()).then(\n\t\t\t\t(step) => {\n\t\t\t\t\tif (cancelled || signal.aborted) return;\n\t\t\t\t\tif (step.done) {\n\t\t\t\t\t\tqueueMicrotask(() => a.down([[COMPLETE]]));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ta.emit(step.value as T);\n\t\t\t\t\tqueueMicrotask(pump);\n\t\t\t\t},\n\t\t\t\t(e) => {\n\t\t\t\t\tif (!cancelled && !signal.aborted) a.down([[ERROR, e]]);\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\t\tqueueMicrotask(pump);\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t\touterSignal?.removeEventListener(\"abort\", onOuterAbort);\n\t\t\tac.abort();\n\t\t\tvoid Promise.resolve(it.return?.()).catch(() => undefined);\n\t\t};\n\t}, sourceOpts(rest));\n}\n\nfunction isNode(x: unknown): x is Node {\n\treturn (\n\t\tx != null &&\n\t\ttypeof (x as Node).subscribe === \"function\" &&\n\t\ttypeof (x as Node).get === \"function\"\n\t);\n}\n\n/**\n * Coerces a value to a `Node` by shape: existing `Node` passthrough, thenable → {@link fromPromise},\n * async iterable → {@link fromAsyncIter}, sync iterable → {@link fromIter}, else scalar → {@link of}.\n *\n * @param input - Any value to wrap.\n * @param opts - Passed through when a Promise/async path is chosen.\n * @returns `Node` of the inferred element type.\n *\n * @example\n * ```ts\n * import { fromAny, state } from \"@graphrefly/graphrefly-ts\";\n *\n * fromAny(state(1));\n * fromAny(Promise.resolve(2));\n * ```\n *\n * @category extra\n */\nexport function fromAny<T>(input: NodeInput<T>, opts?: AsyncSourceOpts): Node<T> {\n\tif (isNode(input)) {\n\t\treturn input as Node<T>;\n\t}\n\tif (isThenable(input)) {\n\t\treturn fromPromise(input as PromiseLike<T>, opts);\n\t}\n\tif (input !== null && input !== undefined) {\n\t\tconst candidate = input as { [Symbol.asyncIterator]?: unknown; [Symbol.iterator]?: unknown };\n\t\tif (typeof candidate[Symbol.asyncIterator] === \"function\") {\n\t\t\treturn fromAsyncIter(input as AsyncIterable<T>, opts);\n\t\t}\n\t\tif (typeof candidate[Symbol.iterator] === \"function\") {\n\t\t\treturn fromIter(input as Iterable<T>, opts);\n\t\t}\n\t}\n\t// scalar fallback\n\treturn of(input as T);\n}\n\n/**\n * Emits each argument as `DATA` in order, then `COMPLETE` (implemented via {@link fromIter}).\n *\n * @param values - Values to emit.\n * @returns `Node<T>` — finite sequence.\n *\n * @example\n * ```ts\n * import { of } from \"@graphrefly/graphrefly-ts\";\n *\n * of(1, 2, 3);\n * ```\n *\n * @category extra\n */\nexport function of<T>(...values: T[]): Node<T> {\n\treturn fromIter(values, undefined);\n}\n\n/**\n * Completes immediately with no `DATA` (cold `EMPTY` analogue).\n *\n * @param opts - Optional producer options.\n * @returns `Node<T>` — terminal `COMPLETE` only.\n *\n * @example\n * ```ts\n * import { empty } from \"@graphrefly/graphrefly-ts\";\n *\n * empty();\n * ```\n *\n * @category extra\n */\nexport function empty<T = never>(opts?: ExtraOpts): Node<T> {\n\treturn producer<T>((_d, a) => {\n\t\ta.down([[COMPLETE]]);\n\t\treturn undefined;\n\t}, sourceOpts(opts));\n}\n\n/**\n * Never emits and never completes until teardown (cold `NEVER` analogue).\n *\n * @param opts - Optional producer options.\n * @returns `Node<T>` — silent until unsubscribed.\n *\n * @example\n * ```ts\n * import { never } from \"@graphrefly/graphrefly-ts\";\n *\n * never();\n * ```\n *\n * @category extra\n */\nexport function never<T = never>(opts?: ExtraOpts): Node<T> {\n\treturn producer<T>(() => undefined, sourceOpts(opts));\n}\n\n/**\n * Emits `ERROR` as soon as the producer starts (cold error source).\n *\n * @param err - Error payload forwarded as `ERROR` data.\n * @param opts - Optional producer options.\n * @returns `Node<never>` — terminates with `ERROR`.\n *\n * @example\n * ```ts\n * import { throwError } from \"@graphrefly/graphrefly-ts\";\n *\n * throwError(new Error(\"fail\"));\n * ```\n *\n * @category extra\n */\nexport function throwError(err: unknown, opts?: ExtraOpts): Node<never> {\n\treturn producer<never>((_d, a) => {\n\t\ta.down([[ERROR, err]]);\n\t\treturn undefined;\n\t}, sourceOpts(opts));\n}\n\n/**\n * Subscribes immediately and runs `fn` for each upstream `DATA`; returns unsubscribe.\n *\n * @param source - Upstream node.\n * @param fn - Side effect per value.\n * @param opts - Effect node options.\n * @returns Unsubscribe function (idempotent).\n *\n * @example\n * ```ts\n * import { forEach, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const u = forEach(state(1), (v) => console.log(v));\n * u();\n * ```\n *\n * @category extra\n */\nexport function forEach<T>(source: Node<T>, fn: (value: T) => void, opts?: ExtraOpts): () => void {\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...opts,\n\t\tonMessage(msg: Message, _i, _a) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tfn(msg[1] as T);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n/**\n * Buffers every `DATA`; on upstream `COMPLETE` emits one `DATA` with the full array then `COMPLETE`.\n *\n * @param source - Upstream node.\n * @param opts - Optional node options (operator describe kind).\n * @returns `Node<T[]>` — single array emission before completion.\n *\n * @example\n * ```ts\n * import { of, toArray } from \"@graphrefly/graphrefly-ts\";\n *\n * toArray(of(1, 2, 3));\n * ```\n *\n * @category extra\n */\nexport function toArray<T>(source: Node<T>, opts?: ExtraOpts): Node<T[]> {\n\tconst acc: T[] = [];\n\treturn node<T[]>([source as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg: Message, _i, a) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tacc.push(msg[1] as T);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\ta.emit([...acc]);\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n/**\n * Multicasts upstream: one subscription to `source` while this wrapper has subscribers (via {@link producer}).\n *\n * @param source - Upstream node to share.\n * @param opts - Producer options; `initial` seeds from `source.get()` when set by factory.\n * @returns `Node<T>` — hot ref-counted bridge.\n *\n * @example\n * ```ts\n * import { share, state } from \"@graphrefly/graphrefly-ts\";\n *\n * share(state(0));\n * ```\n *\n * @category extra\n */\nexport function share<T>(source: Node<T>, opts?: ExtraOpts): Node<T> {\n\treturn producer<T>(\n\t\t(_d, a) =>\n\t\t\tsource.subscribe((msgs) => {\n\t\t\t\ta.down(msgs);\n\t\t\t}),\n\t\t{ ...sourceOpts(opts), initial: source.get() },\n\t);\n}\n\n/**\n * Like {@link share} with a bounded replay buffer: new subscribers receive the last `bufferSize`\n * `DATA` payloads (as separate batches) before live updates.\n *\n * @param source - Upstream node.\n * @param bufferSize - Maximum past values to replay (≥ 1).\n * @param opts - Producer options.\n * @returns `Node<T>` — multicast with replay on subscribe.\n *\n * @example\n * ```ts\n * import { replay, state } from \"@graphrefly/graphrefly-ts\";\n *\n * replay(state(0), 3);\n * ```\n *\n * @category extra\n */\nexport function replay<T>(source: Node<T>, bufferSize: number, opts?: ExtraOpts): Node<T> {\n\tif (bufferSize < 1) throw new RangeError(\"replay expects bufferSize >= 1\");\n\tconst buf: T[] = [];\n\tconst inner = producer<T>(\n\t\t(_d, a) =>\n\t\t\tsource.subscribe((msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === DATA) {\n\t\t\t\t\t\tbuf.push(m[1] as T);\n\t\t\t\t\t\tif (buf.length > bufferSize) buf.shift();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ta.down(msgs);\n\t\t\t}),\n\t\t{ ...sourceOpts(opts), initial: source.get() },\n\t);\n\treturn wrapSubscribeHook(inner, (sink) => {\n\t\tfor (const v of buf) {\n\t\t\tsink([[DATA, v]]);\n\t\t}\n\t});\n}\n\n/**\n * {@link replay} with `bufferSize === 1` — replays the latest `DATA` to new subscribers.\n *\n * @param source - Upstream node.\n * @param opts - Producer options.\n * @returns `Node<T>` — share + last-value replay.\n *\n * @example\n * ```ts\n * import { cached, state } from \"@graphrefly/graphrefly-ts\";\n *\n * cached(state(0));\n * ```\n *\n * @category extra\n */\nexport function cached<T>(source: Node<T>, opts?: ExtraOpts): Node<T> {\n\treturn replay(source, 1, opts);\n}\n\n/**\n * Converts the first `DATA` on `source` into a Promise; rejects on `ERROR` or `COMPLETE` without data.\n *\n * @param source - Node to read once.\n * @returns Promise of the first value.\n *\n * @example\n * ```ts\n * import { firstValueFrom, of } from \"@graphrefly/graphrefly-ts\";\n *\n * await firstValueFrom(of(42));\n * ```\n *\n * @category extra\n */\nexport function firstValueFrom<T>(source: Node<T>): Promise<T> {\n\treturn new Promise<T>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tconst unsub = source.subscribe((msgs) => {\n\t\t\tfor (const m of msgs) {\n\t\t\t\tif (settled) return;\n\t\t\t\tif (m[0] === DATA) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tresolve(m[1] as T);\n\t\t\t\t\tqueueMicrotask(() => unsub());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (m[0] === ERROR) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\treject(m[1]);\n\t\t\t\t\tqueueMicrotask(() => unsub());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (m[0] === COMPLETE) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\treject(new Error(\"completed without DATA\"));\n\t\t\t\t\tqueueMicrotask(() => unsub());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n// ——————————————————————————————————————————————————————————————\n// RxJS-compatible aliases\n// ——————————————————————————————————————————————————————————————\n\n/**\n * RxJS-named alias for {@link replay} — multicast with a replay buffer of size `bufferSize`.\n *\n * @param source - Upstream node.\n * @param bufferSize - Replay depth (≥ 1).\n * @param opts - Producer options.\n * @returns Same behavior as `replay`.\n *\n * @example\n * ```ts\n * import { shareReplay, state } from \"@graphrefly/graphrefly-ts\";\n *\n * shareReplay(state(0), 5);\n * ```\n *\n * @category extra\n */\nexport const shareReplay = replay;\n","/**\n * Minimal 5-field cron parser and matcher (minute hour day-of-month month day-of-week).\n * Ported from callbag-recharge `extra/cron.ts` for `fromCron` (roadmap §2.3).\n */\nexport interface CronSchedule {\n\tminutes: Set<number>;\n\thours: Set<number>;\n\tdaysOfMonth: Set<number>;\n\tmonths: Set<number>;\n\tdaysOfWeek: Set<number>;\n}\n\nfunction parseField(field: string, min: number, max: number): Set<number> {\n\tconst result = new Set<number>();\n\tfor (const part of field.split(\",\")) {\n\t\tconst [range, stepStr] = part.split(\"/\");\n\t\tconst step = stepStr ? Number.parseInt(stepStr, 10) : 1;\n\t\tif (Number.isNaN(step) || step < 1) throw new Error(`Invalid cron step: ${part}`);\n\t\tlet start: number;\n\t\tlet end: number;\n\t\tif (range === \"*\") {\n\t\t\tstart = min;\n\t\t\tend = max;\n\t\t} else if (range.includes(\"-\")) {\n\t\t\tconst [a, b] = range.split(\"-\");\n\t\t\tstart = Number.parseInt(a, 10);\n\t\t\tend = Number.parseInt(b, 10);\n\t\t} else {\n\t\t\tstart = Number.parseInt(range, 10);\n\t\t\tend = start;\n\t\t}\n\t\tif (Number.isNaN(start) || Number.isNaN(end)) throw new Error(`Invalid cron field: ${field}`);\n\t\tif (start < min || end > max)\n\t\t\tthrow new Error(`Cron field out of range: ${field} (${min}-${max})`);\n\t\tif (start > end) throw new Error(`Invalid cron range: ${start}-${end} in ${field}`);\n\t\tfor (let i = start; i <= end; i += step) result.add(i);\n\t}\n\treturn result;\n}\n\n/**\n * Parses a standard 5-field cron expression into a {@link CronSchedule}.\n *\n * Supports `*`, ranges (`1-5`), steps (`*\\/5`, `0-30/10`), and comma-separated\n * lists. Fields are: minute (0–59), hour (0–23), day-of-month (1–31),\n * month (1–12), day-of-week (0–6, Sunday = 0).\n *\n * @param expr - Five-field whitespace-separated cron string (e.g. `\"0 9 * * 1-5\"`).\n * @returns Parsed {@link CronSchedule} with one `Set<number>` per field.\n * @throws Error when the expression does not have exactly 5 fields, contains\n * out-of-range values, or uses an invalid step.\n *\n * @example\n * ```ts\n * import { parseCron } from \"@graphrefly/graphrefly-ts\";\n *\n * const sched = parseCron(\"0 9 * * 1-5\"); // weekdays at 09:00\n * sched.hours; // Set { 9 }\n * sched.daysOfWeek; // Set { 1, 2, 3, 4, 5 }\n * ```\n */\nexport function parseCron(expr: string): CronSchedule {\n\tconst parts = expr.trim().split(/\\s+/);\n\tif (parts.length !== 5) throw new Error(`Invalid cron: expected 5 fields, got ${parts.length}`);\n\treturn {\n\t\tminutes: parseField(parts[0], 0, 59),\n\t\thours: parseField(parts[1], 0, 23),\n\t\tdaysOfMonth: parseField(parts[2], 1, 31),\n\t\tmonths: parseField(parts[3], 1, 12),\n\t\tdaysOfWeek: parseField(parts[4], 0, 6),\n\t};\n}\n\n/**\n * Returns `true` if `date` satisfies every field of `schedule`.\n *\n * @param schedule - Parsed schedule from {@link parseCron}.\n * @param date - Moment to test (local time via `getMinutes`, `getHours`, etc.).\n * @returns `true` when all five cron fields match the given date.\n *\n * @example\n * ```ts\n * import { parseCron, matchesCron } from \"@graphrefly/graphrefly-ts\";\n *\n * const sched = parseCron(\"30 8 * * 1\"); // Mondays at 08:30\n * const monday = new Date(\"2026-03-30T08:30:00\"); // a Monday\n * matchesCron(sched, monday); // true\n * ```\n */\nexport function matchesCron(schedule: CronSchedule, date: Date): boolean {\n\treturn (\n\t\tschedule.minutes.has(date.getMinutes()) &&\n\t\tschedule.hours.has(date.getHours()) &&\n\t\tschedule.daysOfMonth.has(date.getDate()) &&\n\t\tschedule.months.has(date.getMonth() + 1) &&\n\t\tschedule.daysOfWeek.has(date.getDay())\n\t);\n}\n","/**\n * Protocol, system, and ingest adapters (roadmap §5.2, §5.2c).\n *\n * Each adapter wraps an external protocol or system as a reactive {@link Node}\n * built on {@link producer} / {@link node} — no second protocol.\n *\n * **Moved from sources.ts:** fromHTTP, fromWebSocket/toWebSocket, fromWebhook,\n * toSSE, fromMCP, fromGitHook.\n *\n * **New (5.2c):** fromOTel, fromSyslog, fromStatsD, fromPrometheus,\n * fromKafka/toKafka, fromRedisStream/toRedisStream, fromCSV, fromNDJSON,\n * fromClickHouseWatch, fromPulsar/toPulsar, fromNATS/toNATS,\n * fromRabbitMQ/toRabbitMQ.\n */\n\nimport { batch } from \"../core/batch.js\";\nimport { wallClockNs } from \"../core/clock.js\";\nimport {\n\tCOMPLETE,\n\tDATA,\n\tDIRTY,\n\tERROR,\n\ttype Message,\n\tRESOLVED,\n\tTEARDOWN,\n} from \"../core/messages.js\";\nimport { type Node, type NodeOptions, node } from \"../core/node.js\";\nimport { producer, state } from \"../core/sugar.js\";\nimport { NS_PER_MS, NS_PER_SEC } from \"./backoff.js\";\nimport { type WithStatusBundle, withStatus } from \"./resilience.js\";\nimport type { AsyncSourceOpts } from \"./sources.js\";\nimport { globToRegExp, matchesAnyPattern } from \"./sources.js\";\n\n/** Structured callback for sink transport failures (Kafka, Redis, etc.). */\nexport type SinkTransportError = {\n\tstage: \"serialize\" | \"send\" | \"routing_key\";\n\terror: Error;\n\tvalue: unknown;\n};\n\ntype ExtraOpts = Omit<NodeOptions, \"describeKind\">;\n\nfunction sourceOpts(opts?: ExtraOpts): NodeOptions {\n\treturn { describeKind: \"producer\", ...opts };\n}\n\n// ——————————————————————————————————————————————————————————————\n// WebSocket adapter (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/** WebSocket-like transport accepted by {@link fromWebSocket} / {@link toWebSocket}. */\nexport type WebSocketLike = {\n\tsend(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;\n\tclose(code?: number, reason?: string): void;\n\taddEventListener(type: \"message\" | \"error\" | \"close\", listener: (ev: unknown) => void): void;\n\tremoveEventListener(type: \"message\" | \"error\" | \"close\", listener: (ev: unknown) => void): void;\n};\n\nexport type WebSocketMessageEventLike = { data: unknown };\nexport type WebSocketRegister<T> = (\n\temit: (payload: T) => void,\n\terror: (err: unknown) => void,\n\tcomplete: () => void,\n) => () => void;\n\n/**\n * Wraps a WebSocket as a GraphReFly producer source.\n *\n * Incoming socket messages are emitted as `DATA`; socket `error` emits `ERROR`; socket `close`\n * emits `COMPLETE`. Teardown detaches listeners and optionally closes the socket.\n *\n * @category extra\n */\nexport function fromWebSocket<T = unknown>(\n\tsocket: WebSocketLike,\n\topts?: ExtraOpts & {\n\t\tparse?: (payload: unknown, event: unknown) => T;\n\t\tcloseOnTeardown?: boolean;\n\t},\n): Node<T>;\nexport function fromWebSocket<T = unknown>(\n\tregister: WebSocketRegister<T>,\n\topts?: ExtraOpts & {\n\t\tparse?: (payload: unknown, event: unknown) => T;\n\t\tcloseOnTeardown?: boolean;\n\t},\n): Node<T>;\nexport function fromWebSocket<T = unknown>(\n\tsocketOrRegister: WebSocketLike | WebSocketRegister<T>,\n\topts?: ExtraOpts & {\n\t\tparse?: (payload: unknown, event: unknown) => T;\n\t\tcloseOnTeardown?: boolean;\n\t},\n): Node<T> {\n\tconst { parse, closeOnTeardown = false, ...rest } = opts ?? {};\n\treturn producer<T>((_d, a) => {\n\t\tlet active = true;\n\t\tlet cleanup: (() => void) | undefined;\n\t\tconst runCleanup = () => {\n\t\t\tconst fn = cleanup;\n\t\t\tcleanup = undefined;\n\t\t\tfn?.();\n\t\t};\n\t\tconst terminate = (message: Message) => {\n\t\t\tif (!active) return;\n\t\t\tactive = false;\n\t\t\ta.down([message]);\n\t\t\trunCleanup();\n\t\t};\n\t\tconst emit = (raw: unknown, event: unknown = raw) => {\n\t\t\tif (!active) return;\n\t\t\ttry {\n\t\t\t\tconst payload =\n\t\t\t\t\traw !== null && typeof raw === \"object\" && \"data\" in (raw as Record<string, unknown>)\n\t\t\t\t\t\t? (raw as WebSocketMessageEventLike).data\n\t\t\t\t\t\t: raw;\n\t\t\t\tconst parsed = parse ? parse(payload, event) : (payload as T);\n\t\t\t\ta.emit(parsed);\n\t\t\t} catch (err) {\n\t\t\t\tterminate([ERROR, err]);\n\t\t\t}\n\t\t};\n\t\tconst error = (err: unknown) => {\n\t\t\tterminate([ERROR, err]);\n\t\t};\n\t\tconst complete = () => {\n\t\t\tterminate([COMPLETE]);\n\t\t};\n\t\tif (typeof socketOrRegister === \"function\") {\n\t\t\ttry {\n\t\t\t\tcleanup = socketOrRegister(emit, error, complete);\n\t\t\t\tif (typeof cleanup !== \"function\") {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"fromWebSocket register contract violation: register must return cleanup callable\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tterminate([ERROR, err]);\n\t\t\t}\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t\trunCleanup();\n\t\t\t};\n\t\t}\n\n\t\tconst ws = socketOrRegister;\n\t\tconst onMessage = (event: unknown) => emit(event, event);\n\t\tconst onError = (event: unknown) => error(event);\n\t\tconst onClose = () => complete();\n\t\tws.addEventListener(\"message\", onMessage);\n\t\tws.addEventListener(\"error\", onError);\n\t\tws.addEventListener(\"close\", onClose);\n\t\tcleanup = () => {\n\t\t\tws.removeEventListener(\"message\", onMessage);\n\t\t\tws.removeEventListener(\"error\", onError);\n\t\t\tws.removeEventListener(\"close\", onClose);\n\t\t\tif (closeOnTeardown) ws.close();\n\t\t};\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\trunCleanup();\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n// ——————————————————————————————————————————————————————————————\n// Webhook adapter (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/** Registration callback for {@link fromWebhook}. */\nexport type WebhookRegister<T> = (handlers: {\n\t/** Push one webhook payload downstream as `[[DATA, payload]]`. */\n\temit: (payload: T) => void;\n\t/** Push terminal error as `[[ERROR, err]]`. */\n\terror: (err: unknown) => void;\n\t/** Push terminal completion as `[[COMPLETE]]`. */\n\tcomplete: () => void;\n}) => (() => void) | undefined;\n\n/**\n * Bridges HTTP webhook callbacks into a GraphReFly source.\n *\n * The `register` callback wires your runtime/framework callback to GraphReFly and may return a\n * cleanup function. This keeps the adapter runtime-agnostic while following the same producer\n * pattern as {@link fromEvent}.\n *\n * @param register - Registers webhook handlers (`emit`, `error`, `complete`) and optionally returns cleanup.\n * @param opts - Optional producer options.\n * @returns `Node<T>` — webhook payloads as `DATA`; teardown runs returned cleanup.\n *\n * @example\n * ```ts\n * import express from \"express\";\n * import { fromWebhook } from \"@graphrefly/graphrefly-ts\";\n *\n * type HookPayload = { event: string; data: unknown };\n * const app = express();\n * app.use(express.json());\n *\n * const hook$ = fromWebhook<HookPayload>(({ emit, error }) => {\n * const handler = (req: express.Request, res: express.Response) => {\n * try {\n * emit(req.body as HookPayload);\n * res.status(200).send(\"ok\");\n * } catch (e) {\n * error(e);\n * res.status(500).send(\"error\");\n * }\n * };\n * app.post(\"/webhook\", handler);\n * return () => {\n * // Express has no direct route-removal API in common use.\n * };\n * });\n * ```\n *\n * @example Fastify\n * ```ts\n * import Fastify from \"fastify\";\n * import { fromWebhook } from \"@graphrefly/graphrefly-ts\";\n *\n * const fastify = Fastify();\n * const hook$ = fromWebhook<any>(({ emit, error }) => {\n * const handler = async (req: any, reply: any) => {\n * try {\n * emit(req.body);\n * reply.code(200).send({ ok: true });\n * } catch (e) {\n * error(e);\n * reply.code(500).send({ ok: false });\n * }\n * };\n * fastify.post(\"/webhook\", handler);\n * return () => {};\n * });\n * ```\n *\n * @category extra\n */\nexport function fromWebhook<T = unknown>(register: WebhookRegister<T>, opts?: ExtraOpts): Node<T> {\n\treturn producer<T>((_d, a) => {\n\t\tlet active = true;\n\t\tconst emit = (payload: T) => {\n\t\t\tif (!active) return;\n\t\t\ta.emit(payload);\n\t\t};\n\t\tconst error = (err: unknown) => {\n\t\t\tif (!active) return;\n\t\t\tactive = false;\n\t\t\ta.down([[ERROR, err]]);\n\t\t};\n\t\tconst complete = () => {\n\t\t\tif (!active) return;\n\t\t\tactive = false;\n\t\t\ta.down([[COMPLETE]]);\n\t\t};\n\n\t\ttry {\n\t\t\tconst cleanup = register({ emit, error, complete });\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t\tcleanup?.();\n\t\t\t};\n\t\t} catch (err) {\n\t\t\terror(err);\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t};\n\t\t}\n\t}, sourceOpts(opts));\n}\n\n// ——————————————————————————————————————————————————————————————\n// HTTP adapter (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/**\n * Options for {@link fromHTTP}.\n *\n * @category extra\n */\nexport interface FromHTTPOptions extends AsyncSourceOpts {\n\t/** HTTP method. Default: `\"GET\"`. */\n\tmethod?: string;\n\t/** Request headers. */\n\theaders?: Record<string, string>;\n\t/** Request body (for POST/PUT/PATCH). */\n\tbody?: any;\n\t/** Transform the Response before emitting. Default: `response.json()`. */\n\ttransform?: (response: Response) => any | Promise<any>;\n\t/** Request timeout in **nanoseconds**. Default: `30s` (30 * NS_PER_SEC). */\n\ttimeoutNs?: number;\n}\n\n/**\n * Result of {@link fromHTTP}: main source plus status, error, and fetch count companions.\n *\n * @category extra\n */\nexport type HTTPBundle<T> = WithStatusBundle<T> & {\n\t/** Number of successful fetches. */\n\tfetchCount: Node<number>;\n\t/** Nanosecond wall-clock timestamp of the last successful fetch. */\n\tlastUpdated: Node<number>;\n};\n\n/**\n * Creates a one-shot fetch-based HTTP source with lifecycle tracking.\n *\n * @category extra\n */\nexport function fromHTTP<T = any>(url: string, opts?: FromHTTPOptions): HTTPBundle<T> {\n\tconst {\n\t\tmethod = \"GET\",\n\t\theaders,\n\t\tbody: bodyOpt,\n\t\ttransform = (r: Response) => r.json(),\n\t\ttimeoutNs = 30 * NS_PER_SEC,\n\t\tsignal: externalSignal,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst fetchCount = state(0, { name: `${rest.name ?? \"http\"}/fetchCount` });\n\tconst lastUpdated = state(0, { name: `${rest.name ?? \"http\"}/lastUpdated` });\n\n\tconst sourceNode = producer<T>((_d, a) => {\n\t\tlet active = true;\n\t\tconst abort = new AbortController();\n\n\t\tif (externalSignal?.aborted) {\n\t\t\ta.down([[ERROR, externalSignal.reason ?? new Error(\"Aborted\")]]);\n\t\t\treturn () => {};\n\t\t}\n\t\texternalSignal?.addEventListener(\"abort\", () => abort.abort(externalSignal.reason), {\n\t\t\tonce: true,\n\t\t});\n\n\t\tconst timeoutId = setTimeout(\n\t\t\t() => abort.abort(new Error(\"Request timeout\")),\n\t\t\tMath.ceil(timeoutNs / NS_PER_MS),\n\t\t);\n\n\t\tconst body =\n\t\t\tbodyOpt !== undefined\n\t\t\t\t? typeof bodyOpt === \"string\"\n\t\t\t\t\t? bodyOpt\n\t\t\t\t\t: JSON.stringify(bodyOpt)\n\t\t\t\t: undefined;\n\n\t\tfetch(url, { method, headers, body, signal: abort.signal })\n\t\t\t.then(async (res) => {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tif (!active) return;\n\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tthrow new Error(`HTTP ${res.status}: ${res.statusText}`);\n\t\t\t\t}\n\n\t\t\t\tconst data = await transform(res);\n\t\t\t\tif (!active) return;\n\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfetchCount.down([[DATA, (fetchCount.get() ?? 0) + 1]]);\n\t\t\t\t\tlastUpdated.down([[DATA, wallClockNs()]]);\n\t\t\t\t\ta.emit(data as T);\n\t\t\t\t});\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tif (!active) return;\n\t\t\t\tif (err.name === \"AbortError\") return;\n\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t});\n\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\tabort.abort();\n\t\t};\n\t}, sourceOpts(rest));\n\n\tconst tracked = withStatus(sourceNode);\n\n\treturn {\n\t\t...tracked,\n\t\tfetchCount,\n\t\tlastUpdated,\n\t};\n}\n\n// ——————————————————————————————————————————————————————————————\n// SSE sink (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/** Options for {@link toSSE}. */\nexport type ToSSEOptions = {\n\t/** Custom payload serializer for non-string payloads. Default: `JSON.stringify` fallback to `String(value)`. */\n\tserialize?: (value: unknown) => string;\n\t/** Event name for DATA tuples. Default: `\"data\"`. */\n\tdataEvent?: string;\n\t/** Event name for ERROR tuples. Default: `\"error\"`. */\n\terrorEvent?: string;\n\t/** Event name for COMPLETE tuples. Default: `\"complete\"`. */\n\tcompleteEvent?: string;\n\t/** Emit `event: resolved` when RESOLVED arrives. Default: `false`. */\n\tincludeResolved?: boolean;\n\t/** Emit `event: dirty` when DIRTY arrives. Default: `false`. */\n\tincludeDirty?: boolean;\n\t/** Add SSE comment keepalive frames (`: keepalive`) on an interval. Disabled when unset. */\n\tkeepAliveMs?: number;\n\t/** Optional abort signal to terminate the stream early. */\n\tsignal?: AbortSignal;\n\t/** Maps custom message types to SSE event names. */\n\teventNameResolver?: (type: symbol) => string;\n};\n\nfunction messageTypeLabel(t: symbol): string {\n\treturn Symbol.keyFor(t) ?? t.description ?? \"message\";\n}\n\nfunction serializeSseData(value: unknown, serialize: (value: unknown) => string): string {\n\tif (typeof value === \"string\") return value;\n\treturn serialize(value);\n}\n\nfunction sseFrame(event: string, data?: string): string {\n\tlet out = `event: ${event}\\n`;\n\tif (data !== undefined) {\n\t\tconst lines = data.split(/\\r?\\n/);\n\t\tfor (const line of lines) {\n\t\t\tout += `data: ${line}\\n`;\n\t\t}\n\t}\n\treturn `${out}\\n`;\n}\n\n/**\n * Creates a standard Server-Sent Events stream from node messages.\n *\n * @category extra\n */\nexport function toSSE<T>(source: Node<T>, opts?: ToSSEOptions): ReadableStream<Uint8Array> {\n\tconst {\n\t\tserialize = (value: unknown) => {\n\t\t\tif (value instanceof Error) return value.message;\n\t\t\ttry {\n\t\t\t\treturn JSON.stringify(value);\n\t\t\t} catch {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t},\n\t\tdataEvent = \"data\",\n\t\terrorEvent = \"error\",\n\t\tcompleteEvent = \"complete\",\n\t\tincludeResolved = false,\n\t\tincludeDirty = false,\n\t\tkeepAliveMs,\n\t\tsignal,\n\t\teventNameResolver = messageTypeLabel,\n\t} = opts ?? {};\n\tconst encoder = new TextEncoder();\n\tlet stop: (() => void) | undefined;\n\n\treturn new ReadableStream<Uint8Array>({\n\t\tstart(controller) {\n\t\t\tlet closed = false;\n\t\t\tlet keepAlive: ReturnType<typeof setInterval> | undefined;\n\t\t\tlet unsub: () => void = () => {};\n\t\t\tconst close = () => {\n\t\t\t\tif (closed) return;\n\t\t\t\tclosed = true;\n\t\t\t\tif (keepAlive !== undefined) clearInterval(keepAlive);\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tunsub();\n\t\t\t\tcontroller.close();\n\t\t\t};\n\t\t\tstop = close;\n\t\t\tconst write = (event: string, data?: string) => {\n\t\t\t\tif (closed) return;\n\t\t\t\tcontroller.enqueue(encoder.encode(sseFrame(event, data)));\n\t\t\t};\n\t\t\tconst onAbort = () => {\n\t\t\t\tif (closed) return;\n\t\t\t\tclose();\n\t\t\t};\n\t\t\tunsub = source.subscribe((msgs) => {\n\t\t\t\tfor (const msg of msgs) {\n\t\t\t\t\tconst t = msg[0];\n\t\t\t\t\tif (t === DATA) {\n\t\t\t\t\t\twrite(dataEvent, serializeSseData(msg[1], serialize));\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (t === ERROR) {\n\t\t\t\t\t\twrite(errorEvent, serializeSseData(msg[1], serialize));\n\t\t\t\t\t\tclose();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\t\twrite(completeEvent);\n\t\t\t\t\t\tclose();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (!includeResolved && t === RESOLVED) continue;\n\t\t\t\t\tif (!includeDirty && t === DIRTY) continue;\n\t\t\t\t\twrite(\n\t\t\t\t\t\teventNameResolver(t),\n\t\t\t\t\t\tmsg.length > 1 ? serializeSseData(msg[1], serialize) : undefined,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (keepAliveMs !== undefined && keepAliveMs > 0) {\n\t\t\t\tkeepAlive = setInterval(() => {\n\t\t\t\t\tif (closed) return;\n\t\t\t\t\tcontroller.enqueue(encoder.encode(\": keepalive\\n\\n\"));\n\t\t\t\t}, keepAliveMs);\n\t\t\t}\n\t\t\tif (signal?.aborted) onAbort();\n\t\t\telse signal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\t},\n\t\tcancel() {\n\t\t\tstop?.();\n\t\t},\n\t});\n}\n\n// ——————————————————————————————————————————————————————————————\n// WebSocket sink (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/** Options for {@link toWebSocket}. */\nexport type ToWebSocketOptions<T> = {\n\t/** Serialize DATA payloads before `socket.send(...)`. */\n\tserialize?: (value: T) => string | ArrayBufferLike | Blob | ArrayBufferView;\n\t/** Close socket when upstream emits COMPLETE. Default: `true`. */\n\tcloseOnComplete?: boolean;\n\t/** Close socket when upstream emits ERROR. Default: `true`. */\n\tcloseOnError?: boolean;\n\t/** Optional close code used when close is triggered by terminal tuples. */\n\tcloseCode?: number;\n\t/** Optional close reason used when close is triggered by terminal tuples. */\n\tcloseReason?: string;\n\t/** Structured callback for serialize/send/close transport failures. */\n\tonTransportError?: (event: ToWebSocketTransportError) => void;\n};\n\nexport type ToWebSocketTransportError = {\n\tstage: \"serialize\" | \"send\" | \"close\";\n\terror: Error;\n\tmessage: Message | undefined;\n};\n\n/**\n * Forwards upstream `DATA` payloads to a WebSocket via `send`.\n *\n * @category extra\n */\nexport function toWebSocket<T>(\n\tsource: Node<T>,\n\tsocket: WebSocketLike,\n\topts?: ToWebSocketOptions<T>,\n): () => void {\n\tconst {\n\t\tserialize = (value: T) => {\n\t\t\tif (\n\t\t\t\ttypeof value === \"string\" ||\n\t\t\t\tvalue instanceof Blob ||\n\t\t\t\tvalue instanceof ArrayBuffer ||\n\t\t\t\tArrayBuffer.isView(value)\n\t\t\t) {\n\t\t\t\treturn value as string | ArrayBufferLike | Blob | ArrayBufferView;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn JSON.stringify(value);\n\t\t\t} catch {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t},\n\t\tcloseOnComplete = true,\n\t\tcloseOnError = true,\n\t\tcloseCode,\n\t\tcloseReason,\n\t\tonTransportError,\n\t} = opts ?? {};\n\tlet closed = false;\n\tconst toError = (err: unknown): Error => (err instanceof Error ? err : new Error(String(err)));\n\tconst reportTransportError = (\n\t\tstage: \"serialize\" | \"send\" | \"close\",\n\t\terror: unknown,\n\t\tmessage: Message | undefined,\n\t) => {\n\t\tif (!onTransportError) return;\n\t\ttry {\n\t\t\tonTransportError({ stage, error: toError(error), message });\n\t\t} catch {\n\t\t\t/* user-provided hook should not throw into graph path */\n\t\t}\n\t};\n\tconst closeSocket = (message: Message) => {\n\t\tif (closed) return;\n\t\tclosed = true;\n\t\ttry {\n\t\t\tsocket.close(closeCode, closeReason);\n\t\t} catch (err) {\n\t\t\treportTransportError(\"close\", err, message);\n\t\t}\n\t};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tlet serialized: string | ArrayBufferLike | Blob | ArrayBufferView;\n\t\t\t\ttry {\n\t\t\t\t\tserialized = serialize(msg[1] as T);\n\t\t\t\t} catch (err) {\n\t\t\t\t\treportTransportError(\"serialize\", err, msg);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tsocket.send(serialized === undefined ? String(msg[1] as T) : serialized);\n\t\t\t\t} catch (err) {\n\t\t\t\t\treportTransportError(\"send\", err, msg);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === COMPLETE && closeOnComplete) {\n\t\t\t\tcloseSocket(msg);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === ERROR && closeOnError) {\n\t\t\t\tcloseSocket(msg);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——————————————————————————————————————————————————————————————\n// MCP adapter (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/**\n * Duck-typed MCP (Model Context Protocol) client — only the notification\n * registration surface is required so callers are not coupled to a specific SDK.\n */\nexport type MCPClientLike = {\n\tsetNotificationHandler(method: string, handler: (notification: unknown) => void): void;\n};\n\n/** Options for {@link fromMCP}. */\nexport type FromMCPOptions = ExtraOpts & {\n\t/** MCP notification method to subscribe to. Default `\"notifications/message\"`. */\n\tmethod?: string;\n\tonDisconnect?: (cb: (err?: unknown) => void) => void;\n};\n\n/**\n * Wraps an MCP client's server-push notifications as a reactive source.\n *\n * @category extra\n */\nexport function fromMCP<T = unknown>(client: MCPClientLike, opts?: FromMCPOptions): Node<T> {\n\tconst { method = \"notifications/message\", onDisconnect, ...rest } = opts ?? {};\n\treturn producer<T>((_d, a) => {\n\t\tlet active = true;\n\t\tclient.setNotificationHandler(method, (notification) => {\n\t\t\tif (!active) return;\n\t\t\ta.emit(notification as T);\n\t\t});\n\t\tif (onDisconnect) {\n\t\t\tonDisconnect((err?: unknown) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tactive = false;\n\t\t\t\ta.down([[ERROR, err ?? new Error(\"MCP client disconnected\")]]);\n\t\t\t});\n\t\t}\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\tclient.setNotificationHandler(method, () => {});\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n// ——————————————————————————————————————————————————————————————\n// Git adapter (from sources.ts)\n// ——————————————————————————————————————————————————————————————\n\n/** Git hook type for {@link fromGitHook}. */\nexport type GitHookType = \"post-commit\" | \"post-merge\" | \"post-checkout\" | \"post-rewrite\";\n\n/** Structured git event emitted by {@link fromGitHook}. */\nexport type GitEvent = {\n\thook: GitHookType;\n\tcommit: string;\n\tfiles: string[];\n\tmessage: string;\n\tauthor: string;\n\ttimestamp_ns: number;\n};\n\n/** Options for {@link fromGitHook}. */\nexport type FromGitHookOptions = ExtraOpts & {\n\tpollMs?: number;\n\tinclude?: string[];\n\texclude?: string[];\n};\n\n// globToRegExp, matchesAnyPattern imported from ./sources.js\n\n/**\n * Git change detection as a reactive source.\n *\n * @category extra\n */\nexport function fromGitHook(repoPath: string, opts?: FromGitHookOptions): Node<GitEvent> {\n\tconst { pollMs = 5000, include, exclude, ...rest } = opts ?? {};\n\tconst includePatterns = include?.map(globToRegExp) ?? [];\n\tconst excludePatterns = exclude?.map(globToRegExp) ?? [];\n\n\treturn producer<GitEvent>((_d, a) => {\n\t\tlet active = true;\n\t\tlet lastSeen: string;\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\n\t\tconst { execFileSync } = require(\"node:child_process\") as typeof import(\"node:child_process\");\n\n\t\tconst git = (...args: string[]): string => {\n\t\t\ttry {\n\t\t\t\treturn execFileSync(\"git\", args, { cwd: repoPath, encoding: \"utf-8\" }).trim();\n\t\t\t} catch (err) {\n\t\t\t\tif (!active) return \"\";\n\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t\tcleanup();\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t};\n\n\t\tconst cleanup = () => {\n\t\t\tactive = false;\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t};\n\n\t\tlastSeen = git(\"rev-parse\", \"HEAD\");\n\t\tif (!active) return () => {};\n\n\t\tconst schedule = () => {\n\t\t\tif (!active) return;\n\t\t\ttimer = setTimeout(check, pollMs);\n\t\t};\n\n\t\tconst check = () => {\n\t\t\tif (!active) return;\n\t\t\tconst head = git(\"rev-parse\", \"HEAD\");\n\t\t\tif (!active || !head || head === lastSeen) {\n\t\t\t\tschedule();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet files = git(\"diff\", \"--name-only\", `${lastSeen}..${head}`).split(\"\\n\").filter(Boolean);\n\t\t\tif (!active) {\n\t\t\t\tschedule();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (includePatterns.length > 0) {\n\t\t\t\tfiles = files.filter((f) => matchesAnyPattern(f, includePatterns));\n\t\t\t}\n\t\t\tif (excludePatterns.length > 0) {\n\t\t\t\tfiles = files.filter((f) => !matchesAnyPattern(f, excludePatterns));\n\t\t\t}\n\n\t\t\tconst message = git(\"log\", \"-1\", \"--format=%s\", head);\n\t\t\tif (!active) {\n\t\t\t\tschedule();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst author = git(\"log\", \"-1\", \"--format=%an\", head);\n\t\t\tif (!active) {\n\t\t\t\tschedule();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ta.emit({\n\t\t\t\thook: \"post-commit\" as GitHookType,\n\t\t\t\tcommit: head,\n\t\t\t\tfiles,\n\t\t\t\tmessage,\n\t\t\t\tauthor,\n\t\t\t\ttimestamp_ns: wallClockNs(),\n\t\t\t});\n\t\t\tlastSeen = head;\n\t\t\tschedule();\n\t\t};\n\n\t\tschedule();\n\t\treturn cleanup;\n\t}, sourceOpts(rest));\n}\n\n// ——————————————————————————————————————————————————————————————\n// 5.2c — Ingest adapters (universal source layer)\n// ——————————————————————————————————————————————————————————————\n\n// ——— Shared helpers ———\n\n/** Standard handler triple for adapters that accept injected registrations. */\nexport type AdapterHandlers<T> = {\n\temit: (payload: T) => void;\n\terror: (err: unknown) => void;\n\tcomplete: () => void;\n};\n\n// ——— OpenTelemetry (OTLP/HTTP) ———\n\n/** Structured OTel span. */\nexport type OTelSpan = {\n\ttraceId: string;\n\tspanId: string;\n\toperationName: string;\n\tserviceName: string;\n\tstartTimeNs: number;\n\tendTimeNs: number;\n\tstatus: \"OK\" | \"ERROR\" | \"UNSET\";\n\tattributes: Record<string, unknown>;\n\tevents: Array<{ name: string; timestampNs: number; attributes?: Record<string, unknown> }>;\n};\n\n/** Structured OTel metric data point. */\nexport type OTelMetric = {\n\tname: string;\n\tdescription?: string;\n\tunit?: string;\n\ttype: \"gauge\" | \"sum\" | \"histogram\" | \"summary\";\n\tvalue: number;\n\tattributes: Record<string, unknown>;\n\ttimestampNs: number;\n};\n\n/** Structured OTel log record. */\nexport type OTelLog = {\n\ttimestampNs: number;\n\tseverityNumber?: number;\n\tseverityText?: string;\n\tbody: unknown;\n\tattributes: Record<string, unknown>;\n\ttraceId?: string;\n\tspanId?: string;\n};\n\n/** Registration callback for the OTLP/HTTP receiver. */\nexport type OTelRegister = (handlers: {\n\tonTraces: (spans: OTelSpan[]) => void;\n\tonMetrics: (metrics: OTelMetric[]) => void;\n\tonLogs: (logs: OTelLog[]) => void;\n\tonError: (err: unknown) => void;\n}) => (() => void) | undefined;\n\n/** Options for {@link fromOTel}. */\nexport type FromOTelOptions = ExtraOpts & {};\n\n/** Bundle returned by {@link fromOTel}. */\nexport type OTelBundle = {\n\ttraces: Node<OTelSpan>;\n\tmetrics: Node<OTelMetric>;\n\tlogs: Node<OTelLog>;\n};\n\n/**\n * OTLP/HTTP receiver — accepts traces, metrics, and logs as separate reactive nodes.\n *\n * The caller owns the HTTP server. `fromOTel` receives a `register` callback that\n * wires OTLP POST endpoints to the three signal handlers. Each signal type gets\n * its own `Node` so downstream can subscribe selectively.\n *\n * @param register - Wires OTLP HTTP routes to `onTraces`, `onMetrics`, `onLogs` handlers.\n * @param opts - Optional producer options.\n * @returns {@link OTelBundle} — `{ traces, metrics, logs }` nodes.\n *\n * @example\n * ```ts\n * import express from \"express\";\n * import { fromOTel } from \"@graphrefly/graphrefly-ts\";\n *\n * const app = express();\n * app.use(express.json());\n *\n * const otel = fromOTel(({ onTraces, onMetrics, onLogs }) => {\n * app.post(\"/v1/traces\", (req, res) => { onTraces(req.body.resourceSpans ?? []); res.sendStatus(200); });\n * app.post(\"/v1/metrics\", (req, res) => { onMetrics(req.body.resourceMetrics ?? []); res.sendStatus(200); });\n * app.post(\"/v1/logs\", (req, res) => { onLogs(req.body.resourceLogs ?? []); res.sendStatus(200); });\n * return () => {};\n * });\n * ```\n *\n * @category extra\n */\nexport function fromOTel(register: OTelRegister, opts?: FromOTelOptions): OTelBundle {\n\tlet registerCleanup: (() => void) | undefined;\n\tlet active = true;\n\tlet teardownCount = 0;\n\n\tconst teardownOne = () => {\n\t\tteardownCount++;\n\t\tif (teardownCount >= 3 && registerCleanup) {\n\t\t\tregisterCleanup();\n\t\t\tregisterCleanup = undefined;\n\t\t}\n\t};\n\n\tconst traces = producer<OTelSpan>(\n\t\t(_d, _a) => () => {\n\t\t\tactive = false;\n\t\t\tteardownOne();\n\t\t},\n\t\tsourceOpts(opts),\n\t);\n\tconst metrics = producer<OTelMetric>(\n\t\t(_d, _a) => () => {\n\t\t\tactive = false;\n\t\t\tteardownOne();\n\t\t},\n\t\tsourceOpts(opts),\n\t);\n\tconst logs = producer<OTelLog>(\n\t\t(_d, _a) => () => {\n\t\t\tactive = false;\n\t\t\tteardownOne();\n\t\t},\n\t\tsourceOpts(opts),\n\t);\n\n\t// Wire registration — each handler batch-emits into the corresponding node.\n\tregisterCleanup =\n\t\tregister({\n\t\t\tonTraces: (spans) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const span of spans) traces.down([[DATA, span]]);\n\t\t\t\t});\n\t\t\t},\n\t\t\tonMetrics: (ms) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const m of ms) metrics.down([[DATA, m]]);\n\t\t\t\t});\n\t\t\t},\n\t\t\tonLogs: (ls) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const l of ls) logs.down([[DATA, l]]);\n\t\t\t\t});\n\t\t\t},\n\t\t\tonError: (err) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tactive = false;\n\t\t\t\ttraces.down([[ERROR, err]]);\n\t\t\t\tmetrics.down([[ERROR, err]]);\n\t\t\t\tlogs.down([[ERROR, err]]);\n\t\t\t},\n\t\t}) ?? undefined;\n\n\treturn { traces, metrics, logs };\n}\n\n// ——— Syslog (RFC 5424) ———\n\n/** Parsed syslog message (RFC 5424). */\nexport type SyslogMessage = {\n\tfacility: number;\n\tseverity: number;\n\ttimestamp: string;\n\thostname: string;\n\tappName: string;\n\tprocId: string;\n\tmsgId: string;\n\tmessage: string;\n\ttimestampNs: number;\n};\n\n/** Registration callback for syslog receiver. */\nexport type SyslogRegister = (handlers: AdapterHandlers<SyslogMessage>) => (() => void) | undefined;\n\n/** Options for {@link fromSyslog}. */\nexport type FromSyslogOptions = ExtraOpts & {};\n\n/**\n * RFC 5424 syslog receiver as a reactive source.\n *\n * The caller owns the UDP/TCP socket. `fromSyslog` receives a `register` callback\n * that wires socket data events to the `emit` handler with parsed syslog messages.\n *\n * @param register - Wires socket to emit/error/complete handlers.\n * @param opts - Optional producer options.\n * @returns `Node<SyslogMessage>` — one `DATA` per syslog message.\n *\n * @example\n * ```ts\n * import dgram from \"node:dgram\";\n * import { fromSyslog, parseSyslog } from \"@graphrefly/graphrefly-ts\";\n *\n * const server = dgram.createSocket(\"udp4\");\n * const syslog$ = fromSyslog(({ emit, error }) => {\n * server.on(\"message\", (buf) => {\n * try { emit(parseSyslog(buf.toString())); }\n * catch (e) { error(e); }\n * });\n * server.bind(514);\n * return () => server.close();\n * });\n * ```\n *\n * @category extra\n */\nexport function fromSyslog(\n\tregister: SyslogRegister,\n\topts?: FromSyslogOptions,\n): Node<SyslogMessage> {\n\treturn fromWebhook<SyslogMessage>(register as WebhookRegister<SyslogMessage>, opts);\n}\n\n/**\n * Parses a raw RFC 5424 syslog line into a structured {@link SyslogMessage}.\n *\n * Format: `<PRI>VERSION TIMESTAMP HOSTNAME APP-NAME PROCID MSGID MSG`\n *\n * @category extra\n */\nexport function parseSyslog(raw: string): SyslogMessage {\n\tconst match = raw.match(/^<(\\d{1,3})>\\d?\\s*(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s*(.*)/s);\n\tif (!match) {\n\t\tconst nowNs = wallClockNs();\n\t\treturn {\n\t\t\tfacility: 1,\n\t\t\tseverity: 6,\n\t\t\ttimestamp: new Date(Math.floor(nowNs / 1_000_000)).toISOString(),\n\t\t\thostname: \"-\",\n\t\t\tappName: \"-\",\n\t\t\tprocId: \"-\",\n\t\t\tmsgId: \"-\",\n\t\t\tmessage: raw.trim(),\n\t\t\ttimestampNs: nowNs,\n\t\t};\n\t}\n\tconst pri = Number(match[1]);\n\treturn {\n\t\tfacility: pri >> 3,\n\t\tseverity: pri & 7,\n\t\ttimestamp: match[2],\n\t\thostname: match[3],\n\t\tappName: match[4],\n\t\tprocId: match[5],\n\t\tmsgId: match[6],\n\t\tmessage: (match[7] ?? \"\").trim(),\n\t\ttimestampNs: wallClockNs(),\n\t};\n}\n\n// ——— StatsD / DogStatsD ———\n\n/** Parsed StatsD metric. */\nexport type StatsDMetric = {\n\tname: string;\n\tvalue: number;\n\ttype: \"counter\" | \"gauge\" | \"timer\" | \"histogram\" | \"set\" | \"distribution\";\n\tsampleRate?: number;\n\ttags: Record<string, string>;\n\ttimestampNs: number;\n};\n\n/** Registration callback for StatsD receiver. */\nexport type StatsDRegister = (handlers: AdapterHandlers<StatsDMetric>) => (() => void) | undefined;\n\n/** Options for {@link fromStatsD}. */\nexport type FromStatsDOptions = ExtraOpts & {};\n\n/**\n * StatsD/DogStatsD UDP receiver as a reactive source.\n *\n * The caller owns the UDP socket. `fromStatsD` receives a `register` callback\n * that wires datagrams to the `emit` handler with parsed metrics.\n *\n * @param register - Wires socket to emit/error/complete handlers.\n * @param opts - Optional producer options.\n * @returns `Node<StatsDMetric>` — one `DATA` per metric line.\n *\n * @example\n * ```ts\n * import dgram from \"node:dgram\";\n * import { fromStatsD, parseStatsD } from \"@graphrefly/graphrefly-ts\";\n *\n * const server = dgram.createSocket(\"udp4\");\n * const stats$ = fromStatsD(({ emit, error }) => {\n * server.on(\"message\", (buf) => {\n * for (const line of buf.toString().split(\"\\\\n\")) {\n * if (line.trim()) {\n * try { emit(parseStatsD(line)); }\n * catch (e) { error(e); }\n * }\n * }\n * });\n * server.bind(8125);\n * return () => server.close();\n * });\n * ```\n *\n * @category extra\n */\nexport function fromStatsD(register: StatsDRegister, opts?: FromStatsDOptions): Node<StatsDMetric> {\n\treturn fromWebhook<StatsDMetric>(register as WebhookRegister<StatsDMetric>, opts);\n}\n\nconst STATSD_TYPES: Record<string, StatsDMetric[\"type\"]> = {\n\tc: \"counter\",\n\tg: \"gauge\",\n\tms: \"timer\",\n\th: \"histogram\",\n\ts: \"set\",\n\td: \"distribution\",\n};\n\n/**\n * Parses a raw StatsD/DogStatsD line into a structured {@link StatsDMetric}.\n *\n * Format: `metric.name:value|type|@sampleRate|#tag1:val1,tag2:val2`\n *\n * @category extra\n */\nexport function parseStatsD(line: string): StatsDMetric {\n\tconst parts = line.split(\"|\");\n\tconst [name, valueStr] = (parts[0] ?? \"\").split(\":\");\n\tif (!name || valueStr === undefined) {\n\t\tthrow new Error(`Invalid StatsD line: ${line}`);\n\t}\n\tconst typeCode = parts[1]?.trim() ?? \"c\";\n\tconst type = STATSD_TYPES[typeCode] ?? \"counter\";\n\t// Set type uses string identifiers (e.g. unique user IDs), not numeric values.\n\tconst value = type === \"set\" ? 0 : Number(valueStr);\n\n\tlet sampleRate: number | undefined;\n\tconst tags: Record<string, string> = {};\n\n\tfor (let i = 2; i < parts.length; i++) {\n\t\tconst part = parts[i].trim();\n\t\tif (part.startsWith(\"@\")) {\n\t\t\tsampleRate = Number(part.slice(1));\n\t\t} else if (part.startsWith(\"#\")) {\n\t\t\tfor (const tag of part.slice(1).split(\",\")) {\n\t\t\t\tconst [k, v] = tag.split(\":\");\n\t\t\t\tif (k) tags[k] = v ?? \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { name: name.trim(), value, type, sampleRate, tags, timestampNs: wallClockNs() };\n}\n\n// ——— Prometheus scrape ———\n\n/** Parsed Prometheus metric. */\nexport type PrometheusMetric = {\n\tname: string;\n\tlabels: Record<string, string>;\n\tvalue: number;\n\ttimestampMs?: number;\n\ttype?: \"counter\" | \"gauge\" | \"histogram\" | \"summary\" | \"untyped\";\n\thelp?: string;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromPrometheus}. */\nexport type FromPrometheusOptions = AsyncSourceOpts & {\n\t/** Scrape interval in nanoseconds. Default `15 * NS_PER_SEC` (15s). */\n\tintervalNs?: number;\n\t/** Request headers for the scrape. */\n\theaders?: Record<string, string>;\n\t/** Request timeout in nanoseconds. Default `10 * NS_PER_SEC` (10s). */\n\ttimeoutNs?: number;\n};\n\n/**\n * Scrapes a Prometheus `/metrics` endpoint on a reactive timer interval.\n *\n * Each scrape parses the exposition format and emits one `DATA` per metric line.\n * Uses `fromTimer` semantics internally (reactive timer source, not polling).\n *\n * @param endpoint - URL of the Prometheus metrics endpoint.\n * @param opts - Scrape interval, headers, timeout.\n * @returns `Node<PrometheusMetric>` — one `DATA` per metric per scrape.\n *\n * @example\n * ```ts\n * import { fromPrometheus } from \"@graphrefly/graphrefly-ts\";\n *\n * const prom$ = fromPrometheus(\"http://localhost:9090/metrics\", { intervalNs: 30 * NS_PER_SEC });\n * ```\n *\n * @category extra\n */\nexport function fromPrometheus(\n\tendpoint: string,\n\topts?: FromPrometheusOptions,\n): Node<PrometheusMetric> {\n\tconst {\n\t\tintervalNs = 15 * NS_PER_SEC,\n\t\theaders,\n\t\ttimeoutNs = 10 * NS_PER_SEC,\n\t\tsignal: externalSignal,\n\t\t...rest\n\t} = opts ?? {};\n\tconst intervalMs = Math.ceil(intervalNs / NS_PER_MS);\n\n\treturn producer<PrometheusMetric>((_d, a) => {\n\t\tlet active = true;\n\t\tlet running = false;\n\t\tlet timer: ReturnType<typeof setInterval> | undefined;\n\n\t\tconst cleanup = () => {\n\t\t\tactive = false;\n\t\t\tif (timer !== undefined) {\n\t\t\t\tclearInterval(timer);\n\t\t\t\ttimer = undefined;\n\t\t\t}\n\t\t};\n\n\t\tconst scrape = async () => {\n\t\t\tif (!active || running) return;\n\t\t\trunning = true;\n\t\t\tconst abort = new AbortController();\n\t\t\tconst timeoutId = setTimeout(\n\t\t\t\t() => abort.abort(new Error(\"Scrape timeout\")),\n\t\t\t\tMath.ceil(timeoutNs / NS_PER_MS),\n\t\t\t);\n\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(endpoint, {\n\t\t\t\t\theaders: { Accept: \"text/plain\", ...headers },\n\t\t\t\t\tsignal: abort.signal,\n\t\t\t\t});\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tif (!active) return;\n\t\t\t\tif (!res.ok) throw new Error(`Prometheus scrape ${res.status}: ${res.statusText}`);\n\n\t\t\t\tconst text = await res.text();\n\t\t\t\tif (!active) return;\n\n\t\t\t\tconst metrics = parsePrometheusText(text);\n\t\t\t\tfor (const m of metrics) a.emit(m);\n\t\t\t} catch (err) {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tif (!active) return;\n\t\t\t\tif (err instanceof Error && err.name === \"AbortError\") return;\n\t\t\t\tcleanup();\n\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t} finally {\n\t\t\t\trunning = false;\n\t\t\t}\n\t\t};\n\n\t\tconst onAbort = () => {\n\t\t\tif (!active) return;\n\t\t\tcleanup();\n\t\t\ta.down([[ERROR, externalSignal?.reason ?? new Error(\"Aborted\")]]);\n\t\t};\n\n\t\tif (externalSignal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn () => {};\n\t\t}\n\t\texternalSignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t// Initial scrape + periodic.\n\t\tvoid scrape();\n\t\ttimer = setInterval(() => void scrape(), intervalMs);\n\n\t\treturn () => {\n\t\t\tcleanup();\n\t\t\texternalSignal?.removeEventListener(\"abort\", onAbort);\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/**\n * Parses Prometheus exposition format text into structured metrics.\n *\n * @category extra\n */\nexport function parsePrometheusText(text: string): PrometheusMetric[] {\n\tconst results: PrometheusMetric[] = [];\n\tconst types = new Map<string, string>();\n\tconst helps = new Map<string, string>();\n\n\tfor (const rawLine of text.split(\"\\n\")) {\n\t\tconst line = rawLine.trim();\n\t\tif (!line) continue;\n\n\t\tif (line.startsWith(\"# TYPE \")) {\n\t\t\tconst rest = line.slice(7);\n\t\t\tconst spaceIdx = rest.indexOf(\" \");\n\t\t\tif (spaceIdx > 0) {\n\t\t\t\ttypes.set(rest.slice(0, spaceIdx), rest.slice(spaceIdx + 1).trim());\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (line.startsWith(\"# HELP \")) {\n\t\t\tconst rest = line.slice(7);\n\t\t\tconst spaceIdx = rest.indexOf(\" \");\n\t\t\tif (spaceIdx > 0) {\n\t\t\t\thelps.set(rest.slice(0, spaceIdx), rest.slice(spaceIdx + 1).trim());\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (line.startsWith(\"#\")) continue;\n\n\t\t// metric_name{label=\"value\"} 123 timestamp?\n\t\tlet name: string;\n\t\tlet labels: Record<string, string> = {};\n\t\tlet valueStr: string;\n\t\tlet tsStr: string | undefined;\n\n\t\tconst braceIdx = line.indexOf(\"{\");\n\t\tif (braceIdx >= 0) {\n\t\t\tname = line.slice(0, braceIdx);\n\t\t\tconst closeBrace = line.indexOf(\"}\", braceIdx);\n\t\t\tif (closeBrace < 0) continue;\n\t\t\tconst labelStr = line.slice(braceIdx + 1, closeBrace);\n\t\t\tlabels = parsePrometheusLabels(labelStr);\n\t\t\tconst after = line\n\t\t\t\t.slice(closeBrace + 1)\n\t\t\t\t.trim()\n\t\t\t\t.split(/\\s+/);\n\t\t\tvalueStr = after[0] ?? \"\";\n\t\t\ttsStr = after[1];\n\t\t} else {\n\t\t\tconst parts = line.split(/\\s+/);\n\t\t\tname = parts[0] ?? \"\";\n\t\t\tvalueStr = parts[1] ?? \"\";\n\t\t\ttsStr = parts[2];\n\t\t}\n\n\t\tif (!name || !valueStr) continue;\n\n\t\tconst baseName = name.replace(/(_total|_count|_sum|_bucket|_created|_info)$/, \"\");\n\t\tresults.push({\n\t\t\tname,\n\t\t\tlabels,\n\t\t\tvalue: Number(valueStr),\n\t\t\ttimestampMs: tsStr ? Number(tsStr) : undefined,\n\t\t\ttype: (types.get(baseName) ?? types.get(name)) as PrometheusMetric[\"type\"],\n\t\t\thelp: helps.get(baseName) ?? helps.get(name),\n\t\t\ttimestampNs: wallClockNs(),\n\t\t});\n\t}\n\n\treturn results;\n}\n\nfunction parsePrometheusLabels(str: string): Record<string, string> {\n\tconst labels: Record<string, string> = {};\n\tconst re = /(\\w+)=\"((?:[^\"\\\\]|\\\\.)*)\"/g;\n\tlet m: RegExpExecArray | null = re.exec(str);\n\twhile (m !== null) {\n\t\tlabels[m[1]] = m[2].replace(/\\\\(.)/g, \"$1\");\n\t\tm = re.exec(str);\n\t}\n\treturn labels;\n}\n\n// ——— Kafka ———\n\n/** Duck-typed Kafka consumer (compatible with kafkajs, confluent-kafka, Pulsar KoP). */\nexport type KafkaConsumerLike = {\n\tsubscribe(opts: { topic: string; fromBeginning?: boolean }): Promise<void>;\n\trun(opts: {\n\t\teachMessage: (payload: {\n\t\t\ttopic: string;\n\t\t\tpartition: number;\n\t\t\tmessage: {\n\t\t\t\tkey: Buffer | null;\n\t\t\t\tvalue: Buffer | null;\n\t\t\t\theaders?: Record<string, Buffer | string | undefined>;\n\t\t\t\toffset: string;\n\t\t\t\ttimestamp: string;\n\t\t\t};\n\t\t}) => Promise<void>;\n\t}): Promise<void>;\n\tdisconnect(): Promise<void>;\n};\n\n/** Duck-typed Kafka producer. */\nexport type KafkaProducerLike = {\n\tsend(record: {\n\t\ttopic: string;\n\t\tmessages: Array<{\n\t\t\tkey?: string | Buffer | null;\n\t\t\tvalue: string | Buffer | null;\n\t\t\theaders?: Record<string, string | Buffer>;\n\t\t}>;\n\t}): Promise<void>;\n\tdisconnect(): Promise<void>;\n};\n\n/** Structured Kafka message. */\nexport type KafkaMessage<T = unknown> = {\n\ttopic: string;\n\tpartition: number;\n\tkey: string | null;\n\tvalue: T;\n\theaders: Record<string, string>;\n\toffset: string;\n\ttimestamp: string;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromKafka}. */\nexport type FromKafkaOptions = ExtraOpts & {\n\t/** Start from beginning of topic. Default: `false`. */\n\tfromBeginning?: boolean;\n\t/** Deserialize message value. Default: `JSON.parse(buffer.toString())`. */\n\tdeserialize?: (value: Buffer | null) => unknown;\n};\n\n/**\n * Kafka consumer as a reactive source.\n *\n * Wraps a KafkaJS-compatible consumer. Each message becomes a `DATA` emission.\n * Compatible with Pulsar via KoP (Kafka-on-Pulsar).\n *\n * @param consumer - KafkaJS-compatible consumer instance (caller owns connect/disconnect lifecycle).\n * @param topic - Topic to consume from.\n * @param opts - Deserialization and source options.\n * @returns `Node<KafkaMessage<T>>` — one `DATA` per Kafka message.\n *\n * @example\n * ```ts\n * import { Kafka } from \"kafkajs\";\n * import { fromKafka } from \"@graphrefly/graphrefly-ts\";\n *\n * const kafka = new Kafka({ brokers: [\"localhost:9092\"] });\n * const consumer = kafka.consumer({ groupId: \"my-group\" });\n * await consumer.connect();\n *\n * const events$ = fromKafka(consumer, \"events\", { deserialize: (buf) => JSON.parse(buf!.toString()) });\n * ```\n *\n * @category extra\n */\nexport function fromKafka<T = unknown>(\n\tconsumer: KafkaConsumerLike,\n\ttopic: string,\n\topts?: FromKafkaOptions,\n): Node<KafkaMessage<T>> {\n\tconst {\n\t\tfromBeginning = false,\n\t\tdeserialize = (buf: Buffer | null) => {\n\t\t\tif (buf === null) return null;\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(buf.toString());\n\t\t\t} catch {\n\t\t\t\treturn buf.toString();\n\t\t\t}\n\t\t},\n\t\t...rest\n\t} = opts ?? {};\n\n\treturn producer<KafkaMessage<T>>((_d, a) => {\n\t\tlet active = true;\n\n\t\tconst start = async () => {\n\t\t\ttry {\n\t\t\t\tawait consumer.subscribe({ topic, fromBeginning });\n\t\t\t\tawait consumer.run({\n\t\t\t\t\teachMessage: async ({ topic: t, partition, message: msg }) => {\n\t\t\t\t\t\tif (!active) return;\n\t\t\t\t\t\tconst headers: Record<string, string> = {};\n\t\t\t\t\t\tif (msg.headers) {\n\t\t\t\t\t\t\tfor (const [k, v] of Object.entries(msg.headers)) {\n\t\t\t\t\t\t\t\tif (v !== undefined) headers[k] = typeof v === \"string\" ? v : v.toString();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\ta.emit({\n\t\t\t\t\t\t\ttopic: t,\n\t\t\t\t\t\t\tpartition,\n\t\t\t\t\t\t\tkey: msg.key?.toString() ?? null,\n\t\t\t\t\t\t\tvalue: deserialize(msg.value) as T,\n\t\t\t\t\t\t\theaders,\n\t\t\t\t\t\t\toffset: msg.offset,\n\t\t\t\t\t\t\ttimestamp: msg.timestamp,\n\t\t\t\t\t\t\ttimestampNs: wallClockNs(),\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tif (active) a.down([[ERROR, err]]);\n\t\t\t}\n\t\t};\n\n\t\tvoid start();\n\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/** Options for {@link toKafka}. */\nexport type ToKafkaOptions<T> = ExtraOpts & {\n\t/** Serialize value for Kafka. Default: `JSON.stringify`. */\n\tserialize?: (value: T) => string | Buffer;\n\t/** Extract message key from value. Default: `null` (no key). */\n\tkeyExtractor?: (value: T) => string | null;\n\t/** Called on serialization or send failures. */\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * Kafka producer sink — forwards upstream `DATA` to a Kafka topic.\n *\n * @param source - Upstream node to forward.\n * @param kafkaProducer - KafkaJS-compatible producer instance.\n * @param topic - Target topic.\n * @param opts - Serialization and key extraction options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toKafka<T>(\n\tsource: Node<T>,\n\tkafkaProducer: KafkaProducerLike,\n\ttopic: string,\n\topts?: ToKafkaOptions<T>,\n): () => void {\n\tconst {\n\t\tserialize = (v: T) => JSON.stringify(v),\n\t\tkeyExtractor,\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tconst key = keyExtractor?.(value) ?? null;\n\t\t\t\tlet serialized: string | Buffer;\n\t\t\t\ttry {\n\t\t\t\t\tserialized = serialize(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tvoid kafkaProducer\n\t\t\t\t\t.send({\n\t\t\t\t\t\ttopic,\n\t\t\t\t\t\tmessages: [{ key, value: Buffer.from(serialized as string) }],\n\t\t\t\t\t})\n\t\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— Redis Streams ———\n\n/** Duck-typed Redis client (compatible with ioredis, redis). */\nexport type RedisClientLike = {\n\txadd(key: string, id: string, ...fieldsAndValues: string[]): Promise<string>;\n\txread(\n\t\t...args: Array<string | number>\n\t): Promise<Array<[string, Array<[string, string[]]>]> | null>;\n\tdisconnect(): void;\n};\n\n/** Structured Redis Stream entry. */\nexport type RedisStreamEntry<T = unknown> = {\n\tid: string;\n\tkey: string;\n\tdata: T;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromRedisStream}. */\nexport type FromRedisStreamOptions = ExtraOpts & {\n\t/** Block timeout in ms for XREAD. Default: `5000`. */\n\tblockMs?: number;\n\t/** Start ID. Default: `\"$\"` (new entries only). */\n\tstartId?: string;\n\t/** Parse raw Redis hash fields to structured data. Default: parses `data` field as JSON. */\n\tparse?: (fields: string[]) => unknown;\n};\n\n/**\n * Redis Streams consumer as a reactive source.\n *\n * Uses XREAD with BLOCK to reactively consume stream entries.\n *\n * @param client - ioredis/redis-compatible client (caller owns connection).\n * @param key - Redis stream key.\n * @param opts - Block timeout, start ID, and parsing options.\n * @returns `Node<RedisStreamEntry<T>>` — one `DATA` per stream entry.\n *\n * @category extra\n */\nexport function fromRedisStream<T = unknown>(\n\tclient: RedisClientLike,\n\tkey: string,\n\topts?: FromRedisStreamOptions,\n): Node<RedisStreamEntry<T>> {\n\tconst {\n\t\tblockMs = 5000,\n\t\tstartId = \"$\",\n\t\tparse = (fields: string[]) => {\n\t\t\t// Redis returns flat [field, value, field, value, ...] arrays.\n\t\t\tfor (let i = 0; i < fields.length; i += 2) {\n\t\t\t\tif (fields[i] === \"data\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn JSON.parse(fields[i + 1]);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn fields[i + 1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Return as object if no \"data\" field.\n\t\t\tconst obj: Record<string, string> = {};\n\t\t\tfor (let i = 0; i < fields.length; i += 2) {\n\t\t\t\tobj[fields[i]] = fields[i + 1];\n\t\t\t}\n\t\t\treturn obj;\n\t\t},\n\t\t...rest\n\t} = opts ?? {};\n\n\treturn producer<RedisStreamEntry<T>>((_d, a) => {\n\t\tlet active = true;\n\t\tlet lastId = startId;\n\n\t\tconst poll = async () => {\n\t\t\twhile (active) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await client.xread(\"BLOCK\", blockMs, \"STREAMS\", key, lastId);\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\tif (result) {\n\t\t\t\t\t\tfor (const [_streamKey, entries] of result) {\n\t\t\t\t\t\t\tfor (const [id, fields] of entries) {\n\t\t\t\t\t\t\t\tlastId = id;\n\t\t\t\t\t\t\t\ta.emit({\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\t\t\tdata: parse(fields) as T,\n\t\t\t\t\t\t\t\t\ttimestampNs: wallClockNs(),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvoid poll();\n\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/** Options for {@link toRedisStream}. */\nexport type ToRedisStreamOptions<T> = ExtraOpts & {\n\t/** Serialize value to Redis hash fields. Default: `[\"data\", JSON.stringify(value)]`. */\n\tserialize?: (value: T) => string[];\n\t/** Max stream length (MAXLEN ~). Default: no trimming. */\n\tmaxLen?: number;\n\t/** Called on serialization or send failures. */\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * Redis Streams producer sink — forwards upstream `DATA` to a Redis stream.\n *\n * @param source - Upstream node to forward.\n * @param client - ioredis/redis-compatible client.\n * @param key - Redis stream key.\n * @param opts - Serialization options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toRedisStream<T>(\n\tsource: Node<T>,\n\tclient: RedisClientLike,\n\tkey: string,\n\topts?: ToRedisStreamOptions<T>,\n): () => void {\n\tconst {\n\t\tserialize = (v: T) => [\"data\", JSON.stringify(v)],\n\t\tmaxLen,\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet fields: string[];\n\t\t\t\ttry {\n\t\t\t\t\tfields = serialize(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tconst send =\n\t\t\t\t\tmaxLen !== undefined\n\t\t\t\t\t\t? client.xadd(key, \"MAXLEN\", \"~\", String(maxLen), \"*\", ...fields)\n\t\t\t\t\t\t: client.xadd(key, \"*\", ...fields);\n\t\t\t\tvoid send.catch((err: unknown) => {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— CSV ingest ———\n\n/** Parsed CSV row. */\nexport type CSVRow = Record<string, string>;\n\n/** Options for {@link fromCSV}. */\nexport type FromCSVOptions = ExtraOpts & {\n\t/** Column delimiter. Default: `\",\"`. */\n\tdelimiter?: string;\n\t/** Whether the first row is a header. Default: `true`. */\n\thasHeader?: boolean;\n\t/** Explicit column names (overrides header row). */\n\tcolumns?: string[];\n\t/** Custom line parser (e.g. wrapping a library like `csv-parse`). Overrides built-in parser + delimiter. */\n\tparseLine?: (line: string) => string[];\n};\n\n/**\n * CSV file/stream ingest for batch replay.\n *\n * Reads a CSV from a `ReadableStream<string>` or an `AsyncIterable<string>` of lines,\n * emitting one `DATA` per row. `COMPLETE` after all rows are emitted.\n *\n * @param source - Async iterable of CSV text chunks (lines or multi-line chunks).\n * @param opts - Delimiter, header, and column options.\n * @returns `Node<CSVRow>` — one `DATA` per parsed row.\n *\n * @example\n * ```ts\n * import { createReadStream } from \"node:fs\";\n * import { fromCSV } from \"@graphrefly/graphrefly-ts\";\n *\n * const csv$ = fromCSV(createReadStream(\"data.csv\", \"utf-8\"));\n * ```\n *\n * @category extra\n */\nexport function fromCSV(source: AsyncIterable<string>, opts?: FromCSVOptions): Node<CSVRow> {\n\tconst {\n\t\tdelimiter = \",\",\n\t\thasHeader = true,\n\t\tcolumns: explicitColumns,\n\t\tparseLine,\n\t\t...rest\n\t} = opts ?? {};\n\tconst parse = parseLine ?? ((line: string) => parseCSVLine(line, delimiter));\n\n\treturn producer<CSVRow>((_d, a) => {\n\t\tlet cancelled = false;\n\n\t\tconst run = async () => {\n\t\t\ttry {\n\t\t\t\tlet headers: string[] | undefined = explicitColumns;\n\t\t\t\tlet buffer = \"\";\n\n\t\t\t\tfor await (const chunk of source) {\n\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\tbuffer += chunk;\n\n\t\t\t\t\tconst lines = buffer.split(/\\r?\\n/);\n\t\t\t\t\t// Keep last partial line in buffer.\n\t\t\t\t\tbuffer = lines.pop() ?? \"\";\n\n\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\t\tif (!line.trim()) continue;\n\n\t\t\t\t\t\tconst values = parse(line);\n\n\t\t\t\t\t\tif (!headers && hasHeader) {\n\t\t\t\t\t\t\theaders = values;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!headers) {\n\t\t\t\t\t\t\theaders = values.map((_, i) => `col${i}`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst row: CSVRow = {};\n\t\t\t\t\t\tfor (let i = 0; i < headers.length; i++) {\n\t\t\t\t\t\t\trow[headers[i]] = values[i] ?? \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\ta.emit(row);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Process remaining buffer.\n\t\t\t\tif (!cancelled && buffer.trim()) {\n\t\t\t\t\tconst values = parse(buffer);\n\t\t\t\t\tif (headers) {\n\t\t\t\t\t\tconst row: CSVRow = {};\n\t\t\t\t\t\tfor (let i = 0; i < headers.length; i++) {\n\t\t\t\t\t\t\trow[headers[i]] = values[i] ?? \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\ta.emit(row);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!cancelled) a.down([[COMPLETE]]);\n\t\t\t} catch (err) {\n\t\t\t\tif (!cancelled) a.down([[ERROR, err]]);\n\t\t\t}\n\t\t};\n\n\t\tvoid run();\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, sourceOpts(rest));\n}\n\nfunction parseCSVLine(line: string, delimiter: string): string[] {\n\tconst values: string[] = [];\n\tlet current = \"\";\n\tlet inQuotes = false;\n\n\tfor (let i = 0; i < line.length; i++) {\n\t\tconst ch = line[i];\n\t\tif (inQuotes) {\n\t\t\tif (ch === '\"') {\n\t\t\t\tif (line[i + 1] === '\"') {\n\t\t\t\t\tcurrent += '\"';\n\t\t\t\t\ti++;\n\t\t\t\t} else {\n\t\t\t\t\tinQuotes = false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcurrent += ch;\n\t\t\t}\n\t\t} else if (ch === '\"') {\n\t\t\tinQuotes = true;\n\t\t} else if (ch === delimiter) {\n\t\t\tvalues.push(current);\n\t\t\tcurrent = \"\";\n\t\t} else {\n\t\t\tcurrent += ch;\n\t\t}\n\t}\n\tvalues.push(current);\n\treturn values;\n}\n\n// ——— NDJSON ingest ———\n\n/** Options for {@link fromNDJSON}. */\nexport type FromNDJSONOptions = ExtraOpts & {};\n\n/**\n * Newline-delimited JSON stream ingest for batch replay.\n *\n * Reads an async iterable of text chunks, splits by newline, parses each line\n * as JSON, and emits one `DATA` per parsed object. `COMPLETE` after stream ends.\n *\n * @param source - Async iterable of NDJSON text chunks.\n * @param opts - Optional producer options.\n * @returns `Node<T>` — one `DATA` per JSON line.\n *\n * @example\n * ```ts\n * import { createReadStream } from \"node:fs\";\n * import { fromNDJSON } from \"@graphrefly/graphrefly-ts\";\n *\n * const logs$ = fromNDJSON(createReadStream(\"logs.ndjson\", \"utf-8\"));\n * ```\n *\n * @category extra\n */\nexport function fromNDJSON<T = unknown>(\n\tsource: AsyncIterable<string>,\n\topts?: FromNDJSONOptions,\n): Node<T> {\n\treturn producer<T>((_d, a) => {\n\t\tlet cancelled = false;\n\n\t\tconst run = async () => {\n\t\t\ttry {\n\t\t\t\tlet buffer = \"\";\n\n\t\t\t\tfor await (const chunk of source) {\n\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\tbuffer += chunk;\n\n\t\t\t\t\tconst lines = buffer.split(/\\r?\\n/);\n\t\t\t\t\tbuffer = lines.pop() ?? \"\";\n\n\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\t\tconst trimmed = line.trim();\n\t\t\t\t\t\tif (!trimmed) continue;\n\t\t\t\t\t\ta.emit(JSON.parse(trimmed) as T);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Process remaining buffer.\n\t\t\t\tif (!cancelled && buffer.trim()) {\n\t\t\t\t\ta.emit(JSON.parse(buffer.trim()) as T);\n\t\t\t\t}\n\n\t\t\t\tif (!cancelled) a.down([[COMPLETE]]);\n\t\t\t} catch (err) {\n\t\t\t\tif (!cancelled) a.down([[ERROR, err]]);\n\t\t\t}\n\t\t};\n\n\t\tvoid run();\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, sourceOpts(opts));\n}\n\n// ——— ClickHouse live materialized view ———\n\n/** Structured ClickHouse query result row. */\nexport type ClickHouseRow = Record<string, unknown>;\n\n/** Duck-typed ClickHouse client. */\nexport type ClickHouseClientLike = {\n\tquery(opts: { query: string; format?: string }): Promise<{\n\t\tjson<T = unknown>(): Promise<T[]>;\n\t}>;\n};\n\n/** Options for {@link fromClickHouseWatch}. */\nexport type FromClickHouseWatchOptions = AsyncSourceOpts & {\n\t/** Polling interval in nanoseconds. Default: `5 * NS_PER_SEC` (5s). */\n\tintervalNs?: number;\n\t/** JSON format to request. Default: `\"JSONEachRow\"`. */\n\tformat?: string;\n};\n\n/**\n * ClickHouse live materialized view as a reactive source.\n *\n * Polls a ClickHouse query on a reactive timer interval and emits new/changed rows.\n * Uses a timer-driven approach (not busy-wait polling).\n *\n * @param client - ClickHouse client instance (caller owns connection).\n * @param query - SQL query to execute on each interval.\n * @param opts - Polling interval and format options.\n * @returns `Node<ClickHouseRow>` — one `DATA` per result row per scrape.\n *\n * @example\n * ```ts\n * import { createClient } from \"@clickhouse/client\";\n * import { fromClickHouseWatch } from \"@graphrefly/graphrefly-ts\";\n *\n * const client = createClient({ url: \"http://localhost:8123\" });\n * const rows$ = fromClickHouseWatch(client, \"SELECT * FROM errors_mv ORDER BY timestamp DESC LIMIT 100\");\n * ```\n *\n * @category extra\n */\nexport function fromClickHouseWatch(\n\tclient: ClickHouseClientLike,\n\tquery: string,\n\topts?: FromClickHouseWatchOptions,\n): Node<ClickHouseRow> {\n\tconst {\n\t\tintervalNs = 5 * NS_PER_SEC,\n\t\tformat = \"JSONEachRow\",\n\t\tsignal: externalSignal,\n\t\t...rest\n\t} = opts ?? {};\n\tconst intervalMs = Math.ceil(intervalNs / NS_PER_MS);\n\n\treturn producer<ClickHouseRow>((_d, a) => {\n\t\tlet active = true;\n\t\tlet running = false;\n\t\tlet timer: ReturnType<typeof setInterval> | undefined;\n\n\t\tconst cleanup = () => {\n\t\t\tactive = false;\n\t\t\tif (timer !== undefined) {\n\t\t\t\tclearInterval(timer);\n\t\t\t\ttimer = undefined;\n\t\t\t}\n\t\t};\n\n\t\tconst execute = async () => {\n\t\t\tif (!active || running) return;\n\t\t\trunning = true;\n\t\t\ttry {\n\t\t\t\tconst result = await client.query({ query, format });\n\t\t\t\tif (!active) return;\n\t\t\t\tconst rows = await result.json<ClickHouseRow>();\n\t\t\t\tif (!active) return;\n\t\t\t\tfor (const row of rows) a.emit(row);\n\t\t\t} catch (err) {\n\t\t\t\tif (!active) return;\n\t\t\t\tcleanup();\n\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t} finally {\n\t\t\t\trunning = false;\n\t\t\t}\n\t\t};\n\n\t\tconst onAbort = () => {\n\t\t\tif (!active) return;\n\t\t\tcleanup();\n\t\t\ta.down([[ERROR, externalSignal?.reason ?? new Error(\"Aborted\")]]);\n\t\t};\n\n\t\tif (externalSignal?.aborted) {\n\t\t\tonAbort();\n\t\t\treturn () => {};\n\t\t}\n\t\texternalSignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\tvoid execute();\n\t\ttimer = setInterval(() => void execute(), intervalMs);\n\n\t\treturn () => {\n\t\t\tcleanup();\n\t\t\texternalSignal?.removeEventListener(\"abort\", onAbort);\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n// ——— Apache Pulsar (native client) ———\n\n/** Duck-typed Pulsar consumer (compatible with pulsar-client). */\nexport type PulsarConsumerLike = {\n\treceive(): Promise<{\n\t\tgetData(): Buffer;\n\t\tgetMessageId(): { toString(): string };\n\t\tgetPartitionKey(): string;\n\t\tgetProperties(): Record<string, string>;\n\t\tgetPublishTimestamp(): number;\n\t\tgetEventTimestamp(): number;\n\t\tgetTopicName(): string;\n\t}>;\n\tacknowledge(msg: unknown): Promise<void>;\n\tclose(): Promise<void>;\n};\n\n/** Duck-typed Pulsar producer. */\nexport type PulsarProducerLike = {\n\tsend(msg: {\n\t\tdata: Buffer;\n\t\tpartitionKey?: string;\n\t\tproperties?: Record<string, string>;\n\t}): Promise<void>;\n\tclose(): Promise<void>;\n};\n\n/** Structured Pulsar message. */\nexport type PulsarMessage<T = unknown> = {\n\ttopic: string;\n\tmessageId: string;\n\tkey: string;\n\tvalue: T;\n\tproperties: Record<string, string>;\n\tpublishTime: number;\n\teventTime: number;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromPulsar}. */\nexport type FromPulsarOptions = ExtraOpts & {\n\t/** Deserialize message data. Default: `JSON.parse(buffer.toString())`. */\n\tdeserialize?: (data: Buffer) => unknown;\n\t/** Acknowledge messages automatically. Default: `true`. */\n\tautoAck?: boolean;\n};\n\n/**\n * Apache Pulsar consumer as a reactive source (native client).\n *\n * Wraps a `pulsar-client`-compatible consumer. Each message becomes a `DATA` emission.\n * For Kafka-on-Pulsar (KoP), use {@link fromKafka} instead.\n *\n * @param consumer - Pulsar consumer instance (caller owns create/close lifecycle).\n * @param opts - Deserialization and source options.\n * @returns `Node<PulsarMessage<T>>` — one `DATA` per Pulsar message.\n *\n * @remarks\n * Teardown sets an internal flag but cannot interrupt a pending `consumer.receive()`.\n * The loop exits on the next message or when the consumer is closed externally.\n * Callers should call `consumer.close()` after unsubscribing for prompt cleanup.\n *\n * @example\n * ```ts\n * import Pulsar from \"pulsar-client\";\n * import { fromPulsar } from \"@graphrefly/graphrefly-ts\";\n *\n * const client = new Pulsar.Client({ serviceUrl: \"pulsar://localhost:6650\" });\n * const consumer = await client.subscribe({ topic: \"events\", subscription: \"my-sub\" });\n * const events$ = fromPulsar(consumer);\n * ```\n *\n * @category extra\n */\nexport function fromPulsar<T = unknown>(\n\tconsumer: PulsarConsumerLike,\n\topts?: FromPulsarOptions,\n): Node<PulsarMessage<T>> {\n\tconst {\n\t\tautoAck = true,\n\t\tdeserialize = (buf: Buffer) => {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(buf.toString());\n\t\t\t} catch {\n\t\t\t\treturn buf.toString();\n\t\t\t}\n\t\t},\n\t\t...rest\n\t} = opts ?? {};\n\n\treturn producer<PulsarMessage<T>>((_d, a) => {\n\t\tlet active = true;\n\n\t\tconst loop = async () => {\n\t\t\twhile (active) {\n\t\t\t\ttry {\n\t\t\t\t\tconst msg = await consumer.receive();\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\ta.emit({\n\t\t\t\t\t\ttopic: msg.getTopicName(),\n\t\t\t\t\t\tmessageId: msg.getMessageId().toString(),\n\t\t\t\t\t\tkey: msg.getPartitionKey(),\n\t\t\t\t\t\tvalue: deserialize(msg.getData()) as T,\n\t\t\t\t\t\tproperties: msg.getProperties(),\n\t\t\t\t\t\tpublishTime: msg.getPublishTimestamp(),\n\t\t\t\t\t\teventTime: msg.getEventTimestamp(),\n\t\t\t\t\t\ttimestampNs: wallClockNs(),\n\t\t\t\t\t});\n\t\t\t\t\tif (autoAck) await consumer.acknowledge(msg);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (active) a.down([[ERROR, err]]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvoid loop();\n\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/** Options for {@link toPulsar}. */\nexport type ToPulsarOptions<T> = ExtraOpts & {\n\t/** Serialize value for Pulsar. Default: `JSON.stringify` → Buffer. */\n\tserialize?: (value: T) => Buffer;\n\t/** Extract partition key from value. Default: none. */\n\tkeyExtractor?: (value: T) => string | undefined;\n\t/** Extract properties from value. */\n\tpropertiesExtractor?: (value: T) => Record<string, string> | undefined;\n\t/** Called on serialization or send failures. */\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * Pulsar producer sink — forwards upstream `DATA` to a Pulsar topic.\n *\n * @param source - Upstream node to forward.\n * @param pulsarProducer - Pulsar producer instance (caller owns lifecycle).\n * @param opts - Serialization options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toPulsar<T>(\n\tsource: Node<T>,\n\tpulsarProducer: PulsarProducerLike,\n\topts?: ToPulsarOptions<T>,\n): () => void {\n\tconst {\n\t\tserialize = (v: T) => Buffer.from(JSON.stringify(v)),\n\t\tkeyExtractor,\n\t\tpropertiesExtractor,\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet data: Buffer;\n\t\t\t\ttry {\n\t\t\t\t\tdata = serialize(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tvoid pulsarProducer\n\t\t\t\t\t.send({\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tpartitionKey: keyExtractor?.(value),\n\t\t\t\t\t\tproperties: propertiesExtractor?.(value),\n\t\t\t\t\t})\n\t\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— NATS ———\n\n/** Duck-typed NATS subscription (compatible with nats.js). */\nexport type NATSSubscriptionLike = AsyncIterable<{\n\tsubject: string;\n\tdata: Uint8Array;\n\theaders?: { get(key: string): string; keys(): string[] };\n\treply?: string;\n\tsid: number;\n}>;\n\n/** Duck-typed NATS client (compatible with nats.js). */\nexport type NATSClientLike = {\n\tsubscribe(subject: string, opts?: { queue?: string }): NATSSubscriptionLike;\n\tpublish(subject: string, data?: Uint8Array, opts?: { headers?: unknown; reply?: string }): void;\n\tdrain(): Promise<void>;\n};\n\n/** Structured NATS message. */\nexport type NATSMessage<T = unknown> = {\n\tsubject: string;\n\tdata: T;\n\theaders: Record<string, string>;\n\treply: string | undefined;\n\tsid: number;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromNATS}. */\nexport type FromNATSOptions = ExtraOpts & {\n\t/** Queue group name for load balancing. */\n\tqueue?: string;\n\t/** Deserialize message data. Default: `JSON.parse(textDecoder.decode(data))`. */\n\tdeserialize?: (data: Uint8Array) => unknown;\n};\n\n/**\n * NATS consumer as a reactive source.\n *\n * Wraps a `nats.js`-compatible client subscription. Each message becomes a `DATA` emission.\n *\n * @param client - NATS client instance (caller owns connect/drain lifecycle).\n * @param subject - Subject to subscribe to (supports wildcards).\n * @param opts - Queue group, deserialization, and source options.\n * @returns `Node<NATSMessage<T>>` — one `DATA` per NATS message.\n *\n * @remarks\n * Teardown sets an internal flag but cannot break the async iterator. The loop\n * exits on the next message or when the subscription is drained/unsubscribed\n * externally. Call `client.drain()` after unsubscribing for prompt cleanup.\n *\n * @example\n * ```ts\n * import { connect } from \"nats\";\n * import { fromNATS } from \"@graphrefly/graphrefly-ts\";\n *\n * const nc = await connect({ servers: \"localhost:4222\" });\n * const events$ = fromNATS(nc, \"events.>\");\n * ```\n *\n * @category extra\n */\nexport function fromNATS<T = unknown>(\n\tclient: NATSClientLike,\n\tsubject: string,\n\topts?: FromNATSOptions,\n): Node<NATSMessage<T>> {\n\tconst decoder = new TextDecoder();\n\tconst {\n\t\tqueue,\n\t\tdeserialize = (data: Uint8Array) => {\n\t\t\tconst text = decoder.decode(data);\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(text);\n\t\t\t} catch {\n\t\t\t\treturn text;\n\t\t\t}\n\t\t},\n\t\t...rest\n\t} = opts ?? {};\n\n\treturn producer<NATSMessage<T>>((_d, a) => {\n\t\tlet active = true;\n\t\tconst sub = client.subscribe(subject, queue ? { queue } : undefined);\n\n\t\tconst loop = async () => {\n\t\t\ttry {\n\t\t\t\tfor await (const msg of sub) {\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\tconst headers: Record<string, string> = {};\n\t\t\t\t\tif (msg.headers) {\n\t\t\t\t\t\tfor (const k of msg.headers.keys()) {\n\t\t\t\t\t\t\theaders[k] = msg.headers.get(k);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ta.emit({\n\t\t\t\t\t\tsubject: msg.subject,\n\t\t\t\t\t\tdata: deserialize(msg.data) as T,\n\t\t\t\t\t\theaders,\n\t\t\t\t\t\treply: msg.reply,\n\t\t\t\t\t\tsid: msg.sid,\n\t\t\t\t\t\ttimestampNs: wallClockNs(),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// Subscription closed (drain or unsubscribe) — complete.\n\t\t\t\tif (active) a.down([[COMPLETE]]);\n\t\t\t} catch (err) {\n\t\t\t\tif (active) a.down([[ERROR, err]]);\n\t\t\t}\n\t\t};\n\n\t\tvoid loop();\n\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/** Options for {@link toNATS}. */\nexport type ToNATSOptions<T> = ExtraOpts & {\n\t/** Serialize value for NATS. Default: `JSON.stringify` → Uint8Array. */\n\tserialize?: (value: T) => Uint8Array;\n\t/** Called on serialization failures. */\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * NATS publisher sink — forwards upstream `DATA` to a NATS subject.\n *\n * @param source - Upstream node to forward.\n * @param client - NATS client instance.\n * @param subject - Target subject.\n * @param opts - Serialization options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toNATS<T>(\n\tsource: Node<T>,\n\tclient: NATSClientLike,\n\tsubject: string,\n\topts?: ToNATSOptions<T>,\n): () => void {\n\tconst encoder = new TextEncoder();\n\tconst {\n\t\tserialize = (v: T) => encoder.encode(JSON.stringify(v)),\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet data: Uint8Array;\n\t\t\t\ttry {\n\t\t\t\t\tdata = serialize(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tclient.publish(subject, data);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— RabbitMQ ———\n\n/** Duck-typed RabbitMQ channel (compatible with amqplib). */\nexport type RabbitMQChannelLike = {\n\tconsume(\n\t\tqueue: string,\n\t\tonMessage: (\n\t\t\tmsg: {\n\t\t\t\tcontent: Buffer;\n\t\t\t\tfields: {\n\t\t\t\t\troutingKey: string;\n\t\t\t\t\texchange: string;\n\t\t\t\t\tdeliveryTag: number;\n\t\t\t\t\tredelivered: boolean;\n\t\t\t\t};\n\t\t\t\tproperties: Record<string, unknown>;\n\t\t\t} | null,\n\t\t) => void,\n\t\topts?: { noAck?: boolean },\n\t): Promise<{ consumerTag: string }>;\n\tcancel(consumerTag: string): Promise<void>;\n\tack(msg: unknown): void;\n\tpublish(\n\t\texchange: string,\n\t\troutingKey: string,\n\t\tcontent: Buffer,\n\t\topts?: Record<string, unknown>,\n\t): boolean;\n\tsendToQueue(queue: string, content: Buffer, opts?: Record<string, unknown>): boolean;\n};\n\n/** Structured RabbitMQ message. */\nexport type RabbitMQMessage<T = unknown> = {\n\tqueue: string;\n\troutingKey: string;\n\texchange: string;\n\tcontent: T;\n\tproperties: Record<string, unknown>;\n\tdeliveryTag: number;\n\tredelivered: boolean;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromRabbitMQ}. */\nexport type FromRabbitMQOptions = ExtraOpts & {\n\t/** Deserialize message content. Default: `JSON.parse(buffer.toString())`. */\n\tdeserialize?: (content: Buffer) => unknown;\n\t/** Auto-acknowledge messages. Default: `true`. */\n\tautoAck?: boolean;\n};\n\n/**\n * RabbitMQ consumer as a reactive source.\n *\n * Wraps an `amqplib`-compatible channel. Each message becomes a `DATA` emission.\n *\n * @param channel - AMQP channel instance (caller owns connection/channel lifecycle).\n * @param queue - Queue to consume from.\n * @param opts - Deserialization and acknowledgment options.\n * @returns `Node<RabbitMQMessage<T>>` — one `DATA` per RabbitMQ message.\n *\n * @remarks\n * When `autoAck` is `false`, the adapter opens the channel with `noAck: false`\n * (broker requires acks) but does not call `channel.ack()`. The caller must ack\n * messages externally using the `deliveryTag` from the emitted {@link RabbitMQMessage}:\n * ```ts\n * channel.ack({ fields: { deliveryTag: msg.deliveryTag } } as any);\n * ```\n *\n * @example\n * ```ts\n * import amqplib from \"amqplib\";\n * import { fromRabbitMQ } from \"@graphrefly/graphrefly-ts\";\n *\n * const conn = await amqplib.connect(\"amqp://localhost\");\n * const ch = await conn.createChannel();\n * await ch.assertQueue(\"events\");\n * const events$ = fromRabbitMQ(ch, \"events\");\n * ```\n *\n * @category extra\n */\nexport function fromRabbitMQ<T = unknown>(\n\tchannel: RabbitMQChannelLike,\n\tqueue: string,\n\topts?: FromRabbitMQOptions,\n): Node<RabbitMQMessage<T>> {\n\tconst {\n\t\tautoAck = true,\n\t\tdeserialize = (buf: Buffer) => {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(buf.toString());\n\t\t\t} catch {\n\t\t\t\treturn buf.toString();\n\t\t\t}\n\t\t},\n\t\t...rest\n\t} = opts ?? {};\n\n\treturn producer<RabbitMQMessage<T>>((_d, a) => {\n\t\tlet active = true;\n\t\tlet consumerTag: string | undefined;\n\n\t\tconst start = async () => {\n\t\t\ttry {\n\t\t\t\tconst result = await channel.consume(\n\t\t\t\t\tqueue,\n\t\t\t\t\t(msg) => {\n\t\t\t\t\t\tif (!active) return;\n\t\t\t\t\t\tif (msg === null) {\n\t\t\t\t\t\t\t// Broker cancelled the consumer (queue deleted, etc.).\n\t\t\t\t\t\t\tif (active) a.down([[ERROR, new Error(\"Consumer cancelled by broker\")]]);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ta.emit({\n\t\t\t\t\t\t\tqueue,\n\t\t\t\t\t\t\troutingKey: msg.fields.routingKey,\n\t\t\t\t\t\t\texchange: msg.fields.exchange,\n\t\t\t\t\t\t\tcontent: deserialize(msg.content) as T,\n\t\t\t\t\t\t\tproperties: msg.properties,\n\t\t\t\t\t\t\tdeliveryTag: msg.fields.deliveryTag,\n\t\t\t\t\t\t\tredelivered: msg.fields.redelivered,\n\t\t\t\t\t\t\ttimestampNs: wallClockNs(),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (autoAck) channel.ack(msg);\n\t\t\t\t\t},\n\t\t\t\t\t{ noAck: false },\n\t\t\t\t);\n\t\t\t\tconsumerTag = result.consumerTag;\n\t\t\t} catch (err) {\n\t\t\t\tif (active) a.down([[ERROR, err]]);\n\t\t\t}\n\t\t};\n\n\t\tvoid start();\n\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\tif (consumerTag !== undefined) {\n\t\t\t\tvoid channel.cancel(consumerTag);\n\t\t\t}\n\t\t};\n\t}, sourceOpts(rest));\n}\n\n/** Options for {@link toRabbitMQ}. */\nexport type ToRabbitMQOptions<T> = ExtraOpts & {\n\t/** Serialize value for RabbitMQ. Default: `Buffer.from(JSON.stringify(value))`. */\n\tserialize?: (value: T) => Buffer;\n\t/** Extract routing key from value. Default: `\"\"`. */\n\troutingKeyExtractor?: (value: T) => string;\n\t/** Called on serialization or send failures. */\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * RabbitMQ producer sink — forwards upstream `DATA` to a RabbitMQ exchange/queue.\n *\n * @param source - Upstream node to forward.\n * @param channel - AMQP channel instance.\n * @param exchange - Target exchange (use `\"\"` for default exchange + queue routing).\n * @param opts - Serialization and routing options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toRabbitMQ<T>(\n\tsource: Node<T>,\n\tchannel: RabbitMQChannelLike,\n\texchange: string,\n\topts?: ToRabbitMQOptions<T>,\n): () => void {\n\tconst {\n\t\tserialize = (v: T) => Buffer.from(JSON.stringify(v)),\n\t\troutingKeyExtractor = () => \"\",\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet routingKey: string;\n\t\t\t\ttry {\n\t\t\t\t\troutingKey = routingKeyExtractor(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"routing_key\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tlet content: Buffer;\n\t\t\t\ttry {\n\t\t\t\t\tcontent = serialize(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tchannel.publish(exchange, routingKey, content);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——————————————————————————————————————————————————————————————\n// Phase 5.2d — Storage & sink adapters\n// ——————————————————————————————————————————————————————————————\n\n/** Handle returned by buffered sinks. `flush()` drains remaining buffer. */\nexport type BufferedSinkHandle = {\n\t/** Stop the sink and cancel the flush timer. */\n\tdispose: () => void;\n\t/** Manually drain the internal buffer. */\n\tflush: () => Promise<void>;\n};\n\n// ——— toFile ———\n\n/** Duck-typed writable file handle (compatible with `fs.createWriteStream`). */\nexport type FileWriterLike = {\n\twrite(data: string | Uint8Array): boolean | void;\n\tend(): void;\n};\n\n/** Options for {@link toFile}. */\nexport type ToFileOptions<T> = ExtraOpts & {\n\t/** Serialize a value to a string line. Default: `JSON.stringify(v) + \"\\n\"`. */\n\tserialize?: (value: T) => string;\n\t/** `\"append\"` (default) or `\"overwrite\"` — controls initial file behavior hint. */\n\tmode?: \"append\" | \"overwrite\";\n\t/** Flush interval in ms. `0` = write-through (no buffering). Default: `0`. */\n\tflushIntervalMs?: number;\n\t/** Buffer size (item count) before auto-flush. Default: `Infinity` (timer only). */\n\tbatchSize?: number;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * File sink — writes upstream `DATA` values to a file-like writable.\n *\n * When `flushIntervalMs > 0` or `batchSize` is set, values are buffered and\n * flushed in batches. Otherwise, each value is written immediately.\n *\n * @param source - Upstream node.\n * @param writer - Writable file handle (e.g. `fs.createWriteStream(path, { flags: \"a\" })`).\n * @param opts - Serialization, buffering, and mode options.\n * @returns `BufferedSinkHandle` with `dispose()` and `flush()`.\n *\n * @category extra\n */\nexport function toFile<T>(\n\tsource: Node<T>,\n\twriter: FileWriterLike,\n\topts?: ToFileOptions<T>,\n): BufferedSinkHandle {\n\tconst {\n\t\tserialize = (v: T) => `${JSON.stringify(v)}\\n`,\n\t\tflushIntervalMs = 0,\n\t\tbatchSize = Number.POSITIVE_INFINITY,\n\t\tonTransportError,\n\t\tmode: _mode,\n\t\t...rest\n\t} = opts ?? {};\n\n\tlet buffer: string[] = [];\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\n\tconst doFlush = () => {\n\t\tif (buffer.length === 0) return;\n\t\tconst chunk = buffer.join(\"\");\n\t\tbuffer = [];\n\t\ttry {\n\t\t\twriter.write(chunk);\n\t\t} catch (err) {\n\t\t\tonTransportError?.({\n\t\t\t\tstage: \"send\",\n\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\tvalue: chunk,\n\t\t\t});\n\t\t}\n\t};\n\n\tconst scheduleFlush = () => {\n\t\tif (flushIntervalMs > 0 && timer === undefined) {\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tdoFlush();\n\t\t\t}, flushIntervalMs);\n\t\t}\n\t};\n\n\tconst buffered = flushIntervalMs > 0 || batchSize < Number.POSITIVE_INFINITY;\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet line: string;\n\t\t\t\ttry {\n\t\t\t\t\tline = serialize(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (buffered) {\n\t\t\t\t\tbuffer.push(line);\n\t\t\t\t\tif (buffer.length >= batchSize) doFlush();\n\t\t\t\t\telse scheduleFlush();\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\twriter.write(line);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === COMPLETE || msg[0] === TEARDOWN) {\n\t\t\t\tdoFlush();\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\n\tconst unsub = inner.subscribe(() => {});\n\n\tconst dispose = () => {\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t\tdoFlush();\n\t\twriter.end();\n\t\tunsub();\n\t};\n\n\treturn {\n\t\tdispose,\n\t\tflush: async () => {\n\t\t\tdoFlush();\n\t\t},\n\t};\n}\n\n// ——— toCSV ———\n\n/** Options for {@link toCSV}. */\nexport type ToCSVOptions<T> = ExtraOpts & {\n\t/** Column names. Required — determines header row and field order. */\n\tcolumns: string[];\n\t/** Column delimiter. Default: `\",\"`. */\n\tdelimiter?: string;\n\t/** Whether to write a header row on first flush. Default: `true`. */\n\twriteHeader?: boolean;\n\t/** Extract a cell value from the row object. Default: `String(row[col] ?? \"\")`. */\n\tcellExtractor?: (row: T, column: string) => string;\n\t/** Flush interval in ms. Default: `0` (write-through). */\n\tflushIntervalMs?: number;\n\t/** Buffer size before auto-flush. Default: `Infinity`. */\n\tbatchSize?: number;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\nfunction escapeCSVField(value: string, delimiter: string): string {\n\tif (value.includes(delimiter) || value.includes('\"') || value.includes(\"\\n\")) {\n\t\treturn `\"${value.replace(/\"/g, '\"\"')}\"`;\n\t}\n\treturn value;\n}\n\n/**\n * CSV file sink — writes upstream `DATA` as CSV rows.\n *\n * @param source - Upstream node.\n * @param writer - Writable file handle.\n * @param opts - Column definition, delimiter, and buffering options.\n * @returns `BufferedSinkHandle`.\n *\n * @category extra\n */\nexport function toCSV<T>(\n\tsource: Node<T>,\n\twriter: FileWriterLike,\n\topts: ToCSVOptions<T>,\n): BufferedSinkHandle {\n\tconst {\n\t\tcolumns,\n\t\tdelimiter = \",\",\n\t\twriteHeader = true,\n\t\tcellExtractor = (row: T, col: string) => String((row as Record<string, unknown>)[col] ?? \"\"),\n\t\tflushIntervalMs = 0,\n\t\tbatchSize = Number.POSITIVE_INFINITY,\n\t\tonTransportError,\n\t\t...rest\n\t} = opts;\n\n\tlet headerWritten = false;\n\n\tconst serializeRow = (row: T): string => {\n\t\tif (!headerWritten && writeHeader) {\n\t\t\theaderWritten = true;\n\t\t\tconst header = columns.map((c) => escapeCSVField(c, delimiter)).join(delimiter);\n\t\t\tconst data = columns\n\t\t\t\t.map((c) => escapeCSVField(cellExtractor(row, c), delimiter))\n\t\t\t\t.join(delimiter);\n\t\t\treturn `${header}\\n${data}\\n`;\n\t\t}\n\t\treturn `${columns.map((c) => escapeCSVField(cellExtractor(row, c), delimiter)).join(delimiter)}\\n`;\n\t};\n\n\treturn toFile<T>(source, writer, {\n\t\tserialize: serializeRow,\n\t\tflushIntervalMs,\n\t\tbatchSize,\n\t\tonTransportError,\n\t\t...rest,\n\t});\n}\n\n// ——— toClickHouse ———\n\n/** Duck-typed ClickHouse client for batch inserts. */\nexport type ClickHouseInsertClientLike = {\n\tinsert(params: { table: string; values: unknown[]; format?: string }): Promise<void>;\n};\n\n/** Options for {@link toClickHouse}. */\nexport type ToClickHouseOptions<T> = ExtraOpts & {\n\t/** Batch size before auto-flush. Default: `1000`. */\n\tbatchSize?: number;\n\t/** Flush interval in ms. Default: `5000`. */\n\tflushIntervalMs?: number;\n\t/** Insert format. Default: `\"JSONEachRow\"`. */\n\tformat?: string;\n\t/** Transform value before insert. Default: identity. */\n\ttransform?: (value: T) => unknown;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * ClickHouse buffered batch insert sink.\n *\n * Accumulates upstream `DATA` values and inserts in batches.\n *\n * @param source - Upstream node.\n * @param client - ClickHouse client with `insert()`.\n * @param table - Target table name.\n * @param opts - Batch size, flush interval, and transform options.\n * @returns `BufferedSinkHandle`.\n *\n * @category extra\n */\nexport function toClickHouse<T>(\n\tsource: Node<T>,\n\tclient: ClickHouseInsertClientLike,\n\ttable: string,\n\topts?: ToClickHouseOptions<T>,\n): BufferedSinkHandle {\n\tconst {\n\t\tbatchSize = 1000,\n\t\tflushIntervalMs = 5000,\n\t\tformat = \"JSONEachRow\",\n\t\ttransform = (v: T) => v,\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tlet buffer: unknown[] = [];\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet lastFlush: Promise<void> = Promise.resolve();\n\n\tconst doFlush = (): Promise<void> => {\n\t\tif (buffer.length === 0) return Promise.resolve();\n\t\tconst batch = buffer;\n\t\tbuffer = [];\n\t\ttry {\n\t\t\tconst p = client.insert({ table, values: batch, format }).catch((err: unknown) => {\n\t\t\t\tonTransportError?.({\n\t\t\t\t\tstage: \"send\",\n\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\tvalue: batch,\n\t\t\t\t});\n\t\t\t});\n\t\t\tlastFlush = p;\n\t\t\treturn p;\n\t\t} catch (err) {\n\t\t\tonTransportError?.({\n\t\t\t\tstage: \"send\",\n\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\tvalue: batch,\n\t\t\t});\n\t\t\treturn Promise.resolve();\n\t\t}\n\t};\n\n\tconst scheduleFlush = () => {\n\t\tif (timer === undefined) {\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tdoFlush();\n\t\t\t}, flushIntervalMs);\n\t\t}\n\t};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\ttry {\n\t\t\t\t\tbuffer.push(transform(value));\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (buffer.length >= batchSize) doFlush();\n\t\t\t\telse scheduleFlush();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === COMPLETE || msg[0] === TEARDOWN) {\n\t\t\t\tdoFlush();\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\n\tconst unsub = inner.subscribe(() => {});\n\n\tconst dispose = () => {\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t\tdoFlush();\n\t\tunsub();\n\t};\n\n\treturn {\n\t\tdispose,\n\t\tflush: () => doFlush().then(() => lastFlush),\n\t};\n}\n\n// ——— toS3 ———\n\n/** Duck-typed S3 client (compatible with AWS SDK v3 `S3Client.send(PutObjectCommand(...))`). */\nexport type S3ClientLike = {\n\tputObject(params: {\n\t\tBucket: string;\n\t\tKey: string;\n\t\tBody: string | Uint8Array;\n\t\tContentType?: string;\n\t}): Promise<unknown>;\n};\n\n/** Options for {@link toS3}. */\nexport type ToS3Options<T> = ExtraOpts & {\n\t/** Output format. Default: `\"ndjson\"`. */\n\tformat?: \"ndjson\" | \"json\";\n\t/** Generate the S3 key for each batch. Receives `(seq, wallClockNs)`. Default: ISO timestamp + sequence. */\n\tkeyGenerator?: (seq: number, timestampNs: number) => string;\n\t/** Batch size before auto-flush. Default: `1000`. */\n\tbatchSize?: number;\n\t/** Flush interval in ms. Default: `10000`. */\n\tflushIntervalMs?: number;\n\t/** Transform value before serialization. Default: identity. */\n\ttransform?: (value: T) => unknown;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * S3 object storage sink — buffers values and uploads as NDJSON or JSON objects.\n *\n * @param source - Upstream node.\n * @param client - S3-compatible client with `putObject()`.\n * @param bucket - S3 bucket name.\n * @param opts - Format, key generation, batching options.\n * @returns `BufferedSinkHandle`.\n *\n * @category extra\n */\nexport function toS3<T>(\n\tsource: Node<T>,\n\tclient: S3ClientLike,\n\tbucket: string,\n\topts?: ToS3Options<T>,\n): BufferedSinkHandle {\n\tconst {\n\t\tformat = \"ndjson\",\n\t\tkeyGenerator = (seq: number, timestampNs: number) => {\n\t\t\tconst ms = Math.floor(timestampNs / 1_000_000);\n\t\t\tconst ts = new Date(ms).toISOString().replace(/[:.]/g, \"-\");\n\t\t\treturn `data/${ts}-${seq}.${format === \"ndjson\" ? \"ndjson\" : \"json\"}`;\n\t\t},\n\t\tbatchSize = 1000,\n\t\tflushIntervalMs = 10000,\n\t\ttransform = (v: T) => v,\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tlet buffer: unknown[] = [];\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet seq = 0;\n\tlet lastFlush: Promise<void> = Promise.resolve();\n\n\tconst doFlush = (): Promise<void> => {\n\t\tif (buffer.length === 0) return Promise.resolve();\n\t\tconst batch = buffer;\n\t\tbuffer = [];\n\t\tseq += 1;\n\t\tconst body =\n\t\t\tformat === \"ndjson\"\n\t\t\t\t? `${batch.map((v) => JSON.stringify(v)).join(\"\\n\")}\\n`\n\t\t\t\t: JSON.stringify(batch);\n\t\tconst contentType = format === \"ndjson\" ? \"application/x-ndjson\" : \"application/json\";\n\t\tconst key = keyGenerator(seq, wallClockNs());\n\t\ttry {\n\t\t\tconst p: Promise<void> = client\n\t\t\t\t.putObject({ Bucket: bucket, Key: key, Body: body, ContentType: contentType })\n\t\t\t\t.then(() => {})\n\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue: batch,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\tlastFlush = p;\n\t\t\treturn p;\n\t\t} catch (err) {\n\t\t\tonTransportError?.({\n\t\t\t\tstage: \"send\",\n\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\tvalue: batch,\n\t\t\t});\n\t\t\treturn Promise.resolve();\n\t\t}\n\t};\n\n\tconst scheduleFlush = () => {\n\t\tif (timer === undefined) {\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tdoFlush();\n\t\t\t}, flushIntervalMs);\n\t\t}\n\t};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\ttry {\n\t\t\t\t\tbuffer.push(transform(value));\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (buffer.length >= batchSize) doFlush();\n\t\t\t\telse scheduleFlush();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === COMPLETE || msg[0] === TEARDOWN) {\n\t\t\t\tdoFlush();\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\n\tconst unsub = inner.subscribe(() => {});\n\n\tconst dispose = () => {\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t\tdoFlush();\n\t\tunsub();\n\t};\n\n\treturn {\n\t\tdispose,\n\t\tflush: () => doFlush().then(() => lastFlush),\n\t};\n}\n\n// ——— toPostgres ———\n\n/** Duck-typed Postgres client (compatible with `pg.Client` / `pg.Pool`). */\nexport type PostgresClientLike = {\n\tquery(sql: string, params?: unknown[]): Promise<unknown>;\n};\n\n/** Options for {@link toPostgres}. */\nexport type ToPostgresOptions<T> = ExtraOpts & {\n\t/** Build the SQL + params for an insert. Default: JSON insert into `table`. */\n\ttoSQL?: (value: T, table: string) => { sql: string; params: unknown[] };\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * PostgreSQL sink — inserts each upstream `DATA` value as a row.\n *\n * @param source - Upstream node.\n * @param client - Postgres client with `query()`.\n * @param table - Target table name.\n * @param opts - SQL builder and error options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toPostgres<T>(\n\tsource: Node<T>,\n\tclient: PostgresClientLike,\n\ttable: string,\n\topts?: ToPostgresOptions<T>,\n): () => void {\n\tconst {\n\t\ttoSQL = (v: T, t: string) => ({\n\t\t\tsql: `INSERT INTO \"${t.replace(/\"/g, '\"\"')}\" (data) VALUES ($1)`,\n\t\t\tparams: [JSON.stringify(v)],\n\t\t}),\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet query: { sql: string; params: unknown[] };\n\t\t\t\ttry {\n\t\t\t\t\tquery = toSQL(value, table);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tvoid client.query(query.sql, query.params).catch((err: unknown) => {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— toMongo ———\n\n/** Duck-typed MongoDB collection (compatible with `mongodb` driver). */\nexport type MongoCollectionLike = {\n\tinsertOne(doc: unknown): Promise<unknown>;\n};\n\n/** Options for {@link toMongo}. */\nexport type ToMongoOptions<T> = ExtraOpts & {\n\t/** Transform value to a MongoDB document. Default: identity. */\n\ttoDocument?: (value: T) => unknown;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * MongoDB sink — inserts each upstream `DATA` value as a document.\n *\n * @param source - Upstream node.\n * @param collection - MongoDB collection with `insertOne()`.\n * @param opts - Document transform and error options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toMongo<T>(\n\tsource: Node<T>,\n\tcollection: MongoCollectionLike,\n\topts?: ToMongoOptions<T>,\n): () => void {\n\tconst { toDocument = (v: T) => v, onTransportError, ...rest } = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet doc: unknown;\n\t\t\t\ttry {\n\t\t\t\t\tdoc = toDocument(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tvoid collection.insertOne(doc).catch((err: unknown) => {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— toLoki ———\n\n/** Loki log stream entry. */\nexport type LokiStream = {\n\tstream: Record<string, string>;\n\tvalues: [string, string][];\n};\n\n/** Duck-typed Loki push client (HTTP push API). */\nexport type LokiClientLike = {\n\tpush(streams: { streams: LokiStream[] }): Promise<unknown>;\n};\n\n/** Options for {@link toLoki}. */\nexport type ToLokiOptions<T> = ExtraOpts & {\n\t/** Static labels applied to every log entry. */\n\tlabels?: Record<string, string>;\n\t/** Extract the log line from a value. Default: `JSON.stringify(v)`. */\n\ttoLine?: (value: T) => string;\n\t/** Extract additional labels from a value. Default: none. */\n\ttoLabels?: (value: T) => Record<string, string>;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * Grafana Loki sink — pushes upstream `DATA` values as log entries.\n *\n * @param source - Upstream node.\n * @param client - Loki-compatible client with `push()`.\n * @param opts - Label, serialization, and error options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toLoki<T>(\n\tsource: Node<T>,\n\tclient: LokiClientLike,\n\topts?: ToLokiOptions<T>,\n): () => void {\n\tconst {\n\t\tlabels = {},\n\t\ttoLine = (v: T) => JSON.stringify(v),\n\t\ttoLabels,\n\t\tonTransportError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet line: string;\n\t\t\t\ttry {\n\t\t\t\t\tline = toLine(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tlet streamLabels: Record<string, string>;\n\t\t\t\ttry {\n\t\t\t\t\tstreamLabels = toLabels ? { ...labels, ...toLabels(value) } : labels;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tconst ts = `${wallClockNs()}`;\n\t\t\t\tvoid client\n\t\t\t\t\t.push({ streams: [{ stream: streamLabels, values: [[ts, line]] }] })\n\t\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— toTempo ———\n\n/** Duck-typed Tempo span push client (OTLP/HTTP shape). */\nexport type TempoClientLike = {\n\tpush(payload: { resourceSpans: unknown[] }): Promise<unknown>;\n};\n\n/** Options for {@link toTempo}. */\nexport type ToTempoOptions<T> = ExtraOpts & {\n\t/** Transform a value into OTLP resourceSpans entries. */\n\ttoResourceSpans?: (value: T) => unknown[];\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * Grafana Tempo sink — pushes upstream `DATA` values as trace spans.\n *\n * @param source - Upstream node.\n * @param client - Tempo-compatible client with `push()`.\n * @param opts - Span transform and error options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toTempo<T>(\n\tsource: Node<T>,\n\tclient: TempoClientLike,\n\topts?: ToTempoOptions<T>,\n): () => void {\n\tconst { toResourceSpans = (v: T) => [v], onTransportError, ...rest } = opts ?? {};\n\n\tconst inner = node([source as Node], () => undefined, {\n\t\tdescribeKind: \"effect\",\n\t\t...rest,\n\t\tonMessage(msg: Message) {\n\t\t\tif (msg[0] === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet spans: unknown[];\n\t\t\t\ttry {\n\t\t\t\t\tspans = toResourceSpans(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"serialize\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tvoid client.push({ resourceSpans: spans }).catch((err: unknown) => {\n\t\t\t\t\tonTransportError?.({\n\t\t\t\t\t\tstage: \"send\",\n\t\t\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n\treturn inner.subscribe(() => {});\n}\n\n// ——— checkpointToS3 ———\n\n/** Options for {@link checkpointToS3}. */\nexport type CheckpointToS3Options = {\n\t/** S3 key prefix. Default: `\"checkpoints/\"`. */\n\tprefix?: string;\n\t/** Debounce ms for autoCheckpoint. Default: `500`. */\n\tdebounceMs?: number;\n\t/** Full snapshot compaction interval. Default: `10`. */\n\tcompactEvery?: number;\n\tonError?: (error: unknown) => void;\n};\n\n/**\n * Wires `graph.autoCheckpoint()` to persist snapshots to S3.\n *\n * @param graph - Graph instance to checkpoint.\n * @param client - S3-compatible client with `putObject()`.\n * @param bucket - S3 bucket name.\n * @param opts - Key prefix, debounce, and compaction options.\n * @returns Dispose handle.\n *\n * @category extra\n */\nexport function checkpointToS3(\n\tgraph: {\n\t\tautoCheckpoint: (adapter: { save(data: unknown): void }, opts?: unknown) => { dispose(): void };\n\t\tname: string;\n\t},\n\tclient: S3ClientLike,\n\tbucket: string,\n\topts?: CheckpointToS3Options,\n): { dispose(): void } {\n\tconst { prefix = \"checkpoints/\", debounceMs, compactEvery, onError } = opts ?? {};\n\tconst adapter = {\n\t\tsave(data: unknown) {\n\t\t\tconst ms = Math.floor(wallClockNs() / 1_000_000);\n\t\t\tconst key = `${prefix}${graph.name}/checkpoint-${ms}.json`;\n\t\t\tlet body: string;\n\t\t\ttry {\n\t\t\t\tbody = JSON.stringify(data);\n\t\t\t} catch (err) {\n\t\t\t\tonError?.(err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvoid client\n\t\t\t\t.putObject({\n\t\t\t\t\tBucket: bucket,\n\t\t\t\t\tKey: key,\n\t\t\t\t\tBody: body,\n\t\t\t\t\tContentType: \"application/json\",\n\t\t\t\t})\n\t\t\t\t.catch((err) => onError?.(err));\n\t\t},\n\t};\n\treturn graph.autoCheckpoint(adapter, { debounceMs, compactEvery, onError });\n}\n\n// ——— checkpointToRedis ———\n\n/** Duck-typed Redis client for checkpoint storage. */\nexport type RedisCheckpointClientLike = {\n\tset(key: string, value: string): Promise<unknown>;\n\tget(key: string): Promise<string | null>;\n};\n\n/** Options for {@link checkpointToRedis}. */\nexport type CheckpointToRedisOptions = {\n\t/** Key prefix. Default: `\"graphrefly:checkpoint:\"`. */\n\tprefix?: string;\n\t/** Debounce ms for autoCheckpoint. Default: `500`. */\n\tdebounceMs?: number;\n\t/** Full snapshot compaction interval. Default: `10`. */\n\tcompactEvery?: number;\n\tonError?: (error: unknown) => void;\n};\n\n/**\n * Wires `graph.autoCheckpoint()` to persist snapshots to Redis.\n *\n * @param graph - Graph instance to checkpoint.\n * @param client - Redis client with `set()`/`get()`.\n * @param opts - Key prefix, debounce, and compaction options.\n * @returns Dispose handle.\n *\n * @category extra\n */\nexport function checkpointToRedis(\n\tgraph: {\n\t\tautoCheckpoint: (adapter: { save(data: unknown): void }, opts?: unknown) => { dispose(): void };\n\t\tname: string;\n\t},\n\tclient: RedisCheckpointClientLike,\n\topts?: CheckpointToRedisOptions,\n): { dispose(): void } {\n\tconst { prefix = \"graphrefly:checkpoint:\", debounceMs, compactEvery, onError } = opts ?? {};\n\tconst key = `${prefix}${graph.name}`;\n\tconst adapter = {\n\t\tsave(data: unknown) {\n\t\t\tlet body: string;\n\t\t\ttry {\n\t\t\t\tbody = JSON.stringify(data);\n\t\t\t} catch (err) {\n\t\t\t\tonError?.(err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvoid client.set(key, body).catch((err) => onError?.(err));\n\t\t},\n\t};\n\treturn graph.autoCheckpoint(adapter, { debounceMs, compactEvery, onError });\n}\n","/**\n * Watermark-based backpressure controller — reactive PAUSE/RESUME flow control.\n *\n * Purely synchronous, event-driven. No timers, no polling, no Promises.\n * Each controller instance uses a unique lockId so multiple controllers\n * on the same upstream node do not collide.\n *\n * @module\n */\n\nimport { type Messages, PAUSE, RESUME } from \"../core/messages.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type WatermarkOptions = {\n\t/** Pending count at which PAUSE is sent upstream. */\n\thighWaterMark: number;\n\t/** Pending count at which RESUME is sent upstream (after being paused). */\n\tlowWaterMark: number;\n};\n\nexport type WatermarkController = {\n\t/** Call when a DATA message is buffered/enqueued. Returns `true` if PAUSE was just sent. */\n\tonEnqueue(): boolean;\n\t/** Call when a buffered item is consumed. Returns `true` if RESUME was just sent. */\n\tonDequeue(): boolean;\n\t/** Current un-consumed item count. */\n\treadonly pending: number;\n\t/** Whether upstream is currently paused by this controller. */\n\treadonly paused: boolean;\n\t/** Dispose: if paused, sends RESUME to unblock upstream. */\n\tdispose(): void;\n};\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nlet nextLockId = 0;\n\n/**\n * Creates a watermark-based backpressure controller.\n *\n * @param sendUp - Callback that delivers messages upstream (typically `handle.up`).\n * @param opts - High/low watermark thresholds (item counts).\n * @returns A {@link WatermarkController}.\n *\n * @example\n * ```ts\n * const handle = graph.observe(\"fast-source\");\n * const wm = createWatermarkController(\n * (msgs) => handle.up(msgs),\n * { highWaterMark: 64, lowWaterMark: 16 },\n * );\n *\n * // In sink callback:\n * handle.subscribe((msgs) => {\n * for (const msg of msgs) {\n * if (msg[0] === DATA) {\n * buffer.push(msg[1]);\n * wm.onEnqueue();\n * }\n * }\n * });\n *\n * // When consumer drains:\n * const item = buffer.shift();\n * wm.onDequeue();\n * ```\n *\n * @category extra\n */\nexport function createWatermarkController(\n\tsendUp: (messages: Messages) => void,\n\topts: WatermarkOptions,\n): WatermarkController {\n\tif (opts.highWaterMark < 1) throw new RangeError(\"highWaterMark must be >= 1\");\n\tif (opts.lowWaterMark < 0) throw new RangeError(\"lowWaterMark must be >= 0\");\n\tif (opts.lowWaterMark >= opts.highWaterMark)\n\t\tthrow new RangeError(\"lowWaterMark must be < highWaterMark\");\n\tconst lockId = Symbol(`bp-${++nextLockId}`);\n\tlet pending = 0;\n\tlet paused = false;\n\n\treturn {\n\t\tonEnqueue(): boolean {\n\t\t\tpending += 1;\n\t\t\tif (!paused && pending >= opts.highWaterMark) {\n\t\t\t\tpaused = true;\n\t\t\t\tsendUp([[PAUSE, lockId]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tonDequeue(): boolean {\n\t\t\tif (pending > 0) pending -= 1;\n\t\t\tif (paused && pending <= opts.lowWaterMark) {\n\t\t\t\tpaused = false;\n\t\t\t\tsendUp([[RESUME, lockId]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tget pending() {\n\t\t\treturn pending;\n\t\t},\n\t\tget paused() {\n\t\t\treturn paused;\n\t\t},\n\t\tdispose() {\n\t\t\tif (paused) {\n\t\t\t\tpaused = false;\n\t\t\t\tsendUp([[RESUME, lockId]]);\n\t\t\t}\n\t\t},\n\t};\n}\n","/**\n * Checkpoint adapters and {@link Graph} save/restore helpers (roadmap §3.1).\n */\n/// <reference lib=\"dom\" />\n\nimport { randomBytes } from \"node:crypto\";\nimport { mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\nimport { COMPLETE, DATA, ERROR } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { producer } from \"../core/sugar.js\";\nimport type { Graph, GraphPersistSnapshot } from \"../graph/graph.js\";\n\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 warnNonJsonValues(data: GraphPersistSnapshot): void {\n\tfor (const [path, node] of Object.entries(data.nodes)) {\n\t\tconst v = node.value;\n\t\tif (v === undefined || v === null) continue;\n\t\tif (typeof v === \"function\" || typeof v === \"symbol\" || typeof v === \"bigint\") {\n\t\t\tconsole.warn(\n\t\t\t\t`checkpoint: node \"${path}\" has non-JSON-serializable value (${typeof v}); it will be lost on round-trip`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction stableSnapshotJson(data: GraphPersistSnapshot): string {\n\twarnNonJsonValues(data);\n\treturn `${JSON.stringify(sortJsonValue(data), undefined, 0)}\\n`;\n}\n\n/**\n * Persists {@link GraphPersistSnapshot} blobs (single save/load contract, roadmap §3.1).\n */\nexport interface CheckpointAdapter {\n\tsave(data: GraphPersistSnapshot): void;\n\tload(): GraphPersistSnapshot | null;\n}\n\n/**\n * In-memory adapter (process-local; useful for tests).\n *\n * @category extra\n */\nexport class MemoryCheckpointAdapter implements CheckpointAdapter {\n\t#data: GraphPersistSnapshot | null = null;\n\n\tsave(data: GraphPersistSnapshot): void {\n\t\tthis.#data = JSON.parse(JSON.stringify(data)) as GraphPersistSnapshot;\n\t}\n\n\tload(): GraphPersistSnapshot | null {\n\t\treturn this.#data === null\n\t\t\t? null\n\t\t\t: (JSON.parse(JSON.stringify(this.#data)) as GraphPersistSnapshot);\n\t}\n}\n\n/**\n * Stores JSON-cloned snapshots under a key inside a caller-owned record (tests / embedding).\n *\n * @category extra\n */\nexport class DictCheckpointAdapter implements CheckpointAdapter {\n\treadonly #storage: Record<string, unknown>;\n\treadonly #key: string;\n\n\tconstructor(storage: Record<string, unknown>, key = \"graphrefly_checkpoint\") {\n\t\tthis.#storage = storage;\n\t\tthis.#key = key;\n\t}\n\n\tsave(data: GraphPersistSnapshot): void {\n\t\tthis.#storage[this.#key] = JSON.parse(JSON.stringify(data)) as Record<string, unknown>;\n\t}\n\n\tload(): GraphPersistSnapshot | null {\n\t\tconst raw = this.#storage[this.#key];\n\t\treturn raw !== null && typeof raw === \"object\" && !Array.isArray(raw)\n\t\t\t? (JSON.parse(JSON.stringify(raw)) as GraphPersistSnapshot)\n\t\t\t: null;\n\t}\n}\n\n/**\n * Atomic JSON file persistence (temp file in the target directory, then `rename`).\n *\n * @remarks\n * **Errors:** `load()` returns `null` for missing files, empty files, or invalid JSON (no throw).\n *\n * @category extra\n */\nexport class FileCheckpointAdapter implements CheckpointAdapter {\n\treadonly #path: string;\n\n\tconstructor(path: string) {\n\t\tthis.#path = path;\n\t}\n\n\tsave(data: GraphPersistSnapshot): void {\n\t\tconst dir = dirname(this.#path);\n\t\tmkdirSync(dir, { recursive: true });\n\t\tconst payload = stableSnapshotJson(data);\n\t\tconst base = basename(this.#path);\n\t\tconst tmp = join(dir, `.${base}.${randomBytes(8).toString(\"hex\")}.tmp`);\n\t\ttry {\n\t\t\twriteFileSync(tmp, payload, \"utf8\");\n\t\t\trenameSync(tmp, this.#path);\n\t\t} catch (e) {\n\t\t\ttry {\n\t\t\t\tunlinkSync(tmp);\n\t\t\t} catch {\n\t\t\t\t/* ignore */\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\tload(): GraphPersistSnapshot | null {\n\t\ttry {\n\t\t\tconst text = readFileSync(this.#path, \"utf8\").trim();\n\t\t\tif (!text) return null;\n\t\t\tconst data = JSON.parse(text) as unknown;\n\t\t\treturn data !== null && typeof data === \"object\" && !Array.isArray(data)\n\t\t\t\t? (data as GraphPersistSnapshot)\n\t\t\t\t: null;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n/**\n * Persists one JSON blob under a fixed key using Node.js `node:sqlite` ({@link DatabaseSync}).\n *\n * @remarks\n * **Runtime:** Requires Node 22.5+ with `node:sqlite` enabled (experimental in some releases). Call `close()` when discarding the adapter.\n *\n * @category extra\n */\nexport class SqliteCheckpointAdapter implements CheckpointAdapter {\n\treadonly #db: DatabaseSync;\n\treadonly #key: string;\n\n\tconstructor(path: string, key = \"graphrefly_checkpoint\") {\n\t\tthis.#db = new DatabaseSync(path);\n\t\tthis.#key = key;\n\t\tthis.#db.exec(\n\t\t\t`CREATE TABLE IF NOT EXISTS graphrefly_checkpoint (k TEXT PRIMARY KEY, v TEXT NOT NULL)`,\n\t\t);\n\t}\n\n\tsave(data: GraphPersistSnapshot): void {\n\t\tconst payload = stableSnapshotJson(data).trimEnd();\n\t\tthis.#db\n\t\t\t.prepare(`INSERT OR REPLACE INTO graphrefly_checkpoint (k, v) VALUES (?, ?)`)\n\t\t\t.run(this.#key, payload);\n\t}\n\n\tload(): GraphPersistSnapshot | null {\n\t\tconst row = this.#db\n\t\t\t.prepare(`SELECT v FROM graphrefly_checkpoint WHERE k = ?`)\n\t\t\t.get(this.#key) as { v: string } | undefined;\n\t\tif (row === undefined || typeof row.v !== \"string\" || row.v.trim() === \"\") return null;\n\t\tconst parsed = JSON.parse(row.v) as unknown;\n\t\treturn parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed)\n\t\t\t? (parsed as GraphPersistSnapshot)\n\t\t\t: null;\n\t}\n\n\t/** Close the underlying SQLite connection (safe to call more than once). */\n\tclose(): void {\n\t\ttry {\n\t\t\tthis.#db.close();\n\t\t} catch {\n\t\t\t/* ignore if already closed */\n\t\t}\n\t}\n}\n\n/**\n * Writes {@link Graph.snapshot} through `adapter.save`.\n *\n * @param graph - Target graph instance.\n * @param adapter - Sync persistence backend.\n * @returns `void` — side-effect only; the snapshot is written to `adapter`.\n *\n * @example\n * ```ts\n * import { saveGraphCheckpoint, MemoryCheckpointAdapter, Graph } from \"@graphrefly/graphrefly-ts\";\n *\n * const g = new Graph(\"app\");\n * const adapter = new MemoryCheckpointAdapter();\n * saveGraphCheckpoint(g, adapter);\n * ```\n *\n * @category extra\n */\nexport function saveGraphCheckpoint(graph: Graph, adapter: CheckpointAdapter): void {\n\tadapter.save(graph.snapshot());\n}\n\n/**\n * Loads a snapshot via `adapter.load` and applies {@link Graph.restore} when data exists.\n *\n * @param graph - Graph whose topology matches the snapshot.\n * @param adapter - Sync persistence backend.\n * @returns `true` if data was present and `restore` ran; `false` if `load()` returned `null`.\n *\n * @example\n * ```ts\n * import {\n * saveGraphCheckpoint,\n * restoreGraphCheckpoint,\n * MemoryCheckpointAdapter,\n * Graph,\n * } from \"@graphrefly/graphrefly-ts\";\n *\n * const g = new Graph(\"app\");\n * const adapter = new MemoryCheckpointAdapter();\n * saveGraphCheckpoint(g, adapter);\n *\n * const g2 = new Graph(\"app\");\n * restoreGraphCheckpoint(g2, adapter); // true\n * ```\n *\n * @category extra\n */\nexport function restoreGraphCheckpoint(graph: Graph, adapter: CheckpointAdapter): boolean {\n\tconst data = adapter.load();\n\tif (data === null) return false;\n\tgraph.restore(data);\n\treturn true;\n}\n\n/**\n * Minimal JSON-shaped payload for a single node's cached value (custom adapters).\n *\n * @param n - Any {@link Node}.\n * @returns `{ version: 1, value }` from {@link Node.get}.\n *\n * @example\n * ```ts\n * import { checkpointNodeValue, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const s = state(42);\n * checkpointNodeValue(s); // { version: 1, value: 42 }\n * ```\n *\n * @category extra\n */\nexport function checkpointNodeValue<T>(n: Node<T>): { version: number; value: T | undefined } {\n\treturn { version: 1, value: n.get() };\n}\n\nexport type IndexedDbCheckpointSpec = {\n\tdbName: string;\n\tstoreName: string;\n\t/** @default \"graphrefly_checkpoint\" */\n\tkey?: string;\n\tversion?: number;\n};\n\n/**\n * Wraps an `IDBRequest` as a one-shot reactive source.\n *\n * @param req - Request whose callbacks are converted to protocol messages.\n * @returns `Node<T>` that emits `DATA` once on success, then `COMPLETE`; emits `ERROR` on failure.\n *\n * @example\n * ```ts\n * import { fromIDBRequest } from \"@graphrefly/graphrefly-ts\";\n *\n * const req = indexedDB.open(\"myDb\", 1);\n * fromIDBRequest(req).subscribe((msgs) => console.log(msgs));\n * // Emits [[DATA, IDBDatabase], [COMPLETE]] on success\n * ```\n *\n * @category extra\n */\nexport function fromIDBRequest<T>(req: IDBRequest<T>): Node<T> {\n\treturn producer<T>((_d, a) => {\n\t\tlet done = false;\n\t\tconst clear = () => {\n\t\t\treq.onsuccess = null;\n\t\t\treq.onerror = null;\n\t\t};\n\t\treq.onsuccess = () => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t\ta.down([[DATA, req.result], [COMPLETE]]);\n\t\t};\n\t\treq.onerror = () => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t\ta.down([[ERROR, req.error ?? new Error(\"IndexedDB request failed\")]]);\n\t\t};\n\t\treturn () => {\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t};\n\t});\n}\n\n/**\n * Wraps an `IDBTransaction` terminal lifecycle as a one-shot reactive source.\n *\n * @param tx - Transaction to observe.\n * @returns `Node<void>` that emits `DATA` (`undefined`) then `COMPLETE` on success; emits `ERROR` on `error`/`abort`.\n *\n * @example\n * ```ts\n * import { fromIDBTransaction } from \"@graphrefly/graphrefly-ts\";\n *\n * const db: IDBDatabase = ...; // obtained from indexedDB.open\n * const tx = db.transaction(\"store\", \"readwrite\");\n * fromIDBTransaction(tx).subscribe((msgs) => console.log(msgs));\n * // Emits [[DATA, undefined], [COMPLETE]] when the transaction commits\n * ```\n *\n * @category extra\n */\nexport function fromIDBTransaction(tx: IDBTransaction): Node<void> {\n\treturn producer<void>((_d, a) => {\n\t\tlet done = false;\n\t\tconst clear = () => {\n\t\t\ttx.oncomplete = null;\n\t\t\ttx.onerror = null;\n\t\t\ttx.onabort = null;\n\t\t};\n\t\ttx.oncomplete = () => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t\ta.down([[DATA, undefined], [COMPLETE]]);\n\t\t};\n\t\ttx.onerror = () => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t\ta.down([[ERROR, tx.error ?? new Error(\"IndexedDB transaction failed\")]]);\n\t\t};\n\t\ttx.onabort = () => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t\ta.down([[ERROR, tx.error ?? new Error(\"IndexedDB transaction aborted\")]]);\n\t\t};\n\t\treturn () => {\n\t\t\tdone = true;\n\t\t\tclear();\n\t\t};\n\t});\n}\n\nfunction openIdbNode(dbName: string, storeName: string, version: number): Node<IDBDatabase> {\n\treturn producer<IDBDatabase>((_d, a) => {\n\t\tif (typeof indexedDB === \"undefined\") {\n\t\t\ta.down([[ERROR, new TypeError(\"indexedDB is not available in this environment\")]]);\n\t\t\treturn undefined;\n\t\t}\n\t\tconst req = indexedDB.open(dbName, version);\n\t\treq.onupgradeneeded = () => {\n\t\t\tconst db = req.result;\n\t\t\tif (!db.objectStoreNames.contains(storeName)) {\n\t\t\t\tdb.createObjectStore(storeName);\n\t\t\t}\n\t\t};\n\t\tconst unsub = fromIDBRequest(req).subscribe((msgs) => a.down(msgs));\n\t\treturn () => {\n\t\t\tunsub();\n\t\t};\n\t});\n}\n\n/**\n * Persists {@link Graph.snapshot} under `spec.key` (browser IndexedDB).\n *\n * @param graph - Graph to snapshot.\n * @param spec - Database name, object store name, optional `key` and schema `version`.\n * @returns A reactive `Node<void>` that emits `DATA` (`undefined`) then `COMPLETE` on success, or `ERROR` on failure.\n *\n * @remarks\n * **Environment:** Emits `ERROR` if `indexedDB` is undefined (e.g. Node without a polyfill).\n *\n * @example\n * ```ts\n * import { saveGraphCheckpointIndexedDb, Graph } from \"@graphrefly/graphrefly-ts\";\n *\n * const g = new Graph(\"app\");\n * const save$ = saveGraphCheckpointIndexedDb(g, {\n * dbName: \"myApp\",\n * storeName: \"checkpoints\",\n * });\n * save$.subscribe((msgs) => console.log(\"saved:\", msgs));\n * ```\n *\n * @category extra\n */\nexport function saveGraphCheckpointIndexedDb(\n\tgraph: Graph,\n\tspec: IndexedDbCheckpointSpec,\n): Node<void> {\n\tconst key = spec.key ?? \"graphrefly_checkpoint\";\n\treturn producer<void>((_d, a) => {\n\t\tlet db: IDBDatabase | undefined;\n\t\tlet opUnsub: (() => void) | undefined;\n\t\tlet done = false;\n\t\tconst close = () => {\n\t\t\tif (db === undefined) return;\n\t\t\tdb.close();\n\t\t\tdb = undefined;\n\t\t};\n\t\tconst finishWith = (msgs: [symbol, unknown?][]) => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\ta.down(msgs);\n\t\t\topUnsub?.();\n\t\t\topUnsub = undefined;\n\t\t\topenUnsub();\n\t\t\tclose();\n\t\t};\n\t\tconst startWrite = () => {\n\t\t\tif (db === undefined || opUnsub !== undefined) return;\n\t\t\tconst tx = db.transaction(spec.storeName, \"readwrite\");\n\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\tlet reqDone = false;\n\t\t\tlet txDone = false;\n\t\t\tlet reqError: unknown;\n\t\t\tlet unsubReq: (() => void) | undefined;\n\t\t\tlet unsubTx: (() => void) | undefined;\n\t\t\tconst maybeFinish = () => {\n\t\t\t\tif (reqError !== undefined) {\n\t\t\t\t\tfinishWith([[ERROR, reqError]]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!reqDone || !txDone) return;\n\t\t\t\tfinishWith([[DATA, undefined], [COMPLETE]]);\n\t\t\t};\n\t\t\tunsubReq = fromIDBRequest(store.put(graph.snapshot(), key)).subscribe((msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === ERROR) reqError = m[1];\n\t\t\t\t\tif (m[0] === COMPLETE || m[0] === ERROR) reqDone = true;\n\t\t\t\t}\n\t\t\t\tmaybeFinish();\n\t\t\t});\n\t\t\tunsubTx = fromIDBTransaction(tx).subscribe((msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === ERROR) {\n\t\t\t\t\t\tfinishWith([[ERROR, m[1]]]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (m[0] === COMPLETE) txDone = true;\n\t\t\t\t}\n\t\t\t\tmaybeFinish();\n\t\t\t});\n\t\t\topUnsub = () => {\n\t\t\t\tunsubReq?.();\n\t\t\t\tunsubReq = undefined;\n\t\t\t\tunsubTx?.();\n\t\t\t\tunsubTx = undefined;\n\t\t\t};\n\t\t};\n\t\tconst openUnsub = openIdbNode(spec.dbName, spec.storeName, spec.version ?? 1).subscribe(\n\t\t\t(msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === DATA) {\n\t\t\t\t\t\tdb = m[1] as IDBDatabase;\n\t\t\t\t\t\tstartWrite();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (m[0] === ERROR) {\n\t\t\t\t\t\tfinishWith([[ERROR, m[1]]]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t\treturn () => {\n\t\t\topUnsub?.();\n\t\t\topUnsub = undefined;\n\t\t\topenUnsub();\n\t\t\tclose();\n\t\t};\n\t});\n}\n\n/**\n * Loads a snapshot from IndexedDB and applies {@link Graph.restore} when present.\n *\n * @param graph - Graph whose topology matches the stored snapshot.\n * @param spec - Same `dbName` / `storeName` / `key` / `version` as save.\n * @returns A reactive `Node<boolean>`: emits `true` if a snapshot was restored, `false` if missing or not a plain object, then `COMPLETE`; or `ERROR` on I/O failure.\n *\n * @example\n * ```ts\n * import { restoreGraphCheckpointIndexedDb, Graph } from \"@graphrefly/graphrefly-ts\";\n *\n * const g = new Graph(\"app\");\n * const restore$ = restoreGraphCheckpointIndexedDb(g, {\n * dbName: \"myApp\",\n * storeName: \"checkpoints\",\n * });\n * restore$.subscribe((msgs) => console.log(\"restored:\", msgs));\n * // Emits [[DATA, true], [COMPLETE]] if a snapshot was found and applied\n * ```\n *\n * @category extra\n */\nexport function restoreGraphCheckpointIndexedDb(\n\tgraph: Graph,\n\tspec: IndexedDbCheckpointSpec,\n): Node<boolean> {\n\tconst key = spec.key ?? \"graphrefly_checkpoint\";\n\treturn producer<boolean>((_d, a) => {\n\t\tlet db: IDBDatabase | undefined;\n\t\tlet reqUnsub: (() => void) | undefined;\n\t\tlet txUnsub: (() => void) | undefined;\n\t\tlet done = false;\n\t\tlet txDone = false;\n\t\tlet requestDone = false;\n\t\tlet requestValue: unknown;\n\t\tlet requestError: unknown;\n\t\tconst close = () => {\n\t\t\tif (db === undefined) return;\n\t\t\tdb.close();\n\t\t\tdb = undefined;\n\t\t};\n\t\tconst finishWith = (msgs: [symbol, unknown?][]) => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\ta.down(msgs);\n\t\t\treqUnsub?.();\n\t\t\treqUnsub = undefined;\n\t\t\ttxUnsub?.();\n\t\t\ttxUnsub = undefined;\n\t\t\topenUnsub();\n\t\t\tclose();\n\t\t};\n\t\tconst maybeEmitResult = () => {\n\t\t\tif (!requestDone || !txDone) return;\n\t\t\tif (requestError !== undefined) {\n\t\t\t\tfinishWith([[ERROR, requestError]]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (requestValue === undefined || requestValue === null) {\n\t\t\t\tfinishWith([[DATA, false], [COMPLETE]]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (typeof requestValue !== \"object\" || Array.isArray(requestValue)) {\n\t\t\t\tfinishWith([[DATA, false], [COMPLETE]]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgraph.restore(requestValue as GraphPersistSnapshot);\n\t\t\tfinishWith([[DATA, true], [COMPLETE]]);\n\t\t};\n\t\tconst startRead = () => {\n\t\t\tif (db === undefined || reqUnsub !== undefined || txUnsub !== undefined) return;\n\t\t\tconst tx = db.transaction(spec.storeName, \"readonly\");\n\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\treqUnsub = fromIDBRequest(store.get(key)).subscribe((msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === DATA) requestValue = m[1];\n\t\t\t\t\tif (m[0] === ERROR) requestError = m[1];\n\t\t\t\t\tif (m[0] === COMPLETE || m[0] === ERROR) requestDone = true;\n\t\t\t\t}\n\t\t\t\tmaybeEmitResult();\n\t\t\t});\n\t\t\ttxUnsub = fromIDBTransaction(tx).subscribe((msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === ERROR) {\n\t\t\t\t\t\tfinishWith([[ERROR, m[1]]]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (m[0] === COMPLETE) txDone = true;\n\t\t\t\t}\n\t\t\t\tmaybeEmitResult();\n\t\t\t});\n\t\t};\n\t\tconst openUnsub = openIdbNode(spec.dbName, spec.storeName, spec.version ?? 1).subscribe(\n\t\t\t(msgs) => {\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === DATA) {\n\t\t\t\t\t\tdb = m[1] as IDBDatabase;\n\t\t\t\t\t\tstartRead();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (m[0] === ERROR) {\n\t\t\t\t\t\tfinishWith([[ERROR, m[1]]]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t\treturn () => {\n\t\t\treqUnsub?.();\n\t\t\treqUnsub = undefined;\n\t\t\ttxUnsub?.();\n\t\t\ttxUnsub = undefined;\n\t\t\topenUnsub();\n\t\t\tclose();\n\t\t};\n\t});\n}\n","/**\n * `dynamicNode` — runtime dep tracking with diamond resolution (Phase 0.3b).\n *\n * Unlike `node()` where deps are fixed at construction, `dynamicNode` discovers\n * deps at runtime via a tracking `get()` proxy. After each recompute, deps are\n * diffed: new deps are connected, removed deps are disconnected, and bitmasks\n * are rebuilt. Kept deps retain their subscriptions (no teardown/reconnect churn).\n *\n * This ports callbag-recharge's `dynamicDerived` pattern to GraphReFly's protocol.\n */\nimport type { Actor } from \"./actor.js\";\nimport { normalizeActor } from \"./actor.js\";\nimport { emitWithBatch } from \"./batch.js\";\nimport { wallClockNs } from \"./clock.js\";\nimport type { GuardAction, NodeGuard } from \"./guard.js\";\nimport { GuardDenied } from \"./guard.js\";\nimport {\n\tCOMPLETE,\n\tDATA,\n\tDIRTY,\n\tERROR,\n\tINVALIDATE,\n\ttype Message,\n\ttype Messages,\n\tPAUSE,\n\tpropagatesToMeta,\n\tRESOLVED,\n\tRESUME,\n\tTEARDOWN,\n} from \"./messages.js\";\nimport {\n\tnode as createNode,\n\ttype Node,\n\ttype NodeActions,\n\ttype NodeDescribeKind,\n\ttype NodeInspectorHook,\n\ttype NodeOptions,\n\ttype NodeSink,\n\ttype NodeStatus,\n\ttype NodeTransportOptions,\n\ttype OnMessageHandler,\n\ttype SubscribeHints,\n} from \"./node.js\";\n\n/**\n * The tracking `get` function passed to `dynamicNode`'s compute function.\n * Each call to `get(dep)` reads the dep's current value and records it as a dependency.\n */\nexport type DynGet = <V>(dep: Node<V>) => V | undefined;\n\n/**\n * Compute function for `dynamicNode`. Receives a tracking `get` proxy.\n * Deps are discovered by which nodes are passed to `get()` during execution.\n */\nexport type DynamicNodeFn<T> = (get: DynGet) => T;\n\n/** Options for `dynamicNode`. */\nexport type DynamicNodeOptions = Pick<\n\tNodeOptions,\n\t| \"name\"\n\t| \"equals\"\n\t| \"meta\"\n\t| \"resubscribable\"\n\t| \"resetOnTeardown\"\n\t| \"guard\"\n\t| \"onMessage\"\n\t| \"onResubscribe\"\n\t| \"completeWhenDepsComplete\"\n\t| \"describeKind\"\n>;\n\n/**\n * Creates a node with runtime dep tracking. Deps are discovered each time the\n * compute function runs by tracking which nodes are passed to the `get()` proxy.\n *\n * After each recompute:\n * - New deps (not in previous set) are subscribed\n * - Removed deps (not in current set) are unsubscribed\n * - Kept deps retain their existing subscriptions\n * - Bitmasks are rebuilt to match the new dep set\n *\n * The node participates fully in diamond resolution via the standard two-phase\n * DIRTY/RESOLVED protocol across all dynamically-tracked deps.\n *\n * @param fn - Compute function receiving a tracking `get` proxy.\n * @param opts - Optional configuration.\n * @returns `Node<T>` with dynamic dep tracking.\n *\n * @example\n * ```ts\n * import { dynamicNode, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const cond = state(true);\n * const a = state(1);\n * const b = state(2);\n *\n * // Deps change based on cond's value\n * const d = dynamicNode((get) => {\n * const useA = get(cond);\n * return useA ? get(a) : get(b);\n * });\n * ```\n *\n * @category core\n */\nexport function dynamicNode<T = unknown>(fn: DynamicNodeFn<T>, opts?: DynamicNodeOptions): Node<T> {\n\treturn new DynamicNodeImpl<T>(fn, opts ?? {});\n}\n\n/** @internal — exported for {@link describeNode} `instanceof` check. */\nexport class DynamicNodeImpl<T = unknown> implements Node<T> {\n\tprivate readonly _optsName: string | undefined;\n\tprivate _registryName: string | undefined;\n\treadonly _describeKind: NodeDescribeKind | undefined;\n\treadonly meta: Record<string, Node>;\n\tprivate readonly _fn: DynamicNodeFn<T>;\n\tprivate readonly _equals: (a: unknown, b: unknown) => boolean;\n\tprivate readonly _resubscribable: boolean;\n\tprivate readonly _resetOnTeardown: boolean;\n\tprivate readonly _autoComplete: boolean;\n\tprivate readonly _onMessage: OnMessageHandler | undefined;\n\tprivate readonly _onResubscribe: (() => void) | undefined;\n\t/** @internal — read by {@link describeNode} for `accessHintForGuard`. */\n\treadonly _guard: NodeGuard | undefined;\n\tprivate _lastMutation: { actor: Actor; timestamp_ns: number } | undefined;\n\tprivate _inspectorHook: NodeInspectorHook | undefined;\n\n\t// Sink tracking\n\tprivate _sinkCount = 0;\n\tprivate _singleDepSinkCount = 0;\n\tprivate _singleDepSinks = new WeakSet<NodeSink>();\n\n\t// Actions object (for onMessage handler)\n\tprivate readonly _actions: NodeActions;\n\tprivate readonly _boundEmitToSinks: (messages: Messages) => void;\n\n\t// Mutable state\n\tprivate _cached: T | undefined;\n\tprivate _status: NodeStatus = \"disconnected\";\n\tprivate _terminal = false;\n\tprivate _connected = false;\n\tprivate _rewiring = false; // re-entrancy guard\n\n\t// Dynamic deps tracking\n\tprivate _deps: Node[] = [];\n\tprivate _depUnsubs: Array<() => void> = [];\n\tprivate _depIndexMap = new Map<Node, number>(); // node → index in _deps\n\tprivate _dirtyBits = new Set<number>();\n\tprivate _settledBits = new Set<number>();\n\tprivate _completeBits = new Set<number>();\n\n\t// Sinks\n\tprivate _sinks: NodeSink | Set<NodeSink> | null = null;\n\n\tconstructor(fn: DynamicNodeFn<T>, opts: DynamicNodeOptions) {\n\t\tthis._fn = fn;\n\t\tthis._optsName = opts.name;\n\t\tthis._describeKind = opts.describeKind;\n\t\tthis._equals = opts.equals ?? Object.is;\n\t\tthis._resubscribable = opts.resubscribable ?? false;\n\t\tthis._resetOnTeardown = opts.resetOnTeardown ?? false;\n\t\tthis._autoComplete = opts.completeWhenDepsComplete ?? true;\n\t\tthis._onMessage = opts.onMessage;\n\t\tthis._onResubscribe = opts.onResubscribe;\n\t\tthis._guard = opts.guard;\n\t\tthis._inspectorHook = undefined;\n\n\t\t// Build companion meta nodes (same pattern as NodeImpl)\n\t\tconst meta: Record<string, Node> = {};\n\t\tfor (const [k, v] of Object.entries(opts.meta ?? {})) {\n\t\t\tmeta[k] = createNode({\n\t\t\t\tinitial: v,\n\t\t\t\tname: `${opts.name ?? \"dynamicNode\"}:meta:${k}`,\n\t\t\t\tdescribeKind: \"state\",\n\t\t\t\t...(opts.guard != null ? { guard: opts.guard } : {}),\n\t\t\t});\n\t\t}\n\t\tObject.freeze(meta);\n\t\tthis.meta = meta;\n\n\t\t// Actions object: created once, references `this` methods.\n\t\tconst self = this;\n\t\tthis._actions = {\n\t\t\tdown(messages): void {\n\t\t\t\tself._downInternal(messages);\n\t\t\t},\n\t\t\temit(value): void {\n\t\t\t\tself._emitAutoValue(value);\n\t\t\t},\n\t\t\tup(messages): void {\n\t\t\t\tfor (const dep of self._deps) {\n\t\t\t\t\tdep.up?.(messages, { internal: true });\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\n\t\t// Bind commonly detached protocol methods\n\t\tthis._boundEmitToSinks = this._emitToSinks.bind(this);\n\t}\n\n\tget name(): string | undefined {\n\t\treturn this._registryName ?? this._optsName;\n\t}\n\n\t/** @internal */\n\t_assignRegistryName(localName: string): void {\n\t\tif (this._optsName !== undefined || this._registryName !== undefined) return;\n\t\tthis._registryName = localName;\n\t}\n\n\t/**\n\t * @internal Attach/remove inspector hook for graph-level observability.\n\t * Returns a disposer that restores the previous hook.\n\t */\n\t_setInspectorHook(hook?: NodeInspectorHook): () => void {\n\t\tconst prev = this._inspectorHook;\n\t\tthis._inspectorHook = hook;\n\t\treturn () => {\n\t\t\tif (this._inspectorHook === hook) {\n\t\t\t\tthis._inspectorHook = prev;\n\t\t\t}\n\t\t};\n\t}\n\n\tget status(): NodeStatus {\n\t\treturn this._status;\n\t}\n\n\tget lastMutation(): Readonly<{ actor: Actor; timestamp_ns: number }> | undefined {\n\t\treturn this._lastMutation;\n\t}\n\n\t/** Versioning not yet supported on DynamicNodeImpl. */\n\tget v(): undefined {\n\t\treturn undefined;\n\t}\n\n\thasGuard(): boolean {\n\t\treturn this._guard != null;\n\t}\n\n\tallowsObserve(actor: Actor): boolean {\n\t\tif (this._guard == null) return true;\n\t\treturn this._guard(normalizeActor(actor), \"observe\");\n\t}\n\n\tget(): T | undefined {\n\t\treturn this._cached;\n\t}\n\n\tdown(messages: Messages, options?: NodeTransportOptions): void {\n\t\tif (messages.length === 0) return;\n\t\tif (!options?.internal && this._guard != null) {\n\t\t\tconst actor = normalizeActor(options?.actor);\n\t\t\tconst delivery = options?.delivery ?? \"write\";\n\t\t\tconst action: GuardAction = delivery === \"signal\" ? \"signal\" : \"write\";\n\t\t\tif (!this._guard(actor, action)) {\n\t\t\t\tthrow new GuardDenied({ actor, action, nodeName: this.name });\n\t\t\t}\n\t\t\tthis._lastMutation = { actor, timestamp_ns: wallClockNs() };\n\t\t}\n\t\tthis._downInternal(messages);\n\t}\n\n\tprivate _downInternal(messages: Messages): void {\n\t\tif (messages.length === 0) return;\n\t\tlet sinkMessages = messages;\n\t\tif (this._terminal && !this._resubscribable) {\n\t\t\tconst pass = messages.filter((m) => m[0] === TEARDOWN || m[0] === INVALIDATE);\n\t\t\tif (pass.length === 0) return;\n\t\t\tsinkMessages = pass as Messages;\n\t\t}\n\t\tthis._handleLocalLifecycle(sinkMessages);\n\t\t// Single-dep optimization: skip DIRTY to sinks when sole subscriber is single-dep\n\t\t// AND the batch contains a phase-2 message (DATA/RESOLVED). Standalone DIRTY\n\t\t// (without follow-up) must pass through so downstream is notified.\n\t\tif (this._canSkipDirty()) {\n\t\t\t// Inline check: does the batch contain DATA or RESOLVED?\n\t\t\tlet hasPhase2 = false;\n\t\t\tfor (let i = 0; i < sinkMessages.length; i++) {\n\t\t\t\tconst t = sinkMessages[i][0];\n\t\t\t\tif (t === DATA || t === RESOLVED) {\n\t\t\t\t\thasPhase2 = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (hasPhase2) {\n\t\t\t\t// Inline filter: remove DIRTY messages\n\t\t\t\tconst filtered: Message[] = [];\n\t\t\t\tfor (let i = 0; i < sinkMessages.length; i++) {\n\t\t\t\t\tif (sinkMessages[i][0] !== DIRTY) filtered.push(sinkMessages[i]);\n\t\t\t\t}\n\t\t\t\tif (filtered.length > 0) {\n\t\t\t\t\temitWithBatch(this._boundEmitToSinks, filtered);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\temitWithBatch(this._boundEmitToSinks, sinkMessages);\n\t}\n\n\tprivate _canSkipDirty(): boolean {\n\t\treturn this._sinkCount === 1 && this._singleDepSinkCount === 1;\n\t}\n\n\tsubscribe(sink: NodeSink, hints?: SubscribeHints): () => void {\n\t\tif (hints?.actor != null && this._guard != null) {\n\t\t\tconst actor = normalizeActor(hints.actor);\n\t\t\tif (!this._guard(actor, \"observe\")) {\n\t\t\t\tthrow new GuardDenied({ actor, action: \"observe\", nodeName: this.name });\n\t\t\t}\n\t\t}\n\n\t\tif (this._terminal && this._resubscribable) {\n\t\t\tthis._terminal = false;\n\t\t\tthis._status = \"disconnected\";\n\t\t\tthis._onResubscribe?.();\n\t\t}\n\n\t\tthis._sinkCount += 1;\n\t\tif (hints?.singleDep) {\n\t\t\tthis._singleDepSinkCount += 1;\n\t\t\tthis._singleDepSinks.add(sink);\n\t\t}\n\n\t\tif (this._sinks == null) {\n\t\t\tthis._sinks = sink;\n\t\t} else if (typeof this._sinks === \"function\") {\n\t\t\tthis._sinks = new Set<NodeSink>([this._sinks, sink]);\n\t\t} else {\n\t\t\tthis._sinks.add(sink);\n\t\t}\n\n\t\tif (!this._connected) {\n\t\t\tthis._connect();\n\t\t}\n\n\t\tlet removed = false;\n\t\treturn () => {\n\t\t\tif (removed) return;\n\t\t\tremoved = true;\n\t\t\tthis._sinkCount -= 1;\n\t\t\tif (this._singleDepSinks.has(sink)) {\n\t\t\t\tthis._singleDepSinkCount -= 1;\n\t\t\t\tthis._singleDepSinks.delete(sink);\n\t\t\t}\n\t\t\tif (this._sinks == null) return;\n\t\t\tif (typeof this._sinks === \"function\") {\n\t\t\t\tif (this._sinks === sink) this._sinks = null;\n\t\t\t} else {\n\t\t\t\tthis._sinks.delete(sink);\n\t\t\t\tif (this._sinks.size === 1) {\n\t\t\t\t\tconst [only] = this._sinks;\n\t\t\t\t\tthis._sinks = only;\n\t\t\t\t} else if (this._sinks.size === 0) {\n\t\t\t\t\tthis._sinks = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this._sinks == null) {\n\t\t\t\tthis._disconnect();\n\t\t\t}\n\t\t};\n\t}\n\n\tup(messages: Messages, options?: NodeTransportOptions): void {\n\t\tif (this._deps.length === 0) return;\n\t\tif (!options?.internal && this._guard != null) {\n\t\t\tconst actor = normalizeActor(options?.actor);\n\t\t\tif (!this._guard(actor, \"write\")) {\n\t\t\t\tthrow new GuardDenied({ actor, action: \"write\", nodeName: this.name });\n\t\t\t}\n\t\t\tthis._lastMutation = { actor, timestamp_ns: wallClockNs() };\n\t\t}\n\t\tfor (const dep of this._deps) {\n\t\t\tdep.up?.(messages, options);\n\t\t}\n\t}\n\n\tunsubscribe(): void {\n\t\tthis._disconnect();\n\t}\n\n\t// --- Private methods ---\n\n\tprivate _emitToSinks(messages: Messages): void {\n\t\tif (this._sinks == null) return;\n\t\tif (typeof this._sinks === \"function\") {\n\t\t\tthis._sinks(messages);\n\t\t\treturn;\n\t\t}\n\t\tconst snapshot = [...this._sinks];\n\t\tfor (const sink of snapshot) {\n\t\t\tsink(messages);\n\t\t}\n\t}\n\n\tprivate _handleLocalLifecycle(messages: Messages): void {\n\t\tfor (const m of messages) {\n\t\t\tconst t = m[0];\n\t\t\tif (t === DATA) this._cached = m[1] as T;\n\t\t\tif (t === INVALIDATE) {\n\t\t\t\tthis._cached = undefined;\n\t\t\t}\n\t\t\tif (t === DATA || t === RESOLVED) {\n\t\t\t\tthis._status = \"settled\";\n\t\t\t} else if (t === DIRTY) {\n\t\t\t\tthis._status = \"dirty\";\n\t\t\t} else if (t === COMPLETE) {\n\t\t\t\tthis._status = \"completed\";\n\t\t\t\tthis._terminal = true;\n\t\t\t} else if (t === ERROR) {\n\t\t\t\tthis._status = \"errored\";\n\t\t\t\tthis._terminal = true;\n\t\t\t}\n\t\t\tif (t === TEARDOWN) {\n\t\t\t\tif (this._resetOnTeardown) this._cached = undefined;\n\t\t\t\ttry {\n\t\t\t\t\tthis._propagateToMeta(t);\n\t\t\t\t} finally {\n\t\t\t\t\tthis._disconnect();\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Propagate other meta-eligible signals (centralized in messages.ts).\n\t\t\tif (t !== TEARDOWN && propagatesToMeta(t)) {\n\t\t\t\tthis._propagateToMeta(t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Propagate a signal to all companion meta nodes (best-effort). */\n\tprivate _propagateToMeta(t: symbol): void {\n\t\tfor (const metaNode of Object.values(this.meta)) {\n\t\t\ttry {\n\t\t\t\tmetaNode.down([[t]], { internal: true });\n\t\t\t} catch {\n\t\t\t\t/* best-effort: other meta nodes still receive the signal */\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _emitAutoValue(value: unknown): void {\n\t\tconst wasDirty = this._status === \"dirty\";\n\t\tconst unchanged = this._equals(this._cached, value);\n\t\tif (unchanged) {\n\t\t\tthis._downInternal(wasDirty ? [[RESOLVED]] : [[DIRTY], [RESOLVED]]);\n\t\t\treturn;\n\t\t}\n\t\tthis._cached = value as T;\n\t\tthis._downInternal(wasDirty ? [[DATA, value]] : [[DIRTY], [DATA, value]]);\n\t}\n\n\tprivate _connect(): void {\n\t\tif (this._connected) return;\n\t\tthis._connected = true;\n\t\tthis._status = \"settled\";\n\t\tthis._dirtyBits.clear();\n\t\tthis._settledBits.clear();\n\t\tthis._completeBits.clear();\n\t\tthis._runFn();\n\t}\n\n\tprivate _disconnect(): void {\n\t\tif (!this._connected) return;\n\t\tfor (const unsub of this._depUnsubs) unsub();\n\t\tthis._depUnsubs = [];\n\t\tthis._deps = [];\n\t\tthis._depIndexMap.clear();\n\t\tthis._dirtyBits.clear();\n\t\tthis._settledBits.clear();\n\t\tthis._completeBits.clear();\n\t\tthis._connected = false;\n\t\tthis._status = \"disconnected\";\n\t}\n\n\tprivate _runFn(): void {\n\t\tif (this._terminal && !this._resubscribable) return;\n\t\tif (this._rewiring) return;\n\n\t\t// Track deps during fn execution\n\t\tconst trackedDeps: Node[] = [];\n\t\tconst trackedSet = new Set<Node>();\n\n\t\tconst get: DynGet = <V>(dep: Node<V>): V | undefined => {\n\t\t\tif (!trackedSet.has(dep)) {\n\t\t\t\ttrackedSet.add(dep);\n\t\t\t\ttrackedDeps.push(dep);\n\t\t\t}\n\t\t\treturn dep.get();\n\t\t};\n\n\t\ttry {\n\t\t\t// Collect dep values for inspector hook\n\t\t\tconst depValues: unknown[] = [];\n\t\t\tfor (const dep of this._deps) {\n\t\t\t\tdepValues.push(dep.get());\n\t\t\t}\n\t\t\tthis._inspectorHook?.({ kind: \"run\", depValues });\n\n\t\t\tconst result = this._fn(get);\n\t\t\tthis._rewire(trackedDeps);\n\t\t\tif (result === undefined) return;\n\t\t\tthis._emitAutoValue(result);\n\t\t} catch (err) {\n\t\t\tthis._downInternal([[ERROR, err]]);\n\t\t}\n\t}\n\n\tprivate _rewire(newDeps: Node[]): void {\n\t\tthis._rewiring = true;\n\t\ttry {\n\t\t\tconst oldMap = this._depIndexMap;\n\t\t\tconst newMap = new Map<Node, number>();\n\t\t\tconst newUnsubs: Array<() => void> = [];\n\n\t\t\t// Reuse or create subscriptions\n\t\t\tfor (let i = 0; i < newDeps.length; i++) {\n\t\t\t\tconst dep = newDeps[i];\n\t\t\t\tnewMap.set(dep, i);\n\t\t\t\tconst oldIdx = oldMap.get(dep);\n\t\t\t\tif (oldIdx !== undefined) {\n\t\t\t\t\t// Kept dep — reuse subscription but update index\n\t\t\t\t\tnewUnsubs.push(this._depUnsubs[oldIdx]);\n\t\t\t\t\t// Mark old unsub as consumed\n\t\t\t\t\tthis._depUnsubs[oldIdx] = () => {};\n\t\t\t\t} else {\n\t\t\t\t\t// New dep — subscribe\n\t\t\t\t\tconst idx = i;\n\t\t\t\t\tconst unsub = dep.subscribe((msgs) => this._handleDepMessages(idx, msgs));\n\t\t\t\t\tnewUnsubs.push(unsub);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Disconnect removed deps\n\t\t\tfor (const [dep, oldIdx] of oldMap) {\n\t\t\t\tif (!newMap.has(dep)) {\n\t\t\t\t\tthis._depUnsubs[oldIdx]();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._deps = newDeps;\n\t\t\tthis._depUnsubs = newUnsubs;\n\t\t\tthis._depIndexMap = newMap;\n\t\t\tthis._dirtyBits.clear();\n\t\t\tthis._settledBits.clear();\n\t\t\t// Preserve complete bits for deps that are still present\n\t\t\tconst newCompleteBits = new Set<number>();\n\t\t\tfor (const oldIdx of this._completeBits) {\n\t\t\t\tconst dep = [...oldMap.entries()].find(([, idx]) => idx === oldIdx)?.[0];\n\t\t\t\tif (dep && newMap.has(dep)) {\n\t\t\t\t\tnewCompleteBits.add(newMap.get(dep)!);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._completeBits = newCompleteBits;\n\t\t} finally {\n\t\t\tthis._rewiring = false;\n\t\t}\n\t}\n\n\tprivate _handleDepMessages(index: number, messages: Messages): void {\n\t\tif (this._rewiring) return; // suppress signals during rewire\n\n\t\tfor (const msg of messages) {\n\t\t\tthis._inspectorHook?.({ kind: \"dep_message\", depIndex: index, message: msg });\n\t\t\tconst t = msg[0];\n\t\t\t// User-defined message handler gets first look (spec §2.6).\n\t\t\tif (this._onMessage) {\n\t\t\t\ttry {\n\t\t\t\t\tif (this._onMessage(msg, index, this._actions)) continue;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthis._downInternal([[ERROR, err]]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (t === DIRTY) {\n\t\t\t\tthis._dirtyBits.add(index);\n\t\t\t\tthis._settledBits.delete(index);\n\t\t\t\tif (this._dirtyBits.size === 1) {\n\t\t\t\t\t// First dirty — propagate\n\t\t\t\t\temitWithBatch(this._boundEmitToSinks, [[DIRTY]]);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === DATA || t === RESOLVED) {\n\t\t\t\tif (!this._dirtyBits.has(index)) {\n\t\t\t\t\tthis._dirtyBits.add(index);\n\t\t\t\t\temitWithBatch(this._boundEmitToSinks, [[DIRTY]]);\n\t\t\t\t}\n\t\t\t\tthis._settledBits.add(index);\n\t\t\t\tif (this._allDirtySettled()) {\n\t\t\t\t\tthis._dirtyBits.clear();\n\t\t\t\t\tthis._settledBits.clear();\n\t\t\t\t\tthis._runFn();\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\tthis._completeBits.add(index);\n\t\t\t\tthis._dirtyBits.delete(index);\n\t\t\t\tthis._settledBits.delete(index);\n\t\t\t\tif (this._allDirtySettled()) {\n\t\t\t\t\tthis._dirtyBits.clear();\n\t\t\t\t\tthis._settledBits.clear();\n\t\t\t\t\tthis._runFn();\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tthis._autoComplete &&\n\t\t\t\t\tthis._completeBits.size >= this._deps.length &&\n\t\t\t\t\tthis._deps.length > 0\n\t\t\t\t) {\n\t\t\t\t\tthis._downInternal([[COMPLETE]]);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\tthis._downInternal([msg]);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (t === INVALIDATE || t === TEARDOWN || t === PAUSE || t === RESUME) {\n\t\t\t\tthis._downInternal([msg]);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis._downInternal([msg]);\n\t\t}\n\t}\n\n\tprivate _allDirtySettled(): boolean {\n\t\tif (this._dirtyBits.size === 0) return false;\n\t\tfor (const idx of this._dirtyBits) {\n\t\t\tif (!this._settledBits.has(idx)) return false;\n\t\t}\n\t\treturn true;\n\t}\n}\n","/**\n * Tier 1 sync operators (roadmap §2.1) and Tier 2 async/dynamic operators (roadmap §2.2) —\n * each returns a {@link Node} built with {@link node} (or {@link producer} for cold sources).\n */\n\nimport { monotonicNs } from \"../core/clock.js\";\nimport {\n\tCOMPLETE,\n\tDATA,\n\tDIRTY,\n\tERROR,\n\ttype Message,\n\ttype Messages,\n\tPAUSE,\n\tRESOLVED,\n\tRESUME,\n} from \"../core/messages.js\";\nimport { type Node, type NodeActions, type NodeOptions, node } from \"../core/node.js\";\nimport { derived, producer } from \"../core/sugar.js\";\nimport { NS_PER_MS } from \"./backoff.js\";\nimport { fromAny, type NodeInput } from \"./sources.js\";\n\ntype ExtraOpts = Omit<NodeOptions, \"describeKind\">;\n\nfunction operatorOpts(opts?: ExtraOpts): NodeOptions {\n\treturn { describeKind: \"operator\", ...opts };\n}\n\n/**\n * Maps each settled value from `source` through `project`.\n *\n * @param source - Upstream node.\n * @param project - Transform for each value.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Derived node emitting mapped values.\n *\n * @example\n * ```ts\n * import { map, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = map(state(2), (x) => x * 3);\n * ```\n *\n * @category extra\n */\nexport function map<T, R>(source: Node<T>, project: (value: T) => R, opts?: ExtraOpts): Node<R> {\n\treturn derived([source as Node], ([v]) => project(v as T), operatorOpts(opts));\n}\n\n/**\n * Forwards values that satisfy `predicate`; otherwise emits `RESOLVED` with no `DATA` (two-phase semantics).\n *\n * @param source - Upstream node.\n * @param predicate - Inclusion test.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Filtered node.\n *\n * @example\n * ```ts\n * import { filter, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = filter(state(1), (x) => x > 0);\n * ```\n *\n * @category extra\n */\nexport function filter<T>(\n\tsource: Node<T>,\n\tpredicate: (value: T) => boolean,\n\topts?: ExtraOpts,\n): Node<T> {\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (predicate(v as T)) return v as T;\n\t\t\ta.down([[RESOLVED]]);\n\t\t\treturn undefined;\n\t\t},\n\t\toperatorOpts(opts),\n\t);\n}\n\n/**\n * Folds each upstream value into an accumulator; emits the new accumulator every time.\n *\n * Unlike RxJS, `seed` is always required — there is no seedless mode where the first\n * value silently becomes the accumulator.\n *\n * @param source - Upstream node.\n * @param reducer - `(acc, value) => nextAcc`.\n * @param seed - Initial accumulator (required).\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Scan node.\n *\n * @example\n * ```ts\n * import { scan, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = scan(state(1), (a, x) => a + x, 0);\n * ```\n *\n * @category extra\n */\nexport function scan<T, R>(\n\tsource: Node<T>,\n\treducer: (acc: R, value: T) => R,\n\tseed: R,\n\topts?: ExtraOpts,\n): Node<R> {\n\tlet acc = seed;\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v]) => {\n\t\t\tacc = reducer(acc, v as T);\n\t\t\treturn acc;\n\t\t},\n\t\t{ ...operatorOpts(opts), initial: seed, resetOnTeardown: true },\n\t);\n}\n\n/**\n * Reduces to one value emitted when `source` completes; if no `DATA` arrived, emits `seed`.\n *\n * Unlike RxJS, `seed` is always required. If the source completes without emitting\n * DATA, the seed value is emitted (RxJS would throw without a seed).\n *\n * @param source - Upstream node.\n * @param reducer - `(acc, value) => nextAcc`.\n * @param seed - Empty-completion default and initial accumulator (required).\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Node that emits once on completion.\n *\n * @example\n * ```ts\n * import { reduce, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = reduce(state(1), (a, x) => a + x, 0);\n * ```\n *\n * @category extra\n */\nexport function reduce<T, R>(\n\tsource: Node<T>,\n\treducer: (acc: R, value: T) => R,\n\tseed: R,\n\topts?: ExtraOpts,\n): Node<R> {\n\tlet acc = seed;\n\tlet sawData = false;\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v]) => {\n\t\t\tsawData = true;\n\t\t\tacc = reducer(acc, v as T);\n\t\t\treturn undefined;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonResubscribe:\n\t\t\t\topts?.resubscribable === true\n\t\t\t\t\t? () => {\n\t\t\t\t\t\t\tacc = seed;\n\t\t\t\t\t\t\tsawData = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\tonMessage(msg: Message, _i: number, a) {\n\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\tif (!sawData) acc = seed;\n\t\t\t\t\ta.emit(acc);\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Emits at most `count` **`DATA`** values, then **`COMPLETE`**. `RESOLVED` does not advance the counter.\n *\n * @param source - Upstream node.\n * @param count - Maximum `DATA` emissions (≤0 completes immediately).\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Limited stream.\n *\n * @example\n * ```ts\n * import { take, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = take(state(0), 3);\n * ```\n *\n * @category extra\n */\nexport function take<T>(source: Node<T>, count: number, opts?: ExtraOpts): Node<T> {\n\tif (count <= 0) {\n\t\treturn node<T>(\n\t\t\t[source as Node],\n\t\t\t(_d, a) => {\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\treturn undefined;\n\t\t\t},\n\t\t\t{\n\t\t\t\t...operatorOpts(opts),\n\t\t\t\tcompleteWhenDepsComplete: false,\n\t\t\t\tonMessage(msg, _i, a) {\n\t\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t}\n\tlet taken = 0;\n\tlet done = false;\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v]) => {\n\t\t\tif (done) return undefined;\n\t\t\treturn v as T;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonResubscribe:\n\t\t\t\topts?.resubscribable === true\n\t\t\t\t\t? () => {\n\t\t\t\t\t\t\ttaken = 0;\n\t\t\t\t\t\t\tdone = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tif (msg[0] === DIRTY) return false;\n\t\t\t\tif (done) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === DATA) {\n\t\t\t\t\ttaken += 1;\n\t\t\t\t\tif (taken >= count) {\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t\ta.emit(source.get() as T);\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === RESOLVED) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\tdone = true;\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (msg[0] === ERROR) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Skips the first `count` **`DATA`** emissions. `RESOLVED` does not advance the counter.\n *\n * @param source - Upstream node.\n * @param count - Number of `DATA` values to drop.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Skipped stream.\n *\n * @example\n * ```ts\n * import { skip, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = skip(state(0), 2);\n * ```\n *\n * @category extra\n */\nexport function skip<T>(source: Node<T>, count: number, opts?: ExtraOpts): Node<T> {\n\tlet skipped = 0;\n\treturn node<T>([source as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === DIRTY) {\n\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tskipped += 1;\n\t\t\t\tif (skipped <= count) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t} else {\n\t\t\t\t\ta.emit(msg[1]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n/**\n * Emits while `predicate` holds; on first false, sends **`COMPLETE`**.\n *\n * @param source - Upstream node.\n * @param predicate - Continuation test.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Truncated stream.\n *\n * @example\n * ```ts\n * import { takeWhile, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = takeWhile(state(1), (x) => x < 10);\n * ```\n *\n * @category extra\n */\nexport function takeWhile<T>(\n\tsource: Node<T>,\n\tpredicate: (value: T) => boolean,\n\topts?: ExtraOpts,\n): Node<T> {\n\tlet done = false;\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (done) return undefined;\n\t\t\tif (!predicate(v as T)) {\n\t\t\t\tdone = true;\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn v as T;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tif (done) {\n\t\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Forwards `source` until `notifier` matches `predicate` (default: notifier **`DATA`**), then **`COMPLETE`**.\n *\n * @param source - Main upstream.\n * @param notifier - Triggers completion when `predicate(msg)` is true.\n * @param opts - Optional {@link NodeOptions}, plus `predicate` for custom notifier matching.\n * @returns `Node<T>` - Truncated stream.\n *\n * @example\n * ```ts\n * import { producer, takeUntil, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const src = state(1);\n * const stop = producer((_d, a) => a.emit(undefined));\n * const n = takeUntil(src, stop);\n * ```\n *\n * @category extra\n */\nexport function takeUntil<T>(\n\tsource: Node<T>,\n\tnotifier: Node,\n\topts?: ExtraOpts & { predicate?: (msg: Message) => boolean },\n): Node<T> {\n\tconst pred = opts?.predicate ?? ((m: Message) => m[0] === DATA);\n\tconst { predicate: _, ...restOpts } = opts ?? {};\n\tlet stopped = false;\n\treturn node<T>(\n\t\t[source as Node, notifier],\n\t\t([v]) => {\n\t\t\tif (stopped) return undefined;\n\t\t\treturn v as T;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(restOpts as ExtraOpts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, i, a) {\n\t\t\t\tif (stopped) {\n\t\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (i === 1) {\n\t\t\t\t\tif (pred(msg)) {\n\t\t\t\t\t\tstopped = true;\n\t\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Emits the first **`DATA`** then **`COMPLETE`** (same as `take(source, 1)`).\n *\n * @param source - Upstream node.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Single-value stream.\n *\n * @example\n * ```ts\n * import { first, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = first(state(42));\n * ```\n *\n * @category extra\n */\nexport function first<T>(source: Node<T>, opts?: ExtraOpts): Node<T> {\n\treturn take(source, 1, opts);\n}\n\n/**\n * Buffers values and emits the last **`DATA`** on **`COMPLETE`**; optional `defaultValue` if none arrived.\n *\n * @param source - Upstream node.\n * @param options - Optional {@link NodeOptions} and `defaultValue` when empty.\n * @returns `Node<T>` - Last-or-default node.\n *\n * @example\n * ```ts\n * import { last, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = last(state(1), { defaultValue: 0 });\n * ```\n *\n * @category extra\n */\nexport function last<T>(source: Node<T>, options?: ExtraOpts & { defaultValue?: T }): Node<T> {\n\tconst { defaultValue, ...rest } = options ?? {};\n\tconst useDefault = options != null && Object.hasOwn(options, \"defaultValue\");\n\tlet lastVal: T | undefined;\n\tlet has = false;\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v]) => {\n\t\t\tlastVal = v as T;\n\t\t\thas = true;\n\t\t\treturn undefined;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(rest),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tif (msg[0] === COMPLETE) {\n\t\t\t\t\tif (has) {\n\t\t\t\t\t\ta.emit(lastVal as T);\n\t\t\t\t\t} else if (useDefault) {\n\t\t\t\t\t\ta.emit(defaultValue as T);\n\t\t\t\t\t}\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Emits the first value matching `predicate`, then **`COMPLETE`**.\n *\n * @param source - Upstream node.\n * @param predicate - Match test.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - First-match stream.\n *\n * @example\n * ```ts\n * import { find, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = find(state(1), (x) => x > 0);\n * ```\n *\n * @category extra\n */\nexport function find<T>(\n\tsource: Node<T>,\n\tpredicate: (value: T) => boolean,\n\topts?: ExtraOpts,\n): Node<T> {\n\treturn take(filter(source, predicate, opts), 1, opts);\n}\n\n/**\n * Emits the `index`th **`DATA`** (zero-based), then **`COMPLETE`**.\n *\n * @param source - Upstream node.\n * @param index - Zero-based emission index.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Single indexed value.\n *\n * @example\n * ```ts\n * import { elementAt, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = elementAt(state(0), 2);\n * ```\n *\n * @category extra\n */\nexport function elementAt<T>(source: Node<T>, index: number, opts?: ExtraOpts): Node<T> {\n\treturn take(skip(source, index, opts), 1, opts);\n}\n\n/**\n * Prepends `initial` as **`DATA`**, then forwards every value from `source`.\n *\n * @param source - Upstream node.\n * @param initial - Value emitted before upstream.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Prefixed stream.\n *\n * @example\n * ```ts\n * import { startWith, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = startWith(state(2), 0);\n * ```\n *\n * @category extra\n */\nexport function startWith<T>(source: Node<T>, initial: T, opts?: ExtraOpts): Node<T> {\n\tlet prepended = false;\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (!prepended) {\n\t\t\t\tprepended = true;\n\t\t\t\ta.emit(initial);\n\t\t\t}\n\t\t\ta.emit(v as T);\n\t\t\treturn undefined;\n\t\t},\n\t\toperatorOpts(opts),\n\t);\n}\n\n/**\n * Observer shape for {@link tap} — side effects for data, error, and/or complete.\n */\nexport type TapObserver<T> = {\n\tdata?: (value: T) => void;\n\terror?: (err: unknown) => void;\n\tcomplete?: () => void;\n};\n\n/**\n * Invokes side effects; values pass through unchanged.\n *\n * Accepts either a function (called on each DATA) or an observer object\n * `{ data?, error?, complete? }` for lifecycle-aware side effects.\n *\n * @param source - Upstream node.\n * @param fnOrObserver - Side effect function or observer object.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Passthrough node.\n *\n * @example\n * ```ts\n * import { tap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * // Function form (DATA only)\n * tap(state(1), (x) => console.log(x));\n *\n * // Observer form (DATA + ERROR + COMPLETE)\n * tap(state(1), { data: console.log, error: console.error, complete: () => console.log(\"done\") });\n * ```\n *\n * @category extra\n */\nexport function tap<T>(\n\tsource: Node<T>,\n\tfnOrObserver: ((value: T) => void) | TapObserver<T>,\n\topts?: ExtraOpts,\n): Node<T> {\n\tif (typeof fnOrObserver === \"function\") {\n\t\treturn derived(\n\t\t\t[source as Node],\n\t\t\t([v]) => {\n\t\t\t\tfnOrObserver(v as T);\n\t\t\t\treturn v as T;\n\t\t\t},\n\t\t\toperatorOpts(opts),\n\t\t);\n\t}\n\tconst obs = fnOrObserver;\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([v]) => {\n\t\t\tobs.data?.(v as T);\n\t\t\treturn v as T;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tobs.error?.(msg[1]);\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tobs.complete?.();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Suppresses adjacent duplicates using `equals` (default `Object.is`).\n *\n * @param source - Upstream node.\n * @param equals - Optional equality for consecutive values.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Deduped stream.\n *\n * @example\n * ```ts\n * import { distinctUntilChanged, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = distinctUntilChanged(state(1));\n * ```\n *\n * @category extra\n */\nexport function distinctUntilChanged<T>(\n\tsource: Node<T>,\n\tequals: (a: T, b: T) => boolean = Object.is,\n\topts?: ExtraOpts,\n): Node<T> {\n\treturn node<T>([source as Node], ([v]) => v as T, {\n\t\t...operatorOpts(opts),\n\t\tequals: equals as (a: unknown, b: unknown) => boolean,\n\t});\n}\n\n/**\n * Emits `[previous, current]` pairs starting after the second value (first pair uses `RESOLVED` only).\n *\n * @param source - Upstream node.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<readonly [T, T]>` - Pair stream.\n *\n * @example\n * ```ts\n * import { pairwise, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = pairwise(state(0));\n * ```\n *\n * @category extra\n */\nexport function pairwise<T>(source: Node<T>, opts?: ExtraOpts): Node<readonly [T, T]> {\n\tlet prev: T | undefined;\n\tlet hasPrev = false;\n\treturn node<readonly [T, T]>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tconst x = v as T;\n\t\t\tif (!hasPrev) {\n\t\t\t\tprev = x;\n\t\t\t\thasPrev = true;\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst pair = [prev as T, x] as const;\n\t\t\tprev = x;\n\t\t\treturn pair;\n\t\t},\n\t\toperatorOpts(opts),\n\t);\n}\n\n/**\n * Combines the latest value from each dependency whenever any dep settles (combineLatest).\n *\n * @param sources - Nodes to combine (variadic).\n * @returns `Node<T>` - Tuple of latest values.\n *\n * @example\n * ```ts\n * import { combine, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = combine(state(1), state(\"a\"));\n * ```\n *\n * @remarks\n * Unlike RxJS `combineLatest`, this is named `combine`. Use the {@link combineLatest} alias\n * if you prefer the RxJS name. Seed is always required for `scan`/`reduce` (no seedless mode).\n *\n * @category extra\n */\nexport function combine<const T extends readonly unknown[]>(\n\t...sources: { [K in keyof T]: Node<T[K]> }\n): Node<T> {\n\tconst deps = [...sources] as unknown as Node[];\n\treturn node<T>(deps, (vals) => vals as unknown as T, operatorOpts());\n}\n\n/**\n * When `primary` settles, emits `[primary, latestSecondary]`. `secondary` alone updates cache only.\n *\n * @param primary - Main stream.\n * @param secondary - Latest value is paired on each primary emission.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<readonly [A, B]>` - Paired stream.\n *\n * @example\n * ```ts\n * import { state, withLatestFrom } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = withLatestFrom(state(1), state(\"x\"));\n * ```\n *\n * @category extra\n */\nexport function withLatestFrom<A, B>(\n\tprimary: Node<A>,\n\tsecondary: Node<B>,\n\topts?: ExtraOpts,\n): Node<readonly [A, B]> {\n\tlet latestB: B | undefined;\n\tlet hasB = false;\n\treturn node<readonly [A, B]>([primary as Node, secondary as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tonMessage(msg, i, a) {\n\t\t\tif (i === 1 && (msg[0] === DATA || msg[0] === RESOLVED)) {\n\t\t\t\tlatestB = secondary.get() as B;\n\t\t\t\thasB = true;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0 && (msg[0] === DATA || msg[0] === RESOLVED)) {\n\t\t\t\tif (!hasB) {\n\t\t\t\t\tlatestB = secondary.get() as B;\n\t\t\t\t\thasB = true;\n\t\t\t\t}\n\t\t\t\ta.emit([primary.get() as A, latestB as B]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0 && msg[0] === DIRTY) {\n\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && msg[0] === DIRTY) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (msg[0] === COMPLETE || msg[0] === ERROR) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Merges **`DATA`** from any source with correct two-phase dirty tracking. **`COMPLETE`** after **all** sources complete (spec §1.3.5).\n *\n * @param sources - Nodes to merge (variadic; empty completes immediately).\n * @returns `Node<T>` - Merged stream.\n *\n * @remarks\n * **Ordering:** DIRTY/RESOLVED rules follow multi-source semantics in `~/src/graphrefly/GRAPHREFLY-SPEC.md`.\n *\n * @example\n * ```ts\n * import { merge, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = merge(state(1), state(2));\n * ```\n *\n * @category extra\n */\nexport function merge<T>(...sources: readonly Node<T>[]): Node<T> {\n\tif (sources.length === 0) {\n\t\treturn producer<T>((_d, a) => {\n\t\t\ta.down([[COMPLETE]]);\n\t\t\treturn undefined;\n\t\t}, operatorOpts());\n\t}\n\tconst deps = sources as unknown as Node[];\n\tconst n = deps.length;\n\tlet completed = 0;\n\tlet dirtyMask = 0n;\n\tlet anyData = false;\n\treturn node<T>(deps, () => undefined, {\n\t\t...operatorOpts(),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tconst bit = 1n << BigInt(i);\n\t\t\tif (t === DIRTY) {\n\t\t\t\tconst wasClean = dirtyMask === 0n;\n\t\t\t\tdirtyMask |= bit;\n\t\t\t\tif (wasClean) {\n\t\t\t\t\tanyData = false;\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\tif (dirtyMask & bit) {\n\t\t\t\t\tdirtyMask &= ~bit;\n\t\t\t\t\tif (dirtyMask === 0n && !anyData) {\n\t\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tdirtyMask &= ~bit;\n\t\t\t\tanyData = true;\n\t\t\t\ta.emit(msg[1]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\tdirtyMask &= ~bit;\n\t\t\t\tcompleted += 1;\n\t\t\t\tif (completed >= n) {\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Zips one **`DATA`** from each source per cycle into a tuple. Only **`DATA`** enqueues (spec §1.3.3).\n *\n * @param sources - Nodes to zip (variadic).\n * @returns `Node<T>` - Zipped tuples.\n *\n * @example\n * ```ts\n * import { state, zip } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = zip(state(1), state(2));\n * ```\n *\n * @category extra\n */\nexport function zip<const T extends readonly unknown[]>(\n\t...sources: { [K in keyof T]: Node<T[K]> }\n): Node<T> {\n\tconst n = sources.length;\n\tif (n === 0) {\n\t\treturn node<T>([], () => [] as unknown as T, operatorOpts());\n\t}\n\tconst deps = [...sources] as unknown as Node[];\n\tconst queues: unknown[][] = Array.from({ length: n }, () => []);\n\tlet dirtyMask = 0n;\n\tlet anyData = false;\n\tlet active = n;\n\n\tfunction tryEmit(a: { emit(v: T): void }) {\n\t\twhile (queues.every((q) => q.length > 0)) {\n\t\t\tconst tuple = queues.map((q) => q.shift()!) as unknown as T;\n\t\t\ta.emit(tuple);\n\t\t}\n\t}\n\n\treturn node<T>(deps, () => undefined, {\n\t\t...operatorOpts(),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tconst bit = 1n << BigInt(i);\n\t\t\tif (t === DIRTY) {\n\t\t\t\tconst wasClean = dirtyMask === 0n;\n\t\t\t\tdirtyMask |= bit;\n\t\t\t\tif (wasClean) {\n\t\t\t\t\tanyData = false;\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\tif (dirtyMask & bit) {\n\t\t\t\t\tdirtyMask &= ~bit;\n\t\t\t\t\tif (dirtyMask === 0n) {\n\t\t\t\t\t\tif (anyData) {\n\t\t\t\t\t\t\ttryEmit(a);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tdirtyMask &= ~bit;\n\t\t\t\tqueues[i].push(msg[1]);\n\t\t\t\tanyData = true;\n\t\t\t\tif (dirtyMask === 0n) {\n\t\t\t\t\ttryEmit(a);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\tactive -= 1;\n\t\t\t\tif (active === 0 || queues[i].length === 0) {\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Plays all of `firstSrc`, then all of `secondSrc`. **`DATA`** from `secondSrc` during phase one is buffered until handoff.\n *\n * @param firstSrc - First segment.\n * @param secondSrc - Second segment.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Concatenated stream.\n *\n * @example\n * ```ts\n * import { concat, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = concat(state(1), state(2));\n * ```\n *\n * @category extra\n */\nexport function concat<T>(firstSrc: Node<T>, secondSrc: Node<T>, opts?: ExtraOpts): Node<T> {\n\tlet phase: 0 | 1 = 0;\n\tconst pending: unknown[] = [];\n\treturn node<T>([firstSrc as Node, secondSrc as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (phase === 0 && i === 1) {\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tpending.push(msg[1]);\n\t\t\t\t} else if (t === ERROR) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (phase === 0 && i === 0) {\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tphase = 1;\n\t\t\t\t\tfor (const v of pending) {\n\t\t\t\t\t\ta.emit(v as T);\n\t\t\t\t\t}\n\t\t\t\t\tpending.length = 0;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (phase === 1 && i === 0) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (phase === 1 && i === 1) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * First source to emit **`DATA`** wins; later traffic follows only the winner (Rx-style `race`).\n *\n * @param sources - Contestants (variadic; empty completes immediately; one node is identity).\n * @returns `Node<T>` - Winning stream.\n *\n * @example\n * ```ts\n * import { race, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = race(state(1), state(2));\n * ```\n *\n * @category extra\n */\nexport function race<T>(...sources: readonly Node<T>[]): Node<T> {\n\tif (sources.length === 0) {\n\t\treturn producer<T>((_d, a) => {\n\t\t\ta.down([[COMPLETE]]);\n\t\t\treturn undefined;\n\t\t}, operatorOpts());\n\t}\n\tif (sources.length === 1) {\n\t\treturn node<T>([sources[0] as Node], ([v]) => v as T, operatorOpts());\n\t}\n\tconst deps = sources as unknown as Node[];\n\tlet winner: number | null = null;\n\treturn node<T>(deps, () => undefined, {\n\t\t...operatorOpts(),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (winner !== null && i !== winner) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA && winner === null) {\n\t\t\t\twinner = i;\n\t\t\t\ta.emit(msg[1]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (winner !== null && i === winner) {\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\ta.emit(msg[1]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (winner === null) {\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE || t === ERROR) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n// --- Tier 2: async / dynamic (roadmap §2.2), all on `node` / `producer` ---\n\nfunction forwardInner<R>(inner: Node<R>, a: NodeActions, onInnerComplete: () => void): () => void {\n\tlet unsub: (() => void) | undefined;\n\tlet finished = false;\n\tlet emitted = false;\n\tconst finish = (): void => {\n\t\tif (finished) return;\n\t\tfinished = true;\n\t\tonInnerComplete();\n\t};\n\tunsub = inner.subscribe((msgs) => {\n\t\tlet sawComplete = false;\n\t\tlet sawError = false;\n\t\tconst out: Message[] = [];\n\t\tfor (const m of msgs) {\n\t\t\tif (m[0] === DATA) emitted = true;\n\t\t\tif (m[0] === COMPLETE) sawComplete = true;\n\t\t\telse {\n\t\t\t\tif (m[0] === ERROR) sawError = true;\n\t\t\t\tout.push(m);\n\t\t\t}\n\t\t}\n\t\tif (out.length > 0) a.down(out as unknown as Messages);\n\t\tif (sawError) {\n\t\t\tunsub?.();\n\t\t\tunsub = undefined;\n\t\t\tfinish();\n\t\t} else if (sawComplete) {\n\t\t\tfinish();\n\t\t}\n\t});\n\tif (!emitted && (inner.status === \"settled\" || inner.status === \"resolved\")) {\n\t\ta.emit(inner.get() as R);\n\t}\n\tif (inner.status === \"completed\" || inner.status === \"errored\") {\n\t\tfinish();\n\t}\n\treturn () => {\n\t\tunsub?.();\n\t\tunsub = undefined;\n\t};\n}\n\n/**\n * Maps each settled value to an inner node; unsubscribes the previous inner (Rx-style `switchMap`).\n *\n * @param source - Upstream node.\n * @param project - Maps each outer value to an inner source shape (`Node`, scalar, `PromiseLike`, `Iterable`, or `AsyncIterable`) coerced via {@link fromAny}.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Emissions from the active inner subscription.\n * @example\n * ```ts\n * import { switchMap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const src = state(0);\n * switchMap(src, (n) => state((n as number) * 2));\n * ```\n *\n * @category extra\n */\nexport function switchMap<T, R>(\n\tsource: Node<T>,\n\tproject: (value: T) => NodeInput<R>,\n\topts?: ExtraOpts,\n): Node<R> {\n\tlet innerUnsub: (() => void) | undefined;\n\tlet sourceDone = false;\n\tlet attached = false;\n\n\tfunction clearInner(): void {\n\t\tinnerUnsub?.();\n\t\tinnerUnsub = undefined;\n\t}\n\n\tfunction attach(v: T, a: NodeActions): void {\n\t\tattached = true;\n\t\tclearInner();\n\t\tinnerUnsub = forwardInner(fromAny(project(v)), a, () => {\n\t\t\tclearInner();\n\t\t\tif (sourceDone) a.down([[COMPLETE]]);\n\t\t});\n\t}\n\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\t// Skip if onMessage already handled the initial DATA during connect.\n\t\t\tif (!attached) attach(v as T, a);\n\t\t\treturn clearInner;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tclearInner();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tsourceDone = true;\n\t\t\t\t\tif (innerUnsub === undefined) a.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tattach(msg[1] as T, a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Like {@link switchMap}, but ignores outer `DATA` while an inner subscription is active (`exhaustMap`).\n *\n * @param source - Upstream node.\n * @param project - Maps each outer value to an inner source shape (`Node`, scalar, `PromiseLike`, `Iterable`, or `AsyncIterable`) coerced via {@link fromAny}.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Emissions from the active inner while it runs.\n * @example\n * ```ts\n * import { exhaustMap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * exhaustMap(state(0), () => state(1));\n * ```\n *\n * @category extra\n */\nexport function exhaustMap<T, R>(\n\tsource: Node<T>,\n\tproject: (value: T) => NodeInput<R>,\n\topts?: ExtraOpts,\n): Node<R> {\n\tlet innerUnsub: (() => void) | undefined;\n\tlet sourceDone = false;\n\tlet attached = false;\n\n\tfunction clearInner(): void {\n\t\tinnerUnsub?.();\n\t\tinnerUnsub = undefined;\n\t}\n\n\tfunction attach(v: T, a: NodeActions): void {\n\t\tattached = true;\n\t\tinnerUnsub = forwardInner(fromAny(project(v)), a, () => {\n\t\t\tclearInner();\n\t\t\tif (sourceDone) a.down([[COMPLETE]]);\n\t\t});\n\t}\n\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (!attached && innerUnsub === undefined) attach(v as T, a);\n\t\t\treturn clearInner;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tclearInner();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tsourceDone = true;\n\t\t\t\t\tif (innerUnsub === undefined) a.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tif (innerUnsub !== undefined) {\n\t\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tattach(msg[1] as T, a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Enqueues each outer value and subscribes to inners one at a time (`concatMap`).\n *\n * @param source - Upstream node.\n * @param project - Maps each outer value to an inner source shape (`Node`, scalar, `PromiseLike`, `Iterable`, or `AsyncIterable`) coerced via {@link fromAny}.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<R>` - Sequential concatenation of inner streams.\n * @example\n * ```ts\n * import { concatMap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * concatMap(state(0), (n) => state((n as number) + 1));\n * ```\n *\n * @category extra\n */\nexport function concatMap<T, R>(\n\tsource: Node<T>,\n\tproject: (value: T) => NodeInput<R>,\n\topts?: ExtraOpts & { maxBuffer?: number },\n): Node<R> {\n\tconst { maxBuffer: maxBuf, ...concatNodeOpts } = opts ?? {};\n\tconst queue: T[] = [];\n\tlet innerUnsub: (() => void) | undefined;\n\tlet sourceDone = false;\n\tlet attached = false;\n\n\tfunction clearInner(): void {\n\t\tinnerUnsub?.();\n\t\tinnerUnsub = undefined;\n\t}\n\n\tfunction tryPump(a: NodeActions): void {\n\t\tif (innerUnsub !== undefined) return;\n\t\tif (queue.length === 0) {\n\t\t\tif (sourceDone) a.down([[COMPLETE]]);\n\t\t\treturn;\n\t\t}\n\t\tconst v = queue.shift()!;\n\t\tinnerUnsub = forwardInner(fromAny(project(v)), a, () => {\n\t\t\tclearInner();\n\t\t\ttryPump(a);\n\t\t});\n\t}\n\n\tfunction enqueue(v: T, a: NodeActions): void {\n\t\tattached = true;\n\t\tif (maxBuf && maxBuf > 0 && queue.length >= maxBuf) queue.shift();\n\t\tqueue.push(v);\n\t\ttryPump(a);\n\t}\n\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (!attached) enqueue(v as T, a);\n\t\t\treturn clearInner;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(concatNodeOpts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tclearInner();\n\t\t\t\t\tqueue.length = 0;\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tsourceDone = true;\n\t\t\t\t\ttryPump(a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tenqueue(msg[1] as T, a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/** Options for {@link mergeMap}. */\nexport type MergeMapOptions = ExtraOpts & {\n\t/** Maximum number of concurrent inner subscriptions. Default: `Infinity` (unbounded). */\n\tconcurrent?: number;\n};\n\n/**\n * Subscribes to inner nodes in parallel (up to `concurrent`) and merges outputs (`mergeMap` / `flatMap`).\n *\n * @param source - Upstream node.\n * @param project - Maps each outer value to an inner source shape (`Node`, scalar, `PromiseLike`, `Iterable`, or `AsyncIterable`) coerced via {@link fromAny}.\n * @param opts - Optional options including `concurrent` limit.\n * @returns `Node<R>` - Merged output of all active inners; completes when the outer and every inner complete.\n * @example\n * ```ts\n * import { mergeMap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * // Unbounded (default)\n * mergeMap(state(0), (n) => state((n as number) + 1));\n *\n * // Limited concurrency\n * mergeMap(state(0), (n) => state((n as number) + 1), { concurrent: 3 });\n * ```\n *\n * @category extra\n */\nexport function mergeMap<T, R>(\n\tsource: Node<T>,\n\tproject: (value: T) => NodeInput<R>,\n\topts?: MergeMapOptions,\n): Node<R> {\n\tconst { concurrent: concurrentOpt, ...mergeNodeOpts } = opts ?? {};\n\tconst maxConcurrent =\n\t\tconcurrentOpt != null && concurrentOpt > 0 ? concurrentOpt : Number.POSITIVE_INFINITY;\n\tlet active = 0;\n\tlet sourceDone = false;\n\tconst innerStops = new Set<() => void>();\n\tconst buffer: T[] = [];\n\n\tfunction tryComplete(a: NodeActions): void {\n\t\tif (sourceDone && active === 0 && buffer.length === 0) a.down([[COMPLETE]]);\n\t}\n\n\tfunction spawn(v: T, a: NodeActions): void {\n\t\tactive++;\n\t\tconst inner = fromAny(project(v));\n\t\tlet stop: (() => void) | undefined;\n\t\tconst runStop = (): void => {\n\t\t\tstop?.();\n\t\t\tif (stop !== undefined) innerStops.delete(stop);\n\t\t\tstop = undefined;\n\t\t};\n\t\tstop = inner.subscribe((msgs) => {\n\t\t\tlet sawComplete = false;\n\t\t\tconst out: Message[] = [];\n\t\t\tfor (const m of msgs) {\n\t\t\t\tif (m[0] === COMPLETE) sawComplete = true;\n\t\t\t\telse out.push(m);\n\t\t\t}\n\t\t\tif (out.length > 0) a.down(out as unknown as Messages);\n\t\t\tif (sawComplete) {\n\t\t\t\trunStop();\n\t\t\t\tactive--;\n\t\t\t\tdrainBuffer(a);\n\t\t\t\ttryComplete(a);\n\t\t\t}\n\t\t});\n\t\tinnerStops.add(stop);\n\t}\n\n\tfunction drainBuffer(a: NodeActions): void {\n\t\twhile (buffer.length > 0 && active < maxConcurrent) {\n\t\t\tspawn(buffer.shift()!, a);\n\t\t}\n\t}\n\n\tfunction enqueue(v: T, a: NodeActions): void {\n\t\tif (active < maxConcurrent) {\n\t\t\tspawn(v, a);\n\t\t} else {\n\t\t\tbuffer.push(v);\n\t\t}\n\t}\n\n\tfunction clearAll(): void {\n\t\tfor (const u of innerStops) u();\n\t\tinnerStops.clear();\n\t\tactive = 0;\n\t\tbuffer.length = 0;\n\t}\n\n\tlet attached = false;\n\n\treturn node<R>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\tif (!attached) {\n\t\t\t\tattached = true;\n\t\t\t\tenqueue(v as T, a);\n\t\t\t}\n\t\t\treturn clearAll;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(mergeNodeOpts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tclearAll();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tsourceDone = true;\n\t\t\t\t\ttryComplete(a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tenqueue(msg[1] as T, a);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * RxJS-named alias for {@link mergeMap} — projects each `DATA` to an inner node and merges outputs.\n *\n * @param source - Upstream node.\n * @param project - Returns an inner `Node<R>` per value.\n * @param opts - Optional concurrency cap and node options (excluding `describeKind`).\n * @returns Merged projection; behavior matches `mergeMap`.\n *\n * @example\n * ```ts\n * import { flatMap, state } from \"@graphrefly/graphrefly-ts\";\n *\n * flatMap(state(0), (n) => state(n));\n * ```\n *\n * @category extra\n */\nexport const flatMap = mergeMap;\n\n/**\n * Delays phase-2 emissions by `ms` (timers). `DIRTY` still forwards immediately.\n *\n * @param source - Upstream node.\n * @param ms - Delay in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Same values, shifted in time.\n * @example\n * ```ts\n * import { delay, state } from \"@graphrefly/graphrefly-ts\";\n *\n * delay(state(1), 100);\n * ```\n *\n * @category extra\n */\nexport function delay<T>(source: Node<T>, ms: number, opts?: ExtraOpts): Node<T> {\n\tconst timers = new Set<ReturnType<typeof setTimeout>>();\n\tfunction clearAll(): void {\n\t\tfor (const id of timers) clearTimeout(id);\n\t\ttimers.clear();\n\t}\n\treturn node<T>([source as Node], () => clearAll, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === DIRTY || t === ERROR || t === COMPLETE || t === PAUSE || t === RESUME) {\n\t\t\t\tif (t === COMPLETE) clearAll();\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tconst id = setTimeout(() => {\n\t\t\t\t\ttimers.delete(id);\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t}, ms);\n\t\t\t\ttimers.add(id);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Emits the latest value only after `ms` quiet time since the last trigger (`debounce`).\n *\n * @param source - Upstream node.\n * @param ms - Quiet window in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Debounced stream.\n * @example\n * ```ts\n * import { debounce, state } from \"@graphrefly/graphrefly-ts\";\n *\n * debounce(state(0), 50);\n * ```\n *\n * @category extra\n */\nexport function debounce<T>(source: Node<T>, ms: number, opts?: ExtraOpts): Node<T> {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet pending: T | undefined;\n\tfunction clearTimer(): void {\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t}\n\treturn node<T>([source as Node], () => clearTimer, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === ERROR || t === PAUSE || t === RESUME) {\n\t\t\t\tclearTimer();\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\tif (timer !== undefined) {\n\t\t\t\t\tclearTimer();\n\t\t\t\t\ta.emit(pending as T);\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DIRTY) {\n\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tclearTimer();\n\t\t\t\tpending = msg[1] as T;\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t\ta.emit(pending as T);\n\t\t\t\t}, ms);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\nexport type ThrottleOptions = { leading?: boolean; trailing?: boolean };\n\n/**\n * Rate-limits emissions to at most once per `ms` window (`throttleTime`).\n *\n * @param source - Upstream node.\n * @param ms - Minimum spacing in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`) plus `leading` / `trailing`.\n * @returns `Node<T>` - Throttled stream.\n * @example\n * ```ts\n * import { throttle, state } from \"@graphrefly/graphrefly-ts\";\n *\n * throttle(state(0), 1_000, { trailing: false });\n * ```\n *\n * @category extra\n */\nexport function throttle<T>(\n\tsource: Node<T>,\n\tms: number,\n\topts?: ExtraOpts & ThrottleOptions,\n): Node<T> {\n\tconst { leading: leadingOpt, trailing: trailingOpt, ...throttleNodeOpts } = opts ?? {};\n\tconst leading = leadingOpt !== false;\n\tconst trailing = trailingOpt === true;\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tconst windowNs = ms * NS_PER_MS;\n\tlet lastEmitNs = -Infinity;\n\tlet pending: T | undefined;\n\tlet hasPending = false;\n\n\tfunction clearTimer(): void {\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t}\n\n\treturn node<T>(\n\t\t[source as Node],\n\t\t() => {\n\t\t\tclearTimer();\n\t\t\treturn undefined;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(throttleNodeOpts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR || t === COMPLETE || t === PAUSE || t === RESUME) {\n\t\t\t\t\tclearTimer();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tconst v = msg[1] as T;\n\t\t\t\t\tconst nowNs = monotonicNs();\n\t\t\t\t\tif (leading && nowNs - lastEmitNs >= windowNs) {\n\t\t\t\t\t\tlastEmitNs = nowNs;\n\t\t\t\t\t\ta.emit(v);\n\t\t\t\t\t\tclearTimer();\n\t\t\t\t\t\tif (trailing) {\n\t\t\t\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\t\t\t\ttimer = undefined;\n\t\t\t\t\t\t\t\tif (hasPending) {\n\t\t\t\t\t\t\t\t\tlastEmitNs = monotonicNs();\n\t\t\t\t\t\t\t\t\ta.emit(pending as T);\n\t\t\t\t\t\t\t\t\thasPending = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, ms);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (trailing) {\n\t\t\t\t\t\tpending = v;\n\t\t\t\t\t\thasPending = true;\n\t\t\t\t\t\tif (timer === undefined) {\n\t\t\t\t\t\t\tconst elapsedMs = (nowNs - lastEmitNs) / NS_PER_MS;\n\t\t\t\t\t\t\ttimer = setTimeout(\n\t\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\t\ttimer = undefined;\n\t\t\t\t\t\t\t\t\tif (hasPending) {\n\t\t\t\t\t\t\t\t\t\tlastEmitNs = monotonicNs();\n\t\t\t\t\t\t\t\t\t\ta.emit(pending as T);\n\t\t\t\t\t\t\t\t\t\thasPending = false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tMath.max(0, ms - elapsedMs),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Emits the most recent source value whenever `notifier` settles (`sample`).\n *\n * @param source - Node whose latest value is sampled.\n * @param notifier - When this node settles (`DATA` / `RESOLVED`), a sample is taken.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Sampled snapshots of `source`.\n * @remarks **Undefined payload:** If `T` includes `undefined`, `get() === undefined` is treated as “no snapshot” and the operator emits `RESOLVED` instead of `DATA`.\n * @example\n * ```ts\n * import { sample, state } from \"@graphrefly/graphrefly-ts\";\n *\n * sample(state(1), state(0));\n * ```\n *\n * @category extra\n */\nexport function sample<T>(source: Node<T>, notifier: Node<unknown>, opts?: ExtraOpts): Node<T> {\n\treturn node<T>([source as Node, notifier as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === ERROR) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === DATA) {\n\t\t\t\t// Emit the latest source value when notifier fires.\n\t\t\t\t// `undefined` is a valid value (Node<void>); always emit.\n\t\t\t\ta.emit((source as Node<T>).get() as T);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === RESOLVED) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n/**\n * After each source `DATA`, waits `ms` then emits the latest value if another `DATA` has not arrived (`auditTime` / trailing window).\n *\n * @param source - Upstream node.\n * @param ms - Window in milliseconds after each `DATA`.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Trailing-edge sampled stream.\n * @example\n * ```ts\n * import { audit, state } from \"@graphrefly/graphrefly-ts\";\n *\n * audit(state(0), 100);\n * ```\n *\n * @category extra\n */\nexport function audit<T>(source: Node<T>, ms: number, opts?: ExtraOpts): Node<T> {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet latest: T | undefined;\n\tlet has = false;\n\n\tfunction clearTimer(): void {\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t}\n\n\treturn node<T>([source as Node], () => clearTimer, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === ERROR || t === COMPLETE || t === PAUSE || t === RESUME) {\n\t\t\t\tclearTimer();\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DIRTY) {\n\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DATA) {\n\t\t\t\tlatest = msg[1] as T;\n\t\t\t\thas = true;\n\t\t\t\tclearTimer();\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t\tif (has) {\n\t\t\t\t\t\thas = false;\n\t\t\t\t\t\ta.emit(latest as T);\n\t\t\t\t\t}\n\t\t\t\t}, ms);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Errors if no `DATA` arrives within `ms` after subscribe or after the previous `DATA`.\n *\n * @param source - Upstream node.\n * @param ms - Idle budget in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`) and `with` for a custom error payload.\n * @returns `Node<T>` - Pass-through with idle watchdog.\n * @example\n * ```ts\n * import { timeout, state } from \"@graphrefly/graphrefly-ts\";\n *\n * timeout(state(0), 5_000);\n * ```\n *\n * @category extra\n */\nexport function timeout<T>(\n\tsource: Node<T>,\n\tms: number,\n\topts?: ExtraOpts & { with?: unknown },\n): Node<T> {\n\tconst { with: withPayload, ...timeoutNodeOpts } = opts ?? {};\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tconst err = withPayload ?? new Error(\"timeout\");\n\n\tfunction arm(a: NodeActions): void {\n\t\tclearTimeout(timer);\n\t\ttimer = setTimeout(() => {\n\t\t\ttimer = undefined;\n\t\t\ta.down([[ERROR, err]]);\n\t\t}, ms);\n\t}\n\n\treturn node<T>(\n\t\t[source as Node],\n\t\t([_v], a) => {\n\t\t\tarm(a);\n\t\t\treturn () => clearTimeout(timer);\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(timeoutNodeOpts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tarm(a);\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE || t === ERROR) {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY || t === RESOLVED) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Buffers source `DATA` values; flushes an array when `notifier` settles (`buffer`).\n *\n * @param source - Upstream node.\n * @param notifier - Flush trigger on each settlement.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T[]>` - Emits buffered arrays (may be empty-handled via `RESOLVED` when nothing buffered).\n * @example\n * ```ts\n * import { buffer, state } from \"@graphrefly/graphrefly-ts\";\n *\n * buffer(state(0), state(0));\n * ```\n *\n * @category extra\n */\nexport function buffer<T>(source: Node<T>, notifier: Node<unknown>, opts?: ExtraOpts): Node<T[]> {\n\tconst buf: T[] = [];\n\treturn node<T[]>([source as Node, notifier as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === ERROR) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE && i === 0) {\n\t\t\t\tif (buf.length > 0) a.emit([...buf]);\n\t\t\t\tbuf.length = 0;\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE && i === 1) {\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0 && t === DATA) {\n\t\t\t\tbuf.push(msg[1] as T);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === DATA) {\n\t\t\t\tif (buf.length > 0) {\n\t\t\t\t\ta.emit([...buf]);\n\t\t\t\t\tbuf.length = 0;\n\t\t\t\t} else {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === RESOLVED) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0 && (t === DIRTY || t === RESOLVED)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n/**\n * Batches consecutive `DATA` values into arrays of length `count` (`bufferCount` / `windowCount`).\n *\n * @param source - Upstream node.\n * @param count - Buffer size before emit; must be > 0.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T[]>` - Emits fixed-size arrays; remainder flushes on `COMPLETE`.\n * @example\n * ```ts\n * import { bufferCount, state } from \"@graphrefly/graphrefly-ts\";\n *\n * bufferCount(state(0), 3);\n * ```\n *\n * @category extra\n */\nexport function bufferCount<T>(source: Node<T>, count: number, opts?: ExtraOpts): Node<T[]> {\n\tif (count <= 0) throw new RangeError(\"bufferCount expects count > 0\");\n\tconst buf: T[] = [];\n\tlet started = false;\n\treturn node<T[]>(\n\t\t[source as Node],\n\t\t([v], a) => {\n\t\t\t// onMessage intercepts subsequent DATA; compute fn only runs on initial connect.\n\t\t\tif (!started) {\n\t\t\t\tstarted = true;\n\t\t\t\tbuf.push(v as T);\n\t\t\t\tif (buf.length >= count) {\n\t\t\t\t\ta.emit(buf.splice(0, buf.length));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tif (buf.length > 0) a.emit([...buf]);\n\t\t\t\t\tbuf.length = 0;\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tbuf.push(msg[1] as T);\n\t\t\t\t\tif (buf.length >= count) {\n\t\t\t\t\t\ta.emit(buf.splice(0, buf.length));\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Splits source `DATA` into sub-nodes of `count` values each. Each sub-node completes after `count` items or when source completes.\n *\n * @param source - Upstream node.\n * @param count - Items per window.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<Node<T>>` - Each emission is a sub-node carrying that window's values.\n *\n * @example\n * ```ts\n * import { windowCount, state } from \"@graphrefly/graphrefly-ts\";\n *\n * windowCount(state(0), 3);\n * ```\n *\n * @category extra\n */\nexport function windowCount<T>(source: Node<T>, count: number, opts?: ExtraOpts): Node<Node<T>> {\n\tif (count <= 0) throw new RangeError(\"windowCount expects count > 0\");\n\tlet win: Node<T> | undefined;\n\tlet winDown: ((msgs: Messages) => void) | undefined;\n\tlet n = 0;\n\n\tfunction openWindow(a: NodeActions): void {\n\t\tconst s = producer<T>((_d, actions) => {\n\t\t\twinDown = actions.down.bind(actions);\n\t\t\treturn () => {\n\t\t\t\twinDown = undefined;\n\t\t\t};\n\t\t}, operatorOpts());\n\t\twin = s;\n\t\tn = 0;\n\t\ta.emit(s);\n\t}\n\n\treturn node<Node<T>>([source as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === DATA) {\n\t\t\t\tif (!win) openWindow(a);\n\t\t\t\twinDown?.([[DATA, msg[1]]]);\n\t\t\t\tn += 1;\n\t\t\t\tif (n >= count) {\n\t\t\t\t\twinDown?.([[COMPLETE]]);\n\t\t\t\t\twin = undefined;\n\t\t\t\t\twinDown = undefined;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE) {\n\t\t\t\twinDown?.([[COMPLETE]]);\n\t\t\t\twin = undefined;\n\t\t\t\twinDown = undefined;\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\twinDown?.([msg]);\n\t\t\t\twin = undefined;\n\t\t\t\twinDown = undefined;\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === DIRTY) {\n\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESOLVED) {\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n/**\n * Flushes buffered `DATA` values every `ms` (`bufferTime` / `windowTime`).\n *\n * @param source - Upstream node.\n * @param ms - Flush interval in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T[]>` - Time-windowed batches.\n * @example\n * ```ts\n * import { bufferTime, state } from \"@graphrefly/graphrefly-ts\";\n *\n * bufferTime(state(0), 250);\n * ```\n *\n * @category extra\n */\nexport function bufferTime<T>(source: Node<T>, ms: number, opts?: ExtraOpts): Node<T[]> {\n\tconst buf: T[] = [];\n\tlet iv: ReturnType<typeof setInterval> | undefined;\n\treturn node<T[]>(\n\t\t[source as Node],\n\t\t(_deps, a) => {\n\t\t\tiv = setInterval(() => {\n\t\t\t\tif (buf.length > 0) {\n\t\t\t\t\ta.emit([...buf]);\n\t\t\t\t\tbuf.length = 0;\n\t\t\t\t}\n\t\t\t}, ms);\n\t\t\treturn () => {\n\t\t\t\tif (iv !== undefined) clearInterval(iv);\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tif (iv !== undefined) clearInterval(iv);\n\t\t\t\t\tif (buf.length > 0) a.emit([...buf]);\n\t\t\t\t\tbuf.length = 0;\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\tbuf.push(msg[1] as T);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Splits source `DATA` into time-windowed sub-nodes; each window lasts `ms`.\n *\n * @param source - Upstream node.\n * @param ms - Window duration in milliseconds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<Node<T>>` - Each emission is a sub-node carrying that window's values.\n *\n * @example\n * ```ts\n * import { windowTime, state } from \"@graphrefly/graphrefly-ts\";\n *\n * windowTime(state(0), 500);\n * ```\n *\n * @category extra\n */\nexport function windowTime<T>(source: Node<T>, ms: number, opts?: ExtraOpts): Node<Node<T>> {\n\tlet winDown: ((msgs: Messages) => void) | undefined;\n\tlet iv: ReturnType<typeof setInterval> | undefined;\n\n\tfunction closeWindow(): void {\n\t\twinDown?.([[COMPLETE]]);\n\t\twinDown = undefined;\n\t}\n\n\treturn node<Node<T>>(\n\t\t[source as Node],\n\t\t(_deps, a) => {\n\t\t\tfunction openWindow(): void {\n\t\t\t\tconst s = producer<T>((_d, actions) => {\n\t\t\t\t\twinDown = actions.down.bind(actions);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\twinDown = undefined;\n\t\t\t\t\t};\n\t\t\t\t}, operatorOpts());\n\t\t\t\ta.emit(s);\n\t\t\t}\n\t\t\topenWindow();\n\t\t\tiv = setInterval(() => {\n\t\t\t\tcloseWindow();\n\t\t\t\topenWindow();\n\t\t\t}, ms);\n\t\t\treturn () => {\n\t\t\t\tif (iv !== undefined) clearInterval(iv);\n\t\t\t\tcloseWindow();\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\t...operatorOpts(opts),\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tonMessage(msg, _i, a) {\n\t\t\t\tconst t = msg[0];\n\t\t\t\tif (t === DATA) {\n\t\t\t\t\twinDown?.([[DATA, msg[1]]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === COMPLETE) {\n\t\t\t\t\tif (iv !== undefined) clearInterval(iv);\n\t\t\t\t\tcloseWindow();\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === ERROR) {\n\t\t\t\t\tif (iv !== undefined) clearInterval(iv);\n\t\t\t\t\twinDown?.([msg]);\n\t\t\t\t\tcloseWindow();\n\t\t\t\t\ta.down([msg]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === DIRTY) {\n\t\t\t\t\ta.down([[DIRTY]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (t === RESOLVED) {\n\t\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Splits source `DATA` into sub-nodes, opening a new window each time `notifier` emits `DATA`.\n *\n * @param source - Upstream node.\n * @param notifier - Each `DATA` from `notifier` closes the current window and opens a new one.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<Node<T>>` - Each emission is a sub-node carrying that window's values.\n *\n * @example\n * ```ts\n * import { state, window } from \"@graphrefly/graphrefly-ts\";\n *\n * window(state(0), state(0));\n * ```\n *\n * @category extra\n */\nexport function window<T>(\n\tsource: Node<T>,\n\tnotifier: Node<unknown>,\n\topts?: ExtraOpts,\n): Node<Node<T>> {\n\tlet win: Node<T> | undefined;\n\tlet winDown: ((msgs: Messages) => void) | undefined;\n\n\tfunction closeWindow(): void {\n\t\twinDown?.([[COMPLETE]]);\n\t\twin = undefined;\n\t\twinDown = undefined;\n\t}\n\n\treturn node<Node<T>>([source as Node, notifier as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (i === 0 && t === DATA) {\n\t\t\t\tif (!win) {\n\t\t\t\t\tconst s = producer<T>((_d, actions) => {\n\t\t\t\t\t\twinDown = actions.down.bind(actions);\n\t\t\t\t\t\treturn () => {\n\t\t\t\t\t\t\twinDown = undefined;\n\t\t\t\t\t\t};\n\t\t\t\t\t}, operatorOpts());\n\t\t\t\t\twin = s;\n\t\t\t\t\ta.emit(s);\n\t\t\t\t}\n\t\t\t\twinDown?.([[DATA, msg[1]]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === DATA) {\n\t\t\t\tcloseWindow();\n\t\t\t\tconst s = producer<T>((_d, actions) => {\n\t\t\t\t\twinDown = actions.down.bind(actions);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\twinDown = undefined;\n\t\t\t\t\t};\n\t\t\t\t}, operatorOpts());\n\t\t\t\twin = s;\n\t\t\t\ta.emit(s);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE && i === 0) {\n\t\t\t\tcloseWindow();\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === COMPLETE && i === 1) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === ERROR) {\n\t\t\t\twinDown?.([msg]);\n\t\t\t\twin = undefined;\n\t\t\t\twinDown = undefined;\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 0 && (t === DIRTY || t === RESOLVED)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (i === 1 && t === RESOLVED) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t});\n}\n\n/**\n * Increments on each tick (`interval`); uses `setInterval` via {@link producer}.\n *\n * @param periodMs - Time between ticks.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<number>` - Emits `0`, `1`, `2`, … while subscribed.\n * @example\n * ```ts\n * import { interval } from \"@graphrefly/graphrefly-ts\";\n *\n * interval(1_000);\n * ```\n *\n * @category extra\n */\nexport function interval(periodMs: number, opts?: ExtraOpts): Node<number> {\n\tlet n = 0;\n\treturn producer<number>((_d, a) => {\n\t\tconst id = setInterval(() => {\n\t\t\ta.emit(n);\n\t\t\tn += 1;\n\t\t}, periodMs);\n\t\treturn () => clearInterval(id);\n\t}, operatorOpts(opts));\n}\n\n/**\n * Subscribes to `source` repeatedly (`count` times, sequentially). Best with a fresh or `resubscribable` source.\n *\n * @param source - Upstream node to replay.\n * @param count - Number of subscription rounds.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Forwards each round then completes after the last inner `COMPLETE`.\n * @example\n * ```ts\n * import { repeat, state } from \"@graphrefly/graphrefly-ts\";\n *\n * repeat(state(1, { resubscribable: true }), 2);\n * ```\n *\n * @category extra\n */\nexport function repeat<T>(source: Node<T>, count: number, opts?: ExtraOpts): Node<T> {\n\tif (count <= 0) throw new RangeError(\"repeat expects count > 0\");\n\treturn producer<T>((_d, a) => {\n\t\tlet remaining = count;\n\t\tlet innerU: (() => void) | undefined;\n\n\t\tconst start = (): void => {\n\t\t\tinnerU?.();\n\t\t\tinnerU = source.subscribe((msgs) => {\n\t\t\t\tlet completed = false;\n\t\t\t\tconst fwd: Message[] = [];\n\t\t\t\tfor (const m of msgs) {\n\t\t\t\t\tif (m[0] === COMPLETE) completed = true;\n\t\t\t\t\telse fwd.push(m);\n\t\t\t\t}\n\t\t\t\tif (fwd.length > 0) a.down(fwd as unknown as Messages);\n\t\t\t\tif (completed) {\n\t\t\t\t\tinnerU?.();\n\t\t\t\t\tinnerU = undefined;\n\t\t\t\t\tremaining -= 1;\n\t\t\t\t\tif (remaining > 0) start();\n\t\t\t\t\telse a.down([[COMPLETE]]);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tstart();\n\t\treturn () => {\n\t\t\tinnerU?.();\n\t\t};\n\t}, operatorOpts(opts));\n}\n\n/**\n * While `PAUSE` is in effect, buffers `DIRTY` / `DATA` / `RESOLVED`; flushes on `RESUME`.\n *\n * @param source - Upstream node.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Pass-through with pause buffering.\n * @example\n * ```ts\n * import { pausable, state, PAUSE, RESUME } from \"@graphrefly/graphrefly-ts\";\n *\n * const s = state(0);\n * pausable(s);\n * s.down([[PAUSE]]);\n * s.down([[RESUME]]);\n * ```\n *\n * @category extra\n */\nexport function pausable<T>(source: Node<T>, opts?: ExtraOpts): Node<T> {\n\tlet paused = false;\n\tconst backlog: Message[] = [];\n\n\treturn node<T>([source as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === PAUSE) {\n\t\t\t\tpaused = true;\n\t\t\t\ta.down([msg]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (t === RESUME) {\n\t\t\t\tpaused = false;\n\t\t\t\ta.down([msg]);\n\t\t\t\tfor (const m of backlog) a.down([m]);\n\t\t\t\tbacklog.length = 0;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (paused && (t === DIRTY || t === DATA || t === RESOLVED)) {\n\t\t\t\tbacklog.push(msg);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Replaces an upstream `ERROR` with a recovered value (`catchError`-style).\n *\n * @param source - Upstream node.\n * @param recover - Maps the error payload to a replacement value; if it throws, `ERROR` is forwarded.\n * @param opts - Optional {@link NodeOptions} (excluding `describeKind`).\n * @returns `Node<T>` - Recovered stream.\n * @example\n * ```ts\n * import { rescue, state } from \"@graphrefly/graphrefly-ts\";\n *\n * rescue(state(0), () => 0);\n * ```\n *\n * @category extra\n */\nexport function rescue<T>(\n\tsource: Node<T>,\n\trecover: (err: unknown) => T,\n\topts?: ExtraOpts,\n): Node<T> {\n\treturn node<T>([source as Node], () => undefined, {\n\t\t...operatorOpts(opts),\n\t\tcompleteWhenDepsComplete: false,\n\t\tonMessage(msg, _i, a) {\n\t\t\tif (msg[0] === ERROR) {\n\t\t\t\ttry {\n\t\t\t\t\ta.emit(recover(msg[1]));\n\t\t\t\t} catch (err) {\n\t\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\ta.down([msg]);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\n/**\n * Forwards upstream `DATA` only while `control.get()` is truthy; when closed, emits `RESOLVED`\n * instead of repeating the last value (value-level gate). For protocol pause/resume, use {@link pausable}.\n *\n * @param source - Upstream value node.\n * @param control - Boolean node; when falsy, output stays “closed” for that tick.\n * @param opts - Optional node options (excluding `describeKind`).\n * @returns `Node<T>` gated by `control`.\n *\n * @example\n * ```ts\n * import { gate, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const data = state(1);\n * const open = state(true);\n * gate(data, open);\n * ```\n *\n * @category extra\n */\nexport function gate<T>(source: Node<T>, control: Node<boolean>, opts?: ExtraOpts): Node<T> {\n\treturn node<T>(\n\t\t[source as Node, control as Node],\n\t\t(_deps, a) => {\n\t\t\tconst v = (source as Node).get();\n\t\t\tconst c = (control as Node).get();\n\t\t\tif (!c) {\n\t\t\t\ta.down([[RESOLVED]]);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn v as T;\n\t\t},\n\t\toperatorOpts(opts),\n\t);\n}\n\n// ——————————————————————————————————————————————————————————————\n// RxJS-compatible aliases — improve AI code-generation accuracy\n// ——————————————————————————————————————————————————————————————\n\n/**\n * RxJS-named alias for {@link combine} — emits when any dep updates with latest tuple of values.\n *\n * @param sources - Upstream nodes as separate arguments (same calling shape as `combine`).\n * @returns Combined node; signature matches `combine`.\n *\n * @example\n * ```ts\n * import { combineLatest, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const n = combineLatest(state(1), state(\"a\"));\n * ```\n *\n * @category extra\n */\nexport const combineLatest = combine;\n\n/**\n * RxJS-named alias for {@link debounce} — drops rapid `DATA` until `ms` of quiet.\n *\n * @param source - Upstream node.\n * @param ms - Quiet period in milliseconds.\n * @param opts - Optional node options (excluding `describeKind`).\n * @returns Debounced node; behavior matches `debounce`.\n *\n * @example\n * ```ts\n * import { debounceTime, state } from \"@graphrefly/graphrefly-ts\";\n *\n * debounceTime(state(0), 100);\n * ```\n *\n * @category extra\n */\nexport const debounceTime = debounce;\n\n/**\n * RxJS-named alias for {@link throttle} — emits on leading/trailing edges within `ms`.\n *\n * @param source - Upstream node.\n * @param ms - Minimum spacing in milliseconds.\n * @param opts - Optional throttle shape (`leading` / `trailing`) and node options.\n * @returns Throttled node; behavior matches `throttle`.\n *\n * @example\n * ```ts\n * import { throttleTime, state } from \"@graphrefly/graphrefly-ts\";\n *\n * throttleTime(state(0), 100);\n * ```\n *\n * @category extra\n */\nexport const throttleTime = throttle;\n\n/**\n * RxJS-named alias for {@link rescue} — replaces upstream `ERROR` with a recovered value.\n *\n * @param source - Upstream node.\n * @param recover - Maps error payload to replacement value.\n * @param opts - Optional node options (excluding `describeKind`).\n * @returns Recovered stream; behavior matches `rescue`.\n *\n * @example\n * ```ts\n * import { catchError, state } from \"@graphrefly/graphrefly-ts\";\n *\n * catchError(state(0), () => 0);\n * ```\n *\n * @category extra\n */\nexport const catchError = rescue;\n","/**\n * Shared internals for roadmap §3.2 data structures (option B — versioned snapshots).\n *\n * @remarks\n * Not re-exported from the package barrel; consumers use concrete factories\n * (`reactiveMap`, …). Keeps `equals` / snapshot wiring consistent across\n * collections without exposing a second public protocol.\n *\n * @packageDocumentation\n * @internal\n */\n\n/**\n * Immutable value paired with a monotonic version for {@link NodeOptions.equals}.\n * Downstream nodes can treat unchanged versions as `RESOLVED`-eligible via `equals`.\n *\n * When the backing node has V0 versioning (GRAPHREFLY-SPEC §7), `v0` carries\n * the node's identity (`id`) and version counter for diff-friendly observation\n * and cross-snapshot dedup (roadmap §6.0b).\n */\nexport type Versioned<T> = {\n\treadonly version: number;\n\treadonly value: T;\n\t/** V0 identity from the backing node, when versioning is enabled. */\n\treadonly v0?: { readonly id: string; readonly version: number };\n};\n\n/**\n * `NodeOptions.equals` helper: compares only `version` on {@link Versioned} snapshots.\n */\nexport function snapshotEqualsVersion(a: unknown, b: unknown): boolean {\n\tif (typeof a !== \"object\" || a == null || typeof b !== \"object\" || b == null) {\n\t\treturn Object.is(a, b);\n\t}\n\tif (!(\"version\" in a) || !(\"version\" in b)) return Object.is(a, b);\n\treturn (a as Versioned<unknown>).version === (b as Versioned<unknown>).version;\n}\n\n/**\n * Returns the next snapshot with an incremented version (pure).\n * When `v0` is provided, it is included in the snapshot for V0-aware consumers.\n *\n * **Note:** `v0` is captured before the backing node's DATA emission (which\n * advances the node's version counter). The embedded `v0.version` is therefore\n * one behind the node's post-emission `node.v.version`. This is intentional —\n * `v0` records the node's version at snapshot construction time.\n */\nexport function bumpVersion<T>(\n\tcurrent: Versioned<T>,\n\tnextValue: T,\n\tv0?: { id: string; version: number },\n): Versioned<T> {\n\tif (v0 != null) {\n\t\treturn { version: current.version + 1, value: nextValue, v0 };\n\t}\n\treturn { version: current.version + 1, value: nextValue };\n}\n","/**\n * Reactive key–value map (roadmap §3.2) — versioned snapshots (`reactive-base`) and a manual\n * {@link state} node.\n */\nimport { batch } from \"../core/batch.js\";\nimport { monotonicNs } from \"../core/clock.js\";\nimport { DATA, DIRTY } from \"../core/messages.js\";\nimport type { Node, NodeOptions } from \"../core/node.js\";\nimport { state } from \"../core/sugar.js\";\nimport { bumpVersion, snapshotEqualsVersion, type Versioned } from \"./reactive-base.js\";\n\ntype MapEntry<V> = { value: V; expiresAt?: number };\n\nexport type ReactiveMapSnapshot<K, V> = Versioned<{ map: ReadonlyMap<K, V> }>;\n\nexport type ReactiveMapOptions = {\n\t/** Optional registry name for `describe()` / debugging. */\n\tname?: string;\n\t/** When set, evicts least-recently-used keys after inserts that exceed this size. */\n\tmaxSize?: number;\n\t/** Default TTL in seconds. Used when `set` omits per-call `ttl`. */\n\tdefaultTtl?: number;\n} & Omit<NodeOptions, \"initial\" | \"describeKind\" | \"equals\">;\n\nexport type ReactiveMapBundle<K, V> = {\n\t/** Emits {@link ReactiveMapSnapshot} on each structural change (two-phase). */\n\tnode: Node<ReactiveMapSnapshot<K, V>>;\n\tget: (key: K) => V | undefined;\n\tset: (key: K, value: V, opts?: { ttl?: number }) => void;\n\tdelete: (key: K) => void;\n\tclear: () => void;\n\thas: (key: K) => boolean;\n\treadonly size: number;\n\t/** Removes expired entries (monotonic clock), emitting if the visible map changes. */\n\tpruneExpired: () => void;\n};\n\nfunction emptySnapshot<K, V>(): ReactiveMapSnapshot<K, V> {\n\treturn { version: 0, value: { map: new Map() } };\n}\n\nfunction isExpired(e: MapEntry<unknown>, now: number): boolean {\n\treturn e.expiresAt !== undefined && now >= e.expiresAt;\n}\n\nfunction buildMap<K, V>(store: Map<K, MapEntry<V>>, now: number): Map<K, V> {\n\tconst out = new Map<K, V>();\n\tfor (const [k, e] of store) {\n\t\tif (!isExpired(e, now)) out.set(k, e.value);\n\t}\n\treturn out;\n}\n\n/**\n * Creates a reactive `Map` with optional per-key TTL and optional LRU max size.\n *\n * @param options - Node options plus `maxSize` / `defaultTtl` (seconds).\n * @returns `ReactiveMapBundle` — imperative `get` / `set` / `delete` / `clear` / `pruneExpired` and a `node` emitting versioned readonly map snapshots.\n *\n * @remarks\n * **TTL:** Expiry is checked on `get`, `has`, `size`, `pruneExpired`, and before each\n * snapshot emission (expired keys are pruned first). There is no\n * background timer; monotonic-clock–expired keys may still appear in the last-emitted\n * snapshot on `node` until a read or `pruneExpired` removes them.\n * Uses `monotonicNs()` — immune to wall-clock adjustments.\n *\n * **LRU:** Uses native `Map` insertion order — `get` / `has` refreshes position; under\n * `maxSize` pressure the first key in iteration order is evicted. When `maxSize` is\n * omitted or is less than 1, no size-based eviction runs.\n *\n * @example\n * ```ts\n * import { reactiveMap } from \"@graphrefly/graphrefly-ts\";\n *\n * const m = reactiveMap<string, number>({ name: \"cache\", maxSize: 100, defaultTtl: 60 });\n * m.set(\"x\", 1);\n * m.node.subscribe((msgs) => {\n * console.log(msgs);\n * });\n * ```\n *\n * @category extra\n */\nexport function reactiveMap<K, V>(options: ReactiveMapOptions = {}): ReactiveMapBundle<K, V> {\n\tconst { name, maxSize, defaultTtl, ...nodeOpts } = options;\n\tconst store = new Map<K, MapEntry<V>>();\n\n\tlet current = emptySnapshot<K, V>();\n\n\tconst n = state<ReactiveMapSnapshot<K, V>>(current, {\n\t\t...nodeOpts,\n\t\tname,\n\t\tdescribeKind: \"state\",\n\t\tequals: snapshotEqualsVersion,\n\t});\n\n\tfunction pruneExpiredInternal(): boolean {\n\t\tconst now = monotonicNs();\n\t\tlet removed = false;\n\t\tfor (const [k, e] of store) {\n\t\t\tif (isExpired(e, now)) {\n\t\t\t\tstore.delete(k);\n\t\t\t\tremoved = true;\n\t\t\t}\n\t\t}\n\t\treturn removed;\n\t}\n\n\tfunction evictLruWhileOver(): void {\n\t\tif (maxSize === undefined || maxSize < 1) return;\n\t\twhile (store.size > maxSize) {\n\t\t\tconst first = store.keys().next().value as K | undefined;\n\t\t\tif (first === undefined) break;\n\t\t\tstore.delete(first);\n\t\t}\n\t}\n\n\tfunction pushSnapshot(): void {\n\t\tpruneExpiredInternal();\n\t\tconst now = monotonicNs();\n\t\tconst map = buildMap(store, now) as ReadonlyMap<K, V>;\n\t\tconst nv = n.v;\n\t\tcurrent = bumpVersion(current, { map }, nv ? { id: nv.id, version: nv.version } : undefined);\n\t\tbatch(() => {\n\t\t\tn.down([[DIRTY]]);\n\t\t\tn.down([[DATA, current]]);\n\t\t});\n\t}\n\n\tfunction touchLru(key: K): void {\n\t\tconst e = store.get(key);\n\t\tif (e === undefined) return;\n\t\tstore.delete(key);\n\t\tstore.set(key, e);\n\t}\n\n\tconst bundle: ReactiveMapBundle<K, V> = {\n\t\tnode: n,\n\n\t\tget(key: K): V | undefined {\n\t\t\tconst now = monotonicNs();\n\t\t\tconst e = store.get(key);\n\t\t\tif (e === undefined) return undefined;\n\t\t\tif (isExpired(e, now)) {\n\t\t\t\tstore.delete(key);\n\t\t\t\tpushSnapshot();\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\ttouchLru(key);\n\t\t\treturn e.value;\n\t\t},\n\n\t\tset(key: K, value: V, setOpts?: { ttl?: number }): void {\n\t\t\tpruneExpiredInternal();\n\t\t\tconst ttlSec = setOpts?.ttl ?? defaultTtl;\n\t\t\tif (ttlSec !== undefined && ttlSec <= 0) {\n\t\t\t\tthrow new RangeError(`reactiveMap: ttl must be positive (got ${ttlSec})`);\n\t\t\t}\n\t\t\tconst expiresAt = ttlSec !== undefined ? monotonicNs() + ttlSec * 1_000_000_000 : undefined;\n\t\t\tif (store.has(key)) store.delete(key);\n\t\t\tstore.set(key, { value, expiresAt });\n\t\t\tevictLruWhileOver();\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tdelete(key: K): void {\n\t\t\tif (!store.delete(key)) return;\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tclear(): void {\n\t\t\tif (store.size === 0) return;\n\t\t\tstore.clear();\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\thas(key: K): boolean {\n\t\t\tconst now = monotonicNs();\n\t\t\tconst e = store.get(key);\n\t\t\tif (e === undefined) return false;\n\t\t\tif (isExpired(e, now)) {\n\t\t\t\tstore.delete(key);\n\t\t\t\tpushSnapshot();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ttouchLru(key);\n\t\t\treturn true;\n\t\t},\n\n\t\tget size(): number {\n\t\t\tpruneExpiredInternal();\n\t\t\treturn store.size;\n\t\t},\n\n\t\tpruneExpired(): void {\n\t\t\tif (!pruneExpiredInternal()) return;\n\t\t\tpushSnapshot();\n\t\t},\n\t};\n\n\treturn bundle;\n}\n","/**\n * Composite data patterns (roadmap §3.2b).\n *\n * These helpers compose existing primitives (`node`, `switchMap`, `reactiveMap`,\n * `dynamicNode`, `fromAny`) without introducing new protocol semantics.\n */\n\nimport { batch } from \"../core/batch.js\";\nimport { dynamicNode } from \"../core/dynamic-node.js\";\nimport { DATA } from \"../core/messages.js\";\nimport type { Node, NodeOptions } from \"../core/node.js\";\nimport { derived, state } from \"../core/sugar.js\";\nimport { merge, switchMap } from \"./operators.js\";\nimport { type ReactiveMapBundle, type ReactiveMapOptions, reactiveMap } from \"./reactive-map.js\";\nimport { forEach, fromAny, type NodeInput } from \"./sources.js\";\n\nfunction isNodeLike<T>(value: unknown): value is Node<T> {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\ttypeof (value as Node<T>).get === \"function\" &&\n\t\ttypeof (value as Node<T>).subscribe === \"function\"\n\t);\n}\n\n/**\n * Verification payload shape is intentionally user-defined.\n */\nexport type VerifyValue = unknown;\n\nexport type VerifiableOptions<TVerify = VerifyValue> = Omit<\n\tNodeOptions,\n\t\"describeKind\" | \"initial\"\n> & {\n\t/** Reactive re-verification trigger. */\n\ttrigger?: NodeInput<unknown>;\n\t/** Re-run verification whenever `source` settles. */\n\tautoVerify?: boolean;\n\t/** Initial verification companion value. */\n\tinitialVerified?: TVerify | null;\n};\n\nexport type VerifiableBundle<T, TVerify = VerifyValue> = {\n\t/** Coerced source node. */\n\tnode: Node<T>;\n\t/** Latest verification result (`null` before first verification). */\n\tverified: Node<TVerify | null>;\n\t/** Effective trigger node used for verification, if any. */\n\ttrigger: Node<unknown> | null;\n};\n\n/**\n * Composes a value node with a reactive verification companion.\n *\n * Uses `switchMap` so newer triggers cancel stale in-flight verification work.\n */\nexport function verifiable<T, TVerify = VerifyValue>(\n\tsource: NodeInput<T>,\n\tverifyFn: (value: T) => NodeInput<TVerify>,\n\topts?: VerifiableOptions<TVerify>,\n): VerifiableBundle<T, TVerify> {\n\tconst sourceNode = fromAny(source);\n\tconst hasSourceVersioning = sourceNode.v != null;\n\tconst verified = state<TVerify | null>(opts?.initialVerified ?? null, {\n\t\t...(hasSourceVersioning ? { meta: { sourceVersion: null } } : {}),\n\t});\n\tconst hasTrigger = opts?.trigger !== undefined && opts.trigger !== null;\n\n\tlet triggerNode: Node<unknown> | null = null;\n\tif (hasTrigger && opts?.autoVerify) {\n\t\ttriggerNode = merge(fromAny(opts.trigger) as Node<unknown>, sourceNode as Node<unknown>);\n\t} else if (hasTrigger) {\n\t\ttriggerNode = fromAny(opts.trigger);\n\t} else if (opts?.autoVerify) {\n\t\ttriggerNode = sourceNode as Node<unknown>;\n\t}\n\n\tif (triggerNode !== null) {\n\t\tconst verifyStream = switchMap(triggerNode, () => verifyFn(sourceNode.get() as T));\n\t\tforEach(verifyStream, (value) => {\n\t\t\tbatch(() => {\n\t\t\t\tverified.down([[DATA, value]]);\n\t\t\t\t// V0 backfill: stamp which source version was verified (§6.0b).\n\t\t\t\tif (hasSourceVersioning) {\n\t\t\t\t\tconst sv = sourceNode.v;\n\t\t\t\t\tif (sv != null) {\n\t\t\t\t\t\tverified.meta.sourceVersion.down([[DATA, { id: sv.id, version: sv.version }]]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\treturn { node: sourceNode, verified, trigger: triggerNode };\n}\n\nexport type Extraction<TMem> = {\n\tupsert: Array<{ key: string; value: TMem }>;\n\tremove?: string[];\n};\n\nexport type DistillOptions<TMem> = {\n\tscore: (mem: TMem, context: unknown) => number;\n\tcost: (mem: TMem) => number;\n\tbudget?: number;\n\tevict?: (key: string, mem: TMem) => boolean | Node<boolean>;\n\tconsolidate?: (entries: ReadonlyMap<string, TMem>) => NodeInput<Extraction<TMem>>;\n\tconsolidateTrigger?: NodeInput<unknown>;\n\tcontext?: NodeInput<unknown>;\n\tmapOptions?: ReactiveMapOptions;\n};\n\nexport type DistillBundle<TMem> = {\n\tstore: ReactiveMapBundle<string, TMem>;\n\tcompact: Node<Array<{ key: string; value: TMem; score: number }>>;\n\tsize: Node<number>;\n};\n\nfunction keepalive(node: Node): void {\n\tnode.subscribe(() => undefined);\n}\n\nfunction mapFromSnapshot<TMem>(snapshot: unknown): ReadonlyMap<string, TMem> {\n\tif (\n\t\ttypeof snapshot === \"object\" &&\n\t\tsnapshot !== null &&\n\t\t\"value\" in snapshot &&\n\t\ttypeof (snapshot as { value?: unknown }).value === \"object\" &&\n\t\t(snapshot as { value?: unknown }).value !== null &&\n\t\t\"map\" in ((snapshot as { value?: unknown }).value as object)\n\t) {\n\t\treturn ((snapshot as { value: { map: ReadonlyMap<string, TMem> } }).value.map ??\n\t\t\tnew Map<string, TMem>()) as ReadonlyMap<string, TMem>;\n\t}\n\treturn new Map<string, TMem>();\n}\n\nfunction asReadonlyMap<TMem>(store: ReactiveMapBundle<string, TMem>): ReadonlyMap<string, TMem> {\n\treturn mapFromSnapshot<TMem>(store.node.get());\n}\n\nfunction applyExtraction<TMem>(\n\tstore: ReactiveMapBundle<string, TMem>,\n\textraction: Extraction<TMem>,\n): void {\n\tif (!Array.isArray(extraction.upsert)) {\n\t\tthrow new TypeError(\"distill extraction requires upsert: Array<{ key, value }>\");\n\t}\n\tbatch(() => {\n\t\tfor (const { key, value } of extraction.upsert) {\n\t\t\tstore.set(key, value);\n\t\t}\n\t\tfor (const key of extraction.remove ?? []) {\n\t\t\tstore.delete(key);\n\t\t}\n\t});\n}\n\n/**\n * Budget-constrained reactive memory composition.\n */\nexport function distill<TRaw, TMem>(\n\tsource: NodeInput<TRaw>,\n\textractFn: (raw: TRaw, existing: ReadonlyMap<string, TMem>) => NodeInput<Extraction<TMem>>,\n\topts: DistillOptions<TMem>,\n): DistillBundle<TMem> {\n\tconst sourceNode = fromAny(source);\n\tconst store = reactiveMap<string, TMem>(opts.mapOptions ?? {});\n\tconst budget = opts.budget ?? 2000;\n\tconst hasContext = opts.context !== undefined && opts.context !== null;\n\tconst contextNode = hasContext ? fromAny(opts.context) : state<unknown>(null);\n\n\tconst extractionStream = switchMap(sourceNode, (raw) => extractFn(raw, asReadonlyMap(store)));\n\tforEach(extractionStream, (extraction) => {\n\t\tapplyExtraction(store, extraction);\n\t});\n\n\tif (opts.evict) {\n\t\tconst evictionKeys = dynamicNode((get) => {\n\t\t\tconst out: string[] = [];\n\t\t\tconst snapshot = mapFromSnapshot<TMem>(get(store.node));\n\t\t\tfor (const [key, mem] of snapshot) {\n\t\t\t\tconst verdict = opts.evict!(key, mem);\n\t\t\t\tif (isNodeLike<boolean>(verdict)) {\n\t\t\t\t\tif (get(verdict) === true) out.push(key);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (typeof verdict === \"boolean\") {\n\t\t\t\t\tif (verdict) out.push(key);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthrow new TypeError(\"distill evict() must return boolean or Node<boolean>\");\n\t\t\t}\n\t\t\treturn out;\n\t\t});\n\t\tforEach(evictionKeys, (keys) => {\n\t\t\tfor (const key of keys) store.delete(key);\n\t\t});\n\t}\n\n\tconst hasConsolidateTrigger =\n\t\topts.consolidateTrigger !== undefined && opts.consolidateTrigger !== null;\n\tif (opts.consolidate && hasConsolidateTrigger) {\n\t\tconst consolidateTriggerNode = fromAny(opts.consolidateTrigger);\n\t\tconst consolidationStream = switchMap(consolidateTriggerNode, () =>\n\t\t\topts.consolidate!(asReadonlyMap(store)),\n\t\t);\n\t\tforEach(consolidationStream, (extraction) => {\n\t\t\tapplyExtraction(store, extraction);\n\t\t});\n\t}\n\n\tconst compact = derived([store.node, contextNode], ([snapshot, context]) => {\n\t\tconst entries = [...mapFromSnapshot<TMem>(snapshot).entries()].map(([key, value]) => ({\n\t\t\tkey,\n\t\t\tvalue,\n\t\t\tscore: opts.score(value, context),\n\t\t\tcost: opts.cost(value),\n\t\t}));\n\t\tentries.sort((a, b) => b.score - a.score);\n\n\t\tconst packed: Array<{ key: string; value: TMem; score: number }> = [];\n\t\tlet remaining = budget;\n\t\tfor (const item of entries) {\n\t\t\tif (item.cost <= remaining) {\n\t\t\t\tpacked.push({ key: item.key, value: item.value, score: item.score });\n\t\t\t\tremaining -= item.cost;\n\t\t\t}\n\t\t}\n\t\treturn packed;\n\t});\n\n\tconst size = derived([store.node], ([snapshot]) => mapFromSnapshot<TMem>(snapshot).size);\n\tkeepalive(compact);\n\tkeepalive(size);\n\n\treturn { store, compact, size };\n}\n","// ---------------------------------------------------------------------------\n// RxJS bridge — reactive interop between GraphReFly nodes and RxJS Observables.\n// ---------------------------------------------------------------------------\n// Generic utilities for bridging GraphReFly's message protocol to RxJS\n// Observables. Works anywhere RxJS is available (NestJS, Angular, standalone).\n//\n// Usage:\n// import { toObservable, observeNode$ } from '@graphrefly/graphrefly-ts/extra';\n// const values$ = toObservable(myNode); // Observable<T>\n// const msgs$ = toMessages$(myNode); // Observable<Messages>\n// const node$ = observeNode$(graph, \"path\"); // Observable<T> via graph.observe\n// const all$ = observeGraph$(graph); // Observable<{ path, messages }>\n// ---------------------------------------------------------------------------\n\nimport { Observable } from \"rxjs\";\nimport { COMPLETE, DATA, ERROR, type Messages } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport type { Graph, GraphObserveAll, GraphObserveOne, ObserveOptions } from \"../graph/graph.js\";\n\n/**\n * Bridge a `Node<T>` to an RxJS `Observable<T>`.\n *\n * Emits the node's value on each `DATA` message. Maps `ERROR` to\n * `subscriber.error()` and `COMPLETE` to `subscriber.complete()`.\n * Protocol-internal signals (DIRTY, RESOLVED, PAUSE, etc.) are skipped.\n *\n * Unsubscribing the Observable unsubscribes the node.\n */\nexport function toObservable<T>(node: Node<T>): Observable<T> {\n\treturn new Observable<T>((subscriber) => {\n\t\tconst unsub = node.subscribe((msgs) => {\n\t\t\tfor (const m of msgs) {\n\t\t\t\tif (subscriber.closed) return;\n\t\t\t\tif (m[0] === DATA) {\n\t\t\t\t\tsubscriber.next(m[1] as T);\n\t\t\t\t} else if (m[0] === ERROR) {\n\t\t\t\t\tsubscriber.error(m[1]);\n\t\t\t\t\treturn;\n\t\t\t\t} else if (m[0] === COMPLETE) {\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn unsub;\n\t});\n}\n\n/**\n * Bridge a `Node<T>` to an `Observable<Messages>` — raw message batches.\n *\n * Each emission is a full `[[Type, Data?], ...]` batch. The Observable\n * terminates on ERROR or COMPLETE (the terminal batch is still emitted\n * as the final `next()` before the Observable signal).\n */\nexport function toMessages$<T>(node: Node<T>): Observable<Messages> {\n\treturn new Observable<Messages>((subscriber) => {\n\t\tconst unsub = node.subscribe((msgs) => {\n\t\t\tif (subscriber.closed) return;\n\t\t\tsubscriber.next(msgs);\n\t\t\tfor (const m of msgs) {\n\t\t\t\tif (m[0] === ERROR) {\n\t\t\t\t\tsubscriber.error(m[1]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (m[0] === COMPLETE) {\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn unsub;\n\t});\n}\n\n/**\n * Observe a single node in a `Graph` as an `Observable<T>`.\n *\n * Equivalent to `toObservable(graph.resolve(path))` but routes through\n * `graph.observe()` so actor guards are respected when provided.\n */\nexport function observeNode$<T>(\n\tgraph: Graph,\n\tpath: string,\n\toptions?: ObserveOptions,\n): Observable<T> {\n\treturn new Observable<T>((subscriber) => {\n\t\tconst handle: GraphObserveOne = graph.observe(path, options);\n\t\tconst unsub = handle.subscribe((msgs) => {\n\t\t\tfor (const m of msgs) {\n\t\t\t\tif (subscriber.closed) return;\n\t\t\t\tif (m[0] === DATA) {\n\t\t\t\t\tsubscriber.next(m[1] as T);\n\t\t\t\t} else if (m[0] === ERROR) {\n\t\t\t\t\tsubscriber.error(m[1]);\n\t\t\t\t\treturn;\n\t\t\t\t} else if (m[0] === COMPLETE) {\n\t\t\t\t\tsubscriber.complete();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn unsub;\n\t});\n}\n\n/**\n * Observe all nodes in a `Graph` as an `Observable<{ path, messages }>`.\n *\n * Each emission carries the qualified node path and the raw message batch.\n * The Observable never self-completes (graphs are long-lived); dispose by\n * unsubscribing.\n */\nexport function observeGraph$(\n\tgraph: Graph,\n\toptions?: ObserveOptions,\n): Observable<{ path: string; messages: Messages }> {\n\treturn new Observable((subscriber) => {\n\t\tconst handle: GraphObserveAll = graph.observe(options);\n\t\tconst unsub = handle.subscribe((nodePath, messages) => {\n\t\t\tif (subscriber.closed) return;\n\t\t\tsubscriber.next({ path: nodePath, messages });\n\t\t});\n\t\treturn unsub;\n\t});\n}\n","/**\n * Lazy per-topic manual nodes (roadmap §3.2) — create topics on first access, publish with two-phase push.\n */\n\nimport { batch } from \"../core/batch.js\";\nimport { DATA, DIRTY, TEARDOWN } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { state } from \"../core/sugar.js\";\n\n/**\n * In-memory lazy topic registry: each topic is an independent {@link state} node.\n *\n * @category extra\n */\nexport interface PubSubHub {\n\t/**\n\t * Returns the topic node, creating it on first use.\n\t *\n\t * @param name - Topic key.\n\t * @returns `Node` whose value is the last published payload (initially `undefined`).\n\t */\n\ttopic(name: string): Node<unknown>;\n\n\t/**\n\t * Pushes a value to the topic (two-phase `DIRTY` then `DATA`, matching other manual sources here).\n\t *\n\t * @param name - Topic key.\n\t * @param value - Payload.\n\t */\n\tpublish(name: string, value: unknown): void;\n\n\t/**\n\t * Removes a topic and tears down its node. Returns `true` if the topic existed.\n\t *\n\t * @param name - Topic key.\n\t */\n\tremoveTopic(name: string): boolean;\n}\n\nclass PubSubHubImpl implements PubSubHub {\n\tprivate readonly topics = new Map<string, Node<unknown>>();\n\n\ttopic(name: string): Node<unknown> {\n\t\tlet n = this.topics.get(name);\n\t\tif (n === undefined) {\n\t\t\tn = state(undefined, { describeKind: \"state\" });\n\t\t\tthis.topics.set(name, n);\n\t\t}\n\t\treturn n;\n\t}\n\n\tpublish(name: string, value: unknown): void {\n\t\tconst t = this.topic(name);\n\t\tbatch(() => {\n\t\t\tt.down([[DIRTY]]);\n\t\t\tt.down([[DATA, value]]);\n\t\t});\n\t}\n\n\tremoveTopic(name: string): boolean {\n\t\tconst n = this.topics.get(name);\n\t\tif (n === undefined) return false;\n\t\tn.down([[TEARDOWN]]);\n\t\tthis.topics.delete(name);\n\t\treturn true;\n\t}\n}\n\n/**\n * Creates an empty {@link PubSubHub} for lazy topic nodes.\n *\n * @returns A new hub with no topics until {@link PubSubHub.topic} or {@link PubSubHub.publish} runs.\n *\n * @example\n * ```ts\n * import { pubsub } from \"@graphrefly/graphrefly-ts\";\n *\n * const hub = pubsub();\n * const t = hub.topic(\"events\");\n * t.subscribe((msgs) => console.log(msgs));\n * hub.publish(\"events\", { ok: true });\n * hub.removeTopic(\"events\"); // tears down the node\n * ```\n *\n * @category extra\n */\nexport function pubsub(): PubSubHub {\n\treturn new PubSubHubImpl();\n}\n","/**\n * Dual-key sorted index (roadmap §3.2) — unique primary key, rows ordered by `(secondary, primary)`.\n */\nimport { batch } from \"../core/batch.js\";\nimport { DATA, DIRTY } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { derived, state } from \"../core/sugar.js\";\nimport { bumpVersion, snapshotEqualsVersion, type Versioned } from \"./reactive-base.js\";\n\nexport type IndexRow<K, V = unknown> = {\n\treadonly primary: K;\n\treadonly secondary: unknown;\n\treadonly value: V;\n};\n\nexport type ReactiveIndexSnapshot<K, V = unknown> = Versioned<{ rows: readonly IndexRow<K, V>[] }>;\n\nexport type ReactiveIndexOptions = {\n\tname?: string;\n};\n\nexport type ReactiveIndexBundle<K, V = unknown> = {\n\t/** Rows sorted by `(secondary, primary)`; versioned snapshots. */\n\treadonly ordered: Node<ReactiveIndexSnapshot<K, V>>;\n\t/** Map from primary key to stored value. */\n\treadonly byPrimary: Node<ReadonlyMap<K, V>>;\n\tupsert: (primary: K, secondary: unknown, value: V) => void;\n\tdelete: (primary: K) => void;\n\tclear: () => void;\n};\n\nfunction emptySnapshot<K, V>(): ReactiveIndexSnapshot<K, V> {\n\treturn { version: 0, value: { rows: [] } };\n}\n\nfunction rowKey<K, V>(row: IndexRow<K, V>): [unknown, K] {\n\treturn [row.secondary, row.primary];\n}\n\n/** Lexicographic ordering for index keys (mirrors Python tuple compare for typical primitives). */\nfunction cmpOrd(a: unknown, b: unknown): number {\n\tif (a === b) return 0;\n\tconst ta = typeof a;\n\tconst tb = typeof b;\n\tif (ta === tb && (ta === \"number\" || ta === \"string\" || ta === \"boolean\" || ta === \"bigint\")) {\n\t\tconst ax = a as number | string | boolean | bigint;\n\t\tconst bx = b as number | string | boolean | bigint;\n\t\tif (ax < bx) return -1;\n\t\tif (ax > bx) return 1;\n\t\treturn 0;\n\t}\n\treturn String(a).localeCompare(String(b));\n}\n\nfunction compareKeys<K>(a: [unknown, K], b: [unknown, K]): number {\n\tlet c = cmpOrd(a[0], b[0]);\n\tif (c !== 0) return c;\n\tc = cmpOrd(a[1], b[1]);\n\treturn c;\n}\n\nfunction bisectLeft<K, V>(rows: readonly IndexRow<K, V>[], row: IndexRow<K, V>): number {\n\tconst k = rowKey(row);\n\tlet lo = 0;\n\tlet hi = rows.length;\n\twhile (lo < hi) {\n\t\tconst mid = (lo + hi) >> 1;\n\t\tif (compareKeys(k, rowKey(rows[mid]!)) > 0) lo = mid + 1;\n\t\telse hi = mid;\n\t}\n\treturn lo;\n}\n\nfunction byPrimaryMap<K, V>(rows: readonly IndexRow<K, V>[]): Map<K, V> {\n\tconst m = new Map<K, V>();\n\tfor (const r of rows) m.set(r.primary, r.value);\n\treturn m;\n}\n\nfunction keepaliveDerived(n: Node<unknown>): void {\n\tvoid n.subscribe(() => {});\n}\n\n/**\n * Creates a reactive index: unique primary key per row, rows sorted by `(secondary, primary)` for ordered scans.\n *\n * @param options - Optional `name` for `describe()` / debugging.\n * @returns Bundle with `ordered` (versioned rows), `byPrimary` (map), and imperative `upsert` / `delete` / `clear`.\n *\n * @remarks\n * **Ordering:** `secondary` and `primary` are compared via a small total order: same primitive `typeof` uses\n * numeric/string/boolean/bigint comparison; mixed or object keys fall back to `String(a).localeCompare(String(b))`\n * (not identical to Python’s rich comparison for exotic types).\n *\n * @example\n * ```ts\n * import { reactiveIndex } from \"@graphrefly/graphrefly-ts\";\n *\n * const idx = reactiveIndex<string, string>();\n * idx.upsert(\"id1\", 10, \"row-a\");\n * idx.upsert(\"id2\", 5, \"row-b\");\n * ```\n *\n * @category extra\n */\nexport function reactiveIndex<K, V = unknown>(\n\toptions: ReactiveIndexOptions = {},\n): ReactiveIndexBundle<K, V> {\n\tconst { name } = options;\n\tconst buf: IndexRow<K, V>[] = [];\n\tlet current = emptySnapshot<K, V>();\n\n\tconst ordered = state<ReactiveIndexSnapshot<K, V>>(current, {\n\t\tname,\n\t\tdescribeKind: \"state\",\n\t\tequals: snapshotEqualsVersion,\n\t});\n\n\tconst byPrimary = derived(\n\t\t[ordered],\n\t\t([s]) => {\n\t\t\tconst rows = (s as ReactiveIndexSnapshot<K, V>).value.rows;\n\t\t\treturn byPrimaryMap(rows);\n\t\t},\n\t\t{ initial: new Map<K, V>(), describeKind: \"derived\" },\n\t);\n\tkeepaliveDerived(byPrimary);\n\n\tfunction pushSnapshot(): void {\n\t\tconst ov = ordered.v;\n\t\tcurrent = bumpVersion(\n\t\t\tcurrent,\n\t\t\t{ rows: [...buf] },\n\t\t\tov ? { id: ov.id, version: ov.version } : undefined,\n\t\t);\n\t\tbatch(() => {\n\t\t\tordered.down([[DIRTY]]);\n\t\t\tordered.down([[DATA, current]]);\n\t\t});\n\t}\n\n\treturn {\n\t\tordered,\n\t\tbyPrimary,\n\n\t\tupsert(primary: K, secondary: unknown, value: V): void {\n\t\t\tconst next = buf.filter((r) => r.primary !== primary);\n\t\t\tconst row: IndexRow<K, V> = { primary, secondary, value };\n\t\t\tconst pos = bisectLeft(next, row);\n\t\t\tnext.splice(pos, 0, row);\n\t\t\tbuf.length = 0;\n\t\t\tbuf.push(...next);\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tdelete(primary: K): void {\n\t\t\tconst next = buf.filter((r) => r.primary !== primary);\n\t\t\tif (next.length === buf.length) return;\n\t\t\tbuf.length = 0;\n\t\t\tbuf.push(...next);\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tclear(): void {\n\t\t\tif (buf.length === 0) return;\n\t\t\tbuf.length = 0;\n\t\t\tpushSnapshot();\n\t\t},\n\t};\n}\n","/**\n * Reactive positional list (roadmap §3.2) — tuple snapshot with append / insert / pop / clear.\n */\nimport { batch } from \"../core/batch.js\";\nimport { DATA, DIRTY } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { state } from \"../core/sugar.js\";\nimport { bumpVersion, snapshotEqualsVersion, type Versioned } from \"./reactive-base.js\";\n\nexport type ReactiveListSnapshot<T> = Versioned<{ items: readonly T[] }>;\n\nexport type ReactiveListOptions = {\n\tname?: string;\n};\n\nexport type ReactiveListBundle<T> = {\n\t/** Emits {@link ReactiveListSnapshot} on each structural change (two-phase). */\n\treadonly items: Node<ReactiveListSnapshot<T>>;\n\tappend: (value: T) => void;\n\tinsert: (index: number, value: T) => void;\n\tpop: (index?: number) => T;\n\tclear: () => void;\n};\n\nfunction emptySnapshot<T>(): ReactiveListSnapshot<T> {\n\treturn { version: 0, value: { items: [] } };\n}\n\n/**\n * Creates a reactive list with versioned immutable array snapshots.\n *\n * @param initial - Optional initial items (copied).\n * @param options - Optional `name` for `describe()` / debugging.\n * @returns Bundle with `items` (state node) and `append` / `insert` / `pop` / `clear`.\n *\n * @example\n * ```ts\n * import { reactiveList } from \"@graphrefly/graphrefly-ts\";\n *\n * const list = reactiveList<string>([\"a\"], { name: \"queue\" });\n * list.append(\"b\");\n * ```\n *\n * @category extra\n */\nexport function reactiveList<T>(\n\tinitial?: readonly T[],\n\toptions: ReactiveListOptions = {},\n): ReactiveListBundle<T> {\n\tconst { name } = options;\n\tconst buf: T[] = initial ? [...initial] : [];\n\tlet current: ReactiveListSnapshot<T> =\n\t\tbuf.length > 0 ? { version: 1, value: { items: [...buf] } } : emptySnapshot();\n\n\tconst items = state<ReactiveListSnapshot<T>>(current, {\n\t\tname,\n\t\tdescribeKind: \"state\",\n\t\tequals: snapshotEqualsVersion,\n\t});\n\n\tfunction pushSnapshot(): void {\n\t\tconst iv = items.v;\n\t\tcurrent = bumpVersion(\n\t\t\tcurrent,\n\t\t\t{ items: [...buf] },\n\t\t\tiv ? { id: iv.id, version: iv.version } : undefined,\n\t\t);\n\t\tbatch(() => {\n\t\t\titems.down([[DIRTY]]);\n\t\t\titems.down([[DATA, current]]);\n\t\t});\n\t}\n\n\treturn {\n\t\titems,\n\n\t\tappend(value: T): void {\n\t\t\tbuf.push(value);\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tinsert(index: number, value: T): void {\n\t\t\tif (index < 0 || index > buf.length) {\n\t\t\t\tthrow new RangeError(\"index out of range\");\n\t\t\t}\n\t\t\tbuf.splice(index, 0, value);\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tpop(index = -1): T {\n\t\t\tif (buf.length === 0) {\n\t\t\t\tthrow new RangeError(\"pop from empty list\");\n\t\t\t}\n\t\t\tconst i = index >= 0 ? index : buf.length + index;\n\t\t\tif (i < 0 || i >= buf.length) {\n\t\t\t\tthrow new RangeError(\"index out of range\");\n\t\t\t}\n\t\t\tconst [v] = buf.splice(i, 1);\n\t\t\tpushSnapshot();\n\t\t\treturn v as T;\n\t\t},\n\n\t\tclear(): void {\n\t\t\tif (buf.length === 0) return;\n\t\t\tbuf.length = 0;\n\t\t\tpushSnapshot();\n\t\t},\n\t};\n}\n","/**\n * Reactive append-only log (roadmap §3.2) — versioned snapshots and derived tail / slice views.\n */\nimport { batch } from \"../core/batch.js\";\nimport { DATA, DIRTY } from \"../core/messages.js\";\nimport type { Node } from \"../core/node.js\";\nimport { derived, state } from \"../core/sugar.js\";\nimport { bumpVersion, snapshotEqualsVersion, type Versioned } from \"./reactive-base.js\";\n\nexport type ReactiveLogSnapshot<T> = Versioned<{ entries: readonly T[] }>;\n\nexport type ReactiveLogOptions = {\n\tname?: string;\n\tmaxSize?: number;\n};\n\nexport type ReactiveLogBundle<T> = {\n\t/** Emits {@link ReactiveLogSnapshot} on each append/clear (two-phase). */\n\treadonly entries: Node<ReactiveLogSnapshot<T>>;\n\tappend: (value: T) => void;\n\t/** Push all values, trim once, emit one snapshot. */\n\tappendMany: (values: readonly T[]) => void;\n\tclear: () => void;\n\t/** Remove the first `n` entries; emits snapshot. */\n\ttrimHead: (n: number) => void;\n\t/** Last `n` entries (or fewer); updates when the log changes. */\n\ttail: (n: number) => Node<readonly T[]>;\n};\n\nfunction emptySnapshot<T>(): ReactiveLogSnapshot<T> {\n\treturn { version: 0, value: { entries: [] } };\n}\n\n/**\n * Keep a derived node's dep wiring alive for `get()` without a user sink.\n * Returns the unsubscribe handle so callers can clean up.\n *\n * @remarks Derived views (`tail`, `logSlice`) install this so `get()` stays\n * wired without an external sink. The returned disposer is currently not\n * exposed on the bundle — subscriptions are released when the log bundle\n * becomes unreachable and the GC collects the closure.\n */\nfunction keepaliveDerived(n: Node<unknown>): () => void {\n\treturn n.subscribe(() => {});\n}\n\n/**\n * Creates an append-only reactive log with versioned tuple snapshots.\n *\n * @param initial - Optional seed entries (copied).\n * @param options - Optional `name` for `describe()` / debugging.\n * @returns Bundle with `entries` (state node), `append`, `clear`, and {@link ReactiveLogBundle.tail}.\n *\n * @remarks\n * **Derived views:** {@link tail} and {@link logSlice} install an internal noop subscription so\n * `get()` stays wired without an external sink; creating very many disposable derived nodes can\n * retain subscriptions until the log bundle is unreachable.\n *\n * @example\n * ```ts\n * import { reactiveLog } from \"@graphrefly/graphrefly-ts\";\n *\n * const lg = reactiveLog<number>([1, 2], { name: \"audit\" });\n * lg.append(3);\n * lg.entries.subscribe((msgs) => console.log(msgs));\n * ```\n *\n * @category extra\n */\nexport function reactiveLog<T>(\n\tinitial?: readonly T[],\n\toptions: ReactiveLogOptions = {},\n): ReactiveLogBundle<T> {\n\tconst { name, maxSize } = options;\n\tif (maxSize !== undefined && maxSize < 1) {\n\t\tthrow new RangeError(\"maxSize must be >= 1\");\n\t}\n\tconst buf: T[] = initial ? [...initial] : [];\n\tif (maxSize !== undefined && buf.length > maxSize) {\n\t\tbuf.splice(0, buf.length - maxSize);\n\t}\n\tlet current: ReactiveLogSnapshot<T> =\n\t\tbuf.length > 0 ? { version: 1, value: { entries: [...buf] } } : emptySnapshot();\n\n\tconst entries = state<ReactiveLogSnapshot<T>>(current, {\n\t\tname,\n\t\tdescribeKind: \"state\",\n\t\tequals: snapshotEqualsVersion,\n\t});\n\n\tfunction pushSnapshot(): void {\n\t\tconst ev = entries.v;\n\t\tcurrent = bumpVersion(\n\t\t\tcurrent,\n\t\t\t{ entries: [...buf] },\n\t\t\tev ? { id: ev.id, version: ev.version } : undefined,\n\t\t);\n\t\tbatch(() => {\n\t\t\tentries.down([[DIRTY]]);\n\t\t\tentries.down([[DATA, current]]);\n\t\t});\n\t}\n\n\tfunction trimBuf(): void {\n\t\tif (maxSize !== undefined && buf.length > maxSize) {\n\t\t\tbuf.splice(0, buf.length - maxSize);\n\t\t}\n\t}\n\n\tconst bundle: ReactiveLogBundle<T> = {\n\t\tentries,\n\n\t\tappend(value: T): void {\n\t\t\tbuf.push(value);\n\t\t\ttrimBuf();\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tappendMany(values: readonly T[]): void {\n\t\t\tif (values.length === 0) return;\n\t\t\tbuf.push(...values);\n\t\t\ttrimBuf();\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\tclear(): void {\n\t\t\tif (buf.length === 0) return;\n\t\t\tbuf.length = 0;\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\ttrimHead(n: number): void {\n\t\t\tif (n < 0) {\n\t\t\t\tthrow new RangeError(\"n must be >= 0\");\n\t\t\t}\n\t\t\tif (n === 0) return;\n\t\t\tif (n >= buf.length) {\n\t\t\t\tif (buf.length === 0) return;\n\t\t\t\tbuf.length = 0;\n\t\t\t} else {\n\t\t\t\tbuf.splice(0, n);\n\t\t\t}\n\t\t\tpushSnapshot();\n\t\t},\n\n\t\ttail(n: number): Node<readonly T[]> {\n\t\t\tif (n < 0) {\n\t\t\t\tthrow new RangeError(\"n must be >= 0\");\n\t\t\t}\n\t\t\tconst snap = entries.get() as ReactiveLogSnapshot<T>;\n\t\t\tconst e = snap.value.entries;\n\t\t\tconst init = n === 0 ? [] : e.slice(Math.max(0, e.length - n));\n\t\t\tconst out = derived(\n\t\t\t\t[entries],\n\t\t\t\t([s]) => {\n\t\t\t\t\tconst list = (s as ReactiveLogSnapshot<T>).value.entries;\n\t\t\t\t\treturn n === 0 ? [] : list.slice(Math.max(0, list.length - n));\n\t\t\t\t},\n\t\t\t\t{ initial: init, describeKind: \"derived\" },\n\t\t\t);\n\t\t\tkeepaliveDerived(out);\n\t\t\treturn out;\n\t\t},\n\t};\n\n\treturn bundle;\n}\n\n/**\n * Builds a derived node for `entries.slice(start, stop)` (same semantics as `Array.prototype.slice`; `stop` exclusive).\n *\n * @param log - Log from {@link reactiveLog}.\n * @param start - Start index (must be `>= 0`).\n * @param stop - End index (exclusive); omit to slice to the end.\n * @returns Derived node emitting the sliced readonly array.\n *\n * @example\n * ```ts\n * import { reactiveLog, logSlice } from \"@graphrefly/graphrefly-ts\";\n *\n * const lg = reactiveLog<number>([10, 20, 30, 40, 50]);\n * const slice$ = logSlice(lg, 1, 4); // reactive view of [20, 30, 40]\n * slice$.subscribe((msgs) => console.log(msgs));\n *\n * lg.append(60); // slice$ now reflects [20, 30, 40] (indices 1–3 of updated log)\n * ```\n *\n * @category extra\n */\nexport function logSlice<T>(\n\tlog: ReactiveLogBundle<T>,\n\tstart: number,\n\tstop?: number,\n): Node<readonly T[]> {\n\tif (start < 0) {\n\t\tthrow new RangeError(\"start must be >= 0\");\n\t}\n\tconst snap = log.entries.get() as ReactiveLogSnapshot<T>;\n\tconst e = snap.value.entries;\n\tconst init = stop === undefined ? e.slice(start) : e.slice(start, stop);\n\tconst out = derived(\n\t\t[log.entries],\n\t\t([s]) => {\n\t\t\tconst list = (s as ReactiveLogSnapshot<T>).value.entries;\n\t\t\treturn stop === undefined ? list.slice(start) : list.slice(start, stop);\n\t\t},\n\t\t{ initial: init, describeKind: \"derived\" },\n\t);\n\tkeepaliveDerived(out);\n\treturn out;\n}\n","/**\n * Wire protocol for worker bridge communication.\n *\n * Messages with {@link messageTier} >= 2 cross the wire (DATA values via\n * coalescing, RESOLVED/COMPLETE/TEARDOWN as signals, ERROR as serialized\n * payloads). Tier 0–1 (DIRTY, INVALIDATE, PAUSE, RESUME) stay local to\n * each side's reactive graph.\n *\n * Lifecycle signals serialize as string names since Symbols can't survive\n * structured clone. Unknown {@link Symbol.for} symbols are round-tripped\n * via their registered key.\n */\n\nimport { COMPLETE, ERROR, INVALIDATE, PAUSE, RESUME, TEARDOWN } from \"../../core/messages.js\";\n\n// ---------------------------------------------------------------------------\n// Wire message types\n// ---------------------------------------------------------------------------\n\n/** Value update — one node changed. */\nexport interface ValueMessage {\n\tt: \"v\";\n\t/** Node name. */\n\ts: string;\n\t/** Serialized value. */\n\td: unknown;\n}\n\n/** Lifecycle signal — serialized symbol name. */\nexport interface SignalMessage {\n\tt: \"s\";\n\t/** Node name, or `\"*\"` for bridge-wide. */\n\ts: string;\n\t/** Signal name string (e.g. \"TEARDOWN\"). */\n\tsig: string;\n\t/** Optional payload for custom symbols (spec §1.3.6 forward unchanged). */\n\td?: unknown;\n}\n\n/** Ready — worker declares its exported nodes with initial values. */\nexport interface ReadyMessage {\n\tt: \"r\";\n\tstores: Record<string, unknown>;\n}\n\n/** Init — main sends initial values of its exposed nodes. */\nexport interface InitMessage {\n\tt: \"i\";\n\tstores: Record<string, unknown>;\n}\n\n/** Batch value update — multiple nodes changed in one reactive cycle. */\nexport interface BatchMessage {\n\tt: \"b\";\n\tu: Record<string, unknown>;\n\t/** V0 versions per node for delta sync — peer skips if version <= lastSeen (§6.0b). */\n\tv?: Record<string, number>;\n}\n\n/** Error payload — serialized since Error objects don't survive structured clone. */\nexport interface ErrorMessage {\n\tt: \"e\";\n\t/** Node name. */\n\ts: string;\n\t/** Serialized error. */\n\terr: { message: string; name: string; stack?: string };\n}\n\nexport type BridgeMessage =\n\t| ValueMessage\n\t| SignalMessage\n\t| ReadyMessage\n\t| InitMessage\n\t| BatchMessage\n\t| ErrorMessage;\n\n// ---------------------------------------------------------------------------\n// Signal serialization — Symbol <-> string for structured clone\n// ---------------------------------------------------------------------------\n\nconst signalToNameMap = new Map<symbol, string>([\n\t[INVALIDATE, \"INVALIDATE\"],\n\t[PAUSE, \"PAUSE\"],\n\t[RESUME, \"RESUME\"],\n\t[TEARDOWN, \"TEARDOWN\"],\n\t[COMPLETE, \"COMPLETE\"],\n\t[ERROR, \"ERROR\"],\n]);\n\nconst nameToSignalMap = new Map<string, symbol>([\n\t[\"INVALIDATE\", INVALIDATE],\n\t[\"PAUSE\", PAUSE],\n\t[\"RESUME\", RESUME],\n\t[\"TEARDOWN\", TEARDOWN],\n\t[\"COMPLETE\", COMPLETE],\n\t[\"ERROR\", ERROR],\n]);\n\n/**\n * Serialize a message type symbol to a string for structured clone transfer.\n *\n * Known GraphReFly symbols map to their canonical names. Unknown symbols\n * registered via {@link Symbol.for} use their registered key. Unregistered\n * symbols return `\"UNKNOWN\"`.\n */\nexport function signalToName(s: symbol): string {\n\tconst known = signalToNameMap.get(s);\n\tif (known) return known;\n\tconst key = Symbol.keyFor(s);\n\treturn key ?? \"UNKNOWN\";\n}\n\n/**\n * Deserialize a string back to a message type symbol.\n *\n * Known GraphReFly names map to their canonical symbols. Other non-empty\n * strings are reconstructed via {@link Symbol.for} (round-trip safe for\n * custom message types). Returns `undefined` for `\"UNKNOWN\"`.\n */\nexport function nameToSignal(name: string): symbol | undefined {\n\tconst known = nameToSignalMap.get(name);\n\tif (known) return known;\n\tif (name && name !== \"UNKNOWN\") return Symbol.for(name);\n\treturn undefined;\n}\n\n/** Serialize an error for structured clone transfer. */\nexport function serializeError(err: unknown): { message: string; name: string; stack?: string } {\n\tif (err instanceof Error) {\n\t\treturn { message: err.message, name: err.name, stack: err.stack };\n\t}\n\treturn { message: String(err), name: \"Error\" };\n}\n\n/** Deserialize an error payload back to an Error object. */\nexport function deserializeError(payload: {\n\tmessage: string;\n\tname: string;\n\tstack?: string;\n}): Error {\n\tconst err = new Error(payload.message);\n\terr.name = payload.name;\n\tif (payload.stack) err.stack = payload.stack;\n\treturn err;\n}\n","/**\n * WorkerTransport — normalized message channel for all worker types.\n *\n * Abstracts Worker, SharedWorker, ServiceWorker, BroadcastChannel, and\n * MessagePort behind a uniform post/listen/terminate interface.\n */\n\n/** Normalized bidirectional message channel. */\nexport interface WorkerTransport {\n\t/** Send data to the other side. Optional transferables for zero-copy. */\n\tpost(data: unknown, transfer?: Transferable[]): void;\n\t/** Listen for incoming messages. Returns unsubscribe function. */\n\tlisten(handler: (data: unknown) => void): () => void;\n\t/** Terminate the connection (if supported by the underlying transport). */\n\tterminate?(): void;\n}\n\n/**\n * Auto-detect transport type and create a normalized WorkerTransport.\n *\n * Supports:\n * - `Worker` — direct postMessage/onmessage\n * - `SharedWorker` — port-based postMessage/onmessage\n * - `ServiceWorker` — postMessage via controller, listen via navigator.serviceWorker\n * - `BroadcastChannel` — postMessage/onmessage (no Transferable support)\n * - `MessagePort` — direct postMessage/onmessage (worker-side SharedWorker port)\n */\nexport function createTransport(target: unknown): WorkerTransport {\n\t// MessagePort (SharedWorker port from inside the worker, or raw MessagePort)\n\tif (typeof MessagePort !== \"undefined\" && target instanceof MessagePort) {\n\t\treturn {\n\t\t\tpost(data, transfer) {\n\t\t\t\ttarget.postMessage(data, transfer ?? []);\n\t\t\t},\n\t\t\tlisten(handler) {\n\t\t\t\tconst h = (e: MessageEvent) => handler(e.data);\n\t\t\t\ttarget.addEventListener(\"message\", h);\n\t\t\t\ttarget.start();\n\t\t\t\treturn () => target.removeEventListener(\"message\", h);\n\t\t\t},\n\t\t\tterminate() {\n\t\t\t\ttarget.close();\n\t\t\t},\n\t\t};\n\t}\n\n\t// SharedWorker — use its port\n\tif (typeof SharedWorker !== \"undefined\" && target instanceof SharedWorker) {\n\t\treturn createTransport(target.port);\n\t}\n\n\t// Web Worker\n\tif (typeof Worker !== \"undefined\" && target instanceof Worker) {\n\t\treturn {\n\t\t\tpost(data, transfer) {\n\t\t\t\ttarget.postMessage(data, transfer ?? []);\n\t\t\t},\n\t\t\tlisten(handler) {\n\t\t\t\tconst h = (e: MessageEvent) => handler(e.data);\n\t\t\t\ttarget.addEventListener(\"message\", h);\n\t\t\t\treturn () => target.removeEventListener(\"message\", h);\n\t\t\t},\n\t\t\tterminate() {\n\t\t\t\ttarget.terminate();\n\t\t\t},\n\t\t};\n\t}\n\n\t// BroadcastChannel — no Transferable support\n\tif (typeof BroadcastChannel !== \"undefined\" && target instanceof BroadcastChannel) {\n\t\treturn {\n\t\t\tpost(data, transfer?) {\n\t\t\t\tif (transfer && transfer.length > 0) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\"[graphrefly] WorkerTransport: BroadcastChannel does not support Transferable objects. The transfer argument is ignored and objects will be cloned instead.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\ttarget.postMessage(data);\n\t\t\t},\n\t\t\tlisten(handler) {\n\t\t\t\tconst h = (e: MessageEvent) => handler(e.data);\n\t\t\t\ttarget.addEventListener(\"message\", h);\n\t\t\t\treturn () => target.removeEventListener(\"message\", h);\n\t\t\t},\n\t\t\tterminate() {\n\t\t\t\ttarget.close();\n\t\t\t},\n\t\t};\n\t}\n\n\t// ServiceWorker\n\tif (typeof ServiceWorker !== \"undefined\" && target instanceof ServiceWorker) {\n\t\treturn {\n\t\t\tpost(data, transfer) {\n\t\t\t\ttarget.postMessage(data, transfer ?? []);\n\t\t\t},\n\t\t\tlisten(handler) {\n\t\t\t\tconst h = (e: MessageEvent) => {\n\t\t\t\t\tif (e.source === target) handler(e.data);\n\t\t\t\t};\n\t\t\t\tnavigator.serviceWorker.addEventListener(\"message\", h);\n\t\t\t\treturn () => navigator.serviceWorker.removeEventListener(\"message\", h);\n\t\t\t},\n\t\t};\n\t}\n\n\tthrow new Error(\n\t\t\"createTransport: unsupported target type. Expected Worker, SharedWorker, ServiceWorker, BroadcastChannel, or MessagePort.\",\n\t);\n}\n","/**\n * workerBridge — main-thread reactive node bridge to a worker.\n *\n * Creates proxy nodes for imported worker nodes, subscribes to exposed\n * nodes and sends values across the wire. Uses derived() + effect() for\n * natural batch coalescing via two-phase push + bitmask resolution.\n *\n * Wire filtering: messages with {@link messageTier} >= 2 cross the wire.\n * DATA values go through the coalescing path; RESOLVED, COMPLETE, ERROR,\n * TEARDOWN, and unknown {@link Symbol.for} types go through the signal\n * subscription. Tier 0–1 (DIRTY, INVALIDATE, PAUSE, RESUME) stay local.\n *\n * Handshake:\n * 1. Main creates bridge, starts listening\n * 2. Worker sends { t: 'r', stores: { name: initialValue, ... } }\n * 3. Main creates proxy nodes, marks meta.status \"connected\"\n * 4. Main sends { t: 'i', stores: { name: currentValue, ... } }\n * 5. Bidirectional value flow begins\n */\n\nimport { batch } from \"../../core/batch.js\";\nimport {\n\tDATA,\n\tERROR,\n\tknownMessageTypes,\n\ttype Messages,\n\tmessageTier,\n\tTEARDOWN,\n} from \"../../core/messages.js\";\nimport type { Node, NodeSink } from \"../../core/node.js\";\nimport { derived, effect, state } from \"../../core/sugar.js\";\nimport type { BatchMessage, BridgeMessage } from \"./protocol.js\";\nimport { deserializeError, nameToSignal, serializeError, signalToName } from \"./protocol.js\";\nimport type { WorkerTransport } from \"./transport.js\";\nimport { createTransport } from \"./transport.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface WorkerBridgeOptions<\n\tTExpose extends Record<string, Node<any>>,\n\tTImport extends readonly string[],\n> {\n\t/** Nodes to send to the worker. */\n\texpose?: TExpose;\n\t/** Node names the worker will provide. */\n\timport?: TImport;\n\t/** Per-node transferable extractors for zero-copy ArrayBuffer passing. */\n\ttransfer?: Partial<Record<keyof TExpose, (value: any) => Transferable[]>>;\n\t/** Debug name. */\n\tname?: string;\n\t/**\n\t * Handshake timeout in milliseconds. If the worker doesn't send READY\n\t * within this window, `meta.status` transitions to `\"closed\"` and\n\t * `meta.error` is set. Default: no timeout.\n\t */\n\ttimeoutMs?: number;\n}\n\n/** Proxy nodes created from imported worker node names. */\ntype ImportedNodes<T extends readonly string[]> = {\n\treadonly [K in T[number]]: Node<any>;\n};\n\nexport type WorkerBridge<\n\t_TExpose extends Record<string, Node<any>>,\n\tTImport extends readonly string[],\n> = ImportedNodes<TImport> & {\n\t/** Connection status meta node. */\n\tmeta: {\n\t\tstatus: Node<\"connecting\" | \"connected\" | \"closed\">;\n\t\terror: Node<Error | null>;\n\t};\n\t/** Destroy the bridge: sends TEARDOWN, disconnects, terminates worker. */\n\tdestroy(): void;\n};\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nfunction isTransport(t: unknown): t is WorkerTransport {\n\treturn (\n\t\ttypeof t === \"object\" &&\n\t\tt !== null &&\n\t\ttypeof (t as any).post === \"function\" &&\n\t\ttypeof (t as any).listen === \"function\"\n\t);\n}\n\nexport function workerBridge<\n\tTExpose extends Record<string, Node<any>>,\n\tTImport extends readonly string[],\n>(\n\ttarget: unknown | WorkerTransport,\n\topts: WorkerBridgeOptions<TExpose, TImport>,\n): WorkerBridge<TExpose, TImport> {\n\tconst transport = isTransport(target) ? target : createTransport(target);\n\tconst bridgeName = opts.name ?? \"workerBridge\";\n\tconst exposeEntries = Object.entries(opts.expose ?? {});\n\tconst importNames = (opts.import ?? []) as readonly string[];\n\tconst transferFns = opts.transfer ?? {};\n\n\t// -- Meta: connection status -----------------------------------------------\n\tconst statusNode = state<\"connecting\" | \"connected\" | \"closed\">(\"connecting\", {\n\t\tname: `${bridgeName}::meta::status`,\n\t});\n\tconst errorNode = state<Error | null>(null, {\n\t\tname: `${bridgeName}::meta::error`,\n\t});\n\n\t// -- Proxy nodes for imports (worker -> main) ------------------------------\n\tconst proxyNodes = new Map<string, Node<any>>();\n\tconst lastSeenImportVersions = new Map<string, number>();\n\tfor (const name of importNames) {\n\t\tconst proxy = state(undefined, { name: `${bridgeName}::${name}` });\n\t\tproxyNodes.set(name, proxy);\n\t}\n\n\t// -- Send coalescing via derived + effect ----------------------------------\n\tconst lastSent = new Map<string, unknown>();\n\tlet effectUnsub: (() => void) | undefined;\n\n\tif (exposeEntries.length > 0) {\n\t\tconst exposedNodes = exposeEntries.map(([, n]) => n);\n\n\t\tconst aggregated = derived(\n\t\t\texposedNodes,\n\t\t\t() => {\n\t\t\t\tconst updates: Record<string, unknown> = {};\n\t\t\t\tfor (const [name, n] of exposeEntries) {\n\t\t\t\t\tconst v = n.get();\n\t\t\t\t\tif (v !== lastSent.get(name)) {\n\t\t\t\t\t\tupdates[name] = v;\n\t\t\t\t\t\tlastSent.set(name, v);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn updates;\n\t\t\t},\n\t\t\t{ equals: () => false, name: `${bridgeName}::aggregated` },\n\t\t);\n\n\t\tconst effectNode = effect([aggregated], () => {\n\t\t\tconst updates = aggregated.get() as Record<string, unknown>;\n\t\t\tif (Object.keys(updates).length === 0) return;\n\n\t\t\tconst transferList: Transferable[] = [];\n\t\t\tfor (const name of Object.keys(updates)) {\n\t\t\t\tconst fn = (transferFns as any)[name];\n\t\t\t\tif (fn) transferList.push(...fn(updates[name]));\n\t\t\t}\n\n\t\t\t// V0 delta sync: include version counters when available (§6.0b).\n\t\t\tlet versions: Record<string, number> | undefined;\n\t\t\tfor (const [name, n] of exposeEntries) {\n\t\t\t\tif (name in updates && n.v != null) {\n\t\t\t\t\tif (versions == null) versions = {};\n\t\t\t\t\tversions[name] = n.v.version;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst msg: BatchMessage = { t: \"b\", u: updates, ...(versions ? { v: versions } : {}) };\n\t\t\ttry {\n\t\t\t\ttransport.post(msg, transferList.length > 0 ? transferList : undefined);\n\t\t\t} catch (err) {\n\t\t\t\terrorNode.down([[DATA, err instanceof Error ? err : new Error(String(err))]]);\n\t\t\t}\n\t\t});\n\t\t// Effect nodes are lazy — subscribe to activate the chain\n\t\teffectUnsub = effectNode.subscribe(() => {});\n\t}\n\n\t// -- Receive handler -------------------------------------------------------\n\tlet destroyed = false;\n\n\tconst unlisten = transport.listen((data) => {\n\t\tif (destroyed) return;\n\t\tconst msg = data as BridgeMessage;\n\n\t\tswitch (msg.t) {\n\t\t\t// Worker ready — set proxy nodes with initial values\n\t\t\tcase \"r\": {\n\t\t\t\tif (handshakeTimer !== undefined) clearTimeout(handshakeTimer);\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const [name, value] of Object.entries(msg.stores)) {\n\t\t\t\t\t\tconst proxy = proxyNodes.get(name);\n\t\t\t\t\t\tif (proxy) proxy.down([[DATA, value]]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tstatusNode.down([[DATA, \"connected\"]]);\n\n\t\t\t\t// Send initial values of exposed nodes\n\t\t\t\tconst initValues: Record<string, unknown> = {};\n\t\t\t\tfor (const [name, n] of exposeEntries) {\n\t\t\t\t\tinitValues[name] = n.get();\n\t\t\t\t\tlastSent.set(name, initValues[name]);\n\t\t\t\t}\n\t\t\t\ttransport.post({ t: \"i\", stores: initValues } satisfies BridgeMessage);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Single value update from worker\n\t\t\tcase \"v\": {\n\t\t\t\tconst proxy = proxyNodes.get(msg.s);\n\t\t\t\tif (proxy) proxy.down([[DATA, msg.d]]);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Batch value update from worker\n\t\t\tcase \"b\": {\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const [name, value] of Object.entries(msg.u)) {\n\t\t\t\t\t\tconst incomingVersion = msg.v?.[name];\n\t\t\t\t\t\tif (incomingVersion != null) {\n\t\t\t\t\t\t\tconst lastSeen = lastSeenImportVersions.get(name);\n\t\t\t\t\t\t\tif (lastSeen != null && incomingVersion <= lastSeen) continue;\n\t\t\t\t\t\t\tlastSeenImportVersions.set(name, incomingVersion);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst proxy = proxyNodes.get(name);\n\t\t\t\t\t\tif (proxy) proxy.down([[DATA, value]]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Error from worker node\n\t\t\tcase \"e\": {\n\t\t\t\tconst proxy = proxyNodes.get(msg.s);\n\t\t\t\tif (proxy) proxy.down([[ERROR, deserializeError(msg.err)]]);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Lifecycle signal from worker\n\t\t\tcase \"s\": {\n\t\t\t\tconst sig = nameToSignal(msg.sig);\n\t\t\t\tif (!sig) break;\n\n\t\t\t\tconst targets: Node<any>[] =\n\t\t\t\t\tmsg.s === \"*\"\n\t\t\t\t\t\t? [...proxyNodes.values()]\n\t\t\t\t\t\t: proxyNodes.has(msg.s)\n\t\t\t\t\t\t\t? [proxyNodes.get(msg.s)!]\n\t\t\t\t\t\t\t: [];\n\n\t\t\t\tfor (const proxy of targets) {\n\t\t\t\t\tproxy.down((msg.d === undefined ? [[sig]] : [[sig, msg.d]]) as Messages);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t});\n\n\t// -- Subscribe to exposed nodes: forward tier >= 2 messages -----------------\n\tconst exposeUnsubs: Array<() => void> = [];\n\tfor (const [name, n] of exposeEntries) {\n\t\tconst unsub = n.subscribe(((msgs: Messages) => {\n\t\t\tif (destroyed) return;\n\t\t\tfor (const m of msgs) {\n\t\t\t\tconst type = m[0] as symbol;\n\t\t\t\t// DATA goes through the coalescing path — skip here\n\t\t\t\tif (type === DATA) continue;\n\t\t\t\t// Block known tier 0/1 (DIRTY, INVALIDATE, PAUSE, RESUME) — local only.\n\t\t\t\t// Unknown types (not in knownMessageTypes) always forward (spec §1.3.6).\n\t\t\t\tif (knownMessageTypes.includes(type) && messageTier(type) < 2) continue;\n\t\t\t\t// ERROR: serialize payload\n\t\t\t\tif (type === ERROR) {\n\t\t\t\t\ttransport.post({\n\t\t\t\t\t\tt: \"e\",\n\t\t\t\t\t\ts: name,\n\t\t\t\t\t\terr: serializeError(m[1]),\n\t\t\t\t\t} satisfies BridgeMessage);\n\t\t\t\t} else {\n\t\t\t\t\t// RESOLVED, COMPLETE, TEARDOWN, and unknown Symbol.for types\n\t\t\t\t\ttransport.post({\n\t\t\t\t\t\tt: \"s\",\n\t\t\t\t\t\ts: name,\n\t\t\t\t\t\tsig: signalToName(type),\n\t\t\t\t\t\td: m.length > 1 ? m[1] : undefined,\n\t\t\t\t\t} satisfies BridgeMessage);\n\t\t\t\t}\n\t\t\t}\n\t\t}) as NodeSink);\n\t\texposeUnsubs.push(unsub);\n\t}\n\n\t// -- Handshake timeout -----------------------------------------------------\n\tlet handshakeTimer: ReturnType<typeof setTimeout> | undefined;\n\tif (opts.timeoutMs != null && opts.timeoutMs > 0) {\n\t\thandshakeTimer = setTimeout(() => {\n\t\t\tif (statusNode.get() === \"connecting\") {\n\t\t\t\terrorNode.down([[DATA, new Error(\"Worker bridge handshake timeout\")]]);\n\t\t\t\tdestroy();\n\t\t\t}\n\t\t}, opts.timeoutMs);\n\t}\n\n\t// -- Build result object ---------------------------------------------------\n\tfunction destroy() {\n\t\tif (destroyed) return;\n\t\tdestroyed = true;\n\n\t\tif (handshakeTimer !== undefined) clearTimeout(handshakeTimer);\n\n\t\t// Send bridge-level TEARDOWN to worker\n\t\ttransport.post({\n\t\t\tt: \"s\",\n\t\t\ts: \"*\",\n\t\t\tsig: signalToName(TEARDOWN),\n\t\t} satisfies BridgeMessage);\n\n\t\t// Cleanup: unsub effect first (stops sending), then unsub expose\n\t\t// listeners, then unlisten on transport\n\t\tif (effectUnsub) effectUnsub();\n\t\tfor (const unsub of exposeUnsubs) unsub();\n\t\texposeUnsubs.length = 0;\n\t\tunlisten();\n\n\t\tstatusNode.down([[DATA, \"closed\"]]);\n\n\t\tlastSent.clear();\n\t\tlastSeenImportVersions.clear();\n\t\tproxyNodes.clear();\n\t}\n\n\tconst result: any = {\n\t\tmeta: { status: statusNode, error: errorNode },\n\t\tdestroy,\n\t};\n\n\t// Attach proxy nodes as properties\n\tfor (const [name, proxy] of proxyNodes) {\n\t\tresult[name] = proxy;\n\t}\n\n\treturn result as WorkerBridge<TExpose, TImport>;\n}\n","/**\n * workerSelf — worker-side reactive node bridge.\n *\n * Mirror of workerBridge() for the worker side. Creates proxy nodes for\n * imports from main thread, exposes local nodes via the same wire protocol.\n * Uses derived() + effect() for batch coalescing.\n *\n * Wire filtering: messages with {@link messageTier} >= 2 cross the wire.\n * DATA values go through the coalescing path; RESOLVED, COMPLETE, ERROR,\n * TEARDOWN, and unknown {@link Symbol.for} types go through the signal\n * subscription. Tier 0–1 (DIRTY, INVALIDATE, PAUSE, RESUME) stay local.\n *\n * Handshake (worker perspective):\n * 1. workerSelf() called — creates proxy nodes for imports\n * 2. Runs expose factory with proxy nodes -> gets nodes to expose\n * 3. Sends { t: 'r', stores: { name: initialValue, ... } } to main\n * 4. Receives { t: 'i', stores: { name: value, ... } } from main\n * 5. Updates proxy nodes -> triggers local effects\n */\n\nimport { batch } from \"../../core/batch.js\";\nimport {\n\tDATA,\n\tERROR,\n\tknownMessageTypes,\n\ttype Messages,\n\tmessageTier,\n\tTEARDOWN,\n} from \"../../core/messages.js\";\nimport type { Node, NodeSink } from \"../../core/node.js\";\nimport { derived, effect, state } from \"../../core/sugar.js\";\nimport type { BatchMessage, BridgeMessage } from \"./protocol.js\";\nimport { deserializeError, nameToSignal, serializeError, signalToName } from \"./protocol.js\";\nimport type { WorkerTransport } from \"./transport.js\";\nimport { createTransport } from \"./transport.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface WorkerSelfOptions<TImport extends readonly string[]> {\n\t/** Node names that the main thread will provide. */\n\timport?: TImport;\n\t/** Factory that receives imported proxy nodes and returns nodes to expose. */\n\texpose: (imported: WorkerImported<TImport>) => Record<string, Node<any>>;\n\t/** Per-node transferable extractors for zero-copy ArrayBuffer passing. */\n\ttransfer?: Record<string, (value: any) => Transferable[]>;\n}\n\n/** Proxy nodes available inside the worker from main-thread exposed nodes. */\ntype WorkerImported<T extends readonly string[]> = {\n\treadonly [K in T[number]]: Node<any>;\n};\n\nexport interface WorkerSelfHandle {\n\t/** Dispose all subscriptions and stop the bridge. */\n\tdestroy(): void;\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nfunction isTransport(t: unknown): t is WorkerTransport {\n\treturn (\n\t\ttypeof t === \"object\" &&\n\t\tt !== null &&\n\t\ttypeof (t as any).post === \"function\" &&\n\t\ttypeof (t as any).listen === \"function\"\n\t);\n}\n\nexport function workerSelf<TImport extends readonly string[]>(\n\ttarget: unknown | WorkerTransport,\n\topts: WorkerSelfOptions<TImport>,\n): WorkerSelfHandle {\n\tconst transport = isTransport(target) ? target : createTransport(target);\n\tconst importNames = (opts.import ?? []) as readonly string[];\n\tconst transferFns = opts.transfer ?? {};\n\n\t// -- Proxy nodes for imports (main -> worker) ------------------------------\n\tconst proxyNodes = new Map<string, Node<any>>();\n\tconst lastSeenImportVersions = new Map<string, number>();\n\tconst importedObj: any = {};\n\tfor (const name of importNames) {\n\t\tconst s = state(undefined, { name: `worker::${name}` });\n\t\tproxyNodes.set(name, s);\n\t\timportedObj[name] = s;\n\t}\n\n\t// -- Run expose factory ----------------------------------------------------\n\tconst exposedNodes = opts.expose(importedObj as WorkerImported<TImport>);\n\tconst exposeEntries = Object.entries(exposedNodes);\n\n\t// -- Send coalescing via derived + effect ----------------------------------\n\tconst lastSent = new Map<string, unknown>();\n\tlet effectUnsub: (() => void) | undefined;\n\tlet destroyed = false;\n\n\tif (exposeEntries.length > 0) {\n\t\tconst nodes = exposeEntries.map(([, n]) => n);\n\n\t\tconst aggregated = derived(\n\t\t\tnodes,\n\t\t\t() => {\n\t\t\t\tconst updates: Record<string, unknown> = {};\n\t\t\t\tfor (const [name, n] of exposeEntries) {\n\t\t\t\t\tconst v = n.get();\n\t\t\t\t\tif (v !== lastSent.get(name)) {\n\t\t\t\t\t\tupdates[name] = v;\n\t\t\t\t\t\tlastSent.set(name, v);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn updates;\n\t\t\t},\n\t\t\t{ equals: () => false, name: \"workerSelf::aggregated\" },\n\t\t);\n\n\t\tconst effectNode = effect([aggregated], () => {\n\t\t\tif (destroyed) return;\n\t\t\tconst updates = aggregated.get() as Record<string, unknown>;\n\t\t\tif (Object.keys(updates).length === 0) return;\n\n\t\t\tconst transferList: Transferable[] = [];\n\t\t\tfor (const name of Object.keys(updates)) {\n\t\t\t\tconst fn = (transferFns as any)[name];\n\t\t\t\tif (fn) transferList.push(...fn(updates[name]));\n\t\t\t}\n\n\t\t\t// V0 delta sync: include version counters when available (§6.0b).\n\t\t\tlet versions: Record<string, number> | undefined;\n\t\t\tfor (const [name, n] of exposeEntries) {\n\t\t\t\tif (name in updates && n.v != null) {\n\t\t\t\t\tif (versions == null) versions = {};\n\t\t\t\t\tversions[name] = n.v.version;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst msg: BatchMessage = { t: \"b\", u: updates, ...(versions ? { v: versions } : {}) };\n\t\t\ttry {\n\t\t\t\ttransport.post(msg, transferList.length > 0 ? transferList : undefined);\n\t\t\t} catch (_err) {\n\t\t\t\t// Transport failure — bridge is likely destroyed; swallow\n\t\t\t}\n\t\t});\n\t\t// Effect nodes are lazy — subscribe to activate the chain\n\t\teffectUnsub = effectNode.subscribe(() => {});\n\t}\n\n\t// -- Subscribe to exposed nodes: forward tier >= 2 messages -----------------\n\tconst exposeUnsubs: Array<() => void> = [];\n\tfor (const [name, n] of exposeEntries) {\n\t\tconst unsub = n.subscribe(((msgs: Messages) => {\n\t\t\tif (destroyed) return;\n\t\t\tfor (const m of msgs) {\n\t\t\t\tconst type = m[0] as symbol;\n\t\t\t\t// DATA goes through the coalescing path — skip here\n\t\t\t\tif (type === DATA) continue;\n\t\t\t\t// Block known tier 0/1 (DIRTY, INVALIDATE, PAUSE, RESUME) — local only.\n\t\t\t\t// Unknown types (not in knownMessageTypes) always forward (spec §1.3.6).\n\t\t\t\tif (knownMessageTypes.includes(type) && messageTier(type) < 2) continue;\n\t\t\t\t// ERROR: serialize payload\n\t\t\t\tif (type === ERROR) {\n\t\t\t\t\ttransport.post({\n\t\t\t\t\t\tt: \"e\",\n\t\t\t\t\t\ts: name,\n\t\t\t\t\t\terr: serializeError(m[1]),\n\t\t\t\t\t} satisfies BridgeMessage);\n\t\t\t\t} else {\n\t\t\t\t\t// RESOLVED, COMPLETE, TEARDOWN, and unknown Symbol.for types\n\t\t\t\t\ttransport.post({\n\t\t\t\t\t\tt: \"s\",\n\t\t\t\t\t\ts: name,\n\t\t\t\t\t\tsig: signalToName(type),\n\t\t\t\t\t\td: m.length > 1 ? m[1] : undefined,\n\t\t\t\t\t} satisfies BridgeMessage);\n\t\t\t\t}\n\t\t\t}\n\t\t}) as NodeSink);\n\t\texposeUnsubs.push(unsub);\n\t}\n\n\t// -- Receive handler -------------------------------------------------------\n\tconst unlisten = transport.listen((data) => {\n\t\tif (destroyed) return;\n\t\tconst msg = data as BridgeMessage;\n\n\t\tswitch (msg.t) {\n\t\t\t// Init from main — set proxy node values\n\t\t\tcase \"i\": {\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const [name, value] of Object.entries(msg.stores)) {\n\t\t\t\t\t\tconst proxy = proxyNodes.get(name);\n\t\t\t\t\t\tif (proxy) proxy.down([[DATA, value]]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Single value update from main\n\t\t\tcase \"v\": {\n\t\t\t\tconst proxy = proxyNodes.get(msg.s);\n\t\t\t\tif (proxy) proxy.down([[DATA, msg.d]]);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Batch value update from main\n\t\t\tcase \"b\": {\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const [name, value] of Object.entries(msg.u)) {\n\t\t\t\t\t\tconst incomingVersion = msg.v?.[name];\n\t\t\t\t\t\tif (incomingVersion != null) {\n\t\t\t\t\t\t\tconst lastSeen = lastSeenImportVersions.get(name);\n\t\t\t\t\t\t\tif (lastSeen != null && incomingVersion <= lastSeen) continue;\n\t\t\t\t\t\t\tlastSeenImportVersions.set(name, incomingVersion);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst proxy = proxyNodes.get(name);\n\t\t\t\t\t\tif (proxy) proxy.down([[DATA, value]]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Error from main node\n\t\t\tcase \"e\": {\n\t\t\t\tconst proxy = proxyNodes.get(msg.s);\n\t\t\t\tif (proxy) proxy.down([[ERROR, deserializeError(msg.err)]]);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Lifecycle signal from main\n\t\t\tcase \"s\": {\n\t\t\t\tconst sig = nameToSignal(msg.sig);\n\t\t\t\tif (!sig) break;\n\n\t\t\t\tif (sig === TEARDOWN && msg.s === \"*\") {\n\t\t\t\t\tdestroy();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst targets: Node<any>[] =\n\t\t\t\t\tmsg.s === \"*\"\n\t\t\t\t\t\t? [...proxyNodes.values()]\n\t\t\t\t\t\t: proxyNodes.has(msg.s)\n\t\t\t\t\t\t\t? [proxyNodes.get(msg.s)!]\n\t\t\t\t\t\t\t: [];\n\n\t\t\t\tfor (const proxy of targets) {\n\t\t\t\t\tproxy.down((msg.d === undefined ? [[sig]] : [[sig, msg.d]]) as Messages);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t});\n\n\t// -- Send ready message ----------------------------------------------------\n\tconst readyValues: Record<string, unknown> = {};\n\tfor (const [name, n] of exposeEntries) {\n\t\treadyValues[name] = n.get();\n\t\tlastSent.set(name, readyValues[name]);\n\t}\n\ttransport.post({ t: \"r\", stores: readyValues } satisfies BridgeMessage);\n\n\t// -- Destroy ---------------------------------------------------------------\n\tfunction destroy() {\n\t\tif (destroyed) return;\n\t\tdestroyed = true;\n\n\t\t// Cleanup: unsub effect first (stops sending), then expose listeners,\n\t\t// then unlisten on transport\n\t\tif (effectUnsub) effectUnsub();\n\t\tfor (const unsub of exposeUnsubs) unsub();\n\t\texposeUnsubs.length = 0;\n\t\tunlisten();\n\t\ttransport.terminate?.();\n\n\t\tlastSent.clear();\n\t\tlastSeenImportVersions.clear();\n\t\tproxyNodes.clear();\n\t}\n\n\treturn { destroy };\n}\n"],"mappings":"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","names":["delay","last","clampNonNegative","operatorOpts","debounce","resolvePath","sourceOpts","buffer","batch","seq","import_node_crypto","import_node_fs","import_node_path","node","operatorOpts","buffer","first","map","node","node","emptySnapshot","emptySnapshot","emptySnapshot","keepaliveDerived","isTransport"]}
|