@absolutejs/sync 1.22.0 → 1.24.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/engine/materializedView.ts", "../src/engine/aggregate.ts", "../src/engine/equiJoin.ts", "../src/engine/dataflow.ts", "../src/engine/pollingSource.ts", "../src/engine/cluster.ts", "../src/engine/presence.ts", "../src/engine/collection.ts", "../src/engine/reactive.ts", "../src/engine/graph.ts", "../src/engine/permissions.ts", "../src/engine/search.ts", "../src/engine/textIndex.ts", "../src/engine/vectorIndex.ts", "../src/engine/schedule.ts", "../src/engine/pack.ts", "../src/engine/mutation.ts", "../src/engine/retry.ts", "../node_modules/@absolutejs/telemetry/dist/index.js", "../src/engine/sandbox.ts", "../src/engine/syncEngine.ts", "../src/engine/cdc.ts", "../src/engine/schema.ts", "../src/engine/routes.ts", "../src/serializer.ts", "../src/engine/connection.ts"],
3
+ "sources": ["../src/engine/materializedView.ts", "../src/engine/aggregate.ts", "../src/engine/equiJoin.ts", "../src/engine/dataflow.ts", "../src/engine/pollingSource.ts", "../src/engine/cluster.ts", "../src/engine/presence.ts", "../src/engine/collection.ts", "../src/engine/reactive.ts", "../src/engine/graph.ts", "../src/engine/permissions.ts", "../src/engine/search.ts", "../src/engine/textIndex.ts", "../src/engine/vectorIndex.ts", "../src/engine/schedule.ts", "../src/engine/pack.ts", "../src/engine/mutation.ts", "../src/engine/retry.ts", "../node_modules/@absolutejs/telemetry/dist/index.js", "../src/engine/sandbox.ts", "../src/engine/migrate.ts", "../src/engine/syncEngine.ts", "../src/engine/cdc.ts", "../src/engine/schema.ts", "../src/engine/routes.ts", "../src/serializer.ts", "../src/engine/connection.ts"],
4
4
  "sourcesContent": [
5
5
  "import type { RowChange, RowKey, ViewDiff } from './types';\n\nexport type MaterializedViewOptions<T> = {\n\t/** Row identity within the result set. */\n\tkey: (row: T) => RowKey;\n\t/**\n\t * The query's WHERE as a JS predicate: does this row belong in the result\n\t * set? Evaluated on every changed row to decide enter/leave/update. (The\n\t * Drizzle/Prisma adapters can derive this from a query filter.)\n\t */\n\tmatch: (row: T) => boolean;\n\t/**\n\t * Equality used by {@link MaterializedView.reset} to detect changed rows.\n\t * Defaults to a shallow compare of own enumerable properties.\n\t */\n\tequals?: (a: T, b: T) => boolean;\n};\n\nexport type MaterializedView<T> = {\n\t/**\n\t * Replace the result set with `rows` (the initial DB query result). Rows are\n\t * trusted to already satisfy the predicate — the database applied the filter.\n\t */\n\thydrate: (rows: Iterable<T>) => void;\n\t/**\n\t * Apply one row change and return the resulting diff. Empty `added`/`removed`/\n\t * `changed` arrays mean the change did not affect this view.\n\t */\n\tapply: (change: RowChange<T>) => ViewDiff<T>;\n\t/**\n\t * Replace the result set with a fresh query result and return the diff versus\n\t * what the view previously held. Powers the refetch fallback for queries that\n\t * can't be matched incrementally.\n\t */\n\treset: (rows: Iterable<T>) => ViewDiff<T>;\n\t/** Current result set, as an array. */\n\trows: () => T[];\n\t/** Current result-set size. */\n\tsize: () => number;\n};\n\nconst emptyDiff = <T>(): ViewDiff<T> => ({\n\tadded: [],\n\tremoved: [],\n\tchanged: []\n});\n\nconst shallowEqual = (a: unknown, b: unknown): boolean => {\n\tif (a === b) {\n\t\treturn true;\n\t}\n\tif (\n\t\ttypeof a !== 'object' ||\n\t\ttypeof b !== 'object' ||\n\t\ta === null ||\n\t\tb === null\n\t) {\n\t\treturn false;\n\t}\n\tconst aKeys = Object.keys(a);\n\tconst bKeys = Object.keys(b);\n\tif (aKeys.length !== bKeys.length) {\n\t\treturn false;\n\t}\n\treturn aKeys.every(\n\t\t(key) =>\n\t\t\t(a as Record<string, unknown>)[key] ===\n\t\t\t(b as Record<string, unknown>)[key]\n\t);\n};\n\n/** True when a diff carries no changes. */\nexport const isEmptyViewDiff = <T>(diff: ViewDiff<T>): boolean =>\n\tdiff.added.length === 0 &&\n\tdiff.removed.length === 0 &&\n\tdiff.changed.length === 0;\n\n/**\n * A single query's materialized result set, maintained incrementally by\n * predicate matching (the Tier 3 IVM core). Hydrate once from the database, then\n * feed each changed row through {@link MaterializedView.apply}: the view decides\n * whether the row entered, left, stayed-and-changed, or is irrelevant, and\n * returns just that delta — so the server pushes diffs instead of refetching.\n *\n * Scope: single-table filtered queries (no ORDER BY / LIMIT windows — a top-N\n * query should hydrate-and-refetch rather than rely on this view, since a row\n * entering can silently evict another). Joins/aggregations are a later,\n * differential-dataflow engine.\n */\nexport const createMaterializedView = <T>(\n\toptions: MaterializedViewOptions<T>\n): MaterializedView<T> => {\n\tconst { key, match } = options;\n\tconst equals = options.equals ?? shallowEqual;\n\tconst set = new Map<RowKey, T>();\n\n\treturn {\n\t\thydrate: (rows) => {\n\t\t\tset.clear();\n\t\t\tfor (const row of rows) {\n\t\t\t\tset.set(key(row), row);\n\t\t\t}\n\t\t},\n\t\treset: (rows) => {\n\t\t\tconst next = new Map<RowKey, T>();\n\t\t\tconst added: T[] = [];\n\t\t\tconst changed: T[] = [];\n\t\t\tfor (const row of rows) {\n\t\t\t\tconst rowKey = key(row);\n\t\t\t\tnext.set(rowKey, row);\n\t\t\t\tconst previous = set.get(rowKey);\n\t\t\t\tif (previous === undefined) {\n\t\t\t\t\tadded.push(row);\n\t\t\t\t} else if (!equals(previous, row)) {\n\t\t\t\t\tchanged.push(row);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst removed: T[] = [];\n\t\t\tfor (const [rowKey, previous] of set) {\n\t\t\t\tif (!next.has(rowKey)) {\n\t\t\t\t\tremoved.push(previous);\n\t\t\t\t}\n\t\t\t}\n\t\t\tset.clear();\n\t\t\tfor (const [rowKey, row] of next) {\n\t\t\t\tset.set(rowKey, row);\n\t\t\t}\n\t\t\treturn { added, removed, changed };\n\t\t},\n\t\tapply: ({ op, row }) => {\n\t\t\tconst rowKey = key(row);\n\t\t\tconst existing = set.get(rowKey);\n\n\t\t\tif (op === 'delete') {\n\t\t\t\tif (existing === undefined) {\n\t\t\t\t\treturn emptyDiff();\n\t\t\t\t}\n\t\t\t\tset.delete(rowKey);\n\t\t\t\treturn { added: [], removed: [existing], changed: [] };\n\t\t\t}\n\n\t\t\t// insert | update — let the predicate decide membership.\n\t\t\tif (match(row)) {\n\t\t\t\tset.set(rowKey, row);\n\t\t\t\treturn existing === undefined\n\t\t\t\t\t? { added: [row], removed: [], changed: [] }\n\t\t\t\t\t: { added: [], removed: [], changed: [row] };\n\t\t\t}\n\n\t\t\t// No longer matches: it leaves the set if it was in it.\n\t\t\tif (existing !== undefined) {\n\t\t\t\tset.delete(rowKey);\n\t\t\t\treturn { added: [], removed: [existing], changed: [] };\n\t\t\t}\n\t\t\treturn emptyDiff();\n\t\t},\n\t\trows: () => [...set.values()],\n\t\tsize: () => set.size\n\t};\n};\n",
6
6
  "import type { RowChange, RowKey } from './types';\n\nexport type AggregateOptions<T> = {\n\t/** Row identity — used to track each row's contribution across updates. */\n\tkey: (row: T) => RowKey;\n\t/** Group rows by this key. Omit to aggregate everything into one group (`''`). */\n\tgroupBy?: (row: T) => RowKey;\n\t/**\n\t * Numeric value to aggregate for `sum`/`avg`/`min`/`max`. Omit for a\n\t * count-only aggregate (sum stays 0, min/max stay undefined).\n\t */\n\tvalue?: (row: T) => number;\n};\n\n/** Maintained summary for one group. */\nexport type AggregateGroup = {\n\tgroup: RowKey;\n\tcount: number;\n\tsum: number;\n\t/** `sum / count`, or 0 when the group is empty. */\n\tavg: number;\n\tmin: number | undefined;\n\tmax: number | undefined;\n};\n\nexport type Aggregate<T> = {\n\t/** Bulk-load the initial rows (replaces current state). */\n\thydrate: (rows: Iterable<T>) => void;\n\t/** Fold one row change into the running aggregates. */\n\tapply: (change: RowChange<T>) => void;\n\t/** Current summary for every non-empty group. */\n\tgroups: () => AggregateGroup[];\n\t/** Current summary for one group, or `undefined` if empty. */\n\tgroup: (group: RowKey) => AggregateGroup | undefined;\n};\n\ntype GroupState = {\n\tcount: number;\n\tsum: number;\n\t/** Multiset of values, so removing the current min/max stays correct. */\n\tvalueCounts: Map<number, number>;\n\tmin: number | undefined;\n\tmax: number | undefined;\n};\n\nconst newGroupState = (): GroupState => ({\n\tcount: 0,\n\tsum: 0,\n\tvalueCounts: new Map(),\n\tmin: undefined,\n\tmax: undefined\n});\n\nconst recomputeExtremes = (state: GroupState) => {\n\tif (state.valueCounts.size === 0) {\n\t\tstate.min = undefined;\n\t\tstate.max = undefined;\n\t\treturn;\n\t}\n\tlet min = Infinity;\n\tlet max = -Infinity;\n\tfor (const value of state.valueCounts.keys()) {\n\t\tif (value < min) {\n\t\t\tmin = value;\n\t\t}\n\t\tif (value > max) {\n\t\t\tmax = value;\n\t\t}\n\t}\n\tstate.min = min;\n\tstate.max = max;\n};\n\nconst summarize = (group: RowKey, state: GroupState): AggregateGroup => ({\n\tgroup,\n\tcount: state.count,\n\tsum: state.sum,\n\tavg: state.count > 0 ? state.sum / state.count : 0,\n\tmin: state.min,\n\tmax: state.max\n});\n\n/**\n * An incrementally-maintained aggregation — the DD-lite for `count`/`sum`/`avg`/\n * `min`/`max`, optionally grouped. Feed it the change feed (insert/update/delete)\n * and it updates each group's summary in place: count/sum/avg are O(1); min/max\n * use a value multiset so removing the current extremum recomputes correctly\n * (O(distinct values) only when the extremum leaves).\n *\n * Per-row contributions are tracked by `key`, so updates (including a row moving\n * between groups) and deletes adjust the right group without re-scanning. Use it\n * server-side over the engine's change feed, or client-side over collection\n * diffs.\n */\nexport const createAggregate = <T>(\n\toptions: AggregateOptions<T>\n): Aggregate<T> => {\n\tconst { key, groupBy, value } = options;\n\tconst groups = new Map<RowKey, GroupState>();\n\t// Each row's last (group, value), so updates/deletes adjust the right group.\n\t// `value` is undefined for a count-only aggregate (no value extractor).\n\tconst contributions = new Map<\n\t\tRowKey,\n\t\t{ group: RowKey; value: number | undefined }\n\t>();\n\n\tconst add = (group: RowKey, contribution: number | undefined) => {\n\t\tlet state = groups.get(group);\n\t\tif (state === undefined) {\n\t\t\tstate = newGroupState();\n\t\t\tgroups.set(group, state);\n\t\t}\n\t\tstate.count += 1;\n\t\tif (contribution === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tstate.sum += contribution;\n\t\tstate.valueCounts.set(\n\t\t\tcontribution,\n\t\t\t(state.valueCounts.get(contribution) ?? 0) + 1\n\t\t);\n\t\tstate.min =\n\t\t\tstate.min === undefined\n\t\t\t\t? contribution\n\t\t\t\t: Math.min(state.min, contribution);\n\t\tstate.max =\n\t\t\tstate.max === undefined\n\t\t\t\t? contribution\n\t\t\t\t: Math.max(state.max, contribution);\n\t};\n\n\tconst remove = (group: RowKey, contribution: number | undefined) => {\n\t\tconst state = groups.get(group);\n\t\tif (state === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tstate.count -= 1;\n\t\tif (contribution !== undefined) {\n\t\t\tstate.sum -= contribution;\n\t\t\tconst remaining = (state.valueCounts.get(contribution) ?? 0) - 1;\n\t\t\tif (remaining <= 0) {\n\t\t\t\tstate.valueCounts.delete(contribution);\n\t\t\t\tif (contribution === state.min || contribution === state.max) {\n\t\t\t\t\trecomputeExtremes(state);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tstate.valueCounts.set(contribution, remaining);\n\t\t\t}\n\t\t}\n\t\tif (state.count <= 0) {\n\t\t\tgroups.delete(group);\n\t\t}\n\t};\n\n\tconst apply = (change: RowChange<T>) => {\n\t\tconst rowKey = key(change.row);\n\t\tconst previous = contributions.get(rowKey);\n\n\t\tif (change.op === 'delete') {\n\t\t\tif (previous !== undefined) {\n\t\t\t\tremove(previous.group, previous.value);\n\t\t\t\tcontributions.delete(rowKey);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst group = groupBy ? groupBy(change.row) : '';\n\t\tconst contribution = value ? value(change.row) : undefined;\n\t\tif (previous !== undefined) {\n\t\t\tremove(previous.group, previous.value);\n\t\t}\n\t\tadd(group, contribution);\n\t\tcontributions.set(rowKey, { group, value: contribution });\n\t};\n\n\treturn {\n\t\thydrate: (rows) => {\n\t\t\tgroups.clear();\n\t\t\tcontributions.clear();\n\t\t\tfor (const row of rows) {\n\t\t\t\tapply({ op: 'insert', row });\n\t\t\t}\n\t\t},\n\t\tapply,\n\t\tgroups: () =>\n\t\t\t[...groups.entries()].map(([group, state]) =>\n\t\t\t\tsummarize(group, state)\n\t\t\t),\n\t\tgroup: (group) => {\n\t\t\tconst state = groups.get(group);\n\t\t\treturn state === undefined ? undefined : summarize(group, state);\n\t\t}\n\t};\n};\n",
@@ -22,14 +22,15 @@
22
22
  "/**\n * Mutation retry policy — opt-in conflict retry for `defineMutation`. Convex\n * auto-retries every mutation on OCC conflict because their handlers are pure\n * deterministic functions; sync handlers are arbitrary user code, so retry is\n * opt-in and the user owns the idempotency contract. When a handler throws a\n * classified-as-retryable error (default: PG serialization failures, codes\n * 40001 / 40P01), the engine discards the buffered changes, awaits a backoff,\n * and re-runs the handler with a fresh transaction.\n */\n\n/** What the engine receives + uses to schedule the next attempt. */\nexport type RetryPolicy = {\n\t/** Inclusive max attempts (1 = no retry). Defaults to 5. */\n\tmaxAttempts?: number;\n\t/** Compute the delay before attempt `n+1` (n is 1-indexed). */\n\tbackoff?: (attempt: number) => number;\n\t/**\n\t * Return `true` for errors that should trigger a retry. Defaults to\n\t * {@link isSerializationFailure} — PG `40001` (serialization_failure) +\n\t * `40P01` (deadlock_detected). Override to add MySQL `1213`, app-level\n\t * \"version conflict\" sentinels, CRDT merge conflicts, etc.\n\t */\n\tisRetryable?: (error: unknown) => boolean;\n\t/**\n\t * Hard ceiling on total elapsed time across all attempts (ms). A\n\t * still-failing mutation past this gives up regardless of `maxAttempts`.\n\t * Defaults to 30_000.\n\t */\n\tmaxElapsedMs?: number;\n};\n\nconst PG_RETRY_CODES = new Set(['40001', '40P01']);\n\n/**\n * Default retryability predicate — Postgres serialization_failure (`40001`)\n * and deadlock_detected (`40P01`). `postgres` (porsager) and `pg` both expose\n * the SQLSTATE on `error.code`. We also accept the codes on a wrapping\n * `error.cause` to be friendly to libraries that wrap errors.\n */\nexport const isSerializationFailure = (error: unknown): boolean => {\n\tif (error === null || typeof error !== 'object') return false;\n\tconst code = (error as { code?: unknown }).code;\n\tif (typeof code === 'string' && PG_RETRY_CODES.has(code)) return true;\n\tconst cause = (error as { cause?: unknown }).cause;\n\tif (cause !== undefined) return isSerializationFailure(cause);\n\n\treturn false;\n};\n\nexport type ExponentialBackoffOptions = {\n\t/** Initial delay (ms). Defaults to 25. */\n\tbaseMs?: number;\n\t/** Multiplier per attempt. Defaults to 2. */\n\tfactor?: number;\n\t/** Hard cap on a single delay (ms). Defaults to 1000. */\n\tmaxMs?: number;\n\t/** Random jitter as a fraction of the computed delay. Defaults to 0.2. */\n\tjitter?: number;\n};\n\n/**\n * Exponential backoff with optional jitter — matches the shape used in\n * `@absolutejs/queue` so a user who's already learned one knows the other.\n *\n * @example\n * defineMutation({\n * name: 'transfer',\n * retry: { maxAttempts: 5, backoff: exponentialBackoff() },\n * handler: async (args, ctx, actions) => { ... }\n * });\n */\nexport const exponentialBackoff =\n\t(options: ExponentialBackoffOptions = {}) =>\n\t(attempt: number): number => {\n\t\tconst base = options.baseMs ?? 25;\n\t\tconst factor = options.factor ?? 2;\n\t\tconst max = options.maxMs ?? 1000;\n\t\tconst jitter = options.jitter ?? 0.2;\n\t\tconst raw = Math.min(max, base * factor ** Math.max(0, attempt - 1));\n\t\tconst spread = raw * jitter;\n\n\t\treturn raw + (Math.random() * 2 - 1) * spread;\n\t};\n\n/** Internal: thrown when retries exhaust without success. Re-throws the\n * underlying error so the caller's existing error handling still works; the\n * `RetriesExhaustedError` form is only used inside the engine for typing. */\nexport class RetriesExhaustedError extends Error {\n\treadonly attempts: number;\n\treadonly elapsedMs: number;\n\treadonly cause: unknown;\n\tconstructor(attempts: number, elapsedMs: number, cause: unknown) {\n\t\tconst message = cause instanceof Error ? cause.message : String(cause);\n\t\tsuper(\n\t\t\t`retries exhausted after ${attempts} attempts (${elapsedMs}ms): ${message}`\n\t\t);\n\t\tthis.name = 'RetriesExhaustedError';\n\t\tthis.attempts = attempts;\n\t\tthis.elapsedMs = elapsedMs;\n\t\tthis.cause = cause;\n\t}\n}\n",
23
23
  "// @bun\n// src/index.ts\nvar SpanKind = {\n INTERNAL: 0,\n SERVER: 1,\n CLIENT: 2,\n PRODUCER: 3,\n CONSUMER: 4\n};\nvar SpanStatusCode = {\n UNSET: 0,\n OK: 1,\n ERROR: 2\n};\nvar NOOP_SPAN_CONTEXT = {\n spanId: \"0000000000000000\",\n traceFlags: 0,\n traceId: \"00000000000000000000000000000000\"\n};\nvar noopSpan = {\n addEvent: () => noopSpan,\n end: () => {},\n isRecording: () => false,\n recordException: () => {},\n setAttribute: () => noopSpan,\n setAttributes: () => noopSpan,\n setStatus: () => noopSpan,\n spanContext: () => NOOP_SPAN_CONTEXT,\n updateName: () => noopSpan\n};\nvar createNoopSpan = () => noopSpan;\nvar startActiveSpanNoop = (_name, optionsOrFn, maybeFn) => {\n const fn = typeof optionsOrFn === \"function\" ? optionsOrFn : maybeFn;\n return fn(noopSpan);\n};\nvar noopTracer = {\n startActiveSpan: startActiveSpanNoop,\n startSpan: () => noopSpan\n};\nvar createNoopTracer = () => noopTracer;\nvar createNoopTracerProvider = () => ({\n getTracer: () => noopTracer\n});\nvar tracerOrNoop = (provider, name, version) => provider !== undefined ? provider.getTracer(name, version) : noopTracer;\nvar ABS_ATTRS = {\n tenant: \"abs.tenant\",\n shardId: \"abs.shard.id\",\n engineId: \"abs.engine.id\",\n collection: \"abs.collection\",\n mutation: \"abs.mutation\",\n mutationAttempt: \"abs.mutation.attempt\",\n subscriptionId: \"abs.subscription.id\",\n batchSize: \"abs.batch.size\",\n clusterMessageOrigin: \"abs.cluster.origin\",\n jobId: \"abs.job.id\",\n jobKind: \"abs.job.kind\",\n jobAttempt: \"abs.job.attempt\",\n jobMaxAttempts: \"abs.job.max_attempts\",\n workerId: \"abs.worker.id\",\n runtimeKey: \"abs.runtime.key\",\n runtimePid: \"abs.runtime.pid\",\n runtimePort: \"abs.runtime.port\",\n runtimeExitReason: \"abs.runtime.exit_reason\",\n runtimeReadinessMs: \"abs.runtime.readiness_ms\",\n routeShard: \"abs.route.shard\",\n routeDecision: \"abs.route.decision\",\n secretName: \"abs.secret.name\",\n secretFingerprint: \"abs.secret.fingerprint\",\n auditKind: \"abs.audit.kind\"\n};\nvar withSpan = async (tracer, name, options, fn) => tracer.startActiveSpan(name, options, async (span) => {\n try {\n const result = await fn(span);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error)\n });\n span.recordException(error);\n throw error;\n } finally {\n span.end();\n }\n});\nvar withSpanSync = (tracer, name, options, fn) => tracer.startActiveSpan(name, options, (span) => {\n try {\n const result = fn(span);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error)\n });\n span.recordException(error);\n throw error;\n } finally {\n span.end();\n }\n});\nexport {\n withSpanSync,\n withSpan,\n tracerOrNoop,\n createNoopTracerProvider,\n createNoopTracer,\n createNoopSpan,\n SpanStatusCode,\n SpanKind,\n ABS_ATTRS\n};\n\n//# debugId=3038092490E875A764756E2164756E21\n//# sourceMappingURL=index.js.map\n",
24
24
  "/**\n * Sandboxed mutation runner — executes a string-form mutation handler inside\n * an `@absolutejs/isolated-jsc` Isolate. Use it when the handler source is\n * not fully trusted (multi-tenant PaaS, plugin systems, AI-generated logic),\n * or when you want to cap CPU/memory per mutation defensively.\n *\n * Trade-offs vs an ordinary `handler`:\n *\n * - Handler must be a string. It evaluates inside the isolate's JSC VM, with\n * no access to the host's modules, closures, or globals — only the\n * `args` / `ctx` clones and the `actions` Reference we pass in.\n * - First call per mutation pays an isolated-jsc runner warmup + callable\n * compile. Every subsequent call is served from the runner's keyed\n * callable cache — no per-call eval, no per-call `setGlobal`.\n * - Timeout terminates the isolate (the sandbox runner detects this and\n * lazily re-spawns on the next call). On the FFI backend timeouts throw\n * a TerminationException without killing the isolate; sync's runner\n * treats both shapes the same.\n *\n * **Backend default: `'auto'`** — `'auto'` picks FFI when libJSC is reachable\n * (~300 KB cold heap, interrupt-driven CPU timeouts) and falls back to\n * Worker (~46 MB cold heap, postMessage round-trips) otherwise. Pin to\n * `'worker'` if you specifically need Web APIs (`URL`, `TextEncoder`,\n * `WebSocket`) inside your handler — those live in the Bun-Worker\n * environment, not the bare JSC C API.\n *\n * **Per-call hot path (since isolated-jsc 0.8).** Each mutation owns a\n * `createIsolatedRunner()` instance. The runner applies the `tenant-script`\n * policy, keeps a keyed isolate pool, and caches the wrapped mutation as a\n * precompiled callable. Per call we invoke `runner.call(name, source, args)`\n * with a call id that routes `actions.*` back through a host Reference.\n *\n * The runner is built lazily per-mutation: nothing is spawned until the\n * mutation actually runs for the first time. No engine teardown hook is\n * needed — the OS reaps the workers when the engine's host process exits.\n */\n\n// Type-only import — erased at runtime, so the engine still loads when\n// `@absolutejs/isolated-jsc` isn't installed. The actual module is loaded\n// lazily via dynamic `import()` inside `loadIsolatedJsc`.\nimport type { IsolatedRunner, RunMetrics } from '@absolutejs/isolated-jsc';\nimport type { MutationActions } from './mutation';\n\ntype IsolatedJscModule = typeof import('@absolutejs/isolated-jsc');\n\n/**\n * Per-call metrics record emitted by `sandboxedHandler` when the engine\n * is configured with {@link SyncEngineOptions.handlerMetrics}. One record\n * per invocation, fired AFTER the call completes (success or failure).\n *\n * Use this for per-tenant dashboards (\"which tenant is burning the most\n * CPU?\"), runtime alerting (\"this handler is timing out repeatedly\"),\n * cost attribution, and post-mortem replay of slow / failed mutations.\n *\n * Sample wiring pattern — publish to a sync collection users can\n * subscribe to like any other:\n *\n * ```ts\n * const engine = createSyncEngine({\n * handlerMetrics: (record) => {\n * metricsCollection.insert(record); // your own collection / sink\n * },\n * });\n * ```\n */\nexport type HandlerMetricsRecord = {\n\t/** Globally-unique id for this call (random). Useful as a join key. */\n\tid: string;\n\t/** Name passed to `defineMutation`. */\n\tmutationName: string;\n\t/** Wall-clock duration from call entry to result resolution (ms). */\n\tdurationMs: number;\n\t/**\n\t * CPU time spent inside the JSC sandbox (ms). Comes from\n\t * isolated-jsc runner metrics — does NOT include host-side message-passing\n\t * overhead on the Worker backend. Sub-millisecond runs round to 0.\n\t */\n\tcpuMs: number;\n\t/** isolated-jsc backend that executed the call. */\n\tbackend?: 'ffi' | 'worker';\n\t/**\n\t * Heap size (bytes) measured immediately after the script returned.\n\t * Not the run's peak — a true peak needs continuous polling.\n\t */\n\theapBytes: number;\n\t/** `true` if the handler returned normally; `false` if it threw. */\n\tok: boolean;\n\t/** Error name (`TimeoutError`, `MemoryLimitError`, `Error`, …) on failure. */\n\terrorName?: string;\n\t/** Error message on failure. */\n\terrorMessage?: string;\n\t/** `Date.now()` at the moment the call ended. */\n\ttimestamp: number;\n};\n\n/**\n * Per-call hook invoked once each `sandboxedHandler` invocation finishes\n * (success or failure). Synchronous return is the common case; an async\n * return is awaited but its rejection is swallowed (a metrics hook that\n * crashes must NOT also crash the caller's mutation path).\n */\nexport type HandlerMetricsHook = (\n\trecord: HandlerMetricsRecord\n) => void | Promise<void>;\n\n/**\n * Per-host configuration for an entry in {@link BridgeFetchConfig}.\n * Auth is computed on the host side per call; the secret never enters\n * the sandbox's JSC heap.\n */\nexport type BridgeFetchEndpoint = {\n\t/**\n\t * Header values to add to every request to this host. Static — read\n\t * once at engine construction. Use {@link authorization} for tokens\n\t * that need to be computed per call.\n\t */\n\theaders?: Record<string, string>;\n\t/**\n\t * Compute the `Authorization` header value on each call. Synchronous\n\t * or async. Throwing rejects the in-sandbox call without revealing\n\t * the underlying error (the sandbox sees a generic\n\t * \"authorization callback failed\").\n\t */\n\tauthorization?: () => string | Promise<string>;\n};\n\n/**\n * `actions.fetch(url, init)` allowlist + auth-injection config keyed by\n * hostname. A request whose URL parses to a hostname NOT in this map is\n * rejected before any network call. A request whose hostname IS in the\n * map gets the configured static headers + the computed authorization\n * stitched in on the host side. The sandbox source never sees the auth\n * value.\n *\n * Hostname keys are exact (`'api.example.com'`). The special key `'*'`\n * is a wildcard (use sparingly — it disables allowlisting).\n *\n * ```ts\n * createSyncEngine({\n * bridgeFetch: {\n * 'api.stripe.com': {\n * authorization: () => `Bearer ${process.env.STRIPE_KEY}`,\n * },\n * 'api.openai.com': {\n * authorization: () => `Bearer ${process.env.OPENAI_KEY}`,\n * headers: { 'OpenAI-Beta': 'assistants=v2' },\n * },\n * },\n * });\n * ```\n */\nexport type BridgeFetchConfig = Record<string, BridgeFetchEndpoint>;\n\n/**\n * Response shape `actions.fetch` resolves to inside the sandbox. The\n * body is materialised as text on the host (so it crosses the JSC\n * boundary as a structured-cloned string). Users parse it themselves\n * with `JSON.parse(res.body)` for JSON responses.\n */\nexport type BridgeFetchResponse = {\n\tok: boolean;\n\tstatus: number;\n\tstatusText: string;\n\turl: string;\n\theaders: Record<string, string>;\n\tbody: string;\n};\n\n/** Per-mutation sandbox configuration. */\nexport type SandboxConfig = {\n\t/** Heap memory cap (MB). Default 32. */\n\tmemoryLimit?: number;\n\t/** Wall-clock cap per call (ms). Default 5000. */\n\ttimeout?: number;\n\t/**\n\t * isolated-jsc backend. Defaults to `'auto'` (FFI when libJSC is\n\t * reachable, Worker otherwise). Both backends now run through the same\n\t * `createIsolatedRunner().call()` hot path; the choice trades cold spawn\n\t * (FFI wins ~6×) against Web API availability (Worker only).\n\t *\n\t * Pin to `'worker'` if your handler needs Web APIs (`URL`,\n\t * `TextEncoder`, `WebSocket`) — those live in the Bun-Worker\n\t * environment, not the bare JSC C API.\n\t *\n\t * Pin to `'ffi'` to bypass the auto-probe when you know libJSC is\n\t * reachable (e.g. CI with a known image).\n\t */\n\tbackend?: 'auto' | 'ffi' | 'worker';\n\t/**\n\t * **Escape hatch.** Map of host functions the sandboxed handler may\n\t * call as `unsafeHost.fnName(...args)`. The name is deliberately\n\t * loud: anyone reading the source must see immediately that a\n\t * sandboxed mutation is reaching through to non-deterministic host\n\t * code (third-party API, queue push, email send, anything that\n\t * touches the outside world).\n\t *\n\t * Without this option, the sandbox is hermetic — only `args`,\n\t * `ctx`, and `actions` are reachable. Declare an entry here, name\n\t * it visibly (e.g. `chargeStripe`, `sendSlackPing`), and the engine\n\t * exposes it on the sandbox-side `unsafeHost` Proxy. The fn runs on\n\t * the host; its return value is structured-cloned back across the\n\t * isolate boundary; thrown errors propagate into the sandbox as\n\t * normal JS errors the handler can catch.\n\t *\n\t * The deterministic-mutation guarantees stop at the call site —\n\t * retries WILL re-fire these host fns (they're outside the\n\t * transaction). Treat them as side effects and either make them\n\t * idempotent or pair them with explicit compensation in the\n\t * handler. Convex's actions are the same model; this is the same\n\t * trade.\n\t *\n\t * @example\n\t * ```ts\n\t * defineMutation({\n\t * name: 'payments:checkout',\n\t * sandboxedHandler: `async (args, ctx, actions, unsafeHost) => {\n\t * const order = await actions.insert('orders', { ...args, status: 'pending' });\n\t * const receipt = await unsafeHost.chargeStripe({\n\t * amount: order.amount,\n\t * token: args.token,\n\t * });\n\t * await actions.update('orders', { id: order.id, status: 'paid', receipt });\n\t * return order;\n\t * }`,\n\t * sandbox: {\n\t * unsafeHost: {\n\t * chargeStripe: ({ amount, token }) =>\n\t * stripe.charges.create({ amount, source: token }),\n\t * },\n\t * },\n\t * });\n\t * ```\n\t */\n\t// `any[]` (not `unknown[]`) for ergonomics — consumers write typed\n\t// fns like `(input: { amount: number }) => …` and would otherwise\n\t// have to cast inside every body to satisfy contravariance. The\n\t// sandbox-side dispatch doesn't enforce arg types anyway (they\n\t// cross structured-clone); validate inside the fn.\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tunsafeHost?: Record<string, (...args: any[]) => unknown | Promise<unknown>>;\n};\n\nlet isolatedJscModule: IsolatedJscModule | undefined;\nconst loadIsolatedJsc = async (): Promise<IsolatedJscModule> => {\n\tif (isolatedJscModule !== undefined) return isolatedJscModule;\n\ttry {\n\t\tisolatedJscModule = await import('@absolutejs/isolated-jsc');\n\t\treturn isolatedJscModule;\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t'sandboxedHandler requires the optional peer \"@absolutejs/isolated-jsc\". ' +\n\t\t\t\t'Install it with: bun add @absolutejs/isolated-jsc',\n\t\t\t{ cause: error }\n\t\t);\n\t}\n};\n\n/**\n * Wrap user source as a function expression for `runner.call`. The compiled\n * function takes `(__callId, args, ctx)` — `__callId` keys the\n * per-call `actions` lookup, so the dispatch Reference (installed once\n * per isolate as a global) can route `actions.*` calls back to the\n * correct call's host-side `actions` instance. The in-VM `actions`\n * object is a thin shim that closes the call id over a global\n * `__dispatch` Reference.\n *\n * The wrapper is SYNC. If `userFn` is sync the return is a primitive\n * (FFI's `unwrapResultPromise` short-circuits on `!JSValueIsObject` —\n * zero unwrap evals). If `userFn` is async the return is a Promise and\n * the unwrap pump fires normally.\n */\nconst wrap = (source: string): string => `\n\tfunction (__callId, args, ctx) {\n\t\tconst userFn = (${source});\n\t\tif (typeof userFn !== 'function') {\n\t\t\tthrow new Error(\n\t\t\t\t'sandboxedHandler must evaluate to (args, ctx, actions, unsafeHost) => result; got ' +\n\t\t\t\t\ttypeof userFn\n\t\t\t);\n\t\t}\n\t\tconst actions = {\n\t\t\tinsert: (table, data) => __dispatch(__callId, 'insert', table, data),\n\t\t\tupdate: (table, data) => __dispatch(__callId, 'update', table, data),\n\t\t\tdelete: (table, row) => __dispatch(__callId, 'delete', table, row),\n\t\t\tchange: (collection, change) => __dispatch(__callId, 'change', collection, change),\n\t\t\tnow: () => __dispatch(__callId, 'now'),\n\t\t\tfetch: (url, init) => __dispatch(__callId, 'fetch', url, init)\n\t\t};\n\t\t// Escape hatch — host fns the mutation explicitly opted in to.\n\t\t// The Proxy means every property access is a host call; the\n\t\t// engine throws if the property name isn't declared in the\n\t\t// mutation's sandbox.unsafeHost map.\n\t\tconst unsafeHost = new Proxy({}, {\n\t\t\tget: (_target, fnName) => {\n\t\t\t\tif (typeof fnName !== 'string') return undefined;\n\t\t\t\treturn (...callArgs) =>\n\t\t\t\t\t__dispatch(__callId, 'unsafeHost', fnName, callArgs);\n\t\t\t}\n\t\t});\n\t\treturn userFn(args, ctx, actions, unsafeHost);\n\t}\n`;\n\ntype CompiledMutation = {\n\t/** Per-call actions instances, keyed by callId. Lives for the\n\t * duration of each call. */\n\tcallMap: Map<number, MutationActions>;\n\tnextCallId: number;\n\trunner: IsolatedRunner;\n\tsource: string;\n\ttimeoutMs: number;\n};\n\nconst compile = async (\n\tsource: string,\n\tconfig: SandboxConfig,\n\tbridgeFetch: BridgeFetchConfig | undefined\n): Promise<CompiledMutation> => {\n\tconst { Reference, createIsolatedRunner, resolveIsolatePolicy } =\n\t\tawait loadIsolatedJsc();\n\n\t// Dispatch installed ONCE per runner context as a global. Closes over the\n\t// per-mutation callMap; each in-VM `actions.*` call hands its\n\t// callId back so we look up the right `actions` instance. This is\n\t// concurrent-safe: every call has its own callId → its own slot,\n\t// no shared-mutable-state races.\n\tconst callMap = new Map<number, MutationActions>();\n\tconst unsafeHost = config.unsafeHost;\n\tconst dispatch = new Reference(((\n\t\tcallId: unknown,\n\t\top: unknown,\n\t\t...rest: unknown[]\n\t): Promise<unknown> | unknown => {\n\t\tconst a = callMap.get(callId as number);\n\t\tif (a === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`__dispatch invoked for orphan callId ${String(callId)}`\n\t\t\t);\n\t\t}\n\t\tswitch (op) {\n\t\t\tcase 'insert':\n\t\t\t\treturn a.insert(rest[0] as string, rest[1]);\n\t\t\tcase 'update':\n\t\t\t\treturn a.update(rest[0] as string, rest[1]);\n\t\t\tcase 'delete':\n\t\t\t\treturn a.delete(rest[0] as string, rest[1]);\n\t\t\tcase 'change':\n\t\t\t\treturn a.change(rest[0] as string, rest[1] as never);\n\t\t\tcase 'now':\n\t\t\t\treturn a.now();\n\t\t\tcase 'fetch':\n\t\t\t\treturn runBridgeFetch(\n\t\t\t\t\tbridgeFetch,\n\t\t\t\t\trest[0] as string,\n\t\t\t\t\trest[1] as RequestInit | undefined\n\t\t\t\t);\n\t\t\tcase 'unsafeHost': {\n\t\t\t\tconst fnName = rest[0] as string;\n\t\t\t\tconst callArgs = (rest[1] as unknown[]) ?? [];\n\t\t\t\tif (\n\t\t\t\t\tunsafeHost === undefined ||\n\t\t\t\t\ttypeof unsafeHost[fnName] !== 'function'\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`sandboxedHandler called unsafeHost.${fnName}() but it was not declared in the mutation's sandbox.unsafeHost config. Declare it (and only the host fns you intend to expose) to opt in to the escape hatch.`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn unsafeHost[fnName](...callArgs);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`unknown sandbox action op: ${String(op)}`);\n\t\t}\n\t}) as (...rawArgs: unknown[]) => unknown);\n\n\tconst timeoutMs = config.timeout ?? 5000;\n\tconst sourceToCall = wrap(source);\n\tconst policy = resolveIsolatePolicy('tenant-script', {\n\t\tallowWorkerFallback: true,\n\t\tbackend: config.backend ?? 'auto',\n\t\tmemoryLimit: config.memoryLimit ?? 32,\n\t\ttimeout: timeoutMs\n\t});\n\tconst runner = createIsolatedRunner({\n\t\tglobals: { __dispatch: dispatch },\n\t\tpolicy\n\t});\n\tawait runner.precompile('sandboxedHandler', sourceToCall);\n\n\treturn {\n\t\tcallMap,\n\t\tnextCallId: 1,\n\t\trunner,\n\t\tsource: sourceToCall,\n\t\ttimeoutMs\n\t};\n};\n\n/**\n * Host-side implementation of `actions.fetch(url, init)`. Enforces the\n * `BridgeFetchConfig` allowlist (rejecting otherwise-unknown hostnames\n * before any network call), computes the authorization on the host\n * side (so the secret never crosses into JSC), and returns a\n * structured-cloneable {@link BridgeFetchResponse} the sandbox can\n * pick apart.\n */\nconst runBridgeFetch = async (\n\tconfig: BridgeFetchConfig | undefined,\n\turl: string,\n\tinit: RequestInit | undefined\n): Promise<BridgeFetchResponse> => {\n\tif (config === undefined) {\n\t\tthrow new Error(\n\t\t\t'actions.fetch called but the engine has no `bridgeFetch` config — ' +\n\t\t\t\t'pass `bridgeFetch: { ... }` to createSyncEngine.'\n\t\t);\n\t}\n\tlet parsed: URL;\n\ttry {\n\t\tparsed = new URL(url);\n\t} catch {\n\t\tthrow new Error(`actions.fetch: invalid URL \"${String(url)}\"`);\n\t}\n\tconst endpoint =\n\t\tconfig[parsed.hostname] ??\n\t\t(Object.prototype.hasOwnProperty.call(config, '*')\n\t\t\t? config['*']\n\t\t\t: undefined);\n\tif (endpoint === undefined) {\n\t\tthrow new Error(\n\t\t\t`actions.fetch: hostname \"${parsed.hostname}\" is not allowlisted in bridgeFetch config`\n\t\t);\n\t}\n\tconst headers: Record<string, string> = { ...(endpoint.headers ?? {}) };\n\t// Carry user-supplied headers from the sandbox last so an explicit\n\t// override wins — except we never let the sandbox set Authorization,\n\t// because that would reveal the auth pattern the host injected.\n\tif (init?.headers !== undefined) {\n\t\tconst incoming = init.headers as Record<string, string>;\n\t\tfor (const [name, value] of Object.entries(incoming)) {\n\t\t\tif (name.toLowerCase() === 'authorization') continue;\n\t\t\theaders[name] = value;\n\t\t}\n\t}\n\tif (endpoint.authorization !== undefined) {\n\t\tlet auth: string;\n\t\ttry {\n\t\t\tauth = await endpoint.authorization();\n\t\t} catch {\n\t\t\tthrow new Error('actions.fetch: authorization callback failed');\n\t\t}\n\t\theaders.Authorization = auth;\n\t}\n\tconst response = await fetch(url, { ...init, headers });\n\tconst responseHeaders: Record<string, string> = {};\n\tresponse.headers.forEach((value, name) => {\n\t\tresponseHeaders[name] = value;\n\t});\n\tconst body = await response.text();\n\treturn {\n\t\tbody,\n\t\theaders: responseHeaders,\n\t\tok: response.ok,\n\t\tstatus: response.status,\n\t\tstatusText: response.statusText,\n\t\turl: response.url\n\t};\n};\n\n/**\n * Build a lazy runner for one mutation's sandboxed source. The first call\n * compiles the runner + dispatch Reference + callable;\n * subsequent calls only generate a fresh callId, register the per-call\n * `actions` in the callMap, and invoke `runner.call(...)`. Per-call cost on\n * FFI: one JSObjectCallAsFunction + three cheap primitive packings. No\n * per-call Reference allocation, no setGlobal, no eval.\n *\n * Concurrency-safe by construction: each call has its own callId →\n * its own actions slot in the callMap.\n *\n * If the isolate has been disposed (timeout, memory cap), the next\n * call re-spawns transparently.\n */\nexport const makeSandboxedHandler = (\n\tsource: string,\n\tconfig: SandboxConfig = {},\n\t/**\n\t * Engine-level extras the per-mutation config doesn't carry:\n\t * - `metricsHook` enables per-call telemetry via\n\t * `runner.call(..., { withMetrics: true })` (small cost; off without\n\t * the hook).\n\t * - `bridgeFetch` enables `actions.fetch(url, init)` inside the\n\t * sandbox with host-side allowlist + auth injection.\n\t */\n\tengineExtras?: {\n\t\tmetricsHook?: {\n\t\t\tmutationName: string;\n\t\t\tonMetrics: HandlerMetricsHook;\n\t\t};\n\t\tbridgeFetch?: BridgeFetchConfig;\n\t}\n): ((\n\targs: unknown,\n\tctx: unknown,\n\tactions: MutationActions\n) => Promise<unknown>) => {\n\tlet pending: Promise<CompiledMutation> | undefined;\n\tconst metricsHook = engineExtras?.metricsHook;\n\tconst bridgeFetch = engineExtras?.bridgeFetch;\n\n\tconst getCompiled = async (): Promise<CompiledMutation> => {\n\t\tif (pending !== undefined) {\n\t\t\treturn pending;\n\t\t}\n\t\tpending = compile(source, config, bridgeFetch);\n\t\treturn pending;\n\t};\n\n\treturn async (args, ctx, actions) => {\n\t\tconst compiled = await getCompiled();\n\t\tconst callId = compiled.nextCallId++;\n\t\tcompiled.callMap.set(callId, actions);\n\n\t\t// Fast path: no metrics hook → no per-call overhead.\n\t\tif (metricsHook === undefined) {\n\t\t\ttry {\n\t\t\t\treturn await compiled.runner.call(\n\t\t\t\t\t'sandboxedHandler',\n\t\t\t\t\tcompiled.source,\n\t\t\t\t\t[callId, args, ctx],\n\t\t\t\t\t{ run: { timeout: compiled.timeoutMs } }\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tif (isIsolateDisposalError(error)) {\n\t\t\t\t\tpending = undefined;\n\t\t\t\t\tawait disposeCompiled(compiled);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\tcompiled.callMap.delete(callId);\n\t\t\t}\n\t\t}\n\n\t\t// Metrics path: switch to runner metrics so we get backend, cpuMs,\n\t\t// and heapBytes from the isolate side. Errors get a synthesized record\n\t\t// before re-throwing so the caller still sees the error.\n\t\tconst startedAt = performance.now();\n\t\tconst id = makeRandomId();\n\t\ttry {\n\t\t\tconst { result, metrics } = await compiled.runner.call(\n\t\t\t\t'sandboxedHandler',\n\t\t\t\tcompiled.source,\n\t\t\t\t[callId, args, ctx],\n\t\t\t\t{ run: { timeout: compiled.timeoutMs }, withMetrics: true }\n\t\t\t);\n\t\t\tfireMetrics(metricsHook.onMetrics, {\n\t\t\t\tbackend: metrics.backend,\n\t\t\t\tcpuMs: metrics.cpuMs,\n\t\t\t\tdurationMs: performance.now() - startedAt,\n\t\t\t\theapBytes: metrics.heapBytes,\n\t\t\t\tid,\n\t\t\t\tmutationName: metricsHook.mutationName,\n\t\t\t\tok: true,\n\t\t\t\ttimestamp: Date.now()\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tif (isIsolateDisposalError(error)) {\n\t\t\t\tpending = undefined;\n\t\t\t\tawait disposeCompiled(compiled);\n\t\t\t}\n\t\t\tfireMetrics(metricsHook.onMetrics, {\n\t\t\t\tcpuMs: 0,\n\t\t\t\tdurationMs: performance.now() - startedAt,\n\t\t\t\terrorMessage:\n\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\terrorName: error instanceof Error ? error.name : 'Error',\n\t\t\t\theapBytes: 0,\n\t\t\t\tid,\n\t\t\t\tmutationName: metricsHook.mutationName,\n\t\t\t\tok: false,\n\t\t\t\ttimestamp: Date.now()\n\t\t\t});\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tcompiled.callMap.delete(callId);\n\t\t}\n\t};\n};\n\nconst makeRandomId = (): string =>\n\t`hm_${Date.now().toString(36)}${Math.random().toString(36).slice(2, 10)}`;\n\nconst isIsolateDisposalError = (error: unknown): boolean =>\n\terror instanceof Error &&\n\t(error.name === 'TimeoutError' ||\n\t\terror.name === 'MemoryLimitError' ||\n\t\terror.name === 'IsolateDisposedError');\n\nconst disposeCompiled = async (compiled: CompiledMutation): Promise<void> => {\n\ttry {\n\t\tawait compiled.runner.dispose();\n\t} catch {\n\t\t// The isolate/pool may already have been torn down by the failing run.\n\t}\n};\n\nconst fireMetrics = (\n\thook: HandlerMetricsHook,\n\trecord: HandlerMetricsRecord\n): void => {\n\tlet outcome: void | Promise<void>;\n\ttry {\n\t\toutcome = hook(record);\n\t} catch {\n\t\t// Hook threw synchronously — swallow. The caller's mutation must\n\t\t// not fail because the metrics sink failed.\n\t\treturn;\n\t}\n\tif (outcome instanceof Promise) {\n\t\toutcome.catch(() => {\n\t\t\t// Async rejection — same policy: swallow.\n\t\t});\n\t}\n};\n",
25
- "import {\n\tABS_ATTRS,\n\ttracerOrNoop,\n\ttype TracerProvider as TelemetryTracerProvider\n} from '@absolutejs/telemetry';\nimport type {\n\tCollectionContext,\n\tCollectionDefinition,\n\tJoinCollectionDefinition\n} from './collection';\nimport { createEquiJoin } from './equiJoin';\nimport type { EquiJoin } from './equiJoin';\nimport type { GraphCollectionDefinition, GraphInstance } from './graph';\nimport { createMaterializedView, isEmptyViewDiff } from './materializedView';\nimport type { MaterializedView } from './materializedView';\nimport type {\n\tMutationActions,\n\tMutationDefinition,\n\tTableWriter,\n\tTransactionRunner\n} from './mutation';\nimport type {\n\tReactiveQueryDefinition,\n\tReadHandle,\n\tTableReader\n} from './reactive';\nimport {\n\texponentialBackoff,\n\tisSerializationFailure,\n\tRetriesExhaustedError\n} from './retry';\nimport {\n\ttype BridgeFetchConfig,\n\ttype HandlerMetricsHook,\n\ttype HandlerMetricsRecord,\n\tmakeSandboxedHandler\n} from './sandbox';\nimport type {\n\tPermissionsDefinition,\n\tReadRule,\n\tTablePermissions,\n\tWriteRule\n} from './permissions';\nimport { PackMissingDependencyError, PackTableConflictError } from './pack';\nimport type { RegisteredPack, SyncPack } from './pack';\nimport type { SearchCollectionDefinition, SearchIndex } from './search';\nimport { SEARCH_SCORE_FIELD } from './search';\nimport type { ScheduleDefinition } from './schedule';\nimport type {\n\tCollectionKind,\n\tEngineActivity,\n\tEngineInspection,\n\tEngineMetrics\n} from './devtools';\nimport type { SchemaDefinition, TableSchema } from './schema';\nimport type { CrdtMergeable } from '../crdt';\nimport type { ClusterBus } from './cluster';\nimport type { ChangeSource, RowChange, RowKey, ViewDiff } from './types';\n\n/**\n * Which fields of a `Row` are CRDT values, and the {@link CrdtMergeable} backend\n * (e.g. `rgaText`, or `yjsText` from `@absolutejs/sync-yjs`) used to merge each.\n * Pass to `engine.registerCrdt` so the engine merges those fields on write.\n */\nexport type CrdtFields<Row> = {\n\t[Field in keyof Row]?: CrdtMergeable<Row[Field]>;\n};\n\n/**\n * Thrown when `authorize` denies a subscribe or a mutation. The message names\n * the denied action; the message always starts with \"Not authorized\".\n */\nexport class UnauthorizedError extends Error {\n\tconstructor(subject: string) {\n\t\tsuper(`Not authorized: ${subject}`);\n\t\tthis.name = 'UnauthorizedError';\n\t}\n}\n\n/**\n * Thrown by `engine.subscribe` / `engine.hydrate` (1.15.0+) when the caller's\n * `AbortSignal` fires before the operation reaches a `Subscription` /\n * resolved value. The `name` is `'AbortError'` to match the DOM-standard\n * spelling so existing `catch (error) { if (error.name === 'AbortError') ... }`\n * patterns work unchanged.\n */\nexport class AbortError extends Error {\n\tconstructor(reason?: string) {\n\t\tsuper(reason ?? 'Aborted');\n\t\tthis.name = 'AbortError';\n\t}\n}\n\nconst checkAborted = (signal?: AbortSignal): void => {\n\tif (signal?.aborted) {\n\t\tthrow new AbortError(\n\t\t\tsignal.reason instanceof Error\n\t\t\t\t? signal.reason.message\n\t\t\t\t: typeof signal.reason === 'string'\n\t\t\t\t\t? signal.reason\n\t\t\t\t\t: 'Aborted'\n\t\t);\n\t}\n};\n\nconst linkAbortToUnsubscribe = (\n\tsignal: AbortSignal | undefined,\n\tunsubscribe: () => void\n): void => {\n\tif (signal === undefined) return;\n\tif (signal.aborted) {\n\t\tunsubscribe();\n\t\treturn;\n\t}\n\tconst handler = () => {\n\t\ttry {\n\t\t\tunsubscribe();\n\t\t} catch {\n\t\t\t/* idempotent unsubscribes shouldn't surface here */\n\t\t}\n\t};\n\tsignal.addEventListener('abort', handler, { once: true });\n};\n\n/**\n * Thrown when a mutation's write fails its table's schema (see\n * {@link defineSchema}). The message names the offending field.\n */\nexport class SchemaError extends Error {\n\tconstructor(table: string, fieldName: string) {\n\t\tsuper(`Schema violation on \"${table}\": invalid field \"${fieldName}\"`);\n\t\tthis.name = 'SchemaError';\n\t}\n}\n\nexport type SubscribeArgs<T, P, Ctx> = {\n\t/** Registered collection name. */\n\tcollection: string;\n\t/** Query params (e.g. a filter value); passed to hydrate/match/authorize. */\n\tparams: P;\n\t/** Caller context (e.g. session); passed to hydrate/match/authorize. */\n\tctx: Ctx;\n\t/**\n\t * Receives every non-empty diff (with its version) after the initial\n\t * reply. 1.18.0+: a third optional `cursor` argument carries the\n\t * cross-instance resume cursor as of this diff. Callers that ignore\n\t * the 3rd arg keep working unchanged.\n\t */\n\tonDiff: (diff: ViewDiff<T>, version: number, cursor?: string) => void;\n\t/**\n\t * Resume from a point the client already applied. When the change log still\n\t * covers `(since, now]` for a single-table collection, the engine replies\n\t * with a catch-up diff instead of a full snapshot; otherwise it falls back\n\t * to a snapshot.\n\t *\n\t * Accepts `number` (legacy pre-1.17 — interpreted as the version of THIS\n\t * engine instance) or a `string` cursor (1.17.0+ — opaque vector of\n\t * `(instanceId, version)` per origin, returned by the engine on every\n\t * subscription/diff and round-tripped by the client unmodified). Use the\n\t * cursor form for cross-instance resume.\n\t */\n\tsince?: number | string;\n\t/**\n\t * Cancellation handle (1.15.0). Two effects:\n\t * 1. If the signal is already aborted when `subscribe` is called, the\n\t * engine throws {@link AbortError} immediately — no authorize, no\n\t * hydrate, no subscription.\n\t * 2. If the signal fires AFTER the subscription is live, the engine\n\t * auto-calls `unsubscribe()`. The consumer never has to thread two\n\t * handles for the same lifetime.\n\t *\n\t * Backwards-compatible — omit `signal` and the engine behaves exactly\n\t * as in pre-1.15.0.\n\t */\n\tsignal?: AbortSignal;\n};\n\nexport type Subscription<T> = {\n\t/** The result set at subscribe time — a snapshot (empty when resuming). */\n\tinitial: T[];\n\t/** Catch-up diff when resuming via `since` (instead of `initial`). */\n\tcatchup?: ViewDiff<T>;\n\t/** The engine's local version this reply brings the client up to. */\n\tversion: number;\n\t/**\n\t * Opaque cross-instance resume cursor (1.17.0+). Encodes the per-origin\n\t * vector of `(instanceId, version)` the client is now up-to-date with;\n\t * pass it back as `SubscribeArgs.since` on reconnect. Works for resume\n\t * against ANY instance in a cluster, not just the one that issued it —\n\t * the receiving instance decodes the cursor, walks its log for entries\n\t * the client hasn't seen yet, and either replies with a catch-up diff\n\t * or a fresh snapshot.\n\t */\n\tcursor: string;\n\t/** Stop receiving diffs and release the view. */\n\tunsubscribe: () => void;\n};\n\nexport type SyncEngine = {\n\t/** Register a collection definition (see {@link defineCollection}). */\n\tregister: <T, P = void, Ctx = CollectionContext>(\n\t\tcollection: CollectionDefinition<T, P, Ctx>\n\t) => void;\n\t/** Register an incremental join collection (see {@link defineJoinCollection}). */\n\tregisterJoin: <L, R, Out, P = void, Ctx = CollectionContext>(\n\t\tcollection: JoinCollectionDefinition<L, R, Out, P, Ctx>\n\t) => void;\n\t/** Register an operator-graph collection (see {@link defineGraphCollection}). */\n\tregisterGraph: <Out, P = void, Ctx = CollectionContext>(\n\t\tcollection: GraphCollectionDefinition<Out, P, Ctx>\n\t) => void;\n\t/**\n\t * Register a live search collection (see {@link defineSearchCollection}): a\n\t * full-text or vector index maintained from a source table's change feed and\n\t * queried by the subscription's params, returning the ranked top-K live.\n\t */\n\tregisterSearch: <T, Query = string, Ctx = CollectionContext>(\n\t\tcollection: SearchCollectionDefinition<T, Query, Ctx>\n\t) => void;\n\t/**\n\t * Register a scheduled function (see {@link defineSchedule}): server-triggered\n\t * work whose `actions` writes go live through the change feed. Wire the cron\n\t * triggers with the `scheduled` Elysia plugin.\n\t */\n\tregisterSchedule: (schedule: ScheduleDefinition) => void;\n\t/**\n\t * Run a registered schedule's handler now: its writes commit (in the\n\t * configured transaction) and emit as one live batch. The `scheduled` plugin\n\t * calls this on each cron fire; call it directly to trigger on demand.\n\t */\n\trunSchedule: (name: string) => Promise<void>;\n\t/** Registered schedules (name + cron pattern) — used by the `scheduled` plugin. */\n\tlistSchedules: () => ScheduleDefinition[];\n\t/**\n\t * Open a live subscription: authorize, hydrate the initial set, and stream\n\t * diffs as changes arrive. Rejects with {@link UnauthorizedError} on deny.\n\t */\n\tsubscribe: <T, P = void, Ctx = CollectionContext>(\n\t\targs: SubscribeArgs<T, P, Ctx>\n\t) => Promise<Subscription<T>>;\n\t/**\n\t * One-shot read: authorize and return a collection's current rows without\n\t * subscribing. Powers an Eden-typed HTTP hydrate route (and SSR). Rejects\n\t * with {@link UnauthorizedError} on deny.\n\t *\n\t * Pass `options.signal` (1.15.0+) to cancel the operation mid-flight —\n\t * the engine throws {@link AbortError} after the next await point if\n\t * the signal has fired.\n\t */\n\thydrate: (\n\t\tcollection: string,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\toptions?: { signal?: AbortSignal }\n\t) => Promise<unknown[]>;\n\t/**\n\t * Feed a committed change to `table` into the engine, fanning the resulting\n\t * diff to every live subscription of every collection that reads that table.\n\t * Call after a mutation, or wire a {@link ChangeSource} via `connectSource`.\n\t * Single-table subscriptions diff the row; multi-table / refetch ones\n\t * re-hydrate.\n\t */\n\tapplyChange: <T>(table: string, change: RowChange<T>) => Promise<void>;\n\t/**\n\t * Connect a change source (e.g. a CDC adapter): its emitted changes flow into\n\t * `applyChange`. Resolves to a disconnect function that stops the source.\n\t */\n\tconnectSource: (source: ChangeSource) => Promise<() => Promise<void>>;\n\t/**\n\t * Join a cluster (see {@link ClusterBus}): broadcast this instance's committed\n\t * changes to peers and apply theirs locally, so subscribers on every instance\n\t * stay live. Resolves to a disconnect function. Run once per instance.\n\t */\n\tconnectCluster: (bus: ClusterBus) => Promise<() => Promise<void>>;\n\t/** Active subscription count, optionally for one collection. */\n\tsubscriptionCount: (collection?: string) => number;\n\t/** Register a mutation definition (see {@link defineMutation}). */\n\tregisterMutation: <Args, Ctx = CollectionContext, Result = unknown>(\n\t\tmutation: MutationDefinition<Args, Ctx, Result>\n\t) => void;\n\t/**\n\t * Register how to persist a `table` (any ORM), so a mutation's\n\t * `actions.insert/update/delete` write to your store and emit the live change\n\t * in one step — you can't write without going live. See {@link TableWriter}.\n\t */\n\tregisterWriter: <Row = unknown, Ctx = CollectionContext, Tx = unknown>(\n\t\ttable: string,\n\t\twriter: TableWriter<Row, Ctx, Tx>\n\t) => void;\n\t/**\n\t * Register a read-set-tracked reactive query (see {@link defineReactiveQuery}):\n\t * it re-runs and re-pushes whenever any table it read changes — no `match`, no\n\t * operator graph, no manual change emission.\n\t */\n\tregisterReactive: <T, P = void, Ctx = CollectionContext>(\n\t\tquery: ReactiveQueryDefinition<T, P, Ctx>\n\t) => void;\n\t/**\n\t * Teach the engine how to read a table for reactive queries' `ctx.db` (any\n\t * ORM). Required for every table a reactive query reads.\n\t */\n\tregisterReader: <Ctx = CollectionContext>(\n\t\ttable: string,\n\t\treader: TableReader<Ctx>\n\t) => void;\n\t/**\n\t * Register declarative, row-level permissions for a `table` (see\n\t * {@link definePermissions}). Read rules filter every row the engine emits for\n\t * the table; write rules gate `actions.insert/update/delete`. Equivalent to a\n\t * `permissions` entry on {@link createSyncEngine}.\n\t */\n\tregisterPermissions: <Row = unknown, Ctx = CollectionContext>(\n\t\ttable: string,\n\t\trules: TablePermissions<Row, Ctx>\n\t) => void;\n\t/**\n\t * Register a `table`'s schema (see {@link defineSchema}): writes are validated\n\t * against it (a bad write rejects the mutation with {@link SchemaError}), and\n\t * its `migrate` lazily upcasts rows on read. Equivalent to a `schemas` entry\n\t * on {@link createSyncEngine}.\n\t */\n\tregisterSchema: <Row = unknown>(\n\t\ttable: string,\n\t\tschema: TableSchema<Row>\n\t) => void;\n\t/**\n\t * Declare which fields on a `table` are CRDT values (see {@link CrdtMergeable}\n\t * — e.g. `rgaText` from `@absolutejs/sync/crdt`, or `yjsText` from\n\t * `@absolutejs/sync-yjs`). The engine then MERGES those fields on\n\t * `actions.insert/update` instead of overwriting them, so concurrent writers\n\t * converge with no clobbering — conflict-free collaborative editing with no\n\t * merge code in your mutation. It also registers a ready-made\n\t * `\"<table>:merge\"` mutation that upserts a row patch, so a client (e.g. the\n\t * `useCollaborativeText` framework hooks) needs no custom server mutation.\n\t */\n\tregisterCrdt: <Row = Record<string, unknown>>(\n\t\ttable: string,\n\t\tfields: CrdtFields<Row>\n\t) => void;\n\t/**\n\t * Apply a table's schema `migrate` to a raw/stored row (identity when there's\n\t * no schema or migration). Use it wherever you read raw rows the engine\n\t * doesn't (e.g. a search collection's `source`); the engine already migrates\n\t * reactive `ctx.db` reads, view hydrates, and the one-shot hydrate.\n\t */\n\tmigrate: <Row = unknown>(table: string, row: Row) => Row;\n\t/**\n\t * Run a registered mutation: authorize, invoke its handler (which writes and\n\t * emits changes via `applyChange`), and resolve with the handler's result.\n\t * Rejects with {@link UnauthorizedError} on deny, or an error for an unknown\n\t * mutation / a handler throw. Drive this from the transport's mutate frame.\n\t */\n\trunMutation: (\n\t\tname: string,\n\t\targs: unknown,\n\t\tctx: unknown\n\t) => Promise<unknown>;\n\t/**\n\t * Atomically run N mutations in a single transaction (sync 1.11+).\n\t * Each `{ name, args }` spec is authorized, then handlers fire in\n\t * order against shared buffered changes. If any handler throws, the\n\t * entire transaction rolls back — no partial commits, no fanned-out\n\t * diffs. On success the accumulated changes apply as ONE live batch\n\t * and the per-mutation results return in order.\n\t *\n\t * No retry policy applies to batches in v0.2; configure per-mutation\n\t * retries on individual `runMutation` calls when atomicity isn't\n\t * needed. A failed batch passes the original error through with no\n\t * wrapping.\n\t *\n\t * Requires `transaction` to be set in {@link SyncEngineOptions} for\n\t * actual DB-level atomicity; without it the batch still buffers\n\t * changes into one fan-out but the underlying adapter writes\n\t * piecemeal.\n\t */\n\trunMutations: (\n\t\tspecs: Array<{ name: string; args: unknown }>,\n\t\tctx: unknown\n\t) => Promise<unknown[]>;\n\t/**\n\t * A point-in-time snapshot of the engine for devtools: registered collections\n\t * (+ kind, tables, live subscription counts), mutations, schedules, readers,\n\t * writers, the change-feed version, and recent changes. See `syncDevtools`.\n\t */\n\tinspect: () => EngineInspection;\n\t/**\n\t * Operator-shaped engine metrics — counters + memory estimates + throughput\n\t * totals since engine start. Distinct from {@link SyncEngine.inspect}: this\n\t * is what a PaaS host scrapes on an interval to answer \"is this engine\n\t * healthy\" and \"what's its resource footprint.\" Feed it to\n\t * `@absolutejs/metering` for per-engine cost attribution.\n\t *\n\t * Added in 1.13.0.\n\t */\n\tmetrics: () => EngineMetrics;\n\t/**\n\t * Capture the engine's change log + version as a serializable\n\t * {@link ChangeLogSnapshot} the host can persist (disk, S3, the cluster\n\t * bus) and restore on the next boot via\n\t * {@link SyncEngineOptions.initialChangeLog} or\n\t * {@link SyncEngine.importChangeLog}. The receiving engine MUST share this\n\t * engine's `instanceId` — otherwise the resume contract silently breaks.\n\t *\n\t * Cheap: the snapshot's `entries` is a shallow copy of the bounded log\n\t * (capped by `changeLogSize` / `changeLogRetainMs`). Call on a timer or on\n\t * graceful shutdown — both are fine; the snapshot is monotonic in commit\n\t * order, so a partial roll-forward (apply entries newer than the snapshot\n\t * from another source) is safe.\n\t *\n\t * Added in 1.19.0.\n\t */\n\texportChangeLog: () => ChangeLogSnapshot;\n\t/**\n\t * Adopt a {@link ChangeLogSnapshot} into a running engine that has not yet\n\t * committed any local changes (its `version` is 0). The snapshot's\n\t * `instanceId` MUST match this engine's `instanceId`. Throws otherwise.\n\t *\n\t * Convenience for hosts that want to set up the engine, register surfaces,\n\t * AND THEN restore. Equivalent to passing the snapshot via\n\t * `createSyncEngine({ initialChangeLog })` if you have it at construction\n\t * time. Returns the number of entries imported.\n\t *\n\t * Added in 1.19.0.\n\t */\n\timportChangeLog: (snapshot: ChangeLogSnapshot) => number;\n\t/**\n\t * Reconstruct the state of registered tables as of a target\n\t * timestamp by walking the change log forward and folding each op\n\t * into a per-table view. Useful for forensic incident response\n\t * (\"what did the tenant see at 14:32?\") and the \"I deleted prod\n\t * — restore us to 2h ago\" recovery story.\n\t *\n\t * The reconstruction is exact when the log spans `targetAt` (i.e.\n\t * the log's oldest entry is at version 1). When the log has been\n\t * trimmed (`changeLogSize` / `changeLogRetainMs` evicted older\n\t * entries) AND `targetAt` falls in the gap, the result is\n\t * best-effort: state walked forward from the OLDEST retained\n\t * entry, with `truncated: true` so the caller knows.\n\t *\n\t * Added in 1.22.0.\n\t *\n\t * @example\n\t * ```ts\n\t * const twoHoursAgo = Date.now() - 2 * 60 * 60 * 1000;\n\t * const result = await engine.replayTo({ at: twoHoursAgo, tables: ['orders'] });\n\t * if (result.truncated) {\n\t * console.warn('Replay truncated — log retention window too short.');\n\t * }\n\t * console.log(result.rows.orders); // orders as of two hours ago\n\t * ```\n\t */\n\treplayTo: (options: ReplayOptions) => Promise<ReplayResult>;\n\t/**\n\t * Subscribe to the live engine activity stream (changes, mutation outcomes,\n\t * subscribe/unsubscribe). Returns an unsubscribe. Powers the devtools feed.\n\t */\n\tonActivity: (listener: (event: EngineActivity) => void) => () => void;\n\t/**\n\t * Outbound CDC stream — yield every committed change as a {@link LoggedChange},\n\t * historical first (entries with `version > since`) then continuously tailing\n\t * live commits. Use it to feed downstream pipelines (Kafka, search indexers,\n\t * audit logs, analytics warehouses).\n\t *\n\t * The iterator is notify-driven (no polling): it parks on a Promise that\n\t * resolves the instant a new commit lands.\n\t *\n\t * If `since` falls before the oldest entry retained in the bounded change\n\t * log, the iterator throws {@link MissedChangesError} so the consumer\n\t * notices the gap instead of silently skipping commits. Resubscribe with\n\t * `since = engine.inspect().recentChanges[0].version` after re-bootstrapping.\n\t *\n\t * If the consumer iterates slower than the engine commits and the in-flight\n\t * buffer overflows (`maxBuffer`, default 10000), the iterator throws\n\t * {@link CdcConsumerSlowError} for the same reason.\n\t *\n\t * @example\n\t * for await (const entry of engine.streamChanges({ since: lastCursor })) {\n\t * await kafka.send('sync.changes', JSON.stringify(entry));\n\t * lastCursor = entry.version;\n\t * }\n\t */\n\tstreamChanges: (\n\t\toptions?: StreamChangesOptions\n\t) => AsyncIterable<LoggedChange>;\n\t/**\n\t * Register a {@link SyncPack} — a self-contained bundle of schemas,\n\t * permissions, readers/writers, collections, mutations, and schedules.\n\t * Dispatches each field to the matching `register*` method. Rejects\n\t * with {@link PackTableConflictError} if the pack claims a table\n\t * another registered pack already owns; with\n\t * {@link PackMissingDependencyError} if `requireDependencies` is set\n\t * and a `readsTables` entry has no registered reader.\n\t *\n\t * See `syncPacks.design.md` for the rationale.\n\t */\n\tregisterPack: (pack: SyncPack) => void;\n};\n\n/**\n * 1.18.0: `OnDiff` receives an opaque `cursor` string alongside the version.\n * The cursor is the engine's cross-instance resume cursor as of this batch\n * — the connection layer forwards it to the client on the wire so a\n * reconnect can resume across shards. Pre-1.18 callers that ignore the 3rd\n * arg keep working unchanged.\n */\ntype OnDiff = (diff: ViewDiff<unknown>, version: number, cursor?: string) => void;\n\ntype JoinState = {\n\top: EquiJoin<unknown, unknown, unknown>;\n\tleftTable: string;\n\trightTable: string;\n\t/** Per-side filters (bound to params/ctx) — a failing change leaves the join. */\n\tleftMatch?: (row: unknown) => boolean;\n\trightMatch?: (row: unknown) => boolean;\n};\n\ntype ActiveSubscription =\n\t| {\n\t\t\tkind: 'view';\n\t\t\tcollection: string;\n\t\t\tview: MaterializedView<unknown>;\n\t\t\t/** Incremental (has a predicate) vs refetch fallback. */\n\t\t\tincremental: boolean;\n\t\t\t/** Re-run the bound hydrate for the refetch fallback. */\n\t\t\trehydrate: () => Promise<Iterable<unknown>>;\n\t\t\t/** Result-row identity (used to net a batch's diffs). */\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\tonDiff: OnDiff;\n\t }\n\t| {\n\t\t\tkind: 'join';\n\t\t\tcollection: string;\n\t\t\tjoin: JoinState;\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\tonDiff: OnDiff;\n\t }\n\t| {\n\t\t\tkind: 'graph';\n\t\t\tcollection: string;\n\t\t\tinstance: GraphInstance<unknown>;\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\tonDiff: OnDiff;\n\t }\n\t| {\n\t\t\tkind: 'reactive';\n\t\t\tcollection: string;\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\t/** Re-run; returns the new rows and the read set (tables/keys/ranges). */\n\t\t\trerun: () => Promise<{\n\t\t\t\trows: unknown[];\n\t\t\t\treadTables: Set<string>;\n\t\t\t\treadKeys: Set<string>;\n\t\t\t\trangeDeps: RangeDep[];\n\t\t\t}>;\n\t\t\t/**\n\t\t\t * Stable key over `(collection, params, ctx)`. Subscriptions sharing\n\t\t\t * the same key are equivalent on the read side, so a single rerun\n\t\t\t * per change batch can serve all of them (see `reactivePairs`).\n\t\t\t */\n\t\t\trerunKey: string;\n\t\t\t/** Current result set, keyed (diffed against the next re-run). */\n\t\t\tcurrent: Map<RowKey, unknown>;\n\t\t\t/** Full-table dependencies (from `db.all`). */\n\t\t\treadTables: Set<string>;\n\t\t\t/** Row-level dependencies `table\\0key` (from `db.get`). */\n\t\t\treadKeys: Set<string>;\n\t\t\t/** Range dependencies (from `db.where`) — predicate + matched keys. */\n\t\t\trangeDeps: RangeDep[];\n\t\t\tonDiff: OnDiff;\n\t }\n\t| {\n\t\t\tkind: 'search';\n\t\t\tcollection: string;\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\t/** Re-run the search against the (now-updated) shared index. */\n\t\t\trerun: () => unknown[];\n\t\t\t/** Current ranked result set, keyed (diffed against the next re-run). */\n\t\t\tcurrent: Map<RowKey, unknown>;\n\t\t\tonDiff: OnDiff;\n\t };\n\n/** A `db.where` dependency: the predicate plus the keys that matched at read. */\ntype RangeDep = {\n\ttable: string;\n\tpredicate: (row: unknown) => boolean;\n\tkeys: Set<RowKey>;\n};\n\n/**\n * A single committed change as it appears in the engine's change log and on\n * the {@link SyncEngine.streamChanges} CDC stream. Versions are monotonic\n * across the engine: a single mutation that writes N rows emits N entries\n * all sharing the same `version`.\n */\nexport type LoggedChange = {\n\t/** This engine's local monotonic version when the change was logged. */\n\tversion: number;\n\ttable: string;\n\tchange: RowChange<unknown>;\n\t/**\n\t * Wall-clock when this change was logged (Date.now()). Used by the\n\t * engine's time-based retention sweep (`changeLogRetainMs`) and\n\t * surfaced as the change-log age in {@link SyncEngine.metrics}.\n\t * Added in 1.13.0; pre-1.13.0 consumers of `LoggedChange` ignore it.\n\t */\n\tat: number;\n\t/**\n\t * Instance id that originated this change. For locally-committed changes\n\t * this is the engine's own `instanceId`; for cluster-received changes,\n\t * the originating peer's id.\n\t *\n\t * Added in 1.17.0; pre-1.17 consumers ignore it.\n\t */\n\torigin: string;\n\t/**\n\t * The ORIGINATOR's local version at commit time. For locally-committed\n\t * changes this equals `version`; for cluster-received changes, the\n\t * peer's version. Resume cursors (1.17.0+) carry `(origin, originVersion)`\n\t * pairs so a client's last-seen point matches against peer entries this\n\t * engine has logged via the bus.\n\t *\n\t * Added in 1.17.0; pre-1.17 consumers ignore it.\n\t */\n\toriginVersion: number;\n};\n\n/** Thrown by {@link SyncEngine.streamChanges} when `since` is older than the\n * oldest entry retained in the bounded change log (i.e. the consumer was\n * disconnected long enough that the engine has lost the diff). The consumer\n * should re-bootstrap from a fresh hydrate and resume from `availableSince`. */\nexport class MissedChangesError extends Error {\n\treadonly requestedSince: number;\n\treadonly availableSince: number;\n\tconstructor(requestedSince: number, availableSince: number) {\n\t\tsuper(\n\t\t\t`Change log no longer covers version ${requestedSince}; oldest available is ${availableSince}. ` +\n\t\t\t\t`Re-bootstrap and resume from ${availableSince}.`\n\t\t);\n\t\tthis.name = 'MissedChangesError';\n\t\tthis.requestedSince = requestedSince;\n\t\tthis.availableSince = availableSince;\n\t}\n}\n\n/** Options for {@link SyncEngine.streamChanges}. */\nexport type StreamChangesOptions = {\n\t/**\n\t * Last version the consumer has already processed. The stream yields\n\t * entries with `version > since`. Defaults to `0` (replay everything in\n\t * the log, then tail).\n\t */\n\tsince?: number;\n\t/**\n\t * Cancel the stream cleanly. When the signal aborts, the iterator\n\t * resolves to `done` on its next yield and unregisters its subscriber.\n\t */\n\tsignal?: AbortSignal;\n\t/**\n\t * Hard cap on the in-flight buffer for this consumer. If the engine\n\t * commits faster than the consumer iterates and the buffer overflows,\n\t * the stream rejects so the consumer notices instead of silently\n\t * skipping entries. Defaults to 10000.\n\t */\n\tmaxBuffer?: number;\n};\n\n/** Thrown by {@link SyncEngine.streamChanges} when the consumer fell so far\n * behind that the in-flight buffer overflowed. Resubscribe from the last\n * cursor the consumer successfully processed. */\nexport class CdcConsumerSlowError extends Error {\n\treadonly maxBuffer: number;\n\treadonly lastDeliveredVersion: number;\n\tconstructor(maxBuffer: number, lastDeliveredVersion: number) {\n\t\tsuper(\n\t\t\t`CDC stream buffer overflowed (max ${maxBuffer}); consumer fell behind. ` +\n\t\t\t\t`Last delivered version: ${lastDeliveredVersion}. Resubscribe with since=${lastDeliveredVersion}.`\n\t\t);\n\t\tthis.name = 'CdcConsumerSlowError';\n\t\tthis.maxBuffer = maxBuffer;\n\t\tthis.lastDeliveredVersion = lastDeliveredVersion;\n\t}\n}\n\n/**\n * Thrown by `runMutation` / `runMutations` when `mutationConcurrency` is\n * saturated AND the waiting queue is already at `mutationQueueLimit`. The\n * caller sees this immediately (no queue time) so the host can shed load\n * with a clean 429 instead of letting the queue grow unboundedly. Added\n * in 1.20.0.\n */\nexport class MutationQueueOverflowError extends Error {\n\treadonly queueLimit: number;\n\tconstructor(queueLimit: number) {\n\t\tsuper(\n\t\t\t`Mutation queue overflowed (limit ${queueLimit}); the engine is at ` +\n\t\t\t\t`its mutationConcurrency cap and the waiting queue is full. ` +\n\t\t\t\t`Retry later or shed load at the gateway.`\n\t\t);\n\t\tthis.name = 'MutationQueueOverflowError';\n\t\tthis.queueLimit = queueLimit;\n\t}\n}\n\n/**\n * Thrown by `engine.subscribe` when the calling tenant's active-subscription\n * count is already at the configured `subscriptionLimit.max`. The caller sees\n * this immediately — BEFORE authorize, hydrate, or any subscription state\n * allocation — so a rejected call leaks nothing. Added in 1.20.1.\n */\nexport class SubscriptionLimitError extends Error {\n\treadonly tenantKey: string;\n\treadonly limit: number;\n\treadonly active: number;\n\tconstructor(tenantKey: string, limit: number, active: number) {\n\t\tsuper(\n\t\t\t`Tenant \"${tenantKey}\" is at the subscription cap ` +\n\t\t\t\t`(${active}/${limit}). Close an existing subscription before opening another.`\n\t\t);\n\t\tthis.name = 'SubscriptionLimitError';\n\t\tthis.tenantKey = tenantKey;\n\t\tthis.limit = limit;\n\t\tthis.active = active;\n\t}\n}\n\n/**\n * Serializable snapshot of an engine's change log + monotonic version, returned\n * by {@link SyncEngine.exportChangeLog} and consumed by\n * {@link SyncEngineOptions.initialChangeLog} or\n * {@link SyncEngine.importChangeLog}.\n *\n * The PaaS host persists this on shard rotation (every N seconds or on graceful\n * shutdown) and hands it back to the replacement engine so resume cursors\n * referencing this `instanceId` keep working past the restart. Bounded by the\n * receiving engine's `changeLogSize` + `changeLogRetainMs` policies — entries\n * that exceed either cap on import are trimmed exactly as if they had been\n * logged live.\n *\n * Added in 1.19.0.\n */\nexport type ChangeLogSnapshot = {\n\t/** The exporting engine's `instanceId`. Receiver MUST match. */\n\tinstanceId: string;\n\t/** The exporting engine's monotonic version at snapshot time. */\n\tversion: number;\n\t/** Every retained log entry, in commit order (oldest first). */\n\tentries: ReadonlyArray<LoggedChange>;\n\t/**\n\t * Optional version-stamp the host may use to compare snapshots without\n\t * deserializing the entries (e.g. for incremental persistence). Set to\n\t * `Date.now()` at export time. Receivers ignore this field.\n\t */\n\texportedAt?: number;\n};\n\n/**\n * Options for {@link SyncEngine.replayTo}. Added in 1.22.0.\n */\nexport type ReplayOptions = {\n\t/**\n\t * Target timestamp (`Date.now()`-shaped). The engine walks the\n\t * change log forward, applying entries with `at <= targetAt`. The\n\t * result is the state as-of `targetAt` (or as close as the log\n\t * permits — see `truncated`).\n\t */\n\tat: number;\n\t/**\n\t * Optional table filter. When set, only entries whose `table` is\n\t * in this list are folded into the result; entries for other\n\t * tables are skipped. Useful for \"show me what `tasks` looked\n\t * like at T\" without paying to reconstruct every table.\n\t */\n\ttables?: ReadonlyArray<string>;\n};\n\n/**\n * Returned by {@link SyncEngine.replayTo}. Added in 1.22.0.\n *\n * - `rows` — per-table arrays of rows that existed as of `asOfAt`.\n * Keys are table names; values are the row objects (in last-write\n * order — last write wins for duplicate-keyed inserts).\n * - `asOfVersion` / `asOfAt` — the version + wall-clock of the LAST\n * entry folded into the result. May be earlier than `targetAt` if\n * no entries existed between the last-included entry and the\n * target.\n * - `truncated` — `true` when the log has been trimmed past the\n * target window (`changeLog[0].version > 1 && changeLog[0].at >\n * targetAt`). In this case, `rows` represents the state walked\n * forward from the OLDEST retained entry — NOT the actual state\n * at `targetAt`. The caller should treat the result as\n * \"best-effort given retention window\" and warn the operator.\n */\nexport type ReplayResult = {\n\tasOfVersion: number;\n\tasOfAt: number;\n\trows: Record<string, ReadonlyArray<unknown>>;\n\ttruncated: boolean;\n};\n\nexport type SyncEngineOptions = {\n\t/**\n\t * Stable identifier for this engine instance. Defaults to a per-process\n\t * random UUID. Pass a stable value (e.g. `${hostname}:${shardId}`) when\n\t * running a fleet of engines behind a cluster bus — 1.17.0+ resume\n\t * cursors carry the originating `instanceId`, so a client that reconnects\n\t * to a different shard can request a catch-up against the original's\n\t * change feed only if that instance's id matches a peer the new shard\n\t * knows about.\n\t */\n\tinstanceId?: string;\n\t/**\n\t * How many recent changes to retain for resumable reconnects. A client that\n\t * reconnects within this window gets a catch-up diff; beyond it, a fresh\n\t * snapshot. Defaults to 1024.\n\t */\n\tchangeLogSize?: number;\n\t/**\n\t * Time-based change-log retention: drop entries older than this many ms,\n\t * in addition to the count cap above. Lets a high-throughput engine keep\n\t * a SHORT log (e.g. \"60s of changes\") regardless of count, which both\n\t * bounds memory and bounds the catch-up work on reconnect. Defaults to\n\t * `null` — only the count cap (`changeLogSize`) applies.\n\t *\n\t * Added in 1.13.0.\n\t */\n\tchangeLogRetainMs?: number | null;\n\t/**\n\t * Run every mutation inside your database's transaction (see\n\t * {@link TransactionRunner}): the handler's writes commit all-or-nothing, and\n\t * the engine emits the resulting diff only after the commit. Omit to run\n\t * mutations without a transaction (each writer call is its own DB op).\n\t */\n\ttransaction?: TransactionRunner;\n\t/**\n\t * Declarative, row-level permissions keyed by table (see\n\t * {@link definePermissions}). Read rules filter every row the engine emits;\n\t * write rules gate `actions.insert/update/delete`. Add more later with\n\t * {@link SyncEngine.registerPermissions}. Type the rules at the\n\t * `definePermissions<YourCtx>(...)` call site; the engine accepts any context\n\t * (it threads `ctx` untyped to your rules).\n\t */\n\tpermissions?: PermissionsDefinition<any>;\n\t/**\n\t * Declarative row schemas keyed by table (see {@link defineSchema}): writes\n\t * are validated against them, and `migrate` lazily upcasts rows on read. Add\n\t * more later with {@link SyncEngine.registerSchema}.\n\t */\n\tschemas?: SchemaDefinition;\n\t/**\n\t * Cross-client cache for reactive query results, keyed by\n\t * `(collection, params, ctx)` — equivalent subscribers reuse a single\n\t * cached snapshot on initial subscribe instead of each re-running the\n\t * query body. Per-batch dedup (already in `reactivePairs` since 1.1) is\n\t * unchanged; this adds *cross-batch* sharing.\n\t *\n\t * Entries are invalidated when a write overlaps their read set (same\n\t * `isReactiveAffected` check live subscriptions use), and bounded by an\n\t * LRU + an optional TTL.\n\t *\n\t * Defaults: `{ max: 256, ttlMs: 60_000 }`. Pass `{ max: 0 }` to disable.\n\t */\n\treactiveCache?: {\n\t\tmax?: number;\n\t\tttlMs?: number;\n\t};\n\t/**\n\t * Per-call telemetry for `sandboxedHandler` mutations. When set, every\n\t * sandboxed call fires `onMetrics(record)` after completion with\n\t * `{ id, mutationName, durationMs, cpuMs, heapBytes, ok, errorName,\n\t * errorMessage, timestamp }`. Wire to a sync collection, your\n\t * observability backend, a Drizzle table, anything you want.\n\t *\n\t * Hook failures are swallowed (a misbehaving metrics sink must NOT\n\t * crash the caller's mutation). Adding the hook switches the runner\n\t * to `callable.callWithMetrics`, which is a small per-call cost\n\t * (~0.05 ms) — disable for hot-path mutations that don't need it.\n\t *\n\t * Off by default.\n\t *\n\t * @see {@link HandlerMetricsRecord}\n\t */\n\thandlerMetrics?: HandlerMetricsHook;\n\t/**\n\t * Allowlist + auth-injection map for `actions.fetch(url, init)` calls\n\t * issued from inside a `sandboxedHandler`. Each entry is keyed by\n\t * hostname (`'api.stripe.com'`); the value's `authorization` is a\n\t * sync or async callback computed on the host so the secret never\n\t * crosses into the JSC sandbox. Requests to non-allowlisted hosts\n\t * are rejected before any network call.\n\t *\n\t * Without this set, `actions.fetch` throws \"no bridgeFetch config.\"\n\t * Plain (non-sandboxed) handlers don't use this — they can just call\n\t * `fetch` directly since they run in the host process.\n\t *\n\t * @see {@link BridgeFetchConfig}\n\t */\n\tbridgeFetch?: BridgeFetchConfig;\n\t/**\n\t * Seed the engine's change log on boot from a prior snapshot — produced by\n\t * {@link SyncEngine.exportChangeLog} on the previous instance, persisted by\n\t * the host across a shard reboot, then handed back here. Cursors that\n\t * referenced this engine's `instanceId` stay resumable past the restart\n\t * (provided their last-seen point still lives in the retained log).\n\t *\n\t * The snapshot's `instanceId` MUST match `options.instanceId` (otherwise\n\t * `createSyncEngine` throws — a wrong-id restore would silently break the\n\t * resume contract). Snapshot `version` becomes this engine's local\n\t * monotonic version; entries are inserted in version order. Subscribers,\n\t * permissions, schemas, schedules, packs, mutations, and the reactive\n\t * cache are NOT in the snapshot — re-register them as normal after\n\t * `createSyncEngine` returns. Added in 1.19.0.\n\t */\n\tinitialChangeLog?: ChangeLogSnapshot;\n\t/**\n\t * Maximum concurrent in-flight mutations (`runMutation` + `runMutations`).\n\t * Calls beyond the limit wait in a FIFO queue and run as slots free up;\n\t * `engine.metrics().mutations.queued` surfaces the queue depth.\n\t *\n\t * A single tenant flooding `runMutation` can otherwise drive unbounded\n\t * memory growth (per-mutation `actions` buffers, retry timers, sandbox\n\t * invocations queued against the isolate pool). Set this to a value\n\t * appropriate for the host's tenant tier — e.g. `32` for a free tier,\n\t * `256` for paid. Without this option the engine is unbounded\n\t * (matching pre-1.20 behavior).\n\t *\n\t * Sandboxed mutations are gated by the same semaphore. If you need\n\t * finer-grained control (sandbox-only throttling), see\n\t * `@absolutejs/isolated-jsc`'s pool size — that's the lower layer.\n\t *\n\t * Added in 1.20.0.\n\t */\n\tmutationConcurrency?: number;\n\t/**\n\t * Cap on the queue of waiting mutations once `mutationConcurrency` is\n\t * saturated. Calls beyond this cap throw {@link MutationQueueOverflowError}\n\t * immediately instead of queueing — the host can surface a clean 429 or\n\t * apply a tenant-specific shed policy. Defaults to unbounded (queue\n\t * never rejects). Only meaningful when `mutationConcurrency` is set.\n\t *\n\t * Added in 1.20.0.\n\t */\n\tmutationQueueLimit?: number;\n\t/**\n\t * Per-tenant active-subscription cap. Symmetric to\n\t * {@link SyncEngineOptions.mutationConcurrency} on the read side: a\n\t * single tenant opening thousands of subscriptions would otherwise\n\t * exhaust the engine's per-subscription bookkeeping\n\t * (`active`/`tableIndex` Maps, the reactive cache, per-row diff\n\t * computation cost).\n\t *\n\t * `key` derives a tenant identifier from `(ctx, args)`; returning\n\t * `undefined` skips the cap for that call (e.g. internal/system\n\t * subscriptions). When the active count for a key reaches `max`, the\n\t * next `subscribe` throws {@link SubscriptionLimitError} BEFORE any\n\t * authorize, hydrate, or state allocation — so a denied call leaks\n\t * nothing.\n\t *\n\t * Active counts are surfaced through `engine.metrics().subscriptions.byTenant`\n\t * for tier monitoring. Added in 1.20.1.\n\t */\n\tsubscriptionLimit?: {\n\t\tmax: number;\n\t\tkey: (ctx: unknown, args: { collection: string }) => string | undefined;\n\t};\n\t/**\n\t * Optional OpenTelemetry tracer provider. When set, the engine\n\t * wraps `subscribe`, `runMutation`, `runMutations`, and cluster\n\t * fan-out in spans named `sync.<op>` with `ABS_ATTRS` semantic\n\t * conventions (`abs.engine.id`, `abs.collection`, `abs.mutation`,\n\t * etc.). When absent, all tracing is a zero-allocation noop —\n\t * existing call sites pay nothing. Added in 1.21.0.\n\t *\n\t * Pass any `@opentelemetry/api`-compatible `TracerProvider`. See\n\t * `@absolutejs/telemetry` for the type shape — sync re-uses its\n\t * helpers but doesn't peer-dep `@opentelemetry/api` directly.\n\t *\n\t * @example\n\t * ```ts\n\t * import { NodeTracerProvider } from '@opentelemetry/sdk-node';\n\t * const tp = new NodeTracerProvider({ ... });\n\t * tp.register();\n\t * const engine = createSyncEngine({ tracerProvider: tp });\n\t * ```\n\t */\n\ttracerProvider?: TelemetryTracerProvider;\n};\n\nconst defaultKey = (row: unknown): RowKey => (row as { id: RowKey }).id;\n\nconst shallowEqual = (a: unknown, b: unknown): boolean => {\n\tif (a === b) {\n\t\treturn true;\n\t}\n\tif (\n\t\ttypeof a !== 'object' ||\n\t\ttypeof b !== 'object' ||\n\t\ta === null ||\n\t\tb === null\n\t) {\n\t\treturn false;\n\t}\n\tconst aKeys = Object.keys(a);\n\tconst bKeys = Object.keys(b);\n\treturn (\n\t\taKeys.length === bKeys.length &&\n\t\taKeys.every(\n\t\t\t(k) =>\n\t\t\t\t(a as Record<string, unknown>)[k] ===\n\t\t\t\t(b as Record<string, unknown>)[k]\n\t\t)\n\t);\n};\n\n/**\n * Per-object stable identifier — paired with {@link stableSubKey} so two\n * subscriptions that share the same `(collection, params, ctx)` get the same\n * key and have their reactive rerun deduplicated within a change batch (the\n * fan-out fix in {@link reactivePairs}). Falls back to an incrementing id\n * stored on a WeakMap for values JSON can't represent (functions, classes,\n * cyclic structures), so identity-equal ctxs still share a key while\n * different-identity ones don't accidentally merge.\n */\nconst subKeyIds = new WeakMap<object, string>();\nlet subKeyCounter = 0;\nconst stableValueKey = (value: unknown): string => {\n\tif (value === undefined) return 'u';\n\tif (value === null) return 'n';\n\tconst tag = typeof value;\n\tif (tag === 'string') return `s:${value as string}`;\n\tif (tag === 'number' || tag === 'boolean' || tag === 'bigint') {\n\t\treturn `${tag[0]}:${String(value)}`;\n\t}\n\tif (tag !== 'object') return `${tag[0]}:fn`;\n\ttry {\n\t\t// Stable ordering: sort keys before serialising so { a, b } and { b, a }\n\t\t// produce the same string. JSON.stringify with a replacer keeps it tight.\n\t\treturn `o:${JSON.stringify(value, (_k, v): unknown => {\n\t\t\tif (v === null || typeof v !== 'object' || Array.isArray(v))\n\t\t\t\treturn v;\n\t\t\tconst record = v as Record<string, unknown>;\n\t\t\tconst sorted: Record<string, unknown> = {};\n\t\t\tfor (const key of Object.keys(record).sort()) {\n\t\t\t\tsorted[key] = record[key];\n\t\t\t}\n\n\t\t\treturn sorted;\n\t\t})}`;\n\t} catch {\n\t\t// Cyclic or unserializable — fall back to per-object identity.\n\t\tconst obj = value as object;\n\t\tlet id = subKeyIds.get(obj);\n\t\tif (id === undefined) {\n\t\t\tsubKeyCounter += 1;\n\t\t\tid = `i${subKeyCounter}`;\n\t\t\tsubKeyIds.set(obj, id);\n\t\t}\n\n\t\treturn `i:${id}`;\n\t}\n};\n\nconst stableSubKey = (\n\tcollection: string,\n\tparams: unknown,\n\tctx: unknown\n): string => `${collection}|${stableValueKey(params)}|${stableValueKey(ctx)}`;\n\n/** Shallow-equal ignoring the search score field — used to suppress re-emitting\n * a search result whose only change is BM25 score drift as the corpus grows. */\nconst equalsIgnoringScore = (a: unknown, b: unknown): boolean => {\n\tif (\n\t\ttypeof a !== 'object' ||\n\t\ttypeof b !== 'object' ||\n\t\ta === null ||\n\t\tb === null\n\t) {\n\t\treturn a === b;\n\t}\n\tconst strip = (value: Record<string, unknown>) =>\n\t\tObject.keys(value).filter((k) => k !== SEARCH_SCORE_FIELD);\n\tconst aKeys = strip(a as Record<string, unknown>);\n\tconst bKeys = strip(b as Record<string, unknown>);\n\treturn (\n\t\taKeys.length === bKeys.length &&\n\t\taKeys.every(\n\t\t\t(k) =>\n\t\t\t\t(a as Record<string, unknown>)[k] ===\n\t\t\t\t(b as Record<string, unknown>)[k]\n\t\t)\n\t);\n};\n\n/**\n * The Tier 3 sync engine: a registry of collections plus the view syncer. It is\n * transport-agnostic — `subscribe` returns the initial snapshot and an\n * `onDiff` stream, which an Elysia/SSE layer wires to a connection, and\n * `applyChange` is the change feed you drive from your mutations.\n *\n * Access control is first-class: every subscribe runs the collection's\n * `authorize`, and a collection's `match`/`hydrate` scope rows to the caller, so\n * a change to a row the caller can't see never reaches them.\n */\nexport const createSyncEngine = (\n\toptions: SyncEngineOptions = {}\n): SyncEngine => {\n\t// Heterogeneous registry: `any` here is what lets collections of different\n\t// row/param/context types share one map (the public `register`/`subscribe`\n\t// surface stays fully typed).\n\tconst registry = new Map<\n\t\tstring,\n\t\t| CollectionDefinition<any, any, any>\n\t\t| JoinCollectionDefinition<any, any, any, any, any>\n\t\t| GraphCollectionDefinition<any, any, any>\n\t\t| ReactiveQueryDefinition<any, any, any>\n\t\t| SearchCollectionDefinition<any, any, any>\n\t>();\n\tconst mutations = new Map<string, MutationDefinition<any, any, any>>();\n\t// Lazy sandbox runners keyed by mutation name. Built on first call to a\n\t// mutation that has `sandboxedHandler` set; reused thereafter. Engine has\n\t// no teardown; the OS reaps the isolate workers on process exit.\n\tconst sandboxRunners = new Map<\n\t\tstring,\n\t\t(\n\t\t\targs: unknown,\n\t\t\tctx: unknown,\n\t\t\tactions: MutationActions\n\t\t) => Promise<unknown>\n\t>();\n\tconst writers = new Map<string, TableWriter>();\n\tconst readers = new Map<string, TableReader>();\n\tconst schedules = new Map<string, ScheduleDefinition>();\n\t// Pack registry — table -> owning pack name, and the list of registered\n\t// packs for engine.inspect().packs.\n\tconst packTableOwners = new Map<string, string>();\n\tconst registeredPacks: RegisteredPack[] = [];\n\t// Declarative row-level permissions, keyed by table. Stored with an `unknown`\n\t// context — the engine threads ctx untyped — while the public\n\t// `definePermissions`/`registerPermissions` surface stays fully typed.\n\tconst permissions = new Map<string, TablePermissions<unknown, unknown>>();\n\tfor (const [table, rules] of Object.entries(options.permissions ?? {})) {\n\t\tpermissions.set(table, rules as TablePermissions<unknown, unknown>);\n\t}\n\tconst readRuleFor = (\n\t\ttable: string\n\t): ReadRule<unknown, unknown> | undefined => permissions.get(table)?.read;\n\tconst writeRuleFor = (\n\t\ttable: string,\n\t\top: 'insert' | 'update' | 'delete'\n\t): WriteRule<unknown, unknown> | undefined => {\n\t\tconst rules = permissions.get(table);\n\t\treturn rules?.[op] ?? rules?.write;\n\t};\n\t// Declarative row schemas, keyed by table.\n\tconst schemas = new Map<string, TableSchema<unknown>>();\n\tfor (const [table, schema] of Object.entries(options.schemas ?? {})) {\n\t\tschemas.set(table, schema as TableSchema<unknown>);\n\t}\n\t// CRDT fields, keyed by table: field name -> mergeable backend. Set via\n\t// registerCrdt; consulted in makeActions to merge (not overwrite) on write.\n\tconst crdtFields = new Map<\n\t\tstring,\n\t\tRecord<string, CrdtMergeable<unknown>>\n\t>();\n\t// Validate a write against its table's schema: every field on insert; only\n\t// the supplied fields on update. Throws SchemaError naming the bad field.\n\tconst validateWrite = (\n\t\ttable: string,\n\t\top: 'insert' | 'update',\n\t\trow: unknown\n\t) => {\n\t\tconst schema = schemas.get(table);\n\t\tif (schema === undefined || typeof row !== 'object' || row === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst record = row as Record<string, unknown>;\n\t\tfor (const [fieldName, validate] of Object.entries(schema.fields)) {\n\t\t\tconst present = fieldName in record;\n\t\t\tif (op === 'update' && !present) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!validate(record[fieldName])) {\n\t\t\t\tthrow new SchemaError(table, fieldName);\n\t\t\t}\n\t\t}\n\t};\n\t// Lazily upcast a stored/raw row to the current shape (identity if no migrate).\n\tconst migrateRow = (table: string, row: unknown): unknown => {\n\t\tconst migrate = schemas.get(table)?.migrate;\n\t\treturn migrate ? migrate(row) : row;\n\t};\n\t// Reactive (read-set-tracked) subscriptions, scanned on each change since\n\t// their dependencies (the tables they read) are dynamic, not in tableIndex.\n\tconst reactiveSubs = new Set<\n\t\tExtract<ActiveSubscription, { kind: 'reactive' }>\n\t>();\n\t// Search subscriptions + one shared index per search collection, kept live\n\t// from the source table's change feed (like reactiveSubs, not in tableIndex).\n\tconst searchSubs = new Set<\n\t\tExtract<ActiveSubscription, { kind: 'search' }>\n\t>();\n\tconst searchIndexes = new Map<\n\t\tstring,\n\t\t{\n\t\t\tindex: SearchIndex<unknown, unknown>;\n\t\t\tdefinition: SearchCollectionDefinition<unknown, unknown, unknown>;\n\t\t\thydrated: boolean;\n\t\t}\n\t>();\n\tconst active = new Map<string, Set<ActiveSubscription>>();\n\t// Which collections read each table — so a table change fans to all of them.\n\tconst tableIndex = new Map<string, Set<string>>();\n\n\t// Monotonic change feed: every applyChange bumps `version` and appends to a\n\t// bounded log, so a client can resume from the version it last applied.\n\tconst changeLogSize = options.changeLogSize ?? 1024;\n\tconst changeLogRetainMs = options.changeLogRetainMs ?? null;\n\tconst changeLog: LoggedChange[] = [];\n\tlet version = 0;\n\t// Engine-level counters surfaced via `engine.metrics()` (1.13.0).\n\tconst engineStartedAt = Date.now();\n\tlet mutationsCompleted = 0;\n\tlet mutationsFailed = 0;\n\tlet mutationsRetried = 0;\n\tlet mutationsInFlight = 0;\n\n\t// 1.20.0: optional FIFO semaphore gating mutation entry. Capacity is\n\t// `mutationConcurrency`; waiters queue with optional `mutationQueueLimit`\n\t// rejection. New arrivals that find ANY queued waiter also queue (FIFO\n\t// preservation), so a steady arrival rate can't starve an early waiter.\n\tconst mutationWaiters: (() => void)[] = [];\n\tlet mutationsQueued = 0;\n\n\tconst acquireMutationSlot = async (): Promise<void> => {\n\t\tconst limit = options.mutationConcurrency;\n\t\tif (limit === undefined) {\n\t\t\t// No semaphore — still bump the metric so `inFlight` is\n\t\t\t// always accurate, but skip all the queue plumbing.\n\t\t\tmutationsInFlight += 1;\n\t\t\treturn;\n\t\t}\n\t\t// FIFO: if a slot is open AND no waiters are queued, take it\n\t\t// synchronously. The increment is part of the same synchronous\n\t\t// step as the check, so two arrivals can't both pass when only\n\t\t// one slot remains.\n\t\tif (mutationsInFlight < limit && mutationWaiters.length === 0) {\n\t\t\tmutationsInFlight += 1;\n\t\t\treturn;\n\t\t}\n\t\t// Queue, or reject if the queue is also capped.\n\t\tconst queueLimit = options.mutationQueueLimit;\n\t\tif (queueLimit !== undefined && mutationsQueued >= queueLimit) {\n\t\t\tthrow new MutationQueueOverflowError(queueLimit);\n\t\t}\n\t\tmutationsQueued += 1;\n\t\ttry {\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tmutationWaiters.push(resolve);\n\t\t\t});\n\t\t} finally {\n\t\t\tmutationsQueued -= 1;\n\t\t}\n\t\t// Wake means a slot just opened up FOR US (`releaseMutationSlot`\n\t\t// only resolves one waiter per release). Claim it now — atomic\n\t\t// with the wake step.\n\t\tmutationsInFlight += 1;\n\t};\n\n\tconst releaseMutationSlot = (): void => {\n\t\tmutationsInFlight -= 1;\n\t\tif (options.mutationConcurrency === undefined) return;\n\t\tconst next = mutationWaiters.shift();\n\t\tif (next !== undefined) next();\n\t};\n\n\t// 1.20.1: per-tenant subscription cap. Active count keyed by the\n\t// host-supplied `subscriptionLimit.key(ctx, args)`. `undefined` from\n\t// `key()` means \"exempt this call from the cap\" — internal / system\n\t// subscriptions can skip the bookkeeping entirely.\n\tconst subscriptionsByTenant = new Map<string, number>();\n\n\tconst acquireSubscriptionSlot = (\n\t\tctx: unknown,\n\t\targs: { collection: string }\n\t): string | undefined => {\n\t\tconst cap = options.subscriptionLimit;\n\t\tif (cap === undefined) return undefined;\n\t\tconst tenantKey = cap.key(ctx, args);\n\t\tif (tenantKey === undefined) return undefined;\n\t\tconst active = subscriptionsByTenant.get(tenantKey) ?? 0;\n\t\tif (active >= cap.max) {\n\t\t\tthrow new SubscriptionLimitError(tenantKey, cap.max, active);\n\t\t}\n\t\tsubscriptionsByTenant.set(tenantKey, active + 1);\n\t\treturn tenantKey;\n\t};\n\n\tconst releaseSubscriptionSlot = (tenantKey: string | undefined): void => {\n\t\tif (tenantKey === undefined) return;\n\t\tconst active = subscriptionsByTenant.get(tenantKey);\n\t\tif (active === undefined || active <= 1) {\n\t\t\tsubscriptionsByTenant.delete(tenantKey);\n\t\t} else {\n\t\t\tsubscriptionsByTenant.set(tenantKey, active - 1);\n\t\t}\n\t};\n\n\t// Cross-client reactive query cache (1.3+). Keyed by stableSubKey, holds\n\t// the result + read set so a fresh subscribe with the same key reuses the\n\t// rerun instead of hitting the DB again. Per-batch dedup (since 1.1) is\n\t// already in `reactivePairs`; this lifts the sharing across batches.\n\t//\n\t// Entries are invalidated when a write overlaps the cached read set (same\n\t// `isReactiveAffected` check live subs use). LRU-bounded; optional TTL.\n\tconst reactiveCacheMax = options.reactiveCache?.max ?? 256;\n\tconst reactiveCacheTtlMs = options.reactiveCache?.ttlMs ?? 60_000;\n\ttype CachedRerun = {\n\t\trerunKey: string;\n\t\trows: unknown[];\n\t\treadTables: Set<string>;\n\t\treadKeys: Set<string>;\n\t\trangeDeps: RangeDep[];\n\t\tversion: number;\n\t\texpiresAt: number;\n\t};\n\t// `Map` preserves insertion order — re-set on access for LRU semantics.\n\tconst cachedReruns = new Map<string, CachedRerun>();\n\tconst touchCacheEntry = (key: string, entry: CachedRerun) => {\n\t\tcachedReruns.delete(key);\n\t\tcachedReruns.set(key, entry);\n\t};\n\tconst readCacheEntry = (key: string): CachedRerun | undefined => {\n\t\tif (reactiveCacheMax <= 0) return undefined;\n\t\tconst entry = cachedReruns.get(key);\n\t\tif (entry === undefined) return undefined;\n\t\tif (reactiveCacheTtlMs > 0 && entry.expiresAt < Date.now()) {\n\t\t\tcachedReruns.delete(key);\n\n\t\t\treturn undefined;\n\t\t}\n\t\ttouchCacheEntry(key, entry);\n\n\t\treturn entry;\n\t};\n\tconst writeCacheEntry = (entry: CachedRerun) => {\n\t\tif (reactiveCacheMax <= 0) return;\n\t\tcachedReruns.set(entry.rerunKey, entry);\n\t\t// LRU eviction: oldest insertion wins out when over budget.\n\t\twhile (cachedReruns.size > reactiveCacheMax) {\n\t\t\tconst oldest = cachedReruns.keys().next().value;\n\t\t\tif (oldest === undefined) break;\n\t\t\tcachedReruns.delete(oldest);\n\t\t}\n\t};\n\t// Devtools activity stream — listeners are notified of changes, mutation\n\t// outcomes, and subscribe/unsubscribe. Cheap (a no-op) when no one's watching.\n\tconst activityListeners = new Set<(event: EngineActivity) => void>();\n\tconst emitActivity = (event: EngineActivity) => {\n\t\tfor (const listener of activityListeners) {\n\t\t\tlistener(event);\n\t\t}\n\t};\n\t// Outbound CDC stream subscribers — `streamChanges()` adds itself here.\n\t// Notifications fire from `logChange` so every appended log entry reaches\n\t// every active streamer atomically with the log push.\n\tconst streamSubscribers = new Set<(entry: LoggedChange) => void>();\n\tconst runInTransaction = options.transaction;\n\t// Cluster fan-out: a stable id so we ignore our own broadcasts, and the bus\n\t// (set by connectCluster) we publish locally-committed changes to. Pass\n\t// `options.instanceId` for stable cross-process identity (e.g. the\n\t// hostname or a config-supplied UUID) — 1.17.0+ resume cursors travel\n\t// across instances, so the id needs to be stable across restarts if you\n\t// want resume to keep working past a reboot.\n\tconst instanceId =\n\t\toptions.instanceId ??\n\t\tglobalThis.crypto?.randomUUID?.() ??\n\t\t`i${Math.random()}`;\n\tlet clusterBus: ClusterBus | undefined;\n\n\t// 1.21.0: OTel tracer (noop when options.tracerProvider is unset).\n\t// All hot-path tracing flows through this — zero allocations when\n\t// the provider is absent because the noop tracer is a singleton.\n\tconst tracer = tracerOrNoop(options.tracerProvider, '@absolutejs/sync');\n\n\t// 1.19.0: optional boot-time restore from a prior engine's snapshot. Must\n\t// happen BEFORE any local writes — we validate by checking version === 0\n\t// inside importChangeLog and call it once here from the construction path.\n\tconst importChangeLog = (snapshot: ChangeLogSnapshot): number => {\n\t\tif (version !== 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`[sync] importChangeLog: engine already has version ${version}; ` +\n\t\t\t\t\t`restore must happen before any local writes commit.`\n\t\t\t);\n\t\t}\n\t\tif (snapshot.instanceId !== instanceId) {\n\t\t\tthrow new Error(\n\t\t\t\t`[sync] importChangeLog: snapshot instanceId \"${snapshot.instanceId}\" ` +\n\t\t\t\t\t`does not match this engine's instanceId \"${instanceId}\". ` +\n\t\t\t\t\t`Pass options.instanceId = \"${snapshot.instanceId}\" to createSyncEngine.`\n\t\t\t);\n\t\t}\n\t\t// Adopt version + entries. logChange's retention sweeps still apply,\n\t\t// so over-large snapshots get trimmed exactly like live logs would.\n\t\tversion = snapshot.version;\n\t\tfor (const entry of snapshot.entries) {\n\t\t\tchangeLog.push(entry);\n\t\t}\n\t\t// Apply count cap once after the bulk push (cheaper than per-entry).\n\t\twhile (changeLog.length > changeLogSize) {\n\t\t\tchangeLog.shift();\n\t\t}\n\t\t// Apply time-based retention to the imported tail.\n\t\tif (changeLogRetainMs !== null && changeLogRetainMs > 0) {\n\t\t\tconst cutoff = Date.now() - changeLogRetainMs;\n\t\t\twhile (changeLog.length > 0 && changeLog[0]!.at < cutoff) {\n\t\t\t\tchangeLog.shift();\n\t\t\t}\n\t\t}\n\t\treturn snapshot.entries.length;\n\t};\n\n\tif (options.initialChangeLog !== undefined) {\n\t\timportChangeLog(options.initialChangeLog);\n\t}\n\n\tconst broadcast = (\n\t\tchanges: { table: string; change: RowChange<unknown> }[],\n\t\t// 1.17.0 — the local version at the moment of this broadcast, so\n\t\t// peers can log the changes against `(instanceId, originVersion)`\n\t\t// and serve cross-instance resume from their own log.\n\t\toriginVersion: number\n\t) => {\n\t\tif (clusterBus !== undefined && changes.length > 0) {\n\t\t\tvoid clusterBus.publish({ changes, origin: instanceId, originVersion });\n\t\t}\n\t};\n\n\tconst subsFor = (collection: string) => {\n\t\tlet set = active.get(collection);\n\t\tif (set === undefined) {\n\t\t\tset = new Set();\n\t\t\tactive.set(collection, set);\n\t\t}\n\t\treturn set;\n\t};\n\n\tconst addTableIndex = (table: string, name: string) => {\n\t\tlet set = tableIndex.get(table);\n\t\tif (set === undefined) {\n\t\t\tset = new Set();\n\t\t\ttableIndex.set(table, set);\n\t\t}\n\t\tset.add(name);\n\t};\n\n\t/** A side change that fails its filter becomes a leave (delete from the join). */\n\tconst sideChange = (\n\t\tchange: RowChange<unknown>,\n\t\tmatch?: (row: unknown) => boolean\n\t): RowChange<unknown> =>\n\t\tchange.op !== 'delete' && match !== undefined && !match(change.row)\n\t\t\t? { op: 'delete', row: change.row }\n\t\t\t: change;\n\n\tconst EMPTY_DIFF: ViewDiff<unknown> = {\n\t\tadded: [],\n\t\tremoved: [],\n\t\tchanged: []\n\t};\n\n\t/** Apply one change to a subscription's state and return its diff (no emit). */\n\tconst subscriptionDiff = async (\n\t\tsubscription: ActiveSubscription,\n\t\ttable: string,\n\t\tchange: RowChange<unknown>\n\t): Promise<ViewDiff<unknown>> => {\n\t\tif (subscription.kind === 'graph') {\n\t\t\treturn subscription.instance.applyChange(table, change);\n\t\t}\n\t\tif (subscription.kind === 'join') {\n\t\t\tconst js = subscription.join;\n\t\t\tif (table === js.leftTable) {\n\t\t\t\treturn js.op.applyLeft(sideChange(change, js.leftMatch));\n\t\t\t}\n\t\t\tif (table === js.rightTable) {\n\t\t\t\treturn js.op.applyRight(sideChange(change, js.rightMatch));\n\t\t\t}\n\t\t\treturn EMPTY_DIFF;\n\t\t}\n\t\tif (subscription.kind === 'reactive') {\n\t\t\t// Reactive subs re-run as a whole (see reactivePairs), not per change.\n\t\t\treturn EMPTY_DIFF;\n\t\t}\n\t\tif (subscription.kind === 'search') {\n\t\t\t// Search subs re-rank as a whole (see searchPairs), not per change.\n\t\t\treturn EMPTY_DIFF;\n\t\t}\n\t\tif (subscription.incremental) {\n\t\t\ttry {\n\t\t\t\treturn subscription.view.apply(change);\n\t\t\t} catch {\n\t\t\t\t// The predicate couldn't decide this change (e.g. an operator the\n\t\t\t\t// inferred matcher doesn't support) — degrade to a correct refetch\n\t\t\t\t// rather than a wrong diff.\n\t\t\t\treturn subscription.view.reset(await subscription.rehydrate());\n\t\t\t}\n\t\t}\n\t\treturn subscription.view.reset(await subscription.rehydrate());\n\t};\n\n\t/** Active subscriptions whose collection reads `table`. */\n\tconst subscriptionsForTable = function* (\n\t\ttable: string\n\t): Generator<ActiveSubscription> {\n\t\tconst names = tableIndex.get(table);\n\t\tif (names === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const name of names) {\n\t\t\tconst set = active.get(name);\n\t\t\tif (set === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tyield* set;\n\t\t}\n\t};\n\n\t/**\n\t * Net a batch's per-change diffs by key, relative to the pre-batch state, so a\n\t * mutation that touches the same row twice collapses to one coherent change:\n\t * add-then-remove cancels, add-then-update stays an add, remove-then-add\n\t * becomes a change.\n\t */\n\tconst mergeViewDiffs = (\n\t\tdiffs: ViewDiff<unknown>[],\n\t\tkey: (row: unknown) => RowKey\n\t): ViewDiff<unknown> => {\n\t\ttype Net = { state: 'added' | 'changed' | 'removed'; row: unknown };\n\t\tconst net = new Map<RowKey, Net>();\n\t\tfor (const diff of diffs) {\n\t\t\tfor (const row of diff.removed) {\n\t\t\t\tconst previous = net.get(key(row));\n\t\t\t\tif (previous?.state === 'added') {\n\t\t\t\t\tnet.delete(key(row));\n\t\t\t\t} else {\n\t\t\t\t\tnet.set(key(row), { state: 'removed', row });\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const row of diff.added) {\n\t\t\t\tconst previous = net.get(key(row));\n\t\t\t\tnet.set(key(row), {\n\t\t\t\t\tstate: previous?.state === 'removed' ? 'changed' : 'added',\n\t\t\t\t\trow\n\t\t\t\t});\n\t\t\t}\n\t\t\tfor (const row of diff.changed) {\n\t\t\t\tconst previous = net.get(key(row));\n\t\t\t\tnet.set(key(row), {\n\t\t\t\t\tstate: previous?.state === 'added' ? 'added' : 'changed',\n\t\t\t\t\trow\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tconst added: unknown[] = [];\n\t\tconst changed: unknown[] = [];\n\t\tconst removed: unknown[] = [];\n\t\tfor (const { state, row } of net.values()) {\n\t\t\tif (state === 'added') {\n\t\t\t\tadded.push(row);\n\t\t\t} else if (state === 'changed') {\n\t\t\t\tchanged.push(row);\n\t\t\t} else {\n\t\t\t\tremoved.push(row);\n\t\t\t}\n\t\t}\n\t\treturn { added, changed, removed };\n\t};\n\n\ttype ReactiveSub = Extract<ActiveSubscription, { kind: 'reactive' }>;\n\n\tconst depKey = (table: string, key: RowKey): string => `${table} ${key}`;\n\n\t/** The key of a changed row under its table's reader key (if one is set). */\n\tconst changedKeyFor = (\n\t\ttable: string,\n\t\tchange: RowChange<unknown>\n\t): RowKey | undefined => readers.get(table)?.key?.(change.row);\n\n\t/**\n\t * An instrumented read handle: `all` records a full-table dependency; `get`\n\t * records a precise row-key dependency when the table's reader has a `key`\n\t * (else falls back to a table dependency).\n\t */\n\tconst makeReadHandle = (\n\t\tctx: unknown,\n\t\treadTables: Set<string>,\n\t\treadKeys: Set<string>,\n\t\trangeDeps: RangeDep[],\n\t\t// Schedules read unscoped (trusted server code); subscriptions apply rules.\n\t\tapplyRules = true\n\t): ReadHandle => {\n\t\tconst readerFor = (table: string): TableReader => {\n\t\t\tconst reader = readers.get(table);\n\t\t\tif (reader === undefined) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No reader registered for table \"${table}\" — register one with engine.registerReader`\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn reader;\n\t\t};\n\t\tconst ruleFor = (table: string) =>\n\t\t\tapplyRules ? readRuleFor(table) : undefined;\n\n\t\treturn {\n\t\t\tall: async (table) => {\n\t\t\t\treadTables.add(table);\n\t\t\t\t// Migrate raw rows to the current shape, then scope by read rule.\n\t\t\t\tconst rows = [...(await readerFor(table).all(ctx))].map((row) =>\n\t\t\t\t\tmigrateRow(table, row)\n\t\t\t\t);\n\t\t\t\tconst rule = ruleFor(table);\n\t\t\t\treturn (\n\t\t\t\t\trule ? rows.filter((row) => rule(ctx, row)) : rows\n\t\t\t\t) as never[];\n\t\t\t},\n\t\t\tget: async (table, key) => {\n\t\t\t\tconst reader = readerFor(table);\n\t\t\t\tif (reader.get === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Reader for table \"${table}\" has no get(); use db.all() or add get`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (reader.key !== undefined) {\n\t\t\t\t\treadKeys.add(depKey(table, key));\n\t\t\t\t} else {\n\t\t\t\t\treadTables.add(table);\n\t\t\t\t}\n\t\t\t\tconst raw = await reader.get(key, ctx);\n\t\t\t\tconst row =\n\t\t\t\t\traw === undefined ? undefined : migrateRow(table, raw);\n\t\t\t\tconst rule = ruleFor(table);\n\t\t\t\t// A row the caller can't read reads as absent.\n\t\t\t\treturn (\n\t\t\t\t\trule && row !== undefined && !rule(ctx, row)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: row\n\t\t\t\t) as never;\n\t\t\t},\n\t\t\twhere: async (table, predicate) => {\n\t\t\t\tconst reader = readerFor(table);\n\t\t\t\tconst rule = ruleFor(table);\n\t\t\t\t// Fold the read rule into the range predicate, so an unreadable row\n\t\t\t\t// never matches and a visibility flip still re-runs the query.\n\t\t\t\tconst effective = (\n\t\t\t\t\trule\n\t\t\t\t\t\t? (row: unknown) =>\n\t\t\t\t\t\t\t\t(predicate as (r: unknown) => boolean)(row) &&\n\t\t\t\t\t\t\t\trule(ctx, row)\n\t\t\t\t\t\t: (predicate as (row: unknown) => boolean)\n\t\t\t\t) as (row: unknown) => boolean;\n\t\t\t\tconst matched = [...(await reader.all(ctx))]\n\t\t\t\t\t.map((row) => migrateRow(table, row))\n\t\t\t\t\t.filter(effective);\n\t\t\t\tif (reader.key !== undefined) {\n\t\t\t\t\t// Remember which rows matched, so an update/delete that pulls a\n\t\t\t\t\t// row out of the range still re-runs (it's in this key set).\n\t\t\t\t\tconst key = reader.key;\n\t\t\t\t\trangeDeps.push({\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\tpredicate: effective,\n\t\t\t\t\t\tkeys: new Set(matched.map(key))\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treadTables.add(table);\n\t\t\t\t}\n\t\t\t\treturn matched as never[];\n\t\t\t}\n\t\t};\n\t};\n\n\tconst writerFor = (table: string): TableWriter => {\n\t\tconst writer = writers.get(table);\n\t\tif (writer === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`No writer registered for table \"${table}\" — register one with engine.registerWriter, or use actions.change`\n\t\t\t);\n\t\t}\n\t\treturn writer;\n\t};\n\n\t// Load the committed row a write targets (by the table's reader), if any — so\n\t// authorization and CRDT merge both reflect committed state, not the payload.\n\tconst readExisting = async (\n\t\ttable: string,\n\t\tvalue: unknown,\n\t\tctx: unknown\n\t): Promise<unknown> => {\n\t\tconst reader = readers.get(table);\n\t\tif (reader?.get === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst id = reader.key\n\t\t\t? reader.key(value)\n\t\t\t: (value as { id?: RowKey }).id;\n\t\treturn id === undefined ? undefined : reader.get(id, ctx);\n\t};\n\n\t// Enforce a table's declarative write rule before the writer runs (so a deny\n\t// rolls the transaction back). For update/delete, evaluate the rule against the\n\t// *existing* row when a reader can load it — so the check reflects committed\n\t// state, not a client-supplied payload.\n\tconst authorizeWrite = async (\n\t\ttable: string,\n\t\top: 'insert' | 'update' | 'delete',\n\t\tvalue: unknown,\n\t\tctx: unknown\n\t) => {\n\t\tconst rule = writeRuleFor(table, op);\n\t\tif (rule === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tlet subject = value;\n\t\tif (op !== 'insert') {\n\t\t\tconst existing = await readExisting(table, value, ctx);\n\t\t\tif (existing !== undefined) {\n\t\t\t\tsubject = existing;\n\t\t\t}\n\t\t}\n\t\tif (!rule(ctx, subject)) {\n\t\t\tthrow new UnauthorizedError(`${op} on table \"${table}\"`);\n\t\t}\n\t};\n\n\t// Merge a write's CRDT fields into the committed row (so concurrent writers\n\t// converge) instead of overwriting them. A no-op for tables without CRDT\n\t// fields. On insert the base is the empty state; on update it's the stored\n\t// field value. Returns the row patch the writer should persist.\n\tconst mergeCrdtFields = async (\n\t\ttable: string,\n\t\top: 'insert' | 'update',\n\t\tdata: unknown,\n\t\tctx: unknown\n\t): Promise<unknown> => {\n\t\tconst fields = crdtFields.get(table);\n\t\tif (fields === undefined || data === null || typeof data !== 'object') {\n\t\t\treturn data;\n\t\t}\n\t\tconst incoming = data as Record<string, unknown>;\n\t\tconst existing =\n\t\t\top === 'update' ? await readExisting(table, data, ctx) : undefined;\n\t\tconst base =\n\t\t\texisting !== null && typeof existing === 'object'\n\t\t\t\t? (existing as Record<string, unknown>)\n\t\t\t\t: undefined;\n\t\tconst merged: Record<string, unknown> = { ...incoming };\n\t\tfor (const [field, adapter] of Object.entries(fields)) {\n\t\t\tif (incoming[field] === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmerged[field] = adapter.merge(\n\t\t\t\tbase?.[field] ?? adapter.empty(),\n\t\t\t\tincoming[field]\n\t\t\t);\n\t\t}\n\t\treturn merged;\n\t};\n\n\t/**\n\t * Build the write actions a mutation or schedule handler uses, collecting its\n\t * changes into a fresh buffer (so a transaction that retries/rolls back never\n\t * double-emits). `tx` threads to each writer. `enforce` applies write\n\t * permission rules (mutations); schedules run trusted, so they pass `false`.\n\t */\n\tconst makeActions = (tx: unknown, ctx: unknown, enforce: boolean) => {\n\t\tconst buffered: { table: string; change: RowChange<unknown> }[] = [];\n\t\tconst actions: MutationActions = {\n\t\t\tchange: (collection, change) => {\n\t\t\t\tbuffered.push({\n\t\t\t\t\ttable: collection,\n\t\t\t\t\tchange: change as RowChange<unknown>\n\t\t\t\t});\n\t\t\t\treturn Promise.resolve();\n\t\t\t},\n\t\t\tinsert: async (table, data) => {\n\t\t\t\t// Schema is data integrity — validated for trusted schedules too.\n\t\t\t\tvalidateWrite(table, 'insert', data);\n\t\t\t\tif (enforce) {\n\t\t\t\t\tawait authorizeWrite(table, 'insert', data, ctx);\n\t\t\t\t}\n\t\t\t\tconst merged = await mergeCrdtFields(\n\t\t\t\t\ttable,\n\t\t\t\t\t'insert',\n\t\t\t\t\tdata,\n\t\t\t\t\tctx\n\t\t\t\t);\n\t\t\t\tconst row = await writerFor(table).insert(merged, ctx, tx);\n\t\t\t\tbuffered.push({ table, change: { op: 'insert', row } });\n\t\t\t\treturn row;\n\t\t\t},\n\t\t\tupdate: async (table, data) => {\n\t\t\t\tvalidateWrite(table, 'update', data);\n\t\t\t\tif (enforce) {\n\t\t\t\t\tawait authorizeWrite(table, 'update', data, ctx);\n\t\t\t\t}\n\t\t\t\tconst merged = await mergeCrdtFields(\n\t\t\t\t\ttable,\n\t\t\t\t\t'update',\n\t\t\t\t\tdata,\n\t\t\t\t\tctx\n\t\t\t\t);\n\t\t\t\tconst row = await writerFor(table).update(merged, ctx, tx);\n\t\t\t\tbuffered.push({ table, change: { op: 'update', row } });\n\t\t\t\treturn row;\n\t\t\t},\n\t\t\tdelete: async (table, row) => {\n\t\t\t\tif (enforce) {\n\t\t\t\t\tawait authorizeWrite(table, 'delete', row, ctx);\n\t\t\t\t}\n\t\t\t\tawait writerFor(table).delete(row, ctx, tx);\n\t\t\t\tbuffered.push({ table, change: { op: 'delete', row } });\n\t\t\t},\n\t\t\t// Default wall clock. Replay / rebase paths can wrap and pin\n\t\t\t// this; today it's just Date.now().\n\t\t\tnow: () => Date.now()\n\t\t};\n\t\treturn { actions, buffered };\n\t};\n\n\t/** Diff a re-run against a sub's current set; updates `current`. Shared by the\n\t * reactive and search kinds (both re-run wholesale and diff). `equals` decides\n\t * whether a still-present row counts as changed. */\n\tconst diffRerun = (\n\t\tsub: {\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\tcurrent: Map<RowKey, unknown>;\n\t\t},\n\t\trows: unknown[],\n\t\tequals: (a: unknown, b: unknown) => boolean = shallowEqual\n\t): ViewDiff<unknown> => {\n\t\tconst next = new Map<RowKey, unknown>();\n\t\tfor (const row of rows) {\n\t\t\tnext.set(sub.key(row), row);\n\t\t}\n\t\tconst added: unknown[] = [];\n\t\tconst removed: unknown[] = [];\n\t\tconst changed: unknown[] = [];\n\t\tfor (const [rowKey, row] of next) {\n\t\t\tconst previous = sub.current.get(rowKey);\n\t\t\tif (previous === undefined) {\n\t\t\t\tadded.push(row);\n\t\t\t} else if (!equals(previous, row)) {\n\t\t\t\tchanged.push(row);\n\t\t\t}\n\t\t}\n\t\tfor (const [rowKey, row] of sub.current) {\n\t\t\tif (!next.has(rowKey)) {\n\t\t\t\tremoved.push(row);\n\t\t\t}\n\t\t}\n\t\tsub.current = next;\n\t\treturn { added, removed, changed };\n\t};\n\n\t/** Re-run every reactive query whose read set intersects the changed tables. */\n\ttype ReactiveChange = {\n\t\ttable: string;\n\t\tkey: RowKey | undefined;\n\t\trow: unknown;\n\t};\n\n\t/** Does a change fall in a range dep — matched now, or a member at last read? */\n\tconst inRange = (dep: RangeDep, change: ReactiveChange): boolean =>\n\t\tdep.table === change.table &&\n\t\t((change.key !== undefined && dep.keys.has(change.key)) ||\n\t\t\tdep.predicate(change.row));\n\n\t/** Does any change in the batch overlap this read set? Used for both live\n\t * sub invalidation and cross-client cache invalidation. */\n\tconst readSetOverlaps = (\n\t\treadTables: Set<string>,\n\t\treadKeys: Set<string>,\n\t\trangeDeps: RangeDep[],\n\t\tchanges: ReactiveChange[]\n\t): boolean =>\n\t\tchanges.some(\n\t\t\t(change) =>\n\t\t\t\treadTables.has(change.table) ||\n\t\t\t\t(change.key !== undefined &&\n\t\t\t\t\treadKeys.has(depKey(change.table, change.key))) ||\n\t\t\t\trangeDeps.some((dep) => inRange(dep, change))\n\t\t);\n\n\t/** Did this batch touch a table, row key, or range the sub read? */\n\tconst isReactiveAffected = (\n\t\tsub: ReactiveSub,\n\t\tchanges: ReactiveChange[]\n\t): boolean =>\n\t\treadSetOverlaps(sub.readTables, sub.readKeys, sub.rangeDeps, changes);\n\n\t/** Drop cached reruns whose read set overlaps this write batch. Cheap walk —\n\t * the cache is bounded by `reactiveCache.max` (default 256). */\n\tconst invalidateCacheForChanges = (changes: ReactiveChange[]) => {\n\t\tif (cachedReruns.size === 0) return;\n\t\tfor (const [key, entry] of cachedReruns) {\n\t\t\tif (\n\t\t\t\treadSetOverlaps(\n\t\t\t\t\tentry.readTables,\n\t\t\t\t\tentry.readKeys,\n\t\t\t\t\tentry.rangeDeps,\n\t\t\t\t\tchanges\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tcachedReruns.delete(key);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst reactivePairs = async (\n\t\tchanges: ReactiveChange[]\n\t): Promise<[ActiveSubscription, ViewDiff<unknown>][]> => {\n\t\t// Drop now-stale cache entries before reruns — otherwise a fresh\n\t\t// subscriber landing during the batch could read the OLD value.\n\t\tinvalidateCacheForChanges(changes);\n\n\t\tconst pairs: [ActiveSubscription, ViewDiff<unknown>][] = [];\n\t\t// Dedupe: subscriptions sharing the same `(collection, params, ctx)`\n\t\t// only need ONE rerun per change batch. With 1000 subs on the same\n\t\t// query, this drops per-change CPU from O(N) reruns to O(1) — every\n\t\t// sub then diffs the shared result against its own `current` and\n\t\t// receives its own per-sub frame (which the transport still writes\n\t\t// per-WS, see #22 batch-frame fan-out for the next step).\n\t\tconst sharedRuns = new Map<\n\t\t\tstring,\n\t\t\tPromise<Awaited<ReturnType<ReactiveSub['rerun']>>>\n\t\t>();\n\t\tfor (const sub of reactiveSubs) {\n\t\t\tif (!isReactiveAffected(sub, changes)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet runPromise = sharedRuns.get(sub.rerunKey);\n\t\t\tif (runPromise === undefined) {\n\t\t\t\trunPromise = sub.rerun();\n\t\t\t\tsharedRuns.set(sub.rerunKey, runPromise);\n\t\t\t}\n\t\t\tconst { rows, readTables, readKeys, rangeDeps } = await runPromise;\n\t\t\tsub.readTables = readTables;\n\t\t\tsub.readKeys = readKeys;\n\t\t\tsub.rangeDeps = rangeDeps;\n\t\t\tconst diff = diffRerun(sub, rows);\n\t\t\tif (!isEmptyViewDiff(diff)) {\n\t\t\t\tpairs.push([sub, diff]);\n\t\t\t}\n\t\t}\n\t\t// Refresh cache entries with the freshly-computed rows so subsequent\n\t\t// subscribers reuse them without hitting the DB.\n\t\tfor (const [key, runPromise] of sharedRuns) {\n\t\t\trunPromise\n\t\t\t\t.then(({ rows, readTables, readKeys, rangeDeps }) => {\n\t\t\t\t\twriteCacheEntry({\n\t\t\t\t\t\texpiresAt: Date.now() + reactiveCacheTtlMs,\n\t\t\t\t\t\trangeDeps,\n\t\t\t\t\t\treadKeys,\n\t\t\t\t\t\treadTables,\n\t\t\t\t\t\trerunKey: key,\n\t\t\t\t\t\trows,\n\t\t\t\t\t\tversion\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch(() => {\n\t\t\t\t\t// rerun threw — leave cache as-is (already invalidated above)\n\t\t\t\t});\n\t\t}\n\n\t\treturn pairs;\n\t};\n\n\t/** Lazily build + hydrate a search collection's shared index (once). */\n\tconst ensureSearchIndex = async (\n\t\tdefinition: SearchCollectionDefinition<unknown, unknown, unknown>\n\t) => {\n\t\tlet entry = searchIndexes.get(definition.name);\n\t\tif (entry === undefined) {\n\t\t\tentry = { index: definition.index(), definition, hydrated: false };\n\t\t\tsearchIndexes.set(definition.name, entry);\n\t\t}\n\t\tif (!entry.hydrated) {\n\t\t\tfor (const row of await definition.source()) {\n\t\t\t\tentry.index.add(row);\n\t\t\t}\n\t\t\tentry.hydrated = true;\n\t\t}\n\t\treturn entry;\n\t};\n\n\t/**\n\t * Keep search indexes live and re-rank affected search subs: apply each change\n\t * to its collection's index, then re-run every sub whose collection changed.\n\t * Synchronous — the index ops and re-ranks don't touch the DB.\n\t */\n\tconst searchPairs = (\n\t\tchanges: { table: string; change: RowChange<unknown> }[]\n\t): [ActiveSubscription, ViewDiff<unknown>][] => {\n\t\tconst touched = new Set<string>();\n\t\tfor (const { table, change } of changes) {\n\t\t\tfor (const entry of searchIndexes.values()) {\n\t\t\t\tif (!entry.hydrated || entry.definition.table !== table) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (change.op === 'delete') {\n\t\t\t\t\tentry.index.remove(entry.definition.key(change.row));\n\t\t\t\t} else {\n\t\t\t\t\tentry.index.add(change.row);\n\t\t\t\t}\n\t\t\t\ttouched.add(entry.definition.name);\n\t\t\t}\n\t\t}\n\t\tconst pairs: [ActiveSubscription, ViewDiff<unknown>][] = [];\n\t\tfor (const sub of searchSubs) {\n\t\t\tif (!touched.has(sub.collection)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Ignore pure score drift (BM25 idf shifts as the corpus grows), so a\n\t\t\t// result only re-emits when it enters/leaves or its content changes —\n\t\t\t// not on every unrelated insert.\n\t\t\tconst diff = diffRerun(sub, sub.rerun(), equalsIgnoringScore);\n\t\t\tif (!isEmptyViewDiff(diff)) {\n\t\t\t\tpairs.push([sub, diff]);\n\t\t\t}\n\t\t}\n\t\treturn pairs;\n\t};\n\n\tconst logChange = (changeVersion: number, entry: LoggedChange) => {\n\t\tchangeLog.push(entry);\n\t\t// Count-based cap.\n\t\tif (changeLog.length > changeLogSize) {\n\t\t\tchangeLog.shift();\n\t\t}\n\t\t// Time-based retention (1.13.0): drop entries older than the\n\t\t// configured window. Cheap when the log is small or the head is\n\t\t// fresh — we stop the moment we find a young-enough entry.\n\t\tif (changeLogRetainMs !== null && changeLogRetainMs > 0) {\n\t\t\tconst cutoff = entry.at - changeLogRetainMs;\n\t\t\twhile (changeLog.length > 0 && changeLog[0]!.at < cutoff) {\n\t\t\t\tchangeLog.shift();\n\t\t\t}\n\t\t}\n\t\t// Atomic with the log push — every active CDC streamer sees every\n\t\t// entry exactly once, in version order, with no chance of a missed\n\t\t// commit between phase-1 catch-up and phase-2 tail.\n\t\tfor (const subscriber of streamSubscribers) {\n\t\t\tsubscriber(entry);\n\t\t}\n\t};\n\n\t// 1.17.0 cross-instance cursor encode/decode. Opaque to clients —\n\t// shaped as base64-ish JSON internally. The client must round-trip\n\t// what the server returned, unmodified.\n\tconst encodeCursor = (versions: Record<string, number>): string =>\n\t\t// Plain JSON is fine; clients treat it as opaque. We don't base64\n\t\t// because the cursor lives in a JSON payload anyway (snapshot frame).\n\t\tJSON.stringify(versions);\n\tconst decodeCursor = (cursor: string): Record<string, number> | null => {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(cursor);\n\t\t\tif (typeof parsed !== 'object' || parsed === null) return null;\n\t\t\tconst out: Record<string, number> = {};\n\t\t\tfor (const [k, v] of Object.entries(parsed)) {\n\t\t\t\tif (typeof v === 'number') out[k] = v;\n\t\t\t}\n\t\t\treturn out;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t};\n\tconst currentCursor = (): string => {\n\t\t// Snapshot the highest local version + each peer's highest origin\n\t\t// version seen so far. Cheap O(log) — single backwards walk grabs\n\t\t// the most-recent originVersion per peer.\n\t\tconst versions: Record<string, number> = { [instanceId]: version };\n\t\tfor (let i = changeLog.length - 1; i >= 0; i--) {\n\t\t\tconst entry = changeLog[i]!;\n\t\t\tif (versions[entry.origin] === undefined) {\n\t\t\t\tversions[entry.origin] = entry.originVersion;\n\t\t\t}\n\t\t}\n\t\treturn encodeCursor(versions);\n\t};\n\n\t/** Apply a single committed change at its own version (CDC / direct writes). */\n\tconst applyChange = async (\n\t\ttable: string,\n\t\tchange: RowChange<unknown>,\n\t\tshouldBroadcast = true\n\t) => {\n\t\tversion += 1;\n\t\tconst changeVersion = version;\n\t\tconst at = Date.now();\n\t\tlogChange(changeVersion, {\n\t\t\tversion: changeVersion,\n\t\t\ttable,\n\t\t\tchange,\n\t\t\tat,\n\t\t\torigin: instanceId,\n\t\t\toriginVersion: changeVersion\n\t\t});\n\t\temitActivity({\n\t\t\ttype: 'change',\n\t\t\tat,\n\t\t\ttable,\n\t\t\top: change.op,\n\t\t\tversion: changeVersion\n\t\t});\n\t\t// Collect, then emit once at the end: reactive re-runs are async, and\n\t\t// emitting before they finish would let the transport flush a partial frame.\n\t\tconst emissions: [ActiveSubscription, ViewDiff<unknown>][] = [];\n\t\tfor (const subscription of subscriptionsForTable(table)) {\n\t\t\tconst diff = await subscriptionDiff(subscription, table, change);\n\t\t\tif (!isEmptyViewDiff(diff)) {\n\t\t\t\temissions.push([subscription, diff]);\n\t\t\t}\n\t\t}\n\t\temissions.push(\n\t\t\t...(await reactivePairs([\n\t\t\t\t{ table, key: changedKeyFor(table, change), row: change.row }\n\t\t\t]))\n\t\t);\n\t\temissions.push(...searchPairs([{ table, change }]));\n\t\tconst cursorForBatch = currentCursor();\n\t\tfor (const [subscription, diff] of emissions) {\n\t\t\tsubscription.onDiff(diff, changeVersion, cursorForBatch);\n\t\t}\n\t\tif (shouldBroadcast) {\n\t\t\tbroadcast([{ table, change }], changeVersion);\n\t\t}\n\t};\n\n\t/**\n\t * Apply a set of changes atomically: one version bump for the whole batch and\n\t * a single net-merged diff per affected subscription. Used by mutations so a\n\t * client never renders a torn intermediate state mid-mutation.\n\t */\n\tconst applyChangeBatch = async (\n\t\tchanges: { table: string; change: RowChange<unknown> }[],\n\t\tshouldBroadcast = true,\n\t\t/**\n\t\t * 1.17.0 — peer-relayed batches override the change-log entry's\n\t\t * `origin` + `originVersion` so a cross-instance client cursor can\n\t\t * later match the entry. Local batches leave this `undefined` and\n\t\t * the entry inherits the engine's own identity.\n\t\t */\n\t\tpeerOrigin?: { origin: string; originVersion: number }\n\t) => {\n\t\tif (changes.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tversion += 1;\n\t\tconst batchVersion = version;\n\t\tconst perSubscription = new Map<\n\t\t\tActiveSubscription,\n\t\t\tViewDiff<unknown>[]\n\t\t>();\n\t\tconst reactiveChanges: ReactiveChange[] = [];\n\t\tconst batchAt = Date.now();\n\t\t// 1.17.0: peer-relayed batches override origin/originVersion via\n\t\t// `peerOrigin` (set when applyChangeBatch is called from the cluster\n\t\t// subscribe path). Defaults to this engine's identity.\n\t\tconst batchOrigin = peerOrigin?.origin ?? instanceId;\n\t\tconst batchOriginVersion = peerOrigin?.originVersion ?? batchVersion;\n\t\tfor (const { table, change } of changes) {\n\t\t\tlogChange(batchVersion, {\n\t\t\t\tversion: batchVersion,\n\t\t\t\ttable,\n\t\t\t\tchange,\n\t\t\t\tat: batchAt,\n\t\t\t\torigin: batchOrigin,\n\t\t\t\toriginVersion: batchOriginVersion\n\t\t\t});\n\t\t\temitActivity({\n\t\t\t\ttype: 'change',\n\t\t\t\tat: batchAt,\n\t\t\t\ttable,\n\t\t\t\top: change.op,\n\t\t\t\tversion: batchVersion\n\t\t\t});\n\t\t\treactiveChanges.push({\n\t\t\t\ttable,\n\t\t\t\tkey: changedKeyFor(table, change),\n\t\t\t\trow: change.row\n\t\t\t});\n\t\t\tfor (const subscription of subscriptionsForTable(table)) {\n\t\t\t\t// Apply in order to keep operator state correct; collect to merge.\n\t\t\t\tconst diff = await subscriptionDiff(\n\t\t\t\t\tsubscription,\n\t\t\t\t\ttable,\n\t\t\t\t\tchange\n\t\t\t\t);\n\t\t\t\tconst list = perSubscription.get(subscription);\n\t\t\t\tif (list === undefined) {\n\t\t\t\t\tperSubscription.set(subscription, [diff]);\n\t\t\t\t} else {\n\t\t\t\t\tlist.push(diff);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Gather all emissions before sending any, so the whole batch — view diffs\n\t\t// and reactive re-runs (async) — leaves as one coalesced frame.\n\t\tconst emissions: [ActiveSubscription, ViewDiff<unknown>][] = [];\n\t\tfor (const [subscription, diffs] of perSubscription) {\n\t\t\tconst merged =\n\t\t\t\tdiffs.length === 1\n\t\t\t\t\t? diffs[0]!\n\t\t\t\t\t: mergeViewDiffs(diffs, subscription.key);\n\t\t\tif (!isEmptyViewDiff(merged)) {\n\t\t\t\temissions.push([subscription, merged]);\n\t\t\t}\n\t\t}\n\t\temissions.push(...(await reactivePairs(reactiveChanges)));\n\t\temissions.push(...searchPairs(changes));\n\t\tconst cursorForBatch = currentCursor();\n\t\tfor (const [subscription, diff] of emissions) {\n\t\t\tsubscription.onDiff(diff, batchVersion, cursorForBatch);\n\t\t}\n\t\tif (shouldBroadcast) {\n\t\t\tbroadcast(changes, batchVersion);\n\t\t}\n\t};\n\n\t/**\n\t * Normalize a `since` value (number or cursor string) into a per-origin\n\t * version vector. A bare `number` is treated as legacy 1.16- form — the\n\t * version of THIS instance. A cursor string is the 1.17.0+ multi-origin\n\t * shape encoded by `currentCursor()`.\n\t */\n\tconst normalizeSince = (since: number | string): Record<string, number> | null => {\n\t\tif (typeof since === 'number') {\n\t\t\treturn { [instanceId]: since };\n\t\t}\n\t\treturn decodeCursor(since);\n\t};\n\n\t/**\n\t * Can we replay `(since, now]` from the log for `tables`? With a cursor,\n\t * this is a per-origin coverage check — every entry the client hasn't\n\t * seen MUST be present in our log. Pre-1.16 `number` form matches when\n\t * the local log covers `(since.version, now]`. Returns `false` for\n\t * non-incremental subs (refetch/join/graph/search), since those can't be\n\t * replayed precisely from a row-change log.\n\t */\n\tconst canResume = (since: number | string, incremental: boolean): boolean => {\n\t\tif (!incremental) {\n\t\t\treturn false;\n\t\t}\n\t\tconst sinceVec = normalizeSince(since);\n\t\tif (sinceVec === null) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Walk the log backwards: every entry with `origin === O` and\n\t\t// `originVersion > sinceVec[O]` MUST appear in the log. If the log\n\t\t// has been trimmed past any such entry, we can't catch up.\n\t\t// Per-origin: for each origin O we've seen, check that the oldest\n\t\t// entry with that origin is no newer than `sinceVec[O] + 1`. For\n\t\t// an unknown origin, we fall back to \"no coverage\" (caller gets a\n\t\t// snapshot, just like pre-1.17 behavior).\n\t\tconst oldestPerOrigin = new Map<string, number>();\n\t\tfor (const entry of changeLog) {\n\t\t\tconst current = oldestPerOrigin.get(entry.origin);\n\t\t\tif (current === undefined || entry.originVersion < current) {\n\t\t\t\toldestPerOrigin.set(entry.origin, entry.originVersion);\n\t\t\t}\n\t\t}\n\n\t\t// Log-wide watermark: the smallest version still in the log. If this\n\t\t// is past `lastSeen + 1`, ANY entries between the cursor and oldestLogVersion\n\t\t// were trimmed (regardless of origin).\n\t\tconst oldestLogVersion = changeLog[0]?.version;\n\t\tfor (const [origin, lastSeen] of Object.entries(sinceVec)) {\n\t\t\t// Special case: if we've never seen any entry from this origin,\n\t\t\t// but the client claims to have seen up to `lastSeen` from it,\n\t\t\t// we DEFINITELY can't reconstruct — snapshot it.\n\t\t\tif (origin === instanceId) {\n\t\t\t\t// Local origin: standard check.\n\t\t\t\tif (lastSeen >= version) continue; // nothing newer\n\t\t\t\tconst oldestLocal = oldestPerOrigin.get(instanceId);\n\t\t\t\t// If we have local entries, walk them: they must reach back\n\t\t\t\t// to lastSeen + 1.\n\t\t\t\tif (oldestLocal !== undefined) {\n\t\t\t\t\tif (oldestLocal > lastSeen + 1) return false;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// No local entries — the version bumps since mint were all\n\t\t\t\t// from peer broadcasts. Resume is safe ONLY if the log itself\n\t\t\t\t// hasn't been trimmed past the mint point (otherwise some\n\t\t\t\t// local entries existed but were retired).\n\t\t\t\tif (\n\t\t\t\t\toldestLogVersion !== undefined &&\n\t\t\t\t\toldestLogVersion > lastSeen + 1\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Peer origin: same check against the peer's entries.\n\t\t\t\tconst oldestPeer = oldestPerOrigin.get(origin);\n\t\t\t\tif (oldestPeer === undefined) {\n\t\t\t\t\t// We've never logged any change from this peer. If the client\n\t\t\t\t\t// has seen entries from this peer, we can't help.\n\t\t\t\t\tif (lastSeen > 0) return false;\n\t\t\t\t} else if (oldestPeer > lastSeen + 1) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t};\n\n\t/**\n\t * Build a catch-up diff from the log for one subscription (last op per\n\t * key wins). Multi-origin aware (1.17.0+): walks every entry whose\n\t * `(origin, originVersion)` is newer than the client's last-seen for\n\t * that origin.\n\t */\n\tconst buildCatchup = (\n\t\tsince: number | string,\n\t\ttables: string[],\n\t\tkey: (row: unknown) => RowKey,\n\t\tmatch: (row: unknown) => boolean\n\t): ViewDiff<unknown> => {\n\t\tconst sinceVec = normalizeSince(since) ?? {};\n\t\tconst latest = new Map<\n\t\t\tRowKey,\n\t\t\t{ op: 'upsert' | 'remove'; row: unknown }\n\t\t>();\n\t\tfor (const entry of changeLog) {\n\t\t\tif (!tables.includes(entry.table)) continue;\n\t\t\t// Skip entries the client has already seen for this origin.\n\t\t\tconst lastSeen = sinceVec[entry.origin];\n\t\t\tif (lastSeen !== undefined && entry.originVersion <= lastSeen) continue;\n\t\t\tconst row = entry.change.row;\n\t\t\tconst present =\n\t\t\t\tentry.change.op !== 'delete' && match(row)\n\t\t\t\t\t? 'upsert'\n\t\t\t\t\t: 'remove';\n\t\t\tlatest.set(key(row), { op: present, row });\n\t\t}\n\t\tconst changed: unknown[] = [];\n\t\tconst removed: unknown[] = [];\n\t\tfor (const { op, row } of latest.values()) {\n\t\t\t(op === 'upsert' ? changed : removed).push(row);\n\t\t}\n\t\treturn { added: [], removed, changed };\n\t};\n\n\tconst subscribeJoin = async (\n\t\tcollection: string,\n\t\tdefinition: JoinCollectionDefinition<\n\t\t\tunknown,\n\t\t\tunknown,\n\t\t\tunknown,\n\t\t\tunknown,\n\t\t\tunknown\n\t\t>,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\tonDiff: OnDiff,\n\t\tset: Set<ActiveSubscription>\n\t): Promise<Subscription<unknown>> => {\n\t\tif (definition.authorize !== undefined) {\n\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\tif (!allowed) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst { left, right } = definition;\n\t\tconst op = createEquiJoin<unknown, unknown, unknown>({\n\t\t\tleftKey: left.key,\n\t\t\trightKey: right.key,\n\t\t\tleftOn: left.on,\n\t\t\trightOn: right.on,\n\t\t\tselect: definition.select\n\t\t});\n\t\top.hydrate(\n\t\t\t[...(await left.hydrate(params, ctx))],\n\t\t\t[...(await right.hydrate(params, ctx))]\n\t\t);\n\t\tconst atVersion = version;\n\n\t\tconst subscription: ActiveSubscription = {\n\t\t\tkind: 'join',\n\t\t\tcollection,\n\t\t\tjoin: {\n\t\t\t\top,\n\t\t\t\tleftTable: left.table,\n\t\t\t\trightTable: right.table,\n\t\t\t\tleftMatch: left.match\n\t\t\t\t\t? (row) => left.match!(row, params, ctx)\n\t\t\t\t\t: undefined,\n\t\t\t\trightMatch: right.match\n\t\t\t\t\t? (row) => right.match!(row, params, ctx)\n\t\t\t\t\t: undefined\n\t\t\t},\n\t\t\tkey: definition.key as (row: unknown) => RowKey,\n\t\t\tonDiff\n\t\t};\n\t\tset.add(subscription);\n\n\t\treturn {\n\t\t\tinitial: op.rows(),\n\t\t\tcursor: currentCursor(),\n\t\t\tversion: atVersion,\n\t\t\tunsubscribe: () => {\n\t\t\t\tset.delete(subscription);\n\t\t\t}\n\t\t};\n\t};\n\n\tconst subscribeGraph = async (\n\t\tcollection: string,\n\t\tdefinition: GraphCollectionDefinition<unknown, unknown, unknown>,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\tonDiff: OnDiff,\n\t\tset: Set<ActiveSubscription>\n\t): Promise<Subscription<unknown>> => {\n\t\tif (definition.authorize !== undefined) {\n\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\tif (!allowed) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst instance = definition.query.instantiate(params, ctx);\n\t\tconst initial = await instance.hydrate();\n\t\tconst atVersion = version;\n\t\tconst subscription: ActiveSubscription = {\n\t\t\tkind: 'graph',\n\t\t\tcollection,\n\t\t\tinstance,\n\t\t\tkey: definition.key as (row: unknown) => RowKey,\n\t\t\tonDiff\n\t\t};\n\t\tset.add(subscription);\n\t\treturn {\n\t\t\tinitial,\n\t\t\tcursor: currentCursor(),\n\t\t\tversion: atVersion,\n\t\t\tunsubscribe: () => {\n\t\t\t\tset.delete(subscription);\n\t\t\t}\n\t\t};\n\t};\n\n\tconst subscribeReactive = async (\n\t\tcollection: string,\n\t\tdefinition: ReactiveQueryDefinition<unknown, unknown, unknown>,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\tonDiff: OnDiff,\n\t\tset: Set<ActiveSubscription>\n\t): Promise<Subscription<unknown>> => {\n\t\tif (definition.authorize !== undefined) {\n\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\tif (!allowed) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\t// Each run gets a fresh read set; the handle records tables + row keys read.\n\t\tconst rerun = async () => {\n\t\t\tconst readTables = new Set<string>();\n\t\t\tconst readKeys = new Set<string>();\n\t\t\tconst rangeDeps: RangeDep[] = [];\n\t\t\tconst db = makeReadHandle(ctx, readTables, readKeys, rangeDeps);\n\t\t\tconst rows = [...(await definition.run({ ctx, db, params }))];\n\t\t\treturn { rangeDeps, readKeys, readTables, rows };\n\t\t};\n\t\tconst rerunKey = stableSubKey(collection, params, ctx);\n\t\t// Cross-client cache hit (1.3+): a previous subscriber with the same\n\t\t// (collection, params, ctx) ran the query body recently and its\n\t\t// result is still valid (no overlapping write since). Reuse it\n\t\t// instead of hitting the DB again. Cache misses fall through to\n\t\t// `rerun()` and populate the cache for the next subscriber.\n\t\tconst cached = readCacheEntry(rerunKey);\n\t\tconst first =\n\t\t\tcached !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\trangeDeps: cached.rangeDeps,\n\t\t\t\t\t\treadKeys: cached.readKeys,\n\t\t\t\t\t\treadTables: cached.readTables,\n\t\t\t\t\t\trows: cached.rows\n\t\t\t\t\t}\n\t\t\t\t: await rerun();\n\t\tif (cached === undefined) {\n\t\t\twriteCacheEntry({\n\t\t\t\texpiresAt: Date.now() + reactiveCacheTtlMs,\n\t\t\t\trangeDeps: first.rangeDeps,\n\t\t\t\treadKeys: first.readKeys,\n\t\t\t\treadTables: first.readTables,\n\t\t\t\trerunKey,\n\t\t\t\trows: first.rows,\n\t\t\t\tversion\n\t\t\t});\n\t\t}\n\t\tconst current = new Map<RowKey, unknown>();\n\t\tfor (const row of first.rows) {\n\t\t\tcurrent.set(definition.key(row), row);\n\t\t}\n\t\tconst atVersion = version;\n\t\tconst subscription: ReactiveSub = {\n\t\t\tkind: 'reactive',\n\t\t\tcollection,\n\t\t\tkey: definition.key,\n\t\t\trerun,\n\t\t\trerunKey,\n\t\t\tcurrent,\n\t\t\treadTables: first.readTables,\n\t\t\treadKeys: first.readKeys,\n\t\t\trangeDeps: first.rangeDeps,\n\t\t\tonDiff\n\t\t};\n\t\tset.add(subscription);\n\t\treactiveSubs.add(subscription);\n\t\treturn {\n\t\t\tinitial: first.rows,\n\t\t\tcursor: currentCursor(),\n\t\t\tversion: atVersion,\n\t\t\tunsubscribe: () => {\n\t\t\t\tset.delete(subscription);\n\t\t\t\treactiveSubs.delete(subscription);\n\t\t\t}\n\t\t};\n\t};\n\n\tconst subscribeSearch = async (\n\t\tcollection: string,\n\t\tdefinition: SearchCollectionDefinition<unknown, unknown, unknown>,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\tonDiff: OnDiff,\n\t\tset: Set<ActiveSubscription>\n\t): Promise<Subscription<unknown>> => {\n\t\t// The subscription params are the query (a string for text, a vector for\n\t\t// similarity).\n\t\tconst query = params;\n\t\tif (definition.authorize !== undefined) {\n\t\t\tconst allowed = await definition.authorize(query, ctx);\n\t\t\tif (!allowed) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst entry = await ensureSearchIndex(definition);\n\t\tconst limit = definition.limit ?? 20;\n\t\tconst readRule = readRuleFor(definition.table);\n\t\t// Re-rank: top-K from the (shared, live) index, scoped by the read rule,\n\t\t// each row tagged with its score so the client can sort by relevance.\n\t\tconst rerun = (): unknown[] => {\n\t\t\tconst candidates = entry.index.search(\n\t\t\t\tquery,\n\t\t\t\treadRule ? limit * 5 : limit\n\t\t\t);\n\t\t\tconst visible = readRule\n\t\t\t\t? candidates.filter((hit) => readRule(ctx, hit.row))\n\t\t\t\t: candidates;\n\t\t\treturn visible.slice(0, limit).map((hit) => ({\n\t\t\t\t...(hit.row as Record<string, unknown>),\n\t\t\t\t[SEARCH_SCORE_FIELD]: hit.score\n\t\t\t}));\n\t\t};\n\t\tconst initial = rerun();\n\t\tconst current = new Map<RowKey, unknown>();\n\t\tfor (const row of initial) {\n\t\t\tcurrent.set(definition.key(row), row);\n\t\t}\n\t\tconst atVersion = version;\n\t\tconst subscription: Extract<ActiveSubscription, { kind: 'search' }> = {\n\t\t\tkind: 'search',\n\t\t\tcollection,\n\t\t\tkey: definition.key,\n\t\t\trerun,\n\t\t\tcurrent,\n\t\t\tonDiff\n\t\t};\n\t\tset.add(subscription);\n\t\tsearchSubs.add(subscription);\n\t\treturn {\n\t\t\tinitial,\n\t\t\tcursor: currentCursor(),\n\t\t\tversion: atVersion,\n\t\t\tunsubscribe: () => {\n\t\t\t\tset.delete(subscription);\n\t\t\t\tsearchSubs.delete(subscription);\n\t\t\t}\n\t\t};\n\t};\n\n\tconst engine: SyncEngine = {\n\t\tregister: (collection) => {\n\t\t\tregistry.set(collection.name, collection);\n\t\t\tfor (const table of collection.tables ?? [collection.name]) {\n\t\t\t\taddTableIndex(table, collection.name);\n\t\t\t}\n\t\t},\n\n\t\tregisterJoin: (collection) => {\n\t\t\tregistry.set(collection.name, collection);\n\t\t\taddTableIndex(collection.left.table, collection.name);\n\t\t\taddTableIndex(collection.right.table, collection.name);\n\t\t},\n\n\t\tregisterGraph: (collection) => {\n\t\t\tregistry.set(collection.name, collection);\n\t\t\tfor (const table of collection.query.tables()) {\n\t\t\t\taddTableIndex(table, collection.name);\n\t\t\t}\n\t\t},\n\n\t\tregisterSearch: (collection) => {\n\t\t\t// Like reactive: not in tableIndex — its index is driven directly by\n\t\t\t// searchPairs off the change feed.\n\t\t\tregistry.set(collection.name, collection);\n\t\t},\n\n\t\tsubscribe: async ({ collection, params, ctx, onDiff, since, signal }) => {\n\t\t\t// 1.21.0: wrap subscribe setup in a span. The Subscription\n\t\t\t// lives past `subscribe()` returning — the span only covers\n\t\t\t// the setup cost (authorize / hydrate / view materialization),\n\t\t\t// not the ongoing reactive lifetime.\n\t\t\tconst subscribeSpan = tracer.startSpan('sync.subscribe', {\n\t\t\t\tattributes: {\n\t\t\t\t\t[ABS_ATTRS.engineId]: instanceId,\n\t\t\t\t\t[ABS_ATTRS.collection]: collection\n\t\t\t\t}\n\t\t\t});\n\t\t\ttry {\n\t\t\t// (1.15.0) Cheap up-front check — if the consumer already aborted\n\t\t\t// before we got here, throw before any side effect (no authorize,\n\t\t\t// no hydrate, no view materialization).\n\t\t\tcheckAborted(signal);\n\n\t\t\tconst registered = registry.get(collection);\n\t\t\tif (registered === undefined) {\n\t\t\t\tthrow new Error(`Unknown collection \"${collection}\"`);\n\t\t\t}\n\n\t\t\t// (1.20.1) Per-tenant cap. Acquired BEFORE authorize/hydrate/any\n\t\t\t// state allocation. If subscribe throws between here and the\n\t\t\t// successful return (auth rejection, abort, schema error, etc.)\n\t\t\t// we release in the `catch` below — otherwise the wrapped\n\t\t\t// `unsubscribe` is the release path.\n\t\t\tconst tenantSlot = acquireSubscriptionSlot(ctx, { collection });\n\t\t\tlet slotHandedOff = false;\n\t\t\ttry {\n\n\t\t\tconst typedOnDiff = onDiff as OnDiff;\n\t\t\tconst subscribeSet = subsFor(collection);\n\n\t\t\t// Wrap the eventual return so we (a) re-check signal after the\n\t\t\t// async setup (catches mid-flight aborts), (b) auto-call\n\t\t\t// unsubscribe when signal fires after the subscription is live,\n\t\t\t// and (c) decrement the tenant's active-sub count idempotently\n\t\t\t// when unsubscribe runs.\n\t\t\tconst wrapReturn = <T>(sub: Subscription<T>): Subscription<T> => {\n\t\t\t\tcheckAborted(signal);\n\t\t\t\tconst innerUnsubscribe = sub.unsubscribe;\n\t\t\t\tlet released = false;\n\t\t\t\tconst wrappedUnsubscribe = (): void => {\n\t\t\t\t\tif (released) return;\n\t\t\t\t\treleased = true;\n\t\t\t\t\treleaseSubscriptionSlot(tenantSlot);\n\t\t\t\t\tinnerUnsubscribe();\n\t\t\t\t};\n\t\t\t\tconst wrapped = { ...sub, unsubscribe: wrappedUnsubscribe };\n\t\t\t\tlinkAbortToUnsubscribe(signal, wrappedUnsubscribe);\n\t\t\t\tslotHandedOff = true;\n\t\t\t\treturn wrapped;\n\t\t\t};\n\n\t\t\tconst registeredKind = (registered as { kind?: string }).kind;\n\t\t\tif (registeredKind === 'join') {\n\t\t\t\tconst joined = await subscribeJoin(\n\t\t\t\t\tcollection,\n\t\t\t\t\tregistered as JoinCollectionDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t\tparams,\n\t\t\t\t\tctx,\n\t\t\t\t\ttypedOnDiff,\n\t\t\t\t\tsubscribeSet\n\t\t\t\t);\n\t\t\t\treturn wrapReturn(joined) as Subscription<never>;\n\t\t\t}\n\t\t\tif (registeredKind === 'graph') {\n\t\t\t\tconst graphed = await subscribeGraph(\n\t\t\t\t\tcollection,\n\t\t\t\t\tregistered as GraphCollectionDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t\tparams,\n\t\t\t\t\tctx,\n\t\t\t\t\ttypedOnDiff,\n\t\t\t\t\tsubscribeSet\n\t\t\t\t);\n\t\t\t\treturn wrapReturn(graphed) as Subscription<never>;\n\t\t\t}\n\t\t\tif (registeredKind === 'reactive') {\n\t\t\t\tconst reactived = await subscribeReactive(\n\t\t\t\t\tcollection,\n\t\t\t\t\tregistered as ReactiveQueryDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t\tparams,\n\t\t\t\t\tctx,\n\t\t\t\t\ttypedOnDiff,\n\t\t\t\t\tsubscribeSet\n\t\t\t\t);\n\t\t\t\treturn wrapReturn(reactived) as Subscription<never>;\n\t\t\t}\n\t\t\tif (registeredKind === 'search') {\n\t\t\t\tconst searched = await subscribeSearch(\n\t\t\t\t\tcollection,\n\t\t\t\t\tregistered as SearchCollectionDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t\tparams,\n\t\t\t\t\tctx,\n\t\t\t\t\ttypedOnDiff,\n\t\t\t\t\tsubscribeSet\n\t\t\t\t);\n\t\t\t\treturn wrapReturn(searched) as Subscription<never>;\n\t\t\t}\n\t\t\tconst definition = registered as CollectionDefinition<\n\t\t\t\tunknown,\n\t\t\t\tunknown,\n\t\t\t\tunknown\n\t\t\t>;\n\n\t\t\tif (definition.authorize !== undefined) {\n\t\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\t\tif (!allowed) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst key = definition.key ?? defaultKey;\n\t\t\tconst match = definition.match;\n\t\t\tconst tables = definition.tables ?? [collection];\n\t\t\t// Declarative read rule + schema migration apply to single-table\n\t\t\t// collections (their rows are that table's rows); join/aggregate\n\t\t\t// collections scope via match.\n\t\t\tconst scopedTable = tables.length === 1 ? tables[0]! : undefined;\n\t\t\tconst readRule =\n\t\t\t\tscopedTable !== undefined\n\t\t\t\t\t? readRuleFor(scopedTable)\n\t\t\t\t\t: undefined;\n\t\t\t// Migrate the DB result to the current shape, then filter it through the\n\t\t\t// read rule — so the initial snapshot and the refetch fallback are\n\t\t\t// always current-shape and never include a row the caller can't see.\n\t\t\tconst rehydrate = async () => {\n\t\t\t\tconst raw = [...(await definition.hydrate(params, ctx))];\n\t\t\t\tconst rows =\n\t\t\t\t\tscopedTable !== undefined\n\t\t\t\t\t\t? raw.map((row) => migrateRow(scopedTable, row))\n\t\t\t\t\t\t: raw;\n\t\t\t\treturn readRule\n\t\t\t\t\t? rows.filter((row) => readRule(ctx, row))\n\t\t\t\t\t: rows;\n\t\t\t};\n\t\t\t// Incremental matching only applies to single-table collections; a\n\t\t\t// join/aggregate spanning tables can't match a single row, so it uses\n\t\t\t// the refetch fallback.\n\t\t\tconst incremental = match !== undefined && tables.length === 1;\n\t\t\t// Fold the read rule into the incremental predicate (also used by the\n\t\t\t// catch-up builder), so an unreadable row never enters the view.\n\t\t\tconst boundMatch = incremental\n\t\t\t\t? (row: unknown) =>\n\t\t\t\t\t\tmatch(row, params, ctx) &&\n\t\t\t\t\t\t(readRule ? readRule(ctx, row) : true)\n\t\t\t\t: () => true;\n\t\t\tconst view = createMaterializedView<unknown>({\n\t\t\t\tkey,\n\t\t\t\tmatch: boundMatch\n\t\t\t});\n\n\t\t\t// Resume from the log when possible (catch-up diff); else send a\n\t\t\t// snapshot. The view is hydrated either way so future changes match.\n\t\t\tconst resuming =\n\t\t\t\tsince !== undefined && canResume(since, incremental);\n\t\t\tview.hydrate([...(await rehydrate())]);\n\t\t\tconst atVersion = version;\n\n\t\t\tconst subscription: ActiveSubscription = {\n\t\t\t\tkind: 'view',\n\t\t\t\tcollection,\n\t\t\t\tview,\n\t\t\t\tincremental,\n\t\t\t\trehydrate,\n\t\t\t\tkey,\n\t\t\t\tonDiff: typedOnDiff\n\t\t\t};\n\t\t\tsubscribeSet.add(subscription);\n\n\t\t\tconst unsubscribe = () => {\n\t\t\t\tsubscribeSet.delete(subscription);\n\t\t\t};\n\n\t\t\tif (resuming) {\n\t\t\t\treturn wrapReturn({\n\t\t\t\t\tinitial: [],\n\t\t\t\t\tcatchup: buildCatchup(\n\t\t\t\t\t\tsince,\n\t\t\t\t\t\ttables,\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tboundMatch\n\t\t\t\t\t) as ViewDiff<never>,\n\t\t\t\t\tcursor: currentCursor(),\n\t\t\t\t\tversion: atVersion,\n\t\t\t\t\tunsubscribe\n\t\t\t\t}) as Subscription<never>;\n\t\t\t}\n\t\t\treturn wrapReturn({\n\t\t\t\tinitial: view.rows() as never[],\n\t\t\t\tcursor: currentCursor(),\n\t\t\t\tversion: atVersion,\n\t\t\t\tunsubscribe\n\t\t\t}) as Subscription<never>;\n\t\t\t} catch (error) {\n\t\t\t\t// (1.20.1) If anything between acquire and the successful\n\t\t\t\t// return throws (authorize, abort, schema error, etc.),\n\t\t\t\t// release the tenant slot so the cap doesn't leak by one\n\t\t\t\t// per failed call.\n\t\t\t\tif (!slotHandedOff) releaseSubscriptionSlot(tenantSlot);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\t} catch (spanError) {\n\t\t\t\t// 1.21.0: outer span wrap — re-throw, recording any\n\t\t\t\t// failure (subscribe-time errors are common and worth\n\t\t\t\t// surfacing).\n\t\t\t\tsubscribeSpan.recordException(spanError);\n\t\t\t\tsubscribeSpan.setStatus({\n\t\t\t\t\tcode: 2 /* SpanStatusCode.ERROR */,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\tspanError instanceof Error\n\t\t\t\t\t\t\t? spanError.message\n\t\t\t\t\t\t\t: String(spanError)\n\t\t\t\t});\n\t\t\t\tthrow spanError;\n\t\t\t} finally {\n\t\t\t\tsubscribeSpan.end();\n\t\t\t}\n\t\t},\n\n\t\thydrate: async (collection, params, ctx, options) => {\n\t\t\tconst signal = options?.signal;\n\t\t\tcheckAborted(signal);\n\t\t\tconst definition = registry.get(collection) as\n\t\t\t\t| CollectionDefinition<unknown, unknown, unknown>\n\t\t\t\t| undefined;\n\t\t\tif (definition === undefined) {\n\t\t\t\tthrow new Error(`Unknown collection \"${collection}\"`);\n\t\t\t}\n\t\t\tif (definition.authorize !== undefined) {\n\t\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\t\tcheckAborted(signal);\n\t\t\t\tif (!allowed) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t`hydrate collection \"${collection}\"`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst raw = [...(await definition.hydrate(params, ctx))];\n\t\t\tcheckAborted(signal);\n\t\t\tconst tables = definition.tables ?? [collection];\n\t\t\tconst scopedTable = tables.length === 1 ? tables[0]! : undefined;\n\t\t\tconst rows =\n\t\t\t\tscopedTable !== undefined\n\t\t\t\t\t? raw.map((row) => migrateRow(scopedTable, row))\n\t\t\t\t\t: raw;\n\t\t\tconst readRule =\n\t\t\t\tscopedTable !== undefined\n\t\t\t\t\t? readRuleFor(scopedTable)\n\t\t\t\t\t: undefined;\n\t\t\treturn readRule ? rows.filter((row) => readRule(ctx, row)) : rows;\n\t\t},\n\n\t\tapplyChange: (table, change) =>\n\t\t\tapplyChange(table, change as RowChange<unknown>),\n\n\t\tconnectSource: async (source) => {\n\t\t\tawait source.start((table, change) => applyChange(table, change));\n\t\t\treturn async () => {\n\t\t\t\tawait source.stop();\n\t\t\t};\n\t\t},\n\n\t\tconnectCluster: async (bus) => {\n\t\t\tconst unsubscribe = await bus.subscribe((message) => {\n\t\t\t\t// Ignore our own broadcasts; apply peers' changes locally without\n\t\t\t\t// re-broadcasting (that would loop).\n\t\t\t\tif (message.origin === instanceId) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// 1.17.0 — log peer changes with their origin + originVersion\n\t\t\t\t// so a client carrying a cross-instance cursor can resume\n\t\t\t\t// against them. Pre-1.17 buses that don't carry originVersion\n\t\t\t\t// default to 0 (any cross-instance resume falls back to a\n\t\t\t\t// snapshot — matches pre-1.17 behavior exactly).\n\t\t\t\tvoid applyChangeBatch(message.changes, false, {\n\t\t\t\t\torigin: message.origin,\n\t\t\t\t\toriginVersion: message.originVersion ?? 0\n\t\t\t\t});\n\t\t\t});\n\t\t\tclusterBus = bus;\n\n\t\t\treturn async () => {\n\t\t\t\tclusterBus = undefined;\n\t\t\t\tawait unsubscribe();\n\t\t\t};\n\t\t},\n\n\t\tsubscriptionCount: (collection) => {\n\t\t\tif (collection !== undefined) {\n\t\t\t\treturn active.get(collection)?.size ?? 0;\n\t\t\t}\n\t\t\tlet total = 0;\n\t\t\tfor (const set of active.values()) {\n\t\t\t\ttotal += set.size;\n\t\t\t}\n\t\t\treturn total;\n\t\t},\n\n\t\tregisterMutation: (mutation) => {\n\t\t\tif (\n\t\t\t\tmutation.handler === undefined &&\n\t\t\t\tmutation.sandboxedHandler === undefined\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Mutation \"${mutation.name}\" must define either \\`handler\\` or \\`sandboxedHandler\\``\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (\n\t\t\t\tmutation.handler !== undefined &&\n\t\t\t\tmutation.sandboxedHandler !== undefined\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Mutation \"${mutation.name}\" defines both \\`handler\\` and \\`sandboxedHandler\\` — pick one`\n\t\t\t\t);\n\t\t\t}\n\t\t\tmutations.set(mutation.name, mutation);\n\t\t\t// Build the sandbox runner eagerly only if we know the source —\n\t\t\t// the actual isolate spawn is still lazy (inside makeSandboxedHandler).\n\t\t\tif (mutation.sandboxedHandler !== undefined) {\n\t\t\t\tsandboxRunners.set(\n\t\t\t\t\tmutation.name,\n\t\t\t\t\tmakeSandboxedHandler(\n\t\t\t\t\t\tmutation.sandboxedHandler,\n\t\t\t\t\t\tmutation.sandbox,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbridgeFetch: options.bridgeFetch,\n\t\t\t\t\t\t\tmetricsHook:\n\t\t\t\t\t\t\t\toptions.handlerMetrics === undefined\n\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t\t\tmutationName: mutation.name,\n\t\t\t\t\t\t\t\t\t\t\tonMetrics: options.handlerMetrics\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tregisterWriter: (table, writer) => {\n\t\t\twriters.set(table, writer as TableWriter);\n\t\t},\n\n\t\tregisterReactive: (query) => {\n\t\t\tregistry.set(query.name, query);\n\t\t},\n\n\t\tregisterReader: (table, reader) => {\n\t\t\treaders.set(table, reader as TableReader);\n\t\t},\n\n\t\tregisterPermissions: (table, rules) => {\n\t\t\tpermissions.set(table, rules as TablePermissions<unknown, unknown>);\n\t\t},\n\n\t\tregisterSchema: (table, schema) => {\n\t\t\tschemas.set(table, schema as TableSchema<unknown>);\n\t\t},\n\n\t\tregisterCrdt: (table, fields) => {\n\t\t\tcrdtFields.set(\n\t\t\t\ttable,\n\t\t\t\tfields as Record<string, CrdtMergeable<unknown>>\n\t\t\t);\n\t\t\t// A ready-made merge mutation so a client needs no custom server code:\n\t\t\t// upsert the row patch — the CRDT auto-merge in makeActions folds the\n\t\t\t// declared fields into the stored row. Named \"<table>:merge\".\n\t\t\tconst name = `${table}:merge`;\n\t\t\tmutations.set(name, {\n\t\t\t\thandler: async (args, ctx, actions) => {\n\t\t\t\t\tconst existing = await readExisting(table, args, ctx);\n\t\t\t\t\treturn existing === undefined\n\t\t\t\t\t\t? actions.insert(table, args)\n\t\t\t\t\t\t: actions.update(table, args);\n\t\t\t\t},\n\t\t\t\tname\n\t\t\t} as MutationDefinition<unknown, unknown, unknown>);\n\t\t},\n\n\t\tmigrate: (table, row) => migrateRow(table, row) as typeof row,\n\n\t\trunMutation: async (name, args, ctx) => {\n\t\t\t// 1.21.0: wrap the entire mutation lifecycle in a span. Noop\n\t\t\t// when no tracerProvider was supplied.\n\t\t\tconst span = tracer.startSpan('sync.runMutation', {\n\t\t\t\tattributes: {\n\t\t\t\t\t[ABS_ATTRS.engineId]: instanceId,\n\t\t\t\t\t[ABS_ATTRS.mutation]: name\n\t\t\t\t}\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tconst mutation = mutations.get(name);\n\t\t\t\tif (mutation === undefined) {\n\t\t\t\t\tthrow new Error(`Unknown mutation \"${name}\"`);\n\t\t\t\t}\n\t\t\tif (mutation.authorize !== undefined) {\n\t\t\t\tconst allowed = await mutation.authorize(args, ctx);\n\t\t\t\tif (!allowed) {\n\t\t\t\t\tthrow new UnauthorizedError(`run mutation \"${name}\"`);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 1.20.0: gate at the entry. Wait if `mutationConcurrency`\n\t\t\t// is saturated; throw `MutationQueueOverflowError` if the\n\t\t\t// queue is also capped and full. Authorization fails before\n\t\t\t// the gate so a denied call never burns a slot.\n\t\t\tawait acquireMutationSlot();\n\n\t\t\t// Pick the handler shape: in-process function or sandboxed string\n\t\t\t// source (runs inside @absolutejs/isolated-jsc). Sandbox runner is\n\t\t\t// built lazily and pre-cached in registerMutation.\n\t\t\tconst sandboxRunner = sandboxRunners.get(name);\n\t\t\tconst invokeHandler =\n\t\t\t\tsandboxRunner !== undefined\n\t\t\t\t\t? sandboxRunner\n\t\t\t\t\t: (\n\t\t\t\t\t\t\ta: unknown,\n\t\t\t\t\t\t\tc: unknown,\n\t\t\t\t\t\t\tactions: MutationActions\n\t\t\t\t\t\t): Promise<unknown> =>\n\t\t\t\t\t\t\tPromise.resolve(\n\t\t\t\t\t\t\t\t// Non-null assertion: registerMutation guarantees one of\n\t\t\t\t\t\t\t\t// handler/sandboxedHandler is defined.\n\t\t\t\t\t\t\t\tmutation.handler!(a, c, actions)\n\t\t\t\t\t\t\t);\n\n\t\t\t// Run the handler (optionally inside the DB transaction), collecting its\n\t\t\t// changes into a fresh buffer per attempt — so a transaction that retries\n\t\t\t// or rolls back never double-emits or leaks a half-applied batch.\n\t\t\tconst runHandler = async (tx: unknown) => {\n\t\t\t\tconst { actions, buffered } = makeActions(tx, ctx, true);\n\t\t\t\tconst result = await invokeHandler(args, ctx, actions);\n\t\t\t\treturn { buffered, result };\n\t\t\t};\n\n\t\t\t// Resolve the retry policy once per call. When `mutation.retry` is\n\t\t\t// undefined we still go through the loop, but bounded to one\n\t\t\t// attempt with no backoff (cheaper than a separate code path).\n\t\t\tconst retry = mutation.retry;\n\t\t\tconst maxAttempts =\n\t\t\t\tretry === undefined ? 1 : (retry.maxAttempts ?? 5);\n\t\t\tconst isRetryable = retry?.isRetryable ?? isSerializationFailure;\n\t\t\tconst computeDelay = retry?.backoff ?? exponentialBackoff();\n\t\t\tconst maxElapsedMs = retry?.maxElapsedMs ?? 30_000;\n\t\t\tconst startedAt = Date.now();\n\n\t\t\t// Each attempt builds fresh `actions`/`buffered` via the makeActions\n\t\t\t// call inside runHandler, so a retry never inherits half-applied\n\t\t\t// buffered changes from a failed attempt. Transactions reopen too:\n\t\t\t// runInTransaction wraps each individual attempt.\n\t\t\tlet lastError: unknown;\n\t\t\tlet attemptsMade = 0;\n\t\t\ttry {\n\t\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\t\tattemptsMade = attempt;\n\t\t\t\ttry {\n\t\t\t\t\tconst { buffered, result } =\n\t\t\t\t\t\trunInTransaction !== undefined\n\t\t\t\t\t\t\t? await runInTransaction((tx) => runHandler(tx))\n\t\t\t\t\t\t\t: await runHandler(undefined);\n\t\t\t\t\tawait applyChangeBatch(buffered);\n\t\t\t\t\tmutationsCompleted += 1;\n\t\t\t\t\temitActivity({\n\t\t\t\t\t\ttype: 'mutation',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tstatus: 'ok'\n\t\t\t\t\t});\n\t\t\t\t\treturn result;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlastError = error;\n\t\t\t\t\tconst elapsedMs = Date.now() - startedAt;\n\t\t\t\t\tconst canRetry =\n\t\t\t\t\t\tattempt < maxAttempts &&\n\t\t\t\t\t\tisRetryable(error) &&\n\t\t\t\t\t\telapsedMs < maxElapsedMs;\n\t\t\t\t\tif (!canRetry) break;\n\t\t\t\t\tmutationsRetried += 1;\n\n\t\t\t\t\tconst rawDelay = computeDelay(attempt);\n\t\t\t\t\t// Cap the delay so we don't blow past maxElapsedMs while\n\t\t\t\t\t// sleeping. If the cap would be negative we're already past\n\t\t\t\t\t// the budget; treat as exhausted.\n\t\t\t\t\tconst remaining = maxElapsedMs - elapsedMs;\n\t\t\t\t\tif (remaining <= 0) break;\n\t\t\t\t\tconst delayMs = Math.max(0, Math.min(rawDelay, remaining));\n\n\t\t\t\t\temitActivity({\n\t\t\t\t\t\ttype: 'mutationRetry',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\tdelayMs,\n\t\t\t\t\t\terrorName:\n\t\t\t\t\t\t\terror instanceof Error ? error.name : 'Error',\n\t\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t\t\t: String(error)\n\t\t\t\t\t});\n\t\t\t\t\tif (delayMs > 0) {\n\t\t\t\t\t\tawait new Promise((resolve) =>\n\t\t\t\t\t\t\tsetTimeout(resolve, delayMs)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmutationsFailed += 1;\n\t\t\temitActivity({\n\t\t\t\ttype: 'mutation',\n\t\t\t\tat: Date.now(),\n\t\t\t\tname,\n\t\t\t\tstatus: 'error'\n\t\t\t});\n\t\t\t// Wrap only when we actually burned through more than one attempt\n\t\t\t// — a non-retryable first-attempt failure passes through with its\n\t\t\t// original error preserved, even if `retry` is configured.\n\t\t\tif (attemptsMade > 1) {\n\t\t\t\tthrow new RetriesExhaustedError(\n\t\t\t\t\tattemptsMade,\n\t\t\t\t\tDate.now() - startedAt,\n\t\t\t\t\tlastError\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow lastError;\n\t\t\t} finally {\n\t\t\t\treleaseMutationSlot();\n\t\t\t}\n\t\t\t} catch (spanError) {\n\t\t\t\t// 1.21.0: outer span wrap — record any throw, rethrow.\n\t\t\t\tspan.recordException(spanError);\n\t\t\t\tspan.setStatus({\n\t\t\t\t\tcode: 2 /* SpanStatusCode.ERROR */,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\tspanError instanceof Error\n\t\t\t\t\t\t\t? spanError.message\n\t\t\t\t\t\t\t: String(spanError)\n\t\t\t\t});\n\t\t\t\tthrow spanError;\n\t\t\t} finally {\n\t\t\t\tspan.end();\n\t\t\t}\n\t\t},\n\n\t\trunMutations: async (specs, ctx) => {\n\t\t\t// Empty batch: short-circuit. Don't open a DB tx for nothing —\n\t\t\t// some adapters (PG with auto-commit, MySQL with implicit\n\t\t\t// commit, etc.) count even an empty BEGIN/COMMIT as a real\n\t\t\t// transaction, which is wasteful and noisy in observability.\n\t\t\tif (specs.length === 0) return [];\n\t\t\t// Snapshot the requested mutation names up front so the\n\t\t\t// authorization + handler resolution happens BEFORE we open\n\t\t\t// the DB transaction. A typo'd name aborts cleanly without\n\t\t\t// burning a tx.\n\t\t\tconst resolved = specs.map((spec) => {\n\t\t\t\tconst mutation = mutations.get(spec.name);\n\t\t\t\tif (mutation === undefined) {\n\t\t\t\t\tthrow new Error(`Unknown mutation \"${spec.name}\"`);\n\t\t\t\t}\n\t\t\t\treturn { args: spec.args, mutation, name: spec.name };\n\t\t\t});\n\t\t\t// 1.20.0: the whole batch is one slot. Resolve names BEFORE\n\t\t\t// the gate so an unknown-mutation typo never queues.\n\t\t\tawait acquireMutationSlot();\n\n\t\t\tconst runBatch = async (tx: unknown) => {\n\t\t\t\tconst results: unknown[] = [];\n\t\t\t\tconst accumulated: {\n\t\t\t\t\ttable: string;\n\t\t\t\t\tchange: RowChange<unknown>;\n\t\t\t\t}[] = [];\n\t\t\t\tfor (const { args, mutation, name } of resolved) {\n\t\t\t\t\tif (mutation.authorize !== undefined) {\n\t\t\t\t\t\tconst allowed = await mutation.authorize(args, ctx);\n\t\t\t\t\t\tif (!allowed) {\n\t\t\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t\t\t`run mutation \"${name}\"`\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\tconst sandboxRunner = sandboxRunners.get(name);\n\t\t\t\t\tconst invokeHandler =\n\t\t\t\t\t\tsandboxRunner !== undefined\n\t\t\t\t\t\t\t? sandboxRunner\n\t\t\t\t\t\t\t: (\n\t\t\t\t\t\t\t\t\ta: unknown,\n\t\t\t\t\t\t\t\t\tc: unknown,\n\t\t\t\t\t\t\t\t\tactions: MutationActions\n\t\t\t\t\t\t\t\t): Promise<unknown> =>\n\t\t\t\t\t\t\t\t\tPromise.resolve(\n\t\t\t\t\t\t\t\t\t\tmutation.handler!(a, c, actions)\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t// Each handler gets its own `actions`/`buffered` so per-\n\t\t\t\t\t// call validation + crdt merges still work — we collect\n\t\t\t\t\t// the buffered tail into `accumulated` after each\n\t\t\t\t\t// handler returns. If the next handler throws, the\n\t\t\t\t\t// surrounding `runInTransaction` rolls everything back;\n\t\t\t\t\t// applyChangeBatch never runs.\n\t\t\t\t\tconst { actions, buffered } = makeActions(tx, ctx, true);\n\t\t\t\t\tconst result = await invokeHandler(args, ctx, actions);\n\t\t\t\t\tresults.push(result);\n\t\t\t\t\taccumulated.push(...buffered);\n\t\t\t\t}\n\t\t\t\treturn { accumulated, results };\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tconst { accumulated, results } =\n\t\t\t\t\trunInTransaction !== undefined\n\t\t\t\t\t\t? await runInTransaction((tx) => runBatch(tx))\n\t\t\t\t\t\t: await runBatch(undefined);\n\t\t\t\tawait applyChangeBatch(accumulated);\n\t\t\t\temitActivity({\n\t\t\t\t\ttype: 'mutationBatch',\n\t\t\t\t\tat: Date.now(),\n\t\t\t\t\tnames: resolved.map((entry) => entry.name),\n\t\t\t\t\tstatus: 'ok'\n\t\t\t\t});\n\t\t\t\treturn results;\n\t\t\t} catch (error) {\n\t\t\t\temitActivity({\n\t\t\t\t\ttype: 'mutationBatch',\n\t\t\t\t\tat: Date.now(),\n\t\t\t\t\tnames: resolved.map((entry) => entry.name),\n\t\t\t\t\tstatus: 'error'\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\treleaseMutationSlot();\n\t\t\t}\n\t\t},\n\n\t\tregisterSchedule: (schedule) => {\n\t\t\tschedules.set(schedule.name, schedule);\n\t\t},\n\n\t\tlistSchedules: () => [...schedules.values()],\n\n\t\trunSchedule: async (name) => {\n\t\t\tconst schedule = schedules.get(name);\n\t\t\tif (schedule === undefined) {\n\t\t\t\tthrow new Error(`Unknown schedule \"${name}\"`);\n\t\t\t}\n\t\t\t// A schedule reads unscoped and writes without permission checks (it's\n\t\t\t// trusted server code); its writes emit as one live batch like a mutation.\n\t\t\tconst runHandler = async (tx: unknown) => {\n\t\t\t\tconst { actions, buffered } = makeActions(tx, {}, false);\n\t\t\t\tconst db = makeReadHandle({}, new Set(), new Set(), [], false);\n\t\t\t\tawait schedule.run({ actions, db });\n\t\t\t\treturn buffered;\n\t\t\t};\n\n\t\t\tconst retry = schedule.retry;\n\t\t\tconst maxAttempts =\n\t\t\t\tretry === undefined ? 1 : (retry.maxAttempts ?? 5);\n\t\t\tconst isRetryable = retry?.isRetryable ?? isSerializationFailure;\n\t\t\tconst computeDelay = retry?.backoff ?? exponentialBackoff();\n\t\t\tconst maxElapsedMs = retry?.maxElapsedMs ?? 30_000;\n\t\t\tconst startedAt = Date.now();\n\n\t\t\tlet lastError: unknown;\n\t\t\tlet attemptsMade = 0;\n\t\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\t\tattemptsMade = attempt;\n\t\t\t\ttry {\n\t\t\t\t\tconst buffered =\n\t\t\t\t\t\trunInTransaction !== undefined\n\t\t\t\t\t\t\t? await runInTransaction((tx) => runHandler(tx))\n\t\t\t\t\t\t\t: await runHandler(undefined);\n\t\t\t\t\tawait applyChangeBatch(buffered);\n\t\t\t\t\temitActivity({\n\t\t\t\t\t\ttype: 'schedule',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tstatus: 'ok'\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlastError = error;\n\t\t\t\t\tconst elapsedMs = Date.now() - startedAt;\n\t\t\t\t\tconst canRetry =\n\t\t\t\t\t\tattempt < maxAttempts &&\n\t\t\t\t\t\tisRetryable(error) &&\n\t\t\t\t\t\telapsedMs < maxElapsedMs;\n\t\t\t\t\tif (!canRetry) break;\n\n\t\t\t\t\tconst rawDelay = computeDelay(attempt);\n\t\t\t\t\tconst remaining = maxElapsedMs - elapsedMs;\n\t\t\t\t\tif (remaining <= 0) break;\n\t\t\t\t\tconst delayMs = Math.max(0, Math.min(rawDelay, remaining));\n\n\t\t\t\t\temitActivity({\n\t\t\t\t\t\ttype: 'scheduleRetry',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\tdelayMs,\n\t\t\t\t\t\terrorName:\n\t\t\t\t\t\t\terror instanceof Error ? error.name : 'Error',\n\t\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t\t\t: String(error)\n\t\t\t\t\t});\n\t\t\t\t\tif (delayMs > 0) {\n\t\t\t\t\t\tawait new Promise((resolve) =>\n\t\t\t\t\t\t\tsetTimeout(resolve, delayMs)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\temitActivity({\n\t\t\t\ttype: 'schedule',\n\t\t\t\tat: Date.now(),\n\t\t\t\tname,\n\t\t\t\tstatus: 'error'\n\t\t\t});\n\t\t\tif (attemptsMade > 1) {\n\t\t\t\tthrow new RetriesExhaustedError(\n\t\t\t\t\tattemptsMade,\n\t\t\t\t\tDate.now() - startedAt,\n\t\t\t\t\tlastError\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow lastError;\n\t\t},\n\n\t\tregisterPack: (pack) => {\n\t\t\tfor (const table of pack.ownsTables) {\n\t\t\t\tconst existing = packTableOwners.get(table);\n\t\t\t\tif (existing !== undefined) {\n\t\t\t\t\tthrow new PackTableConflictError(\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\texisting,\n\t\t\t\t\t\tpack.name\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.requireDependencies === true) {\n\t\t\t\tfor (const table of pack.readsTables ?? []) {\n\t\t\t\t\tif (!readers.has(table)) {\n\t\t\t\t\t\tthrow new PackMissingDependencyError(pack.name, table);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.schemas !== undefined) {\n\t\t\t\tfor (const [table, schema] of Object.entries(pack.schemas)) {\n\t\t\t\t\tengine.registerSchema(table, schema);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.permissions !== undefined) {\n\t\t\t\tfor (const [table, rules] of Object.entries(pack.permissions)) {\n\t\t\t\t\tengine.registerPermissions(table, rules);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.readers !== undefined) {\n\t\t\t\tfor (const [table, reader] of Object.entries(pack.readers)) {\n\t\t\t\t\tengine.registerReader(table, reader);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.writers !== undefined) {\n\t\t\t\tfor (const [table, writer] of Object.entries(pack.writers)) {\n\t\t\t\t\tengine.registerWriter(table, writer);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.crdt !== undefined) {\n\t\t\t\tfor (const [table, fields] of Object.entries(pack.crdt)) {\n\t\t\t\t\tengine.registerCrdt(table, fields);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const collection of pack.collections ?? []) {\n\t\t\t\tengine.register(collection);\n\t\t\t}\n\t\t\tfor (const collection of pack.joinCollections ?? []) {\n\t\t\t\tengine.registerJoin(collection);\n\t\t\t}\n\t\t\tfor (const collection of pack.graphCollections ?? []) {\n\t\t\t\tengine.registerGraph(collection);\n\t\t\t}\n\t\t\tfor (const collection of pack.searchCollections ?? []) {\n\t\t\t\tengine.registerSearch(collection);\n\t\t\t}\n\t\t\tfor (const query of pack.reactiveQueries ?? []) {\n\t\t\t\tengine.registerReactive(query);\n\t\t\t}\n\t\t\tfor (const mutation of pack.mutations ?? []) {\n\t\t\t\tengine.registerMutation(mutation);\n\t\t\t}\n\t\t\tfor (const schedule of pack.schedules ?? []) {\n\t\t\t\tengine.registerSchedule(schedule);\n\t\t\t}\n\t\t\tfor (const table of pack.ownsTables) {\n\t\t\t\tpackTableOwners.set(table, pack.name);\n\t\t\t}\n\t\t\tregisteredPacks.push({\n\t\t\t\tname: pack.name,\n\t\t\t\tversion: pack.version,\n\t\t\t\townsTables: [...pack.ownsTables],\n\t\t\t\treadsTables: [...(pack.readsTables ?? [])]\n\t\t\t});\n\t\t},\n\n\t\tinspect: () => {\n\t\t\tconst collections = [...registry.entries()].map(([name, def]) => {\n\t\t\t\tconst kind = ((def as { kind?: CollectionKind }).kind ??\n\t\t\t\t\t'view') as CollectionKind;\n\t\t\t\tlet tables: string[] = [];\n\t\t\t\tif (kind === 'join') {\n\t\t\t\t\tconst join = def as JoinCollectionDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>;\n\t\t\t\t\ttables = [join.left.table, join.right.table];\n\t\t\t\t} else if (kind === 'graph') {\n\t\t\t\t\ttables = (\n\t\t\t\t\t\tdef as GraphCollectionDefinition<\n\t\t\t\t\t\t\tunknown,\n\t\t\t\t\t\t\tunknown,\n\t\t\t\t\t\t\tunknown\n\t\t\t\t\t\t>\n\t\t\t\t\t).query.tables();\n\t\t\t\t} else if (kind === 'search') {\n\t\t\t\t\ttables = [\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\tdef as SearchCollectionDefinition<\n\t\t\t\t\t\t\t\tunknown,\n\t\t\t\t\t\t\t\tunknown,\n\t\t\t\t\t\t\t\tunknown\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t).table\n\t\t\t\t\t];\n\t\t\t\t} else if (kind === 'view') {\n\t\t\t\t\ttables = (\n\t\t\t\t\t\tdef as CollectionDefinition<unknown, unknown, unknown>\n\t\t\t\t\t).tables ?? [name];\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tname,\n\t\t\t\t\tkind,\n\t\t\t\t\ttables,\n\t\t\t\t\tsubscriptions: active.get(name)?.size ?? 0\n\t\t\t\t};\n\t\t\t});\n\t\t\tconst DEVTOOLS_RECENT = 50;\n\t\t\treturn {\n\t\t\t\tversion,\n\t\t\t\tcollections,\n\t\t\t\tmutations: [...mutations.keys()],\n\t\t\t\tschedules: [...schedules.values()].map((schedule) => ({\n\t\t\t\t\tname: schedule.name,\n\t\t\t\t\tpattern: schedule.pattern\n\t\t\t\t})),\n\t\t\t\treaders: [...readers.keys()],\n\t\t\t\twriters: [...writers.keys()],\n\t\t\t\trecentChanges: changeLog\n\t\t\t\t\t.slice(-DEVTOOLS_RECENT)\n\t\t\t\t\t.map((entry) => ({\n\t\t\t\t\t\tversion: entry.version,\n\t\t\t\t\t\ttable: entry.table,\n\t\t\t\t\t\top: entry.change.op\n\t\t\t\t\t})),\n\t\t\t\tpacks: registeredPacks.map((pack) => ({\n\t\t\t\t\tname: pack.name,\n\t\t\t\t\tversion: pack.version,\n\t\t\t\t\townsTables: [...pack.ownsTables],\n\t\t\t\t\treadsTables: [...pack.readsTables]\n\t\t\t\t}))\n\t\t\t};\n\t\t},\n\n\t\texportChangeLog: () => ({\n\t\t\tentries: changeLog.slice(),\n\t\t\texportedAt: Date.now(),\n\t\t\tinstanceId,\n\t\t\tversion\n\t\t}),\n\n\t\timportChangeLog,\n\n\t\treplayTo: async ({ at, tables }) => {\n\t\t\t// 1.22.0: walk the bounded change log forward to targetAt,\n\t\t\t// folding each op into a per-table keyed view. Last write\n\t\t\t// wins per key. Delete removes the key.\n\t\t\tconst filterTables =\n\t\t\t\ttables !== undefined ? new Set(tables) : undefined;\n\t\t\tconst state = new Map<string, Map<RowKey, unknown>>();\n\t\t\tlet asOfVersion = 0;\n\t\t\tlet asOfAt = 0;\n\t\t\t// Truncation: the log doesn't extend back to `at`. We've\n\t\t\t// trimmed entries that may have mattered for the\n\t\t\t// reconstruction, so the result is \"state walked forward\n\t\t\t// from the OLDEST retained entry\" rather than the actual\n\t\t\t// state at `at`. Distinguishable from \"no history at all\"\n\t\t\t// (`changeLog[0]?.version === 1`).\n\t\t\tconst oldest = changeLog[0];\n\t\t\tconst truncated =\n\t\t\t\toldest !== undefined &&\n\t\t\t\toldest.version > 1 &&\n\t\t\t\toldest.at > at;\n\t\t\tfor (const entry of changeLog) {\n\t\t\t\tif (entry.at > at) break;\n\t\t\t\tif (\n\t\t\t\t\tfilterTables !== undefined &&\n\t\t\t\t\t!filterTables.has(entry.table)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tlet tableState = state.get(entry.table);\n\t\t\t\tif (tableState === undefined) {\n\t\t\t\t\ttableState = new Map();\n\t\t\t\t\tstate.set(entry.table, tableState);\n\t\t\t\t}\n\t\t\t\tconst reader = readers.get(entry.table);\n\t\t\t\tconst key =\n\t\t\t\t\treader?.key?.(entry.change.row) ??\n\t\t\t\t\t((entry.change.row as { id?: RowKey })?.id as RowKey);\n\t\t\t\tif (key === undefined) {\n\t\t\t\t\t// Without a stable key we can't apply ops idempotently\n\t\t\t\t\t// — skip silently. In practice every table the\n\t\t\t\t\t// engine has emitted changes for has a reader (the\n\t\t\t\t\t// engine's own change-emit path doesn't run without\n\t\t\t\t\t// one), so this branch is defensive.\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (entry.change.op === 'delete') {\n\t\t\t\t\ttableState.delete(key);\n\t\t\t\t} else {\n\t\t\t\t\ttableState.set(key, entry.change.row);\n\t\t\t\t}\n\t\t\t\tasOfVersion = entry.version;\n\t\t\t\tasOfAt = entry.at;\n\t\t\t}\n\t\t\tconst rows: Record<string, ReadonlyArray<unknown>> = {};\n\t\t\tfor (const [table, map] of state) {\n\t\t\t\trows[table] = [...map.values()];\n\t\t\t}\n\t\t\treturn { asOfAt, asOfVersion, rows, truncated };\n\t\t},\n\n\t\tmetrics: () => {\n\t\t\tconst now = Date.now();\n\t\t\tconst byCollection: Record<string, number> = {};\n\t\t\tlet totalSubscriptions = 0;\n\t\t\tfor (const [name, subs] of active) {\n\t\t\t\tbyCollection[name] = subs.size;\n\t\t\t\ttotalSubscriptions += subs.size;\n\t\t\t}\n\t\t\tconst oldest = changeLog[0];\n\t\t\treturn {\n\t\t\t\tat: now,\n\t\t\t\tchangeLog: {\n\t\t\t\t\tcapacity: changeLogSize,\n\t\t\t\t\tentries: changeLog.length,\n\t\t\t\t\toldestAgeMs: oldest ? now - oldest.at : null,\n\t\t\t\t\toldestVersion: oldest ? oldest.version : null,\n\t\t\t\t\tretainMs: changeLogRetainMs\n\t\t\t\t},\n\t\t\t\tmutations: {\n\t\t\t\t\tcompleted: mutationsCompleted,\n\t\t\t\t\tfailed: mutationsFailed,\n\t\t\t\t\tinFlight: mutationsInFlight,\n\t\t\t\t\tqueued: mutationsQueued,\n\t\t\t\t\tretried: mutationsRetried\n\t\t\t\t},\n\t\t\t\treactiveCache: {\n\t\t\t\t\tcapacity: reactiveCacheMax,\n\t\t\t\t\tentries: cachedReruns.size\n\t\t\t\t},\n\t\t\t\tschedules: {\n\t\t\t\t\tregistered: schedules.size\n\t\t\t\t},\n\t\t\t\tsubscriptions: {\n\t\t\t\t\tbyCollection,\n\t\t\t\t\tbyTenant: Object.fromEntries(subscriptionsByTenant),\n\t\t\t\t\ttotal: totalSubscriptions\n\t\t\t\t},\n\t\t\t\tuptimeMs: now - engineStartedAt,\n\t\t\t\tversion\n\t\t\t};\n\t\t},\n\n\t\tonActivity: (listener) => {\n\t\t\tactivityListeners.add(listener);\n\t\t\treturn () => {\n\t\t\t\tactivityListeners.delete(listener);\n\t\t\t};\n\t\t},\n\n\t\tstreamChanges: ({\n\t\t\tsince = 0,\n\t\t\tsignal,\n\t\t\tmaxBuffer = 10_000\n\t\t}: StreamChangesOptions = {}) => {\n\t\t\t// Detect a gap up front so the consumer's `for await` sees the\n\t\t\t// throw immediately rather than after the first historical entry.\n\t\t\t// (We tolerate `since === 0`, which means \"give me everything in\n\t\t\t// the log\"; the gap check only kicks in for a non-zero cursor.)\n\t\t\tconst oldest = changeLog[0];\n\t\t\tif (\n\t\t\t\tsince > 0 &&\n\t\t\t\toldest !== undefined &&\n\t\t\t\toldest.version > since + 1\n\t\t\t) {\n\t\t\t\tconst err = new MissedChangesError(since, oldest.version);\n\t\t\t\treturn {\n\t\t\t\t\t[Symbol.asyncIterator]() {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tnext: () => Promise.reject(err)\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Register the subscriber BEFORE snapshotting history so a commit\n\t\t\t// landing between the snapshot and the live tail can't be missed.\n\t\t\t// Phase 2 dedupes against `cursor`.\n\t\t\tconst buffer: LoggedChange[] = [];\n\t\t\tlet waiter: (() => void) | null = null;\n\t\t\tlet overflow = false;\n\t\t\tconst wake = () => {\n\t\t\t\tif (waiter !== null) {\n\t\t\t\t\tconst resume = waiter;\n\t\t\t\t\twaiter = null;\n\t\t\t\t\tresume();\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst subscriber = (entry: LoggedChange) => {\n\t\t\t\tif (buffer.length >= maxBuffer) {\n\t\t\t\t\toverflow = true;\n\t\t\t\t\twake();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbuffer.push(entry);\n\t\t\t\twake();\n\t\t\t};\n\t\t\tstreamSubscribers.add(subscriber);\n\n\t\t\tconst onAbort = () => wake();\n\t\t\tsignal?.addEventListener('abort', onAbort, { once: true });\n\n\t\t\tlet lastDelivered = since;\n\n\t\t\treturn {\n\t\t\t\tasync *[Symbol.asyncIterator]() {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Phase 1: historical entries. Copy the array so a\n\t\t\t\t\t\t// concurrent log.shift() (when the ring buffer rotates)\n\t\t\t\t\t\t// can't surprise us mid-iteration.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// A single batched mutation writes N rows that all\n\t\t\t\t\t\t// share one version, so we filter on `entry.version >\n\t\t\t\t\t\t// since` directly (no per-yield cursor bump — that\n\t\t\t\t\t\t// would deliver only the first row of every batch).\n\t\t\t\t\t\tconst history = [...changeLog];\n\t\t\t\t\t\tconst headVersion =\n\t\t\t\t\t\t\thistory.length > 0\n\t\t\t\t\t\t\t\t? history[history.length - 1]!.version\n\t\t\t\t\t\t\t\t: since;\n\t\t\t\t\t\tfor (const entry of history) {\n\t\t\t\t\t\t\tif (signal?.aborted) return;\n\t\t\t\t\t\t\tif (entry.version > since) {\n\t\t\t\t\t\t\t\tlastDelivered = entry.version;\n\t\t\t\t\t\t\t\tyield entry;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Phase 2: live tail. Dedupe against `headVersion`\n\t\t\t\t\t\t// (the head of the log when phase 1 finished): any\n\t\t\t\t\t\t// buffered entry with `version <= headVersion` was\n\t\t\t\t\t\t// already yielded from history (a commit between\n\t\t\t\t\t\t// subscriber registration and the snapshot lands in\n\t\t\t\t\t\t// both the buffer and the snapshot).\n\t\t\t\t\t\twhile (!signal?.aborted) {\n\t\t\t\t\t\t\twhile (buffer.length > 0) {\n\t\t\t\t\t\t\t\tconst entry = buffer.shift()!;\n\t\t\t\t\t\t\t\tif (entry.version > headVersion) {\n\t\t\t\t\t\t\t\t\tlastDelivered = entry.version;\n\t\t\t\t\t\t\t\t\tyield entry;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (overflow) {\n\t\t\t\t\t\t\t\tthrow new CdcConsumerSlowError(\n\t\t\t\t\t\t\t\t\tmaxBuffer,\n\t\t\t\t\t\t\t\t\tlastDelivered\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (signal?.aborted) return;\n\t\t\t\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\t\t\t\twaiter = resolve;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tstreamSubscribers.delete(subscriber);\n\t\t\t\t\t\tsignal?.removeEventListener('abort', onAbort);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t};\n\n\treturn engine;\n};\n",
25
+ "/**\n * Tenant migration primitives. Closes G7 from the deep-research\n * audit: \"move a tenant from engine A to engine B.\"\n *\n * The substrate offers three composable verbs:\n *\n * - **`engine.fence({ reason })`** — pause new mutations on the\n * source so its captured state stops drifting. Subscribers continue\n * to read; only `runMutation` rejects (with\n * {@link EngineFencedError}). Returns a {@link FenceHandle} with\n * `lift()` to undo.\n * - **`engine.exportSnapshot({ tables?, ctx? })`** — walk the\n * registered readers and return a portable\n * {@link EngineSnapshot} carrying the source `instanceId`,\n * `version`, and current rows per table. Cheap and synchronous from\n * the operator's POV.\n * - **`engine.importSnapshot(snapshot, options?)`** — on the target,\n * bulk-load the rows via each table's registered writer. Tracks\n * per-table progress. Returns a {@link MigrationImportResult} with\n * row counts.\n *\n * The intended choreography for a cross-region tenant move:\n *\n * ```ts\n * // ── on the source ──\n * const fence = source.fence({ reason: 'tenant-7 → us-east-2' });\n * try {\n * const snapshot = await source.exportSnapshot();\n * await transport(snapshot); // S3, message bus, etc.\n * // ── on the target ──\n * await target.importSnapshot(snapshot, {\n * onProgress: (table, done, total) =>\n * console.log(`${table}: ${done}/${total}`)\n * });\n * await cutoverDns(); // direct clients at target\n * } finally {\n * fence.lift();\n * }\n * ```\n *\n * Out of scope: out-of-band writes (CDC drivers, raw SQL) — the\n * caller is responsible for pausing those before fencing, otherwise\n * the captured snapshot drifts.\n *\n * Added in 1.24.0.\n */\n\n/**\n * Portable per-tenant state captured by\n * {@link SyncEngine.exportSnapshot}. Consumed by\n * {@link SyncEngine.importSnapshot} on the target engine.\n */\nexport type EngineSnapshot = {\n\t/** The exporting engine's `instanceId` (for audit / forensics). */\n\tsourceInstanceId: string;\n\t/** Source engine's monotonic version at snapshot time. */\n\tversion: number;\n\t/** `Date.now()` at export — used by hosts for staleness checks. */\n\texportedAt: number;\n\t/** Current rows per table, read from each table's registered reader. */\n\ttables: Record<string, ReadonlyArray<unknown>>;\n};\n\n/**\n * Returned by {@link SyncEngine.importSnapshot}.\n */\nexport type MigrationImportResult = {\n\t/** Number of tables that had at least one row imported. */\n\ttablesImported: number;\n\t/** Total rows inserted across all tables. */\n\trowsImported: number;\n\t/** Rows inserted per table. Tables with zero rows are still listed. */\n\tperTable: Record<string, number>;\n\t/**\n\t * Tables present in the snapshot that the target engine has no\n\t * registered writer for — skipped silently. Surface this to\n\t * operators so they can catch \"I forgot to register `tasks` on\n\t * the new shard\" cleanly.\n\t */\n\tskipped: ReadonlyArray<string>;\n};\n\n/**\n * Returned by {@link SyncEngine.fence}. Hold this and call `lift()`\n * to re-enable mutations. Holding multiple fences is supported — the\n * engine stays fenced until every handle has been lifted.\n */\nexport type FenceHandle = {\n\t/** `Date.now()` at fence time. */\n\tfencedAt: number;\n\t/** Human-readable reason — surfaced on {@link EngineFencedError}. */\n\treason: string;\n\t/** Re-enable mutations. Idempotent (later calls are no-ops). */\n\tlift: () => void;\n};\n\nexport type ExportSnapshotOptions = {\n\t/**\n\t * Narrow the export to a subset of registered tables. Useful for\n\t * per-tenant cuts when readers expose `ctx`-scoped data.\n\t */\n\ttables?: ReadonlyArray<string>;\n\t/**\n\t * Context passed to each reader's `all(ctx)`. The default `{}`\n\t * works for engines whose readers ignore context.\n\t */\n\tctx?: unknown;\n};\n\nexport type ImportSnapshotOptions = {\n\t/**\n\t * Narrow the import to a subset of tables in the snapshot.\n\t * Tables outside the filter are skipped (NOT recorded in\n\t * `skipped`; that field is for tables with no writer).\n\t */\n\ttables?: ReadonlyArray<string>;\n\t/**\n\t * Called for each row insertion. Fires synchronously inside the\n\t * import loop; keep it cheap or schedule heavy work elsewhere.\n\t */\n\tonProgress?: (table: string, done: number, total: number) => void;\n\t/**\n\t * Context passed to each writer's `insert(data, ctx, tx)`. The\n\t * default `{}` works for writers that ignore context.\n\t */\n\tctx?: unknown;\n};\n\n/**\n * Thrown by `runMutation` when the engine is fenced. The reason\n * carries through so operators can correlate denied calls to the\n * fence that caused them.\n */\nexport class EngineFencedError extends Error {\n\treadonly reason: string;\n\tconstructor(reason: string) {\n\t\tsuper(`[sync] Engine is fenced for migration: ${reason}`);\n\t\tthis.name = 'EngineFencedError';\n\t\tthis.reason = reason;\n\t}\n}\n",
26
+ "import {\n\tABS_ATTRS,\n\ttracerOrNoop,\n\ttype TracerProvider as TelemetryTracerProvider\n} from '@absolutejs/telemetry';\nimport type {\n\tCollectionContext,\n\tCollectionDefinition,\n\tJoinCollectionDefinition\n} from './collection';\nimport { createEquiJoin } from './equiJoin';\nimport type { EquiJoin } from './equiJoin';\nimport type { GraphCollectionDefinition, GraphInstance } from './graph';\nimport { createMaterializedView, isEmptyViewDiff } from './materializedView';\nimport type { MaterializedView } from './materializedView';\nimport type {\n\tMutationActions,\n\tMutationDefinition,\n\tTableWriter,\n\tTransactionRunner\n} from './mutation';\nimport type {\n\tReactiveQueryDefinition,\n\tReadHandle,\n\tTableReader\n} from './reactive';\nimport {\n\texponentialBackoff,\n\tisSerializationFailure,\n\tRetriesExhaustedError\n} from './retry';\nimport {\n\ttype BridgeFetchConfig,\n\ttype HandlerMetricsHook,\n\ttype HandlerMetricsRecord,\n\tmakeSandboxedHandler\n} from './sandbox';\nimport type {\n\tPermissionsDefinition,\n\tReadRule,\n\tTablePermissions,\n\tWriteRule\n} from './permissions';\nimport { PackMissingDependencyError, PackTableConflictError } from './pack';\nimport type { RegisteredPack, SyncPack } from './pack';\nimport type { SearchCollectionDefinition, SearchIndex } from './search';\nimport { SEARCH_SCORE_FIELD } from './search';\nimport type { ScheduleDefinition } from './schedule';\nimport type {\n\tCollectionKind,\n\tEngineActivity,\n\tEngineInspection,\n\tEngineMetrics\n} from './devtools';\nimport type { SchemaDefinition, TableSchema } from './schema';\nimport {\n\tEngineFencedError,\n\ttype EngineSnapshot,\n\ttype ExportSnapshotOptions,\n\ttype FenceHandle,\n\ttype ImportSnapshotOptions,\n\ttype MigrationImportResult\n} from './migrate';\nimport type { CrdtMergeable } from '../crdt';\nimport type { ClusterBus } from './cluster';\nimport type { ChangeSource, RowChange, RowKey, ViewDiff } from './types';\n\n/**\n * Which fields of a `Row` are CRDT values, and the {@link CrdtMergeable} backend\n * (e.g. `rgaText`, or `yjsText` from `@absolutejs/sync-yjs`) used to merge each.\n * Pass to `engine.registerCrdt` so the engine merges those fields on write.\n */\nexport type CrdtFields<Row> = {\n\t[Field in keyof Row]?: CrdtMergeable<Row[Field]>;\n};\n\n/**\n * Thrown when `authorize` denies a subscribe or a mutation. The message names\n * the denied action; the message always starts with \"Not authorized\".\n */\nexport class UnauthorizedError extends Error {\n\tconstructor(subject: string) {\n\t\tsuper(`Not authorized: ${subject}`);\n\t\tthis.name = 'UnauthorizedError';\n\t}\n}\n\n/**\n * Thrown by `engine.subscribe` / `engine.hydrate` (1.15.0+) when the caller's\n * `AbortSignal` fires before the operation reaches a `Subscription` /\n * resolved value. The `name` is `'AbortError'` to match the DOM-standard\n * spelling so existing `catch (error) { if (error.name === 'AbortError') ... }`\n * patterns work unchanged.\n */\nexport class AbortError extends Error {\n\tconstructor(reason?: string) {\n\t\tsuper(reason ?? 'Aborted');\n\t\tthis.name = 'AbortError';\n\t}\n}\n\nconst checkAborted = (signal?: AbortSignal): void => {\n\tif (signal?.aborted) {\n\t\tthrow new AbortError(\n\t\t\tsignal.reason instanceof Error\n\t\t\t\t? signal.reason.message\n\t\t\t\t: typeof signal.reason === 'string'\n\t\t\t\t\t? signal.reason\n\t\t\t\t\t: 'Aborted'\n\t\t);\n\t}\n};\n\nconst linkAbortToUnsubscribe = (\n\tsignal: AbortSignal | undefined,\n\tunsubscribe: () => void\n): void => {\n\tif (signal === undefined) return;\n\tif (signal.aborted) {\n\t\tunsubscribe();\n\t\treturn;\n\t}\n\tconst handler = () => {\n\t\ttry {\n\t\t\tunsubscribe();\n\t\t} catch {\n\t\t\t/* idempotent unsubscribes shouldn't surface here */\n\t\t}\n\t};\n\tsignal.addEventListener('abort', handler, { once: true });\n};\n\n/**\n * Thrown when a mutation's write fails its table's schema (see\n * {@link defineSchema}). The message names the offending field.\n */\nexport class SchemaError extends Error {\n\tconstructor(table: string, fieldName: string) {\n\t\tsuper(`Schema violation on \"${table}\": invalid field \"${fieldName}\"`);\n\t\tthis.name = 'SchemaError';\n\t}\n}\n\nexport type SubscribeArgs<T, P, Ctx> = {\n\t/** Registered collection name. */\n\tcollection: string;\n\t/** Query params (e.g. a filter value); passed to hydrate/match/authorize. */\n\tparams: P;\n\t/** Caller context (e.g. session); passed to hydrate/match/authorize. */\n\tctx: Ctx;\n\t/**\n\t * Receives every non-empty diff (with its version) after the initial\n\t * reply. 1.18.0+: a third optional `cursor` argument carries the\n\t * cross-instance resume cursor as of this diff. Callers that ignore\n\t * the 3rd arg keep working unchanged.\n\t */\n\tonDiff: (diff: ViewDiff<T>, version: number, cursor?: string) => void;\n\t/**\n\t * Resume from a point the client already applied. When the change log still\n\t * covers `(since, now]` for a single-table collection, the engine replies\n\t * with a catch-up diff instead of a full snapshot; otherwise it falls back\n\t * to a snapshot.\n\t *\n\t * Accepts `number` (legacy pre-1.17 — interpreted as the version of THIS\n\t * engine instance) or a `string` cursor (1.17.0+ — opaque vector of\n\t * `(instanceId, version)` per origin, returned by the engine on every\n\t * subscription/diff and round-tripped by the client unmodified). Use the\n\t * cursor form for cross-instance resume.\n\t */\n\tsince?: number | string;\n\t/**\n\t * Cancellation handle (1.15.0). Two effects:\n\t * 1. If the signal is already aborted when `subscribe` is called, the\n\t * engine throws {@link AbortError} immediately — no authorize, no\n\t * hydrate, no subscription.\n\t * 2. If the signal fires AFTER the subscription is live, the engine\n\t * auto-calls `unsubscribe()`. The consumer never has to thread two\n\t * handles for the same lifetime.\n\t *\n\t * Backwards-compatible — omit `signal` and the engine behaves exactly\n\t * as in pre-1.15.0.\n\t */\n\tsignal?: AbortSignal;\n};\n\nexport type Subscription<T> = {\n\t/** The result set at subscribe time — a snapshot (empty when resuming). */\n\tinitial: T[];\n\t/** Catch-up diff when resuming via `since` (instead of `initial`). */\n\tcatchup?: ViewDiff<T>;\n\t/** The engine's local version this reply brings the client up to. */\n\tversion: number;\n\t/**\n\t * Opaque cross-instance resume cursor (1.17.0+). Encodes the per-origin\n\t * vector of `(instanceId, version)` the client is now up-to-date with;\n\t * pass it back as `SubscribeArgs.since` on reconnect. Works for resume\n\t * against ANY instance in a cluster, not just the one that issued it —\n\t * the receiving instance decodes the cursor, walks its log for entries\n\t * the client hasn't seen yet, and either replies with a catch-up diff\n\t * or a fresh snapshot.\n\t */\n\tcursor: string;\n\t/** Stop receiving diffs and release the view. */\n\tunsubscribe: () => void;\n};\n\nexport type SyncEngine = {\n\t/** Register a collection definition (see {@link defineCollection}). */\n\tregister: <T, P = void, Ctx = CollectionContext>(\n\t\tcollection: CollectionDefinition<T, P, Ctx>\n\t) => void;\n\t/** Register an incremental join collection (see {@link defineJoinCollection}). */\n\tregisterJoin: <L, R, Out, P = void, Ctx = CollectionContext>(\n\t\tcollection: JoinCollectionDefinition<L, R, Out, P, Ctx>\n\t) => void;\n\t/** Register an operator-graph collection (see {@link defineGraphCollection}). */\n\tregisterGraph: <Out, P = void, Ctx = CollectionContext>(\n\t\tcollection: GraphCollectionDefinition<Out, P, Ctx>\n\t) => void;\n\t/**\n\t * Register a live search collection (see {@link defineSearchCollection}): a\n\t * full-text or vector index maintained from a source table's change feed and\n\t * queried by the subscription's params, returning the ranked top-K live.\n\t */\n\tregisterSearch: <T, Query = string, Ctx = CollectionContext>(\n\t\tcollection: SearchCollectionDefinition<T, Query, Ctx>\n\t) => void;\n\t/**\n\t * Register a scheduled function (see {@link defineSchedule}): server-triggered\n\t * work whose `actions` writes go live through the change feed. Wire the cron\n\t * triggers with the `scheduled` Elysia plugin.\n\t */\n\tregisterSchedule: (schedule: ScheduleDefinition) => void;\n\t/**\n\t * Run a registered schedule's handler now: its writes commit (in the\n\t * configured transaction) and emit as one live batch. The `scheduled` plugin\n\t * calls this on each cron fire; call it directly to trigger on demand.\n\t */\n\trunSchedule: (name: string) => Promise<void>;\n\t/** Registered schedules (name + cron pattern) — used by the `scheduled` plugin. */\n\tlistSchedules: () => ScheduleDefinition[];\n\t/**\n\t * Open a live subscription: authorize, hydrate the initial set, and stream\n\t * diffs as changes arrive. Rejects with {@link UnauthorizedError} on deny.\n\t */\n\tsubscribe: <T, P = void, Ctx = CollectionContext>(\n\t\targs: SubscribeArgs<T, P, Ctx>\n\t) => Promise<Subscription<T>>;\n\t/**\n\t * One-shot read: authorize and return a collection's current rows without\n\t * subscribing. Powers an Eden-typed HTTP hydrate route (and SSR). Rejects\n\t * with {@link UnauthorizedError} on deny.\n\t *\n\t * Pass `options.signal` (1.15.0+) to cancel the operation mid-flight —\n\t * the engine throws {@link AbortError} after the next await point if\n\t * the signal has fired.\n\t */\n\thydrate: (\n\t\tcollection: string,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\toptions?: { signal?: AbortSignal }\n\t) => Promise<unknown[]>;\n\t/**\n\t * Feed a committed change to `table` into the engine, fanning the resulting\n\t * diff to every live subscription of every collection that reads that table.\n\t * Call after a mutation, or wire a {@link ChangeSource} via `connectSource`.\n\t * Single-table subscriptions diff the row; multi-table / refetch ones\n\t * re-hydrate.\n\t */\n\tapplyChange: <T>(table: string, change: RowChange<T>) => Promise<void>;\n\t/**\n\t * Connect a change source (e.g. a CDC adapter): its emitted changes flow into\n\t * `applyChange`. Resolves to a disconnect function that stops the source.\n\t */\n\tconnectSource: (source: ChangeSource) => Promise<() => Promise<void>>;\n\t/**\n\t * Join a cluster (see {@link ClusterBus}): broadcast this instance's committed\n\t * changes to peers and apply theirs locally, so subscribers on every instance\n\t * stay live. Resolves to a disconnect function. Run once per instance.\n\t */\n\tconnectCluster: (bus: ClusterBus) => Promise<() => Promise<void>>;\n\t/** Active subscription count, optionally for one collection. */\n\tsubscriptionCount: (collection?: string) => number;\n\t/** Register a mutation definition (see {@link defineMutation}). */\n\tregisterMutation: <Args, Ctx = CollectionContext, Result = unknown>(\n\t\tmutation: MutationDefinition<Args, Ctx, Result>\n\t) => void;\n\t/**\n\t * Register how to persist a `table` (any ORM), so a mutation's\n\t * `actions.insert/update/delete` write to your store and emit the live change\n\t * in one step — you can't write without going live. See {@link TableWriter}.\n\t */\n\tregisterWriter: <Row = unknown, Ctx = CollectionContext, Tx = unknown>(\n\t\ttable: string,\n\t\twriter: TableWriter<Row, Ctx, Tx>\n\t) => void;\n\t/**\n\t * Register a read-set-tracked reactive query (see {@link defineReactiveQuery}):\n\t * it re-runs and re-pushes whenever any table it read changes — no `match`, no\n\t * operator graph, no manual change emission.\n\t */\n\tregisterReactive: <T, P = void, Ctx = CollectionContext>(\n\t\tquery: ReactiveQueryDefinition<T, P, Ctx>\n\t) => void;\n\t/**\n\t * Teach the engine how to read a table for reactive queries' `ctx.db` (any\n\t * ORM). Required for every table a reactive query reads.\n\t */\n\tregisterReader: <Ctx = CollectionContext>(\n\t\ttable: string,\n\t\treader: TableReader<Ctx>\n\t) => void;\n\t/**\n\t * Register declarative, row-level permissions for a `table` (see\n\t * {@link definePermissions}). Read rules filter every row the engine emits for\n\t * the table; write rules gate `actions.insert/update/delete`. Equivalent to a\n\t * `permissions` entry on {@link createSyncEngine}.\n\t */\n\tregisterPermissions: <Row = unknown, Ctx = CollectionContext>(\n\t\ttable: string,\n\t\trules: TablePermissions<Row, Ctx>\n\t) => void;\n\t/**\n\t * Register a `table`'s schema (see {@link defineSchema}): writes are validated\n\t * against it (a bad write rejects the mutation with {@link SchemaError}), and\n\t * its `migrate` lazily upcasts rows on read. Equivalent to a `schemas` entry\n\t * on {@link createSyncEngine}.\n\t */\n\tregisterSchema: <Row = unknown>(\n\t\ttable: string,\n\t\tschema: TableSchema<Row>\n\t) => void;\n\t/**\n\t * Declare which fields on a `table` are CRDT values (see {@link CrdtMergeable}\n\t * — e.g. `rgaText` from `@absolutejs/sync/crdt`, or `yjsText` from\n\t * `@absolutejs/sync-yjs`). The engine then MERGES those fields on\n\t * `actions.insert/update` instead of overwriting them, so concurrent writers\n\t * converge with no clobbering — conflict-free collaborative editing with no\n\t * merge code in your mutation. It also registers a ready-made\n\t * `\"<table>:merge\"` mutation that upserts a row patch, so a client (e.g. the\n\t * `useCollaborativeText` framework hooks) needs no custom server mutation.\n\t */\n\tregisterCrdt: <Row = Record<string, unknown>>(\n\t\ttable: string,\n\t\tfields: CrdtFields<Row>\n\t) => void;\n\t/**\n\t * Apply a table's schema `migrate` to a raw/stored row (identity when there's\n\t * no schema or migration). Use it wherever you read raw rows the engine\n\t * doesn't (e.g. a search collection's `source`); the engine already migrates\n\t * reactive `ctx.db` reads, view hydrates, and the one-shot hydrate.\n\t */\n\tmigrate: <Row = unknown>(table: string, row: Row) => Row;\n\t/**\n\t * Run a registered mutation: authorize, invoke its handler (which writes and\n\t * emits changes via `applyChange`), and resolve with the handler's result.\n\t * Rejects with {@link UnauthorizedError} on deny, or an error for an unknown\n\t * mutation / a handler throw. Drive this from the transport's mutate frame.\n\t */\n\trunMutation: (\n\t\tname: string,\n\t\targs: unknown,\n\t\tctx: unknown\n\t) => Promise<unknown>;\n\t/**\n\t * Atomically run N mutations in a single transaction (sync 1.11+).\n\t * Each `{ name, args }` spec is authorized, then handlers fire in\n\t * order against shared buffered changes. If any handler throws, the\n\t * entire transaction rolls back — no partial commits, no fanned-out\n\t * diffs. On success the accumulated changes apply as ONE live batch\n\t * and the per-mutation results return in order.\n\t *\n\t * No retry policy applies to batches in v0.2; configure per-mutation\n\t * retries on individual `runMutation` calls when atomicity isn't\n\t * needed. A failed batch passes the original error through with no\n\t * wrapping.\n\t *\n\t * Requires `transaction` to be set in {@link SyncEngineOptions} for\n\t * actual DB-level atomicity; without it the batch still buffers\n\t * changes into one fan-out but the underlying adapter writes\n\t * piecemeal.\n\t */\n\trunMutations: (\n\t\tspecs: Array<{ name: string; args: unknown }>,\n\t\tctx: unknown\n\t) => Promise<unknown[]>;\n\t/**\n\t * A point-in-time snapshot of the engine for devtools: registered collections\n\t * (+ kind, tables, live subscription counts), mutations, schedules, readers,\n\t * writers, the change-feed version, and recent changes. See `syncDevtools`.\n\t */\n\tinspect: () => EngineInspection;\n\t/**\n\t * Operator-shaped engine metrics — counters + memory estimates + throughput\n\t * totals since engine start. Distinct from {@link SyncEngine.inspect}: this\n\t * is what a PaaS host scrapes on an interval to answer \"is this engine\n\t * healthy\" and \"what's its resource footprint.\" Feed it to\n\t * `@absolutejs/metering` for per-engine cost attribution.\n\t *\n\t * Added in 1.13.0.\n\t */\n\tmetrics: () => EngineMetrics;\n\t/**\n\t * Capture the engine's change log + version as a serializable\n\t * {@link ChangeLogSnapshot} the host can persist (disk, S3, the cluster\n\t * bus) and restore on the next boot via\n\t * {@link SyncEngineOptions.initialChangeLog} or\n\t * {@link SyncEngine.importChangeLog}. The receiving engine MUST share this\n\t * engine's `instanceId` — otherwise the resume contract silently breaks.\n\t *\n\t * Cheap: the snapshot's `entries` is a shallow copy of the bounded log\n\t * (capped by `changeLogSize` / `changeLogRetainMs`). Call on a timer or on\n\t * graceful shutdown — both are fine; the snapshot is monotonic in commit\n\t * order, so a partial roll-forward (apply entries newer than the snapshot\n\t * from another source) is safe.\n\t *\n\t * Added in 1.19.0.\n\t */\n\texportChangeLog: () => ChangeLogSnapshot;\n\t/**\n\t * Adopt a {@link ChangeLogSnapshot} into a running engine that has not yet\n\t * committed any local changes (its `version` is 0). The snapshot's\n\t * `instanceId` MUST match this engine's `instanceId`. Throws otherwise.\n\t *\n\t * Convenience for hosts that want to set up the engine, register surfaces,\n\t * AND THEN restore. Equivalent to passing the snapshot via\n\t * `createSyncEngine({ initialChangeLog })` if you have it at construction\n\t * time. Returns the number of entries imported.\n\t *\n\t * Added in 1.19.0.\n\t */\n\timportChangeLog: (snapshot: ChangeLogSnapshot) => number;\n\t/**\n\t * Reconstruct the state of registered tables as of a target\n\t * timestamp by walking the change log forward and folding each op\n\t * into a per-table view. Useful for forensic incident response\n\t * (\"what did the tenant see at 14:32?\") and the \"I deleted prod\n\t * — restore us to 2h ago\" recovery story.\n\t *\n\t * The reconstruction is exact when the log spans `targetAt` (i.e.\n\t * the log's oldest entry is at version 1). When the log has been\n\t * trimmed (`changeLogSize` / `changeLogRetainMs` evicted older\n\t * entries) AND `targetAt` falls in the gap, the result is\n\t * best-effort: state walked forward from the OLDEST retained\n\t * entry, with `truncated: true` so the caller knows.\n\t *\n\t * Added in 1.22.0.\n\t *\n\t * @example\n\t * ```ts\n\t * const twoHoursAgo = Date.now() - 2 * 60 * 60 * 1000;\n\t * const result = await engine.replayTo({ at: twoHoursAgo, tables: ['orders'] });\n\t * if (result.truncated) {\n\t * console.warn('Replay truncated — log retention window too short.');\n\t * }\n\t * console.log(result.rows.orders); // orders as of two hours ago\n\t * ```\n\t */\n\treplayTo: (options: ReplayOptions) => Promise<ReplayResult>;\n\t/**\n\t * Pause new mutations on the engine — the source half of the G7 tenant\n\t * migration contract. While at least one fence is held, `runMutation`\n\t * rejects with {@link EngineFencedError}; subscribe/hydrate continue to\n\t * work, so live readers stay served while the snapshot is in flight.\n\t *\n\t * Multiple fence handles compose — the engine stays fenced until every\n\t * handle has been `lift()`-ed. Lifting is idempotent.\n\t *\n\t * Out of scope: out-of-band writes (CDC drivers, raw SQL). The caller\n\t * is responsible for halting those before fencing, otherwise the\n\t * snapshot will drift between `exportSnapshot` and import on the target.\n\t *\n\t * Added in 1.24.0.\n\t */\n\tfence: (options: { reason: string }) => FenceHandle;\n\t/**\n\t * Capture the engine's current per-table state into a portable\n\t * {@link EngineSnapshot}. Walks every registered reader's `all(ctx)`\n\t * and collects the rows. Used to ship a tenant between engines (G7).\n\t *\n\t * Pair with `fence()` on the source to stop drift, then\n\t * `importSnapshot()` on the target. The shape is intentionally\n\t * detached from `ChangeLogSnapshot` — snapshots carry live state, not\n\t * history. Use `exportChangeLog()` separately if you need forensic\n\t * continuity at the target instanceId.\n\t *\n\t * Added in 1.24.0.\n\t *\n\t * @example\n\t * const fence = source.fence({ reason: 'tenant move' });\n\t * try {\n\t * const snapshot = await source.exportSnapshot();\n\t * await target.importSnapshot(snapshot);\n\t * } finally { fence.lift(); }\n\t */\n\texportSnapshot: (options?: ExportSnapshotOptions) => Promise<EngineSnapshot>;\n\t/**\n\t * Bulk-load an {@link EngineSnapshot} into this engine via each table's\n\t * registered writer. Tables present in the snapshot but missing a\n\t * writer here are surfaced in `result.skipped` so the operator can\n\t * detect a misconfigured target. The target half of the G7 migration\n\t * contract.\n\t *\n\t * Inserts do NOT emit change events to subscribers — the import is\n\t * meant to land on a fresh target whose clients will re-hydrate after\n\t * the DNS cutover. If you need to fan changes out (e.g. mid-flight\n\t * cutover), drain the change log via `streamChanges()` and\n\t * `applyChange()` separately.\n\t *\n\t * Added in 1.24.0.\n\t */\n\timportSnapshot: (\n\t\tsnapshot: EngineSnapshot,\n\t\toptions?: ImportSnapshotOptions\n\t) => Promise<MigrationImportResult>;\n\t/**\n\t * Subscribe to the live engine activity stream (changes, mutation outcomes,\n\t * subscribe/unsubscribe). Returns an unsubscribe. Powers the devtools feed.\n\t */\n\tonActivity: (listener: (event: EngineActivity) => void) => () => void;\n\t/**\n\t * Outbound CDC stream — yield every committed change as a {@link LoggedChange},\n\t * historical first (entries with `version > since`) then continuously tailing\n\t * live commits. Use it to feed downstream pipelines (Kafka, search indexers,\n\t * audit logs, analytics warehouses).\n\t *\n\t * The iterator is notify-driven (no polling): it parks on a Promise that\n\t * resolves the instant a new commit lands.\n\t *\n\t * If `since` falls before the oldest entry retained in the bounded change\n\t * log, the iterator throws {@link MissedChangesError} so the consumer\n\t * notices the gap instead of silently skipping commits. Resubscribe with\n\t * `since = engine.inspect().recentChanges[0].version` after re-bootstrapping.\n\t *\n\t * If the consumer iterates slower than the engine commits and the in-flight\n\t * buffer overflows (`maxBuffer`, default 10000), the iterator throws\n\t * {@link CdcConsumerSlowError} for the same reason.\n\t *\n\t * @example\n\t * for await (const entry of engine.streamChanges({ since: lastCursor })) {\n\t * await kafka.send('sync.changes', JSON.stringify(entry));\n\t * lastCursor = entry.version;\n\t * }\n\t */\n\tstreamChanges: (\n\t\toptions?: StreamChangesOptions\n\t) => AsyncIterable<LoggedChange>;\n\t/**\n\t * Register a {@link SyncPack} — a self-contained bundle of schemas,\n\t * permissions, readers/writers, collections, mutations, and schedules.\n\t * Dispatches each field to the matching `register*` method. Rejects\n\t * with {@link PackTableConflictError} if the pack claims a table\n\t * another registered pack already owns; with\n\t * {@link PackMissingDependencyError} if `requireDependencies` is set\n\t * and a `readsTables` entry has no registered reader.\n\t *\n\t * See `syncPacks.design.md` for the rationale.\n\t */\n\tregisterPack: (pack: SyncPack) => void;\n};\n\n/**\n * 1.18.0: `OnDiff` receives an opaque `cursor` string alongside the version.\n * The cursor is the engine's cross-instance resume cursor as of this batch\n * — the connection layer forwards it to the client on the wire so a\n * reconnect can resume across shards. Pre-1.18 callers that ignore the 3rd\n * arg keep working unchanged.\n */\ntype OnDiff = (diff: ViewDiff<unknown>, version: number, cursor?: string) => void;\n\ntype JoinState = {\n\top: EquiJoin<unknown, unknown, unknown>;\n\tleftTable: string;\n\trightTable: string;\n\t/** Per-side filters (bound to params/ctx) — a failing change leaves the join. */\n\tleftMatch?: (row: unknown) => boolean;\n\trightMatch?: (row: unknown) => boolean;\n};\n\ntype ActiveSubscription =\n\t| {\n\t\t\tkind: 'view';\n\t\t\tcollection: string;\n\t\t\tview: MaterializedView<unknown>;\n\t\t\t/** Incremental (has a predicate) vs refetch fallback. */\n\t\t\tincremental: boolean;\n\t\t\t/** Re-run the bound hydrate for the refetch fallback. */\n\t\t\trehydrate: () => Promise<Iterable<unknown>>;\n\t\t\t/** Result-row identity (used to net a batch's diffs). */\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\tonDiff: OnDiff;\n\t }\n\t| {\n\t\t\tkind: 'join';\n\t\t\tcollection: string;\n\t\t\tjoin: JoinState;\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\tonDiff: OnDiff;\n\t }\n\t| {\n\t\t\tkind: 'graph';\n\t\t\tcollection: string;\n\t\t\tinstance: GraphInstance<unknown>;\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\tonDiff: OnDiff;\n\t }\n\t| {\n\t\t\tkind: 'reactive';\n\t\t\tcollection: string;\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\t/** Re-run; returns the new rows and the read set (tables/keys/ranges). */\n\t\t\trerun: () => Promise<{\n\t\t\t\trows: unknown[];\n\t\t\t\treadTables: Set<string>;\n\t\t\t\treadKeys: Set<string>;\n\t\t\t\trangeDeps: RangeDep[];\n\t\t\t}>;\n\t\t\t/**\n\t\t\t * Stable key over `(collection, params, ctx)`. Subscriptions sharing\n\t\t\t * the same key are equivalent on the read side, so a single rerun\n\t\t\t * per change batch can serve all of them (see `reactivePairs`).\n\t\t\t */\n\t\t\trerunKey: string;\n\t\t\t/** Current result set, keyed (diffed against the next re-run). */\n\t\t\tcurrent: Map<RowKey, unknown>;\n\t\t\t/** Full-table dependencies (from `db.all`). */\n\t\t\treadTables: Set<string>;\n\t\t\t/** Row-level dependencies `table\\0key` (from `db.get`). */\n\t\t\treadKeys: Set<string>;\n\t\t\t/** Range dependencies (from `db.where`) — predicate + matched keys. */\n\t\t\trangeDeps: RangeDep[];\n\t\t\tonDiff: OnDiff;\n\t }\n\t| {\n\t\t\tkind: 'search';\n\t\t\tcollection: string;\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\t/** Re-run the search against the (now-updated) shared index. */\n\t\t\trerun: () => unknown[];\n\t\t\t/** Current ranked result set, keyed (diffed against the next re-run). */\n\t\t\tcurrent: Map<RowKey, unknown>;\n\t\t\tonDiff: OnDiff;\n\t };\n\n/** A `db.where` dependency: the predicate plus the keys that matched at read. */\ntype RangeDep = {\n\ttable: string;\n\tpredicate: (row: unknown) => boolean;\n\tkeys: Set<RowKey>;\n};\n\n/**\n * A single committed change as it appears in the engine's change log and on\n * the {@link SyncEngine.streamChanges} CDC stream. Versions are monotonic\n * across the engine: a single mutation that writes N rows emits N entries\n * all sharing the same `version`.\n */\nexport type LoggedChange = {\n\t/** This engine's local monotonic version when the change was logged. */\n\tversion: number;\n\ttable: string;\n\tchange: RowChange<unknown>;\n\t/**\n\t * Wall-clock when this change was logged (Date.now()). Used by the\n\t * engine's time-based retention sweep (`changeLogRetainMs`) and\n\t * surfaced as the change-log age in {@link SyncEngine.metrics}.\n\t * Added in 1.13.0; pre-1.13.0 consumers of `LoggedChange` ignore it.\n\t */\n\tat: number;\n\t/**\n\t * Instance id that originated this change. For locally-committed changes\n\t * this is the engine's own `instanceId`; for cluster-received changes,\n\t * the originating peer's id.\n\t *\n\t * Added in 1.17.0; pre-1.17 consumers ignore it.\n\t */\n\torigin: string;\n\t/**\n\t * The ORIGINATOR's local version at commit time. For locally-committed\n\t * changes this equals `version`; for cluster-received changes, the\n\t * peer's version. Resume cursors (1.17.0+) carry `(origin, originVersion)`\n\t * pairs so a client's last-seen point matches against peer entries this\n\t * engine has logged via the bus.\n\t *\n\t * Added in 1.17.0; pre-1.17 consumers ignore it.\n\t */\n\toriginVersion: number;\n};\n\n/** Thrown by {@link SyncEngine.streamChanges} when `since` is older than the\n * oldest entry retained in the bounded change log (i.e. the consumer was\n * disconnected long enough that the engine has lost the diff). The consumer\n * should re-bootstrap from a fresh hydrate and resume from `availableSince`. */\nexport class MissedChangesError extends Error {\n\treadonly requestedSince: number;\n\treadonly availableSince: number;\n\tconstructor(requestedSince: number, availableSince: number) {\n\t\tsuper(\n\t\t\t`Change log no longer covers version ${requestedSince}; oldest available is ${availableSince}. ` +\n\t\t\t\t`Re-bootstrap and resume from ${availableSince}.`\n\t\t);\n\t\tthis.name = 'MissedChangesError';\n\t\tthis.requestedSince = requestedSince;\n\t\tthis.availableSince = availableSince;\n\t}\n}\n\n/** Options for {@link SyncEngine.streamChanges}. */\nexport type StreamChangesOptions = {\n\t/**\n\t * Last version the consumer has already processed. The stream yields\n\t * entries with `version > since`. Defaults to `0` (replay everything in\n\t * the log, then tail).\n\t */\n\tsince?: number;\n\t/**\n\t * Cancel the stream cleanly. When the signal aborts, the iterator\n\t * resolves to `done` on its next yield and unregisters its subscriber.\n\t */\n\tsignal?: AbortSignal;\n\t/**\n\t * Hard cap on the in-flight buffer for this consumer. If the engine\n\t * commits faster than the consumer iterates and the buffer overflows,\n\t * the stream rejects so the consumer notices instead of silently\n\t * skipping entries. Defaults to 10000.\n\t */\n\tmaxBuffer?: number;\n};\n\n/** Thrown by {@link SyncEngine.streamChanges} when the consumer fell so far\n * behind that the in-flight buffer overflowed. Resubscribe from the last\n * cursor the consumer successfully processed. */\nexport class CdcConsumerSlowError extends Error {\n\treadonly maxBuffer: number;\n\treadonly lastDeliveredVersion: number;\n\tconstructor(maxBuffer: number, lastDeliveredVersion: number) {\n\t\tsuper(\n\t\t\t`CDC stream buffer overflowed (max ${maxBuffer}); consumer fell behind. ` +\n\t\t\t\t`Last delivered version: ${lastDeliveredVersion}. Resubscribe with since=${lastDeliveredVersion}.`\n\t\t);\n\t\tthis.name = 'CdcConsumerSlowError';\n\t\tthis.maxBuffer = maxBuffer;\n\t\tthis.lastDeliveredVersion = lastDeliveredVersion;\n\t}\n}\n\n/**\n * Thrown by `runMutation` / `runMutations` when `mutationConcurrency` is\n * saturated AND the waiting queue is already at `mutationQueueLimit`. The\n * caller sees this immediately (no queue time) so the host can shed load\n * with a clean 429 instead of letting the queue grow unboundedly. Added\n * in 1.20.0.\n */\nexport class MutationQueueOverflowError extends Error {\n\treadonly queueLimit: number;\n\tconstructor(queueLimit: number) {\n\t\tsuper(\n\t\t\t`Mutation queue overflowed (limit ${queueLimit}); the engine is at ` +\n\t\t\t\t`its mutationConcurrency cap and the waiting queue is full. ` +\n\t\t\t\t`Retry later or shed load at the gateway.`\n\t\t);\n\t\tthis.name = 'MutationQueueOverflowError';\n\t\tthis.queueLimit = queueLimit;\n\t}\n}\n\n/**\n * Thrown by `engine.subscribe` when the calling tenant's active-subscription\n * count is already at the configured `subscriptionLimit.max`. The caller sees\n * this immediately — BEFORE authorize, hydrate, or any subscription state\n * allocation — so a rejected call leaks nothing. Added in 1.20.1.\n */\nexport class SubscriptionLimitError extends Error {\n\treadonly tenantKey: string;\n\treadonly limit: number;\n\treadonly active: number;\n\tconstructor(tenantKey: string, limit: number, active: number) {\n\t\tsuper(\n\t\t\t`Tenant \"${tenantKey}\" is at the subscription cap ` +\n\t\t\t\t`(${active}/${limit}). Close an existing subscription before opening another.`\n\t\t);\n\t\tthis.name = 'SubscriptionLimitError';\n\t\tthis.tenantKey = tenantKey;\n\t\tthis.limit = limit;\n\t\tthis.active = active;\n\t}\n}\n\n/**\n * Serializable snapshot of an engine's change log + monotonic version, returned\n * by {@link SyncEngine.exportChangeLog} and consumed by\n * {@link SyncEngineOptions.initialChangeLog} or\n * {@link SyncEngine.importChangeLog}.\n *\n * The PaaS host persists this on shard rotation (every N seconds or on graceful\n * shutdown) and hands it back to the replacement engine so resume cursors\n * referencing this `instanceId` keep working past the restart. Bounded by the\n * receiving engine's `changeLogSize` + `changeLogRetainMs` policies — entries\n * that exceed either cap on import are trimmed exactly as if they had been\n * logged live.\n *\n * Added in 1.19.0.\n */\nexport type ChangeLogSnapshot = {\n\t/** The exporting engine's `instanceId`. Receiver MUST match. */\n\tinstanceId: string;\n\t/** The exporting engine's monotonic version at snapshot time. */\n\tversion: number;\n\t/** Every retained log entry, in commit order (oldest first). */\n\tentries: ReadonlyArray<LoggedChange>;\n\t/**\n\t * Optional version-stamp the host may use to compare snapshots without\n\t * deserializing the entries (e.g. for incremental persistence). Set to\n\t * `Date.now()` at export time. Receivers ignore this field.\n\t */\n\texportedAt?: number;\n};\n\n/**\n * Options for {@link SyncEngine.replayTo}. Added in 1.22.0.\n */\nexport type ReplayOptions = {\n\t/**\n\t * Target timestamp (`Date.now()`-shaped). The engine walks the\n\t * change log forward, applying entries with `at <= targetAt`. The\n\t * result is the state as-of `targetAt` (or as close as the log\n\t * permits — see `truncated`).\n\t */\n\tat: number;\n\t/**\n\t * Optional table filter. When set, only entries whose `table` is\n\t * in this list are folded into the result; entries for other\n\t * tables are skipped. Useful for \"show me what `tasks` looked\n\t * like at T\" without paying to reconstruct every table.\n\t */\n\ttables?: ReadonlyArray<string>;\n};\n\n/**\n * Returned by {@link SyncEngine.replayTo}. Added in 1.22.0.\n *\n * - `rows` — per-table arrays of rows that existed as of `asOfAt`.\n * Keys are table names; values are the row objects (in last-write\n * order — last write wins for duplicate-keyed inserts).\n * - `asOfVersion` / `asOfAt` — the version + wall-clock of the LAST\n * entry folded into the result. May be earlier than `targetAt` if\n * no entries existed between the last-included entry and the\n * target.\n * - `truncated` — `true` when the log has been trimmed past the\n * target window (`changeLog[0].version > 1 && changeLog[0].at >\n * targetAt`). In this case, `rows` represents the state walked\n * forward from the OLDEST retained entry — NOT the actual state\n * at `targetAt`. The caller should treat the result as\n * \"best-effort given retention window\" and warn the operator.\n */\nexport type ReplayResult = {\n\tasOfVersion: number;\n\tasOfAt: number;\n\trows: Record<string, ReadonlyArray<unknown>>;\n\ttruncated: boolean;\n};\n\nexport type SyncEngineOptions = {\n\t/**\n\t * Stable identifier for this engine instance. Defaults to a per-process\n\t * random UUID. Pass a stable value (e.g. `${hostname}:${shardId}`) when\n\t * running a fleet of engines behind a cluster bus — 1.17.0+ resume\n\t * cursors carry the originating `instanceId`, so a client that reconnects\n\t * to a different shard can request a catch-up against the original's\n\t * change feed only if that instance's id matches a peer the new shard\n\t * knows about.\n\t */\n\tinstanceId?: string;\n\t/**\n\t * How many recent changes to retain for resumable reconnects. A client that\n\t * reconnects within this window gets a catch-up diff; beyond it, a fresh\n\t * snapshot. Defaults to 1024.\n\t */\n\tchangeLogSize?: number;\n\t/**\n\t * Time-based change-log retention: drop entries older than this many ms,\n\t * in addition to the count cap above. Lets a high-throughput engine keep\n\t * a SHORT log (e.g. \"60s of changes\") regardless of count, which both\n\t * bounds memory and bounds the catch-up work on reconnect. Defaults to\n\t * `null` — only the count cap (`changeLogSize`) applies.\n\t *\n\t * Added in 1.13.0.\n\t */\n\tchangeLogRetainMs?: number | null;\n\t/**\n\t * Run every mutation inside your database's transaction (see\n\t * {@link TransactionRunner}): the handler's writes commit all-or-nothing, and\n\t * the engine emits the resulting diff only after the commit. Omit to run\n\t * mutations without a transaction (each writer call is its own DB op).\n\t */\n\ttransaction?: TransactionRunner;\n\t/**\n\t * Declarative, row-level permissions keyed by table (see\n\t * {@link definePermissions}). Read rules filter every row the engine emits;\n\t * write rules gate `actions.insert/update/delete`. Add more later with\n\t * {@link SyncEngine.registerPermissions}. Type the rules at the\n\t * `definePermissions<YourCtx>(...)` call site; the engine accepts any context\n\t * (it threads `ctx` untyped to your rules).\n\t */\n\tpermissions?: PermissionsDefinition<any>;\n\t/**\n\t * Declarative row schemas keyed by table (see {@link defineSchema}): writes\n\t * are validated against them, and `migrate` lazily upcasts rows on read. Add\n\t * more later with {@link SyncEngine.registerSchema}.\n\t */\n\tschemas?: SchemaDefinition;\n\t/**\n\t * Cross-client cache for reactive query results, keyed by\n\t * `(collection, params, ctx)` — equivalent subscribers reuse a single\n\t * cached snapshot on initial subscribe instead of each re-running the\n\t * query body. Per-batch dedup (already in `reactivePairs` since 1.1) is\n\t * unchanged; this adds *cross-batch* sharing.\n\t *\n\t * Entries are invalidated when a write overlaps their read set (same\n\t * `isReactiveAffected` check live subscriptions use), and bounded by an\n\t * LRU + an optional TTL.\n\t *\n\t * Defaults: `{ max: 256, ttlMs: 60_000 }`. Pass `{ max: 0 }` to disable.\n\t */\n\treactiveCache?: {\n\t\tmax?: number;\n\t\tttlMs?: number;\n\t};\n\t/**\n\t * Per-call telemetry for `sandboxedHandler` mutations. When set, every\n\t * sandboxed call fires `onMetrics(record)` after completion with\n\t * `{ id, mutationName, durationMs, cpuMs, heapBytes, ok, errorName,\n\t * errorMessage, timestamp }`. Wire to a sync collection, your\n\t * observability backend, a Drizzle table, anything you want.\n\t *\n\t * Hook failures are swallowed (a misbehaving metrics sink must NOT\n\t * crash the caller's mutation). Adding the hook switches the runner\n\t * to `callable.callWithMetrics`, which is a small per-call cost\n\t * (~0.05 ms) — disable for hot-path mutations that don't need it.\n\t *\n\t * Off by default.\n\t *\n\t * @see {@link HandlerMetricsRecord}\n\t */\n\thandlerMetrics?: HandlerMetricsHook;\n\t/**\n\t * Allowlist + auth-injection map for `actions.fetch(url, init)` calls\n\t * issued from inside a `sandboxedHandler`. Each entry is keyed by\n\t * hostname (`'api.stripe.com'`); the value's `authorization` is a\n\t * sync or async callback computed on the host so the secret never\n\t * crosses into the JSC sandbox. Requests to non-allowlisted hosts\n\t * are rejected before any network call.\n\t *\n\t * Without this set, `actions.fetch` throws \"no bridgeFetch config.\"\n\t * Plain (non-sandboxed) handlers don't use this — they can just call\n\t * `fetch` directly since they run in the host process.\n\t *\n\t * @see {@link BridgeFetchConfig}\n\t */\n\tbridgeFetch?: BridgeFetchConfig;\n\t/**\n\t * Seed the engine's change log on boot from a prior snapshot — produced by\n\t * {@link SyncEngine.exportChangeLog} on the previous instance, persisted by\n\t * the host across a shard reboot, then handed back here. Cursors that\n\t * referenced this engine's `instanceId` stay resumable past the restart\n\t * (provided their last-seen point still lives in the retained log).\n\t *\n\t * The snapshot's `instanceId` MUST match `options.instanceId` (otherwise\n\t * `createSyncEngine` throws — a wrong-id restore would silently break the\n\t * resume contract). Snapshot `version` becomes this engine's local\n\t * monotonic version; entries are inserted in version order. Subscribers,\n\t * permissions, schemas, schedules, packs, mutations, and the reactive\n\t * cache are NOT in the snapshot — re-register them as normal after\n\t * `createSyncEngine` returns. Added in 1.19.0.\n\t */\n\tinitialChangeLog?: ChangeLogSnapshot;\n\t/**\n\t * Maximum concurrent in-flight mutations (`runMutation` + `runMutations`).\n\t * Calls beyond the limit wait in a FIFO queue and run as slots free up;\n\t * `engine.metrics().mutations.queued` surfaces the queue depth.\n\t *\n\t * A single tenant flooding `runMutation` can otherwise drive unbounded\n\t * memory growth (per-mutation `actions` buffers, retry timers, sandbox\n\t * invocations queued against the isolate pool). Set this to a value\n\t * appropriate for the host's tenant tier — e.g. `32` for a free tier,\n\t * `256` for paid. Without this option the engine is unbounded\n\t * (matching pre-1.20 behavior).\n\t *\n\t * Sandboxed mutations are gated by the same semaphore. If you need\n\t * finer-grained control (sandbox-only throttling), see\n\t * `@absolutejs/isolated-jsc`'s pool size — that's the lower layer.\n\t *\n\t * Added in 1.20.0.\n\t */\n\tmutationConcurrency?: number;\n\t/**\n\t * Cap on the queue of waiting mutations once `mutationConcurrency` is\n\t * saturated. Calls beyond this cap throw {@link MutationQueueOverflowError}\n\t * immediately instead of queueing — the host can surface a clean 429 or\n\t * apply a tenant-specific shed policy. Defaults to unbounded (queue\n\t * never rejects). Only meaningful when `mutationConcurrency` is set.\n\t *\n\t * Added in 1.20.0.\n\t */\n\tmutationQueueLimit?: number;\n\t/**\n\t * Per-tenant active-subscription cap. Symmetric to\n\t * {@link SyncEngineOptions.mutationConcurrency} on the read side: a\n\t * single tenant opening thousands of subscriptions would otherwise\n\t * exhaust the engine's per-subscription bookkeeping\n\t * (`active`/`tableIndex` Maps, the reactive cache, per-row diff\n\t * computation cost).\n\t *\n\t * `key` derives a tenant identifier from `(ctx, args)`; returning\n\t * `undefined` skips the cap for that call (e.g. internal/system\n\t * subscriptions). When the active count for a key reaches `max`, the\n\t * next `subscribe` throws {@link SubscriptionLimitError} BEFORE any\n\t * authorize, hydrate, or state allocation — so a denied call leaks\n\t * nothing.\n\t *\n\t * Active counts are surfaced through `engine.metrics().subscriptions.byTenant`\n\t * for tier monitoring. Added in 1.20.1.\n\t */\n\tsubscriptionLimit?: {\n\t\tmax: number;\n\t\tkey: (ctx: unknown, args: { collection: string }) => string | undefined;\n\t};\n\t/**\n\t * Optional OpenTelemetry tracer provider. When set, the engine\n\t * wraps `subscribe`, `runMutation`, `runMutations`, and cluster\n\t * fan-out in spans named `sync.<op>` with `ABS_ATTRS` semantic\n\t * conventions (`abs.engine.id`, `abs.collection`, `abs.mutation`,\n\t * etc.). When absent, all tracing is a zero-allocation noop —\n\t * existing call sites pay nothing. Added in 1.21.0.\n\t *\n\t * Pass any `@opentelemetry/api`-compatible `TracerProvider`. See\n\t * `@absolutejs/telemetry` for the type shape — sync re-uses its\n\t * helpers but doesn't peer-dep `@opentelemetry/api` directly.\n\t *\n\t * @example\n\t * ```ts\n\t * import { NodeTracerProvider } from '@opentelemetry/sdk-node';\n\t * const tp = new NodeTracerProvider({ ... });\n\t * tp.register();\n\t * const engine = createSyncEngine({ tracerProvider: tp });\n\t * ```\n\t */\n\ttracerProvider?: TelemetryTracerProvider;\n};\n\nconst defaultKey = (row: unknown): RowKey => (row as { id: RowKey }).id;\n\nconst shallowEqual = (a: unknown, b: unknown): boolean => {\n\tif (a === b) {\n\t\treturn true;\n\t}\n\tif (\n\t\ttypeof a !== 'object' ||\n\t\ttypeof b !== 'object' ||\n\t\ta === null ||\n\t\tb === null\n\t) {\n\t\treturn false;\n\t}\n\tconst aKeys = Object.keys(a);\n\tconst bKeys = Object.keys(b);\n\treturn (\n\t\taKeys.length === bKeys.length &&\n\t\taKeys.every(\n\t\t\t(k) =>\n\t\t\t\t(a as Record<string, unknown>)[k] ===\n\t\t\t\t(b as Record<string, unknown>)[k]\n\t\t)\n\t);\n};\n\n/**\n * Per-object stable identifier — paired with {@link stableSubKey} so two\n * subscriptions that share the same `(collection, params, ctx)` get the same\n * key and have their reactive rerun deduplicated within a change batch (the\n * fan-out fix in {@link reactivePairs}). Falls back to an incrementing id\n * stored on a WeakMap for values JSON can't represent (functions, classes,\n * cyclic structures), so identity-equal ctxs still share a key while\n * different-identity ones don't accidentally merge.\n */\nconst subKeyIds = new WeakMap<object, string>();\nlet subKeyCounter = 0;\nconst stableValueKey = (value: unknown): string => {\n\tif (value === undefined) return 'u';\n\tif (value === null) return 'n';\n\tconst tag = typeof value;\n\tif (tag === 'string') return `s:${value as string}`;\n\tif (tag === 'number' || tag === 'boolean' || tag === 'bigint') {\n\t\treturn `${tag[0]}:${String(value)}`;\n\t}\n\tif (tag !== 'object') return `${tag[0]}:fn`;\n\ttry {\n\t\t// Stable ordering: sort keys before serialising so { a, b } and { b, a }\n\t\t// produce the same string. JSON.stringify with a replacer keeps it tight.\n\t\treturn `o:${JSON.stringify(value, (_k, v): unknown => {\n\t\t\tif (v === null || typeof v !== 'object' || Array.isArray(v))\n\t\t\t\treturn v;\n\t\t\tconst record = v as Record<string, unknown>;\n\t\t\tconst sorted: Record<string, unknown> = {};\n\t\t\tfor (const key of Object.keys(record).sort()) {\n\t\t\t\tsorted[key] = record[key];\n\t\t\t}\n\n\t\t\treturn sorted;\n\t\t})}`;\n\t} catch {\n\t\t// Cyclic or unserializable — fall back to per-object identity.\n\t\tconst obj = value as object;\n\t\tlet id = subKeyIds.get(obj);\n\t\tif (id === undefined) {\n\t\t\tsubKeyCounter += 1;\n\t\t\tid = `i${subKeyCounter}`;\n\t\t\tsubKeyIds.set(obj, id);\n\t\t}\n\n\t\treturn `i:${id}`;\n\t}\n};\n\nconst stableSubKey = (\n\tcollection: string,\n\tparams: unknown,\n\tctx: unknown\n): string => `${collection}|${stableValueKey(params)}|${stableValueKey(ctx)}`;\n\n/** Shallow-equal ignoring the search score field — used to suppress re-emitting\n * a search result whose only change is BM25 score drift as the corpus grows. */\nconst equalsIgnoringScore = (a: unknown, b: unknown): boolean => {\n\tif (\n\t\ttypeof a !== 'object' ||\n\t\ttypeof b !== 'object' ||\n\t\ta === null ||\n\t\tb === null\n\t) {\n\t\treturn a === b;\n\t}\n\tconst strip = (value: Record<string, unknown>) =>\n\t\tObject.keys(value).filter((k) => k !== SEARCH_SCORE_FIELD);\n\tconst aKeys = strip(a as Record<string, unknown>);\n\tconst bKeys = strip(b as Record<string, unknown>);\n\treturn (\n\t\taKeys.length === bKeys.length &&\n\t\taKeys.every(\n\t\t\t(k) =>\n\t\t\t\t(a as Record<string, unknown>)[k] ===\n\t\t\t\t(b as Record<string, unknown>)[k]\n\t\t)\n\t);\n};\n\n/**\n * The Tier 3 sync engine: a registry of collections plus the view syncer. It is\n * transport-agnostic — `subscribe` returns the initial snapshot and an\n * `onDiff` stream, which an Elysia/SSE layer wires to a connection, and\n * `applyChange` is the change feed you drive from your mutations.\n *\n * Access control is first-class: every subscribe runs the collection's\n * `authorize`, and a collection's `match`/`hydrate` scope rows to the caller, so\n * a change to a row the caller can't see never reaches them.\n */\nexport const createSyncEngine = (\n\toptions: SyncEngineOptions = {}\n): SyncEngine => {\n\t// Heterogeneous registry: `any` here is what lets collections of different\n\t// row/param/context types share one map (the public `register`/`subscribe`\n\t// surface stays fully typed).\n\tconst registry = new Map<\n\t\tstring,\n\t\t| CollectionDefinition<any, any, any>\n\t\t| JoinCollectionDefinition<any, any, any, any, any>\n\t\t| GraphCollectionDefinition<any, any, any>\n\t\t| ReactiveQueryDefinition<any, any, any>\n\t\t| SearchCollectionDefinition<any, any, any>\n\t>();\n\tconst mutations = new Map<string, MutationDefinition<any, any, any>>();\n\t// Lazy sandbox runners keyed by mutation name. Built on first call to a\n\t// mutation that has `sandboxedHandler` set; reused thereafter. Engine has\n\t// no teardown; the OS reaps the isolate workers on process exit.\n\tconst sandboxRunners = new Map<\n\t\tstring,\n\t\t(\n\t\t\targs: unknown,\n\t\t\tctx: unknown,\n\t\t\tactions: MutationActions\n\t\t) => Promise<unknown>\n\t>();\n\tconst writers = new Map<string, TableWriter>();\n\tconst readers = new Map<string, TableReader>();\n\tconst schedules = new Map<string, ScheduleDefinition>();\n\t// Pack registry — table -> owning pack name, and the list of registered\n\t// packs for engine.inspect().packs.\n\tconst packTableOwners = new Map<string, string>();\n\tconst registeredPacks: RegisteredPack[] = [];\n\t// Declarative row-level permissions, keyed by table. Stored with an `unknown`\n\t// context — the engine threads ctx untyped — while the public\n\t// `definePermissions`/`registerPermissions` surface stays fully typed.\n\tconst permissions = new Map<string, TablePermissions<unknown, unknown>>();\n\tfor (const [table, rules] of Object.entries(options.permissions ?? {})) {\n\t\tpermissions.set(table, rules as TablePermissions<unknown, unknown>);\n\t}\n\tconst readRuleFor = (\n\t\ttable: string\n\t): ReadRule<unknown, unknown> | undefined => permissions.get(table)?.read;\n\tconst writeRuleFor = (\n\t\ttable: string,\n\t\top: 'insert' | 'update' | 'delete'\n\t): WriteRule<unknown, unknown> | undefined => {\n\t\tconst rules = permissions.get(table);\n\t\treturn rules?.[op] ?? rules?.write;\n\t};\n\t// Declarative row schemas, keyed by table.\n\tconst schemas = new Map<string, TableSchema<unknown>>();\n\tfor (const [table, schema] of Object.entries(options.schemas ?? {})) {\n\t\tschemas.set(table, schema as TableSchema<unknown>);\n\t}\n\t// CRDT fields, keyed by table: field name -> mergeable backend. Set via\n\t// registerCrdt; consulted in makeActions to merge (not overwrite) on write.\n\tconst crdtFields = new Map<\n\t\tstring,\n\t\tRecord<string, CrdtMergeable<unknown>>\n\t>();\n\t// Validate a write against its table's schema: every field on insert; only\n\t// the supplied fields on update. Throws SchemaError naming the bad field.\n\tconst validateWrite = (\n\t\ttable: string,\n\t\top: 'insert' | 'update',\n\t\trow: unknown\n\t) => {\n\t\tconst schema = schemas.get(table);\n\t\tif (schema === undefined || typeof row !== 'object' || row === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst record = row as Record<string, unknown>;\n\t\tfor (const [fieldName, validate] of Object.entries(schema.fields)) {\n\t\t\tconst present = fieldName in record;\n\t\t\tif (op === 'update' && !present) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!validate(record[fieldName])) {\n\t\t\t\tthrow new SchemaError(table, fieldName);\n\t\t\t}\n\t\t}\n\t};\n\t// Lazily upcast a stored/raw row to the current shape (identity if no migrate).\n\tconst migrateRow = (table: string, row: unknown): unknown => {\n\t\tconst migrate = schemas.get(table)?.migrate;\n\t\treturn migrate ? migrate(row) : row;\n\t};\n\t// Reactive (read-set-tracked) subscriptions, scanned on each change since\n\t// their dependencies (the tables they read) are dynamic, not in tableIndex.\n\tconst reactiveSubs = new Set<\n\t\tExtract<ActiveSubscription, { kind: 'reactive' }>\n\t>();\n\t// Search subscriptions + one shared index per search collection, kept live\n\t// from the source table's change feed (like reactiveSubs, not in tableIndex).\n\tconst searchSubs = new Set<\n\t\tExtract<ActiveSubscription, { kind: 'search' }>\n\t>();\n\tconst searchIndexes = new Map<\n\t\tstring,\n\t\t{\n\t\t\tindex: SearchIndex<unknown, unknown>;\n\t\t\tdefinition: SearchCollectionDefinition<unknown, unknown, unknown>;\n\t\t\thydrated: boolean;\n\t\t}\n\t>();\n\tconst active = new Map<string, Set<ActiveSubscription>>();\n\t// Which collections read each table — so a table change fans to all of them.\n\tconst tableIndex = new Map<string, Set<string>>();\n\n\t// Monotonic change feed: every applyChange bumps `version` and appends to a\n\t// bounded log, so a client can resume from the version it last applied.\n\tconst changeLogSize = options.changeLogSize ?? 1024;\n\tconst changeLogRetainMs = options.changeLogRetainMs ?? null;\n\tconst changeLog: LoggedChange[] = [];\n\tlet version = 0;\n\t// Engine-level counters surfaced via `engine.metrics()` (1.13.0).\n\tconst engineStartedAt = Date.now();\n\tlet mutationsCompleted = 0;\n\tlet mutationsFailed = 0;\n\tlet mutationsRetried = 0;\n\tlet mutationsInFlight = 0;\n\n\t// 1.20.0: optional FIFO semaphore gating mutation entry. Capacity is\n\t// `mutationConcurrency`; waiters queue with optional `mutationQueueLimit`\n\t// rejection. New arrivals that find ANY queued waiter also queue (FIFO\n\t// preservation), so a steady arrival rate can't starve an early waiter.\n\tconst mutationWaiters: (() => void)[] = [];\n\tlet mutationsQueued = 0;\n\n\t// 1.24.0: G7 migration fence. While `activeFences` is non-empty,\n\t// `runMutation` rejects with EngineFencedError. Reads remain\n\t// available so the snapshot transport doesn't block subscribers.\n\t// Multi-fence compose: every handle must lift() before the engine\n\t// unfences. The reason of the OLDEST fence is reported on rejection.\n\tconst activeFences = new Set<FenceHandle>();\n\n\tconst acquireMutationSlot = async (): Promise<void> => {\n\t\tconst limit = options.mutationConcurrency;\n\t\tif (limit === undefined) {\n\t\t\t// No semaphore — still bump the metric so `inFlight` is\n\t\t\t// always accurate, but skip all the queue plumbing.\n\t\t\tmutationsInFlight += 1;\n\t\t\treturn;\n\t\t}\n\t\t// FIFO: if a slot is open AND no waiters are queued, take it\n\t\t// synchronously. The increment is part of the same synchronous\n\t\t// step as the check, so two arrivals can't both pass when only\n\t\t// one slot remains.\n\t\tif (mutationsInFlight < limit && mutationWaiters.length === 0) {\n\t\t\tmutationsInFlight += 1;\n\t\t\treturn;\n\t\t}\n\t\t// Queue, or reject if the queue is also capped.\n\t\tconst queueLimit = options.mutationQueueLimit;\n\t\tif (queueLimit !== undefined && mutationsQueued >= queueLimit) {\n\t\t\tthrow new MutationQueueOverflowError(queueLimit);\n\t\t}\n\t\tmutationsQueued += 1;\n\t\ttry {\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tmutationWaiters.push(resolve);\n\t\t\t});\n\t\t} finally {\n\t\t\tmutationsQueued -= 1;\n\t\t}\n\t\t// Wake means a slot just opened up FOR US (`releaseMutationSlot`\n\t\t// only resolves one waiter per release). Claim it now — atomic\n\t\t// with the wake step.\n\t\tmutationsInFlight += 1;\n\t};\n\n\tconst releaseMutationSlot = (): void => {\n\t\tmutationsInFlight -= 1;\n\t\tif (options.mutationConcurrency === undefined) return;\n\t\tconst next = mutationWaiters.shift();\n\t\tif (next !== undefined) next();\n\t};\n\n\t// 1.20.1: per-tenant subscription cap. Active count keyed by the\n\t// host-supplied `subscriptionLimit.key(ctx, args)`. `undefined` from\n\t// `key()` means \"exempt this call from the cap\" — internal / system\n\t// subscriptions can skip the bookkeeping entirely.\n\tconst subscriptionsByTenant = new Map<string, number>();\n\n\tconst acquireSubscriptionSlot = (\n\t\tctx: unknown,\n\t\targs: { collection: string }\n\t): string | undefined => {\n\t\tconst cap = options.subscriptionLimit;\n\t\tif (cap === undefined) return undefined;\n\t\tconst tenantKey = cap.key(ctx, args);\n\t\tif (tenantKey === undefined) return undefined;\n\t\tconst active = subscriptionsByTenant.get(tenantKey) ?? 0;\n\t\tif (active >= cap.max) {\n\t\t\tthrow new SubscriptionLimitError(tenantKey, cap.max, active);\n\t\t}\n\t\tsubscriptionsByTenant.set(tenantKey, active + 1);\n\t\treturn tenantKey;\n\t};\n\n\tconst releaseSubscriptionSlot = (tenantKey: string | undefined): void => {\n\t\tif (tenantKey === undefined) return;\n\t\tconst active = subscriptionsByTenant.get(tenantKey);\n\t\tif (active === undefined || active <= 1) {\n\t\t\tsubscriptionsByTenant.delete(tenantKey);\n\t\t} else {\n\t\t\tsubscriptionsByTenant.set(tenantKey, active - 1);\n\t\t}\n\t};\n\n\t// Cross-client reactive query cache (1.3+). Keyed by stableSubKey, holds\n\t// the result + read set so a fresh subscribe with the same key reuses the\n\t// rerun instead of hitting the DB again. Per-batch dedup (since 1.1) is\n\t// already in `reactivePairs`; this lifts the sharing across batches.\n\t//\n\t// Entries are invalidated when a write overlaps the cached read set (same\n\t// `isReactiveAffected` check live subs use). LRU-bounded; optional TTL.\n\tconst reactiveCacheMax = options.reactiveCache?.max ?? 256;\n\tconst reactiveCacheTtlMs = options.reactiveCache?.ttlMs ?? 60_000;\n\ttype CachedRerun = {\n\t\trerunKey: string;\n\t\trows: unknown[];\n\t\treadTables: Set<string>;\n\t\treadKeys: Set<string>;\n\t\trangeDeps: RangeDep[];\n\t\tversion: number;\n\t\texpiresAt: number;\n\t};\n\t// `Map` preserves insertion order — re-set on access for LRU semantics.\n\tconst cachedReruns = new Map<string, CachedRerun>();\n\tconst touchCacheEntry = (key: string, entry: CachedRerun) => {\n\t\tcachedReruns.delete(key);\n\t\tcachedReruns.set(key, entry);\n\t};\n\tconst readCacheEntry = (key: string): CachedRerun | undefined => {\n\t\tif (reactiveCacheMax <= 0) return undefined;\n\t\tconst entry = cachedReruns.get(key);\n\t\tif (entry === undefined) return undefined;\n\t\tif (reactiveCacheTtlMs > 0 && entry.expiresAt < Date.now()) {\n\t\t\tcachedReruns.delete(key);\n\n\t\t\treturn undefined;\n\t\t}\n\t\ttouchCacheEntry(key, entry);\n\n\t\treturn entry;\n\t};\n\tconst writeCacheEntry = (entry: CachedRerun) => {\n\t\tif (reactiveCacheMax <= 0) return;\n\t\tcachedReruns.set(entry.rerunKey, entry);\n\t\t// LRU eviction: oldest insertion wins out when over budget.\n\t\twhile (cachedReruns.size > reactiveCacheMax) {\n\t\t\tconst oldest = cachedReruns.keys().next().value;\n\t\t\tif (oldest === undefined) break;\n\t\t\tcachedReruns.delete(oldest);\n\t\t}\n\t};\n\t// Devtools activity stream — listeners are notified of changes, mutation\n\t// outcomes, and subscribe/unsubscribe. Cheap (a no-op) when no one's watching.\n\tconst activityListeners = new Set<(event: EngineActivity) => void>();\n\tconst emitActivity = (event: EngineActivity) => {\n\t\tfor (const listener of activityListeners) {\n\t\t\tlistener(event);\n\t\t}\n\t};\n\t// Outbound CDC stream subscribers — `streamChanges()` adds itself here.\n\t// Notifications fire from `logChange` so every appended log entry reaches\n\t// every active streamer atomically with the log push.\n\tconst streamSubscribers = new Set<(entry: LoggedChange) => void>();\n\tconst runInTransaction = options.transaction;\n\t// Cluster fan-out: a stable id so we ignore our own broadcasts, and the bus\n\t// (set by connectCluster) we publish locally-committed changes to. Pass\n\t// `options.instanceId` for stable cross-process identity (e.g. the\n\t// hostname or a config-supplied UUID) — 1.17.0+ resume cursors travel\n\t// across instances, so the id needs to be stable across restarts if you\n\t// want resume to keep working past a reboot.\n\tconst instanceId =\n\t\toptions.instanceId ??\n\t\tglobalThis.crypto?.randomUUID?.() ??\n\t\t`i${Math.random()}`;\n\tlet clusterBus: ClusterBus | undefined;\n\n\t// 1.21.0: OTel tracer (noop when options.tracerProvider is unset).\n\t// All hot-path tracing flows through this — zero allocations when\n\t// the provider is absent because the noop tracer is a singleton.\n\tconst tracer = tracerOrNoop(options.tracerProvider, '@absolutejs/sync');\n\n\t// 1.19.0: optional boot-time restore from a prior engine's snapshot. Must\n\t// happen BEFORE any local writes — we validate by checking version === 0\n\t// inside importChangeLog and call it once here from the construction path.\n\tconst importChangeLog = (snapshot: ChangeLogSnapshot): number => {\n\t\tif (version !== 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`[sync] importChangeLog: engine already has version ${version}; ` +\n\t\t\t\t\t`restore must happen before any local writes commit.`\n\t\t\t);\n\t\t}\n\t\tif (snapshot.instanceId !== instanceId) {\n\t\t\tthrow new Error(\n\t\t\t\t`[sync] importChangeLog: snapshot instanceId \"${snapshot.instanceId}\" ` +\n\t\t\t\t\t`does not match this engine's instanceId \"${instanceId}\". ` +\n\t\t\t\t\t`Pass options.instanceId = \"${snapshot.instanceId}\" to createSyncEngine.`\n\t\t\t);\n\t\t}\n\t\t// Adopt version + entries. logChange's retention sweeps still apply,\n\t\t// so over-large snapshots get trimmed exactly like live logs would.\n\t\tversion = snapshot.version;\n\t\tfor (const entry of snapshot.entries) {\n\t\t\tchangeLog.push(entry);\n\t\t}\n\t\t// Apply count cap once after the bulk push (cheaper than per-entry).\n\t\twhile (changeLog.length > changeLogSize) {\n\t\t\tchangeLog.shift();\n\t\t}\n\t\t// Apply time-based retention to the imported tail.\n\t\tif (changeLogRetainMs !== null && changeLogRetainMs > 0) {\n\t\t\tconst cutoff = Date.now() - changeLogRetainMs;\n\t\t\twhile (changeLog.length > 0 && changeLog[0]!.at < cutoff) {\n\t\t\t\tchangeLog.shift();\n\t\t\t}\n\t\t}\n\t\treturn snapshot.entries.length;\n\t};\n\n\tif (options.initialChangeLog !== undefined) {\n\t\timportChangeLog(options.initialChangeLog);\n\t}\n\n\tconst broadcast = (\n\t\tchanges: { table: string; change: RowChange<unknown> }[],\n\t\t// 1.17.0 — the local version at the moment of this broadcast, so\n\t\t// peers can log the changes against `(instanceId, originVersion)`\n\t\t// and serve cross-instance resume from their own log.\n\t\toriginVersion: number\n\t) => {\n\t\tif (clusterBus !== undefined && changes.length > 0) {\n\t\t\tvoid clusterBus.publish({ changes, origin: instanceId, originVersion });\n\t\t}\n\t};\n\n\tconst subsFor = (collection: string) => {\n\t\tlet set = active.get(collection);\n\t\tif (set === undefined) {\n\t\t\tset = new Set();\n\t\t\tactive.set(collection, set);\n\t\t}\n\t\treturn set;\n\t};\n\n\tconst addTableIndex = (table: string, name: string) => {\n\t\tlet set = tableIndex.get(table);\n\t\tif (set === undefined) {\n\t\t\tset = new Set();\n\t\t\ttableIndex.set(table, set);\n\t\t}\n\t\tset.add(name);\n\t};\n\n\t/** A side change that fails its filter becomes a leave (delete from the join). */\n\tconst sideChange = (\n\t\tchange: RowChange<unknown>,\n\t\tmatch?: (row: unknown) => boolean\n\t): RowChange<unknown> =>\n\t\tchange.op !== 'delete' && match !== undefined && !match(change.row)\n\t\t\t? { op: 'delete', row: change.row }\n\t\t\t: change;\n\n\tconst EMPTY_DIFF: ViewDiff<unknown> = {\n\t\tadded: [],\n\t\tremoved: [],\n\t\tchanged: []\n\t};\n\n\t/** Apply one change to a subscription's state and return its diff (no emit). */\n\tconst subscriptionDiff = async (\n\t\tsubscription: ActiveSubscription,\n\t\ttable: string,\n\t\tchange: RowChange<unknown>\n\t): Promise<ViewDiff<unknown>> => {\n\t\tif (subscription.kind === 'graph') {\n\t\t\treturn subscription.instance.applyChange(table, change);\n\t\t}\n\t\tif (subscription.kind === 'join') {\n\t\t\tconst js = subscription.join;\n\t\t\tif (table === js.leftTable) {\n\t\t\t\treturn js.op.applyLeft(sideChange(change, js.leftMatch));\n\t\t\t}\n\t\t\tif (table === js.rightTable) {\n\t\t\t\treturn js.op.applyRight(sideChange(change, js.rightMatch));\n\t\t\t}\n\t\t\treturn EMPTY_DIFF;\n\t\t}\n\t\tif (subscription.kind === 'reactive') {\n\t\t\t// Reactive subs re-run as a whole (see reactivePairs), not per change.\n\t\t\treturn EMPTY_DIFF;\n\t\t}\n\t\tif (subscription.kind === 'search') {\n\t\t\t// Search subs re-rank as a whole (see searchPairs), not per change.\n\t\t\treturn EMPTY_DIFF;\n\t\t}\n\t\tif (subscription.incremental) {\n\t\t\ttry {\n\t\t\t\treturn subscription.view.apply(change);\n\t\t\t} catch {\n\t\t\t\t// The predicate couldn't decide this change (e.g. an operator the\n\t\t\t\t// inferred matcher doesn't support) — degrade to a correct refetch\n\t\t\t\t// rather than a wrong diff.\n\t\t\t\treturn subscription.view.reset(await subscription.rehydrate());\n\t\t\t}\n\t\t}\n\t\treturn subscription.view.reset(await subscription.rehydrate());\n\t};\n\n\t/** Active subscriptions whose collection reads `table`. */\n\tconst subscriptionsForTable = function* (\n\t\ttable: string\n\t): Generator<ActiveSubscription> {\n\t\tconst names = tableIndex.get(table);\n\t\tif (names === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const name of names) {\n\t\t\tconst set = active.get(name);\n\t\t\tif (set === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tyield* set;\n\t\t}\n\t};\n\n\t/**\n\t * Net a batch's per-change diffs by key, relative to the pre-batch state, so a\n\t * mutation that touches the same row twice collapses to one coherent change:\n\t * add-then-remove cancels, add-then-update stays an add, remove-then-add\n\t * becomes a change.\n\t */\n\tconst mergeViewDiffs = (\n\t\tdiffs: ViewDiff<unknown>[],\n\t\tkey: (row: unknown) => RowKey\n\t): ViewDiff<unknown> => {\n\t\ttype Net = { state: 'added' | 'changed' | 'removed'; row: unknown };\n\t\tconst net = new Map<RowKey, Net>();\n\t\tfor (const diff of diffs) {\n\t\t\tfor (const row of diff.removed) {\n\t\t\t\tconst previous = net.get(key(row));\n\t\t\t\tif (previous?.state === 'added') {\n\t\t\t\t\tnet.delete(key(row));\n\t\t\t\t} else {\n\t\t\t\t\tnet.set(key(row), { state: 'removed', row });\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const row of diff.added) {\n\t\t\t\tconst previous = net.get(key(row));\n\t\t\t\tnet.set(key(row), {\n\t\t\t\t\tstate: previous?.state === 'removed' ? 'changed' : 'added',\n\t\t\t\t\trow\n\t\t\t\t});\n\t\t\t}\n\t\t\tfor (const row of diff.changed) {\n\t\t\t\tconst previous = net.get(key(row));\n\t\t\t\tnet.set(key(row), {\n\t\t\t\t\tstate: previous?.state === 'added' ? 'added' : 'changed',\n\t\t\t\t\trow\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tconst added: unknown[] = [];\n\t\tconst changed: unknown[] = [];\n\t\tconst removed: unknown[] = [];\n\t\tfor (const { state, row } of net.values()) {\n\t\t\tif (state === 'added') {\n\t\t\t\tadded.push(row);\n\t\t\t} else if (state === 'changed') {\n\t\t\t\tchanged.push(row);\n\t\t\t} else {\n\t\t\t\tremoved.push(row);\n\t\t\t}\n\t\t}\n\t\treturn { added, changed, removed };\n\t};\n\n\ttype ReactiveSub = Extract<ActiveSubscription, { kind: 'reactive' }>;\n\n\tconst depKey = (table: string, key: RowKey): string => `${table} ${key}`;\n\n\t/** The key of a changed row under its table's reader key (if one is set). */\n\tconst changedKeyFor = (\n\t\ttable: string,\n\t\tchange: RowChange<unknown>\n\t): RowKey | undefined => readers.get(table)?.key?.(change.row);\n\n\t/**\n\t * An instrumented read handle: `all` records a full-table dependency; `get`\n\t * records a precise row-key dependency when the table's reader has a `key`\n\t * (else falls back to a table dependency).\n\t */\n\tconst makeReadHandle = (\n\t\tctx: unknown,\n\t\treadTables: Set<string>,\n\t\treadKeys: Set<string>,\n\t\trangeDeps: RangeDep[],\n\t\t// Schedules read unscoped (trusted server code); subscriptions apply rules.\n\t\tapplyRules = true\n\t): ReadHandle => {\n\t\tconst readerFor = (table: string): TableReader => {\n\t\t\tconst reader = readers.get(table);\n\t\t\tif (reader === undefined) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No reader registered for table \"${table}\" — register one with engine.registerReader`\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn reader;\n\t\t};\n\t\tconst ruleFor = (table: string) =>\n\t\t\tapplyRules ? readRuleFor(table) : undefined;\n\n\t\treturn {\n\t\t\tall: async (table) => {\n\t\t\t\treadTables.add(table);\n\t\t\t\t// Migrate raw rows to the current shape, then scope by read rule.\n\t\t\t\tconst rows = [...(await readerFor(table).all(ctx))].map((row) =>\n\t\t\t\t\tmigrateRow(table, row)\n\t\t\t\t);\n\t\t\t\tconst rule = ruleFor(table);\n\t\t\t\treturn (\n\t\t\t\t\trule ? rows.filter((row) => rule(ctx, row)) : rows\n\t\t\t\t) as never[];\n\t\t\t},\n\t\t\tget: async (table, key) => {\n\t\t\t\tconst reader = readerFor(table);\n\t\t\t\tif (reader.get === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Reader for table \"${table}\" has no get(); use db.all() or add get`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (reader.key !== undefined) {\n\t\t\t\t\treadKeys.add(depKey(table, key));\n\t\t\t\t} else {\n\t\t\t\t\treadTables.add(table);\n\t\t\t\t}\n\t\t\t\tconst raw = await reader.get(key, ctx);\n\t\t\t\tconst row =\n\t\t\t\t\traw === undefined ? undefined : migrateRow(table, raw);\n\t\t\t\tconst rule = ruleFor(table);\n\t\t\t\t// A row the caller can't read reads as absent.\n\t\t\t\treturn (\n\t\t\t\t\trule && row !== undefined && !rule(ctx, row)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: row\n\t\t\t\t) as never;\n\t\t\t},\n\t\t\twhere: async (table, predicate) => {\n\t\t\t\tconst reader = readerFor(table);\n\t\t\t\tconst rule = ruleFor(table);\n\t\t\t\t// Fold the read rule into the range predicate, so an unreadable row\n\t\t\t\t// never matches and a visibility flip still re-runs the query.\n\t\t\t\tconst effective = (\n\t\t\t\t\trule\n\t\t\t\t\t\t? (row: unknown) =>\n\t\t\t\t\t\t\t\t(predicate as (r: unknown) => boolean)(row) &&\n\t\t\t\t\t\t\t\trule(ctx, row)\n\t\t\t\t\t\t: (predicate as (row: unknown) => boolean)\n\t\t\t\t) as (row: unknown) => boolean;\n\t\t\t\tconst matched = [...(await reader.all(ctx))]\n\t\t\t\t\t.map((row) => migrateRow(table, row))\n\t\t\t\t\t.filter(effective);\n\t\t\t\tif (reader.key !== undefined) {\n\t\t\t\t\t// Remember which rows matched, so an update/delete that pulls a\n\t\t\t\t\t// row out of the range still re-runs (it's in this key set).\n\t\t\t\t\tconst key = reader.key;\n\t\t\t\t\trangeDeps.push({\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\tpredicate: effective,\n\t\t\t\t\t\tkeys: new Set(matched.map(key))\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treadTables.add(table);\n\t\t\t\t}\n\t\t\t\treturn matched as never[];\n\t\t\t}\n\t\t};\n\t};\n\n\tconst writerFor = (table: string): TableWriter => {\n\t\tconst writer = writers.get(table);\n\t\tif (writer === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`No writer registered for table \"${table}\" — register one with engine.registerWriter, or use actions.change`\n\t\t\t);\n\t\t}\n\t\treturn writer;\n\t};\n\n\t// Load the committed row a write targets (by the table's reader), if any — so\n\t// authorization and CRDT merge both reflect committed state, not the payload.\n\tconst readExisting = async (\n\t\ttable: string,\n\t\tvalue: unknown,\n\t\tctx: unknown\n\t): Promise<unknown> => {\n\t\tconst reader = readers.get(table);\n\t\tif (reader?.get === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst id = reader.key\n\t\t\t? reader.key(value)\n\t\t\t: (value as { id?: RowKey }).id;\n\t\treturn id === undefined ? undefined : reader.get(id, ctx);\n\t};\n\n\t// Enforce a table's declarative write rule before the writer runs (so a deny\n\t// rolls the transaction back). For update/delete, evaluate the rule against the\n\t// *existing* row when a reader can load it — so the check reflects committed\n\t// state, not a client-supplied payload.\n\tconst authorizeWrite = async (\n\t\ttable: string,\n\t\top: 'insert' | 'update' | 'delete',\n\t\tvalue: unknown,\n\t\tctx: unknown\n\t) => {\n\t\tconst rule = writeRuleFor(table, op);\n\t\tif (rule === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tlet subject = value;\n\t\tif (op !== 'insert') {\n\t\t\tconst existing = await readExisting(table, value, ctx);\n\t\t\tif (existing !== undefined) {\n\t\t\t\tsubject = existing;\n\t\t\t}\n\t\t}\n\t\tif (!rule(ctx, subject)) {\n\t\t\tthrow new UnauthorizedError(`${op} on table \"${table}\"`);\n\t\t}\n\t};\n\n\t// Merge a write's CRDT fields into the committed row (so concurrent writers\n\t// converge) instead of overwriting them. A no-op for tables without CRDT\n\t// fields. On insert the base is the empty state; on update it's the stored\n\t// field value. Returns the row patch the writer should persist.\n\tconst mergeCrdtFields = async (\n\t\ttable: string,\n\t\top: 'insert' | 'update',\n\t\tdata: unknown,\n\t\tctx: unknown\n\t): Promise<unknown> => {\n\t\tconst fields = crdtFields.get(table);\n\t\tif (fields === undefined || data === null || typeof data !== 'object') {\n\t\t\treturn data;\n\t\t}\n\t\tconst incoming = data as Record<string, unknown>;\n\t\tconst existing =\n\t\t\top === 'update' ? await readExisting(table, data, ctx) : undefined;\n\t\tconst base =\n\t\t\texisting !== null && typeof existing === 'object'\n\t\t\t\t? (existing as Record<string, unknown>)\n\t\t\t\t: undefined;\n\t\tconst merged: Record<string, unknown> = { ...incoming };\n\t\tfor (const [field, adapter] of Object.entries(fields)) {\n\t\t\tif (incoming[field] === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmerged[field] = adapter.merge(\n\t\t\t\tbase?.[field] ?? adapter.empty(),\n\t\t\t\tincoming[field]\n\t\t\t);\n\t\t}\n\t\treturn merged;\n\t};\n\n\t/**\n\t * Build the write actions a mutation or schedule handler uses, collecting its\n\t * changes into a fresh buffer (so a transaction that retries/rolls back never\n\t * double-emits). `tx` threads to each writer. `enforce` applies write\n\t * permission rules (mutations); schedules run trusted, so they pass `false`.\n\t */\n\tconst makeActions = (tx: unknown, ctx: unknown, enforce: boolean) => {\n\t\tconst buffered: { table: string; change: RowChange<unknown> }[] = [];\n\t\tconst actions: MutationActions = {\n\t\t\tchange: (collection, change) => {\n\t\t\t\tbuffered.push({\n\t\t\t\t\ttable: collection,\n\t\t\t\t\tchange: change as RowChange<unknown>\n\t\t\t\t});\n\t\t\t\treturn Promise.resolve();\n\t\t\t},\n\t\t\tinsert: async (table, data) => {\n\t\t\t\t// Schema is data integrity — validated for trusted schedules too.\n\t\t\t\tvalidateWrite(table, 'insert', data);\n\t\t\t\tif (enforce) {\n\t\t\t\t\tawait authorizeWrite(table, 'insert', data, ctx);\n\t\t\t\t}\n\t\t\t\tconst merged = await mergeCrdtFields(\n\t\t\t\t\ttable,\n\t\t\t\t\t'insert',\n\t\t\t\t\tdata,\n\t\t\t\t\tctx\n\t\t\t\t);\n\t\t\t\tconst row = await writerFor(table).insert(merged, ctx, tx);\n\t\t\t\tbuffered.push({ table, change: { op: 'insert', row } });\n\t\t\t\treturn row;\n\t\t\t},\n\t\t\tupdate: async (table, data) => {\n\t\t\t\tvalidateWrite(table, 'update', data);\n\t\t\t\tif (enforce) {\n\t\t\t\t\tawait authorizeWrite(table, 'update', data, ctx);\n\t\t\t\t}\n\t\t\t\tconst merged = await mergeCrdtFields(\n\t\t\t\t\ttable,\n\t\t\t\t\t'update',\n\t\t\t\t\tdata,\n\t\t\t\t\tctx\n\t\t\t\t);\n\t\t\t\tconst row = await writerFor(table).update(merged, ctx, tx);\n\t\t\t\tbuffered.push({ table, change: { op: 'update', row } });\n\t\t\t\treturn row;\n\t\t\t},\n\t\t\tdelete: async (table, row) => {\n\t\t\t\tif (enforce) {\n\t\t\t\t\tawait authorizeWrite(table, 'delete', row, ctx);\n\t\t\t\t}\n\t\t\t\tawait writerFor(table).delete(row, ctx, tx);\n\t\t\t\tbuffered.push({ table, change: { op: 'delete', row } });\n\t\t\t},\n\t\t\t// Default wall clock. Replay / rebase paths can wrap and pin\n\t\t\t// this; today it's just Date.now().\n\t\t\tnow: () => Date.now()\n\t\t};\n\t\treturn { actions, buffered };\n\t};\n\n\t/** Diff a re-run against a sub's current set; updates `current`. Shared by the\n\t * reactive and search kinds (both re-run wholesale and diff). `equals` decides\n\t * whether a still-present row counts as changed. */\n\tconst diffRerun = (\n\t\tsub: {\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\tcurrent: Map<RowKey, unknown>;\n\t\t},\n\t\trows: unknown[],\n\t\tequals: (a: unknown, b: unknown) => boolean = shallowEqual\n\t): ViewDiff<unknown> => {\n\t\tconst next = new Map<RowKey, unknown>();\n\t\tfor (const row of rows) {\n\t\t\tnext.set(sub.key(row), row);\n\t\t}\n\t\tconst added: unknown[] = [];\n\t\tconst removed: unknown[] = [];\n\t\tconst changed: unknown[] = [];\n\t\tfor (const [rowKey, row] of next) {\n\t\t\tconst previous = sub.current.get(rowKey);\n\t\t\tif (previous === undefined) {\n\t\t\t\tadded.push(row);\n\t\t\t} else if (!equals(previous, row)) {\n\t\t\t\tchanged.push(row);\n\t\t\t}\n\t\t}\n\t\tfor (const [rowKey, row] of sub.current) {\n\t\t\tif (!next.has(rowKey)) {\n\t\t\t\tremoved.push(row);\n\t\t\t}\n\t\t}\n\t\tsub.current = next;\n\t\treturn { added, removed, changed };\n\t};\n\n\t/** Re-run every reactive query whose read set intersects the changed tables. */\n\ttype ReactiveChange = {\n\t\ttable: string;\n\t\tkey: RowKey | undefined;\n\t\trow: unknown;\n\t};\n\n\t/** Does a change fall in a range dep — matched now, or a member at last read? */\n\tconst inRange = (dep: RangeDep, change: ReactiveChange): boolean =>\n\t\tdep.table === change.table &&\n\t\t((change.key !== undefined && dep.keys.has(change.key)) ||\n\t\t\tdep.predicate(change.row));\n\n\t/** Does any change in the batch overlap this read set? Used for both live\n\t * sub invalidation and cross-client cache invalidation. */\n\tconst readSetOverlaps = (\n\t\treadTables: Set<string>,\n\t\treadKeys: Set<string>,\n\t\trangeDeps: RangeDep[],\n\t\tchanges: ReactiveChange[]\n\t): boolean =>\n\t\tchanges.some(\n\t\t\t(change) =>\n\t\t\t\treadTables.has(change.table) ||\n\t\t\t\t(change.key !== undefined &&\n\t\t\t\t\treadKeys.has(depKey(change.table, change.key))) ||\n\t\t\t\trangeDeps.some((dep) => inRange(dep, change))\n\t\t);\n\n\t/** Did this batch touch a table, row key, or range the sub read? */\n\tconst isReactiveAffected = (\n\t\tsub: ReactiveSub,\n\t\tchanges: ReactiveChange[]\n\t): boolean =>\n\t\treadSetOverlaps(sub.readTables, sub.readKeys, sub.rangeDeps, changes);\n\n\t/** Drop cached reruns whose read set overlaps this write batch. Cheap walk —\n\t * the cache is bounded by `reactiveCache.max` (default 256). */\n\tconst invalidateCacheForChanges = (changes: ReactiveChange[]) => {\n\t\tif (cachedReruns.size === 0) return;\n\t\tfor (const [key, entry] of cachedReruns) {\n\t\t\tif (\n\t\t\t\treadSetOverlaps(\n\t\t\t\t\tentry.readTables,\n\t\t\t\t\tentry.readKeys,\n\t\t\t\t\tentry.rangeDeps,\n\t\t\t\t\tchanges\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tcachedReruns.delete(key);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst reactivePairs = async (\n\t\tchanges: ReactiveChange[]\n\t): Promise<[ActiveSubscription, ViewDiff<unknown>][]> => {\n\t\t// Drop now-stale cache entries before reruns — otherwise a fresh\n\t\t// subscriber landing during the batch could read the OLD value.\n\t\tinvalidateCacheForChanges(changes);\n\n\t\tconst pairs: [ActiveSubscription, ViewDiff<unknown>][] = [];\n\t\t// Dedupe: subscriptions sharing the same `(collection, params, ctx)`\n\t\t// only need ONE rerun per change batch. With 1000 subs on the same\n\t\t// query, this drops per-change CPU from O(N) reruns to O(1) — every\n\t\t// sub then diffs the shared result against its own `current` and\n\t\t// receives its own per-sub frame (which the transport still writes\n\t\t// per-WS, see #22 batch-frame fan-out for the next step).\n\t\tconst sharedRuns = new Map<\n\t\t\tstring,\n\t\t\tPromise<Awaited<ReturnType<ReactiveSub['rerun']>>>\n\t\t>();\n\t\tfor (const sub of reactiveSubs) {\n\t\t\tif (!isReactiveAffected(sub, changes)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet runPromise = sharedRuns.get(sub.rerunKey);\n\t\t\tif (runPromise === undefined) {\n\t\t\t\trunPromise = sub.rerun();\n\t\t\t\tsharedRuns.set(sub.rerunKey, runPromise);\n\t\t\t}\n\t\t\tconst { rows, readTables, readKeys, rangeDeps } = await runPromise;\n\t\t\tsub.readTables = readTables;\n\t\t\tsub.readKeys = readKeys;\n\t\t\tsub.rangeDeps = rangeDeps;\n\t\t\tconst diff = diffRerun(sub, rows);\n\t\t\tif (!isEmptyViewDiff(diff)) {\n\t\t\t\tpairs.push([sub, diff]);\n\t\t\t}\n\t\t}\n\t\t// Refresh cache entries with the freshly-computed rows so subsequent\n\t\t// subscribers reuse them without hitting the DB.\n\t\tfor (const [key, runPromise] of sharedRuns) {\n\t\t\trunPromise\n\t\t\t\t.then(({ rows, readTables, readKeys, rangeDeps }) => {\n\t\t\t\t\twriteCacheEntry({\n\t\t\t\t\t\texpiresAt: Date.now() + reactiveCacheTtlMs,\n\t\t\t\t\t\trangeDeps,\n\t\t\t\t\t\treadKeys,\n\t\t\t\t\t\treadTables,\n\t\t\t\t\t\trerunKey: key,\n\t\t\t\t\t\trows,\n\t\t\t\t\t\tversion\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch(() => {\n\t\t\t\t\t// rerun threw — leave cache as-is (already invalidated above)\n\t\t\t\t});\n\t\t}\n\n\t\treturn pairs;\n\t};\n\n\t/** Lazily build + hydrate a search collection's shared index (once). */\n\tconst ensureSearchIndex = async (\n\t\tdefinition: SearchCollectionDefinition<unknown, unknown, unknown>\n\t) => {\n\t\tlet entry = searchIndexes.get(definition.name);\n\t\tif (entry === undefined) {\n\t\t\tentry = { index: definition.index(), definition, hydrated: false };\n\t\t\tsearchIndexes.set(definition.name, entry);\n\t\t}\n\t\tif (!entry.hydrated) {\n\t\t\tfor (const row of await definition.source()) {\n\t\t\t\tentry.index.add(row);\n\t\t\t}\n\t\t\tentry.hydrated = true;\n\t\t}\n\t\treturn entry;\n\t};\n\n\t/**\n\t * Keep search indexes live and re-rank affected search subs: apply each change\n\t * to its collection's index, then re-run every sub whose collection changed.\n\t * Synchronous — the index ops and re-ranks don't touch the DB.\n\t */\n\tconst searchPairs = (\n\t\tchanges: { table: string; change: RowChange<unknown> }[]\n\t): [ActiveSubscription, ViewDiff<unknown>][] => {\n\t\tconst touched = new Set<string>();\n\t\tfor (const { table, change } of changes) {\n\t\t\tfor (const entry of searchIndexes.values()) {\n\t\t\t\tif (!entry.hydrated || entry.definition.table !== table) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (change.op === 'delete') {\n\t\t\t\t\tentry.index.remove(entry.definition.key(change.row));\n\t\t\t\t} else {\n\t\t\t\t\tentry.index.add(change.row);\n\t\t\t\t}\n\t\t\t\ttouched.add(entry.definition.name);\n\t\t\t}\n\t\t}\n\t\tconst pairs: [ActiveSubscription, ViewDiff<unknown>][] = [];\n\t\tfor (const sub of searchSubs) {\n\t\t\tif (!touched.has(sub.collection)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Ignore pure score drift (BM25 idf shifts as the corpus grows), so a\n\t\t\t// result only re-emits when it enters/leaves or its content changes —\n\t\t\t// not on every unrelated insert.\n\t\t\tconst diff = diffRerun(sub, sub.rerun(), equalsIgnoringScore);\n\t\t\tif (!isEmptyViewDiff(diff)) {\n\t\t\t\tpairs.push([sub, diff]);\n\t\t\t}\n\t\t}\n\t\treturn pairs;\n\t};\n\n\tconst logChange = (changeVersion: number, entry: LoggedChange) => {\n\t\tchangeLog.push(entry);\n\t\t// Count-based cap.\n\t\tif (changeLog.length > changeLogSize) {\n\t\t\tchangeLog.shift();\n\t\t}\n\t\t// Time-based retention (1.13.0): drop entries older than the\n\t\t// configured window. Cheap when the log is small or the head is\n\t\t// fresh — we stop the moment we find a young-enough entry.\n\t\tif (changeLogRetainMs !== null && changeLogRetainMs > 0) {\n\t\t\tconst cutoff = entry.at - changeLogRetainMs;\n\t\t\twhile (changeLog.length > 0 && changeLog[0]!.at < cutoff) {\n\t\t\t\tchangeLog.shift();\n\t\t\t}\n\t\t}\n\t\t// Atomic with the log push — every active CDC streamer sees every\n\t\t// entry exactly once, in version order, with no chance of a missed\n\t\t// commit between phase-1 catch-up and phase-2 tail.\n\t\tfor (const subscriber of streamSubscribers) {\n\t\t\tsubscriber(entry);\n\t\t}\n\t};\n\n\t// 1.17.0 cross-instance cursor encode/decode. Opaque to clients —\n\t// shaped as base64-ish JSON internally. The client must round-trip\n\t// what the server returned, unmodified.\n\tconst encodeCursor = (versions: Record<string, number>): string =>\n\t\t// Plain JSON is fine; clients treat it as opaque. We don't base64\n\t\t// because the cursor lives in a JSON payload anyway (snapshot frame).\n\t\tJSON.stringify(versions);\n\tconst decodeCursor = (cursor: string): Record<string, number> | null => {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(cursor);\n\t\t\tif (typeof parsed !== 'object' || parsed === null) return null;\n\t\t\tconst out: Record<string, number> = {};\n\t\t\tfor (const [k, v] of Object.entries(parsed)) {\n\t\t\t\tif (typeof v === 'number') out[k] = v;\n\t\t\t}\n\t\t\treturn out;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t};\n\tconst currentCursor = (): string => {\n\t\t// Snapshot the highest local version + each peer's highest origin\n\t\t// version seen so far. Cheap O(log) — single backwards walk grabs\n\t\t// the most-recent originVersion per peer.\n\t\tconst versions: Record<string, number> = { [instanceId]: version };\n\t\tfor (let i = changeLog.length - 1; i >= 0; i--) {\n\t\t\tconst entry = changeLog[i]!;\n\t\t\tif (versions[entry.origin] === undefined) {\n\t\t\t\tversions[entry.origin] = entry.originVersion;\n\t\t\t}\n\t\t}\n\t\treturn encodeCursor(versions);\n\t};\n\n\t/** Apply a single committed change at its own version (CDC / direct writes). */\n\tconst applyChange = async (\n\t\ttable: string,\n\t\tchange: RowChange<unknown>,\n\t\tshouldBroadcast = true\n\t) => {\n\t\tversion += 1;\n\t\tconst changeVersion = version;\n\t\tconst at = Date.now();\n\t\tlogChange(changeVersion, {\n\t\t\tversion: changeVersion,\n\t\t\ttable,\n\t\t\tchange,\n\t\t\tat,\n\t\t\torigin: instanceId,\n\t\t\toriginVersion: changeVersion\n\t\t});\n\t\temitActivity({\n\t\t\ttype: 'change',\n\t\t\tat,\n\t\t\ttable,\n\t\t\top: change.op,\n\t\t\tversion: changeVersion\n\t\t});\n\t\t// Collect, then emit once at the end: reactive re-runs are async, and\n\t\t// emitting before they finish would let the transport flush a partial frame.\n\t\tconst emissions: [ActiveSubscription, ViewDiff<unknown>][] = [];\n\t\tfor (const subscription of subscriptionsForTable(table)) {\n\t\t\tconst diff = await subscriptionDiff(subscription, table, change);\n\t\t\tif (!isEmptyViewDiff(diff)) {\n\t\t\t\temissions.push([subscription, diff]);\n\t\t\t}\n\t\t}\n\t\temissions.push(\n\t\t\t...(await reactivePairs([\n\t\t\t\t{ table, key: changedKeyFor(table, change), row: change.row }\n\t\t\t]))\n\t\t);\n\t\temissions.push(...searchPairs([{ table, change }]));\n\t\tconst cursorForBatch = currentCursor();\n\t\tfor (const [subscription, diff] of emissions) {\n\t\t\tsubscription.onDiff(diff, changeVersion, cursorForBatch);\n\t\t}\n\t\tif (shouldBroadcast) {\n\t\t\tbroadcast([{ table, change }], changeVersion);\n\t\t}\n\t};\n\n\t/**\n\t * Apply a set of changes atomically: one version bump for the whole batch and\n\t * a single net-merged diff per affected subscription. Used by mutations so a\n\t * client never renders a torn intermediate state mid-mutation.\n\t */\n\tconst applyChangeBatch = async (\n\t\tchanges: { table: string; change: RowChange<unknown> }[],\n\t\tshouldBroadcast = true,\n\t\t/**\n\t\t * 1.17.0 — peer-relayed batches override the change-log entry's\n\t\t * `origin` + `originVersion` so a cross-instance client cursor can\n\t\t * later match the entry. Local batches leave this `undefined` and\n\t\t * the entry inherits the engine's own identity.\n\t\t */\n\t\tpeerOrigin?: { origin: string; originVersion: number }\n\t) => {\n\t\tif (changes.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tversion += 1;\n\t\tconst batchVersion = version;\n\t\tconst perSubscription = new Map<\n\t\t\tActiveSubscription,\n\t\t\tViewDiff<unknown>[]\n\t\t>();\n\t\tconst reactiveChanges: ReactiveChange[] = [];\n\t\tconst batchAt = Date.now();\n\t\t// 1.17.0: peer-relayed batches override origin/originVersion via\n\t\t// `peerOrigin` (set when applyChangeBatch is called from the cluster\n\t\t// subscribe path). Defaults to this engine's identity.\n\t\tconst batchOrigin = peerOrigin?.origin ?? instanceId;\n\t\tconst batchOriginVersion = peerOrigin?.originVersion ?? batchVersion;\n\t\tfor (const { table, change } of changes) {\n\t\t\tlogChange(batchVersion, {\n\t\t\t\tversion: batchVersion,\n\t\t\t\ttable,\n\t\t\t\tchange,\n\t\t\t\tat: batchAt,\n\t\t\t\torigin: batchOrigin,\n\t\t\t\toriginVersion: batchOriginVersion\n\t\t\t});\n\t\t\temitActivity({\n\t\t\t\ttype: 'change',\n\t\t\t\tat: batchAt,\n\t\t\t\ttable,\n\t\t\t\top: change.op,\n\t\t\t\tversion: batchVersion\n\t\t\t});\n\t\t\treactiveChanges.push({\n\t\t\t\ttable,\n\t\t\t\tkey: changedKeyFor(table, change),\n\t\t\t\trow: change.row\n\t\t\t});\n\t\t\tfor (const subscription of subscriptionsForTable(table)) {\n\t\t\t\t// Apply in order to keep operator state correct; collect to merge.\n\t\t\t\tconst diff = await subscriptionDiff(\n\t\t\t\t\tsubscription,\n\t\t\t\t\ttable,\n\t\t\t\t\tchange\n\t\t\t\t);\n\t\t\t\tconst list = perSubscription.get(subscription);\n\t\t\t\tif (list === undefined) {\n\t\t\t\t\tperSubscription.set(subscription, [diff]);\n\t\t\t\t} else {\n\t\t\t\t\tlist.push(diff);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Gather all emissions before sending any, so the whole batch — view diffs\n\t\t// and reactive re-runs (async) — leaves as one coalesced frame.\n\t\tconst emissions: [ActiveSubscription, ViewDiff<unknown>][] = [];\n\t\tfor (const [subscription, diffs] of perSubscription) {\n\t\t\tconst merged =\n\t\t\t\tdiffs.length === 1\n\t\t\t\t\t? diffs[0]!\n\t\t\t\t\t: mergeViewDiffs(diffs, subscription.key);\n\t\t\tif (!isEmptyViewDiff(merged)) {\n\t\t\t\temissions.push([subscription, merged]);\n\t\t\t}\n\t\t}\n\t\temissions.push(...(await reactivePairs(reactiveChanges)));\n\t\temissions.push(...searchPairs(changes));\n\t\tconst cursorForBatch = currentCursor();\n\t\tfor (const [subscription, diff] of emissions) {\n\t\t\tsubscription.onDiff(diff, batchVersion, cursorForBatch);\n\t\t}\n\t\tif (shouldBroadcast) {\n\t\t\tbroadcast(changes, batchVersion);\n\t\t}\n\t};\n\n\t/**\n\t * Normalize a `since` value (number or cursor string) into a per-origin\n\t * version vector. A bare `number` is treated as legacy 1.16- form — the\n\t * version of THIS instance. A cursor string is the 1.17.0+ multi-origin\n\t * shape encoded by `currentCursor()`.\n\t */\n\tconst normalizeSince = (since: number | string): Record<string, number> | null => {\n\t\tif (typeof since === 'number') {\n\t\t\treturn { [instanceId]: since };\n\t\t}\n\t\treturn decodeCursor(since);\n\t};\n\n\t/**\n\t * Can we replay `(since, now]` from the log for `tables`? With a cursor,\n\t * this is a per-origin coverage check — every entry the client hasn't\n\t * seen MUST be present in our log. Pre-1.16 `number` form matches when\n\t * the local log covers `(since.version, now]`. Returns `false` for\n\t * non-incremental subs (refetch/join/graph/search), since those can't be\n\t * replayed precisely from a row-change log.\n\t */\n\tconst canResume = (since: number | string, incremental: boolean): boolean => {\n\t\tif (!incremental) {\n\t\t\treturn false;\n\t\t}\n\t\tconst sinceVec = normalizeSince(since);\n\t\tif (sinceVec === null) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Walk the log backwards: every entry with `origin === O` and\n\t\t// `originVersion > sinceVec[O]` MUST appear in the log. If the log\n\t\t// has been trimmed past any such entry, we can't catch up.\n\t\t// Per-origin: for each origin O we've seen, check that the oldest\n\t\t// entry with that origin is no newer than `sinceVec[O] + 1`. For\n\t\t// an unknown origin, we fall back to \"no coverage\" (caller gets a\n\t\t// snapshot, just like pre-1.17 behavior).\n\t\tconst oldestPerOrigin = new Map<string, number>();\n\t\tfor (const entry of changeLog) {\n\t\t\tconst current = oldestPerOrigin.get(entry.origin);\n\t\t\tif (current === undefined || entry.originVersion < current) {\n\t\t\t\toldestPerOrigin.set(entry.origin, entry.originVersion);\n\t\t\t}\n\t\t}\n\n\t\t// Log-wide watermark: the smallest version still in the log. If this\n\t\t// is past `lastSeen + 1`, ANY entries between the cursor and oldestLogVersion\n\t\t// were trimmed (regardless of origin).\n\t\tconst oldestLogVersion = changeLog[0]?.version;\n\t\tfor (const [origin, lastSeen] of Object.entries(sinceVec)) {\n\t\t\t// Special case: if we've never seen any entry from this origin,\n\t\t\t// but the client claims to have seen up to `lastSeen` from it,\n\t\t\t// we DEFINITELY can't reconstruct — snapshot it.\n\t\t\tif (origin === instanceId) {\n\t\t\t\t// Local origin: standard check.\n\t\t\t\tif (lastSeen >= version) continue; // nothing newer\n\t\t\t\tconst oldestLocal = oldestPerOrigin.get(instanceId);\n\t\t\t\t// If we have local entries, walk them: they must reach back\n\t\t\t\t// to lastSeen + 1.\n\t\t\t\tif (oldestLocal !== undefined) {\n\t\t\t\t\tif (oldestLocal > lastSeen + 1) return false;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// No local entries — the version bumps since mint were all\n\t\t\t\t// from peer broadcasts. Resume is safe ONLY if the log itself\n\t\t\t\t// hasn't been trimmed past the mint point (otherwise some\n\t\t\t\t// local entries existed but were retired).\n\t\t\t\tif (\n\t\t\t\t\toldestLogVersion !== undefined &&\n\t\t\t\t\toldestLogVersion > lastSeen + 1\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Peer origin: same check against the peer's entries.\n\t\t\t\tconst oldestPeer = oldestPerOrigin.get(origin);\n\t\t\t\tif (oldestPeer === undefined) {\n\t\t\t\t\t// We've never logged any change from this peer. If the client\n\t\t\t\t\t// has seen entries from this peer, we can't help.\n\t\t\t\t\tif (lastSeen > 0) return false;\n\t\t\t\t} else if (oldestPeer > lastSeen + 1) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t};\n\n\t/**\n\t * Build a catch-up diff from the log for one subscription (last op per\n\t * key wins). Multi-origin aware (1.17.0+): walks every entry whose\n\t * `(origin, originVersion)` is newer than the client's last-seen for\n\t * that origin.\n\t */\n\tconst buildCatchup = (\n\t\tsince: number | string,\n\t\ttables: string[],\n\t\tkey: (row: unknown) => RowKey,\n\t\tmatch: (row: unknown) => boolean\n\t): ViewDiff<unknown> => {\n\t\tconst sinceVec = normalizeSince(since) ?? {};\n\t\tconst latest = new Map<\n\t\t\tRowKey,\n\t\t\t{ op: 'upsert' | 'remove'; row: unknown }\n\t\t>();\n\t\tfor (const entry of changeLog) {\n\t\t\tif (!tables.includes(entry.table)) continue;\n\t\t\t// Skip entries the client has already seen for this origin.\n\t\t\tconst lastSeen = sinceVec[entry.origin];\n\t\t\tif (lastSeen !== undefined && entry.originVersion <= lastSeen) continue;\n\t\t\tconst row = entry.change.row;\n\t\t\tconst present =\n\t\t\t\tentry.change.op !== 'delete' && match(row)\n\t\t\t\t\t? 'upsert'\n\t\t\t\t\t: 'remove';\n\t\t\tlatest.set(key(row), { op: present, row });\n\t\t}\n\t\tconst changed: unknown[] = [];\n\t\tconst removed: unknown[] = [];\n\t\tfor (const { op, row } of latest.values()) {\n\t\t\t(op === 'upsert' ? changed : removed).push(row);\n\t\t}\n\t\treturn { added: [], removed, changed };\n\t};\n\n\tconst subscribeJoin = async (\n\t\tcollection: string,\n\t\tdefinition: JoinCollectionDefinition<\n\t\t\tunknown,\n\t\t\tunknown,\n\t\t\tunknown,\n\t\t\tunknown,\n\t\t\tunknown\n\t\t>,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\tonDiff: OnDiff,\n\t\tset: Set<ActiveSubscription>\n\t): Promise<Subscription<unknown>> => {\n\t\tif (definition.authorize !== undefined) {\n\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\tif (!allowed) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst { left, right } = definition;\n\t\tconst op = createEquiJoin<unknown, unknown, unknown>({\n\t\t\tleftKey: left.key,\n\t\t\trightKey: right.key,\n\t\t\tleftOn: left.on,\n\t\t\trightOn: right.on,\n\t\t\tselect: definition.select\n\t\t});\n\t\top.hydrate(\n\t\t\t[...(await left.hydrate(params, ctx))],\n\t\t\t[...(await right.hydrate(params, ctx))]\n\t\t);\n\t\tconst atVersion = version;\n\n\t\tconst subscription: ActiveSubscription = {\n\t\t\tkind: 'join',\n\t\t\tcollection,\n\t\t\tjoin: {\n\t\t\t\top,\n\t\t\t\tleftTable: left.table,\n\t\t\t\trightTable: right.table,\n\t\t\t\tleftMatch: left.match\n\t\t\t\t\t? (row) => left.match!(row, params, ctx)\n\t\t\t\t\t: undefined,\n\t\t\t\trightMatch: right.match\n\t\t\t\t\t? (row) => right.match!(row, params, ctx)\n\t\t\t\t\t: undefined\n\t\t\t},\n\t\t\tkey: definition.key as (row: unknown) => RowKey,\n\t\t\tonDiff\n\t\t};\n\t\tset.add(subscription);\n\n\t\treturn {\n\t\t\tinitial: op.rows(),\n\t\t\tcursor: currentCursor(),\n\t\t\tversion: atVersion,\n\t\t\tunsubscribe: () => {\n\t\t\t\tset.delete(subscription);\n\t\t\t}\n\t\t};\n\t};\n\n\tconst subscribeGraph = async (\n\t\tcollection: string,\n\t\tdefinition: GraphCollectionDefinition<unknown, unknown, unknown>,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\tonDiff: OnDiff,\n\t\tset: Set<ActiveSubscription>\n\t): Promise<Subscription<unknown>> => {\n\t\tif (definition.authorize !== undefined) {\n\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\tif (!allowed) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst instance = definition.query.instantiate(params, ctx);\n\t\tconst initial = await instance.hydrate();\n\t\tconst atVersion = version;\n\t\tconst subscription: ActiveSubscription = {\n\t\t\tkind: 'graph',\n\t\t\tcollection,\n\t\t\tinstance,\n\t\t\tkey: definition.key as (row: unknown) => RowKey,\n\t\t\tonDiff\n\t\t};\n\t\tset.add(subscription);\n\t\treturn {\n\t\t\tinitial,\n\t\t\tcursor: currentCursor(),\n\t\t\tversion: atVersion,\n\t\t\tunsubscribe: () => {\n\t\t\t\tset.delete(subscription);\n\t\t\t}\n\t\t};\n\t};\n\n\tconst subscribeReactive = async (\n\t\tcollection: string,\n\t\tdefinition: ReactiveQueryDefinition<unknown, unknown, unknown>,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\tonDiff: OnDiff,\n\t\tset: Set<ActiveSubscription>\n\t): Promise<Subscription<unknown>> => {\n\t\tif (definition.authorize !== undefined) {\n\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\tif (!allowed) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\t// Each run gets a fresh read set; the handle records tables + row keys read.\n\t\tconst rerun = async () => {\n\t\t\tconst readTables = new Set<string>();\n\t\t\tconst readKeys = new Set<string>();\n\t\t\tconst rangeDeps: RangeDep[] = [];\n\t\t\tconst db = makeReadHandle(ctx, readTables, readKeys, rangeDeps);\n\t\t\tconst rows = [...(await definition.run({ ctx, db, params }))];\n\t\t\treturn { rangeDeps, readKeys, readTables, rows };\n\t\t};\n\t\tconst rerunKey = stableSubKey(collection, params, ctx);\n\t\t// Cross-client cache hit (1.3+): a previous subscriber with the same\n\t\t// (collection, params, ctx) ran the query body recently and its\n\t\t// result is still valid (no overlapping write since). Reuse it\n\t\t// instead of hitting the DB again. Cache misses fall through to\n\t\t// `rerun()` and populate the cache for the next subscriber.\n\t\tconst cached = readCacheEntry(rerunKey);\n\t\tconst first =\n\t\t\tcached !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\trangeDeps: cached.rangeDeps,\n\t\t\t\t\t\treadKeys: cached.readKeys,\n\t\t\t\t\t\treadTables: cached.readTables,\n\t\t\t\t\t\trows: cached.rows\n\t\t\t\t\t}\n\t\t\t\t: await rerun();\n\t\tif (cached === undefined) {\n\t\t\twriteCacheEntry({\n\t\t\t\texpiresAt: Date.now() + reactiveCacheTtlMs,\n\t\t\t\trangeDeps: first.rangeDeps,\n\t\t\t\treadKeys: first.readKeys,\n\t\t\t\treadTables: first.readTables,\n\t\t\t\trerunKey,\n\t\t\t\trows: first.rows,\n\t\t\t\tversion\n\t\t\t});\n\t\t}\n\t\tconst current = new Map<RowKey, unknown>();\n\t\tfor (const row of first.rows) {\n\t\t\tcurrent.set(definition.key(row), row);\n\t\t}\n\t\tconst atVersion = version;\n\t\tconst subscription: ReactiveSub = {\n\t\t\tkind: 'reactive',\n\t\t\tcollection,\n\t\t\tkey: definition.key,\n\t\t\trerun,\n\t\t\trerunKey,\n\t\t\tcurrent,\n\t\t\treadTables: first.readTables,\n\t\t\treadKeys: first.readKeys,\n\t\t\trangeDeps: first.rangeDeps,\n\t\t\tonDiff\n\t\t};\n\t\tset.add(subscription);\n\t\treactiveSubs.add(subscription);\n\t\treturn {\n\t\t\tinitial: first.rows,\n\t\t\tcursor: currentCursor(),\n\t\t\tversion: atVersion,\n\t\t\tunsubscribe: () => {\n\t\t\t\tset.delete(subscription);\n\t\t\t\treactiveSubs.delete(subscription);\n\t\t\t}\n\t\t};\n\t};\n\n\tconst subscribeSearch = async (\n\t\tcollection: string,\n\t\tdefinition: SearchCollectionDefinition<unknown, unknown, unknown>,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\tonDiff: OnDiff,\n\t\tset: Set<ActiveSubscription>\n\t): Promise<Subscription<unknown>> => {\n\t\t// The subscription params are the query (a string for text, a vector for\n\t\t// similarity).\n\t\tconst query = params;\n\t\tif (definition.authorize !== undefined) {\n\t\t\tconst allowed = await definition.authorize(query, ctx);\n\t\t\tif (!allowed) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst entry = await ensureSearchIndex(definition);\n\t\tconst limit = definition.limit ?? 20;\n\t\tconst readRule = readRuleFor(definition.table);\n\t\t// Re-rank: top-K from the (shared, live) index, scoped by the read rule,\n\t\t// each row tagged with its score so the client can sort by relevance.\n\t\tconst rerun = (): unknown[] => {\n\t\t\tconst candidates = entry.index.search(\n\t\t\t\tquery,\n\t\t\t\treadRule ? limit * 5 : limit\n\t\t\t);\n\t\t\tconst visible = readRule\n\t\t\t\t? candidates.filter((hit) => readRule(ctx, hit.row))\n\t\t\t\t: candidates;\n\t\t\treturn visible.slice(0, limit).map((hit) => ({\n\t\t\t\t...(hit.row as Record<string, unknown>),\n\t\t\t\t[SEARCH_SCORE_FIELD]: hit.score\n\t\t\t}));\n\t\t};\n\t\tconst initial = rerun();\n\t\tconst current = new Map<RowKey, unknown>();\n\t\tfor (const row of initial) {\n\t\t\tcurrent.set(definition.key(row), row);\n\t\t}\n\t\tconst atVersion = version;\n\t\tconst subscription: Extract<ActiveSubscription, { kind: 'search' }> = {\n\t\t\tkind: 'search',\n\t\t\tcollection,\n\t\t\tkey: definition.key,\n\t\t\trerun,\n\t\t\tcurrent,\n\t\t\tonDiff\n\t\t};\n\t\tset.add(subscription);\n\t\tsearchSubs.add(subscription);\n\t\treturn {\n\t\t\tinitial,\n\t\t\tcursor: currentCursor(),\n\t\t\tversion: atVersion,\n\t\t\tunsubscribe: () => {\n\t\t\t\tset.delete(subscription);\n\t\t\t\tsearchSubs.delete(subscription);\n\t\t\t}\n\t\t};\n\t};\n\n\tconst engine: SyncEngine = {\n\t\tregister: (collection) => {\n\t\t\tregistry.set(collection.name, collection);\n\t\t\tfor (const table of collection.tables ?? [collection.name]) {\n\t\t\t\taddTableIndex(table, collection.name);\n\t\t\t}\n\t\t},\n\n\t\tregisterJoin: (collection) => {\n\t\t\tregistry.set(collection.name, collection);\n\t\t\taddTableIndex(collection.left.table, collection.name);\n\t\t\taddTableIndex(collection.right.table, collection.name);\n\t\t},\n\n\t\tregisterGraph: (collection) => {\n\t\t\tregistry.set(collection.name, collection);\n\t\t\tfor (const table of collection.query.tables()) {\n\t\t\t\taddTableIndex(table, collection.name);\n\t\t\t}\n\t\t},\n\n\t\tregisterSearch: (collection) => {\n\t\t\t// Like reactive: not in tableIndex — its index is driven directly by\n\t\t\t// searchPairs off the change feed.\n\t\t\tregistry.set(collection.name, collection);\n\t\t},\n\n\t\tsubscribe: async ({ collection, params, ctx, onDiff, since, signal }) => {\n\t\t\t// 1.21.0: wrap subscribe setup in a span. The Subscription\n\t\t\t// lives past `subscribe()` returning — the span only covers\n\t\t\t// the setup cost (authorize / hydrate / view materialization),\n\t\t\t// not the ongoing reactive lifetime.\n\t\t\tconst subscribeSpan = tracer.startSpan('sync.subscribe', {\n\t\t\t\tattributes: {\n\t\t\t\t\t[ABS_ATTRS.engineId]: instanceId,\n\t\t\t\t\t[ABS_ATTRS.collection]: collection\n\t\t\t\t}\n\t\t\t});\n\t\t\ttry {\n\t\t\t// (1.15.0) Cheap up-front check — if the consumer already aborted\n\t\t\t// before we got here, throw before any side effect (no authorize,\n\t\t\t// no hydrate, no view materialization).\n\t\t\tcheckAborted(signal);\n\n\t\t\tconst registered = registry.get(collection);\n\t\t\tif (registered === undefined) {\n\t\t\t\tthrow new Error(`Unknown collection \"${collection}\"`);\n\t\t\t}\n\n\t\t\t// (1.20.1) Per-tenant cap. Acquired BEFORE authorize/hydrate/any\n\t\t\t// state allocation. If subscribe throws between here and the\n\t\t\t// successful return (auth rejection, abort, schema error, etc.)\n\t\t\t// we release in the `catch` below — otherwise the wrapped\n\t\t\t// `unsubscribe` is the release path.\n\t\t\tconst tenantSlot = acquireSubscriptionSlot(ctx, { collection });\n\t\t\tlet slotHandedOff = false;\n\t\t\ttry {\n\n\t\t\tconst typedOnDiff = onDiff as OnDiff;\n\t\t\tconst subscribeSet = subsFor(collection);\n\n\t\t\t// Wrap the eventual return so we (a) re-check signal after the\n\t\t\t// async setup (catches mid-flight aborts), (b) auto-call\n\t\t\t// unsubscribe when signal fires after the subscription is live,\n\t\t\t// and (c) decrement the tenant's active-sub count idempotently\n\t\t\t// when unsubscribe runs.\n\t\t\tconst wrapReturn = <T>(sub: Subscription<T>): Subscription<T> => {\n\t\t\t\tcheckAborted(signal);\n\t\t\t\tconst innerUnsubscribe = sub.unsubscribe;\n\t\t\t\tlet released = false;\n\t\t\t\tconst wrappedUnsubscribe = (): void => {\n\t\t\t\t\tif (released) return;\n\t\t\t\t\treleased = true;\n\t\t\t\t\treleaseSubscriptionSlot(tenantSlot);\n\t\t\t\t\tinnerUnsubscribe();\n\t\t\t\t};\n\t\t\t\tconst wrapped = { ...sub, unsubscribe: wrappedUnsubscribe };\n\t\t\t\tlinkAbortToUnsubscribe(signal, wrappedUnsubscribe);\n\t\t\t\tslotHandedOff = true;\n\t\t\t\treturn wrapped;\n\t\t\t};\n\n\t\t\tconst registeredKind = (registered as { kind?: string }).kind;\n\t\t\tif (registeredKind === 'join') {\n\t\t\t\tconst joined = await subscribeJoin(\n\t\t\t\t\tcollection,\n\t\t\t\t\tregistered as JoinCollectionDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t\tparams,\n\t\t\t\t\tctx,\n\t\t\t\t\ttypedOnDiff,\n\t\t\t\t\tsubscribeSet\n\t\t\t\t);\n\t\t\t\treturn wrapReturn(joined) as Subscription<never>;\n\t\t\t}\n\t\t\tif (registeredKind === 'graph') {\n\t\t\t\tconst graphed = await subscribeGraph(\n\t\t\t\t\tcollection,\n\t\t\t\t\tregistered as GraphCollectionDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t\tparams,\n\t\t\t\t\tctx,\n\t\t\t\t\ttypedOnDiff,\n\t\t\t\t\tsubscribeSet\n\t\t\t\t);\n\t\t\t\treturn wrapReturn(graphed) as Subscription<never>;\n\t\t\t}\n\t\t\tif (registeredKind === 'reactive') {\n\t\t\t\tconst reactived = await subscribeReactive(\n\t\t\t\t\tcollection,\n\t\t\t\t\tregistered as ReactiveQueryDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t\tparams,\n\t\t\t\t\tctx,\n\t\t\t\t\ttypedOnDiff,\n\t\t\t\t\tsubscribeSet\n\t\t\t\t);\n\t\t\t\treturn wrapReturn(reactived) as Subscription<never>;\n\t\t\t}\n\t\t\tif (registeredKind === 'search') {\n\t\t\t\tconst searched = await subscribeSearch(\n\t\t\t\t\tcollection,\n\t\t\t\t\tregistered as SearchCollectionDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t\tparams,\n\t\t\t\t\tctx,\n\t\t\t\t\ttypedOnDiff,\n\t\t\t\t\tsubscribeSet\n\t\t\t\t);\n\t\t\t\treturn wrapReturn(searched) as Subscription<never>;\n\t\t\t}\n\t\t\tconst definition = registered as CollectionDefinition<\n\t\t\t\tunknown,\n\t\t\t\tunknown,\n\t\t\t\tunknown\n\t\t\t>;\n\n\t\t\tif (definition.authorize !== undefined) {\n\t\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\t\tif (!allowed) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst key = definition.key ?? defaultKey;\n\t\t\tconst match = definition.match;\n\t\t\tconst tables = definition.tables ?? [collection];\n\t\t\t// Declarative read rule + schema migration apply to single-table\n\t\t\t// collections (their rows are that table's rows); join/aggregate\n\t\t\t// collections scope via match.\n\t\t\tconst scopedTable = tables.length === 1 ? tables[0]! : undefined;\n\t\t\tconst readRule =\n\t\t\t\tscopedTable !== undefined\n\t\t\t\t\t? readRuleFor(scopedTable)\n\t\t\t\t\t: undefined;\n\t\t\t// Migrate the DB result to the current shape, then filter it through the\n\t\t\t// read rule — so the initial snapshot and the refetch fallback are\n\t\t\t// always current-shape and never include a row the caller can't see.\n\t\t\tconst rehydrate = async () => {\n\t\t\t\tconst raw = [...(await definition.hydrate(params, ctx))];\n\t\t\t\tconst rows =\n\t\t\t\t\tscopedTable !== undefined\n\t\t\t\t\t\t? raw.map((row) => migrateRow(scopedTable, row))\n\t\t\t\t\t\t: raw;\n\t\t\t\treturn readRule\n\t\t\t\t\t? rows.filter((row) => readRule(ctx, row))\n\t\t\t\t\t: rows;\n\t\t\t};\n\t\t\t// Incremental matching only applies to single-table collections; a\n\t\t\t// join/aggregate spanning tables can't match a single row, so it uses\n\t\t\t// the refetch fallback.\n\t\t\tconst incremental = match !== undefined && tables.length === 1;\n\t\t\t// Fold the read rule into the incremental predicate (also used by the\n\t\t\t// catch-up builder), so an unreadable row never enters the view.\n\t\t\tconst boundMatch = incremental\n\t\t\t\t? (row: unknown) =>\n\t\t\t\t\t\tmatch(row, params, ctx) &&\n\t\t\t\t\t\t(readRule ? readRule(ctx, row) : true)\n\t\t\t\t: () => true;\n\t\t\tconst view = createMaterializedView<unknown>({\n\t\t\t\tkey,\n\t\t\t\tmatch: boundMatch\n\t\t\t});\n\n\t\t\t// Resume from the log when possible (catch-up diff); else send a\n\t\t\t// snapshot. The view is hydrated either way so future changes match.\n\t\t\tconst resuming =\n\t\t\t\tsince !== undefined && canResume(since, incremental);\n\t\t\tview.hydrate([...(await rehydrate())]);\n\t\t\tconst atVersion = version;\n\n\t\t\tconst subscription: ActiveSubscription = {\n\t\t\t\tkind: 'view',\n\t\t\t\tcollection,\n\t\t\t\tview,\n\t\t\t\tincremental,\n\t\t\t\trehydrate,\n\t\t\t\tkey,\n\t\t\t\tonDiff: typedOnDiff\n\t\t\t};\n\t\t\tsubscribeSet.add(subscription);\n\n\t\t\tconst unsubscribe = () => {\n\t\t\t\tsubscribeSet.delete(subscription);\n\t\t\t};\n\n\t\t\tif (resuming) {\n\t\t\t\treturn wrapReturn({\n\t\t\t\t\tinitial: [],\n\t\t\t\t\tcatchup: buildCatchup(\n\t\t\t\t\t\tsince,\n\t\t\t\t\t\ttables,\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tboundMatch\n\t\t\t\t\t) as ViewDiff<never>,\n\t\t\t\t\tcursor: currentCursor(),\n\t\t\t\t\tversion: atVersion,\n\t\t\t\t\tunsubscribe\n\t\t\t\t}) as Subscription<never>;\n\t\t\t}\n\t\t\treturn wrapReturn({\n\t\t\t\tinitial: view.rows() as never[],\n\t\t\t\tcursor: currentCursor(),\n\t\t\t\tversion: atVersion,\n\t\t\t\tunsubscribe\n\t\t\t}) as Subscription<never>;\n\t\t\t} catch (error) {\n\t\t\t\t// (1.20.1) If anything between acquire and the successful\n\t\t\t\t// return throws (authorize, abort, schema error, etc.),\n\t\t\t\t// release the tenant slot so the cap doesn't leak by one\n\t\t\t\t// per failed call.\n\t\t\t\tif (!slotHandedOff) releaseSubscriptionSlot(tenantSlot);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\t} catch (spanError) {\n\t\t\t\t// 1.21.0: outer span wrap — re-throw, recording any\n\t\t\t\t// failure (subscribe-time errors are common and worth\n\t\t\t\t// surfacing).\n\t\t\t\tsubscribeSpan.recordException(spanError);\n\t\t\t\tsubscribeSpan.setStatus({\n\t\t\t\t\tcode: 2 /* SpanStatusCode.ERROR */,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\tspanError instanceof Error\n\t\t\t\t\t\t\t? spanError.message\n\t\t\t\t\t\t\t: String(spanError)\n\t\t\t\t});\n\t\t\t\tthrow spanError;\n\t\t\t} finally {\n\t\t\t\tsubscribeSpan.end();\n\t\t\t}\n\t\t},\n\n\t\thydrate: async (collection, params, ctx, options) => {\n\t\t\tconst signal = options?.signal;\n\t\t\tcheckAborted(signal);\n\t\t\tconst definition = registry.get(collection) as\n\t\t\t\t| CollectionDefinition<unknown, unknown, unknown>\n\t\t\t\t| undefined;\n\t\t\tif (definition === undefined) {\n\t\t\t\tthrow new Error(`Unknown collection \"${collection}\"`);\n\t\t\t}\n\t\t\tif (definition.authorize !== undefined) {\n\t\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\t\tcheckAborted(signal);\n\t\t\t\tif (!allowed) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t`hydrate collection \"${collection}\"`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst raw = [...(await definition.hydrate(params, ctx))];\n\t\t\tcheckAborted(signal);\n\t\t\tconst tables = definition.tables ?? [collection];\n\t\t\tconst scopedTable = tables.length === 1 ? tables[0]! : undefined;\n\t\t\tconst rows =\n\t\t\t\tscopedTable !== undefined\n\t\t\t\t\t? raw.map((row) => migrateRow(scopedTable, row))\n\t\t\t\t\t: raw;\n\t\t\tconst readRule =\n\t\t\t\tscopedTable !== undefined\n\t\t\t\t\t? readRuleFor(scopedTable)\n\t\t\t\t\t: undefined;\n\t\t\treturn readRule ? rows.filter((row) => readRule(ctx, row)) : rows;\n\t\t},\n\n\t\tapplyChange: (table, change) =>\n\t\t\tapplyChange(table, change as RowChange<unknown>),\n\n\t\tconnectSource: async (source) => {\n\t\t\tawait source.start((table, change) => applyChange(table, change));\n\t\t\treturn async () => {\n\t\t\t\tawait source.stop();\n\t\t\t};\n\t\t},\n\n\t\tconnectCluster: async (bus) => {\n\t\t\tconst unsubscribe = await bus.subscribe((message) => {\n\t\t\t\t// Ignore our own broadcasts; apply peers' changes locally without\n\t\t\t\t// re-broadcasting (that would loop).\n\t\t\t\tif (message.origin === instanceId) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// 1.17.0 — log peer changes with their origin + originVersion\n\t\t\t\t// so a client carrying a cross-instance cursor can resume\n\t\t\t\t// against them. Pre-1.17 buses that don't carry originVersion\n\t\t\t\t// default to 0 (any cross-instance resume falls back to a\n\t\t\t\t// snapshot — matches pre-1.17 behavior exactly).\n\t\t\t\tvoid applyChangeBatch(message.changes, false, {\n\t\t\t\t\torigin: message.origin,\n\t\t\t\t\toriginVersion: message.originVersion ?? 0\n\t\t\t\t});\n\t\t\t});\n\t\t\tclusterBus = bus;\n\n\t\t\treturn async () => {\n\t\t\t\tclusterBus = undefined;\n\t\t\t\tawait unsubscribe();\n\t\t\t};\n\t\t},\n\n\t\tsubscriptionCount: (collection) => {\n\t\t\tif (collection !== undefined) {\n\t\t\t\treturn active.get(collection)?.size ?? 0;\n\t\t\t}\n\t\t\tlet total = 0;\n\t\t\tfor (const set of active.values()) {\n\t\t\t\ttotal += set.size;\n\t\t\t}\n\t\t\treturn total;\n\t\t},\n\n\t\tregisterMutation: (mutation) => {\n\t\t\tif (\n\t\t\t\tmutation.handler === undefined &&\n\t\t\t\tmutation.sandboxedHandler === undefined\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Mutation \"${mutation.name}\" must define either \\`handler\\` or \\`sandboxedHandler\\``\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (\n\t\t\t\tmutation.handler !== undefined &&\n\t\t\t\tmutation.sandboxedHandler !== undefined\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Mutation \"${mutation.name}\" defines both \\`handler\\` and \\`sandboxedHandler\\` — pick one`\n\t\t\t\t);\n\t\t\t}\n\t\t\tmutations.set(mutation.name, mutation);\n\t\t\t// Build the sandbox runner eagerly only if we know the source —\n\t\t\t// the actual isolate spawn is still lazy (inside makeSandboxedHandler).\n\t\t\tif (mutation.sandboxedHandler !== undefined) {\n\t\t\t\tsandboxRunners.set(\n\t\t\t\t\tmutation.name,\n\t\t\t\t\tmakeSandboxedHandler(\n\t\t\t\t\t\tmutation.sandboxedHandler,\n\t\t\t\t\t\tmutation.sandbox,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbridgeFetch: options.bridgeFetch,\n\t\t\t\t\t\t\tmetricsHook:\n\t\t\t\t\t\t\t\toptions.handlerMetrics === undefined\n\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t\t\tmutationName: mutation.name,\n\t\t\t\t\t\t\t\t\t\t\tonMetrics: options.handlerMetrics\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tregisterWriter: (table, writer) => {\n\t\t\twriters.set(table, writer as TableWriter);\n\t\t},\n\n\t\tregisterReactive: (query) => {\n\t\t\tregistry.set(query.name, query);\n\t\t},\n\n\t\tregisterReader: (table, reader) => {\n\t\t\treaders.set(table, reader as TableReader);\n\t\t},\n\n\t\tregisterPermissions: (table, rules) => {\n\t\t\tpermissions.set(table, rules as TablePermissions<unknown, unknown>);\n\t\t},\n\n\t\tregisterSchema: (table, schema) => {\n\t\t\tschemas.set(table, schema as TableSchema<unknown>);\n\t\t},\n\n\t\tregisterCrdt: (table, fields) => {\n\t\t\tcrdtFields.set(\n\t\t\t\ttable,\n\t\t\t\tfields as Record<string, CrdtMergeable<unknown>>\n\t\t\t);\n\t\t\t// A ready-made merge mutation so a client needs no custom server code:\n\t\t\t// upsert the row patch — the CRDT auto-merge in makeActions folds the\n\t\t\t// declared fields into the stored row. Named \"<table>:merge\".\n\t\t\tconst name = `${table}:merge`;\n\t\t\tmutations.set(name, {\n\t\t\t\thandler: async (args, ctx, actions) => {\n\t\t\t\t\tconst existing = await readExisting(table, args, ctx);\n\t\t\t\t\treturn existing === undefined\n\t\t\t\t\t\t? actions.insert(table, args)\n\t\t\t\t\t\t: actions.update(table, args);\n\t\t\t\t},\n\t\t\t\tname\n\t\t\t} as MutationDefinition<unknown, unknown, unknown>);\n\t\t},\n\n\t\tmigrate: (table, row) => migrateRow(table, row) as typeof row,\n\n\t\trunMutation: async (name, args, ctx) => {\n\t\t\t// 1.21.0: wrap the entire mutation lifecycle in a span. Noop\n\t\t\t// when no tracerProvider was supplied.\n\t\t\tconst span = tracer.startSpan('sync.runMutation', {\n\t\t\t\tattributes: {\n\t\t\t\t\t[ABS_ATTRS.engineId]: instanceId,\n\t\t\t\t\t[ABS_ATTRS.mutation]: name\n\t\t\t\t}\n\t\t\t});\n\t\t\ttry {\n\t\t\t\t// 1.24.0: reject early when fenced — before authorize, before\n\t\t\t\t// slot acquisition. Operators expect a fenced engine to be a\n\t\t\t\t// hard wall, not a queue.\n\t\t\t\tif (activeFences.size > 0) {\n\t\t\t\t\tconst oldest = activeFences.values().next()\n\t\t\t\t\t\t.value as FenceHandle;\n\t\t\t\t\tthrow new EngineFencedError(oldest.reason);\n\t\t\t\t}\n\t\t\t\tconst mutation = mutations.get(name);\n\t\t\t\tif (mutation === undefined) {\n\t\t\t\t\tthrow new Error(`Unknown mutation \"${name}\"`);\n\t\t\t\t}\n\t\t\tif (mutation.authorize !== undefined) {\n\t\t\t\tconst allowed = await mutation.authorize(args, ctx);\n\t\t\t\tif (!allowed) {\n\t\t\t\t\tthrow new UnauthorizedError(`run mutation \"${name}\"`);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 1.20.0: gate at the entry. Wait if `mutationConcurrency`\n\t\t\t// is saturated; throw `MutationQueueOverflowError` if the\n\t\t\t// queue is also capped and full. Authorization fails before\n\t\t\t// the gate so a denied call never burns a slot.\n\t\t\tawait acquireMutationSlot();\n\n\t\t\t// Pick the handler shape: in-process function or sandboxed string\n\t\t\t// source (runs inside @absolutejs/isolated-jsc). Sandbox runner is\n\t\t\t// built lazily and pre-cached in registerMutation.\n\t\t\tconst sandboxRunner = sandboxRunners.get(name);\n\t\t\tconst invokeHandler =\n\t\t\t\tsandboxRunner !== undefined\n\t\t\t\t\t? sandboxRunner\n\t\t\t\t\t: (\n\t\t\t\t\t\t\ta: unknown,\n\t\t\t\t\t\t\tc: unknown,\n\t\t\t\t\t\t\tactions: MutationActions\n\t\t\t\t\t\t): Promise<unknown> =>\n\t\t\t\t\t\t\tPromise.resolve(\n\t\t\t\t\t\t\t\t// Non-null assertion: registerMutation guarantees one of\n\t\t\t\t\t\t\t\t// handler/sandboxedHandler is defined.\n\t\t\t\t\t\t\t\tmutation.handler!(a, c, actions)\n\t\t\t\t\t\t\t);\n\n\t\t\t// Run the handler (optionally inside the DB transaction), collecting its\n\t\t\t// changes into a fresh buffer per attempt — so a transaction that retries\n\t\t\t// or rolls back never double-emits or leaks a half-applied batch.\n\t\t\tconst runHandler = async (tx: unknown) => {\n\t\t\t\tconst { actions, buffered } = makeActions(tx, ctx, true);\n\t\t\t\tconst result = await invokeHandler(args, ctx, actions);\n\t\t\t\treturn { buffered, result };\n\t\t\t};\n\n\t\t\t// Resolve the retry policy once per call. When `mutation.retry` is\n\t\t\t// undefined we still go through the loop, but bounded to one\n\t\t\t// attempt with no backoff (cheaper than a separate code path).\n\t\t\tconst retry = mutation.retry;\n\t\t\tconst maxAttempts =\n\t\t\t\tretry === undefined ? 1 : (retry.maxAttempts ?? 5);\n\t\t\tconst isRetryable = retry?.isRetryable ?? isSerializationFailure;\n\t\t\tconst computeDelay = retry?.backoff ?? exponentialBackoff();\n\t\t\tconst maxElapsedMs = retry?.maxElapsedMs ?? 30_000;\n\t\t\tconst startedAt = Date.now();\n\n\t\t\t// Each attempt builds fresh `actions`/`buffered` via the makeActions\n\t\t\t// call inside runHandler, so a retry never inherits half-applied\n\t\t\t// buffered changes from a failed attempt. Transactions reopen too:\n\t\t\t// runInTransaction wraps each individual attempt.\n\t\t\tlet lastError: unknown;\n\t\t\tlet attemptsMade = 0;\n\t\t\ttry {\n\t\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\t\tattemptsMade = attempt;\n\t\t\t\ttry {\n\t\t\t\t\tconst { buffered, result } =\n\t\t\t\t\t\trunInTransaction !== undefined\n\t\t\t\t\t\t\t? await runInTransaction((tx) => runHandler(tx))\n\t\t\t\t\t\t\t: await runHandler(undefined);\n\t\t\t\t\tawait applyChangeBatch(buffered);\n\t\t\t\t\tmutationsCompleted += 1;\n\t\t\t\t\temitActivity({\n\t\t\t\t\t\ttype: 'mutation',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tstatus: 'ok'\n\t\t\t\t\t});\n\t\t\t\t\treturn result;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlastError = error;\n\t\t\t\t\tconst elapsedMs = Date.now() - startedAt;\n\t\t\t\t\tconst canRetry =\n\t\t\t\t\t\tattempt < maxAttempts &&\n\t\t\t\t\t\tisRetryable(error) &&\n\t\t\t\t\t\telapsedMs < maxElapsedMs;\n\t\t\t\t\tif (!canRetry) break;\n\t\t\t\t\tmutationsRetried += 1;\n\n\t\t\t\t\tconst rawDelay = computeDelay(attempt);\n\t\t\t\t\t// Cap the delay so we don't blow past maxElapsedMs while\n\t\t\t\t\t// sleeping. If the cap would be negative we're already past\n\t\t\t\t\t// the budget; treat as exhausted.\n\t\t\t\t\tconst remaining = maxElapsedMs - elapsedMs;\n\t\t\t\t\tif (remaining <= 0) break;\n\t\t\t\t\tconst delayMs = Math.max(0, Math.min(rawDelay, remaining));\n\n\t\t\t\t\temitActivity({\n\t\t\t\t\t\ttype: 'mutationRetry',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\tdelayMs,\n\t\t\t\t\t\terrorName:\n\t\t\t\t\t\t\terror instanceof Error ? error.name : 'Error',\n\t\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t\t\t: String(error)\n\t\t\t\t\t});\n\t\t\t\t\tif (delayMs > 0) {\n\t\t\t\t\t\tawait new Promise((resolve) =>\n\t\t\t\t\t\t\tsetTimeout(resolve, delayMs)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmutationsFailed += 1;\n\t\t\temitActivity({\n\t\t\t\ttype: 'mutation',\n\t\t\t\tat: Date.now(),\n\t\t\t\tname,\n\t\t\t\tstatus: 'error'\n\t\t\t});\n\t\t\t// Wrap only when we actually burned through more than one attempt\n\t\t\t// — a non-retryable first-attempt failure passes through with its\n\t\t\t// original error preserved, even if `retry` is configured.\n\t\t\tif (attemptsMade > 1) {\n\t\t\t\tthrow new RetriesExhaustedError(\n\t\t\t\t\tattemptsMade,\n\t\t\t\t\tDate.now() - startedAt,\n\t\t\t\t\tlastError\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow lastError;\n\t\t\t} finally {\n\t\t\t\treleaseMutationSlot();\n\t\t\t}\n\t\t\t} catch (spanError) {\n\t\t\t\t// 1.21.0: outer span wrap — record any throw, rethrow.\n\t\t\t\tspan.recordException(spanError);\n\t\t\t\tspan.setStatus({\n\t\t\t\t\tcode: 2 /* SpanStatusCode.ERROR */,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\tspanError instanceof Error\n\t\t\t\t\t\t\t? spanError.message\n\t\t\t\t\t\t\t: String(spanError)\n\t\t\t\t});\n\t\t\t\tthrow spanError;\n\t\t\t} finally {\n\t\t\t\tspan.end();\n\t\t\t}\n\t\t},\n\n\t\trunMutations: async (specs, ctx) => {\n\t\t\t// Empty batch: short-circuit. Don't open a DB tx for nothing —\n\t\t\t// some adapters (PG with auto-commit, MySQL with implicit\n\t\t\t// commit, etc.) count even an empty BEGIN/COMMIT as a real\n\t\t\t// transaction, which is wasteful and noisy in observability.\n\t\t\tif (specs.length === 0) return [];\n\t\t\t// Snapshot the requested mutation names up front so the\n\t\t\t// authorization + handler resolution happens BEFORE we open\n\t\t\t// the DB transaction. A typo'd name aborts cleanly without\n\t\t\t// burning a tx.\n\t\t\tconst resolved = specs.map((spec) => {\n\t\t\t\tconst mutation = mutations.get(spec.name);\n\t\t\t\tif (mutation === undefined) {\n\t\t\t\t\tthrow new Error(`Unknown mutation \"${spec.name}\"`);\n\t\t\t\t}\n\t\t\t\treturn { args: spec.args, mutation, name: spec.name };\n\t\t\t});\n\t\t\t// 1.20.0: the whole batch is one slot. Resolve names BEFORE\n\t\t\t// the gate so an unknown-mutation typo never queues.\n\t\t\tawait acquireMutationSlot();\n\n\t\t\tconst runBatch = async (tx: unknown) => {\n\t\t\t\tconst results: unknown[] = [];\n\t\t\t\tconst accumulated: {\n\t\t\t\t\ttable: string;\n\t\t\t\t\tchange: RowChange<unknown>;\n\t\t\t\t}[] = [];\n\t\t\t\tfor (const { args, mutation, name } of resolved) {\n\t\t\t\t\tif (mutation.authorize !== undefined) {\n\t\t\t\t\t\tconst allowed = await mutation.authorize(args, ctx);\n\t\t\t\t\t\tif (!allowed) {\n\t\t\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t\t\t`run mutation \"${name}\"`\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\tconst sandboxRunner = sandboxRunners.get(name);\n\t\t\t\t\tconst invokeHandler =\n\t\t\t\t\t\tsandboxRunner !== undefined\n\t\t\t\t\t\t\t? sandboxRunner\n\t\t\t\t\t\t\t: (\n\t\t\t\t\t\t\t\t\ta: unknown,\n\t\t\t\t\t\t\t\t\tc: unknown,\n\t\t\t\t\t\t\t\t\tactions: MutationActions\n\t\t\t\t\t\t\t\t): Promise<unknown> =>\n\t\t\t\t\t\t\t\t\tPromise.resolve(\n\t\t\t\t\t\t\t\t\t\tmutation.handler!(a, c, actions)\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t// Each handler gets its own `actions`/`buffered` so per-\n\t\t\t\t\t// call validation + crdt merges still work — we collect\n\t\t\t\t\t// the buffered tail into `accumulated` after each\n\t\t\t\t\t// handler returns. If the next handler throws, the\n\t\t\t\t\t// surrounding `runInTransaction` rolls everything back;\n\t\t\t\t\t// applyChangeBatch never runs.\n\t\t\t\t\tconst { actions, buffered } = makeActions(tx, ctx, true);\n\t\t\t\t\tconst result = await invokeHandler(args, ctx, actions);\n\t\t\t\t\tresults.push(result);\n\t\t\t\t\taccumulated.push(...buffered);\n\t\t\t\t}\n\t\t\t\treturn { accumulated, results };\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tconst { accumulated, results } =\n\t\t\t\t\trunInTransaction !== undefined\n\t\t\t\t\t\t? await runInTransaction((tx) => runBatch(tx))\n\t\t\t\t\t\t: await runBatch(undefined);\n\t\t\t\tawait applyChangeBatch(accumulated);\n\t\t\t\temitActivity({\n\t\t\t\t\ttype: 'mutationBatch',\n\t\t\t\t\tat: Date.now(),\n\t\t\t\t\tnames: resolved.map((entry) => entry.name),\n\t\t\t\t\tstatus: 'ok'\n\t\t\t\t});\n\t\t\t\treturn results;\n\t\t\t} catch (error) {\n\t\t\t\temitActivity({\n\t\t\t\t\ttype: 'mutationBatch',\n\t\t\t\t\tat: Date.now(),\n\t\t\t\t\tnames: resolved.map((entry) => entry.name),\n\t\t\t\t\tstatus: 'error'\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\treleaseMutationSlot();\n\t\t\t}\n\t\t},\n\n\t\tregisterSchedule: (schedule) => {\n\t\t\tschedules.set(schedule.name, schedule);\n\t\t},\n\n\t\tlistSchedules: () => [...schedules.values()],\n\n\t\trunSchedule: async (name) => {\n\t\t\tconst schedule = schedules.get(name);\n\t\t\tif (schedule === undefined) {\n\t\t\t\tthrow new Error(`Unknown schedule \"${name}\"`);\n\t\t\t}\n\t\t\t// A schedule reads unscoped and writes without permission checks (it's\n\t\t\t// trusted server code); its writes emit as one live batch like a mutation.\n\t\t\tconst runHandler = async (tx: unknown) => {\n\t\t\t\tconst { actions, buffered } = makeActions(tx, {}, false);\n\t\t\t\tconst db = makeReadHandle({}, new Set(), new Set(), [], false);\n\t\t\t\tawait schedule.run({ actions, db });\n\t\t\t\treturn buffered;\n\t\t\t};\n\n\t\t\tconst retry = schedule.retry;\n\t\t\tconst maxAttempts =\n\t\t\t\tretry === undefined ? 1 : (retry.maxAttempts ?? 5);\n\t\t\tconst isRetryable = retry?.isRetryable ?? isSerializationFailure;\n\t\t\tconst computeDelay = retry?.backoff ?? exponentialBackoff();\n\t\t\tconst maxElapsedMs = retry?.maxElapsedMs ?? 30_000;\n\t\t\tconst startedAt = Date.now();\n\n\t\t\tlet lastError: unknown;\n\t\t\tlet attemptsMade = 0;\n\t\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\t\tattemptsMade = attempt;\n\t\t\t\ttry {\n\t\t\t\t\tconst buffered =\n\t\t\t\t\t\trunInTransaction !== undefined\n\t\t\t\t\t\t\t? await runInTransaction((tx) => runHandler(tx))\n\t\t\t\t\t\t\t: await runHandler(undefined);\n\t\t\t\t\tawait applyChangeBatch(buffered);\n\t\t\t\t\temitActivity({\n\t\t\t\t\t\ttype: 'schedule',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tstatus: 'ok'\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlastError = error;\n\t\t\t\t\tconst elapsedMs = Date.now() - startedAt;\n\t\t\t\t\tconst canRetry =\n\t\t\t\t\t\tattempt < maxAttempts &&\n\t\t\t\t\t\tisRetryable(error) &&\n\t\t\t\t\t\telapsedMs < maxElapsedMs;\n\t\t\t\t\tif (!canRetry) break;\n\n\t\t\t\t\tconst rawDelay = computeDelay(attempt);\n\t\t\t\t\tconst remaining = maxElapsedMs - elapsedMs;\n\t\t\t\t\tif (remaining <= 0) break;\n\t\t\t\t\tconst delayMs = Math.max(0, Math.min(rawDelay, remaining));\n\n\t\t\t\t\temitActivity({\n\t\t\t\t\t\ttype: 'scheduleRetry',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\tdelayMs,\n\t\t\t\t\t\terrorName:\n\t\t\t\t\t\t\terror instanceof Error ? error.name : 'Error',\n\t\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t\t\t: String(error)\n\t\t\t\t\t});\n\t\t\t\t\tif (delayMs > 0) {\n\t\t\t\t\t\tawait new Promise((resolve) =>\n\t\t\t\t\t\t\tsetTimeout(resolve, delayMs)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\temitActivity({\n\t\t\t\ttype: 'schedule',\n\t\t\t\tat: Date.now(),\n\t\t\t\tname,\n\t\t\t\tstatus: 'error'\n\t\t\t});\n\t\t\tif (attemptsMade > 1) {\n\t\t\t\tthrow new RetriesExhaustedError(\n\t\t\t\t\tattemptsMade,\n\t\t\t\t\tDate.now() - startedAt,\n\t\t\t\t\tlastError\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow lastError;\n\t\t},\n\n\t\tregisterPack: (pack) => {\n\t\t\tfor (const table of pack.ownsTables) {\n\t\t\t\tconst existing = packTableOwners.get(table);\n\t\t\t\tif (existing !== undefined) {\n\t\t\t\t\tthrow new PackTableConflictError(\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\texisting,\n\t\t\t\t\t\tpack.name\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.requireDependencies === true) {\n\t\t\t\tfor (const table of pack.readsTables ?? []) {\n\t\t\t\t\tif (!readers.has(table)) {\n\t\t\t\t\t\tthrow new PackMissingDependencyError(pack.name, table);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.schemas !== undefined) {\n\t\t\t\tfor (const [table, schema] of Object.entries(pack.schemas)) {\n\t\t\t\t\tengine.registerSchema(table, schema);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.permissions !== undefined) {\n\t\t\t\tfor (const [table, rules] of Object.entries(pack.permissions)) {\n\t\t\t\t\tengine.registerPermissions(table, rules);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.readers !== undefined) {\n\t\t\t\tfor (const [table, reader] of Object.entries(pack.readers)) {\n\t\t\t\t\tengine.registerReader(table, reader);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.writers !== undefined) {\n\t\t\t\tfor (const [table, writer] of Object.entries(pack.writers)) {\n\t\t\t\t\tengine.registerWriter(table, writer);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.crdt !== undefined) {\n\t\t\t\tfor (const [table, fields] of Object.entries(pack.crdt)) {\n\t\t\t\t\tengine.registerCrdt(table, fields);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const collection of pack.collections ?? []) {\n\t\t\t\tengine.register(collection);\n\t\t\t}\n\t\t\tfor (const collection of pack.joinCollections ?? []) {\n\t\t\t\tengine.registerJoin(collection);\n\t\t\t}\n\t\t\tfor (const collection of pack.graphCollections ?? []) {\n\t\t\t\tengine.registerGraph(collection);\n\t\t\t}\n\t\t\tfor (const collection of pack.searchCollections ?? []) {\n\t\t\t\tengine.registerSearch(collection);\n\t\t\t}\n\t\t\tfor (const query of pack.reactiveQueries ?? []) {\n\t\t\t\tengine.registerReactive(query);\n\t\t\t}\n\t\t\tfor (const mutation of pack.mutations ?? []) {\n\t\t\t\tengine.registerMutation(mutation);\n\t\t\t}\n\t\t\tfor (const schedule of pack.schedules ?? []) {\n\t\t\t\tengine.registerSchedule(schedule);\n\t\t\t}\n\t\t\tfor (const table of pack.ownsTables) {\n\t\t\t\tpackTableOwners.set(table, pack.name);\n\t\t\t}\n\t\t\tregisteredPacks.push({\n\t\t\t\tname: pack.name,\n\t\t\t\tversion: pack.version,\n\t\t\t\townsTables: [...pack.ownsTables],\n\t\t\t\treadsTables: [...(pack.readsTables ?? [])]\n\t\t\t});\n\t\t},\n\n\t\tinspect: () => {\n\t\t\tconst collections = [...registry.entries()].map(([name, def]) => {\n\t\t\t\tconst kind = ((def as { kind?: CollectionKind }).kind ??\n\t\t\t\t\t'view') as CollectionKind;\n\t\t\t\tlet tables: string[] = [];\n\t\t\t\tif (kind === 'join') {\n\t\t\t\t\tconst join = def as JoinCollectionDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>;\n\t\t\t\t\ttables = [join.left.table, join.right.table];\n\t\t\t\t} else if (kind === 'graph') {\n\t\t\t\t\ttables = (\n\t\t\t\t\t\tdef as GraphCollectionDefinition<\n\t\t\t\t\t\t\tunknown,\n\t\t\t\t\t\t\tunknown,\n\t\t\t\t\t\t\tunknown\n\t\t\t\t\t\t>\n\t\t\t\t\t).query.tables();\n\t\t\t\t} else if (kind === 'search') {\n\t\t\t\t\ttables = [\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\tdef as SearchCollectionDefinition<\n\t\t\t\t\t\t\t\tunknown,\n\t\t\t\t\t\t\t\tunknown,\n\t\t\t\t\t\t\t\tunknown\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t).table\n\t\t\t\t\t];\n\t\t\t\t} else if (kind === 'view') {\n\t\t\t\t\ttables = (\n\t\t\t\t\t\tdef as CollectionDefinition<unknown, unknown, unknown>\n\t\t\t\t\t).tables ?? [name];\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tname,\n\t\t\t\t\tkind,\n\t\t\t\t\ttables,\n\t\t\t\t\tsubscriptions: active.get(name)?.size ?? 0\n\t\t\t\t};\n\t\t\t});\n\t\t\tconst DEVTOOLS_RECENT = 50;\n\t\t\treturn {\n\t\t\t\tversion,\n\t\t\t\tcollections,\n\t\t\t\tmutations: [...mutations.keys()],\n\t\t\t\tschedules: [...schedules.values()].map((schedule) => ({\n\t\t\t\t\tname: schedule.name,\n\t\t\t\t\tpattern: schedule.pattern\n\t\t\t\t})),\n\t\t\t\treaders: [...readers.keys()],\n\t\t\t\twriters: [...writers.keys()],\n\t\t\t\trecentChanges: changeLog\n\t\t\t\t\t.slice(-DEVTOOLS_RECENT)\n\t\t\t\t\t.map((entry) => ({\n\t\t\t\t\t\tversion: entry.version,\n\t\t\t\t\t\ttable: entry.table,\n\t\t\t\t\t\top: entry.change.op\n\t\t\t\t\t})),\n\t\t\t\tpacks: registeredPacks.map((pack) => ({\n\t\t\t\t\tname: pack.name,\n\t\t\t\t\tversion: pack.version,\n\t\t\t\t\townsTables: [...pack.ownsTables],\n\t\t\t\t\treadsTables: [...pack.readsTables]\n\t\t\t\t}))\n\t\t\t};\n\t\t},\n\n\t\texportChangeLog: () => ({\n\t\t\tentries: changeLog.slice(),\n\t\t\texportedAt: Date.now(),\n\t\t\tinstanceId,\n\t\t\tversion\n\t\t}),\n\n\t\timportChangeLog,\n\n\t\treplayTo: async ({ at, tables }) => {\n\t\t\t// 1.22.0: walk the bounded change log forward to targetAt,\n\t\t\t// folding each op into a per-table keyed view. Last write\n\t\t\t// wins per key. Delete removes the key.\n\t\t\tconst filterTables =\n\t\t\t\ttables !== undefined ? new Set(tables) : undefined;\n\t\t\tconst state = new Map<string, Map<RowKey, unknown>>();\n\t\t\tlet asOfVersion = 0;\n\t\t\tlet asOfAt = 0;\n\t\t\t// Truncation: the log doesn't extend back to `at`. We've\n\t\t\t// trimmed entries that may have mattered for the\n\t\t\t// reconstruction, so the result is \"state walked forward\n\t\t\t// from the OLDEST retained entry\" rather than the actual\n\t\t\t// state at `at`. Distinguishable from \"no history at all\"\n\t\t\t// (`changeLog[0]?.version === 1`).\n\t\t\tconst oldest = changeLog[0];\n\t\t\tconst truncated =\n\t\t\t\toldest !== undefined &&\n\t\t\t\toldest.version > 1 &&\n\t\t\t\toldest.at > at;\n\t\t\tfor (const entry of changeLog) {\n\t\t\t\tif (entry.at > at) break;\n\t\t\t\tif (\n\t\t\t\t\tfilterTables !== undefined &&\n\t\t\t\t\t!filterTables.has(entry.table)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tlet tableState = state.get(entry.table);\n\t\t\t\tif (tableState === undefined) {\n\t\t\t\t\ttableState = new Map();\n\t\t\t\t\tstate.set(entry.table, tableState);\n\t\t\t\t}\n\t\t\t\tconst reader = readers.get(entry.table);\n\t\t\t\tconst key =\n\t\t\t\t\treader?.key?.(entry.change.row) ??\n\t\t\t\t\t((entry.change.row as { id?: RowKey })?.id as RowKey);\n\t\t\t\tif (key === undefined) {\n\t\t\t\t\t// Without a stable key we can't apply ops idempotently\n\t\t\t\t\t// — skip silently. In practice every table the\n\t\t\t\t\t// engine has emitted changes for has a reader (the\n\t\t\t\t\t// engine's own change-emit path doesn't run without\n\t\t\t\t\t// one), so this branch is defensive.\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (entry.change.op === 'delete') {\n\t\t\t\t\ttableState.delete(key);\n\t\t\t\t} else {\n\t\t\t\t\ttableState.set(key, entry.change.row);\n\t\t\t\t}\n\t\t\t\tasOfVersion = entry.version;\n\t\t\t\tasOfAt = entry.at;\n\t\t\t}\n\t\t\tconst rows: Record<string, ReadonlyArray<unknown>> = {};\n\t\t\tfor (const [table, map] of state) {\n\t\t\t\trows[table] = [...map.values()];\n\t\t\t}\n\t\t\treturn { asOfAt, asOfVersion, rows, truncated };\n\t\t},\n\n\t\tfence: ({ reason }) => {\n\t\t\tconst handle: FenceHandle = {\n\t\t\t\tfencedAt: Date.now(),\n\t\t\t\treason,\n\t\t\t\tlift: () => {\n\t\t\t\t\tactiveFences.delete(handle);\n\t\t\t\t}\n\t\t\t};\n\t\t\tactiveFences.add(handle);\n\t\t\treturn handle;\n\t\t},\n\n\t\texportSnapshot: async ({ tables, ctx = {} }: ExportSnapshotOptions = {}) => {\n\t\t\tconst tableFilter = tables !== undefined ? new Set(tables) : undefined;\n\t\t\tconst rows: Record<string, ReadonlyArray<unknown>> = {};\n\t\t\tfor (const [table, reader] of readers) {\n\t\t\t\tif (tableFilter !== undefined && !tableFilter.has(table)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst iterable = await reader.all(ctx);\n\t\t\t\trows[table] = [...iterable];\n\t\t\t}\n\t\t\treturn {\n\t\t\t\texportedAt: Date.now(),\n\t\t\t\tsourceInstanceId: instanceId,\n\t\t\t\ttables: rows,\n\t\t\t\tversion\n\t\t\t};\n\t\t},\n\n\t\timportSnapshot: async (\n\t\t\tsnapshot,\n\t\t\t{ tables, onProgress, ctx = {} }: ImportSnapshotOptions = {}\n\t\t) => {\n\t\t\tconst tableFilter = tables !== undefined ? new Set(tables) : undefined;\n\t\t\tconst perTable: Record<string, number> = {};\n\t\t\tconst skipped: string[] = [];\n\t\t\tlet tablesImported = 0;\n\t\t\tlet rowsImported = 0;\n\t\t\tfor (const [table, snapshotRows] of Object.entries(\n\t\t\t\tsnapshot.tables\n\t\t\t)) {\n\t\t\t\tif (tableFilter !== undefined && !tableFilter.has(table)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst writer = writers.get(table);\n\t\t\t\tif (writer === undefined) {\n\t\t\t\t\tskipped.push(table);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst total = snapshotRows.length;\n\t\t\t\tlet done = 0;\n\t\t\t\tfor (const row of snapshotRows) {\n\t\t\t\t\tawait writer.insert(row, ctx, undefined);\n\t\t\t\t\tdone += 1;\n\t\t\t\t\trowsImported += 1;\n\t\t\t\t\tif (onProgress !== undefined) {\n\t\t\t\t\t\tonProgress(table, done, total);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tperTable[table] = done;\n\t\t\t\tif (done > 0) tablesImported += 1;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tperTable,\n\t\t\t\trowsImported,\n\t\t\t\tskipped,\n\t\t\t\ttablesImported\n\t\t\t};\n\t\t},\n\n\t\tmetrics: () => {\n\t\t\tconst now = Date.now();\n\t\t\tconst byCollection: Record<string, number> = {};\n\t\t\tlet totalSubscriptions = 0;\n\t\t\tfor (const [name, subs] of active) {\n\t\t\t\tbyCollection[name] = subs.size;\n\t\t\t\ttotalSubscriptions += subs.size;\n\t\t\t}\n\t\t\tconst oldest = changeLog[0];\n\t\t\treturn {\n\t\t\t\tat: now,\n\t\t\t\tchangeLog: {\n\t\t\t\t\tcapacity: changeLogSize,\n\t\t\t\t\tentries: changeLog.length,\n\t\t\t\t\toldestAgeMs: oldest ? now - oldest.at : null,\n\t\t\t\t\toldestVersion: oldest ? oldest.version : null,\n\t\t\t\t\tretainMs: changeLogRetainMs\n\t\t\t\t},\n\t\t\t\tmutations: {\n\t\t\t\t\tcompleted: mutationsCompleted,\n\t\t\t\t\tfailed: mutationsFailed,\n\t\t\t\t\tinFlight: mutationsInFlight,\n\t\t\t\t\tqueued: mutationsQueued,\n\t\t\t\t\tretried: mutationsRetried\n\t\t\t\t},\n\t\t\t\treactiveCache: {\n\t\t\t\t\tcapacity: reactiveCacheMax,\n\t\t\t\t\tentries: cachedReruns.size\n\t\t\t\t},\n\t\t\t\tschedules: {\n\t\t\t\t\tregistered: schedules.size\n\t\t\t\t},\n\t\t\t\tsubscriptions: {\n\t\t\t\t\tbyCollection,\n\t\t\t\t\tbyTenant: Object.fromEntries(subscriptionsByTenant),\n\t\t\t\t\ttotal: totalSubscriptions\n\t\t\t\t},\n\t\t\t\tuptimeMs: now - engineStartedAt,\n\t\t\t\tversion\n\t\t\t};\n\t\t},\n\n\t\tonActivity: (listener) => {\n\t\t\tactivityListeners.add(listener);\n\t\t\treturn () => {\n\t\t\t\tactivityListeners.delete(listener);\n\t\t\t};\n\t\t},\n\n\t\tstreamChanges: ({\n\t\t\tsince = 0,\n\t\t\tsignal,\n\t\t\tmaxBuffer = 10_000\n\t\t}: StreamChangesOptions = {}) => {\n\t\t\t// Detect a gap up front so the consumer's `for await` sees the\n\t\t\t// throw immediately rather than after the first historical entry.\n\t\t\t// (We tolerate `since === 0`, which means \"give me everything in\n\t\t\t// the log\"; the gap check only kicks in for a non-zero cursor.)\n\t\t\tconst oldest = changeLog[0];\n\t\t\tif (\n\t\t\t\tsince > 0 &&\n\t\t\t\toldest !== undefined &&\n\t\t\t\toldest.version > since + 1\n\t\t\t) {\n\t\t\t\tconst err = new MissedChangesError(since, oldest.version);\n\t\t\t\treturn {\n\t\t\t\t\t[Symbol.asyncIterator]() {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tnext: () => Promise.reject(err)\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Register the subscriber BEFORE snapshotting history so a commit\n\t\t\t// landing between the snapshot and the live tail can't be missed.\n\t\t\t// Phase 2 dedupes against `cursor`.\n\t\t\tconst buffer: LoggedChange[] = [];\n\t\t\tlet waiter: (() => void) | null = null;\n\t\t\tlet overflow = false;\n\t\t\tconst wake = () => {\n\t\t\t\tif (waiter !== null) {\n\t\t\t\t\tconst resume = waiter;\n\t\t\t\t\twaiter = null;\n\t\t\t\t\tresume();\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst subscriber = (entry: LoggedChange) => {\n\t\t\t\tif (buffer.length >= maxBuffer) {\n\t\t\t\t\toverflow = true;\n\t\t\t\t\twake();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbuffer.push(entry);\n\t\t\t\twake();\n\t\t\t};\n\t\t\tstreamSubscribers.add(subscriber);\n\n\t\t\tconst onAbort = () => wake();\n\t\t\tsignal?.addEventListener('abort', onAbort, { once: true });\n\n\t\t\tlet lastDelivered = since;\n\n\t\t\treturn {\n\t\t\t\tasync *[Symbol.asyncIterator]() {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Phase 1: historical entries. Copy the array so a\n\t\t\t\t\t\t// concurrent log.shift() (when the ring buffer rotates)\n\t\t\t\t\t\t// can't surprise us mid-iteration.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// A single batched mutation writes N rows that all\n\t\t\t\t\t\t// share one version, so we filter on `entry.version >\n\t\t\t\t\t\t// since` directly (no per-yield cursor bump — that\n\t\t\t\t\t\t// would deliver only the first row of every batch).\n\t\t\t\t\t\tconst history = [...changeLog];\n\t\t\t\t\t\tconst headVersion =\n\t\t\t\t\t\t\thistory.length > 0\n\t\t\t\t\t\t\t\t? history[history.length - 1]!.version\n\t\t\t\t\t\t\t\t: since;\n\t\t\t\t\t\tfor (const entry of history) {\n\t\t\t\t\t\t\tif (signal?.aborted) return;\n\t\t\t\t\t\t\tif (entry.version > since) {\n\t\t\t\t\t\t\t\tlastDelivered = entry.version;\n\t\t\t\t\t\t\t\tyield entry;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Phase 2: live tail. Dedupe against `headVersion`\n\t\t\t\t\t\t// (the head of the log when phase 1 finished): any\n\t\t\t\t\t\t// buffered entry with `version <= headVersion` was\n\t\t\t\t\t\t// already yielded from history (a commit between\n\t\t\t\t\t\t// subscriber registration and the snapshot lands in\n\t\t\t\t\t\t// both the buffer and the snapshot).\n\t\t\t\t\t\twhile (!signal?.aborted) {\n\t\t\t\t\t\t\twhile (buffer.length > 0) {\n\t\t\t\t\t\t\t\tconst entry = buffer.shift()!;\n\t\t\t\t\t\t\t\tif (entry.version > headVersion) {\n\t\t\t\t\t\t\t\t\tlastDelivered = entry.version;\n\t\t\t\t\t\t\t\t\tyield entry;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (overflow) {\n\t\t\t\t\t\t\t\tthrow new CdcConsumerSlowError(\n\t\t\t\t\t\t\t\t\tmaxBuffer,\n\t\t\t\t\t\t\t\t\tlastDelivered\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (signal?.aborted) return;\n\t\t\t\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\t\t\t\twaiter = resolve;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tstreamSubscribers.delete(subscriber);\n\t\t\t\t\t\tsignal?.removeEventListener('abort', onAbort);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t};\n\n\treturn engine;\n};\n",
26
27
  "/**\n * `syncCdc` Elysia plugin — exposes {@link SyncEngine.streamChanges} as a\n * Server-Sent Events route. Use this to feed an external CDC consumer\n * (Kafka producer, search indexer, audit pipeline) over plain HTTP, no\n * WebSocket required.\n *\n * Each delivered change becomes one SSE event:\n *\n * id: 1234\n * event: change\n * data: {\"version\":1234,\"table\":\"users\",\"change\":{\"op\":\"insert\",\"row\":{...}}}\n *\n * Consumers track their cursor via the `id` field; on reconnect the browser\n * `EventSource` automatically sends a `Last-Event-ID` header, and this route\n * reads it (or the `?since=N` query param) to resume from the right place.\n *\n * Heartbeats keep the connection alive across idle-proxy timeouts. If the\n * consumer falls so far behind that the engine's in-flight buffer overflows,\n * the engine throws {@link CdcConsumerSlowError}; we forward it as a\n * `error` SSE event so the client knows to resubscribe (vs silently\n * dropping commits).\n */\n\nimport type { Elysia as ElysiaType } from 'elysia';\nimport {\n\tCdcConsumerSlowError,\n\tMissedChangesError,\n\ttype LoggedChange,\n\ttype SyncEngine\n} from './syncEngine';\n\n// Lazy Elysia loader. Elysia is a peer dependency of `@absolutejs/sync`, and\n// callers of `syncCdc` always have it installed (it's an Elysia plugin). The\n// reason for the indirection is that this file lives in the engine subpath\n// barrel (`@absolutejs/sync/engine`), and any top-level `import { Elysia }\n// from 'elysia'` would be hoisted by the bundler so that *every* engine\n// subpath consumer eagerly evaluates Elysia at module load — even consumers\n// that don't use `syncCdc` (e.g. sync packs in `@absolutejs/sync-packs/`).\n// Resolving Elysia on first call instead keeps the engine subpath dependency-\n// free at module-load time.\nlet cachedElysia: typeof ElysiaType | undefined;\nconst loadElysia = (): typeof ElysiaType => {\n\tif (cachedElysia !== undefined) return cachedElysia;\n\t// `require()` resolves synchronously in Bun and Node (via CJS interop),\n\t// runs at *call* time, and the bundler does not hoist it.\n\tconst mod = (require as (id: string) => unknown)('elysia') as {\n\t\tElysia: typeof ElysiaType;\n\t};\n\tcachedElysia = mod.Elysia;\n\treturn cachedElysia;\n};\n\nexport type SyncCdcOptions = {\n\t/** The engine whose change log this route streams. */\n\tengine: SyncEngine;\n\t/** Route path. Defaults to `/sync/cdc`. */\n\tpath?: string;\n\t/** Heartbeat comment interval (ms) so idle proxies don't drop us. Default 25000. */\n\theartbeatMs?: number;\n\t/** Per-stream in-flight buffer cap. Passed to {@link SyncEngine.streamChanges}. Default 10000. */\n\tmaxBuffer?: number;\n};\n\nconst parseSince = (\n\tquery: Record<string, string | undefined>,\n\tlastEventId: string | null\n): number => {\n\tconst raw = query.since ?? lastEventId ?? '0';\n\tconst parsed = Number(raw);\n\treturn Number.isFinite(parsed) && parsed >= 0 ? Math.floor(parsed) : 0;\n};\n\nconst encodeEvent = (\n\tevent: string,\n\tid: number | null,\n\tdata: unknown\n): string => {\n\tconst parts: string[] = [];\n\tif (id !== null) parts.push(`id: ${id}`);\n\tparts.push(`event: ${event}`);\n\tparts.push(`data: ${JSON.stringify(data)}`);\n\treturn `${parts.join('\\n')}\\n\\n`;\n};\n\nexport const syncCdc = ({\n\tengine,\n\tpath = '/sync/cdc',\n\theartbeatMs = 25_000,\n\tmaxBuffer = 10_000\n}: SyncCdcOptions) => {\n\tconst Elysia = loadElysia();\n\treturn new Elysia({ name: '@absolutejs/sync/cdc' }).get(path, (context) => {\n\t\tconst lastEventId = context.request.headers.get('last-event-id');\n\t\tconst since = parseSince(\n\t\t\tcontext.query as Record<string, string | undefined>,\n\t\t\tlastEventId\n\t\t);\n\t\tconst encoder = new TextEncoder();\n\n\t\tconst stream = new ReadableStream<Uint8Array>({\n\t\t\tasync start(controller) {\n\t\t\t\tconst write = (chunk: string) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tcontroller.enqueue(encoder.encode(chunk));\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// controller already closed by an abort race\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\twrite(\n\t\t\t\t\tencodeEvent('open', null, {\n\t\t\t\t\t\tsince,\n\t\t\t\t\t\tat: Date.now()\n\t\t\t\t\t})\n\t\t\t\t);\n\n\t\t\t\tconst heartbeat = setInterval(\n\t\t\t\t\t() => write(': ping\\n\\n'),\n\t\t\t\t\theartbeatMs\n\t\t\t\t);\n\n\t\t\t\ttry {\n\t\t\t\t\tfor await (const entry of engine.streamChanges({\n\t\t\t\t\t\tsince,\n\t\t\t\t\t\tsignal: context.request.signal,\n\t\t\t\t\t\tmaxBuffer\n\t\t\t\t\t})) {\n\t\t\t\t\t\twrite(\n\t\t\t\t\t\t\tencodeEvent(\n\t\t\t\t\t\t\t\t'change',\n\t\t\t\t\t\t\t\tentry.version,\n\t\t\t\t\t\t\t\tentry satisfies LoggedChange\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 (error) {\n\t\t\t\t\tif (error instanceof MissedChangesError) {\n\t\t\t\t\t\twrite(\n\t\t\t\t\t\t\tencodeEvent('error', null, {\n\t\t\t\t\t\t\t\tname: 'MissedChangesError',\n\t\t\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\t\t\trequestedSince: error.requestedSince,\n\t\t\t\t\t\t\t\tavailableSince: error.availableSince\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (error instanceof CdcConsumerSlowError) {\n\t\t\t\t\t\twrite(\n\t\t\t\t\t\t\tencodeEvent('error', null, {\n\t\t\t\t\t\t\t\tname: 'CdcConsumerSlowError',\n\t\t\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\t\t\tlastDeliveredVersion: error.lastDeliveredVersion\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\twrite(\n\t\t\t\t\t\t\tencodeEvent('error', null, {\n\t\t\t\t\t\t\t\tname:\n\t\t\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t\t\t? error.name\n\t\t\t\t\t\t\t\t\t\t: 'Error',\n\t\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t\t\t\t\t: String(error)\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} finally {\n\t\t\t\t\tclearInterval(heartbeat);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// already closed\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn new Response(stream, {\n\t\t\theaders: {\n\t\t\t\t'cache-control': 'no-cache, no-transform',\n\t\t\t\tconnection: 'keep-alive',\n\t\t\t\t'content-type': 'text/event-stream',\n\t\t\t\t// Tell nginx (and other reverse proxies) not to buffer the\n\t\t\t\t// stream — without this it holds chunks back and the SSE\n\t\t\t\t// connection tears (ERR_INCOMPLETE_CHUNKED_ENCODING).\n\t\t\t\t'x-accel-buffering': 'no'\n\t\t\t}\n\t\t});\n\t});\n};\n",
27
28
  "/**\n * Declarative, dependency-free row schemas keyed by table. The engine validates\n * a mutation's writes against the schema before they're persisted (a bad write\n * is rejected, like a permission deny), and lazily **migrates** rows on read —\n * so changing a shape needs no up-front database migration. Field validators are\n * plain `(value) => boolean` functions; the `field` kit covers the common cases.\n */\n\n/** Validates one field's value. Optionality is encoded by the validator (see `field.optional`). */\nexport type FieldValidator = (value: unknown) => boolean;\n\nexport type TableSchema<Row = unknown> = {\n\t/** Per-field validators. On insert every field is checked; on update, only\n\t * the fields present in the payload. Extra fields not listed here are allowed. */\n\tfields: Record<string, FieldValidator>;\n\t/** Schema version, for documentation/migration bookkeeping. Default 1. */\n\tversion?: number;\n\t/** Upcast a stored/raw row to the current shape — applied lazily on reads. */\n\tmigrate?: (row: Row) => Row;\n};\n\n/** A `table` → {@link TableSchema} map. */\nexport type SchemaDefinition = Record<string, TableSchema<any>>;\n\n/**\n * Define table schemas. Identity at runtime (for type inference). Pass to\n * `createSyncEngine({ schemas })` or register with `engine.registerSchema`.\n */\nexport const defineSchema = <S extends SchemaDefinition>(schemas: S): S =>\n\tschemas;\n\nconst isFiniteNumber = (value: unknown): value is number =>\n\ttypeof value === 'number' && Number.isFinite(value);\n\n/** A small validator kit. Compose with `field.optional` / `field.array` / `field.enum`. */\nexport const field = {\n\tstring: ((value) => typeof value === 'string') as FieldValidator,\n\tnumber: isFiniteNumber as FieldValidator,\n\tboolean: ((value) => typeof value === 'boolean') as FieldValidator,\n\t/** Any defined value. */\n\tany: (() => true) as FieldValidator,\n\t/** Allow `undefined` (the field may be omitted), else delegate to `inner`. */\n\toptional:\n\t\t(inner: FieldValidator): FieldValidator =>\n\t\t(value) =>\n\t\t\tvalue === undefined || inner(value),\n\t/** An array whose every element satisfies `inner`. */\n\tarray:\n\t\t(inner: FieldValidator): FieldValidator =>\n\t\t(value) =>\n\t\t\tArray.isArray(value) && value.every(inner),\n\t/** One of the given literal values. */\n\tenum:\n\t\t(...values: unknown[]): FieldValidator =>\n\t\t(value) =>\n\t\t\tvalues.includes(value)\n};\n",
28
29
  "import type { CollectionDefinition } from './collection';\nimport type { MutationDefinition } from './mutation';\nimport type { SyncEngine } from './syncEngine';\n\n/**\n * Eden-native HTTP route helpers (Tier 3). These turn a typed collection /\n * mutation definition into a plain Elysia route handler — so hydrate and mutate\n * are ordinary Elysia routes that Eden types end to end, with TypeBox validating\n * the params/body. The live diff stream stays on the WebSocket (`syncSocket`).\n *\n * They import no Elysia: each returns `(context) => Promise<...>`, which you pass\n * to `.get` / `.post` with a TypeBox `query` / `body` schema. The handler's\n * return type carries the row / result type, so `treaty<typeof app>()` infers it.\n */\n\n/** The slice of an Elysia route context these helpers read. */\nexport type SyncRouteContext = {\n\tquery: unknown;\n\tbody: unknown;\n\t[key: string]: unknown;\n};\n\nconst emptyContext = () => ({});\n\n/**\n * Build a GET handler that hydrates `collection` — authorize, then return its\n * current rows. The handler returns `Promise<Row[]>`, so Eden infers the row\n * type from the collection definition; the route's TypeBox `query` schema\n * validates and types the params.\n *\n * @example\n * .get('/sync/orders', hydrateRoute(engine, ordersCollection, (c) => ({ userId: c.userId })),\n * { query: t.Object({ userId: t.Numeric() }) })\n */\nexport const hydrateRoute = <Row, Params, Ctx>(\n\tengine: SyncEngine,\n\tcollection: CollectionDefinition<Row, Params, Ctx>,\n\tresolveContext: (\n\t\tcontext: SyncRouteContext\n\t) => Ctx = emptyContext as () => Ctx\n) => {\n\treturn async (context: SyncRouteContext): Promise<Row[]> => {\n\t\tconst rows = await engine.hydrate(\n\t\t\tcollection.name,\n\t\t\tcontext.query as Params,\n\t\t\tresolveContext(context)\n\t\t);\n\t\treturn rows as Row[];\n\t};\n};\n\n/**\n * Build a POST handler that runs `mutation`. The handler returns\n * `Promise<Result>`, so Eden infers the result type; the route's TypeBox `body`\n * schema validates and types the args.\n *\n * @example\n * .post('/sync/createOrder', mutateRoute(engine, createOrder, (c) => ({ userId: c.userId })),\n * { body: t.Object({ total: t.Number() }) })\n */\nexport const mutateRoute = <Args, Ctx, Result>(\n\tengine: SyncEngine,\n\tmutation: MutationDefinition<Args, Ctx, Result>,\n\tresolveContext: (\n\t\tcontext: SyncRouteContext\n\t) => Ctx = emptyContext as () => Ctx\n) => {\n\treturn async (context: SyncRouteContext): Promise<Result> => {\n\t\tconst result = await engine.runMutation(\n\t\t\tmutation.name,\n\t\t\tcontext.body as Args,\n\t\t\tresolveContext(context)\n\t\t);\n\t\treturn result as Result;\n\t};\n};\n",
29
30
  "import type { ClientFrame, ServerFrame } from './engine/connection';\n\n/**\n * Wire-format adapter (1.16.0). The engine and client default to JSON, but\n * for high-throughput deployments — a customer pushing 1 MB initial\n * snapshots, a tenant fan-out hitting 100k frames/sec — a binary serializer\n * (msgpack, cbor, or a custom tagged layout) cuts both bandwidth and\n * parse-side CPU.\n *\n * Both ends of the connection MUST use the same serializer. The default\n * `jsonSerializer` keeps every existing client + server pair working\n * unchanged; opt in to a different one on BOTH `syncSocket` and the client\n * lib to gain the win.\n *\n * The serializer only handles the wire format. Frame-shape validation\n * stays in the engine (`parseFrame` in connection.ts) — it runs on the\n * decoded object, so the same validation works for JSON, msgpack, etc.\n */\nexport type FrameSerializer = {\n\t/** Server→client: encode an outgoing `ServerFrame` for transport. */\n\tencodeServer: (frame: ServerFrame) => string | ArrayBufferLike | Uint8Array;\n\t/** Client→server: encode an outgoing `ClientFrame` for transport. */\n\tencodeClient: (frame: ClientFrame) => string | ArrayBufferLike | Uint8Array;\n\t/**\n\t * Deserialize a wire payload into a raw object. Return `null` for\n\t * unparseable input — the engine's validation step turns that into\n\t * a protocol error.\n\t */\n\tdecode: (raw: unknown) => unknown;\n};\n\n/**\n * Default JSON serializer — what `@absolutejs/sync` has always shipped.\n * Strings go through `JSON.parse`; already-parsed objects pass through\n * (some WS adapters auto-decode). `Uint8Array` / `ArrayBuffer` get\n * UTF-8 decoded first (binary WS frames carrying JSON text).\n */\nexport const jsonSerializer: FrameSerializer = {\n\tdecode: (raw: unknown): unknown => {\n\t\tif (typeof raw === 'string') {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(raw);\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\tif (raw instanceof Uint8Array) {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(new TextDecoder().decode(raw));\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\tif (raw instanceof ArrayBuffer) {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(new TextDecoder().decode(new Uint8Array(raw)));\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\treturn raw;\n\t},\n\tencodeClient: (frame: ClientFrame): string => JSON.stringify(frame),\n\tencodeServer: (frame: ServerFrame): string => JSON.stringify(frame)\n};\n",
30
31
  "import type { PresenceHandle, PresenceHub, PresenceMember } from './presence';\nimport type { Subscription, SyncEngine } from './syncEngine';\nimport type { FrameSerializer } from '../serializer';\nimport { jsonSerializer } from '../serializer';\n\n/**\n * Wire protocol for the sync-engine WebSocket. One connection multiplexes many\n * collection subscriptions, each tagged with a client-chosen `id`.\n */\n\n/** Client → server. */\nexport type ClientFrame =\n\t| {\n\t\t\ttype: 'subscribe';\n\t\t\tid: string;\n\t\t\tcollection: string;\n\t\t\tparams?: unknown;\n\t\t\t/**\n\t\t\t * Resume from a point already applied (catch-up instead of snapshot).\n\t\t\t *\n\t\t\t * Accepts either:\n\t\t\t * - `number` (pre-1.18 legacy) — the version of THIS engine instance.\n\t\t\t * - `string` (1.17.0+ cursor) — an opaque cross-instance resume\n\t\t\t * cursor returned by the server on prior snapshot/diff/frame.\n\t\t\t * The client round-trips it unmodified.\n\t\t\t */\n\t\t\tsince?: number | string;\n\t }\n\t| { type: 'unsubscribe'; id: string }\n\t| { type: 'mutate'; mutationId: number; name: string; args?: unknown }\n\t| { type: 'presence-join'; room: string; memberId: string; state: unknown }\n\t| { type: 'presence-set'; room: string; state: unknown }\n\t| { type: 'presence-leave'; room: string };\n\n/** One subscription's delta within a {@link ServerFrame} `frame`. */\nexport type FrameDiff<T = unknown> = {\n\tid: string;\n\tadded: T[];\n\tremoved: T[];\n\tchanged: T[];\n};\n\n/**\n * Server → client. `version` is THIS engine's local change-feed watermark.\n * `cursor` (1.17.0+) is an opaque cross-instance resume cursor — round-trip\n * it on `subscribe.since` to resume across cluster shards.\n */\nexport type ServerFrame<T = unknown> =\n\t| { type: 'snapshot'; id: string; rows: T[]; version?: number; cursor?: string }\n\t| {\n\t\t\ttype: 'diff';\n\t\t\tid: string;\n\t\t\tadded: T[];\n\t\t\tremoved: T[];\n\t\t\tchanged: T[];\n\t\t\tversion?: number;\n\t\t\tcursor?: string;\n\t }\n\t| {\n\t\t\t// One atomic batch (e.g. a transactional mutation) that touched several\n\t\t\t// subscriptions — bundled into one message so the client applies them in\n\t\t\t// a single frame, never showing a torn cross-collection intermediate.\n\t\t\ttype: 'frame';\n\t\t\tversion?: number;\n\t\t\tcursor?: string;\n\t\t\tdiffs: FrameDiff<T>[];\n\t }\n\t| {\n\t\t\t// A presence room changed: members joined, updated state, or left.\n\t\t\ttype: 'presence';\n\t\t\troom: string;\n\t\t\tjoined: PresenceMember<T>[];\n\t\t\tupdated: PresenceMember<T>[];\n\t\t\tleft: string[];\n\t }\n\t| { type: 'error'; id?: string; message: string }\n\t| { type: 'ack'; mutationId: number; result?: unknown }\n\t| { type: 'reject'; mutationId: number; message: string };\n\nexport type SyncConnectionOptions = {\n\tengine: SyncEngine;\n\t/** Resolved auth context for this connection; passed to every subscribe. */\n\tctx: unknown;\n\t/**\n\t * Send a frame to the client (the transport serializes it). May return\n\t * a number — by convention `-1` signals transport-layer backpressure (the\n\t * value Bun's `ws.send()` returns when the WS buffer is full). The\n\t * connection tracks consecutive `-1` returns and surfaces them via\n\t * `connection.stats().slowSendsRecent`. Legacy `void`-returning sends\n\t * keep working unchanged.\n\t *\n\t * NOTE: 1.16.0 — `send` receives the typed `ServerFrame`. The connection\n\t * does NOT pre-serialize; the WS adapter (`syncSocket`) wraps `send` to\n\t * call `serializer.encodeServer(frame)` before `ws.send(...)`. This keeps\n\t * the connection layer transport-agnostic.\n\t */\n\tsend: (frame: ServerFrame) => void | number;\n\t/** Optional presence hub; enables the `presence-*` frames (see createPresenceHub). */\n\tpresence?: PresenceHub;\n\t/**\n\t * Wire-format serializer (1.16.0). Defaults to `jsonSerializer` —\n\t * the historical JSON-over-WS behavior. Both ends of the connection\n\t * MUST use the same serializer; pair this option with the matching\n\t * client-side `serializer` to opt into binary frames.\n\t */\n\tserializer?: FrameSerializer;\n};\n\n/**\n * Connection-level operational counters surfaced via {@link SyncConnection.stats}.\n * Pair with the WS adapter's own backpressure signal for end-to-end slow-client\n * detection.\n */\nexport type SyncConnectionStats = {\n\t/** Active subscriptions on this connection. */\n\tsubscriptionCount: number;\n\t/** Active presence-room memberships on this connection. */\n\tpresenceRoomCount: number;\n\t/** Frames successfully sent (non-backpressure return) since the connection opened. */\n\tframesSent: number;\n\t/** Consecutive `-1` (backpressure) returns from `send` since the last successful send. */\n\tslowSendsRecent: number;\n};\n\nexport type SyncConnection = {\n\t/** Handle one client frame (a parsed object or a raw JSON string). */\n\thandle: (raw: unknown) => Promise<void>;\n\t/** Tear down every subscription on this connection (call on socket close). */\n\tclose: () => void;\n\t/**\n\t * Point-in-time connection counters — subscription count, frames sent, and\n\t * how many consecutive `send` calls came back with the transport's backpressure\n\t * signal. Cheap; safe to call from a metering loop.\n\t *\n\t * Added in 1.14.0.\n\t */\n\tstats: () => SyncConnectionStats;\n};\n\nconst parseFrame = (raw: unknown, serializer: FrameSerializer): ClientFrame | undefined => {\n\t// 1.16.0: hand off the wire decode to the serializer (default JSON).\n\t// The shape validation below is identical regardless of wire format —\n\t// the serializer just produces an object, we walk it for type safety.\n\tlet value: unknown = raw;\n\tif (typeof value === 'string' || value instanceof Uint8Array || value instanceof ArrayBuffer) {\n\t\tvalue = serializer.decode(raw);\n\t\tif (value === null) return undefined;\n\t}\n\tif (typeof value !== 'object' || value === null) {\n\t\treturn undefined;\n\t}\n\tconst frame = value as {\n\t\ttype?: unknown;\n\t\tid?: unknown;\n\t\tcollection?: unknown;\n\t\tparams?: unknown;\n\t\tsince?: unknown;\n\t\tmutationId?: unknown;\n\t\tname?: unknown;\n\t\targs?: unknown;\n\t\troom?: unknown;\n\t\tmemberId?: unknown;\n\t\tstate?: unknown;\n\t};\n\tif (frame.type === 'subscribe') {\n\t\t// 1.17.0+: `since` accepts a number (legacy local-version) OR an\n\t\t// opaque cursor string. Drop anything else.\n\t\tconst since =\n\t\t\ttypeof frame.since === 'number' || typeof frame.since === 'string'\n\t\t\t\t? frame.since\n\t\t\t\t: undefined;\n\t\treturn typeof frame.id === 'string' &&\n\t\t\ttypeof frame.collection === 'string'\n\t\t\t? {\n\t\t\t\t\ttype: 'subscribe',\n\t\t\t\t\tid: frame.id,\n\t\t\t\t\tcollection: frame.collection,\n\t\t\t\t\tparams: frame.params,\n\t\t\t\t\tsince\n\t\t\t\t}\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'unsubscribe') {\n\t\treturn typeof frame.id === 'string'\n\t\t\t? { type: 'unsubscribe', id: frame.id }\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'mutate') {\n\t\treturn typeof frame.mutationId === 'number' &&\n\t\t\ttypeof frame.name === 'string'\n\t\t\t? {\n\t\t\t\t\ttype: 'mutate',\n\t\t\t\t\tmutationId: frame.mutationId,\n\t\t\t\t\tname: frame.name,\n\t\t\t\t\targs: frame.args\n\t\t\t\t}\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'presence-join') {\n\t\treturn typeof frame.room === 'string' &&\n\t\t\ttypeof frame.memberId === 'string'\n\t\t\t? {\n\t\t\t\t\ttype: 'presence-join',\n\t\t\t\t\troom: frame.room,\n\t\t\t\t\tmemberId: frame.memberId,\n\t\t\t\t\tstate: frame.state\n\t\t\t\t}\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'presence-set') {\n\t\treturn typeof frame.room === 'string'\n\t\t\t? { type: 'presence-set', room: frame.room, state: frame.state }\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'presence-leave') {\n\t\treturn typeof frame.room === 'string'\n\t\t\t? { type: 'presence-leave', room: frame.room }\n\t\t\t: undefined;\n\t}\n\treturn undefined;\n};\n\n/**\n * The per-connection protocol handler — transport-agnostic glue between a single\n * client socket and the {@link SyncEngine}. It owns that connection's\n * subscriptions: a `subscribe` frame authorizes + hydrates and replies with a\n * `snapshot`, then streams `diff` frames; `unsubscribe`/`close` release views.\n *\n * Pure (no WebSocket import) so it can be unit-tested with a fake `send`; the\n * Elysia `syncSocket` plugin is the thin adapter that feeds it socket events.\n */\nexport const createSyncConnection = ({\n\tengine,\n\tctx,\n\tsend: rawSend,\n\tpresence,\n\tserializer = jsonSerializer\n}: SyncConnectionOptions): SyncConnection => {\n\tconst subscriptions = new Map<string, Subscription<unknown>>();\n\t// This connection's presence memberships (one per room), torn down on close.\n\tconst presenceRooms = new Map<string, PresenceHandle<unknown>>();\n\n\t// 1.14.0: track transport-layer backpressure. `send` may return -1 (Bun's\n\t// WS backpressure signal) — accumulate consecutive `-1`s so the host can\n\t// detect a slow client; reset to 0 on any non-backpressure return.\n\tlet framesSent = 0;\n\tlet slowSendsRecent = 0;\n\tconst send = (frame: ServerFrame) => {\n\t\tconst ret = rawSend(frame);\n\t\tif (ret === -1) {\n\t\t\tslowSendsRecent += 1;\n\t\t} else {\n\t\t\tframesSent += 1;\n\t\t\tslowSendsRecent = 0;\n\t\t}\n\t};\n\n\t// Diffs from one atomic batch (a mutation, or a single applyChange) arrive via\n\t// onDiff synchronously and share a version. Buffer them and flush as one\n\t// message: a lone diff stays a plain `diff` (so single-collection clients are\n\t// unchanged); several become one `frame` the client applies atomically.\n\tlet pending: FrameDiff[] = [];\n\tlet pendingVersion: number | undefined;\n\t// 1.18.0: the cursor that came alongside the in-flight diff batch. We\n\t// forward it on the wire so clients can resume across cluster shards.\n\tlet pendingCursor: string | undefined;\n\tlet flushScheduled = false;\n\n\tconst flush = () => {\n\t\tif (pending.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst diffs = pending;\n\t\tconst version = pendingVersion;\n\t\tconst cursor = pendingCursor;\n\t\tpending = [];\n\t\tpendingVersion = undefined;\n\t\tpendingCursor = undefined;\n\t\tif (diffs.length === 1) {\n\t\t\tconst only = diffs[0]!;\n\t\t\tsend({\n\t\t\t\ttype: 'diff',\n\t\t\t\tid: only.id,\n\t\t\t\tadded: only.added,\n\t\t\t\tremoved: only.removed,\n\t\t\t\tchanged: only.changed,\n\t\t\t\tversion,\n\t\t\t\tcursor\n\t\t\t});\n\t\t} else {\n\t\t\tsend({ type: 'frame', diffs, version, cursor });\n\t\t}\n\t};\n\n\tconst scheduleFlush = () => {\n\t\tif (flushScheduled) {\n\t\t\treturn;\n\t\t}\n\t\tflushScheduled = true;\n\t\tqueueMicrotask(() => {\n\t\t\tflushScheduled = false;\n\t\t\tflush();\n\t\t});\n\t};\n\n\tconst bufferDiff = (diff: FrameDiff, diffVersion: number, cursor?: string) => {\n\t\t// A new version means a new batch — flush the previous one first.\n\t\tif (pending.length > 0 && pendingVersion !== diffVersion) {\n\t\t\tflush();\n\t\t}\n\t\tpending.push(diff);\n\t\tpendingVersion = diffVersion;\n\t\t// Cursor for the in-flight batch — same cursor for every diff sharing\n\t\t// `diffVersion` (the engine emits them with one currentCursor() call).\n\t\tif (cursor !== undefined) pendingCursor = cursor;\n\t\tscheduleFlush();\n\t};\n\n\tconst handle = async (raw: unknown) => {\n\t\tconst frame = parseFrame(raw, serializer);\n\t\tif (frame === undefined) {\n\t\t\tsend({ type: 'error', message: 'Malformed sync frame' });\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'mutate') {\n\t\t\ttry {\n\t\t\t\tconst result = await engine.runMutation(\n\t\t\t\t\tframe.name,\n\t\t\t\t\tframe.args,\n\t\t\t\t\tctx\n\t\t\t\t);\n\t\t\t\t// The mutation's diffs were buffered during runMutation; flush them\n\t\t\t\t// (as one frame) before the ack so the ack always arrives after.\n\t\t\t\tflush();\n\t\t\t\tsend({ type: 'ack', mutationId: frame.mutationId, result });\n\t\t\t} catch (error) {\n\t\t\t\tsend({\n\t\t\t\t\ttype: 'reject',\n\t\t\t\t\tmutationId: frame.mutationId,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'unsubscribe') {\n\t\t\tsubscriptions.get(frame.id)?.unsubscribe();\n\t\t\tsubscriptions.delete(frame.id);\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'presence-join') {\n\t\t\tif (presence === undefined) {\n\t\t\t\tsend({ type: 'error', message: 'Presence is not enabled' });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// A re-join replaces the prior membership for this room.\n\t\t\tpresenceRooms.get(frame.room)?.leave();\n\t\t\tconst handle = presence.join(\n\t\t\t\tframe.room,\n\t\t\t\tframe.memberId,\n\t\t\t\tframe.state,\n\t\t\t\t(diff) => {\n\t\t\t\t\tsend({\n\t\t\t\t\t\ttype: 'presence',\n\t\t\t\t\t\troom: frame.room,\n\t\t\t\t\t\tjoined: diff.joined,\n\t\t\t\t\t\tupdated: diff.updated,\n\t\t\t\t\t\tleft: diff.left\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t);\n\t\t\tpresenceRooms.set(frame.room, handle);\n\t\t\t// Initial snapshot to the joiner (peers got a `joined` diff instead).\n\t\t\tsend({\n\t\t\t\ttype: 'presence',\n\t\t\t\troom: frame.room,\n\t\t\t\tjoined: handle.members,\n\t\t\t\tupdated: [],\n\t\t\t\tleft: []\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'presence-set') {\n\t\t\tpresenceRooms.get(frame.room)?.set(frame.state);\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'presence-leave') {\n\t\t\tpresenceRooms.get(frame.room)?.leave();\n\t\t\tpresenceRooms.delete(frame.room);\n\t\t\treturn;\n\t\t}\n\n\t\tif (subscriptions.has(frame.id)) {\n\t\t\tsend({\n\t\t\t\ttype: 'error',\n\t\t\t\tid: frame.id,\n\t\t\t\tmessage: `Subscription id \"${frame.id}\" already in use`\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst subscription = await engine.subscribe({\n\t\t\t\tcollection: frame.collection,\n\t\t\t\tparams: frame.params,\n\t\t\t\tctx,\n\t\t\t\tsince: frame.since,\n\t\t\t\tonDiff: (diff, diffVersion, cursor) => {\n\t\t\t\t\tbufferDiff(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: frame.id,\n\t\t\t\t\t\t\tadded: diff.added,\n\t\t\t\t\t\t\tremoved: diff.removed,\n\t\t\t\t\t\t\tchanged: diff.changed\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdiffVersion,\n\t\t\t\t\t\tcursor\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t\tsubscriptions.set(frame.id, subscription);\n\t\t\t// No await between subscribe resolving and this send, so the initial\n\t\t\t// reply always precedes any diff for this subscription.\n\t\t\tif (subscription.catchup !== undefined) {\n\t\t\t\t// Resumed: a catch-up diff applied on top of the client's set.\n\t\t\t\tsend({\n\t\t\t\t\ttype: 'diff',\n\t\t\t\t\tid: frame.id,\n\t\t\t\t\tadded: subscription.catchup.added,\n\t\t\t\t\tremoved: subscription.catchup.removed,\n\t\t\t\t\tchanged: subscription.catchup.changed,\n\t\t\t\t\tversion: subscription.version,\n\t\t\t\t\tcursor: subscription.cursor\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tsend({\n\t\t\t\t\ttype: 'snapshot',\n\t\t\t\t\tid: frame.id,\n\t\t\t\t\trows: subscription.initial,\n\t\t\t\t\tversion: subscription.version,\n\t\t\t\t\tcursor: subscription.cursor\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tsend({\n\t\t\t\ttype: 'error',\n\t\t\t\tid: frame.id,\n\t\t\t\tmessage: error instanceof Error ? error.message : String(error)\n\t\t\t});\n\t\t}\n\t};\n\n\tconst close = () => {\n\t\tfor (const subscription of subscriptions.values()) {\n\t\t\tsubscription.unsubscribe();\n\t\t}\n\t\tsubscriptions.clear();\n\t\t// Drop this connection's presence so peers see it leave (auto-cleanup).\n\t\tfor (const handle of presenceRooms.values()) {\n\t\t\thandle.leave();\n\t\t}\n\t\tpresenceRooms.clear();\n\t};\n\n\tconst stats = (): SyncConnectionStats => ({\n\t\tframesSent,\n\t\tpresenceRoomCount: presenceRooms.size,\n\t\tslowSendsRecent,\n\t\tsubscriptionCount: subscriptions.size\n\t});\n\n\treturn { close, handle, stats };\n};\n"
31
32
  ],
32
- "mappings": "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",
33
- "debugId": "04E0C6606054D14564756E2164756E21",
33
+ "mappings": "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",
34
+ "debugId": "A8C35E8D4A587BE064756E2164756E21",
34
35
  "names": []
35
36
  }