@prometheus-ags/entity-graph-core 4.3.0 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/README.md +64 -0
- package/dist/{chunk-64YZRB56.mjs → chunk-T5WSFBXH.mjs} +127 -93
- package/dist/chunk-T5WSFBXH.mjs.map +1 -0
- package/dist/devtools.d.ts +1 -1
- package/dist/devtools.mjs +1 -1
- package/dist/{graph-QfI6o5eV.d.ts → graph-BNIJRUzI.d.ts} +8 -0
- package/dist/index.d.ts +208 -18
- package/dist/index.mjs +394 -94
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-64YZRB56.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/merge/lww.ts","../src/merge/registry.ts","../src/view/evaluator.ts","../src/graph-mutators.ts","../src/graph.ts","../src/legacy-devtools.ts","../src/engine.ts","../src/crud/relations.ts","../src/devtools-compatibility-bridge.ts"],"names":["listeners"],"mappings":"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","file":"chunk-T5WSFBXH.mjs","sourcesContent":["/**\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","/**\n * Draft-level graph writes shared by the store actions in `graph.ts` and by\n * `batchGraphWrites`. Each function mutates an immer draft of the graph data;\n * the caller owns the single `set` that publishes the result. Keeping one\n * implementation guarantees a batched write and the equivalent store action\n * produce the same graph.\n */\nimport type {\n EntityId,\n EntitySyncMetadata,\n EntityType,\n GraphState,\n ListState,\n QueryKey,\n} from \"./graph\";\nimport { getMergeStrategy } from \"./merge/registry\";\nimport type { MergeContext } from \"./merge/types\";\n\n/** The data slots of the graph (everything except the action functions). */\nexport type GraphData = Pick<GraphState, \"entities\" | \"patches\" | \"entityStates\" | \"syncMetadata\" | \"lists\">;\n\nexport function entityKey(type: EntityType, id: EntityId): string {\n return `${type}:${id}`;\n}\n\nexport function defaultSyncMetadata(): EntitySyncMetadata {\n return { synced: true, origin: \"server\", updatedAt: null };\n}\n\nexport function defaultListState(): ListState {\n return {\n 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\nexport function upsertEntityDraft(s: GraphData, type: EntityType, id: EntityId, data: Record<string, unknown>): void {\n if (!s.entities[type]) s.entities[type] = {};\n const key = entityKey(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\nexport function upsertEntitiesDraft(\n s: GraphData,\n type: EntityType,\n entries: ReadonlyArray<{ id: EntityId; data: Record<string, unknown> }>,\n): void {\n if (!s.entities[type]) s.entities[type] = {};\n const strategy = getMergeStrategy(type);\n for (const { id, data } of entries) {\n const key = entityKey(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\nexport function replaceEntityDraft(s: GraphData, type: EntityType, id: EntityId, data: Record<string, unknown>): void {\n if (!s.entities[type]) s.entities[type] = {};\n s.entities[type][id] = data;\n const key = entityKey(type, id);\n if (!s.syncMetadata[key]) s.syncMetadata[key] = defaultSyncMetadata();\n}\n\nexport function removeEntityDraft(s: GraphData, type: EntityType, id: EntityId): void {\n delete s.entities[type]?.[id];\n delete s.patches[type]?.[id];\n delete s.entityStates[entityKey(type, id)];\n delete s.syncMetadata[entityKey(type, id)];\n}\n\nexport function patchEntityDraft(s: GraphData, type: EntityType, id: EntityId, patch: Record<string, unknown>): void {\n if (!s.patches[type]) s.patches[type] = {};\n s.patches[type][id] = { ...(s.patches[type][id] ?? {}), ...patch };\n}\n\nexport function unpatchEntityDraft(s: GraphData, type: EntityType, id: EntityId, keys: readonly string[]): void {\n const p = s.patches[type]?.[id];\n if (!p) return;\n for (const k of keys) delete p[k];\n}\n\nexport function clearPatchDraft(s: GraphData, type: EntityType, id: EntityId): void {\n delete s.patches[type]?.[id];\n}\n\nexport function setEntitySyncMetadataDraft(\n s: GraphData,\n type: EntityType,\n id: EntityId,\n metadata: Partial<EntitySyncMetadata>,\n): void {\n const k = entityKey(type, id);\n s.syncMetadata[k] = { ...(s.syncMetadata[k] ?? defaultSyncMetadata()), ...metadata };\n}\n\nexport function removeIdFromAllListsDraft(s: GraphData, type: EntityType, id: EntityId): void {\n for (const key of Object.keys(s.lists)) {\n const list = s.lists[key];\n if (list.entityType && list.entityType !== type) continue;\n 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\nexport function insertIdInListDraft(s: GraphData, key: QueryKey, id: EntityId, position: \"start\" | \"end\" | number): void {\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\n/**\n * Set a list's ordered ids (deduplicated, first occurrence wins) without\n * touching its fetch lifecycle or pagination metadata.\n */\nexport function setListIdsDraft(s: GraphData, key: QueryKey, ids: readonly EntityId[], entityType?: EntityType): void {\n if (!s.lists[key]) s.lists[key] = defaultListState();\n s.lists[key].ids = Array.from(new Set(ids));\n if (entityType !== undefined) s.lists[key].entityType = entityType;\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 {\n clearPatchDraft,\n defaultListState,\n defaultSyncMetadata,\n entityKey as ek,\n insertIdInListDraft,\n patchEntityDraft,\n removeEntityDraft,\n removeIdFromAllListsDraft,\n replaceEntityDraft,\n setEntitySyncMetadataDraft,\n unpatchEntityDraft,\n upsertEntitiesDraft,\n upsertEntityDraft,\n} from \"./graph-mutators\";\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 * Entity type of the ids this list holds, recorded by `ingestFetchedList`. Absent on lists\n * written only through key-based actions; untyped lists are treated as holding any type.\n */\n entityType?: EntityType | 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 *\n * **Written values are adopted and frozen.** The store is immer-backed with\n * auto-freeze on, so every object passed to a write (and every object nested in\n * it) becomes part of the immutable graph and is deep-frozen. This is\n * intentional: it is what makes structural sharing, O(1) transaction rollback\n * and time travel safe. If the caller (or another library, e.g. an A2UI data\n * model) keeps mutating an object after writing it, pass a copy\n * (`structuredClone(value)`). The AG-UI bridge does this for you.\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, remove an id from every list that holds `type` (or is untyped) and decrement `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\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\n/**\n * Merged-read cache for `readEntity`, mirroring `snapshotCache`'s shape.\n *\n * Without it, `readEntity` allocated `{ ...base, ...patch }` on EVERY call\n * whenever a patch existed — so two consecutive reads of an unchanged entity\n * returned different references, defeating `useShallow`/memo comparison in\n * every React consumer and re-rendering subscribers on unrelated store\n * writes. The identity contract is now: same `base` + same `patch` (by\n * reference) ⇒ same returned object.\n */\ninterface MergedReadCacheEntry {\n base: Record<string, unknown>;\n patch: Record<string, unknown>;\n merged: Record<string, unknown>;\n}\nconst mergedReadCache = new Map<string, MergedReadCacheEntry>();\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) => upsertEntityDraft(s, type, id, data)),\n upsertEntities: (type, entries) => set((s) => upsertEntitiesDraft(s, type, entries)),\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 // Dedupe on BOTH paths. The append arm always deduped; the replace\n // arm passed fetched ids through verbatim, so a transport whose\n // backend returned two physical rows for one logical id rendered\n // the entity twice in every list consumer (observed 2026-09-01:\n // graph-explorer's rail doubled after a store-level id defect —\n // the store bug was real, but a list of entity ids must never\n // contain the same id twice regardless of what a fetch returned).\n const nextIds = target.mode === \"append\"\n ? Array.from(new Set([...existing.ids, ...targetIds]))\n : Array.from(new Set(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 entityType: type,\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 entityType: type,\n }\n : { ...existing, ids: nextIds, entityType: type };\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) => replaceEntityDraft(s, type, id, data)),\n removeEntity: (type, id) => set((s) => removeEntityDraft(s, type, id)),\n patchEntity: (type, id, patch) => set((s) => patchEntityDraft(s, type, id, patch)),\n unpatchEntity: (type, id, keys) => set((s) => unpatchEntityDraft(s, type, id, keys)),\n clearPatch: (type, id) => set((s) => clearPatchDraft(s, 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) => setEntitySyncMetadataDraft(s, type, id, metadata)),\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) => removeIdFromAllListsDraft(s, type, id)),\n insertIdInList: (key, id, position) => set((s) => insertIdInListDraft(s, key, id, position)),\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];\n if (!base) { mergedReadCache.delete(ek(type, id)); return null; }\n const patch = s.patches[type]?.[id];\n // No patch: the stored object IS the read — already referentially\n // stable, nothing to cache.\n if (!patch) return base as T;\n const key = ek(type, id);\n const cached = mergedReadCache.get(key);\n if (cached && cached.base === base && cached.patch === patch) {\n return cached.merged as T;\n }\n const merged = { ...base, ...patch };\n mergedReadCache.set(key, { base, patch, merged });\n return merged 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","/** Deprecated in-process event shape retained by the package root. */\nexport type LegacyDevtoolsEvent =\n | { kind: \"upsert\"; type: string; id: string; data: Record<string, unknown>; at: string }\n | { kind: \"patch\"; type: string; id: string; patch: Record<string, unknown>; at: string }\n | { kind: \"unpatch\"; type: string; id: string; keys: string[]; at: string }\n | { kind: \"clearPatch\"; type: string; id: string; at: string }\n | { kind: \"list\"; key: string; idCount: number; at: string };\n\ntype LegacyListener = (event: LegacyDevtoolsEvent) => void;\n\nconst listeners = new Set<LegacyListener>();\n\nfunction publish(event: LegacyDevtoolsEvent): void {\n if (listeners.size === 0) return;\n for (const listener of [...listeners]) {\n try {\n listener(event);\n } catch {\n // Keep the prior diagnostic without forwarding a potentially sensitive exception.\n console.warn(\"[engine] devtools subscriber threw\");\n }\n }\n}\n\n/**\n * Deprecated op-site event API retained without loading the optional\n * versioned DevTools controller into the package root bundle. It stores no\n * history or cursor; new inspection surfaces use the versioned subpath.\n */\nexport function subscribeLegacyDevtoolsEvent(listener: LegacyListener): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/** @internal Deprecated manual injection used by legacy internal callers. */\nexport function emitLegacyDevtoolsEvent(event: LegacyDevtoolsEvent): void {\n publish(event);\n}\n","import { graphStore } from \"./graph\";\nimport type { EntityType, EntityId, GraphStore, ListState } from \"./graph\";\nimport {\n emitLegacyDevtoolsEvent,\n subscribeLegacyDevtoolsEvent,\n type LegacyDevtoolsEvent,\n} from \"./legacy-devtools\";\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 globalSubscriberStatsListeners = new Set<() => void>();\nconst subscriberStatsListenersByStore = new WeakMap<GraphStore, Set<() => void>>();\nfunction subscriberStatsListenersFor(store: GraphStore) {\n let listeners = subscriberStatsListenersByStore.get(store);\n if (!listeners) {\n listeners = new Set();\n subscriberStatsListenersByStore.set(store, listeners);\n }\n return listeners;\n}\nfunction emitSubscriberStatsChange(store: GraphStore) {\n for (const cb of new Set([\n ...globalSubscriberStatsListeners,\n ...subscriberStatsListenersFor(store),\n ])) 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(store);\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(store);\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, store?: GraphStore) {\n const listeners = store ? subscriberStatsListenersFor(store) : globalSubscriberStatsListeners;\n listeners.add(onChange);\n return () => listeners.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// This deprecated stream preserves the original graph-transaction op-site\n// contract without loading the optional v1 controller into the root bundle.\n// It retains no independent history or cursor.\n\n/**\n * Discriminated union of devtools events.\n *\n * New inspection surfaces should use the versioned `./devtools` subpath.\n */\nexport type DevtoolsEvent = LegacyDevtoolsEvent;\n\ntype DevtoolsListener = (event: DevtoolsEvent) => void;\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 return subscribeLegacyDevtoolsEvent(cb);\n}\n\n/**\n * Internal deprecated synthetic-injection seam retained for compatibility.\n *\n * NOT re-exported from `src/index.ts` — the public surface is\n * `subscribeDevtoolsEvent` only.\n */\nexport function notifyDevtools(event: DevtoolsEvent): void {\n emitLegacyDevtoolsEvent(event);\n}\n\nconst gcIntervalsByStore = new Map<GraphStore, ReturnType<typeof setInterval>>();\n\n/**\n * Ids held by any list, per entity type. Untyped lists (`entityType` absent) are recorded under\n * `null` and retain a matching id of every type.\n */\nfunction collectListReferences(lists: Record<string, ListState>): Map<EntityType | null, Set<EntityId>> {\n const refs = new Map<EntityType | null, Set<EntityId>>();\n for (const list of Object.values(lists)) {\n const type = list.entityType ?? null;\n let ids = refs.get(type);\n if (!ids) refs.set(type, (ids = new Set()));\n for (const id of list.ids) ids.add(id);\n }\n return refs;\n}\n\n/**\n * One GC pass: removes entities that are unobserved, referenced by no list, older than\n * `defaultGcTime`, not fetching, and have no non-empty local patches. Lists are never edited:\n * list membership is a reference, so a collected entity is by definition in no list.\n */\nfunction runGarbageCollection(storeApi: GraphStore = graphStore): void {\n const store = storeApi.getState();\n const { defaultGcTime: gcTime } = getEngineOptions();\n const now = Date.now();\n const listRefs = collectListReferences(store.lists);\n const untypedRefs = listRefs.get(null);\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 const typedRefs = listRefs.get(type);\n for (const id of Object.keys(bucket)) {\n const key = `${type}:${id}`;\n if (hasSubscribers(key, storeApi)) continue;\n if (typedRefs?.has(id) || untypedRefs?.has(id)) 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) store.removeEntity(type, id);\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 { 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/** Read the existing registry for derived tooling projections without creating a second schema source. */\nexport function getRegisteredSchemas(): readonly EntitySchema[] { return [...schemaRegistry.values()]; }\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","import type { GraphStore } from \"./graph\";\n\nexport interface LegacyTimeTravelSnapshotMetadata {\n seq: number;\n at: number;\n label?: string;\n}\n\nexport interface LegacyTimeTravelState {\n snapshots: ReadonlyArray<LegacyTimeTravelSnapshotMetadata>;\n cursor: number | null;\n capacity: number;\n}\n\n/**\n * Thin root-safe facade supplied by an attached optional DevTools controller.\n * It owns no graph data, cursor, or snapshot history.\n */\nexport interface GraphDevtoolsCompatibilityDelegate {\n configure(capacity: number): void;\n capture(label?: string): number;\n restoreByIndex(index: number): boolean;\n restoreByCursor(cursor: number): boolean;\n step(delta: number): boolean;\n getState(): LegacyTimeTravelState;\n subscribe(listener: () => void): () => void;\n clear(): void;\n}\n\ninterface CompatibilityEntry {\n delegate: GraphDevtoolsCompatibilityDelegate | null;\n listeners: Set<() => void>;\n unsubscribeDelegate: (() => void) | null;\n compatibilityDetach: (() => void) | null;\n}\n\ninterface CompatibilityBridgeState {\n version: 1;\n entries: WeakMap<GraphStore, CompatibilityEntry>;\n factory: ((store: GraphStore) => () => void) | null;\n}\n\nconst BRIDGE_KEY = Symbol.for(\"prometheus.entity-graph.devtools.compatibility.v1\");\nconst bridgeHost = globalThis as typeof globalThis & { [key: symbol]: unknown };\nconst existingBridge = bridgeHost[BRIDGE_KEY] as CompatibilityBridgeState | undefined;\nconst bridgeState: CompatibilityBridgeState = existingBridge?.version === 1\n ? existingBridge\n : { version: 1, entries: new WeakMap(), factory: null };\nbridgeHost[BRIDGE_KEY] = bridgeState;\n\nfunction getOrCreateEntry(store: GraphStore): CompatibilityEntry {\n let entry = bridgeState.entries.get(store);\n if (!entry) {\n entry = {\n delegate: null,\n listeners: new Set(),\n unsubscribeDelegate: null,\n compatibilityDetach: null,\n };\n bridgeState.entries.set(store, entry);\n }\n return entry;\n}\n\nfunction ensureDelegate(store: GraphStore, entry: CompatibilityEntry): void {\n const factory = bridgeState.factory;\n if (entry.delegate || entry.compatibilityDetach || !factory) return;\n entry.compatibilityDetach = factory(store);\n}\n\n/** Registered only when the explicit optional DevTools module is loaded. */\nexport function registerGraphDevtoolsCompatibilityFactory(\n factory: (store: GraphStore) => () => void,\n): void {\n bridgeState.factory = factory;\n}\n\nfunction notify(entry: CompatibilityEntry): void {\n for (const listener of [...entry.listeners]) {\n try {\n listener();\n } catch {\n // Deprecated tooling listeners never interrupt the graph or controller.\n }\n }\n}\n\nexport function registerGraphDevtoolsCompatibilityDelegate(\n store: GraphStore,\n delegate: GraphDevtoolsCompatibilityDelegate,\n): () => void {\n const entry = getOrCreateEntry(store);\n entry.unsubscribeDelegate?.();\n entry.delegate = delegate;\n entry.unsubscribeDelegate = delegate.subscribe(() => notify(entry));\n notify(entry);\n\n let unregistered = false;\n return () => {\n if (unregistered || entry.delegate !== delegate) return;\n unregistered = true;\n entry.unsubscribeDelegate?.();\n entry.unsubscribeDelegate = null;\n entry.delegate = null;\n notify(entry);\n if (entry.listeners.size === 0) bridgeState.entries.delete(store);\n };\n}\n\nexport function getGraphDevtoolsCompatibilityDelegate(\n store: GraphStore,\n): GraphDevtoolsCompatibilityDelegate | null {\n const entry = getOrCreateEntry(store);\n ensureDelegate(store, entry);\n return entry.delegate;\n}\n\nexport function peekGraphDevtoolsCompatibilityDelegate(\n store: GraphStore,\n): GraphDevtoolsCompatibilityDelegate | null {\n return bridgeState.entries.get(store)?.delegate ?? null;\n}\n\nexport function subscribeGraphDevtoolsCompatibility(\n store: GraphStore,\n listener: () => void,\n): () => void {\n const entry = getOrCreateEntry(store);\n entry.listeners.add(listener);\n ensureDelegate(store, entry);\n return () => {\n entry.listeners.delete(listener);\n if (entry.listeners.size === 0 && entry.delegate === null) bridgeState.entries.delete(store);\n };\n}\n\nexport function resetGraphDevtoolsCompatibility(store?: GraphStore): void {\n if (store) {\n const entry = bridgeState.entries.get(store);\n entry?.delegate?.clear();\n if (entry?.compatibilityDetach) {\n const detach = entry.compatibilityDetach;\n entry.compatibilityDetach = null;\n detach();\n }\n if (entry && entry.delegate === null && entry.listeners.size === 0) bridgeState.entries.delete(store);\n return;\n }\n bridgeState.entries = new WeakMap<GraphStore, CompatibilityEntry>();\n}\n"]}
|
package/dist/devtools.d.ts
CHANGED
package/dist/devtools.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { registerGraphDevtoolsCompatibilityFactory, registerGraphDevtoolsCompatibilityDelegate, getRegisteredSchemas, serializeKey, EMPTY_ENTITY_STATE, EMPTY_SYNC_METADATA, EMPTY_LIST_STATE } from './chunk-
|
|
1
|
+
import { registerGraphDevtoolsCompatibilityFactory, registerGraphDevtoolsCompatibilityDelegate, getRegisteredSchemas, serializeKey, EMPTY_ENTITY_STATE, EMPTY_SYNC_METADATA, EMPTY_LIST_STATE } from './chunk-T5WSFBXH.mjs';
|
|
2
2
|
|
|
3
3
|
// src/devtools/protocol.ts
|
|
4
4
|
var GRAPH_DEVTOOLS_PROTOCOL = "prometheus.entity-graph.devtools";
|
|
@@ -254,6 +254,14 @@ declare const EMPTY_SYNC_METADATA: EntitySyncMetadata;
|
|
|
254
254
|
declare const EMPTY_LIST_STATE: ListState;
|
|
255
255
|
/**
|
|
256
256
|
* Canonical Zustand store: **entities** (server truth), **patches** (UI-only overlay), **lists** (id order + list meta), and **entityStates** (per-entity fetch state).
|
|
257
|
+
*
|
|
258
|
+
* **Written values are adopted and frozen.** The store is immer-backed with
|
|
259
|
+
* auto-freeze on, so every object passed to a write (and every object nested in
|
|
260
|
+
* it) becomes part of the immutable graph and is deep-frozen. This is
|
|
261
|
+
* intentional: it is what makes structural sharing, O(1) transaction rollback
|
|
262
|
+
* and time travel safe. If the caller (or another library, e.g. an A2UI data
|
|
263
|
+
* model) keeps mutating an object after writing it, pass a copy
|
|
264
|
+
* (`structuredClone(value)`). The AG-UI bridge does this for you.
|
|
257
265
|
* Framework bindings subscribe to the vanilla store; stores, adapters, and
|
|
258
266
|
* engines can read it synchronously through `graphStore.getState()`.
|
|
259
267
|
*/
|