@bitcobblers/wod-wiki-storage 0.44.2159 → 0.45.2166
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/dist/{chunk-MOGQICXM.mjs → chunk-7ICLFFYU.mjs} +2 -2
- package/dist/chunk-7ICLFFYU.mjs.map +1 -0
- package/dist/{chunk-IMNG2HY5.mjs → chunk-J6KVDPTL.mjs} +3 -3
- package/dist/chunk-J6KVDPTL.mjs.map +1 -0
- package/dist/{chunk-JFVXIJJI.mjs → chunk-PJ7GRYOZ.mjs} +8 -8
- package/dist/chunk-PJ7GRYOZ.mjs.map +1 -0
- package/dist/{chunk-IFLOX2TK.mjs → chunk-UN56ET7P.mjs} +3 -3
- package/dist/{chunk-IFLOX2TK.mjs.map → chunk-UN56ET7P.mjs.map} +1 -1
- package/dist/idb/index.cjs +1 -1
- package/dist/idb/index.cjs.map +1 -1
- package/dist/idb/index.d.cts +3 -3
- package/dist/idb/index.d.ts +3 -3
- package/dist/idb/index.mjs +3 -3
- package/dist/index.cjs +6 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.mjs +5 -5
- package/dist/{policy-DRYF6Y8i.d.cts → policy-BBwCBMtp.d.cts} +3 -2
- package/dist/{policy-CPscN81J.d.ts → policy-C86TCPSM.d.ts} +3 -2
- package/dist/sql/index.cjs +60 -44
- package/dist/sql/index.cjs.map +1 -1
- package/dist/sql/index.d.cts +3 -3
- package/dist/sql/index.d.ts +3 -3
- package/dist/sql/index.mjs +64 -48
- package/dist/sql/index.mjs.map +1 -1
- package/dist/{sync-DG4Z-szj.d.cts → sync-BDu_Q__z.d.cts} +1 -1
- package/dist/{sync-Bjj_c1ea.d.ts → sync-BQ0g8ctt.d.ts} +1 -1
- package/dist/{wire-DGYxXt3I.d.ts → wire-BO8FM1LJ.d.cts} +17 -8
- package/dist/{wire-DGYxXt3I.d.cts → wire-BO8FM1LJ.d.ts} +17 -8
- package/package.json +6 -6
- package/dist/chunk-IMNG2HY5.mjs.map +0 -1
- package/dist/chunk-JFVXIJJI.mjs.map +0 -1
- package/dist/chunk-MOGQICXM.mjs.map +0 -1
package/dist/sql/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/sql/domain.ts","../../src/sql/storage.ts","../../src/sql/backup.ts"],"names":["pageSql","rows","text"],"mappings":"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","file":"index.mjs","sourcesContent":["/** Current Note and actionable-block SQL projections. */\n\nimport type { Database, SqlConnection, SqlValue } from './connection';\nimport { StorageError } from './errors';\nimport { putRows, deleteRows, clearRows, getRows, listRows, storeDefinition, SCHEMA_TABLE, batchInsert, deleteIn } from './store';\nimport { decodeRowJson, encodeRowJson } from './codec';\nimport { DB_VERSION, STORE_DEFS } from '../schema';\nimport type { StoreDef } from '../schema';\nimport type { StoreName } from '../contract';\nimport {\n DOMAIN_PROJECTION_VERSION,\n type DomainPredicate,\n type DomainQueryResult,\n} from '../domain';\nimport { isRange, keyFromValue, type KeyDTO, type RangeDTO, type TxOp } from '../wire';\n// The app's own source/catalog semantics — no duplicated matchers.\nimport { catalogOfItem, sourceMatches } from '@bitcobblers/wod-wiki-wql';\nimport { rowsEqual, validateStoredPins } from '../validation';\nimport type { BlockRevision, Note, Session } from '../entities';\n\nconst TABLES = ['domain_note', 'query_block'] as const;\n\nconst PROJECTION_GUARD_KEY = 'domain_projection';\n\ntype SourceItem = Parameters<typeof sourceMatches>[0];\n\nfunction sourceItem(row: Record<string, unknown>): SourceItem {\n const item: SourceItem = {};\n for (const key of ['id', 'noteId', 'sourceId', 'type', 'seedOrigin', 'seedChunkId', 'sourcePath', 'catalog', 'notebookId'] as const) {\n const value = row[key];\n if (typeof value === 'string') item[key] = value;\n else if (value != null) throw new StorageError(400, `${key} must be a string`);\n }\n return item;\n}\n\ninterface NoteIdentity { note_id: string; date: number | null; created_at: number; note: Note }\n\nconst num = (v: unknown): number | null => (typeof v === 'number' && Number.isFinite(v) ? v : null);\nconst text = (v: unknown): string | null => (typeof v === 'string' ? v : null);\nconst T = (v: unknown): SqlValue => (text(v) as SqlValue) ?? null;\nconst N = (v: unknown): SqlValue => num(v) ?? 0;\n\n// ── DDL (engine-neutral; numeric suffix only differs on postgres) ──────────\n\nfunction ensureDdl(db: Database): Promise<void> {\n const n = db.dialect === 'postgres' ? ' DOUBLE PRECISION' : '';\n const t = db.dialect === 'postgres' ? ' TEXT COLLATE \"C\"' : ' TEXT';\n const ddl = [\n `CREATE TABLE IF NOT EXISTS \"domain_note\" (\"note_id\"${t} PRIMARY KEY NOT NULL, \"note_type\"${t}, \"catalog\"${t}, \"source_id\"${t}, \"source_path\"${t}, \"title\"${t} NOT NULL, \"title_search\"${t} NOT NULL, \"created_at\"${n} NOT NULL, \"date\"${n}, \"text_search\"${t} NOT NULL, \"journal\"${n} NOT NULL, \"payload\"${t} NOT NULL)`,\n `CREATE INDEX IF NOT EXISTS \"idx_domain_note_date\" ON \"domain_note\" (\"date\", \"note_id\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_domain_note_created\" ON \"domain_note\" (\"created_at\", \"note_id\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_domain_note_source_path\" ON \"domain_note\" (\"source_path\")`,\n `CREATE TABLE IF NOT EXISTS \"query_block\" (\"occurrence_id\"${t} PRIMARY KEY NOT NULL, \"source_note_id\"${t}, \"parent_note_id\"${t}, \"content_id\"${t}, \"section_key\"${t}, \"ordinal\"${n}, \"data_type\"${t}, \"source_id\"${t}, \"source_path\"${t}, \"catalog\"${t}, \"effective_date\"${n} NOT NULL, \"created_at\"${n} NOT NULL, \"note_title\"${t}, \"normalized_text\"${t} NOT NULL, \"journal\"${n} NOT NULL, \"payload\"${t} NOT NULL)`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_type\" ON \"query_block\" (\"data_type\", \"effective_date\", \"occurrence_id\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_parent\" ON \"query_block\" (\"parent_note_id\", \"ordinal\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_content\" ON \"query_block\" (\"content_id\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_source_path\" ON \"query_block\" (\"source_path\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_source_note\" ON \"query_block\" (\"source_note_id\")`,\n ];\n return db.transaction(async (tx) => {\n for (const sql of ddl) await tx.exec(sql);\n });\n}\n\n\nconst DOMAIN_NOTE_COLS = ['note_id','note_type','catalog','source_id','source_path','title','title_search','created_at','date','text_search','journal','payload'] as const;\nconst QUERY_BLOCK_COLS = ['occurrence_id','source_note_id','parent_note_id','content_id','section_key','ordinal','data_type','source_id','source_path','catalog','effective_date','created_at','note_title','normalized_text','journal','payload'] as const;\n\nconst conflictUpdate = (table: string, cols: readonly string[], keys: readonly string[]): string =>\n `ON CONFLICT (${keys.map((k) => `\"${k}\"`).join(', ')}) DO UPDATE SET ` +\n cols.filter((c) => !keys.includes(c)).map((c) => `\"${c}\" = excluded.\"${c}\"`).join(',') +\n ` WHERE ` + cols.filter(col => !keys.includes(col)).map(col => `\"${table}\".\"${col}\" IS DISTINCT FROM excluded.\"${col}\"`).join(' OR ');\n\n/** One domain_note row; undefined when the note has no identity (store write\n * still succeeds — nothing to project). */\nfunction domainNoteRow(note: Record<string, unknown>): SqlValue[] | undefined {\n const id = text(note.id);\n if (!id) return undefined;\n const source = sourceItem(note);\n return [\n id,\n T(note.type),\n T(catalogOfItem(source)),\n T(note.sourceId),\n T(note.sourcePath),\n T(note.title) ?? '',\n (text(note.title) ?? '').toLowerCase(),\n N(note.createdAt),\n num(note.date),\n (text(note.rawContent) ?? '').toLowerCase(),\n sourceMatches(source, 'journal') ? 1 : 0,\n encodeRowJson(note),\n ];\n}\n\nasync function upsertDomainNotes(conn: SqlConnection, notes: Record<string, unknown>[]): Promise<void> {\n const rows = notes.map(domainNoteRow).filter((r): r is SqlValue[] => r !== undefined);\n await batchInsert(conn, 'domain_note', [...DOMAIN_NOTE_COLS], rows, conflictUpdate('domain_note', DOMAIN_NOTE_COLS, ['note_id']));\n}\n\n\n/** One query_block row; undefined when the block has no identity. */\nfunction queryBlockRow(block: Record<string, unknown>, parent: NoteIdentity | undefined): SqlValue[] | undefined {\n const id = text(block.id);\n if (!id) return undefined;\n const source = sourceItem(block);\n const createdAt = N(block.createdAt);\n const effective = parent ? (parent.date ?? parent.created_at) : createdAt;\n return [\n id,\n T(block.noteId),\n parent?.note_id ?? null,\n T(block.blockContentId),\n T(block.blockId),\n num(block.position),\n T(block.dataType),\n T(block.sourceId),\n T(block.sourcePath),\n T(catalogOfItem(source)),\n effective,\n createdAt,\n parent?.note.title ?? T(block.noteTitle),\n (text(block.rawContent) ?? '').toLowerCase(),\n sourceMatches(source, 'journal') ? 1 : 0,\n encodeRowJson(parent ? { ...block, noteTitle: parent.note.title } : block),\n ];\n}\n\nasync function upsertQueryBlocks(conn: SqlConnection, blocks: [Record<string, unknown>, NoteIdentity | undefined][]): Promise<void> {\n const rows = blocks.map(([b, p]) => queryBlockRow(b, p)).filter((r): r is SqlValue[] => r !== undefined);\n await batchInsert(conn, 'query_block', [...QUERY_BLOCK_COLS], rows, conflictUpdate('query_block', QUERY_BLOCK_COLS, ['occurrence_id']));\n}\n\n// ── Parent identity resolution ───────────────────────────────────────────────\n\ninterface ParentIndex { byNoteId: Map<string, NoteIdentity> }\n\nfunction indexNoteIdentities(notes: Iterable<Record<string, unknown>>): ParentIndex {\n const byNoteId = new Map<string, NoteIdentity>();\n for (const note of notes) {\n const id = text(note.id);\n if (id) byNoteId.set(id, { note_id: id, date: num(note.date), created_at: num(note.createdAt) ?? 0, note: note as unknown as Note });\n }\n return { byNoteId };\n}\n\nfunction resolveParentFrom(index: ParentIndex, block: Record<string, unknown>): NoteIdentity | undefined {\n const parent = typeof block.noteId === 'string' ? index.byNoteId.get(block.noteId) : undefined;\n const mapped = typeof block.blockId === 'string' ? parent?.note.blocks[block.blockId] : undefined;\n return parent && mapped && block.id === `${parent.note_id}:${mapped.id}`\n && block.blockVersion === mapped.version && block.dataType === mapped.kind\n && block.sourceRevision === parent.note.sourceRevision && block.from === mapped.from && block.to === mapped.to\n && block.rawContent === parent.note.rawContent.slice(mapped.from, mapped.to) ? parent : undefined;\n}\n\nasync function fetchParentIndex(conn: SqlConnection, noteIds: string[]): Promise<ParentIndex> {\n const notes = await getRows(conn, storeDefinition('notes'), noteIds);\n return indexNoteIdentities(notes.filter((row): row is Record<string, unknown> => row !== undefined));\n}\n\n// ── Per-key refresh ──────────────────────────────────────────────────────────\n\nconst keyHead = (key: KeyDTO): SqlValue => (Array.isArray(key) ? (key[0] as SqlValue) : key);\n\n/** Chunked `col IN (…)` SELECT returning the first column as strings. */\nasync function selectIn(conn: SqlConnection, selectCol: string, table: string, col: string, vals: SqlValue[]): Promise<string[]> {\n const IN_CHUNK = 500;\n const out: string[] = [];\n for (let i = 0; i < vals.length; i += IN_CHUNK) {\n const part = vals.slice(i, i + IN_CHUNK);\n const rows = await conn.query(`SELECT \"${selectCol}\" FROM \"${table}\" WHERE \"${col}\" IN (${part.map(() => '?').join(', ')})`, part);\n for (const r of rows) out.push(String(r[selectCol]));\n }\n return out;\n}\n\nasync function healQueryBlocksForNotes(conn: SqlConnection, noteIds: string[]): Promise<void> {\n const ids = await selectIn(conn, 'occurrence_id', 'query_block', 'source_note_id', noteIds);\n await refreshBlocks(conn, [...new Set(ids)]);\n}\n\nasync function refreshNotes(conn: SqlConnection, ids: KeyDTO[]): Promise<void> {\n const ks = [...new Set(ids.map((id) => String(keyHead(id))))];\n if (ks.length === 0) return;\n const found = new Map<string, Record<string, unknown>>();\n for (let i = 0; i < ks.length; i += 500) {\n const part = ks.slice(i, i + 500);\n const rows = await conn.query(`SELECT \"k0\", \"data\" FROM \"notes\" WHERE \"k0\" IN (${part.map(() => '?').join(', ')})`, part);\n for (const row of rows) found.set(String(row.k0), decodeRowJson<Record<string, unknown>>(String(row.data)));\n }\n const present: Record<string, unknown>[] = [];\n const missing: string[] = [];\n for (const k of ks) {\n const note = found.get(k);\n if (note) present.push(note);\n else missing.push(k);\n }\n await upsertDomainNotes(conn, present);\n const presentIds = present.map((n) => text(n.id)).filter((x): x is string => !!x);\n await healQueryBlocksForNotes(conn, presentIds);\n await deleteIn(conn, 'domain_note', 'note_id', missing);\n await deleteIn(conn, 'query_block', 'source_note_id', missing);\n await deleteIn(conn, 'block_index', 'i_by_note_0', missing);\n await deleteIn(conn, 'block_efforts', 'i_by_note_0', missing);\n}\n\n\nasync function refreshBlocks(conn: SqlConnection, ids: KeyDTO[]): Promise<void> {\n const ks = [...new Set(ids.map((id) => String(keyHead(id))))];\n if (ks.length === 0) return;\n const found = new Map<string, Record<string, unknown>>();\n for (let i = 0; i < ks.length; i += 500) {\n const part = ks.slice(i, i + 500);\n const rows = await conn.query(`SELECT \"k0\", \"data\" FROM \"block_index\" WHERE \"k0\" IN (${part.map(() => '?').join(', ')})`, part);\n for (const row of rows) found.set(String(row.k0), decodeRowJson<Record<string, unknown>>(String(row.data)));\n }\n const blocks = [...found.values()];\n const noteIds = [...new Set(blocks.map((b) => text(b.noteId)).filter((x): x is string => !!x))];\n const index = await fetchParentIndex(conn, noteIds);\n await upsertQueryBlocks(conn, blocks.map((b) => [b, resolveParentFrom(index, b)]));\n await deleteIn(conn, 'query_block', 'occurrence_id', ks.filter((k) => !found.has(k)));\n}\n\ninterface Impact {\n notes: KeyDTO[];\n pinnedNotes: Note[];\n pinnedSessions: Session[];\n blocks: KeyDTO[];\n notesClear: boolean;\n blocksClear: boolean;\n}\n\nconst TRACKED: Partial<Record<StoreName, 'notes' | 'blocks'>> = {\n notes: 'notes',\n block_index: 'blocks',\n};\n\nasync function deleteTargetKeys(conn: SqlConnection, def: StoreDef, target: KeyDTO | RangeDTO): Promise<KeyDTO[]> {\n if (!isRange(target)) return [target];\n const rows = await listRows(conn, def, target);\n return rows.map((row) => keyFromValue(def, row));\n}\n\n/** Checks precede mutations; pins and projections commit with source rows. */\nexport async function refreshDomain(\n conn: SqlConnection,\n ops: TxOp[],\n): Promise<(KeyDTO | null)[]> {\n const impact: Impact = {\n notes: [], blocks: [], pinnedNotes: [], pinnedSessions: [],\n notesClear: false, blocksClear: false,\n };\n const results: (KeyDTO | null)[] = [];\n for (const op of ops) if (op === null || typeof op !== 'object' || Array.isArray(op)) throw new StorageError(400, 'tx op must be an object');\n const checks = ops.filter((op): op is Extract<TxOp, {op: 'check'}> => op.op === 'check');\n const checkStores = [...new Set(checks.map(op => op.store))];\n for (const store of checkStores) {\n const scoped = checks.filter(op => op.store === store);\n const actual = await getRows(conn, storeDefinition(store), scoped.map(op => op.key));\n scoped.forEach((op, i) => {\n if (!rowsEqual(actual[i] ?? null, op.value)) throw new StorageError(409, 'transaction read changed before commit', 'transaction_conflict');\n });\n }\n // Consecutive puts on one store flush as chunked multi-row INSERTs; the\n // flush also precedes any delete/clear so range deletes observe them.\n let pending: { def: StoreDef; values: unknown[] } | undefined;\n const flushPuts = async (): Promise<void> => {\n if (!pending) return;\n const batch = pending;\n pending = undefined;\n if (batch.values.length === 0) return;\n const changed: KeyDTO[] = [];\n const keys = await putRows(conn, batch.def, batch.values, changed);\n const slot = TRACKED[batch.def.name];\n if (slot) impact[slot].push(...changed);\n const changedSet = new Set(changed.map(key => JSON.stringify(key)));\n if (batch.def.name === 'notes') impact.pinnedNotes.push(...batch.values.filter(value => changedSet.has(JSON.stringify(keyFromValue(batch.def, value)))) as Note[]);\n if (batch.def.name === 'sessions') impact.pinnedSessions.push(...batch.values.filter(value => changedSet.has(JSON.stringify(keyFromValue(batch.def, value)))) as Session[]);\n results.push(...keys);\n };\n for (const op of ops) {\n if (op.op === 'check') { results.push(null); continue; }\n const store = 'store' in op ? op.store : undefined;\n const def = storeDefinition(typeof store === 'string' ? store : String(store));\n const kind: unknown = typeof op.op === 'string' ? op.op : undefined; // runtime junk tolerated\n if (op.op === 'put') {\n if (pending && pending.def.name !== def.name) await flushPuts();\n (pending ??= { def, values: [] }).values.push(op.value);\n } else if (op.op === 'delete') {\n await flushPuts();\n const slot = TRACKED[def.name];\n if (slot) {\n // op.key types as KeyDTO on the wire, but deleteRows honours ranges too.\n for (const key of await deleteTargetKeys(conn, def, op.key as KeyDTO | RangeDTO)) impact[slot].push(key);\n }\n await deleteRows(conn, def, op.key as KeyDTO | RangeDTO);\n results.push(null);\n } else if (op.op === 'clear') {\n await flushPuts();\n await clearRows(conn, def);\n if (def.name === 'notes') impact.notesClear = true;\n else if (def.name === 'block_index') impact.blocksClear = true;\n results.push(null);\n } else {\n throw new StorageError(400, `tx op must be check | put | delete | clear, got: ${String(kind)}`);\n }\n }\n await flushPuts();\n const finalNotes = (await getRows(conn, storeDefinition('notes'), [...new Set(impact.pinnedNotes.map(note => note.id))])).filter(Boolean) as Note[];\n const finalSessions = (await getRows(conn, storeDefinition('sessions'), [...new Set(impact.pinnedSessions.map(session => session.id))])).filter(Boolean) as Session[];\n await validateStoredPins(finalNotes, finalSessions, keys => getRows(conn, storeDefinition('block_revisions'), keys as KeyDTO[]) as Promise<(BlockRevision | undefined)[]>);\n await refresh(conn, impact);\n return results;\n}\n\nasync function refresh(conn: SqlConnection, impact: Impact): Promise<void> {\n // Clears stage first: a tx of [clear, put n1] must end with exactly n1\n // projected, and [put n1, clear] with nothing — clearing the derived rows\n // before re-projecting surviving keys satisfies both orders.\n if (impact.notesClear) {\n await conn.exec(`DELETE FROM \"domain_note\"`);\n await conn.exec(`DELETE FROM \"query_block\" WHERE \"source_note_id\" NOT IN (SELECT \"k0\" FROM \"notes\")`);\n await conn.exec(`DELETE FROM \"block_index\" WHERE \"i_by_note_0\" NOT IN (SELECT \"k0\" FROM \"notes\")`);\n await conn.exec(`DELETE FROM \"block_efforts\" WHERE \"i_by_note_0\" NOT IN (SELECT \"k0\" FROM \"notes\")`);\n }\n if (impact.blocksClear) await conn.exec(`DELETE FROM \"query_block\"`);\n await refreshNotes(conn, impact.notes);\n await refreshBlocks(conn, impact.blocks);\n}\n\n/**\n * Rebuild the derived tables from the source-of-truth store rows and stamp\n * the projection guard. Caller owns the transaction (atomicity) — the guard\n * row commits together with the rebuilt rows.\n */\nexport async function rebuildProjections(conn: SqlConnection): Promise<void> {\n await conn.exec(\n `CREATE TABLE IF NOT EXISTS \"${SCHEMA_TABLE}\" (\"key\" TEXT PRIMARY KEY, \"value\" TEXT NOT NULL)`,\n );\n for (const t of TABLES) await conn.exec(`DELETE FROM \"${t}\"`);\n const notes = await conn.query(`SELECT \"data\" FROM \"notes\"`);\n const noteObjs = notes.map((row) => decodeRowJson<Record<string, unknown>>(String(row.data)));\n await upsertDomainNotes(conn, noteObjs);\n const blocks = await conn.query(`SELECT \"data\" FROM \"block_index\"`);\n const blockObjs = blocks.map((row) => decodeRowJson<Record<string, unknown>>(String(row.data)));\n // domain_note was just rebuilt from exactly these notes — parent identity\n // resolves in memory instead of one query per block.\n const index = indexNoteIdentities(noteObjs);\n await upsertQueryBlocks(conn, blockObjs.map((b) => [b, resolveParentFrom(index, b)]));\n await conn.exec(\n `INSERT INTO \"${SCHEMA_TABLE}\" (\"key\", \"value\") VALUES (?, ?) ON CONFLICT (\"key\") DO UPDATE SET \"value\" = excluded.\"value\"`,\n [PROJECTION_GUARD_KEY, JSON.stringify({ version: DOMAIN_PROJECTION_VERSION })],\n );\n}\n\n/** Boot-time derived state: DDL + rebuild only when the guard is incompatible\n * (first run, projection version bump, or an interrupted prior rebuild). */\nexport async function initializeDomain(db: Database): Promise<void> {\n await ensureDdl(db);\n await db.transaction(async (tx) => {\n await tx.exec(\n `CREATE TABLE IF NOT EXISTS \"${SCHEMA_TABLE}\" (\"key\" TEXT PRIMARY KEY, \"value\" TEXT NOT NULL)`,\n );\n const guardRows = await tx.query(`SELECT \"value\" FROM \"${SCHEMA_TABLE}\" WHERE \"key\" = ?`, [PROJECTION_GUARD_KEY]);\n let guard: { version?: unknown } | undefined;\n if (guardRows[0]) {\n try {\n guard = JSON.parse(String(guardRows[0].value)) as { version?: unknown };\n } catch {\n guard = undefined; // corrupt guard → rebuild and restamp\n }\n }\n if (guard?.version === DOMAIN_PROJECTION_VERSION) return;\n await rebuildProjections(tx);\n });\n}\n\n/** Read-only readiness check (no DDL, no writes): both real guards — the\n * store schema version row and the domain projection version row — must be\n * current, and every store/projection table must exist. Missing table →\n * db_not_initialized; version drift or corrupt guards → schema_incompatible;\n * auth/network errors propagate untouched. Used by\n * openCliDb(…, { initialize: false }). */\nexport async function verifyReadiness(db: Database): Promise<void> {\n // Only \"missing relation\" SQL failures mean uninitialized; everything\n // else (auth, network, permissions) surfaces as-is.\n const isMissingRelation = (error: unknown): boolean => {\n if (typeof error !== 'object' || error === null) return false;\n // Bun.SQL: code ERR_POSTGRES_SERVER_ERROR, SQLSTATE in errno; postgres\n // 42P01 = undefined_table. libsql node: SQLITE_ERROR + \"no such table\".\n if ('errno' in error && error.errno === '42P01') return true;\n if ('code' in error && error.code === '42P01') return true;\n return (\n 'code' in error &&\n error.code === 'SQLITE_ERROR' &&\n /no such table/i.test(error instanceof Error ? error.message : String(error))\n );\n };\n\n /** Safe parse: a missing row → undefined; a corrupt guard → incompatible. */\n const readGuard = async (key: string): Promise<{ version?: unknown } | undefined> => {\n const rows = await db.query(`SELECT \"value\" FROM \"${SCHEMA_TABLE}\" WHERE \"key\" = ?`, [key]);\n if (!rows.length || typeof rows[0].value !== 'string') return undefined;\n try {\n return JSON.parse(rows[0].value) as { version?: unknown };\n } catch {\n throw new StorageError(500, `database guard \"${key}\" is corrupt; re-run initialization`, 'schema_incompatible');\n }\n };\n\n let schemaGuard: { version?: unknown } | undefined;\n let projectionGuard: { version?: unknown } | undefined;\n try {\n schemaGuard = await readGuard('schema');\n projectionGuard = await readGuard(PROJECTION_GUARD_KEY);\n } catch (error) {\n if (isMissingRelation(error)) {\n throw new StorageError(500, 'database is not initialized (schema guard table missing)', 'db_not_initialized');\n }\n throw error;\n }\n const schemaVersion = schemaGuard?.version;\n const projectionVersion = projectionGuard?.version;\n if (typeof schemaVersion !== 'number') {\n throw new StorageError(500, 'database is not initialized (no schema guard row)', 'db_not_initialized');\n }\n if (typeof projectionVersion !== 'number') {\n throw new StorageError(500, 'database is not initialized (projections never built)', 'db_not_initialized');\n }\n if (schemaVersion > DB_VERSION) {\n throw new StorageError(\n 500,\n `database schema v${schemaVersion} is newer than this server supports (v${DB_VERSION}); refusing to downgrade`,\n 'schema_incompatible',\n );\n }\n if (schemaVersion !== DB_VERSION) {\n throw new StorageError(\n 500,\n `database schema v${schemaVersion} is incompatible with v${DB_VERSION}; re-run initialization`,\n 'schema_incompatible',\n );\n }\n if (projectionVersion !== DOMAIN_PROJECTION_VERSION) {\n throw new StorageError(\n 500,\n `database projections v${projectionVersion} are incompatible with v${DOMAIN_PROJECTION_VERSION}; re-run initialization`,\n 'schema_incompatible',\n );\n }\n // Table readiness: known-safe internal identifiers, LIMIT 0 → no rows move.\n for (const table of [...STORE_DEFS.map((def) => def.name), ...TABLES]) {\n try {\n await db.query(`SELECT * FROM \"${table}\" LIMIT 0`);\n } catch (error) {\n if (isMissingRelation(error)) {\n throw new StorageError(500, `database is not initialized (missing table: ${table})`, 'db_not_initialized');\n }\n throw error;\n }\n }\n}\n\n/** Clears derived tables after a data wipe (empty is a consistent state). */\nexport async function wipeDomain(conn: SqlConnection): Promise<void> {\n for (const t of TABLES) await conn.exec(`DELETE FROM \"${t}\"`);\n}\n\n// ── Domain query execution ───────────────────────────────────────────────────\n\nexport const MAX_BODY = 64 * 1024;\nconst MAX_CLAUSES = 32;\nconst MAX_VALUES = 64;\nconst MAX_VALUE_LEN = 256;\nconst MAX_ORDER = 4;\n\ntype Plan = 'notes' | 'blocks' | 'entries';\n\nconst listFields = ['id', 'noteId', 'type', 'catalog', 'source', 'tags', 'effort'] as const;\n\nconst onlyKeys = (obj: Record<string, unknown>, allowed: string[]): boolean =>\n Object.keys(obj).every((k) => allowed.includes(k));\n\nfunction bad(msg: string): StorageError {\n return new StorageError(400, msg);\n}\n\nfunction strArray(v: unknown, what: string): string[] {\n if (!Array.isArray(v) || v.length < 1 || v.length > MAX_VALUES) {\n throw bad(`${what} needs 1..=${MAX_VALUES} values`);\n }\n return v.map((x) => {\n if (typeof x !== 'string' || x.length < 1 || x.length > MAX_VALUE_LEN) {\n throw bad(`${what} values must be 1..=${MAX_VALUE_LEN} chars`);\n }\n return x;\n });\n}\n\n/** Strict predicate parse — unknown/missing/duplicate payload keys are 400. */\nfunction parsePredicate(v: unknown, plan: Plan): DomainPredicate {\n if (v === null || typeof v !== 'object' || Array.isArray(v)) throw bad('predicate must be an object');\n const obj = v as Record<string, unknown>;\n const field = obj.field;\n if (typeof field !== 'string') throw bad('predicate.field required');\n let negate = false;\n if ('negate' in obj) {\n if (typeof obj.negate !== 'boolean') throw bad('predicate.negate must be boolean');\n negate = obj.negate;\n }\n if ((listFields as readonly string[]).includes(field)) {\n if (!onlyKeys(obj, ['field', 'values', 'negate'])) {\n throw bad(`predicate ${field} accepts only field/values/negate`);\n }\n return { field, values: strArray(obj.values, `predicate ${field}.values`), ...(negate ? { negate } : {}) } as DomainPredicate;\n }\n if (field === 'text') {\n if (!onlyKeys(obj, ['field', 'value']) || negate) throw bad('predicate text accepts only {field, value}');\n if (typeof obj.value !== 'string' || obj.value.length < 1 || obj.value.length > MAX_VALUE_LEN) {\n throw bad('predicate text.value must be 1..=256 chars');\n }\n return { field: 'text', value: obj.value };\n }\n if (field === 'date') {\n if (!onlyKeys(obj, ['field', 'start', 'end', 'endExclusive'])) {\n throw bad('predicate date accepts only field/start/end/endExclusive');\n }\n const n = (k: string): number => {\n if (typeof obj[k] !== 'number' || !Number.isFinite(obj[k])) throw bad(`predicate date.${k} must be a finite number`);\n return obj[k];\n };\n if ('endExclusive' in obj && typeof obj.endExclusive !== 'boolean') {\n throw bad('predicate date.endExclusive must be boolean');\n }\n return { field: 'date', start: n('start'), end: n('end'), ...(obj.endExclusive === true ? { endExclusive: true } : {}) };\n }\n if (field === 'page') {\n if (plan === 'blocks') throw bad('predicate page does not apply to the blocks plan');\n if (!onlyKeys(obj, ['field', 'value'])) throw bad('predicate page accepts only {field, value}');\n if (typeof obj.value !== 'boolean') throw bad('predicate page.value must be boolean');\n return { field: 'page', value: obj.value };\n }\n if (field === 'sourceFence') {\n if (!onlyKeys(obj, ['field'])) throw bad('predicate sourceFence accepts only {field}');\n return { field: 'sourceFence' };\n }\n if (field === 'defaultNotes') {\n if (plan === 'blocks') throw bad('predicate defaultNotes does not apply to the blocks plan');\n if (!onlyKeys(obj, ['field', 'feeds'])) throw bad('predicate defaultNotes accepts only {field, feeds}');\n if (typeof obj.feeds !== 'boolean') throw bad('predicate defaultNotes.feeds must be boolean');\n return { field: 'defaultNotes', feeds: obj.feeds };\n }\n throw bad(`unknown predicate field: ${field}`);\n}\n\nfunction parseClauses(v: unknown, plan: Plan, what: string): DomainPredicate[] {\n if (v === undefined) return [];\n if (!Array.isArray(v)) throw bad(`${what} must be an array`);\n if (v.length > MAX_CLAUSES) throw bad(`${what} supports at most ${MAX_CLAUSES} clauses`);\n return v.map((p) => parsePredicate(p, plan));\n}\n\nfunction orderCols(field: string, plan: Plan): string {\n if (field === 'id' || field === 'createdAt') return field;\n if (plan === 'blocks') {\n if (field === 'noteTitle' || field === 'dataType' || field === 'position') return field;\n throw bad(field === 'date' || field === 'title' ? `order ${field} does not apply to the blocks plan` : `unknown order field: ${field}`);\n }\n if (field === 'date' || field === 'title') return field;\n throw bad(\n field === 'noteTitle' || field === 'dataType' || field === 'position'\n ? `order ${field} only applies to the blocks plan`\n : `unknown order field: ${field}`,\n );\n}\n\ninterface ParsedQuery {\n plan: Plan;\n selection: DomainPredicate[];\n filters: DomainPredicate[];\n order: { field: string; desc: boolean }[];\n offset: number;\n limit?: number;\n}\n\nfunction parseQuery(body: unknown): ParsedQuery {\n if (body === null || typeof body !== 'object' || Array.isArray(body)) throw bad('body must be a DomainQuery object');\n const obj = body as Record<string, unknown>;\n const plan = obj.plan;\n if (plan !== 'notes' && plan !== 'blocks' && plan !== 'entries') {\n throw bad('body.plan must be notes | blocks | entries');\n }\n for (const k of Object.keys(obj)) {\n if (!['plan', 'selection', 'filters', 'order', 'offset', 'limit'].includes(k)) {\n throw bad(`unknown DomainQuery field: ${k}`);\n }\n }\n const order: { field: string; desc: boolean }[] = [];\n if (obj.order !== undefined) {\n if (!Array.isArray(obj.order)) throw bad('order must be an array');\n if (obj.order.length > MAX_ORDER) throw bad(`order supports at most ${MAX_ORDER} keys`);\n for (const entry of obj.order) {\n if (entry === null || typeof entry !== 'object' || Array.isArray(entry)) throw bad('order entries must be objects');\n const e = entry as Record<string, unknown>;\n if (typeof e.field !== 'string') throw bad('order.field required');\n if (!onlyKeys(e, ['field', 'direction'])) throw bad('order entries accept only field/direction');\n if (e.direction !== undefined && e.direction !== 'asc' && e.direction !== 'desc') {\n throw bad('order.direction must be asc | desc');\n }\n order.push({ field: orderCols(e.field, plan), desc: e.direction === 'desc' });\n }\n }\n const intIn = (k: string): number | undefined => {\n const v = obj[k];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== 'number' || !Number.isInteger(v)) throw bad(`${k} must be an integer`);\n if (v < 0) throw bad(`${k} must be >= 0`);\n return v;\n };\n // Omitted limit = complete matched set; an explicit limit is the caller's\n // paging choice, never silently truncated.\n return {\n plan,\n selection: parseClauses(obj.selection, plan, 'selection'),\n filters: parseClauses(obj.filters, plan, 'filters'),\n order,\n offset: intIn('offset') ?? 0,\n limit: intIn('limit'),\n };\n}\n\n// ── Predicate → SQL (bound values only) ──────────────────────────────────────\n\nclass Sql {\n readonly params: SqlValue[] = [];\n constructor(readonly pg: boolean) {}\n bind(v: SqlValue): string {\n this.params.push(v);\n return '?';\n }\n /** Literal substring over a lowercased materialized column — no wildcards. */\n contains(col: string, needle: string): string {\n const p = this.bind(needle.toLowerCase());\n return this.pg ? `strpos(${col}, ${p}) > 0` : `instr(${col}, ${p}) > 0`;\n }\n inList(col: string, values: string[]): string {\n return `${col} IN (${values.map((v) => this.bind(v)).join(', ')})`;\n }\n}\n\n/** WQL source domain — mirrors WQL_SOURCE_VALUES; the non-shape kinds\n * (dashboards/efforts) are exact sourceId literals, journal is materialized. */\nconst SOURCE_ALL_KINDS = ['journal', 'feeds', 'guides', 'playground', 'dashboards', 'efforts'];\n\nfunction sourceKindSql(ctx: Sql, kind: string, sid: string, typeExpr: string | null, journalCol: string): string {\n switch (kind) {\n case 'journal':\n return `(${journalCol} = 1)`;\n case 'feed':\n case 'feeds':\n // Storage identities keep the collection:/page:collection: prefixes.\n return `(substr(${sid}, 1, 11) = 'collection:' OR substr(${sid}, 1, 16) = 'page:collection:')`;\n case 'page':\n case 'pages':\n return `(${sid} = 'page' OR substr(${sid}, 1, 5) = 'page:' OR substr(${sid}, 1, 7) = 'guides:')`;\n case 'guide':\n case 'guides':\n return `(substr(${sid}, 1, 7) = 'guides:')`;\n case 'playground':\n return typeExpr\n ? `(${sid} = 'playground' OR (${typeExpr} IS NOT NULL AND ${typeExpr} = 'playground'))`\n : `(${sid} = 'playground')`;\n default:\n // Exact sourceId literal; NULL sourceId never equals a value.\n return `(${sid} = ${ctx.bind(kind)})`;\n }\n}\n\nfunction sourcePredicateSql(ctx: Sql, values: string[], negate: boolean, sid: string, typeExpr: string | null, journalCol: string): string {\n const matched = values.map((v) => sourceKindSql(ctx, v, sid, typeExpr, journalCol)).join(' OR ');\n return negate ? `NOT COALESCE((${matched}), FALSE)` : matched;\n}\n\nconst wrap = (negate: boolean, matchSql: string): string =>\n negate ? `NOT COALESCE ((${matchSql}), FALSE)` : matchSql;\n\nfunction predicateSql(ctx: Sql, p: DomainPredicate, plan: Plan): string {\n const blocks = plan === 'blocks';\n const id = blocks ? 'q.\"occurrence_id\"' : 'n.\"note_id\"';\n const sid = blocks ? 'q.\"source_id\"' : 'n.\"source_id\"';\n const typeExpr = blocks ? null : 'n.\"note_type\"';\n const typeCol = blocks ? 'q.\"data_type\"' : 'n.\"note_type\"';\n const catalogCol = blocks ? 'q.\"catalog\"' : 'n.\"catalog\"';\n const journalCol = blocks ? 'q.\"journal\"' : 'n.\"journal\"';\n const noteId = blocks ? 'q.\"source_note_id\"' : 'n.\"note_id\"';\n switch (p.field) {\n case 'id':\n return wrap(p.negate === true, ctx.inList(id, p.values));\n case 'noteId':\n return wrap(p.negate === true, ctx.inList(noteId, p.values));\n case 'type':\n return wrap(p.negate === true, ctx.inList(typeCol, p.values));\n case 'catalog':\n return wrap(p.negate === true, ctx.inList(catalogCol, p.values));\n case 'source':\n return sourcePredicateSql(ctx, p.values, p.negate === true, sid, typeExpr, journalCol);\n case 'tags':\n // Tags hang off the parent note on both planes.\n return wrap(\n p.negate === true,\n `EXISTS (SELECT 1 FROM \"note_tags\" nt JOIN \"tags\" t ON t.\"k0\" = nt.\"i_by_tag_0\" ` +\n `WHERE nt.\"i_by_note_0\" = ${noteId} AND t.\"i_by_label_0\" IN (${p.values.map((v) => ctx.bind(v)).join(', ')}))`,\n );\n case 'effort':\n return wrap(\n p.negate === true,\n blocks\n ? `(q.\"content_id\" IS NOT NULL AND EXISTS (SELECT 1 FROM \"block_efforts\" be ` +\n `WHERE be.\"i_by_block_0\" = q.\"content_id\" AND be.\"i_by_effort_0\" IN (${p.values.map((v) => ctx.bind(v)).join(', ')})))`\n : `EXISTS (SELECT 1 FROM \"block_efforts\" be WHERE be.\"i_by_note_0\" = ${noteId} ` +\n `AND be.\"i_by_effort_0\" IN (${p.values.map((v) => ctx.bind(v)).join(', ')}))`,\n );\n case 'text':\n return blocks ? ctx.contains('q.\"normalized_text\"', p.value)\n : `(${ctx.contains('n.\"title_search\"', p.value)} OR ${ctx.contains('n.\"text_search\"', p.value)})`;\n case 'date': {\n const expr = blocks ? 'q.\"effective_date\"' : 'COALESCE(n.\"date\", n.\"created_at\")';\n const lo = ctx.bind(p.start);\n const hi = ctx.bind(p.end);\n const cmp = p.endExclusive ? '<' : '<=';\n return `(${expr} >= ${lo} AND ${expr} ${cmp} ${hi})`;\n }\n case 'page':\n return p.value ? `n.\"note_type\" = 'page'` : `(n.\"note_type\" IS NULL OR n.\"note_type\" <> 'page')`;\n case 'sourceFence': {\n const all = SOURCE_ALL_KINDS.map((k) => sourceKindSql(ctx, k, sid, typeExpr, journalCol)).join(' OR ');\n return `(${sid} IS NULL OR ${sid} = '' OR ${all})`;\n }\n case 'defaultNotes':\n return p.feeds\n ? `(n.\"note_type\" IS NULL OR n.\"note_type\" <> 'page')`\n : `(n.\"note_type\" = 'note' OR (substr(COALESCE(n.\"source_id\", ''), 1, 5) <> 'page:' ` +\n `AND substr(COALESCE(n.\"source_id\", ''), 1, 7) <> 'guides:' ` +\n `AND COALESCE(n.\"note_type\", '') NOT IN ('feed','syntax','behavior','analytics','dashboard','home','page')))`;\n }\n}\n\nfunction clausesSql(ctx: Sql, clauses: DomainPredicate[], plan: Plan): string {\n if (clauses.length === 0) return '';\n return ` WHERE ${clauses.map((p) => predicateSql(ctx, p, plan)).join(' AND ')}`;\n}\n\nfunction orderSql(order: { field: string; desc: boolean }[], plan: Plan): string {\n const idCol = plan === 'blocks' ? 'q.\"occurrence_id\"' : 'n.\"note_id\"';\n const cols: Record<string, string> =\n plan === 'blocks'\n ? { id: 'q.\"occurrence_id\"', createdAt: 'q.\"created_at\"', noteTitle: 'q.\"note_title\"', dataType: 'q.\"data_type\"', position: 'q.\"ordinal\"' }\n : { id: 'n.\"note_id\"', createdAt: 'n.\"created_at\"', date: 'n.\"date\"', title: 'n.\"title\"' };\n // Deterministic paging: pinned NULL placement (sqlite and pg disagree on\n // defaults) plus the primary key as final tiebreaker.\n const parts = order.map(({ field, desc }) =>\n desc ? `${cols[field]} DESC NULLS FIRST` : `${cols[field]} ASC NULLS LAST`,\n );\n if (!order.some((o) => o.field === 'id')) parts.push(`${idCol} ASC`);\n return parts.join(', ');\n}\n\nfunction pagingSql(q: ParsedQuery, pg: boolean): string {\n let s = '';\n if (q.limit !== undefined) s += ` LIMIT ${q.limit}`;\n else if (q.offset > 0 && !pg) s += ' LIMIT -1'; // sqlite needs LIMIT before OFFSET\n if (q.offset > 0) s += ` OFFSET ${q.offset}`;\n return s;\n}\n\n/** Fail closed while any projected block lacks a resolved parent identity. */\nasync function gate(conn: SqlConnection): Promise<void> {\n const rows = await conn.query(`SELECT COUNT(*) AS \"n\" FROM \"query_block\" WHERE \"parent_note_id\" IS NULL`);\n const stale = Number(rows[0]?.n ?? 0);\n if (stale > 0) {\n throw new StorageError(\n 409,\n `domain projections stale: ${stale} block rows have invalid or unresolved current parents`,\n 'domain_projection_unavailable',\n );\n }\n}\n\nfunction planTable(plan: Plan): string {\n return plan === 'blocks' ? '\"query_block\" q' : '\"domain_note\" n';\n}\n\nasync function execute(conn: SqlConnection, q: ParsedQuery, pg: boolean): Promise<DomainQueryResult> {\n const plan = q.plan;\n const table = planTable(plan);\n\n const selCtx = new Sql(pg);\n const selWhere = clausesSql(selCtx, q.selection, plan);\n const filterCtx = new Sql(pg);\n const filterWhere = clausesSql(filterCtx, q.filters, plan);\n const allParams: SqlValue[] = [...selCtx.params, ...filterCtx.params];\n const fullWhere =\n selWhere && filterWhere\n ? `${selWhere} AND ${filterWhere.replace(/^ WHERE /, '')}`\n : selWhere || filterWhere;\n\n const count = async (where: string, params: SqlValue[]): Promise<number> =>\n Number((await conn.query(`SELECT COUNT(*) AS \"n\" FROM ${table}${where}`, params))[0]?.n ?? 0);\n const selectedCount = await count(selWhere, selCtx.params);\n const matchedCount = q.filters.length === 0 ? selectedCount : await count(fullWhere, allParams);\n\n const ordering = orderSql(q.order, plan);\n const paging = pagingSql(q, pg);\n\n if (plan !== 'entries') {\n const pageSql = `SELECT \"payload\" FROM ${table}${fullWhere} ORDER BY ${ordering}${paging}`;\n const rows: unknown[] = (await conn.query(pageSql, allParams)).map((r) => decodeRowJson(String(r.payload)));\n const result = { projectionVersion: DOMAIN_PROJECTION_VERSION, selectedCount, matchedCount, plan, rows };\n // Parsed payloads re-typed by the shared plan schema (JSON columns are unknown).\n return result as DomainQueryResult;\n }\n\n const pageSql = `SELECT \"note_id\", \"payload\" FROM ${table}${fullWhere} ORDER BY ${ordering}${paging}`;\n const noteRows = await conn.query(pageSql, allParams);\n const buckets: [unknown[], unknown[], unknown[]][] = noteRows.map(() => [[], [], []]);\n const index = new Map<string, number>();\n noteRows.forEach((row, i) => index.set(String(row.note_id), i));\n for (let start = 0; start < noteRows.length; start += 500) {\n const ids = noteRows.slice(start, start + 500).map(row => String(row.note_id));\n const placeholders = ids.map(() => '?').join(', ');\n const statements = [\n { sql: `SELECT nt.\"i_by_note_0\" AS \"note_id\", t.\"data\" AS \"payload\" FROM \"note_tags\" nt JOIN \"tags\" t ON t.\"k0\" = nt.\"i_by_tag_0\" WHERE nt.\"i_by_note_0\" IN (${placeholders}) ORDER BY t.\"k0\"`, params: ids },\n { sql: `SELECT p.\"i_by_note_0\" AS \"note_id\", p.\"data\" AS \"payload\" FROM \"page_notes\" p WHERE p.\"i_by_note_0\" IN (${placeholders}) ORDER BY p.\"k0\"`, params: ids },\n { sql: `SELECT DISTINCT p.\"i_by_note_0\" AS \"note_id\", pg.\"data\" AS \"payload\" FROM \"page_notes\" p JOIN \"page\" pg ON pg.\"k0\" = p.\"i_by_page_0\" WHERE p.\"i_by_note_0\" IN (${placeholders}) ORDER BY pg.\"data\"`, params: ids },\n ];\n const relations = conn.batch ? await conn.batch(statements) : await (async () => {\n const rows = [];\n for (const statement of statements) rows.push(await conn.query(statement.sql, statement.params));\n return rows;\n })();\n relations.forEach((rows, relation) => rows.forEach(row => {\n const i = index.get(String(row.note_id));\n if (i !== undefined) buckets[i][relation].push(decodeRowJson(String(row.payload)));\n }));\n }\n const rows = noteRows.map((row, i) => {\n const [tags, links, pages] = buckets[i];\n return { note: decodeRowJson(String(row.payload)), tags, links, pages };\n });\n return { projectionVersion: DOMAIN_PROJECTION_VERSION, selectedCount, matchedCount, plan, rows } as DomainQueryResult;\n}\n\n/** Validate, gate, execute on one consistent snapshot (server route and\n * SqlStorage.queryDomain share this entry). */\nexport async function handleDomainQuery(db: Database, body: unknown): Promise<DomainQueryResult> {\n const query = parseQuery(body);\n return db.transaction(async (tx) => {\n // Counts and page must share one snapshot; writes keep the default level.\n if (db.dialect === 'postgres') await tx.exec('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ READ ONLY');\n await gate(tx);\n return execute(tx, query, db.dialect === 'postgres');\n });\n}\n","/** SQL storage with atomic, change-scoped projections and buffered reads. */\n\nimport type {\n IReadWriteStore,\n IReadOnlyStore,\n IStorage,\n IStorageTransaction,\n StoreName,\n StoreType,\n} from '../contract';\nimport type { DomainQuery, DomainQueryResult } from '../domain';\nimport { stampUserOwned } from '../membership';\nimport { STORE_DEFS, type StoreDef } from '../schema';\nimport {\n isRange,\n keyFromValue,\n rangeFromIDB,\n type KeyDTO,\n type RangeDTO,\n type TxOp,\n} from '../wire';\nimport {\n bufferedGet,\n bufferSlot,\n bufferToOps,\n isDirty,\n overlayRows,\n type BufferEntry,\n} from '../overlay';\nimport {\n countRows,\n getRow,\n initializeStore,\n listRows,\n putRow,\n wipeRows,\n getRows,\n listRowsFromIndexMany,\n} from './store';\nimport {\n handleDomainQuery,\n initializeDomain,\n refreshDomain,\n wipeDomain,\n} from './domain';\nimport { StorageError } from './errors';\nimport { libsqlDatabase, type Database, type SqlConnection } from './connection';\nimport { createClient } from '@libsql/client/web';\nimport { rowsEqual } from '../validation';\n\nexport interface SqlStorageOptions {\n /** Rows in user-owned stores are stamped with this userId on write. Omit\n * for stamp-free writers (data migration preserves ownership verbatim). */\n getUserId?: () => string;\n}\n\nexport class SqlStorage implements IStorage {\n private readonly db: Database;\n private readonly options: SqlStorageOptions;\n private readonly defs: Record<StoreName, StoreDef>;\n private readyPromise?: Promise<void>;\n\n constructor(db: Database, options: SqlStorageOptions = {}) {\n this.db = db;\n this.options = options;\n this.defs = Object.fromEntries(STORE_DEFS.map((d) => [d.name, d])) as Record<StoreName, StoreDef>;\n }\n\n /**\n * Idempotent schema + projection initialization. Cheap when already\n * compatible (both initializers are guard-protected); a failed attempt\n * clears the memo so the next call retries instead of caching the error.\n */\n ready(): Promise<void> {\n this.readyPromise ??= (async () => {\n try {\n await initializeStore(this.db);\n await initializeDomain(this.db);\n } catch (e) {\n this.readyPromise = undefined;\n throw e;\n }\n })();\n return this.readyPromise;\n }\n\n /** Every store operation starts here, so views created before (or during)\n * an in-flight ready() block until initialization actually succeeded. */\n ensureReady(): Promise<void> {\n return this.ready();\n }\n\n def(store: StoreName): StoreDef {\n const def = this.defs[store];\n if (!def) throw new StorageError(404, `SqlStorage: unknown store '${store}'`);\n return def;\n }\n\n private makeView<K extends StoreName>(\n store: K,\n conn: SqlConnection,\n mutable: boolean,\n buffer?: Map<string, BufferEntry>,\n cleared?: Set<StoreName>,\n ): IReadWriteStore<StoreType<K>> {\n return new SqlStore<StoreType<K>>(this, this.def(store), store, conn, mutable, buffer, cleared);\n }\n\n readonly<K extends StoreName>(store: K): IReadOnlyStore<StoreType<K>> {\n return this.makeView(store, this.db, false);\n }\n\n readwrite<K extends StoreName>(store: K): IReadWriteStore<StoreType<K>> {\n return this.makeView(store, this.db, true);\n }\n\n async queryDomain(query: DomainQuery): Promise<DomainQueryResult | undefined> {\n await this.ensureReady();\n try {\n return await handleDomainQuery(this.db, query);\n } catch (e) {\n // Same stale-projection fallback as ApiStorage's 409 mapping.\n if (e instanceof StorageError && e.code === 'domain_projection_unavailable') return undefined;\n throw e;\n }\n }\n\n async transaction<K extends StoreName, R>(\n stores: K[],\n mode: 'readonly' | 'readwrite',\n fn: (tx: IStorageTransaction) => Promise<R>,\n ): Promise<R> {\n await this.ensureReady();\n return this.runTx(stores, mode === 'readwrite', fn);\n }\n\n /** Bulk writes use the same affected-key refresh as ordinary transactions. */\n async bulkTransaction<K extends StoreName, R>(\n stores: K[],\n fn: (tx: IStorageTransaction) => Promise<R>,\n ): Promise<R> {\n await this.ensureReady();\n return this.runTx(stores, true, fn);\n }\n\n private runTx<K extends StoreName, R>(\n stores: K[],\n mutableMode: boolean,\n fn: (tx: IStorageTransaction) => Promise<R>,\n ): Promise<R> {\n const scoped = new Set<StoreName>(stores);\n const buffer = new Map<string, BufferEntry>();\n const cleared = new Set<StoreName>();\n return this.db.transaction(async (conn) => {\n const checkScope = (store: StoreName): void => {\n if (!scoped.has(store)) {\n throw new StorageError(400, `store '${store}' is outside this transaction's scope`, 'store_out_of_scope');\n }\n };\n const tx: IStorageTransaction = {\n readonly: <S extends StoreName>(store: S) => {\n checkScope(store);\n return this.makeView(store, conn, false, buffer, cleared);\n },\n readwrite: <S extends StoreName>(store: S) => {\n checkScope(store);\n if (!mutableMode) {\n throw new StorageError(403, 'transaction was opened readonly', 'read_only_transaction');\n }\n return this.makeView(store, conn, true, buffer, cleared);\n },\n };\n const result = await fn(tx);\n const ops = bufferToOps(STORE_DEFS.map((d) => d.name), buffer, cleared);\n if (ops.length > 0) {\n await refreshDomain(conn, ops);\n }\n return result;\n });\n }\n\n /**\n * Proves the backend accepts writes: one real INSERT into `meta` inside a\n * transaction that is then deliberately rolled back — zero rows committed.\n * A read-only backend, bad token or transport failure rejects here.\n */\n async verifyWritable(): Promise<void> {\n await this.ensureReady();\n const sentinel = new Error('verifyWritable: deliberate rollback sentinel');\n try {\n await this.db.transaction(async (conn) => {\n await putRow(conn, this.def('meta'), {\n key: `__wodwiki_write_check_${crypto.randomUUID()}`,\n value: '',\n });\n throw sentinel;\n });\n } catch (e) {\n if (e !== sentinel) throw e;\n }\n }\n\n async wipe(): Promise<void> {\n await this.ensureReady();\n await this.db.transaction(async (tx) => {\n await wipeRows(tx);\n await wipeDomain(tx);\n });\n }\n\n async close(): Promise<void> {\n await this.db.close();\n }\n\n // Internal seam for SqlStore views (same module): immediate op application\n // and write stamping.\n async applyOps(ops: TxOp[]): Promise<void> {\n await this.db.transaction((tx) => refreshDomain(tx, ops));\n }\n\n stamp(store: StoreName, value: unknown): unknown {\n const userId = this.options.getUserId?.();\n return userId ? stampUserOwned(store, value, userId) : value;\n }\n}\n\n/**\n * Store view over a SqlConnection. Outside a transaction writes apply\n * immediately (each in its own SQL tx with projection refresh); inside one,\n * writes buffer and reads overlay the buffer on committed rows. All\n * operations await backend readiness first.\n */\nclass SqlStore<T> implements IReadWriteStore<T> {\n constructor(\n private readonly owner: SqlStorage,\n private readonly def: StoreDef,\n private readonly store: StoreName,\n private readonly conn: SqlConnection,\n private readonly mutable: boolean,\n private readonly buffer?: Map<string, BufferEntry>,\n private readonly cleared?: Set<StoreName>,\n ) {}\n\n private assertMutable(): void {\n if (!this.mutable) {\n throw new StorageError(403, `${this.store} is opened read-only`, 'read_only_view');\n }\n }\n\n async get(key: IDBValidKey | RangeDTO): Promise<T | undefined> {\n await this.owner.ensureReady();\n const k = this.pointKey(key);\n const state = bufferedGet<T>(this.store, k, this.buffer);\n if (state) return state.hit ? state.value : undefined;\n if (this.cleared?.has(this.store)) return undefined;\n return getRow(this.conn, this.def, k) as Promise<T | undefined>;\n }\n\n async getMany(keys: IDBValidKey[]): Promise<(T | undefined)[]> {\n await this.owner.ensureReady();\n const normalized = keys.map(key => this.pointKey(key));\n const committed = this.cleared?.has(this.store) ? keys.map(() => undefined)\n : await getRows(this.conn, this.def, normalized) as (T | undefined)[];\n return normalized.map((key, i) => {\n const state = bufferedGet<T>(this.store, key, this.buffer);\n return state ? (state.hit ? state.value : undefined) : committed[i];\n });\n }\n\n async getAllFromIndexMany(indexName: string, keys: IDBValidKey[]): Promise<T[][]> {\n await this.owner.ensureReady();\n const rows = await listRowsFromIndexMany(this.conn, this.def, indexName, keys.map(key => this.pointKey(key)));\n return rows.map((values, i) => overlayRows<T>(this.def, this.store, this.buffer, this.cleared, values as T[], undefined, { only: this.pointKey(keys[i]) }, indexName));\n }\n\n async getAll(query?: IDBValidKey | IDBKeyRange | RangeDTO, count?: number): Promise<T[]> {\n await this.owner.ensureReady();\n const range = rangeFromIDB(query);\n const rows = await listRows(this.conn, this.def, range, isDirty(this.store, this.buffer, this.cleared) ? undefined : count);\n return overlayRows<T>(this.def, this.store, this.buffer, this.cleared, rows as T[], count, range);\n }\n\n async getAllFromIndex(indexName: string, query?: IDBValidKey | IDBKeyRange | RangeDTO, count?: number): Promise<T[]> {\n await this.owner.ensureReady();\n const range = rangeFromIDB(query);\n const rows = await listRows(this.conn, this.def, range, isDirty(this.store, this.buffer, this.cleared) ? undefined : count, indexName);\n return overlayRows<T>(this.def, this.store, this.buffer, this.cleared, rows as T[], count, range, indexName);\n }\n\n async count(query?: IDBValidKey | IDBKeyRange | RangeDTO): Promise<number> {\n await this.owner.ensureReady();\n const range = rangeFromIDB(query);\n if (!isDirty(this.store, this.buffer, this.cleared)) return countRows(this.conn, this.def, range);\n const rows = await listRows(this.conn, this.def, range);\n return overlayRows<T>(this.def, this.store, this.buffer, this.cleared, rows as T[], undefined, range).length;\n }\n\n async countFromIndex(indexName: string, query?: IDBValidKey | IDBKeyRange | RangeDTO): Promise<number> {\n await this.owner.ensureReady();\n const range = rangeFromIDB(query);\n if (!isDirty(this.store, this.buffer, this.cleared)) return countRows(this.conn, this.def, range, indexName);\n const rows = await listRows(this.conn, this.def, range, undefined, indexName);\n return overlayRows<T>(this.def, this.store, this.buffer, this.cleared, rows as T[], undefined, range, indexName).length;\n }\n\n async put(value: T, _key?: IDBValidKey): Promise<IDBValidKey> {\n await this.owner.ensureReady();\n this.assertMutable();\n const stored = this.owner.stamp(this.store, value) as T;\n const key = keyFromValue(this.def, stored);\n if (this.store === 'block_revisions') {\n const previous = this.buffer?.get(bufferSlot(this.store, key));\n if (previous?.kind === 'put' && !rowsEqual(previous.value, stored)) throw new StorageError(409, 'immutable block revision collision', 'revision_conflict');\n }\n if (this.buffer) {\n this.buffer.set(bufferSlot(this.store, key), { kind: 'put', value: stored });\n return key;\n }\n await this.owner.applyOps([{ op: 'put', store: this.store, value: stored }]);\n return key;\n }\n\n async putMany(values: T[], _keys?: IDBValidKey[]): Promise<IDBValidKey[]> {\n await this.owner.ensureReady();\n this.assertMutable();\n const stored = values.map(value => this.owner.stamp(this.store, value) as T);\n const keys = stored.map(value => keyFromValue(this.def, value));\n if (this.store === 'block_revisions') {\n const seen = new Map<string, unknown>();\n keys.forEach((key, i) => {\n const slot = bufferSlot(this.store, key), previous = this.buffer?.get(slot);\n const value = seen.has(slot) ? seen.get(slot) : previous?.kind === 'put' ? previous.value : undefined;\n if (value !== undefined && !rowsEqual(value, stored[i])) throw new StorageError(409, 'immutable block revision collision', 'revision_conflict');\n seen.set(slot, stored[i]);\n });\n }\n if (this.buffer) keys.forEach((key, i) => this.buffer!.set(bufferSlot(this.store, key), { kind: 'put', value: stored[i] }));\n else await this.owner.applyOps(stored.map(value => ({ op: 'put', store: this.store, value })));\n return keys;\n }\n\n async delete(key: IDBValidKey | IDBKeyRange | RangeDTO): Promise<void> {\n await this.owner.ensureReady();\n this.assertMutable();\n if (this.store === 'block_revisions') throw new StorageError(409, 'block history requires explicit wipe', 'revision_conflict');\n const range = isRange(key) ? key : undefined;\n const target = range ?? (key as KeyDTO);\n if (this.buffer) {\n if (range) {\n for (const row of await this.getAll(range)) {\n const rowKey = keyFromValue(this.def, row);\n this.buffer.set(bufferSlot(this.store, rowKey), { kind: 'delete', key: rowKey });\n }\n return;\n }\n const point = target as KeyDTO;\n this.buffer.set(bufferSlot(this.store, point), { kind: 'delete', key: point });\n return;\n }\n await this.owner.applyOps([{ op: 'delete', store: this.store, key: target as KeyDTO }]);\n }\n\n async clear(): Promise<void> {\n await this.owner.ensureReady();\n this.assertMutable();\n if (this.store === 'block_revisions') throw new StorageError(409, 'block history requires explicit wipe', 'revision_conflict');\n if (this.buffer) {\n this.cleared?.add(this.store);\n const prefix = `${this.store}\\u0000`;\n for (const slot of [...this.buffer.keys()]) {\n if (slot.startsWith(prefix)) this.buffer.delete(slot);\n }\n return;\n }\n await this.owner.applyOps([{ op: 'clear', store: this.store }]);\n }\n\n /** Normalizes get() arguments to a wire key (bounded ranges match no row). */\n private pointKey(key: IDBValidKey | RangeDTO): KeyDTO {\n if (isRange(key)) {\n if (key.only === undefined) {\n throw new StorageError(400, 'get() needs a plain key or {only}; bounded ranges match no single row');\n }\n return key.only;\n }\n return key as KeyDTO;\n }\n}\n\nexport interface TursoSettings {\n url: string;\n authToken?: string;\n}\n\n/** libsql/https/wss only; plain http only for loopback development; tokens\n * travel via authToken, never the URL. Rejects credentials, query strings\n * and fragments (no secret or option injection through the URL). */\nexport function validateTursoUrl(url: string): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new StorageError(400, 'invalid Turso URL', 'bad_turso_url');\n }\n if (url.includes('?') || url.includes('#')) {\n throw new StorageError(400, 'Turso URL must not carry a query or fragment; pass options/secrets via authToken', 'bad_turso_url');\n }\n if (parsed.username || parsed.password) {\n throw new StorageError(400, 'Turso URL must not embed credentials; pass them via authToken', 'bad_turso_url');\n }\n const loopback = parsed.hostname === '127.0.0.1' || parsed.hostname === 'localhost' || parsed.hostname === '[::1]';\n if (parsed.protocol === 'http:') {\n if (!loopback) {\n throw new StorageError(400, 'refusing plain http Turso URL (token would traverse the network unencrypted); use libsql:/https:', 'bad_turso_url');\n }\n return url;\n }\n if (parsed.protocol !== 'libsql:' && parsed.protocol !== 'https:' && parsed.protocol !== 'wss:') {\n throw new StorageError(400, `unsupported Turso URL scheme ${parsed.protocol} (expected libsql:, https:, wss:)`, 'bad_turso_url');\n }\n return url;\n}\n\n/**\n * Direct-from-browser Turso backend. Construction only validates and builds\n * the client; `await storage.ready()` initializes schema + projections.\n * Errors never embed the auth token.\n */\nexport class BrowserTursoStorage extends SqlStorage {\n constructor(settings: TursoSettings, options: SqlStorageOptions = {}) {\n super(\n libsqlDatabase(createClient({ url: validateTursoUrl(settings.url), authToken: settings.authToken })),\n options,\n );\n }\n}\n","/**\n * Native-copy verification + migration finalize — the pure-SQL seam the CLI\n * `wod db backup/restore/migrate` commands run over any libsql Database.\n *\n * - databaseFingerprint: canonical sha-256 over EVERY user table (schema\n * SQL + sorted typed-cell rows + the sync state row), so a Turso native\n * seed-copy can be proven row- and binary-identical (BLOB bytes are hex\n * encoded — JSON.stringify(ArrayBuffer) would collapse to {}) before any\n * credential is minted or paired. Rows are encoded as typed cells inside\n * JSON arrays and SORTED, so framing is unambiguous and rowid/physical\n * order differences after a native copy cannot produce a false mismatch.\n * - assertDatabaseCopyMatches: interrupted-copy AND concurrent-source\n * refusal — the source must be unchanged since the copy started and the\n * copy must match that exact snapshot.\n * - finalizeMigrationTarget: CAS that flips a migration target from the\n * non-legitimate \"constructing\" marker (state schema 0, unpairable by\n * engine refusal and by `wod db pair`) to the live schema in ONE\n * transaction, only after full replay/pin/binary validation passed.\n *\n * No source is ever mutated by these helpers (reads + one guarded state-row\n * UPDATE on the target). Fingerprint reads run inside one transaction so the\n * enumeration and the rows come from one consistent snapshot.\n */\n\nimport { StorageError } from './errors';\nimport { SYNC_STATE_TABLE, type StoredSyncOp, type SyncMutation } from './sync';\nimport type { StoreName } from '../contract';\nimport type { Database, SqlConnection } from './connection';\n\nexport interface DatabaseFingerprint {\n tables: number;\n rows: number;\n /** sha-256 hex over the canonical whole-database rendering. */\n digest: string;\n /** The sync protocol state row when this database carries that layout. */\n sync: { schema: number; rev: number } | undefined;\n}\n\n/** Canonical typed cell — the discriminant removes every text/number/null/\n * bytes ambiguity that raw string framing (or JSON.stringify of binary)\n * would lose. Hex keeps byte-exactness for BLOBs. */\ntype CanonicalCell = { s: string } | { n: number } | { i: string } | { z: null } | { b: string };\n\nfunction bytesToHex(bytes: Uint8Array): string {\n let hex = '';\n for (const byte of bytes) hex += byte.toString(16).padStart(2, '0');\n return hex;\n}\n\nfunction toCanonicalCell(value: unknown): CanonicalCell {\n if (value === null) return { z: null };\n if (typeof value === 'string') return { s: value };\n if (typeof value === 'number') return { n: value };\n if (typeof value === 'bigint') return { i: value.toString() };\n if (value instanceof Uint8Array) return { b: bytesToHex(value) };\n if (value instanceof ArrayBuffer) return { b: bytesToHex(new Uint8Array(value)) };\n throw new StorageError(500, `fingerprint cannot encode cell of type ${typeof value}`, 'bad_fingerprint_cell');\n}\n\n/** Quote a table identifier for generated SQL (embedded quotes doubled). */\nfunction quoteIdent(name: string): string {\n return `\"${name.replace(/\"/g, '\"\"')}\"`;\n}\n\nasync function sha256(text: string): Promise<string> {\n const subtle = globalThis.crypto?.subtle;\n if (!subtle) throw new StorageError(500, 'Web Crypto unavailable — cannot fingerprint the database', 'no_webcrypto');\n const bytes = new Uint8Array(await subtle.digest('SHA-256', new TextEncoder().encode(text)));\n return [...bytes].map((b) => b.toString(16).padStart(2, '0')).join('');\n}\n\ninterface SyncMarker {\n schema: number;\n rev: number;\n}\n\n/** Validated sync state row, or undefined when the table is absent. */\nasync function readStateMarker(conn: SqlConnection): Promise<SyncMarker | undefined> {\n const tables = await conn.query(\n `SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?`,\n [SYNC_STATE_TABLE],\n );\n if (tables.length === 0) return undefined;\n const rows = await conn.query(`SELECT \"value\" FROM ${quoteIdent(SYNC_STATE_TABLE)} WHERE \"key\" = 'meta'`);\n const raw = rows[0]?.value;\n if (typeof raw !== 'string') {\n throw new StorageError(400, 'sync target is not initialized', 'sync_not_initialized');\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new StorageError(400, 'malformed sync state row', 'bad_sync_state');\n }\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new StorageError(400, 'malformed sync state row', 'bad_sync_state');\n }\n if (!('schema' in parsed) || !('rev' in parsed)) {\n throw new StorageError(400, 'sync state row is missing schema/rev', 'bad_sync_state');\n }\n const { schema, rev } = parsed;\n if (typeof schema !== 'number' || !Number.isSafeInteger(schema) || schema < 0\n || typeof rev !== 'number' || !Number.isSafeInteger(rev) || rev < 0) {\n throw new StorageError(400, 'sync state schema/rev must be non-negative safe integers', 'bad_sync_state');\n }\n return { schema, rev };\n}\n\n// ponytail: whole-table fingerprint — every row is scanned and hashed per\n// verify run; fine for personal workout databases, chunk by key ranges when\n// a database outgrows memory.\n/**\n * Canonical fingerprint of every user table (sqlite_% / libsql_% internal\n * tables excluded): per table the CREATE statement text plus its rows as\n * typed-cell JSON arrays, SORTED so physical row order cannot influence the\n * digest. Reads run inside one transaction for a consistent snapshot.\n */\nexport async function databaseFingerprint(db: Database): Promise<DatabaseFingerprint> {\n return db.transaction(async (tx) => {\n const tableRows = await tx.query(\n `SELECT name, sql FROM sqlite_master WHERE type = 'table'` +\n ` AND name NOT LIKE 'sqlite\\\\_%' ESCAPE '\\\\' AND name NOT LIKE 'libsql\\\\_%' ESCAPE '\\\\'`,\n );\n const tables = tableRows\n .map((row) => ({ name: String(row.name), createSql: typeof row.sql === 'string' ? row.sql : '' }))\n .sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n const sections: string[] = ['wod-wiki-db-fingerprint-v2'];\n let totalRows = 0;\n for (const table of tables) {\n const rows = await tx.query(`SELECT * FROM ${quoteIdent(table.name)}`);\n totalRows += rows.length;\n const encoded = rows.map((row) => JSON.stringify(Object.values(row).map(toCanonicalCell)));\n encoded.sort();\n sections.push(`table ${table.name}`, `schema ${table.createSql}`, `rows ${rows.length}`, ...encoded);\n }\n const sync = await readStateMarker(tx);\n return { tables: tables.length, rows: totalRows, digest: await sha256(sections.join('\\n')), sync };\n });\n}\n\n/**\n * Prove a native copy: the copy must equal the exact source snapshot the\n * caller fingerprinted BEFORE starting the copy (`before`), and the source\n * must not have advanced meanwhile (writers were supposed to be retired).\n * Returns the re-read source fingerprint.\n */\nexport async function assertDatabaseCopyMatches(\n source: Database,\n copy: Database,\n before: DatabaseFingerprint,\n): Promise<DatabaseFingerprint> {\n const after = await databaseFingerprint(source);\n if (after.digest !== before.digest) {\n throw new StorageError(\n 409,\n 'source database changed during the copy — a writer is still active; retire all writers and retry',\n 'source_moved',\n );\n }\n const copied = await databaseFingerprint(copy);\n if (copied.digest !== before.digest) {\n throw new StorageError(\n 409,\n `copy is incomplete or divergent (copy: ${copied.tables} tables / ${copied.rows} rows, source: ${before.tables} tables / ${before.rows} rows)`,\n 'copy_mismatch',\n );\n }\n return after;\n}\n\n/**\n * CAS-finalize a migration target constructed at the non-legitimate marker\n * schema 0: requires the state row to be exactly {schema: 0, rev:\n * expectRev}, then publishes the live schema in the same transaction. A\n * target that never reaches this call stays schema 0 — probes report\n * current/0, which no client accepts and `wod db pair` refuses.\n */\nexport async function finalizeMigrationTarget(db: Database, toSchema: number, expectRev: number): Promise<void> {\n if (!Number.isSafeInteger(toSchema) || toSchema < 1) {\n throw new StorageError(400, 'finalize requires a positive schema version', 'bad_sync_state');\n }\n await db.transaction(async (tx) => {\n const marker = await readStateMarker(tx);\n if (!marker || marker.schema !== 0 || marker.rev !== expectRev) {\n throw new StorageError(\n 409,\n `migration target is not in constructing state (expected schema 0 at rev ${expectRev}, found ${marker ? `schema ${marker.schema} at rev ${marker.rev}` : 'no state row'})`,\n 'migration_not_constructing',\n );\n }\n await tx.exec(\n `UPDATE ${quoteIdent(SYNC_STATE_TABLE)} SET \"value\" = ? WHERE \"key\" = 'meta'`,\n [JSON.stringify({ schema: toSchema, rev: expectRev })],\n );\n });\n}\n\nfunction pinKey(noteId: unknown, blockId: unknown, version: unknown): string {\n return `${String(noteId)}\\u0000${String(blockId)}\\u0000${String(version)}`;\n}\n\n/**\n * Policy snapshot validation shared by `wod db migrate` (pre-write) and\n * `wod db pair` (over the full replayed remote log): a user-scope snapshot\n * is policy-compliant PUTS ONLY — any delete/clear/wipe means non-user\n * policy operations leaked into the copy — and every session pin and note\n * block pin must have its immutable block_revisions row present (missing\n * pins fail the copy, they are never silently dropped).\n */\nexport function assertPolicySnapshot(ops: readonly SyncMutation[]): void {\n const revisions = new Set<string>();\n for (const mutation of ops) {\n if (mutation.op !== 'put') {\n throw new StorageError(\n 400,\n `policy snapshot contains a non-put operation (${mutation.op}) — refusing`,\n 'policy_violation',\n );\n }\n if (mutation.store !== 'block_revisions') continue;\n const row = mutation.value;\n if (typeof row !== 'object' || row === null || !('noteId' in row) || !('blockId' in row) || !('version' in row)) {\n throw new StorageError(400, 'block_revisions row is missing noteId/blockId/version', 'policy_violation');\n }\n revisions.add(pinKey(row.noteId, row.blockId, row.version));\n }\n const check = (noteId: unknown, blockId: unknown, version: unknown, what: string): void => {\n if (!revisions.has(pinKey(noteId, blockId, version))) {\n throw new StorageError(\n 400,\n `${what} pins [${String(noteId)}, ${String(blockId)}, ${String(version)}] but the snapshot has no such immutable revision`,\n 'policy_violation',\n );\n }\n };\n for (const mutation of ops) {\n if (mutation.op !== 'put') continue;\n if (mutation.store === 'sessions') {\n const row = mutation.value;\n if (typeof row !== 'object' || row === null || !('noteId' in row) || !('blockId' in row) || !('blockVersion' in row)) {\n throw new StorageError(400, 'session row is missing noteId/blockId/blockVersion', 'policy_violation');\n }\n check(row.noteId, row.blockId, row.blockVersion, 'a session');\n } else if (mutation.store === 'notes') {\n const row = mutation.value;\n if (typeof row !== 'object' || row === null || !('id' in row) || !('blocks' in row)) {\n throw new StorageError(400, 'note row is missing id/blocks', 'policy_violation');\n }\n if (typeof row.blocks !== 'object' || row.blocks === null) continue;\n for (const block of Object.values(row.blocks)) {\n if (typeof block !== 'object' || block === null || !('id' in block) || !('version' in block)) {\n throw new StorageError(400, 'note block entry is missing id/version', 'policy_violation');\n }\n check(row.id, block.id, block.version, 'a note block');\n }\n }\n }\n}\n\nfunction logKey(store: StoreName, key: unknown): string {\n return `${store}\\u0000${JSON.stringify(key) ?? String(key)}`;\n}\n\n/**\n * Pin closure over a LIVE op log (pair verification): unlike a conversion\n * snapshot, an operational log legitimately contains delete/clear/wipe\n * tombstones, so the CURRENT row set is replayed first and only live\n * sessions/notes must find their immutable revisions. Anything deleted is\n * not required to have one.\n */\nexport function assertLogPinClosure(ops: readonly StoredSyncOp[]): void {\n const live = new Map<string, { store: StoreName; value: Record<string, unknown> }>();\n for (const { mutation } of ops) {\n if (mutation.op === 'put') {\n live.set(logKey(mutation.store, mutation.key), { store: mutation.store, value: mutation.value as Record<string, unknown> });\n } else if (mutation.op === 'delete') {\n live.delete(logKey(mutation.store, mutation.key));\n } else if (mutation.op === 'clear') {\n for (const key of live.keys()) {\n if (key.startsWith(`${mutation.store}\\u0000`)) live.delete(key);\n }\n } else {\n live.clear();\n }\n }\n const revisions = new Set<string>();\n for (const row of live.values()) {\n if (row.store !== 'block_revisions') continue;\n if (!('noteId' in row.value) || !('blockId' in row.value) || !('version' in row.value)) {\n throw new StorageError(400, 'block_revisions row is missing noteId/blockId/version', 'policy_violation');\n }\n revisions.add(pinKey(row.value.noteId, row.value.blockId, row.value.version));\n }\n const check = (noteId: unknown, blockId: unknown, version: unknown, what: string): void => {\n if (!revisions.has(pinKey(noteId, blockId, version))) {\n throw new StorageError(\n 400,\n `${what} pins [${String(noteId)}, ${String(blockId)}, ${String(version)}] but the target has no live immutable revision for it`,\n 'policy_violation',\n );\n }\n };\n for (const row of live.values()) {\n if (row.store === 'sessions') {\n if (!('noteId' in row.value) || !('blockId' in row.value) || !('blockVersion' in row.value)) {\n throw new StorageError(400, 'session row is missing noteId/blockId/blockVersion', 'policy_violation');\n }\n check(row.value.noteId, row.value.blockId, row.value.blockVersion, 'a live session');\n } else if (row.store === 'notes') {\n if (!('id' in row.value) || !('blocks' in row.value)) {\n throw new StorageError(400, 'note row is missing id/blocks', 'policy_violation');\n }\n if (typeof row.value.blocks !== 'object' || row.value.blocks === null) continue;\n for (const block of Object.values(row.value.blocks)) {\n if (typeof block !== 'object' || block === null || !('id' in block) || !('version' in block)) {\n throw new StorageError(400, 'note block entry is missing id/version', 'policy_violation');\n }\n check(row.value.id, block.id, block.version, 'a live note block');\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/sql/domain.ts","../../src/sql/storage.ts","../../src/sql/backup.ts"],"names":["pageSql","rows","text"],"mappings":"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","file":"index.mjs","sourcesContent":["/** Current Note and actionable-block SQL projections. */\n\nimport type { Database, SqlConnection, SqlValue } from './connection';\nimport { StorageError } from './errors';\nimport { putRows, deleteRows, clearRows, getRows, listRows, storeDefinition, SCHEMA_TABLE, batchInsert, deleteIn } from './store';\nimport { decodeRowJson, encodeRowJson } from './codec';\nimport { DB_VERSION, STORE_DEFS } from '../schema';\nimport type { StoreDef } from '../schema';\nimport type { StoreName } from '../contract';\nimport {\n DOMAIN_PROJECTION_VERSION,\n type DomainPredicate,\n type DomainQueryResult,\n} from '../domain';\nimport { isRange, keyFromValue, type KeyDTO, type RangeDTO, type TxOp } from '../wire';\n// The app's own source/catalog semantics — no duplicated matchers. The\n// sourceId prefixes/exact literals below are built from the SAME shape table\n// the JS `sourceMatches` predicate reads, so the wire and the JS filter are\n// one decision (ticket 02); `journal` is the resolver's materialized answer.\nimport { hasLegacyIdentity, migrateLegacyRow, sourceMatches, sourceShape, WQL_SOURCE_VALUES } from '@bitcobblers/wod-wiki-wql';\nimport { rowsEqual, validateStoredPins } from '../validation';\nimport type { BlockRevision, Note, Session } from '../entities';\n\nconst TABLES = ['domain_note', 'query_block'] as const;\n\nconst PROJECTION_GUARD_KEY = 'domain_projection';\n\ntype SourceItem = Parameters<typeof sourceMatches>[0];\n\nfunction sourceNote(row: Record<string, unknown>): SourceItem {\n const item: SourceItem = {};\n for (const key of ['id', 'noteId', 'sourceId', 'type', 'seedOrigin', 'seedChunkId', 'feedOrigin', 'feedSourceId', 'sourcePath', 'notebookId'] as const) {\n const value = row[key];\n if (typeof value === 'string') item[key] = value;\n else if (value != null) throw new StorageError(400, `${key} must be a string`);\n }\n // Tags are resolver inputs (the `notebook:` convention outranks the\n // journal fallback) — the projection must see what the resolver sees.\n const tags = row['tags'];\n if (tags !== undefined && tags !== null) {\n if (!Array.isArray(tags) || !tags.every((t) => typeof t === 'string')) throw new StorageError(400, 'tags must be a string array');\n item.tags = tags as readonly string[];\n }\n return item;\n}\n\ninterface NoteIdentity { note_id: string; date: number | null; created_at: number; note: Note }\n\nconst num = (v: unknown): number | null => (typeof v === 'number' && Number.isFinite(v) ? v : null);\nconst text = (v: unknown): string | null => (typeof v === 'string' ? v : null);\nconst T = (v: unknown): SqlValue => (text(v) as SqlValue) ?? null;\nconst N = (v: unknown): SqlValue => num(v) ?? 0;\n\n// ── DDL (engine-neutral; numeric suffix only differs on postgres) ──────────\n\nfunction ensureDdl(db: Database): Promise<void> {\n const n = db.dialect === 'postgres' ? ' DOUBLE PRECISION' : '';\n const t = db.dialect === 'postgres' ? ' TEXT COLLATE \"C\"' : ' TEXT';\n const ddl = [\n `CREATE TABLE IF NOT EXISTS \"domain_note\" (\"note_id\"${t} PRIMARY KEY NOT NULL, \"note_type\"${t}, \"source_id\"${t}, \"source_path\"${t}, \"title\"${t} NOT NULL, \"title_search\"${t} NOT NULL, \"created_at\"${n} NOT NULL, \"date\"${n}, \"text_search\"${t} NOT NULL, \"journal\"${n} NOT NULL, \"payload\"${t} NOT NULL)`,\n `CREATE INDEX IF NOT EXISTS \"idx_domain_note_date\" ON \"domain_note\" (\"date\", \"note_id\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_domain_note_created\" ON \"domain_note\" (\"created_at\", \"note_id\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_domain_note_source_path\" ON \"domain_note\" (\"source_path\")`,\n `CREATE TABLE IF NOT EXISTS \"query_block\" (\"occurrence_id\"${t} PRIMARY KEY NOT NULL, \"source_note_id\"${t}, \"parent_note_id\"${t}, \"content_id\"${t}, \"section_key\"${t}, \"ordinal\"${n} NOT NULL, \"data_type\"${t}, \"source_id\"${t}, \"source_path\"${t}, \"effective_date\"${n} NOT NULL, \"created_at\"${n} NOT NULL, \"note_title\"${t}, \"normalized_text\"${t} NOT NULL, \"journal\"${n} NOT NULL, \"payload\"${t} NOT NULL)`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_type\" ON \"query_block\" (\"data_type\", \"effective_date\", \"occurrence_id\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_parent\" ON \"query_block\" (\"parent_note_id\", \"ordinal\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_content\" ON \"query_block\" (\"content_id\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_source_path\" ON \"query_block\" (\"source_path\")`,\n `CREATE INDEX IF NOT EXISTS \"idx_query_block_source_note\" ON \"query_block\" (\"source_note_id\")`,\n ];\n return db.transaction(async (tx) => {\n for (const sql of ddl) await tx.exec(sql);\n });\n}\n\n\nconst DOMAIN_NOTE_COLS = ['note_id','note_type','source_id','source_path','title','title_search','created_at','date','text_search','journal','payload'] as const;\nconst QUERY_BLOCK_COLS = ['occurrence_id','source_note_id','parent_note_id','content_id','section_key','ordinal','data_type','source_id','source_path','effective_date','created_at','note_title','normalized_text','journal','payload'] as const;\n\nconst conflictUpdate = (table: string, cols: readonly string[], keys: readonly string[]): string =>\n `ON CONFLICT (${keys.map((k) => `\"${k}\"`).join(', ')}) DO UPDATE SET ` +\n cols.filter((c) => !keys.includes(c)).map((c) => `\"${c}\" = excluded.\"${c}\"`).join(',') +\n ` WHERE ` + cols.filter(col => !keys.includes(col)).map(col => `\"${table}\".\"${col}\" IS DISTINCT FROM excluded.\"${col}\"`).join(' OR ');\n\n/** One domain_note row; undefined when the note has no identity (store write\n * still succeeds — nothing to project). */\nfunction domainNoteRow(note: Record<string, unknown>): SqlValue[] | undefined {\n const id = text(note.id);\n if (!id) return undefined;\n const source = sourceNote(note);\n return [\n id,\n T(note.type),\n T(note.sourceId),\n T(note.sourcePath),\n T(note.title) ?? '',\n (text(note.title) ?? '').toLowerCase(),\n N(note.createdAt),\n num(note.date),\n (text(note.rawContent) ?? '').toLowerCase(),\n sourceMatches(source, 'journal') ? 1 : 0,\n encodeRowJson(note),\n ];\n}\n\nasync function upsertDomainNotes(conn: SqlConnection, notes: Record<string, unknown>[]): Promise<void> {\n const rows = notes.map(domainNoteRow).filter((r): r is SqlValue[] => r !== undefined);\n await batchInsert(conn, 'domain_note', [...DOMAIN_NOTE_COLS], rows, conflictUpdate('domain_note', DOMAIN_NOTE_COLS, ['note_id']));\n}\n\n\n/** One query_block row; undefined when the block has no identity. */\nfunction queryBlockRow(block: Record<string, unknown>, parent: NoteIdentity | undefined): SqlValue[] | undefined {\n const id = text(block.id);\n if (!id) return undefined;\n const source = sourceNote(block);\n const createdAt = N(block.createdAt);\n const effective = parent ? (parent.date ?? parent.created_at) : createdAt;\n return [\n id,\n T(block.noteId),\n parent?.note_id ?? null,\n T(block.blockContentId),\n T(block.blockId),\n num(block.position),\n T(block.dataType),\n T(block.sourceId),\n T(block.sourcePath),\n effective,\n createdAt,\n parent?.note.title ?? T(block.noteTitle),\n (text(block.rawContent) ?? '').toLowerCase(),\n sourceMatches(source, 'journal') ? 1 : 0,\n encodeRowJson(parent ? { ...block, noteTitle: parent.note.title } : block),\n ];\n}\n\nasync function upsertQueryBlocks(conn: SqlConnection, blocks: [Record<string, unknown>, NoteIdentity | undefined][]): Promise<void> {\n const rows = blocks.map(([b, p]) => queryBlockRow(b, p)).filter((r): r is SqlValue[] => r !== undefined);\n await batchInsert(conn, 'query_block', [...QUERY_BLOCK_COLS], rows, conflictUpdate('query_block', QUERY_BLOCK_COLS, ['occurrence_id']));\n}\n\n// ── Parent identity resolution ───────────────────────────────────────────────\n\ninterface ParentIndex { byNoteId: Map<string, NoteIdentity> }\n\nfunction indexNoteIdentities(notes: Iterable<Record<string, unknown>>): ParentIndex {\n const byNoteId = new Map<string, NoteIdentity>();\n for (const note of notes) {\n const id = text(note.id);\n if (id) byNoteId.set(id, { note_id: id, date: num(note.date), created_at: num(note.createdAt) ?? 0, note: note as unknown as Note });\n }\n return { byNoteId };\n}\n\nfunction resolveParentFrom(index: ParentIndex, block: Record<string, unknown>): NoteIdentity | undefined {\n const parent = typeof block.noteId === 'string' ? index.byNoteId.get(block.noteId) : undefined;\n const mapped = typeof block.blockId === 'string' ? parent?.note.blocks[block.blockId] : undefined;\n return parent && mapped && block.id === `${parent.note_id}:${mapped.id}`\n && block.blockVersion === mapped.version && block.dataType === mapped.kind\n && block.sourceRevision === parent.note.sourceRevision && block.from === mapped.from && block.to === mapped.to\n && block.rawContent === parent.note.rawContent.slice(mapped.from, mapped.to) ? parent : undefined;\n}\n\nasync function fetchParentIndex(conn: SqlConnection, noteIds: string[]): Promise<ParentIndex> {\n const notes = await getRows(conn, storeDefinition('notes'), noteIds);\n return indexNoteIdentities(notes.filter((row): row is Record<string, unknown> => row !== undefined));\n}\n\n// ── Per-key refresh ──────────────────────────────────────────────────────────\n\nconst keyHead = (key: KeyDTO): SqlValue => (Array.isArray(key) ? (key[0] as SqlValue) : key);\n\n/** Chunked `col IN (…)` SELECT returning the first column as strings. */\nasync function selectIn(conn: SqlConnection, selectCol: string, table: string, col: string, vals: SqlValue[]): Promise<string[]> {\n const IN_CHUNK = 500;\n const out: string[] = [];\n for (let i = 0; i < vals.length; i += IN_CHUNK) {\n const part = vals.slice(i, i + IN_CHUNK);\n const rows = await conn.query(`SELECT \"${selectCol}\" FROM \"${table}\" WHERE \"${col}\" IN (${part.map(() => '?').join(', ')})`, part);\n for (const r of rows) out.push(String(r[selectCol]));\n }\n return out;\n}\n\nasync function healQueryBlocksForNotes(conn: SqlConnection, noteIds: string[]): Promise<void> {\n const ids = await selectIn(conn, 'occurrence_id', 'query_block', 'source_note_id', noteIds);\n await refreshBlocks(conn, [...new Set(ids)]);\n}\n\nasync function refreshNotes(conn: SqlConnection, ids: KeyDTO[]): Promise<void> {\n const ks = [...new Set(ids.map((id) => String(keyHead(id))))];\n if (ks.length === 0) return;\n const found = new Map<string, Record<string, unknown>>();\n for (let i = 0; i < ks.length; i += 500) {\n const part = ks.slice(i, i + 500);\n const rows = await conn.query(`SELECT \"k0\", \"data\" FROM \"notes\" WHERE \"k0\" IN (${part.map(() => '?').join(', ')})`, part);\n for (const row of rows) found.set(String(row.k0), decodeRowJson<Record<string, unknown>>(String(row.data)));\n }\n const present: Record<string, unknown>[] = [];\n const missing: string[] = [];\n for (const k of ks) {\n const note = found.get(k);\n if (note) present.push(note);\n else missing.push(k);\n }\n await upsertDomainNotes(conn, present);\n const presentIds = present.map((n) => text(n.id)).filter((x): x is string => !!x);\n await healQueryBlocksForNotes(conn, presentIds);\n await deleteIn(conn, 'domain_note', 'note_id', missing);\n await deleteIn(conn, 'query_block', 'source_note_id', missing);\n await deleteIn(conn, 'block_index', 'i_by_note_0', missing);\n await deleteIn(conn, 'block_efforts', 'i_by_note_0', missing);\n}\n\n\nasync function refreshBlocks(conn: SqlConnection, ids: KeyDTO[]): Promise<void> {\n const ks = [...new Set(ids.map((id) => String(keyHead(id))))];\n if (ks.length === 0) return;\n const found = new Map<string, Record<string, unknown>>();\n for (let i = 0; i < ks.length; i += 500) {\n const part = ks.slice(i, i + 500);\n const rows = await conn.query(`SELECT \"k0\", \"data\" FROM \"block_index\" WHERE \"k0\" IN (${part.map(() => '?').join(', ')})`, part);\n for (const row of rows) found.set(String(row.k0), decodeRowJson<Record<string, unknown>>(String(row.data)));\n }\n const blocks = [...found.values()];\n const noteIds = [...new Set(blocks.map((b) => text(b.noteId)).filter((x): x is string => !!x))];\n const index = await fetchParentIndex(conn, noteIds);\n await upsertQueryBlocks(conn, blocks.map((b) => [b, resolveParentFrom(index, b)]));\n await deleteIn(conn, 'query_block', 'occurrence_id', ks.filter((k) => !found.has(k)));\n}\n\ninterface Impact {\n notes: KeyDTO[];\n pinnedNotes: Note[];\n pinnedSessions: Session[];\n blocks: KeyDTO[];\n notesClear: boolean;\n blocksClear: boolean;\n}\n\nconst TRACKED: Partial<Record<StoreName, 'notes' | 'blocks'>> = {\n notes: 'notes',\n block_index: 'blocks',\n};\n\nasync function deleteTargetKeys(conn: SqlConnection, def: StoreDef, target: KeyDTO | RangeDTO): Promise<KeyDTO[]> {\n if (!isRange(target)) return [target];\n const rows = await listRows(conn, def, target);\n return rows.map((row) => keyFromValue(def, row));\n}\n\n/** Checks precede mutations; pins and projections commit with source rows. */\nexport async function refreshDomain(\n conn: SqlConnection,\n ops: TxOp[],\n): Promise<(KeyDTO | null)[]> {\n const impact: Impact = {\n notes: [], blocks: [], pinnedNotes: [], pinnedSessions: [],\n notesClear: false, blocksClear: false,\n };\n const results: (KeyDTO | null)[] = [];\n for (const op of ops) if (op === null || typeof op !== 'object' || Array.isArray(op)) throw new StorageError(400, 'tx op must be an object');\n const checks = ops.filter((op): op is Extract<TxOp, {op: 'check'}> => op.op === 'check');\n const checkStores = [...new Set(checks.map(op => op.store))];\n for (const store of checkStores) {\n const scoped = checks.filter(op => op.store === store);\n const actual = await getRows(conn, storeDefinition(store), scoped.map(op => op.key));\n scoped.forEach((op, i) => {\n if (!rowsEqual(actual[i] ?? null, op.value)) throw new StorageError(409, 'transaction read changed before commit', 'transaction_conflict');\n });\n }\n // Consecutive puts on one store flush as chunked multi-row INSERTs; the\n // flush also precedes any delete/clear so range deletes observe them.\n let pending: { def: StoreDef; values: unknown[] } | undefined;\n const flushPuts = async (): Promise<void> => {\n if (!pending) return;\n const batch = pending;\n pending = undefined;\n if (batch.values.length === 0) return;\n const changed: KeyDTO[] = [];\n const keys = await putRows(conn, batch.def, batch.values, changed);\n const slot = TRACKED[batch.def.name];\n if (slot) impact[slot].push(...changed);\n const changedSet = new Set(changed.map(key => JSON.stringify(key)));\n if (batch.def.name === 'notes') impact.pinnedNotes.push(...batch.values.filter(value => changedSet.has(JSON.stringify(keyFromValue(batch.def, value)))) as Note[]);\n if (batch.def.name === 'sessions') impact.pinnedSessions.push(...batch.values.filter(value => changedSet.has(JSON.stringify(keyFromValue(batch.def, value)))) as Session[]);\n results.push(...keys);\n };\n for (const op of ops) {\n if (op.op === 'check') { results.push(null); continue; }\n const store = 'store' in op ? op.store : undefined;\n const def = storeDefinition(typeof store === 'string' ? store : String(store));\n const kind: unknown = typeof op.op === 'string' ? op.op : undefined; // runtime junk tolerated\n if (op.op === 'put') {\n if (pending && pending.def.name !== def.name) await flushPuts();\n (pending ??= { def, values: [] }).values.push(op.value);\n } else if (op.op === 'delete') {\n await flushPuts();\n const slot = TRACKED[def.name];\n if (slot) {\n // op.key types as KeyDTO on the wire, but deleteRows honours ranges too.\n for (const key of await deleteTargetKeys(conn, def, op.key as KeyDTO | RangeDTO)) impact[slot].push(key);\n }\n await deleteRows(conn, def, op.key as KeyDTO | RangeDTO);\n results.push(null);\n } else if (op.op === 'clear') {\n await flushPuts();\n await clearRows(conn, def);\n if (def.name === 'notes') impact.notesClear = true;\n else if (def.name === 'block_index') impact.blocksClear = true;\n results.push(null);\n } else {\n throw new StorageError(400, `tx op must be check | put | delete | clear, got: ${String(kind)}`);\n }\n }\n await flushPuts();\n const finalNotes = (await getRows(conn, storeDefinition('notes'), [...new Set(impact.pinnedNotes.map(note => note.id))])).filter(Boolean) as Note[];\n const finalSessions = (await getRows(conn, storeDefinition('sessions'), [...new Set(impact.pinnedSessions.map(session => session.id))])).filter(Boolean) as Session[];\n await validateStoredPins(finalNotes, finalSessions, keys => getRows(conn, storeDefinition('block_revisions'), keys as KeyDTO[]) as Promise<(BlockRevision | undefined)[]>);\n await refresh(conn, impact);\n return results;\n}\n\nasync function refresh(conn: SqlConnection, impact: Impact): Promise<void> {\n // Clears stage first: a tx of [clear, put n1] must end with exactly n1\n // projected, and [put n1, clear] with nothing — clearing the derived rows\n // before re-projecting surviving keys satisfies both orders.\n if (impact.notesClear) {\n await conn.exec(`DELETE FROM \"domain_note\"`);\n await conn.exec(`DELETE FROM \"query_block\" WHERE \"source_note_id\" NOT IN (SELECT \"k0\" FROM \"notes\")`);\n await conn.exec(`DELETE FROM \"block_index\" WHERE \"i_by_note_0\" NOT IN (SELECT \"k0\" FROM \"notes\")`);\n await conn.exec(`DELETE FROM \"block_efforts\" WHERE \"i_by_note_0\" NOT IN (SELECT \"k0\" FROM \"notes\")`);\n }\n if (impact.blocksClear) await conn.exec(`DELETE FROM \"query_block\"`);\n await refreshNotes(conn, impact.notes);\n await refreshBlocks(conn, impact.blocks);\n}\n\n/**\n * Rebuild the derived tables from the source-of-truth store rows and stamp\n * the projection guard. Caller owns the transaction (atomicity) — the guard\n * row commits together with the rebuilt rows.\n */\nexport async function rebuildProjections(conn: SqlConnection): Promise<void> {\n await conn.exec(\n `CREATE TABLE IF NOT EXISTS \"${SCHEMA_TABLE}\" (\"key\" TEXT PRIMARY KEY, \"value\" TEXT NOT NULL)`,\n );\n for (const t of TABLES) await conn.exec(`DELETE FROM \"${t}\"`);\n // The notebook-vocabulary migration (ticket 12) folds retired\n // collection/feed identities on the store rows themselves before they are\n // projected — the projection derives journal/source columns from these\n // identities, so it must never see a legacy row.\n const notes = await conn.query(`SELECT \"k0\", \"data\" FROM \"notes\"`);\n const noteObjs = notes.map((row) => migrateLegacyRow(decodeRowJson<Record<string, unknown>>(String(row.data))));\n for (let i = 0; i < notes.length; i++) {\n if (hasLegacyIdentity(decodeRowJson<Record<string, unknown>>(String(notes[i]!.data)))) {\n await conn.exec(`UPDATE \"notes\" SET \"data\" = ? WHERE \"k0\" = ?`, [encodeRowJson(noteObjs[i]!), String(notes[i]!.k0)]);\n }\n }\n await upsertDomainNotes(conn, noteObjs);\n const blocks = await conn.query(`SELECT \"k0\", \"data\" FROM \"block_index\"`);\n const blockObjs = blocks.map((row) => migrateLegacyRow(decodeRowJson<Record<string, unknown>>(String(row.data))));\n for (let i = 0; i < blocks.length; i++) {\n if (hasLegacyIdentity(decodeRowJson<Record<string, unknown>>(String(blocks[i]!.data)))) {\n await conn.exec(`UPDATE \"block_index\" SET \"data\" = ? WHERE \"k0\" = ?`, [encodeRowJson(blockObjs[i]!), String(blocks[i]!.k0)]);\n }\n }\n // domain_note was just rebuilt from exactly these notes — parent identity\n // resolves in memory instead of one query per block.\n const index = indexNoteIdentities(noteObjs);\n await upsertQueryBlocks(conn, blockObjs.map((b) => [b, resolveParentFrom(index, b)]));\n await conn.exec(\n `INSERT INTO \"${SCHEMA_TABLE}\" (\"key\", \"value\") VALUES (?, ?) ON CONFLICT (\"key\") DO UPDATE SET \"value\" = excluded.\"value\"`,\n [PROJECTION_GUARD_KEY, JSON.stringify({ version: DOMAIN_PROJECTION_VERSION })],\n );\n}\n\n/** Boot-time derived state: DDL + rebuild only when the guard is incompatible\n * (first run, projection version bump, or an interrupted prior rebuild). */\nexport async function initializeDomain(db: Database): Promise<void> {\n await ensureDdl(db);\n await db.transaction(async (tx) => {\n await tx.exec(\n `CREATE TABLE IF NOT EXISTS \"${SCHEMA_TABLE}\" (\"key\" TEXT PRIMARY KEY, \"value\" TEXT NOT NULL)`,\n );\n const guardRows = await tx.query(`SELECT \"value\" FROM \"${SCHEMA_TABLE}\" WHERE \"key\" = ?`, [PROJECTION_GUARD_KEY]);\n let guard: { version?: unknown } | undefined;\n if (guardRows[0]) {\n try {\n guard = JSON.parse(String(guardRows[0].value)) as { version?: unknown };\n } catch {\n guard = undefined; // corrupt guard → rebuild and restamp\n }\n }\n if (guard?.version === DOMAIN_PROJECTION_VERSION) return;\n await rebuildProjections(tx);\n });\n}\n\n/** Read-only readiness check (no DDL, no writes): both real guards — the\n * store schema version row and the domain projection version row — must be\n * current, and every store/projection table must exist. Missing table →\n * db_not_initialized; version drift or corrupt guards → schema_incompatible;\n * auth/network errors propagate untouched. Used by\n * openCliDb(…, { initialize: false }). */\nexport async function verifyReadiness(db: Database): Promise<void> {\n // Only \"missing relation\" SQL failures mean uninitialized; everything\n // else (auth, network, permissions) surfaces as-is.\n const isMissingRelation = (error: unknown): boolean => {\n if (typeof error !== 'object' || error === null) return false;\n // Bun.SQL: code ERR_POSTGRES_SERVER_ERROR, SQLSTATE in errno; postgres\n // 42P01 = undefined_table. libsql node: SQLITE_ERROR + \"no such table\".\n if ('errno' in error && error.errno === '42P01') return true;\n if ('code' in error && error.code === '42P01') return true;\n return (\n 'code' in error &&\n error.code === 'SQLITE_ERROR' &&\n /no such table/i.test(error instanceof Error ? error.message : String(error))\n );\n };\n\n /** Safe parse: a missing row → undefined; a corrupt guard → incompatible. */\n const readGuard = async (key: string): Promise<{ version?: unknown } | undefined> => {\n const rows = await db.query(`SELECT \"value\" FROM \"${SCHEMA_TABLE}\" WHERE \"key\" = ?`, [key]);\n if (!rows.length || typeof rows[0].value !== 'string') return undefined;\n try {\n return JSON.parse(rows[0].value) as { version?: unknown };\n } catch {\n throw new StorageError(500, `database guard \"${key}\" is corrupt; re-run initialization`, 'schema_incompatible');\n }\n };\n\n let schemaGuard: { version?: unknown } | undefined;\n let projectionGuard: { version?: unknown } | undefined;\n try {\n schemaGuard = await readGuard('schema');\n projectionGuard = await readGuard(PROJECTION_GUARD_KEY);\n } catch (error) {\n if (isMissingRelation(error)) {\n throw new StorageError(500, 'database is not initialized (schema guard table missing)', 'db_not_initialized');\n }\n throw error;\n }\n const schemaVersion = schemaGuard?.version;\n const projectionVersion = projectionGuard?.version;\n if (typeof schemaVersion !== 'number') {\n throw new StorageError(500, 'database is not initialized (no schema guard row)', 'db_not_initialized');\n }\n if (typeof projectionVersion !== 'number') {\n throw new StorageError(500, 'database is not initialized (projections never built)', 'db_not_initialized');\n }\n if (schemaVersion > DB_VERSION) {\n throw new StorageError(\n 500,\n `database schema v${schemaVersion} is newer than this server supports (v${DB_VERSION}); refusing to downgrade`,\n 'schema_incompatible',\n );\n }\n if (schemaVersion !== DB_VERSION) {\n throw new StorageError(\n 500,\n `database schema v${schemaVersion} is incompatible with v${DB_VERSION}; re-run initialization`,\n 'schema_incompatible',\n );\n }\n if (projectionVersion !== DOMAIN_PROJECTION_VERSION) {\n throw new StorageError(\n 500,\n `database projections v${projectionVersion} are incompatible with v${DOMAIN_PROJECTION_VERSION}; re-run initialization`,\n 'schema_incompatible',\n );\n }\n // Table readiness: known-safe internal identifiers, LIMIT 0 → no rows move.\n for (const table of [...STORE_DEFS.map((def) => def.name), ...TABLES]) {\n try {\n await db.query(`SELECT * FROM \"${table}\" LIMIT 0`);\n } catch (error) {\n if (isMissingRelation(error)) {\n throw new StorageError(500, `database is not initialized (missing table: ${table})`, 'db_not_initialized');\n }\n throw error;\n }\n }\n}\n\n/** Clears derived tables after a data wipe (empty is a consistent state). */\nexport async function wipeDomain(conn: SqlConnection): Promise<void> {\n for (const t of TABLES) await conn.exec(`DELETE FROM \"${t}\"`);\n}\n\n// ── Domain query execution ───────────────────────────────────────────────────\n\nexport const MAX_BODY = 64 * 1024;\nconst MAX_CLAUSES = 32;\nconst MAX_VALUES = 64;\nconst MAX_VALUE_LEN = 256;\nconst MAX_ORDER = 4;\n\ntype Plan = 'notes' | 'blocks' | 'detail';\n\nconst listFields = ['id', 'noteId', 'type', 'source', 'tags', 'effort'] as const;\n\nconst onlyKeys = (obj: Record<string, unknown>, allowed: string[]): boolean =>\n Object.keys(obj).every((k) => allowed.includes(k));\n\nfunction bad(msg: string): StorageError {\n return new StorageError(400, msg);\n}\n\nfunction strArray(v: unknown, what: string): string[] {\n if (!Array.isArray(v) || v.length < 1 || v.length > MAX_VALUES) {\n throw bad(`${what} needs 1..=${MAX_VALUES} values`);\n }\n return v.map((x) => {\n if (typeof x !== 'string' || x.length < 1 || x.length > MAX_VALUE_LEN) {\n throw bad(`${what} values must be 1..=${MAX_VALUE_LEN} chars`);\n }\n return x;\n });\n}\n\n/** Strict predicate parse — unknown/missing/duplicate payload keys are 400. */\nfunction parsePredicate(v: unknown, plan: Plan): DomainPredicate {\n if (v === null || typeof v !== 'object' || Array.isArray(v)) throw bad('predicate must be an object');\n const obj = v as Record<string, unknown>;\n const field = obj.field;\n if (typeof field !== 'string') throw bad('predicate.field required');\n let negate = false;\n if ('negate' in obj) {\n if (typeof obj.negate !== 'boolean') throw bad('predicate.negate must be boolean');\n negate = obj.negate;\n }\n if ((listFields as readonly string[]).includes(field)) {\n if (!onlyKeys(obj, ['field', 'values', 'negate'])) {\n throw bad(`predicate ${field} accepts only field/values/negate`);\n }\n return { field, values: strArray(obj.values, `predicate ${field}.values`), ...(negate ? { negate } : {}) } as DomainPredicate;\n }\n if (field === 'typedTag') {\n if (!onlyKeys(obj, ['field', 'tagType', 'values', 'negate'])) {\n throw bad('predicate typedTag accepts only field/tagType/values/negate');\n }\n if (typeof obj.tagType !== 'string' || obj.tagType.length < 1 || obj.tagType.length > MAX_VALUE_LEN) {\n throw bad(`predicate typedTag.tagType must be 1..=${MAX_VALUE_LEN} chars`);\n }\n return { field: 'typedTag', tagType: obj.tagType, values: strArray(obj.values, 'predicate typedTag.values'), ...(negate ? { negate } : {}) };\n }\n if (field === 'text') {\n if (!onlyKeys(obj, ['field', 'value']) || negate) throw bad('predicate text accepts only {field, value}');\n if (typeof obj.value !== 'string' || obj.value.length < 1 || obj.value.length > MAX_VALUE_LEN) {\n throw bad('predicate text.value must be 1..=256 chars');\n }\n return { field: 'text', value: obj.value };\n }\n if (field === 'date') {\n if (!onlyKeys(obj, ['field', 'start', 'end', 'endExclusive'])) {\n throw bad('predicate date accepts only field/start/end/endExclusive');\n }\n const n = (k: string): number => {\n if (typeof obj[k] !== 'number' || !Number.isFinite(obj[k])) throw bad(`predicate date.${k} must be a finite number`);\n return obj[k];\n };\n if ('endExclusive' in obj && typeof obj.endExclusive !== 'boolean') {\n throw bad('predicate date.endExclusive must be boolean');\n }\n return { field: 'date', start: n('start'), end: n('end'), ...(obj.endExclusive === true ? { endExclusive: true } : {}) };\n }\n if (field === 'page') {\n if (plan === 'blocks') throw bad('predicate page does not apply to the blocks plan');\n if (!onlyKeys(obj, ['field', 'value'])) throw bad('predicate page accepts only {field, value}');\n if (typeof obj.value !== 'boolean') throw bad('predicate page.value must be boolean');\n return { field: 'page', value: obj.value };\n }\n if (field === 'sourceFence') {\n if (!onlyKeys(obj, ['field'])) throw bad('predicate sourceFence accepts only {field}');\n return { field: 'sourceFence' };\n }\n if (field === 'defaultNotes') {\n if (plan === 'blocks') throw bad('predicate defaultNotes does not apply to the blocks plan');\n if (!onlyKeys(obj, ['field', 'nonPages'])) throw bad('predicate defaultNotes accepts only {field, nonPages}');\n if (typeof obj.nonPages !== 'boolean') throw bad('predicate defaultNotes.nonPages must be boolean');\n return { field: 'defaultNotes', nonPages: obj.nonPages };\n }\n throw bad(`unknown predicate field: ${field}`);\n}\n\nfunction parseClauses(v: unknown, plan: Plan, what: string): DomainPredicate[] {\n if (v === undefined) return [];\n if (!Array.isArray(v)) throw bad(`${what} must be an array`);\n if (v.length > MAX_CLAUSES) throw bad(`${what} supports at most ${MAX_CLAUSES} clauses`);\n return v.map((p) => parsePredicate(p, plan));\n}\n\nfunction orderCols(field: string, plan: Plan): string {\n if (field === 'id' || field === 'createdAt') return field;\n if (plan === 'blocks') {\n if (field === 'noteTitle' || field === 'dataType' || field === 'position') return field;\n throw bad(field === 'date' || field === 'title' ? `order ${field} does not apply to the blocks plan` : `unknown order field: ${field}`);\n }\n if (field === 'date' || field === 'title') return field;\n throw bad(\n field === 'noteTitle' || field === 'dataType' || field === 'position'\n ? `order ${field} only applies to the blocks plan`\n : `unknown order field: ${field}`,\n );\n}\n\ninterface ParsedQuery {\n plan: Plan;\n selection: DomainPredicate[];\n filters: DomainPredicate[];\n order: { field: string; desc: boolean }[];\n offset: number;\n limit?: number;\n}\n\nfunction parseQuery(body: unknown): ParsedQuery {\n if (body === null || typeof body !== 'object' || Array.isArray(body)) throw bad('body must be a DomainQuery object');\n const obj = body as Record<string, unknown>;\n const plan = obj.plan;\n if (plan !== 'notes' && plan !== 'blocks' && plan !== 'detail') {\n throw bad('body.plan must be notes | blocks | detail');\n }\n for (const k of Object.keys(obj)) {\n if (!['plan', 'selection', 'filters', 'order', 'offset', 'limit'].includes(k)) {\n throw bad(`unknown DomainQuery field: ${k}`);\n }\n }\n const order: { field: string; desc: boolean }[] = [];\n if (obj.order !== undefined) {\n if (!Array.isArray(obj.order)) throw bad('order must be an array');\n if (obj.order.length > MAX_ORDER) throw bad(`order supports at most ${MAX_ORDER} keys`);\n for (const entry of obj.order) {\n if (entry === null || typeof entry !== 'object' || Array.isArray(entry)) throw bad('order entries must be objects');\n const e = entry as Record<string, unknown>;\n if (typeof e.field !== 'string') throw bad('order.field required');\n if (!onlyKeys(e, ['field', 'direction'])) throw bad('order entries accept only field/direction');\n if (e.direction !== undefined && e.direction !== 'asc' && e.direction !== 'desc') {\n throw bad('order.direction must be asc | desc');\n }\n order.push({ field: orderCols(e.field, plan), desc: e.direction === 'desc' });\n }\n }\n const intIn = (k: string): number | undefined => {\n const v = obj[k];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== 'number' || !Number.isInteger(v)) throw bad(`${k} must be an integer`);\n if (v < 0) throw bad(`${k} must be >= 0`);\n return v;\n };\n // Omitted limit = complete matched set; an explicit limit is the caller's\n // paging choice, never silently truncated.\n return {\n plan,\n selection: parseClauses(obj.selection, plan, 'selection'),\n filters: parseClauses(obj.filters, plan, 'filters'),\n order,\n offset: intIn('offset') ?? 0,\n limit: intIn('limit'),\n };\n}\n\n// ── Predicate → SQL (bound values only) ──────────────────────────────────────\n\nclass Sql {\n readonly params: SqlValue[] = [];\n constructor(readonly pg: boolean) {}\n bind(v: SqlValue): string {\n this.params.push(v);\n return '?';\n }\n /** Literal substring over a lowercased materialized column — no wildcards. */\n contains(col: string, needle: string): string {\n const p = this.bind(needle.toLowerCase());\n return this.pg ? `strpos(${col}, ${p}) > 0` : `instr(${col}, ${p}) > 0`;\n }\n inList(col: string, values: string[]): string {\n return `${col} IN (${values.map((v) => this.bind(v)).join(', ')})`;\n }\n}\n\n/** WQL source domain — derived from the authoritative WQL_SOURCE_VALUES\n * (journal leads the fence; the rest ride the shared shape table), so the\n * SQL sourceFence cannot drift from the JS `source:all` domain. */\nconst SOURCE_ALL_KINDS = ['journal', ...WQL_SOURCE_VALUES.filter((k) => k !== 'journal')];\n\n/** SQL projection of one source kind — built from the SAME\n * {@link SOURCE_ID_SHAPES} table `sourceMatches` reads (single shared\n * projection; never a second prefix decision). Unknown kinds keep the exact\n * sourceId literal. `journal` reads the materialized column, which the\n * write path computes with `sourceMatches(…, 'journal')` — the resolver's\n * documented journal fallback. */\nfunction sourceKindSql(ctx: Sql, kind: string, sid: string, typeExpr: string | null, journalCol: string): string {\n if (kind === 'journal') return `(${journalCol} = 1)`;\n const shape = sourceShape(kind) ?? { exact: [kind] };\n const parts: string[] = [];\n for (const v of shape.exact ?? []) parts.push(`${sid} = ${ctx.bind(v)}`);\n for (const p of shape.prefixes ?? []) parts.push(`substr(${sid}, 1, ${p.length}) = ${ctx.bind(p)}`);\n if (shape.legacyType) {\n // The legacy note-type convention exists only on the note plane.\n parts.push(typeExpr ? `${typeExpr} = ${ctx.bind(shape.legacyType)}` : 'FALSE');\n }\n return `(${parts.join(' OR ')})`;\n}\n\nfunction sourcePredicateSql(ctx: Sql, values: string[], negate: boolean, sid: string, typeExpr: string | null, journalCol: string): string {\n const matched = values.map((v) => sourceKindSql(ctx, v, sid, typeExpr, journalCol)).join(' OR ');\n return negate ? `NOT COALESCE((${matched}), FALSE)` : matched;\n}\n\nconst wrap = (negate: boolean, matchSql: string): string =>\n negate ? `NOT COALESCE ((${matchSql}), FALSE)` : matchSql;\n\nfunction predicateSql(ctx: Sql, p: DomainPredicate, plan: Plan): string {\n const blocks = plan === 'blocks';\n const id = blocks ? 'q.\"occurrence_id\"' : 'n.\"note_id\"';\n const sid = blocks ? 'q.\"source_id\"' : 'n.\"source_id\"';\n const typeExpr = blocks ? null : 'n.\"note_type\"';\n const typeCol = blocks ? 'q.\"data_type\"' : 'n.\"note_type\"';\n const journalCol = blocks ? 'q.\"journal\"' : 'n.\"journal\"';\n const noteId = blocks ? 'q.\"source_note_id\"' : 'n.\"note_id\"';\n switch (p.field) {\n case 'id':\n return wrap(p.negate === true, ctx.inList(id, p.values));\n case 'noteId':\n return wrap(p.negate === true, ctx.inList(noteId, p.values));\n case 'type':\n return wrap(p.negate === true, ctx.inList(typeCol, p.values));\n case 'source':\n return sourcePredicateSql(ctx, p.values, p.negate === true, sid, typeExpr, journalCol);\n case 'tags':\n // Tags hang off the parent note on both planes.\n return wrap(\n p.negate === true,\n `EXISTS (SELECT 1 FROM \"note_tags\" nt JOIN \"tags\" t ON t.\"k0\" = nt.\"i_by_tag_0\" ` +\n `WHERE nt.\"i_by_note_0\" = ${noteId} AND t.\"i_by_label_0\" IN (${p.values.map((v) => ctx.bind(v)).join(', ')}))`,\n );\n case 'typedTag':\n // Typed-tag narrow (ticket 08) — joins on the tags by-type index so a\n // type+label pair resolves in SQL instead of residual JS.\n return wrap(\n p.negate === true,\n `EXISTS (SELECT 1 FROM \"note_tags\" nt JOIN \"tags\" t ON t.\"k0\" = nt.\"i_by_tag_0\" ` +\n `WHERE nt.\"i_by_note_0\" = ${noteId} AND t.\"i_by_type_0\" = ${ctx.bind(p.tagType)} ` +\n `AND t.\"i_by_label_0\" IN (${p.values.map((v) => ctx.bind(v)).join(', ')}))`,\n );\n case 'effort':\n return wrap(\n p.negate === true,\n blocks\n ? `(q.\"content_id\" IS NOT NULL AND EXISTS (SELECT 1 FROM \"block_efforts\" be ` +\n `WHERE be.\"i_by_block_0\" = q.\"content_id\" AND be.\"i_by_effort_0\" IN (${p.values.map((v) => ctx.bind(v)).join(', ')})))`\n : `EXISTS (SELECT 1 FROM \"block_efforts\" be WHERE be.\"i_by_note_0\" = ${noteId} ` +\n `AND be.\"i_by_effort_0\" IN (${p.values.map((v) => ctx.bind(v)).join(', ')}))`,\n );\n case 'text':\n return blocks ? ctx.contains('q.\"normalized_text\"', p.value)\n : `(${ctx.contains('n.\"title_search\"', p.value)} OR ${ctx.contains('n.\"text_search\"', p.value)})`;\n case 'date': {\n const expr = blocks ? 'q.\"effective_date\"' : 'COALESCE(n.\"date\", n.\"created_at\")';\n const lo = ctx.bind(p.start);\n const hi = ctx.bind(p.end);\n const cmp = p.endExclusive ? '<' : '<=';\n return `(${expr} >= ${lo} AND ${expr} ${cmp} ${hi})`;\n }\n case 'page':\n return p.value ? `n.\"note_type\" = 'page'` : `(n.\"note_type\" IS NULL OR n.\"note_type\" <> 'page')`;\n case 'sourceFence': {\n const all = SOURCE_ALL_KINDS.map((k) => sourceKindSql(ctx, k, sid, typeExpr, journalCol)).join(' OR ');\n return `(${sid} IS NULL OR ${sid} = '' OR ${all})`;\n }\n case 'defaultNotes':\n return p.nonPages\n ? `(n.\"note_type\" IS NULL OR n.\"note_type\" <> 'page')`\n : `(n.\"note_type\" = 'note' OR (substr(COALESCE(n.\"source_id\", ''), 1, 5) <> 'page:' ` +\n `AND substr(COALESCE(n.\"source_id\", ''), 1, 7) <> 'guides:' ` +\n `AND COALESCE(n.\"note_type\", '') NOT IN ('feed','syntax','behavior','analytics','dashboard','home','page')))`;\n }\n}\n\nfunction clausesSql(ctx: Sql, clauses: DomainPredicate[], plan: Plan): string {\n if (clauses.length === 0) return '';\n return ` WHERE ${clauses.map((p) => predicateSql(ctx, p, plan)).join(' AND ')}`;\n}\n\nfunction orderSql(order: { field: string; desc: boolean }[], plan: Plan): string {\n const idCol = plan === 'blocks' ? 'q.\"occurrence_id\"' : 'n.\"note_id\"';\n const cols: Record<string, string> =\n plan === 'blocks'\n ? { id: 'q.\"occurrence_id\"', createdAt: 'q.\"created_at\"', noteTitle: 'q.\"note_title\"', dataType: 'q.\"data_type\"', position: 'q.\"ordinal\"' }\n : { id: 'n.\"note_id\"', createdAt: 'n.\"created_at\"', date: 'n.\"date\"', title: 'n.\"title\"' };\n // Deterministic paging: pinned NULL placement (sqlite and pg disagree on\n // defaults) plus the primary key as final tiebreaker.\n const parts = order.map(({ field, desc }) =>\n desc ? `${cols[field]} DESC NULLS FIRST` : `${cols[field]} ASC NULLS LAST`,\n );\n if (!order.some((o) => o.field === 'id')) parts.push(`${idCol} ASC`);\n return parts.join(', ');\n}\n\nfunction pagingSql(q: ParsedQuery, pg: boolean): string {\n let s = '';\n if (q.limit !== undefined) s += ` LIMIT ${q.limit}`;\n else if (q.offset > 0 && !pg) s += ' LIMIT -1'; // sqlite needs LIMIT before OFFSET\n if (q.offset > 0) s += ` OFFSET ${q.offset}`;\n return s;\n}\n\n/** Fail closed while any projected block lacks a resolved parent identity. */\nasync function gate(conn: SqlConnection): Promise<void> {\n const rows = await conn.query(`SELECT COUNT(*) AS \"n\" FROM \"query_block\" WHERE \"parent_note_id\" IS NULL`);\n const stale = Number(rows[0]?.n ?? 0);\n if (stale > 0) {\n throw new StorageError(\n 409,\n `domain projections stale: ${stale} block rows have invalid or unresolved current parents`,\n 'domain_projection_unavailable',\n );\n }\n}\n\nfunction planTable(plan: Plan): string {\n return plan === 'blocks' ? '\"query_block\" q' : '\"domain_note\" n';\n}\n\nasync function execute(conn: SqlConnection, q: ParsedQuery, pg: boolean): Promise<DomainQueryResult> {\n const plan = q.plan;\n const table = planTable(plan);\n\n const selCtx = new Sql(pg);\n const selWhere = clausesSql(selCtx, q.selection, plan);\n const filterCtx = new Sql(pg);\n const filterWhere = clausesSql(filterCtx, q.filters, plan);\n const allParams: SqlValue[] = [...selCtx.params, ...filterCtx.params];\n const fullWhere =\n selWhere && filterWhere\n ? `${selWhere} AND ${filterWhere.replace(/^ WHERE /, '')}`\n : selWhere || filterWhere;\n\n const count = async (where: string, params: SqlValue[]): Promise<number> =>\n Number((await conn.query(`SELECT COUNT(*) AS \"n\" FROM ${table}${where}`, params))[0]?.n ?? 0);\n const selectedCount = await count(selWhere, selCtx.params);\n const matchedCount = q.filters.length === 0 ? selectedCount : await count(fullWhere, allParams);\n\n const ordering = orderSql(q.order, plan);\n const paging = pagingSql(q, pg);\n\n if (plan !== 'detail') {\n const pageSql = `SELECT \"payload\" FROM ${table}${fullWhere} ORDER BY ${ordering}${paging}`;\n const rows: unknown[] = (await conn.query(pageSql, allParams)).map((r) => decodeRowJson(String(r.payload)));\n const result = { projectionVersion: DOMAIN_PROJECTION_VERSION, selectedCount, matchedCount, plan, rows };\n // Parsed payloads re-typed by the shared plan schema (JSON columns are unknown).\n return result as DomainQueryResult;\n }\n\n const pageSql = `SELECT \"note_id\", \"payload\" FROM ${table}${fullWhere} ORDER BY ${ordering}${paging}`;\n const noteRows = await conn.query(pageSql, allParams);\n const buckets: [unknown[], unknown[], unknown[]][] = noteRows.map(() => [[], [], []]);\n const index = new Map<string, number>();\n noteRows.forEach((row, i) => index.set(String(row.note_id), i));\n for (let start = 0; start < noteRows.length; start += 500) {\n const ids = noteRows.slice(start, start + 500).map(row => String(row.note_id));\n const placeholders = ids.map(() => '?').join(', ');\n const statements = [\n { sql: `SELECT nt.\"i_by_note_0\" AS \"note_id\", t.\"data\" AS \"payload\" FROM \"note_tags\" nt JOIN \"tags\" t ON t.\"k0\" = nt.\"i_by_tag_0\" WHERE nt.\"i_by_note_0\" IN (${placeholders}) ORDER BY t.\"k0\"`, params: ids },\n { sql: `SELECT p.\"i_by_note_0\" AS \"note_id\", p.\"data\" AS \"payload\" FROM \"page_notes\" p WHERE p.\"i_by_note_0\" IN (${placeholders}) ORDER BY p.\"k0\"`, params: ids },\n { sql: `SELECT DISTINCT p.\"i_by_note_0\" AS \"note_id\", pg.\"data\" AS \"payload\" FROM \"page_notes\" p JOIN \"page\" pg ON pg.\"k0\" = p.\"i_by_page_0\" WHERE p.\"i_by_note_0\" IN (${placeholders}) ORDER BY pg.\"data\"`, params: ids },\n ];\n const relations = conn.batch ? await conn.batch(statements) : await (async () => {\n const rows = [];\n for (const statement of statements) rows.push(await conn.query(statement.sql, statement.params));\n return rows;\n })();\n relations.forEach((rows, relation) => rows.forEach(row => {\n const i = index.get(String(row.note_id));\n if (i !== undefined) buckets[i][relation].push(decodeRowJson(String(row.payload)));\n }));\n }\n const rows = noteRows.map((row, i) => {\n const [tags, links, pages] = buckets[i];\n return { note: decodeRowJson(String(row.payload)), tags, links, pages };\n });\n return { projectionVersion: DOMAIN_PROJECTION_VERSION, selectedCount, matchedCount, plan, rows } as DomainQueryResult;\n}\n\n/** Validate, gate, execute on one consistent snapshot (server route and\n * SqlStorage.queryDomain share this entry). */\nexport async function handleDomainQuery(db: Database, body: unknown): Promise<DomainQueryResult> {\n const query = parseQuery(body);\n return db.transaction(async (tx) => {\n // Counts and page must share one snapshot; writes keep the default level.\n if (db.dialect === 'postgres') await tx.exec('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ READ ONLY');\n await gate(tx);\n return execute(tx, query, db.dialect === 'postgres');\n });\n}\n","/** SQL storage with atomic, change-scoped projections and buffered reads. */\n\nimport type {\n IReadWriteStore,\n IReadOnlyStore,\n IStorage,\n IStorageTransaction,\n StoreName,\n StoreType,\n} from '../contract';\nimport type { DomainQuery, DomainQueryResult } from '../domain';\nimport { stampUserOwned } from '../membership';\nimport { STORE_DEFS, type StoreDef } from '../schema';\nimport {\n isRange,\n keyFromValue,\n rangeFromIDB,\n type KeyDTO,\n type RangeDTO,\n type TxOp,\n} from '../wire';\nimport {\n bufferedGet,\n bufferSlot,\n bufferToOps,\n isDirty,\n overlayRows,\n type BufferEntry,\n} from '../overlay';\nimport {\n countRows,\n getRow,\n initializeStore,\n listRows,\n putRow,\n wipeRows,\n getRows,\n listRowsFromIndexMany,\n} from './store';\nimport {\n handleDomainQuery,\n initializeDomain,\n refreshDomain,\n wipeDomain,\n} from './domain';\nimport { StorageError } from './errors';\nimport { libsqlDatabase, type Database, type SqlConnection } from './connection';\nimport { createClient } from '@libsql/client/web';\nimport { rowsEqual } from '../validation';\n\nexport interface SqlStorageOptions {\n /** Rows in user-owned stores are stamped with this userId on write. Omit\n * for stamp-free writers (data migration preserves ownership verbatim). */\n getUserId?: () => string;\n}\n\nexport class SqlStorage implements IStorage {\n private readonly db: Database;\n private readonly options: SqlStorageOptions;\n private readonly defs: Record<StoreName, StoreDef>;\n private readyPromise?: Promise<void>;\n\n constructor(db: Database, options: SqlStorageOptions = {}) {\n this.db = db;\n this.options = options;\n this.defs = Object.fromEntries(STORE_DEFS.map((d) => [d.name, d])) as Record<StoreName, StoreDef>;\n }\n\n /**\n * Idempotent schema + projection initialization. Cheap when already\n * compatible (both initializers are guard-protected); a failed attempt\n * clears the memo so the next call retries instead of caching the error.\n */\n ready(): Promise<void> {\n this.readyPromise ??= (async () => {\n try {\n await initializeStore(this.db);\n await initializeDomain(this.db);\n } catch (e) {\n this.readyPromise = undefined;\n throw e;\n }\n })();\n return this.readyPromise;\n }\n\n /** Every store operation starts here, so views created before (or during)\n * an in-flight ready() block until initialization actually succeeded. */\n ensureReady(): Promise<void> {\n return this.ready();\n }\n\n def(store: StoreName): StoreDef {\n const def = this.defs[store];\n if (!def) throw new StorageError(404, `SqlStorage: unknown store '${store}'`);\n return def;\n }\n\n private makeView<K extends StoreName>(\n store: K,\n conn: SqlConnection,\n mutable: boolean,\n buffer?: Map<string, BufferEntry>,\n cleared?: Set<StoreName>,\n ): IReadWriteStore<StoreType<K>> {\n return new SqlStore<StoreType<K>>(this, this.def(store), store, conn, mutable, buffer, cleared);\n }\n\n readonly<K extends StoreName>(store: K): IReadOnlyStore<StoreType<K>> {\n return this.makeView(store, this.db, false);\n }\n\n readwrite<K extends StoreName>(store: K): IReadWriteStore<StoreType<K>> {\n return this.makeView(store, this.db, true);\n }\n\n async queryDomain(query: DomainQuery): Promise<DomainQueryResult | undefined> {\n await this.ensureReady();\n try {\n return await handleDomainQuery(this.db, query);\n } catch (e) {\n // Same stale-projection fallback as ApiStorage's 409 mapping.\n if (e instanceof StorageError && e.code === 'domain_projection_unavailable') return undefined;\n throw e;\n }\n }\n\n async transaction<K extends StoreName, R>(\n stores: K[],\n mode: 'readonly' | 'readwrite',\n fn: (tx: IStorageTransaction) => Promise<R>,\n ): Promise<R> {\n await this.ensureReady();\n return this.runTx(stores, mode === 'readwrite', fn);\n }\n\n /** Bulk writes use the same affected-key refresh as ordinary transactions. */\n async bulkTransaction<K extends StoreName, R>(\n stores: K[],\n fn: (tx: IStorageTransaction) => Promise<R>,\n ): Promise<R> {\n await this.ensureReady();\n return this.runTx(stores, true, fn);\n }\n\n private runTx<K extends StoreName, R>(\n stores: K[],\n mutableMode: boolean,\n fn: (tx: IStorageTransaction) => Promise<R>,\n ): Promise<R> {\n const scoped = new Set<StoreName>(stores);\n const buffer = new Map<string, BufferEntry>();\n const cleared = new Set<StoreName>();\n return this.db.transaction(async (conn) => {\n const checkScope = (store: StoreName): void => {\n if (!scoped.has(store)) {\n throw new StorageError(400, `store '${store}' is outside this transaction's scope`, 'store_out_of_scope');\n }\n };\n const tx: IStorageTransaction = {\n readonly: <S extends StoreName>(store: S) => {\n checkScope(store);\n return this.makeView(store, conn, false, buffer, cleared);\n },\n readwrite: <S extends StoreName>(store: S) => {\n checkScope(store);\n if (!mutableMode) {\n throw new StorageError(403, 'transaction was opened readonly', 'read_only_transaction');\n }\n return this.makeView(store, conn, true, buffer, cleared);\n },\n };\n const result = await fn(tx);\n const ops = bufferToOps(STORE_DEFS.map((d) => d.name), buffer, cleared);\n if (ops.length > 0) {\n await refreshDomain(conn, ops);\n }\n return result;\n });\n }\n\n /**\n * Proves the backend accepts writes: one real INSERT into `meta` inside a\n * transaction that is then deliberately rolled back — zero rows committed.\n * A read-only backend, bad token or transport failure rejects here.\n */\n async verifyWritable(): Promise<void> {\n await this.ensureReady();\n const sentinel = new Error('verifyWritable: deliberate rollback sentinel');\n try {\n await this.db.transaction(async (conn) => {\n await putRow(conn, this.def('meta'), {\n key: `__wodwiki_write_check_${crypto.randomUUID()}`,\n value: '',\n });\n throw sentinel;\n });\n } catch (e) {\n if (e !== sentinel) throw e;\n }\n }\n\n async wipe(): Promise<void> {\n await this.ensureReady();\n await this.db.transaction(async (tx) => {\n await wipeRows(tx);\n await wipeDomain(tx);\n });\n }\n\n async close(): Promise<void> {\n await this.db.close();\n }\n\n // Internal seam for SqlStore views (same module): immediate op application\n // and write stamping.\n async applyOps(ops: TxOp[]): Promise<void> {\n await this.db.transaction((tx) => refreshDomain(tx, ops));\n }\n\n stamp(store: StoreName, value: unknown): unknown {\n const userId = this.options.getUserId?.();\n return userId ? stampUserOwned(store, value, userId) : value;\n }\n}\n\n/**\n * Store view over a SqlConnection. Outside a transaction writes apply\n * immediately (each in its own SQL tx with projection refresh); inside one,\n * writes buffer and reads overlay the buffer on committed rows. All\n * operations await backend readiness first.\n */\nclass SqlStore<T> implements IReadWriteStore<T> {\n constructor(\n private readonly owner: SqlStorage,\n private readonly def: StoreDef,\n private readonly store: StoreName,\n private readonly conn: SqlConnection,\n private readonly mutable: boolean,\n private readonly buffer?: Map<string, BufferEntry>,\n private readonly cleared?: Set<StoreName>,\n ) {}\n\n private assertMutable(): void {\n if (!this.mutable) {\n throw new StorageError(403, `${this.store} is opened read-only`, 'read_only_view');\n }\n }\n\n async get(key: IDBValidKey | RangeDTO): Promise<T | undefined> {\n await this.owner.ensureReady();\n const k = this.pointKey(key);\n const state = bufferedGet<T>(this.store, k, this.buffer);\n if (state) return state.hit ? state.value : undefined;\n if (this.cleared?.has(this.store)) return undefined;\n return getRow(this.conn, this.def, k) as Promise<T | undefined>;\n }\n\n async getMany(keys: IDBValidKey[]): Promise<(T | undefined)[]> {\n await this.owner.ensureReady();\n const normalized = keys.map(key => this.pointKey(key));\n const committed = this.cleared?.has(this.store) ? keys.map(() => undefined)\n : await getRows(this.conn, this.def, normalized) as (T | undefined)[];\n return normalized.map((key, i) => {\n const state = bufferedGet<T>(this.store, key, this.buffer);\n return state ? (state.hit ? state.value : undefined) : committed[i];\n });\n }\n\n async getAllFromIndexMany(indexName: string, keys: IDBValidKey[]): Promise<T[][]> {\n await this.owner.ensureReady();\n const rows = await listRowsFromIndexMany(this.conn, this.def, indexName, keys.map(key => this.pointKey(key)));\n return rows.map((values, i) => overlayRows<T>(this.def, this.store, this.buffer, this.cleared, values as T[], undefined, { only: this.pointKey(keys[i]) }, indexName));\n }\n\n async getAll(query?: IDBValidKey | IDBKeyRange | RangeDTO, count?: number): Promise<T[]> {\n await this.owner.ensureReady();\n const range = rangeFromIDB(query);\n const rows = await listRows(this.conn, this.def, range, isDirty(this.store, this.buffer, this.cleared) ? undefined : count);\n return overlayRows<T>(this.def, this.store, this.buffer, this.cleared, rows as T[], count, range);\n }\n\n async getAllFromIndex(indexName: string, query?: IDBValidKey | IDBKeyRange | RangeDTO, count?: number): Promise<T[]> {\n await this.owner.ensureReady();\n const range = rangeFromIDB(query);\n const rows = await listRows(this.conn, this.def, range, isDirty(this.store, this.buffer, this.cleared) ? undefined : count, indexName);\n return overlayRows<T>(this.def, this.store, this.buffer, this.cleared, rows as T[], count, range, indexName);\n }\n\n async count(query?: IDBValidKey | IDBKeyRange | RangeDTO): Promise<number> {\n await this.owner.ensureReady();\n const range = rangeFromIDB(query);\n if (!isDirty(this.store, this.buffer, this.cleared)) return countRows(this.conn, this.def, range);\n const rows = await listRows(this.conn, this.def, range);\n return overlayRows<T>(this.def, this.store, this.buffer, this.cleared, rows as T[], undefined, range).length;\n }\n\n async countFromIndex(indexName: string, query?: IDBValidKey | IDBKeyRange | RangeDTO): Promise<number> {\n await this.owner.ensureReady();\n const range = rangeFromIDB(query);\n if (!isDirty(this.store, this.buffer, this.cleared)) return countRows(this.conn, this.def, range, indexName);\n const rows = await listRows(this.conn, this.def, range, undefined, indexName);\n return overlayRows<T>(this.def, this.store, this.buffer, this.cleared, rows as T[], undefined, range, indexName).length;\n }\n\n async put(value: T, _key?: IDBValidKey): Promise<IDBValidKey> {\n await this.owner.ensureReady();\n this.assertMutable();\n const stored = this.owner.stamp(this.store, value) as T;\n const key = keyFromValue(this.def, stored);\n if (this.store === 'block_revisions') {\n const previous = this.buffer?.get(bufferSlot(this.store, key));\n if (previous?.kind === 'put' && !rowsEqual(previous.value, stored)) throw new StorageError(409, 'immutable block revision collision', 'revision_conflict');\n }\n if (this.buffer) {\n this.buffer.set(bufferSlot(this.store, key), { kind: 'put', value: stored });\n return key;\n }\n await this.owner.applyOps([{ op: 'put', store: this.store, value: stored }]);\n return key;\n }\n\n async putMany(values: T[], _keys?: IDBValidKey[]): Promise<IDBValidKey[]> {\n await this.owner.ensureReady();\n this.assertMutable();\n const stored = values.map(value => this.owner.stamp(this.store, value) as T);\n const keys = stored.map(value => keyFromValue(this.def, value));\n if (this.store === 'block_revisions') {\n const seen = new Map<string, unknown>();\n keys.forEach((key, i) => {\n const slot = bufferSlot(this.store, key), previous = this.buffer?.get(slot);\n const value = seen.has(slot) ? seen.get(slot) : previous?.kind === 'put' ? previous.value : undefined;\n if (value !== undefined && !rowsEqual(value, stored[i])) throw new StorageError(409, 'immutable block revision collision', 'revision_conflict');\n seen.set(slot, stored[i]);\n });\n }\n if (this.buffer) keys.forEach((key, i) => this.buffer!.set(bufferSlot(this.store, key), { kind: 'put', value: stored[i] }));\n else await this.owner.applyOps(stored.map(value => ({ op: 'put', store: this.store, value })));\n return keys;\n }\n\n async delete(key: IDBValidKey | IDBKeyRange | RangeDTO): Promise<void> {\n await this.owner.ensureReady();\n this.assertMutable();\n if (this.store === 'block_revisions') throw new StorageError(409, 'block history requires explicit wipe', 'revision_conflict');\n const range = isRange(key) ? key : undefined;\n const target = range ?? (key as KeyDTO);\n if (this.buffer) {\n if (range) {\n for (const row of await this.getAll(range)) {\n const rowKey = keyFromValue(this.def, row);\n this.buffer.set(bufferSlot(this.store, rowKey), { kind: 'delete', key: rowKey });\n }\n return;\n }\n const point = target as KeyDTO;\n this.buffer.set(bufferSlot(this.store, point), { kind: 'delete', key: point });\n return;\n }\n await this.owner.applyOps([{ op: 'delete', store: this.store, key: target as KeyDTO }]);\n }\n\n async clear(): Promise<void> {\n await this.owner.ensureReady();\n this.assertMutable();\n if (this.store === 'block_revisions') throw new StorageError(409, 'block history requires explicit wipe', 'revision_conflict');\n if (this.buffer) {\n this.cleared?.add(this.store);\n const prefix = `${this.store}\\u0000`;\n for (const slot of [...this.buffer.keys()]) {\n if (slot.startsWith(prefix)) this.buffer.delete(slot);\n }\n return;\n }\n await this.owner.applyOps([{ op: 'clear', store: this.store }]);\n }\n\n /** Normalizes get() arguments to a wire key (bounded ranges match no row). */\n private pointKey(key: IDBValidKey | RangeDTO): KeyDTO {\n if (isRange(key)) {\n if (key.only === undefined) {\n throw new StorageError(400, 'get() needs a plain key or {only}; bounded ranges match no single row');\n }\n return key.only;\n }\n return key as KeyDTO;\n }\n}\n\nexport interface TursoSettings {\n url: string;\n authToken?: string;\n}\n\n/** libsql/https/wss only; plain http only for loopback development; tokens\n * travel via authToken, never the URL. Rejects credentials, query strings\n * and fragments (no secret or option injection through the URL). */\nexport function validateTursoUrl(url: string): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new StorageError(400, 'invalid Turso URL', 'bad_turso_url');\n }\n if (url.includes('?') || url.includes('#')) {\n throw new StorageError(400, 'Turso URL must not carry a query or fragment; pass options/secrets via authToken', 'bad_turso_url');\n }\n if (parsed.username || parsed.password) {\n throw new StorageError(400, 'Turso URL must not embed credentials; pass them via authToken', 'bad_turso_url');\n }\n const loopback = parsed.hostname === '127.0.0.1' || parsed.hostname === 'localhost' || parsed.hostname === '[::1]';\n if (parsed.protocol === 'http:') {\n if (!loopback) {\n throw new StorageError(400, 'refusing plain http Turso URL (token would traverse the network unencrypted); use libsql:/https:', 'bad_turso_url');\n }\n return url;\n }\n if (parsed.protocol !== 'libsql:' && parsed.protocol !== 'https:' && parsed.protocol !== 'wss:') {\n throw new StorageError(400, `unsupported Turso URL scheme ${parsed.protocol} (expected libsql:, https:, wss:)`, 'bad_turso_url');\n }\n return url;\n}\n\n/**\n * Direct-from-browser Turso backend. Construction only validates and builds\n * the client; `await storage.ready()` initializes schema + projections.\n * Errors never embed the auth token.\n */\nexport class BrowserTursoStorage extends SqlStorage {\n constructor(settings: TursoSettings, options: SqlStorageOptions = {}) {\n super(\n libsqlDatabase(createClient({ url: validateTursoUrl(settings.url), authToken: settings.authToken })),\n options,\n );\n }\n}\n","/**\n * Native-copy verification + migration finalize — the pure-SQL seam the CLI\n * `wod db backup/restore/migrate` commands run over any libsql Database.\n *\n * - databaseFingerprint: canonical sha-256 over EVERY user table (schema\n * SQL + sorted typed-cell rows + the sync state row), so a Turso native\n * seed-copy can be proven row- and binary-identical (BLOB bytes are hex\n * encoded — JSON.stringify(ArrayBuffer) would collapse to {}) before any\n * credential is minted or paired. Rows are encoded as typed cells inside\n * JSON arrays and SORTED, so framing is unambiguous and rowid/physical\n * order differences after a native copy cannot produce a false mismatch.\n * - assertDatabaseCopyMatches: interrupted-copy AND concurrent-source\n * refusal — the source must be unchanged since the copy started and the\n * copy must match that exact snapshot.\n * - finalizeMigrationTarget: CAS that flips a migration target from the\n * non-legitimate \"constructing\" marker (state schema 0, unpairable by\n * engine refusal and by `wod db pair`) to the live schema in ONE\n * transaction, only after full replay/pin/binary validation passed.\n *\n * No source is ever mutated by these helpers (reads + one guarded state-row\n * UPDATE on the target). Fingerprint reads run inside one transaction so the\n * enumeration and the rows come from one consistent snapshot.\n */\n\nimport { StorageError } from './errors';\nimport { SYNC_STATE_TABLE, type StoredSyncOp, type SyncMutation } from './sync';\nimport type { StoreName } from '../contract';\nimport type { Database, SqlConnection } from './connection';\n\nexport interface DatabaseFingerprint {\n tables: number;\n rows: number;\n /** sha-256 hex over the canonical whole-database rendering. */\n digest: string;\n /** The sync protocol state row when this database carries that layout. */\n sync: { schema: number; rev: number } | undefined;\n}\n\n/** Canonical typed cell — the discriminant removes every text/number/null/\n * bytes ambiguity that raw string framing (or JSON.stringify of binary)\n * would lose. Hex keeps byte-exactness for BLOBs. */\ntype CanonicalCell = { s: string } | { n: number } | { i: string } | { z: null } | { b: string };\n\nfunction bytesToHex(bytes: Uint8Array): string {\n let hex = '';\n for (const byte of bytes) hex += byte.toString(16).padStart(2, '0');\n return hex;\n}\n\nfunction toCanonicalCell(value: unknown): CanonicalCell {\n if (value === null) return { z: null };\n if (typeof value === 'string') return { s: value };\n if (typeof value === 'number') return { n: value };\n if (typeof value === 'bigint') return { i: value.toString() };\n if (value instanceof Uint8Array) return { b: bytesToHex(value) };\n if (value instanceof ArrayBuffer) return { b: bytesToHex(new Uint8Array(value)) };\n throw new StorageError(500, `fingerprint cannot encode cell of type ${typeof value}`, 'bad_fingerprint_cell');\n}\n\n/** Quote a table identifier for generated SQL (embedded quotes doubled). */\nfunction quoteIdent(name: string): string {\n return `\"${name.replace(/\"/g, '\"\"')}\"`;\n}\n\nasync function sha256(text: string): Promise<string> {\n const subtle = globalThis.crypto?.subtle;\n if (!subtle) throw new StorageError(500, 'Web Crypto unavailable — cannot fingerprint the database', 'no_webcrypto');\n const bytes = new Uint8Array(await subtle.digest('SHA-256', new TextEncoder().encode(text)));\n return [...bytes].map((b) => b.toString(16).padStart(2, '0')).join('');\n}\n\ninterface SyncMarker {\n schema: number;\n rev: number;\n}\n\n/** Validated sync state row, or undefined when the table is absent. */\nasync function readStateMarker(conn: SqlConnection): Promise<SyncMarker | undefined> {\n const tables = await conn.query(\n `SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?`,\n [SYNC_STATE_TABLE],\n );\n if (tables.length === 0) return undefined;\n const rows = await conn.query(`SELECT \"value\" FROM ${quoteIdent(SYNC_STATE_TABLE)} WHERE \"key\" = 'meta'`);\n const raw = rows[0]?.value;\n if (typeof raw !== 'string') {\n throw new StorageError(400, 'sync target is not initialized', 'sync_not_initialized');\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new StorageError(400, 'malformed sync state row', 'bad_sync_state');\n }\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new StorageError(400, 'malformed sync state row', 'bad_sync_state');\n }\n if (!('schema' in parsed) || !('rev' in parsed)) {\n throw new StorageError(400, 'sync state row is missing schema/rev', 'bad_sync_state');\n }\n const { schema, rev } = parsed;\n if (typeof schema !== 'number' || !Number.isSafeInteger(schema) || schema < 0\n || typeof rev !== 'number' || !Number.isSafeInteger(rev) || rev < 0) {\n throw new StorageError(400, 'sync state schema/rev must be non-negative safe integers', 'bad_sync_state');\n }\n return { schema, rev };\n}\n\n// ponytail: whole-table fingerprint — every row is scanned and hashed per\n// verify run; fine for personal workout databases, chunk by key ranges when\n// a database outgrows memory.\n/**\n * Canonical fingerprint of every user table (sqlite_% / libsql_% internal\n * tables excluded): per table the CREATE statement text plus its rows as\n * typed-cell JSON arrays, SORTED so physical row order cannot influence the\n * digest. Reads run inside one transaction for a consistent snapshot.\n */\nexport async function databaseFingerprint(db: Database): Promise<DatabaseFingerprint> {\n return db.transaction(async (tx) => {\n const tableRows = await tx.query(\n `SELECT name, sql FROM sqlite_master WHERE type = 'table'` +\n ` AND name NOT LIKE 'sqlite\\\\_%' ESCAPE '\\\\' AND name NOT LIKE 'libsql\\\\_%' ESCAPE '\\\\'`,\n );\n const tables = tableRows\n .map((row) => ({ name: String(row.name), createSql: typeof row.sql === 'string' ? row.sql : '' }))\n .sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n const sections: string[] = ['wod-wiki-db-fingerprint-v2'];\n let totalRows = 0;\n for (const table of tables) {\n const rows = await tx.query(`SELECT * FROM ${quoteIdent(table.name)}`);\n totalRows += rows.length;\n const encoded = rows.map((row) => JSON.stringify(Object.values(row).map(toCanonicalCell)));\n encoded.sort();\n sections.push(`table ${table.name}`, `schema ${table.createSql}`, `rows ${rows.length}`, ...encoded);\n }\n const sync = await readStateMarker(tx);\n return { tables: tables.length, rows: totalRows, digest: await sha256(sections.join('\\n')), sync };\n });\n}\n\n/**\n * Prove a native copy: the copy must equal the exact source snapshot the\n * caller fingerprinted BEFORE starting the copy (`before`), and the source\n * must not have advanced meanwhile (writers were supposed to be retired).\n * Returns the re-read source fingerprint.\n */\nexport async function assertDatabaseCopyMatches(\n source: Database,\n copy: Database,\n before: DatabaseFingerprint,\n): Promise<DatabaseFingerprint> {\n const after = await databaseFingerprint(source);\n if (after.digest !== before.digest) {\n throw new StorageError(\n 409,\n 'source database changed during the copy — a writer is still active; retire all writers and retry',\n 'source_moved',\n );\n }\n const copied = await databaseFingerprint(copy);\n if (copied.digest !== before.digest) {\n throw new StorageError(\n 409,\n `copy is incomplete or divergent (copy: ${copied.tables} tables / ${copied.rows} rows, source: ${before.tables} tables / ${before.rows} rows)`,\n 'copy_mismatch',\n );\n }\n return after;\n}\n\n/**\n * CAS-finalize a migration target constructed at the non-legitimate marker\n * schema 0: requires the state row to be exactly {schema: 0, rev:\n * expectRev}, then publishes the live schema in the same transaction. A\n * target that never reaches this call stays schema 0 — probes report\n * current/0, which no client accepts and `wod db pair` refuses.\n */\nexport async function finalizeMigrationTarget(db: Database, toSchema: number, expectRev: number): Promise<void> {\n if (!Number.isSafeInteger(toSchema) || toSchema < 1) {\n throw new StorageError(400, 'finalize requires a positive schema version', 'bad_sync_state');\n }\n await db.transaction(async (tx) => {\n const marker = await readStateMarker(tx);\n if (!marker || marker.schema !== 0 || marker.rev !== expectRev) {\n throw new StorageError(\n 409,\n `migration target is not in constructing state (expected schema 0 at rev ${expectRev}, found ${marker ? `schema ${marker.schema} at rev ${marker.rev}` : 'no state row'})`,\n 'migration_not_constructing',\n );\n }\n await tx.exec(\n `UPDATE ${quoteIdent(SYNC_STATE_TABLE)} SET \"value\" = ? WHERE \"key\" = 'meta'`,\n [JSON.stringify({ schema: toSchema, rev: expectRev })],\n );\n });\n}\n\nfunction pinKey(noteId: unknown, blockId: unknown, version: unknown): string {\n return `${String(noteId)}\\u0000${String(blockId)}\\u0000${String(version)}`;\n}\n\n/**\n * Policy snapshot validation shared by `wod db migrate` (pre-write) and\n * `wod db pair` (over the full replayed remote log): a user-scope snapshot\n * is policy-compliant PUTS ONLY — any delete/clear/wipe means non-user\n * policy operations leaked into the copy — and every session pin and note\n * block pin must have its immutable block_revisions row present (missing\n * pins fail the copy, they are never silently dropped).\n */\nexport function assertPolicySnapshot(ops: readonly SyncMutation[]): void {\n const revisions = new Set<string>();\n for (const mutation of ops) {\n if (mutation.op !== 'put') {\n throw new StorageError(\n 400,\n `policy snapshot contains a non-put operation (${mutation.op}) — refusing`,\n 'policy_violation',\n );\n }\n if (mutation.store !== 'block_revisions') continue;\n const row = mutation.value;\n if (typeof row !== 'object' || row === null || !('noteId' in row) || !('blockId' in row) || !('version' in row)) {\n throw new StorageError(400, 'block_revisions row is missing noteId/blockId/version', 'policy_violation');\n }\n revisions.add(pinKey(row.noteId, row.blockId, row.version));\n }\n const check = (noteId: unknown, blockId: unknown, version: unknown, what: string): void => {\n if (!revisions.has(pinKey(noteId, blockId, version))) {\n throw new StorageError(\n 400,\n `${what} pins [${String(noteId)}, ${String(blockId)}, ${String(version)}] but the snapshot has no such immutable revision`,\n 'policy_violation',\n );\n }\n };\n for (const mutation of ops) {\n if (mutation.op !== 'put') continue;\n if (mutation.store === 'sessions') {\n const row = mutation.value;\n if (typeof row !== 'object' || row === null || !('noteId' in row) || !('blockId' in row) || !('blockVersion' in row)) {\n throw new StorageError(400, 'session row is missing noteId/blockId/blockVersion', 'policy_violation');\n }\n check(row.noteId, row.blockId, row.blockVersion, 'a session');\n } else if (mutation.store === 'notes') {\n const row = mutation.value;\n if (typeof row !== 'object' || row === null || !('id' in row) || !('blocks' in row)) {\n throw new StorageError(400, 'note row is missing id/blocks', 'policy_violation');\n }\n if (typeof row.blocks !== 'object' || row.blocks === null) continue;\n for (const block of Object.values(row.blocks)) {\n if (typeof block !== 'object' || block === null || !('id' in block) || !('version' in block)) {\n throw new StorageError(400, 'note block entry is missing id/version', 'policy_violation');\n }\n check(row.id, block.id, block.version, 'a note block');\n }\n }\n }\n}\n\nfunction logKey(store: StoreName, key: unknown): string {\n return `${store}\\u0000${JSON.stringify(key) ?? String(key)}`;\n}\n\n/**\n * Pin closure over a LIVE op log (pair verification): unlike a conversion\n * snapshot, an operational log legitimately contains delete/clear/wipe\n * tombstones, so the CURRENT row set is replayed first and only live\n * sessions/notes must find their immutable revisions. Anything deleted is\n * not required to have one.\n */\nexport function assertLogPinClosure(ops: readonly StoredSyncOp[]): void {\n const live = new Map<string, { store: StoreName; value: Record<string, unknown> }>();\n for (const { mutation } of ops) {\n if (mutation.op === 'put') {\n live.set(logKey(mutation.store, mutation.key), { store: mutation.store, value: mutation.value as Record<string, unknown> });\n } else if (mutation.op === 'delete') {\n live.delete(logKey(mutation.store, mutation.key));\n } else if (mutation.op === 'clear') {\n for (const key of live.keys()) {\n if (key.startsWith(`${mutation.store}\\u0000`)) live.delete(key);\n }\n } else {\n live.clear();\n }\n }\n const revisions = new Set<string>();\n for (const row of live.values()) {\n if (row.store !== 'block_revisions') continue;\n if (!('noteId' in row.value) || !('blockId' in row.value) || !('version' in row.value)) {\n throw new StorageError(400, 'block_revisions row is missing noteId/blockId/version', 'policy_violation');\n }\n revisions.add(pinKey(row.value.noteId, row.value.blockId, row.value.version));\n }\n const check = (noteId: unknown, blockId: unknown, version: unknown, what: string): void => {\n if (!revisions.has(pinKey(noteId, blockId, version))) {\n throw new StorageError(\n 400,\n `${what} pins [${String(noteId)}, ${String(blockId)}, ${String(version)}] but the target has no live immutable revision for it`,\n 'policy_violation',\n );\n }\n };\n for (const row of live.values()) {\n if (row.store === 'sessions') {\n if (!('noteId' in row.value) || !('blockId' in row.value) || !('blockVersion' in row.value)) {\n throw new StorageError(400, 'session row is missing noteId/blockId/blockVersion', 'policy_violation');\n }\n check(row.value.noteId, row.value.blockId, row.value.blockVersion, 'a live session');\n } else if (row.store === 'notes') {\n if (!('id' in row.value) || !('blocks' in row.value)) {\n throw new StorageError(400, 'note row is missing id/blocks', 'policy_violation');\n }\n if (typeof row.value.blocks !== 'object' || row.value.blocks === null) continue;\n for (const block of Object.values(row.value.blocks)) {\n if (typeof block !== 'object' || block === null || !('id' in block) || !('version' in block)) {\n throw new StorageError(400, 'note block entry is missing id/version', 'policy_violation');\n }\n check(row.value.id, block.id, block.version, 'a live note block');\n }\n }\n }\n}\n"]}
|