@prometheus-ags/entity-graph-core 3.0.2 → 3.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/transport/registry.ts","../src/view/prisma-compile.ts","../src/view/types.ts","../src/transport/rest.ts","../src/merge/lww.ts","../src/merge/registry.ts","../src/graph.ts","../src/object-path.ts","../src/merge/loro.ts","../src/graph-query.ts","../src/engine.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/evaluator.ts","../src/view/incremental.ts","../src/crud/relations.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","createStore","subscribeWithSelector","immer","clone","ek","listeners","sleep","idx","schemaRegistry","isObject","id","document","DEFAULT_TABLE","rows"],"mappings":"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","file":"index.cjs","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","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","/**\n * merge/lww.ts — Last-write-wins default strategy.\n *\n * Semantics match the historical `upsertEntity` behavior exactly: shallow-merge\n * the incoming write over the previous value. This is the fallback when no\n * other strategy is registered, so registering nothing is a no-op change.\n */\n\nimport type { MergeStrategy } from \"./types\";\n\n/**\n * Shallow-merge `next` over `prev` (incoming keys win). Returns a new object.\n * On first write (`prev` undefined) returns a shallow copy of `next`.\n */\nexport const lwwStrategy: MergeStrategy = (prev, next) => {\n return prev ? { ...prev, ...next } : { ...next };\n};\n","/**\n * merge/registry.ts — One MergeStrategy per entity type (+ optional global default).\n *\n * Lookup order at write time:\n * 1. strategy registered for the exact `type`\n * 2. global default strategy (if one was set)\n * 3. built-in LWW (`lwwStrategy`)\n *\n * Step 3 guarantees that with zero registrations the graph behaves exactly as\n * it did before this seam existed.\n */\n\nimport type { MergeStrategy } from \"./types\";\nimport { lwwStrategy } from \"./lww\";\n\nconst byType = new Map<string, MergeStrategy>();\nlet globalDefault: MergeStrategy | null = null;\n\n/**\n * Register a {@link MergeStrategy} for one entity type. Overwrites any prior\n * registration for that type.\n */\nexport function registerMergeStrategy(type: string, strategy: MergeStrategy): void {\n byType.set(type, strategy);\n}\n\n/**\n * Set the fallback strategy used for any type without its own registration.\n * Pass `null` to clear it (reverting the fallback to built-in LWW).\n */\nexport function setDefaultMergeStrategy(strategy: MergeStrategy | null): void {\n globalDefault = strategy;\n}\n\n/**\n * Resolve the effective strategy for a type: per-type → global default → LWW.\n * Always returns a usable strategy (never null).\n */\nexport function getMergeStrategy(type: string): MergeStrategy {\n return byType.get(type) ?? globalDefault ?? lwwStrategy;\n}\n\n/** True if `type` (or a global default) has a non-LWW strategy registered. */\nexport function hasMergeStrategy(type: string): boolean {\n return byType.has(type) || globalDefault !== null;\n}\n\n/** @internal Test-only. NOT re-exported from index.ts. */\nexport function __resetMergeStrategies(): void {\n byType.clear();\n globalDefault = null;\n}\n","import { createStore } from \"zustand/vanilla\";\nimport { subscribeWithSelector } from \"zustand/middleware\";\nimport { immer } from \"zustand/middleware/immer\";\nimport type { EntityError } from \"./errors\";\nimport { getMergeStrategy } from \"./merge/registry\";\nimport type { MergeContext } from \"./merge/types\";\n\n/** Logical entity kind (e.g. `\"Post\"`). Used to partition the normalized graph. */\nexport type EntityType = string;\n/** Primary key for an entity within its `type`. Lists and relations reference this, not row copies. */\nexport type EntityId = string;\n/** Stable string key for a list query (often `JSON.stringify`-shaped). Lists store IDs only under this key. */\nexport type QueryKey = string;\n/** Provenance of the latest known entity state. */\nexport type SyncOrigin = \"server\" | \"client\" | \"optimistic\";\n\n/** Optional sync-facing metadata kept outside canonical entity payloads. */\nexport interface EntitySyncMetadata {\n synced: boolean;\n origin: SyncOrigin;\n updatedAt: number | null;\n}\n\n/** Snapshot shape returned by sync-aware reads and graph-native query helpers. */\nexport type EntitySnapshot<T extends object> = T & {\n $synced: boolean;\n $origin: SyncOrigin;\n $updatedAt: number | null;\n};\n\n/**\n * Fetch/cache metadata for a single entity instance (`type:id`).\n * Separates transport concerns from canonical `entities` data so hooks can show spinners and stale-while-revalidate without mutating server-shaped fields.\n */\nexport interface EntityState {\n isFetching: boolean;\n lastFetched: number | null;\n error: string | null;\n stale: boolean;\n}\n\n/**\n * Ordered **IDs** for a list query plus pagination metadata — never embedded entity payloads.\n * Cross-view reactivity depends on this: when `entities[type][id]` updates, every list containing that id re-resolves rows from the graph.\n */\nexport interface ListState {\n ids: EntityId[];\n total: number | null;\n nextCursor: string | null;\n prevCursor: string | null;\n hasNextPage: boolean;\n hasPrevPage: boolean;\n isFetching: boolean;\n isFetchingMore: boolean;\n error: string | null;\n /**\n * Typed error instance for 2.0 hooks (`useEntities`, `useEntityQuery`).\n * Carries `TerminalError` / `TransientError` so consumers can\n * `instanceof`-check the failure mode without parsing the string in\n * `error`. Both fields are written together by `setListError`; the\n * string `error` field remains for back-compat with 1.x consumers.\n */\n lastError: EntityError | null;\n lastFetched: number | null;\n stale: boolean;\n currentPage: number | null;\n pageSize: number | null;\n}\n\n/**\n * Stable fallbacks for missing `lists[key]` / `entityStates[key]` slots.\n * Inline `?? { ... }` defaults allocate new objects every `getSnapshot` call and trigger React 19\n * “getSnapshot should be cached” / maximum update depth errors with `useSyncExternalStore`.\n */\nexport const EMPTY_IDS: EntityId[] = [];\n\nexport const EMPTY_ENTITY_STATE: EntityState = {\n isFetching: false,\n lastFetched: null,\n error: null,\n stale: false,\n};\n\nexport const EMPTY_SYNC_METADATA: EntitySyncMetadata = {\n synced: true,\n origin: \"server\",\n updatedAt: null,\n};\n\nexport const EMPTY_LIST_STATE: ListState = {\n ids: EMPTY_IDS,\n total: null,\n nextCursor: null,\n prevCursor: null,\n hasNextPage: false,\n hasPrevPage: false,\n isFetching: false,\n isFetchingMore: false,\n error: null,\n lastError: null,\n lastFetched: null,\n stale: false,\n currentPage: null,\n pageSize: null,\n};\n\n/**\n * Canonical Zustand store: **entities** (server truth), **patches** (UI-only overlay), **lists** (id order + list meta), and **entityStates** (per-entity fetch state).\n * Framework bindings subscribe to the vanilla store; stores, adapters, and\n * engines can read it synchronously through `graphStore.getState()`.\n */\nexport interface GraphState {\n /** Normalized server-confirmed records. Mutate only via upsert/replace/remove — not from components. */\n entities: Record<EntityType, Record<EntityId, Record<string, unknown>>>;\n /** Local-only fields merged at read time (`readEntity` / hooks). Never send patches to the server. */\n patches: Record<EntityType, Record<EntityId, Record<string, unknown>>>;\n /** Per-entity fetch lifecycle keyed as `${type}:${id}`. */\n entityStates: Record<string, EntityState>;\n /** Optional sync/provenance state layered beside the canonical entity payload. */\n syncMetadata: Record<string, EntitySyncMetadata>;\n /** List slots keyed by serialized query keys. Values hold id arrays and pagination — not entity clones. */\n lists: Record<QueryKey, ListState>;\n /**\n * Shallow-merge `data` into the canonical entity. Use when the API returns partial updates or normalized fragments.\n * @param type - Entity kind\n * @param id - Entity id\n * @param data - Fields to merge into existing canonical data\n */\n upsertEntity: (type: EntityType, id: EntityId, data: Record<string, unknown>) => void;\n /**\n * Batch upsert for list endpoints — avoids N separate writes when hydrating many rows at once.\n * @param type - Entity kind\n * @param entries - Pairs of id + partial/full payloads to merge\n */\n upsertEntities: (type: EntityType, entries: Array<{ id: EntityId; data: Record<string, unknown> }>) => void;\n /**\n * Replace the canonical entity entirely (no merge). Use when the server returns a full snapshot and partial merge would leave stale keys behind.\n */\n replaceEntity: (type: EntityType, id: EntityId, data: Record<string, unknown>) => void;\n /** Remove canonical entity, its patches, and its entityState. Does not remove the id from lists — use `removeIdFromAllLists` if needed. */\n removeEntity: (type: EntityType, id: EntityId) => void;\n /**\n * Merge UI-only fields into `patches` so every subscriber sees selection, expansion, optimistic toggles, etc., without forking canonical data.\n */\n patchEntity: (type: EntityType, id: EntityId, patch: Record<string, unknown>) => void;\n /** Remove specific patch keys; other patch keys remain. */\n unpatchEntity: (type: EntityType, id: EntityId, keys: string[]) => void;\n /** Drop all patches for an entity (e.g. after successful mutation when server data is authoritative). */\n clearPatch: (type: EntityType, id: EntityId) => void;\n /** Reflect in-flight GET for a single entity (deduped fetches in the engine still flip this once per logical request). */\n setEntityFetching: (type: EntityType, id: EntityId, fetching: boolean) => void;\n /** Persist terminal fetch failure message and clear fetching — hooks surface `error` while leaving prior data if any. */\n setEntityError: (type: EntityType, id: EntityId, error: string | null) => void;\n /** Mark entity successfully loaded; clears error, fetching, stale, and updates `lastFetched`. */\n setEntityFetched: (type: EntityType, id: EntityId) => void;\n /** Drive background revalidation: when true, hooks refetch while still showing cached `readEntity` data. */\n setEntityStale: (type: EntityType, id: EntityId, stale: boolean) => void;\n /** Merge sync metadata for one entity without polluting canonical server fields. */\n setEntitySyncMetadata: (type: EntityType, id: EntityId, metadata: Partial<EntitySyncMetadata>) => void;\n /** Clear sync metadata for one entity. */\n clearEntitySyncMetadata: (type: EntityType, id: EntityId) => void;\n /**\n * Replace list ids and merge pagination meta after a primary list fetch (not load-more).\n * Resets fetching flags and clears list error on success path (engine calls this after normalize).\n */\n setListResult: (key: QueryKey, ids: EntityId[], meta: Partial<Omit<ListState, \"ids\" | \"isFetching\" | \"isFetchingMore\" | \"error\" | \"stale\">>) => void;\n /** Append unique ids (e.g. infinite scroll) while merging meta; dedupes id order. */\n appendListResult: (key: QueryKey, ids: EntityId[], meta: Partial<Omit<ListState, \"ids\" | \"isFetching\" | \"isFetchingMore\" | \"error\" | \"stale\">>) => void;\n /** Prepend ids (e.g. “new item at top”) with optional meta merge. */\n prependListResult: (key: QueryKey, ids: EntityId[], meta?: Partial<ListState>) => void;\n /** After deletes, keep every list consistent by removing an id everywhere it appears and decrementing `total` when tracked. */\n removeIdFromAllLists: (type: EntityType, id: EntityId) => void;\n /**\n * Insert or move an id in one list. If the id already exists, it is removed first then re-inserted at `position`.\n * @param position - `\"start\"`, `\"end\"`, or numeric index\n */\n insertIdInList: (key: QueryKey, id: EntityId, position: \"start\" | \"end\" | number) => void;\n /** Initial or full list fetch in progress (not page-2+). */\n setListFetching: (key: QueryKey, fetching: boolean) => void;\n /** Pagination / “load more” in progress for the same list key. */\n setListFetchingMore: (key: QueryKey, fetchingMore: boolean) => void;\n /**\n * Record list fetch failure; clears both fetching flags.\n * The optional `typed` argument is the typed `EntityError` instance\n * (used by 2.0 hooks); when omitted only the string `error` field is\n * populated (back-compat with 1.x callers).\n */\n setListError: (key: QueryKey, error: string | null, typed?: EntityError | null) => void;\n /** Mark a list query stale so hooks can refetch without discarding current ids (stale-while-revalidate). */\n setListStale: (key: QueryKey, stale: boolean) => void;\n /**\n * Mark one or all entities of a type stale for subscriber-driven refetch. Does not delete data.\n * @param id - Omit to stale every entity of `type`\n */\n invalidateEntity: (type: EntityType, id?: EntityId) => void;\n /**\n * Mark lists stale by key prefix or custom predicate so the next access triggers background refresh without dropping ids immediately.\n */\n invalidateLists: (matcher: string | ((key: QueryKey) => boolean)) => void;\n /** Convenience: stale all entities of a type and lists whose keys start with `type`. */\n invalidateType: (type: EntityType) => void;\n /**\n * Single read path: `{ ...entities[type][id], ...patches[type][id] }` or null if no canonical row exists.\n * @returns Merged view suitable for rendering; not a deep clone\n */\n readEntity: <T = Record<string, unknown>>(type: EntityType, id: EntityId) => T | null;\n /**\n * Sync-aware read path: canonical entity + patches + virtual sync metadata (`$synced`, `$origin`, `$updatedAt`).\n */\n readEntitySnapshot: <T = Record<string, unknown>>(type: EntityType, id: EntityId) => EntitySnapshot<T & Record<string, unknown>> | null;\n}\n\nfunction defaultEntityState(): EntityState {\n return { ...EMPTY_ENTITY_STATE };\n}\n\nfunction defaultSyncMetadata(): EntitySyncMetadata {\n return { ...EMPTY_SYNC_METADATA };\n}\n\nfunction defaultListState(): ListState {\n return { ...EMPTY_LIST_STATE, ids: [] };\n}\n\nfunction ek(type: EntityType, id: EntityId) { return `${type}:${id}`; }\n\ninterface SnapshotCacheEntry {\n base: Record<string, unknown>;\n patch: Record<string, unknown> | undefined;\n metadata: EntitySyncMetadata;\n snapshot: EntitySnapshot<Record<string, unknown>>;\n}\n\nconst snapshotCache = new Map<string, SnapshotCacheEntry>();\n\nfunction readCachedEntitySnapshot<T extends Record<string, unknown>>(\n type: EntityType,\n id: EntityId,\n base: Record<string, unknown>,\n patch: Record<string, unknown> | undefined,\n metadata: EntitySyncMetadata,\n): EntitySnapshot<T> {\n const key = ek(type, id);\n const cached = snapshotCache.get(key);\n if (\n cached &&\n cached.base === base &&\n cached.patch === patch &&\n cached.metadata === metadata\n ) {\n return cached.snapshot as EntitySnapshot<T>;\n }\n\n const snapshot = {\n ...(patch ? { ...base, ...patch } : base),\n $synced: metadata.synced,\n $origin: metadata.origin,\n $updatedAt: metadata.updatedAt,\n } as EntitySnapshot<T>;\n\n snapshotCache.set(key, { base, patch, metadata, snapshot });\n return snapshot;\n}\n\n/** Creates an isolated, framework-neutral entity graph store. */\nexport function createGraphStore() {\n return createStore<GraphState>()(\n subscribeWithSelector(\n immer((set, get) => ({\n entities: {}, patches: {}, entityStates: {}, syncMetadata: {}, lists: {},\n\n upsertEntity: (type, id, data) => set((s) => {\n if (!s.entities[type]) s.entities[type] = {};\n const key = ek(type, id);\n // Route through the registered MergeStrategy (default = LWW shallow merge,\n // identical to the historical `{ ...prev, ...data }` behavior).\n const strategy = getMergeStrategy(type);\n const ctx: MergeContext = { type, id, origin: s.syncMetadata[key]?.origin ?? \"server\", updatedAt: Date.now() };\n s.entities[type][id] = strategy(s.entities[type][id], data, ctx);\n if (!s.syncMetadata[key]) s.syncMetadata[key] = defaultSyncMetadata();\n }),\n upsertEntities: (type, entries) => set((s) => {\n if (!s.entities[type]) s.entities[type] = {};\n const strategy = getMergeStrategy(type);\n for (const { id, data } of entries) {\n const key = ek(type, id);\n const ctx: MergeContext = { type, id, origin: s.syncMetadata[key]?.origin ?? \"server\", updatedAt: Date.now() };\n s.entities[type][id] = strategy(s.entities[type][id], data, ctx);\n if (!s.syncMetadata[key]) s.syncMetadata[key] = defaultSyncMetadata();\n }\n }),\n replaceEntity: (type, id, data) => set((s) => {\n if (!s.entities[type]) s.entities[type] = {};\n s.entities[type][id] = data;\n const key = ek(type, id);\n if (!s.syncMetadata[key]) s.syncMetadata[key] = defaultSyncMetadata();\n }),\n removeEntity: (type, id) => set((s) => {\n delete s.entities[type]?.[id];\n delete s.patches[type]?.[id];\n delete s.entityStates[ek(type, id)];\n delete s.syncMetadata[ek(type, id)];\n }),\n patchEntity: (type, id, patch) => set((s) => {\n if (!s.patches[type]) s.patches[type] = {};\n s.patches[type][id] = { ...(s.patches[type][id] ?? {}), ...patch };\n }),\n unpatchEntity: (type, id, keys) => set((s) => {\n const p = s.patches[type]?.[id]; if (!p) return;\n for (const k of keys) delete p[k];\n }),\n clearPatch: (type, id) => set((s) => { delete s.patches[type]?.[id]; }),\n setEntityFetching: (type, id, fetching) => set((s) => {\n const k = ek(type, id);\n if (!s.entityStates[k]) s.entityStates[k] = defaultEntityState();\n s.entityStates[k].isFetching = fetching;\n }),\n setEntityError: (type, id, error) => set((s) => {\n const k = ek(type, id);\n if (!s.entityStates[k]) s.entityStates[k] = defaultEntityState();\n s.entityStates[k].error = error; s.entityStates[k].isFetching = false;\n }),\n setEntityFetched: (type, id) => set((s) => {\n const k = ek(type, id);\n if (!s.entityStates[k]) s.entityStates[k] = defaultEntityState();\n s.entityStates[k].lastFetched = Date.now();\n s.entityStates[k].isFetching = false;\n s.entityStates[k].error = null; s.entityStates[k].stale = false;\n s.syncMetadata[k] = { ...(s.syncMetadata[k] ?? defaultSyncMetadata()), synced: true, origin: \"server\", updatedAt: Date.now() };\n }),\n setEntityStale: (type, id, stale) => set((s) => {\n const k = ek(type, id);\n if (!s.entityStates[k]) s.entityStates[k] = defaultEntityState();\n s.entityStates[k].stale = stale;\n }),\n setEntitySyncMetadata: (type, id, metadata) => set((s) => {\n const k = ek(type, id);\n s.syncMetadata[k] = { ...(s.syncMetadata[k] ?? defaultSyncMetadata()), ...metadata };\n }),\n clearEntitySyncMetadata: (type, id) => set((s) => {\n delete s.syncMetadata[ek(type, id)];\n }),\n setListResult: (key, ids, meta) => set((s) => {\n const ex = s.lists[key] ?? defaultListState();\n s.lists[key] = { ...ex, ...meta, ids, isFetching: false, isFetchingMore: false, error: null, lastError: null, stale: false, lastFetched: Date.now() };\n }),\n appendListResult: (key, ids, meta) => set((s) => {\n const ex = s.lists[key] ?? defaultListState();\n s.lists[key] = { ...ex, ...meta, ids: Array.from(new Set([...ex.ids, ...ids])), isFetching: false, isFetchingMore: false, error: null, lastError: null, stale: false, lastFetched: Date.now() };\n }),\n prependListResult: (key, ids, meta) => set((s) => {\n const ex = s.lists[key] ?? defaultListState();\n s.lists[key] = { ...ex, ...(meta ?? {}), ids: Array.from(new Set([...ids, ...ex.ids])), isFetching: false, isFetchingMore: false, error: null, lastError: null, stale: false, lastFetched: Date.now() };\n }),\n removeIdFromAllLists: (_type, id) => set((s) => {\n for (const key of Object.keys(s.lists)) {\n const list = s.lists[key]; const idx = list.ids.indexOf(id);\n if (idx !== -1) { list.ids.splice(idx, 1); if (list.total !== null) list.total -= 1; }\n }\n }),\n insertIdInList: (key, id, position) => set((s) => {\n if (!s.lists[key]) s.lists[key] = defaultListState();\n const ids = s.lists[key].ids;\n const ex = ids.indexOf(id); if (ex !== -1) ids.splice(ex, 1);\n if (position === \"start\") ids.unshift(id);\n else if (position === \"end\") ids.push(id);\n else ids.splice(position, 0, id);\n }),\n setListFetching: (key, fetching) => set((s) => {\n if (!s.lists[key]) s.lists[key] = defaultListState();\n s.lists[key].isFetching = fetching;\n }),\n setListFetchingMore: (key, fetchingMore) => set((s) => {\n if (!s.lists[key]) s.lists[key] = defaultListState();\n s.lists[key].isFetchingMore = fetchingMore;\n }),\n setListError: (key, error, typed) => set((s) => {\n if (!s.lists[key]) s.lists[key] = defaultListState();\n s.lists[key].error = error;\n s.lists[key].lastError = typed ?? (error === null ? null : s.lists[key].lastError);\n s.lists[key].isFetching = false;\n s.lists[key].isFetchingMore = false;\n // Stamp lastFetched on failure too. Without this, the SWR\n // staleness check (`Date.now() - (lastFetched ?? 0) > staleTime`)\n // would return true on the next render and refire the fetcher\n // immediately — a 404/permanent error becomes an infinite\n // retry loop. With lastFetched stamped, the failure is treated\n // as a complete attempt and consumers see a stable `error` +\n // `isFetching: false`. They can manually `refetch()` if they\n // want to retry. Clearing `stale` also makes invalidateLists\n // the explicit retry mechanism, which is the contract we want.\n s.lists[key].lastFetched = Date.now();\n s.lists[key].stale = false;\n }),\n setListStale: (key, stale) => set((s) => {\n if (!s.lists[key]) s.lists[key] = defaultListState();\n s.lists[key].stale = stale;\n }),\n invalidateEntity: (type, id) => set((s) => {\n if (id) { const k = ek(type, id); if (s.entityStates[k]) s.entityStates[k].stale = true; }\n else { for (const k of Object.keys(s.entityStates)) if (k.startsWith(`${type}:`)) s.entityStates[k].stale = true; }\n }),\n invalidateLists: (matcher) => set((s) => {\n const pred = typeof matcher === \"string\" ? (k: string) => k.startsWith(matcher) : matcher;\n for (const key of Object.keys(s.lists)) if (pred(key)) s.lists[key].stale = true;\n }),\n invalidateType: (type) => { get().invalidateEntity(type); get().invalidateLists(type); },\n readEntity: <T>(type: EntityType, id: EntityId): T | null => {\n const s = get(); const base = s.entities[type]?.[id]; if (!base) return null;\n const patch = s.patches[type]?.[id];\n return (patch ? { ...base, ...patch } : base) as T;\n },\n readEntitySnapshot: <T>(type: EntityType, id: EntityId): EntitySnapshot<T & Record<string, unknown>> | null => {\n const s = get();\n const base = s.entities[type]?.[id];\n if (!base) {\n snapshotCache.delete(ek(type, id));\n return null;\n }\n const patch = s.patches[type]?.[id];\n const metadata = s.syncMetadata[ek(type, id)] ?? EMPTY_SYNC_METADATA;\n return readCachedEntitySnapshot<T & Record<string, unknown>>(\n type,\n id,\n base,\n patch,\n metadata,\n );\n },\n }))\n )\n );\n}\n\n/**\n * Default process-wide entity graph store. Framework bindings subscribe to\n * this vanilla store; non-React consumers use its `getState`, `setState`, and\n * `subscribe` methods directly.\n */\nexport const graphStore = createGraphStore();\n\nexport type GraphStore = ReturnType<typeof createGraphStore>;\n\n/**\n * @deprecated Import `graphStore` from core, or `useGraphStore` from the React\n * binding. This StoreApi-shaped alias remains for non-React 2.x migrations.\n */\nexport const useGraphStore = graphStore;\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\";\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-crdt\");\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 { EntityType, EntityId, GraphStore } from \"./graph\";\n\n/**\n * Process-wide defaults for stale times, retries, and background revalidation.\n * Keeps hook signatures small: `useEntity` / `useEntityList` merge these with per-query overrides.\n */\nexport interface EngineOptions {\n defaultStaleTime?: number;\n /** Max age (`Date.now() - lastFetched`) for evicting entities with zero subscribers during GC. */\n defaultGcTime?: number;\n /** Interval between GC passes when the collector is active (default 60s). */\n gcInterval?: number;\n maxRetries?: number;\n retryBaseDelay?: number;\n revalidateOnFocus?: boolean;\n revalidateOnReconnect?: boolean;\n}\n\n/**\n * Declarative **instruction** for loading one entity: wire transport (`fetch`), normalization, and graph writes.\n * Hooks pass this to `fetchEntity`; the graph remains source of truth after success.\n */\nexport interface EntityQueryOptions<TRaw, TEntity extends object> {\n type: EntityType;\n id: EntityId | null | undefined;\n fetch: (id: EntityId) => Promise<TRaw>;\n normalize: (raw: TRaw) => TEntity;\n idField?: string;\n sideEffects?: (raw: TRaw, store: GraphStore) => void;\n staleTime?: number;\n enabled?: boolean;\n onSuccess?: (entity: TEntity) => void;\n onError?: (error: Error) => void;\n}\n\n/** Cursor/page knobs passed through to list `fetch` implementations (REST, GraphQL, etc.). */\nexport interface ListFetchParams {\n cursor?: string;\n page?: number;\n pageSize?: number;\n params?: Record<string, unknown>;\n}\n\n/**\n * Normalized list page shape from any backend. Items are mapped through `normalize` into `{ id, data }` upserts — the list stores ids only.\n */\nexport interface ListResponse<T> {\n items: T[];\n total?: number | null;\n nextCursor?: string | null;\n prevCursor?: string;\n hasNextPage?: boolean;\n hasPrevPage?: boolean;\n page?: number;\n pageSize?: number;\n}\n\n/**\n * Declarative **instruction** for a collection query: stable `queryKey`, fetcher, and per-row normalization into the graph.\n * `mode` controls whether a fetch replaces ids or appends (infinite scroll) when used with load-more.\n */\nexport interface ListQueryOptions<TRaw, TEntity extends object> {\n type: EntityType;\n queryKey: unknown[];\n /**\n * Inline fetcher (deprecated 1.x REST form). Optional in 2.0: pure graph\n * subscriptions for Tier-A PGlite/Electric entities pass no fetcher — the\n * graph is hydrated out-of-band and the hook only joins ids → entities.\n * When omitted, `fetchList` is a no-op and the hook is read-only.\n */\n fetch?: (params: ListFetchParams) => Promise<ListResponse<TRaw>>;\n /** Row normalizer. Optional alongside `fetch` (graph-only callers omit both). */\n normalize?: (raw: TRaw) => { id: EntityId; data: TEntity };\n sideEffects?: (items: TRaw[], store: GraphStore) => void;\n mode?: \"replace\" | \"append\";\n staleTime?: number;\n enabled?: boolean;\n onSuccess?: (result: ListResponse<TRaw>) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Deterministic string key for list queries so object order in nested keys does not create duplicate cache entries.\n * @param key - Hook-provided query key array (serializable values)\n */\nexport function serializeKey(key: unknown[]): string {\n return JSON.stringify(key, (_, v) =>\n v && typeof v === \"object\" && !Array.isArray(v)\n ? Object.fromEntries(Object.entries(v as Record<string, unknown>).sort()) : v);\n}\n\nfunction sleep(ms: number) { return new Promise((r) => setTimeout(r, ms)); }\n\nconst inflightByStore = new WeakMap<GraphStore, Map<string, Promise<unknown>>>();\n\nfunction inflightFor(store: GraphStore) {\n let inflight = inflightByStore.get(store);\n if (!inflight) {\n inflight = new Map();\n inflightByStore.set(store, inflight);\n }\n return inflight;\n}\n/**\n * Collapse concurrent identical requests into one Promise (prevents stampedes when many components mount the same entity/list).\n * @param key - Logical dedupe key (e.g. `type:id` or serialized list key)\n * @param fn - Async work that performs the fetch + graph writes\n */\nexport function dedupe<T>(key: string, fn: () => Promise<T>, store: GraphStore = graphStore): Promise<T> {\n const inflight = inflightFor(store);\n if (inflight.has(key)) return inflight.get(key) as Promise<T>;\n const p = fn().finally(() => inflight.delete(key));\n inflight.set(key, p); return p;\n}\n\nconst subscriberStatsListeners = new Set<() => void>();\nfunction emitSubscriberStatsChange() {\n for (const cb of subscriberStatsListeners) cb();\n}\n\nconst subscribersByStore = new WeakMap<GraphStore, Map<string, Set<symbol>>>();\n\nfunction subscribersFor(store: GraphStore) {\n let subscribers = subscribersByStore.get(store);\n if (!subscribers) {\n subscribers = new Map();\n subscribersByStore.set(store, subscribers);\n }\n return subscribers;\n}\n/**\n * Ref-count graph interest for a subscriber key (`${type}:${id}`). Background revalidation skips keys with zero subscribers.\n * @returns Opaque token required for `unregisterSubscriber`\n */\nexport function registerSubscriber(key: string, store: GraphStore = graphStore): symbol {\n const subscribers = subscribersFor(store);\n const token = Symbol(key);\n if (!subscribers.has(key)) subscribers.set(key, new Set());\n subscribers.get(key)!.add(token);\n emitSubscriberStatsChange();\n return token;\n}\n/** Pair with `registerSubscriber` on unmount so idle entities stop refetching. */\nexport function unregisterSubscriber(key: string, token: symbol, store: GraphStore = graphStore) {\n const subscribers = subscribersFor(store);\n const set = subscribers.get(key);\n if (!set) return;\n set.delete(token);\n if (set.size === 0) subscribers.delete(key);\n emitSubscriberStatsChange();\n}\n/** Used by the engine to avoid background work for keys nothing in the tree is observing. */\nexport function hasSubscribers(key: string, store: GraphStore = graphStore) {\n return (subscribersFor(store).get(key)?.size ?? 0) > 0;\n}\n\nconst DEFAULT_OPTIONS: Required<EngineOptions> = {\n defaultStaleTime: 30_000,\n defaultGcTime: 300_000,\n gcInterval: 60_000,\n maxRetries: 3,\n retryBaseDelay: 1_000,\n revalidateOnFocus: true,\n revalidateOnReconnect: true,\n};\nlet engineOptions: Required<EngineOptions> = { ...DEFAULT_OPTIONS };\n\n/**\n * Subscribe to ref-count changes for `registerSubscriber` / `unregisterSubscriber`.\n * Used by `useGraphDevTools` so subscriber totals update without graph mutations.\n */\nexport function subscribeSubscriberStats(onChange: () => void) {\n subscriberStatsListeners.add(onChange);\n return () => subscriberStatsListeners.delete(onChange);\n}\n\n/** Total active entity subscriber tokens across all keys (sum of ref-counts). */\nexport function getActiveSubscriberCount(store: GraphStore = graphStore): number {\n let n = 0;\n for (const set of subscribersFor(store).values()) n += set.size;\n return n;\n}\n\n// ── DevtoolsEvent + tap (W3 — entity-engine-devtools-tap capability) ────────\n//\n// In-process push stream of mutating graph events for dev tooling. The\n// Entity Explorer (W5+) subscribes here for its Events tab and to keep the\n// Tree tab live without polling.\n//\n// Hot-path is a no-op when no subscribers are registered. Op-site calls in\n// graph-actions.ts are wrapped in `process.env.NODE_ENV !== \"production\"`\n// so esbuild DCE elides them from prod bundles.\n\n/**\n * Discriminated union of devtools events.\n *\n * - `upsert`, `patch`, `clearPatch` are emitted from `graph-actions.ts` ops.\n * - `unpatch` and `list` are forward-compatible kinds reserved for future\n * instrumentation (W5+ event bus / W6+ panel). Consumers MUST handle them\n * in exhaustive `switch`/`if` chains today, even though no op-site emits\n * them in this change.\n */\nexport type DevtoolsEvent =\n | { kind: \"upsert\"; type: EntityType; id: EntityId; data: Record<string, unknown>; at: string }\n | { kind: \"patch\"; type: EntityType; id: EntityId; patch: Record<string, unknown>; at: string }\n | { kind: \"unpatch\"; type: EntityType; id: EntityId; keys: string[]; at: string }\n | { kind: \"clearPatch\"; type: EntityType; id: EntityId; at: string }\n | { kind: \"list\"; key: string; idCount: number; at: string };\n\ntype DevtoolsListener = (event: DevtoolsEvent) => void;\n\nconst devtoolsSubscribers = new Set<DevtoolsListener>();\n\n/**\n * Subscribe to the devtools event stream.\n *\n * - Returns an `UnsubscribeFn` that removes this listener.\n * - Idempotent: subscribing the same function reference twice tracks it once\n * (Set semantics).\n * - Throwing listeners do NOT block delivery to other listeners; the error is\n * logged via `console.warn` and dispatch continues.\n * - Re-entrancy safe: listeners that subscribe/unsubscribe during dispatch\n * affect future events only, not the in-flight one.\n */\nexport function subscribeDevtoolsEvent(cb: DevtoolsListener): () => void {\n devtoolsSubscribers.add(cb);\n return () => {\n devtoolsSubscribers.delete(cb);\n };\n}\n\n/**\n * Internal — called from `graph-actions.ts` at every mutating op site.\n *\n * Hot-path no-op when no subscribers registered. Snapshot iteration for\n * re-entrancy safety. Per-subscriber `try/catch` so a throwing listener\n * doesn't break delivery to siblings.\n *\n * NOT re-exported from `src/index.ts` — the public surface is\n * `subscribeDevtoolsEvent` only.\n */\nexport function notifyDevtools(event: DevtoolsEvent): void {\n if (devtoolsSubscribers.size === 0) return;\n const listeners = [...devtoolsSubscribers];\n for (const cb of listeners) {\n try {\n cb(event);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\"[engine] devtools subscriber threw:\", err);\n }\n }\n}\n\nconst gcIntervalsByStore = new Map<GraphStore, ReturnType<typeof setInterval>>();\n\n/**\n * One GC pass: removes entities that are unobserved, older than `defaultGcTime`, not fetching,\n * and have no non-empty local patches; then strips their ids from all lists.\n */\nfunction runGarbageCollection(storeApi: GraphStore = graphStore): void {\n const store = storeApi.getState();\n const { defaultGcTime: gcTime } = getEngineOptions();\n const now = Date.now();\n const toRemove: Array<{ type: EntityType; id: EntityId }> = [];\n\n for (const type of Object.keys(store.entities)) {\n const bucket = store.entities[type];\n if (!bucket) continue;\n for (const id of Object.keys(bucket)) {\n const key = `${type}:${id}`;\n if (hasSubscribers(key, storeApi)) continue;\n const patch = store.patches[type]?.[id];\n if (patch !== undefined && Object.keys(patch).length > 0) continue;\n const entityState = store.entityStates[key];\n if (entityState?.isFetching) continue;\n const lastFetched = entityState?.lastFetched;\n if (lastFetched == null) continue;\n if (now - lastFetched <= gcTime) continue;\n toRemove.push({ type, id });\n }\n }\n\n for (const { type, id } of toRemove) {\n store.removeEntity(type, id);\n store.removeIdFromAllLists(type, id);\n }\n}\n\n/**\n * Stops the periodic garbage-collection timer for the selected graph.\n */\nexport function stopGarbageCollector(storeApi: GraphStore = graphStore): void {\n const intervalId = gcIntervalsByStore.get(storeApi);\n if (intervalId != null && typeof clearInterval !== \"undefined\") {\n clearInterval(intervalId);\n gcIntervalsByStore.delete(storeApi);\n }\n}\n\n/**\n * Starts periodic garbage collection using current `getEngineOptions().gcInterval`.\n * Stops any previous interval first. No-ops during SSR (`window` is undefined) or without `setInterval`.\n * @returns Disposer that stops this graph's collector.\n */\nexport function startGarbageCollector(storeApi: GraphStore = graphStore): () => void {\n stopGarbageCollector(storeApi);\n if (typeof window === \"undefined\" || typeof setInterval === \"undefined\") return () => {};\n const intervalId = setInterval(\n () => runGarbageCollection(storeApi),\n getEngineOptions().gcInterval,\n );\n gcIntervalsByStore.set(storeApi, intervalId);\n return () => stopGarbageCollector(storeApi);\n}\n\nfunction restartGarbageCollector(storeApi: GraphStore = graphStore) {\n startGarbageCollector(storeApi);\n}\n\n/** Override global engine behavior (typically once at app bootstrap). Restarts GC with merged options. */\nexport function configureEngine(opts: EngineOptions) {\n engineOptions = { ...DEFAULT_OPTIONS, ...opts };\n const activeStores = [...gcIntervalsByStore.keys()];\n if (activeStores.length === 0) restartGarbageCollector();\n else for (const storeApi of activeStores) restartGarbageCollector(storeApi);\n}\n/** Read merged engine options; hooks use this for default `staleTime` and retry behavior. */\nexport function getEngineOptions() { return engineOptions; }\n\n/**\n * Run a single-entity fetch with dedupe, retries, normalization, and graph updates.\n * Call from hooks/adapters — not from presentational components.\n */\nexport async function fetchEntity<TRaw, TEntity extends object>(\n opts: EntityQueryOptions<TRaw, TEntity>, engineOpts: Required<EngineOptions>, storeApi: GraphStore = graphStore\n) {\n const { type, id, fetch, normalize, sideEffects, idField = \"id\" } = opts;\n if (!id) return;\n storeApi.getState().setEntityFetching(type, id, true);\n const attempt = async (retries: number): Promise<void> => {\n try {\n const raw = await fetch(id);\n const normalized = normalize(raw);\n const resolvedId = (normalized as Record<string, unknown>)[idField] as EntityId ?? id;\n storeApi.getState().upsertEntity(type, resolvedId, normalized as Record<string, unknown>);\n storeApi.getState().setEntityFetched(type, resolvedId);\n if (sideEffects) sideEffects(raw, storeApi);\n opts.onSuccess?.(normalized);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n if (retries < engineOpts.maxRetries) { await sleep(engineOpts.retryBaseDelay * Math.pow(2, retries)); return attempt(retries + 1); }\n storeApi.getState().setEntityError(type, id, error.message);\n opts.onError?.(error);\n }\n };\n await dedupe(`${type}:${id}`, () => attempt(0), storeApi);\n}\n\n/**\n * Fetch a list page: upserts all rows, writes ids to the list key, supports append mode for pagination.\n * @param isLoadMore - When true, uses a separate dedupe key and `appendListResult` / `setListFetchingMore`.\n */\nexport async function fetchList<TRaw, TEntity extends object>(\n opts: ListQueryOptions<TRaw, TEntity>, params: ListFetchParams, engineOpts: Required<EngineOptions>, isLoadMore = false, storeApi: GraphStore = graphStore\n) {\n const { type, queryKey, fetch, normalize, sideEffects, mode = \"replace\" } = opts;\n const key = serializeKey(queryKey);\n const store = storeApi.getState();\n // Graph-only subscription (Tier-A PGlite/Electric): no inline fetcher. The\n // graph is hydrated out-of-band, so there is nothing to fetch here.\n if (!fetch || !normalize) return;\n if (isLoadMore) store.setListFetchingMore(key, true);\n else store.setListFetching(key, true);\n const attempt = async (retries: number): Promise<void> => {\n try {\n const response = await fetch(params);\n const normalized = response.items.map(normalize);\n storeApi.getState().upsertEntities(type, normalized.map(({ id, data }) => ({ id, data: data as Record<string, unknown> })));\n for (const { id } of normalized) storeApi.getState().setEntityFetched(type, id);\n const ids = normalized.map(({ id }) => id);\n const meta = { total: response.total ?? null, nextCursor: response.nextCursor ?? null, prevCursor: response.prevCursor ?? null, hasNextPage: response.hasNextPage ?? !!response.nextCursor, hasPrevPage: response.hasPrevPage ?? !!response.prevCursor, currentPage: response.page ?? null, pageSize: response.pageSize ?? null };\n if (mode === \"append\" && isLoadMore) storeApi.getState().appendListResult(key, ids, meta);\n else storeApi.getState().setListResult(key, ids, meta);\n if (sideEffects) sideEffects(response.items, storeApi);\n opts.onSuccess?.(response);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n if (retries < engineOpts.maxRetries) { await sleep(engineOpts.retryBaseDelay * Math.pow(2, retries)); return attempt(retries + 1); }\n storeApi.getState().setListError(key, error.message);\n opts.onError?.(error);\n }\n };\n await dedupe(isLoadMore ? `${key}:more` : key, () => attempt(0), storeApi);\n}\n\ninterface GlobalListenerAttachment {\n references: number;\n dispose: () => void;\n}\n\nconst globalListenerAttachments = new WeakMap<GraphStore, GlobalListenerAttachment>();\n\nfunction releaseGlobalListenerAttachment(\n storeApi: GraphStore,\n attachment: GlobalListenerAttachment,\n): () => void {\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const current = globalListenerAttachments.get(storeApi);\n if (current !== attachment) return;\n current.references -= 1;\n if (current.references > 0) return;\n current.dispose();\n globalListenerAttachments.delete(storeApi);\n };\n}\n\n/**\n * Opt-in window listeners that mark **subscribed** entities stale on focus/reconnect so hooks can SWR-refetch.\n * Reference-counted per graph and safe for SSR (no-ops without `window`).\n * @returns Disposer that releases this attachment and removes listeners plus GC when the last owner releases it.\n */\nexport function attachGlobalListeners(storeApi: GraphStore = graphStore): () => void {\n if (typeof window === \"undefined\") return () => {};\n const existing = globalListenerAttachments.get(storeApi);\n if (existing) {\n existing.references += 1;\n return releaseGlobalListenerAttachment(storeApi, existing);\n }\n\n const stopGc = startGarbageCollector(storeApi);\n const revalidateAll = () => {\n const state = storeApi.getState();\n for (const key of subscribersFor(storeApi).keys()) {\n if (!hasSubscribers(key, storeApi)) continue;\n const colonIdx = key.indexOf(\":\");\n if (colonIdx === -1) continue;\n const type = key.slice(0, colonIdx);\n const id = key.slice(colonIdx + 1);\n state.setEntityStale(type, id, true);\n }\n };\n const revalidateWhenVisible = () => {\n if (document.visibilityState === \"visible\") revalidateAll();\n };\n const revalidateOnFocus = engineOptions.revalidateOnFocus;\n const revalidateOnReconnect = engineOptions.revalidateOnReconnect;\n if (revalidateOnFocus) {\n window.addEventListener(\"visibilitychange\", revalidateWhenVisible);\n window.addEventListener(\"focus\", revalidateAll);\n }\n if (revalidateOnReconnect) window.addEventListener(\"online\", revalidateAll);\n\n const attachment: GlobalListenerAttachment = {\n references: 1,\n dispose: () => {\n if (revalidateOnFocus) {\n window.removeEventListener(\"visibilitychange\", revalidateWhenVisible);\n window.removeEventListener(\"focus\", revalidateAll);\n }\n if (revalidateOnReconnect) {\n window.removeEventListener(\"online\", revalidateAll);\n }\n stopGc();\n },\n };\n globalListenerAttachments.set(storeApi, attachment);\n return releaseGlobalListenerAttachment(storeApi, attachment);\n}\n","import { graphStore } from \"./graph\";\nimport type { EntityId, EntitySyncMetadata, EntityType, GraphStore, QueryKey, SyncOrigin } from \"./graph\";\nimport { notifyDevtools } from \"./engine\";\n\n// Local type declaration so we can reference `process.env.NODE_ENV` without\n// pulling in @types/node (the package targets browser bundles too). Consumer\n// bundlers (Vite/Webpack/esbuild) replace this literal at build time so the\n// devtools notify call-sites tree-shake out of production builds.\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 (typeof process === \"undefined\" || process.env.NODE_ENV !== \"production\") {\n notifyDevtools({ 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 (typeof process === \"undefined\" || process.env.NODE_ENV !== \"production\") {\n notifyDevtools({ 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 (typeof process === \"undefined\" || process.env.NODE_ENV !== \"production\") {\n notifyDevtools({ 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(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\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 registry = new Map<string, RegistryEntry>();\n\n/** Test-only helper: clears the devtools store registry between test runs. */\nexport function __resetStoreRegistry(): void {\n registry.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 to registry\n for (const entry of registry.values()) {\n if (entry.bus === bus && entry.active) {\n entry.active = false;\n try { entry.unsubscribeSrc(); } catch { /* ignore */ }\n }\n }\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 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 a snapshot of all registered stores (active + inactive) in registration order. */\nexport function getRegisteredStores(): ReadonlyArray<RegisteredStore> {\n return Array.from(registry.values()).map((e) => ({ name: e.name, active: e.active }));\n}\n","/**\n * devtools-time-travel.ts — G4 parity: true time-travel for the entity graph.\n *\n * The Timeline tab (C5) inspected a read-only history log. This adds the\n * defining Redux-DevTools capability the gap analysis called out: **rewind the\n * LIVE graph to a prior recorded state and replay forward.**\n *\n * Model:\n * - `recordGraphSnapshot()` captures the canonical graph data (entities, patches,\n * entityStates, syncMetadata, lists) into a bounded ring (default 50).\n * - `restoreGraphSnapshot(index)` writes a captured snapshot back into the live\n * Zustand store — the graph (and every subscriber/view) reverts to that state.\n * - `getTimeTravelState()` exposes the ring + current cursor for the devtools UI.\n *\n * Snapshots are deep-cloned on capture and on restore so restoring never aliases\n * ring contents into the live store (a later mutation must not corrupt history).\n *\n * This is debug-time machinery: it is intended to run behind the EntityExplorer,\n * not in production data paths.\n */\n\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 id (capture order). */\n seq: number;\n /** Capture timestamp (ms). */\n at: number;\n /** Optional label (e.g. the action that produced this state). */\n label?: string;\n data: GraphSlice;\n}\n\nexport interface TimeTravelState {\n snapshots: ReadonlyArray<Omit<TimeTravelSnapshot, \"data\">>;\n /** Index currently restored, or null if live (at head). */\n cursor: number | null;\n capacity: number;\n}\n\nlet capacity = 50;\nlet ring: TimeTravelSnapshot[] = [];\nlet seqCounter = 0;\nlet cursor: number | null = null;\nconst listeners = new Set<() => void>();\n\nfunction notify(): void {\n for (const l of listeners) l();\n}\n\nfunction cloneSlice(s: GraphSlice): GraphSlice {\n return {\n entities: structuredClone(s.entities),\n patches: structuredClone(s.patches),\n entityStates: structuredClone(s.entityStates),\n syncMetadata: structuredClone(s.syncMetadata),\n lists: structuredClone(s.lists),\n };\n}\n\n/** Configure ring capacity (number of retained snapshots). */\nexport function configureTimeTravel(opts: { capacity?: number }): void {\n if (opts.capacity && opts.capacity > 0) capacity = opts.capacity;\n if (ring.length > capacity) ring = ring.slice(-capacity);\n notify();\n}\n\n/** Capture the current live graph state into the ring. Returns the snapshot seq. */\nexport function recordGraphSnapshot(label?: string, storeApi: GraphStore = graphStore): number {\n const s = storeApi.getState();\n const snap: TimeTravelSnapshot = {\n seq: seqCounter++,\n at: Date.now(),\n ...(label !== undefined ? { label } : {}),\n data: cloneSlice(s),\n };\n ring.push(snap);\n if (ring.length > capacity) ring = ring.slice(-capacity);\n // Recording new state means we're at the live head again.\n cursor = null;\n notify();\n return snap.seq;\n}\n\n/**\n * Restore the live graph to the snapshot at ring `index` (0-based into the\n * current ring). The Zustand store is overwritten with a deep clone of the\n * captured slice, so all subscribers re-render at that historical state.\n * Returns true if restored.\n */\nexport function restoreGraphSnapshot(index: number, storeApi: GraphStore = graphStore): boolean {\n const snap = ring[index];\n if (!snap) return false;\n const clone = cloneSlice(snap.data);\n storeApi.setState(clone as Partial<ReturnType<typeof graphStore.getState>>);\n cursor = index;\n notify();\n return true;\n}\n\n/** Restore by capture seq (stable across ring eviction within capacity). */\nexport function restoreGraphSnapshotBySeq(seq: number, storeApi: GraphStore = graphStore): boolean {\n const index = ring.findIndex((s) => s.seq === seq);\n return index === -1 ? false : restoreGraphSnapshot(index, storeApi);\n}\n\n/** Step the cursor by `delta` (negative = back in time) and restore. */\nexport function stepTimeTravel(delta: number, storeApi: GraphStore = graphStore): boolean {\n const base = cursor ?? ring.length - 1;\n const target = Math.max(0, Math.min(ring.length - 1, base + delta));\n return restoreGraphSnapshot(target, storeApi);\n}\n\n/** Snapshot metadata + cursor for the devtools UI (no heavy data payloads). */\nexport function getTimeTravelState(): TimeTravelState {\n return {\n snapshots: ring.map(({ data: _data, ...meta }) => meta),\n cursor,\n capacity,\n };\n}\n\n/** Subscribe to ring/cursor changes (for useSyncExternalStore in the UI). */\nexport function subscribeTimeTravel(cb: () => void): () => void {\n listeners.add(cb);\n return () => listeners.delete(cb);\n}\n\n/** @internal Test-only reset. */\nexport function __resetTimeTravel(): void {\n ring = [];\n seqCounter = 0;\n cursor = null;\n capacity = 50;\n}\n","import type { FilterSpec, FilterClause, FilterGroup, SortSpec, SortClause } from \"./types\";\n\n/**\n * Evaluate `FilterSpec` against one in-memory entity — mirrors remote semantics as closely as plain JS allows.\n * Use for **local** and **hybrid** `useEntityView` paths so UI filtering matches what users expect from the declarative spec.\n */\nexport function matchesFilter(entity: Record<string, unknown>, filter: FilterSpec): boolean {\n if (Array.isArray(filter)) return filter.every((clause) => matchesClause(entity, clause));\n return matchesGroup(entity, filter);\n}\nfunction matchesGroup(entity: Record<string, unknown>, group: FilterGroup): boolean {\n const { logic, clauses } = group;\n if (logic === \"and\") return clauses.every((c) => \"logic\" in c ? matchesGroup(entity, c) : matchesClause(entity, c));\n return clauses.some((c) => \"logic\" in c ? matchesGroup(entity, c) : matchesClause(entity, c));\n}\nfunction matchesClause(entity: Record<string, unknown>, clause: FilterClause): boolean {\n const { field, op, value, predicate } = clause;\n const fv = getNestedValue(entity, field);\n switch (op) {\n case \"eq\": return fv === value;\n case \"neq\": return fv !== value;\n case \"gt\": return (fv as number) > (value as number);\n case \"gte\": return (fv as number) >= (value as number);\n case \"lt\": return (fv as number) < (value as number);\n case \"lte\": return (fv as number) <= (value as number);\n case \"in\": return Array.isArray(value) && value.includes(fv);\n case \"nin\": return Array.isArray(value) && !value.includes(fv);\n case \"isNull\": return fv == null;\n case \"isNotNull\": return fv != null;\n case \"contains\": return typeof fv === \"string\" && typeof value === \"string\" && fv.toLowerCase().includes(value.toLowerCase());\n case \"startsWith\": return typeof fv === \"string\" && typeof value === \"string\" && fv.toLowerCase().startsWith(value.toLowerCase());\n case \"endsWith\": return typeof fv === \"string\" && typeof value === \"string\" && fv.toLowerCase().endsWith(value.toLowerCase());\n case \"between\": { const [lo, hi] = value as [number, number]; return (fv as number) >= lo && (fv as number) <= hi; }\n case \"arrayContains\": return Array.isArray(fv) && fv.includes(value);\n case \"arrayOverlaps\": return Array.isArray(fv) && Array.isArray(value) && value.some((v) => fv.includes(v));\n case \"matches\": return typeof fv === \"string\" && new RegExp(value as string).test(fv);\n case \"custom\": return predicate ? predicate(fv, entity) : true;\n default: return true;\n }\n}\n/**\n * Case-insensitive substring match across configured string fields; empty query is a no-op pass.\n * Keeps quick search consistent between client-only and debounced remote `q` params.\n */\nexport function matchesSearch(entity: Record<string, unknown>, query: string, fields: string[]): boolean {\n if (!query.trim()) return true;\n const lq = query.toLowerCase();\n return fields.some((field) => { const v = getNestedValue(entity, field); return typeof v === \"string\" && v.toLowerCase().includes(lq); });\n}\n/**\n * Multi-key comparator implementing `SortSpec` (null ordering, optional custom comparators, locale-aware string fallback).\n * Shared by local sorting and binary insertion for realtime updates.\n */\nexport function compareEntities(a: Record<string, unknown>, b: Record<string, unknown>, sort: SortSpec): number {\n for (const clause of sort) { const r = compareByClause(a, b, clause); if (r !== 0) return r; } return 0;\n}\nfunction compareByClause(a: Record<string, unknown>, b: Record<string, unknown>, clause: SortClause): number {\n const { field, direction, nulls = \"last\", comparator } = clause;\n const av = getNestedValue(a, field); const bv = getNestedValue(b, field);\n const aNull = av == null; const bNull = bv == null;\n if (aNull && bNull) return 0;\n if (aNull) return nulls === \"first\" ? -1 : 1;\n if (bNull) return nulls === \"first\" ? 1 : -1;\n let cmp: number;\n if (comparator) cmp = comparator(av, bv);\n else if (typeof av === \"string\" && typeof bv === \"string\") cmp = av.localeCompare(bv, undefined, { sensitivity: \"base\", numeric: true });\n else if (typeof av === \"number\" && typeof bv === \"number\") cmp = av - bv;\n else cmp = String(av).localeCompare(String(bv));\n return direction === \"desc\" ? -cmp : cmp;\n}\n/**\n * Binary-search insertion index so realtime inserts land in sorted order without resorting the full id list (O(log n) per insert).\n * Skips missing `getEntity` rows by advancing low — callers should ensure entities exist or tolerate append-like behavior.\n */\nexport function findInsertionIndex(entity: Record<string, unknown>, sortedIds: string[], getEntity: (id: string) => Record<string, unknown> | null, sort: SortSpec): number {\n let lo = 0; let hi = sortedIds.length;\n while (lo < hi) { const mid = (lo + hi) >>> 1; const me = getEntity(sortedIds[mid]); if (!me) { lo = mid + 1; continue; } if (compareEntities(entity, me, sort) <= 0) hi = mid; else lo = mid + 1; }\n return lo;\n}\n/**\n * Pure list projection: map ids → entities, drop missing, filter/sort/search, return **ids** in display order.\n * Bridges stored id lists with on-the-fly view descriptors without duplicating entity payloads.\n */\nexport function applyView(ids: string[], getEntity: (id: string) => Record<string, unknown> | null, filter?: FilterSpec | null, sort?: SortSpec | null, search?: { query: string; fields: string[] } | null): string[] {\n let entries: Array<{ id: string; entity: Record<string, unknown> }> = [];\n for (const id of ids) { const entity = getEntity(id); if (!entity) continue; entries.push({ id, entity }); }\n if (filter && entries.length > 0) entries = entries.filter(({ entity }) => matchesFilter(entity, filter));\n if (search?.query) entries = entries.filter(({ entity }) => matchesSearch(entity, search.query, search.fields));\n if (sort && sort.length > 0) entries.sort((a, b) => compareEntities(a.entity, b.entity, sort));\n return entries.map((e) => e.id);\n}\n/**\n * Heuristic for whether the graph likely holds **all** rows for a list key (enables local-only filtering/sorting in `useEntityView`).\n * `total` and `hasNextPage` come from list metadata written by fetchers.\n */\nexport function checkCompleteness(loadedCount: number, total: number | null, hasNextPage: boolean): { isComplete: boolean; reason: string } {\n if (!hasNextPage && total !== null && loadedCount >= total) return { isComplete: true, reason: \"all-loaded\" };\n if (hasNextPage) return { isComplete: false, reason: \"has-more-pages\" };\n return { isComplete: true, reason: \"no-more-pages\" };\n}\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\");\n let current: unknown = obj;\n for (const part of parts) { if (current == null || typeof current !== \"object\") return undefined; current = (current as Record<string, unknown>)[part]; }\n return current;\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","import { graphStore } from \"../graph\";\nimport { serializeKey } from \"../engine\";\nimport type { EntityType, EntityId, GraphStore } from \"../graph\";\n\nexport type RelationCardinality = \"belongsTo\" | \"hasMany\" | \"manyToMany\";\n/**\n * FK edge: this entity points at one parent row. Used to invalidate parent aggregates and optional list keys when the FK changes.\n */\nexport interface BelongsToRelation { cardinality: \"belongsTo\"; foreignKey: string; targetType: EntityType; invalidateTargetLists?: string[]; }\n/**\n * Inverse collection: children carry `foreignKey` pointing here; `listKeyPrefix` builds the child list query key for a given parent id.\n */\nexport interface HasManyRelation { cardinality: \"hasMany\"; targetType: EntityType; foreignKey: string; listKeyPrefix: (parentId: EntityId) => unknown[]; }\n/**\n * Join-style relation stored as an id array on this entity; invalidates partner lists derived via `listKeyPrefix` for each touched id.\n */\nexport interface ManyToManyRelation { cardinality: \"manyToMany\"; targetType: EntityType; localArrayField?: string; listKeyPrefix: (thisId: EntityId) => unknown[]; }\nexport type RelationDescriptor = BelongsToRelation | HasManyRelation | ManyToManyRelation;\n/**\n * Declarative relation metadata for one `EntityType`: optional named relations and list key prefixes to invalidate on any mutation.\n */\nexport interface EntitySchema { type: EntityType; relations?: Record<string, RelationDescriptor>; globalListKeys?: string[]; }\n/**\n * Snapshot diff passed to cascade rules after CRUD: compare `previous` vs `next` to find FK moves, array membership changes, etc.\n */\nexport interface CascadeContext { type: EntityType; id: EntityId; previous: Record<string, unknown> | null; next: Record<string, unknown> | null; op: \"create\" | \"update\" | \"delete\"; }\n\nconst schemaRegistry = new Map<EntityType, EntitySchema>();\n/** Register or replace schema for `schema.type` (typically at app init). */\nexport function registerSchema(schema: EntitySchema) { schemaRegistry.set(schema.type, schema); }\n/** Lookup schema for cascade/join reads; returns null if unregistered. */\nexport function getSchema(type: EntityType) { return schemaRegistry.get(type) ?? null; }\n\n/**\n * After a successful mutation, mark related entities/lists stale so hooks refetch without manually hunting query keys.\n * Traverses registered schemas (including reverse `hasMany`) so denormalized UIs stay eventually consistent with the graph.\n */\nexport function cascadeInvalidation(ctx: CascadeContext, storeApi: GraphStore = graphStore) {\n const schema = schemaRegistry.get(ctx.type); if (!schema) return;\n const store = storeApi.getState();\n if (schema.globalListKeys) for (const key of schema.globalListKeys) store.invalidateLists(key);\n if (!schema.relations) return;\n for (const [, relation] of Object.entries(schema.relations)) {\n switch (relation.cardinality) {\n case \"belongsTo\": {\n const prevFk = ctx.previous?.[relation.foreignKey] as EntityId | null;\n const nextFk = ctx.next?.[relation.foreignKey] as EntityId | null;\n if (prevFk && prevFk !== nextFk && relation.invalidateTargetLists) for (const kp of relation.invalidateTargetLists) store.invalidateLists((k) => k.startsWith(kp) && k.includes(prevFk));\n if (nextFk && relation.invalidateTargetLists) for (const kp of relation.invalidateTargetLists) store.invalidateLists((k) => k.startsWith(kp) && k.includes(nextFk));\n if (prevFk) store.invalidateEntity(relation.targetType, prevFk);\n if (nextFk) store.invalidateEntity(relation.targetType, nextFk);\n break;\n }\n case \"hasMany\": store.invalidateLists(serializeKey(relation.listKeyPrefix(ctx.id) as unknown[])); break;\n case \"manyToMany\": {\n const prevIds = ctx.previous?.[relation.localArrayField ?? \"\"] as EntityId[] | null;\n const nextIds = ctx.next?.[relation.localArrayField ?? \"\"] as EntityId[] | null;\n for (const relatedId of new Set([...(prevIds ?? []), ...(nextIds ?? [])])) store.invalidateLists(serializeKey(relation.listKeyPrefix(relatedId) as unknown[]));\n break;\n }\n }\n }\n for (const [, otherSchema] of schemaRegistry) {\n if (!otherSchema.relations) continue;\n for (const [, rel] of Object.entries(otherSchema.relations)) {\n if (rel.targetType !== ctx.type) continue;\n if (rel.cardinality === \"hasMany\") store.invalidateLists(serializeKey(rel.listKeyPrefix(ctx.id) as unknown[]));\n }\n }\n}\n\n/**\n * Resolve relation **placeholders** for detail panels: joins graph reads for belongs-to targets, has-many id lists, or many-to-many id arrays.\n * Returns plain objects suitable for rendering; does not mutate the graph.\n */\nexport function readRelations(type: EntityType, entity: Record<string, unknown>, storeApi: GraphStore = graphStore): Record<string, unknown> {\n const schema = schemaRegistry.get(type); if (!schema?.relations) return {};\n const store = storeApi.getState(); const result: Record<string, unknown> = {};\n for (const [name, relation] of Object.entries(schema.relations)) {\n switch (relation.cardinality) {\n case \"belongsTo\": { const fkValue = entity[relation.foreignKey] as EntityId | null; result[name] = fkValue ? store.readEntity(relation.targetType, fkValue) : null; break; }\n case \"hasMany\": { const listKey = serializeKey(relation.listKeyPrefix(entity.id as EntityId) as unknown[]); const listState = store.lists[listKey]; result[name] = listState ? listState.ids.map((id) => store.readEntity(relation.targetType, id)).filter(Boolean) : []; break; }\n case \"manyToMany\": { const ids = entity[relation.localArrayField ?? \"\"] as EntityId[] | null; result[name] = ids ? ids.map((id) => store.readEntity(relation.targetType, id)).filter(Boolean) : []; break; }\n }\n }\n return result;\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/view/prisma-compile.ts","../src/view/types.ts","../src/transport/rest.ts","../src/merge/lww.ts","../src/merge/registry.ts","../src/view/evaluator.ts","../src/graph.ts","../src/object-path.ts","../src/merge/loro.ts","../src/graph-query.ts","../src/engine.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/crud/relations.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","createStore","subscribeWithSelector","immer","clone","ek","listeners","sleep","idx","schemaRegistry","isObject","id","document","DEFAULT_TABLE","rows"],"mappings":"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","file":"index.cjs","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","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","/**\n * merge/lww.ts — Last-write-wins default strategy.\n *\n * Semantics match the historical `upsertEntity` behavior exactly: shallow-merge\n * the incoming write over the previous value. This is the fallback when no\n * other strategy is registered, so registering nothing is a no-op change.\n */\n\nimport type { MergeStrategy } from \"./types\";\n\n/**\n * Shallow-merge `next` over `prev` (incoming keys win). Returns a new object.\n * On first write (`prev` undefined) returns a shallow copy of `next`.\n */\nexport const lwwStrategy: MergeStrategy = (prev, next) => {\n return prev ? { ...prev, ...next } : { ...next };\n};\n","/**\n * merge/registry.ts — One MergeStrategy per entity type (+ optional global default).\n *\n * Lookup order at write time:\n * 1. strategy registered for the exact `type`\n * 2. global default strategy (if one was set)\n * 3. built-in LWW (`lwwStrategy`)\n *\n * Step 3 guarantees that with zero registrations the graph behaves exactly as\n * it did before this seam existed.\n */\n\nimport type { MergeStrategy } from \"./types\";\nimport { lwwStrategy } from \"./lww\";\n\nconst byType = new Map<string, MergeStrategy>();\nlet globalDefault: MergeStrategy | null = null;\n\n/**\n * Register a {@link MergeStrategy} for one entity type. Overwrites any prior\n * registration for that type.\n */\nexport function registerMergeStrategy(type: string, strategy: MergeStrategy): void {\n byType.set(type, strategy);\n}\n\n/**\n * Set the fallback strategy used for any type without its own registration.\n * Pass `null` to clear it (reverting the fallback to built-in LWW).\n */\nexport function setDefaultMergeStrategy(strategy: MergeStrategy | null): void {\n globalDefault = strategy;\n}\n\n/**\n * Resolve the effective strategy for a type: per-type → global default → LWW.\n * Always returns a usable strategy (never null).\n */\nexport function getMergeStrategy(type: string): MergeStrategy {\n return byType.get(type) ?? globalDefault ?? lwwStrategy;\n}\n\n/** True if `type` (or a global default) has a non-LWW strategy registered. */\nexport function hasMergeStrategy(type: string): boolean {\n return byType.has(type) || globalDefault !== null;\n}\n\n/** @internal Test-only. NOT re-exported from index.ts. */\nexport function __resetMergeStrategies(): void {\n byType.clear();\n globalDefault = null;\n}\n","import type { FilterSpec, FilterClause, FilterGroup, SortSpec, SortClause } from \"./types\";\n\n/**\n * Evaluate `FilterSpec` against one in-memory entity — mirrors remote semantics as closely as plain JS allows.\n * Use for **local** and **hybrid** `useEntityView` paths so UI filtering matches what users expect from the declarative spec.\n */\nexport function matchesFilter(entity: Record<string, unknown>, filter: FilterSpec): boolean {\n if (Array.isArray(filter)) return filter.every((clause) => matchesClause(entity, clause));\n return matchesGroup(entity, filter);\n}\nfunction matchesGroup(entity: Record<string, unknown>, group: FilterGroup): boolean {\n const { logic, clauses } = group;\n if (logic === \"and\") return clauses.every((c) => \"logic\" in c ? matchesGroup(entity, c) : matchesClause(entity, c));\n return clauses.some((c) => \"logic\" in c ? matchesGroup(entity, c) : matchesClause(entity, c));\n}\nfunction matchesClause(entity: Record<string, unknown>, clause: FilterClause): boolean {\n const { field, op, value, predicate } = clause;\n const fv = getNestedValue(entity, field);\n switch (op) {\n case \"eq\": return fv === value;\n case \"neq\": return fv !== value;\n case \"gt\": return (fv as number) > (value as number);\n case \"gte\": return (fv as number) >= (value as number);\n case \"lt\": return (fv as number) < (value as number);\n case \"lte\": return (fv as number) <= (value as number);\n case \"in\": return Array.isArray(value) && value.includes(fv);\n case \"nin\": return Array.isArray(value) && !value.includes(fv);\n case \"isNull\": return fv == null;\n case \"isNotNull\": return fv != null;\n case \"contains\": return typeof fv === \"string\" && typeof value === \"string\" && fv.toLowerCase().includes(value.toLowerCase());\n case \"startsWith\": return typeof fv === \"string\" && typeof value === \"string\" && fv.toLowerCase().startsWith(value.toLowerCase());\n case \"endsWith\": return typeof fv === \"string\" && typeof value === \"string\" && fv.toLowerCase().endsWith(value.toLowerCase());\n case \"between\": { const [lo, hi] = value as [number, number]; return (fv as number) >= lo && (fv as number) <= hi; }\n case \"arrayContains\": return Array.isArray(fv) && fv.includes(value);\n case \"arrayOverlaps\": return Array.isArray(fv) && Array.isArray(value) && value.some((v) => fv.includes(v));\n case \"matches\": return typeof fv === \"string\" && new RegExp(value as string).test(fv);\n case \"custom\": return predicate ? predicate(fv, entity) : true;\n default: return true;\n }\n}\n/**\n * Case-insensitive substring match across configured string fields; empty query is a no-op pass.\n * Keeps quick search consistent between client-only and debounced remote `q` params.\n */\nexport function matchesSearch(entity: Record<string, unknown>, query: string, fields: string[]): boolean {\n if (!query.trim()) return true;\n const lq = query.toLowerCase();\n return fields.some((field) => { const v = getNestedValue(entity, field); return typeof v === \"string\" && v.toLowerCase().includes(lq); });\n}\n/**\n * Multi-key comparator implementing `SortSpec` (null ordering, optional custom comparators, locale-aware string fallback).\n * Shared by local sorting and binary insertion for realtime updates.\n */\nexport function compareEntities(a: Record<string, unknown>, b: Record<string, unknown>, sort: SortSpec): number {\n for (const clause of sort) { const r = compareByClause(a, b, clause); if (r !== 0) return r; } return 0;\n}\nfunction compareByClause(a: Record<string, unknown>, b: Record<string, unknown>, clause: SortClause): number {\n const { field, direction, nulls = \"last\", comparator } = clause;\n const av = getNestedValue(a, field); const bv = getNestedValue(b, field);\n const aNull = av == null; const bNull = bv == null;\n if (aNull && bNull) return 0;\n if (aNull) return nulls === \"first\" ? -1 : 1;\n if (bNull) return nulls === \"first\" ? 1 : -1;\n let cmp: number;\n if (comparator) cmp = comparator(av, bv);\n else if (typeof av === \"string\" && typeof bv === \"string\") cmp = av.localeCompare(bv, undefined, { sensitivity: \"base\", numeric: true });\n else if (typeof av === \"number\" && typeof bv === \"number\") cmp = av - bv;\n else cmp = String(av).localeCompare(String(bv));\n return direction === \"desc\" ? -cmp : cmp;\n}\n/**\n * Binary-search insertion index so realtime inserts land in sorted order without resorting the full id list (O(log n) per insert).\n * Skips missing `getEntity` rows by advancing low — callers should ensure entities exist or tolerate append-like behavior.\n */\nexport function findInsertionIndex(entity: Record<string, unknown>, sortedIds: string[], getEntity: (id: string) => Record<string, unknown> | null, sort: SortSpec): number {\n let lo = 0; let hi = sortedIds.length;\n while (lo < hi) { const mid = (lo + hi) >>> 1; const me = getEntity(sortedIds[mid]); if (!me) { lo = mid + 1; continue; } if (compareEntities(entity, me, sort) <= 0) hi = mid; else lo = mid + 1; }\n return lo;\n}\n/**\n * Pure list projection: map ids → entities, drop missing, filter/sort/search, return **ids** in display order.\n * Bridges stored id lists with on-the-fly view descriptors without duplicating entity payloads.\n */\nexport function applyView(ids: string[], getEntity: (id: string) => Record<string, unknown> | null, filter?: FilterSpec | null, sort?: SortSpec | null, search?: { query: string; fields: string[] } | null): string[] {\n let entries: Array<{ id: string; entity: Record<string, unknown> }> = [];\n for (const id of ids) { const entity = getEntity(id); if (!entity) continue; entries.push({ id, entity }); }\n if (filter && entries.length > 0) entries = entries.filter(({ entity }) => matchesFilter(entity, filter));\n if (search?.query) entries = entries.filter(({ entity }) => matchesSearch(entity, search.query, search.fields));\n if (sort && sort.length > 0) entries.sort((a, b) => compareEntities(a.entity, b.entity, sort));\n return entries.map((e) => e.id);\n}\n/**\n * Heuristic for whether the graph likely holds **all** rows for a list key (enables local-only filtering/sorting in `useEntityView`).\n * `total` and `hasNextPage` come from list metadata written by fetchers.\n */\nexport function checkCompleteness(loadedCount: number, total: number | null, hasNextPage: boolean): { isComplete: boolean; reason: string } {\n if (!hasNextPage && total !== null && loadedCount >= total) return { isComplete: true, reason: \"all-loaded\" };\n if (hasNextPage) return { isComplete: false, reason: \"has-more-pages\" };\n return { isComplete: true, reason: \"no-more-pages\" };\n}\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\");\n let current: unknown = obj;\n for (const part of parts) { if (current == null || typeof current !== \"object\") return undefined; current = (current as Record<string, unknown>)[part]; }\n return current;\n}\n","import { createStore } from \"zustand/vanilla\";\nimport { subscribeWithSelector } from \"zustand/middleware\";\nimport { immer } from \"zustand/middleware/immer\";\nimport type { EntityError } from \"./errors\";\nimport { getMergeStrategy } from \"./merge/registry\";\nimport type { MergeContext } from \"./merge/types\";\nimport { findInsertionIndex, matchesFilter, matchesSearch } from \"./view/evaluator\";\nimport type { ViewDescriptor } from \"./view/types\";\n\n/** Logical entity kind (e.g. `\"Post\"`). Used to partition the normalized graph. */\nexport type EntityType = string;\n/** Primary key for an entity within its `type`. Lists and relations reference this, not row copies. */\nexport type EntityId = string;\n/** Stable string key for a list query (often `JSON.stringify`-shaped). Lists store IDs only under this key. */\nexport type QueryKey = string;\n/** Provenance of the latest known entity state. */\nexport type SyncOrigin = \"server\" | \"client\" | \"optimistic\";\n\n/** Optional sync-facing metadata kept outside canonical entity payloads. */\nexport interface EntitySyncMetadata {\n synced: boolean;\n origin: SyncOrigin;\n updatedAt: number | null;\n}\n\n/** Snapshot shape returned by sync-aware reads and graph-native query helpers. */\nexport type EntitySnapshot<T extends object> = T & {\n $synced: boolean;\n $origin: SyncOrigin;\n $updatedAt: number | null;\n};\n\n/**\n * Fetch/cache metadata for a single entity instance (`type:id`).\n * Separates transport concerns from canonical `entities` data so hooks can show spinners and stale-while-revalidate without mutating server-shaped fields.\n */\nexport interface EntityState {\n isFetching: boolean;\n lastFetched: number | null;\n error: string | null;\n stale: boolean;\n}\n\n/**\n * Ordered **IDs** for a list query plus pagination metadata — never embedded entity payloads.\n * Cross-view reactivity depends on this: when `entities[type][id]` updates, every list containing that id re-resolves rows from the graph.\n */\nexport interface ListState {\n ids: EntityId[];\n total: number | null;\n nextCursor: string | null;\n prevCursor: string | null;\n hasNextPage: boolean;\n hasPrevPage: boolean;\n isFetching: boolean;\n isFetchingMore: boolean;\n error: string | null;\n /**\n * Typed error instance for 2.0 hooks (`useEntities`, `useEntityQuery`).\n * Carries `TerminalError` / `TransientError` so consumers can\n * `instanceof`-check the failure mode without parsing the string in\n * `error`. Both fields are written together by `setListError`; the\n * string `error` field remains for back-compat with 1.x consumers.\n */\n lastError: EntityError | null;\n lastFetched: number | null;\n stale: boolean;\n currentPage: number | null;\n pageSize: number | null;\n}\n\n/** Pagination and lifecycle metadata accepted by successful list writes. */\nexport type ListResultMeta = Partial<Omit<\n ListState,\n \"ids\" | \"isFetching\" | \"isFetchingMore\" | \"error\" | \"stale\"\n>>;\n\n/** One list projection updated as part of an atomic fetched-list ingestion. */\nexport interface FetchedListTarget {\n key: QueryKey;\n mode?: \"replace\" | \"append\";\n meta?: ListResultMeta;\n /** Override list membership when the transport derives ids separately. */\n ids?: EntityId[];\n}\n\n/** Additional normalized entity rows committed with the primary fetched list. */\nexport interface FetchedEntityBatch {\n type: EntityType;\n entries: Array<{ id: EntityId; data: Record<string, unknown> }>;\n}\n\n/** Incrementally project fetched rows into an existing view-backed list. */\nexport interface FetchedListProjection {\n key: QueryKey;\n view: ViewDescriptor;\n /** Complete the projection's fetch lifecycle without replacing its ids. */\n completeFetch?: boolean;\n}\n\n/** Additional graph projections completed by one fetched-list response. */\nexport interface IngestFetchedListOptions {\n lists?: FetchedListTarget[];\n /** Side-descriptor rows that must commit or fail with the primary batch. */\n sideBatches?: FetchedEntityBatch[];\n /** View-backed lists that receive matching fetched ids in the same publication. */\n projections?: FetchedListProjection[];\n /** List fetch flags to clear without replacing their existing ids or metadata. */\n finishListFetches?: QueryKey[];\n}\n\n/**\n * Stable fallbacks for missing `lists[key]` / `entityStates[key]` slots.\n * Inline `?? { ... }` defaults allocate new objects every `getSnapshot` call and trigger React 19\n * “getSnapshot should be cached” / maximum update depth errors with `useSyncExternalStore`.\n */\nexport const EMPTY_IDS: EntityId[] = [];\n\nexport const EMPTY_ENTITY_STATE: EntityState = {\n isFetching: false,\n lastFetched: null,\n error: null,\n stale: false,\n};\n\nexport const EMPTY_SYNC_METADATA: EntitySyncMetadata = {\n synced: true,\n origin: \"server\",\n updatedAt: null,\n};\n\nexport const EMPTY_LIST_STATE: ListState = {\n ids: EMPTY_IDS,\n total: null,\n nextCursor: null,\n prevCursor: null,\n hasNextPage: false,\n hasPrevPage: false,\n isFetching: false,\n isFetchingMore: false,\n error: null,\n lastError: null,\n lastFetched: null,\n stale: false,\n currentPage: null,\n pageSize: null,\n};\n\n/**\n * Canonical Zustand store: **entities** (server truth), **patches** (UI-only overlay), **lists** (id order + list meta), and **entityStates** (per-entity fetch state).\n * Framework bindings subscribe to the vanilla store; stores, adapters, and\n * engines can read it synchronously through `graphStore.getState()`.\n */\nexport interface GraphState {\n /** Normalized server-confirmed records. Mutate only via upsert/replace/remove — not from components. */\n entities: Record<EntityType, Record<EntityId, Record<string, unknown>>>;\n /** Local-only fields merged at read time (`readEntity` / hooks). Never send patches to the server. */\n patches: Record<EntityType, Record<EntityId, Record<string, unknown>>>;\n /** Per-entity fetch lifecycle keyed as `${type}:${id}`. */\n entityStates: Record<string, EntityState>;\n /** Optional sync/provenance state layered beside the canonical entity payload. */\n syncMetadata: Record<string, EntitySyncMetadata>;\n /** List slots keyed by serialized query keys. Values hold id arrays and pagination — not entity clones. */\n lists: Record<QueryKey, ListState>;\n /**\n * Shallow-merge `data` into the canonical entity. Use when the API returns partial updates or normalized fragments.\n * @param type - Entity kind\n * @param id - Entity id\n * @param data - Fields to merge into existing canonical data\n */\n upsertEntity: (type: EntityType, id: EntityId, data: Record<string, unknown>) => void;\n /**\n * Batch upsert for list endpoints — avoids N separate writes when hydrating many rows at once.\n * @param type - Entity kind\n * @param entries - Pairs of id + partial/full payloads to merge\n */\n upsertEntities: (type: EntityType, entries: Array<{ id: EntityId; data: Record<string, unknown> }>) => void;\n /**\n * Merge one fetched page, mark every row fetched, and update its list\n * projections in one Zustand publication.\n */\n ingestFetchedList: (\n type: EntityType,\n entries: Array<{ id: EntityId; data: Record<string, unknown> }>,\n options?: IngestFetchedListOptions,\n ) => void;\n /**\n * Replace the canonical entity entirely (no merge). Use when the server returns a full snapshot and partial merge would leave stale keys behind.\n */\n replaceEntity: (type: EntityType, id: EntityId, data: Record<string, unknown>) => void;\n /** Remove canonical entity, its patches, and its entityState. Does not remove the id from lists — use `removeIdFromAllLists` if needed. */\n removeEntity: (type: EntityType, id: EntityId) => void;\n /**\n * Merge UI-only fields into `patches` so every subscriber sees selection, expansion, optimistic toggles, etc., without forking canonical data.\n */\n patchEntity: (type: EntityType, id: EntityId, patch: Record<string, unknown>) => void;\n /** Remove specific patch keys; other patch keys remain. */\n unpatchEntity: (type: EntityType, id: EntityId, keys: string[]) => void;\n /** Drop all patches for an entity (e.g. after successful mutation when server data is authoritative). */\n clearPatch: (type: EntityType, id: EntityId) => void;\n /** Reflect in-flight GET for a single entity (deduped fetches in the engine still flip this once per logical request). */\n setEntityFetching: (type: EntityType, id: EntityId, fetching: boolean) => void;\n /** Persist terminal fetch failure message and clear fetching — hooks surface `error` while leaving prior data if any. */\n setEntityError: (type: EntityType, id: EntityId, error: string | null) => void;\n /** Mark entity successfully loaded; clears error, fetching, stale, and updates `lastFetched`. */\n setEntityFetched: (type: EntityType, id: EntityId) => void;\n /** Drive background revalidation: when true, hooks refetch while still showing cached `readEntity` data. */\n setEntityStale: (type: EntityType, id: EntityId, stale: boolean) => void;\n /** Merge sync metadata for one entity without polluting canonical server fields. */\n setEntitySyncMetadata: (type: EntityType, id: EntityId, metadata: Partial<EntitySyncMetadata>) => void;\n /** Clear sync metadata for one entity. */\n clearEntitySyncMetadata: (type: EntityType, id: EntityId) => void;\n /**\n * Replace list ids and merge pagination meta after a primary list fetch (not load-more).\n * Resets fetching flags and clears list error on success path (engine calls this after normalize).\n */\n setListResult: (key: QueryKey, ids: EntityId[], meta: Partial<Omit<ListState, \"ids\" | \"isFetching\" | \"isFetchingMore\" | \"error\" | \"stale\">>) => void;\n /** Append unique ids (e.g. infinite scroll) while merging meta; dedupes id order. */\n appendListResult: (key: QueryKey, ids: EntityId[], meta: Partial<Omit<ListState, \"ids\" | \"isFetching\" | \"isFetchingMore\" | \"error\" | \"stale\">>) => void;\n /** Prepend ids (e.g. “new item at top”) with optional meta merge. */\n prependListResult: (key: QueryKey, ids: EntityId[], meta?: Partial<ListState>) => void;\n /** After deletes, keep every list consistent by removing an id everywhere it appears and decrementing `total` when tracked. */\n removeIdFromAllLists: (type: EntityType, id: EntityId) => void;\n /**\n * Insert or move an id in one list. If the id already exists, it is removed first then re-inserted at `position`.\n * @param position - `\"start\"`, `\"end\"`, or numeric index\n */\n insertIdInList: (key: QueryKey, id: EntityId, position: \"start\" | \"end\" | number) => void;\n /** Initial or full list fetch in progress (not page-2+). */\n setListFetching: (key: QueryKey, fetching: boolean) => void;\n /** Pagination / “load more” in progress for the same list key. */\n setListFetchingMore: (key: QueryKey, fetchingMore: boolean) => void;\n /**\n * Record list fetch failure; clears both fetching flags.\n * The optional `typed` argument is the typed `EntityError` instance\n * (used by 2.0 hooks); when omitted only the string `error` field is\n * populated (back-compat with 1.x callers).\n */\n setListError: (key: QueryKey, error: string | null, typed?: EntityError | null) => void;\n /** Mark a list query stale so hooks can refetch without discarding current ids (stale-while-revalidate). */\n setListStale: (key: QueryKey, stale: boolean) => void;\n /**\n * Mark one or all entities of a type stale for subscriber-driven refetch. Does not delete data.\n * @param id - Omit to stale every entity of `type`\n */\n invalidateEntity: (type: EntityType, id?: EntityId) => void;\n /**\n * Mark lists stale by key prefix or custom predicate so the next access triggers background refresh without dropping ids immediately.\n */\n invalidateLists: (matcher: string | ((key: QueryKey) => boolean)) => void;\n /** Convenience: stale all entities of a type and lists whose keys start with `type`. */\n invalidateType: (type: EntityType) => void;\n /**\n * Single read path: `{ ...entities[type][id], ...patches[type][id] }` or null if no canonical row exists.\n * @returns Merged view suitable for rendering; not a deep clone\n */\n readEntity: <T = Record<string, unknown>>(type: EntityType, id: EntityId) => T | null;\n /**\n * Sync-aware read path: canonical entity + patches + virtual sync metadata (`$synced`, `$origin`, `$updatedAt`).\n */\n readEntitySnapshot: <T = Record<string, unknown>>(type: EntityType, id: EntityId) => EntitySnapshot<T & Record<string, unknown>> | null;\n}\n\nfunction defaultEntityState(): EntityState {\n return { ...EMPTY_ENTITY_STATE };\n}\n\nfunction defaultSyncMetadata(): EntitySyncMetadata {\n return { ...EMPTY_SYNC_METADATA };\n}\n\nfunction defaultListState(): ListState {\n return { ...EMPTY_LIST_STATE, ids: [] };\n}\n\nfunction ek(type: EntityType, id: EntityId) { return `${type}:${id}`; }\n\ninterface SnapshotCacheEntry {\n base: Record<string, unknown>;\n patch: Record<string, unknown> | undefined;\n metadata: EntitySyncMetadata;\n snapshot: EntitySnapshot<Record<string, unknown>>;\n}\n\nconst snapshotCache = new Map<string, SnapshotCacheEntry>();\n\nfunction readCachedEntitySnapshot<T extends Record<string, unknown>>(\n type: EntityType,\n id: EntityId,\n base: Record<string, unknown>,\n patch: Record<string, unknown> | undefined,\n metadata: EntitySyncMetadata,\n): EntitySnapshot<T> {\n const key = ek(type, id);\n const cached = snapshotCache.get(key);\n if (\n cached &&\n cached.base === base &&\n cached.patch === patch &&\n cached.metadata === metadata\n ) {\n return cached.snapshot as EntitySnapshot<T>;\n }\n\n const snapshot = {\n ...(patch ? { ...base, ...patch } : base),\n $synced: metadata.synced,\n $origin: metadata.origin,\n $updatedAt: metadata.updatedAt,\n } as EntitySnapshot<T>;\n\n snapshotCache.set(key, { base, patch, metadata, snapshot });\n return snapshot;\n}\n\n/** Creates an isolated, framework-neutral entity graph store. */\nexport function createGraphStore() {\n return createStore<GraphState>()(\n subscribeWithSelector(\n immer((set, get) => ({\n entities: {}, patches: {}, entityStates: {}, syncMetadata: {}, lists: {},\n\n upsertEntity: (type, id, data) => set((s) => {\n if (!s.entities[type]) s.entities[type] = {};\n const key = ek(type, id);\n // Route through the registered MergeStrategy (default = LWW shallow merge,\n // identical to the historical `{ ...prev, ...data }` behavior).\n const strategy = getMergeStrategy(type);\n const ctx: MergeContext = { type, id, origin: s.syncMetadata[key]?.origin ?? \"server\", updatedAt: Date.now() };\n s.entities[type][id] = strategy(s.entities[type][id], data, ctx);\n if (!s.syncMetadata[key]) s.syncMetadata[key] = defaultSyncMetadata();\n }),\n upsertEntities: (type, entries) => set((s) => {\n if (!s.entities[type]) s.entities[type] = {};\n const strategy = getMergeStrategy(type);\n for (const { id, data } of entries) {\n const key = ek(type, id);\n const ctx: MergeContext = { type, id, origin: s.syncMetadata[key]?.origin ?? \"server\", updatedAt: Date.now() };\n s.entities[type][id] = strategy(s.entities[type][id], data, ctx);\n if (!s.syncMetadata[key]) s.syncMetadata[key] = defaultSyncMetadata();\n }\n }),\n ingestFetchedList: (type, entries, options = {}) => set((s) => {\n const fetchedAt = Date.now();\n const ids = entries.map(({ id }) => id);\n const batches: FetchedEntityBatch[] = [\n { type, entries },\n ...(options.sideBatches ?? []),\n ];\n const origins = new Map<string, SyncOrigin>();\n\n for (const batch of batches) {\n if (!s.entities[batch.type]) s.entities[batch.type] = {};\n for (const { id } of batch.entries) {\n const key = ek(batch.type, id);\n if (!origins.has(key)) {\n origins.set(key, s.syncMetadata[key]?.origin ?? \"server\");\n }\n }\n }\n\n for (const batch of batches) {\n const strategy = getMergeStrategy(batch.type);\n for (const { id, data } of batch.entries) {\n const key = ek(batch.type, id);\n const ctx: MergeContext = {\n type: batch.type,\n id,\n origin: origins.get(key) ?? \"server\",\n updatedAt: fetchedAt,\n };\n s.entities[batch.type][id] = strategy(s.entities[batch.type][id], data, ctx);\n }\n }\n\n const completed = new Set<string>();\n for (const batch of batches) {\n for (const { id } of batch.entries) {\n const key = ek(batch.type, id);\n if (completed.has(key)) continue;\n completed.add(key);\n if (!s.entityStates[key]) s.entityStates[key] = defaultEntityState();\n s.entityStates[key].lastFetched = fetchedAt;\n s.entityStates[key].isFetching = false;\n s.entityStates[key].error = null;\n s.entityStates[key].stale = false;\n s.syncMetadata[key] = {\n ...(s.syncMetadata[key] ?? defaultSyncMetadata()),\n synced: true,\n origin: \"server\",\n updatedAt: fetchedAt,\n };\n }\n }\n\n const readDraftEntity = (id: EntityId): Record<string, unknown> | null => {\n const base = s.entities[type]?.[id];\n if (!base) return null;\n const patch = s.patches[type]?.[id];\n const metadata = s.syncMetadata[ek(type, id)] ?? defaultSyncMetadata();\n return {\n ...base,\n ...(patch ?? {}),\n $synced: metadata.synced,\n $origin: metadata.origin,\n $updatedAt: metadata.updatedAt,\n };\n };\n\n for (const target of options.lists ?? []) {\n const existing = s.lists[target.key] ?? defaultListState();\n const targetIds = target.ids ?? ids;\n const nextIds = target.mode === \"append\"\n ? Array.from(new Set([...existing.ids, ...targetIds]))\n : targetIds;\n s.lists[target.key] = {\n ...existing,\n ...(target.meta ?? {}),\n ids: nextIds,\n isFetching: false,\n isFetchingMore: false,\n error: null,\n lastError: null,\n stale: false,\n lastFetched: fetchedAt,\n };\n }\n\n for (const projection of options.projections ?? []) {\n const existing = s.lists[projection.key] ?? defaultListState();\n const nextIds = [...existing.ids];\n const { filter, sort, search } = projection.view;\n\n for (const id of new Set(ids)) {\n if (nextIds.includes(id)) continue;\n const entity = readDraftEntity(id);\n if (!entity) continue;\n const matches =\n (!filter || matchesFilter(entity, filter)) &&\n (!search?.query || matchesSearch(entity, search.query, search.fields));\n if (!matches) continue;\n\n if (sort && sort.length > 0) {\n const index = findInsertionIndex(entity, nextIds, readDraftEntity, sort);\n nextIds.splice(index, 0, id);\n } else {\n nextIds.unshift(id);\n }\n }\n\n s.lists[projection.key] = projection.completeFetch\n ? {\n ...existing,\n ids: nextIds,\n isFetching: false,\n isFetchingMore: false,\n error: null,\n lastError: null,\n stale: false,\n lastFetched: fetchedAt,\n }\n : { ...existing, ids: nextIds };\n }\n\n for (const key of options.finishListFetches ?? []) {\n if (!s.lists[key]) s.lists[key] = defaultListState();\n s.lists[key].isFetching = false;\n }\n }),\n replaceEntity: (type, id, data) => set((s) => {\n if (!s.entities[type]) s.entities[type] = {};\n s.entities[type][id] = data;\n const key = ek(type, id);\n if (!s.syncMetadata[key]) s.syncMetadata[key] = defaultSyncMetadata();\n }),\n removeEntity: (type, id) => set((s) => {\n delete s.entities[type]?.[id];\n delete s.patches[type]?.[id];\n delete s.entityStates[ek(type, id)];\n delete s.syncMetadata[ek(type, id)];\n }),\n patchEntity: (type, id, patch) => set((s) => {\n if (!s.patches[type]) s.patches[type] = {};\n s.patches[type][id] = { ...(s.patches[type][id] ?? {}), ...patch };\n }),\n unpatchEntity: (type, id, keys) => set((s) => {\n const p = s.patches[type]?.[id]; if (!p) return;\n for (const k of keys) delete p[k];\n }),\n clearPatch: (type, id) => set((s) => { delete s.patches[type]?.[id]; }),\n setEntityFetching: (type, id, fetching) => set((s) => {\n const k = ek(type, id);\n if (!s.entityStates[k]) s.entityStates[k] = defaultEntityState();\n s.entityStates[k].isFetching = fetching;\n }),\n setEntityError: (type, id, error) => set((s) => {\n const k = ek(type, id);\n if (!s.entityStates[k]) s.entityStates[k] = defaultEntityState();\n s.entityStates[k].error = error; s.entityStates[k].isFetching = false;\n }),\n setEntityFetched: (type, id) => set((s) => {\n const k = ek(type, id);\n if (!s.entityStates[k]) s.entityStates[k] = defaultEntityState();\n s.entityStates[k].lastFetched = Date.now();\n s.entityStates[k].isFetching = false;\n s.entityStates[k].error = null; s.entityStates[k].stale = false;\n s.syncMetadata[k] = { ...(s.syncMetadata[k] ?? defaultSyncMetadata()), synced: true, origin: \"server\", updatedAt: Date.now() };\n }),\n setEntityStale: (type, id, stale) => set((s) => {\n const k = ek(type, id);\n if (!s.entityStates[k]) s.entityStates[k] = defaultEntityState();\n s.entityStates[k].stale = stale;\n }),\n setEntitySyncMetadata: (type, id, metadata) => set((s) => {\n const k = ek(type, id);\n s.syncMetadata[k] = { ...(s.syncMetadata[k] ?? defaultSyncMetadata()), ...metadata };\n }),\n clearEntitySyncMetadata: (type, id) => set((s) => {\n delete s.syncMetadata[ek(type, id)];\n }),\n setListResult: (key, ids, meta) => set((s) => {\n const ex = s.lists[key] ?? defaultListState();\n s.lists[key] = { ...ex, ...meta, ids, isFetching: false, isFetchingMore: false, error: null, lastError: null, stale: false, lastFetched: Date.now() };\n }),\n appendListResult: (key, ids, meta) => set((s) => {\n const ex = s.lists[key] ?? defaultListState();\n s.lists[key] = { ...ex, ...meta, ids: Array.from(new Set([...ex.ids, ...ids])), isFetching: false, isFetchingMore: false, error: null, lastError: null, stale: false, lastFetched: Date.now() };\n }),\n prependListResult: (key, ids, meta) => set((s) => {\n const ex = s.lists[key] ?? defaultListState();\n s.lists[key] = { ...ex, ...(meta ?? {}), ids: Array.from(new Set([...ids, ...ex.ids])), isFetching: false, isFetchingMore: false, error: null, lastError: null, stale: false, lastFetched: Date.now() };\n }),\n removeIdFromAllLists: (_type, id) => set((s) => {\n for (const key of Object.keys(s.lists)) {\n const list = s.lists[key]; const idx = list.ids.indexOf(id);\n if (idx !== -1) { list.ids.splice(idx, 1); if (list.total !== null) list.total -= 1; }\n }\n }),\n insertIdInList: (key, id, position) => set((s) => {\n if (!s.lists[key]) s.lists[key] = defaultListState();\n const ids = s.lists[key].ids;\n const ex = ids.indexOf(id); if (ex !== -1) ids.splice(ex, 1);\n if (position === \"start\") ids.unshift(id);\n else if (position === \"end\") ids.push(id);\n else ids.splice(position, 0, id);\n }),\n setListFetching: (key, fetching) => set((s) => {\n if (!s.lists[key]) s.lists[key] = defaultListState();\n s.lists[key].isFetching = fetching;\n }),\n setListFetchingMore: (key, fetchingMore) => set((s) => {\n if (!s.lists[key]) s.lists[key] = defaultListState();\n s.lists[key].isFetchingMore = fetchingMore;\n }),\n setListError: (key, error, typed) => set((s) => {\n if (!s.lists[key]) s.lists[key] = defaultListState();\n s.lists[key].error = error;\n s.lists[key].lastError = typed ?? (error === null ? null : s.lists[key].lastError);\n s.lists[key].isFetching = false;\n s.lists[key].isFetchingMore = false;\n // Stamp lastFetched on failure too. Without this, the SWR\n // staleness check (`Date.now() - (lastFetched ?? 0) > staleTime`)\n // would return true on the next render and refire the fetcher\n // immediately — a 404/permanent error becomes an infinite\n // retry loop. With lastFetched stamped, the failure is treated\n // as a complete attempt and consumers see a stable `error` +\n // `isFetching: false`. They can manually `refetch()` if they\n // want to retry. Clearing `stale` also makes invalidateLists\n // the explicit retry mechanism, which is the contract we want.\n s.lists[key].lastFetched = Date.now();\n s.lists[key].stale = false;\n }),\n setListStale: (key, stale) => set((s) => {\n if (!s.lists[key]) s.lists[key] = defaultListState();\n s.lists[key].stale = stale;\n }),\n invalidateEntity: (type, id) => set((s) => {\n if (id) { const k = ek(type, id); if (s.entityStates[k]) s.entityStates[k].stale = true; }\n else { for (const k of Object.keys(s.entityStates)) if (k.startsWith(`${type}:`)) s.entityStates[k].stale = true; }\n }),\n invalidateLists: (matcher) => set((s) => {\n const pred = typeof matcher === \"string\" ? (k: string) => k.startsWith(matcher) : matcher;\n for (const key of Object.keys(s.lists)) if (pred(key)) s.lists[key].stale = true;\n }),\n invalidateType: (type) => { get().invalidateEntity(type); get().invalidateLists(type); },\n readEntity: <T>(type: EntityType, id: EntityId): T | null => {\n const s = get(); const base = s.entities[type]?.[id]; if (!base) return null;\n const patch = s.patches[type]?.[id];\n return (patch ? { ...base, ...patch } : base) as T;\n },\n readEntitySnapshot: <T>(type: EntityType, id: EntityId): EntitySnapshot<T & Record<string, unknown>> | null => {\n const s = get();\n const base = s.entities[type]?.[id];\n if (!base) {\n snapshotCache.delete(ek(type, id));\n return null;\n }\n const patch = s.patches[type]?.[id];\n const metadata = s.syncMetadata[ek(type, id)] ?? EMPTY_SYNC_METADATA;\n return readCachedEntitySnapshot<T & Record<string, unknown>>(\n type,\n id,\n base,\n patch,\n metadata,\n );\n },\n }))\n )\n );\n}\n\n/**\n * Default process-wide entity graph store. Framework bindings subscribe to\n * this vanilla store; non-React consumers use its `getState`, `setState`, and\n * `subscribe` methods directly.\n */\nexport const graphStore = createGraphStore();\n\nexport type GraphStore = ReturnType<typeof createGraphStore>;\n\n/**\n * @deprecated Import `graphStore` from core, or `useGraphStore` from the React\n * binding. This StoreApi-shaped alias remains for non-React 2.x migrations.\n */\nexport const useGraphStore = graphStore;\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\";\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-crdt\");\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 { EntityType, EntityId, GraphStore } from \"./graph\";\n\n/**\n * Process-wide defaults for stale times, retries, and background revalidation.\n * Keeps hook signatures small: `useEntity` / `useEntityList` merge these with per-query overrides.\n */\nexport interface EngineOptions {\n defaultStaleTime?: number;\n /** Max age (`Date.now() - lastFetched`) for evicting entities with zero subscribers during GC. */\n defaultGcTime?: number;\n /** Interval between GC passes when the collector is active (default 60s). */\n gcInterval?: number;\n maxRetries?: number;\n retryBaseDelay?: number;\n revalidateOnFocus?: boolean;\n revalidateOnReconnect?: boolean;\n}\n\n/**\n * Declarative **instruction** for loading one entity: wire transport (`fetch`), normalization, and graph writes.\n * Hooks pass this to `fetchEntity`; the graph remains source of truth after success.\n */\nexport interface EntityQueryOptions<TRaw, TEntity extends object> {\n type: EntityType;\n id: EntityId | null | undefined;\n fetch: (id: EntityId) => Promise<TRaw>;\n normalize: (raw: TRaw) => TEntity;\n idField?: string;\n sideEffects?: (raw: TRaw, store: GraphStore) => void;\n staleTime?: number;\n enabled?: boolean;\n onSuccess?: (entity: TEntity) => void;\n onError?: (error: Error) => void;\n}\n\n/** Cursor/page knobs passed through to list `fetch` implementations (REST, GraphQL, etc.). */\nexport interface ListFetchParams {\n cursor?: string;\n page?: number;\n pageSize?: number;\n params?: Record<string, unknown>;\n}\n\n/**\n * Normalized list page shape from any backend. Items are mapped through `normalize` into `{ id, data }` upserts — the list stores ids only.\n */\nexport interface ListResponse<T> {\n items: T[];\n total?: number | null;\n nextCursor?: string | null;\n prevCursor?: string;\n hasNextPage?: boolean;\n hasPrevPage?: boolean;\n page?: number;\n pageSize?: number;\n}\n\n/**\n * Declarative **instruction** for a collection query: stable `queryKey`, fetcher, and per-row normalization into the graph.\n * `mode` controls whether a fetch replaces ids or appends (infinite scroll) when used with load-more.\n */\nexport interface ListQueryOptions<TRaw, TEntity extends object> {\n type: EntityType;\n queryKey: unknown[];\n /**\n * Inline fetcher (deprecated 1.x REST form). Optional in 2.0: pure graph\n * subscriptions for Tier-A PGlite/Electric entities pass no fetcher — the\n * graph is hydrated out-of-band and the hook only joins ids → entities.\n * When omitted, `fetchList` is a no-op and the hook is read-only.\n */\n fetch?: (params: ListFetchParams) => Promise<ListResponse<TRaw>>;\n /** Row normalizer. Optional alongside `fetch` (graph-only callers omit both). */\n normalize?: (raw: TRaw) => { id: EntityId; data: TEntity };\n sideEffects?: (items: TRaw[], store: GraphStore) => void;\n mode?: \"replace\" | \"append\";\n staleTime?: number;\n enabled?: boolean;\n onSuccess?: (result: ListResponse<TRaw>) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Deterministic string key for list queries so object order in nested keys does not create duplicate cache entries.\n * @param key - Hook-provided query key array (serializable values)\n */\nexport function serializeKey(key: unknown[]): string {\n return JSON.stringify(key, (_, v) =>\n v && typeof v === \"object\" && !Array.isArray(v)\n ? Object.fromEntries(Object.entries(v as Record<string, unknown>).sort()) : v);\n}\n\nfunction sleep(ms: number) { return new Promise((r) => setTimeout(r, ms)); }\n\nconst inflightByStore = new WeakMap<GraphStore, Map<string, Promise<unknown>>>();\n\nfunction inflightFor(store: GraphStore) {\n let inflight = inflightByStore.get(store);\n if (!inflight) {\n inflight = new Map();\n inflightByStore.set(store, inflight);\n }\n return inflight;\n}\n/**\n * Collapse concurrent identical requests into one Promise (prevents stampedes when many components mount the same entity/list).\n * @param key - Logical dedupe key (e.g. `type:id` or serialized list key)\n * @param fn - Async work that performs the fetch + graph writes\n */\nexport function dedupe<T>(key: string, fn: () => Promise<T>, store: GraphStore = graphStore): Promise<T> {\n const inflight = inflightFor(store);\n if (inflight.has(key)) return inflight.get(key) as Promise<T>;\n const p = fn().finally(() => inflight.delete(key));\n inflight.set(key, p); return p;\n}\n\nconst subscriberStatsListeners = new Set<() => void>();\nfunction emitSubscriberStatsChange() {\n for (const cb of subscriberStatsListeners) cb();\n}\n\nconst subscribersByStore = new WeakMap<GraphStore, Map<string, Set<symbol>>>();\n\nfunction subscribersFor(store: GraphStore) {\n let subscribers = subscribersByStore.get(store);\n if (!subscribers) {\n subscribers = new Map();\n subscribersByStore.set(store, subscribers);\n }\n return subscribers;\n}\n/**\n * Ref-count graph interest for a subscriber key (`${type}:${id}`). Background revalidation skips keys with zero subscribers.\n * @returns Opaque token required for `unregisterSubscriber`\n */\nexport function registerSubscriber(key: string, store: GraphStore = graphStore): symbol {\n const subscribers = subscribersFor(store);\n const token = Symbol(key);\n if (!subscribers.has(key)) subscribers.set(key, new Set());\n subscribers.get(key)!.add(token);\n emitSubscriberStatsChange();\n return token;\n}\n/** Pair with `registerSubscriber` on unmount so idle entities stop refetching. */\nexport function unregisterSubscriber(key: string, token: symbol, store: GraphStore = graphStore) {\n const subscribers = subscribersFor(store);\n const set = subscribers.get(key);\n if (!set) return;\n set.delete(token);\n if (set.size === 0) subscribers.delete(key);\n emitSubscriberStatsChange();\n}\n/** Used by the engine to avoid background work for keys nothing in the tree is observing. */\nexport function hasSubscribers(key: string, store: GraphStore = graphStore) {\n return (subscribersFor(store).get(key)?.size ?? 0) > 0;\n}\n\nconst DEFAULT_OPTIONS: Required<EngineOptions> = {\n defaultStaleTime: 30_000,\n defaultGcTime: 300_000,\n gcInterval: 60_000,\n maxRetries: 3,\n retryBaseDelay: 1_000,\n revalidateOnFocus: true,\n revalidateOnReconnect: true,\n};\nlet engineOptions: Required<EngineOptions> = { ...DEFAULT_OPTIONS };\n\n/**\n * Subscribe to ref-count changes for `registerSubscriber` / `unregisterSubscriber`.\n * Used by `useGraphDevTools` so subscriber totals update without graph mutations.\n */\nexport function subscribeSubscriberStats(onChange: () => void) {\n subscriberStatsListeners.add(onChange);\n return () => subscriberStatsListeners.delete(onChange);\n}\n\n/** Total active entity subscriber tokens across all keys (sum of ref-counts). */\nexport function getActiveSubscriberCount(store: GraphStore = graphStore): number {\n let n = 0;\n for (const set of subscribersFor(store).values()) n += set.size;\n return n;\n}\n\n// ── DevtoolsEvent + tap (W3 — entity-engine-devtools-tap capability) ────────\n//\n// In-process push stream of mutating graph events for dev tooling. The\n// Entity Explorer (W5+) subscribes here for its Events tab and to keep the\n// Tree tab live without polling.\n//\n// Hot-path is a no-op when no subscribers are registered. Op-site calls in\n// graph-actions.ts are wrapped in `process.env.NODE_ENV !== \"production\"`\n// so esbuild DCE elides them from prod bundles.\n\n/**\n * Discriminated union of devtools events.\n *\n * - `upsert`, `patch`, `clearPatch` are emitted from `graph-actions.ts` ops.\n * - `unpatch` and `list` are forward-compatible kinds reserved for future\n * instrumentation (W5+ event bus / W6+ panel). Consumers MUST handle them\n * in exhaustive `switch`/`if` chains today, even though no op-site emits\n * them in this change.\n */\nexport type DevtoolsEvent =\n | { kind: \"upsert\"; type: EntityType; id: EntityId; data: Record<string, unknown>; at: string }\n | { kind: \"patch\"; type: EntityType; id: EntityId; patch: Record<string, unknown>; at: string }\n | { kind: \"unpatch\"; type: EntityType; id: EntityId; keys: string[]; at: string }\n | { kind: \"clearPatch\"; type: EntityType; id: EntityId; at: string }\n | { kind: \"list\"; key: string; idCount: number; at: string };\n\ntype DevtoolsListener = (event: DevtoolsEvent) => void;\n\nconst devtoolsSubscribers = new Set<DevtoolsListener>();\n\n/**\n * Subscribe to the devtools event stream.\n *\n * - Returns an `UnsubscribeFn` that removes this listener.\n * - Idempotent: subscribing the same function reference twice tracks it once\n * (Set semantics).\n * - Throwing listeners do NOT block delivery to other listeners; the error is\n * logged via `console.warn` and dispatch continues.\n * - Re-entrancy safe: listeners that subscribe/unsubscribe during dispatch\n * affect future events only, not the in-flight one.\n */\nexport function subscribeDevtoolsEvent(cb: DevtoolsListener): () => void {\n devtoolsSubscribers.add(cb);\n return () => {\n devtoolsSubscribers.delete(cb);\n };\n}\n\n/**\n * Internal — called from `graph-actions.ts` at every mutating op site.\n *\n * Hot-path no-op when no subscribers registered. Snapshot iteration for\n * re-entrancy safety. Per-subscriber `try/catch` so a throwing listener\n * doesn't break delivery to siblings.\n *\n * NOT re-exported from `src/index.ts` — the public surface is\n * `subscribeDevtoolsEvent` only.\n */\nexport function notifyDevtools(event: DevtoolsEvent): void {\n if (devtoolsSubscribers.size === 0) return;\n const listeners = [...devtoolsSubscribers];\n for (const cb of listeners) {\n try {\n cb(event);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\"[engine] devtools subscriber threw:\", err);\n }\n }\n}\n\nconst gcIntervalsByStore = new Map<GraphStore, ReturnType<typeof setInterval>>();\n\n/**\n * One GC pass: removes entities that are unobserved, older than `defaultGcTime`, not fetching,\n * and have no non-empty local patches; then strips their ids from all lists.\n */\nfunction runGarbageCollection(storeApi: GraphStore = graphStore): void {\n const store = storeApi.getState();\n const { defaultGcTime: gcTime } = getEngineOptions();\n const now = Date.now();\n const toRemove: Array<{ type: EntityType; id: EntityId }> = [];\n\n for (const type of Object.keys(store.entities)) {\n const bucket = store.entities[type];\n if (!bucket) continue;\n for (const id of Object.keys(bucket)) {\n const key = `${type}:${id}`;\n if (hasSubscribers(key, storeApi)) continue;\n const patch = store.patches[type]?.[id];\n if (patch !== undefined && Object.keys(patch).length > 0) continue;\n const entityState = store.entityStates[key];\n if (entityState?.isFetching) continue;\n const lastFetched = entityState?.lastFetched;\n if (lastFetched == null) continue;\n if (now - lastFetched <= gcTime) continue;\n toRemove.push({ type, id });\n }\n }\n\n for (const { type, id } of toRemove) {\n store.removeEntity(type, id);\n store.removeIdFromAllLists(type, id);\n }\n}\n\n/**\n * Stops the periodic garbage-collection timer for the selected graph.\n */\nexport function stopGarbageCollector(storeApi: GraphStore = graphStore): void {\n const intervalId = gcIntervalsByStore.get(storeApi);\n if (intervalId != null && typeof clearInterval !== \"undefined\") {\n clearInterval(intervalId);\n gcIntervalsByStore.delete(storeApi);\n }\n}\n\n/**\n * Starts periodic garbage collection using current `getEngineOptions().gcInterval`.\n * Stops any previous interval first. No-ops during SSR (`window` is undefined) or without `setInterval`.\n * @returns Disposer that stops this graph's collector.\n */\nexport function startGarbageCollector(storeApi: GraphStore = graphStore): () => void {\n stopGarbageCollector(storeApi);\n if (typeof window === \"undefined\" || typeof setInterval === \"undefined\") return () => {};\n const intervalId = setInterval(\n () => runGarbageCollection(storeApi),\n getEngineOptions().gcInterval,\n );\n gcIntervalsByStore.set(storeApi, intervalId);\n return () => stopGarbageCollector(storeApi);\n}\n\nfunction restartGarbageCollector(storeApi: GraphStore = graphStore) {\n startGarbageCollector(storeApi);\n}\n\n/** Override global engine behavior (typically once at app bootstrap). Restarts GC with merged options. */\nexport function configureEngine(opts: EngineOptions) {\n engineOptions = { ...DEFAULT_OPTIONS, ...opts };\n const activeStores = [...gcIntervalsByStore.keys()];\n if (activeStores.length === 0) restartGarbageCollector();\n else for (const storeApi of activeStores) restartGarbageCollector(storeApi);\n}\n/** Read merged engine options; hooks use this for default `staleTime` and retry behavior. */\nexport function getEngineOptions() { return engineOptions; }\n\n/**\n * Run a single-entity fetch with dedupe, retries, normalization, and graph updates.\n * Call from hooks/adapters — not from presentational components.\n */\nexport async function fetchEntity<TRaw, TEntity extends object>(\n opts: EntityQueryOptions<TRaw, TEntity>, engineOpts: Required<EngineOptions>, storeApi: GraphStore = graphStore\n) {\n const { type, id, fetch, normalize, sideEffects, idField = \"id\" } = opts;\n if (!id) return;\n storeApi.getState().setEntityFetching(type, id, true);\n const attempt = async (retries: number): Promise<void> => {\n try {\n const raw = await fetch(id);\n const normalized = normalize(raw);\n const resolvedId = (normalized as Record<string, unknown>)[idField] as EntityId ?? id;\n storeApi.getState().upsertEntity(type, resolvedId, normalized as Record<string, unknown>);\n storeApi.getState().setEntityFetched(type, resolvedId);\n if (sideEffects) sideEffects(raw, storeApi);\n opts.onSuccess?.(normalized);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n if (retries < engineOpts.maxRetries) { await sleep(engineOpts.retryBaseDelay * Math.pow(2, retries)); return attempt(retries + 1); }\n storeApi.getState().setEntityError(type, id, error.message);\n opts.onError?.(error);\n }\n };\n await dedupe(`${type}:${id}`, () => attempt(0), storeApi);\n}\n\n/**\n * Fetch a list page: upserts all rows, writes ids to the list key, supports append mode for pagination.\n * @param isLoadMore - When true, uses a separate dedupe key and `appendListResult` / `setListFetchingMore`.\n */\nexport async function fetchList<TRaw, TEntity extends object>(\n opts: ListQueryOptions<TRaw, TEntity>, params: ListFetchParams, engineOpts: Required<EngineOptions>, isLoadMore = false, storeApi: GraphStore = graphStore\n) {\n const { type, queryKey, fetch, normalize, sideEffects, mode = \"replace\" } = opts;\n const key = serializeKey(queryKey);\n const store = storeApi.getState();\n // Graph-only subscription (Tier-A PGlite/Electric): no inline fetcher. The\n // graph is hydrated out-of-band, so there is nothing to fetch here.\n if (!fetch || !normalize) return;\n if (isLoadMore) store.setListFetchingMore(key, true);\n else store.setListFetching(key, true);\n const attempt = async (retries: number): Promise<void> => {\n try {\n const response = await fetch(params);\n const normalized = response.items.map(normalize);\n const meta = { total: response.total ?? null, nextCursor: response.nextCursor ?? null, prevCursor: response.prevCursor ?? null, hasNextPage: response.hasNextPage ?? !!response.nextCursor, hasPrevPage: response.hasPrevPage ?? !!response.prevCursor, currentPage: response.page ?? null, pageSize: response.pageSize ?? null };\n storeApi.getState().ingestFetchedList(\n type,\n normalized.map(({ id, data }) => ({ id, data: data as Record<string, unknown> })),\n { lists: [{ key, mode: mode === \"append\" && isLoadMore ? \"append\" : \"replace\", meta }] },\n );\n if (sideEffects) sideEffects(response.items, storeApi);\n opts.onSuccess?.(response);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n if (retries < engineOpts.maxRetries) { await sleep(engineOpts.retryBaseDelay * Math.pow(2, retries)); return attempt(retries + 1); }\n storeApi.getState().setListError(key, error.message);\n opts.onError?.(error);\n }\n };\n await dedupe(isLoadMore ? `${key}:more` : key, () => attempt(0), storeApi);\n}\n\ninterface GlobalListenerAttachment {\n references: number;\n dispose: () => void;\n}\n\nconst globalListenerAttachments = new WeakMap<GraphStore, GlobalListenerAttachment>();\n\nfunction releaseGlobalListenerAttachment(\n storeApi: GraphStore,\n attachment: GlobalListenerAttachment,\n): () => void {\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const current = globalListenerAttachments.get(storeApi);\n if (current !== attachment) return;\n current.references -= 1;\n if (current.references > 0) return;\n current.dispose();\n globalListenerAttachments.delete(storeApi);\n };\n}\n\n/**\n * Opt-in window listeners that mark **subscribed** entities stale on focus/reconnect so hooks can SWR-refetch.\n * Reference-counted per graph and safe for SSR (no-ops without `window`).\n * @returns Disposer that releases this attachment and removes listeners plus GC when the last owner releases it.\n */\nexport function attachGlobalListeners(storeApi: GraphStore = graphStore): () => void {\n if (typeof window === \"undefined\") return () => {};\n const existing = globalListenerAttachments.get(storeApi);\n if (existing) {\n existing.references += 1;\n return releaseGlobalListenerAttachment(storeApi, existing);\n }\n\n const stopGc = startGarbageCollector(storeApi);\n const revalidateAll = () => {\n const state = storeApi.getState();\n for (const key of subscribersFor(storeApi).keys()) {\n if (!hasSubscribers(key, storeApi)) continue;\n const colonIdx = key.indexOf(\":\");\n if (colonIdx === -1) continue;\n const type = key.slice(0, colonIdx);\n const id = key.slice(colonIdx + 1);\n state.setEntityStale(type, id, true);\n }\n };\n const revalidateWhenVisible = () => {\n if (document.visibilityState === \"visible\") revalidateAll();\n };\n const revalidateOnFocus = engineOptions.revalidateOnFocus;\n const revalidateOnReconnect = engineOptions.revalidateOnReconnect;\n if (revalidateOnFocus) {\n window.addEventListener(\"visibilitychange\", revalidateWhenVisible);\n window.addEventListener(\"focus\", revalidateAll);\n }\n if (revalidateOnReconnect) window.addEventListener(\"online\", revalidateAll);\n\n const attachment: GlobalListenerAttachment = {\n references: 1,\n dispose: () => {\n if (revalidateOnFocus) {\n window.removeEventListener(\"visibilitychange\", revalidateWhenVisible);\n window.removeEventListener(\"focus\", revalidateAll);\n }\n if (revalidateOnReconnect) {\n window.removeEventListener(\"online\", revalidateAll);\n }\n stopGc();\n },\n };\n globalListenerAttachments.set(storeApi, attachment);\n return releaseGlobalListenerAttachment(storeApi, attachment);\n}\n","import { graphStore } from \"./graph\";\nimport type { EntityId, EntitySyncMetadata, EntityType, GraphStore, QueryKey, SyncOrigin } from \"./graph\";\nimport { notifyDevtools } from \"./engine\";\n\n// Local type declaration so we can reference `process.env.NODE_ENV` without\n// pulling in @types/node (the package targets browser bundles too). Consumer\n// bundlers (Vite/Webpack/esbuild) replace this literal at build time so the\n// devtools notify call-sites tree-shake out of production builds.\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 (typeof process === \"undefined\" || process.env.NODE_ENV !== \"production\") {\n notifyDevtools({ 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 (typeof process === \"undefined\" || process.env.NODE_ENV !== \"production\") {\n notifyDevtools({ 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 (typeof process === \"undefined\" || process.env.NODE_ENV !== \"production\") {\n notifyDevtools({ 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(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\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 registry = new Map<string, RegistryEntry>();\n\n/** Test-only helper: clears the devtools store registry between test runs. */\nexport function __resetStoreRegistry(): void {\n registry.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 to registry\n for (const entry of registry.values()) {\n if (entry.bus === bus && entry.active) {\n entry.active = false;\n try { entry.unsubscribeSrc(); } catch { /* ignore */ }\n }\n }\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 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 a snapshot of all registered stores (active + inactive) in registration order. */\nexport function getRegisteredStores(): ReadonlyArray<RegisteredStore> {\n return Array.from(registry.values()).map((e) => ({ name: e.name, active: e.active }));\n}\n","/**\n * devtools-time-travel.ts — G4 parity: true time-travel for the entity graph.\n *\n * The Timeline tab (C5) inspected a read-only history log. This adds the\n * defining Redux-DevTools capability the gap analysis called out: **rewind the\n * LIVE graph to a prior recorded state and replay forward.**\n *\n * Model:\n * - `recordGraphSnapshot()` captures the canonical graph data (entities, patches,\n * entityStates, syncMetadata, lists) into a bounded ring (default 50).\n * - `restoreGraphSnapshot(index)` writes a captured snapshot back into the live\n * Zustand store — the graph (and every subscriber/view) reverts to that state.\n * - `getTimeTravelState()` exposes the ring + current cursor for the devtools UI.\n *\n * Snapshots are deep-cloned on capture and on restore so restoring never aliases\n * ring contents into the live store (a later mutation must not corrupt history).\n *\n * This is debug-time machinery: it is intended to run behind the EntityExplorer,\n * not in production data paths.\n */\n\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 id (capture order). */\n seq: number;\n /** Capture timestamp (ms). */\n at: number;\n /** Optional label (e.g. the action that produced this state). */\n label?: string;\n data: GraphSlice;\n}\n\nexport interface TimeTravelState {\n snapshots: ReadonlyArray<Omit<TimeTravelSnapshot, \"data\">>;\n /** Index currently restored, or null if live (at head). */\n cursor: number | null;\n capacity: number;\n}\n\nlet capacity = 50;\nlet ring: TimeTravelSnapshot[] = [];\nlet seqCounter = 0;\nlet cursor: number | null = null;\nconst listeners = new Set<() => void>();\n\nfunction notify(): void {\n for (const l of listeners) l();\n}\n\nfunction cloneSlice(s: GraphSlice): GraphSlice {\n return {\n entities: structuredClone(s.entities),\n patches: structuredClone(s.patches),\n entityStates: structuredClone(s.entityStates),\n syncMetadata: structuredClone(s.syncMetadata),\n lists: structuredClone(s.lists),\n };\n}\n\n/** Configure ring capacity (number of retained snapshots). */\nexport function configureTimeTravel(opts: { capacity?: number }): void {\n if (opts.capacity && opts.capacity > 0) capacity = opts.capacity;\n if (ring.length > capacity) ring = ring.slice(-capacity);\n notify();\n}\n\n/** Capture the current live graph state into the ring. Returns the snapshot seq. */\nexport function recordGraphSnapshot(label?: string, storeApi: GraphStore = graphStore): number {\n const s = storeApi.getState();\n const snap: TimeTravelSnapshot = {\n seq: seqCounter++,\n at: Date.now(),\n ...(label !== undefined ? { label } : {}),\n data: cloneSlice(s),\n };\n ring.push(snap);\n if (ring.length > capacity) ring = ring.slice(-capacity);\n // Recording new state means we're at the live head again.\n cursor = null;\n notify();\n return snap.seq;\n}\n\n/**\n * Restore the live graph to the snapshot at ring `index` (0-based into the\n * current ring). The Zustand store is overwritten with a deep clone of the\n * captured slice, so all subscribers re-render at that historical state.\n * Returns true if restored.\n */\nexport function restoreGraphSnapshot(index: number, storeApi: GraphStore = graphStore): boolean {\n const snap = ring[index];\n if (!snap) return false;\n const clone = cloneSlice(snap.data);\n storeApi.setState(clone as Partial<ReturnType<typeof graphStore.getState>>);\n cursor = index;\n notify();\n return true;\n}\n\n/** Restore by capture seq (stable across ring eviction within capacity). */\nexport function restoreGraphSnapshotBySeq(seq: number, storeApi: GraphStore = graphStore): boolean {\n const index = ring.findIndex((s) => s.seq === seq);\n return index === -1 ? false : restoreGraphSnapshot(index, storeApi);\n}\n\n/** Step the cursor by `delta` (negative = back in time) and restore. */\nexport function stepTimeTravel(delta: number, storeApi: GraphStore = graphStore): boolean {\n const base = cursor ?? ring.length - 1;\n const target = Math.max(0, Math.min(ring.length - 1, base + delta));\n return restoreGraphSnapshot(target, storeApi);\n}\n\n/** Snapshot metadata + cursor for the devtools UI (no heavy data payloads). */\nexport function getTimeTravelState(): TimeTravelState {\n return {\n snapshots: ring.map(({ data: _data, ...meta }) => meta),\n cursor,\n capacity,\n };\n}\n\n/** Subscribe to ring/cursor changes (for useSyncExternalStore in the UI). */\nexport function subscribeTimeTravel(cb: () => void): () => void {\n listeners.add(cb);\n return () => listeners.delete(cb);\n}\n\n/** @internal Test-only reset. */\nexport function __resetTimeTravel(): void {\n ring = [];\n seqCounter = 0;\n cursor = null;\n capacity = 50;\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","import { graphStore } from \"../graph\";\nimport { serializeKey } from \"../engine\";\nimport type { EntityType, EntityId, GraphStore } from \"../graph\";\n\nexport type RelationCardinality = \"belongsTo\" | \"hasMany\" | \"manyToMany\";\n/**\n * FK edge: this entity points at one parent row. Used to invalidate parent aggregates and optional list keys when the FK changes.\n */\nexport interface BelongsToRelation { cardinality: \"belongsTo\"; foreignKey: string; targetType: EntityType; invalidateTargetLists?: string[]; }\n/**\n * Inverse collection: children carry `foreignKey` pointing here; `listKeyPrefix` builds the child list query key for a given parent id.\n */\nexport interface HasManyRelation { cardinality: \"hasMany\"; targetType: EntityType; foreignKey: string; listKeyPrefix: (parentId: EntityId) => unknown[]; }\n/**\n * Join-style relation stored as an id array on this entity; invalidates partner lists derived via `listKeyPrefix` for each touched id.\n */\nexport interface ManyToManyRelation { cardinality: \"manyToMany\"; targetType: EntityType; localArrayField?: string; listKeyPrefix: (thisId: EntityId) => unknown[]; }\nexport type RelationDescriptor = BelongsToRelation | HasManyRelation | ManyToManyRelation;\n/**\n * Declarative relation metadata for one `EntityType`: optional named relations and list key prefixes to invalidate on any mutation.\n */\nexport interface EntitySchema { type: EntityType; relations?: Record<string, RelationDescriptor>; globalListKeys?: string[]; }\n/**\n * Snapshot diff passed to cascade rules after CRUD: compare `previous` vs `next` to find FK moves, array membership changes, etc.\n */\nexport interface CascadeContext { type: EntityType; id: EntityId; previous: Record<string, unknown> | null; next: Record<string, unknown> | null; op: \"create\" | \"update\" | \"delete\"; }\n\nconst schemaRegistry = new Map<EntityType, EntitySchema>();\n/** Register or replace schema for `schema.type` (typically at app init). */\nexport function registerSchema(schema: EntitySchema) { schemaRegistry.set(schema.type, schema); }\n/** Lookup schema for cascade/join reads; returns null if unregistered. */\nexport function getSchema(type: EntityType) { return schemaRegistry.get(type) ?? null; }\n\n/**\n * After a successful mutation, mark related entities/lists stale so hooks refetch without manually hunting query keys.\n * Traverses registered schemas (including reverse `hasMany`) so denormalized UIs stay eventually consistent with the graph.\n */\nexport function cascadeInvalidation(ctx: CascadeContext, storeApi: GraphStore = graphStore) {\n const schema = schemaRegistry.get(ctx.type); if (!schema) return;\n const store = storeApi.getState();\n if (schema.globalListKeys) for (const key of schema.globalListKeys) store.invalidateLists(key);\n if (!schema.relations) return;\n for (const [, relation] of Object.entries(schema.relations)) {\n switch (relation.cardinality) {\n case \"belongsTo\": {\n const prevFk = ctx.previous?.[relation.foreignKey] as EntityId | null;\n const nextFk = ctx.next?.[relation.foreignKey] as EntityId | null;\n if (prevFk && prevFk !== nextFk && relation.invalidateTargetLists) for (const kp of relation.invalidateTargetLists) store.invalidateLists((k) => k.startsWith(kp) && k.includes(prevFk));\n if (nextFk && relation.invalidateTargetLists) for (const kp of relation.invalidateTargetLists) store.invalidateLists((k) => k.startsWith(kp) && k.includes(nextFk));\n if (prevFk) store.invalidateEntity(relation.targetType, prevFk);\n if (nextFk) store.invalidateEntity(relation.targetType, nextFk);\n break;\n }\n case \"hasMany\": store.invalidateLists(serializeKey(relation.listKeyPrefix(ctx.id) as unknown[])); break;\n case \"manyToMany\": {\n const prevIds = ctx.previous?.[relation.localArrayField ?? \"\"] as EntityId[] | null;\n const nextIds = ctx.next?.[relation.localArrayField ?? \"\"] as EntityId[] | null;\n for (const relatedId of new Set([...(prevIds ?? []), ...(nextIds ?? [])])) store.invalidateLists(serializeKey(relation.listKeyPrefix(relatedId) as unknown[]));\n break;\n }\n }\n }\n for (const [, otherSchema] of schemaRegistry) {\n if (!otherSchema.relations) continue;\n for (const [, rel] of Object.entries(otherSchema.relations)) {\n if (rel.targetType !== ctx.type) continue;\n if (rel.cardinality === \"hasMany\") store.invalidateLists(serializeKey(rel.listKeyPrefix(ctx.id) as unknown[]));\n }\n }\n}\n\n/**\n * Resolve relation **placeholders** for detail panels: joins graph reads for belongs-to targets, has-many id lists, or many-to-many id arrays.\n * Returns plain objects suitable for rendering; does not mutate the graph.\n */\nexport function readRelations(type: EntityType, entity: Record<string, unknown>, storeApi: GraphStore = graphStore): Record<string, unknown> {\n const schema = schemaRegistry.get(type); if (!schema?.relations) return {};\n const store = storeApi.getState(); const result: Record<string, unknown> = {};\n for (const [name, relation] of Object.entries(schema.relations)) {\n switch (relation.cardinality) {\n case \"belongsTo\": { const fkValue = entity[relation.foreignKey] as EntityId | null; result[name] = fkValue ? store.readEntity(relation.targetType, fkValue) : null; break; }\n case \"hasMany\": { const listKey = serializeKey(relation.listKeyPrefix(entity.id as EntityId) as unknown[]); const listState = store.lists[listKey]; result[name] = listState ? listState.ids.map((id) => store.readEntity(relation.targetType, id)).filter(Boolean) : []; break; }\n case \"manyToMany\": { const ids = entity[relation.localArrayField ?? \"\"] as EntityId[] | null; result[name] = ids ? ids.map((id) => store.readEntity(relation.targetType, id)).filter(Boolean) : []; break; }\n }\n }\n return result;\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"]}