@bitcobblers/wod-wiki-storage 0.35.2115 → 0.35.2117
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-DAGT3P7M.mjs → chunk-Y576CUFQ.mjs} +118 -36
- package/dist/chunk-Y576CUFQ.mjs.map +1 -0
- package/dist/index.cjs +182 -47
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +12 -5
- package/dist/index.d.ts +12 -5
- package/dist/index.mjs +62 -16
- package/dist/index.mjs.map +1 -1
- package/dist/sql/index.cjs +507 -286
- package/dist/sql/index.cjs.map +1 -1
- package/dist/sql/index.d.cts +16 -61
- package/dist/sql/index.d.ts +16 -61
- package/dist/sql/index.mjs +422 -270
- package/dist/sql/index.mjs.map +1 -1
- package/dist/wire-Cfvz-I0h.d.cts +207 -0
- package/dist/wire-Cfvz-I0h.d.ts +207 -0
- package/package.json +6 -9
- package/dist/chunk-DAGT3P7M.mjs.map +0 -1
- package/dist/wire-C7ZtlBKe.d.cts +0 -489
- package/dist/wire-C7ZtlBKe.d.ts +0 -489
package/dist/sql/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/sql/errors.ts","../../src/sql/connection.ts","../../src/sql/codec.ts","../../src/schema.ts","../../src/wire.ts","../../src/sql/store.ts","../../src/domain.ts","../../src/sql/domain.ts","../../src/membership.ts","../../src/overlay.ts","../../src/sql/storage.ts"],"names":["text","clauses","order","rows","params","catalogOfItem","sourceMatches","sp","pageSql","result","createClient"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * StorageError — the single error type every shared SQL layer throws.\n * Replaces the API server's HTTP-specific error: `status` keeps the wire\n * mapping for the HTTP surface, `code` carries a stable machine identifier\n * (e.g. 'domain_projection_unavailable') for browser callers.\n */\nexport class StorageError extends Error {\n constructor(readonly status: number, message: string, readonly code?: string) {\n super(message);\n this.name = 'StorageError';\n }\n}\n","/**\n * Connection contracts + a generic libsql adapter. The adapter takes a\n * *structural* client so the browser passes @libsql/client/web and the server\n * passes @libsql/client (node) — this module never imports either, keeping\n * the browser graph free of native drivers.\n *\n * All operations are serialized through one promise chain: the underlying\n * client shares a single connection, so concurrent transactions/reads could\n * otherwise interleave on it. Transactions run on a transaction-owned\n * connection (libsql interactive transaction), so writes inside a transaction\n * commit or roll back atomically and are not visible outside it.\n */\n\nimport type { Client } from '@libsql/client';\n\nexport type SqlValue = string | number | null; // booleans bound as 1/0 by callers\nexport type SqlRow = Record<string, unknown>;\n\nexport interface SqlConnection {\n query(sql: string, params?: SqlValue[]): Promise<SqlRow[]>;\n exec(sql: string, params?: SqlValue[]): Promise<void>;\n}\n\nexport interface Database extends SqlConnection {\n readonly dialect: 'sqlite' | 'postgres';\n transaction<T>(fn: (tx: SqlConnection) => Promise<T>): Promise<T>;\n close(): Promise<void>;\n}\n\n/** Minimal surface used from a libsql client (node or web build) — the real\n * @libsql/client types, type-only so the browser graph stays driver-free. */\nexport type LibsqlClient = Pick<Client, 'execute' | 'transaction' | 'close'>;\n\nfunction libsqlRows(result: { rows: ArrayLike<Record<string, unknown>> }): SqlRow[] {\n return result.rows as unknown as SqlRow[];\n}\n\n/** Wrap a libsql client (node or web build) into the shared Database surface. */\nexport function libsqlDatabase(client: LibsqlClient): Database {\n let chain: Promise<unknown> = Promise.resolve();\n const serialize = <T>(fn: () => Promise<T>): Promise<T> => {\n const next = chain.then(fn, fn);\n chain = next.then(() => undefined, () => undefined);\n return next;\n };\n return {\n dialect: 'sqlite',\n query: (sql, params = []) => serialize(() => client.execute({ sql, args: params }).then(libsqlRows)),\n exec: async (sql, params = []) => {\n await serialize(() => client.execute({ sql, args: params }));\n },\n transaction<T>(fn: (tx: SqlConnection) => Promise<T>): Promise<T> {\n return serialize(async () => {\n const tx = await client.transaction('write');\n try {\n const txConn: SqlConnection = {\n query: (sql, params = []) => tx.execute({ sql, args: params }).then(libsqlRows),\n exec: async (sql, params = []) => {\n await tx.execute({ sql, args: params });\n },\n };\n const result = await fn(txConn);\n await tx.commit();\n return result;\n } catch (err) {\n try {\n await tx.rollback();\n } catch {\n // transaction already closed by the failed statement\n }\n throw err;\n } finally {\n tx.close();\n }\n });\n },\n close: async () => {\n await chain;\n client.close();\n },\n };\n}\n","/**\n * Row codec for the SQL `data` column. Plain JSON.stringify destroys\n * ArrayBuffer values ({}); attachment rows carry raw blobs, so encoding tags\n * the declared binary field and decoding revives it.\n *\n * Collision safety: tagging applies ONLY to the declared binary field of the\n * declared store (attachments.data) — arbitrary rows (meta, notes, …) are\n * plain JSON in both directions, so authored {$binary:…}-shaped objects\n * anywhere else round-trip byte-for-byte. Within attachments.data the value\n * is typed `ArrayBuffer | string`; strings pass through, and only the exact\n * two-key tag revives.\n */\n\nconst TAG = '$binary';\nconst LEN = '$bytes';\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n const CHUNK = 0x8000; // String.fromCharCode.apply arg ceiling\n for (let i = 0; i < bytes.length; i += CHUNK) {\n binary += String.fromCharCode(...bytes.subarray(i, i + CHUNK));\n }\n return btoa(binary);\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length); // exact-length buffer: .buffer IS the decoded ArrayBuffer\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/** Tag shape: exactly { $binary: base64, $bytes: length }. */\nfunction reviveBinary(value: unknown): unknown {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return value;\n const keys = Object.keys(value);\n if (keys.length !== 2 || !keys.includes(TAG) || !keys.includes(LEN)) return value;\n const tag = value as Record<string, unknown>;\n if (typeof tag[TAG] !== 'string' || typeof tag[LEN] !== 'number') return value;\n const bytes = base64ToBytes(tag[TAG]);\n if (bytes.length !== tag[LEN]) {\n throw new Error(`corrupt binary cell: declared ${tag[LEN]} bytes, decoded ${bytes.length}`);\n }\n return bytes.buffer;\n}\n\n/** Serialize a row; when `binaryField` is set and holds an ArrayBuffer, it is\n * replaced by the lossless tag (shallow copy — the input row is untouched). */\nexport function encodeRowJson(value: unknown, binaryField?: string): string {\n if (binaryField && value !== null && typeof value === 'object' && !Array.isArray(value)) {\n const row = value as Record<string, unknown>;\n const data = row[binaryField];\n if (data instanceof ArrayBuffer) {\n const bytes = new Uint8Array(data);\n return JSON.stringify({ ...row, [binaryField]: { [TAG]: bytesToBase64(bytes), [LEN]: bytes.length } });\n }\n }\n return JSON.stringify(value);\n}\n\n/** Parse a row; when `binaryField` is set, a tagged value there revives as an\n * ArrayBuffer. Every other value — including tag-shaped data in other fields\n * or stores — is returned exactly as authored. */\nexport function decodeRowJson<T = unknown>(text: string, binaryField?: string): T {\n const row = JSON.parse(text) as unknown;\n if (binaryField && row !== null && typeof row === 'object' && !Array.isArray(row)) {\n const record = row as Record<string, unknown>;\n const revived = reviveBinary(record[binaryField]);\n if (revived !== record[binaryField]) record[binaryField] = revived;\n }\n return row as T;\n}\n","/**\n * STORE_DEFS — runtime store/index spec for the wodwiki database, derived\n * verbatim from IndexedDBStorage.open()'s upgrade callback (DB_VERSION 25,\n * apps/playground/src/services/storage/IndexedDBStorage.ts). The API server\n * builds its SQL schema from this spec.\n *\n * V25 adds the memberships store (system) and the by-user ownership index\n * on every store that can hold user-created rows (see USER_OWNED_STORES in\n * membership.ts — the ownership crosswalk).\n *\n * keyPath convention: array of property paths in key order. A single-element\n * array is a simple (scalar) key; multiple elements form a compound key.\n * Dotted paths ('baseAttributes.discipline') address nested properties.\n */\n\nimport type { StoreName } from './contract';\n\n// DOMAIN_PROJECTION_VERSION lives in ./domain (re-exported by the package\n// index) — deliberately not re-exported here to avoid a star-export\n// ambiguity between ./schema and ./domain.\n\n/**\n * Shared IndexedDB schema version — the browser database opens at exactly\n * this version (apps/playground/src/services/storage/IndexedDBStorage.ts\n * imports it), so store/index drift between the app and this spec is a type\n * error, not a runtime surprise. Bump on every store/index change and add\n * the matching guarded upgrade step.\n *\n * 27 supersedes 26: real databases already upgraded to the first 26 cut\n * (before by-source / by-created / the unique note-tag pair) exist in the\n * wild, so \"version 26\" is ambiguous — 27's presence-guarded repairs bring\n * every mixed DB to the same shape.\n */\nexport const DB_VERSION = 28;\n\n/**\n * Typed field metadata — column type per extracted field path, shared with\n * the API so its SQL DDL derives DOUBLE PRECISION / INTEGER / BOOLEAN /\n * TEXT from this table instead of a hardcoded per-index allowlist.\n *\n * Extraction rule (API side): a primary-key column `k<i>` takes the type of\n * STORE_DEFS store's keyPath[i]; an index column `i_<index>_<part>` takes the\n * type of that index's keyPath[part] here. Anything absent defaults to TEXT.\n * Civil-date strings stay TEXT on purpose (page.date is 'YYYY-MM-DD');\n * instants are epoch-ms numbers (notes.date, createdAt, timestamp).\n */\nexport type StorageColumnType = 'number' | 'text' | 'boolean';\n\nexport const COLUMN_TYPES: Record<StoreName, Record<string, StorageColumnType>> = {\n notes: { date: 'number', createdAt: 'number' },\n page: { createdAt: 'number' }, // page.date is a civil 'YYYY-MM-DD' string → TEXT\n page_notes: { position: 'number', createdAt: 'number' },\n tags: { createdAt: 'number' },\n tag_types: { createdAt: 'number' },\n note_tags: {},\n segments: {\n version: 'number',\n position: 'number',\n createdAt: 'number',\n updatedAt: 'number',\n isHistory: 'boolean',\n },\n sessions: {\n segmentVersion: 'number',\n version: 'number',\n startTime: 'number',\n endTime: 'number',\n duration: 'number',\n roundsCompleted: 'number',\n totalRounds: 'number',\n repsCompleted: 'number',\n completed: 'boolean',\n createdAt: 'number',\n },\n attachments: { createdAt: 'number' },\n events: {\n timestamp: 'number',\n segmentVersion: 'number',\n line: 'number',\n sourceStatementId: 'number',\n stackLevel: 'number',\n 'timeSpan.started': 'number',\n 'timeSpan.ended': 'number',\n },\n field_catalog: {},\n field_sources: {},\n field_values: {},\n field_catalog_meta: {},\n efforts: { 'baseAttributes.met': 'number' },\n block_index: {\n segmentVersion: 'number',\n position: 'number',\n createdAt: 'number',\n isStatic: 'boolean',\n },\n block_efforts: { createdAt: 'number', isStatic: 'boolean' },\n meta: {},\n memberships: { createdAt: 'number' },\n};\n\nexport interface IndexDef {\n name: string;\n keyPath: string[];\n unique?: boolean;\n multiEntry?: boolean;\n}\n\nexport interface StoreDef {\n name: StoreName;\n keyPath: string[];\n indexes: IndexDef[];\n /** System stores survive wipe() (identity must not be reset with data). */\n system?: boolean;\n}\n\nexport const STORE_DEFS: StoreDef[] = [\n // 1. notes\n { name: 'notes', keyPath: ['id'], indexes: [\n { name: 'by-date', keyPath: ['date'] },\n { name: 'by-created', keyPath: ['createdAt'] },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 2. page\n { name: 'page', keyPath: ['id'], indexes: [\n { name: 'by-date', keyPath: ['date'], unique: true },\n { name: 'by-slug', keyPath: ['slug'], unique: true },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 2b. page_notes (V22)\n { name: 'page_notes', keyPath: ['id'], indexes: [\n { name: 'by-page', keyPath: ['pageId'] },\n { name: 'by-note', keyPath: ['noteId'] },\n { name: 'by-page-note', keyPath: ['pageId', 'noteId'], unique: true },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 3. tags\n { name: 'tags', keyPath: ['id'], indexes: [\n { name: 'by-label', keyPath: ['label'], unique: true },\n { name: 'by-type', keyPath: ['type'] },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 3a. tag_types (V23)\n { name: 'tag_types', keyPath: ['id'], indexes: [\n { name: 'by-name', keyPath: ['name'], unique: true },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 4. note_tags\n { name: 'note_tags', keyPath: ['id'], indexes: [\n { name: 'by-note', keyPath: ['noteId'] },\n { name: 'by-tag', keyPath: ['tagId'] },\n { name: 'by-note-tag', keyPath: ['noteId', 'tagId'], unique: true },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 5. segments\n { name: 'segments', keyPath: ['id', 'version'], indexes: [\n { name: 'by-note', keyPath: ['noteId'] },\n { name: 'by-type', keyPath: ['dataType'] },\n { name: 'by-page', keyPath: ['pageId'] },\n { name: 'by-history', keyPath: ['isHistory'] },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 6. sessions\n { name: 'sessions', keyPath: ['id'], indexes: [\n { name: 'by-segment', keyPath: ['segmentId'] },\n { name: 'by-note', keyPath: ['noteId'] },\n { name: 'by-completed', keyPath: ['createdAt'] },\n { name: 'by-content', keyPath: ['blockContentId'] },\n { name: 'by-block', keyPath: ['blockId'] },\n { name: 'by-page', keyPath: ['pageId'] },\n { name: 'by-origin', keyPath: ['origin'] },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 7. results — removed in V26: legacy alias of sessions. The V26 upgrade\n // migrates any residual rows into `sessions` (projecting pre-V21 data.logs\n // into event rows) before dropping the store; no compatibility alias.\n // 8. attachments\n { name: 'attachments', keyPath: ['id'], indexes: [\n { name: 'by-note', keyPath: ['noteId'] },\n { name: 'by-time', keyPath: ['createdAt'] },\n { name: 'by-page', keyPath: ['pageId'] },\n { name: 'by-result', keyPath: ['resultId'] },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 9. events\n { name: 'events', keyPath: ['id'], indexes: [\n { name: 'by-timestamp', keyPath: ['timestamp'] },\n { name: 'by-result-grain', keyPath: ['resultId', 'grain'] },\n { name: 'by-content-grain', keyPath: ['blockContentId', 'grain'] },\n { name: 'by-effort', keyPath: ['effortSlug'] },\n { name: 'by-outputType', keyPath: ['outputType'] },\n { name: 'by-grain', keyPath: ['grain'] },\n { name: 'by-metric-date', keyPath: ['metricDateKeys'], multiEntry: true },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 10. field catalog\n { name: 'field_catalog', keyPath: ['id'], indexes: [\n { name: 'by-path', keyPath: ['path'] },\n ] },\n { name: 'field_sources', keyPath: ['id'], indexes: [] },\n { name: 'field_values', keyPath: ['key'], indexes: [\n { name: 'by-field', keyPath: ['fieldId'] },\n ] },\n { name: 'field_catalog_meta', keyPath: ['id'], indexes: [] },\n // 11. efforts\n { name: 'efforts', keyPath: ['slug'], indexes: [\n { name: 'by-discipline', keyPath: ['baseAttributes.discipline'] },\n { name: 'by-source', keyPath: ['registrySource'] },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 12. block_index\n { name: 'block_index', keyPath: ['id'], indexes: [\n { name: 'by-note', keyPath: ['noteId'] },\n { name: 'by-content', keyPath: ['blockContentId'] },\n { name: 'by-type', keyPath: ['dataType'] },\n { name: 'by-source', keyPath: ['sourceId'] },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 13. block_efforts\n { name: 'block_efforts', keyPath: ['id'], indexes: [\n { name: 'by-note', keyPath: ['noteId'] },\n { name: 'by-effort', keyPath: ['effortSlug'] },\n { name: 'by-block', keyPath: ['blockContentId'] },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 14. meta\n { name: 'meta', keyPath: ['key'], indexes: [] },\n // 15. memberships (V25, system — survives wipe; truth lives in\n // localStorage locally, in the SQL table on the API)\n { name: 'memberships', keyPath: ['id'], indexes: [], system: true },\n];\n","/**\n * Wire DTOs + key helpers shared by the storage client (ApiStorage) and the\n * API server. Keys are scalars or scalar tuples (keyPath order); ranges bound\n * them. Over HTTP, keys/ranges travel as urlencoded JSON query params.\n *\n * Range-typed helpers accept real IDBKeyRange instances AND plain RangeDTO\n * literals — non-IDB runtimes (Bun, node, tests) have no IDBKeyRange global,\n * so everything duck-types on field shape.\n */\n\nimport type { StoreName } from './contract';\nimport type { StoreDef } from './schema';\n\nexport type Scalar = string | number;\n\n/** Primary key: scalar for single-property keyPaths, tuple for compound. */\nexport type KeyDTO = Scalar | Scalar[];\n\nexport interface RangeDTO {\n only?: KeyDTO;\n /** Inclusive lower bound unless lowerOpen. Scalar or tuple (keyPath order). */\n lower?: KeyDTO;\n /** Inclusive upper bound unless upperOpen. Scalar or tuple (keyPath order). */\n upper?: KeyDTO;\n lowerOpen?: boolean;\n upperOpen?: boolean;\n}\n\nexport type TxOp =\n | { op: 'put'; store: StoreName; value: unknown }\n | { op: 'delete'; store: StoreName; key: KeyDTO }\n | { op: 'clear'; store: StoreName };\n\n/** Anything shaped like a range: real IDBKeyRange or a plain RangeDTO literal. */\nexport function isRange(arg: unknown): arg is RangeDTO {\n return arg !== null && typeof arg === 'object' && !Array.isArray(arg) &&\n ('only' in arg || 'lower' in arg || 'upper' in arg || 'lowerOpen' in arg || 'upperOpen' in arg);\n}\n\n/** Reads one dotted property path ('a.b.c') off a row. */\nexport function extractKeyPart(value: unknown, dottedPath: string): Scalar | undefined {\n let cur: unknown = value;\n for (const part of dottedPath.split('.')) {\n if (cur === null || typeof cur !== 'object') return undefined;\n // Dynamic key on an untyped row: index-signature view is the only way to read it.\n const row = cur as Record<string, unknown>;\n if (!(part in row)) return undefined;\n cur = row[part];\n }\n if (cur === null || typeof cur === 'object' || cur === undefined) return undefined;\n return cur as Scalar; // string/number/boolean leaf narrowed to the wire subset\n}\n\n/** Extracts a row's primary key per the store's inline keyPath. */\nexport function keyFromValue(def: StoreDef, value: unknown): KeyDTO {\n const parts = def.keyPath.map((p) => extractKeyPart(value, p));\n for (const [i, part] of parts.entries()) {\n if (part === undefined) {\n throw new Error(`keyFromValue(${def.name}): keyPath part '${def.keyPath[i]}' missing on value`);\n }\n }\n // Loop above proved every element defined.\n const key = parts as Scalar[];\n return key.length === 1 ? key[0] : key;\n}\n\n/** Canonical url-safe string form of a key (also the buffer/tx match key). */\nexport function encodeKey(key: KeyDTO): string {\n return encodeURIComponent(JSON.stringify(key));\n}\n\n/**\n * Converts an IndexedDB query — bare key, IDBKeyRange, or an already-wire\n * RangeDTO — to its wire form. Duck-types: objects with lower/upper/\n * lowerOpen/upperOpen fields (real ranges or plain literals) pass through;\n * scalars and tuple arrays become {only}.\n */\nexport function rangeFromIDB(query?: IDBValidKey | IDBKeyRange | RangeDTO): RangeDTO | undefined {\n if (query === undefined) return undefined;\n if (!isRange(query)) {\n // Bare IDBValidKey (scalar/tuple; exotic keys like Date pass through lossy).\n const key = query as KeyDTO;\n return { only: key };\n }\n if (query.only !== undefined) return query;\n const wire: RangeDTO = {};\n if (query.lower !== undefined && query.lower !== null) {\n wire.lower = query.lower;\n wire.lowerOpen = query.lowerOpen === true;\n }\n if (query.upper !== undefined && query.upper !== null) {\n wire.upper = query.upper;\n wire.upperOpen = query.upperOpen === true;\n }\n return wire.lower !== undefined || wire.upper !== undefined ? wire : undefined;\n}\n\n/** IndexedDB key ordering: numbers < strings < tuples; tuples lexicographic. */\nexport function compareKeys(a: KeyDTO, b: KeyDTO): number {\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b)) return Array.isArray(a) ? 1 : -1;\n for (let i = 0; i < Math.min(a.length, b.length); i++) {\n const c = compareKeys(a[i], b[i]);\n if (c !== 0) return c;\n }\n return a.length - b.length;\n }\n if (typeof a === 'number' && typeof b === 'number') {\n return a < b ? -1 : a > b ? 1 : 0;\n }\n if (typeof a === 'number' || typeof b === 'number') return typeof a === 'number' ? -1 : 1;\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/** True when a key matches a wire range (IDB bound semantics). */\nexport function keyInRange(key: KeyDTO, range: RangeDTO): boolean {\n if (range.only !== undefined) return compareKeys(key, range.only) === 0;\n if (range.lower !== undefined) {\n const c = compareKeys(key, range.lower);\n if (c < 0 || (c === 0 && range.lowerOpen === true)) return false;\n }\n if (range.upper !== undefined) {\n const c = compareKeys(key, range.upper);\n if (c > 0 || (c === 0 && range.upperOpen === true)) return false;\n }\n return true;\n}\n","/**\n * Schema-driven store operations: IDB-style stores persisted into SQL tables\n * (one per store, extracted key/index columns + full JSON in `data`). The\n * schema derives entirely from STORE_DEFS / COLUMN_TYPES; JSON payloads stay\n * the source of truth. Shared by the API server and the browser\n * BrowserTursoStorage/SqlStorage backends.\n */\nimport {\n COLUMN_TYPES,\n DB_VERSION,\n STORE_DEFS,\n type IndexDef,\n type StorageColumnType,\n type StoreDef,\n} from '../schema';\nimport {\n compareKeys,\n extractKeyPart,\n isRange,\n keyInRange,\n type KeyDTO,\n type RangeDTO,\n type Scalar,\n} from '../wire';\nimport type { Database, SqlConnection, SqlRow, SqlValue } from './connection';\nimport { StorageError } from './errors';\nimport type { StoreName } from '../contract';\nimport { decodeRowJson, encodeRowJson } from './codec';\n\nexport const SCHEMA_TABLE = '_wodwiki_schema';\nconst SCHEMA_KEY = 'schema';\n\n/** Stores whose rows carry a raw binary field the codec must preserve. */\nconst BINARY_FIELD: Partial<Record<StoreName, string>> = { attachments: 'data' };\n\nconst binaryFieldOf = (def: StoreDef): string | undefined => BINARY_FIELD[def.name];\n\nexport function storeDefinition(name: string): StoreDef {\n const def = STORE_DEFS.find((d) => d.name === name);\n if (!def) throw new StorageError(404, `unknown store: ${name}`);\n return def;\n}\n\nfunction indexDefinition(def: StoreDef, indexName: string): IndexDef {\n const idx = def.indexes.find((i) => i.name === indexName);\n if (!idx) throw new StorageError(404, `unknown index: ${def.name}.${indexName}`);\n return idx;\n}\n\n/** ASCII identifier chars only; everything else → '_' (safe inside quotes). */\nfunction sanitize(name: string): string {\n return name.replace(/[^A-Za-z0-9_]/g, '_');\n}\n\nconst indexCol = (indexName: string, part: number): string => `i_${sanitize(indexName)}_${part}`;\n\nfunction keyCols(def: StoreDef): string[] {\n return def.keyPath.map((_, i) => `k${i}`);\n}\n\nconst junctionTable = (def: StoreDef, idx: IndexDef): string => `${def.name}__${sanitize(idx.name)}`;\n\nconst multiEntryIndex = (def: StoreDef): IndexDef | undefined => def.indexes.find((i) => i.multiEntry);\n\nfunction pathType(def: StoreDef, path: string): StorageColumnType {\n return COLUMN_TYPES[def.name][path] ?? 'text';\n}\n\n/** SQLite store columns stay untyped (BLOB affinity) so values keep their\n * storage class and IDB ordering; PostgreSQL needs concrete types. Numbers\n * and booleans bind as float8 (booleans as 0/1), so both get DOUBLE\n * PRECISION. Text uses COLLATE \"C\" so PG ordering matches SQLite bytes. */\nfunction colSql(dialect: 'sqlite' | 'postgres', type: StorageColumnType): string {\n if (dialect === 'sqlite') return '';\n return type === 'text' ? ' TEXT COLLATE \"C\"' : ' DOUBLE PRECISION';\n}\n\n/** Runtime scalar → bound SQL value: null→NULL, bool→1/0, number/string as-is,\n * anything else → JSON text. */\nfunction toSqlScalar(v: unknown): SqlValue {\n if (v === null || v === undefined) return null;\n if (typeof v === 'boolean') return v ? 1 : 0;\n if (typeof v === 'number' || typeof v === 'string') return v;\n return JSON.stringify(v);\n}\n\nfunction validateKey(key: unknown): asserts key is KeyDTO {\n const scalar = (v: unknown): v is Scalar =>\n typeof v === 'string' || (typeof v === 'number' && Number.isFinite(v));\n if (!scalar(key) && !(Array.isArray(key) && key.length > 0 && key.every(scalar))) {\n throw new StorageError(400, 'key must be a string, finite number, or non-empty scalar tuple');\n }\n}\n\nfunction validateRange(range: RangeDTO | undefined): void {\n if (range === undefined) return;\n if (range === null || typeof range !== 'object' || Array.isArray(range)) {\n throw new StorageError(400, 'range must be an object');\n }\n for (const key of [range.only, range.lower, range.upper]) {\n if (key !== undefined) validateKey(key);\n }\n for (const open of [range.lowerOpen, range.upperOpen]) {\n if (open !== undefined && typeof open !== 'boolean') {\n throw new StorageError(400, 'range open flags must be boolean');\n }\n }\n}\n\nfunction toParts(key: KeyDTO): Scalar[] {\n validateKey(key);\n return Array.isArray(key) ? key : [key];\n}\n\n/** Reads a dotted path whose leaf must be an array (multiEntry values).\n * Shared extractKeyPart deliberately rejects array leaves, so the last hop\n * is traversed here over the parsed JSON row. */\nfunction arrayPart(value: unknown, dotted: string): unknown[] | undefined {\n let cur: unknown = value;\n for (const part of dotted.split('.')) {\n if (cur === null || typeof cur !== 'object') return undefined;\n // Traversal over parsed JSON: only plain rows are ever stored.\n const row = cur as Record<string, unknown>;\n cur = row[part];\n }\n return Array.isArray(cur) ? cur : undefined;\n}\n\n/** Primary-key extraction at the trust boundary: a missing keyPath part is\n * required-input validation → 400 (not an internal error). */\nfunction requireKey(def: StoreDef, value: unknown): KeyDTO {\n const parts = def.keyPath.map((p) => extractKeyPart(value, p));\n for (const [i, part] of parts.entries()) {\n if (part === undefined) {\n throw new StorageError(400, `keyPath part '${def.keyPath[i]}' missing on ${def.name} value`);\n }\n }\n const key = parts as Scalar[];\n return key.length === 1 ? key[0] : key;\n}\n\n/** Scalar bounds compile to the first key column; tuple bounds compile\n * part-wise when their arity fits the target columns; anything else returns\n * null → caller falls back to a scan + shared keyInRange filter. Returns the WHERE\n * clause ('' when unfiltered) and pushes bound params in order. */\nfunction rangeWhere(cols: string[], range: RangeDTO | undefined, params: SqlValue[]): string | null {\n if (!range) return '';\n if (range.only !== undefined) {\n const parts = toParts(range.only);\n if (parts.length > cols.length) return null;\n const clauses = parts.map((p, i) => {\n params.push(toSqlScalar(p));\n return `\"${cols[i]}\" = ?`;\n });\n return ` WHERE ${clauses.join(' AND ')}`;\n }\n const bounds: Array<[Scalar[], string]> = [];\n if (range.lower !== undefined && range.lower !== null) {\n bounds.push([toParts(range.lower), range.lowerOpen ? '>' : '>=']);\n }\n if (range.upper !== undefined && range.upper !== null) {\n bounds.push([toParts(range.upper), range.upperOpen ? '<' : '<=']);\n }\n const clauses: string[] = [];\n for (const [parts, op] of bounds) {\n if (parts.length > cols.length) return null;\n if (parts.length === 1) {\n params.push(toSqlScalar(parts[0]));\n clauses.push(`\"${cols[0]}\" ${op} ?`);\n } else {\n // Tuple compare: (c0,c1) >= (p0,p1) ⇔ c0 > p0 OR (c0 = p0 AND c1 >= p1)\n const ors = parts.map((p, i) => {\n const eqs: string[] = [];\n for (let j = 0; j < i; j++) {\n params.push(toSqlScalar(parts[j]));\n eqs.push(`\"${cols[j]}\" = ?`);\n }\n params.push(toSqlScalar(p));\n const cmpOp = i === parts.length - 1 ? op : op[0];\n eqs.push(`\"${cols[i]}\" ${cmpOp} ?`);\n return `(${eqs.join(' AND ')})`;\n });\n clauses.push(`(${ors.join(' OR ')})`);\n }\n }\n return clauses.length ? ` WHERE ${clauses.join(' AND ')}` : '';\n}\n\nfunction clampLimit(count: number | undefined): number | undefined {\n if (count === undefined) return undefined;\n if (typeof count !== 'number' || !Number.isFinite(count)) {\n throw new StorageError(400, `invalid count: ${String(count)}`);\n }\n return Math.max(0, Math.floor(count));\n}\n\nconst limitClause = (count: number | undefined): string =>\n count === undefined ? '' : ` LIMIT ${clampLimit(count)}`;\n\nfunction parseRows(rows: SqlRow[], binaryField?: string): unknown[] {\n return rows.map((r) => decodeRowJson(r.data as string, binaryField));\n}\n\n/** Full-table scan + in-memory IDB filtering/ordering via the shared wire\n * helpers. Only reachable for range shapes the column compile cannot express\n * (arity mismatches). Rows missing an index field are NOT in the index\n * (IDB semantics) and are skipped; a missing primary key is a 400. */\nasync function scanRows(\n conn: SqlConnection,\n def: StoreDef,\n idx: IndexDef | undefined,\n range: RangeDTO | undefined,\n limit: number | undefined,\n): Promise<unknown[]> {\n const rows = await conn.query(`SELECT \"data\" FROM \"${def.name}\"`);\n const keyed: Array<[KeyDTO, unknown]> = [];\n for (const row of rows) {\n const value = decodeRowJson(row.data as string, binaryFieldOf(def));\n if (idx) {\n const parts = idx.keyPath.map((p) => extractKeyPart(value, p));\n if (!parts.every((p): p is Scalar => p !== undefined)) continue;\n const key = parts.length === 1 ? parts[0] : parts;\n if (range && !keyInRange(key, range)) continue;\n keyed.push([key, value]);\n } else {\n const key = requireKey(def, value);\n if (range && !keyInRange(key, range)) continue;\n keyed.push([key, value]);\n }\n }\n keyed.sort((a, b) => compareKeys(a[0], b[0]));\n const out = keyed.map(([, v]) => v);\n return limit === undefined ? out : out.slice(0, limit);\n}\n\nexport async function getRow(conn: SqlConnection, def: StoreDef, key: KeyDTO): Promise<unknown | undefined> {\n const parts = toParts(key);\n if (parts.length !== def.keyPath.length) {\n throw new StorageError(400, `key arity ${parts.length} != keyPath arity ${def.keyPath.length} for ${def.name}`);\n }\n const cond = keyCols(def).map((c) => `\"${c}\" = ?`).join(' AND ');\n const rows = await conn.query(\n `SELECT \"data\" FROM \"${def.name}\" WHERE ${cond}`,\n parts.map(toSqlScalar),\n );\n return rows[0] ? decodeRowJson(rows[0].data as string, binaryFieldOf(def)) : undefined;\n}\n\nexport async function listRows(\n conn: SqlConnection,\n def: StoreDef,\n range?: RangeDTO,\n count?: number,\n indexName?: string,\n): Promise<unknown[]> {\n validateRange(range);\n const idx = indexName ? indexDefinition(def, indexName) : undefined;\n const binaryField = binaryFieldOf(def);\n if (idx?.multiEntry) {\n // JSON encoding preserves numeric/string equality in both SQL dialects.\n const only = range?.only;\n if (only === undefined || typeof only === 'object') {\n throw new StorageError(400, `multi-entry index ${def.name}.${idx.name} supports exact-match queries only`);\n }\n const joinOn = keyCols(def).map((c) => `j.\"${c}\" = e.\"${c}\"`).join(' AND ');\n // IDB multi-entry ordering: junction value first, then the primary key.\n const order = ['j.\"v\"', ...keyCols(def).map((c) => `j.\"${c}\"`)].join(', ');\n const rows = await conn.query(\n `SELECT e.\"data\" AS \"data\" FROM \"${def.name}\" e JOIN \"${junctionTable(def, idx)}\" j ON ${joinOn}` +\n ` WHERE j.\"v\" = ? ORDER BY ${order}${limitClause(count)}`,\n [JSON.stringify(only)],\n );\n return parseRows(rows, binaryField);\n }\n const cols = idx ? idx.keyPath.map((_, part) => indexCol(idx.name, part)) : keyCols(def);\n const params: SqlValue[] = [];\n const where = rangeWhere(cols, range, params);\n if (where === null) return scanRows(conn, def, idx, range, clampLimit(count));\n // IDB: rows whose index key is missing/invalid are not in the index —\n // exclude them even from unfiltered listings (SQL NULL comparison alone\n // only drops them from bounded ranges). NULLS never reach ORDER BY.\n const notNull = cols.map((c) => `\"${c}\" IS NOT NULL`).join(' AND ');\n const cond = where ? `${where} AND ${notNull}` : ` WHERE ${notNull}`;\n // IDB orders index results by (index key, primary key).\n const keyNames = keyCols(def).filter((k) => !cols.includes(k));\n const order = ` ORDER BY ${[...cols, ...keyNames].map((c) => `\"${c}\"`).join(', ')}`;\n const rows = await conn.query(\n `SELECT \"data\" FROM \"${def.name}\"${cond}${order}${limitClause(count)}`,\n params,\n );\n return parseRows(rows, binaryField);\n}\n\nexport async function countRows(\n conn: SqlConnection,\n def: StoreDef,\n range?: RangeDTO,\n indexName?: string,\n): Promise<number> {\n validateRange(range);\n const idx = indexName ? indexDefinition(def, indexName) : undefined;\n if (idx?.multiEntry) {\n const only = range?.only;\n if (only === undefined || typeof only === 'object') {\n throw new StorageError(400, `multi-entry index ${def.name}.${idx.name} supports exact-match queries only`);\n }\n const joinOn = keyCols(def).map((c) => `j.\"${c}\" = e.\"${c}\"`).join(' AND ');\n const rows = await conn.query(\n `SELECT COUNT(*) AS \"n\" FROM \"${def.name}\" e JOIN \"${junctionTable(def, idx)}\" j ON ${joinOn} WHERE j.\"v\" = ?`,\n [JSON.stringify(only)],\n );\n return Number(rows[0]?.n ?? 0);\n }\n const cols = idx ? idx.keyPath.map((_, part) => indexCol(idx.name, part)) : keyCols(def);\n const params: SqlValue[] = [];\n const where = rangeWhere(cols, range, params);\n if (where === null) {\n const all = await scanRows(conn, def, idx, range, undefined);\n return all.length;\n }\n const cond = idx ? (where ? `${where} AND ${cols.map((c) => `\"${c}\" IS NOT NULL`).join(' AND ')}` : ` WHERE ${cols.map((c) => `\"${c}\" IS NOT NULL`).join(' AND ')}`) : where;\n const rows = await conn.query(`SELECT COUNT(*) AS \"n\" FROM \"${def.name}\"${cond}`, params);\n return Number(rows[0]?.n ?? 0);\n}\n\nexport async function putRow(conn: SqlConnection, def: StoreDef, value: unknown): Promise<KeyDTO> {\n const key = requireKey(def, value);\n const keyParts = toParts(key).map(toSqlScalar);\n const keys = keyCols(def);\n\n const cols = [...keys];\n const vals = [...keyParts];\n for (const idx of def.indexes) {\n if (idx.multiEntry) continue;\n idx.keyPath.forEach((path, part) => {\n cols.push(indexCol(idx.name, part));\n vals.push(toSqlScalar(extractKeyPart(value, path) ?? null));\n });\n }\n cols.push('data');\n // Codec keeps attachment ArrayBuffer payloads byte-exact (attachment-only field).\n vals.push(encodeRowJson(value, binaryFieldOf(def)));\n\n const keySet = new Set(keys);\n const updates = cols.filter((c) => !keySet.has(c)).map((c) => `\"${c}\" = excluded.\"${c}\"`).join(', ');\n const collist = cols.map((c) => `\"${c}\"`).join(', ');\n const placeholders = cols.map(() => '?').join(', ');\n const pk = keys.map((k) => `\"${k}\"`).join(', ');\n await conn.exec(\n `INSERT INTO \"${def.name}\" (${collist}) VALUES (${placeholders}) ON CONFLICT (${pk}) DO UPDATE SET ${updates}`,\n vals,\n );\n\n const multi = multiEntryIndex(def);\n if (multi) {\n const jt = junctionTable(def, multi);\n const cond = keys.map((c) => `\"${c}\" = ?`).join(' AND ');\n await conn.exec(`DELETE FROM \"${jt}\" WHERE ${cond}`, keyParts);\n const items = arrayPart(value, multi.keyPath[0]);\n if (Array.isArray(items)) {\n const jcols = [...keys, 'v'];\n const jcollist = jcols.map((c) => `\"${c}\"`).join(', ');\n const jph = jcols.map(() => '?').join(', ');\n for (const item of items) {\n await conn.exec(\n `INSERT INTO \"${jt}\" (${jcollist}) VALUES (${jph}) ON CONFLICT DO NOTHING`,\n [...keyParts, JSON.stringify(item)],\n );\n }\n }\n }\n return key;\n}\n\nexport async function deleteRows(conn: SqlConnection, def: StoreDef, keyOrRange: KeyDTO | RangeDTO): Promise<void> {\n const multi = multiEntryIndex(def);\n if (!isRange(keyOrRange)) {\n const parts = toParts(keyOrRange);\n if (parts.length > def.keyPath.length) {\n throw new StorageError(400, `key arity ${parts.length} > keyPath arity ${def.keyPath.length} for ${def.name}`);\n }\n const n = Math.min(parts.length, def.keyPath.length);\n const cond = keyCols(def).slice(0, n).map((c) => `\"${c}\" = ?`).join(' AND ');\n const params = parts.slice(0, n).map(toSqlScalar);\n if (multi) await conn.exec(`DELETE FROM \"${junctionTable(def, multi)}\" WHERE ${cond}`, params);\n await conn.exec(`DELETE FROM \"${def.name}\" WHERE ${cond}`, params);\n return;\n }\n validateRange(keyOrRange);\n const cols = keyCols(def);\n const params: SqlValue[] = [];\n const where = rangeWhere(cols, keyOrRange, params);\n if (where === null) {\n // Uncompilable shape: enumerate matching rows, delete per key.\n for (const row of await listRows(conn, def, keyOrRange)) {\n await deleteRows(conn, def, requireKey(def, row));\n }\n return;\n }\n const collist = cols.map((c) => `\"${c}\"`).join(', ');\n if (multi) {\n await conn.exec(\n `DELETE FROM \"${junctionTable(def, multi)}\" WHERE (${collist}) IN (SELECT ${collist} FROM \"${def.name}\"${where})`,\n params,\n );\n }\n await conn.exec(`DELETE FROM \"${def.name}\"${where}`, params);\n}\n\nexport async function clearRows(conn: SqlConnection, def: StoreDef): Promise<void> {\n const multi = multiEntryIndex(def);\n if (multi) await conn.exec(`DELETE FROM \"${junctionTable(def, multi)}\"`);\n await conn.exec(`DELETE FROM \"${def.name}\"`);\n}\n\n/** Wipe all user stores; system stores (memberships) survive and the internal\n * schema metadata table is not a store, so the version guard is untouched. */\nexport async function wipeRows(conn: SqlConnection): Promise<void> {\n for (const def of STORE_DEFS) {\n if (!def.system) await clearRows(conn, def);\n }\n}\n\nfunction tableListSql(dialect: 'sqlite' | 'postgres'): string {\n return dialect === 'sqlite'\n ? `SELECT \"name\" FROM \"sqlite_master\" WHERE \"type\" = 'table'`\n : `SELECT \"table_name\" FROM \"information_schema\".\"tables\" WHERE \"table_schema\" = current_schema()`;\n}\n\n/** Create the current schema only. Existing incompatible versions fail closed. */\nasync function ensureStoreTables(\n conn: SqlConnection,\n dialect: 'sqlite' | 'postgres',\n def: StoreDef,\n): Promise<void> {\n const keys = keyCols(def);\n const cols: Array<[string, string]> = keys.map((k, i) => [k, colSql(dialect, pathType(def, def.keyPath[i]))]);\n for (const idx of def.indexes) {\n if (idx.multiEntry) continue;\n idx.keyPath.forEach((path, part) => {\n cols.push([indexCol(idx.name, part), colSql(dialect, pathType(def, path))]);\n });\n }\n cols.push(['data', ' TEXT NOT NULL']);\n const colDefs = cols.map(([c, t]) => `\"${c}\"${t}`);\n await conn.exec(\n `CREATE TABLE IF NOT EXISTS \"${def.name}\" (${colDefs.join(', ')}, PRIMARY KEY (${keys.map((k) => `\"${k}\"`).join(', ')}))`,\n );\n for (const idx of def.indexes) {\n if (idx.multiEntry) continue;\n const parts = idx.keyPath.map((_, part) => `\"${indexCol(idx.name, part)}\"`).join(', ');\n await conn.exec(\n `CREATE ${idx.unique ? 'UNIQUE ' : ''}INDEX IF NOT EXISTS \"${def.name}__${sanitize(idx.name)}\" ON \"${def.name}\" (${parts})`,\n );\n }\n const multi = multiEntryIndex(def);\n if (multi) {\n const jt = junctionTable(def, multi);\n const jkeys = keys.map((k, i) => `\"${k}\"${colSql(dialect, pathType(def, def.keyPath[i]))}`);\n // v: BLOB affinity on sqlite (storage class preserved), byte-order C on PG.\n await conn.exec(\n `CREATE TABLE IF NOT EXISTS \"${jt}\" (${jkeys.join(', ')}, \"v\"${colSql(dialect, 'text')}, PRIMARY KEY (${[...keys, '\"v\"'].join(', ')}))`,\n );\n await conn.exec(`CREATE INDEX IF NOT EXISTS \"${jt}__v\" ON \"${jt}\" (\"v\")`);\n }\n}\n\n/** Internal schema metadata is not exposed or cleared by the store API. */\nexport async function initializeStore(db: Database): Promise<void> {\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 storeTables = new Set<string>(STORE_DEFS.map((d) => d.name));\n const tableNames = new Set(\n (await tx.query(tableListSql(db.dialect))).map((r) => String(Object.values(r)[0])),\n );\n const guardRows = await tx.query(`SELECT \"value\" FROM \"${SCHEMA_TABLE}\" WHERE \"key\" = ?`, [SCHEMA_KEY]);\n let stored: number | undefined;\n if (guardRows[0]) {\n const guard = JSON.parse(String(guardRows[0].value)) as { version?: unknown };\n if (typeof guard.version !== 'number') {\n throw new StorageError(500, `corrupt ${SCHEMA_TABLE} guard row`, 'bad_schema_guard');\n }\n stored = guard.version;\n if (stored !== DB_VERSION) {\n throw new StorageError(\n 500,\n `database schema v${stored} does not match this server (v${DB_VERSION}); use a compatible server or migrate a backed-up database`,\n 'schema_incompatible',\n );\n }\n } else if ([...tableNames].some((name) => storeTables.has(name))) {\n throw new StorageError(\n 500,\n 'database contains store tables but no wod-wiki schema guard; refusing to adopt a foreign database — point SQLITE_PATH/DATABASE_URL at a fresh database',\n 'foreign_database',\n );\n }\n for (const def of STORE_DEFS) await ensureStoreTables(tx, db.dialect, def);\n if (stored !== DB_VERSION) {\n await tx.exec(\n `INSERT INTO \"${SCHEMA_TABLE}\" (\"key\", \"value\") VALUES (?, ?) ON CONFLICT (\"key\") DO UPDATE SET \"value\" = excluded.\"value\"`,\n [SCHEMA_KEY, JSON.stringify({ version: DB_VERSION })],\n );\n }\n });\n}\n","import type { BlockIndexRow, Note, NoteSegment, Page, PageNote, Tag } from './entities';\n\nexport const DOMAIN_PROJECTION_VERSION = 1;\n\nexport type DomainPredicate =\n | { field: 'id' | 'noteId' | 'type' | 'catalog' | 'source' | 'tags' | 'effort'; values: string[]; negate?: boolean }\n | { field: 'text'; value: string }\n | { field: 'date'; start: number; end: number; endExclusive?: boolean }\n | { field: 'page'; value: boolean }\n | { field: 'defaultNotes'; feeds: boolean }\n | { field: 'sourceFence' };\n\nexport type DomainOrder = {\n field: 'id' | 'createdAt' | 'date' | 'title' | 'noteTitle' | 'dataType' | 'position';\n direction: 'asc' | 'desc';\n};\n\nexport type DomainQuery = {\n plan: 'notes' | 'blocks' | 'entries';\n selection?: DomainPredicate[];\n filters?: DomainPredicate[];\n order?: DomainOrder[];\n offset?: number;\n limit?: number;\n};\n\nexport interface DomainEntry {\n note: Note;\n segments: NoteSegment[];\n tags: Tag[];\n links: PageNote[];\n pages: Page[];\n}\n\nexport type DomainQueryResult = {\n projectionVersion: typeof DOMAIN_PROJECTION_VERSION;\n selectedCount: number;\n matchedCount: number;\n} & (\n | { plan: 'notes'; rows: Note[] }\n | { plan: 'blocks'; rows: BlockIndexRow[] }\n | { plan: 'entries'; rows: DomainEntry[] }\n);\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction optionalStrings(row: Record<string, unknown>, fields: string[]): boolean {\n return fields.every(field => row[field] === undefined || typeof row[field] === 'string');\n}\n\nfunction finiteNumbers(row: Record<string, unknown>, fields: string[]): boolean {\n return fields.every(field => typeof row[field] === 'number' && Number.isFinite(row[field]));\n}\n\nfunction isNote(value: unknown): value is Note {\n return isObject(value) && typeof value.id === 'string' && typeof value.title === 'string'\n && finiteNumbers(value, ['createdAt'])\n && (value.date === undefined || finiteNumbers(value, ['date']))\n && optionalStrings(value, ['type', 'sourceId', 'catalog', 'sourcePath', 'seedOrigin', 'seedChunkId'])\n && (value.tags === undefined || (Array.isArray(value.tags) && value.tags.every(tag => typeof tag === 'string')));\n}\n\nfunction isBlock(value: unknown): value is BlockIndexRow {\n return isObject(value) && typeof value.id === 'string' && typeof value.noteId === 'string'\n && typeof value.segmentId === 'string' && finiteNumbers(value, ['segmentVersion', 'createdAt'])\n && typeof value.dataType === 'string' && typeof value.rawContent === 'string'\n && typeof value.noteTitle === 'string'\n && optionalStrings(value, ['blockContentId', 'sourceId', 'sourcePath', 'routeId'])\n && (value.position === undefined || finiteNumbers(value, ['position']))\n && (value.isStatic === undefined || typeof value.isStatic === 'boolean');\n}\n\nfunction isSegment(value: unknown): value is NoteSegment {\n return isObject(value) && typeof value.id === 'string' && typeof value.noteId === 'string'\n && finiteNumbers(value, ['version', 'createdAt']) && typeof value.dataType === 'string'\n && typeof value.rawContent === 'string' && (value.data === null || isObject(value.data))\n && optionalStrings(value, ['sourceContent', 'pageId'])\n && (value.position === undefined || finiteNumbers(value, ['position']))\n && (value.isHistory === undefined || typeof value.isHistory === 'boolean');\n}\n\nfunction isTag(value: unknown): value is Tag {\n return isObject(value) && typeof value.id === 'string' && typeof value.label === 'string'\n && finiteNumbers(value, ['createdAt']) && optionalStrings(value, ['type']);\n}\n\nfunction isPage(value: unknown): value is Page {\n return isObject(value) && typeof value.id === 'string' && finiteNumbers(value, ['createdAt'])\n && optionalStrings(value, ['date', 'slug', 'title']);\n}\n\nfunction isLink(value: unknown): value is PageNote {\n return isObject(value) && typeof value.id === 'string' && typeof value.noteId === 'string'\n && typeof value.pageId === 'string' && finiteNumbers(value, ['createdAt'])\n && (value.position === undefined || finiteNumbers(value, ['position']));\n}\n\nfunction isEntry(value: unknown): value is DomainEntry {\n return isObject(value) && isNote(value.note)\n && Array.isArray(value.segments) && value.segments.every(isSegment)\n && Array.isArray(value.tags) && value.tags.every(isTag)\n && Array.isArray(value.links) && value.links.every(isLink)\n && Array.isArray(value.pages) && value.pages.every(isPage);\n}\n\nexport function parseDomainQueryResult(value: unknown, plan: DomainQuery['plan']): DomainQueryResult {\n if (!isObject(value) || value.projectionVersion !== DOMAIN_PROJECTION_VERSION\n || value.plan !== plan || !Array.isArray(value.rows)\n || typeof value.selectedCount !== 'number' || !Number.isSafeInteger(value.selectedCount) || value.selectedCount < 0\n || typeof value.matchedCount !== 'number' || !Number.isSafeInteger(value.matchedCount) || value.matchedCount < 0\n || value.matchedCount > value.selectedCount || value.rows.length > value.matchedCount) {\n throw new Error('ApiStorage: invalid or stale domain projection response');\n }\n const counts = { projectionVersion: DOMAIN_PROJECTION_VERSION, selectedCount: value.selectedCount, matchedCount: value.matchedCount } as const;\n switch (plan) {\n case 'notes':\n if (value.rows.every(isNote)) return { ...counts, plan, rows: value.rows };\n break;\n case 'blocks':\n if (value.rows.every(isBlock)) return { ...counts, plan, rows: value.rows };\n break;\n case 'entries':\n if (value.rows.every(isEntry)) return { ...counts, plan, rows: value.rows };\n break;\n }\n throw new Error('ApiStorage: invalid domain query rows');\n}\n","/**\n * Domain read models + incremental projection refresh over the shared SQL\n * store tables.\n *\n * Three derived tables, rebuilt from the per-store source tables (source of\n * truth) when incompatible and refreshed per affected key inside the same\n * transaction as every mutation:\n * domain_note — note metadata selector + original payload\n * query_block — one occurrence row per block_index row, parent resolved by\n * exact noteId or sourcePath (ambiguous/orphan → NULL parent,\n * which gates ALL domain reads with 409 until healed)\n * segment_head — MAX(version) per segment id taken BEFORE the isHistory\n * filter, so a superseded revision can never resurrect\n *\n * Rebuilds are guarded: a `_wodwiki_schema` row stamps the projection\n * version, so repeated ready()/boot cycles skip the rebuild while the\n * derived shape is already compatible.\n *\n * Query plans are fixed and fully validated: every value is a bound parameter,\n * names come from this module, counts run before paging, and text matching is\n * a literal substring over JS-lowercased materialized columns (Unicode-exact;\n * instr/strpos never treat % or _ as wildcards).\n *\n * `journal` is materialized in JS (sourceMatches from the wql package — the\n * exact predicate the app applies) so no SQL regex re-implementation exists.\n */\n\nimport type { Database, SqlConnection, SqlValue } from './connection';\nimport { StorageError } from './errors';\nimport { putRow, deleteRows, clearRows, listRows, storeDefinition, SCHEMA_TABLE } from './store';\nimport { decodeRowJson, encodeRowJson } from './codec';\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';\n\nconst TABLES = ['domain_note', 'query_block', 'segment_head'] 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'] 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 }\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, \"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 `CREATE TABLE IF NOT EXISTS \"segment_head\" (\"id\"${t} PRIMARY KEY NOT NULL, \"note_id\"${t} NOT NULL, \"current_version\"${n} NOT NULL, \"position\"${n}, \"search_text\"${t} NOT NULL)`,\n `CREATE INDEX IF NOT EXISTS \"idx_segment_head_note\" ON \"segment_head\" (\"note_id\", \"id\")`,\n ];\n return db.transaction(async (tx) => {\n for (const sql of ddl) await tx.exec(sql);\n });\n}\n\n// ── Row upserts ──────────────────────────────────────────────────────────────\n\nasync function upsertDomainNote(conn: SqlConnection, note: Record<string, unknown>): Promise<void> {\n const id = text(note.id);\n if (!id) return; // no identity to project — the store write itself still succeeds\n const source = sourceItem(note);\n await conn.exec(\n `INSERT INTO \"domain_note\" (\"note_id\",\"note_type\",\"catalog\",\"source_id\",\"source_path\",\"title\",\"created_at\",\"date\",\"text_search\",\"journal\",\"payload\")\n VALUES (?,?,?,?,?,?,?,?,?,?,?)\n ON CONFLICT (\"note_id\") DO UPDATE SET \"note_type\"=excluded.\"note_type\",\"catalog\"=excluded.\"catalog\",\"source_id\"=excluded.\"source_id\",\n \"source_path\"=excluded.\"source_path\",\"title\"=excluded.\"title\",\"created_at\"=excluded.\"created_at\",\"date\"=excluded.\"date\",\n \"text_search\"=excluded.\"text_search\",\"journal\"=excluded.\"journal\",\"payload\"=excluded.\"payload\"`,\n [\n id,\n T(note.type),\n T(catalogOfItem(source)),\n T(note.sourceId),\n T(note.sourcePath),\n T(note.title) ?? '',\n N(note.createdAt),\n num(note.date),\n (text(note.title) ?? '').toLowerCase(),\n sourceMatches(source, 'journal') ? 1 : 0,\n encodeRowJson(note),\n ],\n );\n}\n\n/** Re-project block occurrences onto a (re)written note: every block whose\n * parent identity points here (exact id or shared source path) re-resolves\n * through the fail-closed exact-parent rule — ambiguous identities stay\n * orphaned instead of being arbitrarily re-pointed. */\nasync function healQueryBlocksForNote(conn: SqlConnection, note: Record<string, unknown>): Promise<void> {\n const id = text(note.id);\n if (!id) return;\n const rows = await conn.query(\n `SELECT \"occurrence_id\" FROM \"query_block\"\n WHERE \"source_note_id\" = ? OR (\"source_path\" IS NOT NULL AND \"source_path\" = ?)`,\n [id, T(note.sourcePath)],\n );\n for (const row of rows) await refreshBlock(conn, String(row.occurrence_id));\n}\n\nasync function upsertSegmentHead(conn: SqlConnection, id: SqlValue, head: Record<string, unknown>): Promise<void> {\n await conn.exec(\n `INSERT INTO \"segment_head\" (\"id\",\"note_id\",\"current_version\",\"position\",\"search_text\")\n VALUES (?,?,?,?,?)\n ON CONFLICT (\"id\") DO UPDATE SET \"note_id\"=excluded.\"note_id\",\"current_version\"=excluded.\"current_version\",\n \"position\"=excluded.\"position\",\"search_text\"=excluded.\"search_text\"`,\n [\n id,\n T(head.noteId) ?? '',\n N(head.version),\n // Local latest-segments order is position ?? createdAt — same fallback here.\n num(head.position) ?? num(head.createdAt),\n (text(head.rawContent) ?? '').toLowerCase(),\n ],\n );\n}\n\nasync function identityBy(conn: SqlConnection, col: 'note_id' | 'source_path', val: string): Promise<NoteIdentity[]> {\n const rows = await conn.query(\n `SELECT \"note_id\", \"date\", \"created_at\" FROM \"domain_note\" WHERE \"${col}\" = ?`,\n [val],\n );\n return rows.map((r) => ({\n note_id: String(r.note_id),\n date: num(r.date),\n created_at: num(r.created_at) ?? 0,\n }));\n}\n\n/** Exact noteId first, then deterministic source-path identity. Ambiguous or\n * missing identity → undefined (row stays orphaned; reads gate on it). */\nasync function resolveParent(conn: SqlConnection, block: Record<string, unknown>): Promise<NoteIdentity | undefined> {\n const byPath = async (sp: string): Promise<NoteIdentity | undefined> => {\n const rows = await identityBy(conn, 'source_path', sp);\n return rows.length === 1 ? rows[0] : undefined; // >1 = ambiguous, never guess\n };\n const nid = text(block.noteId);\n if (nid) {\n const rows = await identityBy(conn, 'note_id', nid);\n if (rows.length === 1) return rows[0];\n if (rows.length > 1) return undefined;\n }\n const sp = text(block.sourcePath);\n return sp ? byPath(sp) : undefined;\n}\n\nasync function upsertQueryBlock(conn: SqlConnection, block: Record<string, unknown>): Promise<void> {\n const id = text(block.id);\n if (!id) return;\n const source = sourceItem(block);\n const createdAt = N(block.createdAt);\n const parent = await resolveParent(conn, block);\n const effective = parent ? (parent.date ?? parent.created_at) : createdAt;\n await conn.exec(\n `INSERT INTO \"query_block\" (\"occurrence_id\",\"source_note_id\",\"parent_note_id\",\"content_id\",\"section_key\",\"ordinal\",\n \"data_type\",\"source_id\",\"source_path\",\"catalog\",\"effective_date\",\"created_at\",\"note_title\",\"normalized_text\",\"journal\",\"payload\")\n VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)\n ON CONFLICT (\"occurrence_id\") DO UPDATE SET \"source_note_id\"=excluded.\"source_note_id\",\"parent_note_id\"=excluded.\"parent_note_id\",\n \"content_id\"=excluded.\"content_id\",\"section_key\"=excluded.\"section_key\",\"ordinal\"=excluded.\"ordinal\",\n \"data_type\"=excluded.\"data_type\",\"source_id\"=excluded.\"source_id\",\"source_path\"=excluded.\"source_path\",\n \"catalog\"=excluded.\"catalog\",\"effective_date\"=excluded.\"effective_date\",\"created_at\"=excluded.\"created_at\",\n \"note_title\"=excluded.\"note_title\",\"normalized_text\"=excluded.\"normalized_text\",\"journal\"=excluded.\"journal\",\n \"payload\"=excluded.\"payload\"`,\n [\n id,\n T(block.noteId),\n parent?.note_id ?? null,\n T(block.blockContentId),\n T(block.segmentId),\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 T(block.noteTitle),\n (text(block.rawContent) ?? '').toLowerCase(),\n sourceMatches(source, 'journal') ? 1 : 0,\n encodeRowJson(block),\n ],\n );\n}\n\n// ── Per-key refresh ──────────────────────────────────────────────────────────\n\n/** Segment keys are [id, version]; head pointers key on the first part. */\nconst keyHead = (key: KeyDTO): SqlValue => (Array.isArray(key) ? (key[0] as SqlValue) : key);\n\nasync function refreshNote(conn: SqlConnection, id: KeyDTO): Promise<void> {\n const k = keyHead(id);\n const rows = await conn.query(`SELECT \"data\" FROM \"notes\" WHERE \"k0\" = ?`, [k]);\n const note = rows[0] ? (decodeRowJson<Record<string, unknown>>(String(rows[0].data))) : undefined;\n if (note) {\n await upsertDomainNote(conn, note);\n await healQueryBlocksForNote(conn, note);\n } else {\n const orphans = await conn.query(\n `SELECT \"occurrence_id\" FROM \"query_block\" WHERE \"parent_note_id\" = ? OR \"source_note_id\" = ?`,\n [k, k],\n );\n await conn.exec(`DELETE FROM \"domain_note\" WHERE \"note_id\" = ?`, [k]);\n // Re-project rather than blindly nulling: a surviving unique source-path\n // identity re-parents; ambiguous ones fail closed and gate reads.\n for (const row of orphans) await refreshBlock(conn, String(row.occurrence_id));\n }\n}\n\nasync function refreshSegment(conn: SqlConnection, id: KeyDTO): Promise<void> {\n const k = keyHead(id);\n const rows = await conn.query(`SELECT \"data\" FROM \"segments\" WHERE \"k0\" = ?`, [k]);\n let head: Record<string, unknown> | undefined;\n let headVersion = -Infinity;\n for (const row of rows) {\n const seg = decodeRowJson<Record<string, unknown>>(String(row.data));\n const v = num(seg.version) ?? 0;\n if (!head || v > headVersion) {\n head = seg;\n headVersion = v;\n }\n }\n if (head) await upsertSegmentHead(conn, k, head);\n else await conn.exec(`DELETE FROM \"segment_head\" WHERE \"id\" = ?`, [k]);\n}\n\nasync function refreshBlock(conn: SqlConnection, id: KeyDTO): Promise<void> {\n const k = keyHead(id);\n const rows = await conn.query(`SELECT \"data\" FROM \"block_index\" WHERE \"k0\" = ?`, [k]);\n if (rows[0]) await upsertQueryBlock(conn, decodeRowJson<Record<string, unknown>>(String(rows[0].data)));\n else await conn.exec(`DELETE FROM \"query_block\" WHERE \"occurrence_id\" = ?`, [k]);\n}\n\ninterface Impact {\n notes: KeyDTO[];\n segments: KeyDTO[];\n blocks: KeyDTO[];\n notesClear: boolean;\n segmentsClear: boolean;\n blocksClear: boolean;\n}\n\nconst TRACKED: Partial<Record<StoreName, 'notes' | 'segments' | 'blocks'>> = {\n notes: 'notes',\n segments: 'segments',\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/**\n * Applies ops in order, collecting projection impact per affected key, then\n * refreshes derived rows — all on the caller's transaction. Returns one entry\n * per op: the put key, or null for delete/clear. `opts.deferProjection`\n * skips the per-key refresh pass; the caller MUST rebuild derived state in\n * the same transaction afterwards (see rebuildProjections) or reads will\n * operate on stale projections behind a valid guard.\n */\nexport async function refreshDomain(\n conn: SqlConnection,\n ops: TxOp[],\n opts: { deferProjection?: boolean } = {},\n): Promise<(KeyDTO | null)[]> {\n const impact: Impact = {\n notes: [], segments: [], blocks: [],\n notesClear: false, segmentsClear: false, blocksClear: false,\n };\n const results: (KeyDTO | null)[] = [];\n for (const op of ops) {\n if (op === null || typeof op !== 'object' || Array.isArray(op)) {\n throw new StorageError(400, 'tx op must be an object');\n }\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 const key = await putRow(conn, def, op.value);\n const slot = TRACKED[def.name];\n if (slot) impact[slot].push(key);\n results.push(key);\n } else if (op.op === 'delete') {\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 clearRows(conn, def);\n if (def.name === 'notes') impact.notesClear = true;\n else if (def.name === 'segments') impact.segmentsClear = 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 put | delete | clear, got: ${String(kind)}`);\n }\n }\n if (!opts.deferProjection) 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(`UPDATE \"query_block\" SET \"parent_note_id\" = NULL`);\n }\n if (impact.segmentsClear) await conn.exec(`DELETE FROM \"segment_head\"`);\n if (impact.blocksClear) await conn.exec(`DELETE FROM \"query_block\"`);\n for (const id of impact.notes) await refreshNote(conn, id);\n for (const key of impact.segments) await refreshSegment(conn, key);\n for (const id of impact.blocks) await refreshBlock(conn, id);\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 for (const row of notes) await upsertDomainNote(conn, decodeRowJson<Record<string, unknown>>(String(row.data)));\n const segments = await conn.query(`SELECT \"k0\", \"data\" FROM \"segments\"`);\n const heads = new Map<string, { id: SqlValue; row: Record<string, unknown>; version: number }>();\n for (const row of segments) {\n const seg = decodeRowJson<Record<string, unknown>>(String(row.data));\n const v = num(seg.version) ?? 0;\n const prev = heads.get(String(row.k0));\n if (!prev || v > prev.version) heads.set(String(row.k0), { id: row.k0 as SqlValue, row: seg, version: v });\n }\n for (const head of heads.values()) await upsertSegmentHead(conn, head.id, head.row);\n const blocks = await conn.query(`SELECT \"data\" FROM \"block_index\"`);\n for (const row of blocks) await upsertQueryBlock(conn, decodeRowJson<Record<string, unknown>>(String(row.data)));\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/** 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 const textCol = blocks ? 'q.\"normalized_text\"' : 'n.\"text_search\"';\n const title = ctx.contains(textCol, p.value);\n if (plan !== 'entries') return title;\n // Entries plan: also match the note's latest ACTIVE segment text.\n const body = ctx.contains('h.\"search_text\"', p.value);\n return (\n `(${title} OR EXISTS (SELECT 1 FROM \"segment_head\" h ` +\n `JOIN \"segments\" s ON s.\"k0\" = h.\"id\" AND s.\"k1\" = h.\"current_version\" ` +\n `WHERE h.\"note_id\" = ${noteId} AND COALESCE(s.\"i_by_history_0\", 0) = 0 AND ${body}))`\n );\n }\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 unresolved static 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 = 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 // Entries: page note payloads, then batch-join segments/tags/links/pages.\n const pageSql = `SELECT \"note_id\", \"payload\" FROM ${table}${fullWhere} ORDER BY ${ordering}${paging}`;\n const noteRows = await conn.query(pageSql, allParams);\n const relations = [\n `SELECT h.\"note_id\" AS \"note_id\", s.\"data\" AS \"payload\" FROM selected n\n JOIN \"segment_head\" h ON h.\"note_id\" = n.\"note_id\"\n JOIN \"segments\" s ON s.\"k0\" = h.\"id\" AND s.\"k1\" = h.\"current_version\"\n WHERE COALESCE(s.\"i_by_history_0\", 0) = 0\n ORDER BY h.\"position\" ASC NULLS LAST, s.\"k0\"`,\n `SELECT nt.\"i_by_note_0\" AS \"note_id\", t.\"data\" AS \"payload\" FROM selected n\n JOIN \"note_tags\" nt ON nt.\"i_by_note_0\" = n.\"note_id\"\n JOIN \"tags\" t ON t.\"k0\" = nt.\"i_by_tag_0\" ORDER BY t.\"k0\"`,\n `SELECT p.\"i_by_note_0\" AS \"note_id\", p.\"data\" AS \"payload\" FROM selected n\n JOIN \"page_notes\" p ON p.\"i_by_note_0\" = n.\"note_id\" ORDER BY p.\"k0\"`,\n `SELECT DISTINCT p.\"i_by_note_0\" AS \"note_id\", pg.\"data\" AS \"payload\" FROM selected n\n JOIN \"page_notes\" p ON p.\"i_by_note_0\" = n.\"note_id\"\n JOIN \"page\" pg ON pg.\"k0\" = p.\"i_by_page_0\" ORDER BY pg.\"data\"`,\n ];\n const buckets: Array<[unknown[], unknown[], unknown[], unknown[]]> =\n noteRows.map(() => ([[], [], [], []]));\n const index = new Map<string, number>();\n noteRows.forEach((r, i) => index.set(String(r.note_id), i));\n for (const [rel, relation] of relations.entries()) {\n for (const row of await conn.query(`WITH selected AS (${pageSql}) ${relation}`, allParams)) {\n const i = index.get(String(row.note_id));\n if (i !== undefined) buckets[i][rel].push(decodeRowJson(String(row.payload)));\n }\n }\n const rows = noteRows.map((r, i) => {\n const [segments, tags, links, pages] = buckets[i];\n return { note: decodeRowJson(String(r.payload)), segments, tags, links, pages };\n });\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/** 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","/**\n * membership.ts — identity contract shared by both backends.\n *\n * The single local membership (id 'default') is the owner of every\n * user-created record: adapters stamp `userId` onto rows on write (see\n * stampUserOwned), and the by-user index in STORE_DEFS is the ownership\n * crosswalk per store. Seed rows (seedOrigin === 'seed') stay unowned —\n * they are bundled content, not user data.\n */\n\nimport type { StoreName } from './contract';\nimport type { Membership } from './entities';\n\nexport const DEFAULT_MEMBERSHIP_ID = 'default';\n\nexport function createDefaultMembership(now: number = Date.now()): Membership {\n return { id: DEFAULT_MEMBERSHIP_ID, displayName: 'Anonymous', createdAt: now };\n}\n\n/** Stores that can hold user-created rows. Excluded: the pure seed catalog\n * (field_*), meta, and memberships itself. The by-user index in STORE_DEFS\n * mirrors this list — keep in lockstep. */\nexport const USER_OWNED_STORES: readonly StoreName[] = [\n 'notes', 'page', 'page_notes', 'tags', 'tag_types', 'note_tags',\n 'segments', 'sessions', 'attachments', 'events',\n 'efforts', 'block_index', 'block_efforts',\n];\n\nconst STAMPABLE: Record<string, true> = Object.fromEntries(\n USER_OWNED_STORES.map((s) => [s, true as const])\n);\n\n/** Stamps `userId` onto a user-owned row. Seed rows pass through untouched;\n * already-stamped rows are returned as-is (no churn on re-put). Values in\n * non-user-owned stores are returned unchanged. */\nexport function stampUserOwned(store: StoreName, value: unknown, userId: string): unknown {\n if (!STAMPABLE[store]) return value;\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return value;\n const row = value as Record<string, unknown>;\n if (row.seedOrigin === 'seed') return value;\n if (row.userId === userId) return value;\n return { ...row, userId };\n}\n","/**\n * Transaction write-buffer + read-overlay helpers shared by the HTTP\n * ApiStorage and the SQL SqlStorage backends. A transaction buffers puts and\n * deletes; reads overlay the buffer on backend rows in op order, so\n * read-your-writes holds without round-tripping uncommitted data.\n */\n\nimport type { StoreName } from './contract';\nimport {\n compareKeys,\n extractKeyPart,\n keyFromValue,\n keyInRange,\n type KeyDTO,\n type RangeDTO,\n type TxOp,\n} from './wire';\nimport type { StoreDef } from './schema';\n\nexport interface BufferedPut { kind: 'put'; value: unknown }\nexport interface BufferedDelete { kind: 'delete'; key: KeyDTO }\nexport type BufferEntry = BufferedPut | BufferedDelete;\n\n// Buffer slot key: store + \\u0000 + raw JSON of the key (JSON text never\n// contains a literal \\u0000, so the separator is unambiguous).\nexport const bufferSlot = (store: StoreName, key: KeyDTO): string => `${store}\\u0000${JSON.stringify(key)}`;\n\n/** True when this tx has buffered writes (puts, deletes or a clear) for the store. */\nexport function isDirty(store: StoreName, buffer?: Map<string, BufferEntry>, cleared?: Set<StoreName>): boolean {\n if (cleared?.has(store)) return true;\n if (!buffer) return false;\n const prefix = `${store}\\u0000`;\n for (const slot of buffer.keys()) {\n if (slot.startsWith(prefix)) return true;\n }\n return false;\n}\n\n/** Point lookup against the buffer; undefined means consult the backend. */\nexport function bufferedGet<T>(store: StoreName, key: KeyDTO, buffer?: Map<string, BufferEntry>):\n | { hit: true; value: T }\n | { hit: false }\n | undefined {\n if (!buffer) return undefined;\n const entry = buffer.get(bufferSlot(store, key));\n if (!entry) return undefined;\n return entry.kind === 'put' ? { hit: true, value: entry.value as T } : { hit: false };\n}\n\n/**\n * Applies buffered puts and deletes before range filtering, ordering and\n * paging. Rows missing an index field are not in the index (IDB semantics);\n * multi-entry keys match when any entry is in range.\n */\nexport function overlayRows<T>(\n def: StoreDef,\n store: StoreName,\n buffer: Map<string, BufferEntry> | undefined,\n cleared: Set<StoreName> | undefined,\n rows: T[],\n count?: number,\n range?: RangeDTO,\n indexName?: string,\n): T[] {\n if (!buffer || !isDirty(store, buffer, cleared)) return count !== undefined ? rows.slice(0, count) : rows;\n const out = new Map<string, T>();\n if (!cleared?.has(store)) {\n // Out-map keys are raw JSON key text — same form as buffer slot suffixes.\n for (const row of rows) out.set(JSON.stringify(keyFromValue(def, row)), row);\n }\n const prefix = `${store}\\u0000`;\n for (const [slot, entry] of buffer) {\n if (!slot.startsWith(prefix)) continue;\n if (entry.kind === 'put') out.set(slot.slice(prefix.length), entry.value as T);\n else out.delete(slot.slice(prefix.length));\n }\n // Dirty reads fetch the complete candidate range: buffered deletes can\n // remove the remote head, and puts can change index membership or order.\n const index = indexName ? def.indexes.find(i => i.name === indexName) : undefined;\n if (indexName && !index) throw new Error(`unknown index '${indexName}' for ${store}`);\n const keyOf = (row: T): KeyDTO | undefined => {\n if (!index) return keyFromValue(def, row);\n const parts = index.keyPath.map(path => extractKeyPart(row, path));\n if (parts.some(part => part === undefined)) return undefined;\n const keys = parts.filter((part): part is string | number => part !== undefined);\n return keys.length === 1 ? keys[0] : keys;\n };\n const matches = (row: T): boolean => {\n if (index?.multiEntry) {\n let values: unknown = row;\n for (const part of index.keyPath[0].split('.')) {\n if (values === null || typeof values !== 'object' || !(part in values)) return false;\n values = Reflect.get(values, part);\n }\n return Array.isArray(values) && values.some(value =>\n (typeof value === 'string' || typeof value === 'number') && (!range || keyInRange(value, range)));\n }\n const key = keyOf(row);\n return key !== undefined && (!range || keyInRange(key, range));\n };\n const merged = [...out.values()].filter(matches);\n merged.sort((a, b) => {\n const primary = compareKeys(keyFromValue(def, a), keyFromValue(def, b));\n if (index?.multiEntry) return primary;\n const ak = keyOf(a), bk = keyOf(b);\n return ak !== undefined && bk !== undefined ? compareKeys(ak, bk) || primary : primary;\n });\n return count !== undefined ? merged.slice(0, count) : merged;\n}\n\n/** Drains the tx buffer into wire ops (clears first, then puts/deletes in op order). */\nexport function bufferToOps(storeNames: Iterable<StoreName>, buffer: Map<string, BufferEntry>, cleared: Set<StoreName>): TxOp[] {\n const known = new Set(storeNames);\n const ops: TxOp[] = [];\n for (const store of cleared) {\n if (known.has(store)) ops.push({ op: 'clear', store });\n }\n for (const [slot, entry] of buffer) {\n const sep = slot.indexOf('\\u0000');\n const store = slot.slice(0, sep) as StoreName;\n if (!known.has(store)) continue;\n if (entry.kind === 'put') ops.push({ op: 'put', store, value: entry.value });\n else ops.push({ op: 'delete', store, key: JSON.parse(slot.slice(sep + 1)) as KeyDTO });\n }\n return ops;\n}\n","/**\n * SqlStorage — IStorage over the shared SQL store operations (server or\n * browser). Transactions buffer writes and flush them as one refreshDomain\n * pass inside a real SQL transaction: throw → rollback, success → commit,\n * and buffered reads overlay committed rows (read-your-writes). Projections\n * refresh inside the same transaction; bulkTransaction() batches a migration\n * into one rebuild instead of per-key refreshes. verifyWritable() proves the\n * backend accepts writes with a real INSERT that is rolled back.\n *\n * BrowserTursoStorage opens a direct-to-Turso backend via @libsql/client/web;\n * the constructor only builds the client (HTTP is connectionless), `ready()`\n * initializes schema + projections and every operation awaits it, so a\n * transient init failure never wedges the backend — ready() retries.\n */\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} from './store';\nimport {\n handleDomainQuery,\n initializeDomain,\n refreshDomain,\n rebuildProjections,\n wipeDomain,\n} from './domain';\nimport { StorageError } from './errors';\nimport { libsqlDatabase, type Database, type SqlConnection } from './connection';\nimport { createClient } from '@libsql/client/web';\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, false);\n }\n\n /**\n * Bulk load for migration destinations: like transaction(), but the\n * buffered writes skip per-key projection refresh and derived state is\n * rebuilt once — everything inside one SQL transaction (throw → rollback).\n */\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, true);\n }\n\n private runTx<K extends StoreName, R>(\n stores: K[],\n mutableMode: boolean,\n fn: (tx: IStorageTransaction) => Promise<R>,\n deferProjection: boolean,\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, deferProjection ? { deferProjection: true } : {});\n // Deferred batches rebuild derived state once, inside this same tx.\n if (deferProjection) await rebuildProjections(conn);\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 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.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 delete(key: IDBValidKey | IDBKeyRange | RangeDTO): Promise<void> {\n await this.owner.ensureReady();\n this.assertMutable();\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.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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/sql/errors.ts","../../src/sql/connection.ts","../../src/sql/codec.ts","../../src/schema.ts","../../src/wire.ts","../../src/validation.ts","../../src/sql/store.ts","../../src/domain.ts","../../src/sql/domain.ts","../../src/membership.ts","../../src/overlay.ts","../../src/sql/storage.ts"],"names":["text","record","a","b","validateNoteBlocks","clauses","order","rows","params","catalogOfItem","sourceMatches","pageSql","createClient"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * StorageError — the single error type every shared SQL layer throws.\n * Replaces the API server's HTTP-specific error: `status` keeps the wire\n * mapping for the HTTP surface, `code` carries a stable machine identifier\n * (e.g. 'domain_projection_unavailable') for browser callers.\n */\nexport class StorageError extends Error {\n constructor(readonly status: number, message: string, readonly code?: string) {\n super(message);\n this.name = 'StorageError';\n }\n}\n","/**\n * Connection contracts + a generic libsql adapter. The adapter takes a\n * *structural* client so the browser passes @libsql/client/web and the server\n * passes @libsql/client (node) — this module never imports either, keeping\n * the browser graph free of native drivers.\n *\n * All operations are serialized through one promise chain: the underlying\n * client shares a single connection, so concurrent transactions/reads could\n * otherwise interleave on it. Transactions run on a transaction-owned\n * connection (libsql interactive transaction), so writes inside a transaction\n * commit or roll back atomically and are not visible outside it.\n */\n\nimport type { Client } from '@libsql/client';\n\nimport { StorageError } from './errors';\nexport type SqlValue = string | number | null; // booleans bound as 1/0 by callers\nexport type SqlRow = Record<string, unknown>;\n\nexport interface SqlStatement { sql: string; params?: SqlValue[] }\nexport interface SqlConnection {\n query(sql: string, params?: SqlValue[]): Promise<SqlRow[]>;\n exec(sql: string, params?: SqlValue[]): Promise<void>;\n batch?(statements: SqlStatement[]): Promise<SqlRow[][]>;\n}\n\nexport interface Database extends SqlConnection {\n readonly dialect: 'sqlite' | 'postgres';\n transaction<T>(fn: (tx: SqlConnection) => Promise<T>): Promise<T>;\n close(): Promise<void>;\n}\n\n/** Minimal surface used from a libsql client (node or web build) — the real\n * @libsql/client types, type-only so the browser graph stays driver-free. */\nexport type LibsqlClient = Pick<Client, 'execute' | 'transaction' | 'close'>;\n\nfunction libsqlRows(result: { rows: ArrayLike<Record<string, unknown>> }): SqlRow[] {\n return result.rows as unknown as SqlRow[];\n}\n\n/** Wrap a libsql client (node or web build) into the shared Database surface. */\nexport function libsqlDatabase(client: LibsqlClient): Database {\n let chain: Promise<unknown> = Promise.resolve();\n const serialize = <T>(fn: () => Promise<T>): Promise<T> => {\n const next = chain.then(fn, fn);\n chain = next.then(() => undefined, () => undefined);\n return next;\n };\n return {\n dialect: 'sqlite',\n query: (sql, params = []) => serialize(() => client.execute({ sql, args: params }).then(libsqlRows)),\n exec: async (sql, params = []) => {\n await serialize(() => client.execute({ sql, args: params }));\n },\n transaction<T>(fn: (tx: SqlConnection) => Promise<T>): Promise<T> {\n return serialize(async () => {\n const tx = await client.transaction('write');\n try {\n const txConn: SqlConnection = {\n query: (sql, params = []) => tx.execute({ sql, args: params }).then(libsqlRows),\n exec: async (sql, params = []) => {\n await tx.execute({ sql, args: params });\n },\n batch: async (statements) => (await tx.batch(statements.map(({ sql, params = [] }) => ({ sql, args: params })))).map(libsqlRows),\n };\n const result = await fn(txConn);\n await tx.commit();\n return result;\n } catch (err) {\n try {\n await tx.rollback();\n } catch {\n // transaction already closed by the failed statement\n }\n const message = err instanceof Error ? err.message : String(err);\n for (const code of ['revision_conflict', 'transaction_conflict', 'invalid_session_pin']) {\n if (message.includes(code)) throw new StorageError(409, message, code);\n }\n throw err;\n } finally {\n tx.close();\n }\n });\n },\n close: async () => {\n await chain;\n client.close();\n },\n };\n}\n","/**\n * Row codec for the SQL `data` column. Plain JSON.stringify destroys\n * ArrayBuffer values ({}); attachment rows carry raw blobs, so encoding tags\n * the declared binary field and decoding revives it.\n *\n * Collision safety: tagging applies ONLY to the declared binary field of the\n * declared store (attachments.data) — arbitrary rows (meta, notes, …) are\n * plain JSON in both directions, so authored {$binary:…}-shaped objects\n * anywhere else round-trip byte-for-byte. Within attachments.data the value\n * is typed `ArrayBuffer | string`; strings pass through, and only the exact\n * two-key tag revives.\n */\n\nconst TAG = '$binary';\nconst LEN = '$bytes';\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n const CHUNK = 0x8000; // String.fromCharCode.apply arg ceiling\n for (let i = 0; i < bytes.length; i += CHUNK) {\n binary += String.fromCharCode(...bytes.subarray(i, i + CHUNK));\n }\n return btoa(binary);\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length); // exact-length buffer: .buffer IS the decoded ArrayBuffer\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/** Tag shape: exactly { $binary: base64, $bytes: length }. */\nfunction reviveBinary(value: unknown): unknown {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return value;\n const keys = Object.keys(value);\n if (keys.length !== 2 || !keys.includes(TAG) || !keys.includes(LEN)) return value;\n const tag = value as Record<string, unknown>;\n if (typeof tag[TAG] !== 'string' || typeof tag[LEN] !== 'number') return value;\n const bytes = base64ToBytes(tag[TAG]);\n if (bytes.length !== tag[LEN]) {\n throw new Error(`corrupt binary cell: declared ${tag[LEN]} bytes, decoded ${bytes.length}`);\n }\n return bytes.buffer;\n}\n\n/** Serialize a row; when `binaryField` is set and holds an ArrayBuffer, it is\n * replaced by the lossless tag (shallow copy — the input row is untouched). */\nconst canonicalJson = (_key: string, value: unknown): unknown => {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return value;\n return Object.fromEntries(Object.keys(value).sort().map(key => [key, Reflect.get(value, key)]));\n};\nexport function encodeRowJson(value: unknown, binaryField?: string): string {\n if (binaryField && value !== null && typeof value === 'object' && !Array.isArray(value)) {\n const row = value as Record<string, unknown>;\n const data = row[binaryField];\n if (data instanceof ArrayBuffer) {\n const bytes = new Uint8Array(data);\n return JSON.stringify({ ...row, [binaryField]: { [TAG]: bytesToBase64(bytes), [LEN]: bytes.length } }, canonicalJson);\n }\n }\n return JSON.stringify(value, canonicalJson);\n}\n\n/** Parse a row; when `binaryField` is set, a tagged value there revives as an\n * ArrayBuffer. Every other value — including tag-shaped data in other fields\n * or stores — is returned exactly as authored. */\nexport function decodeRowJson<T = unknown>(text: string, binaryField?: string): T {\n const row = JSON.parse(text) as unknown;\n if (binaryField && row !== null && typeof row === 'object' && !Array.isArray(row)) {\n const record = row as Record<string, unknown>;\n const revived = reviveBinary(record[binaryField]);\n if (revived !== record[binaryField]) record[binaryField] = revived;\n }\n return row as T;\n}\n","/** Fresh schema shared by browser, SQL and in-memory adapters. */\n\nimport type { StoreName } from './contract';\n\n// DOMAIN_PROJECTION_VERSION lives in ./domain (re-exported by the package\n// index) — deliberately not re-exported here to avoid a star-export\n// ambiguity between ./schema and ./domain.\n\nexport const DB_VERSION = 29;\n\n/**\n * Typed field metadata — column type per extracted field path, shared with\n * the API so its SQL DDL derives DOUBLE PRECISION / INTEGER / BOOLEAN /\n * TEXT from this table instead of a hardcoded per-index allowlist.\n *\n * Extraction rule (API side): a primary-key column `k<i>` takes the type of\n * STORE_DEFS store's keyPath[i]; an index column `i_<index>_<part>` takes the\n * type of that index's keyPath[part] here. Anything absent defaults to TEXT.\n * Civil-date strings stay TEXT on purpose (page.date is 'YYYY-MM-DD');\n * instants are epoch-ms numbers (notes.date, createdAt, timestamp).\n */\nexport type StorageColumnType = 'number' | 'text' | 'boolean';\n\nexport const COLUMN_TYPES: Record<StoreName, Record<string, StorageColumnType>> = {\n notes: { date: 'number', createdAt: 'number' },\n page: { createdAt: 'number' }, // page.date is a civil 'YYYY-MM-DD' string → TEXT\n page_notes: { position: 'number', createdAt: 'number' },\n tags: { createdAt: 'number' },\n tag_types: { createdAt: 'number' },\n note_tags: {},\n block_revisions: { version: 'number', savedAt: 'number' },\n sessions: {\n blockVersion: 'number',\n startTime: 'number',\n endTime: 'number',\n duration: 'number',\n roundsCompleted: 'number',\n totalRounds: 'number',\n repsCompleted: 'number',\n completed: 'boolean',\n createdAt: 'number',\n },\n attachments: { createdAt: 'number' },\n events: {\n timestamp: 'number',\n blockVersion: 'number',\n line: 'number',\n sourceStatementId: 'number',\n stackLevel: 'number',\n 'timeSpan.started': 'number',\n 'timeSpan.ended': 'number',\n },\n field_catalog: {},\n field_sources: {},\n field_values: {},\n field_catalog_meta: {},\n efforts: { 'baseAttributes.met': 'number' },\n block_index: {\n blockVersion: 'number',\n sourceRevision: 'number',\n from: 'number',\n to: 'number',\n position: 'number',\n createdAt: 'number',\n isStatic: 'boolean',\n },\n block_efforts: { createdAt: 'number', isStatic: 'boolean' },\n meta: {},\n memberships: { createdAt: 'number' },\n};\n\nexport interface IndexDef {\n name: string;\n keyPath: string[];\n unique?: boolean;\n multiEntry?: boolean;\n}\n\nexport interface StoreDef {\n name: StoreName;\n keyPath: string[];\n indexes: IndexDef[];\n /** System stores survive wipe() (identity must not be reset with data). */\n system?: boolean;\n}\n\nexport const STORE_DEFS: StoreDef[] = [\n // 1. notes\n { name: 'notes', keyPath: ['id'], indexes: [\n { name: 'by-date', keyPath: ['date'] },\n { name: 'by-created', keyPath: ['createdAt'] },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 2. page\n { name: 'page', keyPath: ['id'], indexes: [\n { name: 'by-date', keyPath: ['date'], unique: true },\n { name: 'by-slug', keyPath: ['slug'], unique: true },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 2b. page_notes (V22)\n { name: 'page_notes', keyPath: ['id'], indexes: [\n { name: 'by-page', keyPath: ['pageId'] },\n { name: 'by-note', keyPath: ['noteId'] },\n { name: 'by-page-note', keyPath: ['pageId', 'noteId'], unique: true },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 3. tags\n { name: 'tags', keyPath: ['id'], indexes: [\n { name: 'by-label', keyPath: ['label'], unique: true },\n { name: 'by-type', keyPath: ['type'] },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 3a. tag_types (V23)\n { name: 'tag_types', keyPath: ['id'], indexes: [\n { name: 'by-name', keyPath: ['name'], unique: true },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 4. note_tags\n { name: 'note_tags', keyPath: ['id'], indexes: [\n { name: 'by-note', keyPath: ['noteId'] },\n { name: 'by-tag', keyPath: ['tagId'] },\n { name: 'by-note-tag', keyPath: ['noteId', 'tagId'], unique: true },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n { name: 'block_revisions', keyPath: ['noteId', 'blockId', 'version'], indexes: [\n { name: 'by-note', keyPath: ['noteId'] },\n { name: 'by-block', keyPath: ['noteId', 'blockId'] },\n ] },\n // 6. sessions\n { name: 'sessions', keyPath: ['id'], indexes: [\n { name: 'by-note', keyPath: ['noteId'] },\n { name: 'by-completed', keyPath: ['createdAt'] },\n { name: 'by-content', keyPath: ['blockContentId'] },\n { name: 'by-block', keyPath: ['blockId'] },\n { name: 'by-page', keyPath: ['pageId'] },\n { name: 'by-origin', keyPath: ['origin'] },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 8. attachments\n { name: 'attachments', keyPath: ['id'], indexes: [\n { name: 'by-note', keyPath: ['noteId'] },\n { name: 'by-time', keyPath: ['createdAt'] },\n { name: 'by-page', keyPath: ['pageId'] },\n { name: 'by-result', keyPath: ['resultId'] },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 9. events\n { name: 'events', keyPath: ['id'], indexes: [\n { name: 'by-timestamp', keyPath: ['timestamp'] },\n { name: 'by-result-grain', keyPath: ['resultId', 'grain'] },\n { name: 'by-content-grain', keyPath: ['blockContentId', 'grain'] },\n { name: 'by-effort', keyPath: ['effortSlug'] },\n { name: 'by-outputType', keyPath: ['outputType'] },\n { name: 'by-grain', keyPath: ['grain'] },\n { name: 'by-metric-date', keyPath: ['metricDateKeys'], multiEntry: true },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 10. field catalog\n { name: 'field_catalog', keyPath: ['id'], indexes: [\n { name: 'by-path', keyPath: ['path'] },\n ] },\n { name: 'field_sources', keyPath: ['id'], indexes: [] },\n { name: 'field_values', keyPath: ['key'], indexes: [\n { name: 'by-field', keyPath: ['fieldId'] },\n ] },\n { name: 'field_catalog_meta', keyPath: ['id'], indexes: [] },\n // 11. efforts\n { name: 'efforts', keyPath: ['slug'], indexes: [\n { name: 'by-discipline', keyPath: ['baseAttributes.discipline'] },\n { name: 'by-source', keyPath: ['registrySource'] },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 12. block_index\n { name: 'block_index', keyPath: ['id'], indexes: [\n { name: 'by-note', keyPath: ['noteId'] },\n { name: 'by-content', keyPath: ['blockContentId'] },\n { name: 'by-type', keyPath: ['dataType'] },\n { name: 'by-source', keyPath: ['sourceId'] },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 13. block_efforts\n { name: 'block_efforts', keyPath: ['id'], indexes: [\n { name: 'by-note', keyPath: ['noteId'] },\n { name: 'by-effort', keyPath: ['effortSlug'] },\n { name: 'by-block', keyPath: ['blockContentId'] },\n { name: 'by-user', keyPath: ['userId'] },\n ] },\n // 14. meta\n { name: 'meta', keyPath: ['key'], indexes: [] },\n // 15. memberships (V25, system — survives wipe; truth lives in\n // localStorage locally, in the SQL table on the API)\n { name: 'memberships', keyPath: ['id'], indexes: [], system: true },\n];\n","/**\n * Wire DTOs + key helpers shared by the storage client (ApiStorage) and the\n * API server. Keys are scalars or scalar tuples (keyPath order); ranges bound\n * them. Over HTTP, keys/ranges travel as urlencoded JSON query params.\n *\n * Range-typed helpers accept real IDBKeyRange instances AND plain RangeDTO\n * literals — non-IDB runtimes (Bun, node, tests) have no IDBKeyRange global,\n * so everything duck-types on field shape.\n */\n\nimport type { StoreName } from './contract';\nimport type { StoreDef } from './schema';\n\nexport type Scalar = string | number;\n\n/** Primary key: scalar for single-property keyPaths, tuple for compound. */\nexport type KeyDTO = Scalar | Scalar[];\n\nexport interface RangeDTO {\n only?: KeyDTO;\n /** Inclusive lower bound unless lowerOpen. Scalar or tuple (keyPath order). */\n lower?: KeyDTO;\n /** Inclusive upper bound unless upperOpen. Scalar or tuple (keyPath order). */\n upper?: KeyDTO;\n lowerOpen?: boolean;\n upperOpen?: boolean;\n}\n\nexport type TxOp =\n | { op: 'check'; store: StoreName; key: KeyDTO; value: unknown | null }\n | { op: 'put'; store: StoreName; value: unknown }\n | { op: 'delete'; store: StoreName; key: KeyDTO }\n | { op: 'clear'; store: StoreName };\n\n/** Anything shaped like a range: real IDBKeyRange or a plain RangeDTO literal. */\nexport function isRange(arg: unknown): arg is RangeDTO {\n return arg !== null && typeof arg === 'object' && !Array.isArray(arg) &&\n ('only' in arg || 'lower' in arg || 'upper' in arg || 'lowerOpen' in arg || 'upperOpen' in arg);\n}\n\n/** Reads one dotted property path ('a.b.c') off a row. */\nexport function extractKeyPart(value: unknown, dottedPath: string): Scalar | undefined {\n let cur: unknown = value;\n for (const part of dottedPath.split('.')) {\n if (cur === null || typeof cur !== 'object') return undefined;\n // Dynamic key on an untyped row: index-signature view is the only way to read it.\n const row = cur as Record<string, unknown>;\n if (!(part in row)) return undefined;\n cur = row[part];\n }\n if (cur === null || typeof cur === 'object' || cur === undefined) return undefined;\n return cur as Scalar; // string/number/boolean leaf narrowed to the wire subset\n}\n\n/** Extracts a row's primary key per the store's inline keyPath. */\nexport function keyFromValue(def: StoreDef, value: unknown): KeyDTO {\n const parts = def.keyPath.map((p) => extractKeyPart(value, p));\n for (const [i, part] of parts.entries()) {\n if (part === undefined) {\n throw new Error(`keyFromValue(${def.name}): keyPath part '${def.keyPath[i]}' missing on value`);\n }\n }\n // Loop above proved every element defined.\n const key = parts as Scalar[];\n return key.length === 1 ? key[0] : key;\n}\n\n/** Canonical url-safe string form of a key (also the buffer/tx match key). */\nexport function encodeKey(key: KeyDTO): string {\n return encodeURIComponent(JSON.stringify(key));\n}\n\n/**\n * Converts an IndexedDB query — bare key, IDBKeyRange, or an already-wire\n * RangeDTO — to its wire form. Duck-types: objects with lower/upper/\n * lowerOpen/upperOpen fields (real ranges or plain literals) pass through;\n * scalars and tuple arrays become {only}.\n */\nexport function rangeFromIDB(query?: IDBValidKey | IDBKeyRange | RangeDTO): RangeDTO | undefined {\n if (query === undefined) return undefined;\n if (!isRange(query)) {\n // Bare IDBValidKey (scalar/tuple; exotic keys like Date pass through lossy).\n const key = query as KeyDTO;\n return { only: key };\n }\n if (query.only !== undefined) return query;\n const wire: RangeDTO = {};\n if (query.lower !== undefined && query.lower !== null) {\n wire.lower = query.lower;\n wire.lowerOpen = query.lowerOpen === true;\n }\n if (query.upper !== undefined && query.upper !== null) {\n // IDB upper bound idiom [prefix, []] uses [] > strings; normalize [] to \\uffff on wire.\n wire.upper = Array.isArray(query.upper)\n ? (query.upper.map((p) => (Array.isArray(p) && p.length === 0 ? '\\uffff' : p)) as KeyDTO)\n : query.upper;\n wire.upperOpen = query.upperOpen === true;\n }\n return wire.lower !== undefined || wire.upper !== undefined ? wire : undefined;\n}\n\n/** IndexedDB key ordering: numbers < strings < tuples; tuples lexicographic. */\nexport function compareKeys(a: KeyDTO, b: KeyDTO): number {\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b)) return Array.isArray(a) ? 1 : -1;\n for (let i = 0; i < Math.min(a.length, b.length); i++) {\n const c = compareKeys(a[i], b[i]);\n if (c !== 0) return c;\n }\n return a.length - b.length;\n }\n if (typeof a === 'number' && typeof b === 'number') {\n return a < b ? -1 : a > b ? 1 : 0;\n }\n if (typeof a === 'number' || typeof b === 'number') return typeof a === 'number' ? -1 : 1;\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/** True when a key matches a wire range (IDB bound semantics). */\nexport function keyInRange(key: KeyDTO, range: RangeDTO): boolean {\n if (range.only !== undefined) return compareKeys(key, range.only) === 0;\n if (range.lower !== undefined) {\n const c = compareKeys(key, range.lower);\n if (c < 0 || (c === 0 && range.lowerOpen === true)) return false;\n }\n if (range.upper !== undefined) {\n const c = compareKeys(key, range.upper);\n if (c > 0 || (c === 0 && range.upperOpen === true)) return false;\n }\n return true;\n}\n","import { validateNoteBlocks, type BlockRevision, type Note, type Session } from '@bitcobblers/wod-wiki-core';\nimport type { StoreName } from './contract';\nimport { StorageError } from './sql/errors';\n\nexport function rowsEqual(left: unknown, right: unknown): boolean {\n if (Object.is(left, right)) return true;\n if (left instanceof ArrayBuffer && right instanceof ArrayBuffer) {\n const a = new Uint8Array(left), b = new Uint8Array(right);\n return a.length === b.length && a.every((value, i) => value === b[i]);\n }\n if (typeof left !== 'object' || left === null || typeof right !== 'object' || right === null) return false;\n if (Array.isArray(left) || Array.isArray(right)) return Array.isArray(left) && Array.isArray(right)\n && left.length === right.length && left.every((value, i) => rowsEqual(value, right[i]));\n const a = Object.keys(left).filter(key => Reflect.get(left, key) !== undefined);\n const b = Object.keys(right).filter(key => Reflect.get(right, key) !== undefined);\n return a.length === b.length && a.every(key => Object.hasOwn(right, key)\n && rowsEqual(Reflect.get(left, key), Reflect.get(right, key)));\n}\n\nfunction record(value: unknown): Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) throw new StorageError(400, 'storage row must be an object');\n return value as Record<string, unknown>;\n}\n\nexport function validateStorageRow(store: StoreName, value: unknown): void {\n if (store !== 'notes' && store !== 'block_revisions' && store !== 'sessions' && store !== 'block_index') return;\n const row = record(value);\n const positive = (field: string): boolean => typeof row[field] === 'number' && Number.isSafeInteger(row[field]) && row[field] > 0;\n const required = (field: string): boolean => typeof row[field] === 'string' && row[field].length > 0;\n if (store === 'notes') {\n if (!required('id') || typeof row.title !== 'string' || typeof row.rawContent !== 'string'\n || !positive('sourceRevision') || typeof row.createdAt !== 'number' || !Number.isFinite(row.createdAt)\n || 'segments' in row || 'segmentIds' in row\n || (row.date !== undefined && (typeof row.date !== 'number' || !Number.isFinite(row.date)))\n || (row.seedOrigin !== undefined && row.seedOrigin !== 'seed' && row.seedOrigin !== 'user')\n || (row.seedVersion !== undefined && !positive('seedVersion'))\n || (row.tags !== undefined && (!Array.isArray(row.tags) || !row.tags.every(tag => typeof tag === 'string')))\n || ['type', 'sourceId', 'sourcePath', 'catalog', 'seedChunkId'].some(field => row[field] !== undefined && typeof row[field] !== 'string')) {\n throw new StorageError(400, 'invalid whole Note', 'invalid_note_blocks');\n }\n try { validateNoteBlocks(row.rawContent, record(row.blocks) as Note['blocks'], row.sourceRevision as number); }\n catch (error) { throw new StorageError(400, error instanceof Error ? error.message : 'invalid block map', 'invalid_note_blocks'); }\n } else if (store === 'block_revisions') {\n if (!required('noteId') || !required('blockId') || !positive('version') || typeof row.rawContent !== 'string'\n || typeof row.savedAt !== 'number' || !Number.isFinite(row.savedAt)\n || !['wod', 'query', 'widget', 'embed'].includes(String(row.kind))\n || (row.kind === 'wod' ? row.dialect !== 'time' && row.dialect !== 'log' : row.dialect !== undefined || row.sport !== undefined)\n || (row.sport !== undefined && typeof row.sport !== 'string')) throw new StorageError(400, 'invalid block revision', 'invalid_note_blocks');\n try {\n validateNoteBlocks(row.rawContent as string, { [String(row.blockId)]: {\n id: String(row.blockId), kind: row.kind as BlockRevision['kind'], version: row.version as number,\n sourceRevision: 1, from: 0, to: (row.rawContent as string).length,\n ...(row.dialect === undefined ? {} : { dialect: row.dialect as 'time' | 'log' }),\n ...(row.sport === undefined ? {} : { sport: row.sport as string }),\n } }, 1);\n } catch (error) { throw new StorageError(400, error instanceof Error ? error.message : 'invalid revision source', 'invalid_note_blocks'); }\n } else if (store === 'sessions') {\n if (!required('noteId') || !required('blockId') || !positive('blockVersion')\n || ['segmentId', 'segmentVersion', 'version', 'rawContent', 'script', 'serializedScript', 'source', 'data', 'logs'].some(field => field in row)) {\n throw new StorageError(400, 'Session requires immutable block pin', 'invalid_session_pin');\n }\n } else if (!required('noteId') || !required('blockId') || !positive('blockVersion') || !positive('sourceRevision')\n || row.id !== `${row.noteId}:${row.blockId}` || !Number.isSafeInteger(row.from) || !Number.isSafeInteger(row.to)\n || 'segmentId' in row || 'segmentVersion' in row\n || !['wod', 'query', 'widget', 'embed'].includes(String(row.dataType))\n || typeof row.rawContent !== 'string' || typeof row.noteTitle !== 'string'\n || typeof row.from !== 'number' || typeof row.to !== 'number' || row.from < 0 || row.to <= row.from) {\n throw new StorageError(400, 'invalid actionable block projection', 'invalid_note_blocks');\n }\n}\n\nexport function validateNoteWrite(previous: unknown, value: unknown): void {\n if (previous === undefined || rowsEqual(previous, value)) return;\n const before = record(previous), after = record(value);\n if (typeof before.sourceRevision !== 'number' || typeof after.sourceRevision !== 'number'\n || after.sourceRevision < before.sourceRevision\n || ((!rowsEqual(before.blocks, after.blocks) || before.rawContent !== after.rawContent)\n && after.sourceRevision <= before.sourceRevision)) throw new StorageError(409, 'stale Note source revision', 'transaction_conflict');\n}\n\nexport function validateSessionWrite(previous: unknown, value: unknown): void {\n if (previous === undefined) return;\n const before = record(previous), after = record(value);\n if (before.noteId !== after.noteId || before.blockId !== after.blockId || before.blockVersion !== after.blockVersion)\n throw new StorageError(409, 'Session pin is immutable', 'invalid_session_pin');\n}\n\nexport async function validateStoredPins(\n notes: Note[], sessions: Session[], getRevisions: (keys: IDBValidKey[]) => Promise<(BlockRevision | undefined)[]>,\n): Promise<void> {\n const keys: IDBValidKey[] = [];\n for (const note of notes) for (const block of Object.values(note.blocks)) keys.push([note.id, block.id, block.version]);\n for (const session of sessions) keys.push([session.noteId, session.blockId, session.blockVersion]);\n const revisions = await getRevisions(keys);\n let i = 0;\n for (const note of notes) for (const block of Object.values(note.blocks)) {\n const revision = revisions[i++];\n if (!revision || revision.kind !== block.kind || revision.rawContent !== note.rawContent.slice(block.from, block.to)\n || revision.dialect !== block.dialect || revision.sport !== block.sport) throw new StorageError(409, 'Note block has no matching immutable revision', 'invalid_note_blocks');\n }\n for (let sessionIndex = 0; sessionIndex < sessions.length; sessionIndex++) {\n const revision = revisions[i++];\n if (!revision || revision.kind !== 'wod') throw new StorageError(409, 'Session pin must reference a saved workout revision', 'invalid_session_pin');\n }\n}\n","/**\n * Schema-driven store operations: IDB-style stores persisted into SQL tables\n * (one per store, extracted key/index columns + full JSON in `data`). The\n * schema derives entirely from STORE_DEFS / COLUMN_TYPES; JSON payloads stay\n * the source of truth. Shared by the API server and the browser\n * BrowserTursoStorage/SqlStorage backends.\n */\nimport {\n COLUMN_TYPES,\n DB_VERSION,\n STORE_DEFS,\n type IndexDef,\n type StorageColumnType,\n type StoreDef,\n} from '../schema';\nimport {\n compareKeys,\n extractKeyPart,\n isRange,\n keyInRange,\n type KeyDTO,\n type RangeDTO,\n type Scalar,\n} from '../wire';\nimport type { Database, SqlConnection, SqlRow, SqlValue } from './connection';\nimport { StorageError } from './errors';\nimport type { StoreName } from '../contract';\nimport { decodeRowJson, encodeRowJson } from './codec';\nimport { validateStorageRow } from '../validation';\n\nexport const SCHEMA_TABLE = '_wodwiki_schema';\nconst SCHEMA_KEY = 'schema';\n\n/** Stores whose rows carry a raw binary field the codec must preserve. */\nconst BINARY_FIELD: Partial<Record<StoreName, string>> = { attachments: 'data' };\n\nconst binaryFieldOf = (def: StoreDef): string | undefined => BINARY_FIELD[def.name];\n\nexport function storeDefinition(name: string): StoreDef {\n const def = STORE_DEFS.find((d) => d.name === name);\n if (!def) throw new StorageError(404, `unknown store: ${name}`);\n return def;\n}\n\nfunction indexDefinition(def: StoreDef, indexName: string): IndexDef {\n const idx = def.indexes.find((i) => i.name === indexName);\n if (!idx) throw new StorageError(404, `unknown index: ${def.name}.${indexName}`);\n return idx;\n}\n\n/** ASCII identifier chars only; everything else → '_' (safe inside quotes). */\nfunction sanitize(name: string): string {\n return name.replace(/[^A-Za-z0-9_]/g, '_');\n}\n\nconst indexCol = (indexName: string, part: number): string => `i_${sanitize(indexName)}_${part}`;\n\nfunction keyCols(def: StoreDef): string[] {\n return def.keyPath.map((_, i) => `k${i}`);\n}\n\nconst junctionTable = (def: StoreDef, idx: IndexDef): string => `${def.name}__${sanitize(idx.name)}`;\n\nconst multiEntryIndex = (def: StoreDef): IndexDef | undefined => def.indexes.find((i) => i.multiEntry);\n\nfunction pathType(def: StoreDef, path: string): StorageColumnType {\n return COLUMN_TYPES[def.name][path] ?? 'text';\n}\n\n/** SQLite store columns stay untyped (BLOB affinity) so values keep their\n * storage class and IDB ordering; PostgreSQL needs concrete types. Numbers\n * and booleans bind as float8 (booleans as 0/1), so both get DOUBLE\n * PRECISION. Text uses COLLATE \"C\" so PG ordering matches SQLite bytes. */\nfunction colSql(dialect: 'sqlite' | 'postgres', type: StorageColumnType): string {\n if (dialect === 'sqlite') return '';\n return type === 'text' ? ' TEXT COLLATE \"C\"' : ' DOUBLE PRECISION';\n}\n\n/** Runtime scalar → bound SQL value: null→NULL, bool→1/0, number/string as-is,\n * anything else → JSON text. */\nfunction toSqlScalar(v: unknown): SqlValue {\n if (v === null || v === undefined) return null;\n if (typeof v === 'boolean') return v ? 1 : 0;\n if (typeof v === 'number' || typeof v === 'string') return v;\n return JSON.stringify(v);\n}\n\nfunction validateKey(key: unknown): asserts key is KeyDTO {\n const scalar = (v: unknown): v is Scalar =>\n typeof v === 'string' || (typeof v === 'number' && Number.isFinite(v));\n if (!scalar(key) && !(Array.isArray(key) && key.length > 0 && key.every(scalar))) {\n throw new StorageError(400, 'key must be a string, finite number, or non-empty scalar tuple');\n }\n}\n\nfunction validateRange(range: RangeDTO | undefined): void {\n if (range === undefined) return;\n if (range === null || typeof range !== 'object' || Array.isArray(range)) {\n throw new StorageError(400, 'range must be an object');\n }\n for (const key of [range.only, range.lower, range.upper]) {\n if (key !== undefined) validateKey(key);\n }\n for (const open of [range.lowerOpen, range.upperOpen]) {\n if (open !== undefined && typeof open !== 'boolean') {\n throw new StorageError(400, 'range open flags must be boolean');\n }\n }\n}\n\nfunction toParts(key: KeyDTO): Scalar[] {\n validateKey(key);\n return Array.isArray(key) ? key : [key];\n}\n\n/** Reads a dotted path whose leaf must be an array (multiEntry values).\n * Shared extractKeyPart deliberately rejects array leaves, so the last hop\n * is traversed here over the parsed JSON row. */\nfunction arrayPart(value: unknown, dotted: string): unknown[] | undefined {\n let cur: unknown = value;\n for (const part of dotted.split('.')) {\n if (cur === null || typeof cur !== 'object') return undefined;\n // Traversal over parsed JSON: only plain rows are ever stored.\n const row = cur as Record<string, unknown>;\n cur = row[part];\n }\n return Array.isArray(cur) ? cur : undefined;\n}\n\n/** Primary-key extraction at the trust boundary: a missing keyPath part is\n * required-input validation → 400 (not an internal error). */\nfunction requireKey(def: StoreDef, value: unknown): KeyDTO {\n const parts = def.keyPath.map((p) => extractKeyPart(value, p));\n for (const [i, part] of parts.entries()) {\n if (part === undefined) {\n throw new StorageError(400, `keyPath part '${def.keyPath[i]}' missing on ${def.name} value`);\n }\n }\n const key = parts as Scalar[];\n return key.length === 1 ? key[0] : key;\n}\n\n/** Scalar bounds compile to the first key column; tuple bounds compile\n * part-wise when their arity fits the target columns; anything else returns\n * null → caller falls back to a scan + shared keyInRange filter. Returns the WHERE\n * clause ('' when unfiltered) and pushes bound params in order. */\nfunction rangeWhere(cols: string[], range: RangeDTO | undefined, params: SqlValue[]): string | null {\n if (!range) return '';\n if (range.only !== undefined) {\n const parts = toParts(range.only);\n if (parts.length > cols.length) return null;\n const clauses = parts.map((p, i) => {\n params.push(toSqlScalar(p));\n return `\"${cols[i]}\" = ?`;\n });\n return ` WHERE ${clauses.join(' AND ')}`;\n }\n const bounds: Array<[Scalar[], string]> = [];\n if (range.lower !== undefined && range.lower !== null) {\n bounds.push([toParts(range.lower), range.lowerOpen ? '>' : '>=']);\n }\n if (range.upper !== undefined && range.upper !== null) {\n bounds.push([toParts(range.upper), range.upperOpen ? '<' : '<=']);\n }\n const clauses: string[] = [];\n for (const [parts, op] of bounds) {\n if (parts.length > cols.length) return null;\n if (parts.length === 1) {\n params.push(toSqlScalar(parts[0]));\n clauses.push(`\"${cols[0]}\" ${op} ?`);\n } else {\n // Tuple compare: (c0,c1) >= (p0,p1) ⇔ c0 > p0 OR (c0 = p0 AND c1 >= p1)\n const ors = parts.map((p, i) => {\n const eqs: string[] = [];\n for (let j = 0; j < i; j++) {\n params.push(toSqlScalar(parts[j]));\n eqs.push(`\"${cols[j]}\" = ?`);\n }\n params.push(toSqlScalar(p));\n const cmpOp = i === parts.length - 1 ? op : op[0];\n eqs.push(`\"${cols[i]}\" ${cmpOp} ?`);\n return `(${eqs.join(' AND ')})`;\n });\n clauses.push(`(${ors.join(' OR ')})`);\n }\n }\n return clauses.length ? ` WHERE ${clauses.join(' AND ')}` : '';\n}\n\nfunction clampLimit(count: number | undefined): number | undefined {\n if (count === undefined) return undefined;\n if (typeof count !== 'number' || !Number.isFinite(count)) {\n throw new StorageError(400, `invalid count: ${String(count)}`);\n }\n return Math.max(0, Math.floor(count));\n}\n\nconst limitClause = (count: number | undefined): string =>\n count === undefined ? '' : ` LIMIT ${clampLimit(count)}`;\n\nfunction parseRows(rows: SqlRow[], binaryField?: string): unknown[] {\n return rows.map((r) => decodeRowJson(r.data as string, binaryField));\n}\n\n/** Full-table scan + in-memory IDB filtering/ordering via the shared wire\n * helpers. Only reachable for range shapes the column compile cannot express\n * (arity mismatches). Rows missing an index field are NOT in the index\n * (IDB semantics) and are skipped; a missing primary key is a 400. */\nasync function scanRows(\n conn: SqlConnection,\n def: StoreDef,\n idx: IndexDef | undefined,\n range: RangeDTO | undefined,\n limit: number | undefined,\n): Promise<unknown[]> {\n const rows = await conn.query(`SELECT \"data\" FROM \"${def.name}\"`);\n const keyed: Array<[KeyDTO, unknown]> = [];\n for (const row of rows) {\n const value = decodeRowJson(row.data as string, binaryFieldOf(def));\n if (idx) {\n const parts = idx.keyPath.map((p) => extractKeyPart(value, p));\n if (!parts.every((p): p is Scalar => p !== undefined)) continue;\n const key = parts.length === 1 ? parts[0] : parts;\n if (range && !keyInRange(key, range)) continue;\n keyed.push([key, value]);\n } else {\n const key = requireKey(def, value);\n if (range && !keyInRange(key, range)) continue;\n keyed.push([key, value]);\n }\n }\n keyed.sort((a, b) => compareKeys(a[0], b[0]));\n const out = keyed.map(([, v]) => v);\n return limit === undefined ? out : out.slice(0, limit);\n}\n\nexport async function getRow(conn: SqlConnection, def: StoreDef, key: KeyDTO): Promise<unknown | undefined> {\n const parts = toParts(key);\n if (parts.length !== def.keyPath.length) {\n throw new StorageError(400, `key arity ${parts.length} != keyPath arity ${def.keyPath.length} for ${def.name}`);\n }\n const cond = keyCols(def).map((c) => `\"${c}\" = ?`).join(' AND ');\n const rows = await conn.query(\n `SELECT \"data\" FROM \"${def.name}\" WHERE ${cond}`,\n parts.map(toSqlScalar),\n );\n return rows[0] ? decodeRowJson(rows[0].data as string, binaryFieldOf(def)) : undefined;\n}\n\nexport async function getRows(conn: SqlConnection, def: StoreDef, keys: KeyDTO[]): Promise<(unknown | undefined)[]> {\n const found = new Map<string, unknown>();\n for (const part of chunks(keys, 500)) {\n const params: SqlValue[] = [];\n const conditions = part.map(key => {\n const parts = toParts(key);\n if (parts.length !== def.keyPath.length) throw new StorageError(400, 'invalid compound key arity');\n params.push(...parts.map(toSqlScalar));\n return `(${keyCols(def).map(col => `\"${col}\" = ?`).join(' AND ')})`;\n });\n for (const row of await conn.query(`SELECT \"data\" FROM \"${def.name}\" WHERE ${conditions.join(' OR ')}`, params)) {\n const value = decodeRowJson(String(row.data), binaryFieldOf(def));\n found.set(JSON.stringify(requireKey(def, value)), value);\n }\n }\n return keys.map(key => found.get(JSON.stringify(key)));\n}\n\nexport async function listRowsFromIndexMany(conn: SqlConnection, def: StoreDef, indexName: string, keys: KeyDTO[]): Promise<unknown[][]> {\n const idx = indexDefinition(def, indexName);\n if (idx.multiEntry) {\n const out: unknown[][] = [];\n for (const key of keys) out.push(await listRows(conn, def, { only: key }, undefined, indexName));\n return out;\n }\n const found = new Map<string, unknown[]>();\n for (const part of chunks(keys, 500)) {\n const params: SqlValue[] = [];\n const conditions = part.map(key => {\n const parts = toParts(key);\n if (parts.length !== idx.keyPath.length) throw new StorageError(400, 'invalid index key arity');\n params.push(...parts.map(toSqlScalar));\n return `(${parts.map((_, i) => `\"${indexCol(idx.name, i)}\" = ?`).join(' AND ')})`;\n });\n for (const row of await conn.query(`SELECT \"data\" FROM \"${def.name}\" WHERE ${conditions.join(' OR ')} ORDER BY ${keyCols(def).map(col => `\"${col}\"`).join(', ')}`, params)) {\n const value = decodeRowJson(String(row.data), binaryFieldOf(def));\n const parts = idx.keyPath.map(path => extractKeyPart(value, path));\n const key = JSON.stringify(parts.length === 1 ? parts[0] : parts);\n const bucket = found.get(key);\n if (bucket) bucket.push(value); else found.set(key, [value]);\n }\n }\n return keys.map(key => found.get(JSON.stringify(key)) ?? []);\n}\n\nexport async function listRows(\n conn: SqlConnection,\n def: StoreDef,\n range?: RangeDTO,\n count?: number,\n indexName?: string,\n): Promise<unknown[]> {\n validateRange(range);\n const idx = indexName ? indexDefinition(def, indexName) : undefined;\n const binaryField = binaryFieldOf(def);\n if (idx?.multiEntry) {\n // JSON encoding preserves numeric/string equality in both SQL dialects.\n const only = range?.only;\n if (only === undefined || typeof only === 'object') {\n throw new StorageError(400, `multi-entry index ${def.name}.${idx.name} supports exact-match queries only`);\n }\n const joinOn = keyCols(def).map((c) => `j.\"${c}\" = e.\"${c}\"`).join(' AND ');\n // IDB multi-entry ordering: junction value first, then the primary key.\n const order = ['j.\"v\"', ...keyCols(def).map((c) => `j.\"${c}\"`)].join(', ');\n const rows = await conn.query(\n `SELECT e.\"data\" AS \"data\" FROM \"${def.name}\" e JOIN \"${junctionTable(def, idx)}\" j ON ${joinOn}` +\n ` WHERE j.\"v\" = ? ORDER BY ${order}${limitClause(count)}`,\n [JSON.stringify(only)],\n );\n return parseRows(rows, binaryField);\n }\n const cols = idx ? idx.keyPath.map((_, part) => indexCol(idx.name, part)) : keyCols(def);\n const params: SqlValue[] = [];\n const where = rangeWhere(cols, range, params);\n if (where === null) return scanRows(conn, def, idx, range, clampLimit(count));\n // IDB: rows whose index key is missing/invalid are not in the index —\n // exclude them even from unfiltered listings (SQL NULL comparison alone\n // only drops them from bounded ranges). NULLS never reach ORDER BY.\n const notNull = cols.map((c) => `\"${c}\" IS NOT NULL`).join(' AND ');\n const cond = where ? `${where} AND ${notNull}` : ` WHERE ${notNull}`;\n // IDB orders index results by (index key, primary key).\n const keyNames = keyCols(def).filter((k) => !cols.includes(k));\n const order = ` ORDER BY ${[...cols, ...keyNames].map((c) => `\"${c}\"`).join(', ')}`;\n const rows = await conn.query(\n `SELECT \"data\" FROM \"${def.name}\"${cond}${order}${limitClause(count)}`,\n params,\n );\n return parseRows(rows, binaryField);\n}\n\nexport async function countRows(\n conn: SqlConnection,\n def: StoreDef,\n range?: RangeDTO,\n indexName?: string,\n): Promise<number> {\n validateRange(range);\n const idx = indexName ? indexDefinition(def, indexName) : undefined;\n if (idx?.multiEntry) {\n const only = range?.only;\n if (only === undefined || typeof only === 'object') {\n throw new StorageError(400, `multi-entry index ${def.name}.${idx.name} supports exact-match queries only`);\n }\n const joinOn = keyCols(def).map((c) => `j.\"${c}\" = e.\"${c}\"`).join(' AND ');\n const rows = await conn.query(\n `SELECT COUNT(*) AS \"n\" FROM \"${def.name}\" e JOIN \"${junctionTable(def, idx)}\" j ON ${joinOn} WHERE j.\"v\" = ?`,\n [JSON.stringify(only)],\n );\n return Number(rows[0]?.n ?? 0);\n }\n const cols = idx ? idx.keyPath.map((_, part) => indexCol(idx.name, part)) : keyCols(def);\n const params: SqlValue[] = [];\n const where = rangeWhere(cols, range, params);\n if (where === null) {\n const all = await scanRows(conn, def, idx, range, undefined);\n return all.length;\n }\n const cond = idx ? (where ? `${where} AND ${cols.map((c) => `\"${c}\" IS NOT NULL`).join(' AND ')}` : ` WHERE ${cols.map((c) => `\"${c}\" IS NOT NULL`).join(' AND ')}`) : where;\n const rows = await conn.query(`SELECT COUNT(*) AS \"n\" FROM \"${def.name}\"${cond}`, params);\n return Number(rows[0]?.n ?? 0);\n}\n\n/** Bound-parameter budget per statement. SQLite ≥3.32 allows 32766; 20k\n * leaves headroom, and the row cap keeps single request bodies ≤ ~1 MB. */\nconst PARAM_BUDGET = 20000;\nconst ROW_CAP = 100;\n\nconst chunks = <T>(arr: T[], size: number): T[][] => {\n const out: T[][] = [];\n for (let i = 0; i < arr.length; i += size) out.push(arr.slice(i, i + size));\n return out;\n};\n\n/** Multi-row `INSERT … ON CONFLICT` in param-budgeted chunks. One round trip\n * per chunk over Turso instead of one per row. `cols` are internal schema\n * identifiers (never user input); `onConflict` is the full trailing clause. */\nexport async function batchInsert(\n conn: SqlConnection,\n table: string,\n cols: string[],\n rows: SqlValue[][],\n onConflict: string,\n): Promise<void> {\n if (rows.length === 0) return;\n const collist = cols.map((c) => `\"${c}\"`).join(', ');\n const tuple = `(${cols.map(() => '?').join(', ')})`;\n const per = Math.max(1, Math.min(ROW_CAP, Math.floor(PARAM_BUDGET / cols.length)));\n const statements = chunks(rows, per).map(part => ({\n sql: `INSERT INTO \"${table}\" (${collist}) VALUES ${part.map(() => tuple).join(', ')} ${onConflict}`,\n params: part.flat(),\n }));\n if (conn.batch) await conn.batch(statements);\n else for (const statement of statements) await conn.exec(statement.sql, statement.params);\n}\n\n/** Chunked `DELETE … WHERE col IN (…)` — one round trip per chunk. */\nexport async function deleteIn(conn: SqlConnection, table: string, col: string, vals: SqlValue[]): Promise<void> {\n for (const part of chunks(vals, 500)) {\n if (part.length === 0) continue;\n await conn.exec(`DELETE FROM \"${table}\" WHERE \"${col}\" IN (${part.map(() => '?').join(', ')})`, part);\n }\n}\n\nexport async function putRows(conn: SqlConnection, def: StoreDef, values: unknown[], changedKeys?: KeyDTO[]): Promise<KeyDTO[]> {\n if (values.length === 0) return [];\n for (const value of values) validateStorageRow(def.name, value);\n const keys = keyCols(def);\n const cols = [...keys];\n for (const idx of def.indexes) {\n if (idx.multiEntry) continue;\n idx.keyPath.forEach((_, part) => cols.push(indexCol(idx.name, part)));\n }\n cols.push('data');\n const keySet = new Set(keys);\n const updates = cols.filter((c) => !keySet.has(c)).map((c) => `\"${c}\" = excluded.\"${c}\"`).join(', ');\n const pk = keys.map((k) => `\"${k}\"`).join(', ');\n\n const rows: SqlValue[][] = [];\n const out: KeyDTO[] = [];\n const junction: SqlValue[][] = [];\n const multi = multiEntryIndex(def);\n for (const value of values) {\n const k = requireKey(def, value);\n const keyParts = toParts(k).map(toSqlScalar);\n const vals = [...keyParts];\n for (const idx of def.indexes) {\n if (idx.multiEntry) continue;\n idx.keyPath.forEach((path) => vals.push(toSqlScalar(extractKeyPart(value, path) ?? null)));\n }\n vals.push(encodeRowJson(value, binaryFieldOf(def)));\n rows.push(vals);\n out.push(k);\n if (multi) {\n const items = arrayPart(value, multi.keyPath[0]);\n if (Array.isArray(items)) {\n for (const item of items) junction.push([...keyParts, JSON.stringify(item)]);\n }\n }\n }\n const tuple = `(${cols.map(() => '?').join(', ')})`;\n const per = Math.max(1, Math.min(ROW_CAP, Math.floor(PARAM_BUDGET / cols.length)));\n const statements = chunks(rows, per).map(part => ({\n sql: `INSERT INTO \"${def.name}\" (${cols.map(col => `\"${col}\"`).join(', ')}) VALUES ${part.map(() => tuple).join(', ')} `\n + (def.name === 'block_revisions' ? `ON CONFLICT (${pk}) DO NOTHING` : `ON CONFLICT (${pk}) DO UPDATE SET ${updates} WHERE \"${def.name}\".\"data\" <> excluded.\"data\"`)\n + ` RETURNING ${keys.map(col => `\"${col}\"`).join(', ')}`,\n params: part.flat(),\n }));\n let returned: SqlRow[][];\n try {\n if (conn.batch) returned = await conn.batch(statements);\n else {\n returned = [];\n for (const statement of statements) returned.push(await conn.query(statement.sql, statement.params));\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n for (const code of ['revision_conflict', 'transaction_conflict', 'invalid_session_pin']) {\n if (message.includes(code)) throw new StorageError(409, message, code);\n }\n throw error;\n }\n const changed = returned.flat().map(row => {\n const parts = keys.map(col => row[col]) as Scalar[];\n return parts.length === 1 ? parts[0] : parts;\n });\n changedKeys?.push(...changed);\n if (multi) {\n const jt = junctionTable(def, multi);\n const changedSet = new Set(changed.map(key => JSON.stringify(key)));\n const deletes = values.flatMap(value => {\n const key = requireKey(def, value);\n if (!changedSet.has(JSON.stringify(key))) return [];\n const items = arrayPart(value, multi.keyPath[0]) ?? [];\n return [{ sql: `DELETE FROM \"${jt}\" WHERE ${keys.map(col => `\"${col}\" = ?`).join(' AND ')}`\n + (items.length ? ` AND \"v\" NOT IN (${items.map(() => '?').join(', ')})` : ''),\n params: [...toParts(key).map(toSqlScalar), ...items.map(item => JSON.stringify(item))] }];\n });\n if (conn.batch && deletes.length) await conn.batch(deletes);\n else for (const statement of deletes) await conn.exec(statement.sql, statement.params);\n await batchInsert(conn, jt, [...keys, 'v'], junction.filter(row => changedSet.has(JSON.stringify(keys.length === 1 ? row[0] : row.slice(0, keys.length)))), 'ON CONFLICT DO NOTHING');\n }\n return out;\n}\n\nexport async function putRow(conn: SqlConnection, def: StoreDef, value: unknown): Promise<KeyDTO> {\n return (await putRows(conn, def, [value]))[0];\n}\n\nexport async function deleteRows(conn: SqlConnection, def: StoreDef, keyOrRange: KeyDTO | RangeDTO): Promise<void> {\n if (def.name === 'block_revisions') throw new StorageError(409, 'block history may only be removed by explicit wipe', 'revision_conflict');\n const multi = multiEntryIndex(def);\n if (!isRange(keyOrRange)) {\n const parts = toParts(keyOrRange);\n if (parts.length > def.keyPath.length) {\n throw new StorageError(400, `key arity ${parts.length} > keyPath arity ${def.keyPath.length} for ${def.name}`);\n }\n const n = Math.min(parts.length, def.keyPath.length);\n const cond = keyCols(def).slice(0, n).map((c) => `\"${c}\" = ?`).join(' AND ');\n const params = parts.slice(0, n).map(toSqlScalar);\n if (multi) await conn.exec(`DELETE FROM \"${junctionTable(def, multi)}\" WHERE ${cond}`, params);\n await conn.exec(`DELETE FROM \"${def.name}\" WHERE ${cond}`, params);\n return;\n }\n validateRange(keyOrRange);\n const cols = keyCols(def);\n const params: SqlValue[] = [];\n const where = rangeWhere(cols, keyOrRange, params);\n if (where === null) {\n // Uncompilable shape: enumerate matching rows, delete per key.\n for (const row of await listRows(conn, def, keyOrRange)) {\n await deleteRows(conn, def, requireKey(def, row));\n }\n return;\n }\n const collist = cols.map((c) => `\"${c}\"`).join(', ');\n if (multi) {\n await conn.exec(\n `DELETE FROM \"${junctionTable(def, multi)}\" WHERE (${collist}) IN (SELECT ${collist} FROM \"${def.name}\"${where})`,\n params,\n );\n }\n await conn.exec(`DELETE FROM \"${def.name}\"${where}`, params);\n}\n\nexport async function clearRows(conn: SqlConnection, def: StoreDef, wipe = false): Promise<void> {\n if (def.name === 'block_revisions' && !wipe) throw new StorageError(409, 'block history may only be removed by explicit wipe', 'revision_conflict');\n const multi = multiEntryIndex(def);\n if (multi) await conn.exec(`DELETE FROM \"${junctionTable(def, multi)}\"`);\n await conn.exec(`DELETE FROM \"${def.name}\"`);\n}\n\n/** Wipe all user stores; system stores (memberships) survive and the internal\n * schema metadata table is not a store, so the version guard is untouched. */\nexport async function wipeRows(conn: SqlConnection): Promise<void> {\n for (const def of STORE_DEFS) {\n if (!def.system) await clearRows(conn, def, true);\n }\n}\n\nfunction tableListSql(dialect: 'sqlite' | 'postgres'): string {\n return dialect === 'sqlite'\n ? `SELECT \"name\" FROM \"sqlite_master\" WHERE \"type\" = 'table'`\n : `SELECT \"table_name\" FROM \"information_schema\".\"tables\" WHERE \"table_schema\" = current_schema()`;\n}\n\n/** Create the current schema only. Existing incompatible versions fail closed. */\nasync function ensureStoreTables(\n conn: SqlConnection,\n dialect: 'sqlite' | 'postgres',\n def: StoreDef,\n): Promise<void> {\n const keys = keyCols(def);\n const cols: Array<[string, string]> = keys.map((k, i) => [k, colSql(dialect, pathType(def, def.keyPath[i]))]);\n for (const idx of def.indexes) {\n if (idx.multiEntry) continue;\n idx.keyPath.forEach((path, part) => {\n cols.push([indexCol(idx.name, part), colSql(dialect, pathType(def, path))]);\n });\n }\n cols.push(['data', ' TEXT NOT NULL']);\n const colDefs = cols.map(([c, t]) => `\"${c}\"${t}`);\n await conn.exec(\n `CREATE TABLE IF NOT EXISTS \"${def.name}\" (${colDefs.join(', ')}, PRIMARY KEY (${keys.map((k) => `\"${k}\"`).join(', ')}))`,\n );\n for (const idx of def.indexes) {\n if (idx.multiEntry) continue;\n const parts = idx.keyPath.map((_, part) => `\"${indexCol(idx.name, part)}\"`).join(', ');\n await conn.exec(\n `CREATE ${idx.unique ? 'UNIQUE ' : ''}INDEX IF NOT EXISTS \"${def.name}__${sanitize(idx.name)}\" ON \"${def.name}\" (${parts})`,\n );\n }\n const multi = multiEntryIndex(def);\n if (multi) {\n const jt = junctionTable(def, multi);\n const jkeys = keys.map((k, i) => `\"${k}\"${colSql(dialect, pathType(def, def.keyPath[i]))}`);\n // v: BLOB affinity on sqlite (storage class preserved), byte-order C on PG.\n await conn.exec(\n `CREATE TABLE IF NOT EXISTS \"${jt}\" (${jkeys.join(', ')}, \"v\"${colSql(dialect, 'text')}, PRIMARY KEY (${[...keys, '\"v\"'].join(', ')}))`,\n );\n await conn.exec(`CREATE INDEX IF NOT EXISTS \"${jt}__v\" ON \"${jt}\" (\"v\")`);\n }\n if (def.name === 'notes' && dialect === 'sqlite') {\n await conn.exec(`CREATE TRIGGER IF NOT EXISTS \"notes_revision_guard\" BEFORE UPDATE ON \"notes\"\n WHEN json_extract(NEW.\"data\", '$.sourceRevision') < json_extract(OLD.\"data\", '$.sourceRevision')\n OR ((json_extract(NEW.\"data\", '$.rawContent') IS NOT json_extract(OLD.\"data\", '$.rawContent')\n OR json_extract(NEW.\"data\", '$.blocks') IS NOT json_extract(OLD.\"data\", '$.blocks'))\n AND json_extract(NEW.\"data\", '$.sourceRevision') <= json_extract(OLD.\"data\", '$.sourceRevision'))\n BEGIN SELECT RAISE(ABORT, 'transaction_conflict: stale Note source revision'); END`);\n }\n if (def.name === 'block_revisions' && dialect === 'sqlite') {\n await conn.exec(`CREATE TRIGGER IF NOT EXISTS \"block_revision_guard\" BEFORE INSERT ON \"block_revisions\"\n WHEN EXISTS (SELECT 1 FROM \"block_revisions\" old WHERE old.\"k0\" = NEW.\"k0\" AND old.\"k1\" = NEW.\"k1\" AND old.\"k2\" = NEW.\"k2\" AND old.\"data\" <> NEW.\"data\")\n BEGIN SELECT RAISE(ABORT, 'revision_conflict: immutable block revision collision'); END`);\n }\n if (def.name === 'sessions' && dialect === 'sqlite') {\n await conn.exec(`CREATE TRIGGER IF NOT EXISTS \"session_pin_guard\" BEFORE UPDATE ON \"sessions\"\n WHEN json_extract(NEW.\"data\", '$.noteId') IS NOT json_extract(OLD.\"data\", '$.noteId')\n OR json_extract(NEW.\"data\", '$.blockId') IS NOT json_extract(OLD.\"data\", '$.blockId')\n OR json_extract(NEW.\"data\", '$.blockVersion') IS NOT json_extract(OLD.\"data\", '$.blockVersion')\n BEGIN SELECT RAISE(ABORT, 'invalid_session_pin: Session pin is immutable'); END`);\n }\n if (dialect === 'postgres' && ['notes', 'block_revisions', 'sessions'].includes(def.name)) {\n const condition = def.name === 'block_revisions'\n ? `EXISTS (SELECT 1 FROM \"block_revisions\" old WHERE old.\"k0\" = NEW.\"k0\" AND old.\"k1\" = NEW.\"k1\" AND old.\"k2\" = NEW.\"k2\" AND old.\"data\" <> NEW.\"data\")`\n : def.name === 'notes'\n ? `(NEW.\"data\"::jsonb->>'sourceRevision')::bigint < (OLD.\"data\"::jsonb->>'sourceRevision')::bigint OR ((NEW.\"data\"::jsonb->'rawContent' IS DISTINCT FROM OLD.\"data\"::jsonb->'rawContent' OR NEW.\"data\"::jsonb->'blocks' IS DISTINCT FROM OLD.\"data\"::jsonb->'blocks') AND (NEW.\"data\"::jsonb->>'sourceRevision')::bigint <= (OLD.\"data\"::jsonb->>'sourceRevision')::bigint)`\n : `NEW.\"data\"::jsonb->'noteId' IS DISTINCT FROM OLD.\"data\"::jsonb->'noteId' OR NEW.\"data\"::jsonb->'blockId' IS DISTINCT FROM OLD.\"data\"::jsonb->'blockId' OR NEW.\"data\"::jsonb->'blockVersion' IS DISTINCT FROM OLD.\"data\"::jsonb->'blockVersion'`;\n const code = def.name === 'block_revisions' ? 'revision_conflict' : def.name === 'notes' ? 'transaction_conflict' : 'invalid_session_pin';\n const guard = `${def.name}_guard`;\n await conn.exec(`CREATE OR REPLACE FUNCTION \"${guard}\"() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN IF ${condition} THEN RAISE EXCEPTION '${code}'; END IF; RETURN NEW; END; $$`);\n await conn.exec(`DROP TRIGGER IF EXISTS \"${guard}\" ON \"${def.name}\"`);\n await conn.exec(`CREATE TRIGGER \"${guard}\" BEFORE ${def.name === 'block_revisions' ? 'INSERT' : 'UPDATE'} ON \"${def.name}\" FOR EACH ROW EXECUTE FUNCTION \"${guard}\"()`);\n }\n}\n\n/** Internal schema metadata is not exposed or cleared by the store API. */\nexport async function initializeStore(db: Database): Promise<void> {\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 storeTables = new Set<string>(STORE_DEFS.map((d) => d.name));\n const tableNames = new Set(\n (await tx.query(tableListSql(db.dialect))).map((r) => String(Object.values(r)[0])),\n );\n const guardRows = await tx.query(`SELECT \"value\" FROM \"${SCHEMA_TABLE}\" WHERE \"key\" = ?`, [SCHEMA_KEY]);\n let stored: number | undefined;\n if (guardRows[0]) {\n const guard = JSON.parse(String(guardRows[0].value)) as { version?: unknown };\n if (typeof guard.version !== 'number') {\n throw new StorageError(500, `corrupt ${SCHEMA_TABLE} guard row`, 'bad_schema_guard');\n }\n stored = guard.version;\n if (stored !== DB_VERSION) {\n throw new StorageError(\n 500,\n `database schema v${stored} is incompatible with v${DB_VERSION}; recreation required using an explicitly disposable database`,\n 'schema_incompatible',\n );\n }\n } else if ([...tableNames].some((name) => storeTables.has(name))) {\n throw new StorageError(\n 500,\n 'database contains store tables but no wod-wiki schema guard; refusing to adopt a foreign database — point SQLITE_PATH/DATABASE_URL at a fresh database',\n 'foreign_database',\n );\n }\n for (const def of STORE_DEFS) await ensureStoreTables(tx, db.dialect, def);\n if (stored !== DB_VERSION) {\n await tx.exec(\n `INSERT INTO \"${SCHEMA_TABLE}\" (\"key\", \"value\") VALUES (?, ?) ON CONFLICT (\"key\") DO UPDATE SET \"value\" = excluded.\"value\"`,\n [SCHEMA_KEY, JSON.stringify({ version: DB_VERSION })],\n );\n }\n });\n}\n","import type { BlockIndexRow, Note, Page, PageNote, Tag } from './entities';\nimport { validateNoteBlocks } from '@bitcobblers/wod-wiki-core';\n\nexport const DOMAIN_PROJECTION_VERSION = 2;\n\nexport type DomainPredicate =\n | { field: 'id' | 'noteId' | 'type' | 'catalog' | 'source' | 'tags' | 'effort'; values: string[]; negate?: boolean }\n | { field: 'text'; value: string }\n | { field: 'date'; start: number; end: number; endExclusive?: boolean }\n | { field: 'page'; value: boolean }\n | { field: 'defaultNotes'; feeds: boolean }\n | { field: 'sourceFence' };\n\nexport type DomainOrder = {\n field: 'id' | 'createdAt' | 'date' | 'title' | 'noteTitle' | 'dataType' | 'position';\n direction: 'asc' | 'desc';\n};\n\nexport type DomainQuery = {\n plan: 'notes' | 'blocks' | 'entries';\n selection?: DomainPredicate[];\n filters?: DomainPredicate[];\n order?: DomainOrder[];\n offset?: number;\n limit?: number;\n};\n\nexport interface DomainEntry {\n note: Note;\n tags: Tag[];\n links: PageNote[];\n pages: Page[];\n}\n\nexport type DomainQueryResult = {\n projectionVersion: typeof DOMAIN_PROJECTION_VERSION;\n selectedCount: number;\n matchedCount: number;\n} & (\n | { plan: 'notes'; rows: Note[] }\n | { plan: 'blocks'; rows: BlockIndexRow[] }\n | { plan: 'entries'; rows: DomainEntry[] }\n);\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction optionalStrings(row: Record<string, unknown>, fields: string[]): boolean {\n return fields.every(field => row[field] === undefined || typeof row[field] === 'string');\n}\n\nfunction finiteNumbers(row: Record<string, unknown>, fields: string[]): boolean {\n return fields.every(field => typeof row[field] === 'number' && Number.isFinite(row[field]));\n}\n\nfunction isNote(value: unknown): value is Note {\n if (!isObject(value) || typeof value.id !== 'string' || typeof value.title !== 'string'\n || typeof value.rawContent !== 'string' || !Number.isSafeInteger(value.sourceRevision)\n || typeof value.sourceRevision !== 'number' || value.sourceRevision < 1 || !isObject(value.blocks)\n || !finiteNumbers(value, ['createdAt'])\n || (value.date !== undefined && !finiteNumbers(value, ['date']))\n || !optionalStrings(value, ['type', 'sourceId', 'catalog', 'sourcePath', 'seedOrigin', 'seedChunkId'])\n || (value.tags !== undefined && (!Array.isArray(value.tags) || !value.tags.every(tag => typeof tag === 'string')))) return false;\n try {\n validateNoteBlocks(value.rawContent, value.blocks as Note['blocks'], value.sourceRevision);\n return true;\n } catch { return false; }\n}\n\nfunction isBlock(value: unknown): value is BlockIndexRow {\n return isObject(value) && typeof value.id === 'string' && typeof value.noteId === 'string'\n && typeof value.blockId === 'string' && finiteNumbers(value, ['blockVersion', 'sourceRevision', 'from', 'to', 'createdAt'])\n && value.id === `${value.noteId}:${value.blockId}`\n && typeof value.blockVersion === 'number' && Number.isSafeInteger(value.blockVersion) && value.blockVersion > 0\n && typeof value.sourceRevision === 'number' && Number.isSafeInteger(value.sourceRevision) && value.sourceRevision > 0\n && typeof value.from === 'number' && Number.isSafeInteger(value.from) && value.from >= 0\n && typeof value.to === 'number' && Number.isSafeInteger(value.to) && value.to > value.from\n && ['wod', 'query', 'widget', 'embed'].includes(String(value.dataType)) && typeof value.rawContent === 'string'\n && typeof value.noteTitle === 'string'\n && optionalStrings(value, ['blockContentId', 'sourceId', 'sourcePath', 'routeId'])\n && (value.position === undefined || finiteNumbers(value, ['position']))\n && (value.isStatic === undefined || typeof value.isStatic === 'boolean');\n}\n\n\nfunction isTag(value: unknown): value is Tag {\n return isObject(value) && typeof value.id === 'string' && typeof value.label === 'string'\n && finiteNumbers(value, ['createdAt']) && optionalStrings(value, ['type']);\n}\n\nfunction isPage(value: unknown): value is Page {\n return isObject(value) && typeof value.id === 'string' && finiteNumbers(value, ['createdAt'])\n && optionalStrings(value, ['date', 'slug', 'title']);\n}\n\nfunction isLink(value: unknown): value is PageNote {\n return isObject(value) && typeof value.id === 'string' && typeof value.noteId === 'string'\n && typeof value.pageId === 'string' && finiteNumbers(value, ['createdAt'])\n && (value.position === undefined || finiteNumbers(value, ['position']));\n}\n\nfunction isEntry(value: unknown): value is DomainEntry {\n return isObject(value) && isNote(value.note)\n && Array.isArray(value.tags) && value.tags.every(isTag)\n && Array.isArray(value.links) && value.links.every(isLink)\n && Array.isArray(value.pages) && value.pages.every(isPage);\n}\n\nexport function parseDomainQueryResult(value: unknown, plan: DomainQuery['plan']): DomainQueryResult {\n if (!isObject(value) || value.projectionVersion !== DOMAIN_PROJECTION_VERSION\n || value.plan !== plan || !Array.isArray(value.rows)\n || typeof value.selectedCount !== 'number' || !Number.isSafeInteger(value.selectedCount) || value.selectedCount < 0\n || typeof value.matchedCount !== 'number' || !Number.isSafeInteger(value.matchedCount) || value.matchedCount < 0\n || value.matchedCount > value.selectedCount || value.rows.length > value.matchedCount) {\n throw new Error('ApiStorage: invalid or stale domain projection response');\n }\n const counts = { projectionVersion: DOMAIN_PROJECTION_VERSION, selectedCount: value.selectedCount, matchedCount: value.matchedCount } as const;\n switch (plan) {\n case 'notes':\n if (value.rows.every(isNote)) return { ...counts, plan, rows: value.rows };\n break;\n case 'blocks':\n if (value.rows.every(isBlock)) return { ...counts, plan, rows: value.rows };\n break;\n case 'entries':\n if (value.rows.every(isEntry)) return { ...counts, plan, rows: value.rows };\n break;\n }\n throw new Error('ApiStorage: invalid domain query rows');\n}\n","/** 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 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'] 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 = (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 => `\"${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_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_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/** 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","/**\n * membership.ts — identity contract shared by both backends.\n *\n * The single local membership (id 'default') is the owner of every\n * user-created record: adapters stamp `userId` onto rows on write (see\n * stampUserOwned), and the by-user index in STORE_DEFS is the ownership\n * crosswalk per store. Seed rows (seedOrigin === 'seed') stay unowned —\n * they are bundled content, not user data.\n */\n\nimport type { StoreName } from './contract';\nimport type { Membership } from './entities';\n\nexport const DEFAULT_MEMBERSHIP_ID = 'default';\n\nexport function createDefaultMembership(now: number = Date.now()): Membership {\n return { id: DEFAULT_MEMBERSHIP_ID, displayName: 'Anonymous', createdAt: now };\n}\n\n/** Stores that can hold user-created rows. Excluded: the pure seed catalog\n * (field_*), meta, and memberships itself. The by-user index in STORE_DEFS\n * mirrors this list — keep in lockstep. */\nexport const USER_OWNED_STORES: readonly StoreName[] = [\n 'notes', 'page', 'page_notes', 'tags', 'tag_types', 'note_tags',\n 'sessions', 'attachments', 'events',\n 'efforts', 'block_index', 'block_efforts',\n];\n\nconst STAMPABLE: Record<string, true> = Object.fromEntries(\n USER_OWNED_STORES.map((s) => [s, true as const])\n);\n\n/** Stamps `userId` onto a user-owned row. Seed rows pass through untouched;\n * already-stamped rows are returned as-is (no churn on re-put). Values in\n * non-user-owned stores are returned unchanged. */\nexport function stampUserOwned(store: StoreName, value: unknown, userId: string): unknown {\n if (!STAMPABLE[store]) return value;\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return value;\n const row = value as Record<string, unknown>;\n if (row.seedOrigin === 'seed') return value;\n if (row.userId === userId) return value;\n return { ...row, userId };\n}\n","/**\n * Transaction write-buffer + read-overlay helpers shared by the HTTP\n * ApiStorage and the SQL SqlStorage backends. A transaction buffers puts and\n * deletes; reads overlay the buffer on backend rows in op order, so\n * read-your-writes holds without round-tripping uncommitted data.\n */\n\nimport type { StoreName } from './contract';\nimport {\n compareKeys,\n extractKeyPart,\n keyFromValue,\n keyInRange,\n type KeyDTO,\n type RangeDTO,\n type TxOp,\n} from './wire';\nimport type { StoreDef } from './schema';\n\nexport interface BufferedPut { kind: 'put'; value: unknown }\nexport interface BufferedDelete { kind: 'delete'; key: KeyDTO }\nexport type BufferEntry = BufferedPut | BufferedDelete;\n\n// Buffer slot key: store + \\u0000 + raw JSON of the key (JSON text never\n// contains a literal \\u0000, so the separator is unambiguous).\nexport const bufferSlot = (store: StoreName, key: KeyDTO): string => `${store}\\u0000${JSON.stringify(key)}`;\n\n/** True when this tx has buffered writes (puts, deletes or a clear) for the store. */\nexport function isDirty(store: StoreName, buffer?: Map<string, BufferEntry>, cleared?: Set<StoreName>): boolean {\n if (cleared?.has(store)) return true;\n if (!buffer) return false;\n const prefix = `${store}\\u0000`;\n for (const slot of buffer.keys()) {\n if (slot.startsWith(prefix)) return true;\n }\n return false;\n}\n\n/** Point lookup against the buffer; undefined means consult the backend. */\nexport function bufferedGet<T>(store: StoreName, key: KeyDTO, buffer?: Map<string, BufferEntry>):\n | { hit: true; value: T }\n | { hit: false }\n | undefined {\n if (!buffer) return undefined;\n const entry = buffer.get(bufferSlot(store, key));\n if (!entry) return undefined;\n return entry.kind === 'put' ? { hit: true, value: entry.value as T } : { hit: false };\n}\n\n/**\n * Applies buffered puts and deletes before range filtering, ordering and\n * paging. Rows missing an index field are not in the index (IDB semantics);\n * multi-entry keys match when any entry is in range.\n */\nexport function overlayRows<T>(\n def: StoreDef,\n store: StoreName,\n buffer: Map<string, BufferEntry> | undefined,\n cleared: Set<StoreName> | undefined,\n rows: T[],\n count?: number,\n range?: RangeDTO,\n indexName?: string,\n): T[] {\n if (!buffer || !isDirty(store, buffer, cleared)) return count !== undefined ? rows.slice(0, count) : rows;\n const out = new Map<string, T>();\n if (!cleared?.has(store)) {\n // Out-map keys are raw JSON key text — same form as buffer slot suffixes.\n for (const row of rows) out.set(JSON.stringify(keyFromValue(def, row)), row);\n }\n const prefix = `${store}\\u0000`;\n for (const [slot, entry] of buffer) {\n if (!slot.startsWith(prefix)) continue;\n if (entry.kind === 'put') out.set(slot.slice(prefix.length), entry.value as T);\n else out.delete(slot.slice(prefix.length));\n }\n // Dirty reads fetch the complete candidate range: buffered deletes can\n // remove the remote head, and puts can change index membership or order.\n const index = indexName ? def.indexes.find(i => i.name === indexName) : undefined;\n if (indexName && !index) throw new Error(`unknown index '${indexName}' for ${store}`);\n const keyOf = (row: T): KeyDTO | undefined => {\n if (!index) return keyFromValue(def, row);\n const parts = index.keyPath.map(path => extractKeyPart(row, path));\n if (parts.some(part => part === undefined)) return undefined;\n const keys = parts.filter((part): part is string | number => part !== undefined);\n return keys.length === 1 ? keys[0] : keys;\n };\n const matches = (row: T): boolean => {\n if (index?.multiEntry) {\n let values: unknown = row;\n for (const part of index.keyPath[0].split('.')) {\n if (values === null || typeof values !== 'object' || !(part in values)) return false;\n values = Reflect.get(values, part);\n }\n return Array.isArray(values) && values.some(value =>\n (typeof value === 'string' || typeof value === 'number') && (!range || keyInRange(value, range)));\n }\n const key = keyOf(row);\n return key !== undefined && (!range || keyInRange(key, range));\n };\n const merged = [...out.values()].filter(matches);\n merged.sort((a, b) => {\n const primary = compareKeys(keyFromValue(def, a), keyFromValue(def, b));\n if (index?.multiEntry) return primary;\n const ak = keyOf(a), bk = keyOf(b);\n return ak !== undefined && bk !== undefined ? compareKeys(ak, bk) || primary : primary;\n });\n return count !== undefined ? merged.slice(0, count) : merged;\n}\n\n/** Drains the tx buffer into wire ops (clears first, then puts/deletes in op order). */\nexport function bufferToOps(storeNames: Iterable<StoreName>, buffer: Map<string, BufferEntry>, cleared: Set<StoreName>): TxOp[] {\n const known = new Set(storeNames);\n const ops: TxOp[] = [];\n for (const store of cleared) {\n if (known.has(store)) ops.push({ op: 'clear', store });\n }\n for (const [slot, entry] of buffer) {\n const sep = slot.indexOf('\\u0000');\n const store = slot.slice(0, sep) as StoreName;\n if (!known.has(store)) continue;\n if (entry.kind === 'put') ops.push({ op: 'put', store, value: entry.value });\n else ops.push({ op: 'delete', store, key: JSON.parse(slot.slice(sep + 1)) as KeyDTO });\n }\n return ops;\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"]}
|