@prometheus-ags/entity-graph-core 4.0.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/dist/index.d.ts +150 -3
- package/dist/index.mjs +147 -25
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -10
- package/LICENSE +0 -21
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/transport/registry.ts","../src/active-store.ts","../src/view/prisma-compile.ts","../src/view/types.ts","../src/transport/rest.ts","../src/object-path.ts","../src/merge/loro.ts","../src/graph-query.ts","../src/graph-actions.ts","../src/graph-effects.ts","../src/schema.ts","../src/ai-interop.ts","../src/local-first-runtime.ts","../src/devtools-event-bus.ts","../src/devtools-time-travel.ts","../src/view/incremental.ts","../src/agent/json-patch.ts","../src/agent/ag-ui-bridge.ts","../src/adapters/realtime-manager.ts","../src/adapters/realtime-adapters.ts","../src/adapters/surreal-live.ts","../src/adapters/flint.ts","../src/adapters/electricsql.ts","../src/adapters/electricsql-tenant.ts","../src/adapters/pglite-persistence.ts","../src/adapters/tauri-sql-persistence.ts","../src/schema-from-sql.ts","../src/table/row-models.ts","../src/table/faceting.ts"],"names":["message","clone","idx","isObject","id","DEFAULT_TABLE","rows"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Typed errors used throughout 2.0 to drive retry policy and consumer\n * UI decisions.\n *\n * Why two classes (not a discriminator field):\n * - `instanceof` checks are zero-cost at runtime and survive bundler\n * minification of property names.\n * - Consumers can write `if (error instanceof TerminalError) renderInline()`\n * without importing a type-narrowing helper.\n * - The engine's retry policy is one `instanceof TransientError` check.\n *\n * 4xx → `TerminalError` (no retry — the request is structurally wrong:\n * unauthorized, not-found, schema mismatch, validation failure).\n *\n * 5xx + network failures → `TransientError` (engine retries with\n * exponential backoff up to `maxRetries`).\n *\n * Custom transports can throw either class. The default REST helper\n * (`makeRestTransport`) maps HTTP status codes to the appropriate\n * class automatically.\n *\n * Both classes preserve the original error via the standard\n * `cause` option so stack traces survive the boundary.\n */\n\nexport interface EntityErrorOptions {\n /** HTTP status if the underlying transport was HTTP. */\n status?: number;\n /** Original thrown value (`Error`, `Response`, anything). */\n cause?: unknown;\n}\n\n/**\n * Permanent failure — do not retry. The request will not succeed by\n * trying again with the same inputs.\n *\n * Typical sources: HTTP 4xx, missing tables, validation errors,\n * permission denied, schema mismatches.\n */\nexport class TerminalError extends Error {\n readonly kind = \"terminal\" as const;\n readonly status?: number;\n\n constructor(message: string, opts: EntityErrorOptions = {}) {\n super(message, { cause: opts.cause });\n this.name = \"TerminalError\";\n this.status = opts.status;\n // Preserve stack across minification / older runtimes.\n if (typeof (Error as { captureStackTrace?: unknown }).captureStackTrace === \"function\") {\n (Error as unknown as { captureStackTrace: (target: object, ctor: unknown) => void })\n .captureStackTrace(this, TerminalError);\n }\n }\n}\n\n/**\n * Temporary failure — safe to retry. The engine will retry with\n * exponential backoff up to the configured `maxRetries`.\n *\n * Typical sources: HTTP 5xx, network timeouts, fetch rejections,\n * dropped sockets.\n */\nexport class TransientError extends Error {\n readonly kind = \"transient\" as const;\n readonly status?: number;\n\n constructor(message: string, opts: EntityErrorOptions = {}) {\n super(message, { cause: opts.cause });\n this.name = \"TransientError\";\n this.status = opts.status;\n if (typeof (Error as { captureStackTrace?: unknown }).captureStackTrace === \"function\") {\n (Error as unknown as { captureStackTrace: (target: object, ctor: unknown) => void })\n .captureStackTrace(this, TransientError);\n }\n }\n}\n\n/**\n * Union of every typed error the library raises. Use on consumer-side\n * `error` props when both classes are possible.\n */\nexport type EntityError = TerminalError | TransientError;\n\n/**\n * Convert an unknown thrown value into a typed entity error.\n *\n * - Already-typed errors pass through.\n * - HTTP-status-bearing errors become Terminal (4xx) or Transient (5xx).\n * - `AbortError` / `DOMException` \"AbortError\" → Terminal (caller\n * cancelled; not worth retrying).\n * - Everything else → Transient (assume retryable; better than\n * accidentally permanently failing on a one-off network blip).\n */\nexport function toEntityError(err: unknown): EntityError {\n if (err instanceof TerminalError) return err;\n if (err instanceof TransientError) return err;\n\n // Abort surfaces as DOMException(\"AbortError\") in browsers and as\n // `Error` with name \"AbortError\" in node — treat both as terminal.\n if (err && typeof err === \"object\" && \"name\" in err && (err as { name?: unknown }).name === \"AbortError\") {\n return new TerminalError(\"Aborted\", { cause: err });\n }\n\n // Plain object with a `status` field (e.g. a thrown Response or\n // PostgrestError shape).\n if (err && typeof err === \"object\" && \"status\" in err) {\n const status = Number((err as { status?: unknown }).status);\n const message = (err && typeof err === \"object\" && \"message\" in err)\n ? String((err as { message?: unknown }).message ?? `HTTP ${status}`)\n : `HTTP ${status}`;\n if (Number.isFinite(status) && status >= 400 && status < 500) {\n return new TerminalError(message, { status, cause: err });\n }\n if (Number.isFinite(status) && status >= 500) {\n return new TransientError(message, { status, cause: err });\n }\n }\n\n const message = err instanceof Error ? err.message : String(err);\n return new TransientError(message, { cause: err });\n}\n","/**\n * Process-global registry of `EntityTransport` instances by entity type.\n *\n * Why global state: every consumer of `useEntities(\"Client\")` must\n * resolve the SAME transport. Threading a registry through React\n * context would require every test, every isolated story, every\n * non-React caller (engine internals) to plumb the context — a tax\n * that buys nothing. The 1.x library already used module-global state\n * for the `useGraphStore` Zustand store; this follows the same shape.\n *\n * The registry is mutable: re-registering a type silently replaces the\n * prior transport (tests rely on this; production code should only\n * register once at app boot).\n */\n\nimport type { EntityType } from \"../graph\";\nimport type { EntityTransport } from \"./types\";\n\n// Keyed by entity type. `unknown` because each entity has a different\n// row shape; consumers cast at the `getEntityTransport<T>(type)` call site.\nconst transports = new Map<EntityType, EntityTransport<object>>();\n\n/**\n * Register the transport for an entity type. Called once per type at\n * app boot, typically from `src/shared/db/entity-transports.ts` in the\n * consuming application.\n *\n * Re-registering REPLACES the prior transport — useful for tests, a\n * footgun for production code. If you find yourself re-registering at\n * runtime, you almost certainly want a different design.\n */\nexport function registerEntityTransport<T extends object>(\n type: EntityType,\n transport: EntityTransport<T>,\n): void {\n transports.set(type, transport as unknown as EntityTransport<object>);\n}\n\n/**\n * Look up the transport for an entity type. Throws if none is\n * registered — there is no \"default\" transport, by design.\n *\n * The cast to `EntityTransport<T>` is the API ergonomic\n * compromise that lets call sites stay generic; the registry stores\n * `EntityTransport<object>` because TypeScript can't otherwise unify\n * heterogeneous rows in one map.\n */\nexport function getEntityTransport<T extends object>(\n type: EntityType,\n): EntityTransport<T> {\n const t = transports.get(type);\n if (!t) {\n throw new Error(\n `[entity-management] No transport registered for entity type \"${type}\". ` +\n `Call registerEntityTransport(\"${type}\", ...) at app boot.`,\n );\n }\n return t as unknown as EntityTransport<T>;\n}\n\n/**\n * Test-only: clear ALL registered transports. Production code should\n * never need this; tests use it to reset between specs.\n */\nexport function __resetEntityTransports(): void {\n transports.clear();\n}\n\n/**\n * Introspection: how many transports are currently registered.\n * Useful for asserting in tests that boot wiring ran exactly once.\n */\nexport function getRegisteredEntityTypes(): EntityType[] {\n return Array.from(transports.keys());\n}\n","/**\n * Active-graph resolution for imperative (non-hook) access.\n *\n * `GraphStoreProvider` scopes the React *hook* surface, but imperative callers —\n * Zustand store actions, module-level helpers, mutation callbacks — have no\n * React context to read. Before this module they had no way to reach a scoped\n * graph at all, so a mounted provider silently failed to isolate them.\n *\n * Two independent mechanisms, both opt-in, both falling back to the package\n * singleton so existing consumers are unaffected:\n *\n * 1. `setActiveGraphStore(store)` — a module-level active store. Correct in the\n * browser, where there is exactly one application tree. `GraphStoreProvider`\n * sets it on mount and restores the previous value on unmount.\n *\n * 2. `runWithGraphStore(store, fn)` — an `AsyncLocalStorage` scope. Required on\n * the server, where concurrent requests interleave and a module-level value\n * would leak across them.\n *\n * ALS takes precedence: if a request scope is active it always wins over the\n * module-level value, because a server render must never observe another\n * request's graph.\n *\n * ## Why `node:async_hooks` is loaded lazily\n *\n * This package is bundled for the browser as well as Node. A static\n * `import \"node:async_hooks\"` would break browser builds and pull a polyfill\n * into client bundles. The import is therefore attempted once, at first use of\n * `runWithGraphStore`, and failure degrades to the module-level mechanism\n * rather than throwing.\n */\n\nimport type { GraphStore } from \"./graph\";\n\n/**\n * Declared locally rather than pulling in `@types/node`: this package targets\n * the browser too, and these are only touched behind the `typeof` guards below.\n * Mirrors how `entity-graph-react` declares `process` for its NODE_ENV check.\n */\ndeclare const process: { versions?: { node?: string } } | undefined;\ndeclare const module: { require?: (id: string) => unknown } | undefined;\ndeclare const require: ((id: string) => unknown) | undefined;\n\n/** Minimal shape we need; avoids a type dependency on `node:async_hooks`. */\ninterface AsyncStore<T> {\n getStore(): T | undefined;\n run<R>(store: T, fn: () => R): R;\n}\n\nlet moduleActiveStore: GraphStore | null = null;\nlet asyncScope: AsyncStore<GraphStore> | null = null;\nlet asyncScopeAttempted = false;\n\n/** True when the runtime looks like Node (and so may have `node:async_hooks`). */\nfunction isNodeLike(): boolean {\n return (\n typeof process !== \"undefined\" &&\n typeof (process as { versions?: { node?: string } }).versions?.node === \"string\"\n );\n}\n\n/**\n * Load `AsyncLocalStorage` if this runtime has it.\n *\n * Returns `null` in the browser (and in any runtime without `node:async_hooks`),\n * which is the signal to fall back to the module-level store.\n */\nfunction resolveAsyncScope(): AsyncStore<GraphStore> | null {\n if (asyncScopeAttempted) return asyncScope;\n asyncScopeAttempted = true;\n if (!isNodeLike()) return null;\n try {\n // Indirect require so bundlers do not statically resolve it into browser\n // builds. Present under CJS; absent under pure ESM, where `prepareGraphStoreScope()`\n // must be awaited once at startup instead.\n const req =\n typeof module !== \"undefined\" && typeof module.require === \"function\"\n ? module.require\n : typeof require === \"function\"\n ? require\n : null;\n if (!req) return null;\n const { AsyncLocalStorage } = req(\"node:async_hooks\") as {\n AsyncLocalStorage: new () => AsyncStore<GraphStore>;\n };\n asyncScope = new AsyncLocalStorage();\n } catch {\n asyncScope = null;\n }\n return asyncScope;\n}\n\n/**\n * Initialise request scoping on runtimes without a synchronous `require`.\n *\n * Under **pure ESM** there is no `require`, so the synchronous path above cannot\n * load `node:async_hooks` and `runWithGraphStore` would silently degrade to the\n * module-level store — which does NOT isolate concurrent requests. An ESM server\n * must therefore `await prepareGraphStoreScope()` once during startup, before\n * serving traffic.\n *\n * Safe to call anywhere: it resolves to `false` in the browser and is idempotent.\n */\nexport async function prepareGraphStoreScope(): Promise<boolean> {\n if (asyncScope) return true;\n if (!isNodeLike()) {\n asyncScopeAttempted = true;\n return false;\n }\n if (resolveAsyncScope()) return true;\n try {\n // Specifier held in a variable so TS does not try to resolve @types/node,\n // and so bundlers cannot statically pull it into browser output.\n const specifier = \"node:async_hooks\";\n const mod = (await import(/* @vite-ignore */ specifier)) as unknown as {\n AsyncLocalStorage: new () => AsyncStore<GraphStore>;\n };\n asyncScope = new mod.AsyncLocalStorage();\n asyncScopeAttempted = true;\n return true;\n } catch {\n asyncScopeAttempted = true;\n return false;\n }\n}\n\n/**\n * Set the process/tab-wide active graph.\n *\n * Returns a restore function; callers MUST invoke it on teardown so a nested or\n * remounted provider does not strand a stale store. Passing `null` clears it.\n */\nexport function setActiveGraphStore(store: GraphStore | null): () => void {\n const previous = moduleActiveStore;\n moduleActiveStore = store;\n return () => {\n moduleActiveStore = previous;\n };\n}\n\nlet warnedUnscopedFallback = false;\n\n/**\n * Warn once when request scoping silently degrades.\n *\n * Without this, an ESM server that never called `prepareGraphStoreScope()` gets\n * module-level fallback — which looks like it works single-threaded and leaks\n * across concurrent requests under load. Exactly the class of silent failure\n * this whole module exists to remove.\n */\nfunction warnUnscopedRequestFallback(): void {\n if (warnedUnscopedFallback || !isNodeLike()) return;\n warnedUnscopedFallback = true;\n console.warn(\n \"[entity-graph-core] runWithGraphStore() could not load node:async_hooks, so it fell back to a module-level store. Concurrent requests will NOT be isolated. Await prepareGraphStoreScope() once during server startup.\",\n );\n}\n\n/**\n * Run `fn` with `store` as the active graph for this async context.\n *\n * This is the server-side entry point: an SSR host wraps each request so that\n * concurrent renders never share entity state. When the runtime has no\n * `AsyncLocalStorage`, `fn` still runs — under the module-level store — rather\n * than failing, so isomorphic code does not need a branch.\n */\nexport function runWithGraphStore<R>(store: GraphStore, fn: () => R): R {\n const scope = resolveAsyncScope();\n if (!scope) {\n warnUnscopedRequestFallback();\n const restore = setActiveGraphStore(store);\n try {\n return fn();\n } finally {\n restore();\n }\n }\n return scope.run(store, fn);\n}\n\n/**\n * The graph imperative access should target right now.\n *\n * Precedence: request scope (ALS) → module-level active store → `fallback`.\n * `fallback` is the package singleton, supplied by the caller to avoid a\n * circular import with `graph.ts`.\n */\nexport function resolveActiveGraphStore(fallback: GraphStore): GraphStore {\n const scoped = resolveAsyncScope()?.getStore();\n if (scoped) return scoped;\n return moduleActiveStore ?? fallback;\n}\n\n/** Test seam: drop all active-store state. */\nexport function __resetActiveGraphStore(): void {\n moduleActiveStore = null;\n asyncScope = null;\n asyncScopeAttempted = false;\n warnedUnscopedFallback = false;\n}\n","import type { FilterClause, FilterGroup, FilterSpec, SortSpec } from \"./types\";\n\n/**\n * Nests a leaf Prisma field filter under dotted paths (e.g. `author.name` → `{ author: { name: { … } } }`).\n */\nfunction nestWhereField(parts: string[], leaf: unknown): Record<string, unknown> {\n if (parts.length === 0) return {};\n if (parts.length === 1) return { [parts[0]]: leaf };\n return { [parts[0]]: nestWhereField(parts.slice(1), leaf) };\n}\n\nfunction clauseToPrismaLeaf(c: FilterClause): Record<string, unknown> | null {\n switch (c.op) {\n case \"eq\":\n return { equals: c.value };\n case \"neq\":\n return { not: c.value };\n case \"gt\":\n return { gt: c.value };\n case \"gte\":\n return { gte: c.value };\n case \"lt\":\n return { lt: c.value };\n case \"lte\":\n return { lte: c.value };\n case \"contains\":\n return { contains: c.value, mode: \"insensitive\" };\n case \"startsWith\":\n return { startsWith: c.value, mode: \"insensitive\" };\n case \"endsWith\":\n return { endsWith: c.value, mode: \"insensitive\" };\n case \"in\":\n return { in: c.value };\n case \"nin\":\n return { notIn: c.value };\n case \"arrayContains\":\n return { has: c.value };\n case \"between\":\n case \"arrayOverlaps\":\n case \"matches\":\n case \"custom\":\n default:\n return null;\n }\n}\n\nfunction clauseToPrismaEntry(c: FilterClause): Record<string, unknown> | null {\n const parts = c.field.split(\".\").filter(Boolean);\n if (parts.length === 0) return null;\n\n if (c.op === \"isNull\") {\n /** `value` truthy → equals null; falsy → `{ not: null }` (see Prisma adapter docs). */\n const equalsNull = c.value === undefined || c.value === true;\n return nestWhereField(parts, equalsNull ? null : { not: null });\n }\n if (c.op === \"isNotNull\") {\n return nestWhereField(parts, { not: null });\n }\n\n const leaf = clauseToPrismaLeaf(c);\n if (leaf === null) return null;\n return nestWhereField(parts, leaf);\n}\n\nfunction groupToPrismaWhere(g: FilterGroup): Record<string, unknown> {\n const parts: Record<string, unknown>[] = [];\n for (const item of g.clauses) {\n if (\"logic\" in item) {\n const nested = groupToPrismaWhere(item);\n if (Object.keys(nested).length > 0) parts.push(nested);\n } else {\n const entry = clauseToPrismaEntry(item);\n if (entry) parts.push(entry);\n }\n }\n if (parts.length === 0) return {};\n if (parts.length === 1) return parts[0];\n return g.logic === \"or\" ? { OR: parts } : { AND: parts };\n}\n\n/**\n * Compiles a {@link FilterSpec} into a Prisma `where` object (plain JSON-serializable shape).\n *\n * Operator mapping matches common Prisma filter APIs: `eq` → `equals`, string ops use `mode: \"insensitive\"`,\n * `nin` → `notIn`, `arrayContains` → `has`, `isNull` uses `null` / `{ not: null }` per `value`, and `isNotNull` → `{ not: null }`.\n * Unsupported ops (`between`, `arrayOverlaps`, `matches`, `custom`) are omitted from the result.\n *\n * Top-level clause arrays are combined with `AND`. {@link FilterGroup} uses `AND` / `OR` to match `group.logic`.\n */\nexport function toPrismaWhere(filter: FilterSpec): Record<string, unknown> {\n if (Array.isArray(filter)) {\n const parts: Record<string, unknown>[] = [];\n for (const item of filter) {\n const entry = clauseToPrismaEntry(item);\n if (entry) parts.push(entry);\n }\n if (parts.length === 0) return {};\n if (parts.length === 1) return parts[0];\n return { AND: parts };\n }\n return groupToPrismaWhere(filter);\n}\n\n/**\n * Compiles a {@link SortSpec} into Prisma `orderBy` form: `[{ fieldName: \"asc\" | \"desc\" }, …]`.\n * `nulls` and `comparator` on {@link SortClause} are ignored (local-only); extend callers if your Prisma version supports null ordering.\n */\nexport function toPrismaOrderBy(sort: SortSpec): Record<string, string>[] {\n return sort.map((s) => ({ [s.field]: s.direction }));\n}\n","/**\n * Transport-agnostic comparison operators. Same spec can compile to REST, SQL, GraphQL, or local JS (`evaluator`).\n * `custom` opts out of automatic serialization — use for predicates only the client can evaluate.\n */\nexport type FilterOperator = \"eq\"|\"neq\"|\"gt\"|\"gte\"|\"lt\"|\"lte\"|\"in\"|\"nin\"|\"contains\"|\"startsWith\"|\"endsWith\"|\"isNull\"|\"isNotNull\"|\"between\"|\"arrayContains\"|\"arrayOverlaps\"|\"matches\"|\"custom\";\n/** Atomic filter: field path, operator, optional value, and optional JS predicate for `custom`. */\nexport interface FilterClause { field: string; op: FilterOperator; value?: unknown; predicate?: (fieldValue: unknown, entity: Record<string, unknown>) => boolean; }\nexport type FilterLogic = \"and\" | \"or\";\n/** Nested boolean group so you can express `(A AND B) OR C` without losing structure when compiling to backends. */\nexport interface FilterGroup { logic: FilterLogic; clauses: Array<FilterClause | FilterGroup>; }\n/** Top-level filter: flat AND list of clauses, or a recursive `FilterGroup`. */\nexport type FilterSpec = FilterGroup | FilterClause[];\nexport type SortDirection = \"asc\" | \"desc\";\n/** Single sort key with optional null ordering and custom comparator for local sort parity with remote semantics. */\nexport interface SortClause { field: string; direction: SortDirection; nulls?: \"first\" | \"last\"; comparator?: (a: unknown, b: unknown) => number; }\n/** Ordered multi-key sort (stable application in `compareEntities`). */\nexport type SortSpec = SortClause[];\n/**\n * Everything `useEntityView` needs to describe a virtualized collection: filters, sorts, and simple multi-field search.\n * One descriptor can drive local evaluation, remote query compilation, or hybrid mode.\n */\nexport interface ViewDescriptor { filter?: FilterSpec; sort?: SortSpec; search?: { query: string; fields: string[]; minChars?: number }; }\n/**\n * How complete local graph data is relative to the view: **local** (all in memory), **remote** (server must filter/sort), **hybrid** (show local fast + remote reconcile).\n */\nexport type CompletenessMode = \"local\" | \"remote\" | \"hybrid\";\n\n/**\n * Compile a view to flat REST query params (`sort`, `q`, and `field[op]=value` keys). Skips `custom` clauses — those cannot be expressed as strings.\n */\nexport function toRestParams(view: ViewDescriptor): Record<string, string> {\n const params: Record<string, string> = {};\n if (view.filter) { const clauses = flattenClauses(view.filter); for (const c of clauses) { if (c.op === \"custom\") continue; const key = c.op === \"eq\" ? c.field : `${c.field}[${c.op}]`; params[key] = Array.isArray(c.value) ? (c.value as unknown[]).join(\",\") : String(c.value ?? \"\"); } }\n if (view.sort) params[\"sort\"] = view.sort.map((s) => `${s.direction === \"desc\" ? \"-\" : \"\"}${s.field}`).join(\",\");\n if (view.search?.query) params[\"q\"] = view.search.query;\n return params;\n}\n\n/**\n * Compile a view to parameterized SQL fragments for server-side filtering/sorting. Unknown ops become `TRUE` — validate or restrict ops at the edge.\n */\nexport function toSQLClauses(view: ViewDescriptor): { where: string; orderBy: string; params: unknown[] } {\n const params: unknown[] = []; let paramIdx = 1;\n function clauseToSQL(c: FilterClause): string {\n const col = `\"${c.field}\"`;\n switch (c.op) {\n case \"eq\": params.push(c.value); return `${col} = $${paramIdx++}`;\n case \"neq\": params.push(c.value); return `${col} != $${paramIdx++}`;\n case \"gt\": params.push(c.value); return `${col} > $${paramIdx++}`;\n case \"gte\": params.push(c.value); return `${col} >= $${paramIdx++}`;\n case \"lt\": params.push(c.value); return `${col} < $${paramIdx++}`;\n case \"lte\": params.push(c.value); return `${col} <= $${paramIdx++}`;\n case \"in\": params.push(c.value); return `${col} = ANY($${paramIdx++})`;\n case \"nin\": params.push(c.value); return `${col} != ALL($${paramIdx++})`;\n case \"isNull\": return `${col} IS NULL`;\n case \"isNotNull\": return `${col} IS NOT NULL`;\n case \"contains\": params.push(`%${c.value}%`); return `${col} ILIKE $${paramIdx++}`;\n case \"startsWith\": params.push(`${c.value}%`); return `${col} ILIKE $${paramIdx++}`;\n case \"between\": { const [lo, hi] = c.value as [unknown, unknown]; params.push(lo, hi); return `${col} BETWEEN $${paramIdx++} AND $${paramIdx++}`; }\n case \"arrayContains\": params.push(c.value); return `$${paramIdx++} = ANY(${col})`;\n default: return \"TRUE\";\n }\n }\n function groupToSQL(g: FilterGroup): string {\n const parts = g.clauses.map((c) => \"logic\" in c ? `(${groupToSQL(c)})` : clauseToSQL(c));\n return parts.join(` ${g.logic.toUpperCase()} `);\n }\n let where = \"TRUE\";\n if (view.filter) { if (Array.isArray(view.filter)) where = view.filter.map(clauseToSQL).join(\" AND \") || \"TRUE\"; else where = groupToSQL(view.filter) || \"TRUE\"; }\n if (view.search?.query) { params.push(`%${view.search.query}%`); where += ` AND (${view.search.fields.map((f) => `\"${f}\"`).join(\" || ' ' || \")}) ILIKE $${paramIdx++}`; }\n const orderBy = view.sort ? view.sort.map((s) => `\"${s.field}\" ${s.direction.toUpperCase()}${s.nulls ? ` NULLS ${s.nulls.toUpperCase()}` : \"\"}`).join(\", \") : \"\";\n return { where, orderBy, params };\n}\n\n/**\n * Produce a GraphQL-variable-shaped object from a view (Hasura/Postgraphile-style `_op` maps). Intended as a starting point — wire to your actual schema.\n */\nexport function toGraphQLVariables(view: ViewDescriptor) {\n const result: { where?: Record<string, unknown>; orderBy?: Array<Record<string, unknown>>; search?: string } = {};\n if (view.filter) { const clauses = flattenClauses(view.filter); const where: Record<string, unknown> = {}; for (const c of clauses) { if (c.op === \"custom\") continue; where[c.field] = { [`_${c.op}`]: c.value }; } if (Object.keys(where).length) result.where = where; }\n if (view.sort) result.orderBy = view.sort.map((s) => ({ [s.field]: s.direction === \"desc\" ? \"desc_nulls_last\" : \"asc_nulls_last\" }));\n if (view.search?.query) result.search = view.search.query;\n return result;\n}\n\n/** Prisma `where` / `orderBy` compilers (JSON-serializable; pair with a route that passes them to `prisma.*.findMany`). */\nexport { toPrismaWhere, toPrismaOrderBy } from \"./prisma-compile\";\n\n/**\n * Normalize nested `FilterGroup` trees to a flat clause list for compilers that only understand atomic predicates.\n */\nexport function flattenClauses(filter: FilterSpec): FilterClause[] {\n if (Array.isArray(filter)) return filter;\n function walk(g: FilterGroup): FilterClause[] { return g.clauses.flatMap((c) => (\"logic\" in c ? walk(c) : [c])); }\n return walk(filter);\n}\n\n/** True if any clause requires client-side `predicate` logic — forces local/hybrid evaluation paths that cannot be pushed to generic REST/SQL. */\nexport function hasCustomPredicates(filter: FilterSpec): boolean { return flattenClauses(filter).some((c) => c.op === \"custom\"); }\n","/**\n * `makeRestTransport` — built-in helper for the most common case: a\n * Supabase / PostgREST backend reached through a `SupabaseClient`-like\n * object.\n *\n * Why a helper (not a class): consumers stay declarative —\n * registerEntityTransport(\"Client\",\n * makeRestTransport<Client>({ supabase, table: \"client\" }));\n * — and the library never imports `@supabase/supabase-js` directly\n * (peer-dep-free).\n *\n * The transport:\n * - Compiles `ListQuery` (filter / sort / search / cursor / limit)\n * into a PostgREST query via the supabase-js builder.\n * - Maps HTTP status to `TerminalError` (4xx) or `TransientError`\n * (5xx / network).\n * - Honours `AbortSignal` via supabase-js `.abortSignal(signal)`.\n * - Returns `total` from PostgREST `count: 'exact'` when requested.\n */\n\nimport { TerminalError, TransientError, toEntityError } from \"../errors\";\nimport type { FilterClause, FilterGroup, FilterSpec, SortClause } from \"../view/types\";\nimport { flattenClauses } from \"../view/types\";\nimport type { ChangeEvent, EntityTransport, ListQuery, ListResult } from \"./types\";\n\n/**\n * Minimal slice of the `@supabase/supabase-js` `SupabaseClient` we use.\n * Declared structurally so the library does not need to import the\n * package as a dependency (peer-dep-free).\n */\nexport interface SupabaseLike {\n from: (table: string) => SupabaseQueryBuilderLike;\n}\n\n/**\n * Subset of the supabase-js builder we exercise. Each call returns the\n * same builder for chaining; `then`-able at the end resolves to\n * `{ data, error, count, status }`.\n */\nexport interface SupabaseQueryBuilderLike {\n select: (columns: string, opts?: { count?: \"exact\" | \"planned\" | \"estimated\"; head?: boolean }) => SupabaseQueryBuilderLike;\n eq: (col: string, val: unknown) => SupabaseQueryBuilderLike;\n neq: (col: string, val: unknown) => SupabaseQueryBuilderLike;\n gt: (col: string, val: unknown) => SupabaseQueryBuilderLike;\n gte: (col: string, val: unknown) => SupabaseQueryBuilderLike;\n lt: (col: string, val: unknown) => SupabaseQueryBuilderLike;\n lte: (col: string, val: unknown) => SupabaseQueryBuilderLike;\n in: (col: string, vals: readonly unknown[]) => SupabaseQueryBuilderLike;\n ilike: (col: string, pattern: string) => SupabaseQueryBuilderLike;\n is: (col: string, val: null | boolean) => SupabaseQueryBuilderLike;\n or: (filter: string) => SupabaseQueryBuilderLike;\n order: (col: string, opts?: { ascending?: boolean; nullsFirst?: boolean }) => SupabaseQueryBuilderLike;\n range: (from: number, to: number) => SupabaseQueryBuilderLike;\n limit: (n: number) => SupabaseQueryBuilderLike;\n abortSignal?: (signal: AbortSignal) => SupabaseQueryBuilderLike;\n then: <TResult1 = unknown, TResult2 = never>(\n onfulfilled?: ((value: { data: unknown; error: unknown; count?: number | null; status?: number }) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ) => Promise<TResult1 | TResult2>;\n}\n\n/** Options for `makeRestTransport`. */\nexport interface MakeRestTransportOptions<T extends object> {\n /** A `@supabase/supabase-js` client (or any structurally-compatible thing). */\n supabase: SupabaseLike;\n /** PostgREST table name. */\n table: string;\n /** Columns to select (default `\"*\"`). */\n select?: string;\n /** Stable id derivation. Defaults to `(row) => String(row.id)`. */\n identify?: (row: T) => string;\n /** Whether the local cache is treated as authoritative. */\n authoritative?: boolean;\n /** Stale-time hint in ms. */\n staleTime?: number;\n /** Free-text search column list (compiled to `or=col.ilike.*query*,…`). */\n searchColumns?: string[];\n /** Default page size when `ListQuery.limit` is absent. */\n defaultLimit?: number;\n}\n\n/**\n * Build an `EntityTransport<T>` from a Supabase client + a table name.\n *\n * The returned transport:\n * - Maps `ListQuery.filter` clauses to PostgREST operators (`eq`, `gt`,\n * `in`, `ilike`, `is null`, etc.).\n * - Compiles `ListQuery.search` into an `or=` clause across\n * `searchColumns`.\n * - Uses `count: 'exact'` on first page to surface `total`.\n * - Throws `TerminalError` on 4xx (no retry); `TransientError` on 5xx\n * or network failure.\n * - Honours `signal` via `.abortSignal(signal)` (supabase-js >= 2.39).\n */\nexport function makeRestTransport<T extends object>(\n opts: MakeRestTransportOptions<T>,\n): EntityTransport<T> {\n const {\n supabase,\n table,\n select = \"*\",\n identify = (row: T) => String((row as { id?: unknown }).id),\n authoritative = false,\n staleTime,\n searchColumns = [],\n defaultLimit = 200,\n } = opts;\n\n return {\n identify,\n authoritative,\n staleTime,\n\n async list(q: ListQuery): Promise<ListResult<T>> {\n const limit = q.limit ?? defaultLimit;\n const offset = typeof q.cursor === \"number\" ? q.cursor : 0;\n\n let builder = supabase\n .from(table)\n .select(select, { count: offset === 0 ? \"exact\" : undefined });\n\n // Apply filter\n if (q.filter) builder = applyFilter(builder, q.filter);\n\n // Apply search across configured columns\n if (q.search && searchColumns.length > 0) {\n const escaped = q.search.replace(/[%,()]/g, \"\"); // PostgREST safety\n const orClause = searchColumns\n .map((c) => `${c}.ilike.*${escaped}*`)\n .join(\",\");\n builder = builder.or(orClause);\n }\n\n // Apply sort\n if (q.sort) {\n for (const s of q.sort as SortClause[]) {\n builder = builder.order(s.field, {\n ascending: s.direction === \"asc\",\n nullsFirst: s.nulls === \"first\",\n });\n }\n }\n\n // Page\n builder = builder.range(offset, offset + limit - 1);\n\n // Abort\n if (q.signal && builder.abortSignal) builder = builder.abortSignal(q.signal);\n\n const result = (await builder) as { data: unknown; error: unknown; count?: number | null; status?: number };\n\n if (result.error) {\n throw mapPostgrestError(result.error, result.status);\n }\n\n const rows = (result.data as T[] | null) ?? [];\n const total = typeof result.count === \"number\" ? result.count : null;\n const nextCursor = rows.length === limit ? offset + limit : null;\n return { rows, total, nextCursor };\n },\n };\n}\n\n/** Compile a `FilterSpec` against a supabase-js builder. */\nfunction applyFilter(\n builder: SupabaseQueryBuilderLike,\n filter: FilterSpec,\n): SupabaseQueryBuilderLike {\n // PostgREST does not have nested OR/AND of arbitrary depth in the\n // builder API, so we flatten and concatenate top-level AND clauses.\n // Nested OR groups become an `.or()` string clause.\n if (!Array.isArray(filter) && (filter as FilterGroup).logic === \"or\") {\n const parts = (filter as FilterGroup).clauses\n .filter((c): c is FilterClause => !(\"logic\" in c))\n .map((c) => clauseToOrFragment(c))\n .filter((s): s is string => !!s);\n if (parts.length > 0) return builder.or(parts.join(\",\"));\n return builder;\n }\n const clauses = flattenClauses(filter);\n let b = builder;\n for (const c of clauses) {\n b = applyClause(b, c);\n }\n return b;\n}\n\nfunction applyClause(\n builder: SupabaseQueryBuilderLike,\n c: FilterClause,\n): SupabaseQueryBuilderLike {\n switch (c.op) {\n case \"eq\": return builder.eq(c.field, c.value);\n case \"neq\": return builder.neq(c.field, c.value);\n case \"gt\": return builder.gt(c.field, c.value);\n case \"gte\": return builder.gte(c.field, c.value);\n case \"lt\": return builder.lt(c.field, c.value);\n case \"lte\": return builder.lte(c.field, c.value);\n case \"in\": return builder.in(c.field, c.value as readonly unknown[]);\n case \"isNull\": return builder.is(c.field, null);\n case \"isNotNull\": return builder.neq(c.field, null);\n case \"contains\": return builder.ilike(c.field, `%${String(c.value)}%`);\n case \"startsWith\": return builder.ilike(c.field, `${String(c.value)}%`);\n case \"endsWith\": return builder.ilike(c.field, `%${String(c.value)}`);\n case \"matches\": return builder.ilike(c.field, String(c.value));\n case \"custom\": return builder; // local-only predicate; skip on server\n default: return builder;\n }\n}\n\n/** Map a single clause to a PostgREST `or=` fragment (e.g. `name.eq.foo`). */\nfunction clauseToOrFragment(c: FilterClause): string | null {\n const v = encodeURIComponent(String(c.value ?? \"\"));\n switch (c.op) {\n case \"eq\": return `${c.field}.eq.${v}`;\n case \"neq\": return `${c.field}.neq.${v}`;\n case \"gt\": return `${c.field}.gt.${v}`;\n case \"gte\": return `${c.field}.gte.${v}`;\n case \"lt\": return `${c.field}.lt.${v}`;\n case \"lte\": return `${c.field}.lte.${v}`;\n case \"isNull\": return `${c.field}.is.null`;\n case \"isNotNull\": return `${c.field}.not.is.null`;\n case \"contains\": return `${c.field}.ilike.*${v}*`;\n case \"startsWith\": return `${c.field}.ilike.${v}*`;\n case \"endsWith\": return `${c.field}.ilike.*${v}`;\n default: return null;\n }\n}\n\n/** Convert a PostgREST error envelope into one of our typed errors. */\nfunction mapPostgrestError(error: unknown, status?: number): TerminalError | TransientError {\n // Already a typed entity error (a custom transport could rethrow these)\n if (error instanceof TerminalError || error instanceof TransientError) return error;\n\n // PostgrestError has `.code`, `.message`, `.details`, `.hint`.\n const message = (error && typeof error === \"object\" && \"message\" in error)\n ? String((error as { message?: unknown }).message ?? \"Unknown REST error\")\n : String(error);\n\n // Some PostgREST errors carry their HTTP status only on the outer\n // response. If `status` is provided we trust it.\n if (typeof status === \"number\") {\n if (status >= 400 && status < 500) {\n return new TerminalError(message, { status, cause: error });\n }\n if (status >= 500) {\n return new TransientError(message, { status, cause: error });\n }\n }\n\n // Postgres \"relation does not exist\" → 42P01 → terminal.\n const code = (error && typeof error === \"object\" && \"code\" in error)\n ? String((error as { code?: unknown }).code ?? \"\")\n : \"\";\n if (code === \"42P01\" || code === \"PGRST116\" || code === \"PGRST106\") {\n return new TerminalError(message, { cause: error });\n }\n\n return toEntityError(error);\n}\n\nexport type { ChangeEvent };\n","function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function getValueAtPath<T = unknown>(source: unknown, path: string): T | undefined {\n if (!path) return source as T;\n const segments = path.split(\".\").filter(Boolean);\n let current: unknown = source;\n for (const segment of segments) {\n if (!isObject(current) && !Array.isArray(current)) return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current as T | undefined;\n}\n\nexport function setValueAtPath<T extends object>(source: T, path: string, value: unknown): T {\n const segments = path.split(\".\").filter(Boolean);\n if (segments.length === 0) return source;\n\n const clone = structuredClone(source) as Record<string, unknown>;\n let current: Record<string, unknown> = clone;\n\n for (let index = 0; index < segments.length - 1; index += 1) {\n const segment = segments[index];\n const next = current[segment];\n if (!isObject(next)) current[segment] = {};\n current = current[segment] as Record<string, unknown>;\n }\n\n current[segments[segments.length - 1]] = value;\n return clone as T;\n}\n\nexport function collectDirtyPaths(current: unknown, original: unknown, prefix = \"\", acc = new Set<string>()): Set<string> {\n if (isObject(current) && isObject(original)) {\n const keys = new Set([...Object.keys(current), ...Object.keys(original)]);\n for (const key of keys) {\n const nextPrefix = prefix ? `${prefix}.${key}` : key;\n collectDirtyPaths(current[key], original[key], nextPrefix, acc);\n }\n return acc;\n }\n\n if (JSON.stringify(current) !== JSON.stringify(original) && prefix) acc.add(prefix);\n return acc;\n}\n","/**\n * merge/loro.ts — Loro-backed CRDT MergeStrategy (reference implementation).\n *\n * Maps each entity (`type:id`) onto a Loro document whose root is an LWW-Map —\n * a near-1:1 fit for the graph's `type:id:field` model. Concurrent field writes\n * resolve via Loro's CRDT semantics rather than blind last-write-wins, so two\n * writers updating *different* fields never clobber each other, and writers\n * updating the *same* field resolve deterministically across replicas.\n *\n * `loro-crdt` is an OPTIONAL peer dependency. It is imported lazily so the core\n * bundle stays `zustand + immer` only — nothing loads Loro unless an app\n * actually registers `createLoroMergeStrategy()`.\n *\n * NOTE: `createLoroMergeStrategy` is async because it dynamically imports the\n * engine. Await it once at boot, then register the resolved synchronous\n * strategy. The returned strategy itself is pure+sync (the MergeStrategy\n * contract), keeping per-write resolution off the async path.\n */\n\nimport type { MergeStrategy } from \"./types\";\n\n/** Minimal surface of the `loro-crdt` LoroDoc we rely on (avoids a hard type dep). */\ninterface LoroDocLike {\n getMap(key: string): LoroMapLike;\n toJSON(): Record<string, unknown>;\n}\ninterface LoroMapLike {\n set(key: string, value: unknown): void;\n toJSON?(): Record<string, unknown>;\n}\ninterface LoroModuleLike {\n LoroDoc: new () => LoroDocLike;\n}\n\nexport type LoroModuleLoader = () => Promise<{ LoroDoc: unknown }>;\n\nconst ROOT_MAP = \"entity\";\nconst LORO_MODULE_SPECIFIER = \"loro-crdt\";\n\n/** Per-(type:id) Loro document cache so repeated writes converge on one CRDT. */\nconst docs = new Map<string, LoroDocLike>();\n\nfunction ek(type: string, id: string): string {\n return `${type}:${id}`;\n}\n\n/**\n * Build a Loro-backed {@link MergeStrategy}. Resolves `loro-crdt` lazily; throws\n * a clear error if the optional peer is not installed.\n *\n * @example\n * ```ts\n * const loro = await createLoroMergeStrategy();\n * registerMergeStrategy(\"Document\", loro);\n * ```\n */\nexport async function createLoroMergeStrategy(\n loadLoro?: LoroModuleLoader,\n): Promise<MergeStrategy> {\n let mod: LoroModuleLike;\n try {\n // `loro-crdt` is an OPTIONAL peer dependency for consumers. It is present as a\n // devDependency here (so CI can prove the merge math), but a consumer may not\n // install it — the runtime try/catch below is the real guard. `@ts-ignore`\n // (not `@ts-expect-error`) so this stays valid whether or not the module\n // resolves at type-check time in a given install.\n // @ts-ignore optional peer dependency, resolved at runtime\n const loaded = loadLoro\n ? await loadLoro()\n : await import(/* @vite-ignore */ LORO_MODULE_SPECIFIER);\n if (typeof loaded.LoroDoc !== \"function\") {\n throw new TypeError(\"loro-crdt did not export a LoroDoc constructor\");\n }\n mod = loaded as unknown as LoroModuleLike;\n } catch (cause) {\n throw new Error(\n \"[merge/loro] createLoroMergeStrategy requires the optional peer dependency 'loro-crdt'. \" +\n \"Install it with `pnpm add loro-crdt`.\",\n { cause },\n );\n }\n\n const { LoroDoc } = mod;\n\n return (prev, next, ctx) => {\n const key = ek(ctx.type, ctx.id);\n let doc = docs.get(key);\n if (!doc) {\n doc = new LoroDoc();\n docs.set(key, doc);\n // Seed the CRDT with any pre-existing canonical state so the first\n // CRDT write merges against known fields rather than an empty doc.\n if (prev) {\n const seed = doc.getMap(ROOT_MAP);\n for (const [k, v] of Object.entries(prev)) seed.set(k, v);\n }\n }\n\n const map = doc.getMap(ROOT_MAP);\n for (const [k, v] of Object.entries(next)) map.set(k, v);\n\n const root = doc.toJSON()[ROOT_MAP];\n return (root && typeof root === \"object\" ? (root as Record<string, unknown>) : { ...next });\n };\n}\n\n/** @internal Test-only. Clears the per-entity Loro doc cache. */\nexport function __resetLoroDocs(): void {\n docs.clear();\n}\n","import { useGraphStore } from \"./graph\";\nimport type { EntityId, EntitySnapshot, EntityType, QueryKey } from \"./graph\";\n\ntype GraphStore = ReturnType<typeof useGraphStore.getState>;\n\nexport type GraphIncludeMap = Record<string, GraphIncludeRelation>;\n\nexport type GraphIncludeRelation =\n | {\n type: EntityType;\n via: { kind: \"field\"; field: string };\n include?: GraphIncludeMap;\n }\n | {\n type: EntityType;\n via: { kind: \"array\"; field: string };\n include?: GraphIncludeMap;\n }\n | {\n type: EntityType;\n via: { kind: \"list\"; key: QueryKey | ((entity: Record<string, unknown>) => QueryKey | null | undefined) };\n include?: GraphIncludeMap;\n }\n | {\n type: EntityType;\n via: {\n kind: \"resolver\";\n resolve: (entity: Record<string, unknown>, store: GraphStore) => EntityId | EntityId[] | null | undefined;\n };\n include?: GraphIncludeMap;\n };\n\nexport interface GraphQueryOptions<TEntity extends object> {\n type: EntityType;\n id?: EntityId;\n ids?: EntityId[];\n listKey?: QueryKey;\n where?: (entity: EntitySnapshot<TEntity>) => boolean;\n sort?: (a: EntitySnapshot<TEntity>, b: EntitySnapshot<TEntity>) => number;\n include?: GraphIncludeMap;\n select?: ((entity: Record<string, unknown>) => unknown) | string[];\n}\n\ntype ProjectedRow = Record<string, unknown>;\n\nexport function queryOnce<TEntity extends object>(\n opts: GraphQueryOptions<TEntity> & { id: EntityId },\n): ProjectedRow | null;\nexport function queryOnce<TEntity extends object>(\n opts: GraphQueryOptions<TEntity>,\n): ProjectedRow[];\nexport function queryOnce<TEntity extends object>(\n opts: GraphQueryOptions<TEntity>,\n): ProjectedRow[] | ProjectedRow | null {\n const store = useGraphStore.getState();\n const ids = resolveCandidateIds(store, opts);\n let rows = ids\n .map((id) => store.readEntitySnapshot<TEntity>(opts.type, id))\n .filter((row): row is EntitySnapshot<TEntity> => row !== null);\n\n if (opts.where) rows = rows.filter(opts.where);\n if (opts.sort) rows = [...rows].sort(opts.sort);\n\n const projected = rows.map((row) => applySelection(projectRow(row, opts.include, store), opts.select));\n if (opts.id) return projected[0] ?? null;\n return projected;\n}\n\nexport const selectGraph = queryOnce;\n\nfunction resolveCandidateIds<TEntity extends object>(store: GraphStore, opts: GraphQueryOptions<TEntity>): EntityId[] {\n if (opts.id) return [opts.id];\n if (opts.ids) return opts.ids;\n if (opts.listKey) return store.lists[opts.listKey]?.ids ?? [];\n return Object.keys(store.entities[opts.type] ?? {});\n}\n\nfunction projectRow(\n row: EntitySnapshot<Record<string, unknown>>,\n include: GraphIncludeMap | undefined,\n store: GraphStore,\n): ProjectedRow {\n if (!include) return row;\n\n const projected: ProjectedRow = { ...row };\n for (const [key, relation] of Object.entries(include)) {\n const related = resolveRelation(row, relation, store);\n projected[key] = related;\n }\n return projected;\n}\n\nfunction resolveRelation(\n entity: Record<string, unknown>,\n relation: GraphIncludeRelation,\n store: GraphStore,\n): ProjectedRow | ProjectedRow[] | null {\n const include = relation.include;\n\n switch (relation.via.kind) {\n case \"field\": {\n const relatedId = entity[relation.via.field];\n if (typeof relatedId !== \"string\") return null;\n const related = store.readEntitySnapshot<Record<string, unknown>>(relation.type, relatedId);\n return related ? projectRow(related, include, store) : null;\n }\n case \"array\": {\n const ids = entity[relation.via.field];\n if (!Array.isArray(ids)) return [];\n return ids\n .map((id) => (typeof id === \"string\" ? store.readEntitySnapshot<Record<string, unknown>>(relation.type, id) : null))\n .filter((row): row is EntitySnapshot<Record<string, unknown>> => row !== null)\n .map((row) => projectRow(row, include, store));\n }\n case \"list\": {\n const key =\n typeof relation.via.key === \"function\"\n ? relation.via.key(entity)\n : relation.via.key;\n if (!key) return [];\n const ids = store.lists[key]?.ids ?? [];\n return ids\n .map((id) => store.readEntitySnapshot<Record<string, unknown>>(relation.type, id))\n .filter((row): row is EntitySnapshot<Record<string, unknown>> => row !== null)\n .map((row) => projectRow(row, include, store));\n }\n case \"resolver\": {\n const resolved = relation.via.resolve(entity, store);\n if (Array.isArray(resolved)) {\n return resolved\n .map((id) => store.readEntitySnapshot<Record<string, unknown>>(relation.type, id))\n .filter((row): row is EntitySnapshot<Record<string, unknown>> => row !== null)\n .map((row) => projectRow(row, include, store));\n }\n if (typeof resolved !== \"string\") return null;\n const related = store.readEntitySnapshot<Record<string, unknown>>(relation.type, resolved);\n return related ? projectRow(related, include, store) : null;\n }\n }\n}\n\nfunction applySelection(\n row: ProjectedRow,\n select: GraphQueryOptions<Record<string, unknown>>[\"select\"],\n): ProjectedRow {\n if (!select) return row;\n if (typeof select === \"function\") {\n const result = select(row as EntitySnapshot<Record<string, unknown>> & Record<string, unknown>);\n return (result && typeof result === \"object\" ? result : { value: result }) as ProjectedRow;\n }\n\n const picked: ProjectedRow = {};\n for (const key of select) {\n if (key in row) picked[key] = row[key];\n }\n return picked;\n}\n","import { graphStore } from \"./graph\";\nimport type { EntityId, EntitySyncMetadata, EntityType, GraphStore, QueryKey, SyncOrigin } from \"./graph\";\nimport { emitLegacyDevtoolsEvent } from \"./legacy-devtools\";\n\ndeclare const process: { env: { NODE_ENV?: string } } | undefined;\n\ninterface GraphDataSnapshot {\n entities: ReturnType<typeof graphStore.getState>[\"entities\"];\n patches: ReturnType<typeof graphStore.getState>[\"patches\"];\n entityStates: ReturnType<typeof graphStore.getState>[\"entityStates\"];\n syncMetadata: ReturnType<typeof graphStore.getState>[\"syncMetadata\"];\n lists: ReturnType<typeof graphStore.getState>[\"lists\"];\n}\n\nexport interface GraphTransaction {\n upsertEntity: (type: EntityType, id: EntityId, data: Record<string, unknown>) => GraphTransaction;\n replaceEntity: (type: EntityType, id: EntityId, data: Record<string, unknown>) => GraphTransaction;\n removeEntity: (type: EntityType, id: EntityId) => GraphTransaction;\n patchEntity: (type: EntityType, id: EntityId, patch: Record<string, unknown>) => GraphTransaction;\n clearPatch: (type: EntityType, id: EntityId) => GraphTransaction;\n insertIdInList: (key: QueryKey, id: EntityId, position: \"start\" | \"end\" | number) => GraphTransaction;\n removeIdFromAllLists: (type: EntityType, id: EntityId) => GraphTransaction;\n setEntitySyncMetadata: (type: EntityType, id: EntityId, metadata: Partial<EntitySyncMetadata>) => GraphTransaction;\n markEntityPending: (type: EntityType, id: EntityId, origin?: SyncOrigin) => GraphTransaction;\n markEntitySynced: (type: EntityType, id: EntityId, origin?: SyncOrigin) => GraphTransaction;\n commit: () => void;\n rollback: () => void;\n snapshot: () => GraphDataSnapshot;\n}\n\nexport interface GraphActionOptions<TInput, TResult> {\n key?: string;\n optimistic?: (tx: GraphTransaction, input: TInput) => void;\n run: (tx: GraphTransaction, input: TInput) => Promise<TResult> | TResult;\n onSuccess?: (result: TResult, input: TInput, tx: GraphTransaction) => void;\n onError?: (error: Error, input: TInput) => void;\n}\n\nexport interface GraphActionRecord {\n id: string;\n key: string;\n input: unknown;\n enqueuedAt: string;\n}\n\nexport type GraphActionEvent =\n | { type: \"enqueued\"; record: GraphActionRecord }\n | { type: \"settled\"; record: GraphActionRecord };\n\nconst graphActionListeners = new Set<(event: GraphActionEvent) => void>();\nconst graphActionReplayers = new Map<string, (record: GraphActionRecord, store: GraphStore) => Promise<unknown>>();\n\nexport function createGraphTransaction(storeApi: GraphStore = graphStore): GraphTransaction {\n const baseline = cloneGraphData(storeApi.getState());\n let closed = false;\n\n const tx: GraphTransaction = {\n upsertEntity(type, id, data) {\n storeApi.getState().upsertEntity(type, id, data);\n if (\n typeof process === \"undefined\" || process.env.NODE_ENV !== \"production\"\n ) {\n emitLegacyDevtoolsEvent({ kind: \"upsert\", type, id, data, at: new Date().toISOString() });\n }\n return tx;\n },\n replaceEntity(type, id, data) {\n storeApi.getState().replaceEntity(type, id, data);\n return tx;\n },\n removeEntity(type, id) {\n storeApi.getState().removeEntity(type, id);\n return tx;\n },\n patchEntity(type, id, patch) {\n storeApi.getState().patchEntity(type, id, patch);\n if (\n typeof process === \"undefined\" || process.env.NODE_ENV !== \"production\"\n ) {\n emitLegacyDevtoolsEvent({ kind: \"patch\", type, id, patch, at: new Date().toISOString() });\n }\n return tx;\n },\n clearPatch(type, id) {\n storeApi.getState().clearPatch(type, id);\n if (\n typeof process === \"undefined\" || process.env.NODE_ENV !== \"production\"\n ) {\n emitLegacyDevtoolsEvent({ kind: \"clearPatch\", type, id, at: new Date().toISOString() });\n }\n return tx;\n },\n insertIdInList(key, id, position) {\n storeApi.getState().insertIdInList(key, id, position);\n return tx;\n },\n removeIdFromAllLists(type, id) {\n storeApi.getState().removeIdFromAllLists(type, id);\n return tx;\n },\n setEntitySyncMetadata(type, id, metadata) {\n storeApi.getState().setEntitySyncMetadata(type, id, metadata);\n return tx;\n },\n markEntityPending(type, id, origin = \"optimistic\") {\n storeApi.getState().setEntitySyncMetadata(type, id, {\n synced: false,\n origin,\n updatedAt: Date.now(),\n });\n return tx;\n },\n markEntitySynced(type, id, origin = \"server\") {\n storeApi.getState().setEntitySyncMetadata(type, id, {\n synced: true,\n origin,\n updatedAt: Date.now(),\n });\n return tx;\n },\n commit() {\n closed = true;\n },\n rollback() {\n if (closed) return;\n storeApi.setState(cloneGraphData(baseline) as Partial<ReturnType<typeof graphStore.getState>>);\n closed = true;\n },\n snapshot() {\n return cloneGraphData(storeApi.getState());\n },\n };\n\n return tx;\n}\n\nexport function createGraphAction<TInput, TResult>(opts: GraphActionOptions<TInput, TResult>) {\n if (opts.key) {\n graphActionReplayers.set(opts.key, async (record, storeApi) => {\n const tx = createGraphTransaction(storeApi);\n try {\n const result = await opts.run(tx, record.input as TInput);\n tx.commit();\n return result;\n } catch (error) {\n tx.rollback();\n throw error;\n }\n });\n }\n\n return async (input: TInput): Promise<TResult> => {\n const tx = createGraphTransaction();\n const record = opts.key\n ? {\n id: `${opts.key}:${Date.now()}`,\n key: opts.key,\n input: structuredClone(input),\n enqueuedAt: new Date().toISOString(),\n }\n : null;\n\n try {\n if (record) emitGraphActionEvent({ type: \"enqueued\", record });\n opts.optimistic?.(tx, input);\n const result = await opts.run(tx, input);\n opts.onSuccess?.(result, input, tx);\n tx.commit();\n if (record) emitGraphActionEvent({ type: \"settled\", record });\n return result;\n } catch (error) {\n tx.rollback();\n const normalized = error instanceof Error ? error : new Error(String(error));\n if (record) emitGraphActionEvent({ type: \"settled\", record });\n opts.onError?.(normalized, input);\n throw normalized;\n }\n };\n}\n\nexport function subscribeGraphActionEvents(listener: (event: GraphActionEvent) => void) {\n graphActionListeners.add(listener);\n return () => graphActionListeners.delete(listener);\n}\n\nexport async function replayRegisteredGraphAction(record: GraphActionRecord, storeApi: GraphStore = graphStore) {\n const replayer = graphActionReplayers.get(record.key);\n if (!replayer) throw new Error(`No graph action registered for key \"${record.key}\"`);\n return replayer(record, storeApi);\n}\n\nfunction cloneGraphData(\n source: Pick<ReturnType<typeof graphStore.getState>, \"entities\" | \"patches\" | \"entityStates\" | \"syncMetadata\" | \"lists\"> = graphStore.getState(),\n): GraphDataSnapshot {\n return {\n entities: structuredClone(source.entities),\n patches: structuredClone(source.patches),\n entityStates: structuredClone(source.entityStates),\n syncMetadata: structuredClone(source.syncMetadata),\n lists: structuredClone(source.lists),\n };\n}\n\nfunction emitGraphActionEvent(event: GraphActionEvent) {\n for (const listener of graphActionListeners) listener(event);\n}\n","import { useGraphStore } from \"./graph\";\n\nexport interface GraphEffectEvent<T> {\n key: string;\n value: T;\n previousValue: T;\n}\n\nexport interface GraphEffectOptions<T> {\n query: () => T[] | T | null;\n getKey?: (value: T, index: number) => string;\n skipInitial?: boolean;\n isEqual?: (previousValue: T, nextValue: T) => boolean;\n onEnter?: (event: { key: string; value: T }) => void;\n onUpdate?: (event: GraphEffectEvent<T>) => void;\n onExit?: (event: { key: string; previousValue: T }) => void;\n}\n\nexport interface GraphEffectHandle {\n dispose: () => void;\n}\n\nexport function createGraphEffect<T>(opts: GraphEffectOptions<T>): GraphEffectHandle {\n const getKey = opts.getKey ?? defaultGetKey;\n const isEqual = opts.isEqual ?? defaultIsEqual;\n\n let initialized = false;\n let previous = new Map<string, T>();\n\n const evaluate = () => {\n const nextValues = normalizeQueryResult(opts.query());\n const next = new Map<string, T>();\n\n nextValues.forEach((value, index) => {\n next.set(getKey(value, index), value);\n });\n\n if (!initialized) {\n initialized = true;\n previous = next;\n if (opts.skipInitial) return;\n }\n\n for (const [key, value] of next.entries()) {\n const previousValue = previous.get(key);\n if (previousValue === undefined) {\n opts.onEnter?.({ key, value });\n continue;\n }\n if (!isEqual(previousValue, value)) {\n opts.onUpdate?.({ key, value, previousValue });\n }\n }\n\n for (const [key, previousValue] of previous.entries()) {\n if (!next.has(key)) opts.onExit?.({ key, previousValue });\n }\n\n previous = next;\n };\n\n evaluate();\n const unsubscribe = useGraphStore.subscribe(() => {\n evaluate();\n });\n\n return {\n dispose: () => {\n unsubscribe();\n },\n };\n}\n\nfunction normalizeQueryResult<T>(value: T[] | T | null): T[] {\n if (value == null) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction defaultGetKey<T>(value: T, index: number): string {\n if (value && typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n if (typeof record.id === \"string\") return record.id;\n if (typeof record.$key === \"string\") return record.$key;\n }\n return String(index);\n}\n\nfunction defaultIsEqual<T>(previousValue: T, nextValue: T): boolean {\n return JSON.stringify(previousValue) === JSON.stringify(nextValue);\n}\n","/**\n * schema.ts (core) — framework-agnostic JSON-schema registry + snapshot/markdown\n * helpers. The React field renderers/editors (MarkdownFieldRenderer,\n * MarkdownFieldEditor, useSchemaEntityFields, buildEntityFieldsFromSchema which\n * depends on the UI FieldDescriptor type) live in the react binding's schema.tsx,\n * built on these primitives.\n */\n\nexport interface JsonSchemaObject {\n $id?: string;\n title?: string;\n description?: string;\n type?: string | string[];\n format?: string;\n enum?: readonly unknown[];\n default?: unknown;\n properties?: Record<string, JsonSchemaObject>;\n items?: JsonSchemaObject;\n required?: string[];\n additionalProperties?: boolean | JsonSchemaObject;\n [\"x-a2ui-component\"]?: string;\n [\"x-display-order\"]?: number;\n [\"x-field-type\"]?: string;\n [\"x-hidden\"]?: boolean;\n}\n\nexport interface EntityJsonSchemaConfig {\n entityType: string;\n schemaId?: string;\n field?: string;\n version?: string;\n source?: \"static\" | \"runtime\" | \"ai\";\n schema: JsonSchemaObject;\n}\n\nexport interface GetEntityJsonSchemaOptions {\n entityType: string;\n schemaId?: string;\n field?: string;\n}\n\nexport interface GraphSnapshotWithSchemasOptions {\n scope: string;\n data: unknown;\n schemas: Array<EntityJsonSchemaConfig | null | undefined>;\n pretty?: boolean;\n}\n\nconst schemaRegistry = new Map<string, EntityJsonSchemaConfig>();\n\nexport function registerEntityJsonSchema(config: EntityJsonSchemaConfig) {\n schemaRegistry.set(registryKey(config.entityType, config.field, config.schemaId), config);\n}\n\nexport function registerRuntimeSchema(config: EntityJsonSchemaConfig) {\n registerEntityJsonSchema(config);\n}\n\nexport function getEntityJsonSchema(opts: GetEntityJsonSchemaOptions): EntityJsonSchemaConfig | null {\n const exact = schemaRegistry.get(registryKey(opts.entityType, opts.field, opts.schemaId));\n if (exact) return exact;\n if (opts.field) {\n const byField = schemaRegistry.get(registryKey(opts.entityType, opts.field));\n if (byField) return byField;\n }\n if (opts.schemaId) {\n const byId = schemaRegistry.get(registryKey(opts.entityType, undefined, opts.schemaId));\n if (byId) return byId;\n }\n for (const schema of schemaRegistry.values()) {\n if (schema.entityType !== opts.entityType) continue;\n if (opts.field && schema.field !== opts.field) continue;\n return schema;\n }\n return null;\n}\n\nexport function exportGraphSnapshotWithSchemas(opts: GraphSnapshotWithSchemasOptions): string {\n return JSON.stringify(\n {\n scope: opts.scope,\n generatedAt: new Date().toISOString(),\n data: opts.data,\n schemas: opts.schemas.filter(Boolean),\n },\n null,\n opts.pretty === false ? 0 : 2,\n );\n}\n\nexport function escapeHtml(input: string): string {\n return input\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n}\n\nexport function renderMarkdownToHtml(value: string): string {\n const escaped = escapeHtml(value);\n const blocks = escaped.split(/\\n{2,}/).map((b) => b.trim()).filter(Boolean);\n return blocks.map((block) => renderMarkdownBlock(block)).join(\"\");\n}\n\n/** Infer a coarse field-type string from a JSON-schema node (UI-agnostic). */\nexport function inferSchemaFieldType(schema: JsonSchemaObject): string {\n const forced = schema[\"x-field-type\"];\n if (forced === \"markdown\") return \"markdown\";\n if (schema.format === \"markdown\") return \"markdown\";\n if (schema.enum) return \"enum\";\n const type = Array.isArray(schema.type) ? schema.type[0] : schema.type;\n switch (type) {\n case \"boolean\": return \"boolean\";\n case \"integer\":\n case \"number\": return \"number\";\n case \"string\":\n if (schema.format === \"email\") return \"email\";\n if (schema.format === \"uri\" || schema.format === \"url\") return \"url\";\n if (schema.format === \"date\" || schema.format === \"date-time\") return \"date\";\n return \"text\";\n case \"array\":\n case \"object\": return \"json\";\n default: return \"text\";\n }\n}\n\nexport function registryKey(entityType: string, field?: string, schemaId?: string) {\n return `${entityType}::${field ?? \"*\"}::${schemaId ?? \"*\"}`;\n}\n\nexport function humanizeFieldName(value: string) {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[_-]+/g, \" \")\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nfunction renderMarkdownBlock(block: string): string {\n if (block.startsWith(\"# \")) return `<h1>${renderInlineMarkdown(block.slice(2))}</h1>`;\n if (block.startsWith(\"## \")) return `<h2>${renderInlineMarkdown(block.slice(3))}</h2>`;\n return `<p>${renderInlineMarkdown(block).replaceAll(\"\\n\", \"<br/>\")}</p>`;\n}\n\nfunction renderInlineMarkdown(block: string): string {\n return block.replace(/\\*\\*(.+?)\\*\\*/g, \"<strong>$1</strong>\");\n}\n","import { useGraphStore } from \"./graph\";\nimport { queryOnce } from \"./graph-query\";\nimport { exportGraphSnapshotWithSchemas, getEntityJsonSchema } from \"./schema\";\n\nexport interface GraphSnapshotExportOptions {\n scope: string;\n data: unknown;\n pretty?: boolean;\n}\n\nexport interface GraphToolContext {\n store: ReturnType<typeof useGraphStore.getState>;\n queryOnce: typeof queryOnce;\n exportGraphSnapshot: typeof exportGraphSnapshot;\n}\n\nexport interface SchemaGraphToolContext extends GraphToolContext {\n getEntityJsonSchema: typeof getEntityJsonSchema;\n exportGraphSnapshotWithSchemas: typeof exportGraphSnapshotWithSchemas;\n}\n\nexport function exportGraphSnapshot(opts: GraphSnapshotExportOptions): string {\n const payload = {\n scope: opts.scope,\n generatedAt: new Date().toISOString(),\n data: opts.data,\n };\n return JSON.stringify(payload, null, opts.pretty === false ? 0 : 2);\n}\n\nexport function createGraphTool<TInput, TResult>(\n handler: (input: TInput, ctx: GraphToolContext) => Promise<TResult> | TResult,\n) {\n return (input: TInput) =>\n handler(input, {\n store: useGraphStore.getState(),\n queryOnce,\n exportGraphSnapshot,\n });\n}\n\nexport function createSchemaGraphTool<TInput, TResult>(\n handler: (input: TInput, ctx: SchemaGraphToolContext) => Promise<TResult> | TResult,\n) {\n return (input: TInput) =>\n handler(input, {\n store: useGraphStore.getState(),\n queryOnce,\n exportGraphSnapshot,\n getEntityJsonSchema,\n exportGraphSnapshotWithSchemas,\n });\n}\n","import { createStore } from \"zustand/vanilla\";\nimport { graphStore, type GraphStore } from \"./graph\";\nimport { replayRegisteredGraphAction, subscribeGraphActionEvents } from \"./graph-actions\";\n\nexport interface GraphPersistenceAdapter {\n get: (key: string) => Promise<string | null> | string | null;\n set: (key: string, value: string) => Promise<void> | void;\n remove?: (key: string) => Promise<void> | void;\n}\n\nexport interface GraphActionRecord {\n id: string;\n key: string;\n input: unknown;\n enqueuedAt: string;\n}\n\nexport interface GraphSyncStatus {\n phase: \"idle\" | \"hydrating\" | \"syncing\" | \"ready\" | \"offline\" | \"error\";\n isOnline: boolean;\n isSynced: boolean;\n pendingActions: number;\n lastHydratedAt: string | null;\n lastPersistedAt: string | null;\n storageKey: string | null;\n error: string | null;\n}\n\nexport interface GraphSnapshotPayload {\n version: 1;\n snapshot: {\n entities: ReturnType<typeof graphStore.getState>[\"entities\"];\n patches: ReturnType<typeof graphStore.getState>[\"patches\"];\n entityStates: ReturnType<typeof graphStore.getState>[\"entityStates\"];\n syncMetadata: ReturnType<typeof graphStore.getState>[\"syncMetadata\"];\n lists: ReturnType<typeof graphStore.getState>[\"lists\"];\n };\n pendingActions: GraphActionRecord[];\n}\n\nexport interface PersistGraphToStorageOptions {\n storage: GraphPersistenceAdapter;\n key: string;\n store?: GraphStore;\n pendingActions?: GraphActionRecord[];\n}\n\nexport interface HydrateGraphFromStorageOptions {\n storage: GraphPersistenceAdapter;\n key: string;\n store?: GraphStore;\n}\n\n/**\n * Retry-with-backoff policy for replaying pending offline actions.\n *\n * The replay loop tracks per-action attempt counts. After `maxAttempts`\n * failed attempts the action is considered \"poisoned\" — it is removed from\n * the in-memory pending queue (so it won't block other actions) and the\n * optional `poisonHandler` is invoked. Consumers typically log the action,\n * surface a UI prompt, or persist it to a dead-letter store.\n *\n * Defaults: 5 attempts, starting at 500ms, doubling up to 30s, with\n * \"equal\" jitter (random in `[delay/2, delay]`).\n */\nexport interface ReplayRetryPolicy {\n maxAttempts?: number;\n initialDelayMs?: number;\n maxDelayMs?: number;\n backoffFactor?: number;\n jitter?: \"full\" | \"equal\" | \"none\";\n poisonHandler?: (action: GraphActionRecord, error: unknown) => void | Promise<void>;\n}\n\nexport interface StartLocalFirstGraphOptions {\n storage: GraphPersistenceAdapter;\n store?: GraphStore;\n key?: string;\n replayPendingActions?: boolean;\n onlineSource?: {\n getIsOnline: () => boolean;\n subscribe: (listener: (online: boolean) => void) => () => void;\n };\n persistDebounceMs?: number;\n /** Retry-with-backoff policy for offline action replay. */\n retryPolicy?: ReplayRetryPolicy;\n}\n\nexport interface LocalFirstGraphRuntime {\n ready: Promise<void>;\n dispose: () => void;\n persistNow: () => Promise<void>;\n hydrate: () => Promise<Awaited<ReturnType<typeof hydrateGraphFromStorage>>>;\n getStatus: () => GraphSyncStatus;\n}\n\nconst DEFAULT_STORAGE_KEY = \"prometheus:graph\";\n\nexport const graphSyncStatusStore = createStore<{ status: GraphSyncStatus; setStatus: (status: Partial<GraphSyncStatus>) => void }>()((set) => ({\n status: {\n phase: \"idle\",\n isOnline: true,\n isSynced: true,\n pendingActions: 0,\n lastHydratedAt: null,\n lastPersistedAt: null,\n storageKey: null,\n error: null,\n },\n setStatus: (status) =>\n set((state) => ({\n status: {\n ...state.status,\n ...status,\n },\n })),\n}));\n\nconst pendingActions = new Map<string, GraphActionRecord>();\n\nexport function getGraphSyncStatus() {\n return graphSyncStatusStore.getState().status;\n}\n\nexport async function persistGraphToStorage(opts: PersistGraphToStorageOptions) {\n const storeApi = opts.store ?? graphStore;\n const payload: GraphSnapshotPayload = {\n version: 1,\n snapshot: cloneGraphSnapshot(storeApi),\n pendingActions: opts.pendingActions ?? Array.from(pendingActions.values()),\n };\n const json = JSON.stringify(payload);\n await opts.storage.set(opts.key, json);\n const persistedAt = new Date().toISOString();\n graphSyncStatusStore.getState().setStatus({\n lastPersistedAt: persistedAt,\n storageKey: opts.key,\n pendingActions: payload.pendingActions.length,\n });\n return {\n ok: true as const,\n key: opts.key,\n bytes: json.length,\n persistedAt,\n };\n}\n\nexport async function hydrateGraphFromStorage(opts: HydrateGraphFromStorageOptions) {\n const storeApi = opts.store ?? graphStore;\n const raw = await opts.storage.get(opts.key);\n if (!raw) {\n return {\n ok: false as const,\n key: opts.key,\n hydratedAt: null,\n entityCounts: {},\n error: \"No persisted graph snapshot found\",\n };\n }\n\n try {\n const parsed = JSON.parse(raw) as GraphSnapshotPayload;\n storeApi.setState(parsed.snapshot as Partial<ReturnType<typeof graphStore.getState>>);\n pendingActions.clear();\n for (const action of parsed.pendingActions ?? []) pendingActions.set(action.id, action);\n const hydratedAt = new Date().toISOString();\n graphSyncStatusStore.getState().setStatus({\n lastHydratedAt: hydratedAt,\n storageKey: opts.key,\n pendingActions: pendingActions.size,\n error: null,\n });\n return {\n ok: true as const,\n key: opts.key,\n hydratedAt,\n entityCounts: Object.fromEntries(\n Object.entries(parsed.snapshot.entities).map(([type, entities]) => [type, Object.keys(entities).length]),\n ),\n pendingActions: Array.from(pendingActions.values()),\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n graphSyncStatusStore.getState().setStatus({\n phase: \"error\",\n error: message,\n storageKey: opts.key,\n });\n return {\n ok: false as const,\n key: opts.key,\n hydratedAt: null,\n entityCounts: {},\n error: message,\n };\n }\n}\n\nexport function startLocalFirstGraph(opts: StartLocalFirstGraphOptions): LocalFirstGraphRuntime {\n const storeApi = opts.store ?? graphStore;\n const key = opts.key ?? DEFAULT_STORAGE_KEY;\n const persistDebounceMs = opts.persistDebounceMs ?? 50;\n const statusStore = graphSyncStatusStore.getState();\n statusStore.setStatus({\n phase: \"hydrating\",\n storageKey: key,\n isOnline: opts.onlineSource?.getIsOnline() ?? getDefaultOnlineSource().getIsOnline(),\n isSynced: pendingActions.size === 0,\n error: null,\n });\n\n let persistTimer: ReturnType<typeof setTimeout> | null = null;\n const schedulePersist = () => {\n if (persistTimer) clearTimeout(persistTimer);\n persistTimer = setTimeout(() => {\n void persistGraphToStorage({ storage: opts.storage, key, store: storeApi });\n }, persistDebounceMs);\n };\n\n const graphUnsub = storeApi.subscribe(() => {\n schedulePersist();\n });\n\n const actionUnsub = subscribeGraphActionEvents((event) => {\n if (event.type === \"enqueued\") pendingActions.set(event.record.id, event.record);\n if (event.type === \"settled\") pendingActions.delete(event.record.id);\n graphSyncStatusStore.getState().setStatus({\n pendingActions: pendingActions.size,\n isSynced: pendingActions.size === 0,\n });\n schedulePersist();\n });\n\n const onlineSource = opts.onlineSource ?? getDefaultOnlineSource();\n const onlineUnsub = onlineSource.subscribe((online) => {\n graphSyncStatusStore.getState().setStatus({\n isOnline: online,\n phase: online ? \"ready\" : \"offline\",\n });\n });\n\n const ready = (async () => {\n const hydrated = await hydrateGraphFromStorage({ storage: opts.storage, key, store: storeApi });\n if (opts.replayPendingActions && hydrated.ok && pendingActions.size > 0) {\n graphSyncStatusStore.getState().setStatus({\n phase: \"syncing\",\n isSynced: false,\n });\n const policy = resolveRetryPolicy(opts.retryPolicy);\n for (const action of Array.from(pendingActions.values())) {\n await replayActionWithRetry(action, policy, storeApi);\n // Whether it succeeded or was poisoned, remove from pending — the\n // poison handler (if any) owns escalation from here.\n pendingActions.delete(action.id);\n }\n await persistGraphToStorage({ storage: opts.storage, key, store: storeApi });\n }\n\n const online = onlineSource.getIsOnline();\n graphSyncStatusStore.getState().setStatus({\n phase: online ? \"ready\" : \"offline\",\n isOnline: online,\n isSynced: pendingActions.size === 0,\n pendingActions: pendingActions.size,\n });\n })();\n\n return {\n ready,\n dispose() {\n graphUnsub();\n actionUnsub();\n onlineUnsub();\n if (persistTimer) clearTimeout(persistTimer);\n },\n async persistNow() {\n await persistGraphToStorage({ storage: opts.storage, key, store: storeApi });\n },\n hydrate() {\n return hydrateGraphFromStorage({ storage: opts.storage, key, store: storeApi });\n },\n getStatus() {\n return graphSyncStatusStore.getState().status;\n },\n };\n}\n\nfunction cloneGraphSnapshot(storeApi: GraphStore) {\n const state = storeApi.getState();\n return {\n entities: structuredClone(state.entities),\n patches: structuredClone(state.patches),\n entityStates: structuredClone(state.entityStates),\n syncMetadata: structuredClone(state.syncMetadata),\n lists: structuredClone(state.lists),\n };\n}\n\ninterface ResolvedRetryPolicy {\n maxAttempts: number;\n initialDelayMs: number;\n maxDelayMs: number;\n backoffFactor: number;\n jitter: \"full\" | \"equal\" | \"none\";\n poisonHandler?: (action: GraphActionRecord, error: unknown) => void | Promise<void>;\n}\n\nfunction resolveRetryPolicy(policy?: ReplayRetryPolicy): ResolvedRetryPolicy {\n return {\n maxAttempts: policy?.maxAttempts ?? 5,\n initialDelayMs: policy?.initialDelayMs ?? 500,\n maxDelayMs: policy?.maxDelayMs ?? 30_000,\n backoffFactor: policy?.backoffFactor ?? 2,\n jitter: policy?.jitter ?? \"equal\",\n poisonHandler: policy?.poisonHandler,\n };\n}\n\nfunction computeDelay(policy: ResolvedRetryPolicy, attempt: number): number {\n const base = Math.min(\n policy.initialDelayMs * Math.pow(policy.backoffFactor, Math.max(0, attempt - 1)),\n policy.maxDelayMs,\n );\n switch (policy.jitter) {\n case \"none\":\n return base;\n case \"full\":\n return Math.random() * base;\n case \"equal\":\n default:\n return base / 2 + Math.random() * (base / 2);\n }\n}\n\n/** Internal — sleep helper that respects test environments. */\nfunction sleep(ms: number): Promise<void> {\n if (ms <= 0) return Promise.resolve();\n return new Promise((r) => setTimeout(r, ms));\n}\n\n/**\n * Attempt to replay an action up to `maxAttempts` times. On exhaustion the\n * action goes to \"poison\" — the optional handler is invoked and the function\n * resolves. Exposed for unit testing.\n */\nexport async function replayActionWithRetry(\n action: GraphActionRecord,\n policy: ResolvedRetryPolicy,\n storeApi: GraphStore = graphStore,\n): Promise<{ ok: true } | { ok: false; poisoned: true; error: unknown }> {\n let lastError: unknown = null;\n for (let attempt = 1; attempt <= policy.maxAttempts; attempt++) {\n try {\n await replayRegisteredGraphAction(action, storeApi);\n return { ok: true };\n } catch (error) {\n lastError = error;\n if (attempt >= policy.maxAttempts) break;\n await sleep(computeDelay(policy, attempt));\n }\n }\n try {\n await policy.poisonHandler?.(action, lastError);\n } catch {\n /* swallow handler failures — they must not block the queue */\n }\n return { ok: false, poisoned: true, error: lastError };\n}\n\nfunction getDefaultOnlineSource() {\n if (typeof window !== \"undefined\" && typeof window.addEventListener === \"function\") {\n return {\n getIsOnline: () => window.navigator.onLine,\n subscribe: (listener: (online: boolean) => void) => {\n const onlineHandler = () => listener(true);\n const offlineHandler = () => listener(false);\n window.addEventListener(\"online\", onlineHandler);\n window.addEventListener(\"offline\", offlineHandler);\n return () => {\n window.removeEventListener(\"online\", onlineHandler);\n window.removeEventListener(\"offline\", offlineHandler);\n };\n },\n };\n }\n\n return {\n getIsOnline: () => true,\n subscribe: () => () => {},\n };\n}\n","/**\n * devtools-event-bus — W5 (seim-em-explorer-event-bus-registry)\n *\n * Ring-buffered, fan-out event bus on top of the W3 `subscribeDevtoolsEvent` tap.\n * Adds: replay-on-subscribe, microtask-level burst coalescing, multi-store registry.\n */\n\nimport { subscribeDevtoolsEvent, type DevtoolsEvent } from \"./engine\";\n\n// ── Public types ───────────────────────────────────────────────────────────────\n\nexport interface DevtoolsEventBusOptions {\n /** Maximum events retained in the ring buffer. Default: 500. */\n bufferSize?: number;\n /**\n * Events 1..N (N = threshold) are dispatched individually as they arrive.\n * Events N+1.. accumulate until the end of the microtask, then are coalesced\n * into one synthetic `kind:\"list\"` summary event.\n * Default: 10. Set to 0 to disable coalescing entirely.\n */\n coalesceBurstThreshold?: number;\n}\n\nexport interface DevtoolsEventBus {\n /** Subscribe to live events. Replays current buffer synchronously before returning. */\n subscribe(cb: (event: DevtoolsEvent) => void): () => void;\n /** Snapshot of buffered events in chronological order (oldest first). */\n getBuffer(): readonly DevtoolsEvent[];\n /** Force-dispatch any pending coalesced burst synchronously. */\n flush(): void;\n /** Release engine-tap, clear all subscribers, cascade inactive to registry. */\n destroy(): void;\n /**\n * Inject a synthetic `DevtoolsEvent` directly into the bus, bypassing the\n * engine tap. Used by the Chrome MV3 extension panel to feed events arriving\n * over the port-messaging bridge into the local bus instance.\n */\n inject(event: DevtoolsEvent): void;\n}\n\n/** Matches the signature of `subscribeDevtoolsEvent` — used for external sources. */\nexport type DevtoolsSourceFn = (cb: (event: DevtoolsEvent) => void) => () => void;\n\nexport interface RegisteredStore {\n name: string;\n active: boolean;\n}\n\n// ── Module-level state ─────────────────────────────────────────────────────────\n\n/** Maps bus → its internal inject function (for registerStore routing). */\nconst _busInjectMap = new WeakMap<DevtoolsEventBus, (event: DevtoolsEvent) => void>();\n\ninterface RegistryEntry {\n name: string;\n active: boolean;\n bus: DevtoolsEventBus;\n unsubscribeSrc: () => void;\n}\nconst registries = new Map<DevtoolsEventBus, Map<string, RegistryEntry>>();\n\n/** Test-only helper: clears the devtools store registry between test runs. */\nexport function __resetStoreRegistry(): void {\n registries.clear();\n}\n\n// ── Factory ────────────────────────────────────────────────────────────────────\n\nexport function createDevtoolsEventBus(opts?: DevtoolsEventBusOptions): DevtoolsEventBus {\n const bufferSize = opts?.bufferSize ?? 500;\n const threshold = opts?.coalesceBurstThreshold ?? 10;\n\n // ── Ring buffer ──────────────────────────────────────────────────────────\n const buffer: DevtoolsEvent[] = bufferSize > 0 ? new Array<DevtoolsEvent>(bufferSize) : [];\n let head = 0;\n let count = 0;\n\n function writeToBuffer(event: DevtoolsEvent): void {\n if (bufferSize === 0) return;\n buffer[head] = event;\n head = (head + 1) % bufferSize;\n if (count < bufferSize) count++;\n }\n\n function getBuffer(): readonly DevtoolsEvent[] {\n if (count === 0) return [];\n if (count < bufferSize) return buffer.slice(0, count);\n return [...buffer.slice(head), ...buffer.slice(0, head)];\n }\n\n // ── Subscribers ──────────────────────────────────────────────────────────\n const subscribers = new Set<(event: DevtoolsEvent) => void>();\n\n function dispatchToSubscribers(event: DevtoolsEvent): void {\n const snap = [...subscribers];\n for (const cb of snap) {\n try { cb(event); } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\"[devtools-event-bus] subscriber threw:\", err);\n }\n }\n }\n\n function dispatchOne(event: DevtoolsEvent): void {\n writeToBuffer(event);\n dispatchToSubscribers(event);\n }\n\n // ── Burst coalescing ──────────────────────────────────────────────────────\n // Events 1..threshold arrive → dispatch immediately + track in pendingBurst.\n // Events threshold+1.. arrive → accumulate in pendingBurst, schedule microtask.\n // flush() → coalesce undispatched remainder into kind:\"list\", reset state.\n let pendingBurst: DevtoolsEvent[] = [];\n let dispatchedCount = 0; // how many from pendingBurst have already been dispatched\n let flushScheduled = false;\n let destroyed = false;\n\n function flush(): void {\n if (pendingBurst.length === 0) { flushScheduled = false; return; }\n const burst = pendingBurst;\n const alreadySent = dispatchedCount;\n pendingBurst = [];\n dispatchedCount = 0;\n flushScheduled = false;\n\n const remaining = burst.slice(alreadySent);\n if (remaining.length === 0) return;\n\n if (threshold === 0 || burst.length <= threshold) {\n // All fit within threshold — no coalescing needed\n for (const ev of remaining) dispatchOne(ev);\n } else {\n // Fill individual slots first (in case some below-threshold slots weren't sent)\n const individualSlots = Math.max(0, threshold - alreadySent);\n const toDispatchIndividually = remaining.slice(0, individualSlots);\n const toCoalesce = remaining.slice(individualSlots);\n for (const ev of toDispatchIndividually) dispatchOne(ev);\n if (toCoalesce.length > 0) {\n dispatchOne({\n kind: \"list\",\n key: \"burst-coalesce\",\n idCount: toCoalesce.length,\n at: new Date().toISOString(),\n });\n }\n }\n }\n\n function handleEngineEvent(event: DevtoolsEvent): void {\n if (destroyed) return;\n if (threshold === 0) { dispatchOne(event); return; }\n\n pendingBurst.push(event);\n\n if (pendingBurst.length <= threshold) {\n // Within individual-dispatch window\n dispatchOne(event);\n dispatchedCount++;\n } else {\n // Exceeded threshold — accumulate and schedule one microtask flush\n if (!flushScheduled) {\n flushScheduled = true;\n Promise.resolve().then(() => flush());\n }\n }\n }\n\n // ── Engine tap ────────────────────────────────────────────────────────────\n const unsubscribeEngine = subscribeDevtoolsEvent(handleEngineEvent);\n\n // ── Bus object ────────────────────────────────────────────────────────────\n const bus: DevtoolsEventBus = {\n subscribe(cb) {\n if (destroyed) return () => {};\n // Synchronous replay of buffer contents\n const snapshot = getBuffer();\n for (const ev of snapshot) {\n try { cb(ev); } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\"[devtools-event-bus] subscriber threw during replay:\", err);\n }\n }\n subscribers.add(cb);\n return () => { subscribers.delete(cb); };\n },\n\n getBuffer,\n flush,\n\n inject(event: DevtoolsEvent): void {\n handleEngineEvent(event);\n },\n\n destroy() {\n if (destroyed) return;\n destroyed = true;\n unsubscribeEngine();\n subscribers.clear();\n pendingBurst = [];\n dispatchedCount = 0;\n flushScheduled = false;\n // Cascade only to sources registered for this bus.\n const registry = registries.get(bus);\n if (registry) {\n for (const entry of registry.values()) {\n if (!entry.active) continue;\n entry.active = false;\n try { entry.unsubscribeSrc(); } catch { /* ignore */ }\n }\n }\n registries.delete(bus);\n _busInjectMap.delete(bus);\n },\n };\n\n // Register inject fn BEFORE returning so registerStore can find it\n _busInjectMap.set(bus, handleEngineEvent);\n\n return bus;\n}\n\n// ── Multi-store registry ──────────────────────────────────────────────────────\n\n/**\n * Wire an additional event source into an existing `DevtoolsEventBus`.\n * Events from `source` flow through the bus's ring buffer, coalescing, and fan-out.\n * Throws if `name` is already registered and active.\n */\nexport function registerStore(\n bus: DevtoolsEventBus,\n source: DevtoolsSourceFn,\n name: string,\n): () => void {\n let registry = registries.get(bus);\n if (!registry) {\n registry = new Map();\n registries.set(bus, registry);\n }\n if (registry.get(name)?.active === true) {\n throw new Error(\n `[devtools-store-registry] Store name \"${name}\" is already registered and active`,\n );\n }\n\n const inject = _busInjectMap.get(bus);\n if (!inject) {\n throw new Error(\n `[devtools-store-registry] Bus is destroyed or was not created by createDevtoolsEventBus`,\n );\n }\n\n const unsubscribeSrc = source(inject);\n const entry: RegistryEntry = { name, active: true, bus, unsubscribeSrc };\n registry.set(name, entry);\n\n return () => {\n if (!entry.active) return;\n entry.active = false;\n unsubscribeSrc();\n };\n}\n\n/** Returns registered stores for one bus, or every bus for legacy callers. */\nexport function getRegisteredStores(bus?: DevtoolsEventBus): ReadonlyArray<RegisteredStore> {\n const entries = bus\n ? [...(registries.get(bus)?.values() ?? [])]\n : [...registries.values()].flatMap((registry) => [...registry.values()]);\n return entries.map((entry) => ({ name: entry.name, active: entry.active }));\n}\n","/**\n * Deprecated root time-travel compatibility facade.\n *\n * Snapshot data, cursors, retention, rewind state, and listeners are owned by\n * the optional per-store DevTools controller. This root module imports only a\n * lightweight delegate bridge, so normal package imports do not pull the\n * optional controller/protocol implementation into the root bundle.\n */\n\nimport {\n getGraphDevtoolsCompatibilityDelegate,\n resetGraphDevtoolsCompatibility,\n subscribeGraphDevtoolsCompatibility,\n} from \"./devtools-compatibility-bridge\";\nimport { graphStore, type GraphStore } from \"./graph\";\n\ntype GraphSlice = Pick<\n ReturnType<typeof graphStore.getState>,\n \"entities\" | \"patches\" | \"entityStates\" | \"syncMetadata\" | \"lists\"\n>;\n\nexport interface TimeTravelSnapshot {\n /** Monotonic controller cursor for the captured state. */\n seq: number;\n /** Capture timestamp (ms). */\n at: number;\n /** Optional compatibility label. */\n label?: string;\n /** Snapshot payloads are controller-private and no longer exposed at root. */\n data: GraphSlice;\n}\n\nexport interface TimeTravelState {\n snapshots: ReadonlyArray<Omit<TimeTravelSnapshot, \"data\">>;\n /** Compatibility ring index currently restored, or null when live. */\n cursor: number | null;\n capacity: number;\n}\n\n/** @deprecated Attach `@prometheus-ags/entity-graph-core/devtools` and configure its controller. */\nexport function configureTimeTravel(\n opts: { capacity?: number },\n storeApi: GraphStore = graphStore,\n): void {\n if (opts.capacity && opts.capacity > 0) {\n getGraphDevtoolsCompatibilityDelegate(storeApi)?.configure(opts.capacity);\n }\n}\n\n/**\n * @deprecated Use the attached controller's automatic snapshot history.\n * Returns `-1` when the optional controller is not attached to `storeApi`.\n */\nexport function recordGraphSnapshot(label?: string, storeApi: GraphStore = graphStore): number {\n return getGraphDevtoolsCompatibilityDelegate(storeApi)?.capture(label) ?? -1;\n}\n\n/** @deprecated Use `controller.rewind(cursor)` from the explicit `./devtools` entry. */\nexport function restoreGraphSnapshot(index: number, storeApi: GraphStore = graphStore): boolean {\n return getGraphDevtoolsCompatibilityDelegate(storeApi)?.restoreByIndex(index) ?? false;\n}\n\n/** @deprecated Use `controller.rewind(cursor)` from the explicit `./devtools` entry. */\nexport function restoreGraphSnapshotBySeq(seq: number, storeApi: GraphStore = graphStore): boolean {\n return getGraphDevtoolsCompatibilityDelegate(storeApi)?.restoreByCursor(seq) ?? false;\n}\n\n/** @deprecated Resolve retained cursors through the explicit per-store controller. */\nexport function stepTimeTravel(delta: number, storeApi: GraphStore = graphStore): boolean {\n return getGraphDevtoolsCompatibilityDelegate(storeApi)?.step(delta) ?? false;\n}\n\n/** @deprecated Use `controller.getSnapshotHistoryStatus()` and controller events. */\nexport function getTimeTravelState(storeApi: GraphStore = graphStore): TimeTravelState {\n return getGraphDevtoolsCompatibilityDelegate(storeApi)?.getState() ?? {\n snapshots: [],\n cursor: null,\n capacity: 50,\n };\n}\n\n/** @deprecated Subscribe to the explicit per-store controller. */\nexport function subscribeTimeTravel(\n cb: () => void,\n storeApi: GraphStore = graphStore,\n): () => void {\n return subscribeGraphDevtoolsCompatibility(storeApi, cb);\n}\n\n/** @internal Test-only bridge reset. It owns no snapshot data. */\nexport function __resetTimeTravel(storeApi?: GraphStore): void {\n const target = storeApi ?? graphStore;\n resetGraphDevtoolsCompatibility(target);\n}\n","/**\n * view/incremental.ts — G3 parity: incremental view maintenance.\n *\n * The baseline `applyView` re-filters + re-sorts the entire id list on every\n * change — O(n) per update. For large lists this is the gap vs TanStack DB's\n * differential-dataflow live queries.\n *\n * This maintains a derived, sorted result and updates it for a SINGLE entity\n * change in O(log n): binary-search the entity's current position, decide\n * membership via the filter, and insert / remove / reposition. No full\n * re-derivation. Result is byte-identical to `applyView` for the same inputs\n * (correctness parity is asserted in tests).\n *\n * Design choice: a hand-rolled dirty-tracking index rather than adopting d2ts\n * (0.1.x, pre-production) — same acceptance bar (sub-linear single-row update),\n * far lower dependency risk. The differential engine can replace the internals\n * later behind this same class without an API change.\n */\n\nimport type { FilterSpec, SortSpec } from \"./types\";\nimport { matchesFilter, matchesSearch, compareEntities } from \"./evaluator\";\n\nexport interface IncrementalViewOptions {\n filter?: FilterSpec | null;\n sort?: SortSpec | null;\n search?: { query: string; fields: string[] } | null;\n /** Resolve an entity by id from the graph (or null if absent). */\n getEntity: (id: string) => Record<string, unknown> | null;\n}\n\n/**\n * A live, sorted view over a set of entity ids that updates incrementally.\n *\n * - `seed(ids)` builds the initial result (one O(n log n) pass).\n * - `applyChange(id)` updates the result for one changed/added/removed entity\n * in O(log n) comparisons (+ array splice).\n * - `result()` returns the current ordered id list (stable reference until a\n * change mutates it).\n */\nexport class IncrementalView {\n private readonly opts: IncrementalViewOptions;\n private ids: string[] = [];\n private readonly members = new Set<string>();\n\n constructor(opts: IncrementalViewOptions) {\n this.opts = opts;\n }\n\n /** Whether an entity qualifies for this view (filter + search). */\n private qualifies(entity: Record<string, unknown> | null): entity is Record<string, unknown> {\n if (!entity) return false;\n if (this.opts.filter && !matchesFilter(entity, this.opts.filter)) return false;\n if (this.opts.search?.query && !matchesSearch(entity, this.opts.search.query, this.opts.search.fields)) return false;\n return true;\n }\n\n /** Comparator over ids using the configured sort (stable, id tiebreak). */\n private cmp(aId: string, bId: string): number {\n const a = this.opts.getEntity(aId);\n const b = this.opts.getEntity(bId);\n if (!a || !b) return 0;\n if (this.opts.sort && this.opts.sort.length > 0) {\n const r = compareEntities(a, b, this.opts.sort);\n if (r !== 0) return r;\n }\n // Deterministic tiebreak so equal-key rows keep a stable, reproducible order.\n return aId < bId ? -1 : aId > bId ? 1 : 0;\n }\n\n /** Binary-search the insertion index for `id` among current `ids`. */\n private insertionIndex(id: string): number {\n let lo = 0;\n let hi = this.ids.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (this.cmp(this.ids[mid], id) < 0) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n /** Build the initial sorted result from a full id set. */\n seed(ids: string[]): void {\n const kept: string[] = [];\n this.members.clear();\n for (const id of ids) {\n if (this.qualifies(this.opts.getEntity(id))) {\n kept.push(id);\n this.members.add(id);\n }\n }\n if (this.opts.sort && this.opts.sort.length > 0) {\n kept.sort((a, b) => this.cmp(a, b));\n }\n this.ids = kept;\n }\n\n /**\n * Update the view for ONE entity that changed/was added/removed.\n * Returns true if the result order changed.\n *\n * O(log n) to locate; the array splice is O(n) memory-move but performs no\n * filter/sort over the whole set — the differentiator from full re-derivation.\n */\n applyChange(id: string): boolean {\n const entity = this.opts.getEntity(id);\n const wasMember = this.members.has(id);\n const isMember = this.qualifies(entity);\n\n if (!wasMember && !isMember) return false;\n\n if (wasMember && !isMember) {\n // Removed from the view.\n const idx = this.ids.indexOf(id);\n if (idx !== -1) this.ids.splice(idx, 1);\n this.members.delete(id);\n return true;\n }\n\n if (!wasMember && isMember) {\n // Newly qualifies — insert at sorted position.\n const idx = this.insertionIndex(id);\n this.ids.splice(idx, 0, id);\n this.members.add(id);\n return true;\n }\n\n // Still a member but its sort key may have changed — reposition if needed.\n const cur = this.ids.indexOf(id);\n if (cur !== -1) this.ids.splice(cur, 1);\n const idx = this.insertionIndex(id);\n this.ids.splice(idx, 0, id);\n return cur !== idx;\n }\n\n /** Current ordered id list. */\n result(): string[] {\n return this.ids;\n }\n\n /** Current member count. */\n size(): number {\n return this.ids.length;\n }\n}\n","/**\n * agent/json-patch.ts — Minimal RFC-6902 JSON Patch applier.\n *\n * AG-UI `STATE_DELTA` events carry RFC-6902 operations. Rather than take a hard\n * dependency on `fast-json-patch` (last released 2022) or require consumers to\n * have `@ag-ui/client`'s applier, this implements the standard's six operations\n * directly. It is small, dependency-free, and fully unit-tested.\n *\n * Immutability: every op returns a NEW document; the input is never mutated.\n *\n * Supported ops: add, replace, remove, move, copy, test.\n * Pointers follow RFC-6901 (`/a/b/0`), including the `-` array-append token and\n * `~1`/`~0` escapes for `/` and `~`.\n */\n\nexport interface JsonPatchOp {\n op: \"add\" | \"remove\" | \"replace\" | \"move\" | \"copy\" | \"test\";\n path: string;\n /** For add/replace/test. */\n value?: unknown;\n /** For move/copy. */\n from?: string;\n}\n\nfunction unescape(token: string): string {\n return token.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n}\n\n/** Parse an RFC-6901 pointer into its decoded segments (`\"\"` → `[]`). */\nfunction parsePointer(pointer: string): string[] {\n if (pointer === \"\") return [];\n if (pointer[0] !== \"/\") throw new Error(`Invalid JSON Pointer: \"${pointer}\"`);\n return pointer.slice(1).split(\"/\").map(unescape);\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction clone<T>(v: T): T {\n return structuredClone(v);\n}\n\nfunction getAt(doc: unknown, segs: string[]): unknown {\n let cur: unknown = doc;\n for (const s of segs) {\n if (Array.isArray(cur)) cur = cur[Number(s)];\n else if (isObject(cur)) cur = cur[s];\n else return undefined;\n }\n return cur;\n}\n\nfunction setAt(doc: unknown, segs: string[], value: unknown, mode: \"add\" | \"replace\"): unknown {\n if (segs.length === 0) return value;\n const root = clone(doc);\n let cur: unknown = root;\n for (let i = 0; i < segs.length - 1; i++) {\n const s = segs[i];\n const next = Array.isArray(cur) ? (cur as unknown[])[Number(s)] : isObject(cur) ? cur[s] : undefined;\n if (next === undefined || next === null) {\n const created: Record<string, unknown> = {};\n if (Array.isArray(cur)) (cur as unknown[])[Number(s)] = created;\n else if (isObject(cur)) cur[s] = created;\n cur = created;\n } else {\n cur = next;\n }\n }\n const last = segs[segs.length - 1];\n if (Array.isArray(cur)) {\n const idx = last === \"-\" ? cur.length : Number(last);\n if (mode === \"add\") cur.splice(idx, 0, value);\n else cur[idx] = value;\n } else if (isObject(cur)) {\n cur[last] = value;\n }\n return root;\n}\n\nfunction removeAt(doc: unknown, segs: string[]): unknown {\n if (segs.length === 0) return undefined;\n const root = clone(doc);\n let cur: unknown = root;\n for (let i = 0; i < segs.length - 1; i++) {\n const s = segs[i];\n cur = Array.isArray(cur) ? (cur as unknown[])[Number(s)] : isObject(cur) ? cur[s] : undefined;\n if (cur === undefined) return root;\n }\n const last = segs[segs.length - 1];\n if (Array.isArray(cur)) cur.splice(Number(last), 1);\n else if (isObject(cur)) delete cur[last];\n return root;\n}\n\n/**\n * Apply a sequence of RFC-6902 operations to `doc`, returning a new document.\n * A failing `test` op throws (per spec); structural ops are applied in order.\n */\nexport function applyJsonPatch<T = unknown>(doc: T, ops: readonly JsonPatchOp[]): T {\n let current: unknown = doc;\n for (const op of ops) {\n const segs = parsePointer(op.path);\n switch (op.op) {\n case \"add\":\n current = setAt(current, segs, op.value, \"add\");\n break;\n case \"replace\":\n current = setAt(current, segs, op.value, \"replace\");\n break;\n case \"remove\":\n current = removeAt(current, segs);\n break;\n case \"move\": {\n const fromSegs = parsePointer(op.from ?? \"\");\n const moved = getAt(current, fromSegs);\n current = removeAt(current, fromSegs);\n current = setAt(current, segs, moved, \"add\");\n break;\n }\n case \"copy\": {\n const fromSegs = parsePointer(op.from ?? \"\");\n const copied = clone(getAt(current, fromSegs));\n current = setAt(current, segs, copied, \"add\");\n break;\n }\n case \"test\": {\n const actual = getAt(current, segs);\n if (JSON.stringify(actual) !== JSON.stringify(op.value)) {\n throw new Error(`JSON Patch test failed at \"${op.path}\"`);\n }\n break;\n }\n default:\n throw new Error(`Unsupported JSON Patch op: ${(op as { op: string }).op}`);\n }\n }\n return current as T;\n}\n","/**\n * agent/ag-ui-bridge.ts — Ingest AG-UI agent state into the entity graph.\n *\n * The headline agentic capability (change C2): an agent emits AG-UI state, it\n * lands in the entity graph, and every view reading those entities updates.\n *\n * AG-UI (https://docs.ag-ui.com) streams two state events:\n * - STATE_SNAPSHOT — the complete agent state object\n * - STATE_DELTA — a partial update as an RFC-6902 JSON Patch\n *\n * Our `patchEntity`/`upsertEntity` already align with this model: STATE_DELTA's\n * JSON Patch maps onto the graph, and writes route through the C1 MergeStrategy\n * so agent edits resolve against concurrent realtime/local writes.\n *\n * Mapping: the agent's state tree is projected onto entities via an\n * {@link AgUiStateMapping}. Each entry says \"the object at this JSON-Pointer\n * prefix is an entity of `type`, keyed by `id` (a field of that object or a\n * constant)\". This keeps the bridge transport-agnostic — it does not depend on\n * `@ag-ui/client` and takes plain event objects, so `@ag-ui/*` stays an OPTIONAL\n * peer (use it for typed events on the consumer side if desired).\n */\n\nimport { useGraphStore } from \"../graph\";\nimport { applyJsonPatch, type JsonPatchOp } from \"./json-patch\";\n\n/** AG-UI STATE_SNAPSHOT event (minimal shape — no @ag-ui dependency). */\nexport interface AgUiStateSnapshotEvent {\n type?: \"STATE_SNAPSHOT\" | string;\n snapshot: Record<string, unknown>;\n}\n\n/** AG-UI STATE_DELTA event (minimal shape — RFC-6902 patch). */\nexport interface AgUiStateDeltaEvent {\n type?: \"STATE_DELTA\" | string;\n delta: JsonPatchOp[];\n}\n\n/** Maps one slice of agent state onto an entity type. */\nexport interface AgUiStateMapping {\n /** Entity type the mapped object(s) belong to. */\n entityType: string;\n /**\n * JSON-Pointer prefix into the agent state where this entity (or collection)\n * lives. `\"/order\"` → a single entity; `\"/orders\"` → a collection keyed by id.\n */\n pointer: string;\n /** Whether `pointer` addresses one object or a collection (array/record). */\n kind: \"single\" | \"collection\";\n /**\n * Field on each object that holds its entity id. For `single` you may instead\n * pass a constant id via `constantId`.\n */\n idField?: string;\n /** Constant id for `single` mappings whose object has no id field. */\n constantId?: string;\n /**\n * How to write: `upsert` (merge via MergeStrategy — default) or `replace`\n * (full overwrite). Snapshots typically replace; deltas typically upsert.\n */\n write?: \"upsert\" | \"replace\";\n}\n\nexport interface ApplyAgUiOptions {\n mappings: AgUiStateMapping[];\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction getAtPointer(state: unknown, pointer: string): unknown {\n if (pointer === \"\" || pointer === \"/\") return state;\n const segs = pointer.slice(1).split(\"/\").map((s) => s.replace(/~1/g, \"/\").replace(/~0/g, \"~\"));\n let cur: unknown = state;\n for (const s of segs) {\n if (Array.isArray(cur)) cur = cur[Number(s)];\n else if (isObject(cur)) cur = cur[s];\n else return undefined;\n }\n return cur;\n}\n\nfunction writeEntity(\n mapping: AgUiStateMapping,\n id: string,\n obj: Record<string, unknown>,\n): void {\n const store = useGraphStore.getState();\n if ((mapping.write ?? \"upsert\") === \"replace\") {\n store.replaceEntity(mapping.entityType, id, obj);\n } else {\n store.upsertEntity(mapping.entityType, id, obj);\n }\n}\n\nfunction projectState(state: Record<string, unknown>, mappings: AgUiStateMapping[]): void {\n for (const mapping of mappings) {\n const slice = getAtPointer(state, mapping.pointer);\n if (slice === undefined) continue;\n\n if (mapping.kind === \"single\") {\n if (!isObject(slice)) continue;\n const id = mapping.constantId ?? String(slice[mapping.idField ?? \"id\"] ?? \"\");\n if (!id) continue;\n writeEntity(mapping, id, slice);\n } else {\n // collection: array of objects, or record keyed by id\n const items: Array<[string, Record<string, unknown>]> = [];\n if (Array.isArray(slice)) {\n for (const item of slice) {\n if (isObject(item)) {\n const id = String(item[mapping.idField ?? \"id\"] ?? \"\");\n if (id) items.push([id, item]);\n }\n }\n } else if (isObject(slice)) {\n for (const [key, item] of Object.entries(slice)) {\n if (isObject(item)) {\n const id = String(item[mapping.idField ?? \"id\"] ?? key);\n items.push([id, item]);\n }\n }\n }\n for (const [id, obj] of items) writeEntity(mapping, id, obj);\n }\n }\n}\n\n/**\n * Apply an AG-UI STATE_SNAPSHOT to the graph. Each mapped slice is written as an\n * entity. Snapshots default to `replace` semantics when the mapping does not\n * specify otherwise is left to the mapping's `write` field (default upsert).\n *\n * @example\n * ```ts\n * applyAgUiSnapshot(event, { mappings: [\n * { entityType: \"Order\", pointer: \"/order\", kind: \"single\", write: \"replace\" },\n * { entityType: \"LineItem\", pointer: \"/order/items\", kind: \"collection\" },\n * ]});\n * ```\n */\nexport function applyAgUiSnapshot(\n event: AgUiStateSnapshotEvent,\n options: ApplyAgUiOptions,\n): void {\n if (!isObject(event.snapshot)) return;\n projectState(event.snapshot, options.mappings);\n}\n\n/**\n * Apply an AG-UI STATE_DELTA (RFC-6902 JSON Patch) to the graph.\n *\n * The delta is applied against a reconstructed agent-state view assembled from\n * the current graph entities (per the mappings), then the resulting slices are\n * re-projected back into the graph. This lets path-based deltas target nested\n * entity fields without the caller tracking the full agent state themselves.\n */\nexport function applyAgUiDelta(\n event: AgUiStateDeltaEvent,\n options: ApplyAgUiOptions,\n /** Current agent-state view; if omitted, reconstructed from the graph mappings. */\n currentState?: Record<string, unknown>,\n): void {\n const base = currentState ?? reconstructState(options.mappings);\n const next = applyJsonPatch(base, event.delta);\n if (isObject(next)) projectState(next, options.mappings);\n}\n\n/** Rebuild a minimal agent-state view from current graph entities (per mappings). */\nfunction reconstructState(mappings: AgUiStateMapping[]): Record<string, unknown> {\n const store = useGraphStore.getState();\n const state: Record<string, unknown> = {};\n for (const mapping of mappings) {\n const key = mapping.pointer.replace(/^\\//, \"\").split(\"/\")[0];\n if (!key) continue;\n const bucket = store.entities[mapping.entityType] ?? {};\n if (mapping.kind === \"single\") {\n const id = mapping.constantId;\n if (id && bucket[id]) state[key] = bucket[id];\n } else {\n state[key] = Object.values(bucket);\n }\n }\n return state;\n}\n","/**\n * adapters/realtime-manager.ts\n *\n * Routes all adapter ChangeSet events into the entity graph.\n * Coalesces rapid-fire updates within a 16ms flush window so that\n * e.g. 10 Supabase row updates for the same entity become one Zustand write.\n */\nimport { graphStore } from \"../graph\";\nimport type { GraphStore } from \"../graph\";\nimport type { RealtimeAdapter, ChangeSet, EntityChange, AdapterStatus, UnsubscribeFn, ChannelConfig } from \"./types\";\n\nexport interface ManagerOptions {\n flushInterval?: number;\n store?: GraphStore;\n onStatusChange?: (adapter: string, status: AdapterStatus) => void;\n onChangeReceived?: (adapter: string, change: EntityChange) => void;\n}\n\ninterface RegisteredAdapter { adapter: RealtimeAdapter; unsubscribes: UnsubscribeFn[]; }\n\nexport class RealtimeManager {\n private adapters = new Map<string, RegisteredAdapter>();\n private pendingChanges: EntityChange[] = [];\n private pendingListKeys = new Set<string>();\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private opts: Required<Omit<ManagerOptions, \"store\">>;\n private store: GraphStore;\n\n constructor(opts: ManagerOptions = {}) {\n this.store = opts.store ?? graphStore;\n this.opts = {\n flushInterval: opts.flushInterval ?? 16,\n onStatusChange: opts.onStatusChange ?? (() => {}),\n onChangeReceived: opts.onChangeReceived ?? (() => {}),\n };\n }\n\n register(adapter: RealtimeAdapter, channels: ChannelConfig[], normalize?: (raw: unknown) => EntityChange | null): UnsubscribeFn {\n const existing = this.adapters.get(adapter.name);\n const registered: RegisteredAdapter = existing ?? { adapter, unsubscribes: [] };\n if (!existing) this.adapters.set(adapter.name, registered);\n if (adapter.onStatusChange) {\n registered.unsubscribes.push(adapter.onStatusChange((s) => this.opts.onStatusChange(adapter.name, s)));\n }\n for (const channel of channels) {\n const unsub = adapter.subscribe(\n { label: `${adapter.name}/${channel.type}`, replayOnConnect: true },\n (cs) => this.handleChangeset(adapter.name, cs, normalize)\n );\n registered.unsubscribes.push(unsub);\n }\n return () => this.unregister(adapter.name);\n }\n\n unregister(name: string) {\n const r = this.adapters.get(name); if (!r) return;\n for (const u of r.unsubscribes) u();\n this.adapters.delete(name);\n }\n\n unregisterAll() { for (const n of this.adapters.keys()) this.unregister(n); }\n\n private handleChangeset(name: string, cs: ChangeSet, normalize?: (raw: unknown) => EntityChange | null) {\n for (const rawChange of cs.changes) {\n const change = normalize ? normalize(rawChange) : rawChange;\n if (!change) continue;\n this.opts.onChangeReceived(name, change);\n this.pendingChanges.push(change);\n }\n if (cs.affectedListKeys) for (const k of cs.affectedListKeys) this.pendingListKeys.add(k);\n this.scheduleFlush();\n }\n\n private scheduleFlush() {\n if (this.opts.flushInterval === 0) { this.flush(); return; }\n if (this.flushTimer !== null) return;\n this.flushTimer = setTimeout(() => { this.flushTimer = null; this.flush(); }, this.opts.flushInterval);\n }\n\n flush() {\n if (this.pendingChanges.length === 0 && this.pendingListKeys.size === 0) return;\n const changes = this.pendingChanges.splice(0);\n const listKeys = new Set(this.pendingListKeys); this.pendingListKeys.clear();\n const store = this.store.getState();\n for (const change of coalesceChanges(changes)) {\n switch (change.op) {\n case \"insert\": case \"upsert\":\n if (change.data) { store.upsertEntity(change.type, change.id, change.data); store.setEntityFetched(change.type, change.id); }\n break;\n case \"update\":\n if (change.patch) {\n if (store.entities[change.type]?.[change.id]) store.upsertEntity(change.type, change.id, change.patch as Record<string, unknown>);\n else store.invalidateEntity(change.type, change.id);\n } else if (change.data) { store.upsertEntity(change.type, change.id, change.data); store.setEntityFetched(change.type, change.id); }\n break;\n case \"delete\":\n store.removeEntity(change.type, change.id);\n store.removeIdFromAllLists(change.type, change.id);\n break;\n }\n }\n for (const key of listKeys) store.invalidateLists(key);\n }\n\n forceFlush() { if (this.flushTimer !== null) { clearTimeout(this.flushTimer); this.flushTimer = null; } this.flush(); }\n}\n\nfunction coalesceChanges(changes: EntityChange[]): EntityChange[] {\n const byKey = new Map<string, EntityChange>();\n for (const c of changes) {\n const key = `${c.type}:${c.id}`; const existing = byKey.get(key);\n if (!existing) { byKey.set(key, { ...c }); continue; }\n if (c.op === \"delete\") { byKey.set(key, c); continue; }\n if (existing.op === \"delete\") continue;\n if (existing.op === \"update\" && c.op === \"update\") {\n byKey.set(key, {\n ...existing,\n patch: { ...(existing.patch ?? {}), ...(c.patch ?? {}) },\n });\n continue;\n }\n byKey.set(key, { ...existing, op: \"upsert\", data: c.data ?? existing.data, patch: c.patch ? { ...(existing.patch ?? {}), ...c.patch } : existing.patch });\n }\n return Array.from(byKey.values());\n}\n\nlet _manager: RealtimeManager | null = null;\nexport function getRealtimeManager(opts?: ManagerOptions): RealtimeManager {\n if (!_manager) _manager = new RealtimeManager(opts);\n return _manager;\n}\nexport function resetRealtimeManager() { _manager?.unregisterAll(); _manager = null; }\n","/**\n * adapters/realtime-adapters.ts\n *\n * WebSocket, Supabase Realtime, Convex, and GraphQL subscription adapters.\n * All implement RealtimeAdapter and route through RealtimeManager → entity graph.\n */\nimport type {\n RealtimeAdapter,\n SubscriptionConfig,\n ChangeSet,\n EntityChange,\n ChangeOperation,\n AdapterStatus,\n UnsubscribeFn,\n ChannelConfig,\n} from \"./types\";\n\n// =============================================================================\n// WebSocket adapter\n// =============================================================================\n\nexport interface WebSocketAdapterOptions {\n url: string | (() => string);\n parseMessage?: (data: unknown) => EntityChange[] | null;\n protocols?: string | string[];\n reconnectBaseDelay?: number;\n maxReconnectAttempts?: number;\n pingInterval?: number;\n pingMessage?: string;\n}\n\nexport function createWebSocketAdapter(opts: WebSocketAdapterOptions): RealtimeAdapter {\n const {\n url,\n parseMessage,\n protocols,\n reconnectBaseDelay = 1_000,\n maxReconnectAttempts = Infinity,\n pingInterval = 30_000,\n pingMessage = '{\"type\":\"ping\"}',\n } = opts;\n\n const statusCbs = new Set<(s: AdapterStatus) => void>();\n const handlers = new Set<(cs: ChangeSet) => void>();\n let ws: WebSocket | null = null;\n let attempts = 0;\n let reconnTimer: ReturnType<typeof setTimeout> | null = null;\n let pingTimer: ReturnType<typeof setInterval> | null = null;\n let stopped = false;\n\n const emit = (s: AdapterStatus) => { for (const cb of statusCbs) cb(s); };\n\n function connect() {\n if (stopped) return;\n const u = typeof url === \"function\" ? url() : url;\n emit(\"connecting\");\n ws = new WebSocket(u, protocols);\n ws.onopen = () => {\n attempts = 0;\n emit(\"connected\");\n if (pingInterval > 0)\n pingTimer = setInterval(() => { if (ws?.readyState === 1) ws.send(pingMessage); }, pingInterval);\n };\n ws.onmessage = (ev) => {\n let parsed: unknown;\n try { parsed = JSON.parse(ev.data); } catch { return; }\n const changes = parseMessage ? parseMessage(parsed) : defaultParse(parsed);\n if (!changes?.length) return;\n for (const h of handlers) h({ changes, timestamp: new Date().toISOString() });\n };\n ws.onclose = () => {\n emit(\"disconnected\");\n clearInterval(pingTimer!);\n if (!stopped && attempts < maxReconnectAttempts)\n reconnTimer = setTimeout(connect, reconnectBaseDelay * Math.pow(2, Math.min(attempts++, 6)));\n };\n ws.onerror = () => { emit(\"error\"); ws?.close(); };\n }\n\n return {\n name: \"websocket\",\n subscribe(_cfg: SubscriptionConfig, handler: (cs: ChangeSet) => void): UnsubscribeFn {\n handlers.add(handler);\n if (!ws || ws.readyState === WebSocket.CLOSED) connect();\n return () => {\n handlers.delete(handler);\n if (handlers.size === 0) {\n stopped = true;\n clearTimeout(reconnTimer!);\n clearInterval(pingTimer!);\n ws?.close();\n ws = null;\n }\n };\n },\n onStatusChange: (cb) => { statusCbs.add(cb); return () => statusCbs.delete(cb); },\n };\n}\n\nfunction defaultParse(data: unknown): EntityChange[] | null {\n if (!data || typeof data !== \"object\") return null;\n const d = data as Record<string, unknown>;\n if (d.op && d.type && d.id) return [d as unknown as EntityChange];\n if (Array.isArray(d.changes)) return d.changes as EntityChange[];\n return null;\n}\n\n// =============================================================================\n// Supabase Realtime adapter\n// =============================================================================\n\n// Minimal surface types — no hard dep on @supabase/supabase-js\ninterface SupabaseClient { channel(name: string): SupabaseChannel; }\ninterface SupabaseChannel {\n on(\n event: \"postgres_changes\",\n config: { event: \"*\"|\"INSERT\"|\"UPDATE\"|\"DELETE\"; schema: string; table: string; filter?: string },\n handler: (payload: SupabasePayload) => void\n ): SupabaseChannel;\n subscribe(cb?: (status: string) => void): SupabaseChannel;\n unsubscribe(): Promise<void>;\n}\ninterface SupabasePayload {\n eventType: \"INSERT\" | \"UPDATE\" | \"DELETE\";\n new: Record<string, unknown>;\n old: Record<string, unknown>;\n table: string;\n}\n\nexport interface SupabaseAdapterOptions {\n tableTypeMap?: Record<string, string>;\n extractId?: (record: Record<string, unknown>) => string;\n schema?: string;\n}\n\nexport function createSupabaseRealtimeAdapter(\n client: SupabaseClient,\n opts: SupabaseAdapterOptions = {}\n): RealtimeAdapter & {\n subscribeChannel: (config: ChannelConfig & { _handler?: (cs: ChangeSet) => void }) => UnsubscribeFn;\n} {\n const {\n tableTypeMap = {},\n extractId = (r) => String(r.id),\n schema = \"public\",\n } = opts;\n const statusCbs = new Set<(s: AdapterStatus) => void>();\n\n function resolveType(table: string): string {\n return tableTypeMap[table] ?? (table.charAt(0).toUpperCase() + table.slice(1));\n }\n\n function payloadToChange(p: SupabasePayload): EntityChange | null {\n const type = resolveType(p.table);\n if (p.eventType === \"DELETE\") {\n const id = extractId(p.old);\n return id ? { op: \"delete\", type, id } : null;\n }\n const id = extractId(p.new);\n if (!id) return null;\n return { op: p.eventType === \"INSERT\" ? \"insert\" : \"upsert\", type, id, data: p.new };\n }\n\n return {\n name: \"supabase-realtime\",\n /**\n * Generic subscribe is a no-op for Supabase. Use `subscribeChannel()` instead,\n * which accepts a `ChannelConfig` with Supabase-specific table/filter parameters.\n */\n subscribe(_cfg: SubscriptionConfig, _handler: (cs: ChangeSet) => void): UnsubscribeFn {\n return () => {};\n },\n onStatusChange: (cb) => { statusCbs.add(cb); return () => statusCbs.delete(cb); },\n subscribeChannel(config) {\n const tableName =\n Object.entries(tableTypeMap).find(([, t]) => t === config.type)?.[0] ??\n config.type.toLowerCase();\n const filterStr = config.id\n ? `id=eq.${config.id}`\n : config.filter\n ? Object.entries(config.filter).map(([k, v]) => `${k}=eq.${v}`).join(\",\")\n : undefined;\n\n const channel = client\n .channel(`entity-store:${config.type}:${config.id ?? \"all\"}`)\n .on(\"postgres_changes\", { event: \"*\", schema, table: tableName, ...(filterStr ? { filter: filterStr } : {}) }, (payload) => {\n const change = payloadToChange(payload);\n if (!change) return;\n config._handler?.({ changes: [change], timestamp: new Date().toISOString() });\n })\n .subscribe((status) => {\n const s: AdapterStatus =\n status === \"SUBSCRIBED\" ? \"connected\" :\n status === \"CHANNEL_ERROR\" ? \"error\" :\n status === \"CLOSED\" ? \"disconnected\" : \"connecting\";\n for (const cb of statusCbs) cb(s);\n });\n\n return () => { channel.unsubscribe(); };\n },\n };\n}\n\n// =============================================================================\n// Convex adapter — snapshot-diff reactive queries → EntityChanges\n// =============================================================================\n\ninterface ConvexClient {\n onUpdate<T>(\n query: unknown,\n args: Record<string, unknown>,\n handler: (result: T) => void\n ): UnsubscribeFn;\n}\n\nexport interface ConvexChannelConfig<T extends object> {\n type: string;\n query: unknown;\n args?: Record<string, unknown>;\n extractId?: (record: T) => string;\n normalize?: (record: T) => Record<string, unknown>;\n}\n\nexport function createConvexAdapter<T extends object>(opts: {\n client: ConvexClient;\n channels: ConvexChannelConfig<T>[];\n}): RealtimeAdapter {\n const { client, channels } = opts;\n const statusCbs = new Set<(s: AdapterStatus) => void>();\n const snapshots = new Map<string, Map<string, T>>();\n\n function diffSnapshot(\n type: string,\n prev: Map<string, T>,\n next: T[],\n extractId: (r: T) => string,\n normalize?: (r: T) => Record<string, unknown>\n ): EntityChange[] {\n const changes: EntityChange[] = [];\n const nextIds = new Set<string>();\n\n for (const record of next) {\n const id = extractId(record);\n nextIds.add(id);\n const data = normalize ? normalize(record) : (record as unknown as Record<string, unknown>);\n changes.push({ op: prev.has(id) ? \"upsert\" : \"insert\", type, id, data });\n prev.set(id, record);\n }\n\n for (const [id] of prev) {\n if (!nextIds.has(id)) {\n changes.push({ op: \"delete\", type, id });\n prev.delete(id);\n }\n }\n\n return changes;\n }\n\n return {\n name: \"convex\",\n subscribe(_cfg: SubscriptionConfig, handler: (cs: ChangeSet) => void): UnsubscribeFn {\n const unsubs: UnsubscribeFn[] = [];\n\n for (const ch of channels) {\n const { type, query, args = {}, normalize } = ch;\n const extractId =\n ch.extractId ??\n ((r: T) =>\n String(\n (r as Record<string, unknown>)._id ??\n (r as Record<string, unknown>).id\n ));\n\n if (!snapshots.has(type)) snapshots.set(type, new Map());\n const snap = snapshots.get(type)!;\n\n unsubs.push(\n client.onUpdate(query, args, (records: T[]) => {\n const changes = diffSnapshot(type, snap, records, extractId, normalize);\n if (changes.length > 0)\n handler({ changes, timestamp: new Date().toISOString() });\n })\n );\n }\n\n for (const cb of statusCbs) cb(\"connected\");\n return () => {\n for (const u of unsubs) u();\n for (const cb of statusCbs) cb(\"disconnected\");\n };\n },\n onStatusChange: (cb) => { statusCbs.add(cb); return () => statusCbs.delete(cb); },\n };\n}\n\n// =============================================================================\n// GraphQL Subscription adapter — graphql-ws protocol\n// =============================================================================\n\ninterface GQLWsClient {\n subscribe<T>(\n payload: { query: string; variables?: Record<string, unknown> },\n sink: {\n next: (value: { data: T }) => void;\n error: (err: unknown) => void;\n complete: () => void;\n }\n ): UnsubscribeFn;\n}\n\nexport interface GQLSubscriptionConfig<T extends object> {\n type: string;\n document: string;\n variables?: Record<string, unknown>;\n getPayload: (\n data: T\n ) => GQLPayload | GQLPayload[] | null;\n}\n\ninterface GQLPayload {\n type?: string;\n node?: Record<string, unknown>;\n id?: string;\n}\n\nexport function createGraphQLSubscriptionAdapter<T extends object>(opts: {\n client: GQLWsClient;\n subscriptions: GQLSubscriptionConfig<T>[];\n extractId?: (node: Record<string, unknown>, type: string) => string;\n normalize?: (node: Record<string, unknown>, type: string) => Record<string, unknown>;\n}): RealtimeAdapter {\n const {\n client,\n subscriptions,\n extractId = (n) => String(n.id),\n normalize,\n } = opts;\n const statusCbs = new Set<(s: AdapterStatus) => void>();\n\n function payloadToChange(type: string, p: GQLPayload): EntityChange | null {\n const gqlType = p.type ?? \"updated\";\n\n if (gqlType === \"deleted\") {\n const id = p.id ?? (p.node ? extractId(p.node, type) : null);\n return id ? { op: \"delete\", type, id } : null;\n }\n\n if (!p.node) return null;\n const id = extractId(p.node, type);\n const data = normalize ? normalize(p.node, type) : stripTypename(p.node);\n const op: ChangeOperation = gqlType === \"created\" ? \"insert\" : \"upsert\";\n return { op, type, id, data };\n }\n\n return {\n name: \"graphql-subscription\",\n subscribe(_cfg: SubscriptionConfig, handler: (cs: ChangeSet) => void): UnsubscribeFn {\n const unsubs: UnsubscribeFn[] = [];\n\n for (const sub of subscriptions) {\n const { type, document, variables, getPayload } = sub;\n\n unsubs.push(\n client.subscribe<T>(\n { query: document, variables },\n {\n next: ({ data }) => {\n const raw = getPayload(data);\n if (!raw) return;\n const payloads = Array.isArray(raw) ? raw : [raw];\n const changes = payloads\n .map((p) => payloadToChange(type, p))\n .filter((c): c is EntityChange => c !== null);\n if (changes.length > 0)\n handler({ changes, timestamp: new Date().toISOString() });\n },\n error: (e) => {\n console.error(`[GQLSub] ${type}:`, e);\n for (const cb of statusCbs) cb(\"error\");\n },\n complete: () => {\n for (const cb of statusCbs) cb(\"disconnected\");\n },\n }\n )\n );\n }\n\n for (const cb of statusCbs) cb(\"connected\");\n return () => { for (const u of unsubs) u(); };\n },\n onStatusChange: (cb) => { statusCbs.add(cb); return () => statusCbs.delete(cb); },\n };\n}\n\nfunction stripTypename(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (k === \"__typename\") continue;\n result[k] =\n v && typeof v === \"object\" && !Array.isArray(v)\n ? stripTypename(v as Record<string, unknown>)\n : v;\n }\n return result;\n}\n","/**\n * adapters/surreal-live.ts\n *\n * SurrealDB LIVE SELECT realtime adapter.\n *\n * SurrealDB live stream → per-channel state machine → RealtimeAdapter contract\n * one ChannelConfig = one LIVE SELECT = one independent reconnect/replay state\n *\n * Implements the RealtimeAdapter contract (NOT SyncAdapter) per the corrected\n * spec at openspec/specs/entity-surreal-live-adapter/spec.md. The consumer\n * owns the SurrealDB client; the adapter only orchestrates live queries.\n */\n\nimport type {\n RealtimeAdapter,\n SubscriptionConfig,\n ChannelConfig,\n ChangeSet,\n EntityChange,\n ChangeOperation,\n AdapterStatus,\n UnsubscribeFn,\n} from \"./types\";\nimport type { EntityType, EntityId } from \"../graph\";\n\n// ---------------------------------------------------------------------------\n// Public surface — minimal-surface types (D1: no hard dep on `surrealdb`)\n// ---------------------------------------------------------------------------\n\nexport interface SurrealLike {\n query<T = unknown>(sql: string, vars?: Record<string, unknown>): Promise<T[]>;\n live<T = unknown>(\n table: string,\n callback: (action: SurrealLiveAction<T>) => void,\n diff?: boolean,\n ): Promise<string>;\n kill(uuid: string): Promise<void>;\n}\n\nexport interface SurrealLiveAction<T = unknown> {\n action: \"CREATE\" | \"UPDATE\" | \"DELETE\" | \"CLOSE\" | string;\n result: T;\n}\n\nexport interface SurrealCheckpointStore {\n get(channelKey: string): Promise<string | undefined>;\n set(channelKey: string, value: string): Promise<void>;\n}\n\nexport interface SurrealTableConfig {\n type: EntityType;\n /** SurrealDB table name; defaults to `type`. */\n table?: string;\n /** Field in the row that carries the entity id; defaults to \"id\". */\n idField?: string;\n}\n\nexport interface SurrealLiveAdapterOptions {\n name?: string;\n surreal: SurrealLike;\n tables: SurrealTableConfig[];\n initialQueryStrategy?: \"select-then-live\" | \"live-only\";\n initialDelayMs?: number;\n maxDelayMs?: number;\n connectedSettleMs?: number;\n checkpointStore?: SurrealCheckpointStore;\n checkpointField?: string;\n listKeyResolver?: (change: EntityChange) => string[] | undefined;\n permanentErrorPatterns?: RegExp[];\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createSurrealLiveAdapter(opts: SurrealLiveAdapterOptions): RealtimeAdapter {\n return new SurrealLiveAdapter(opts);\n}\n\n// ---------------------------------------------------------------------------\n// Internals — Adapter\n// ---------------------------------------------------------------------------\n\ntype Row = Record<string, unknown>;\n\nconst DEFAULT_INITIAL_DELAY = 500;\nconst DEFAULT_MAX_DELAY = 30_000;\nconst DEFAULT_CONNECTED_SETTLE = 30_000;\nconst DEFAULT_CHECKPOINT_FIELD = \"updated_at\";\nconst DEFAULT_PERMANENT_PATTERNS = [\n /authentication/i,\n /unauthor/i,\n /namespace/i,\n /unknown\\s+table/i,\n /permission/i,\n];\nconst STATUS_PRIORITY: AdapterStatus[] = [\"error\", \"disconnected\", \"connecting\", \"connected\"];\n\nclass SurrealLiveAdapter implements RealtimeAdapter {\n readonly name: string;\n private readonly opts: Required<\n Omit<SurrealLiveAdapterOptions, \"checkpointStore\" | \"listKeyResolver\" | \"name\">\n > & {\n name: string;\n checkpointStore?: SurrealCheckpointStore;\n listKeyResolver?: (change: EntityChange) => string[] | undefined;\n };\n private readonly channels = new Map<string, SurrealChannel>();\n private readonly channelStates = new Map<string, AdapterStatus>();\n private readonly statusCallbacks = new Set<(status: AdapterStatus) => void>();\n private _status: AdapterStatus = \"connecting\";\n\n constructor(rawOpts: SurrealLiveAdapterOptions) {\n this.opts = {\n name: rawOpts.name ?? \"surreal-live\",\n surreal: rawOpts.surreal,\n tables: rawOpts.tables,\n initialQueryStrategy: rawOpts.initialQueryStrategy ?? \"select-then-live\",\n initialDelayMs: rawOpts.initialDelayMs ?? DEFAULT_INITIAL_DELAY,\n maxDelayMs: rawOpts.maxDelayMs ?? DEFAULT_MAX_DELAY,\n connectedSettleMs: rawOpts.connectedSettleMs ?? DEFAULT_CONNECTED_SETTLE,\n checkpointField: rawOpts.checkpointField ?? DEFAULT_CHECKPOINT_FIELD,\n permanentErrorPatterns: rawOpts.permanentErrorPatterns ?? DEFAULT_PERMANENT_PATTERNS,\n checkpointStore: rawOpts.checkpointStore,\n listKeyResolver: rawOpts.listKeyResolver,\n };\n this.name = this.opts.name;\n }\n\n subscribe(config: SubscriptionConfig, handler: (cs: ChangeSet) => void): UnsubscribeFn {\n const channelConfig = this._resolveChannelConfig(config);\n const key = this._channelKey(config, channelConfig);\n const channel = new SurrealChannel(this, config, channelConfig, key, handler);\n this.channels.set(key, channel);\n this.channelStates.set(key, \"connecting\");\n this._recomputeStatus();\n // Fire-and-forget start; channel records its own status transitions.\n channel.start().catch(() => {\n // start() handles its own error reporting via _setStatus(error)\n });\n return () => {\n const ch = this.channels.get(key);\n if (!ch) return;\n this.channels.delete(key);\n this.channelStates.delete(key);\n void ch.stop();\n this._recomputeStatus();\n };\n }\n\n onStatusChange = (cb: (status: AdapterStatus) => void): UnsubscribeFn => {\n this.statusCallbacks.add(cb);\n return () => {\n this.statusCallbacks.delete(cb);\n };\n };\n\n // ─── package-private helpers used by SurrealChannel ───────────────────────\n\n _setChannelStatus(key: string, status: AdapterStatus): void {\n if (this.channelStates.get(key) === status) return;\n this.channelStates.set(key, status);\n this._recomputeStatus();\n }\n\n _getOpts() {\n return this.opts;\n }\n\n private _recomputeStatus(): void {\n const states = [...this.channelStates.values()];\n const aggregate: AdapterStatus =\n states.length === 0\n ? \"connecting\"\n : (STATUS_PRIORITY.find((s) => states.includes(s)) ?? \"connecting\");\n if (aggregate === this._status) return;\n this._status = aggregate;\n for (const cb of this.statusCallbacks) cb(aggregate);\n }\n\n private _resolveChannelConfig(config: SubscriptionConfig): ChannelConfig {\n // The RealtimeManager passes `label: \"<adapter-name>/<type>\"`; recover the type from there.\n // When labels don't follow that shape, fall back to the first configured table.\n const labelType = config.label?.split(\"/\").pop();\n const match = this.opts.tables.find((t) => t.type === labelType) ?? this.opts.tables[0];\n if (!match) {\n throw new Error(\n `[surreal-live] no tables configured; pass at least one SurrealTableConfig to createSurrealLiveAdapter`,\n );\n }\n return {\n type: match.type,\n };\n }\n\n private _channelKey(config: SubscriptionConfig, channelConfig: ChannelConfig): string {\n const label = config.label ?? `${this.name}/${channelConfig.type}`;\n return label;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internals — per-channel state machine (design D2)\n// ---------------------------------------------------------------------------\n\nclass SurrealChannel {\n private liveUuid: string | null = null;\n private buffer: SurrealLiveAction<Row>[] = [];\n private seedComplete = false;\n private attempt = 0;\n private connectedSettleTimer: ReturnType<typeof setTimeout> | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private aborted = false;\n private status: AdapterStatus = \"connecting\";\n\n constructor(\n private readonly adapter: SurrealLiveAdapter,\n private readonly config: SubscriptionConfig,\n private readonly channelConfig: ChannelConfig,\n readonly key: string,\n private readonly handler: (cs: ChangeSet) => void,\n ) {}\n\n async start(): Promise<void> {\n if (this.aborted) return;\n this._setStatus(\"connecting\");\n try {\n // D3: open LIVE first so notifications arriving during seed are buffered.\n await this._openLive();\n const opts = this.adapter._getOpts();\n if (opts.initialQueryStrategy !== \"live-only\") {\n await this._runSeed();\n }\n // Flush the buffer (which may have grown during seed) in arrival order.\n this.seedComplete = true;\n const buffered = this.buffer.splice(0);\n for (const action of buffered) this._handleAction(action);\n this._setStatus(\"connected\");\n this._armConnectedSettle();\n } catch (err) {\n this._scheduleReconnect(err);\n }\n }\n\n async stop(): Promise<void> {\n this.aborted = true;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.connectedSettleTimer) {\n clearTimeout(this.connectedSettleTimer);\n this.connectedSettleTimer = null;\n }\n if (this.liveUuid) {\n const uuid = this.liveUuid;\n this.liveUuid = null;\n try {\n await this.adapter._getOpts().surreal.kill(uuid);\n } catch {\n // already-closed live queries are no-ops (defensive per design risk §4)\n }\n }\n }\n\n // ─── private ──────────────────────────────────────────────────────────────\n\n private _table(): string {\n const t = this.adapter._getOpts().tables.find((x) => x.type === this.channelConfig.type);\n return t?.table ?? this.channelConfig.type;\n }\n\n private _idField(): string {\n const t = this.adapter._getOpts().tables.find((x) => x.type === this.channelConfig.type);\n return t?.idField ?? \"id\";\n }\n\n private async _openLive(): Promise<void> {\n if (this.aborted) return;\n const surreal = this.adapter._getOpts().surreal;\n this.liveUuid = await surreal.live<Row>(this._table(), (action) => {\n this._onLiveAction(action);\n });\n }\n\n private _onLiveAction(action: SurrealLiveAction<Row>): void {\n if (this.aborted) return;\n if (!this.seedComplete) {\n this.buffer.push(action);\n return;\n }\n this._handleAction(action);\n }\n\n private _handleAction(action: SurrealLiveAction<Row>): void {\n const op = mapAction(action.action);\n if (op === \"close\") {\n this._scheduleReconnect(new Error(\"SurrealDB live query closed\"));\n return;\n }\n if (op === null) {\n // Unknown action — warn + skip.\n // eslint-disable-next-line no-console\n console.warn(`[surreal-live] unknown action \"${action.action}\"; skipping`);\n return;\n }\n // D8: ChannelConfig.operations filter — honor when present.\n const allowed = this.channelConfig.operations;\n if (allowed && !allowed.includes(op)) return;\n\n const change = this._rowToChange(op, action.result);\n if (!change) return;\n const changeset: ChangeSet = {\n changes: [change],\n timestamp: new Date().toISOString(),\n affectedListKeys: this._resolveListKeys([change]),\n };\n this.handler(changeset);\n void this._persistCheckpoint(change);\n }\n\n private async _runSeed(): Promise<void> {\n const surreal = this.adapter._getOpts().surreal;\n const table = this._table();\n const sql = `SELECT * FROM ${table}`;\n const rows = (await surreal.query<Row>(sql)) ?? [];\n const changes: EntityChange[] = [];\n for (const row of rows) {\n const change = this._rowToChange(\"insert\", row);\n if (change) changes.push(change);\n }\n const changeset: ChangeSet = {\n changes,\n timestamp: new Date().toISOString(),\n affectedListKeys: this._resolveListKeys(changes),\n };\n this.handler(changeset);\n // Update checkpoint to the latest seen row (best-effort).\n for (const change of changes) void this._persistCheckpoint(change);\n }\n\n private _rowToChange(op: ChangeOperation, row: Row | null | undefined): EntityChange | null {\n if (!row && op !== \"delete\") return null;\n const idValue = row?.[this._idField()];\n if (idValue == null) {\n // delete without an id — skip; consumer can't act on it\n // eslint-disable-next-line no-console\n console.warn(`[surreal-live] action ${op} missing id field \"${this._idField()}\"; skipping`);\n return null;\n }\n const id = String(idValue) as EntityId;\n const base = {\n op,\n type: this.channelConfig.type,\n id,\n };\n if (op === \"delete\") return base;\n return { ...base, data: row as Record<string, unknown> };\n }\n\n private _resolveListKeys(changes: EntityChange[]): string[] | undefined {\n const resolver = this.adapter._getOpts().listKeyResolver;\n if (!resolver) return undefined;\n const acc = new Set<string>();\n for (const change of changes) {\n const keys = resolver(change);\n if (!keys) continue;\n for (const k of keys) acc.add(k);\n }\n return acc.size === 0 ? undefined : [...acc];\n }\n\n private async _persistCheckpoint(change: EntityChange): Promise<void> {\n const opts = this.adapter._getOpts();\n if (!opts.checkpointStore) return;\n const value = (change.data as Record<string, unknown> | undefined)?.[opts.checkpointField];\n if (value == null) return;\n try {\n await opts.checkpointStore.set(this.key, String(value));\n } catch {\n // best-effort; do not interrupt the dispatch loop\n }\n }\n\n private async _replayFromCheckpoint(): Promise<void> {\n const opts = this.adapter._getOpts();\n if (!opts.checkpointStore) return;\n const stored = await opts.checkpointStore.get(this.key);\n if (!stored) return;\n const sql = `SELECT * FROM ${this._table()} WHERE ${opts.checkpointField} > $stored ORDER BY ${opts.checkpointField} ASC`;\n const rows = (await opts.surreal.query<Row>(sql, { stored })) ?? [];\n if (rows.length === 0) return;\n const changes: EntityChange[] = [];\n for (const row of rows) {\n const change = this._rowToChange(\"update\", row);\n if (change) changes.push(change);\n }\n if (changes.length === 0) return;\n const changeset: ChangeSet = {\n changes,\n timestamp: new Date().toISOString(),\n affectedListKeys: this._resolveListKeys(changes),\n };\n this.handler(changeset);\n for (const change of changes) void this._persistCheckpoint(change);\n }\n\n private _scheduleReconnect(reason: unknown): void {\n if (this.aborted) return;\n if (this._isPermanent(reason)) {\n this._setStatus(\"error\");\n return;\n }\n this._setStatus(\"disconnected\");\n this.attempt += 1;\n const opts = this.adapter._getOpts();\n const exp = Math.min(this.attempt - 1, 6);\n const base = Math.min(opts.initialDelayMs * 2 ** exp, opts.maxDelayMs);\n const jitter = base * 0.25 * (Math.random() * 2 - 1);\n const delay = Math.max(0, Math.round(base + jitter));\n this._setStatus(\"connecting\");\n this.reconnectTimer = setTimeout(async () => {\n if (this.aborted) return;\n try {\n await this._openLive();\n if (opts.checkpointStore) await this._replayFromCheckpoint();\n this._setStatus(\"connected\");\n this._armConnectedSettle();\n } catch (err) {\n this._scheduleReconnect(err);\n }\n }, delay);\n }\n\n private _isPermanent(reason: unknown): boolean {\n const msg = reason instanceof Error ? reason.message : String(reason ?? \"\");\n const patterns = this.adapter._getOpts().permanentErrorPatterns;\n return patterns.some((re) => re.test(msg));\n }\n\n private _armConnectedSettle(): void {\n if (this.connectedSettleTimer) clearTimeout(this.connectedSettleTimer);\n this.connectedSettleTimer = setTimeout(() => {\n this.attempt = 0;\n }, this.adapter._getOpts().connectedSettleMs);\n }\n\n private _setStatus(status: AdapterStatus): void {\n if (this.status === status) return;\n this.status = status;\n this.adapter._setChannelStatus(this.key, status);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Action enum normalization (design D6)\n// ---------------------------------------------------------------------------\n\nfunction mapAction(action: string): ChangeOperation | \"close\" | null {\n switch ((action ?? \"\").toUpperCase()) {\n case \"CREATE\":\n return \"insert\";\n case \"UPDATE\":\n return \"update\";\n case \"DELETE\":\n return \"delete\";\n case \"CLOSE\":\n return \"close\";\n default:\n return null;\n }\n}\n","/**\n * adapters/flint.ts — Flint Realtime Fabric adapter.\n *\n * Flint frf-entity-management `watchEntities()` AsyncIterable\n * → our ChangeSet stream → RealtimeManager → entity graph\n *\n * GAP-1 is a BRIDGE, not a from-scratch build: the Flint repo already ships\n * `@prometheusags/frf-entity-management` whose `RealtimeAdapter.watchEntities()`\n * yields a plain `EntityEvent` (it JSON-decodes the spine envelope — no proto\n * types leak). We consume that entity-shaped facade behind a minimal-surface\n * type, so:\n * - The unfrozen `proto-v1` risk is contained BELOW this seam.\n * - `@prometheusags/frf-sdk` stays an OPTIONAL peer; this module imports\n * nothing from it. The consumer constructs the Flint client and passes it in.\n *\n * `EntityEvent.offset` (bigint) is forwarded to an optional checkpoint store so\n * reconnects resume from the last seen offset (mirrors the surreal-live adapter).\n */\n\nimport type {\n RealtimeAdapter,\n SubscriptionConfig,\n ChangeSet,\n EntityChange,\n ChangeOperation,\n AdapterStatus,\n UnsubscribeFn,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Minimal surface of the Flint frf-entity-management facade (no frf-sdk dep).\n// Mirrors sdks/entity-management/src/{adapter,types}.ts exactly.\n// ---------------------------------------------------------------------------\n\n/** A decoded entity change event received from the Flint spine. */\nexport interface FlintEntityEvent {\n entityType: string;\n entityId: string;\n tenantId: string;\n channelId: string;\n data: Record<string, unknown>;\n offset: bigint;\n correlationId?: string;\n}\n\n/** Filter criteria for a Flint entity subscription. */\nexport interface FlintEntityQuery {\n channelId: string;\n consumerId: string;\n entityType?: string;\n fromOffset?: bigint;\n}\n\n/** An entity mutation to publish on the Flint spine. */\nexport interface FlintEntityRecord {\n entityType: string;\n entityId: string;\n tenantId: string;\n channelId: string;\n data: Record<string, unknown>;\n correlationId?: string;\n}\n\n/** Minimal surface of the Flint `RealtimeAdapter` we consume. */\nexport interface FlintClientLike {\n watchEntities(query: FlintEntityQuery): AsyncIterable<FlintEntityEvent>;\n mutateEntity(record: FlintEntityRecord): Promise<void>;\n}\n\n/** Optional resume-offset persistence (per channel+consumer). */\nexport interface FlintCheckpointStore {\n get(key: string): Promise<bigint | undefined> | bigint | undefined;\n set(key: string, offset: bigint): Promise<void> | void;\n}\n\nexport interface CreateFlintAdapterOptions {\n name?: string;\n /** The Flint entity-management client (frf-entity-management RealtimeAdapter). */\n client: FlintClientLike;\n /** Channel to subscribe/publish on. */\n channelId: string;\n /** Consumer id for this subscription. */\n consumerId: string;\n /** Restrict to one entity type (optional). */\n entityType?: string;\n /** Resume-offset store; reconnects start `fromOffset = lastSeen + 1`. */\n checkpoints?: FlintCheckpointStore;\n /** Map a Flint event to a change operation. Defaults to \"upsert\". */\n resolveOp?: (event: FlintEntityEvent) => ChangeOperation;\n}\n\nfunction checkpointKey(channelId: string, consumerId: string): string {\n return `flint:${channelId}:${consumerId}`;\n}\n\n/**\n * Build a {@link RealtimeAdapter} backed by the Flint Realtime Fabric.\n *\n * The consumer owns the Flint client (constructed from `@prometheusags/frf-sdk`\n * / `frf-entity-management`); this adapter only orchestrates the stream.\n *\n * @example\n * ```ts\n * import { RealtimeAdapter as FrfAdapter } from \"@prometheusags/frf-entity-management\";\n * import { getRealtimeManager, createFlintAdapter } from \"@prometheus-ags/prometheus-entity-management\";\n *\n * const flint = new FrfAdapter(spineClient);\n * const adapter = createFlintAdapter({ client: flint, channelId: \"tenant-1\", consumerId: \"web-1\" });\n * getRealtimeManager().register(adapter);\n * ```\n */\nexport function createFlintAdapter(options: CreateFlintAdapterOptions): RealtimeAdapter {\n const {\n client,\n channelId,\n consumerId,\n entityType,\n checkpoints,\n resolveOp = () => \"upsert\" as ChangeOperation,\n } = options;\n const name = options.name ?? `flint:${channelId}`;\n const statusListeners = new Set<(s: AdapterStatus) => void>();\n\n function emitStatus(s: AdapterStatus): void {\n for (const cb of statusListeners) cb(s);\n }\n\n return {\n name,\n\n subscribe(_config: SubscriptionConfig, handler: (changeset: ChangeSet) => void): UnsubscribeFn {\n let cancelled = false;\n emitStatus(\"connecting\");\n\n (async () => {\n const key = checkpointKey(channelId, consumerId);\n const lastSeen = checkpoints ? await checkpoints.get(key) : undefined;\n const query: FlintEntityQuery = {\n channelId,\n consumerId,\n ...(entityType !== undefined ? { entityType } : {}),\n ...(lastSeen !== undefined ? { fromOffset: lastSeen + 1n } : {}),\n };\n\n try {\n emitStatus(\"connected\");\n for await (const event of client.watchEntities(query)) {\n if (cancelled) break;\n if (entityType !== undefined && event.entityType !== entityType) continue;\n\n const change: EntityChange = {\n op: resolveOp(event),\n type: event.entityType,\n id: event.entityId,\n data: event.data,\n };\n const changeset: ChangeSet = {\n changes: [change],\n timestamp: new Date().toISOString(),\n };\n handler(changeset);\n\n if (checkpoints) await checkpoints.set(key, event.offset);\n }\n if (!cancelled) emitStatus(\"disconnected\");\n } catch {\n if (!cancelled) emitStatus(\"error\");\n }\n })();\n\n return () => {\n cancelled = true;\n emitStatus(\"disconnected\");\n };\n },\n\n onStatusChange(cb) {\n statusListeners.add(cb);\n return () => statusListeners.delete(cb);\n },\n };\n}\n\n/**\n * Publish an entity mutation to the Flint spine via the client.\n * Thin pass-through kept here so consumers import one Flint surface from us.\n */\nexport async function publishFlintMutation(\n client: FlintClientLike,\n record: FlintEntityRecord,\n): Promise<void> {\n await client.mutateEntity(record);\n}\n","/**\n * adapters/electricsql.ts (core)\n *\n * ElectricSQL + PGlite local-first adapter — the React-free base.\n *\n * Server Postgres → ElectricSQL shape sync (SSE) → PGlite (local WASM Postgres)\n * ↓ NOTIFY\n * Entity Graph (Zustand)\n *\n * React hooks (`useLocalFirst`, `usePGliteQuery`) live in the binding package\n * (`@prometheus-ags/entity-graph-react`), built on this adapter.\n */\nimport { getRealtimeManager } from \"./realtime-manager\";\nimport type { SyncAdapter, SubscriptionConfig, ChangeSet, EntityChange, AdapterStatus, UnsubscribeFn } from \"./types\";\nimport type { EntityType } from \"../graph\";\n\n// ---------------------------------------------------------------------------\n// Minimal surface types (avoids hard deps on @electric-sql/pglite etc.)\n// ---------------------------------------------------------------------------\ninterface PGlite {\n query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<{ rows: T[] }>;\n exec(sql: string): Promise<unknown>;\n listen(channel: string, handler: (payload: string) => void): Promise<() => void>;\n}\ninterface ShapeMessage<T = Record<string, unknown>> {\n headers: { operation: \"insert\" | \"update\" | \"delete\" };\n offset: string; value: T; key: string;\n}\ninterface ShapeStream<T = Record<string, unknown>> {\n subscribe(onMsg: (msgs: ShapeMessage<T>[]) => void, onErr?: (e: Error) => void): () => void;\n isUpToDate: boolean; lastOffset: string;\n}\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\nexport interface ElectricTableConfig<T extends object> {\n type: EntityType; table: string; where?: string; idColumn?: string;\n normalize?: (row: T) => Record<string, unknown>;\n shapeStream: ShapeStream<T>;\n}\n\nexport interface ElectricAdapterOptions {\n pglite: PGlite;\n tables: ElectricTableConfig<Record<string, unknown>>[];\n onSynced?: () => void;\n}\n\n// re-export the realtime manager getter so the react hook can reach it via core\nexport { getRealtimeManager };\n\n// ---------------------------------------------------------------------------\n// Adapter factory (React-free)\n// ---------------------------------------------------------------------------\nexport function createElectricAdapter(opts: ElectricAdapterOptions): SyncAdapter {\n const { pglite, tables, onSynced } = opts;\n const statusCbs = new Set<(s: AdapterStatus) => void>();\n const syncedCbs = new Set<() => void>();\n const syncedTables = new Set<string>();\n let globalHandler: ((cs: ChangeSet) => void) | null = null;\n\n function checkAllSynced() {\n if (tables.every((t) => syncedTables.has(t.table))) { onSynced?.(); for (const cb of syncedCbs) cb(); }\n }\n\n function toChange<T extends object>(tc: ElectricTableConfig<T>, msg: ShapeMessage<T>): EntityChange | null {\n const { type, idColumn = \"id\", normalize } = tc; const op = msg.headers.operation;\n const raw = msg.value; const id = String((raw as Record<string, unknown>)[idColumn]); if (!id) return null;\n const data = normalize ? normalize(raw) : (raw as Record<string, unknown>);\n if (op === \"delete\") return { op: \"delete\", type, id };\n return { op: op === \"insert\" ? \"insert\" : \"upsert\", type, id, data };\n }\n\n const shapeUnsubs: UnsubscribeFn[] = [];\n for (const tc of tables) {\n shapeUnsubs.push(tc.shapeStream.subscribe((msgs) => {\n if (!globalHandler) return;\n const changes = msgs.map((m) => toChange(tc as ElectricTableConfig<Record<string, unknown>>, m as ShapeMessage<Record<string, unknown>>)).filter((c): c is EntityChange => c !== null);\n if (changes.length > 0) globalHandler({ changes, timestamp: new Date().toISOString() });\n if (tc.shapeStream.isUpToDate) { syncedTables.add(tc.table); checkAllSynced(); }\n }, (e) => { console.error(`[Electric] ${tc.table}:`, e); for (const cb of statusCbs) cb(\"error\"); }));\n }\n\n void (async () => {\n for (const tc of tables) {\n await pglite.listen(`entity_store_${tc.table}`, (payload) => {\n if (!globalHandler) return;\n try {\n const parsed: { op: string; row: Record<string, unknown> } = JSON.parse(payload);\n const change = toChange(tc as ElectricTableConfig<Record<string, unknown>>, { headers: { operation: parsed.op as \"insert\"|\"update\"|\"delete\" }, offset: \"\", key: String(parsed.row[tc.idColumn ?? \"id\"]), value: parsed.row });\n if (change) globalHandler({ changes: [change] });\n } catch { /* non-JSON frame */ }\n });\n }\n })();\n\n return {\n name: \"electricsql\",\n subscribe(_cfg: SubscriptionConfig, handler: (cs: ChangeSet) => void): UnsubscribeFn {\n globalHandler = handler;\n for (const cb of statusCbs) cb(\"connected\");\n return () => { globalHandler = null; for (const u of shapeUnsubs) u(); };\n },\n onStatusChange(cb) { statusCbs.add(cb); return () => statusCbs.delete(cb); },\n async query<T = Record<string, unknown>>(sql: string, params?: unknown[]) { const r = await pglite.query<T>(sql, params); return { rows: r.rows }; },\n async execute(sql: string, _params?: unknown[]) { await pglite.exec(sql); },\n isSynced() { return tables.every((t) => syncedTables.has(t.table)); },\n onSyncComplete(cb): UnsubscribeFn {\n if (this.isSynced()) { cb(); return () => {}; }\n syncedCbs.add(cb); return () => syncedCbs.delete(cb);\n },\n };\n}\n","/**\n * adapters/electricsql-tenant.ts\n *\n * Tenant-scoped Electric adapter — the safety primitive that enforces\n * **RULE 5 — Shape predicates ⊆ RLS** (see hotseaters constraints).\n *\n * PGlite has no row-level security. The only way to guarantee a client\n * never sees cross-tenant data through Electric is to refuse to attach\n * any shape that lacks a tenant predicate. This wrapper does exactly that:\n *\n * - Validates the tenant claim (currently `{ companyId }`) is a UUID.\n * - Refuses to attach a shape whose `tenantColumn` is `undefined`. We\n * accept explicit `null` for the company root itself (filtered by `id`).\n * - Builds the `where` clause from `tenantColumn` and the validated\n * companyId so individual shape factories cannot drift from RLS.\n * - Delegates to the existing `createElectricAdapter` for the actual\n * sync wiring.\n *\n * This also fulfils Change 13 item 11 (auth-claim-aware shape registration):\n * the `tenantClaim` is the typed seam where authn meets shape registration.\n *\n * Self-hosted Supabase only. Local stack and `https://electricsql.prometheusags.ai`\n * are the only acceptable Electric endpoints — this module does not\n * hard-code either; it only governs the predicate.\n */\n\nimport { createElectricAdapter } from \"./electricsql\";\nimport type { SyncAdapter } from \"./types\";\nimport type { EntityType } from \"../graph\";\n\n// ---------------------------------------------------------------------------\n// Minimal surface types (mirror adapters/electricsql.ts)\n// ---------------------------------------------------------------------------\ninterface PGlite {\n query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<{ rows: T[] }>;\n exec(sql: string): Promise<unknown>;\n listen(channel: string, handler: (payload: string) => void): Promise<() => void>;\n}\n\ninterface ShapeMessage<T = Record<string, unknown>> {\n headers: { operation: \"insert\" | \"update\" | \"delete\" };\n offset: string;\n value: T;\n key: string;\n}\n\ninterface ShapeStream<T = Record<string, unknown>> {\n subscribe(onMsg: (msgs: ShapeMessage<T>[]) => void, onErr?: (e: Error) => void): () => void;\n isUpToDate: boolean;\n lastOffset: string;\n}\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/** Auth claim required to register tenant-scoped shapes. */\nexport interface TenantClaim {\n companyId: string;\n}\n\nexport interface TenantScopedTableConfig<T extends object = Record<string, unknown>> {\n type: EntityType;\n table: string;\n /**\n * Column used for tenant filtering.\n *\n * - A string (`\"company_id\"`) yields `WHERE company_id = '<companyId>'`.\n * - Explicit `null` means the table IS the tenant root and is filtered by\n * `id = '<companyId>'`. Only the `company` table qualifies.\n * - `undefined` is **rejected** — this is the safety gate.\n */\n tenantColumn: string | null;\n primaryKey?: string[];\n /**\n * Factory invoked with the constructed `where` clause and the tenant claim.\n * Consumers wire their preferred Electric `ShapeStream` builder here. The\n * factory must use the supplied `where` verbatim (no widening).\n */\n shapeStreamFactory: (params: {\n table: string;\n where: string;\n tenantClaim: TenantClaim;\n }) => ShapeStream<T>;\n normalize?: (row: T) => Record<string, unknown>;\n}\n\nexport interface TenantScopedAdapterOptions {\n pglite: PGlite;\n tenantClaim: TenantClaim;\n tables: TenantScopedTableConfig[];\n onSynced?: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nfunction assertUuid(companyId: string): void {\n if (typeof companyId !== \"string\" || !UUID_RE.test(companyId)) {\n throw new Error(\n `tenant-scoped adapter: companyId must be a UUID, received \"${companyId}\".`,\n );\n }\n}\n\nfunction assertSafeColumn(column: string): void {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(column)) {\n throw new Error(`tenant-scoped adapter: unsafe tenantColumn \"${column}\".`);\n }\n}\n\n/**\n * Build the `where` clause for a single shape. Exposed for tests.\n *\n * - `tenantColumn === null` → `id = '<companyId>'` (company-root case)\n * - `tenantColumn === string` → `<tenantColumn> = '<companyId>'`\n *\n * Throws if `tenantColumn` is `undefined` or `companyId` is not a UUID.\n */\nexport function buildTenantWhere(\n tenantColumn: string | null | undefined,\n companyId: string,\n tableLabel: string,\n): string {\n if (typeof tenantColumn === \"undefined\") {\n throw new Error(\n `shape \"${tableLabel}\" lacks tenantColumn — tenant-scoped adapter refuses to attach unscoped shapes.`,\n );\n }\n assertUuid(companyId);\n if (tenantColumn === null) {\n return `id = '${companyId}'`;\n }\n assertSafeColumn(tenantColumn);\n return `${tenantColumn} = '${companyId}'`;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Build a tenant-scoped {@link SyncAdapter}.\n *\n * For each table in `tables`:\n * 1. Validates `tenantColumn` is defined (string or explicit null).\n * 2. Validates `companyId` is a UUID.\n * 3. Builds the predicate and calls `shapeStreamFactory(...)` to get the\n * actual `ShapeStream`.\n * 4. Hands the resulting list off to `createElectricAdapter` for wiring.\n *\n * @throws if any table lacks `tenantColumn`, or the company id is not a UUID.\n */\nexport function createTenantScopedElectricAdapter(\n opts: TenantScopedAdapterOptions,\n): SyncAdapter {\n const { pglite, tenantClaim, tables, onSynced } = opts;\n assertUuid(tenantClaim.companyId);\n\n const wired = tables.map((tc) => {\n const where = buildTenantWhere(tc.tenantColumn, tenantClaim.companyId, tc.table);\n const shapeStream = tc.shapeStreamFactory({ table: tc.table, where, tenantClaim });\n return {\n type: tc.type,\n table: tc.table,\n where,\n idColumn: tc.primaryKey?.[0] ?? \"id\",\n normalize: tc.normalize,\n shapeStream,\n };\n });\n\n return createElectricAdapter({ pglite, tables: wired, onSynced });\n}\n","/**\n * adapters/pglite-persistence.ts\n *\n * PGlite-backed implementation of {@link GraphPersistenceAdapter}.\n *\n * Stores the local-first runtime's graph snapshot inside a PGlite table\n * (`_graph_snapshot` by default) instead of `localStorage`/`IndexedDB`.\n *\n * Why this exists:\n * - The app already has a PGlite handle for ElectricSQL sync.\n * - Putting the graph snapshot alongside synced data means one storage\n * surface to back up, clear, and reason about.\n * - Works in Tauri WebView + Node (PGlite is a WASM Postgres) without\n * pulling in browser-only storage.\n *\n * Contract:\n * - `get(key)` -> returns the stored string or null\n * - `set(key, v)` -> upserts (insert-or-replace), stamping `updated_at`\n * - `remove(key)` -> deletes the row (no-op if absent)\n *\n * The function lazily ensures the storage table exists on first call.\n * That `CREATE TABLE IF NOT EXISTS` is idempotent so it's safe to retry.\n *\n * Self-hosted Supabase only. HotSeatersMVP is the bible. This module does\n * not import `@electric-sql/pglite` — consumers pass a PGlite-shaped handle.\n */\n\nimport type { GraphPersistenceAdapter } from \"../local-first-runtime\";\n\n// ---------------------------------------------------------------------------\n// Minimal surface type — matches the pattern used by adapters/electricsql.ts.\n// Avoids a hard dep on @electric-sql/pglite.\n// ---------------------------------------------------------------------------\nexport interface PGlitePersistenceClient {\n query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<{ rows: T[] }>;\n exec(sql: string): Promise<unknown>;\n}\n\nexport interface CreatePGlitePersistenceAdapterOptions {\n /** Name of the snapshot table. Defaults to `_graph_snapshot`. */\n tableName?: string;\n}\n\nconst DEFAULT_TABLE = \"_graph_snapshot\";\n\n/**\n * Returns a {@link GraphPersistenceAdapter} that reads/writes the graph\n * snapshot through a PGlite-shaped client.\n *\n * @example\n * ```ts\n * import { PGlite } from \"@electric-sql/pglite\";\n * import { startLocalFirstGraph, createPGlitePersistenceAdapter } from \"@prometheus-ags/prometheus-entity-management\";\n *\n * const pglite = await PGlite.create(\"idb://hotseaters\");\n * const storage = await createPGlitePersistenceAdapter(pglite);\n * const runtime = startLocalFirstGraph({ storage, key: \"hotseaters:graph\" });\n * ```\n */\nexport async function createPGlitePersistenceAdapter(\n pglite: PGlitePersistenceClient,\n options: CreatePGlitePersistenceAdapterOptions = {},\n): Promise<GraphPersistenceAdapter> {\n const tableName = options.tableName ?? DEFAULT_TABLE;\n // Quote-escape the identifier with simple validation. Reject anything that\n // isn't a safe identifier so we never interpolate hostile names.\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(tableName)) {\n throw new Error(`createPGlitePersistenceAdapter: invalid tableName \"${tableName}\"`);\n }\n\n await pglite.exec(\n `CREATE TABLE IF NOT EXISTS ${tableName} (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n )`,\n );\n\n return {\n async get(key: string): Promise<string | null> {\n const result = await pglite.query<{ value: string }>(\n `SELECT value FROM ${tableName} WHERE key = $1`,\n [key],\n );\n const row = result.rows[0];\n return row?.value ?? null;\n },\n async set(key: string, value: string): Promise<void> {\n await pglite.query(\n `INSERT INTO ${tableName} (key, value, updated_at)\n VALUES ($1, $2, now())\n ON CONFLICT (key) DO UPDATE\n SET value = EXCLUDED.value,\n updated_at = now()`,\n [key, value],\n );\n },\n async remove(key: string): Promise<void> {\n await pglite.query(`DELETE FROM ${tableName} WHERE key = $1`, [key]);\n },\n };\n}\n","/**\n * adapters/tauri-sql-persistence.ts\n *\n * SQLite-backed implementation of {@link GraphPersistenceAdapter} for Tauri\n * desktop, via the official `@tauri-apps/plugin-sql` `Database` handle.\n *\n * Why this exists:\n * - On Tauri desktop the natural on-device store is SQLite, not PGlite-wasm.\n * - This pairs with `createPGlitePersistenceAdapter` (browser/wasm) so the\n * same local-first runtime persists across web and desktop unchanged.\n *\n * The consumer owns the Tauri `Database` handle (from `Database.load(...)`).\n * This module does NOT import `@tauri-apps/plugin-sql` — it takes a\n * minimal-surface client, mirroring the PGlite/Electric adapter pattern, so it\n * adds no hard dependency. `@tauri-apps/plugin-sql` is an optional peer.\n *\n * Contract (same as every GraphPersistenceAdapter):\n * - `get(key)` -> stored string or null\n * - `set(key, v)` -> upsert (INSERT ... ON CONFLICT)\n * - `remove(key)` -> delete (no-op if absent)\n *\n * Tauri SQL uses SQLite `?`-positional bind params (not `$1`).\n */\n\nimport type { GraphPersistenceAdapter } from \"../local-first-runtime\";\n\n/**\n * Minimal surface of a `@tauri-apps/plugin-sql` `Database` handle.\n * Avoids a hard dep; matches the loaded-Database shape (`execute` + `select`).\n */\nexport interface TauriSqlClient {\n execute(query: string, bindValues?: unknown[]): Promise<unknown>;\n select<T = Record<string, unknown>>(query: string, bindValues?: unknown[]): Promise<T[]>;\n}\n\nexport interface CreateTauriSqlPersistenceAdapterOptions {\n /** Name of the snapshot table. Defaults to `_graph_snapshot`. */\n tableName?: string;\n}\n\nconst DEFAULT_TABLE = \"_graph_snapshot\";\n\n/**\n * Returns a {@link GraphPersistenceAdapter} backed by a Tauri SQLite `Database`.\n *\n * @example\n * ```ts\n * import Database from \"@tauri-apps/plugin-sql\";\n * import { startLocalFirstGraph, createTauriSqlPersistenceAdapter } from \"@prometheus-ags/prometheus-entity-management\";\n *\n * const db = await Database.load(\"sqlite:app.db\");\n * const storage = await createTauriSqlPersistenceAdapter(db);\n * const runtime = startLocalFirstGraph({ storage, key: \"app:graph\" });\n * ```\n */\nexport async function createTauriSqlPersistenceAdapter(\n db: TauriSqlClient,\n options: CreateTauriSqlPersistenceAdapterOptions = {},\n): Promise<GraphPersistenceAdapter> {\n const tableName = options.tableName ?? DEFAULT_TABLE;\n // Reject anything that isn't a safe identifier so we never interpolate a\n // hostile table name into DDL.\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(tableName)) {\n throw new Error(`createTauriSqlPersistenceAdapter: invalid tableName \"${tableName}\"`);\n }\n\n await db.execute(\n `CREATE TABLE IF NOT EXISTS ${tableName} (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n updated_at INTEGER NOT NULL\n )`,\n );\n\n return {\n async get(key: string): Promise<string | null> {\n const rows = await db.select<{ value: string }>(\n `SELECT value FROM ${tableName} WHERE key = ?`,\n [key],\n );\n return rows[0]?.value ?? null;\n },\n async set(key: string, value: string): Promise<void> {\n await db.execute(\n `INSERT INTO ${tableName} (key, value, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT (key) DO UPDATE\n SET value = excluded.value,\n updated_at = excluded.updated_at`,\n [key, value, Date.now()],\n );\n },\n async remove(key: string): Promise<void> {\n await db.execute(`DELETE FROM ${tableName} WHERE key = ?`, [key]);\n },\n };\n}\n","/**\n * schema-from-sql.ts\n *\n * Generates a JSON Schema (and registers it via `registerEntityJsonSchema`)\n * directly from a Postgres `CREATE TABLE` statement. Lets a consumer keep\n * `latest-data/supabase/migrations/*.sql` as the single source of truth for\n * column shapes — no hand-maintained TypeScript schema duplicates.\n *\n * Deliberately regex-based: a real SQL parser is overkill for the slice of\n * DDL we care about, and would add a non-trivial runtime dep.\n *\n * Type mapping\n * ------------\n * UUID, TEXT, VARCHAR(*) -> { type: \"string\" }\n * INTEGER, INT, BIGINT, SMALLINT -> { type: \"integer\" }\n * NUMERIC(*), DECIMAL(*) -> { type: \"number\" }\n * BOOLEAN, BOOL -> { type: \"boolean\" }\n * TIMESTAMPTZ, TIMESTAMP -> { type: \"string\", format: \"date-time\" }\n * DATE -> { type: \"string\", format: \"date\" }\n * JSONB, JSON -> { type: \"object\" }\n * TEXT[] -> { type: \"array\", items: { type: \"string\" } }\n * anything else -> { type: \"string\" } + \"x-warning\"\n *\n * `required` is populated from `NOT NULL` columns that lack a `DEFAULT`.\n * Callers can pass `overrides` to deep-merge a partial config (typically to\n * narrow a JSONB column to an array, or to add `enum`/`format` hints).\n */\n\nimport {\n registerEntityJsonSchema,\n type EntityJsonSchemaConfig,\n type JsonSchemaObject,\n} from \"./schema\";\n\nexport interface RegisterEntityFromSqlOptions {\n entityType: string;\n /** A single `CREATE TABLE` statement (extra DDL around it is ignored). */\n createTableSql: string;\n /** Optional deep-merge overrides (overrides win). */\n overrides?: Partial<EntityJsonSchemaConfig>;\n}\n\ninterface ParsedColumn {\n name: string;\n sqlType: string;\n notNull: boolean;\n hasDefault: boolean;\n}\n\ninterface ParsedTable {\n tableName: string;\n columns: ParsedColumn[];\n}\n\n/**\n * Parse a `CREATE TABLE` block. Exposed for tests and for callers who need\n * the intermediate representation.\n */\nexport function parseCreateTable(sql: string): ParsedTable {\n // Capture: CREATE TABLE [IF NOT EXISTS] <name> ( <body> )\n const headerMatch = sql.match(\n /CREATE\\s+TABLE\\s+(?:IF\\s+NOT\\s+EXISTS\\s+)?[\"]?([A-Za-z_][A-Za-z0-9_]*)[\"]?\\s*\\(([\\s\\S]*)\\)\\s*;?\\s*$/im,\n );\n if (!headerMatch) {\n throw new Error(\"parseCreateTable: could not locate a CREATE TABLE block\");\n }\n const tableName = headerMatch[1];\n const body = headerMatch[2];\n\n const columns: ParsedColumn[] = [];\n for (const rawLine of splitTopLevelCommas(body)) {\n const line = rawLine.trim();\n if (!line) continue;\n // Skip table-level constraints (PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK,\n // CONSTRAINT, LIKE, EXCLUDE).\n if (/^(?:PRIMARY\\s+KEY|FOREIGN\\s+KEY|UNIQUE|CHECK|CONSTRAINT|LIKE|EXCLUDE)\\b/i.test(line)) {\n continue;\n }\n const colMatch = line.match(/^[\"]?([A-Za-z_][A-Za-z0-9_]*)[\"]?\\s+([A-Za-z][A-Za-z0-9_]*(?:\\s*\\([^)]*\\))?(?:\\s*\\[\\s*\\])?)([\\s\\S]*)$/);\n if (!colMatch) continue;\n const name = colMatch[1];\n const sqlType = colMatch[2].replace(/\\s+/g, \"\").toUpperCase();\n const rest = colMatch[3].toUpperCase();\n const notNull = /\\bNOT\\s+NULL\\b/.test(rest);\n const hasDefault = /\\bDEFAULT\\b/.test(rest);\n columns.push({ name, sqlType, notNull, hasDefault });\n }\n\n return { tableName, columns };\n}\n\n/**\n * Split a parenthesised body on top-level commas (ignoring commas inside\n * nested parens like `NUMERIC(10, 2)`).\n */\nfunction splitTopLevelCommas(body: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let current = \"\";\n for (const ch of body) {\n if (ch === \"(\") depth++;\n else if (ch === \")\") depth--;\n if (ch === \",\" && depth === 0) {\n parts.push(current);\n current = \"\";\n } else {\n current += ch;\n }\n }\n if (current.trim()) parts.push(current);\n return parts;\n}\n\n/**\n * Map a normalized (uppercased, whitespace-stripped) SQL type to a JSON\n * schema fragment.\n *\n * Returns `{ schema, warning }` so the caller can surface \"unmapped type\"\n * notes via `x-warning` on the property.\n */\nexport function sqlTypeToJsonSchema(sqlType: string): {\n schema: JsonSchemaObject;\n warning?: string;\n} {\n const t = sqlType.replace(/\\s+/g, \"\").toUpperCase();\n\n if (/^TEXT\\[\\]$/.test(t)) {\n return { schema: { type: \"array\", items: { type: \"string\" } } };\n }\n if (t === \"UUID\" || t === \"TEXT\" || /^VARCHAR(\\(.*\\))?$/.test(t) || /^CHAR(\\(.*\\))?$/.test(t)) {\n return { schema: { type: \"string\" } };\n }\n if (t === \"INTEGER\" || t === \"INT\" || t === \"BIGINT\" || t === \"SMALLINT\" || t === \"INT4\" || t === \"INT8\" || t === \"INT2\") {\n return { schema: { type: \"integer\" } };\n }\n if (/^NUMERIC(\\(.*\\))?$/.test(t) || /^DECIMAL(\\(.*\\))?$/.test(t) || t === \"REAL\" || t === \"DOUBLEPRECISION\" || t === \"FLOAT\") {\n return { schema: { type: \"number\" } };\n }\n if (t === \"BOOLEAN\" || t === \"BOOL\") {\n return { schema: { type: \"boolean\" } };\n }\n if (t === \"TIMESTAMPTZ\" || t === \"TIMESTAMP\" || t === \"TIMESTAMPWITHTIMEZONE\" || t === \"TIMESTAMPWITHOUTTIMEZONE\") {\n return { schema: { type: \"string\", format: \"date-time\" } };\n }\n if (t === \"DATE\") {\n return { schema: { type: \"string\", format: \"date\" } };\n }\n if (t === \"JSONB\" || t === \"JSON\") {\n return { schema: { type: \"object\" } };\n }\n return {\n schema: { type: \"string\" },\n warning: `sql type \"${sqlType}\" not explicitly mapped; defaulting to string`,\n };\n}\n\n/**\n * Untyped deep-merge used by `mergeEntityConfig`. Generic and `unknown`-typed\n * to keep this internal helper free of the interface-vs-Record friction that\n * strict-mode `Record<string, unknown>` introduces with named interfaces.\n *\n * @internal\n */\nfunction deepMergeUnknown(\n base: Record<string, unknown>,\n override: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(override)) {\n const baseValue = base[key];\n if (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n baseValue !== null &&\n typeof baseValue === \"object\" &&\n !Array.isArray(baseValue)\n ) {\n out[key] = deepMergeUnknown(\n baseValue as Record<string, unknown>,\n value as Record<string, unknown>,\n );\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\n/**\n * Merge a generated `EntityJsonSchemaConfig` with an optional caller-supplied\n * overrides object. Required fields (`entityType`, `schema`) always come from\n * the generated value; overrides may extend them but cannot remove them.\n */\nfunction mergeEntityConfig(\n generated: EntityJsonSchemaConfig,\n overrides?: Partial<EntityJsonSchemaConfig>,\n): EntityJsonSchemaConfig {\n if (!overrides) return generated;\n const merged = deepMergeUnknown(\n generated as unknown as Record<string, unknown>,\n overrides as unknown as Record<string, unknown>,\n );\n // Re-impose the required fields from the generated source — overrides may\n // not erase them, only refine them.\n // The deepMerge result is structurally compatible but TypeScript can't\n // narrow it back through the Record<> intermediate; the explicit\n // `unknown` hop is the documented escape per the TS strict-mode contract.\n const refined = merged as unknown as EntityJsonSchemaConfig;\n return {\n ...refined,\n entityType: generated.entityType,\n schema: refined.schema ?? generated.schema,\n };\n}\n\n/**\n * Build (and register) an `EntityJsonSchemaConfig` from a CREATE TABLE\n * statement. Returns the registered config so callers can introspect it.\n */\nexport function registerEntityFromSql(\n opts: RegisterEntityFromSqlOptions,\n): EntityJsonSchemaConfig {\n const parsed = parseCreateTable(opts.createTableSql);\n const properties: Record<string, JsonSchemaObject> = {};\n const required: string[] = [];\n\n for (const col of parsed.columns) {\n const { schema, warning } = sqlTypeToJsonSchema(col.sqlType);\n const propSchema: JsonSchemaObject = { ...schema };\n if (warning) {\n (propSchema as Record<string, unknown>)[\"x-warning\"] = warning;\n }\n properties[col.name] = propSchema;\n if (col.notNull && !col.hasDefault) {\n required.push(col.name);\n }\n }\n\n const generated: EntityJsonSchemaConfig = {\n entityType: opts.entityType,\n source: \"runtime\",\n schema: {\n type: \"object\",\n title: parsed.tableName,\n properties,\n required,\n },\n };\n\n const config = mergeEntityConfig(generated, opts.overrides);\n registerEntityJsonSchema(config);\n return config;\n}\n","/**\n * table/row-models.ts\n *\n * Pure row model pipeline functions. Each stage transforms data\n * into a RowModel — no side effects, no external dependencies.\n */\nimport type {\n Row,\n Cell,\n Column,\n ColumnDef,\n RowModel,\n TableInstance,\n SortingState,\n ColumnFiltersState,\n ExpandedState,\n GroupingState,\n PaginationState,\n CellContext,\n FilterFn,\n SortingFn,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Accessor helpers\n// ---------------------------------------------------------------------------\nfunction resolveAccessor<TData>(\n columnDef: ColumnDef<TData>,\n row: TData,\n index: number,\n): unknown {\n if (columnDef.accessorFn) return columnDef.accessorFn(row, index);\n if (columnDef.accessorKey) return (row as Record<string, unknown>)[columnDef.accessorKey];\n return undefined;\n}\n\nfunction getColumnId<TData>(colDef: ColumnDef<TData>, index: number): string {\n return colDef.id ?? colDef.accessorKey ?? `col_${index}`;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in filter functions\n// ---------------------------------------------------------------------------\nconst builtInFilterFns: Record<string, FilterFn<unknown>> = {\n auto: (row, columnId, filterValue) => {\n const val = row.getValue(columnId);\n if (filterValue == null || filterValue === \"\") return true;\n if (typeof val === \"string\") return val.toLowerCase().includes(String(filterValue).toLowerCase());\n if (typeof val === \"number\") return val === Number(filterValue);\n if (typeof val === \"boolean\") return val === filterValue;\n return String(val).toLowerCase().includes(String(filterValue).toLowerCase());\n },\n};\n\n// ---------------------------------------------------------------------------\n// Built-in sorting comparators\n// ---------------------------------------------------------------------------\nfunction defaultSortingFn(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return 1;\n if (b == null) return -1;\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n return String(a).localeCompare(String(b));\n}\n\n// ---------------------------------------------------------------------------\n// Create Row wrapper\n// ---------------------------------------------------------------------------\nexport function createRow<TData>(\n original: TData,\n index: number,\n columns: Column<TData>[],\n table: TableInstance<TData>,\n depth: number = 0,\n parentId?: string,\n subRows: Row<TData>[] = [],\n): Row<TData> {\n const id = table.options.getRowId\n ? table.options.getRowId(original, index)\n : String(index);\n\n const row: Row<TData> = {\n id,\n index,\n original,\n depth,\n parentId,\n subRows,\n\n getValue: <T = unknown>(columnId: string): T => {\n const col = columns.find((c) => c.id === columnId);\n if (!col) return undefined as T;\n return resolveAccessor(col.columnDef, original, index) as T;\n },\n renderValue: <T = unknown>(columnId: string): T | null => {\n const val = row.getValue<T>(columnId);\n return val ?? null;\n },\n\n getIsSelected: () => !!table.getState().rowSelection[id],\n getCanSelect: () => {\n const opt = table.options.enableRowSelection;\n if (opt === false) return false;\n if (typeof opt === \"function\") return opt(row);\n return true;\n },\n getIsAllSubRowsSelected: () =>\n subRows.length > 0 && subRows.every((sr) => sr.getIsSelected()),\n getIsSomeSelected: () =>\n subRows.some((sr) => sr.getIsSelected() || sr.getIsSomeSelected()),\n toggleSelected: (value?: boolean) => {\n const next = value ?? !row.getIsSelected();\n table.setRowSelection((prev) => ({ ...prev, [id]: next }));\n },\n getToggleSelectedHandler: () => (e: unknown) => {\n row.toggleSelected();\n },\n\n getIsExpanded: () => {\n const expanded = table.getState().expanded;\n if (expanded === true) return true;\n return !!expanded[id];\n },\n getCanExpand: () => subRows.length > 0,\n toggleExpanded: (value?: boolean) => {\n const next = value ?? !row.getIsExpanded();\n table.setExpanded((prev) => {\n if (prev === true) {\n const allRows: Record<string, boolean> = {};\n table.getCoreRowModel().flatRows.forEach((r) => { allRows[r.id] = true; });\n allRows[id] = next;\n return allRows;\n }\n return { ...prev, [id]: next };\n });\n },\n getToggleExpandedHandler: () => () => row.toggleExpanded(),\n\n getIsGrouped: () => !!row.groupingColumnId,\n groupingColumnId: undefined,\n groupingValue: undefined,\n\n getVisibleCells: () =>\n row.getAllCells().filter((cell) => cell.column.getIsVisible()),\n getAllCells: () =>\n columns.map((col) => createCell(row, col, table)),\n\n getIsPinned: () => false,\n pin: () => {},\n };\n\n return row;\n}\n\n// ---------------------------------------------------------------------------\n// Create Cell wrapper\n// ---------------------------------------------------------------------------\nfunction createCell<TData>(\n row: Row<TData>,\n column: Column<TData>,\n table: TableInstance<TData>,\n): Cell<TData> {\n const cellId = `${row.id}_${column.id}`;\n const cell: Cell<TData> = {\n id: cellId,\n row,\n column,\n getValue: <T = unknown>() => row.getValue<T>(column.id),\n renderValue: <T = unknown>() => row.renderValue<T>(column.id),\n getIsGrouped: () => row.getIsGrouped() && row.groupingColumnId === column.id,\n getIsPlaceholder: () => false,\n getIsAggregated: () => row.subRows.length > 0 && row.getIsGrouped() && row.groupingColumnId !== column.id,\n getContext: (): CellContext<TData> => ({\n table,\n row,\n cell,\n column,\n getValue: cell.getValue,\n renderValue: cell.renderValue,\n }),\n };\n return cell;\n}\n\n// ---------------------------------------------------------------------------\n// 1. getCoreRowModel\n// ---------------------------------------------------------------------------\nexport function getCoreRowModel<TData>(\n data: TData[],\n columns: Column<TData>[],\n table: TableInstance<TData>,\n): RowModel<TData> {\n const getSubRows = table.options.getSubRows;\n const flatRows: Row<TData>[] = [];\n\n function processRows(items: TData[], depth: number, parentId?: string): Row<TData>[] {\n return items.map((item, index) => {\n const subData = getSubRows?.(item, index);\n const row = createRow(item, flatRows.length, columns, table, depth, parentId);\n flatRows.push(row);\n if (subData && subData.length > 0) {\n row.subRows = processRows(subData, depth + 1, row.id);\n }\n return row;\n });\n }\n\n const rows = processRows(data, 0);\n const rowsById: Record<string, Row<TData>> = {};\n flatRows.forEach((r) => { rowsById[r.id] = r; });\n\n return { rows, flatRows, rowsById };\n}\n\n// ---------------------------------------------------------------------------\n// 2. getFilteredRowModel\n// ---------------------------------------------------------------------------\nexport function getFilteredRowModel<TData>(\n rowModel: RowModel<TData>,\n columnFilters: ColumnFiltersState,\n globalFilter: unknown,\n columns: Column<TData>[],\n globalFilterFn?: FilterFn<TData>,\n): RowModel<TData> {\n const hasColumnFilters = columnFilters.length > 0;\n const hasGlobalFilter = globalFilter != null && globalFilter !== \"\";\n\n if (!hasColumnFilters && !hasGlobalFilter) return rowModel;\n\n const filterFns = new Map<string, FilterFn<TData>>();\n for (const cf of columnFilters) {\n const col = columns.find((c) => c.id === cf.id);\n if (col) {\n const fn = col.columnDef.filterFn;\n filterFns.set(cf.id, (typeof fn === \"function\" ? fn : builtInFilterFns.auto) as FilterFn<TData>);\n }\n }\n\n const resolvedGlobalFilterFn = (globalFilterFn ?? builtInFilterFns.auto) as FilterFn<TData>;\n const flatRows: Row<TData>[] = [];\n\n function filterRows(rows: Row<TData>[]): Row<TData>[] {\n return rows.filter((row) => {\n for (const cf of columnFilters) {\n const fn = filterFns.get(cf.id);\n if (fn && !fn(row, cf.id, cf.value)) return false;\n }\n if (hasGlobalFilter) {\n const matches = columns.some((col) =>\n resolvedGlobalFilterFn(row, col.id, globalFilter),\n );\n if (!matches) return false;\n }\n flatRows.push(row);\n if (row.subRows.length > 0) {\n const filteredSubRows = filterRows(row.subRows);\n if (filteredSubRows.length > 0) {\n row = { ...row, subRows: filteredSubRows };\n return true;\n }\n }\n return true;\n });\n }\n\n const rows = filterRows(rowModel.rows);\n const rowsById: Record<string, Row<TData>> = {};\n flatRows.forEach((r) => { rowsById[r.id] = r; });\n\n return { rows, flatRows, rowsById };\n}\n\n// ---------------------------------------------------------------------------\n// 3. getSortedRowModel\n// ---------------------------------------------------------------------------\nexport function getSortedRowModel<TData>(\n rowModel: RowModel<TData>,\n sorting: SortingState,\n columns: Column<TData>[],\n): RowModel<TData> {\n if (sorting.length === 0) return rowModel;\n\n const sortFns: Array<{\n columnId: string;\n desc: boolean;\n fn: SortingFn<TData> | null;\n colDef: ColumnDef<TData> | null;\n }> = sorting.map((s) => {\n const col = columns.find((c) => c.id === s.id);\n const colDef = col?.columnDef ?? null;\n let fn: SortingFn<TData> | null = null;\n if (colDef?.sortingFn && typeof colDef.sortingFn === \"function\") {\n fn = colDef.sortingFn;\n }\n return { columnId: s.id, desc: s.desc, fn, colDef };\n });\n\n function sortRows(rows: Row<TData>[]): Row<TData>[] {\n const sorted = [...rows].sort((rowA, rowB) => {\n for (const { columnId, desc, fn, colDef } of sortFns) {\n let result: number;\n if (fn) {\n result = fn(rowA, rowB, columnId);\n } else {\n const a = rowA.getValue(columnId);\n const b = rowB.getValue(columnId);\n result = defaultSortingFn(a, b);\n }\n if (colDef?.invertSorting) result = -result;\n if (result !== 0) return desc ? -result : result;\n }\n return 0;\n });\n\n return sorted.map((row) => {\n if (row.subRows.length > 0) {\n return { ...row, subRows: sortRows(row.subRows) };\n }\n return row;\n });\n }\n\n const rows = sortRows(rowModel.rows);\n const flatRows: Row<TData>[] = [];\n function flatten(rows: Row<TData>[]) {\n rows.forEach((r) => { flatRows.push(r); if (r.subRows.length) flatten(r.subRows); });\n }\n flatten(rows);\n const rowsById: Record<string, Row<TData>> = {};\n flatRows.forEach((r) => { rowsById[r.id] = r; });\n\n return { rows, flatRows, rowsById };\n}\n\n// ---------------------------------------------------------------------------\n// 4. getGroupedRowModel\n// ---------------------------------------------------------------------------\nexport function getGroupedRowModel<TData>(\n rowModel: RowModel<TData>,\n grouping: GroupingState,\n columns: Column<TData>[],\n table: TableInstance<TData>,\n): RowModel<TData> {\n if (grouping.length === 0) return rowModel;\n\n function groupRows(rows: Row<TData>[], depth: number): Row<TData>[] {\n if (depth >= grouping.length) return rows;\n\n const columnId = grouping[depth];\n const groups = new Map<unknown, Row<TData>[]>();\n\n for (const row of rows) {\n const value = row.getValue(columnId);\n const key = value ?? \"__null__\";\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(row);\n }\n\n const groupedRows: Row<TData>[] = [];\n let groupIndex = 0;\n\n for (const [key, groupItems] of groups) {\n const firstRow = groupItems[0];\n const groupRow = createRow(\n firstRow.original,\n groupIndex++,\n columns,\n table,\n depth,\n );\n groupRow.groupingColumnId = columnId;\n groupRow.groupingValue = key === \"__null__\" ? null : key;\n groupRow.subRows = groupRows(groupItems, depth + 1);\n groupedRows.push(groupRow);\n }\n\n return groupedRows;\n }\n\n const rows = groupRows(rowModel.rows, 0);\n const flatRows: Row<TData>[] = [];\n function flatten(items: Row<TData>[]) {\n items.forEach((r) => { flatRows.push(r); if (r.subRows.length) flatten(r.subRows); });\n }\n flatten(rows);\n const rowsById: Record<string, Row<TData>> = {};\n flatRows.forEach((r) => { rowsById[r.id] = r; });\n\n return { rows, flatRows, rowsById };\n}\n\n// ---------------------------------------------------------------------------\n// 5. getExpandedRowModel\n// ---------------------------------------------------------------------------\nexport function getExpandedRowModel<TData>(\n rowModel: RowModel<TData>,\n expanded: ExpandedState,\n): RowModel<TData> {\n const flatRows: Row<TData>[] = [];\n\n function expandRows(rows: Row<TData>[]): Row<TData>[] {\n const result: Row<TData>[] = [];\n for (const row of rows) {\n result.push(row);\n flatRows.push(row);\n const isExpanded = expanded === true || (typeof expanded === \"object\" && expanded[row.id]);\n if (isExpanded && row.subRows.length > 0) {\n const expandedSubRows = expandRows(row.subRows);\n result.push(...expandedSubRows);\n }\n }\n return result;\n }\n\n const rows = expandRows(rowModel.rows);\n const rowsById: Record<string, Row<TData>> = {};\n flatRows.forEach((r) => { rowsById[r.id] = r; });\n\n return { rows, flatRows, rowsById };\n}\n\n// ---------------------------------------------------------------------------\n// 6. getPaginatedRowModel\n// ---------------------------------------------------------------------------\nexport function getPaginatedRowModel<TData>(\n rowModel: RowModel<TData>,\n pagination: PaginationState,\n): RowModel<TData> {\n const { pageIndex, pageSize } = pagination;\n const start = pageIndex * pageSize;\n const end = start + pageSize;\n const rows = rowModel.rows.slice(start, end);\n const flatRows = rows;\n const rowsById: Record<string, Row<TData>> = {};\n flatRows.forEach((r) => { rowsById[r.id] = r; });\n\n return { rows, flatRows, rowsById };\n}\n\n// ---------------------------------------------------------------------------\n// Helper: get selected row model\n// ---------------------------------------------------------------------------\nexport function getSelectedRowModel<TData>(\n rowModel: RowModel<TData>,\n selection: Record<string, boolean>,\n): RowModel<TData> {\n const rows = rowModel.flatRows.filter((r) => selection[r.id]);\n const rowsById: Record<string, Row<TData>> = {};\n rows.forEach((r) => { rowsById[r.id] = r; });\n return { rows, flatRows: rows, rowsById };\n}\n","/**\n * table/faceting.ts\n *\n * Column faceting utilities — compute unique values, counts,\n * and min/max for filter UI controls.\n */\nimport type { Row, RowModel } from \"./types\";\n\n/**\n * Compute unique values and their counts for a given column.\n * Useful for rendering filter dropdown options with hit counts.\n */\nexport function getFacetedUniqueValues<TData>(\n rowModel: RowModel<TData>,\n columnId: string,\n): Map<unknown, number> {\n const counts = new Map<unknown, number>();\n\n for (const row of rowModel.flatRows) {\n const value = row.getValue(columnId);\n if (Array.isArray(value)) {\n for (const v of value) {\n counts.set(v, (counts.get(v) ?? 0) + 1);\n }\n } else {\n counts.set(value, (counts.get(value) ?? 0) + 1);\n }\n }\n\n return counts;\n}\n\n/**\n * Compute min and max numeric values for a given column.\n * Returns [min, max] or undefined if no numeric values exist.\n */\nexport function getFacetedMinMaxValues<TData>(\n rowModel: RowModel<TData>,\n columnId: string,\n): [number, number] | undefined {\n let min = Infinity;\n let max = -Infinity;\n let hasValue = false;\n\n for (const row of rowModel.flatRows) {\n const raw = row.getValue(columnId);\n const value = typeof raw === \"number\" ? raw : Number(raw);\n if (!Number.isNaN(value)) {\n hasValue = true;\n if (value < min) min = value;\n if (value > max) max = value;\n }\n }\n\n return hasValue ? [min, max] : undefined;\n}\n\n/**\n * Get a filtered row model scoped to a single column's facet.\n * Returns a row model that excludes the given column's own filter,\n * so the facet counts reflect what would be available if that\n * specific filter were removed.\n */\nexport function getFacetedRowModel<TData>(\n preFilteredRowModel: RowModel<TData>,\n columnId: string,\n allFilteredRowModel: RowModel<TData>,\n): RowModel<TData> {\n return preFilteredRowModel;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/transport/registry.ts","../src/active-store.ts","../src/view/prisma-compile.ts","../src/view/types.ts","../src/transport/rest.ts","../src/object-path.ts","../src/merge/loro.ts","../src/graph-query.ts","../src/graph-actions.ts","../src/graph-effects.ts","../src/schema.ts","../src/ai-interop.ts","../src/local-first-runtime.ts","../src/devtools-event-bus.ts","../src/devtools-time-travel.ts","../src/view/incremental.ts","../src/agent/json-patch.ts","../src/agent/ag-ui-bridge.ts","../src/adapters/realtime-manager.ts","../src/adapters/realtime-adapters.ts","../src/adapters/surreal-live.ts","../src/adapters/flint.ts","../src/adapters/electricsql.ts","../src/adapters/electricsql-tenant.ts","../src/adapters/pglite-persistence.ts","../src/adapters/tauri-sql-persistence.ts","../src/schema-from-sql.ts","../src/table/row-models.ts","../src/table/faceting.ts"],"names":["message","clone","idx","isObject","id","DEFAULT_TABLE","rows"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Typed errors used throughout 2.0 to drive retry policy and consumer\n * UI decisions.\n *\n * Why two classes (not a discriminator field):\n * - `instanceof` checks are zero-cost at runtime and survive bundler\n * minification of property names.\n * - Consumers can write `if (error instanceof TerminalError) renderInline()`\n * without importing a type-narrowing helper.\n * - The engine's retry policy is one `instanceof TransientError` check.\n *\n * 4xx → `TerminalError` (no retry — the request is structurally wrong:\n * unauthorized, not-found, schema mismatch, validation failure).\n *\n * 5xx + network failures → `TransientError` (engine retries with\n * exponential backoff up to `maxRetries`).\n *\n * Custom transports can throw either class. The default REST helper\n * (`makeRestTransport`) maps HTTP status codes to the appropriate\n * class automatically.\n *\n * Both classes preserve the original error via the standard\n * `cause` option so stack traces survive the boundary.\n */\n\nexport interface EntityErrorOptions {\n /** HTTP status if the underlying transport was HTTP. */\n status?: number;\n /** Original thrown value (`Error`, `Response`, anything). */\n cause?: unknown;\n}\n\n/**\n * Permanent failure — do not retry. The request will not succeed by\n * trying again with the same inputs.\n *\n * Typical sources: HTTP 4xx, missing tables, validation errors,\n * permission denied, schema mismatches.\n */\nexport class TerminalError extends Error {\n readonly kind = \"terminal\" as const;\n readonly status?: number;\n\n constructor(message: string, opts: EntityErrorOptions = {}) {\n super(message, { cause: opts.cause });\n this.name = \"TerminalError\";\n this.status = opts.status;\n // Preserve stack across minification / older runtimes.\n if (typeof (Error as { captureStackTrace?: unknown }).captureStackTrace === \"function\") {\n (Error as unknown as { captureStackTrace: (target: object, ctor: unknown) => void })\n .captureStackTrace(this, TerminalError);\n }\n }\n}\n\n/**\n * Temporary failure — safe to retry. The engine will retry with\n * exponential backoff up to the configured `maxRetries`.\n *\n * Typical sources: HTTP 5xx, network timeouts, fetch rejections,\n * dropped sockets.\n */\nexport class TransientError extends Error {\n readonly kind = \"transient\" as const;\n readonly status?: number;\n\n constructor(message: string, opts: EntityErrorOptions = {}) {\n super(message, { cause: opts.cause });\n this.name = \"TransientError\";\n this.status = opts.status;\n if (typeof (Error as { captureStackTrace?: unknown }).captureStackTrace === \"function\") {\n (Error as unknown as { captureStackTrace: (target: object, ctor: unknown) => void })\n .captureStackTrace(this, TransientError);\n }\n }\n}\n\n/**\n * Union of every typed error the library raises. Use on consumer-side\n * `error` props when both classes are possible.\n */\nexport type EntityError = TerminalError | TransientError;\n\n/**\n * Convert an unknown thrown value into a typed entity error.\n *\n * - Already-typed errors pass through.\n * - HTTP-status-bearing errors become Terminal (4xx) or Transient (5xx).\n * - `AbortError` / `DOMException` \"AbortError\" → Terminal (caller\n * cancelled; not worth retrying).\n * - Everything else → Transient (assume retryable; better than\n * accidentally permanently failing on a one-off network blip).\n */\nexport function toEntityError(err: unknown): EntityError {\n if (err instanceof TerminalError) return err;\n if (err instanceof TransientError) return err;\n\n // Abort surfaces as DOMException(\"AbortError\") in browsers and as\n // `Error` with name \"AbortError\" in node — treat both as terminal.\n if (err && typeof err === \"object\" && \"name\" in err && (err as { name?: unknown }).name === \"AbortError\") {\n return new TerminalError(\"Aborted\", { cause: err });\n }\n\n // Plain object with a `status` field (e.g. a thrown Response or\n // PostgrestError shape).\n if (err && typeof err === \"object\" && \"status\" in err) {\n const status = Number((err as { status?: unknown }).status);\n const message = (err && typeof err === \"object\" && \"message\" in err)\n ? String((err as { message?: unknown }).message ?? `HTTP ${status}`)\n : `HTTP ${status}`;\n if (Number.isFinite(status) && status >= 400 && status < 500) {\n return new TerminalError(message, { status, cause: err });\n }\n if (Number.isFinite(status) && status >= 500) {\n return new TransientError(message, { status, cause: err });\n }\n }\n\n const message = err instanceof Error ? err.message : String(err);\n return new TransientError(message, { cause: err });\n}\n","/**\n * Process-global registry of `EntityTransport` instances by entity type.\n *\n * Why global state: every consumer of `useEntities(\"Client\")` must\n * resolve the SAME transport. Threading a registry through React\n * context would require every test, every isolated story, every\n * non-React caller (engine internals) to plumb the context — a tax\n * that buys nothing. The 1.x library already used module-global state\n * for the `useGraphStore` Zustand store; this follows the same shape.\n *\n * The registry is mutable: re-registering a type silently replaces the\n * prior transport (tests rely on this; production code should only\n * register once at app boot).\n */\n\nimport type { EntityType } from \"../graph\";\nimport type { EntityTransport } from \"./types\";\n\n// Keyed by entity type. `unknown` because each entity has a different\n// row shape; consumers cast at the `getEntityTransport<T>(type)` call site.\nconst transports = new Map<EntityType, EntityTransport<object>>();\n\n/**\n * Register the transport for an entity type. Called once per type at\n * app boot, typically from `src/shared/db/entity-transports.ts` in the\n * consuming application.\n *\n * Re-registering REPLACES the prior transport — useful for tests, a\n * footgun for production code. If you find yourself re-registering at\n * runtime, you almost certainly want a different design.\n */\nexport function registerEntityTransport<T extends object>(\n type: EntityType,\n transport: EntityTransport<T>,\n): void {\n transports.set(type, transport as unknown as EntityTransport<object>);\n}\n\n/**\n * Look up the transport for an entity type. Throws if none is\n * registered — there is no \"default\" transport, by design.\n *\n * The cast to `EntityTransport<T>` is the API ergonomic\n * compromise that lets call sites stay generic; the registry stores\n * `EntityTransport<object>` because TypeScript can't otherwise unify\n * heterogeneous rows in one map.\n */\nexport function getEntityTransport<T extends object>(\n type: EntityType,\n): EntityTransport<T> {\n const t = transports.get(type);\n if (!t) {\n throw new Error(\n `[entity-management] No transport registered for entity type \"${type}\". ` +\n `Call registerEntityTransport(\"${type}\", ...) at app boot.`,\n );\n }\n return t as unknown as EntityTransport<T>;\n}\n\n/**\n * Test-only: clear ALL registered transports. Production code should\n * never need this; tests use it to reset between specs.\n */\nexport function __resetEntityTransports(): void {\n transports.clear();\n}\n\n/**\n * Introspection: how many transports are currently registered.\n * Useful for asserting in tests that boot wiring ran exactly once.\n */\nexport function getRegisteredEntityTypes(): EntityType[] {\n return Array.from(transports.keys());\n}\n","/**\n * Active-graph resolution for imperative (non-hook) access.\n *\n * `GraphStoreProvider` scopes the React *hook* surface, but imperative callers —\n * Zustand store actions, module-level helpers, mutation callbacks — have no\n * React context to read. Before this module they had no way to reach a scoped\n * graph at all, so a mounted provider silently failed to isolate them.\n *\n * Two independent mechanisms, both opt-in, both falling back to the package\n * singleton so existing consumers are unaffected:\n *\n * 1. `setActiveGraphStore(store)` — a module-level active store. Correct in the\n * browser, where there is exactly one application tree. `GraphStoreProvider`\n * sets it on mount and restores the previous value on unmount.\n *\n * 2. `runWithGraphStore(store, fn)` — an `AsyncLocalStorage` scope. Required on\n * the server, where concurrent requests interleave and a module-level value\n * would leak across them.\n *\n * ALS takes precedence: if a request scope is active it always wins over the\n * module-level value, because a server render must never observe another\n * request's graph.\n *\n * ## Why `node:async_hooks` is loaded lazily\n *\n * This package is bundled for the browser as well as Node. A static\n * `import \"node:async_hooks\"` would break browser builds and pull a polyfill\n * into client bundles. The import is therefore attempted once, at first use of\n * `runWithGraphStore`, and failure degrades to the module-level mechanism\n * rather than throwing.\n */\n\nimport type { GraphStore } from \"./graph\";\n\n/**\n * Declared locally rather than pulling in `@types/node`: this package targets\n * the browser too, and these are only touched behind the `typeof` guards below.\n * Mirrors how `entity-graph-react` declares `process` for its NODE_ENV check.\n */\ndeclare const process: { versions?: { node?: string } } | undefined;\ndeclare const module: { require?: (id: string) => unknown } | undefined;\ndeclare const require: ((id: string) => unknown) | undefined;\n\n/** Minimal shape we need; avoids a type dependency on `node:async_hooks`. */\ninterface AsyncStore<T> {\n getStore(): T | undefined;\n run<R>(store: T, fn: () => R): R;\n}\n\nlet moduleActiveStore: GraphStore | null = null;\nlet asyncScope: AsyncStore<GraphStore> | null = null;\nlet asyncScopeAttempted = false;\n\n/** True when the runtime looks like Node (and so may have `node:async_hooks`). */\nfunction isNodeLike(): boolean {\n return (\n typeof process !== \"undefined\" &&\n typeof (process as { versions?: { node?: string } }).versions?.node === \"string\"\n );\n}\n\n/**\n * Load `AsyncLocalStorage` if this runtime has it.\n *\n * Returns `null` in the browser (and in any runtime without `node:async_hooks`),\n * which is the signal to fall back to the module-level store.\n */\nfunction resolveAsyncScope(): AsyncStore<GraphStore> | null {\n if (asyncScopeAttempted) return asyncScope;\n asyncScopeAttempted = true;\n if (!isNodeLike()) return null;\n try {\n // Indirect require so bundlers do not statically resolve it into browser\n // builds. Present under CJS; absent under pure ESM, where `prepareGraphStoreScope()`\n // must be awaited once at startup instead.\n const req =\n typeof module !== \"undefined\" && typeof module.require === \"function\"\n ? module.require\n : typeof require === \"function\"\n ? require\n : null;\n if (!req) return null;\n const { AsyncLocalStorage } = req(\"node:async_hooks\") as {\n AsyncLocalStorage: new () => AsyncStore<GraphStore>;\n };\n asyncScope = new AsyncLocalStorage();\n } catch {\n asyncScope = null;\n }\n return asyncScope;\n}\n\n/**\n * Initialise request scoping on runtimes without a synchronous `require`.\n *\n * Under **pure ESM** there is no `require`, so the synchronous path above cannot\n * load `node:async_hooks` and `runWithGraphStore` would silently degrade to the\n * module-level store — which does NOT isolate concurrent requests. An ESM server\n * must therefore `await prepareGraphStoreScope()` once during startup, before\n * serving traffic.\n *\n * Safe to call anywhere: it resolves to `false` in the browser and is idempotent.\n */\nexport async function prepareGraphStoreScope(): Promise<boolean> {\n if (asyncScope) return true;\n if (!isNodeLike()) {\n asyncScopeAttempted = true;\n return false;\n }\n if (resolveAsyncScope()) return true;\n try {\n // Specifier held in a variable so TS does not try to resolve @types/node,\n // and so bundlers cannot statically pull it into browser output.\n const specifier = \"node:async_hooks\";\n const mod = (await import(/* @vite-ignore */ specifier)) as unknown as {\n AsyncLocalStorage: new () => AsyncStore<GraphStore>;\n };\n asyncScope = new mod.AsyncLocalStorage();\n asyncScopeAttempted = true;\n return true;\n } catch {\n asyncScopeAttempted = true;\n return false;\n }\n}\n\n/**\n * Set the process/tab-wide active graph.\n *\n * Returns a restore function; callers MUST invoke it on teardown so a nested or\n * remounted provider does not strand a stale store. Passing `null` clears it.\n */\nexport function setActiveGraphStore(store: GraphStore | null): () => void {\n const previous = moduleActiveStore;\n moduleActiveStore = store;\n return () => {\n moduleActiveStore = previous;\n };\n}\n\nlet warnedUnscopedFallback = false;\n\n/**\n * Warn once when request scoping silently degrades.\n *\n * Without this, an ESM server that never called `prepareGraphStoreScope()` gets\n * module-level fallback — which looks like it works single-threaded and leaks\n * across concurrent requests under load. Exactly the class of silent failure\n * this whole module exists to remove.\n */\nfunction warnUnscopedRequestFallback(): void {\n if (warnedUnscopedFallback || !isNodeLike()) return;\n warnedUnscopedFallback = true;\n console.warn(\n \"[entity-graph-core] runWithGraphStore() could not load node:async_hooks, so it fell back to a module-level store. Concurrent requests will NOT be isolated. Await prepareGraphStoreScope() once during server startup.\",\n );\n}\n\n/**\n * Run `fn` with `store` as the active graph for this async context.\n *\n * This is the server-side entry point: an SSR host wraps each request so that\n * concurrent renders never share entity state. When the runtime has no\n * `AsyncLocalStorage`, `fn` still runs — under the module-level store — rather\n * than failing, so isomorphic code does not need a branch.\n */\nexport function runWithGraphStore<R>(store: GraphStore, fn: () => R): R {\n const scope = resolveAsyncScope();\n if (!scope) {\n warnUnscopedRequestFallback();\n const restore = setActiveGraphStore(store);\n try {\n return fn();\n } finally {\n restore();\n }\n }\n return scope.run(store, fn);\n}\n\n/**\n * The graph imperative access should target right now.\n *\n * Precedence: request scope (ALS) → module-level active store → `fallback`.\n * `fallback` is the package singleton, supplied by the caller to avoid a\n * circular import with `graph.ts`.\n */\nexport function resolveActiveGraphStore(fallback: GraphStore): GraphStore {\n const scoped = resolveAsyncScope()?.getStore();\n if (scoped) return scoped;\n return moduleActiveStore ?? fallback;\n}\n\n/** Test seam: drop all active-store state. */\nexport function __resetActiveGraphStore(): void {\n moduleActiveStore = null;\n asyncScope = null;\n asyncScopeAttempted = false;\n warnedUnscopedFallback = false;\n}\n","import type { FilterClause, FilterGroup, FilterSpec, SortSpec } from \"./types\";\n\n/**\n * Nests a leaf Prisma field filter under dotted paths (e.g. `author.name` → `{ author: { name: { … } } }`).\n */\nfunction nestWhereField(parts: string[], leaf: unknown): Record<string, unknown> {\n if (parts.length === 0) return {};\n if (parts.length === 1) return { [parts[0]]: leaf };\n return { [parts[0]]: nestWhereField(parts.slice(1), leaf) };\n}\n\nfunction clauseToPrismaLeaf(c: FilterClause): Record<string, unknown> | null {\n switch (c.op) {\n case \"eq\":\n return { equals: c.value };\n case \"neq\":\n return { not: c.value };\n case \"gt\":\n return { gt: c.value };\n case \"gte\":\n return { gte: c.value };\n case \"lt\":\n return { lt: c.value };\n case \"lte\":\n return { lte: c.value };\n case \"contains\":\n return { contains: c.value, mode: \"insensitive\" };\n case \"startsWith\":\n return { startsWith: c.value, mode: \"insensitive\" };\n case \"endsWith\":\n return { endsWith: c.value, mode: \"insensitive\" };\n case \"in\":\n return { in: c.value };\n case \"nin\":\n return { notIn: c.value };\n case \"arrayContains\":\n return { has: c.value };\n case \"between\":\n case \"arrayOverlaps\":\n case \"matches\":\n case \"custom\":\n default:\n return null;\n }\n}\n\nfunction clauseToPrismaEntry(c: FilterClause): Record<string, unknown> | null {\n const parts = c.field.split(\".\").filter(Boolean);\n if (parts.length === 0) return null;\n\n if (c.op === \"isNull\") {\n /** `value` truthy → equals null; falsy → `{ not: null }` (see Prisma adapter docs). */\n const equalsNull = c.value === undefined || c.value === true;\n return nestWhereField(parts, equalsNull ? null : { not: null });\n }\n if (c.op === \"isNotNull\") {\n return nestWhereField(parts, { not: null });\n }\n\n const leaf = clauseToPrismaLeaf(c);\n if (leaf === null) return null;\n return nestWhereField(parts, leaf);\n}\n\nfunction groupToPrismaWhere(g: FilterGroup): Record<string, unknown> {\n const parts: Record<string, unknown>[] = [];\n for (const item of g.clauses) {\n if (\"logic\" in item) {\n const nested = groupToPrismaWhere(item);\n if (Object.keys(nested).length > 0) parts.push(nested);\n } else {\n const entry = clauseToPrismaEntry(item);\n if (entry) parts.push(entry);\n }\n }\n if (parts.length === 0) return {};\n if (parts.length === 1) return parts[0];\n return g.logic === \"or\" ? { OR: parts } : { AND: parts };\n}\n\n/**\n * Compiles a {@link FilterSpec} into a Prisma `where` object (plain JSON-serializable shape).\n *\n * Operator mapping matches common Prisma filter APIs: `eq` → `equals`, string ops use `mode: \"insensitive\"`,\n * `nin` → `notIn`, `arrayContains` → `has`, `isNull` uses `null` / `{ not: null }` per `value`, and `isNotNull` → `{ not: null }`.\n * Unsupported ops (`between`, `arrayOverlaps`, `matches`, `custom`) are omitted from the result.\n *\n * Top-level clause arrays are combined with `AND`. {@link FilterGroup} uses `AND` / `OR` to match `group.logic`.\n */\nexport function toPrismaWhere(filter: FilterSpec): Record<string, unknown> {\n if (Array.isArray(filter)) {\n const parts: Record<string, unknown>[] = [];\n for (const item of filter) {\n const entry = clauseToPrismaEntry(item);\n if (entry) parts.push(entry);\n }\n if (parts.length === 0) return {};\n if (parts.length === 1) return parts[0];\n return { AND: parts };\n }\n return groupToPrismaWhere(filter);\n}\n\n/**\n * Compiles a {@link SortSpec} into Prisma `orderBy` form: `[{ fieldName: \"asc\" | \"desc\" }, …]`.\n * `nulls` and `comparator` on {@link SortClause} are ignored (local-only); extend callers if your Prisma version supports null ordering.\n */\nexport function toPrismaOrderBy(sort: SortSpec): Record<string, string>[] {\n return sort.map((s) => ({ [s.field]: s.direction }));\n}\n","/**\n * Transport-agnostic comparison operators. Same spec can compile to REST, SQL, GraphQL, or local JS (`evaluator`).\n * `custom` opts out of automatic serialization — use for predicates only the client can evaluate.\n */\nexport type FilterOperator = \"eq\"|\"neq\"|\"gt\"|\"gte\"|\"lt\"|\"lte\"|\"in\"|\"nin\"|\"contains\"|\"startsWith\"|\"endsWith\"|\"isNull\"|\"isNotNull\"|\"between\"|\"arrayContains\"|\"arrayOverlaps\"|\"matches\"|\"custom\";\n/** Atomic filter: field path, operator, optional value, and optional JS predicate for `custom`. */\nexport interface FilterClause { field: string; op: FilterOperator; value?: unknown; predicate?: (fieldValue: unknown, entity: Record<string, unknown>) => boolean; }\nexport type FilterLogic = \"and\" | \"or\";\n/** Nested boolean group so you can express `(A AND B) OR C` without losing structure when compiling to backends. */\nexport interface FilterGroup { logic: FilterLogic; clauses: Array<FilterClause | FilterGroup>; }\n/** Top-level filter: flat AND list of clauses, or a recursive `FilterGroup`. */\nexport type FilterSpec = FilterGroup | FilterClause[];\nexport type SortDirection = \"asc\" | \"desc\";\n/** Single sort key with optional null ordering and custom comparator for local sort parity with remote semantics. */\nexport interface SortClause { field: string; direction: SortDirection; nulls?: \"first\" | \"last\"; comparator?: (a: unknown, b: unknown) => number; }\n/** Ordered multi-key sort (stable application in `compareEntities`). */\nexport type SortSpec = SortClause[];\n/**\n * Everything `useEntityView` needs to describe a virtualized collection: filters, sorts, and simple multi-field search.\n * One descriptor can drive local evaluation, remote query compilation, or hybrid mode.\n */\nexport interface ViewDescriptor { filter?: FilterSpec; sort?: SortSpec; search?: { query: string; fields: string[]; minChars?: number }; }\n/**\n * How complete local graph data is relative to the view: **local** (all in memory), **remote** (server must filter/sort), **hybrid** (show local fast + remote reconcile).\n */\nexport type CompletenessMode = \"local\" | \"remote\" | \"hybrid\";\n\n/**\n * Compile a view to flat REST query params (`sort`, `q`, and `field[op]=value` keys). Skips `custom` clauses — those cannot be expressed as strings.\n */\nexport function toRestParams(view: ViewDescriptor): Record<string, string> {\n const params: Record<string, string> = {};\n if (view.filter) { const clauses = flattenClauses(view.filter); for (const c of clauses) { if (c.op === \"custom\") continue; const key = c.op === \"eq\" ? c.field : `${c.field}[${c.op}]`; params[key] = Array.isArray(c.value) ? (c.value as unknown[]).join(\",\") : String(c.value ?? \"\"); } }\n if (view.sort) params[\"sort\"] = view.sort.map((s) => `${s.direction === \"desc\" ? \"-\" : \"\"}${s.field}`).join(\",\");\n if (view.search?.query) params[\"q\"] = view.search.query;\n return params;\n}\n\n/**\n * Compile a view to parameterized SQL fragments for server-side filtering/sorting. Unknown ops become `TRUE` — validate or restrict ops at the edge.\n */\nexport function toSQLClauses(view: ViewDescriptor): { where: string; orderBy: string; params: unknown[] } {\n const params: unknown[] = []; let paramIdx = 1;\n function clauseToSQL(c: FilterClause): string {\n const col = `\"${c.field}\"`;\n switch (c.op) {\n case \"eq\": params.push(c.value); return `${col} = $${paramIdx++}`;\n case \"neq\": params.push(c.value); return `${col} != $${paramIdx++}`;\n case \"gt\": params.push(c.value); return `${col} > $${paramIdx++}`;\n case \"gte\": params.push(c.value); return `${col} >= $${paramIdx++}`;\n case \"lt\": params.push(c.value); return `${col} < $${paramIdx++}`;\n case \"lte\": params.push(c.value); return `${col} <= $${paramIdx++}`;\n case \"in\": params.push(c.value); return `${col} = ANY($${paramIdx++})`;\n case \"nin\": params.push(c.value); return `${col} != ALL($${paramIdx++})`;\n case \"isNull\": return `${col} IS NULL`;\n case \"isNotNull\": return `${col} IS NOT NULL`;\n case \"contains\": params.push(`%${c.value}%`); return `${col} ILIKE $${paramIdx++}`;\n case \"startsWith\": params.push(`${c.value}%`); return `${col} ILIKE $${paramIdx++}`;\n case \"between\": { const [lo, hi] = c.value as [unknown, unknown]; params.push(lo, hi); return `${col} BETWEEN $${paramIdx++} AND $${paramIdx++}`; }\n case \"arrayContains\": params.push(c.value); return `$${paramIdx++} = ANY(${col})`;\n default: return \"TRUE\";\n }\n }\n function groupToSQL(g: FilterGroup): string {\n const parts = g.clauses.map((c) => \"logic\" in c ? `(${groupToSQL(c)})` : clauseToSQL(c));\n return parts.join(` ${g.logic.toUpperCase()} `);\n }\n let where = \"TRUE\";\n if (view.filter) { if (Array.isArray(view.filter)) where = view.filter.map(clauseToSQL).join(\" AND \") || \"TRUE\"; else where = groupToSQL(view.filter) || \"TRUE\"; }\n if (view.search?.query) { params.push(`%${view.search.query}%`); where += ` AND (${view.search.fields.map((f) => `\"${f}\"`).join(\" || ' ' || \")}) ILIKE $${paramIdx++}`; }\n const orderBy = view.sort ? view.sort.map((s) => `\"${s.field}\" ${s.direction.toUpperCase()}${s.nulls ? ` NULLS ${s.nulls.toUpperCase()}` : \"\"}`).join(\", \") : \"\";\n return { where, orderBy, params };\n}\n\n/**\n * Produce a GraphQL-variable-shaped object from a view (Hasura/Postgraphile-style `_op` maps). Intended as a starting point — wire to your actual schema.\n */\nexport function toGraphQLVariables(view: ViewDescriptor) {\n const result: { where?: Record<string, unknown>; orderBy?: Array<Record<string, unknown>>; search?: string } = {};\n if (view.filter) { const clauses = flattenClauses(view.filter); const where: Record<string, unknown> = {}; for (const c of clauses) { if (c.op === \"custom\") continue; where[c.field] = { [`_${c.op}`]: c.value }; } if (Object.keys(where).length) result.where = where; }\n if (view.sort) result.orderBy = view.sort.map((s) => ({ [s.field]: s.direction === \"desc\" ? \"desc_nulls_last\" : \"asc_nulls_last\" }));\n if (view.search?.query) result.search = view.search.query;\n return result;\n}\n\n/** Prisma `where` / `orderBy` compilers (JSON-serializable; pair with a route that passes them to `prisma.*.findMany`). */\nexport { toPrismaWhere, toPrismaOrderBy } from \"./prisma-compile\";\n\n/**\n * Normalize nested `FilterGroup` trees to a flat clause list for compilers that only understand atomic predicates.\n */\nexport function flattenClauses(filter: FilterSpec): FilterClause[] {\n if (Array.isArray(filter)) return filter;\n function walk(g: FilterGroup): FilterClause[] { return g.clauses.flatMap((c) => (\"logic\" in c ? walk(c) : [c])); }\n return walk(filter);\n}\n\n/** True if any clause requires client-side `predicate` logic — forces local/hybrid evaluation paths that cannot be pushed to generic REST/SQL. */\nexport function hasCustomPredicates(filter: FilterSpec): boolean { return flattenClauses(filter).some((c) => c.op === \"custom\"); }\n","/**\n * `makeRestTransport` — built-in helper for the most common case: a\n * Supabase / PostgREST backend reached through a `SupabaseClient`-like\n * object.\n *\n * Why a helper (not a class): consumers stay declarative —\n * registerEntityTransport(\"Client\",\n * makeRestTransport<Client>({ supabase, table: \"client\" }));\n * — and the library never imports `@supabase/supabase-js` directly\n * (peer-dep-free).\n *\n * The transport:\n * - Compiles `ListQuery` (filter / sort / search / cursor / limit)\n * into a PostgREST query via the supabase-js builder.\n * - Maps HTTP status to `TerminalError` (4xx) or `TransientError`\n * (5xx / network).\n * - Honours `AbortSignal` via supabase-js `.abortSignal(signal)`.\n * - Returns `total` from PostgREST `count: 'exact'` when requested.\n */\n\nimport { TerminalError, TransientError, toEntityError } from \"../errors\";\nimport type { FilterClause, FilterGroup, FilterSpec, SortClause } from \"../view/types\";\nimport { flattenClauses } from \"../view/types\";\nimport type { ChangeEvent, EntityTransport, ListQuery, ListResult } from \"./types\";\n\n/**\n * Minimal slice of the `@supabase/supabase-js` `SupabaseClient` we use.\n * Declared structurally so the library does not need to import the\n * package as a dependency (peer-dep-free).\n */\nexport interface SupabaseLike {\n from: (table: string) => SupabaseQueryBuilderLike;\n}\n\n/**\n * Subset of the supabase-js builder we exercise. Each call returns the\n * same builder for chaining; `then`-able at the end resolves to\n * `{ data, error, count, status }`.\n */\nexport interface SupabaseQueryBuilderLike {\n select: (columns: string, opts?: { count?: \"exact\" | \"planned\" | \"estimated\"; head?: boolean }) => SupabaseQueryBuilderLike;\n eq: (col: string, val: unknown) => SupabaseQueryBuilderLike;\n neq: (col: string, val: unknown) => SupabaseQueryBuilderLike;\n gt: (col: string, val: unknown) => SupabaseQueryBuilderLike;\n gte: (col: string, val: unknown) => SupabaseQueryBuilderLike;\n lt: (col: string, val: unknown) => SupabaseQueryBuilderLike;\n lte: (col: string, val: unknown) => SupabaseQueryBuilderLike;\n in: (col: string, vals: readonly unknown[]) => SupabaseQueryBuilderLike;\n ilike: (col: string, pattern: string) => SupabaseQueryBuilderLike;\n is: (col: string, val: null | boolean) => SupabaseQueryBuilderLike;\n or: (filter: string) => SupabaseQueryBuilderLike;\n order: (col: string, opts?: { ascending?: boolean; nullsFirst?: boolean }) => SupabaseQueryBuilderLike;\n range: (from: number, to: number) => SupabaseQueryBuilderLike;\n limit: (n: number) => SupabaseQueryBuilderLike;\n abortSignal?: (signal: AbortSignal) => SupabaseQueryBuilderLike;\n then: <TResult1 = unknown, TResult2 = never>(\n onfulfilled?: ((value: { data: unknown; error: unknown; count?: number | null; status?: number }) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ) => Promise<TResult1 | TResult2>;\n}\n\n/** Options for `makeRestTransport`. */\nexport interface MakeRestTransportOptions<T extends object> {\n /** A `@supabase/supabase-js` client (or any structurally-compatible thing). */\n supabase: SupabaseLike;\n /** PostgREST table name. */\n table: string;\n /** Columns to select (default `\"*\"`). */\n select?: string;\n /** Stable id derivation. Defaults to `(row) => String(row.id)`. */\n identify?: (row: T) => string;\n /** Whether the local cache is treated as authoritative. */\n authoritative?: boolean;\n /** Stale-time hint in ms. */\n staleTime?: number;\n /** Free-text search column list (compiled to `or=col.ilike.*query*,…`). */\n searchColumns?: string[];\n /** Default page size when `ListQuery.limit` is absent. */\n defaultLimit?: number;\n}\n\n/**\n * Build an `EntityTransport<T>` from a Supabase client + a table name.\n *\n * The returned transport:\n * - Maps `ListQuery.filter` clauses to PostgREST operators (`eq`, `gt`,\n * `in`, `ilike`, `is null`, etc.).\n * - Compiles `ListQuery.search` into an `or=` clause across\n * `searchColumns`.\n * - Uses `count: 'exact'` on first page to surface `total`.\n * - Throws `TerminalError` on 4xx (no retry); `TransientError` on 5xx\n * or network failure.\n * - Honours `signal` via `.abortSignal(signal)` (supabase-js >= 2.39).\n */\nexport function makeRestTransport<T extends object>(\n opts: MakeRestTransportOptions<T>,\n): EntityTransport<T> {\n const {\n supabase,\n table,\n select = \"*\",\n identify = (row: T) => String((row as { id?: unknown }).id),\n authoritative = false,\n staleTime,\n searchColumns = [],\n defaultLimit = 200,\n } = opts;\n\n return {\n identify,\n authoritative,\n staleTime,\n\n async list(q: ListQuery): Promise<ListResult<T>> {\n const limit = q.limit ?? defaultLimit;\n const offset = typeof q.cursor === \"number\" ? q.cursor : 0;\n\n let builder = supabase\n .from(table)\n .select(select, { count: offset === 0 ? \"exact\" : undefined });\n\n // Apply filter\n if (q.filter) builder = applyFilter(builder, q.filter);\n\n // Apply search across configured columns\n if (q.search && searchColumns.length > 0) {\n const escaped = q.search.replace(/[%,()]/g, \"\"); // PostgREST safety\n const orClause = searchColumns\n .map((c) => `${c}.ilike.*${escaped}*`)\n .join(\",\");\n builder = builder.or(orClause);\n }\n\n // Apply sort\n if (q.sort) {\n for (const s of q.sort as SortClause[]) {\n builder = builder.order(s.field, {\n ascending: s.direction === \"asc\",\n nullsFirst: s.nulls === \"first\",\n });\n }\n }\n\n // Page\n builder = builder.range(offset, offset + limit - 1);\n\n // Abort\n if (q.signal && builder.abortSignal) builder = builder.abortSignal(q.signal);\n\n const result = (await builder) as { data: unknown; error: unknown; count?: number | null; status?: number };\n\n if (result.error) {\n throw mapPostgrestError(result.error, result.status);\n }\n\n const rows = (result.data as T[] | null) ?? [];\n const total = typeof result.count === \"number\" ? result.count : null;\n const nextCursor = rows.length === limit ? offset + limit : null;\n return { rows, total, nextCursor };\n },\n };\n}\n\n/** Compile a `FilterSpec` against a supabase-js builder. */\nfunction applyFilter(\n builder: SupabaseQueryBuilderLike,\n filter: FilterSpec,\n): SupabaseQueryBuilderLike {\n // PostgREST does not have nested OR/AND of arbitrary depth in the\n // builder API, so we flatten and concatenate top-level AND clauses.\n // Nested OR groups become an `.or()` string clause.\n if (!Array.isArray(filter) && (filter as FilterGroup).logic === \"or\") {\n const parts = (filter as FilterGroup).clauses\n .filter((c): c is FilterClause => !(\"logic\" in c))\n .map((c) => clauseToOrFragment(c))\n .filter((s): s is string => !!s);\n if (parts.length > 0) return builder.or(parts.join(\",\"));\n return builder;\n }\n const clauses = flattenClauses(filter);\n let b = builder;\n for (const c of clauses) {\n b = applyClause(b, c);\n }\n return b;\n}\n\nfunction applyClause(\n builder: SupabaseQueryBuilderLike,\n c: FilterClause,\n): SupabaseQueryBuilderLike {\n switch (c.op) {\n case \"eq\": return builder.eq(c.field, c.value);\n case \"neq\": return builder.neq(c.field, c.value);\n case \"gt\": return builder.gt(c.field, c.value);\n case \"gte\": return builder.gte(c.field, c.value);\n case \"lt\": return builder.lt(c.field, c.value);\n case \"lte\": return builder.lte(c.field, c.value);\n case \"in\": return builder.in(c.field, c.value as readonly unknown[]);\n case \"isNull\": return builder.is(c.field, null);\n case \"isNotNull\": return builder.neq(c.field, null);\n case \"contains\": return builder.ilike(c.field, `%${String(c.value)}%`);\n case \"startsWith\": return builder.ilike(c.field, `${String(c.value)}%`);\n case \"endsWith\": return builder.ilike(c.field, `%${String(c.value)}`);\n case \"matches\": return builder.ilike(c.field, String(c.value));\n case \"custom\": return builder; // local-only predicate; skip on server\n default: return builder;\n }\n}\n\n/** Map a single clause to a PostgREST `or=` fragment (e.g. `name.eq.foo`). */\nfunction clauseToOrFragment(c: FilterClause): string | null {\n const v = encodeURIComponent(String(c.value ?? \"\"));\n switch (c.op) {\n case \"eq\": return `${c.field}.eq.${v}`;\n case \"neq\": return `${c.field}.neq.${v}`;\n case \"gt\": return `${c.field}.gt.${v}`;\n case \"gte\": return `${c.field}.gte.${v}`;\n case \"lt\": return `${c.field}.lt.${v}`;\n case \"lte\": return `${c.field}.lte.${v}`;\n case \"isNull\": return `${c.field}.is.null`;\n case \"isNotNull\": return `${c.field}.not.is.null`;\n case \"contains\": return `${c.field}.ilike.*${v}*`;\n case \"startsWith\": return `${c.field}.ilike.${v}*`;\n case \"endsWith\": return `${c.field}.ilike.*${v}`;\n default: return null;\n }\n}\n\n/** Convert a PostgREST error envelope into one of our typed errors. */\nfunction mapPostgrestError(error: unknown, status?: number): TerminalError | TransientError {\n // Already a typed entity error (a custom transport could rethrow these)\n if (error instanceof TerminalError || error instanceof TransientError) return error;\n\n // PostgrestError has `.code`, `.message`, `.details`, `.hint`.\n const message = (error && typeof error === \"object\" && \"message\" in error)\n ? String((error as { message?: unknown }).message ?? \"Unknown REST error\")\n : String(error);\n\n // Some PostgREST errors carry their HTTP status only on the outer\n // response. If `status` is provided we trust it.\n if (typeof status === \"number\") {\n if (status >= 400 && status < 500) {\n return new TerminalError(message, { status, cause: error });\n }\n if (status >= 500) {\n return new TransientError(message, { status, cause: error });\n }\n }\n\n // Postgres \"relation does not exist\" → 42P01 → terminal.\n const code = (error && typeof error === \"object\" && \"code\" in error)\n ? String((error as { code?: unknown }).code ?? \"\")\n : \"\";\n if (code === \"42P01\" || code === \"PGRST116\" || code === \"PGRST106\") {\n return new TerminalError(message, { cause: error });\n }\n\n return toEntityError(error);\n}\n\nexport type { ChangeEvent };\n","function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function getValueAtPath<T = unknown>(source: unknown, path: string): T | undefined {\n if (!path) return source as T;\n const segments = path.split(\".\").filter(Boolean);\n let current: unknown = source;\n for (const segment of segments) {\n if (!isObject(current) && !Array.isArray(current)) return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current as T | undefined;\n}\n\nexport function setValueAtPath<T extends object>(source: T, path: string, value: unknown): T {\n const segments = path.split(\".\").filter(Boolean);\n if (segments.length === 0) return source;\n\n const clone = structuredClone(source) as Record<string, unknown>;\n let current: Record<string, unknown> = clone;\n\n for (let index = 0; index < segments.length - 1; index += 1) {\n const segment = segments[index];\n const next = current[segment];\n if (!isObject(next)) current[segment] = {};\n current = current[segment] as Record<string, unknown>;\n }\n\n current[segments[segments.length - 1]] = value;\n return clone as T;\n}\n\nexport function collectDirtyPaths(current: unknown, original: unknown, prefix = \"\", acc = new Set<string>()): Set<string> {\n if (isObject(current) && isObject(original)) {\n const keys = new Set([...Object.keys(current), ...Object.keys(original)]);\n for (const key of keys) {\n const nextPrefix = prefix ? `${prefix}.${key}` : key;\n collectDirtyPaths(current[key], original[key], nextPrefix, acc);\n }\n return acc;\n }\n\n if (JSON.stringify(current) !== JSON.stringify(original) && prefix) acc.add(prefix);\n return acc;\n}\n","/**\n * merge/loro.ts — Loro-backed CRDT MergeStrategy (reference implementation).\n *\n * Maps each entity (`type:id`) onto a Loro document whose root is an LWW-Map —\n * a near-1:1 fit for the graph's `type:id:field` model. Concurrent field writes\n * resolve via Loro's CRDT semantics rather than blind last-write-wins, so two\n * writers updating *different* fields never clobber each other, and writers\n * updating the *same* field resolve deterministically across replicas.\n *\n * `loro-crdt` is an OPTIONAL peer dependency. It is imported lazily so the core\n * bundle stays `zustand + immer` only — nothing loads Loro unless an app\n * actually registers `createLoroMergeStrategy()`.\n *\n * NOTE: `createLoroMergeStrategy` is async because it dynamically imports the\n * engine. Await it once at boot, then register the resolved synchronous\n * strategy. The returned strategy itself is pure+sync (the MergeStrategy\n * contract), keeping per-write resolution off the async path.\n */\n\nimport type { MergeStrategy } from \"./types\";\n\n/** Minimal surface of the `loro-crdt` LoroDoc we rely on (avoids a hard type dep). */\ninterface LoroDocLike {\n getMap(key: string): LoroMapLike;\n toJSON(): Record<string, unknown>;\n}\ninterface LoroMapLike {\n set(key: string, value: unknown): void;\n toJSON?(): Record<string, unknown>;\n}\ninterface LoroModuleLike {\n LoroDoc: new () => LoroDocLike;\n}\n\nexport type LoroModuleLoader = () => Promise<{ LoroDoc: unknown }>;\n\nconst ROOT_MAP = \"entity\";\nconst LORO_MODULE_SPECIFIER = \"loro-crdt\";\n\n/** Per-(type:id) Loro document cache so repeated writes converge on one CRDT. */\nconst docs = new Map<string, LoroDocLike>();\n\nfunction ek(type: string, id: string): string {\n return `${type}:${id}`;\n}\n\n/**\n * Build a Loro-backed {@link MergeStrategy}. Resolves `loro-crdt` lazily; throws\n * a clear error if the optional peer is not installed.\n *\n * @example\n * ```ts\n * const loro = await createLoroMergeStrategy();\n * registerMergeStrategy(\"Document\", loro);\n * ```\n */\nexport async function createLoroMergeStrategy(\n loadLoro?: LoroModuleLoader,\n): Promise<MergeStrategy> {\n let mod: LoroModuleLike;\n try {\n // `loro-crdt` is an OPTIONAL peer dependency for consumers. It is present as a\n // devDependency here (so CI can prove the merge math), but a consumer may not\n // install it — the runtime try/catch below is the real guard. `@ts-ignore`\n // (not `@ts-expect-error`) so this stays valid whether or not the module\n // resolves at type-check time in a given install.\n // @ts-ignore optional peer dependency, resolved at runtime\n const loaded = loadLoro\n ? await loadLoro()\n : await import(/* @vite-ignore */ LORO_MODULE_SPECIFIER);\n if (typeof loaded.LoroDoc !== \"function\") {\n throw new TypeError(\"loro-crdt did not export a LoroDoc constructor\");\n }\n mod = loaded as unknown as LoroModuleLike;\n } catch (cause) {\n throw new Error(\n \"[merge/loro] createLoroMergeStrategy requires the optional peer dependency 'loro-crdt'. \" +\n \"Install it with `pnpm add loro-crdt`.\",\n { cause },\n );\n }\n\n const { LoroDoc } = mod;\n\n return (prev, next, ctx) => {\n const key = ek(ctx.type, ctx.id);\n let doc = docs.get(key);\n if (!doc) {\n doc = new LoroDoc();\n docs.set(key, doc);\n // Seed the CRDT with any pre-existing canonical state so the first\n // CRDT write merges against known fields rather than an empty doc.\n if (prev) {\n const seed = doc.getMap(ROOT_MAP);\n for (const [k, v] of Object.entries(prev)) seed.set(k, v);\n }\n }\n\n const map = doc.getMap(ROOT_MAP);\n for (const [k, v] of Object.entries(next)) map.set(k, v);\n\n const root = doc.toJSON()[ROOT_MAP];\n return (root && typeof root === \"object\" ? (root as Record<string, unknown>) : { ...next });\n };\n}\n\n/** @internal Test-only. Clears the per-entity Loro doc cache. */\nexport function __resetLoroDocs(): void {\n docs.clear();\n}\n","import { useGraphStore } from \"./graph\";\nimport type { EntityId, EntitySnapshot, EntityType, QueryKey } from \"./graph\";\n\ntype GraphStore = ReturnType<typeof useGraphStore.getState>;\n\nexport type GraphIncludeMap = Record<string, GraphIncludeRelation>;\n\nexport type GraphIncludeRelation =\n | {\n type: EntityType;\n via: { kind: \"field\"; field: string };\n include?: GraphIncludeMap;\n }\n | {\n type: EntityType;\n via: { kind: \"array\"; field: string };\n include?: GraphIncludeMap;\n }\n | {\n type: EntityType;\n via: { kind: \"list\"; key: QueryKey | ((entity: Record<string, unknown>) => QueryKey | null | undefined) };\n include?: GraphIncludeMap;\n }\n | {\n type: EntityType;\n via: {\n kind: \"resolver\";\n resolve: (entity: Record<string, unknown>, store: GraphStore) => EntityId | EntityId[] | null | undefined;\n };\n include?: GraphIncludeMap;\n };\n\nexport interface GraphQueryOptions<TEntity extends object> {\n type: EntityType;\n id?: EntityId;\n ids?: EntityId[];\n listKey?: QueryKey;\n where?: (entity: EntitySnapshot<TEntity>) => boolean;\n sort?: (a: EntitySnapshot<TEntity>, b: EntitySnapshot<TEntity>) => number;\n include?: GraphIncludeMap;\n select?: ((entity: Record<string, unknown>) => unknown) | string[];\n}\n\ntype ProjectedRow = Record<string, unknown>;\n\nexport function queryOnce<TEntity extends object>(\n opts: GraphQueryOptions<TEntity> & { id: EntityId },\n): ProjectedRow | null;\nexport function queryOnce<TEntity extends object>(\n opts: GraphQueryOptions<TEntity>,\n): ProjectedRow[];\nexport function queryOnce<TEntity extends object>(\n opts: GraphQueryOptions<TEntity>,\n): ProjectedRow[] | ProjectedRow | null {\n const store = useGraphStore.getState();\n const ids = resolveCandidateIds(store, opts);\n let rows = ids\n .map((id) => store.readEntitySnapshot<TEntity>(opts.type, id))\n .filter((row): row is EntitySnapshot<TEntity> => row !== null);\n\n if (opts.where) rows = rows.filter(opts.where);\n if (opts.sort) rows = [...rows].sort(opts.sort);\n\n const projected = rows.map((row) => applySelection(projectRow(row, opts.include, store), opts.select));\n if (opts.id) return projected[0] ?? null;\n return projected;\n}\n\nexport const selectGraph = queryOnce;\n\nfunction resolveCandidateIds<TEntity extends object>(store: GraphStore, opts: GraphQueryOptions<TEntity>): EntityId[] {\n if (opts.id) return [opts.id];\n if (opts.ids) return opts.ids;\n if (opts.listKey) return store.lists[opts.listKey]?.ids ?? [];\n return Object.keys(store.entities[opts.type] ?? {});\n}\n\nfunction projectRow(\n row: EntitySnapshot<Record<string, unknown>>,\n include: GraphIncludeMap | undefined,\n store: GraphStore,\n): ProjectedRow {\n if (!include) return row;\n\n const projected: ProjectedRow = { ...row };\n for (const [key, relation] of Object.entries(include)) {\n const related = resolveRelation(row, relation, store);\n projected[key] = related;\n }\n return projected;\n}\n\nfunction resolveRelation(\n entity: Record<string, unknown>,\n relation: GraphIncludeRelation,\n store: GraphStore,\n): ProjectedRow | ProjectedRow[] | null {\n const include = relation.include;\n\n switch (relation.via.kind) {\n case \"field\": {\n const relatedId = entity[relation.via.field];\n if (typeof relatedId !== \"string\") return null;\n const related = store.readEntitySnapshot<Record<string, unknown>>(relation.type, relatedId);\n return related ? projectRow(related, include, store) : null;\n }\n case \"array\": {\n const ids = entity[relation.via.field];\n if (!Array.isArray(ids)) return [];\n return ids\n .map((id) => (typeof id === \"string\" ? store.readEntitySnapshot<Record<string, unknown>>(relation.type, id) : null))\n .filter((row): row is EntitySnapshot<Record<string, unknown>> => row !== null)\n .map((row) => projectRow(row, include, store));\n }\n case \"list\": {\n const key =\n typeof relation.via.key === \"function\"\n ? relation.via.key(entity)\n : relation.via.key;\n if (!key) return [];\n const ids = store.lists[key]?.ids ?? [];\n return ids\n .map((id) => store.readEntitySnapshot<Record<string, unknown>>(relation.type, id))\n .filter((row): row is EntitySnapshot<Record<string, unknown>> => row !== null)\n .map((row) => projectRow(row, include, store));\n }\n case \"resolver\": {\n const resolved = relation.via.resolve(entity, store);\n if (Array.isArray(resolved)) {\n return resolved\n .map((id) => store.readEntitySnapshot<Record<string, unknown>>(relation.type, id))\n .filter((row): row is EntitySnapshot<Record<string, unknown>> => row !== null)\n .map((row) => projectRow(row, include, store));\n }\n if (typeof resolved !== \"string\") return null;\n const related = store.readEntitySnapshot<Record<string, unknown>>(relation.type, resolved);\n return related ? projectRow(related, include, store) : null;\n }\n }\n}\n\nfunction applySelection(\n row: ProjectedRow,\n select: GraphQueryOptions<Record<string, unknown>>[\"select\"],\n): ProjectedRow {\n if (!select) return row;\n if (typeof select === \"function\") {\n const result = select(row as EntitySnapshot<Record<string, unknown>> & Record<string, unknown>);\n return (result && typeof result === \"object\" ? result : { value: result }) as ProjectedRow;\n }\n\n const picked: ProjectedRow = {};\n for (const key of select) {\n if (key in row) picked[key] = row[key];\n }\n return picked;\n}\n","import { graphStore } from \"./graph\";\nimport type { EntityId, EntitySyncMetadata, EntityType, GraphStore, QueryKey, SyncOrigin } from \"./graph\";\nimport { emitLegacyDevtoolsEvent } from \"./legacy-devtools\";\n\ndeclare const process: { env: { NODE_ENV?: string } } | undefined;\n\ninterface GraphDataSnapshot {\n entities: ReturnType<typeof graphStore.getState>[\"entities\"];\n patches: ReturnType<typeof graphStore.getState>[\"patches\"];\n entityStates: ReturnType<typeof graphStore.getState>[\"entityStates\"];\n syncMetadata: ReturnType<typeof graphStore.getState>[\"syncMetadata\"];\n lists: ReturnType<typeof graphStore.getState>[\"lists\"];\n}\n\nexport interface GraphTransaction {\n upsertEntity: (type: EntityType, id: EntityId, data: Record<string, unknown>) => GraphTransaction;\n replaceEntity: (type: EntityType, id: EntityId, data: Record<string, unknown>) => GraphTransaction;\n removeEntity: (type: EntityType, id: EntityId) => GraphTransaction;\n patchEntity: (type: EntityType, id: EntityId, patch: Record<string, unknown>) => GraphTransaction;\n clearPatch: (type: EntityType, id: EntityId) => GraphTransaction;\n insertIdInList: (key: QueryKey, id: EntityId, position: \"start\" | \"end\" | number) => GraphTransaction;\n removeIdFromAllLists: (type: EntityType, id: EntityId) => GraphTransaction;\n setEntitySyncMetadata: (type: EntityType, id: EntityId, metadata: Partial<EntitySyncMetadata>) => GraphTransaction;\n markEntityPending: (type: EntityType, id: EntityId, origin?: SyncOrigin) => GraphTransaction;\n markEntitySynced: (type: EntityType, id: EntityId, origin?: SyncOrigin) => GraphTransaction;\n commit: () => void;\n rollback: () => void;\n snapshot: () => GraphDataSnapshot;\n}\n\nexport interface GraphActionOptions<TInput, TResult> {\n key?: string;\n optimistic?: (tx: GraphTransaction, input: TInput) => void;\n run: (tx: GraphTransaction, input: TInput) => Promise<TResult> | TResult;\n onSuccess?: (result: TResult, input: TInput, tx: GraphTransaction) => void;\n onError?: (error: Error, input: TInput) => void;\n}\n\nexport interface GraphActionRecord {\n id: string;\n key: string;\n input: unknown;\n enqueuedAt: string;\n}\n\nexport type GraphActionEvent =\n | { type: \"enqueued\"; record: GraphActionRecord }\n | { type: \"settled\"; record: GraphActionRecord };\n\nconst graphActionListeners = new Set<(event: GraphActionEvent) => void>();\nconst graphActionReplayers = new Map<string, (record: GraphActionRecord, store: GraphStore) => Promise<unknown>>();\n\nexport function createGraphTransaction(storeApi: GraphStore = graphStore): GraphTransaction {\n const baseline = cloneGraphData(storeApi.getState());\n let closed = false;\n\n const tx: GraphTransaction = {\n upsertEntity(type, id, data) {\n storeApi.getState().upsertEntity(type, id, data);\n if (\n typeof process === \"undefined\" || process.env.NODE_ENV !== \"production\"\n ) {\n emitLegacyDevtoolsEvent({ kind: \"upsert\", type, id, data, at: new Date().toISOString() });\n }\n return tx;\n },\n replaceEntity(type, id, data) {\n storeApi.getState().replaceEntity(type, id, data);\n return tx;\n },\n removeEntity(type, id) {\n storeApi.getState().removeEntity(type, id);\n return tx;\n },\n patchEntity(type, id, patch) {\n storeApi.getState().patchEntity(type, id, patch);\n if (\n typeof process === \"undefined\" || process.env.NODE_ENV !== \"production\"\n ) {\n emitLegacyDevtoolsEvent({ kind: \"patch\", type, id, patch, at: new Date().toISOString() });\n }\n return tx;\n },\n clearPatch(type, id) {\n storeApi.getState().clearPatch(type, id);\n if (\n typeof process === \"undefined\" || process.env.NODE_ENV !== \"production\"\n ) {\n emitLegacyDevtoolsEvent({ kind: \"clearPatch\", type, id, at: new Date().toISOString() });\n }\n return tx;\n },\n insertIdInList(key, id, position) {\n storeApi.getState().insertIdInList(key, id, position);\n return tx;\n },\n removeIdFromAllLists(type, id) {\n storeApi.getState().removeIdFromAllLists(type, id);\n return tx;\n },\n setEntitySyncMetadata(type, id, metadata) {\n storeApi.getState().setEntitySyncMetadata(type, id, metadata);\n return tx;\n },\n markEntityPending(type, id, origin = \"optimistic\") {\n storeApi.getState().setEntitySyncMetadata(type, id, {\n synced: false,\n origin,\n updatedAt: Date.now(),\n });\n return tx;\n },\n markEntitySynced(type, id, origin = \"server\") {\n storeApi.getState().setEntitySyncMetadata(type, id, {\n synced: true,\n origin,\n updatedAt: Date.now(),\n });\n return tx;\n },\n commit() {\n closed = true;\n },\n rollback() {\n if (closed) return;\n storeApi.setState(cloneGraphData(baseline) as Partial<ReturnType<typeof graphStore.getState>>);\n closed = true;\n },\n snapshot() {\n return cloneGraphData(storeApi.getState());\n },\n };\n\n return tx;\n}\n\nexport function createGraphAction<TInput, TResult>(opts: GraphActionOptions<TInput, TResult>) {\n if (opts.key) {\n graphActionReplayers.set(opts.key, async (record, storeApi) => {\n const tx = createGraphTransaction(storeApi);\n try {\n const result = await opts.run(tx, record.input as TInput);\n tx.commit();\n return result;\n } catch (error) {\n tx.rollback();\n throw error;\n }\n });\n }\n\n return async (input: TInput): Promise<TResult> => {\n const tx = createGraphTransaction();\n const record = opts.key\n ? {\n id: `${opts.key}:${Date.now()}`,\n key: opts.key,\n input: structuredClone(input),\n enqueuedAt: new Date().toISOString(),\n }\n : null;\n\n try {\n if (record) emitGraphActionEvent({ type: \"enqueued\", record });\n opts.optimistic?.(tx, input);\n const result = await opts.run(tx, input);\n opts.onSuccess?.(result, input, tx);\n tx.commit();\n if (record) emitGraphActionEvent({ type: \"settled\", record });\n return result;\n } catch (error) {\n tx.rollback();\n const normalized = error instanceof Error ? error : new Error(String(error));\n if (record) emitGraphActionEvent({ type: \"settled\", record });\n opts.onError?.(normalized, input);\n throw normalized;\n }\n };\n}\n\nexport function subscribeGraphActionEvents(listener: (event: GraphActionEvent) => void) {\n graphActionListeners.add(listener);\n return () => graphActionListeners.delete(listener);\n}\n\nexport async function replayRegisteredGraphAction(record: GraphActionRecord, storeApi: GraphStore = graphStore) {\n const replayer = graphActionReplayers.get(record.key);\n if (!replayer) throw new Error(`No graph action registered for key \"${record.key}\"`);\n return replayer(record, storeApi);\n}\n\nfunction cloneGraphData(\n source: Pick<ReturnType<typeof graphStore.getState>, \"entities\" | \"patches\" | \"entityStates\" | \"syncMetadata\" | \"lists\"> = graphStore.getState(),\n): GraphDataSnapshot {\n return {\n entities: structuredClone(source.entities),\n patches: structuredClone(source.patches),\n entityStates: structuredClone(source.entityStates),\n syncMetadata: structuredClone(source.syncMetadata),\n lists: structuredClone(source.lists),\n };\n}\n\nfunction emitGraphActionEvent(event: GraphActionEvent) {\n for (const listener of graphActionListeners) listener(event);\n}\n","import { useGraphStore } from \"./graph\";\n\nexport interface GraphEffectEvent<T> {\n key: string;\n value: T;\n previousValue: T;\n}\n\nexport interface GraphEffectOptions<T> {\n query: () => T[] | T | null;\n getKey?: (value: T, index: number) => string;\n skipInitial?: boolean;\n isEqual?: (previousValue: T, nextValue: T) => boolean;\n onEnter?: (event: { key: string; value: T }) => void;\n onUpdate?: (event: GraphEffectEvent<T>) => void;\n onExit?: (event: { key: string; previousValue: T }) => void;\n}\n\nexport interface GraphEffectHandle {\n dispose: () => void;\n}\n\nexport function createGraphEffect<T>(opts: GraphEffectOptions<T>): GraphEffectHandle {\n const getKey = opts.getKey ?? defaultGetKey;\n const isEqual = opts.isEqual ?? defaultIsEqual;\n\n let initialized = false;\n let previous = new Map<string, T>();\n\n const evaluate = () => {\n const nextValues = normalizeQueryResult(opts.query());\n const next = new Map<string, T>();\n\n nextValues.forEach((value, index) => {\n next.set(getKey(value, index), value);\n });\n\n if (!initialized) {\n initialized = true;\n previous = next;\n if (opts.skipInitial) return;\n }\n\n for (const [key, value] of next.entries()) {\n const previousValue = previous.get(key);\n if (previousValue === undefined) {\n opts.onEnter?.({ key, value });\n continue;\n }\n if (!isEqual(previousValue, value)) {\n opts.onUpdate?.({ key, value, previousValue });\n }\n }\n\n for (const [key, previousValue] of previous.entries()) {\n if (!next.has(key)) opts.onExit?.({ key, previousValue });\n }\n\n previous = next;\n };\n\n evaluate();\n const unsubscribe = useGraphStore.subscribe(() => {\n evaluate();\n });\n\n return {\n dispose: () => {\n unsubscribe();\n },\n };\n}\n\nfunction normalizeQueryResult<T>(value: T[] | T | null): T[] {\n if (value == null) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction defaultGetKey<T>(value: T, index: number): string {\n if (value && typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n if (typeof record.id === \"string\") return record.id;\n if (typeof record.$key === \"string\") return record.$key;\n }\n return String(index);\n}\n\nfunction defaultIsEqual<T>(previousValue: T, nextValue: T): boolean {\n return JSON.stringify(previousValue) === JSON.stringify(nextValue);\n}\n","/**\n * schema.ts (core) — framework-agnostic JSON-schema registry + snapshot/markdown\n * helpers. The React field renderers/editors (MarkdownFieldRenderer,\n * MarkdownFieldEditor, useSchemaEntityFields, buildEntityFieldsFromSchema which\n * depends on the UI FieldDescriptor type) live in the react binding's schema.tsx,\n * built on these primitives.\n */\n\nexport interface JsonSchemaObject {\n $id?: string;\n title?: string;\n description?: string;\n type?: string | string[];\n format?: string;\n enum?: readonly unknown[];\n default?: unknown;\n properties?: Record<string, JsonSchemaObject>;\n items?: JsonSchemaObject;\n required?: string[];\n additionalProperties?: boolean | JsonSchemaObject;\n [\"x-a2ui-component\"]?: string;\n [\"x-display-order\"]?: number;\n [\"x-field-type\"]?: string;\n [\"x-hidden\"]?: boolean;\n}\n\nexport interface EntityJsonSchemaConfig {\n entityType: string;\n schemaId?: string;\n field?: string;\n version?: string;\n source?: \"static\" | \"runtime\" | \"ai\";\n schema: JsonSchemaObject;\n}\n\nexport interface GetEntityJsonSchemaOptions {\n entityType: string;\n schemaId?: string;\n field?: string;\n}\n\nexport interface GraphSnapshotWithSchemasOptions {\n scope: string;\n data: unknown;\n schemas: Array<EntityJsonSchemaConfig | null | undefined>;\n pretty?: boolean;\n}\n\nconst schemaRegistry = new Map<string, EntityJsonSchemaConfig>();\n\nexport function registerEntityJsonSchema(config: EntityJsonSchemaConfig) {\n schemaRegistry.set(registryKey(config.entityType, config.field, config.schemaId), config);\n}\n\nexport function registerRuntimeSchema(config: EntityJsonSchemaConfig) {\n registerEntityJsonSchema(config);\n}\n\nexport function getEntityJsonSchema(opts: GetEntityJsonSchemaOptions): EntityJsonSchemaConfig | null {\n const exact = schemaRegistry.get(registryKey(opts.entityType, opts.field, opts.schemaId));\n if (exact) return exact;\n if (opts.field) {\n const byField = schemaRegistry.get(registryKey(opts.entityType, opts.field));\n if (byField) return byField;\n }\n if (opts.schemaId) {\n const byId = schemaRegistry.get(registryKey(opts.entityType, undefined, opts.schemaId));\n if (byId) return byId;\n }\n for (const schema of schemaRegistry.values()) {\n if (schema.entityType !== opts.entityType) continue;\n if (opts.field && schema.field !== opts.field) continue;\n return schema;\n }\n return null;\n}\n\nexport function exportGraphSnapshotWithSchemas(opts: GraphSnapshotWithSchemasOptions): string {\n return JSON.stringify(\n {\n scope: opts.scope,\n generatedAt: new Date().toISOString(),\n data: opts.data,\n schemas: opts.schemas.filter(Boolean),\n },\n null,\n opts.pretty === false ? 0 : 2,\n );\n}\n\nexport function escapeHtml(input: string): string {\n return input\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n}\n\nexport function renderMarkdownToHtml(value: string): string {\n const escaped = escapeHtml(value);\n const blocks = escaped.split(/\\n{2,}/).map((b) => b.trim()).filter(Boolean);\n return blocks.map((block) => renderMarkdownBlock(block)).join(\"\");\n}\n\n/** Infer a coarse field-type string from a JSON-schema node (UI-agnostic). */\nexport function inferSchemaFieldType(schema: JsonSchemaObject): string {\n const forced = schema[\"x-field-type\"];\n if (forced === \"markdown\") return \"markdown\";\n if (schema.format === \"markdown\") return \"markdown\";\n if (schema.enum) return \"enum\";\n const type = Array.isArray(schema.type) ? schema.type[0] : schema.type;\n switch (type) {\n case \"boolean\": return \"boolean\";\n case \"integer\":\n case \"number\": return \"number\";\n case \"string\":\n if (schema.format === \"email\") return \"email\";\n if (schema.format === \"uri\" || schema.format === \"url\") return \"url\";\n if (schema.format === \"date\" || schema.format === \"date-time\") return \"date\";\n return \"text\";\n case \"array\":\n case \"object\": return \"json\";\n default: return \"text\";\n }\n}\n\nexport function registryKey(entityType: string, field?: string, schemaId?: string) {\n return `${entityType}::${field ?? \"*\"}::${schemaId ?? \"*\"}`;\n}\n\nexport function humanizeFieldName(value: string) {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[_-]+/g, \" \")\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nfunction renderMarkdownBlock(block: string): string {\n if (block.startsWith(\"# \")) return `<h1>${renderInlineMarkdown(block.slice(2))}</h1>`;\n if (block.startsWith(\"## \")) return `<h2>${renderInlineMarkdown(block.slice(3))}</h2>`;\n return `<p>${renderInlineMarkdown(block).replaceAll(\"\\n\", \"<br/>\")}</p>`;\n}\n\nfunction renderInlineMarkdown(block: string): string {\n return block.replace(/\\*\\*(.+?)\\*\\*/g, \"<strong>$1</strong>\");\n}\n","import { useGraphStore } from \"./graph\";\nimport { queryOnce } from \"./graph-query\";\nimport { exportGraphSnapshotWithSchemas, getEntityJsonSchema } from \"./schema\";\n\nexport interface GraphSnapshotExportOptions {\n scope: string;\n data: unknown;\n pretty?: boolean;\n}\n\nexport interface GraphToolContext {\n store: ReturnType<typeof useGraphStore.getState>;\n queryOnce: typeof queryOnce;\n exportGraphSnapshot: typeof exportGraphSnapshot;\n}\n\nexport interface SchemaGraphToolContext extends GraphToolContext {\n getEntityJsonSchema: typeof getEntityJsonSchema;\n exportGraphSnapshotWithSchemas: typeof exportGraphSnapshotWithSchemas;\n}\n\nexport function exportGraphSnapshot(opts: GraphSnapshotExportOptions): string {\n const payload = {\n scope: opts.scope,\n generatedAt: new Date().toISOString(),\n data: opts.data,\n };\n return JSON.stringify(payload, null, opts.pretty === false ? 0 : 2);\n}\n\nexport function createGraphTool<TInput, TResult>(\n handler: (input: TInput, ctx: GraphToolContext) => Promise<TResult> | TResult,\n) {\n return (input: TInput) =>\n handler(input, {\n store: useGraphStore.getState(),\n queryOnce,\n exportGraphSnapshot,\n });\n}\n\nexport function createSchemaGraphTool<TInput, TResult>(\n handler: (input: TInput, ctx: SchemaGraphToolContext) => Promise<TResult> | TResult,\n) {\n return (input: TInput) =>\n handler(input, {\n store: useGraphStore.getState(),\n queryOnce,\n exportGraphSnapshot,\n getEntityJsonSchema,\n exportGraphSnapshotWithSchemas,\n });\n}\n","import { createStore } from \"zustand/vanilla\";\nimport { graphStore, type GraphStore } from \"./graph\";\nimport { replayRegisteredGraphAction, subscribeGraphActionEvents } from \"./graph-actions\";\n\nexport interface GraphPersistenceAdapter {\n get: (key: string) => Promise<string | null> | string | null;\n set: (key: string, value: string) => Promise<void> | void;\n remove?: (key: string) => Promise<void> | void;\n}\n\nexport interface GraphActionRecord {\n id: string;\n key: string;\n input: unknown;\n enqueuedAt: string;\n}\n\nexport interface GraphSyncStatus {\n phase: \"idle\" | \"hydrating\" | \"syncing\" | \"ready\" | \"offline\" | \"error\";\n isOnline: boolean;\n isSynced: boolean;\n pendingActions: number;\n lastHydratedAt: string | null;\n lastPersistedAt: string | null;\n storageKey: string | null;\n error: string | null;\n}\n\nexport interface GraphSnapshotPayload {\n version: 1;\n snapshot: {\n entities: ReturnType<typeof graphStore.getState>[\"entities\"];\n patches: ReturnType<typeof graphStore.getState>[\"patches\"];\n entityStates: ReturnType<typeof graphStore.getState>[\"entityStates\"];\n syncMetadata: ReturnType<typeof graphStore.getState>[\"syncMetadata\"];\n lists: ReturnType<typeof graphStore.getState>[\"lists\"];\n };\n pendingActions: GraphActionRecord[];\n}\n\nexport interface PersistGraphToStorageOptions {\n storage: GraphPersistenceAdapter;\n key: string;\n store?: GraphStore;\n pendingActions?: GraphActionRecord[];\n /**\n * The runtime whose status this write reports to. Omit for standalone calls,\n * which fall back to the process-wide status store.\n */\n scope?: RuntimeScope;\n}\n\nexport interface HydrateGraphFromStorageOptions {\n storage: GraphPersistenceAdapter;\n key: string;\n store?: GraphStore;\n /**\n * The runtime that owns the pending-action set this hydrate populates.\n *\n * Without a scope, hydrate writes into the process-wide fallback set — which\n * is what made a second runtime's hydrate erase the first runtime's\n * un-settled actions. A runtime always passes its own scope.\n */\n scope?: RuntimeScope;\n}\n\n/**\n * Retry-with-backoff policy for replaying pending offline actions.\n *\n * The replay loop tracks per-action attempt counts. After `maxAttempts`\n * failed attempts the action is considered \"poisoned\" — it is removed from\n * the in-memory pending queue (so it won't block other actions) and the\n * optional `poisonHandler` is invoked. Consumers typically log the action,\n * surface a UI prompt, or persist it to a dead-letter store.\n *\n * Defaults: 5 attempts, starting at 500ms, doubling up to 30s, with\n * \"equal\" jitter (random in `[delay/2, delay]`).\n */\nexport interface ReplayRetryPolicy {\n maxAttempts?: number;\n initialDelayMs?: number;\n maxDelayMs?: number;\n backoffFactor?: number;\n jitter?: \"full\" | \"equal\" | \"none\";\n poisonHandler?: (action: GraphActionRecord, error: unknown) => void | Promise<void>;\n}\n\nexport interface StartLocalFirstGraphOptions {\n storage: GraphPersistenceAdapter;\n store?: GraphStore;\n key?: string;\n replayPendingActions?: boolean;\n onlineSource?: {\n getIsOnline: () => boolean;\n subscribe: (listener: (online: boolean) => void) => () => void;\n };\n persistDebounceMs?: number;\n /** Retry-with-backoff policy for offline action replay. */\n retryPolicy?: ReplayRetryPolicy;\n /**\n * Pre-built scope for this runtime. Omit and one is created — the normal\n * case. Supply one only to share state deliberately (e.g. in a test).\n */\n scope?: RuntimeScope;\n}\n\nexport interface LocalFirstGraphRuntime {\n ready: Promise<void>;\n /**\n * Tear down and drain. The returned promise resolves only once every\n * in-flight persist has settled, so `await dispose()` guarantees no further\n * write from this runtime lands (ADR-009 G2).\n *\n * Callers that do not await it get the old fire-and-forget behaviour, which\n * is why the ASO session manager awaits it before opening a replacement.\n */\n dispose: () => Promise<void>;\n persistNow: () => Promise<void>;\n hydrate: () => Promise<Awaited<ReturnType<typeof hydrateGraphFromStorage>>>;\n getStatus: () => GraphSyncStatus;\n /**\n * This runtime's own state. Read `scope.statusStore` for status isolated from\n * every other runtime in the process.\n */\n scope: RuntimeScope;\n}\n\nconst DEFAULT_STORAGE_KEY = \"prometheus:graph\";\n\nexport const graphSyncStatusStore = createStore<{ status: GraphSyncStatus; setStatus: (status: Partial<GraphSyncStatus>) => void }>()((set) => ({\n status: {\n phase: \"idle\",\n isOnline: true,\n isSynced: true,\n pendingActions: 0,\n lastHydratedAt: null,\n lastPersistedAt: null,\n storageKey: null,\n error: null,\n },\n setStatus: (status) =>\n set((state) => ({\n status: {\n ...state.status,\n ...status,\n },\n })),\n}));\n\n/**\n * Per-runtime state: the pending-action set and the status store that runtime\n * publishes to.\n *\n * Both were previously module-level singletons shared by every runtime in the\n * process. That was not merely shared state — `hydrateGraphFromStorage` clears\n * the pending set before repopulating it, so a second runtime hydrating erased\n * the first runtime's un-settled actions. On an account or practice switch that\n * is silent write loss, which is why this is scoped per runtime (ADR-009 G1).\n */\nexport interface RuntimeScope {\n pendingActions: Map<string, GraphActionRecord>;\n statusStore: GraphSyncStatusStore;\n}\n\nexport type GraphSyncStatusStore = ReturnType<typeof createGraphSyncStatusStore>;\n\n/** Create an independent sync-status store. Each runtime owns one. */\nexport function createGraphSyncStatusStore() {\n return createStore<{\n status: GraphSyncStatus;\n setStatus: (status: Partial<GraphSyncStatus>) => void;\n }>()((set) => ({\n status: {\n phase: \"idle\",\n isOnline: true,\n isSynced: true,\n pendingActions: 0,\n lastHydratedAt: null,\n lastPersistedAt: null,\n storageKey: null,\n error: null,\n },\n setStatus: (status) =>\n set((state) => ({ status: { ...state.status, ...status } })),\n }));\n}\n\n/** Create an isolated runtime scope. */\nexport function createRuntimeScope(): RuntimeScope {\n return {\n pendingActions: new Map<string, GraphActionRecord>(),\n statusStore: createGraphSyncStatusStore(),\n };\n}\n\n/**\n * Process-wide fallback scope, used only by standalone calls to the exported\n * `persistGraphToStorage` / `hydrateGraphFromStorage` helpers that pass no\n * `scope`. Runtimes never use it. It also backs the legacy\n * `graphSyncStatusStore` export so existing consumers keep working.\n */\nconst fallbackScope: RuntimeScope = {\n pendingActions: new Map<string, GraphActionRecord>(),\n statusStore: graphSyncStatusStore,\n};\n\n/** Resolve the scope for an operation, defaulting to the process-wide one. */\nfunction resolveScope(scope?: RuntimeScope): RuntimeScope {\n return scope ?? fallbackScope;\n}\n\nexport function getGraphSyncStatus() {\n return graphSyncStatusStore.getState().status;\n}\n\nexport async function persistGraphToStorage(opts: PersistGraphToStorageOptions) {\n const storeApi = opts.store ?? graphStore;\n const scope = resolveScope(opts.scope);\n const payload: GraphSnapshotPayload = {\n version: 1,\n snapshot: cloneGraphSnapshot(storeApi),\n pendingActions: opts.pendingActions ?? Array.from(scope.pendingActions.values()),\n };\n const json = JSON.stringify(payload);\n await opts.storage.set(opts.key, json);\n const persistedAt = new Date().toISOString();\n scope.statusStore.getState().setStatus({\n lastPersistedAt: persistedAt,\n storageKey: opts.key,\n pendingActions: payload.pendingActions.length,\n });\n return {\n ok: true as const,\n key: opts.key,\n bytes: json.length,\n persistedAt,\n };\n}\n\nexport async function hydrateGraphFromStorage(opts: HydrateGraphFromStorageOptions) {\n const storeApi = opts.store ?? graphStore;\n const scope = resolveScope(opts.scope);\n const raw = await opts.storage.get(opts.key);\n if (!raw) {\n return {\n ok: false as const,\n key: opts.key,\n hydratedAt: null,\n entityCounts: {},\n error: \"No persisted graph snapshot found\",\n };\n }\n\n try {\n const parsed = JSON.parse(raw) as GraphSnapshotPayload;\n storeApi.setState(parsed.snapshot as Partial<ReturnType<typeof graphStore.getState>>);\n // Scoped: this clears only THIS runtime's pending set. Before scoping, a\n // second runtime hydrating wiped the first runtime's un-settled actions.\n scope.pendingActions.clear();\n for (const action of parsed.pendingActions ?? []) scope.pendingActions.set(action.id, action);\n const hydratedAt = new Date().toISOString();\n scope.statusStore.getState().setStatus({\n lastHydratedAt: hydratedAt,\n storageKey: opts.key,\n pendingActions: scope.pendingActions.size,\n error: null,\n });\n return {\n ok: true as const,\n key: opts.key,\n hydratedAt,\n entityCounts: Object.fromEntries(\n Object.entries(parsed.snapshot.entities).map(([type, entities]) => [type, Object.keys(entities).length]),\n ),\n pendingActions: Array.from(scope.pendingActions.values()),\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n scope.statusStore.getState().setStatus({\n phase: \"error\",\n error: message,\n storageKey: opts.key,\n });\n return {\n ok: false as const,\n key: opts.key,\n hydratedAt: null,\n entityCounts: {},\n error: message,\n };\n }\n}\n\nexport function startLocalFirstGraph(opts: StartLocalFirstGraphOptions): LocalFirstGraphRuntime {\n const storeApi = opts.store ?? graphStore;\n const key = opts.key ?? DEFAULT_STORAGE_KEY;\n const persistDebounceMs = opts.persistDebounceMs ?? 50;\n // This runtime's own state. Two runtimes in one process no longer share a\n // pending set, so neither can erase the other's un-settled actions (G1).\n const scope = opts.scope ?? createRuntimeScope();\n const { pendingActions } = scope;\n // Mirror status to the legacy process-wide store as well, so existing\n // consumers of `graphSyncStatusStore` / `useGraphSyncStatus` keep observing\n // a runtime's status when only one runtime exists. With several runtimes the\n // last writer wins there, which is why per-runtime status is read through\n // `runtime.getStatus()` or the scope's own store.\n const setStatus = (status: Partial<GraphSyncStatus>) => {\n scope.statusStore.getState().setStatus(status);\n if (scope.statusStore !== graphSyncStatusStore) {\n graphSyncStatusStore.getState().setStatus(status);\n }\n };\n setStatus({\n phase: \"hydrating\",\n storageKey: key,\n isOnline: opts.onlineSource?.getIsOnline() ?? getDefaultOnlineSource().getIsOnline(),\n isSynced: pendingActions.size === 0,\n error: null,\n });\n\n let persistTimer: ReturnType<typeof setTimeout> | null = null;\n /**\n * Persist writes that have started but not settled.\n *\n * `dispose()` clearing the debounce timer stops a *scheduled* write, but a\n * write already in flight kept running with its promise discarded (`void`),\n * so it could land after teardown — the \"late open resurrects a disposed\n * session\" hazard. Tracking the promise is what makes an await possible\n * (ADR-009 G2).\n */\n const inFlight = new Set<Promise<unknown>>();\n /** Memoized so repeated dispose() calls share one teardown. */\n let disposePromise: Promise<void> | null = null;\n /** Set once dispose starts, so no new write is scheduled after teardown. */\n let disposed = false;\n\n const runPersist = () => {\n const write = persistGraphToStorage({ storage: opts.storage, key, store: storeApi, scope })\n // A failed persist must not reject the disposal barrier — disposal is\n // about *quiescence*, not success. The error is already reported through\n // the status store by persistGraphToStorage itself.\n .catch(() => undefined)\n .finally(() => {\n inFlight.delete(write);\n });\n inFlight.add(write);\n return write;\n };\n\n const schedulePersist = () => {\n if (disposed) return;\n if (persistTimer) clearTimeout(persistTimer);\n persistTimer = setTimeout(() => {\n persistTimer = null;\n void runPersist();\n }, persistDebounceMs);\n };\n\n const graphUnsub = storeApi.subscribe(() => {\n schedulePersist();\n });\n\n const actionUnsub = subscribeGraphActionEvents((event) => {\n if (event.type === \"enqueued\") pendingActions.set(event.record.id, event.record);\n if (event.type === \"settled\") pendingActions.delete(event.record.id);\n setStatus({\n pendingActions: pendingActions.size,\n isSynced: pendingActions.size === 0,\n });\n schedulePersist();\n });\n\n const onlineSource = opts.onlineSource ?? getDefaultOnlineSource();\n const onlineUnsub = onlineSource.subscribe((online) => {\n setStatus({\n isOnline: online,\n phase: online ? \"ready\" : \"offline\",\n });\n });\n\n const ready = (async () => {\n const hydrated = await hydrateGraphFromStorage({ storage: opts.storage, key, store: storeApi, scope });\n if (opts.replayPendingActions && hydrated.ok && pendingActions.size > 0) {\n setStatus({\n phase: \"syncing\",\n isSynced: false,\n });\n const policy = resolveRetryPolicy(opts.retryPolicy);\n for (const action of Array.from(pendingActions.values())) {\n await replayActionWithRetry(action, policy, storeApi);\n // Whether it succeeded or was poisoned, remove from pending — the\n // poison handler (if any) owns escalation from here.\n pendingActions.delete(action.id);\n }\n await persistGraphToStorage({ storage: opts.storage, key, store: storeApi, scope });\n }\n\n const online = onlineSource.getIsOnline();\n setStatus({\n phase: online ? \"ready\" : \"offline\",\n isOnline: online,\n isSynced: pendingActions.size === 0,\n pendingActions: pendingActions.size,\n });\n })();\n\n return {\n ready,\n /**\n * Tear down, and do not resolve until this runtime is quiescent.\n *\n * Unsubscribes first so no further work is queued, cancels a scheduled\n * write, then awaits every write already in flight. Callers that await\n * this are guaranteed no persist from this runtime lands afterwards.\n *\n * Idempotent: a second call returns the same promise rather than starting\n * a second teardown, which is what makes a StrictMode double-unmount safe.\n */\n dispose() {\n if (disposePromise) return disposePromise;\n disposed = true;\n graphUnsub();\n actionUnsub();\n onlineUnsub();\n if (persistTimer) {\n clearTimeout(persistTimer);\n persistTimer = null;\n }\n // Snapshot: `finally` mutates the set as writes settle, and awaiting a\n // live collection would race with its own drainage.\n disposePromise = Promise.all([...inFlight]).then(() => undefined);\n return disposePromise;\n },\n async persistNow() {\n // Tracked like any other write: a caller that persists and immediately\n // disposes must still see the barrier cover this write.\n await runPersist();\n },\n hydrate() {\n return hydrateGraphFromStorage({ storage: opts.storage, key, store: storeApi, scope });\n },\n getStatus() {\n // This runtime's own status, not whichever runtime wrote last.\n return scope.statusStore.getState().status;\n },\n scope,\n };\n}\n\nfunction cloneGraphSnapshot(storeApi: GraphStore) {\n const state = storeApi.getState();\n return {\n entities: structuredClone(state.entities),\n patches: structuredClone(state.patches),\n entityStates: structuredClone(state.entityStates),\n syncMetadata: structuredClone(state.syncMetadata),\n lists: structuredClone(state.lists),\n };\n}\n\ninterface ResolvedRetryPolicy {\n maxAttempts: number;\n initialDelayMs: number;\n maxDelayMs: number;\n backoffFactor: number;\n jitter: \"full\" | \"equal\" | \"none\";\n poisonHandler?: (action: GraphActionRecord, error: unknown) => void | Promise<void>;\n}\n\nfunction resolveRetryPolicy(policy?: ReplayRetryPolicy): ResolvedRetryPolicy {\n return {\n maxAttempts: policy?.maxAttempts ?? 5,\n initialDelayMs: policy?.initialDelayMs ?? 500,\n maxDelayMs: policy?.maxDelayMs ?? 30_000,\n backoffFactor: policy?.backoffFactor ?? 2,\n jitter: policy?.jitter ?? \"equal\",\n poisonHandler: policy?.poisonHandler,\n };\n}\n\nfunction computeDelay(policy: ResolvedRetryPolicy, attempt: number): number {\n const base = Math.min(\n policy.initialDelayMs * Math.pow(policy.backoffFactor, Math.max(0, attempt - 1)),\n policy.maxDelayMs,\n );\n switch (policy.jitter) {\n case \"none\":\n return base;\n case \"full\":\n return Math.random() * base;\n case \"equal\":\n default:\n return base / 2 + Math.random() * (base / 2);\n }\n}\n\n/** Internal — sleep helper that respects test environments. */\nfunction sleep(ms: number): Promise<void> {\n if (ms <= 0) return Promise.resolve();\n return new Promise((r) => setTimeout(r, ms));\n}\n\n/**\n * Attempt to replay an action up to `maxAttempts` times. On exhaustion the\n * action goes to \"poison\" — the optional handler is invoked and the function\n * resolves. Exposed for unit testing.\n */\nexport async function replayActionWithRetry(\n action: GraphActionRecord,\n policy: ResolvedRetryPolicy,\n storeApi: GraphStore = graphStore,\n): Promise<{ ok: true } | { ok: false; poisoned: true; error: unknown }> {\n let lastError: unknown = null;\n for (let attempt = 1; attempt <= policy.maxAttempts; attempt++) {\n try {\n await replayRegisteredGraphAction(action, storeApi);\n return { ok: true };\n } catch (error) {\n lastError = error;\n if (attempt >= policy.maxAttempts) break;\n await sleep(computeDelay(policy, attempt));\n }\n }\n try {\n await policy.poisonHandler?.(action, lastError);\n } catch {\n /* swallow handler failures — they must not block the queue */\n }\n return { ok: false, poisoned: true, error: lastError };\n}\n\nfunction getDefaultOnlineSource() {\n if (typeof window !== \"undefined\" && typeof window.addEventListener === \"function\") {\n return {\n getIsOnline: () => window.navigator.onLine,\n subscribe: (listener: (online: boolean) => void) => {\n const onlineHandler = () => listener(true);\n const offlineHandler = () => listener(false);\n window.addEventListener(\"online\", onlineHandler);\n window.addEventListener(\"offline\", offlineHandler);\n return () => {\n window.removeEventListener(\"online\", onlineHandler);\n window.removeEventListener(\"offline\", offlineHandler);\n };\n },\n };\n }\n\n return {\n getIsOnline: () => true,\n subscribe: () => () => {},\n };\n}\n","/**\n * devtools-event-bus — W5 (seim-em-explorer-event-bus-registry)\n *\n * Ring-buffered, fan-out event bus on top of the W3 `subscribeDevtoolsEvent` tap.\n * Adds: replay-on-subscribe, microtask-level burst coalescing, multi-store registry.\n */\n\nimport { subscribeDevtoolsEvent, type DevtoolsEvent } from \"./engine\";\n\n// ── Public types ───────────────────────────────────────────────────────────────\n\nexport interface DevtoolsEventBusOptions {\n /** Maximum events retained in the ring buffer. Default: 500. */\n bufferSize?: number;\n /**\n * Events 1..N (N = threshold) are dispatched individually as they arrive.\n * Events N+1.. accumulate until the end of the microtask, then are coalesced\n * into one synthetic `kind:\"list\"` summary event.\n * Default: 10. Set to 0 to disable coalescing entirely.\n */\n coalesceBurstThreshold?: number;\n}\n\nexport interface DevtoolsEventBus {\n /** Subscribe to live events. Replays current buffer synchronously before returning. */\n subscribe(cb: (event: DevtoolsEvent) => void): () => void;\n /** Snapshot of buffered events in chronological order (oldest first). */\n getBuffer(): readonly DevtoolsEvent[];\n /** Force-dispatch any pending coalesced burst synchronously. */\n flush(): void;\n /** Release engine-tap, clear all subscribers, cascade inactive to registry. */\n destroy(): void;\n /**\n * Inject a synthetic `DevtoolsEvent` directly into the bus, bypassing the\n * engine tap. Used by the Chrome MV3 extension panel to feed events arriving\n * over the port-messaging bridge into the local bus instance.\n */\n inject(event: DevtoolsEvent): void;\n}\n\n/** Matches the signature of `subscribeDevtoolsEvent` — used for external sources. */\nexport type DevtoolsSourceFn = (cb: (event: DevtoolsEvent) => void) => () => void;\n\nexport interface RegisteredStore {\n name: string;\n active: boolean;\n}\n\n// ── Module-level state ─────────────────────────────────────────────────────────\n\n/** Maps bus → its internal inject function (for registerStore routing). */\nconst _busInjectMap = new WeakMap<DevtoolsEventBus, (event: DevtoolsEvent) => void>();\n\ninterface RegistryEntry {\n name: string;\n active: boolean;\n bus: DevtoolsEventBus;\n unsubscribeSrc: () => void;\n}\nconst registries = new Map<DevtoolsEventBus, Map<string, RegistryEntry>>();\n\n/** Test-only helper: clears the devtools store registry between test runs. */\nexport function __resetStoreRegistry(): void {\n registries.clear();\n}\n\n// ── Factory ────────────────────────────────────────────────────────────────────\n\nexport function createDevtoolsEventBus(opts?: DevtoolsEventBusOptions): DevtoolsEventBus {\n const bufferSize = opts?.bufferSize ?? 500;\n const threshold = opts?.coalesceBurstThreshold ?? 10;\n\n // ── Ring buffer ──────────────────────────────────────────────────────────\n const buffer: DevtoolsEvent[] = bufferSize > 0 ? new Array<DevtoolsEvent>(bufferSize) : [];\n let head = 0;\n let count = 0;\n\n function writeToBuffer(event: DevtoolsEvent): void {\n if (bufferSize === 0) return;\n buffer[head] = event;\n head = (head + 1) % bufferSize;\n if (count < bufferSize) count++;\n }\n\n function getBuffer(): readonly DevtoolsEvent[] {\n if (count === 0) return [];\n if (count < bufferSize) return buffer.slice(0, count);\n return [...buffer.slice(head), ...buffer.slice(0, head)];\n }\n\n // ── Subscribers ──────────────────────────────────────────────────────────\n const subscribers = new Set<(event: DevtoolsEvent) => void>();\n\n function dispatchToSubscribers(event: DevtoolsEvent): void {\n const snap = [...subscribers];\n for (const cb of snap) {\n try { cb(event); } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\"[devtools-event-bus] subscriber threw:\", err);\n }\n }\n }\n\n function dispatchOne(event: DevtoolsEvent): void {\n writeToBuffer(event);\n dispatchToSubscribers(event);\n }\n\n // ── Burst coalescing ──────────────────────────────────────────────────────\n // Events 1..threshold arrive → dispatch immediately + track in pendingBurst.\n // Events threshold+1.. arrive → accumulate in pendingBurst, schedule microtask.\n // flush() → coalesce undispatched remainder into kind:\"list\", reset state.\n let pendingBurst: DevtoolsEvent[] = [];\n let dispatchedCount = 0; // how many from pendingBurst have already been dispatched\n let flushScheduled = false;\n let destroyed = false;\n\n function flush(): void {\n if (pendingBurst.length === 0) { flushScheduled = false; return; }\n const burst = pendingBurst;\n const alreadySent = dispatchedCount;\n pendingBurst = [];\n dispatchedCount = 0;\n flushScheduled = false;\n\n const remaining = burst.slice(alreadySent);\n if (remaining.length === 0) return;\n\n if (threshold === 0 || burst.length <= threshold) {\n // All fit within threshold — no coalescing needed\n for (const ev of remaining) dispatchOne(ev);\n } else {\n // Fill individual slots first (in case some below-threshold slots weren't sent)\n const individualSlots = Math.max(0, threshold - alreadySent);\n const toDispatchIndividually = remaining.slice(0, individualSlots);\n const toCoalesce = remaining.slice(individualSlots);\n for (const ev of toDispatchIndividually) dispatchOne(ev);\n if (toCoalesce.length > 0) {\n dispatchOne({\n kind: \"list\",\n key: \"burst-coalesce\",\n idCount: toCoalesce.length,\n at: new Date().toISOString(),\n });\n }\n }\n }\n\n function handleEngineEvent(event: DevtoolsEvent): void {\n if (destroyed) return;\n if (threshold === 0) { dispatchOne(event); return; }\n\n pendingBurst.push(event);\n\n if (pendingBurst.length <= threshold) {\n // Within individual-dispatch window\n dispatchOne(event);\n dispatchedCount++;\n } else {\n // Exceeded threshold — accumulate and schedule one microtask flush\n if (!flushScheduled) {\n flushScheduled = true;\n Promise.resolve().then(() => flush());\n }\n }\n }\n\n // ── Engine tap ────────────────────────────────────────────────────────────\n const unsubscribeEngine = subscribeDevtoolsEvent(handleEngineEvent);\n\n // ── Bus object ────────────────────────────────────────────────────────────\n const bus: DevtoolsEventBus = {\n subscribe(cb) {\n if (destroyed) return () => {};\n // Synchronous replay of buffer contents\n const snapshot = getBuffer();\n for (const ev of snapshot) {\n try { cb(ev); } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\"[devtools-event-bus] subscriber threw during replay:\", err);\n }\n }\n subscribers.add(cb);\n return () => { subscribers.delete(cb); };\n },\n\n getBuffer,\n flush,\n\n inject(event: DevtoolsEvent): void {\n handleEngineEvent(event);\n },\n\n destroy() {\n if (destroyed) return;\n destroyed = true;\n unsubscribeEngine();\n subscribers.clear();\n pendingBurst = [];\n dispatchedCount = 0;\n flushScheduled = false;\n // Cascade only to sources registered for this bus.\n const registry = registries.get(bus);\n if (registry) {\n for (const entry of registry.values()) {\n if (!entry.active) continue;\n entry.active = false;\n try { entry.unsubscribeSrc(); } catch { /* ignore */ }\n }\n }\n registries.delete(bus);\n _busInjectMap.delete(bus);\n },\n };\n\n // Register inject fn BEFORE returning so registerStore can find it\n _busInjectMap.set(bus, handleEngineEvent);\n\n return bus;\n}\n\n// ── Multi-store registry ──────────────────────────────────────────────────────\n\n/**\n * Wire an additional event source into an existing `DevtoolsEventBus`.\n * Events from `source` flow through the bus's ring buffer, coalescing, and fan-out.\n * Throws if `name` is already registered and active.\n */\nexport function registerStore(\n bus: DevtoolsEventBus,\n source: DevtoolsSourceFn,\n name: string,\n): () => void {\n let registry = registries.get(bus);\n if (!registry) {\n registry = new Map();\n registries.set(bus, registry);\n }\n if (registry.get(name)?.active === true) {\n throw new Error(\n `[devtools-store-registry] Store name \"${name}\" is already registered and active`,\n );\n }\n\n const inject = _busInjectMap.get(bus);\n if (!inject) {\n throw new Error(\n `[devtools-store-registry] Bus is destroyed or was not created by createDevtoolsEventBus`,\n );\n }\n\n const unsubscribeSrc = source(inject);\n const entry: RegistryEntry = { name, active: true, bus, unsubscribeSrc };\n registry.set(name, entry);\n\n return () => {\n if (!entry.active) return;\n entry.active = false;\n unsubscribeSrc();\n };\n}\n\n/** Returns registered stores for one bus, or every bus for legacy callers. */\nexport function getRegisteredStores(bus?: DevtoolsEventBus): ReadonlyArray<RegisteredStore> {\n const entries = bus\n ? [...(registries.get(bus)?.values() ?? [])]\n : [...registries.values()].flatMap((registry) => [...registry.values()]);\n return entries.map((entry) => ({ name: entry.name, active: entry.active }));\n}\n","/**\n * Deprecated root time-travel compatibility facade.\n *\n * Snapshot data, cursors, retention, rewind state, and listeners are owned by\n * the optional per-store DevTools controller. This root module imports only a\n * lightweight delegate bridge, so normal package imports do not pull the\n * optional controller/protocol implementation into the root bundle.\n */\n\nimport {\n getGraphDevtoolsCompatibilityDelegate,\n resetGraphDevtoolsCompatibility,\n subscribeGraphDevtoolsCompatibility,\n} from \"./devtools-compatibility-bridge\";\nimport { graphStore, type GraphStore } from \"./graph\";\n\ntype GraphSlice = Pick<\n ReturnType<typeof graphStore.getState>,\n \"entities\" | \"patches\" | \"entityStates\" | \"syncMetadata\" | \"lists\"\n>;\n\nexport interface TimeTravelSnapshot {\n /** Monotonic controller cursor for the captured state. */\n seq: number;\n /** Capture timestamp (ms). */\n at: number;\n /** Optional compatibility label. */\n label?: string;\n /** Snapshot payloads are controller-private and no longer exposed at root. */\n data: GraphSlice;\n}\n\nexport interface TimeTravelState {\n snapshots: ReadonlyArray<Omit<TimeTravelSnapshot, \"data\">>;\n /** Compatibility ring index currently restored, or null when live. */\n cursor: number | null;\n capacity: number;\n}\n\n/** @deprecated Attach `@prometheus-ags/entity-graph-core/devtools` and configure its controller. */\nexport function configureTimeTravel(\n opts: { capacity?: number },\n storeApi: GraphStore = graphStore,\n): void {\n if (opts.capacity && opts.capacity > 0) {\n getGraphDevtoolsCompatibilityDelegate(storeApi)?.configure(opts.capacity);\n }\n}\n\n/**\n * @deprecated Use the attached controller's automatic snapshot history.\n * Returns `-1` when the optional controller is not attached to `storeApi`.\n */\nexport function recordGraphSnapshot(label?: string, storeApi: GraphStore = graphStore): number {\n return getGraphDevtoolsCompatibilityDelegate(storeApi)?.capture(label) ?? -1;\n}\n\n/** @deprecated Use `controller.rewind(cursor)` from the explicit `./devtools` entry. */\nexport function restoreGraphSnapshot(index: number, storeApi: GraphStore = graphStore): boolean {\n return getGraphDevtoolsCompatibilityDelegate(storeApi)?.restoreByIndex(index) ?? false;\n}\n\n/** @deprecated Use `controller.rewind(cursor)` from the explicit `./devtools` entry. */\nexport function restoreGraphSnapshotBySeq(seq: number, storeApi: GraphStore = graphStore): boolean {\n return getGraphDevtoolsCompatibilityDelegate(storeApi)?.restoreByCursor(seq) ?? false;\n}\n\n/** @deprecated Resolve retained cursors through the explicit per-store controller. */\nexport function stepTimeTravel(delta: number, storeApi: GraphStore = graphStore): boolean {\n return getGraphDevtoolsCompatibilityDelegate(storeApi)?.step(delta) ?? false;\n}\n\n/** @deprecated Use `controller.getSnapshotHistoryStatus()` and controller events. */\nexport function getTimeTravelState(storeApi: GraphStore = graphStore): TimeTravelState {\n return getGraphDevtoolsCompatibilityDelegate(storeApi)?.getState() ?? {\n snapshots: [],\n cursor: null,\n capacity: 50,\n };\n}\n\n/** @deprecated Subscribe to the explicit per-store controller. */\nexport function subscribeTimeTravel(\n cb: () => void,\n storeApi: GraphStore = graphStore,\n): () => void {\n return subscribeGraphDevtoolsCompatibility(storeApi, cb);\n}\n\n/** @internal Test-only bridge reset. It owns no snapshot data. */\nexport function __resetTimeTravel(storeApi?: GraphStore): void {\n const target = storeApi ?? graphStore;\n resetGraphDevtoolsCompatibility(target);\n}\n","/**\n * view/incremental.ts — G3 parity: incremental view maintenance.\n *\n * The baseline `applyView` re-filters + re-sorts the entire id list on every\n * change — O(n) per update. For large lists this is the gap vs TanStack DB's\n * differential-dataflow live queries.\n *\n * This maintains a derived, sorted result and updates it for a SINGLE entity\n * change in O(log n): binary-search the entity's current position, decide\n * membership via the filter, and insert / remove / reposition. No full\n * re-derivation. Result is byte-identical to `applyView` for the same inputs\n * (correctness parity is asserted in tests).\n *\n * Design choice: a hand-rolled dirty-tracking index rather than adopting d2ts\n * (0.1.x, pre-production) — same acceptance bar (sub-linear single-row update),\n * far lower dependency risk. The differential engine can replace the internals\n * later behind this same class without an API change.\n */\n\nimport type { FilterSpec, SortSpec } from \"./types\";\nimport { matchesFilter, matchesSearch, compareEntities } from \"./evaluator\";\n\nexport interface IncrementalViewOptions {\n filter?: FilterSpec | null;\n sort?: SortSpec | null;\n search?: { query: string; fields: string[] } | null;\n /** Resolve an entity by id from the graph (or null if absent). */\n getEntity: (id: string) => Record<string, unknown> | null;\n}\n\n/**\n * A live, sorted view over a set of entity ids that updates incrementally.\n *\n * - `seed(ids)` builds the initial result (one O(n log n) pass).\n * - `applyChange(id)` updates the result for one changed/added/removed entity\n * in O(log n) comparisons (+ array splice).\n * - `result()` returns the current ordered id list (stable reference until a\n * change mutates it).\n */\nexport class IncrementalView {\n private readonly opts: IncrementalViewOptions;\n private ids: string[] = [];\n private readonly members = new Set<string>();\n\n constructor(opts: IncrementalViewOptions) {\n this.opts = opts;\n }\n\n /** Whether an entity qualifies for this view (filter + search). */\n private qualifies(entity: Record<string, unknown> | null): entity is Record<string, unknown> {\n if (!entity) return false;\n if (this.opts.filter && !matchesFilter(entity, this.opts.filter)) return false;\n if (this.opts.search?.query && !matchesSearch(entity, this.opts.search.query, this.opts.search.fields)) return false;\n return true;\n }\n\n /** Comparator over ids using the configured sort (stable, id tiebreak). */\n private cmp(aId: string, bId: string): number {\n const a = this.opts.getEntity(aId);\n const b = this.opts.getEntity(bId);\n if (!a || !b) return 0;\n if (this.opts.sort && this.opts.sort.length > 0) {\n const r = compareEntities(a, b, this.opts.sort);\n if (r !== 0) return r;\n }\n // Deterministic tiebreak so equal-key rows keep a stable, reproducible order.\n return aId < bId ? -1 : aId > bId ? 1 : 0;\n }\n\n /** Binary-search the insertion index for `id` among current `ids`. */\n private insertionIndex(id: string): number {\n let lo = 0;\n let hi = this.ids.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (this.cmp(this.ids[mid], id) < 0) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n /** Build the initial sorted result from a full id set. */\n seed(ids: string[]): void {\n const kept: string[] = [];\n this.members.clear();\n for (const id of ids) {\n if (this.qualifies(this.opts.getEntity(id))) {\n kept.push(id);\n this.members.add(id);\n }\n }\n if (this.opts.sort && this.opts.sort.length > 0) {\n kept.sort((a, b) => this.cmp(a, b));\n }\n this.ids = kept;\n }\n\n /**\n * Update the view for ONE entity that changed/was added/removed.\n * Returns true if the result order changed.\n *\n * O(log n) to locate; the array splice is O(n) memory-move but performs no\n * filter/sort over the whole set — the differentiator from full re-derivation.\n */\n applyChange(id: string): boolean {\n const entity = this.opts.getEntity(id);\n const wasMember = this.members.has(id);\n const isMember = this.qualifies(entity);\n\n if (!wasMember && !isMember) return false;\n\n if (wasMember && !isMember) {\n // Removed from the view.\n const idx = this.ids.indexOf(id);\n if (idx !== -1) this.ids.splice(idx, 1);\n this.members.delete(id);\n return true;\n }\n\n if (!wasMember && isMember) {\n // Newly qualifies — insert at sorted position.\n const idx = this.insertionIndex(id);\n this.ids.splice(idx, 0, id);\n this.members.add(id);\n return true;\n }\n\n // Still a member but its sort key may have changed — reposition if needed.\n const cur = this.ids.indexOf(id);\n if (cur !== -1) this.ids.splice(cur, 1);\n const idx = this.insertionIndex(id);\n this.ids.splice(idx, 0, id);\n return cur !== idx;\n }\n\n /** Current ordered id list. */\n result(): string[] {\n return this.ids;\n }\n\n /** Current member count. */\n size(): number {\n return this.ids.length;\n }\n}\n","/**\n * agent/json-patch.ts — Minimal RFC-6902 JSON Patch applier.\n *\n * AG-UI `STATE_DELTA` events carry RFC-6902 operations. Rather than take a hard\n * dependency on `fast-json-patch` (last released 2022) or require consumers to\n * have `@ag-ui/client`'s applier, this implements the standard's six operations\n * directly. It is small, dependency-free, and fully unit-tested.\n *\n * Immutability: every op returns a NEW document; the input is never mutated.\n *\n * Supported ops: add, replace, remove, move, copy, test.\n * Pointers follow RFC-6901 (`/a/b/0`), including the `-` array-append token and\n * `~1`/`~0` escapes for `/` and `~`.\n */\n\nexport interface JsonPatchOp {\n op: \"add\" | \"remove\" | \"replace\" | \"move\" | \"copy\" | \"test\";\n path: string;\n /** For add/replace/test. */\n value?: unknown;\n /** For move/copy. */\n from?: string;\n}\n\nfunction unescape(token: string): string {\n return token.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n}\n\n/** Parse an RFC-6901 pointer into its decoded segments (`\"\"` → `[]`). */\nfunction parsePointer(pointer: string): string[] {\n if (pointer === \"\") return [];\n if (pointer[0] !== \"/\") throw new Error(`Invalid JSON Pointer: \"${pointer}\"`);\n return pointer.slice(1).split(\"/\").map(unescape);\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction clone<T>(v: T): T {\n return structuredClone(v);\n}\n\nfunction getAt(doc: unknown, segs: string[]): unknown {\n let cur: unknown = doc;\n for (const s of segs) {\n if (Array.isArray(cur)) cur = cur[Number(s)];\n else if (isObject(cur)) cur = cur[s];\n else return undefined;\n }\n return cur;\n}\n\nfunction setAt(doc: unknown, segs: string[], value: unknown, mode: \"add\" | \"replace\"): unknown {\n if (segs.length === 0) return value;\n const root = clone(doc);\n let cur: unknown = root;\n for (let i = 0; i < segs.length - 1; i++) {\n const s = segs[i];\n const next = Array.isArray(cur) ? (cur as unknown[])[Number(s)] : isObject(cur) ? cur[s] : undefined;\n if (next === undefined || next === null) {\n const created: Record<string, unknown> = {};\n if (Array.isArray(cur)) (cur as unknown[])[Number(s)] = created;\n else if (isObject(cur)) cur[s] = created;\n cur = created;\n } else {\n cur = next;\n }\n }\n const last = segs[segs.length - 1];\n if (Array.isArray(cur)) {\n const idx = last === \"-\" ? cur.length : Number(last);\n if (mode === \"add\") cur.splice(idx, 0, value);\n else cur[idx] = value;\n } else if (isObject(cur)) {\n cur[last] = value;\n }\n return root;\n}\n\nfunction removeAt(doc: unknown, segs: string[]): unknown {\n if (segs.length === 0) return undefined;\n const root = clone(doc);\n let cur: unknown = root;\n for (let i = 0; i < segs.length - 1; i++) {\n const s = segs[i];\n cur = Array.isArray(cur) ? (cur as unknown[])[Number(s)] : isObject(cur) ? cur[s] : undefined;\n if (cur === undefined) return root;\n }\n const last = segs[segs.length - 1];\n if (Array.isArray(cur)) cur.splice(Number(last), 1);\n else if (isObject(cur)) delete cur[last];\n return root;\n}\n\n/**\n * Apply a sequence of RFC-6902 operations to `doc`, returning a new document.\n * A failing `test` op throws (per spec); structural ops are applied in order.\n */\nexport function applyJsonPatch<T = unknown>(doc: T, ops: readonly JsonPatchOp[]): T {\n let current: unknown = doc;\n for (const op of ops) {\n const segs = parsePointer(op.path);\n switch (op.op) {\n case \"add\":\n current = setAt(current, segs, op.value, \"add\");\n break;\n case \"replace\":\n current = setAt(current, segs, op.value, \"replace\");\n break;\n case \"remove\":\n current = removeAt(current, segs);\n break;\n case \"move\": {\n const fromSegs = parsePointer(op.from ?? \"\");\n const moved = getAt(current, fromSegs);\n current = removeAt(current, fromSegs);\n current = setAt(current, segs, moved, \"add\");\n break;\n }\n case \"copy\": {\n const fromSegs = parsePointer(op.from ?? \"\");\n const copied = clone(getAt(current, fromSegs));\n current = setAt(current, segs, copied, \"add\");\n break;\n }\n case \"test\": {\n const actual = getAt(current, segs);\n if (JSON.stringify(actual) !== JSON.stringify(op.value)) {\n throw new Error(`JSON Patch test failed at \"${op.path}\"`);\n }\n break;\n }\n default:\n throw new Error(`Unsupported JSON Patch op: ${(op as { op: string }).op}`);\n }\n }\n return current as T;\n}\n","/**\n * agent/ag-ui-bridge.ts — Ingest AG-UI agent state into the entity graph.\n *\n * The headline agentic capability (change C2): an agent emits AG-UI state, it\n * lands in the entity graph, and every view reading those entities updates.\n *\n * AG-UI (https://docs.ag-ui.com) streams two state events:\n * - STATE_SNAPSHOT — the complete agent state object\n * - STATE_DELTA — a partial update as an RFC-6902 JSON Patch\n *\n * Our `patchEntity`/`upsertEntity` already align with this model: STATE_DELTA's\n * JSON Patch maps onto the graph, and writes route through the C1 MergeStrategy\n * so agent edits resolve against concurrent realtime/local writes.\n *\n * Mapping: the agent's state tree is projected onto entities via an\n * {@link AgUiStateMapping}. Each entry says \"the object at this JSON-Pointer\n * prefix is an entity of `type`, keyed by `id` (a field of that object or a\n * constant)\". This keeps the bridge transport-agnostic — it does not depend on\n * `@ag-ui/client` and takes plain event objects, so `@ag-ui/*` stays an OPTIONAL\n * peer (use it for typed events on the consumer side if desired).\n */\n\nimport { useGraphStore } from \"../graph\";\nimport { applyJsonPatch, type JsonPatchOp } from \"./json-patch\";\n\n/** AG-UI STATE_SNAPSHOT event (minimal shape — no @ag-ui dependency). */\nexport interface AgUiStateSnapshotEvent {\n type?: \"STATE_SNAPSHOT\" | string;\n snapshot: Record<string, unknown>;\n}\n\n/** AG-UI STATE_DELTA event (minimal shape — RFC-6902 patch). */\nexport interface AgUiStateDeltaEvent {\n type?: \"STATE_DELTA\" | string;\n delta: JsonPatchOp[];\n}\n\n/** Maps one slice of agent state onto an entity type. */\nexport interface AgUiStateMapping {\n /** Entity type the mapped object(s) belong to. */\n entityType: string;\n /**\n * JSON-Pointer prefix into the agent state where this entity (or collection)\n * lives. `\"/order\"` → a single entity; `\"/orders\"` → a collection keyed by id.\n */\n pointer: string;\n /** Whether `pointer` addresses one object or a collection (array/record). */\n kind: \"single\" | \"collection\";\n /**\n * Field on each object that holds its entity id. For `single` you may instead\n * pass a constant id via `constantId`.\n */\n idField?: string;\n /** Constant id for `single` mappings whose object has no id field. */\n constantId?: string;\n /**\n * How to write: `upsert` (merge via MergeStrategy — default) or `replace`\n * (full overwrite). Snapshots typically replace; deltas typically upsert.\n */\n write?: \"upsert\" | \"replace\";\n}\n\nexport interface ApplyAgUiOptions {\n mappings: AgUiStateMapping[];\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction getAtPointer(state: unknown, pointer: string): unknown {\n if (pointer === \"\" || pointer === \"/\") return state;\n const segs = pointer.slice(1).split(\"/\").map((s) => s.replace(/~1/g, \"/\").replace(/~0/g, \"~\"));\n let cur: unknown = state;\n for (const s of segs) {\n if (Array.isArray(cur)) cur = cur[Number(s)];\n else if (isObject(cur)) cur = cur[s];\n else return undefined;\n }\n return cur;\n}\n\nfunction writeEntity(\n mapping: AgUiStateMapping,\n id: string,\n obj: Record<string, unknown>,\n): void {\n const store = useGraphStore.getState();\n if ((mapping.write ?? \"upsert\") === \"replace\") {\n store.replaceEntity(mapping.entityType, id, obj);\n } else {\n store.upsertEntity(mapping.entityType, id, obj);\n }\n}\n\nfunction projectState(state: Record<string, unknown>, mappings: AgUiStateMapping[]): void {\n for (const mapping of mappings) {\n const slice = getAtPointer(state, mapping.pointer);\n if (slice === undefined) continue;\n\n if (mapping.kind === \"single\") {\n if (!isObject(slice)) continue;\n const id = mapping.constantId ?? String(slice[mapping.idField ?? \"id\"] ?? \"\");\n if (!id) continue;\n writeEntity(mapping, id, slice);\n } else {\n // collection: array of objects, or record keyed by id\n const items: Array<[string, Record<string, unknown>]> = [];\n if (Array.isArray(slice)) {\n for (const item of slice) {\n if (isObject(item)) {\n const id = String(item[mapping.idField ?? \"id\"] ?? \"\");\n if (id) items.push([id, item]);\n }\n }\n } else if (isObject(slice)) {\n for (const [key, item] of Object.entries(slice)) {\n if (isObject(item)) {\n const id = String(item[mapping.idField ?? \"id\"] ?? key);\n items.push([id, item]);\n }\n }\n }\n for (const [id, obj] of items) writeEntity(mapping, id, obj);\n }\n }\n}\n\n/**\n * Apply an AG-UI STATE_SNAPSHOT to the graph. Each mapped slice is written as an\n * entity. Snapshots default to `replace` semantics when the mapping does not\n * specify otherwise is left to the mapping's `write` field (default upsert).\n *\n * @example\n * ```ts\n * applyAgUiSnapshot(event, { mappings: [\n * { entityType: \"Order\", pointer: \"/order\", kind: \"single\", write: \"replace\" },\n * { entityType: \"LineItem\", pointer: \"/order/items\", kind: \"collection\" },\n * ]});\n * ```\n */\nexport function applyAgUiSnapshot(\n event: AgUiStateSnapshotEvent,\n options: ApplyAgUiOptions,\n): void {\n if (!isObject(event.snapshot)) return;\n projectState(event.snapshot, options.mappings);\n}\n\n/**\n * Apply an AG-UI STATE_DELTA (RFC-6902 JSON Patch) to the graph.\n *\n * The delta is applied against a reconstructed agent-state view assembled from\n * the current graph entities (per the mappings), then the resulting slices are\n * re-projected back into the graph. This lets path-based deltas target nested\n * entity fields without the caller tracking the full agent state themselves.\n */\nexport function applyAgUiDelta(\n event: AgUiStateDeltaEvent,\n options: ApplyAgUiOptions,\n /** Current agent-state view; if omitted, reconstructed from the graph mappings. */\n currentState?: Record<string, unknown>,\n): void {\n const base = currentState ?? reconstructState(options.mappings);\n const next = applyJsonPatch(base, event.delta);\n if (isObject(next)) projectState(next, options.mappings);\n}\n\n/** Rebuild a minimal agent-state view from current graph entities (per mappings). */\nfunction reconstructState(mappings: AgUiStateMapping[]): Record<string, unknown> {\n const store = useGraphStore.getState();\n const state: Record<string, unknown> = {};\n for (const mapping of mappings) {\n const key = mapping.pointer.replace(/^\\//, \"\").split(\"/\")[0];\n if (!key) continue;\n const bucket = store.entities[mapping.entityType] ?? {};\n if (mapping.kind === \"single\") {\n const id = mapping.constantId;\n if (id && bucket[id]) state[key] = bucket[id];\n } else {\n state[key] = Object.values(bucket);\n }\n }\n return state;\n}\n","/**\n * adapters/realtime-manager.ts\n *\n * Routes all adapter ChangeSet events into the entity graph.\n * Coalesces rapid-fire updates within a 16ms flush window so that\n * e.g. 10 Supabase row updates for the same entity become one Zustand write.\n */\nimport { graphStore } from \"../graph\";\nimport type { GraphStore } from \"../graph\";\nimport type { RealtimeAdapter, ChangeSet, EntityChange, AdapterStatus, UnsubscribeFn, ChannelConfig } from \"./types\";\n\nexport interface ManagerOptions {\n flushInterval?: number;\n store?: GraphStore;\n onStatusChange?: (adapter: string, status: AdapterStatus) => void;\n onChangeReceived?: (adapter: string, change: EntityChange) => void;\n}\n\ninterface RegisteredAdapter { adapter: RealtimeAdapter; unsubscribes: UnsubscribeFn[]; }\n\nexport class RealtimeManager {\n private adapters = new Map<string, RegisteredAdapter>();\n private pendingChanges: EntityChange[] = [];\n private pendingListKeys = new Set<string>();\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private opts: Required<Omit<ManagerOptions, \"store\">>;\n private store: GraphStore;\n\n constructor(opts: ManagerOptions = {}) {\n this.store = opts.store ?? graphStore;\n this.opts = {\n flushInterval: opts.flushInterval ?? 16,\n onStatusChange: opts.onStatusChange ?? (() => {}),\n onChangeReceived: opts.onChangeReceived ?? (() => {}),\n };\n }\n\n register(adapter: RealtimeAdapter, channels: ChannelConfig[], normalize?: (raw: unknown) => EntityChange | null): UnsubscribeFn {\n const existing = this.adapters.get(adapter.name);\n const registered: RegisteredAdapter = existing ?? { adapter, unsubscribes: [] };\n if (!existing) this.adapters.set(adapter.name, registered);\n if (adapter.onStatusChange) {\n registered.unsubscribes.push(adapter.onStatusChange((s) => this.opts.onStatusChange(adapter.name, s)));\n }\n for (const channel of channels) {\n const unsub = adapter.subscribe(\n { label: `${adapter.name}/${channel.type}`, replayOnConnect: true },\n (cs) => this.handleChangeset(adapter.name, cs, normalize)\n );\n registered.unsubscribes.push(unsub);\n }\n return () => this.unregister(adapter.name);\n }\n\n unregister(name: string) {\n const r = this.adapters.get(name); if (!r) return;\n for (const u of r.unsubscribes) u();\n this.adapters.delete(name);\n }\n\n unregisterAll() { for (const n of this.adapters.keys()) this.unregister(n); }\n\n private handleChangeset(name: string, cs: ChangeSet, normalize?: (raw: unknown) => EntityChange | null) {\n for (const rawChange of cs.changes) {\n const change = normalize ? normalize(rawChange) : rawChange;\n if (!change) continue;\n this.opts.onChangeReceived(name, change);\n this.pendingChanges.push(change);\n }\n if (cs.affectedListKeys) for (const k of cs.affectedListKeys) this.pendingListKeys.add(k);\n this.scheduleFlush();\n }\n\n private scheduleFlush() {\n if (this.opts.flushInterval === 0) { this.flush(); return; }\n if (this.flushTimer !== null) return;\n this.flushTimer = setTimeout(() => { this.flushTimer = null; this.flush(); }, this.opts.flushInterval);\n }\n\n flush() {\n if (this.pendingChanges.length === 0 && this.pendingListKeys.size === 0) return;\n const changes = this.pendingChanges.splice(0);\n const listKeys = new Set(this.pendingListKeys); this.pendingListKeys.clear();\n const store = this.store.getState();\n for (const change of coalesceChanges(changes)) {\n switch (change.op) {\n case \"insert\": case \"upsert\":\n if (change.data) { store.upsertEntity(change.type, change.id, change.data); store.setEntityFetched(change.type, change.id); }\n break;\n case \"update\":\n if (change.patch) {\n if (store.entities[change.type]?.[change.id]) store.upsertEntity(change.type, change.id, change.patch as Record<string, unknown>);\n else store.invalidateEntity(change.type, change.id);\n } else if (change.data) { store.upsertEntity(change.type, change.id, change.data); store.setEntityFetched(change.type, change.id); }\n break;\n case \"delete\":\n store.removeEntity(change.type, change.id);\n store.removeIdFromAllLists(change.type, change.id);\n break;\n }\n }\n for (const key of listKeys) store.invalidateLists(key);\n }\n\n forceFlush() { if (this.flushTimer !== null) { clearTimeout(this.flushTimer); this.flushTimer = null; } this.flush(); }\n}\n\nfunction coalesceChanges(changes: EntityChange[]): EntityChange[] {\n const byKey = new Map<string, EntityChange>();\n for (const c of changes) {\n const key = `${c.type}:${c.id}`; const existing = byKey.get(key);\n if (!existing) { byKey.set(key, { ...c }); continue; }\n if (c.op === \"delete\") { byKey.set(key, c); continue; }\n if (existing.op === \"delete\") continue;\n if (existing.op === \"update\" && c.op === \"update\") {\n byKey.set(key, {\n ...existing,\n patch: { ...(existing.patch ?? {}), ...(c.patch ?? {}) },\n });\n continue;\n }\n byKey.set(key, { ...existing, op: \"upsert\", data: c.data ?? existing.data, patch: c.patch ? { ...(existing.patch ?? {}), ...c.patch } : existing.patch });\n }\n return Array.from(byKey.values());\n}\n\nlet _manager: RealtimeManager | null = null;\nexport function getRealtimeManager(opts?: ManagerOptions): RealtimeManager {\n if (!_manager) _manager = new RealtimeManager(opts);\n return _manager;\n}\nexport function resetRealtimeManager() { _manager?.unregisterAll(); _manager = null; }\n","/**\n * adapters/realtime-adapters.ts\n *\n * WebSocket, Supabase Realtime, Convex, and GraphQL subscription adapters.\n * All implement RealtimeAdapter and route through RealtimeManager → entity graph.\n */\nimport type {\n RealtimeAdapter,\n SubscriptionConfig,\n ChangeSet,\n EntityChange,\n ChangeOperation,\n AdapterStatus,\n UnsubscribeFn,\n ChannelConfig,\n} from \"./types\";\n\n// =============================================================================\n// WebSocket adapter\n// =============================================================================\n\nexport interface WebSocketAdapterOptions {\n url: string | (() => string);\n parseMessage?: (data: unknown) => EntityChange[] | null;\n protocols?: string | string[];\n reconnectBaseDelay?: number;\n maxReconnectAttempts?: number;\n pingInterval?: number;\n pingMessage?: string;\n}\n\nexport function createWebSocketAdapter(opts: WebSocketAdapterOptions): RealtimeAdapter {\n const {\n url,\n parseMessage,\n protocols,\n reconnectBaseDelay = 1_000,\n maxReconnectAttempts = Infinity,\n pingInterval = 30_000,\n pingMessage = '{\"type\":\"ping\"}',\n } = opts;\n\n const statusCbs = new Set<(s: AdapterStatus) => void>();\n const handlers = new Set<(cs: ChangeSet) => void>();\n let ws: WebSocket | null = null;\n let attempts = 0;\n let reconnTimer: ReturnType<typeof setTimeout> | null = null;\n let pingTimer: ReturnType<typeof setInterval> | null = null;\n let stopped = false;\n\n const emit = (s: AdapterStatus) => { for (const cb of statusCbs) cb(s); };\n\n function connect() {\n if (stopped) return;\n const u = typeof url === \"function\" ? url() : url;\n emit(\"connecting\");\n ws = new WebSocket(u, protocols);\n ws.onopen = () => {\n attempts = 0;\n emit(\"connected\");\n if (pingInterval > 0)\n pingTimer = setInterval(() => { if (ws?.readyState === 1) ws.send(pingMessage); }, pingInterval);\n };\n ws.onmessage = (ev) => {\n let parsed: unknown;\n try { parsed = JSON.parse(ev.data); } catch { return; }\n const changes = parseMessage ? parseMessage(parsed) : defaultParse(parsed);\n if (!changes?.length) return;\n for (const h of handlers) h({ changes, timestamp: new Date().toISOString() });\n };\n ws.onclose = () => {\n emit(\"disconnected\");\n clearInterval(pingTimer!);\n if (!stopped && attempts < maxReconnectAttempts)\n reconnTimer = setTimeout(connect, reconnectBaseDelay * Math.pow(2, Math.min(attempts++, 6)));\n };\n ws.onerror = () => { emit(\"error\"); ws?.close(); };\n }\n\n return {\n name: \"websocket\",\n subscribe(_cfg: SubscriptionConfig, handler: (cs: ChangeSet) => void): UnsubscribeFn {\n handlers.add(handler);\n if (!ws || ws.readyState === WebSocket.CLOSED) connect();\n return () => {\n handlers.delete(handler);\n if (handlers.size === 0) {\n stopped = true;\n clearTimeout(reconnTimer!);\n clearInterval(pingTimer!);\n ws?.close();\n ws = null;\n }\n };\n },\n onStatusChange: (cb) => { statusCbs.add(cb); return () => statusCbs.delete(cb); },\n };\n}\n\nfunction defaultParse(data: unknown): EntityChange[] | null {\n if (!data || typeof data !== \"object\") return null;\n const d = data as Record<string, unknown>;\n if (d.op && d.type && d.id) return [d as unknown as EntityChange];\n if (Array.isArray(d.changes)) return d.changes as EntityChange[];\n return null;\n}\n\n// =============================================================================\n// Supabase Realtime adapter\n// =============================================================================\n\n// Minimal surface types — no hard dep on @supabase/supabase-js\ninterface SupabaseClient { channel(name: string): SupabaseChannel; }\ninterface SupabaseChannel {\n on(\n event: \"postgres_changes\",\n config: { event: \"*\"|\"INSERT\"|\"UPDATE\"|\"DELETE\"; schema: string; table: string; filter?: string },\n handler: (payload: SupabasePayload) => void\n ): SupabaseChannel;\n subscribe(cb?: (status: string) => void): SupabaseChannel;\n unsubscribe(): Promise<void>;\n}\ninterface SupabasePayload {\n eventType: \"INSERT\" | \"UPDATE\" | \"DELETE\";\n new: Record<string, unknown>;\n old: Record<string, unknown>;\n table: string;\n}\n\nexport interface SupabaseAdapterOptions {\n tableTypeMap?: Record<string, string>;\n extractId?: (record: Record<string, unknown>) => string;\n schema?: string;\n}\n\nexport function createSupabaseRealtimeAdapter(\n client: SupabaseClient,\n opts: SupabaseAdapterOptions = {}\n): RealtimeAdapter & {\n subscribeChannel: (config: ChannelConfig & { _handler?: (cs: ChangeSet) => void }) => UnsubscribeFn;\n} {\n const {\n tableTypeMap = {},\n extractId = (r) => String(r.id),\n schema = \"public\",\n } = opts;\n const statusCbs = new Set<(s: AdapterStatus) => void>();\n\n function resolveType(table: string): string {\n return tableTypeMap[table] ?? (table.charAt(0).toUpperCase() + table.slice(1));\n }\n\n function payloadToChange(p: SupabasePayload): EntityChange | null {\n const type = resolveType(p.table);\n if (p.eventType === \"DELETE\") {\n const id = extractId(p.old);\n return id ? { op: \"delete\", type, id } : null;\n }\n const id = extractId(p.new);\n if (!id) return null;\n return { op: p.eventType === \"INSERT\" ? \"insert\" : \"upsert\", type, id, data: p.new };\n }\n\n return {\n name: \"supabase-realtime\",\n /**\n * Generic subscribe is a no-op for Supabase. Use `subscribeChannel()` instead,\n * which accepts a `ChannelConfig` with Supabase-specific table/filter parameters.\n */\n subscribe(_cfg: SubscriptionConfig, _handler: (cs: ChangeSet) => void): UnsubscribeFn {\n return () => {};\n },\n onStatusChange: (cb) => { statusCbs.add(cb); return () => statusCbs.delete(cb); },\n subscribeChannel(config) {\n const tableName =\n Object.entries(tableTypeMap).find(([, t]) => t === config.type)?.[0] ??\n config.type.toLowerCase();\n const filterStr = config.id\n ? `id=eq.${config.id}`\n : config.filter\n ? Object.entries(config.filter).map(([k, v]) => `${k}=eq.${v}`).join(\",\")\n : undefined;\n\n const channel = client\n .channel(`entity-store:${config.type}:${config.id ?? \"all\"}`)\n .on(\"postgres_changes\", { event: \"*\", schema, table: tableName, ...(filterStr ? { filter: filterStr } : {}) }, (payload) => {\n const change = payloadToChange(payload);\n if (!change) return;\n config._handler?.({ changes: [change], timestamp: new Date().toISOString() });\n })\n .subscribe((status) => {\n const s: AdapterStatus =\n status === \"SUBSCRIBED\" ? \"connected\" :\n status === \"CHANNEL_ERROR\" ? \"error\" :\n status === \"CLOSED\" ? \"disconnected\" : \"connecting\";\n for (const cb of statusCbs) cb(s);\n });\n\n return () => { channel.unsubscribe(); };\n },\n };\n}\n\n// =============================================================================\n// Convex adapter — snapshot-diff reactive queries → EntityChanges\n// =============================================================================\n\ninterface ConvexClient {\n onUpdate<T>(\n query: unknown,\n args: Record<string, unknown>,\n handler: (result: T) => void\n ): UnsubscribeFn;\n}\n\nexport interface ConvexChannelConfig<T extends object> {\n type: string;\n query: unknown;\n args?: Record<string, unknown>;\n extractId?: (record: T) => string;\n normalize?: (record: T) => Record<string, unknown>;\n}\n\nexport function createConvexAdapter<T extends object>(opts: {\n client: ConvexClient;\n channels: ConvexChannelConfig<T>[];\n}): RealtimeAdapter {\n const { client, channels } = opts;\n const statusCbs = new Set<(s: AdapterStatus) => void>();\n const snapshots = new Map<string, Map<string, T>>();\n\n function diffSnapshot(\n type: string,\n prev: Map<string, T>,\n next: T[],\n extractId: (r: T) => string,\n normalize?: (r: T) => Record<string, unknown>\n ): EntityChange[] {\n const changes: EntityChange[] = [];\n const nextIds = new Set<string>();\n\n for (const record of next) {\n const id = extractId(record);\n nextIds.add(id);\n const data = normalize ? normalize(record) : (record as unknown as Record<string, unknown>);\n changes.push({ op: prev.has(id) ? \"upsert\" : \"insert\", type, id, data });\n prev.set(id, record);\n }\n\n for (const [id] of prev) {\n if (!nextIds.has(id)) {\n changes.push({ op: \"delete\", type, id });\n prev.delete(id);\n }\n }\n\n return changes;\n }\n\n return {\n name: \"convex\",\n subscribe(_cfg: SubscriptionConfig, handler: (cs: ChangeSet) => void): UnsubscribeFn {\n const unsubs: UnsubscribeFn[] = [];\n\n for (const ch of channels) {\n const { type, query, args = {}, normalize } = ch;\n const extractId =\n ch.extractId ??\n ((r: T) =>\n String(\n (r as Record<string, unknown>)._id ??\n (r as Record<string, unknown>).id\n ));\n\n if (!snapshots.has(type)) snapshots.set(type, new Map());\n const snap = snapshots.get(type)!;\n\n unsubs.push(\n client.onUpdate(query, args, (records: T[]) => {\n const changes = diffSnapshot(type, snap, records, extractId, normalize);\n if (changes.length > 0)\n handler({ changes, timestamp: new Date().toISOString() });\n })\n );\n }\n\n for (const cb of statusCbs) cb(\"connected\");\n return () => {\n for (const u of unsubs) u();\n for (const cb of statusCbs) cb(\"disconnected\");\n };\n },\n onStatusChange: (cb) => { statusCbs.add(cb); return () => statusCbs.delete(cb); },\n };\n}\n\n// =============================================================================\n// GraphQL Subscription adapter — graphql-ws protocol\n// =============================================================================\n\ninterface GQLWsClient {\n subscribe<T>(\n payload: { query: string; variables?: Record<string, unknown> },\n sink: {\n next: (value: { data: T }) => void;\n error: (err: unknown) => void;\n complete: () => void;\n }\n ): UnsubscribeFn;\n}\n\nexport interface GQLSubscriptionConfig<T extends object> {\n type: string;\n document: string;\n variables?: Record<string, unknown>;\n getPayload: (\n data: T\n ) => GQLPayload | GQLPayload[] | null;\n}\n\ninterface GQLPayload {\n type?: string;\n node?: Record<string, unknown>;\n id?: string;\n}\n\nexport function createGraphQLSubscriptionAdapter<T extends object>(opts: {\n client: GQLWsClient;\n subscriptions: GQLSubscriptionConfig<T>[];\n extractId?: (node: Record<string, unknown>, type: string) => string;\n normalize?: (node: Record<string, unknown>, type: string) => Record<string, unknown>;\n}): RealtimeAdapter {\n const {\n client,\n subscriptions,\n extractId = (n) => String(n.id),\n normalize,\n } = opts;\n const statusCbs = new Set<(s: AdapterStatus) => void>();\n\n function payloadToChange(type: string, p: GQLPayload): EntityChange | null {\n const gqlType = p.type ?? \"updated\";\n\n if (gqlType === \"deleted\") {\n const id = p.id ?? (p.node ? extractId(p.node, type) : null);\n return id ? { op: \"delete\", type, id } : null;\n }\n\n if (!p.node) return null;\n const id = extractId(p.node, type);\n const data = normalize ? normalize(p.node, type) : stripTypename(p.node);\n const op: ChangeOperation = gqlType === \"created\" ? \"insert\" : \"upsert\";\n return { op, type, id, data };\n }\n\n return {\n name: \"graphql-subscription\",\n subscribe(_cfg: SubscriptionConfig, handler: (cs: ChangeSet) => void): UnsubscribeFn {\n const unsubs: UnsubscribeFn[] = [];\n\n for (const sub of subscriptions) {\n const { type, document, variables, getPayload } = sub;\n\n unsubs.push(\n client.subscribe<T>(\n { query: document, variables },\n {\n next: ({ data }) => {\n const raw = getPayload(data);\n if (!raw) return;\n const payloads = Array.isArray(raw) ? raw : [raw];\n const changes = payloads\n .map((p) => payloadToChange(type, p))\n .filter((c): c is EntityChange => c !== null);\n if (changes.length > 0)\n handler({ changes, timestamp: new Date().toISOString() });\n },\n error: (e) => {\n console.error(`[GQLSub] ${type}:`, e);\n for (const cb of statusCbs) cb(\"error\");\n },\n complete: () => {\n for (const cb of statusCbs) cb(\"disconnected\");\n },\n }\n )\n );\n }\n\n for (const cb of statusCbs) cb(\"connected\");\n return () => { for (const u of unsubs) u(); };\n },\n onStatusChange: (cb) => { statusCbs.add(cb); return () => statusCbs.delete(cb); },\n };\n}\n\nfunction stripTypename(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (k === \"__typename\") continue;\n result[k] =\n v && typeof v === \"object\" && !Array.isArray(v)\n ? stripTypename(v as Record<string, unknown>)\n : v;\n }\n return result;\n}\n","/**\n * adapters/surreal-live.ts\n *\n * SurrealDB LIVE SELECT realtime adapter.\n *\n * SurrealDB live stream → per-channel state machine → RealtimeAdapter contract\n * one ChannelConfig = one LIVE SELECT = one independent reconnect/replay state\n *\n * Implements the RealtimeAdapter contract (NOT SyncAdapter) per the corrected\n * spec at openspec/specs/entity-surreal-live-adapter/spec.md. The consumer\n * owns the SurrealDB client; the adapter only orchestrates live queries.\n */\n\nimport type {\n RealtimeAdapter,\n SubscriptionConfig,\n ChannelConfig,\n ChangeSet,\n EntityChange,\n ChangeOperation,\n AdapterStatus,\n UnsubscribeFn,\n} from \"./types\";\nimport type { EntityType, EntityId } from \"../graph\";\n\n// ---------------------------------------------------------------------------\n// Public surface — minimal-surface types (D1: no hard dep on `surrealdb`)\n// ---------------------------------------------------------------------------\n\nexport interface SurrealLike {\n query<T = unknown>(sql: string, vars?: Record<string, unknown>): Promise<T[]>;\n live<T = unknown>(\n table: string,\n callback: (action: SurrealLiveAction<T>) => void,\n diff?: boolean,\n ): Promise<string>;\n kill(uuid: string): Promise<void>;\n}\n\nexport interface SurrealLiveAction<T = unknown> {\n action: \"CREATE\" | \"UPDATE\" | \"DELETE\" | \"CLOSE\" | string;\n result: T;\n}\n\nexport interface SurrealCheckpointStore {\n get(channelKey: string): Promise<string | undefined>;\n set(channelKey: string, value: string): Promise<void>;\n}\n\nexport interface SurrealTableConfig {\n type: EntityType;\n /** SurrealDB table name; defaults to `type`. */\n table?: string;\n /** Field in the row that carries the entity id; defaults to \"id\". */\n idField?: string;\n}\n\nexport interface SurrealLiveAdapterOptions {\n name?: string;\n surreal: SurrealLike;\n tables: SurrealTableConfig[];\n initialQueryStrategy?: \"select-then-live\" | \"live-only\";\n initialDelayMs?: number;\n maxDelayMs?: number;\n connectedSettleMs?: number;\n checkpointStore?: SurrealCheckpointStore;\n checkpointField?: string;\n listKeyResolver?: (change: EntityChange) => string[] | undefined;\n permanentErrorPatterns?: RegExp[];\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createSurrealLiveAdapter(opts: SurrealLiveAdapterOptions): RealtimeAdapter {\n return new SurrealLiveAdapter(opts);\n}\n\n// ---------------------------------------------------------------------------\n// Internals — Adapter\n// ---------------------------------------------------------------------------\n\ntype Row = Record<string, unknown>;\n\nconst DEFAULT_INITIAL_DELAY = 500;\nconst DEFAULT_MAX_DELAY = 30_000;\nconst DEFAULT_CONNECTED_SETTLE = 30_000;\nconst DEFAULT_CHECKPOINT_FIELD = \"updated_at\";\nconst DEFAULT_PERMANENT_PATTERNS = [\n /authentication/i,\n /unauthor/i,\n /namespace/i,\n /unknown\\s+table/i,\n /permission/i,\n];\nconst STATUS_PRIORITY: AdapterStatus[] = [\"error\", \"disconnected\", \"connecting\", \"connected\"];\n\nclass SurrealLiveAdapter implements RealtimeAdapter {\n readonly name: string;\n private readonly opts: Required<\n Omit<SurrealLiveAdapterOptions, \"checkpointStore\" | \"listKeyResolver\" | \"name\">\n > & {\n name: string;\n checkpointStore?: SurrealCheckpointStore;\n listKeyResolver?: (change: EntityChange) => string[] | undefined;\n };\n private readonly channels = new Map<string, SurrealChannel>();\n private readonly channelStates = new Map<string, AdapterStatus>();\n private readonly statusCallbacks = new Set<(status: AdapterStatus) => void>();\n private _status: AdapterStatus = \"connecting\";\n\n constructor(rawOpts: SurrealLiveAdapterOptions) {\n this.opts = {\n name: rawOpts.name ?? \"surreal-live\",\n surreal: rawOpts.surreal,\n tables: rawOpts.tables,\n initialQueryStrategy: rawOpts.initialQueryStrategy ?? \"select-then-live\",\n initialDelayMs: rawOpts.initialDelayMs ?? DEFAULT_INITIAL_DELAY,\n maxDelayMs: rawOpts.maxDelayMs ?? DEFAULT_MAX_DELAY,\n connectedSettleMs: rawOpts.connectedSettleMs ?? DEFAULT_CONNECTED_SETTLE,\n checkpointField: rawOpts.checkpointField ?? DEFAULT_CHECKPOINT_FIELD,\n permanentErrorPatterns: rawOpts.permanentErrorPatterns ?? DEFAULT_PERMANENT_PATTERNS,\n checkpointStore: rawOpts.checkpointStore,\n listKeyResolver: rawOpts.listKeyResolver,\n };\n this.name = this.opts.name;\n }\n\n subscribe(config: SubscriptionConfig, handler: (cs: ChangeSet) => void): UnsubscribeFn {\n const channelConfig = this._resolveChannelConfig(config);\n const key = this._channelKey(config, channelConfig);\n const channel = new SurrealChannel(this, config, channelConfig, key, handler);\n this.channels.set(key, channel);\n this.channelStates.set(key, \"connecting\");\n this._recomputeStatus();\n // Fire-and-forget start; channel records its own status transitions.\n channel.start().catch(() => {\n // start() handles its own error reporting via _setStatus(error)\n });\n return () => {\n const ch = this.channels.get(key);\n if (!ch) return;\n this.channels.delete(key);\n this.channelStates.delete(key);\n void ch.stop();\n this._recomputeStatus();\n };\n }\n\n onStatusChange = (cb: (status: AdapterStatus) => void): UnsubscribeFn => {\n this.statusCallbacks.add(cb);\n return () => {\n this.statusCallbacks.delete(cb);\n };\n };\n\n // ─── package-private helpers used by SurrealChannel ───────────────────────\n\n _setChannelStatus(key: string, status: AdapterStatus): void {\n if (this.channelStates.get(key) === status) return;\n this.channelStates.set(key, status);\n this._recomputeStatus();\n }\n\n _getOpts() {\n return this.opts;\n }\n\n private _recomputeStatus(): void {\n const states = [...this.channelStates.values()];\n const aggregate: AdapterStatus =\n states.length === 0\n ? \"connecting\"\n : (STATUS_PRIORITY.find((s) => states.includes(s)) ?? \"connecting\");\n if (aggregate === this._status) return;\n this._status = aggregate;\n for (const cb of this.statusCallbacks) cb(aggregate);\n }\n\n private _resolveChannelConfig(config: SubscriptionConfig): ChannelConfig {\n // The RealtimeManager passes `label: \"<adapter-name>/<type>\"`; recover the type from there.\n // When labels don't follow that shape, fall back to the first configured table.\n const labelType = config.label?.split(\"/\").pop();\n const match = this.opts.tables.find((t) => t.type === labelType) ?? this.opts.tables[0];\n if (!match) {\n throw new Error(\n `[surreal-live] no tables configured; pass at least one SurrealTableConfig to createSurrealLiveAdapter`,\n );\n }\n return {\n type: match.type,\n };\n }\n\n private _channelKey(config: SubscriptionConfig, channelConfig: ChannelConfig): string {\n const label = config.label ?? `${this.name}/${channelConfig.type}`;\n return label;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internals — per-channel state machine (design D2)\n// ---------------------------------------------------------------------------\n\nclass SurrealChannel {\n private liveUuid: string | null = null;\n private buffer: SurrealLiveAction<Row>[] = [];\n private seedComplete = false;\n private attempt = 0;\n private connectedSettleTimer: ReturnType<typeof setTimeout> | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private aborted = false;\n private status: AdapterStatus = \"connecting\";\n\n constructor(\n private readonly adapter: SurrealLiveAdapter,\n private readonly config: SubscriptionConfig,\n private readonly channelConfig: ChannelConfig,\n readonly key: string,\n private readonly handler: (cs: ChangeSet) => void,\n ) {}\n\n async start(): Promise<void> {\n if (this.aborted) return;\n this._setStatus(\"connecting\");\n try {\n // D3: open LIVE first so notifications arriving during seed are buffered.\n await this._openLive();\n const opts = this.adapter._getOpts();\n if (opts.initialQueryStrategy !== \"live-only\") {\n await this._runSeed();\n }\n // Flush the buffer (which may have grown during seed) in arrival order.\n this.seedComplete = true;\n const buffered = this.buffer.splice(0);\n for (const action of buffered) this._handleAction(action);\n this._setStatus(\"connected\");\n this._armConnectedSettle();\n } catch (err) {\n this._scheduleReconnect(err);\n }\n }\n\n async stop(): Promise<void> {\n this.aborted = true;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.connectedSettleTimer) {\n clearTimeout(this.connectedSettleTimer);\n this.connectedSettleTimer = null;\n }\n if (this.liveUuid) {\n const uuid = this.liveUuid;\n this.liveUuid = null;\n try {\n await this.adapter._getOpts().surreal.kill(uuid);\n } catch {\n // already-closed live queries are no-ops (defensive per design risk §4)\n }\n }\n }\n\n // ─── private ──────────────────────────────────────────────────────────────\n\n private _table(): string {\n const t = this.adapter._getOpts().tables.find((x) => x.type === this.channelConfig.type);\n return t?.table ?? this.channelConfig.type;\n }\n\n private _idField(): string {\n const t = this.adapter._getOpts().tables.find((x) => x.type === this.channelConfig.type);\n return t?.idField ?? \"id\";\n }\n\n private async _openLive(): Promise<void> {\n if (this.aborted) return;\n const surreal = this.adapter._getOpts().surreal;\n this.liveUuid = await surreal.live<Row>(this._table(), (action) => {\n this._onLiveAction(action);\n });\n }\n\n private _onLiveAction(action: SurrealLiveAction<Row>): void {\n if (this.aborted) return;\n if (!this.seedComplete) {\n this.buffer.push(action);\n return;\n }\n this._handleAction(action);\n }\n\n private _handleAction(action: SurrealLiveAction<Row>): void {\n const op = mapAction(action.action);\n if (op === \"close\") {\n this._scheduleReconnect(new Error(\"SurrealDB live query closed\"));\n return;\n }\n if (op === null) {\n // Unknown action — warn + skip.\n // eslint-disable-next-line no-console\n console.warn(`[surreal-live] unknown action \"${action.action}\"; skipping`);\n return;\n }\n // D8: ChannelConfig.operations filter — honor when present.\n const allowed = this.channelConfig.operations;\n if (allowed && !allowed.includes(op)) return;\n\n const change = this._rowToChange(op, action.result);\n if (!change) return;\n const changeset: ChangeSet = {\n changes: [change],\n timestamp: new Date().toISOString(),\n affectedListKeys: this._resolveListKeys([change]),\n };\n this.handler(changeset);\n void this._persistCheckpoint(change);\n }\n\n private async _runSeed(): Promise<void> {\n const surreal = this.adapter._getOpts().surreal;\n const table = this._table();\n const sql = `SELECT * FROM ${table}`;\n const rows = (await surreal.query<Row>(sql)) ?? [];\n const changes: EntityChange[] = [];\n for (const row of rows) {\n const change = this._rowToChange(\"insert\", row);\n if (change) changes.push(change);\n }\n const changeset: ChangeSet = {\n changes,\n timestamp: new Date().toISOString(),\n affectedListKeys: this._resolveListKeys(changes),\n };\n this.handler(changeset);\n // Update checkpoint to the latest seen row (best-effort).\n for (const change of changes) void this._persistCheckpoint(change);\n }\n\n private _rowToChange(op: ChangeOperation, row: Row | null | undefined): EntityChange | null {\n if (!row && op !== \"delete\") return null;\n const idValue = row?.[this._idField()];\n if (idValue == null) {\n // delete without an id — skip; consumer can't act on it\n // eslint-disable-next-line no-console\n console.warn(`[surreal-live] action ${op} missing id field \"${this._idField()}\"; skipping`);\n return null;\n }\n const id = String(idValue) as EntityId;\n const base = {\n op,\n type: this.channelConfig.type,\n id,\n };\n if (op === \"delete\") return base;\n return { ...base, data: row as Record<string, unknown> };\n }\n\n private _resolveListKeys(changes: EntityChange[]): string[] | undefined {\n const resolver = this.adapter._getOpts().listKeyResolver;\n if (!resolver) return undefined;\n const acc = new Set<string>();\n for (const change of changes) {\n const keys = resolver(change);\n if (!keys) continue;\n for (const k of keys) acc.add(k);\n }\n return acc.size === 0 ? undefined : [...acc];\n }\n\n private async _persistCheckpoint(change: EntityChange): Promise<void> {\n const opts = this.adapter._getOpts();\n if (!opts.checkpointStore) return;\n const value = (change.data as Record<string, unknown> | undefined)?.[opts.checkpointField];\n if (value == null) return;\n try {\n await opts.checkpointStore.set(this.key, String(value));\n } catch {\n // best-effort; do not interrupt the dispatch loop\n }\n }\n\n private async _replayFromCheckpoint(): Promise<void> {\n const opts = this.adapter._getOpts();\n if (!opts.checkpointStore) return;\n const stored = await opts.checkpointStore.get(this.key);\n if (!stored) return;\n const sql = `SELECT * FROM ${this._table()} WHERE ${opts.checkpointField} > $stored ORDER BY ${opts.checkpointField} ASC`;\n const rows = (await opts.surreal.query<Row>(sql, { stored })) ?? [];\n if (rows.length === 0) return;\n const changes: EntityChange[] = [];\n for (const row of rows) {\n const change = this._rowToChange(\"update\", row);\n if (change) changes.push(change);\n }\n if (changes.length === 0) return;\n const changeset: ChangeSet = {\n changes,\n timestamp: new Date().toISOString(),\n affectedListKeys: this._resolveListKeys(changes),\n };\n this.handler(changeset);\n for (const change of changes) void this._persistCheckpoint(change);\n }\n\n private _scheduleReconnect(reason: unknown): void {\n if (this.aborted) return;\n if (this._isPermanent(reason)) {\n this._setStatus(\"error\");\n return;\n }\n this._setStatus(\"disconnected\");\n this.attempt += 1;\n const opts = this.adapter._getOpts();\n const exp = Math.min(this.attempt - 1, 6);\n const base = Math.min(opts.initialDelayMs * 2 ** exp, opts.maxDelayMs);\n const jitter = base * 0.25 * (Math.random() * 2 - 1);\n const delay = Math.max(0, Math.round(base + jitter));\n this._setStatus(\"connecting\");\n this.reconnectTimer = setTimeout(async () => {\n if (this.aborted) return;\n try {\n await this._openLive();\n if (opts.checkpointStore) await this._replayFromCheckpoint();\n this._setStatus(\"connected\");\n this._armConnectedSettle();\n } catch (err) {\n this._scheduleReconnect(err);\n }\n }, delay);\n }\n\n private _isPermanent(reason: unknown): boolean {\n const msg = reason instanceof Error ? reason.message : String(reason ?? \"\");\n const patterns = this.adapter._getOpts().permanentErrorPatterns;\n return patterns.some((re) => re.test(msg));\n }\n\n private _armConnectedSettle(): void {\n if (this.connectedSettleTimer) clearTimeout(this.connectedSettleTimer);\n this.connectedSettleTimer = setTimeout(() => {\n this.attempt = 0;\n }, this.adapter._getOpts().connectedSettleMs);\n }\n\n private _setStatus(status: AdapterStatus): void {\n if (this.status === status) return;\n this.status = status;\n this.adapter._setChannelStatus(this.key, status);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Action enum normalization (design D6)\n// ---------------------------------------------------------------------------\n\nfunction mapAction(action: string): ChangeOperation | \"close\" | null {\n switch ((action ?? \"\").toUpperCase()) {\n case \"CREATE\":\n return \"insert\";\n case \"UPDATE\":\n return \"update\";\n case \"DELETE\":\n return \"delete\";\n case \"CLOSE\":\n return \"close\";\n default:\n return null;\n }\n}\n","/**\n * adapters/flint.ts — Flint Realtime Fabric adapter.\n *\n * Flint frf-entity-management `watchEntities()` AsyncIterable\n * → our ChangeSet stream → RealtimeManager → entity graph\n *\n * GAP-1 is a BRIDGE, not a from-scratch build: the Flint repo already ships\n * `@prometheusags/frf-entity-management` whose `RealtimeAdapter.watchEntities()`\n * yields a plain `EntityEvent` (it JSON-decodes the spine envelope — no proto\n * types leak). We consume that entity-shaped facade behind a minimal-surface\n * type, so:\n * - The unfrozen `proto-v1` risk is contained BELOW this seam.\n * - `@prometheusags/frf-sdk` stays an OPTIONAL peer; this module imports\n * nothing from it. The consumer constructs the Flint client and passes it in.\n *\n * `EntityEvent.offset` (bigint) is forwarded to an optional checkpoint store so\n * reconnects resume from the last seen offset (mirrors the surreal-live adapter).\n */\n\nimport type {\n RealtimeAdapter,\n SubscriptionConfig,\n ChangeSet,\n EntityChange,\n ChangeOperation,\n AdapterStatus,\n UnsubscribeFn,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Minimal surface of the Flint frf-entity-management facade (no frf-sdk dep).\n// Mirrors sdks/entity-management/src/{adapter,types}.ts exactly.\n// ---------------------------------------------------------------------------\n\n/** A decoded entity change event received from the Flint spine. */\nexport interface FlintEntityEvent {\n entityType: string;\n entityId: string;\n tenantId: string;\n channelId: string;\n data: Record<string, unknown>;\n offset: bigint;\n correlationId?: string;\n}\n\n/** Filter criteria for a Flint entity subscription. */\nexport interface FlintEntityQuery {\n channelId: string;\n consumerId: string;\n entityType?: string;\n fromOffset?: bigint;\n}\n\n/** An entity mutation to publish on the Flint spine. */\nexport interface FlintEntityRecord {\n entityType: string;\n entityId: string;\n tenantId: string;\n channelId: string;\n data: Record<string, unknown>;\n correlationId?: string;\n}\n\n/** Minimal surface of the Flint `RealtimeAdapter` we consume. */\nexport interface FlintClientLike {\n watchEntities(query: FlintEntityQuery): AsyncIterable<FlintEntityEvent>;\n mutateEntity(record: FlintEntityRecord): Promise<void>;\n}\n\n/** Optional resume-offset persistence (per channel+consumer). */\nexport interface FlintCheckpointStore {\n get(key: string): Promise<bigint | undefined> | bigint | undefined;\n set(key: string, offset: bigint): Promise<void> | void;\n}\n\nexport interface CreateFlintAdapterOptions {\n name?: string;\n /** The Flint entity-management client (frf-entity-management RealtimeAdapter). */\n client: FlintClientLike;\n /** Channel to subscribe/publish on. */\n channelId: string;\n /** Consumer id for this subscription. */\n consumerId: string;\n /** Restrict to one entity type (optional). */\n entityType?: string;\n /** Resume-offset store; reconnects start `fromOffset = lastSeen + 1`. */\n checkpoints?: FlintCheckpointStore;\n /** Map a Flint event to a change operation. Defaults to \"upsert\". */\n resolveOp?: (event: FlintEntityEvent) => ChangeOperation;\n}\n\nfunction checkpointKey(channelId: string, consumerId: string): string {\n return `flint:${channelId}:${consumerId}`;\n}\n\n/**\n * Build a {@link RealtimeAdapter} backed by the Flint Realtime Fabric.\n *\n * The consumer owns the Flint client (constructed from `@prometheusags/frf-sdk`\n * / `frf-entity-management`); this adapter only orchestrates the stream.\n *\n * @example\n * ```ts\n * import { RealtimeAdapter as FrfAdapter } from \"@prometheusags/frf-entity-management\";\n * import { getRealtimeManager, createFlintAdapter } from \"@prometheus-ags/prometheus-entity-management\";\n *\n * const flint = new FrfAdapter(spineClient);\n * const adapter = createFlintAdapter({ client: flint, channelId: \"tenant-1\", consumerId: \"web-1\" });\n * getRealtimeManager().register(adapter);\n * ```\n */\nexport function createFlintAdapter(options: CreateFlintAdapterOptions): RealtimeAdapter {\n const {\n client,\n channelId,\n consumerId,\n entityType,\n checkpoints,\n resolveOp = () => \"upsert\" as ChangeOperation,\n } = options;\n const name = options.name ?? `flint:${channelId}`;\n const statusListeners = new Set<(s: AdapterStatus) => void>();\n\n function emitStatus(s: AdapterStatus): void {\n for (const cb of statusListeners) cb(s);\n }\n\n return {\n name,\n\n subscribe(_config: SubscriptionConfig, handler: (changeset: ChangeSet) => void): UnsubscribeFn {\n let cancelled = false;\n emitStatus(\"connecting\");\n\n (async () => {\n const key = checkpointKey(channelId, consumerId);\n const lastSeen = checkpoints ? await checkpoints.get(key) : undefined;\n const query: FlintEntityQuery = {\n channelId,\n consumerId,\n ...(entityType !== undefined ? { entityType } : {}),\n ...(lastSeen !== undefined ? { fromOffset: lastSeen + 1n } : {}),\n };\n\n try {\n emitStatus(\"connected\");\n for await (const event of client.watchEntities(query)) {\n if (cancelled) break;\n if (entityType !== undefined && event.entityType !== entityType) continue;\n\n const change: EntityChange = {\n op: resolveOp(event),\n type: event.entityType,\n id: event.entityId,\n data: event.data,\n };\n const changeset: ChangeSet = {\n changes: [change],\n timestamp: new Date().toISOString(),\n };\n handler(changeset);\n\n if (checkpoints) await checkpoints.set(key, event.offset);\n }\n if (!cancelled) emitStatus(\"disconnected\");\n } catch {\n if (!cancelled) emitStatus(\"error\");\n }\n })();\n\n return () => {\n cancelled = true;\n emitStatus(\"disconnected\");\n };\n },\n\n onStatusChange(cb) {\n statusListeners.add(cb);\n return () => statusListeners.delete(cb);\n },\n };\n}\n\n/**\n * Publish an entity mutation to the Flint spine via the client.\n * Thin pass-through kept here so consumers import one Flint surface from us.\n */\nexport async function publishFlintMutation(\n client: FlintClientLike,\n record: FlintEntityRecord,\n): Promise<void> {\n await client.mutateEntity(record);\n}\n","/**\n * adapters/electricsql.ts (core)\n *\n * ElectricSQL + PGlite local-first adapter — the React-free base.\n *\n * Server Postgres → ElectricSQL shape sync (SSE) → PGlite (local WASM Postgres)\n * ↓ NOTIFY\n * Entity Graph (Zustand)\n *\n * React hooks (`useLocalFirst`, `usePGliteQuery`) live in the binding package\n * (`@prometheus-ags/entity-graph-react`), built on this adapter.\n */\nimport { getRealtimeManager } from \"./realtime-manager\";\nimport type { SyncAdapter, SubscriptionConfig, ChangeSet, EntityChange, AdapterStatus, UnsubscribeFn } from \"./types\";\nimport type { EntityType } from \"../graph\";\n\n// ---------------------------------------------------------------------------\n// Minimal surface types (avoids hard deps on @electric-sql/pglite etc.)\n// ---------------------------------------------------------------------------\ninterface PGlite {\n query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<{ rows: T[] }>;\n exec(sql: string): Promise<unknown>;\n listen(channel: string, handler: (payload: string) => void): Promise<() => void>;\n}\ninterface ShapeMessage<T = Record<string, unknown>> {\n headers: { operation: \"insert\" | \"update\" | \"delete\" };\n offset: string; value: T; key: string;\n}\ninterface ShapeStream<T = Record<string, unknown>> {\n subscribe(onMsg: (msgs: ShapeMessage<T>[]) => void, onErr?: (e: Error) => void): () => void;\n isUpToDate: boolean; lastOffset: string;\n /**\n * Electric's handle for this shape. Optional because this is a structural\n * type over the real client and older streams may not expose it — a batch\n * without a handle yields no cursor rather than a half-formed one, since a\n * resume needs BOTH handle and offset.\n */\n shapeHandle?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\nexport interface ElectricTableConfig<T extends object> {\n type: EntityType; table: string; where?: string; idColumn?: string;\n normalize?: (row: T) => Record<string, unknown>;\n shapeStream: ShapeStream<T>;\n}\n\nexport interface ElectricAdapterOptions {\n pglite: PGlite;\n tables: ElectricTableConfig<Record<string, unknown>>[];\n onSynced?: () => void;\n}\n\n// re-export the realtime manager getter so the react hook can reach it via core\nexport { getRealtimeManager };\n\n// ---------------------------------------------------------------------------\n// Adapter factory (React-free)\n// ---------------------------------------------------------------------------\nexport function createElectricAdapter(opts: ElectricAdapterOptions): SyncAdapter {\n const { pglite, tables, onSynced } = opts;\n const statusCbs = new Set<(s: AdapterStatus) => void>();\n const syncedCbs = new Set<() => void>();\n const syncedTables = new Set<string>();\n let globalHandler: ((cs: ChangeSet) => void) | null = null;\n\n function checkAllSynced() {\n if (tables.every((t) => syncedTables.has(t.table))) { onSynced?.(); for (const cb of syncedCbs) cb(); }\n }\n\n function toChange<T extends object>(tc: ElectricTableConfig<T>, msg: ShapeMessage<T>): EntityChange | null {\n const { type, idColumn = \"id\", normalize } = tc; const op = msg.headers.operation;\n const raw = msg.value; const id = String((raw as Record<string, unknown>)[idColumn]); if (!id) return null;\n const data = normalize ? normalize(raw) : (raw as Record<string, unknown>);\n if (op === \"delete\") return { op: \"delete\", type, id };\n return { op: op === \"insert\" ? \"insert\" : \"upsert\", type, id, data };\n }\n\n const shapeUnsubs: UnsubscribeFn[] = [];\n for (const tc of tables) {\n shapeUnsubs.push(tc.shapeStream.subscribe((msgs) => {\n if (!globalHandler) return;\n const changes = msgs.map((m) => toChange(tc as ElectricTableConfig<Record<string, unknown>>, m as ShapeMessage<Record<string, unknown>>)).filter((c): c is EntityChange => c !== null);\n // Carry the batch's resume position. `toChange` drops `msg.offset`\n // because an offset describes a batch boundary, not an individual row —\n // so it is taken from the LAST message and attached to the ChangeSet.\n // Without this the consumer has rows it cannot checkpoint (ADR-009 G3).\n const last = msgs.at(-1) as ShapeMessage<Record<string, unknown>> | undefined;\n const handle = tc.shapeStream.shapeHandle;\n const cursor = handle && last?.offset ? { handle, offset: last.offset } : undefined;\n if (changes.length > 0) globalHandler({ changes, timestamp: new Date().toISOString(), cursor });\n if (tc.shapeStream.isUpToDate) { syncedTables.add(tc.table); checkAllSynced(); }\n }, (e) => { console.error(`[Electric] ${tc.table}:`, e); for (const cb of statusCbs) cb(\"error\"); }));\n }\n\n void (async () => {\n for (const tc of tables) {\n await pglite.listen(`entity_store_${tc.table}`, (payload) => {\n if (!globalHandler) return;\n try {\n const parsed: { op: string; row: Record<string, unknown> } = JSON.parse(payload);\n // A local trigger notification is NOT an Electric shape message and\n // has no offset of its own. The empty string is a placeholder for the\n // unused ShapeMessage field, and no cursor is emitted — this batch\n // genuinely cannot be checkpointed.\n const change = toChange(tc as ElectricTableConfig<Record<string, unknown>>, { headers: { operation: parsed.op as \"insert\"|\"update\"|\"delete\" }, offset: \"\", key: String(parsed.row[tc.idColumn ?? \"id\"]), value: parsed.row });\n if (change) globalHandler({ changes: [change] });\n } catch { /* non-JSON frame */ }\n });\n }\n })();\n\n return {\n name: \"electricsql\",\n subscribe(_cfg: SubscriptionConfig, handler: (cs: ChangeSet) => void): UnsubscribeFn {\n globalHandler = handler;\n for (const cb of statusCbs) cb(\"connected\");\n return () => { globalHandler = null; for (const u of shapeUnsubs) u(); };\n },\n onStatusChange(cb) { statusCbs.add(cb); return () => statusCbs.delete(cb); },\n async query<T = Record<string, unknown>>(sql: string, params?: unknown[]) { const r = await pglite.query<T>(sql, params); return { rows: r.rows }; },\n async execute(sql: string, _params?: unknown[]) { await pglite.exec(sql); },\n isSynced() { return tables.every((t) => syncedTables.has(t.table)); },\n onSyncComplete(cb): UnsubscribeFn {\n if (this.isSynced()) { cb(); return () => {}; }\n syncedCbs.add(cb); return () => syncedCbs.delete(cb);\n },\n };\n}\n","/**\n * adapters/electricsql-tenant.ts\n *\n * Tenant-scoped Electric adapter — the safety primitive that enforces\n * **RULE 5 — Shape predicates ⊆ RLS** (see hotseaters constraints).\n *\n * PGlite has no row-level security. The only way to guarantee a client\n * never sees cross-tenant data through Electric is to refuse to attach\n * any shape that lacks a tenant predicate. This wrapper does exactly that:\n *\n * - Validates the tenant claim (currently `{ companyId }`) is a UUID.\n * - Refuses to attach a shape whose `tenantColumn` is `undefined`. We\n * accept explicit `null` for the company root itself (filtered by `id`).\n * - Builds the `where` clause from `tenantColumn` and the validated\n * companyId so individual shape factories cannot drift from RLS.\n * - Delegates to the existing `createElectricAdapter` for the actual\n * sync wiring.\n *\n * This also fulfils Change 13 item 11 (auth-claim-aware shape registration):\n * the `tenantClaim` is the typed seam where authn meets shape registration.\n *\n * Self-hosted Supabase only. Local stack and `https://electricsql.prometheusags.ai`\n * are the only acceptable Electric endpoints — this module does not\n * hard-code either; it only governs the predicate.\n */\n\nimport { createElectricAdapter } from \"./electricsql\";\nimport type { SyncAdapter } from \"./types\";\nimport type { EntityType } from \"../graph\";\n\n// ---------------------------------------------------------------------------\n// Minimal surface types (mirror adapters/electricsql.ts)\n// ---------------------------------------------------------------------------\ninterface PGlite {\n query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<{ rows: T[] }>;\n exec(sql: string): Promise<unknown>;\n listen(channel: string, handler: (payload: string) => void): Promise<() => void>;\n}\n\ninterface ShapeMessage<T = Record<string, unknown>> {\n headers: { operation: \"insert\" | \"update\" | \"delete\" };\n offset: string;\n value: T;\n key: string;\n}\n\ninterface ShapeStream<T = Record<string, unknown>> {\n subscribe(onMsg: (msgs: ShapeMessage<T>[]) => void, onErr?: (e: Error) => void): () => void;\n isUpToDate: boolean;\n lastOffset: string;\n}\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/** Auth claim required to register tenant-scoped shapes. */\nexport interface TenantClaim {\n companyId: string;\n}\n\nexport interface TenantScopedTableConfig<T extends object = Record<string, unknown>> {\n type: EntityType;\n table: string;\n /**\n * Column used for tenant filtering.\n *\n * - A string (`\"company_id\"`) yields `WHERE company_id = '<companyId>'`.\n * - Explicit `null` means the table IS the tenant root and is filtered by\n * `id = '<companyId>'`. Only the `company` table qualifies.\n * - `undefined` is **rejected** — this is the safety gate.\n */\n tenantColumn: string | null;\n primaryKey?: string[];\n /**\n * Factory invoked with the constructed `where` clause and the tenant claim.\n * Consumers wire their preferred Electric `ShapeStream` builder here. The\n * factory must use the supplied `where` verbatim (no widening).\n */\n shapeStreamFactory: (params: {\n table: string;\n where: string;\n tenantClaim: TenantClaim;\n }) => ShapeStream<T>;\n normalize?: (row: T) => Record<string, unknown>;\n}\n\nexport interface TenantScopedAdapterOptions {\n pglite: PGlite;\n tenantClaim: TenantClaim;\n tables: TenantScopedTableConfig[];\n onSynced?: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nfunction assertUuid(companyId: string): void {\n if (typeof companyId !== \"string\" || !UUID_RE.test(companyId)) {\n throw new Error(\n `tenant-scoped adapter: companyId must be a UUID, received \"${companyId}\".`,\n );\n }\n}\n\nfunction assertSafeColumn(column: string): void {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(column)) {\n throw new Error(`tenant-scoped adapter: unsafe tenantColumn \"${column}\".`);\n }\n}\n\n/**\n * Build the `where` clause for a single shape. Exposed for tests.\n *\n * - `tenantColumn === null` → `id = '<companyId>'` (company-root case)\n * - `tenantColumn === string` → `<tenantColumn> = '<companyId>'`\n *\n * Throws if `tenantColumn` is `undefined` or `companyId` is not a UUID.\n */\nexport function buildTenantWhere(\n tenantColumn: string | null | undefined,\n companyId: string,\n tableLabel: string,\n): string {\n if (typeof tenantColumn === \"undefined\") {\n throw new Error(\n `shape \"${tableLabel}\" lacks tenantColumn — tenant-scoped adapter refuses to attach unscoped shapes.`,\n );\n }\n assertUuid(companyId);\n if (tenantColumn === null) {\n return `id = '${companyId}'`;\n }\n assertSafeColumn(tenantColumn);\n return `${tenantColumn} = '${companyId}'`;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Build a tenant-scoped {@link SyncAdapter}.\n *\n * For each table in `tables`:\n * 1. Validates `tenantColumn` is defined (string or explicit null).\n * 2. Validates `companyId` is a UUID.\n * 3. Builds the predicate and calls `shapeStreamFactory(...)` to get the\n * actual `ShapeStream`.\n * 4. Hands the resulting list off to `createElectricAdapter` for wiring.\n *\n * @throws if any table lacks `tenantColumn`, or the company id is not a UUID.\n */\nexport function createTenantScopedElectricAdapter(\n opts: TenantScopedAdapterOptions,\n): SyncAdapter {\n const { pglite, tenantClaim, tables, onSynced } = opts;\n assertUuid(tenantClaim.companyId);\n\n const wired = tables.map((tc) => {\n const where = buildTenantWhere(tc.tenantColumn, tenantClaim.companyId, tc.table);\n const shapeStream = tc.shapeStreamFactory({ table: tc.table, where, tenantClaim });\n return {\n type: tc.type,\n table: tc.table,\n where,\n idColumn: tc.primaryKey?.[0] ?? \"id\",\n normalize: tc.normalize,\n shapeStream,\n };\n });\n\n return createElectricAdapter({ pglite, tables: wired, onSynced });\n}\n","/**\n * adapters/pglite-persistence.ts\n *\n * PGlite-backed implementation of {@link GraphPersistenceAdapter}.\n *\n * Stores the local-first runtime's graph snapshot inside a PGlite table\n * (`_graph_snapshot` by default) instead of `localStorage`/`IndexedDB`.\n *\n * Why this exists:\n * - The app already has a PGlite handle for ElectricSQL sync.\n * - Putting the graph snapshot alongside synced data means one storage\n * surface to back up, clear, and reason about.\n * - Works in Tauri WebView + Node (PGlite is a WASM Postgres) without\n * pulling in browser-only storage.\n *\n * Contract:\n * - `get(key)` -> returns the stored string or null\n * - `set(key, v)` -> upserts (insert-or-replace), stamping `updated_at`\n * - `remove(key)` -> deletes the row (no-op if absent)\n *\n * The function lazily ensures the storage table exists on first call.\n * That `CREATE TABLE IF NOT EXISTS` is idempotent so it's safe to retry.\n *\n * Self-hosted Supabase only. HotSeatersMVP is the bible. This module does\n * not import `@electric-sql/pglite` — consumers pass a PGlite-shaped handle.\n */\n\nimport type { GraphPersistenceAdapter } from \"../local-first-runtime\";\n\n/**\n * Where a replica resumes from, and which generation it belongs to.\n *\n * `handle` and `offset` are ElectricSQL's own values, echoed back verbatim on\n * resume — they are opaque here. `generation` increments when a snapshot is\n * rebuilt (Electric's must-refetch), so a checkpoint from a previous generation\n * is recognisably stale rather than silently resumed against new rows.\n */\nexport interface ReplicaCheckpoint {\n handle: string;\n offset: string;\n generation: number;\n}\n\n/** Checkpoint plus the rows it describes, committed together or not at all. */\nexport interface CheckpointedWrite {\n key: string;\n value: string;\n checkpoint: ReplicaCheckpoint;\n}\n\n/** What a caller should do with what it found on disk. */\nexport type ResumeDecision =\n | { action: \"resume\"; checkpoint: ReplicaCheckpoint }\n | { action: \"rebuild\"; reason: ResumeRejection };\n\n/**\n * Why a stored replica cannot be resumed.\n *\n * Each is a *rebuild*, never a silent continue: resuming against a boundary\n * that does not describe the rows on disk is how a replica ends up with a\n * plausible-looking mixture of two generations.\n */\nexport type ResumeRejection =\n /** Nothing stored — a cold start, not a fault. */\n | \"no-value\"\n /** Rows exist but were written by plain `set`, so their position is unknown. */\n | \"no-checkpoint\"\n /** The checkpoint predates a rebuild; its offsets refer to a dead generation. */\n | \"stale-generation\"\n /** The server issued a new shape handle, so old offsets are meaningless. */\n | \"handle-changed\";\n\n/**\n * Decide whether a stored replica may be resumed.\n *\n * Pure so the decision is testable without a database. `expected` is what the\n * caller intends to resume as — its current replica generation, and the shape\n * handle the server most recently gave it.\n */\nexport function evaluateResume(\n stored: { value: string | null; checkpoint: ReplicaCheckpoint | null },\n expected: { generation: number; handle?: string },\n): ResumeDecision {\n if (stored.value === null) return { action: \"rebuild\", reason: \"no-value\" };\n if (!stored.checkpoint) return { action: \"rebuild\", reason: \"no-checkpoint\" };\n if (stored.checkpoint.generation !== expected.generation) {\n return { action: \"rebuild\", reason: \"stale-generation\" };\n }\n // Only compare handles when the caller has one to compare against; a caller\n // that does not yet know the handle is resuming, not validating it.\n if (expected.handle && stored.checkpoint.handle !== expected.handle) {\n return { action: \"rebuild\", reason: \"handle-changed\" };\n }\n return { action: \"resume\", checkpoint: stored.checkpoint };\n}\n\n// ---------------------------------------------------------------------------\n// Minimal surface type — matches the pattern used by adapters/electricsql.ts.\n// Avoids a hard dep on @electric-sql/pglite.\n// ---------------------------------------------------------------------------\nexport interface PGlitePersistenceClient {\n query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<{ rows: T[] }>;\n exec(sql: string): Promise<unknown>;\n}\n\nexport interface CreatePGlitePersistenceAdapterOptions {\n /** Name of the snapshot table. Defaults to `_graph_snapshot`. */\n tableName?: string;\n}\n\n/**\n * A persistence adapter that can also commit a resume checkpoint atomically.\n *\n * The plain {@link GraphPersistenceAdapter} contract cannot express this: its\n * `set` writes a value and returns, so a checkpoint written after it is a\n * second transaction, and a crash between the two leaves rows whose resume\n * position is unknown. `setWithCheckpoint` closes that window (ADR-009 G3).\n */\nexport interface CheckpointingPersistenceAdapter extends GraphPersistenceAdapter {\n /** Commit rows and their resume checkpoint in ONE transaction. */\n setWithCheckpoint: (write: CheckpointedWrite) => Promise<void>;\n /** The checkpoint stored for `key`, or null if none. */\n getCheckpoint: (key: string) => Promise<ReplicaCheckpoint | null>;\n}\n\nconst DEFAULT_TABLE = \"_graph_snapshot\";\n\n/**\n * Returns a {@link GraphPersistenceAdapter} that reads/writes the graph\n * snapshot through a PGlite-shaped client.\n *\n * @example\n * ```ts\n * import { PGlite } from \"@electric-sql/pglite\";\n * import { startLocalFirstGraph, createPGlitePersistenceAdapter } from \"@prometheus-ags/prometheus-entity-management\";\n *\n * const pglite = await PGlite.create(\"idb://hotseaters\");\n * const storage = await createPGlitePersistenceAdapter(pglite);\n * const runtime = startLocalFirstGraph({ storage, key: \"hotseaters:graph\" });\n * ```\n */\nexport async function createPGlitePersistenceAdapter(\n pglite: PGlitePersistenceClient,\n options: CreatePGlitePersistenceAdapterOptions = {},\n): Promise<CheckpointingPersistenceAdapter> {\n const tableName = options.tableName ?? DEFAULT_TABLE;\n // Quote-escape the identifier with simple validation. Reject anything that\n // isn't a safe identifier so we never interpolate hostile names.\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(tableName)) {\n throw new Error(`createPGlitePersistenceAdapter: invalid tableName \"${tableName}\"`);\n }\n\n await pglite.exec(\n `CREATE TABLE IF NOT EXISTS ${tableName} (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n updated_at TIMESTAMPTZ NOT NULL DEFAULT now()\n )`,\n );\n\n // Checkpoint columns live on the SAME ROW as the value they describe, so one\n // UPDATE commits both and no transaction can interleave between them. A\n // separate checkpoint table would reintroduce the two-write window this\n // exists to close. Added separately so an existing table is migrated in place.\n await pglite.exec(\n `ALTER TABLE ${tableName}\n ADD COLUMN IF NOT EXISTS checkpoint_handle TEXT,\n ADD COLUMN IF NOT EXISTS checkpoint_offset TEXT,\n ADD COLUMN IF NOT EXISTS checkpoint_generation INTEGER`,\n );\n\n return {\n async get(key: string): Promise<string | null> {\n const result = await pglite.query<{ value: string }>(\n `SELECT value FROM ${tableName} WHERE key = $1`,\n [key],\n );\n const row = result.rows[0];\n return row?.value ?? null;\n },\n async set(key: string, value: string): Promise<void> {\n await pglite.query(\n `INSERT INTO ${tableName} (key, value, updated_at)\n VALUES ($1, $2, now())\n ON CONFLICT (key) DO UPDATE\n SET value = EXCLUDED.value,\n updated_at = now()`,\n [key, value],\n );\n },\n async remove(key: string): Promise<void> {\n await pglite.query(`DELETE FROM ${tableName} WHERE key = $1`, [key]);\n },\n\n /**\n * Commit rows and their resume checkpoint together.\n *\n * One statement, so the two cannot be separated by a crash: either the row\n * carries the new value AND the new checkpoint, or it carries neither. On\n * resume, `getCheckpoint` therefore describes exactly the value returned by\n * `get` — the property ADR-009 G3 requires.\n */\n async setWithCheckpoint({ key, value, checkpoint }: CheckpointedWrite): Promise<void> {\n await pglite.query(\n `INSERT INTO ${tableName}\n (key, value, updated_at, checkpoint_handle, checkpoint_offset, checkpoint_generation)\n VALUES ($1, $2, now(), $3, $4, $5)\n ON CONFLICT (key) DO UPDATE\n SET value = EXCLUDED.value,\n updated_at = now(),\n checkpoint_handle = EXCLUDED.checkpoint_handle,\n checkpoint_offset = EXCLUDED.checkpoint_offset,\n checkpoint_generation = EXCLUDED.checkpoint_generation`,\n [key, value, checkpoint.handle, checkpoint.offset, checkpoint.generation],\n );\n },\n\n async getCheckpoint(key: string): Promise<ReplicaCheckpoint | null> {\n const result = await pglite.query<{\n checkpoint_handle: string | null;\n checkpoint_offset: string | null;\n checkpoint_generation: number | null;\n }>(\n `SELECT checkpoint_handle, checkpoint_offset, checkpoint_generation\n FROM ${tableName} WHERE key = $1`,\n [key],\n );\n const row = result.rows[0];\n // A row written by plain `set` has no checkpoint. That is not an error —\n // it means \"rows exist but their resume position is unknown\", which the\n // caller must treat as a rebuild, not as offset zero.\n if (!row?.checkpoint_handle || row.checkpoint_offset === null) return null;\n return {\n handle: row.checkpoint_handle,\n offset: row.checkpoint_offset,\n generation: row.checkpoint_generation ?? 0,\n };\n },\n };\n}\n","/**\n * adapters/tauri-sql-persistence.ts\n *\n * SQLite-backed implementation of {@link GraphPersistenceAdapter} for Tauri\n * desktop, via the official `@tauri-apps/plugin-sql` `Database` handle.\n *\n * Why this exists:\n * - On Tauri desktop the natural on-device store is SQLite, not PGlite-wasm.\n * - This pairs with `createPGlitePersistenceAdapter` (browser/wasm) so the\n * same local-first runtime persists across web and desktop unchanged.\n *\n * The consumer owns the Tauri `Database` handle (from `Database.load(...)`).\n * This module does NOT import `@tauri-apps/plugin-sql` — it takes a\n * minimal-surface client, mirroring the PGlite/Electric adapter pattern, so it\n * adds no hard dependency. `@tauri-apps/plugin-sql` is an optional peer.\n *\n * Contract (same as every GraphPersistenceAdapter):\n * - `get(key)` -> stored string or null\n * - `set(key, v)` -> upsert (INSERT ... ON CONFLICT)\n * - `remove(key)` -> delete (no-op if absent)\n *\n * Tauri SQL uses SQLite `?`-positional bind params (not `$1`).\n */\n\nimport type { GraphPersistenceAdapter } from \"../local-first-runtime\";\n\n/**\n * Minimal surface of a `@tauri-apps/plugin-sql` `Database` handle.\n * Avoids a hard dep; matches the loaded-Database shape (`execute` + `select`).\n */\nexport interface TauriSqlClient {\n execute(query: string, bindValues?: unknown[]): Promise<unknown>;\n select<T = Record<string, unknown>>(query: string, bindValues?: unknown[]): Promise<T[]>;\n}\n\nexport interface CreateTauriSqlPersistenceAdapterOptions {\n /** Name of the snapshot table. Defaults to `_graph_snapshot`. */\n tableName?: string;\n}\n\nconst DEFAULT_TABLE = \"_graph_snapshot\";\n\n/**\n * Returns a {@link GraphPersistenceAdapter} backed by a Tauri SQLite `Database`.\n *\n * @example\n * ```ts\n * import Database from \"@tauri-apps/plugin-sql\";\n * import { startLocalFirstGraph, createTauriSqlPersistenceAdapter } from \"@prometheus-ags/prometheus-entity-management\";\n *\n * const db = await Database.load(\"sqlite:app.db\");\n * const storage = await createTauriSqlPersistenceAdapter(db);\n * const runtime = startLocalFirstGraph({ storage, key: \"app:graph\" });\n * ```\n */\nexport async function createTauriSqlPersistenceAdapter(\n db: TauriSqlClient,\n options: CreateTauriSqlPersistenceAdapterOptions = {},\n): Promise<GraphPersistenceAdapter> {\n const tableName = options.tableName ?? DEFAULT_TABLE;\n // Reject anything that isn't a safe identifier so we never interpolate a\n // hostile table name into DDL.\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(tableName)) {\n throw new Error(`createTauriSqlPersistenceAdapter: invalid tableName \"${tableName}\"`);\n }\n\n await db.execute(\n `CREATE TABLE IF NOT EXISTS ${tableName} (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n updated_at INTEGER NOT NULL\n )`,\n );\n\n return {\n async get(key: string): Promise<string | null> {\n const rows = await db.select<{ value: string }>(\n `SELECT value FROM ${tableName} WHERE key = ?`,\n [key],\n );\n return rows[0]?.value ?? null;\n },\n async set(key: string, value: string): Promise<void> {\n await db.execute(\n `INSERT INTO ${tableName} (key, value, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT (key) DO UPDATE\n SET value = excluded.value,\n updated_at = excluded.updated_at`,\n [key, value, Date.now()],\n );\n },\n async remove(key: string): Promise<void> {\n await db.execute(`DELETE FROM ${tableName} WHERE key = ?`, [key]);\n },\n };\n}\n","/**\n * schema-from-sql.ts\n *\n * Generates a JSON Schema (and registers it via `registerEntityJsonSchema`)\n * directly from a Postgres `CREATE TABLE` statement. Lets a consumer keep\n * `latest-data/supabase/migrations/*.sql` as the single source of truth for\n * column shapes — no hand-maintained TypeScript schema duplicates.\n *\n * Deliberately regex-based: a real SQL parser is overkill for the slice of\n * DDL we care about, and would add a non-trivial runtime dep.\n *\n * Type mapping\n * ------------\n * UUID, TEXT, VARCHAR(*) -> { type: \"string\" }\n * INTEGER, INT, BIGINT, SMALLINT -> { type: \"integer\" }\n * NUMERIC(*), DECIMAL(*) -> { type: \"number\" }\n * BOOLEAN, BOOL -> { type: \"boolean\" }\n * TIMESTAMPTZ, TIMESTAMP -> { type: \"string\", format: \"date-time\" }\n * DATE -> { type: \"string\", format: \"date\" }\n * JSONB, JSON -> { type: \"object\" }\n * TEXT[] -> { type: \"array\", items: { type: \"string\" } }\n * anything else -> { type: \"string\" } + \"x-warning\"\n *\n * `required` is populated from `NOT NULL` columns that lack a `DEFAULT`.\n * Callers can pass `overrides` to deep-merge a partial config (typically to\n * narrow a JSONB column to an array, or to add `enum`/`format` hints).\n */\n\nimport {\n registerEntityJsonSchema,\n type EntityJsonSchemaConfig,\n type JsonSchemaObject,\n} from \"./schema\";\n\nexport interface RegisterEntityFromSqlOptions {\n entityType: string;\n /** A single `CREATE TABLE` statement (extra DDL around it is ignored). */\n createTableSql: string;\n /** Optional deep-merge overrides (overrides win). */\n overrides?: Partial<EntityJsonSchemaConfig>;\n}\n\ninterface ParsedColumn {\n name: string;\n sqlType: string;\n notNull: boolean;\n hasDefault: boolean;\n}\n\ninterface ParsedTable {\n tableName: string;\n columns: ParsedColumn[];\n}\n\n/**\n * Parse a `CREATE TABLE` block. Exposed for tests and for callers who need\n * the intermediate representation.\n */\nexport function parseCreateTable(sql: string): ParsedTable {\n // Capture: CREATE TABLE [IF NOT EXISTS] <name> ( <body> )\n const headerMatch = sql.match(\n /CREATE\\s+TABLE\\s+(?:IF\\s+NOT\\s+EXISTS\\s+)?[\"]?([A-Za-z_][A-Za-z0-9_]*)[\"]?\\s*\\(([\\s\\S]*)\\)\\s*;?\\s*$/im,\n );\n if (!headerMatch) {\n throw new Error(\"parseCreateTable: could not locate a CREATE TABLE block\");\n }\n const tableName = headerMatch[1];\n const body = headerMatch[2];\n\n const columns: ParsedColumn[] = [];\n for (const rawLine of splitTopLevelCommas(body)) {\n const line = rawLine.trim();\n if (!line) continue;\n // Skip table-level constraints (PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK,\n // CONSTRAINT, LIKE, EXCLUDE).\n if (/^(?:PRIMARY\\s+KEY|FOREIGN\\s+KEY|UNIQUE|CHECK|CONSTRAINT|LIKE|EXCLUDE)\\b/i.test(line)) {\n continue;\n }\n const colMatch = line.match(/^[\"]?([A-Za-z_][A-Za-z0-9_]*)[\"]?\\s+([A-Za-z][A-Za-z0-9_]*(?:\\s*\\([^)]*\\))?(?:\\s*\\[\\s*\\])?)([\\s\\S]*)$/);\n if (!colMatch) continue;\n const name = colMatch[1];\n const sqlType = colMatch[2].replace(/\\s+/g, \"\").toUpperCase();\n const rest = colMatch[3].toUpperCase();\n const notNull = /\\bNOT\\s+NULL\\b/.test(rest);\n const hasDefault = /\\bDEFAULT\\b/.test(rest);\n columns.push({ name, sqlType, notNull, hasDefault });\n }\n\n return { tableName, columns };\n}\n\n/**\n * Split a parenthesised body on top-level commas (ignoring commas inside\n * nested parens like `NUMERIC(10, 2)`).\n */\nfunction splitTopLevelCommas(body: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let current = \"\";\n for (const ch of body) {\n if (ch === \"(\") depth++;\n else if (ch === \")\") depth--;\n if (ch === \",\" && depth === 0) {\n parts.push(current);\n current = \"\";\n } else {\n current += ch;\n }\n }\n if (current.trim()) parts.push(current);\n return parts;\n}\n\n/**\n * Map a normalized (uppercased, whitespace-stripped) SQL type to a JSON\n * schema fragment.\n *\n * Returns `{ schema, warning }` so the caller can surface \"unmapped type\"\n * notes via `x-warning` on the property.\n */\nexport function sqlTypeToJsonSchema(sqlType: string): {\n schema: JsonSchemaObject;\n warning?: string;\n} {\n const t = sqlType.replace(/\\s+/g, \"\").toUpperCase();\n\n if (/^TEXT\\[\\]$/.test(t)) {\n return { schema: { type: \"array\", items: { type: \"string\" } } };\n }\n if (t === \"UUID\" || t === \"TEXT\" || /^VARCHAR(\\(.*\\))?$/.test(t) || /^CHAR(\\(.*\\))?$/.test(t)) {\n return { schema: { type: \"string\" } };\n }\n if (t === \"INTEGER\" || t === \"INT\" || t === \"BIGINT\" || t === \"SMALLINT\" || t === \"INT4\" || t === \"INT8\" || t === \"INT2\") {\n return { schema: { type: \"integer\" } };\n }\n if (/^NUMERIC(\\(.*\\))?$/.test(t) || /^DECIMAL(\\(.*\\))?$/.test(t) || t === \"REAL\" || t === \"DOUBLEPRECISION\" || t === \"FLOAT\") {\n return { schema: { type: \"number\" } };\n }\n if (t === \"BOOLEAN\" || t === \"BOOL\") {\n return { schema: { type: \"boolean\" } };\n }\n if (t === \"TIMESTAMPTZ\" || t === \"TIMESTAMP\" || t === \"TIMESTAMPWITHTIMEZONE\" || t === \"TIMESTAMPWITHOUTTIMEZONE\") {\n return { schema: { type: \"string\", format: \"date-time\" } };\n }\n if (t === \"DATE\") {\n return { schema: { type: \"string\", format: \"date\" } };\n }\n if (t === \"JSONB\" || t === \"JSON\") {\n return { schema: { type: \"object\" } };\n }\n return {\n schema: { type: \"string\" },\n warning: `sql type \"${sqlType}\" not explicitly mapped; defaulting to string`,\n };\n}\n\n/**\n * Untyped deep-merge used by `mergeEntityConfig`. Generic and `unknown`-typed\n * to keep this internal helper free of the interface-vs-Record friction that\n * strict-mode `Record<string, unknown>` introduces with named interfaces.\n *\n * @internal\n */\nfunction deepMergeUnknown(\n base: Record<string, unknown>,\n override: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(override)) {\n const baseValue = base[key];\n if (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n baseValue !== null &&\n typeof baseValue === \"object\" &&\n !Array.isArray(baseValue)\n ) {\n out[key] = deepMergeUnknown(\n baseValue as Record<string, unknown>,\n value as Record<string, unknown>,\n );\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\n/**\n * Merge a generated `EntityJsonSchemaConfig` with an optional caller-supplied\n * overrides object. Required fields (`entityType`, `schema`) always come from\n * the generated value; overrides may extend them but cannot remove them.\n */\nfunction mergeEntityConfig(\n generated: EntityJsonSchemaConfig,\n overrides?: Partial<EntityJsonSchemaConfig>,\n): EntityJsonSchemaConfig {\n if (!overrides) return generated;\n const merged = deepMergeUnknown(\n generated as unknown as Record<string, unknown>,\n overrides as unknown as Record<string, unknown>,\n );\n // Re-impose the required fields from the generated source — overrides may\n // not erase them, only refine them.\n // The deepMerge result is structurally compatible but TypeScript can't\n // narrow it back through the Record<> intermediate; the explicit\n // `unknown` hop is the documented escape per the TS strict-mode contract.\n const refined = merged as unknown as EntityJsonSchemaConfig;\n return {\n ...refined,\n entityType: generated.entityType,\n schema: refined.schema ?? generated.schema,\n };\n}\n\n/**\n * Build (and register) an `EntityJsonSchemaConfig` from a CREATE TABLE\n * statement. Returns the registered config so callers can introspect it.\n */\nexport function registerEntityFromSql(\n opts: RegisterEntityFromSqlOptions,\n): EntityJsonSchemaConfig {\n const parsed = parseCreateTable(opts.createTableSql);\n const properties: Record<string, JsonSchemaObject> = {};\n const required: string[] = [];\n\n for (const col of parsed.columns) {\n const { schema, warning } = sqlTypeToJsonSchema(col.sqlType);\n const propSchema: JsonSchemaObject = { ...schema };\n if (warning) {\n (propSchema as Record<string, unknown>)[\"x-warning\"] = warning;\n }\n properties[col.name] = propSchema;\n if (col.notNull && !col.hasDefault) {\n required.push(col.name);\n }\n }\n\n const generated: EntityJsonSchemaConfig = {\n entityType: opts.entityType,\n source: \"runtime\",\n schema: {\n type: \"object\",\n title: parsed.tableName,\n properties,\n required,\n },\n };\n\n const config = mergeEntityConfig(generated, opts.overrides);\n registerEntityJsonSchema(config);\n return config;\n}\n","/**\n * table/row-models.ts\n *\n * Pure row model pipeline functions. Each stage transforms data\n * into a RowModel — no side effects, no external dependencies.\n */\nimport type {\n Row,\n Cell,\n Column,\n ColumnDef,\n RowModel,\n TableInstance,\n SortingState,\n ColumnFiltersState,\n ExpandedState,\n GroupingState,\n PaginationState,\n CellContext,\n FilterFn,\n SortingFn,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Accessor helpers\n// ---------------------------------------------------------------------------\nfunction resolveAccessor<TData>(\n columnDef: ColumnDef<TData>,\n row: TData,\n index: number,\n): unknown {\n if (columnDef.accessorFn) return columnDef.accessorFn(row, index);\n if (columnDef.accessorKey) return (row as Record<string, unknown>)[columnDef.accessorKey];\n return undefined;\n}\n\nfunction getColumnId<TData>(colDef: ColumnDef<TData>, index: number): string {\n return colDef.id ?? colDef.accessorKey ?? `col_${index}`;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in filter functions\n// ---------------------------------------------------------------------------\nconst builtInFilterFns: Record<string, FilterFn<unknown>> = {\n auto: (row, columnId, filterValue) => {\n const val = row.getValue(columnId);\n if (filterValue == null || filterValue === \"\") return true;\n if (typeof val === \"string\") return val.toLowerCase().includes(String(filterValue).toLowerCase());\n if (typeof val === \"number\") return val === Number(filterValue);\n if (typeof val === \"boolean\") return val === filterValue;\n return String(val).toLowerCase().includes(String(filterValue).toLowerCase());\n },\n};\n\n// ---------------------------------------------------------------------------\n// Built-in sorting comparators\n// ---------------------------------------------------------------------------\nfunction defaultSortingFn(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return 1;\n if (b == null) return -1;\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n return String(a).localeCompare(String(b));\n}\n\n// ---------------------------------------------------------------------------\n// Create Row wrapper\n// ---------------------------------------------------------------------------\nexport function createRow<TData>(\n original: TData,\n index: number,\n columns: Column<TData>[],\n table: TableInstance<TData>,\n depth: number = 0,\n parentId?: string,\n subRows: Row<TData>[] = [],\n): Row<TData> {\n const id = table.options.getRowId\n ? table.options.getRowId(original, index)\n : String(index);\n\n const row: Row<TData> = {\n id,\n index,\n original,\n depth,\n parentId,\n subRows,\n\n getValue: <T = unknown>(columnId: string): T => {\n const col = columns.find((c) => c.id === columnId);\n if (!col) return undefined as T;\n return resolveAccessor(col.columnDef, original, index) as T;\n },\n renderValue: <T = unknown>(columnId: string): T | null => {\n const val = row.getValue<T>(columnId);\n return val ?? null;\n },\n\n getIsSelected: () => !!table.getState().rowSelection[id],\n getCanSelect: () => {\n const opt = table.options.enableRowSelection;\n if (opt === false) return false;\n if (typeof opt === \"function\") return opt(row);\n return true;\n },\n getIsAllSubRowsSelected: () =>\n subRows.length > 0 && subRows.every((sr) => sr.getIsSelected()),\n getIsSomeSelected: () =>\n subRows.some((sr) => sr.getIsSelected() || sr.getIsSomeSelected()),\n toggleSelected: (value?: boolean) => {\n const next = value ?? !row.getIsSelected();\n table.setRowSelection((prev) => ({ ...prev, [id]: next }));\n },\n getToggleSelectedHandler: () => (e: unknown) => {\n row.toggleSelected();\n },\n\n getIsExpanded: () => {\n const expanded = table.getState().expanded;\n if (expanded === true) return true;\n return !!expanded[id];\n },\n getCanExpand: () => subRows.length > 0,\n toggleExpanded: (value?: boolean) => {\n const next = value ?? !row.getIsExpanded();\n table.setExpanded((prev) => {\n if (prev === true) {\n const allRows: Record<string, boolean> = {};\n table.getCoreRowModel().flatRows.forEach((r) => { allRows[r.id] = true; });\n allRows[id] = next;\n return allRows;\n }\n return { ...prev, [id]: next };\n });\n },\n getToggleExpandedHandler: () => () => row.toggleExpanded(),\n\n getIsGrouped: () => !!row.groupingColumnId,\n groupingColumnId: undefined,\n groupingValue: undefined,\n\n getVisibleCells: () =>\n row.getAllCells().filter((cell) => cell.column.getIsVisible()),\n getAllCells: () =>\n columns.map((col) => createCell(row, col, table)),\n\n getIsPinned: () => false,\n pin: () => {},\n };\n\n return row;\n}\n\n// ---------------------------------------------------------------------------\n// Create Cell wrapper\n// ---------------------------------------------------------------------------\nfunction createCell<TData>(\n row: Row<TData>,\n column: Column<TData>,\n table: TableInstance<TData>,\n): Cell<TData> {\n const cellId = `${row.id}_${column.id}`;\n const cell: Cell<TData> = {\n id: cellId,\n row,\n column,\n getValue: <T = unknown>() => row.getValue<T>(column.id),\n renderValue: <T = unknown>() => row.renderValue<T>(column.id),\n getIsGrouped: () => row.getIsGrouped() && row.groupingColumnId === column.id,\n getIsPlaceholder: () => false,\n getIsAggregated: () => row.subRows.length > 0 && row.getIsGrouped() && row.groupingColumnId !== column.id,\n getContext: (): CellContext<TData> => ({\n table,\n row,\n cell,\n column,\n getValue: cell.getValue,\n renderValue: cell.renderValue,\n }),\n };\n return cell;\n}\n\n// ---------------------------------------------------------------------------\n// 1. getCoreRowModel\n// ---------------------------------------------------------------------------\nexport function getCoreRowModel<TData>(\n data: TData[],\n columns: Column<TData>[],\n table: TableInstance<TData>,\n): RowModel<TData> {\n const getSubRows = table.options.getSubRows;\n const flatRows: Row<TData>[] = [];\n\n function processRows(items: TData[], depth: number, parentId?: string): Row<TData>[] {\n return items.map((item, index) => {\n const subData = getSubRows?.(item, index);\n const row = createRow(item, flatRows.length, columns, table, depth, parentId);\n flatRows.push(row);\n if (subData && subData.length > 0) {\n row.subRows = processRows(subData, depth + 1, row.id);\n }\n return row;\n });\n }\n\n const rows = processRows(data, 0);\n const rowsById: Record<string, Row<TData>> = {};\n flatRows.forEach((r) => { rowsById[r.id] = r; });\n\n return { rows, flatRows, rowsById };\n}\n\n// ---------------------------------------------------------------------------\n// 2. getFilteredRowModel\n// ---------------------------------------------------------------------------\nexport function getFilteredRowModel<TData>(\n rowModel: RowModel<TData>,\n columnFilters: ColumnFiltersState,\n globalFilter: unknown,\n columns: Column<TData>[],\n globalFilterFn?: FilterFn<TData>,\n): RowModel<TData> {\n const hasColumnFilters = columnFilters.length > 0;\n const hasGlobalFilter = globalFilter != null && globalFilter !== \"\";\n\n if (!hasColumnFilters && !hasGlobalFilter) return rowModel;\n\n const filterFns = new Map<string, FilterFn<TData>>();\n for (const cf of columnFilters) {\n const col = columns.find((c) => c.id === cf.id);\n if (col) {\n const fn = col.columnDef.filterFn;\n filterFns.set(cf.id, (typeof fn === \"function\" ? fn : builtInFilterFns.auto) as FilterFn<TData>);\n }\n }\n\n const resolvedGlobalFilterFn = (globalFilterFn ?? builtInFilterFns.auto) as FilterFn<TData>;\n const flatRows: Row<TData>[] = [];\n\n function filterRows(rows: Row<TData>[]): Row<TData>[] {\n return rows.filter((row) => {\n for (const cf of columnFilters) {\n const fn = filterFns.get(cf.id);\n if (fn && !fn(row, cf.id, cf.value)) return false;\n }\n if (hasGlobalFilter) {\n const matches = columns.some((col) =>\n resolvedGlobalFilterFn(row, col.id, globalFilter),\n );\n if (!matches) return false;\n }\n flatRows.push(row);\n if (row.subRows.length > 0) {\n const filteredSubRows = filterRows(row.subRows);\n if (filteredSubRows.length > 0) {\n row = { ...row, subRows: filteredSubRows };\n return true;\n }\n }\n return true;\n });\n }\n\n const rows = filterRows(rowModel.rows);\n const rowsById: Record<string, Row<TData>> = {};\n flatRows.forEach((r) => { rowsById[r.id] = r; });\n\n return { rows, flatRows, rowsById };\n}\n\n// ---------------------------------------------------------------------------\n// 3. getSortedRowModel\n// ---------------------------------------------------------------------------\nexport function getSortedRowModel<TData>(\n rowModel: RowModel<TData>,\n sorting: SortingState,\n columns: Column<TData>[],\n): RowModel<TData> {\n if (sorting.length === 0) return rowModel;\n\n const sortFns: Array<{\n columnId: string;\n desc: boolean;\n fn: SortingFn<TData> | null;\n colDef: ColumnDef<TData> | null;\n }> = sorting.map((s) => {\n const col = columns.find((c) => c.id === s.id);\n const colDef = col?.columnDef ?? null;\n let fn: SortingFn<TData> | null = null;\n if (colDef?.sortingFn && typeof colDef.sortingFn === \"function\") {\n fn = colDef.sortingFn;\n }\n return { columnId: s.id, desc: s.desc, fn, colDef };\n });\n\n function sortRows(rows: Row<TData>[]): Row<TData>[] {\n const sorted = [...rows].sort((rowA, rowB) => {\n for (const { columnId, desc, fn, colDef } of sortFns) {\n let result: number;\n if (fn) {\n result = fn(rowA, rowB, columnId);\n } else {\n const a = rowA.getValue(columnId);\n const b = rowB.getValue(columnId);\n result = defaultSortingFn(a, b);\n }\n if (colDef?.invertSorting) result = -result;\n if (result !== 0) return desc ? -result : result;\n }\n return 0;\n });\n\n return sorted.map((row) => {\n if (row.subRows.length > 0) {\n return { ...row, subRows: sortRows(row.subRows) };\n }\n return row;\n });\n }\n\n const rows = sortRows(rowModel.rows);\n const flatRows: Row<TData>[] = [];\n function flatten(rows: Row<TData>[]) {\n rows.forEach((r) => { flatRows.push(r); if (r.subRows.length) flatten(r.subRows); });\n }\n flatten(rows);\n const rowsById: Record<string, Row<TData>> = {};\n flatRows.forEach((r) => { rowsById[r.id] = r; });\n\n return { rows, flatRows, rowsById };\n}\n\n// ---------------------------------------------------------------------------\n// 4. getGroupedRowModel\n// ---------------------------------------------------------------------------\nexport function getGroupedRowModel<TData>(\n rowModel: RowModel<TData>,\n grouping: GroupingState,\n columns: Column<TData>[],\n table: TableInstance<TData>,\n): RowModel<TData> {\n if (grouping.length === 0) return rowModel;\n\n function groupRows(rows: Row<TData>[], depth: number): Row<TData>[] {\n if (depth >= grouping.length) return rows;\n\n const columnId = grouping[depth];\n const groups = new Map<unknown, Row<TData>[]>();\n\n for (const row of rows) {\n const value = row.getValue(columnId);\n const key = value ?? \"__null__\";\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(row);\n }\n\n const groupedRows: Row<TData>[] = [];\n let groupIndex = 0;\n\n for (const [key, groupItems] of groups) {\n const firstRow = groupItems[0];\n const groupRow = createRow(\n firstRow.original,\n groupIndex++,\n columns,\n table,\n depth,\n );\n groupRow.groupingColumnId = columnId;\n groupRow.groupingValue = key === \"__null__\" ? null : key;\n groupRow.subRows = groupRows(groupItems, depth + 1);\n groupedRows.push(groupRow);\n }\n\n return groupedRows;\n }\n\n const rows = groupRows(rowModel.rows, 0);\n const flatRows: Row<TData>[] = [];\n function flatten(items: Row<TData>[]) {\n items.forEach((r) => { flatRows.push(r); if (r.subRows.length) flatten(r.subRows); });\n }\n flatten(rows);\n const rowsById: Record<string, Row<TData>> = {};\n flatRows.forEach((r) => { rowsById[r.id] = r; });\n\n return { rows, flatRows, rowsById };\n}\n\n// ---------------------------------------------------------------------------\n// 5. getExpandedRowModel\n// ---------------------------------------------------------------------------\nexport function getExpandedRowModel<TData>(\n rowModel: RowModel<TData>,\n expanded: ExpandedState,\n): RowModel<TData> {\n const flatRows: Row<TData>[] = [];\n\n function expandRows(rows: Row<TData>[]): Row<TData>[] {\n const result: Row<TData>[] = [];\n for (const row of rows) {\n result.push(row);\n flatRows.push(row);\n const isExpanded = expanded === true || (typeof expanded === \"object\" && expanded[row.id]);\n if (isExpanded && row.subRows.length > 0) {\n const expandedSubRows = expandRows(row.subRows);\n result.push(...expandedSubRows);\n }\n }\n return result;\n }\n\n const rows = expandRows(rowModel.rows);\n const rowsById: Record<string, Row<TData>> = {};\n flatRows.forEach((r) => { rowsById[r.id] = r; });\n\n return { rows, flatRows, rowsById };\n}\n\n// ---------------------------------------------------------------------------\n// 6. getPaginatedRowModel\n// ---------------------------------------------------------------------------\nexport function getPaginatedRowModel<TData>(\n rowModel: RowModel<TData>,\n pagination: PaginationState,\n): RowModel<TData> {\n const { pageIndex, pageSize } = pagination;\n const start = pageIndex * pageSize;\n const end = start + pageSize;\n const rows = rowModel.rows.slice(start, end);\n const flatRows = rows;\n const rowsById: Record<string, Row<TData>> = {};\n flatRows.forEach((r) => { rowsById[r.id] = r; });\n\n return { rows, flatRows, rowsById };\n}\n\n// ---------------------------------------------------------------------------\n// Helper: get selected row model\n// ---------------------------------------------------------------------------\nexport function getSelectedRowModel<TData>(\n rowModel: RowModel<TData>,\n selection: Record<string, boolean>,\n): RowModel<TData> {\n const rows = rowModel.flatRows.filter((r) => selection[r.id]);\n const rowsById: Record<string, Row<TData>> = {};\n rows.forEach((r) => { rowsById[r.id] = r; });\n return { rows, flatRows: rows, rowsById };\n}\n","/**\n * table/faceting.ts\n *\n * Column faceting utilities — compute unique values, counts,\n * and min/max for filter UI controls.\n */\nimport type { Row, RowModel } from \"./types\";\n\n/**\n * Compute unique values and their counts for a given column.\n * Useful for rendering filter dropdown options with hit counts.\n */\nexport function getFacetedUniqueValues<TData>(\n rowModel: RowModel<TData>,\n columnId: string,\n): Map<unknown, number> {\n const counts = new Map<unknown, number>();\n\n for (const row of rowModel.flatRows) {\n const value = row.getValue(columnId);\n if (Array.isArray(value)) {\n for (const v of value) {\n counts.set(v, (counts.get(v) ?? 0) + 1);\n }\n } else {\n counts.set(value, (counts.get(value) ?? 0) + 1);\n }\n }\n\n return counts;\n}\n\n/**\n * Compute min and max numeric values for a given column.\n * Returns [min, max] or undefined if no numeric values exist.\n */\nexport function getFacetedMinMaxValues<TData>(\n rowModel: RowModel<TData>,\n columnId: string,\n): [number, number] | undefined {\n let min = Infinity;\n let max = -Infinity;\n let hasValue = false;\n\n for (const row of rowModel.flatRows) {\n const raw = row.getValue(columnId);\n const value = typeof raw === \"number\" ? raw : Number(raw);\n if (!Number.isNaN(value)) {\n hasValue = true;\n if (value < min) min = value;\n if (value > max) max = value;\n }\n }\n\n return hasValue ? [min, max] : undefined;\n}\n\n/**\n * Get a filtered row model scoped to a single column's facet.\n * Returns a row model that excludes the given column's own filter,\n * so the facet counts reflect what would be available if that\n * specific filter were removed.\n */\nexport function getFacetedRowModel<TData>(\n preFilteredRowModel: RowModel<TData>,\n columnId: string,\n allFilteredRowModel: RowModel<TData>,\n): RowModel<TData> {\n return preFilteredRowModel;\n}\n"]}
|