@ai-matrx/records 0.93.6 → 0.94.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/data/index.cjs +17 -0
- package/dist/data/index.cjs.map +1 -1
- package/dist/data/index.d.cts +2 -2
- package/dist/data/index.d.ts +2 -2
- package/dist/data/index.js +17 -0
- package/dist/data/index.js.map +1 -1
- package/dist/data/react.cjs +16 -3
- package/dist/data/react.cjs.map +1 -1
- package/dist/data/react.d.cts +10 -0
- package/dist/data/react.d.ts +10 -0
- package/dist/data/react.js +16 -3
- package/dist/data/react.js.map +1 -1
- package/dist/entity/index.cjs +1 -1
- package/dist/entity/index.cjs.map +1 -1
- package/dist/entity/index.d.cts +3 -3
- package/dist/entity/index.d.ts +3 -3
- package/dist/entity/index.js +1 -1
- package/dist/entity/index.js.map +1 -1
- package/dist/entity/react.cjs +1 -1
- package/dist/entity/react.cjs.map +1 -1
- package/dist/entity/react.d.cts +10 -0
- package/dist/entity/react.d.ts +10 -0
- package/dist/entity/react.js +1 -1
- package/dist/entity/react.js.map +1 -1
- package/dist/first-page/index.d.cts +6 -0
- package/dist/first-page/index.d.ts +6 -0
- package/dist/{port-DyZ0GfxE.d.ts → port-BNXXJINy.d.ts} +1 -1
- package/dist/{port-B3UeC536.d.cts → port-CEf9hsW4.d.cts} +1 -1
- package/dist/react/index.cjs +17 -0
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +17 -0
- package/dist/react/index.js.map +1 -1
- package/dist/setup/index.cjs +1 -1
- package/dist/setup/index.cjs.map +1 -1
- package/dist/setup/index.d.cts +2 -2
- package/dist/setup/index.d.ts +2 -2
- package/dist/setup/index.js +1 -1
- package/dist/setup/index.js.map +1 -1
- package/dist/{types-DB4J-zIt.d.ts → types-Du4Q9Rvi.d.ts} +10 -0
- package/dist/{types-Bg1q6qwq.d.cts → types-Dxc8Pt7Y.d.cts} +10 -0
- package/package.json +2 -2
package/dist/data/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/data/react.tsx"],"sourcesContent":["\"use client\";\n\n// src/data/react.tsx — @ai-matrx/records/data/react\n//\n// THE FRAME-SIDE DATA LAYER (Applets CONTRACTS v2 §4): the hooks an Applet's code reads through, so the\n// agent writing the Applet never thinks about state. Arman, 2026-10-06: \"making requests once, we're\n// doing optimistic updates, things are done correctly and easily.\"\n//\n// THE ENGINE IS TANSTACK QUERY, and the QueryClient lives in the frame (the host passes one, or the\n// frame mounts its own provider above this). On top of it this layer owns:\n//\n// · RECORDS-OWNED KEYS — `[\"@ai-matrx/records\", \"data\", portKey, alias, …]`. Two mounted Applets (two\n// ports) never share an entry; one alias's columns, pages and rows share one prefix, so a shape\n// change or a reconnect invalidates exactly that alias.\n// · ONE REQUEST PER KEY — every reader of the same question shares one entry and one in-flight call.\n// · KEYSET PAGES — `useDataRows` is an infinite query over the port's cursor; `loadMore` asks for the\n// page after the last row, so a write landing mid-read never skips or repeats a row.\n// · OPTIMISTIC WRITES WITH ROLLBACK AND RECEIPTS — the change is drawn at once; the store's answer (the\n// re-read row with its new `_version`) replaces it; a refusal puts the row back and answers the\n// store's own sentence. Every update sends the `_version` the person saw as `baseVersion`.\n// · LIVE — one subscription per (port, alias), ref-counted across every hook reading the alias, held a\n// grace after the last one lets go. A bump names ids; only those ids are re-read, and each page\n// holding one is patched in place. An id no loaded page holds (a row someone just made) refreshes\n// the alias's pages; `null` (a reconnect) or a shape change refreshes everything for the alias.\n\nimport { createContext, createElement, useContext, useEffect, useMemo, useRef, type ReactNode } from \"react\";\nimport {\n QueryClient as QueryClientClass,\n QueryClientContext,\n QueryClientProvider,\n hashKey,\n useInfiniteQuery,\n useQuery,\n type InfiniteData,\n type QueryClient,\n type QueryKey,\n} from \"@tanstack/react-query\";\n\nimport type { RecordsError, RecordsResult } from \"../results\";\nimport type { Column, DataEvents, DataPort, DataSource, Page, Query, Row, RowsEvent, Uuid, Values } from \"./types\";\n\nexport const RECORDS_QUERY_ROOT = \"@ai-matrx/records\";\n/** How long a live subscription outlives the last hook reading its alias (a remount costs nothing). */\nexport const DATA_LIVE_GRACE_MS = 30_000;\n/** Bumps landing this close together are re-read in one batch. */\nconst BUMP_BATCH_MS = 40;\n\n// ── keys ──────────────────────────────────────────────────────────────────────────────────────\n\nexport const dataKeys = {\n all: (portKey: string) => [RECORDS_QUERY_ROOT, \"data\", portKey] as const,\n sources: (portKey: string) => [RECORDS_QUERY_ROOT, \"data\", portKey, \"sources\"] as const,\n alias: (portKey: string, alias: string) => [RECORDS_QUERY_ROOT, \"data\", portKey, \"alias\", alias] as const,\n columns: (portKey: string, alias: string) => [...dataKeys.alias(portKey, alias), \"columns\"] as const,\n rowsPrefix: (portKey: string, alias: string) => [...dataKeys.alias(portKey, alias), \"rows\"] as const,\n rows: (portKey: string, alias: string, query: Query) => [...dataKeys.rowsPrefix(portKey, alias), stableQuery(query)] as const,\n row: (portKey: string, alias: string, id: Uuid) => [...dataKeys.alias(portKey, alias), \"row\", id] as const,\n};\n\n/** A query's identity: the same question asked with its keys in another order is the same entry. */\nfunction stableQuery(query: Query): string {\n const sortKeys = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.keys(value as object)\n .sort()\n .filter((k) => (value as Record<string, unknown>)[k] !== undefined)\n .map((k) => [k, sortKeys((value as Record<string, unknown>)[k])]),\n );\n }\n return value;\n };\n return JSON.stringify(sortKeys(query ?? {}));\n}\n\n// ── refusals as thrown values (TanStack's error channel) ───────────────────────────────────────\n\n/** A store refusal carried through the query engine; hooks hand back `.error`, never the wrapper. */\nexport class DataRefusal extends Error {\n readonly error: RecordsError;\n constructor(error: RecordsError) {\n super(error.message);\n this.name = \"DataRefusal\";\n this.error = error;\n }\n}\n\nfunction unwrap<T>(answer: RecordsResult<T>): T {\n if (answer.ok) return answer.data;\n throw new DataRefusal(answer.error);\n}\n\nfunction asRecordsError(thrown: unknown): RecordsError | null {\n if (!thrown) return null;\n if (thrown instanceof DataRefusal) return thrown.error;\n return { code: \"unreachable\", message: `The data could not be reached: ${thrown instanceof Error ? thrown.message : String(thrown)}` };\n}\n\n/** Only a refusal that a second try could change is retried; a store sentence is final. */\nfunction retryable(failureCount: number, thrown: unknown): boolean {\n const code = thrown instanceof DataRefusal ? thrown.error.code : \"unreachable\";\n return (code === \"unreachable\" || code === \"timed_out\") && failureCount < 2;\n}\n\n// ── the port in context ───────────────────────────────────────────────────────────────────────\n\ninterface PortContext {\n port: DataPort;\n portKey: string;\n /** The `rows:<alias>` streams. Absent: not live, and the console says so once. */\n events?: DataEvents;\n}\n\nconst DataPortContext = createContext<PortContext | null>(null);\n\nexport interface DataPortProviderProps {\n port: DataPort;\n /** The frame's event streams (`host.events`); a host-side mount passes `hostEvents(port)`. */\n events?: DataEvents;\n /** Unique per mounted Applet (its instance id): two ports never share a cache entry. */\n portKey: string;\n /** The frame's QueryClient. Left out, the nearest `QueryClientProvider` above is used. */\n queryClient?: QueryClient;\n children?: ReactNode;\n}\n\nexport function DataPortProvider({ port, events, portKey, queryClient, children }: DataPortProviderProps) {\n const value = useMemo(() => ({ port, portKey, ...(events ? { events } : {}) }), [port, events, portKey]);\n const inner = createElement(DataPortContext.Provider, { value }, children);\n return queryClient ? createElement(QueryClientProvider, { client: queryClient }, inner) : inner;\n}\n\n/** A host hook that owns its own port (no provider above it) passes it explicitly. */\nexport interface DataScope {\n port: DataPort;\n portKey: string;\n events?: DataEvents;\n}\n\n/** A host-side mount (no frame between): the host port's own producer, as the frame's event streams. */\nexport function hostEvents(port: { subscribe: DataEvents[\"on\"] }): DataEvents {\n return { on: (event, listener) => port.subscribe(event, listener) };\n}\n\nlet warnedNotLive = false;\n\nexport function useDataPort(scope?: DataScope): PortContext {\n const held = useContext(DataPortContext);\n if (scope) return scope;\n if (!held) {\n throw new Error(\n \"A data hook was called outside <DataPortProvider>. The frame mounts it once with the host's DataPort and this Applet's portKey.\",\n );\n }\n return held;\n}\n\n// ── the cache: reading and patching every entry that holds a row ──────────────────────────────\n\ntype RowsData = InfiniteData<Page, string | null>;\n\nfunction forEachRowsEntry(qc: QueryClient, portKey: string, alias: string, fn: (key: QueryKey, data: RowsData) => RowsData | undefined) {\n for (const [key, data] of qc.getQueriesData<RowsData>({ queryKey: dataKeys.rowsPrefix(portKey, alias) })) {\n if (!data) continue;\n const next = fn(key, data);\n if (next && next !== data) qc.setQueryData(key, next);\n }\n}\n\n// ── what the store has said lately, kept until every in-flight page read has seen it ──────────\n//\n// A next-page read (`loadMore`) is built from the pages as they were when it STARTED; when it lands it writes\n// those pages back with the new one appended. A re-read that patched a row while it was in flight was silently\n// undone — independent acceptance, 2026-10-06: 15 of 45 colleague edits made during paging stayed stale. So every\n// row the STORE answered (a live re-read, a write's receipt) and every row it dropped is remembered briefly, and\n// whenever a page read for that alias lands, anything it brought back older is put right again. Optimistic drafts\n// are never remembered: only the store's own answers.\n\n/** How long the store's answer is re-applied after it lands — longer than any page read. */\nconst LANDED_MS = 30_000;\n\ninterface Landed {\n row: Row | null;\n at: number;\n}\n\nconst LANDED_KEY = Symbol.for(\"@ai-matrx/records/data-landed\");\n\ninterface LandedHome {\n byAlias: Map<string, Map<Uuid, Landed>>;\n unsubscribe: () => void;\n}\n\nfunction landedHome(qc: QueryClient): LandedHome {\n const holder = qc as unknown as Record<symbol, LandedHome | undefined>;\n let home = holder[LANDED_KEY];\n if (!home) {\n const made: LandedHome = { byAlias: new Map(), unsubscribe: () => {} };\n made.unsubscribe = qc.getQueryCache().subscribe((event) => {\n if (event.type !== \"updated\" || event.action.type !== \"success\") return;\n const key = event.query.queryKey as readonly unknown[];\n // [\"@ai-matrx/records\", \"data\", portKey, \"alias\", alias, \"rows\", query]\n if (key[0] !== RECORDS_QUERY_ROOT || key[1] !== \"data\" || key[3] !== \"alias\" || key[5] !== \"rows\") return;\n const portKey = String(key[2]);\n const alias = String(key[4]);\n const landed = made.byAlias.get(`${portKey}\\u0001${alias}`);\n if (!landed || landed.size === 0) return;\n reapplyLanded(qc, event.query.queryKey, landed);\n });\n holder[LANDED_KEY] = made;\n home = made;\n }\n return home;\n}\n\nfunction remember(qc: QueryClient, portKey: string, alias: string, id: Uuid, row: Row | null): void {\n const home = landedHome(qc);\n const key = `${portKey}\\u0001${alias}`;\n let landed = home.byAlias.get(key);\n if (!landed) home.byAlias.set(key, (landed = new Map()));\n const now = Date.now();\n for (const [oldId, entry] of landed) if (now - entry.at > LANDED_MS) landed.delete(oldId);\n landed.set(id, { row, at: now });\n}\n\n/** Put back every remembered answer a just-landed page read brought back older (or brought back at all, if dropped). */\nfunction reapplyLanded(qc: QueryClient, key: QueryKey, landed: Map<Uuid, Landed>): void {\n const data = qc.getQueryData<RowsData>(key);\n if (!data) return;\n const now = Date.now();\n let changed = false;\n const pages = data.pages.map((page) => {\n let rows: Row[] | null = null;\n page.rows.forEach((r, i) => {\n const entry = landed.get(r._id);\n if (!entry || now - entry.at > LANDED_MS) return;\n if (entry.row === null) {\n rows ??= page.rows.slice();\n rows[i] = null as unknown as Row;\n } else if (entry.row._version > r._version) {\n rows ??= page.rows.slice();\n rows[i] = entry.row;\n }\n });\n if (!rows) return page;\n changed = true;\n return { ...page, rows: (rows as Row[]).filter((r) => r !== null) };\n });\n // Only when something changed — the write below is itself a \"success\" event, and this must settle.\n if (changed) qc.setQueryData(key, { ...data, pages });\n}\n\n/** Replace one row wherever a page holds it (never with an OLDER version than the one drawn). Answers whether any page held it. */\nfunction patchRow(qc: QueryClient, portKey: string, alias: string, row: Row, options: { force?: boolean; fromStore?: boolean } = {}): boolean {\n if (options.fromStore) remember(qc, portKey, alias, row._id, row);\n let held = false;\n forEachRowsEntry(qc, portKey, alias, (_key, data) => {\n let changed = false;\n const pages = data.pages.map((page) => {\n const i = page.rows.findIndex((r) => r._id === row._id);\n if (i < 0) return page;\n held = true;\n if (!options.force && page.rows[i]!._version > row._version) return page;\n changed = true;\n const rows = page.rows.slice();\n rows[i] = row;\n return { ...page, rows };\n });\n return changed ? { ...data, pages } : data;\n });\n const rowKey = dataKeys.row(portKey, alias, row._id);\n const current = qc.getQueryData<Row | null>(rowKey);\n if (options.force || !current || current._version <= row._version) qc.setQueryData(rowKey, row);\n return held;\n}\n\n/** Take a row out of every page (it was archived, or the reader may no longer see it). */\nfunction dropRow(qc: QueryClient, portKey: string, alias: string, id: Uuid, options: { fromStore?: boolean } = {}): void {\n if (options.fromStore) remember(qc, portKey, alias, id, null);\n forEachRowsEntry(qc, portKey, alias, (_key, data) => {\n let changed = false;\n const pages = data.pages.map((page) => {\n if (!page.rows.some((r) => r._id === id)) return page;\n changed = true;\n return { ...page, rows: page.rows.filter((r) => r._id !== id), total: page.total === null ? null : Math.max(0, page.total - 1) };\n });\n return changed ? { ...data, pages } : data;\n });\n qc.setQueryData(dataKeys.row(portKey, alias, id), null);\n}\n\nfunction findRow(qc: QueryClient, portKey: string, alias: string, id: Uuid): Row | null {\n const direct = qc.getQueryData<Row | null>(dataKeys.row(portKey, alias, id));\n if (direct) return direct;\n for (const [, data] of qc.getQueriesData<RowsData>({ queryKey: dataKeys.rowsPrefix(portKey, alias) })) {\n for (const page of data?.pages ?? []) {\n const hit = page.rows.find((r) => r._id === id);\n if (hit) return hit;\n }\n }\n return null;\n}\n\n// ── live: one subscription per (QueryClient, port, alias), ref-counted ────────────────────────\n\ninterface LiveEntry {\n refs: number;\n stop: () => void;\n timer: ReturnType<typeof setTimeout> | null;\n pending: Set<Uuid>;\n /** A notice in this batch could not name its rows. */\n unknown: boolean;\n flush: ReturnType<typeof setTimeout> | null;\n}\n\nconst LIVE_KEY = Symbol.for(\"@ai-matrx/records/data-live\");\n\nfunction liveHome(qc: QueryClient): Map<string, LiveEntry> {\n const holder = qc as unknown as Record<symbol, Map<string, LiveEntry> | undefined>;\n let home = holder[LIVE_KEY];\n if (!home) {\n home = new Map();\n holder[LIVE_KEY] = home;\n }\n return home;\n}\n\n/** Re-read exactly these ids and put each where it belongs. */\n/** A list whose order is the door's own (newest first) and which asks nothing of the rows: a new row's place is the top. */\nfunction isPlainNewestFirst(key: QueryKey): boolean {\n try {\n const q = JSON.parse(String(key[key.length - 1])) as Query;\n return !(q.where && q.where.length) && !q.search?.trim() && !(q.sort && q.sort.length);\n } catch {\n return false;\n }\n}\n\n/** A list this many pages deep keeps its pages when rows arrive that it cannot place; it counts them instead. */\nconst REREAD_PAGES_MAX = 2;\n\n/** The rows a list was told about but could not place; `refresh()` reads them in. */\ntype RowsDataWithNewer = RowsData & { newer?: number };\n\n/**\n * Rows no loaded page holds — new to this reader, or newly matching. WHERE they go is the store's to say:\n * · a plain newest-first list puts them at the top (the door's own order);\n * · a list of a page or two is read again (cheap, and exact);\n * · a deeper list is NEVER re-read wholesale (that re-read every loaded page on every bump: page 40 of\n * a 25,000-row table took 6 s, verifier 2026-10-06) — it counts them in `newer` for the screen to offer.\n */\n/**\n * What kind of source an alias is — read once through the same cached `sources()` entry every reader shares.\n * Only a custom TABLE's re-read rows are known to belong to its plain list: its read door answers live rows\n * only, in the door's newest-first order. A platform source's `get` can answer an archived row, or one its\n * list hides by default (a \"discovered\" contact), so its rows are never placed by the engine — the list is\n * asked again (short) or told how many are new (deep). Unknown (the read refused) is treated as \"not a table\".\n */\nasync function sourceKind(qc: QueryClient, port: DataPort, portKey: string, alias: string): Promise<DataSource[\"kind\"] | null> {\n try {\n const sources = await qc.ensureQueryData({ queryKey: dataKeys.sources(portKey), queryFn: async () => unwrap(await port.sources()) });\n return sources.find((s) => s.alias === alias)?.kind ?? null;\n } catch {\n return null;\n }\n}\n\nconst DEFERRED_KEY = Symbol.for(\"@ai-matrx/records/data-deferred-rereads\");\nconst OWED_KEY = Symbol.for(\"@ai-matrx/records/data-owed-pages\");\n\n/** Pages a `loadMore` asked for and has not yet received, by list — they go before any waiting re-read. */\ninterface OwedPage {\n pages: number;\n fetchNext: () => void;\n}\n\nfunction owedPages(qc: QueryClient): Map<string, OwedPage> {\n const holder = qc as unknown as Record<symbol, Map<string, OwedPage> | undefined>;\n return (holder[OWED_KEY] ??= new Map());\n}\n\n/** The page a list still owes, if any — and the list can still deliver it. */\nfunction owedPage(qc: QueryClient, hash: string): OwedPage | null {\n const owed = owedPages(qc).get(hash);\n if (!owed) return null;\n const query = qc.getQueryCache().get(hash);\n const data = query?.state.data as RowsData | undefined;\n const last = data?.pages[data.pages.length - 1];\n if (!query || query.state.status === \"error\" || !data || data.pages.length >= owed.pages || !last?.cursor) {\n owedPages(qc).delete(hash);\n return null;\n }\n return owed;\n}\n\n/**\n * Re-read one list — but NEVER over a read already in flight. Interrupting it cancels a page `loadMore` asked\n * for, and notices arriving faster than a page reads would starve paging forever (independent check, 2026-10-06).\n * A re-read asked for meanwhile waits, and however many were asked, one runs the moment the list is idle.\n */\nfunction rereadList(qc: QueryClient, key: QueryKey): void {\n const query = qc.getQueryCache().find({ queryKey: key, exact: true });\n if (!query || (query.state.fetchStatus !== \"fetching\" && !owedPage(qc, query.queryHash))) {\n void qc.invalidateQueries({ queryKey: key, exact: true });\n return;\n }\n const holder = qc as unknown as Record<symbol, Set<string> | undefined>;\n const waiting = (holder[DEFERRED_KEY] ??= new Set());\n if (waiting.has(query.queryHash)) return;\n waiting.add(query.queryHash);\n const settle = () => {\n if (query.state.fetchStatus === \"fetching\") return;\n // A page asked for goes first; the re-read waits until it has landed.\n const owed = owedPage(qc, query.queryHash);\n if (owed) {\n owed.fetchNext();\n return;\n }\n stop();\n waiting.delete(query.queryHash);\n void qc.invalidateQueries({ queryKey: key, exact: true });\n };\n const stop = qc.getQueryCache().subscribe((event) => {\n if (event.query === query) settle();\n });\n settle();\n}\n\n/** A list that cannot place what moved: one exact re-read while it is short, a `newer` count once it is deep. */\nfunction rereadOrCount(qc: QueryClient, key: QueryKey, data: RowsDataWithNewer, count: number): void {\n if (data.pages.length <= REREAD_PAGES_MAX) rereadList(qc, key);\n else qc.setQueryData<RowsDataWithNewer>(key, { ...data, newer: (data.newer ?? 0) + count });\n}\n\nfunction placeUnseen(qc: QueryClient, portKey: string, alias: string, rows: Row[], kind: DataSource[\"kind\"] | null): void {\n for (const [key, data] of qc.getQueriesData<RowsDataWithNewer>({ queryKey: dataKeys.rowsPrefix(portKey, alias) })) {\n if (!data || data.pages.length === 0) continue;\n const missing = rows.filter((row) => !data.pages.some((page) => page.rows.some((r) => r._id === row._id)));\n if (missing.length === 0) continue;\n if (kind === \"table\" && isPlainNewestFirst(key)) {\n const [first, ...rest] = data.pages;\n qc.setQueryData<RowsDataWithNewer>(key, {\n ...data,\n pages: [{ ...first!, rows: [...missing, ...first!.rows], total: first!.total === null ? null : first!.total + missing.length }, ...rest],\n });\n } else {\n rereadOrCount(qc, key, data, missing.length);\n }\n }\n}\n\nasync function rereadIds(qc: QueryClient, port: DataPort, portKey: string, alias: string, ids: Uuid[]): Promise<void> {\n const answers = await Promise.all(ids.map((id) => port.get(alias, id).then((a) => [id, a] as const)));\n const unseen: Row[] = [];\n for (const [id, answer] of answers) {\n if (!answer.ok) continue; // a re-read that failed leaves the drawn row as it was; the next bump or read corrects it\n if (answer.data === null) {\n dropRow(qc, portKey, alias, id, { fromStore: true });\n } else if (!patchRow(qc, portKey, alias, answer.data, { fromStore: true })) {\n unseen.push(answer.data);\n }\n }\n if (unseen.length > 0) placeUnseen(qc, portKey, alias, unseen, await sourceKind(qc, port, portKey, alias));\n}\n\n/**\n * \"Something moved and I cannot say which\" (a reconnect, a wake, more ids than a notice lists). Never a re-read of\n * every loaded page: each list gets one exact re-read while short, or a `newer` mark once deep; each open row is\n * read again (one cheap read per row a view is showing).\n */\nfunction rereadUnknown(qc: QueryClient, portKey: string, alias: string): void {\n for (const [key, data] of qc.getQueriesData<RowsDataWithNewer>({ queryKey: dataKeys.rowsPrefix(portKey, alias) })) {\n if (!data || data.pages.length === 0) {\n rereadList(qc, key);\n continue;\n }\n if (data.pages.length <= REREAD_PAGES_MAX) rereadList(qc, key);\n else qc.setQueryData<RowsDataWithNewer>(key, { ...data, newer: Math.max(data.newer ?? 0, 1) });\n }\n void qc.invalidateQueries({ queryKey: [...dataKeys.alias(portKey, alias), \"row\"] });\n}\n\nfunction onBump(qc: QueryClient, port: DataPort, portKey: string, alias: string, entry: LiveEntry, event: RowsEvent): void {\n if (event.shape) {\n void qc.invalidateQueries({ queryKey: dataKeys.alias(portKey, alias) });\n return;\n }\n // Batched like any other notice: a burst of \"cannot say which\" is one bounded re-read, not one per notice.\n if (event.ids === null) entry.unknown = true;\n else for (const id of event.ids) entry.pending.add(id);\n if (entry.flush) return;\n entry.flush = setTimeout(() => {\n entry.flush = null;\n const ids = [...entry.pending];\n const unknown = entry.unknown;\n entry.pending.clear();\n entry.unknown = false;\n if (unknown) rereadUnknown(qc, portKey, alias);\n else if (ids.length > 0) void rereadIds(qc, port, portKey, alias, ids);\n }, BUMP_BATCH_MS);\n}\n\nfunction acquireLive(qc: QueryClient, port: DataPort, events: DataEvents | undefined, portKey: string, alias: string): () => void {\n const home = liveHome(qc);\n const key = `${portKey}\\u0001${alias}`;\n let entry = home.get(key);\n if (!entry) {\n const made: LiveEntry = { refs: 0, stop: () => {}, timer: null, pending: new Set(), unknown: false, flush: null };\n if (events) {\n made.stop = events.on(`rows:${alias}`, (event) => onBump(qc, port, portKey, alias, made, event));\n } else if (!warnedNotLive) {\n // NOT LIVE, SAID OUT LOUD: with no event stream other people's changes appear only on a re-read.\n warnedNotLive = true;\n console.warn(\"[@ai-matrx/records/data/react] No event stream was given to DataPortProvider, so this view is not live.\");\n }\n home.set(key, made);\n entry = made;\n }\n const mine = entry;\n mine.refs += 1;\n if (mine.timer) {\n clearTimeout(mine.timer);\n mine.timer = null;\n }\n return () => {\n mine.refs -= 1;\n if (mine.refs > 0) return;\n mine.timer = setTimeout(() => {\n if (mine.refs > 0) return;\n if (mine.flush) clearTimeout(mine.flush);\n mine.stop();\n if (home.get(key) === mine) home.delete(key);\n }, DATA_LIVE_GRACE_MS);\n };\n}\n\nconst FALLBACK_KEY = Symbol.for(\"@ai-matrx/records/data-query-client\");\n\n/**\n * The frame's QueryClient — the nearest provider's. A host with none (a plain page using a records hook)\n * gets ONE shared client for the page, held on globalThis so a dual-loaded graph still shares it.\n */\nexport function useRecordsQueryClient(): QueryClient {\n const provided = useContext(QueryClientContext);\n if (provided) return provided;\n const g = globalThis as unknown as Record<symbol, QueryClient | undefined>;\n let held = g[FALLBACK_KEY];\n if (!held) {\n held = new QueryClientClass({ defaultOptions: { queries: { staleTime: 30_000, refetchOnWindowFocus: false } } });\n g[FALLBACK_KEY] = held;\n }\n return held;\n}\n\nfunction useLive(alias: string | null, scope?: DataScope): void {\n const qc = useRecordsQueryClient();\n const { port, portKey, events } = useDataPort(scope);\n useEffect(() => {\n if (!alias) return;\n return acquireLive(qc, port, events, portKey, alias);\n }, [qc, port, events, portKey, alias]);\n}\n\n// ── reads ─────────────────────────────────────────────────────────────────────────────────────\n\nexport interface DataRead<T> {\n data: T | undefined;\n loading: boolean;\n /** The store's own sentence when the read was refused. */\n error: RecordsError | null;\n refresh: () => void;\n}\n\nexport function useDataSources(scope?: DataScope): DataRead<DataSource[]> {\n const { port, portKey } = useDataPort(scope);\n const qc = useRecordsQueryClient();\n const q = useQuery({ queryKey: dataKeys.sources(portKey), queryFn: async () => unwrap(await port.sources()), retry: retryable }, qc);\n return { data: q.data, loading: q.isPending, error: asRecordsError(q.error), refresh: () => void q.refetch() };\n}\n\n/** A server's answer to start from (lane SEED-ENTITY): drawn on the first frame, re-read once it is older than the cache's stale time. */\nexport interface DataSeed<T> {\n data: T;\n /** Epoch ms the server asked. */\n at: number;\n}\n\nexport function useDataColumns(alias: string, scope?: DataScope, seed?: DataSeed<Column[]> | undefined): DataRead<Column[]> {\n const { port, portKey } = useDataPort(scope);\n const qc = useRecordsQueryClient();\n useLive(alias, scope);\n const q = useQuery(\n {\n queryKey: dataKeys.columns(portKey, alias),\n queryFn: async () => unwrap(await port.columns(alias)),\n retry: retryable,\n ...(seed ? { initialData: seed.data, initialDataUpdatedAt: seed.at } : {}),\n },\n qc,\n );\n return { data: q.data, loading: q.isPending, error: asRecordsError(q.error), refresh: () => void q.refetch() };\n}\n\nexport interface DataRows {\n rows: Row[];\n total: number | null;\n loading: boolean;\n /** A next page is being read. */\n loadingMore: boolean;\n hasMore: boolean;\n error: RecordsError | null;\n /** Read the page after the last row (keyset): never skips or repeats a row, whatever is written meanwhile. */\n loadMore: () => void;\n /** Rows written by others that belong somewhere in this (deep, filtered or sorted) list; `refresh()` reads them in. */\n newer: number;\n refresh: () => void;\n}\n\nexport function useDataRows(alias: string, query: Query = {}, scope?: DataScope, seed?: DataSeed<Page> | undefined): DataRows {\n const { port, portKey } = useDataPort(scope);\n const qc = useRecordsQueryClient();\n useLive(alias, scope);\n const rowsKey = dataKeys.rows(portKey, alias, query);\n const q = useInfiniteQuery(\n {\n queryKey: rowsKey,\n queryFn: async ({ pageParam }) => unwrap(await port.list(alias, query, pageParam ?? undefined)),\n initialPageParam: null as string | null,\n getNextPageParam: (last: Page) => last.cursor ?? undefined,\n retry: retryable,\n ...(seed ? { initialData: { pages: [seed.data], pageParams: [null as string | null] }, initialDataUpdatedAt: seed.at } : {}),\n },\n qc,\n );\n const rows = useMemo(() => {\n const seen = new Set<Uuid>();\n const out: Row[] = [];\n for (const page of q.data?.pages ?? []) {\n for (const row of page.rows) {\n // A row an optimistic create drew AND the store's page now holds is one row, drawn once.\n if (seen.has(row._id)) continue;\n seen.add(row._id);\n out.push(row);\n }\n }\n return out;\n }, [q.data]);\n // A PAGE ASKED FOR IS A PAGE OWED. A re-read the engine starts (a colleague moved a row this list cannot place)\n // or an optimistic write's cancel ends a next-page read that is in flight, silently — independent check,\n // 2026-10-06: paging sorted by name stalled on page 1 for 20 s. So `loadMore` records how many pages it wants,\n // and whenever the list is idle and short of that, the page is asked for again.\n const want = useRef<{ key: string; pages: number }>({ key: \"\", pages: 0 });\n const keyHash = hashKey(rowsKey);\n const loaded = q.data?.pages.length ?? 0;\n const { isFetching, hasNextPage, isFetchNextPageError, fetchNextPage } = q;\n useEffect(() => {\n const w = want.current;\n if (w.key !== keyHash || isFetching || loaded >= w.pages) return;\n if (!hasNextPage || isFetchNextPageError) {\n want.current = { key: keyHash, pages: 0 };\n owedPages(qc).delete(keyHash);\n return;\n }\n void fetchNextPage({ cancelRefetch: false });\n }, [qc, keyHash, isFetching, loaded, hasNextPage, isFetchNextPageError, fetchNextPage]);\n return {\n rows,\n total: q.data?.pages[0]?.total ?? null,\n loading: q.isPending,\n loadingMore: q.isFetchingNextPage,\n hasMore: Boolean(q.hasNextPage),\n error: asRecordsError(q.error),\n loadMore: () => {\n if (!q.hasNextPage || q.isFetchingNextPage) return;\n want.current = { key: keyHash, pages: loaded + 1 };\n owedPages(qc).set(keyHash, { pages: loaded + 1, fetchNext: () => void q.fetchNextPage({ cancelRefetch: false }) });\n // A re-read in flight is let finish; the effect above asks for the page the moment it lands.\n if (!q.isFetching) void q.fetchNextPage({ cancelRefetch: false });\n },\n newer: (q.data as RowsDataWithNewer | undefined)?.newer ?? 0,\n refresh: () => void q.refetch(),\n };\n}\n\nexport function useDataRow(alias: string, id: Uuid | null, scope?: DataScope): DataRead<Row | null> {\n const { port, portKey } = useDataPort(scope);\n const qc = useRecordsQueryClient();\n useLive(id ? alias : null, scope);\n const q = useQuery({\n queryKey: dataKeys.row(portKey, alias, id ?? \"-\"),\n queryFn: async () => unwrap(await port.get(alias, id!)),\n enabled: Boolean(id),\n retry: retryable,\n // A row a loaded page already holds is drawn at once; the read confirms it.\n placeholderData: () => (id ? (findRow(qc, portKey, alias, id) ?? undefined) : undefined),\n }, qc);\n return { data: id ? q.data : null, loading: Boolean(id) && q.isPending, error: asRecordsError(q.error), refresh: () => void q.refetch() };\n}\n\n// ── writes: optimistic, rolled back with the store's sentence, answered with a receipt ─────────\n\nexport interface DataMutations {\n /** Drawn at once (marked `_pending`), replaced by the stored row; removed with the store's sentence on refusal. */\n create(values: Values): Promise<RecordsResult<Row>>;\n /** Sends the drawn row's `_version` as baseVersion (or `options.baseVersion`). A stale write is refused and the row re-read. */\n update(id: Uuid, patch: Values, options?: { baseVersion?: number }): Promise<RecordsResult<Row>>;\n archive(id: Uuid): Promise<RecordsResult<void>>;\n restore(id: Uuid): Promise<RecordsResult<void>>;\n}\n\nlet tempCounter = 0;\n\n/**\n * The row as an optimistic update draws it: the patch over the row, with `_custom` MERGED (a patch naming one\n * custom field never blanks the others), and the runtime's own keys kept as they were.\n */\nexport function drawPatch(before: Row, patch: Values): Row {\n const drawn: Row = { ...before, ...patch, _id: before._id, _version: before._version, _organization_id: before._organization_id };\n if (patch._custom && typeof patch._custom === \"object\") {\n drawn._custom = { ...(before._custom ?? {}), ...patch._custom };\n } else if (before._custom !== undefined) {\n drawn._custom = before._custom;\n }\n return drawn;\n}\n\nexport function useDataMutations(alias: string, scope?: DataScope): DataMutations {\n const qc = useRecordsQueryClient();\n const { port, portKey } = useDataPort(scope);\n\n return useMemo<DataMutations>(() => {\n const snapshotRows = () => qc.getQueriesData<RowsData>({ queryKey: dataKeys.rowsPrefix(portKey, alias) });\n const putBack = (snap: ReturnType<typeof snapshotRows>) => {\n for (const [key, data] of snap) qc.setQueryData(key, data);\n };\n\n return {\n async create(values) {\n const tempId = `pending-${Date.now().toString(36)}-${(tempCounter += 1)}`;\n const drawn: Row = { ...values, _id: tempId, _version: 0, _organization_id: \"\", _pending: true };\n await qc.cancelQueries({ queryKey: dataKeys.rowsPrefix(portKey, alias) });\n forEachRowsEntry(qc, portKey, alias, (_key, data) => {\n if (data.pages.length === 0) return data;\n const [first, ...rest] = data.pages;\n return { ...data, pages: [{ ...first!, rows: [drawn, ...first!.rows], total: first!.total === null ? null : first!.total + 1 }, ...rest] };\n });\n const answer = await port.create(alias, values);\n forEachRowsEntry(qc, portKey, alias, (_key, data) => {\n const pages = data.pages.map((page) => {\n if (!page.rows.some((r) => r._id === tempId)) return page;\n const rows = answer.ok\n ? page.rows.map((r) => (r._id === tempId ? answer.data : r))\n : page.rows.filter((r) => r._id !== tempId);\n return { ...page, rows, total: answer.ok || page.total === null ? page.total : Math.max(0, page.total - 1) };\n });\n return { ...data, pages };\n });\n if (answer.ok) qc.setQueryData(dataKeys.row(portKey, alias, answer.data._id), answer.data);\n return answer;\n },\n\n async update(id, patch, options = {}) {\n const before = findRow(qc, portKey, alias, id);\n const baseVersion = options.baseVersion ?? before?._version;\n if (typeof baseVersion !== \"number\") {\n return { ok: false, error: { code: \"stale_read\", message: \"Nothing was saved: this row's version is not known here.\", hint: \"Read the row first, then change it.\" } };\n }\n await qc.cancelQueries({ queryKey: dataKeys.alias(portKey, alias) });\n const rowKey = dataKeys.row(portKey, alias, id);\n const rowBefore = qc.getQueryData<Row | null>(rowKey);\n if (before) patchRow(qc, portKey, alias, drawPatch(before, patch), { force: true });\n const answer = await port.update(alias, id, patch, baseVersion);\n if (answer.ok) {\n patchRow(qc, portKey, alias, answer.data, { force: true, fromStore: true });\n return answer;\n }\n // ROLLBACK: this row goes back to what was drawn before (only the entries that held it), then the\n // store's current row is read so a stale write shows what actually won.\n if (before) patchRow(qc, portKey, alias, before, { force: true });\n qc.setQueryData(rowKey, rowBefore);\n void rereadIds(qc, port, portKey, alias, [id]);\n return answer;\n },\n\n async archive(id) {\n await qc.cancelQueries({ queryKey: dataKeys.rowsPrefix(portKey, alias) });\n const snap = snapshotRows();\n const rowKey = dataKeys.row(portKey, alias, id);\n const rowBefore = qc.getQueryData<Row | null>(rowKey);\n dropRow(qc, portKey, alias, id);\n const answer = await port.archive(alias, id);\n if (!answer.ok) {\n putBack(snap);\n qc.setQueryData(rowKey, rowBefore);\n // Anything another person changed while the archive was in flight is read again.\n void qc.invalidateQueries({ queryKey: dataKeys.rowsPrefix(portKey, alias) });\n }\n return answer;\n },\n\n async restore(id) {\n const answer = await port.restore(alias, id);\n if (answer.ok) {\n void qc.invalidateQueries({ queryKey: dataKeys.rowsPrefix(portKey, alias) });\n void qc.invalidateQueries({ queryKey: dataKeys.row(portKey, alias, id) });\n }\n return answer;\n },\n };\n }, [qc, port, portKey, alias]);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/data/react.tsx"],"sourcesContent":["\"use client\";\n\n// src/data/react.tsx — @ai-matrx/records/data/react\n//\n// THE FRAME-SIDE DATA LAYER (Applets CONTRACTS v2 §4): the hooks an Applet's code reads through, so the\n// agent writing the Applet never thinks about state. Arman, 2026-10-06: \"making requests once, we're\n// doing optimistic updates, things are done correctly and easily.\"\n//\n// THE ENGINE IS TANSTACK QUERY, and the QueryClient lives in the frame (the host passes one, or the\n// frame mounts its own provider above this). On top of it this layer owns:\n//\n// · RECORDS-OWNED KEYS — `[\"@ai-matrx/records\", \"data\", portKey, alias, …]`. Two mounted Applets (two\n// ports) never share an entry; one alias's columns, pages and rows share one prefix, so a shape\n// change or a reconnect invalidates exactly that alias.\n// · ONE REQUEST PER KEY — every reader of the same question shares one entry and one in-flight call.\n// · KEYSET PAGES — `useDataRows` is an infinite query over the port's cursor; `loadMore` asks for the\n// page after the last row, so a write landing mid-read never skips or repeats a row.\n// · OPTIMISTIC WRITES WITH ROLLBACK AND RECEIPTS — the change is drawn at once; the store's answer (the\n// re-read row with its new `_version`) replaces it; a refusal puts the row back and answers the\n// store's own sentence. Every update sends the `_version` the person saw as `baseVersion`.\n// · LIVE — one subscription per (port, alias), ref-counted across every hook reading the alias, held a\n// grace after the last one lets go. A bump names ids; only those ids are re-read, and each page\n// holding one is patched in place. An id no loaded page holds (a row someone just made) refreshes\n// the alias's pages; `null` (a reconnect) or a shape change refreshes everything for the alias.\n\nimport { createContext, createElement, useContext, useEffect, useMemo, useRef, type ReactNode } from \"react\";\nimport {\n QueryClient as QueryClientClass,\n QueryClientContext,\n QueryClientProvider,\n hashKey,\n useInfiniteQuery,\n useQuery,\n type InfiniteData,\n type QueryClient,\n type QueryKey,\n} from \"@tanstack/react-query\";\n\nimport type { RecordsError, RecordsResult } from \"../results\";\nimport type { Column, DataEvents, DataPort, DataSource, Page, Query, Row, RowsEvent, Uuid, Values } from \"./types\";\n\nexport const RECORDS_QUERY_ROOT = \"@ai-matrx/records\";\n/** How long a live subscription outlives the last hook reading its alias (a remount costs nothing). */\nexport const DATA_LIVE_GRACE_MS = 30_000;\n/** Bumps landing this close together are re-read in one batch. */\nconst BUMP_BATCH_MS = 40;\n\n// ── keys ──────────────────────────────────────────────────────────────────────────────────────\n\nexport const dataKeys = {\n all: (portKey: string) => [RECORDS_QUERY_ROOT, \"data\", portKey] as const,\n sources: (portKey: string) => [RECORDS_QUERY_ROOT, \"data\", portKey, \"sources\"] as const,\n alias: (portKey: string, alias: string) => [RECORDS_QUERY_ROOT, \"data\", portKey, \"alias\", alias] as const,\n columns: (portKey: string, alias: string) => [...dataKeys.alias(portKey, alias), \"columns\"] as const,\n rowsPrefix: (portKey: string, alias: string) => [...dataKeys.alias(portKey, alias), \"rows\"] as const,\n rows: (portKey: string, alias: string, query: Query) => [...dataKeys.rowsPrefix(portKey, alias), stableQuery(query)] as const,\n row: (portKey: string, alias: string, id: Uuid) => [...dataKeys.alias(portKey, alias), \"row\", id] as const,\n};\n\n/** A query's identity: the same question asked with its keys in another order is the same entry. */\nfunction stableQuery(query: Query): string {\n const sortKeys = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.keys(value as object)\n .sort()\n .filter((k) => (value as Record<string, unknown>)[k] !== undefined)\n .map((k) => [k, sortKeys((value as Record<string, unknown>)[k])]),\n );\n }\n return value;\n };\n return JSON.stringify(sortKeys(query ?? {}));\n}\n\n// ── refusals as thrown values (TanStack's error channel) ───────────────────────────────────────\n\n/** A store refusal carried through the query engine; hooks hand back `.error`, never the wrapper. */\nexport class DataRefusal extends Error {\n readonly error: RecordsError;\n constructor(error: RecordsError) {\n super(error.message);\n this.name = \"DataRefusal\";\n this.error = error;\n }\n}\n\nfunction unwrap<T>(answer: RecordsResult<T>): T {\n if (answer.ok) return answer.data;\n throw new DataRefusal(answer.error);\n}\n\nfunction asRecordsError(thrown: unknown): RecordsError | null {\n if (!thrown) return null;\n if (thrown instanceof DataRefusal) return thrown.error;\n return { code: \"unreachable\", message: `The data could not be reached: ${thrown instanceof Error ? thrown.message : String(thrown)}` };\n}\n\n/** Only a refusal that a second try could change is retried; a store sentence is final. */\nfunction retryable(failureCount: number, thrown: unknown): boolean {\n const code = thrown instanceof DataRefusal ? thrown.error.code : \"unreachable\";\n return (code === \"unreachable\" || code === \"timed_out\") && failureCount < 2;\n}\n\n// ── the port in context ───────────────────────────────────────────────────────────────────────\n\ninterface PortContext {\n port: DataPort;\n portKey: string;\n /** The `rows:<alias>` streams. Absent: not live, and the console says so once. */\n events?: DataEvents;\n}\n\nconst DataPortContext = createContext<PortContext | null>(null);\n\nexport interface DataPortProviderProps {\n port: DataPort;\n /** The frame's event streams (`host.events`); a host-side mount passes `hostEvents(port)`. */\n events?: DataEvents;\n /** Unique per mounted Applet (its instance id): two ports never share a cache entry. */\n portKey: string;\n /** The frame's QueryClient. Left out, the nearest `QueryClientProvider` above is used. */\n queryClient?: QueryClient;\n children?: ReactNode;\n}\n\nexport function DataPortProvider({ port, events, portKey, queryClient, children }: DataPortProviderProps) {\n const value = useMemo(() => ({ port, portKey, ...(events ? { events } : {}) }), [port, events, portKey]);\n const inner = createElement(DataPortContext.Provider, { value }, children);\n return queryClient ? createElement(QueryClientProvider, { client: queryClient }, inner) : inner;\n}\n\n/** A host hook that owns its own port (no provider above it) passes it explicitly. */\nexport interface DataScope {\n port: DataPort;\n portKey: string;\n events?: DataEvents;\n}\n\n/** A host-side mount (no frame between): the host port's own producer, as the frame's event streams. */\nexport function hostEvents(port: { subscribe: DataEvents[\"on\"] }): DataEvents {\n return { on: (event, listener) => port.subscribe(event, listener) };\n}\n\nlet warnedNotLive = false;\n\nexport function useDataPort(scope?: DataScope): PortContext {\n const held = useContext(DataPortContext);\n if (scope) return scope;\n if (!held) {\n throw new Error(\n \"A data hook was called outside <DataPortProvider>. The frame mounts it once with the host's DataPort and this Applet's portKey.\",\n );\n }\n return held;\n}\n\n// ── the cache: reading and patching every entry that holds a row ──────────────────────────────\n\ntype RowsData = InfiniteData<Page, string | null>;\n\n/**\n * A list of the ARCHIVE (`archived: true`). It holds the rows that LEFT, so nothing that patches, drops or places\n * live rows ever touches it: it is read again whenever its alias moves (`rereadArchives`).\n */\nfunction isArchiveKey(key: QueryKey): boolean {\n try {\n return (JSON.parse(String(key[key.length - 1])) as Query).archived === true;\n } catch {\n return false;\n }\n}\n\n/** Every archive list of an alias, read again (an archive or a restore moved rows in or out of it). */\nfunction rereadArchives(qc: QueryClient, portKey: string, alias: string): void {\n void qc.invalidateQueries({ queryKey: dataKeys.rowsPrefix(portKey, alias), predicate: (query) => isArchiveKey(query.queryKey) });\n}\n\nfunction forEachRowsEntry(qc: QueryClient, portKey: string, alias: string, fn: (key: QueryKey, data: RowsData) => RowsData | undefined) {\n for (const [key, data] of qc.getQueriesData<RowsData>({ queryKey: dataKeys.rowsPrefix(portKey, alias) })) {\n if (!data || isArchiveKey(key)) continue;\n const next = fn(key, data);\n if (next && next !== data) qc.setQueryData(key, next);\n }\n}\n\n// ── what the store has said lately, kept until every in-flight page read has seen it ──────────\n//\n// A next-page read (`loadMore`) is built from the pages as they were when it STARTED; when it lands it writes\n// those pages back with the new one appended. A re-read that patched a row while it was in flight was silently\n// undone — independent acceptance, 2026-10-06: 15 of 45 colleague edits made during paging stayed stale. So every\n// row the STORE answered (a live re-read, a write's receipt) and every row it dropped is remembered briefly, and\n// whenever a page read for that alias lands, anything it brought back older is put right again. Optimistic drafts\n// are never remembered: only the store's own answers.\n\n/** How long the store's answer is re-applied after it lands — longer than any page read. */\nconst LANDED_MS = 30_000;\n\ninterface Landed {\n row: Row | null;\n at: number;\n}\n\nconst LANDED_KEY = Symbol.for(\"@ai-matrx/records/data-landed\");\n\ninterface LandedHome {\n byAlias: Map<string, Map<Uuid, Landed>>;\n unsubscribe: () => void;\n}\n\nfunction landedHome(qc: QueryClient): LandedHome {\n const holder = qc as unknown as Record<symbol, LandedHome | undefined>;\n let home = holder[LANDED_KEY];\n if (!home) {\n const made: LandedHome = { byAlias: new Map(), unsubscribe: () => {} };\n made.unsubscribe = qc.getQueryCache().subscribe((event) => {\n if (event.type !== \"updated\" || event.action.type !== \"success\") return;\n const key = event.query.queryKey as readonly unknown[];\n // [\"@ai-matrx/records\", \"data\", portKey, \"alias\", alias, \"rows\", query]\n if (key[0] !== RECORDS_QUERY_ROOT || key[1] !== \"data\" || key[3] !== \"alias\" || key[5] !== \"rows\" || isArchiveKey(key)) return;\n const portKey = String(key[2]);\n const alias = String(key[4]);\n const landed = made.byAlias.get(`${portKey}\\u0001${alias}`);\n if (!landed || landed.size === 0) return;\n reapplyLanded(qc, event.query.queryKey, landed);\n });\n holder[LANDED_KEY] = made;\n home = made;\n }\n return home;\n}\n\nfunction remember(qc: QueryClient, portKey: string, alias: string, id: Uuid, row: Row | null): void {\n const home = landedHome(qc);\n const key = `${portKey}\\u0001${alias}`;\n let landed = home.byAlias.get(key);\n if (!landed) home.byAlias.set(key, (landed = new Map()));\n const now = Date.now();\n for (const [oldId, entry] of landed) if (now - entry.at > LANDED_MS) landed.delete(oldId);\n landed.set(id, { row, at: now });\n}\n\n/** Put back every remembered answer a just-landed page read brought back older (or brought back at all, if dropped). */\nfunction reapplyLanded(qc: QueryClient, key: QueryKey, landed: Map<Uuid, Landed>): void {\n const data = qc.getQueryData<RowsData>(key);\n if (!data) return;\n const now = Date.now();\n let changed = false;\n const pages = data.pages.map((page) => {\n let rows: Row[] | null = null;\n page.rows.forEach((r, i) => {\n const entry = landed.get(r._id);\n if (!entry || now - entry.at > LANDED_MS) return;\n if (entry.row === null) {\n rows ??= page.rows.slice();\n rows[i] = null as unknown as Row;\n } else if (entry.row._version > r._version) {\n rows ??= page.rows.slice();\n rows[i] = entry.row;\n }\n });\n if (!rows) return page;\n changed = true;\n return { ...page, rows: (rows as Row[]).filter((r) => r !== null) };\n });\n // Only when something changed — the write below is itself a \"success\" event, and this must settle.\n if (changed) qc.setQueryData(key, { ...data, pages });\n}\n\n/** Replace one row wherever a page holds it (never with an OLDER version than the one drawn). Answers whether any page held it. */\nfunction patchRow(qc: QueryClient, portKey: string, alias: string, row: Row, options: { force?: boolean; fromStore?: boolean } = {}): boolean {\n if (options.fromStore) remember(qc, portKey, alias, row._id, row);\n let held = false;\n forEachRowsEntry(qc, portKey, alias, (_key, data) => {\n let changed = false;\n const pages = data.pages.map((page) => {\n const i = page.rows.findIndex((r) => r._id === row._id);\n if (i < 0) return page;\n held = true;\n if (!options.force && page.rows[i]!._version > row._version) return page;\n changed = true;\n const rows = page.rows.slice();\n rows[i] = row;\n return { ...page, rows };\n });\n return changed ? { ...data, pages } : data;\n });\n const rowKey = dataKeys.row(portKey, alias, row._id);\n const current = qc.getQueryData<Row | null>(rowKey);\n if (options.force || !current || current._version <= row._version) qc.setQueryData(rowKey, row);\n return held;\n}\n\n/** Take a row out of every page (it was archived, or the reader may no longer see it). */\nfunction dropRow(qc: QueryClient, portKey: string, alias: string, id: Uuid, options: { fromStore?: boolean } = {}): void {\n if (options.fromStore) remember(qc, portKey, alias, id, null);\n forEachRowsEntry(qc, portKey, alias, (_key, data) => {\n let changed = false;\n const pages = data.pages.map((page) => {\n if (!page.rows.some((r) => r._id === id)) return page;\n changed = true;\n return { ...page, rows: page.rows.filter((r) => r._id !== id), total: page.total === null ? null : Math.max(0, page.total - 1) };\n });\n return changed ? { ...data, pages } : data;\n });\n qc.setQueryData(dataKeys.row(portKey, alias, id), null);\n}\n\nfunction findRow(qc: QueryClient, portKey: string, alias: string, id: Uuid): Row | null {\n const direct = qc.getQueryData<Row | null>(dataKeys.row(portKey, alias, id));\n if (direct) return direct;\n for (const [, data] of qc.getQueriesData<RowsData>({ queryKey: dataKeys.rowsPrefix(portKey, alias) })) {\n for (const page of data?.pages ?? []) {\n const hit = page.rows.find((r) => r._id === id);\n if (hit) return hit;\n }\n }\n return null;\n}\n\n// ── live: one subscription per (QueryClient, port, alias), ref-counted ────────────────────────\n\ninterface LiveEntry {\n refs: number;\n stop: () => void;\n timer: ReturnType<typeof setTimeout> | null;\n pending: Set<Uuid>;\n /** A notice in this batch could not name its rows. */\n unknown: boolean;\n flush: ReturnType<typeof setTimeout> | null;\n}\n\nconst LIVE_KEY = Symbol.for(\"@ai-matrx/records/data-live\");\n\nfunction liveHome(qc: QueryClient): Map<string, LiveEntry> {\n const holder = qc as unknown as Record<symbol, Map<string, LiveEntry> | undefined>;\n let home = holder[LIVE_KEY];\n if (!home) {\n home = new Map();\n holder[LIVE_KEY] = home;\n }\n return home;\n}\n\n/** Re-read exactly these ids and put each where it belongs. */\n/** A list whose order is the door's own (newest first) and which asks nothing of the rows: a new row's place is the top. */\nfunction isPlainNewestFirst(key: QueryKey): boolean {\n try {\n const q = JSON.parse(String(key[key.length - 1])) as Query;\n return !(q.where && q.where.length) && !q.search?.trim() && !(q.sort && q.sort.length);\n } catch {\n return false;\n }\n}\n\n/** A list this many pages deep keeps its pages when rows arrive that it cannot place; it counts them instead. */\nconst REREAD_PAGES_MAX = 2;\n\n/** The rows a list was told about but could not place; `refresh()` reads them in. */\ntype RowsDataWithNewer = RowsData & { newer?: number };\n\n/**\n * Rows no loaded page holds — new to this reader, or newly matching. WHERE they go is the store's to say:\n * · a plain newest-first list puts them at the top (the door's own order);\n * · a list of a page or two is read again (cheap, and exact);\n * · a deeper list is NEVER re-read wholesale (that re-read every loaded page on every bump: page 40 of\n * a 25,000-row table took 6 s, verifier 2026-10-06) — it counts them in `newer` for the screen to offer.\n */\n/**\n * What kind of source an alias is — read once through the same cached `sources()` entry every reader shares.\n * Only a custom TABLE's re-read rows are known to belong to its plain list: its read door answers live rows\n * only, in the door's newest-first order. A platform source's `get` can answer an archived row, or one its\n * list hides by default (a \"discovered\" contact), so its rows are never placed by the engine — the list is\n * asked again (short) or told how many are new (deep). Unknown (the read refused) is treated as \"not a table\".\n */\nasync function sourceKind(qc: QueryClient, port: DataPort, portKey: string, alias: string): Promise<DataSource[\"kind\"] | null> {\n try {\n const sources = await qc.ensureQueryData({ queryKey: dataKeys.sources(portKey), queryFn: async () => unwrap(await port.sources()) });\n return sources.find((s) => s.alias === alias)?.kind ?? null;\n } catch {\n return null;\n }\n}\n\nconst DEFERRED_KEY = Symbol.for(\"@ai-matrx/records/data-deferred-rereads\");\nconst OWED_KEY = Symbol.for(\"@ai-matrx/records/data-owed-pages\");\n\n/** Pages a `loadMore` asked for and has not yet received, by list — they go before any waiting re-read. */\ninterface OwedPage {\n pages: number;\n fetchNext: () => void;\n}\n\nfunction owedPages(qc: QueryClient): Map<string, OwedPage> {\n const holder = qc as unknown as Record<symbol, Map<string, OwedPage> | undefined>;\n return (holder[OWED_KEY] ??= new Map());\n}\n\n/** The page a list still owes, if any — and the list can still deliver it. */\nfunction owedPage(qc: QueryClient, hash: string): OwedPage | null {\n const owed = owedPages(qc).get(hash);\n if (!owed) return null;\n const query = qc.getQueryCache().get(hash);\n const data = query?.state.data as RowsData | undefined;\n const last = data?.pages[data.pages.length - 1];\n if (!query || query.state.status === \"error\" || !data || data.pages.length >= owed.pages || !last?.cursor) {\n owedPages(qc).delete(hash);\n return null;\n }\n return owed;\n}\n\n/**\n * Re-read one list — but NEVER over a read already in flight. Interrupting it cancels a page `loadMore` asked\n * for, and notices arriving faster than a page reads would starve paging forever (independent check, 2026-10-06).\n * A re-read asked for meanwhile waits, and however many were asked, one runs the moment the list is idle.\n */\nfunction rereadList(qc: QueryClient, key: QueryKey): void {\n const query = qc.getQueryCache().find({ queryKey: key, exact: true });\n if (!query || (query.state.fetchStatus !== \"fetching\" && !owedPage(qc, query.queryHash))) {\n void qc.invalidateQueries({ queryKey: key, exact: true });\n return;\n }\n const holder = qc as unknown as Record<symbol, Set<string> | undefined>;\n const waiting = (holder[DEFERRED_KEY] ??= new Set());\n if (waiting.has(query.queryHash)) return;\n waiting.add(query.queryHash);\n const settle = () => {\n if (query.state.fetchStatus === \"fetching\") return;\n // A page asked for goes first; the re-read waits until it has landed.\n const owed = owedPage(qc, query.queryHash);\n if (owed) {\n owed.fetchNext();\n return;\n }\n stop();\n waiting.delete(query.queryHash);\n void qc.invalidateQueries({ queryKey: key, exact: true });\n };\n const stop = qc.getQueryCache().subscribe((event) => {\n if (event.query === query) settle();\n });\n settle();\n}\n\n/** A list that cannot place what moved: one exact re-read while it is short, a `newer` count once it is deep. */\nfunction rereadOrCount(qc: QueryClient, key: QueryKey, data: RowsDataWithNewer, count: number): void {\n if (data.pages.length <= REREAD_PAGES_MAX) rereadList(qc, key);\n else qc.setQueryData<RowsDataWithNewer>(key, { ...data, newer: (data.newer ?? 0) + count });\n}\n\nfunction placeUnseen(qc: QueryClient, portKey: string, alias: string, rows: Row[], kind: DataSource[\"kind\"] | null): void {\n for (const [key, data] of qc.getQueriesData<RowsDataWithNewer>({ queryKey: dataKeys.rowsPrefix(portKey, alias) })) {\n if (!data || data.pages.length === 0 || isArchiveKey(key)) continue;\n const missing = rows.filter((row) => !data.pages.some((page) => page.rows.some((r) => r._id === row._id)));\n if (missing.length === 0) continue;\n if (kind === \"table\" && isPlainNewestFirst(key)) {\n const [first, ...rest] = data.pages;\n qc.setQueryData<RowsDataWithNewer>(key, {\n ...data,\n pages: [{ ...first!, rows: [...missing, ...first!.rows], total: first!.total === null ? null : first!.total + missing.length }, ...rest],\n });\n } else {\n rereadOrCount(qc, key, data, missing.length);\n }\n }\n}\n\nasync function rereadIds(qc: QueryClient, port: DataPort, portKey: string, alias: string, ids: Uuid[]): Promise<void> {\n const answers = await Promise.all(ids.map((id) => port.get(alias, id).then((a) => [id, a] as const)));\n const unseen: Row[] = [];\n for (const [id, answer] of answers) {\n if (!answer.ok) continue; // a re-read that failed leaves the drawn row as it was; the next bump or read corrects it\n if (answer.data === null) {\n dropRow(qc, portKey, alias, id, { fromStore: true });\n } else if (!patchRow(qc, portKey, alias, answer.data, { fromStore: true })) {\n unseen.push(answer.data);\n }\n }\n if (unseen.length > 0) placeUnseen(qc, portKey, alias, unseen, await sourceKind(qc, port, portKey, alias));\n}\n\n/**\n * \"Something moved and I cannot say which\" (a reconnect, a wake, more ids than a notice lists). Never a re-read of\n * every loaded page: each list gets one exact re-read while short, or a `newer` mark once deep; each open row is\n * read again (one cheap read per row a view is showing).\n */\nfunction rereadUnknown(qc: QueryClient, portKey: string, alias: string): void {\n for (const [key, data] of qc.getQueriesData<RowsDataWithNewer>({ queryKey: dataKeys.rowsPrefix(portKey, alias) })) {\n if (!data || data.pages.length === 0) {\n rereadList(qc, key);\n continue;\n }\n if (data.pages.length <= REREAD_PAGES_MAX) rereadList(qc, key);\n else qc.setQueryData<RowsDataWithNewer>(key, { ...data, newer: Math.max(data.newer ?? 0, 1) });\n }\n void qc.invalidateQueries({ queryKey: [...dataKeys.alias(portKey, alias), \"row\"] });\n}\n\nfunction onBump(qc: QueryClient, port: DataPort, portKey: string, alias: string, entry: LiveEntry, event: RowsEvent): void {\n if (event.shape) {\n void qc.invalidateQueries({ queryKey: dataKeys.alias(portKey, alias) });\n return;\n }\n // Batched like any other notice: a burst of \"cannot say which\" is one bounded re-read, not one per notice.\n if (event.ids === null) entry.unknown = true;\n else for (const id of event.ids) entry.pending.add(id);\n if (entry.flush) return;\n entry.flush = setTimeout(() => {\n entry.flush = null;\n const ids = [...entry.pending];\n const unknown = entry.unknown;\n entry.pending.clear();\n entry.unknown = false;\n if (unknown) rereadUnknown(qc, portKey, alias);\n else if (ids.length > 0) void rereadIds(qc, port, portKey, alias, ids);\n // A row that moved may have been archived or restored by someone else: the archive is read again too.\n if (unknown || ids.length > 0) rereadArchives(qc, portKey, alias);\n }, BUMP_BATCH_MS);\n}\n\nfunction acquireLive(qc: QueryClient, port: DataPort, events: DataEvents | undefined, portKey: string, alias: string): () => void {\n const home = liveHome(qc);\n const key = `${portKey}\\u0001${alias}`;\n let entry = home.get(key);\n if (!entry) {\n const made: LiveEntry = { refs: 0, stop: () => {}, timer: null, pending: new Set(), unknown: false, flush: null };\n if (events) {\n made.stop = events.on(`rows:${alias}`, (event) => onBump(qc, port, portKey, alias, made, event));\n } else if (!warnedNotLive) {\n // NOT LIVE, SAID OUT LOUD: with no event stream other people's changes appear only on a re-read.\n warnedNotLive = true;\n console.warn(\"[@ai-matrx/records/data/react] No event stream was given to DataPortProvider, so this view is not live.\");\n }\n home.set(key, made);\n entry = made;\n }\n const mine = entry;\n mine.refs += 1;\n if (mine.timer) {\n clearTimeout(mine.timer);\n mine.timer = null;\n }\n return () => {\n mine.refs -= 1;\n if (mine.refs > 0) return;\n mine.timer = setTimeout(() => {\n if (mine.refs > 0) return;\n if (mine.flush) clearTimeout(mine.flush);\n mine.stop();\n if (home.get(key) === mine) home.delete(key);\n }, DATA_LIVE_GRACE_MS);\n };\n}\n\nconst FALLBACK_KEY = Symbol.for(\"@ai-matrx/records/data-query-client\");\n\n/**\n * The frame's QueryClient — the nearest provider's. A host with none (a plain page using a records hook)\n * gets ONE shared client for the page, held on globalThis so a dual-loaded graph still shares it.\n */\nexport function useRecordsQueryClient(): QueryClient {\n const provided = useContext(QueryClientContext);\n if (provided) return provided;\n const g = globalThis as unknown as Record<symbol, QueryClient | undefined>;\n let held = g[FALLBACK_KEY];\n if (!held) {\n held = new QueryClientClass({ defaultOptions: { queries: { staleTime: 30_000, refetchOnWindowFocus: false } } });\n g[FALLBACK_KEY] = held;\n }\n return held;\n}\n\nfunction useLive(alias: string | null, scope?: DataScope): void {\n const qc = useRecordsQueryClient();\n const { port, portKey, events } = useDataPort(scope);\n useEffect(() => {\n if (!alias) return;\n return acquireLive(qc, port, events, portKey, alias);\n }, [qc, port, events, portKey, alias]);\n}\n\n// ── reads ─────────────────────────────────────────────────────────────────────────────────────\n\nexport interface DataRead<T> {\n data: T | undefined;\n loading: boolean;\n /** The store's own sentence when the read was refused. */\n error: RecordsError | null;\n refresh: () => void;\n}\n\nexport function useDataSources(scope?: DataScope): DataRead<DataSource[]> {\n const { port, portKey } = useDataPort(scope);\n const qc = useRecordsQueryClient();\n const q = useQuery({ queryKey: dataKeys.sources(portKey), queryFn: async () => unwrap(await port.sources()), retry: retryable }, qc);\n return { data: q.data, loading: q.isPending, error: asRecordsError(q.error), refresh: () => void q.refetch() };\n}\n\n/** A server's answer to start from (lane SEED-ENTITY): drawn on the first frame, re-read once it is older than the cache's stale time. */\nexport interface DataSeed<T> {\n data: T;\n /** Epoch ms the server asked. */\n at: number;\n}\n\nexport function useDataColumns(alias: string, scope?: DataScope, seed?: DataSeed<Column[]> | undefined): DataRead<Column[]> {\n const { port, portKey } = useDataPort(scope);\n const qc = useRecordsQueryClient();\n useLive(alias, scope);\n const q = useQuery(\n {\n queryKey: dataKeys.columns(portKey, alias),\n queryFn: async () => unwrap(await port.columns(alias)),\n retry: retryable,\n ...(seed ? { initialData: seed.data, initialDataUpdatedAt: seed.at } : {}),\n },\n qc,\n );\n return { data: q.data, loading: q.isPending, error: asRecordsError(q.error), refresh: () => void q.refetch() };\n}\n\nexport interface DataRows {\n rows: Row[];\n total: number | null;\n loading: boolean;\n /** A next page is being read. */\n loadingMore: boolean;\n hasMore: boolean;\n error: RecordsError | null;\n /** Read the page after the last row (keyset): never skips or repeats a row, whatever is written meanwhile. */\n loadMore: () => void;\n /** Rows written by others that belong somewhere in this (deep, filtered or sorted) list; `refresh()` reads them in. */\n newer: number;\n refresh: () => void;\n}\n\nexport function useDataRows(alias: string, query: Query = {}, scope?: DataScope, seed?: DataSeed<Page> | undefined): DataRows {\n const { port, portKey } = useDataPort(scope);\n const qc = useRecordsQueryClient();\n useLive(alias, scope);\n const rowsKey = dataKeys.rows(portKey, alias, query);\n const q = useInfiniteQuery(\n {\n queryKey: rowsKey,\n queryFn: async ({ pageParam }) => unwrap(await port.list(alias, query, pageParam ?? undefined)),\n initialPageParam: null as string | null,\n getNextPageParam: (last: Page) => last.cursor ?? undefined,\n retry: retryable,\n ...(seed ? { initialData: { pages: [seed.data], pageParams: [null as string | null] }, initialDataUpdatedAt: seed.at } : {}),\n },\n qc,\n );\n const rows = useMemo(() => {\n const seen = new Set<Uuid>();\n const out: Row[] = [];\n for (const page of q.data?.pages ?? []) {\n for (const row of page.rows) {\n // A row an optimistic create drew AND the store's page now holds is one row, drawn once.\n if (seen.has(row._id)) continue;\n seen.add(row._id);\n out.push(row);\n }\n }\n return out;\n }, [q.data]);\n // A PAGE ASKED FOR IS A PAGE OWED. A re-read the engine starts (a colleague moved a row this list cannot place)\n // or an optimistic write's cancel ends a next-page read that is in flight, silently — independent check,\n // 2026-10-06: paging sorted by name stalled on page 1 for 20 s. So `loadMore` records how many pages it wants,\n // and whenever the list is idle and short of that, the page is asked for again.\n const want = useRef<{ key: string; pages: number }>({ key: \"\", pages: 0 });\n const keyHash = hashKey(rowsKey);\n const loaded = q.data?.pages.length ?? 0;\n const { isFetching, hasNextPage, isFetchNextPageError, fetchNextPage } = q;\n useEffect(() => {\n const w = want.current;\n if (w.key !== keyHash || isFetching || loaded >= w.pages) return;\n if (!hasNextPage || isFetchNextPageError) {\n want.current = { key: keyHash, pages: 0 };\n owedPages(qc).delete(keyHash);\n return;\n }\n void fetchNextPage({ cancelRefetch: false });\n }, [qc, keyHash, isFetching, loaded, hasNextPage, isFetchNextPageError, fetchNextPage]);\n return {\n rows,\n total: q.data?.pages[0]?.total ?? null,\n loading: q.isPending,\n loadingMore: q.isFetchingNextPage,\n hasMore: Boolean(q.hasNextPage),\n error: asRecordsError(q.error),\n loadMore: () => {\n if (!q.hasNextPage || q.isFetchingNextPage) return;\n want.current = { key: keyHash, pages: loaded + 1 };\n owedPages(qc).set(keyHash, { pages: loaded + 1, fetchNext: () => void q.fetchNextPage({ cancelRefetch: false }) });\n // A re-read in flight is let finish; the effect above asks for the page the moment it lands.\n if (!q.isFetching) void q.fetchNextPage({ cancelRefetch: false });\n },\n newer: (q.data as RowsDataWithNewer | undefined)?.newer ?? 0,\n refresh: () => void q.refetch(),\n };\n}\n\nexport function useDataRow(alias: string, id: Uuid | null, scope?: DataScope): DataRead<Row | null> {\n const { port, portKey } = useDataPort(scope);\n const qc = useRecordsQueryClient();\n useLive(id ? alias : null, scope);\n const q = useQuery({\n queryKey: dataKeys.row(portKey, alias, id ?? \"-\"),\n queryFn: async () => unwrap(await port.get(alias, id!)),\n enabled: Boolean(id),\n retry: retryable,\n // A row a loaded page already holds is drawn at once; the read confirms it.\n placeholderData: () => (id ? (findRow(qc, portKey, alias, id) ?? undefined) : undefined),\n }, qc);\n return { data: id ? q.data : null, loading: Boolean(id) && q.isPending, error: asRecordsError(q.error), refresh: () => void q.refetch() };\n}\n\n// ── writes: optimistic, rolled back with the store's sentence, answered with a receipt ─────────\n\nexport interface DataMutations {\n /** Drawn at once (marked `_pending`), replaced by the stored row; removed with the store's sentence on refusal. */\n create(values: Values): Promise<RecordsResult<Row>>;\n /** Sends the drawn row's `_version` as baseVersion (or `options.baseVersion`). A stale write is refused and the row re-read. */\n update(id: Uuid, patch: Values, options?: { baseVersion?: number }): Promise<RecordsResult<Row>>;\n archive(id: Uuid): Promise<RecordsResult<void>>;\n restore(id: Uuid): Promise<RecordsResult<void>>;\n}\n\nlet tempCounter = 0;\n\n/**\n * The row as an optimistic update draws it: the patch over the row, with `_custom` MERGED (a patch naming one\n * custom field never blanks the others), and the runtime's own keys kept as they were.\n */\nexport function drawPatch(before: Row, patch: Values): Row {\n const drawn: Row = { ...before, ...patch, _id: before._id, _version: before._version, _organization_id: before._organization_id };\n if (patch._custom && typeof patch._custom === \"object\") {\n drawn._custom = { ...(before._custom ?? {}), ...patch._custom };\n } else if (before._custom !== undefined) {\n drawn._custom = before._custom;\n }\n return drawn;\n}\n\nexport function useDataMutations(alias: string, scope?: DataScope): DataMutations {\n const qc = useRecordsQueryClient();\n const { port, portKey } = useDataPort(scope);\n\n return useMemo<DataMutations>(() => {\n const snapshotRows = () => qc.getQueriesData<RowsData>({ queryKey: dataKeys.rowsPrefix(portKey, alias) });\n const putBack = (snap: ReturnType<typeof snapshotRows>) => {\n for (const [key, data] of snap) qc.setQueryData(key, data);\n };\n\n return {\n async create(values) {\n const tempId = `pending-${Date.now().toString(36)}-${(tempCounter += 1)}`;\n const drawn: Row = { ...values, _id: tempId, _version: 0, _organization_id: \"\", _pending: true };\n await qc.cancelQueries({ queryKey: dataKeys.rowsPrefix(portKey, alias) });\n forEachRowsEntry(qc, portKey, alias, (_key, data) => {\n if (data.pages.length === 0) return data;\n const [first, ...rest] = data.pages;\n return { ...data, pages: [{ ...first!, rows: [drawn, ...first!.rows], total: first!.total === null ? null : first!.total + 1 }, ...rest] };\n });\n const answer = await port.create(alias, values);\n forEachRowsEntry(qc, portKey, alias, (_key, data) => {\n const pages = data.pages.map((page) => {\n if (!page.rows.some((r) => r._id === tempId)) return page;\n const rows = answer.ok\n ? page.rows.map((r) => (r._id === tempId ? answer.data : r))\n : page.rows.filter((r) => r._id !== tempId);\n return { ...page, rows, total: answer.ok || page.total === null ? page.total : Math.max(0, page.total - 1) };\n });\n return { ...data, pages };\n });\n if (answer.ok) qc.setQueryData(dataKeys.row(portKey, alias, answer.data._id), answer.data);\n return answer;\n },\n\n async update(id, patch, options = {}) {\n const before = findRow(qc, portKey, alias, id);\n const baseVersion = options.baseVersion ?? before?._version;\n if (typeof baseVersion !== \"number\") {\n return { ok: false, error: { code: \"stale_read\", message: \"Nothing was saved: this row's version is not known here.\", hint: \"Read the row first, then change it.\" } };\n }\n await qc.cancelQueries({ queryKey: dataKeys.alias(portKey, alias) });\n const rowKey = dataKeys.row(portKey, alias, id);\n const rowBefore = qc.getQueryData<Row | null>(rowKey);\n if (before) patchRow(qc, portKey, alias, drawPatch(before, patch), { force: true });\n const answer = await port.update(alias, id, patch, baseVersion);\n if (answer.ok) {\n patchRow(qc, portKey, alias, answer.data, { force: true, fromStore: true });\n return answer;\n }\n // ROLLBACK: this row goes back to what was drawn before (only the entries that held it), then the\n // store's current row is read so a stale write shows what actually won.\n if (before) patchRow(qc, portKey, alias, before, { force: true });\n qc.setQueryData(rowKey, rowBefore);\n void rereadIds(qc, port, portKey, alias, [id]);\n return answer;\n },\n\n async archive(id) {\n await qc.cancelQueries({ queryKey: dataKeys.rowsPrefix(portKey, alias) });\n const snap = snapshotRows();\n const rowKey = dataKeys.row(portKey, alias, id);\n const rowBefore = qc.getQueryData<Row | null>(rowKey);\n dropRow(qc, portKey, alias, id);\n const answer = await port.archive(alias, id);\n if (!answer.ok) {\n putBack(snap);\n qc.setQueryData(rowKey, rowBefore);\n // Anything another person changed while the archive was in flight is read again.\n void qc.invalidateQueries({ queryKey: dataKeys.rowsPrefix(portKey, alias) });\n } else {\n rereadArchives(qc, portKey, alias);\n }\n return answer;\n },\n\n async restore(id) {\n const answer = await port.restore(alias, id);\n if (answer.ok) {\n void qc.invalidateQueries({ queryKey: dataKeys.rowsPrefix(portKey, alias) });\n void qc.invalidateQueries({ queryKey: dataKeys.row(portKey, alias, id) });\n }\n return answer;\n },\n };\n }, [qc, port, portKey, alias]);\n}\n"],"mappings":"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","names":[]}
|
package/dist/entity/index.cjs
CHANGED
|
@@ -891,7 +891,7 @@ function createEntityDataPort(options) {
|
|
|
891
891
|
}
|
|
892
892
|
const wire = toWire(q, customKeys);
|
|
893
893
|
if (binding.organizationId) wire.scope = { ...wire.scope, organization_id: binding.organizationId };
|
|
894
|
-
const answer = await client.list({ token: binding.token, ...wire, after: cursor ?? null });
|
|
894
|
+
const answer = await client.list({ token: binding.token, ...wire, after: cursor ?? null, ...q.archived === true ? { archived: "archived" } : {} });
|
|
895
895
|
if (!answer.ok) return answer;
|
|
896
896
|
const { data } = answer;
|
|
897
897
|
if (data.sort_ignored.length > 0) {
|