@equationalapplications/core-llm-wiki 7.13.1 → 7.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -0
- package/dist/{chunk-PCRYIUV5.mjs → chunk-BC3QHSF3.mjs} +13 -8
- package/dist/chunk-BC3QHSF3.mjs.map +1 -0
- package/dist/index.d.mts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +140 -12
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +132 -9
- package/dist/index.mjs.map +1 -1
- package/dist/{testing-CqsXv2_l.d.mts → testing-BlGhilQw.d.mts} +52 -2
- package/dist/{testing-CqsXv2_l.d.ts → testing-BlGhilQw.d.ts} +52 -2
- package/dist/testing.d.mts +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +10 -5
- package/dist/testing.js.map +1 -1
- package/dist/testing.mjs +1 -1
- package/package.json +4 -4
- package/dist/chunk-PCRYIUV5.mjs.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/db/migrationGate.ts","../src/db/serializedAdapter.ts","../src/repositories/EntryRepository.ts","../src/repositories/OutboxRepository.ts","../src/repositories/SourceRefIndexRepository.ts","../src/repositories/TaskRepository.ts","../src/repositories/EventRepository.ts","../src/repositories/EdgeRepository.ts","../src/services/search/MiniSearchIndexStrategy.ts","../src/utils/monotonicNow.ts","../src/utils/setupDefaults.ts","../src/services/search/ftsQuery.ts","../src/services/search/Fts5IndexStrategy.ts","../src/services/search/createIndexStrategy.ts","../src/services/MaintenanceScheduler.ts","../src/prompts/ontology.ts","../src/services/OntologyService.ts","../src/services/GraphTraversalService.ts","../src/repositories/LintRepository.ts","../src/services/LintService.ts","../src/db/okf-trust-writes.ts","../src/WikiMemory.ts","../src/utils/formatContext.ts","../src/utils/formatGraphContext.ts","../src/utils/sanitizeForFilename.ts","../src/utils/formatMemoryDump.ts","../src/utils/formatOkfBundle.ts","../src/utils/parseOkfBundle.ts","../src/librarianPrompt.ts","../src/index.ts"],"names":["isStaleAfter","deriveTrustTier","rows","stashed","relatedLinksFor","latestVerified"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { SQLiteAdapter, MigrationPolicy, PendingMigrationWork } from '../types';\nimport type { MetadataRepository } from '../repositories/MetadataRepository';\nimport { probePendingWork } from './sourceRefNormalize';\nimport { setupDatabase } from './schema';\nimport { WikiMigrationRequiredError } from '../types';\n\nconst MIGRATION_POLICIES: readonly MigrationPolicy[] = ['allow', 'refuse', 'auto'];\n\n/**\n * Runs the read-only migration gate, then setupDatabase's every-open DDL.\n * - 'allow': no gate.\n * - 'refuse': any pending work throws before any mutation.\n * - 'auto': a pending schema migration throws; a pending source_ref normalize\n * is let through and run by setup() after the DDL and migrations loop.\n */\nexport async function setupDatabaseWithGate(\n db: SQLiteAdapter,\n prefix: string,\n meta: MetadataRepository,\n migrations: MigrationPolicy = 'allow',\n): Promise<void> {\n // Fail closed: an unrecognized value (e.g. 'Refuse' from env/JSON config) must not\n // silently skip the refusal and run a migration inside a time-critical open.\n if (!MIGRATION_POLICIES.includes(migrations)) {\n throw new TypeError(`Invalid migrations policy ${JSON.stringify(migrations)}; expected 'allow', 'refuse' or 'auto'.`);\n }\n if (migrations !== 'allow') {\n const pending = await probePendingWork(db, meta, prefix);\n if (pending && (migrations === 'refuse' || pending.type === 'schema_migration')) {\n throw new WikiMigrationRequiredError(describePending(pending, migrations), pending);\n }\n }\n return setupDatabase(db, prefix);\n}\n\nfunction describePending(pending: PendingMigrationWork, policy: MigrationPolicy): string {\n const what = pending.type === 'schema_migration'\n ? `schema migration v${pending.fromVersion} -> v${pending.toVersion} is pending`\n : pending.entriesWatermark === 0 && pending.sourceRefIndexWatermark === 0\n ? 'source_ref normalize has not run on this store (normalize stamp missing or outdated; may complete with zero rewrites)'\n : 'source_ref normalize was interrupted and will resume from its watermark';\n return `Migration refused (migrations: '${policy}'): ${what}. ` +\n `Open once with setup({ migrations: 'allow' }) outside any time-critical path to complete it.`;\n}\n","import type { SQLiteAdapter } from '../types';\nimport { WikiTransactionError } from '../types';\nimport { extractSqliteCode } from './sqliteCodes';\n\nexport { extractSqliteCode };\n\n/** True when `err` carries a parseable SQLite code — gates whether the wrapper re-wraps. */\nexport function isDriverError(err: unknown): boolean {\n return extractSqliteCode(err) !== undefined;\n}\n\n/**\n * Returns an adapter with the given methods overridden, delegating everything else\n * (own or class-prototype methods) to `target`.\n *\n * Uses a `Proxy` rather than `Object.create`/object-spread: delegated methods are\n * bound to `target` before being returned, so their receiver (`this`) stays the\n * original adapter instance. That keeps ES `#private` fields and `instanceof`/identity\n * checks inside those methods working — `Object.create` would invoke them with the\n * wrapper as `this` and break both.\n */\nfunction withOverrides(target: SQLiteAdapter, overrides: Partial<SQLiteAdapter>): SQLiteAdapter {\n return new Proxy(target, {\n get(obj, prop, receiver) {\n if (prop in overrides) return Reflect.get(overrides, prop, receiver);\n const value = Reflect.get(obj, prop, obj);\n return typeof value === 'function' ? value.bind(obj) : value;\n },\n }) as SQLiteAdapter;\n}\n\n/**\n * Returns the same adapter with `withTransactionAsync` overridden to throw. Injected\n * by the serialized wrapper onto the `tx` handed to every callback so a *nested*\n * transaction fails loudly instead of deadlocking against the mutex.\n */\nexport function guardReentrancy(tx: SQLiteAdapter): SQLiteAdapter {\n return withOverrides(tx, {\n withTransactionAsync() {\n throw new Error(\n 'Nested withTransactionAsync is not supported: you are already ' +\n 'inside a transaction. Pass the current `tx` down instead of ' +\n 'opening a new transaction.'\n );\n },\n });\n}\n\nconst DEADLOCK_WARN_MS = 10_000;\n\n/**\n * Wraps `withTransactionAsync` in a promise-chain mutex so transactions on the\n * single shared connection run one at a time. Non-transactional reads/writes are\n * untouched. Applied once in the WikiMemory constructor before the adapter reaches\n * any repository or service.\n */\nexport function withSerializedTransactions(db: SQLiteAdapter): SQLiteAdapter {\n let queue: Promise<unknown> = Promise.resolve();\n return withOverrides(db, {\n withTransactionAsync<T>(fn: (tx: SQLiteAdapter) => Promise<T>): Promise<T> {\n // Warns if a call waits >10s for the lock — the signature of the closure-capture\n // deadlock (calling the outer `db` instead of `tx` inside a callback). Cleared the\n // instant the lock is acquired, so it measures queue wait only.\n const warn = setTimeout(() => {\n console.warn(\n '[core-llm-wiki] Transaction queued >10s — possible deadlock. ' +\n 'Inside a transaction callback, use the `tx` parameter, never the ' +\n 'outer database handle.'\n );\n }, DEADLOCK_WARN_MS);\n\n const run = queue\n .catch(() => undefined) // proceed from a settled state; swallow prior outcome\n .then(() => {\n clearTimeout(warn);\n // Re-wrap the tx so a nested withTransactionAsync throws synchronously.\n // Some adapters invoke the callback with no tx handle; fall back to the\n // outer db (same connection). The guard still blocks nested transactions.\n return db.withTransactionAsync((tx) => fn(guardReentrancy(tx ?? db)));\n })\n .catch((e) => {\n // Wrap only driver errors; domain errors reach the caller with instanceof intact.\n throw isDriverError(e)\n ? new WikiTransactionError('Transaction failed', { cause: e })\n : e;\n });\n\n queue = run; // advance the tail; next caller's leading .catch() absorbs this rejection\n return run as Promise<T>;\n },\n });\n}\n","import type { SQLiteAdapter, WikiFact, EmbeddingMarkerKind } from '../types';\nimport { WikiGraphNodeOwnershipConflict } from '../types';\nimport { BaseRepository } from './BaseRepository';\nimport { OutboxRepository } from './OutboxRepository';\nimport { parseJsonArray, parseJsonObject } from './rowMappers';\nimport { reanchorRebuildFingerprint } from '../services/search/fts5Progress';\nimport { liveAtSql, type LiveMode } from '../utils/temporal';\nimport { isStaleAfter, deriveTrustTier } from '@equationalapplications/core-okf';\n\n/** Subset of temporal columns that {@link EntryRepository.setTemporal} may write (spec 2026-09-29 §4.3). */\nexport type TemporalFields = {\n valid_from?: number | null;\n valid_to?: number | null;\n superseded_by?: string | null;\n superseded_at?: number | null;\n};\n\n/** Lightweight projection used by TemporalService for supersession chain walks. */\nexport type TemporalRow = {\n id: string;\n entity_id: string;\n source_type: WikiFact['source_type'];\n deleted_at: number | null;\n created_at: number;\n valid_from: number | null;\n valid_to: number | null;\n superseded_by: string | null;\n};\n\nexport type EntryRowMetadata = {\n id: string;\n entity_id: string;\n updated_at: number | null;\n access_count: number | null;\n};\n\nexport type EntryRowWithEmbeddings = EntryRowMetadata & {\n embedding_blob: Uint8Array | null;\n embedding: string | null;\n};\n\n/**\n * One row of the reembed candidate scan. `findAllForReembed` does `SELECT *`,\n * so the marker columns come back at runtime; naming them here makes that\n * dependency visible to the compiler instead of hiding it behind a cast in\n * MaintenanceService.runReembed (spec §4.4).\n */\nexport type ReembedCandidateRow = WikiFact & {\n embedding_blob?: Uint8Array | null;\n embedding_failed_at?: number | null;\n embedding_failure_kind?: string | null;\n embedding_attempts?: number | null;\n};\n\nfunction mapRowToFact(row: any): WikiFact {\n const tags: string[] = (() => {\n if (Array.isArray(row.tags)) return row.tags;\n try { const p = JSON.parse(row.tags as string); if (Array.isArray(p)) return p; } catch {}\n return [];\n })();\n\n const okf_verified = parseJsonArray<NonNullable<WikiFact['okf_verified']>[number]>(row.okf_verified, []);\n // Hydrate per spec §2.7 + §5.3: surface isStale/trustTier so hosts don't have to\n // re-call the core-okf helpers. Sampled once per row rather than once per call\n // because `now` here means \"as of this hydration\" — using a stable per-call\n // value would shift staleness while we're mapping sibling rows in the same\n // read. Date.now() is cheap enough that per-row sampling is fine.\n const now = Date.now();\n const staleAfterRaw = row.stale_after != null ? Number(row.stale_after) : null;\n\n return {\n id: row.id,\n entity_id: row.entity_id,\n title: row.title,\n body: row.body,\n tags,\n confidence: row.confidence,\n source_type: row.source_type,\n source_hash: row.source_hash ?? null,\n source_ref: row.source_ref ?? null,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n last_accessed_at: (row.last_accessed_at === null || row.last_accessed_at === undefined)\n ? null\n : Number(row.last_accessed_at),\n deleted_at: row.deleted_at != null ? Number(row.deleted_at) : null,\n access_count: Number(row.access_count ?? 0),\n okf_type: row.okf_type ?? null,\n // OKF v0.2\n lifecycle_status: (row.lifecycle_status ?? 'stable') as WikiFact['lifecycle_status'],\n stale_after: staleAfterRaw,\n generated_by: row.generated_by ?? null,\n okf_sources: parseJsonArray<NonNullable<WikiFact['okf_sources']>[number]>(row.okf_sources, []),\n okf_verified,\n okf_usage_window: parseJsonObject<NonNullable<WikiFact['okf_usage_window']>>(row.okf_usage_window),\n last_verified_at: row.last_verified_at != null ? Number(row.last_verified_at) : null,\n last_verified_by: row.last_verified_by ?? null,\n // Spec §2.7 + §5.3: hydrate so read() consumers don't re-call the helpers.\n isStale: isStaleAfter(staleAfterRaw, now),\n trustTier: deriveTrustTier(okf_verified),\n // Temporal (spec 2026-09-29 §4, §10.8): keys appear only when set so\n // existing deep-equality assertions and host snapshots are unchanged.\n ...(row.valid_from != null ? { valid_from: Number(row.valid_from) } : {}),\n ...(row.valid_to != null ? { valid_to: Number(row.valid_to) } : {}),\n ...(row.superseded_by != null ? { superseded_by: String(row.superseded_by) } : {}),\n ...(row.superseded_at != null ? { superseded_at: Number(row.superseded_at) } : {}),\n };\n}\n\nfunction normalizeEmbeddingBlobValue(blob: unknown): Uint8Array | null {\n if (blob instanceof Uint8Array) return blob;\n if (blob !== null && blob !== undefined && typeof blob === 'object') {\n const obj = blob as Record<string, unknown>;\n if (obj['type'] === 'Buffer' && Array.isArray(obj['data'])) {\n return new Uint8Array(obj['data'] as number[]);\n }\n const entries = Object.keys(obj);\n if (entries.length > 0 && entries.every((k) => /^\\d+$/.test(k))) {\n const len = entries.length;\n const arr = new Uint8Array(len);\n for (let i = 0; i < len; i++) arr[i] = (obj[String(i)] as number) ?? 0;\n return arr;\n }\n }\n return null;\n}\n\n/** Mapper that preserves embedding_blob for export/import round-tripping. */\nfunction mapRowToFactWithBlobs(row: any): WikiFact {\n const base = mapRowToFact(row);\n const embeddingBlob = normalizeEmbeddingBlobValue(row.embedding_blob);\n return embeddingBlob ? { ...base, embedding_blob: embeddingBlob } : base;\n}\n\n\nexport class EntryRepository extends BaseRepository {\n /**\n * Column list and liveness predicate shared by findMiniSearchRows and\n * findMiniSearchRowsByIds, so the full rebuild and the incremental read\n * can never drift apart (spec 2026-09-28 §4.4: both must produce\n * identical documents).\n */\n private static readonly MINI_SEARCH_COLUMNS = 'id, entity_id, title, body, tags';\n private static readonly MINI_SEARCH_LIVE_WHERE = 'WHERE deleted_at IS NULL';\n\n private chunkSize = 500;\n\n constructor(db: SQLiteAdapter, prefix: string, private outbox: OutboxRepository) {\n super(db, prefix);\n }\n\n /** Whether the entity has any non-deleted row (librarian gate: keyword ranking over zero facts is trivially empty). */\n async hasLiveEntry(entityId: string, tx?: SQLiteAdapter): Promise<boolean> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ one: number }>(\n `SELECT 1 AS one FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL LIMIT 1`,\n [entityId],\n );\n return row != null;\n }\n\n /**\n * Fetch facts by IDs, optionally scoped to entity IDs.\n * Returns facts in the order of the input IDs (first match wins).\n */\n async findByIds(\n ids: readonly string[],\n scopedEntityIds?: readonly string[],\n tx?: SQLiteAdapter,\n ): Promise<WikiFact[]> {\n const executor = this.getExecutor(tx);\n const rows: any[] = [];\n const entityClause = scopedEntityIds && scopedEntityIds.length > 0\n ? ` AND entity_id IN (${scopedEntityIds.map(() => '?').join(',')})`\n : '';\n const entityParams = scopedEntityIds ?? [];\n\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n const chunkRows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}entries WHERE id IN (${placeholders})${entityClause} AND deleted_at IS NULL`,\n [...chunk, ...entityParams],\n );\n rows.push(...chunkRows);\n }\n\n const byId = new Map(rows.map(r => [r.id, r]));\n return ids\n .map(id => byId.get(id))\n .filter((r): r is any => r !== undefined)\n .map(mapRowToFact);\n }\n\n /**\n * Upsert a WikiFact. Nullable fields set to null when fact value is null.\n * Returns { changes, lastInsertRowId }.\n * `tx` is REQUIRED to ensure atomic outbox staging.\n *\n * OKF metadata discipline (spec §2.5 + DAO checklist §8): content writes\n * MUST NOT silently overwrite OKF metadata that a caller didn't supply. The\n * previous CASE WHEN IS NULL guards around `lifecycle_status`, etc. were\n * dead because the bind always supplied a non-null value (notably\n * `fact.lifecycle_status ?? 'stable'`), so excluded.X was never NULL and\n * an UPDATE rewrote an existing `deprecated` row to `stable`. We now omit\n * these columns from the SET clause entirely — SQLite's ON CONFLICT UPDATE\n * leaves untouched columns at their existing row value, which is exactly\n * the preservation semantics we want for content writes. Callers that\n * intentionally want to overwrite OKF metadata should use\n * {@link upsertForImport} (always-replace semantics for that path).\n * New-row INSERTs still bind a value so the column is populated; if the\n * caller supplied nothing, the schema DEFAULT 'stable' applies when the\n * bind is bound as 'stable' explicitly here.\n *\n * Marker discipline (spec §4.1): a conflict carrying a real\n * `embedding_blob` clears the embedding failure markers, because the row now\n * HAS a valid embedding and a surviving marker would be a self-contradictory\n * diagnostic that inflates runReembed's permanentlyFailed counter. A conflict\n * with no blob leaves marker state alone, matching the \"absent means don't\n * touch\" semantics used for embedding_blob itself.\n *\n * Graph node ownership (spec §2.4 + §3, REQ-OWN-01 + REQ-GRAPH-01): entry\n * IDs share one database-wide namespace, so an ID stays owned by its\n * existing entity for as long as the row exists — soft deletion included.\n * The pre-write lookup already reads the existing row for OKF metadata; we\n * project `entity_id` off that same SELECT and reject the write before\n * any outbox payload construction when the stored owner differs from\n * `fact.entity_id`. Soft-deleted foreign rows keep their IDs reserved;\n * permanent reservation is NOT introduced, so a physically absent ID may\n * still be inserted under the requested entity. The ON CONFLICT UPDATE SET\n * clause carries a final `WHERE entries.entity_id = excluded.entity_id`\n * guard so the database itself refuses a cross-owner row overwrite even if\n * a future caller bypasses the pre-write check. When `runAsync` reports\n * 0 changes (a legitimate conflict-suppressed write, OR an adapter that\n * under-reports a permitted write) we re-read the stored owner; only a\n * foreign owner throws — this is local defensive behavior, not permission\n * for adapters to under-report. The thrown error is\n * `WikiGraphNodeOwnershipConflict` (no owner, node ID, or stored content\n * is disclosed). Upserts that pass both gates retain existing same-entity\n * update + resurrection semantics.\n */\n async upsert(fact: WikiFact, tx: SQLiteAdapter): Promise<{ changes: number; lastInsertRowId: number }> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const tagsJson = JSON.stringify(fact.tags);\n const embeddingBlob = this.normalizeEmbeddingBlob(fact.embedding_blob);\n\n const existingRow = await executor.getFirstAsync<{\n id: string;\n entity_id: string;\n lifecycle_status: string;\n stale_after: number | null;\n generated_by: string | null;\n okf_sources: string | null;\n okf_verified: string | null;\n okf_usage_window: string | null;\n last_verified_at: number | null;\n last_verified_by: string | null;\n }>(\n `SELECT id, entity_id, lifecycle_status, stale_after, generated_by,\n okf_sources, okf_verified, okf_usage_window,\n last_verified_at, last_verified_by\n FROM ${this.prefix}entries WHERE id = ?`,\n [fact.id],\n );\n\n // Entry IDs share one global namespace, so an ID stays owned by its\n // existing entity for as long as the row exists — soft deletion included.\n // Reject here, before any write or outbox payload construction. This costs\n // one extra column on a SELECT the method already ran, not a new query.\n if (existingRow && existingRow.entity_id !== fact.entity_id) {\n throw new WikiGraphNodeOwnershipConflict();\n }\n\n const operation = fact.deleted_at ? 'DELETE' : (existingRow ? 'UPDATE' : 'INSERT');\n\n const result = await executor.runAsync(\n `INSERT INTO ${this.prefix}entries (\n id, entity_id, title, body, tags, confidence, source_type,\n source_hash, source_ref, created_at, updated_at, last_accessed_at, access_count,\n deleted_at, embedding_blob, embedding, okf_type,\n lifecycle_status, stale_after, generated_by, last_verified_at, last_verified_by,\n okf_sources, okf_verified, okf_usage_window\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n title = excluded.title,\n body = excluded.body,\n tags = excluded.tags,\n confidence = excluded.confidence,\n source_type = excluded.source_type,\n source_hash = excluded.source_hash,\n source_ref = excluded.source_ref,\n updated_at = excluded.updated_at,\n last_accessed_at = excluded.last_accessed_at,\n access_count = excluded.access_count,\n deleted_at = excluded.deleted_at,\n embedding_blob = CASE WHEN excluded.embedding_blob IS NULL THEN embedding_blob ELSE excluded.embedding_blob END,\n embedding = NULL,\n embedding_failed_at = CASE WHEN excluded.embedding_blob IS NOT NULL THEN NULL ELSE embedding_failed_at END,\n embedding_failure_kind = CASE WHEN excluded.embedding_blob IS NOT NULL THEN NULL ELSE embedding_failure_kind END,\n embedding_attempts = CASE WHEN excluded.embedding_blob IS NOT NULL THEN 0 ELSE embedding_attempts END,\n okf_type = excluded.okf_type\n WHERE ${this.prefix}entries.entity_id = excluded.entity_id`,\n [\n fact.id,\n fact.entity_id,\n fact.title,\n fact.body,\n tagsJson,\n fact.confidence,\n fact.source_type,\n fact.source_hash,\n fact.source_ref,\n fact.created_at,\n now,\n fact.last_accessed_at === null ? null : fact.last_accessed_at,\n fact.access_count,\n fact.deleted_at ?? null,\n embeddingBlob ?? null,\n null,\n fact.okf_type ?? null,\n // OKF v0.2 metadata — bound for INSERT only; ON CONFLICT UPDATE\n // preserves the existing row values (these columns are intentionally\n // absent from the SET clause above).\n fact.lifecycle_status ?? 'stable',\n fact.stale_after ?? null,\n fact.generated_by ?? null,\n fact.last_verified_at ?? null,\n fact.last_verified_by ?? null,\n fact.okf_sources ? JSON.stringify(fact.okf_sources) : null,\n fact.okf_verified ? JSON.stringify(fact.okf_verified) : null,\n fact.okf_usage_window ? JSON.stringify(fact.okf_usage_window) : null,\n ],\n );\n\n // A suppressed conflict-update reports 0 (see the SQLiteAdapter contract).\n // A permitted write that an adapter under-reports as 0 also lands here, so\n // confirm ownership from the stored row rather than inferring it from the\n // count. A foreign owner rejects; a missing row means the adapter dropped\n // the write (impossible under real SQLite), so fail rather than publish an\n // outbox event for state that does not exist.\n if (result.changes === 0) {\n const stored = await tx.getFirstAsync<{ entity_id: string }>(\n `SELECT entity_id FROM ${this.prefix}entries WHERE id = ?`,\n [fact.id],\n );\n if (!stored) {\n throw new Error('Entry upsert reported no change and stored no row; the SQLiteAdapter did not perform the write');\n }\n if (stored.entity_id !== fact.entity_id) {\n throw new WikiGraphNodeOwnershipConflict();\n }\n }\n\n // Outbox payload mirrors what is actually persisted. On UPDATE, the SET\n // clause intentionally omits the OKF metadata columns so the prior row\n // values win — so `fact.X` here would describe state we did NOT write.\n // Re-read those columns from the stored row and overlay them onto the\n // caller-supplied payload before publishing (#90 review).\n const persistedOkf = existingRow\n ? {\n lifecycle_status: (existingRow.lifecycle_status ?? 'stable') as WikiFact['lifecycle_status'],\n stale_after: existingRow.stale_after != null ? Number(existingRow.stale_after) : null,\n generated_by: existingRow.generated_by ?? null,\n okf_sources: parseJsonArray<NonNullable<WikiFact['okf_sources']>[number]>(existingRow.okf_sources, []),\n okf_verified: parseJsonArray<NonNullable<WikiFact['okf_verified']>[number]>(existingRow.okf_verified, []),\n okf_usage_window: parseJsonObject<NonNullable<WikiFact['okf_usage_window']>>(existingRow.okf_usage_window),\n last_verified_at: existingRow.last_verified_at != null ? Number(existingRow.last_verified_at) : null,\n last_verified_by: existingRow.last_verified_by ?? null,\n }\n : null;\n await this.outbox.push({\n entityId: fact.entity_id,\n tableName: 'entries',\n recordId: fact.id,\n operation,\n payload: persistedOkf ? { ...fact, ...persistedOkf } : fact,\n }, tx);\n\n return result;\n }\n\n /**\n * Normalize an embedding blob value to Uint8Array or null.\n */\n private normalizeEmbeddingBlob(blob: unknown): Uint8Array | null {\n return normalizeEmbeddingBlobValue(blob);\n }\n\n /**\n * Fetch existing rows by IDs and return id/entity_id/updated_at for import collision resolution.\n */\n async findExistingMetadataByIds(\n ids: readonly string[],\n tx?: SQLiteAdapter,\n ): Promise<Array<{ id: string; entity_id: string; updated_at: number }>> {\n const executor = this.getExecutor(tx);\n const rows: Array<{ id: string; entity_id: string; updated_at: number }> = [];\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n const chunkRows = await executor.getAllAsync<any>(\n `SELECT id, entity_id, updated_at FROM ${this.prefix}entries WHERE id IN (${placeholders})`,\n chunk,\n );\n rows.push(...chunkRows.map((row) => ({ id: row.id, entity_id: row.entity_id, updated_at: Number(row.updated_at) })));\n }\n return rows;\n }\n\n async findIdById(id: string, entityId: string, tx?: SQLiteAdapter): Promise<string | null> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}entries WHERE id = ? AND entity_id = ?`,\n [id, entityId],\n );\n return row?.id ?? null;\n }\n\n async findIdsBySource(\n entityId: string,\n sourceRef: string | null,\n sourceHash: string | null,\n tx?: SQLiteAdapter,\n includeDeleted = false,\n ): Promise<string[]> {\n const executor = this.getExecutor(tx);\n let sql = `SELECT id FROM ${this.prefix}entries WHERE entity_id = ?`;\n const args: unknown[] = [entityId];\n if (sourceRef !== null) {\n sql += ` AND source_ref = ?`;\n args.push(sourceRef);\n }\n if (sourceHash !== null) {\n sql += ` AND source_hash = ?`;\n args.push(sourceHash);\n }\n if (!includeDeleted) {\n sql += ` AND deleted_at IS NULL`;\n }\n const rows = await executor.getAllAsync<{ id: string }>(sql, args);\n return rows.map((row) => row.id);\n }\n\n async upsertForImport(fact: WikiFact, tx: SQLiteAdapter): Promise<{ changes: number; lastInsertRowId: number }> {\n const executor = this.getExecutor(tx);\n const tagsJson = JSON.stringify(fact.tags);\n const embeddingBlob = this.normalizeEmbeddingBlob(fact.embedding_blob);\n\n // Import is replace semantics: a re-imported fact whose OKF metadata\n // cleared (stale_after removed, generated_by removed, etc.) MUST overwrite\n // the prior row's value. The previous CASE WHEN IS NULL guards preserved\n // the old database values instead, so an \"absent in dump\" never cleared.\n // Direct `= excluded.X` ensures the dump is authoritative.\n //\n // WARNING: unlike `upsert`, this SQL re-parents a conflicting row\n // (`entity_id = excluded.entity_id`, no owner predicate). It is safe only\n // because ImportExportService skips foreign-owned IDs before calling it.\n // Do not model a new write path on this method; use `upsert`.\n const result = await executor.runAsync(\n `INSERT INTO ${this.prefix}entries (\n id, entity_id, title, body, tags, confidence, source_type,\n source_hash, source_ref, created_at, updated_at, last_accessed_at, access_count,\n deleted_at, embedding_blob, embedding, okf_type,\n lifecycle_status, stale_after, generated_by, last_verified_at, last_verified_by,\n okf_sources, okf_verified, okf_usage_window\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n entity_id = excluded.entity_id,\n title = excluded.title,\n body = excluded.body,\n tags = excluded.tags,\n confidence = excluded.confidence,\n source_type = excluded.source_type,\n source_hash = excluded.source_hash,\n source_ref = excluded.source_ref,\n created_at = excluded.created_at,\n updated_at = excluded.updated_at,\n last_accessed_at = excluded.last_accessed_at,\n access_count = excluded.access_count,\n deleted_at = excluded.deleted_at,\n embedding_blob = excluded.embedding_blob,\n embedding = NULL,\n embedding_failed_at = CASE WHEN excluded.embedding_blob IS NOT NULL THEN NULL ELSE embedding_failed_at END,\n embedding_failure_kind = CASE WHEN excluded.embedding_blob IS NOT NULL THEN NULL ELSE embedding_failure_kind END,\n embedding_attempts = CASE WHEN excluded.embedding_blob IS NOT NULL THEN 0 ELSE embedding_attempts END,\n okf_type = excluded.okf_type,\n lifecycle_status = excluded.lifecycle_status,\n stale_after = excluded.stale_after,\n generated_by = excluded.generated_by,\n last_verified_at = excluded.last_verified_at,\n last_verified_by = excluded.last_verified_by,\n okf_sources = excluded.okf_sources,\n okf_verified = excluded.okf_verified,\n okf_usage_window = excluded.okf_usage_window`,\n [\n fact.id,\n fact.entity_id,\n fact.title,\n fact.body,\n tagsJson,\n fact.confidence,\n fact.source_type,\n fact.source_hash,\n fact.source_ref,\n fact.created_at,\n fact.updated_at,\n fact.last_accessed_at === null ? null : fact.last_accessed_at,\n fact.access_count,\n fact.deleted_at ?? null,\n embeddingBlob ?? null,\n null,\n fact.okf_type ?? null,\n // Same NOT NULL DEFAULT note as in upsert above.\n fact.lifecycle_status ?? 'stable',\n fact.stale_after ?? null,\n fact.generated_by ?? null,\n fact.last_verified_at ?? null,\n fact.last_verified_by ?? null,\n fact.okf_sources ? JSON.stringify(fact.okf_sources) : null,\n fact.okf_verified ? JSON.stringify(fact.okf_verified) : null,\n fact.okf_usage_window ? JSON.stringify(fact.okf_usage_window) : null,\n ],\n );\n\n return result;\n }\n\n /**\n * Soft-delete a single entry by ID scoped to entityId. Sets deleted_at + updated_at.\n * `tx` is REQUIRED to ensure atomic outbox staging.\n */\n async softDelete(entryId: string, entityId: string, tx: SQLiteAdapter): Promise<{ changes: number }> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const result = await executor.runAsync(\n `UPDATE ${this.prefix}entries SET deleted_at = ?, updated_at = ? WHERE id = ? AND entity_id = ? AND deleted_at IS NULL`,\n [now, now, entryId, entityId],\n );\n\n await this.outbox.push({\n entityId,\n tableName: 'entries',\n recordId: entryId,\n operation: 'DELETE',\n payload: { id: entryId, entity_id: entityId, deleted_at: now },\n }, tx);\n\n return result;\n }\n\n /**\n * Soft-delete entries by source_ref and/or source_hash within a transaction.\n * Stages a DELETE outbox entry for each row in the same transaction.\n * `tx` is REQUIRED.\n * Returns the number of rows deleted.\n */\n async softDeleteBySource(\n entityId: string,\n tx: SQLiteAdapter,\n sourceRef?: string | null,\n sourceHash?: string | null,\n ): Promise<number> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n\n let q = `UPDATE ${this.prefix}entries SET deleted_at = ?, updated_at = ? WHERE entity_id = ? AND deleted_at IS NULL`;\n const args: any[] = [now, now, entityId];\n if (sourceRef) {\n q += ` AND source_ref = ?`;\n args.push(sourceRef);\n }\n if (sourceHash) {\n q += ` AND source_hash = ?`;\n args.push(sourceHash);\n }\n\n // Build a separate SELECT query to get affected IDs before updating\n let selectQ = `SELECT id FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL`;\n const selectArgs: any[] = [entityId];\n if (sourceRef) {\n selectQ += ` AND source_ref = ?`;\n selectArgs.push(sourceRef);\n }\n if (sourceHash) {\n selectQ += ` AND source_hash = ?`;\n selectArgs.push(sourceHash);\n }\n\n const idsToDelete = await executor.getAllAsync<{ id: string }>(selectQ, selectArgs);\n\n const result = await executor.runAsync(q, args);\n\n for (const row of idsToDelete) {\n await this.outbox.push({\n entityId,\n tableName: 'entries',\n recordId: row.id,\n operation: 'DELETE',\n payload: { id: row.id, entity_id: entityId, deleted_at: now },\n }, tx);\n }\n\n return result.changes;\n }\n\n /**\n * Fetch IDs + entity_ids of soft-deleted rows older than cutoff for a given entity.\n * Used by runPrune().\n */\n async getPrunableMetadata(\n entityId: string,\n cutoff: number,\n tx?: SQLiteAdapter,\n ): Promise<Array<{ id: string; entity_id: string }>> {\n const executor = this.getExecutor(tx);\n return executor.getAllAsync<{ id: string; entity_id: string }>(\n `SELECT id, entity_id FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NOT NULL AND deleted_at <= ?`,\n [entityId, cutoff],\n );\n }\n\n /**\n * Fetch all non-deleted entries for an entity, ordered by updated_at DESC.\n * Used by _getFullBundle().\n */\n async findAllByEntityId(entityId: string, tx?: SQLiteAdapter): Promise<WikiFact[]> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC`,\n [entityId],\n );\n return rows.map(mapRowToFact);\n }\n\n /**\n * Fetch live, mutable entries for an entity — everything heal is allowed to\n * downgrade or delete — oldest first, capped at `limit`, skipping anything\n * stamped inside the recheck cooldown (heal_checked_at > recheckCutoff).\n *\n * Oldest-first rather than newest-first: with a cooldown in place, newest-first\n * would keep re-selecting recently-touched facts every pass while older ones\n * wait indefinitely to even enter a batch.\n */\n async findHealCandidatesByEntityId(\n entityId: string,\n limit: number,\n recheckCutoff: number,\n tx?: SQLiteAdapter,\n ): Promise<WikiFact[]> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL AND source_type != 'immutable_document'\n AND ${liveAtSql('current')}\n AND (heal_checked_at IS NULL OR heal_checked_at <= ?)\n ORDER BY updated_at ASC LIMIT ?`,\n [entityId, now, now, recheckCutoff, limit],\n );\n return rows.map(mapRowToFact);\n }\n\n /**\n * Resolve search hits to document anchors. The MiniSearch index holds every\n * fact, not only immutable_document rows, so the source-type restriction has\n * to be applied here, after retrieval.\n */\n async findAnchorRowsByIds(\n entityId: string,\n ids: readonly string[],\n tx?: SQLiteAdapter,\n opts?: { withBody?: boolean },\n ): Promise<Array<{ id: string; title: string; source_ref: string | null; body?: string; lifecycle_status?: string }>> {\n if (ids.length === 0) return [];\n const executor = this.getExecutor(tx);\n // Bodies and status are read only for heal grounding (spec §6.3, rev 7);\n // the default projection is unchanged.\n const columns = opts?.withBody ? 'id, title, source_ref, body, lifecycle_status' : 'id, title, source_ref';\n const rows: Array<{ id: string; title: string; source_ref: string | null; body?: string; lifecycle_status?: string }> = [];\n // Chunked like every other multi-id read here. The current caller stays well\n // under SQLITE_MAX_VARIABLE_NUMBER, but that is a property of the caller,\n // not of this method.\n const now = Date.now();\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(', ');\n const chunkRows = await executor.getAllAsync<{ id: string; title: string; source_ref: string | null; body?: string; lifecycle_status?: string }>(\n `SELECT ${columns} FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL\n AND source_type = 'immutable_document'\n AND ${liveAtSql('current')}\n AND id IN (${placeholders})`,\n [entityId, now, now, ...chunk],\n );\n rows.push(...chunkRows);\n }\n return rows;\n }\n\n /**\n * Fetch recent non-deleted entries for an entity (limited), ordered by updated_at DESC.\n * Used by MaintenanceService.doRunLibrarian().\n *\n * When `excludeSourceRef` is supplied, the WHERE clause filters out that\n * sourceRef BEFORE applying LIMIT. The caller in IngestionService is\n * `findRecentByEntityId(entityId, 500, tx)` — it discards same-sourceRef\n * rows after the read to build a cross-sourceRef title index. If those\n * rows are filtered out in SQL, the limit applies to usable rows only\n * and a re-ingest where the caller's sourceRef owns most recent facts\n * still leaves cross-sourceRef entries in the index.\n */\n async findRecentByEntityId(\n entityId: string,\n limit: number,\n tx?: SQLiteAdapter,\n excludeSourceRef?: string,\n ): Promise<WikiFact[]> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n // `IS NULL OR !=` keeps NULL-source_ref rows (e.g. librarian_inferred facts)\n // in the cross-sourceRef title index. The intent of `excludeSourceRef` is\n // \"drop THIS sourceRef's rows\"; NULL rows belong to neither the current\n // sourceRef nor the replacement set, and excluding them causes edges\n // targeting legacy/non-document facts to fail to resolve.\n const excludeClause = excludeSourceRef ? ` AND (source_ref IS NULL OR source_ref != ?)` : '';\n const args: unknown[] = excludeSourceRef ? [entityId, now, now, excludeSourceRef, limit] : [entityId, now, now, limit];\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL AND ${liveAtSql('current')}${excludeClause} ORDER BY updated_at DESC LIMIT ?`,\n args,\n );\n return rows.map(mapRowToFact);\n }\n\n /**\n * Fetch all non-deleted entries for an entity with embedding blobs preserved.\n * Used by ImportExportService for export/import round-tripping.\n */\n async findAllByEntityIdWithBlobs(entityId: string, tx?: SQLiteAdapter): Promise<WikiFact[]> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC`,\n [entityId],\n );\n return rows.map(mapRowToFactWithBlobs);\n }\n\n /**\n * Count non-deleted entries for the given entities whose embedding_blob dimension\n * doesn't match queryVecLength. Used by read() to detect model-switch mismatches.\n */\n async countDimensionMismatched(\n entityIds: readonly string[],\n queryVecLength: number,\n tx?: SQLiteAdapter,\n ): Promise<number> {\n if (entityIds.length === 0) return 0;\n const executor = this.getExecutor(tx);\n const placeholders = entityIds.map(() => '?').join(',');\n const row = await executor.getFirstAsync<{ cnt: number }>(\n `SELECT COUNT(*) AS cnt FROM ${this.prefix}entries\n WHERE entity_id IN (${placeholders}) AND deleted_at IS NULL\n AND embedding_blob IS NOT NULL\n AND (CAST(length(embedding_blob) AS INTEGER) % 4 = 0)\n AND (CAST(length(embedding_blob) AS INTEGER) / 4) != ?`,\n [...entityIds, queryVecLength],\n );\n return row?.cnt ?? 0;\n }\n\n /**\n * Count non-deleted entries for entityId that are stale relative to targetDim\n * (either no blob or wrong dimension). Used by runReembed() per-entity skip logic.\n */\n async countStaleForEntity(entityId: string, targetDim: number, tx?: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ cnt: number }>(\n `SELECT COUNT(*) AS cnt FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL\n AND (\n embedding_blob IS NULL\n OR (CAST(length(embedding_blob) AS INTEGER) / 4) != ?\n )`,\n [entityId, targetDim],\n );\n return row?.cnt ?? 0;\n }\n\n /**\n * Count non-deleted entries with stale or unconverted embeddings relative to `dim`.\n * Used by _reconcileEmbeddingDimension() to decide when to promote the pending\n * embedding_dimension value.\n */\n async countStaleEmbeddings(dim: number, tx?: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ cnt: number }>(\n `SELECT COUNT(*) AS cnt FROM ${this.prefix}entries\n WHERE deleted_at IS NULL\n AND (\n (embedding_blob IS NOT NULL AND (CAST(length(embedding_blob) AS INTEGER) / 4) != ?)\n OR (embedding_blob IS NULL AND embedding IS NOT NULL)\n )`,\n [dim],\n );\n return row?.cnt ?? 0;\n }\n\n /**\n * Bulk delete pruned entries (already soft-deleted) by IDs.\n * Used by runPrune(). Returns total number of deleted rows.\n * `tx` is REQUIRED so outbox deletion events are staged atomically.\n */\n async bulkDeletePruned(\n entityId: string,\n cutoff: number,\n ids: string[],\n tx: SQLiteAdapter,\n ): Promise<number> {\n const executor = this.getExecutor(tx);\n let totalChanges = 0;\n const chunkSize = 500;\n for (let i = 0; i < ids.length; i += chunkSize) {\n const chunk = ids.slice(i, i + chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n const result = await executor.runAsync(\n `DELETE FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NOT NULL AND deleted_at <= ? AND id IN (${placeholders})`,\n [entityId, cutoff, ...chunk],\n );\n totalChanges += result.changes;\n // Stage outbox entries for permanently deleted records\n if (result.changes > 0) {\n for (const id of chunk) {\n await this.outbox.push({\n entityId,\n tableName: 'entries',\n recordId: id,\n operation: 'DELETE',\n payload: { id, entity_id: entityId, deleted_at: cutoff },\n }, tx);\n }\n }\n }\n // Spec #280 Change 3: an engine hard-delete never strands the FTS rebuild fingerprint.\n if (totalChanges > 0) await reanchorRebuildFingerprint(executor, this.prefix, ids);\n return totalChanges;\n }\n\n /**\n * Mark orphaned entries (never accessed, old) as deleted.\n * Used by MaintenanceService.doRunHeal().\n */\n async markOrphaned(\n entityId: string,\n orphanThreshold: number,\n tx: SQLiteAdapter,\n ): Promise<string[]> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const updatedRows = await executor.getAllAsync<{ id: string }>(\n `UPDATE ${this.prefix}entries\n SET deleted_at = ?, updated_at = ?\n WHERE entity_id = ? AND access_count = 0 AND created_at <= ? AND source_type != 'immutable_document' AND deleted_at IS NULL\n RETURNING id`,\n [now, now, entityId, orphanThreshold],\n );\n for (const row of updatedRows) {\n await this.outbox.push({\n entityId,\n tableName: 'entries',\n recordId: row.id,\n operation: 'DELETE',\n payload: { id: row.id, entity_id: entityId, deleted_at: now },\n }, tx);\n }\n return updatedRows.map(r => r.id);\n }\n\n /**\n * Downgrade stale inferred entries to 'tentative'.\n * Used by MaintenanceService.doRunHeal().\n *\n * Returns the ids it downgraded so the caller can fold them into\n * {@link HealResult.downgraded} without double-counting a fact the model also\n * downgraded in the same pass.\n */\n async downgradeStaleInferred(\n entityId: string,\n staleThreshold: number,\n tx: SQLiteAdapter,\n ): Promise<string[]> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const eligibleRows = await executor.getAllAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}entries\n WHERE entity_id = ? AND confidence = 'inferred'\n AND (last_accessed_at <= ? OR (last_accessed_at IS NULL AND created_at <= ?))\n AND source_type != 'immutable_document' AND deleted_at IS NULL`,\n [entityId, staleThreshold, staleThreshold],\n );\n if (eligibleRows.length === 0) return [];\n await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET confidence = 'tentative', updated_at = ?\n WHERE entity_id = ? AND confidence = 'inferred' AND (last_accessed_at <= ? OR (last_accessed_at IS NULL AND created_at <= ?)) AND source_type != 'immutable_document' AND deleted_at IS NULL`,\n [now, entityId, staleThreshold, staleThreshold],\n );\n for (const row of eligibleRows) {\n await this.outbox.push({\n entityId,\n tableName: 'entries',\n recordId: row.id,\n operation: 'UPDATE',\n payload: { id: row.id, entity_id: entityId, confidence: 'tentative', updated_at: now },\n }, tx);\n }\n return eligibleRows.map(r => r.id);\n }\n\n /**\n * Downgrade specific entries to 'tentative' by IDs.\n * Used by MaintenanceService.doRunHeal().\n */\n async downgradeByIds(\n ids: string[],\n entityId: string,\n tx: SQLiteAdapter,\n ): Promise<void> {\n if (ids.length === 0) return;\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const placeholders = ids.map(() => '?').join(',');\n await executor.runAsync(\n `UPDATE ${this.prefix}entries SET confidence = 'tentative', updated_at = ? WHERE id IN (${placeholders}) AND entity_id = ?`,\n [now, ...ids, entityId],\n );\n // Stage outbox entries for downgraded records\n for (const id of ids) {\n await this.outbox.push({\n entityId,\n tableName: 'entries',\n recordId: id,\n operation: 'UPDATE',\n payload: { id, entity_id: entityId, confidence: 'tentative', updated_at: now },\n }, tx);\n }\n }\n\n /**\n * Soft-delete specific entries by IDs.\n * Used by MaintenanceService.doRunHeal().\n */\n async softDeleteByIds(\n ids: string[],\n entityId: string,\n tx: SQLiteAdapter,\n ): Promise<void> {\n if (ids.length === 0) return;\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const placeholders = ids.map(() => '?').join(',');\n await executor.runAsync(\n `UPDATE ${this.prefix}entries SET deleted_at = ?, updated_at = ? WHERE id IN (${placeholders}) AND entity_id = ?`,\n [now, now, ...ids, entityId],\n );\n // Stage outbox entries for soft-deleted records\n for (const id of ids) {\n await this.outbox.push({\n entityId,\n tableName: 'entries',\n recordId: id,\n operation: 'DELETE',\n payload: { id, entity_id: entityId, deleted_at: now },\n }, tx);\n }\n }\n\n /** Spec §4: write any subset of the four temporal columns. Absent key = untouched; null = clear. */\n async setTemporal(\n id: string,\n entityId: string,\n fields: TemporalFields,\n tx: SQLiteAdapter,\n opts?: { outbox?: boolean },\n ): Promise<number> {\n const keys = (['valid_from', 'valid_to', 'superseded_by', 'superseded_at'] as const).filter((k) => k in fields);\n if (keys.length === 0) return 0;\n const executor = this.getExecutor(tx);\n const result = await executor.runAsync(\n `UPDATE ${this.prefix}entries SET ${keys.map((k) => `${k} = ?`).join(', ')} WHERE id = ? AND entity_id = ?`,\n [...keys.map((k) => fields[k] ?? null), id, entityId],\n );\n if (result.changes > 0 && opts?.outbox !== false) {\n const payload: Record<string, unknown> = { id, entity_id: entityId };\n for (const k of keys) payload[k] = fields[k] ?? null;\n await this.outbox.push({ entityId, tableName: 'entries', recordId: id, operation: 'UPDATE', payload }, tx);\n }\n return result.changes;\n }\n\n async findTemporalRow(id: string, tx?: SQLiteAdapter): Promise<TemporalRow | null> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<any>(\n `SELECT id, entity_id, source_type, deleted_at, created_at, valid_from, valid_to, superseded_by\n FROM ${this.prefix}entries WHERE id = ?`,\n [id],\n );\n if (!row) return null;\n return {\n id: String(row.id),\n entity_id: String(row.entity_id),\n source_type: row.source_type,\n deleted_at: row.deleted_at != null ? Number(row.deleted_at) : null,\n created_at: Number(row.created_at),\n valid_from: row.valid_from != null ? Number(row.valid_from) : null,\n valid_to: row.valid_to != null ? Number(row.valid_to) : null,\n superseded_by: row.superseded_by != null ? String(row.superseded_by) : null,\n };\n }\n\n /**\n * Ids of non-deleted facts NOT live at `t` (spec §4.2). In 'current' mode a\n * row with both validity columns NULL is always live, so the query is\n * restricted to rows that carry a validity column — served by the partial\n * entries_temporal_idx.\n */\n async findNonLiveIdsByEntityIds(\n entityIds: readonly string[],\n mode: LiveMode,\n t: number,\n tx?: SQLiteAdapter,\n ): Promise<Set<string>> {\n if (entityIds.length === 0) return new Set();\n const executor = this.getExecutor(tx);\n const placeholders = entityIds.map(() => '?').join(',');\n const temporalOnly = mode === 'current' ? ' AND (valid_from IS NOT NULL OR valid_to IS NOT NULL)' : '';\n const rows = await executor.getAllAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}entries\n WHERE entity_id IN (${placeholders}) AND deleted_at IS NULL${temporalOnly}\n AND NOT ${liveAtSql(mode)}`,\n [...entityIds, t, t],\n );\n return new Set(rows.map((r) => r.id));\n }\n\n async findSupersessionChainIds(\n entityId: string,\n factId: string,\n maxDepth: number,\n tx?: SQLiteAdapter,\n ): Promise<{ predecessors: string[]; successors: string[] }> {\n const executor = this.getExecutor(tx);\n const successors = await executor.getAllAsync<{ id: string }>(\n `WITH RECURSIVE fwd(id, depth) AS (\n SELECT superseded_by, 1 FROM ${this.prefix}entries WHERE id = ? AND entity_id = ? AND superseded_by IS NOT NULL\n UNION\n SELECT e.superseded_by, fwd.depth + 1 FROM fwd\n JOIN ${this.prefix}entries e ON e.id = fwd.id AND e.entity_id = ?\n WHERE e.superseded_by IS NOT NULL AND fwd.depth < ?\n )\n SELECT id FROM fwd ORDER BY depth ASC`,\n [factId, entityId, entityId, maxDepth],\n );\n const predecessors = await executor.getAllAsync<{ id: string }>(\n `WITH RECURSIVE bwd(id, depth) AS (\n SELECT id, 1 FROM ${this.prefix}entries WHERE entity_id = ? AND superseded_by = ?\n UNION\n SELECT e.id, bwd.depth + 1 FROM bwd\n JOIN ${this.prefix}entries e ON e.entity_id = ? AND e.superseded_by = bwd.id\n WHERE bwd.depth < ?\n )\n SELECT id FROM bwd ORDER BY depth DESC`,\n [entityId, factId, entityId, maxDepth],\n );\n const drop = (ids: Array<{ id: string }>) => ids.map((r) => r.id).filter((id) => id !== factId);\n return { predecessors: drop(predecessors), successors: drop(successors) };\n }\n\n async findExpiredIds(entityId: string, cutoff: number, tx?: SQLiteAdapter): Promise<string[]> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL AND valid_to IS NOT NULL AND valid_to <= ?\n ORDER BY valid_to ASC`,\n [entityId, cutoff],\n );\n return rows.map((r) => r.id);\n }\n\n /**\n * Bulk soft-delete all entries for an entity.\n * Stages DELETE outbox entries for each row in the same transaction.\n * `tx` is REQUIRED.\n */\n async bulkSoftDeleteByEntityId(entityId: string, tx: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n // Get IDs before updating for outbox staging\n const idsToDelete = await executor.getAllAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL`,\n [entityId],\n );\n const result = await executor.runAsync(\n `UPDATE ${this.prefix}entries SET deleted_at = ?, updated_at = ? WHERE entity_id = ? AND deleted_at IS NULL`,\n [now, now, entityId],\n );\n // Stage outbox entries for each deleted record\n for (const row of idsToDelete) {\n await this.outbox.push({\n entityId,\n tableName: 'entries',\n recordId: row.id,\n operation: 'DELETE',\n payload: { id: row.id, entity_id: entityId, deleted_at: now },\n }, tx);\n }\n return result.changes;\n }\n\n async findMiniSearchRows(\n entityId?: string,\n tx?: SQLiteAdapter,\n ): Promise<Array<{ id: string; entity_id: string; title: string; body: string; tags: string }>> {\n const executor = this.getExecutor(tx);\n if (entityId !== undefined) {\n return executor.getAllAsync(\n `SELECT ${EntryRepository.MINI_SEARCH_COLUMNS} FROM ${this.prefix}entries ${EntryRepository.MINI_SEARCH_LIVE_WHERE} AND entity_id = ?`,\n [entityId],\n );\n }\n return executor.getAllAsync(\n `SELECT ${EntryRepository.MINI_SEARCH_COLUMNS} FROM ${this.prefix}entries ${EntryRepository.MINI_SEARCH_LIVE_WHERE}`,\n );\n }\n\n /**\n * Keyword-index rows for specific ids — the incremental counterpart of\n * {@link findMiniSearchRows}, with identical columns. Soft-deleted rows and\n * rows of other entities are omitted, so a caller can pass every id a write\n * touched and get back exactly what should be indexed. Spec 2026-09-28 §4.4.\n */\n async findMiniSearchRowsByIds(\n entityId: string,\n ids: readonly string[],\n tx?: SQLiteAdapter,\n ): Promise<Array<{ id: string; entity_id: string; title: string; body: string; tags: string }>> {\n if (ids.length === 0) return [];\n const executor = this.getExecutor(tx);\n const rows: Array<{ id: string; entity_id: string; title: string; body: string; tags: string }> = [];\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n rows.push(...(await executor.getAllAsync<{ id: string; entity_id: string; title: string; body: string; tags: string }>(\n `SELECT ${EntryRepository.MINI_SEARCH_COLUMNS} FROM ${this.prefix}entries ${EntryRepository.MINI_SEARCH_LIVE_WHERE} AND entity_id = ? AND id IN (${placeholders})`,\n [entityId, ...chunk],\n )));\n }\n return rows;\n }\n\n async updateEmbeddingBlob(id: string, blob: Uint8Array, tx?: SQLiteAdapter): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET embedding_blob = ?,\n embedding = NULL,\n embedding_failed_at = NULL,\n embedding_failure_kind = NULL,\n embedding_attempts = 0\n WHERE id = ?`,\n [blob, id],\n );\n }\n\n /**\n * Record a failed embedding attempt. Deliberately does NOT touch updated_at\n * (import merge is last-write-wins on it) and pushes no outbox event —\n * embedding lifecycle is local state, not replicated. Same discipline as\n * updateEmbeddingBlob. See spec §3.5.\n *\n * Only marker-eligible kinds (spec §3.3) are accepted: `no_provider` never\n * marks and `storage_error` never marks, so retry/permanent-failure policy\n * built on these rows only ever sees real embed failures.\n */\n async markEmbeddingFailure(\n id: string,\n kind: EmbeddingMarkerKind,\n now: number,\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET embedding_failed_at = ?,\n embedding_failure_kind = ?,\n embedding_attempts = embedding_attempts + 1\n WHERE id = ?`,\n [now, kind, id],\n );\n }\n\n /**\n * Clear marker state for every marked row. Called when the embedding\n * dimension is promoted: a new model produces different vectors, so past\n * failures — including `float32_overflow`, which is otherwise terminal —\n * no longer predict future ones (spec §2.3).\n *\n * Same discipline as markEmbeddingFailure: no `updated_at` touch and no\n * outbox event, because embedding lifecycle is local state, not replicated.\n * Returns the number of rows cleared.\n */\n async clearEmbeddingFailureMarkers(tx?: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const result = await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET embedding_failed_at = NULL,\n embedding_failure_kind = NULL,\n embedding_attempts = 0\n WHERE embedding_failed_at IS NOT NULL`,\n );\n return result.changes;\n }\n\n async hasLegacySourceTypes(tx?: SQLiteAdapter): Promise<boolean> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ one: number }>(\n `SELECT 1 AS one FROM ${this.prefix}entries WHERE source_type IN ('user_document', 'agent_inferred') LIMIT 1`,\n [],\n );\n return row != null;\n }\n\n async countLegacySourceTypes(tx?: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ count: number }>(\n `SELECT COUNT(*) as count FROM ${this.prefix}entries WHERE source_type IN ('user_document', 'agent_inferred')`,\n [],\n );\n return row?.count ?? 0;\n }\n\n async findAllForReembed(entityId?: string, tx?: SQLiteAdapter): Promise<ReembedCandidateRow[]> {\n const executor = this.getExecutor(tx);\n if (entityId !== undefined) {\n return executor.getAllAsync(\n `SELECT * FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL`,\n [entityId],\n );\n }\n return executor.getAllAsync(\n `SELECT * FROM ${this.prefix}entries WHERE deleted_at IS NULL`,\n );\n }\n\n async findLatestSourceHash(entityId: string, sourceRef: string, tx?: SQLiteAdapter): Promise<string | null> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ source_hash: string | null }>(\n `SELECT source_hash FROM ${this.prefix}entries\n WHERE entity_id = ? AND source_ref = ? AND deleted_at IS NULL\n ORDER BY updated_at DESC, id ASC\n LIMIT 1`,\n [entityId, sourceRef],\n );\n return row?.source_hash ?? null;\n }\n\n /**\n * Batch version of {@link findLatestSourceHash}. Returns a Map covering every\n * requested ref, where the value is the source_hash from the row with the\n * most-recently-updated live fact for that ref, or null when no live row exists.\n *\n * The SQL uses ROW_NUMBER() OVER (PARTITION BY source_ref ORDER BY updated_at\n * DESC, id ASC) — NOT MAX(source_hash). Aggregation with MAX(source_hash) is\n * wrong because MAX computes independently across grouped rows; the hash must\n * come from the exact row that wins MAX(updated_at). The `id ASC` tie-break\n * keeps selection deterministic when two live rows share `updated_at`.\n *\n * Source refs are de-duplicated and processed in chunks so the per-query bind\n * parameter count stays under SQLite's `SQLITE_MAX_VARIABLE_NUMBER` (default\n * 999, leaving one slot for `entity_id`).\n *\n * Empty input is a synchronous early return with zero SQL calls.\n */\n async findLatestSourceHashes(\n entityId: string,\n sourceRefs: readonly string[],\n tx?: SQLiteAdapter,\n ): Promise<Map<string, string | null>> {\n const out = new Map<string, string | null>();\n if (sourceRefs.length === 0) return out;\n // Pre-populate with null for every requested ref so callers can distinguish\n // \"no live row\" (null) from \"row with a null source_hash\" (also null in this\n // shape, but at least the key is guaranteed present).\n const dedupedRefs = Array.from(new Set(sourceRefs));\n for (const ref of dedupedRefs) {\n out.set(ref, null);\n }\n const executor = this.getExecutor(tx);\n // 1 bind parameter for entity_id; remaining slots for source_ref placeholders.\n const chunkLimit = Math.max(1, this.chunkSize - 1);\n for (let i = 0; i < dedupedRefs.length; i += chunkLimit) {\n const chunk = dedupedRefs.slice(i, i + chunkLimit);\n const placeholders = chunk.map(() => '?').join(',');\n const rows = await executor.getAllAsync<{ source_ref: string; source_hash: string | null }>(\n `WITH ranked AS (\n SELECT source_ref, source_hash,\n ROW_NUMBER() OVER (\n PARTITION BY source_ref\n ORDER BY updated_at DESC, id ASC\n ) as rn\n FROM ${this.prefix}entries\n WHERE entity_id = ? AND source_ref IN (${placeholders}) AND deleted_at IS NULL\n )\n SELECT source_ref, source_hash\n FROM ranked\n WHERE rn = 1`,\n [entityId, ...chunk],\n );\n for (const r of rows) {\n out.set(r.source_ref, r.source_hash);\n }\n }\n return out;\n }\n\n /**\n * Per source ref, the hash of the latest live row (same ordering as\n * {@link findLatestSourceHashes}) and whether ANY live row carries a hash.\n * Refs with no live row are absent. Chunked under the bind-variable limit.\n */\n async findSourceStates(\n entityId: string,\n sourceRefs: readonly string[],\n tx?: SQLiteAdapter,\n ): Promise<Map<string, { latestHash: string | null; anyHashed: boolean }>> {\n const out = new Map<string, { latestHash: string | null; anyHashed: boolean }>();\n const deduped = Array.from(new Set(sourceRefs));\n if (deduped.length === 0) return out;\n const executor = this.getExecutor(tx);\n const chunkLimit = Math.max(1, this.chunkSize - 1);\n for (let i = 0; i < deduped.length; i += chunkLimit) {\n const chunk = deduped.slice(i, i + chunkLimit);\n const placeholders = chunk.map(() => '?').join(',');\n const rows = await executor.getAllAsync<{ source_ref: string; source_hash: string | null; any_hashed: number }>(\n `WITH ranked AS (\n SELECT source_ref, source_hash,\n ROW_NUMBER() OVER (PARTITION BY source_ref ORDER BY updated_at DESC, id ASC) AS rn,\n MAX(CASE WHEN source_hash IS NOT NULL THEN 1 ELSE 0 END) OVER (PARTITION BY source_ref) AS any_hashed\n FROM ${this.prefix}entries\n WHERE entity_id = ? AND source_ref IN (${placeholders}) AND deleted_at IS NULL\n )\n SELECT source_ref, source_hash, any_hashed FROM ranked WHERE rn = 1`,\n [entityId, ...chunk],\n );\n for (const r of rows) out.set(r.source_ref, { latestHash: r.source_hash, anyHashed: Number(r.any_hashed) === 1 });\n }\n return out;\n }\n\n /**\n * Return the live source_refs for an entity that hold the given source_hash.\n * Used by the ingestDocument duplicate-hash guard and by hosts auditing\n * duplicate-content collisions. Sorted `COLLATE BINARY` so the canonical\n * ref (the code-unit-minimum of the set) is stable across deploys.\n */\n async findSourceRefsByHash(\n entityId: string,\n sourceHash: string,\n tx?: SQLiteAdapter,\n ): Promise<string[]> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<{ source_ref: string }>(\n `SELECT source_ref FROM ${this.prefix}entries\n WHERE entity_id = ? AND source_hash = ? AND deleted_at IS NULL\n AND source_ref IS NOT NULL\n GROUP BY source_ref\n ORDER BY source_ref COLLATE BINARY`,\n [entityId, sourceHash],\n );\n return rows.map(r => r.source_ref);\n }\n\n /**\n * Per-sourceRef rollup for an entity: one row per live source_ref, with the\n * most-recently-updated live hash (NOT the lexically-max hash) and a live\n * fact count.\n *\n * The hash comes from the same row that wins ROW_NUMBER() over updated_at\n * DESC, so a ref with multiple live hashes (e.g. from import) reports the\n * latest one — matching single-doc `findLatestSourceHash` semantics.\n *\n * Sort is COLLATE BINARY: locale-dependent ordering re-mints identity on\n * every deploy, which is the bug this whole section exists to prevent.\n */\n async listSourceRefs(\n entityId: string,\n tx?: SQLiteAdapter,\n ): Promise<Array<{\n sourceRef: string;\n sourceHash: string | null;\n factCount: number;\n lastIngestedAt: number;\n }>> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<{\n source_ref: string;\n source_hash: string | null;\n fact_count: number;\n last_ingested_at: number;\n }>(\n `WITH ranked AS (\n SELECT source_ref, source_hash, updated_at,\n ROW_NUMBER() OVER (\n PARTITION BY source_ref\n ORDER BY updated_at DESC, id ASC\n ) AS rn,\n COUNT(*) OVER (PARTITION BY source_ref) AS fact_count\n FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL AND source_ref IS NOT NULL\n )\n SELECT source_ref,\n source_hash AS source_hash,\n fact_count AS fact_count,\n updated_at AS last_ingested_at\n FROM ranked\n WHERE rn = 1\n ORDER BY source_ref COLLATE BINARY`,\n [entityId],\n );\n return rows.map(r => ({\n sourceRef: r.source_ref,\n sourceHash: r.source_hash,\n factCount: Number(r.fact_count),\n lastIngestedAt: Number(r.last_ingested_at),\n }));\n }\n\n /**\n * Count live entries for an entity across all source_refs/source_hashes.\n * Used by forget({ dryRun, clearAll: true }).\n */\n async countLiveByEntityId(entityId: string, tx?: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ cnt: number }>(\n `SELECT COUNT(*) AS cnt FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL`,\n [entityId],\n );\n return row?.cnt ?? 0;\n }\n\n /**\n * Count live entries matching a source filter (either or both may be null).\n * Used by forget({ dryRun: true }) with sourceRef/sourceHash.\n */\n async countLiveBySource(\n entityId: string,\n sourceRef: string | null,\n sourceHash: string | null,\n tx?: SQLiteAdapter,\n ): Promise<number> {\n const executor = this.getExecutor(tx);\n let q = `SELECT COUNT(*) AS cnt FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL`;\n const args: unknown[] = [entityId];\n if (sourceRef !== null) { q += ` AND source_ref = ?`; args.push(sourceRef); }\n if (sourceHash !== null) { q += ` AND source_hash = ?`; args.push(sourceHash); }\n const row = await executor.getFirstAsync<{ cnt: number }>(q, args);\n return row?.cnt ?? 0;\n }\n\n async findMetadataByIds(ids: readonly string[], tx?: SQLiteAdapter): Promise<EntryRowMetadata[]> {\n if (ids.length === 0) return [];\n const executor = this.getExecutor(tx);\n const rows: EntryRowMetadata[] = [];\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n const chunkRows = await executor.getAllAsync<EntryRowMetadata>(\n `SELECT id, entity_id, updated_at, access_count FROM ${this.prefix}entries WHERE id IN (${placeholders}) AND deleted_at IS NULL`,\n chunk,\n );\n rows.push(...chunkRows);\n }\n return rows;\n }\n\n async findWithEmbeddingsByIds(ids: readonly string[], tx?: SQLiteAdapter): Promise<EntryRowWithEmbeddings[]> {\n if (ids.length === 0) return [];\n const executor = this.getExecutor(tx);\n const rows: EntryRowWithEmbeddings[] = [];\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n const chunkRows = await executor.getAllAsync<EntryRowWithEmbeddings>(\n `SELECT id, entity_id, embedding_blob, embedding, updated_at, access_count FROM ${this.prefix}entries WHERE id IN (${placeholders}) AND deleted_at IS NULL`,\n chunk,\n );\n rows.push(...chunkRows);\n }\n return rows;\n }\n\n async findMetadataByEntityIds(entityIds: readonly string[], tx?: SQLiteAdapter): Promise<EntryRowMetadata[]> {\n if (entityIds.length === 0) return [];\n const executor = this.getExecutor(tx);\n const placeholders = entityIds.map(() => '?').join(',');\n return executor.getAllAsync<EntryRowMetadata>(\n `SELECT id, entity_id, updated_at, access_count FROM ${this.prefix}entries WHERE entity_id IN (${placeholders}) AND deleted_at IS NULL`,\n [...entityIds],\n );\n }\n\n async findWithEmbeddingsByEntityIds(entityIds: readonly string[], tx?: SQLiteAdapter): Promise<EntryRowWithEmbeddings[]> {\n if (entityIds.length === 0) return [];\n const executor = this.getExecutor(tx);\n const placeholders = entityIds.map(() => '?').join(',');\n return executor.getAllAsync<EntryRowWithEmbeddings>(\n `SELECT id, entity_id, embedding_blob, embedding, updated_at, access_count FROM ${this.prefix}entries WHERE entity_id IN (${placeholders}) AND deleted_at IS NULL`,\n [...entityIds],\n );\n }\n\n async findEmbeddingsByIds(\n ids: readonly string[],\n tx?: SQLiteAdapter,\n ): Promise<Array<{ id: string; embedding_blob: Uint8Array | null; embedding: string | null }>> {\n if (ids.length === 0) return [];\n const executor = this.getExecutor(tx);\n const rows: Array<{ id: string; embedding_blob: Uint8Array | null; embedding: string | null }> = [];\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n const chunkRows = await executor.getAllAsync<{ id: string; embedding_blob: Uint8Array | null; embedding: string | null }>(\n `SELECT id, embedding_blob, embedding FROM ${this.prefix}entries WHERE id IN (${placeholders}) AND deleted_at IS NULL`,\n chunk,\n );\n rows.push(...chunkRows);\n }\n return rows;\n }\n\n async trackAccess(ids: readonly string[], now: number, tx?: SQLiteAdapter): Promise<void> {\n if (ids.length === 0) return;\n const executor = this.getExecutor(tx);\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n await executor.runAsync(\n `UPDATE ${this.prefix}entries SET access_count = access_count + 1, last_accessed_at = ? WHERE id IN (${placeholders})`,\n [now, ...chunk],\n );\n }\n }\n\n getLegacyMigrationSQL(): string {\n return [\n `-- Migrate legacy source_type values (targets your WikiMemory prefix: ${this.prefix})`,\n `UPDATE ${this.prefix}entries SET source_type = 'immutable_document' WHERE source_type = 'user_document';`,\n `UPDATE ${this.prefix}entries SET source_type = 'librarian_inferred' WHERE source_type = 'agent_inferred';`,\n ].join('\\n');\n }\n\n async findRecentByEntityIds(\n entityIds: readonly string[],\n limit: number,\n tx?: SQLiteAdapter,\n opts?: { excludeDrafts?: boolean; live?: { mode: LiveMode; t: number } },\n ): Promise<WikiFact[]> {\n if (entityIds.length === 0) return [];\n const executor = this.getExecutor(tx);\n const placeholders = entityIds.map(() => '?').join(',');\n const draftClause = opts?.excludeDrafts === true ? ` AND lifecycle_status != 'draft'` : '';\n const liveClause = opts?.live ? ` AND ${liveAtSql(opts.live.mode)}` : '';\n const liveArgs = opts?.live ? [opts.live.t, opts.live.t] : [];\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}entries WHERE entity_id IN (${placeholders}) AND deleted_at IS NULL${draftClause}${liveClause} ORDER BY updated_at DESC LIMIT ?`,\n [...entityIds, ...liveArgs, limit],\n );\n return rows.map(mapRowToFact);\n }\n\n /** IDs of live draft facts for the given entities (spec §5.1). Callers pass ≤ 100 entity ids. */\n async findDraftIdsByEntityIds(entityIds: readonly string[], tx?: SQLiteAdapter): Promise<Set<string>> {\n if (entityIds.length === 0) return new Set();\n const executor = this.getExecutor(tx);\n const placeholders = entityIds.map(() => '?').join(',');\n const rows = await executor.getAllAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}entries\n WHERE entity_id IN (${placeholders}) AND deleted_at IS NULL AND lifecycle_status = 'draft'`,\n [...entityIds],\n );\n return new Set(rows.map((r) => r.id));\n }\n\n /** Live drafts for one entity, newest first, keyset-paged by (created_at, id). */\n async listDraftsByEntityId(\n entityId: string,\n limit: number,\n after: { createdAt: number; id: string } | null,\n tx?: SQLiteAdapter,\n ): Promise<WikiFact[]> {\n const executor = this.getExecutor(tx);\n const afterClause = after ? ` AND (created_at < ? OR (created_at = ? AND id < ?))` : '';\n const args: unknown[] = after\n ? [entityId, after.createdAt, after.createdAt, after.id, limit]\n : [entityId, limit];\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL AND lifecycle_status = 'draft'${afterClause}\n ORDER BY created_at DESC, id DESC LIMIT ?`,\n args,\n );\n return rows.map(mapRowToFact);\n }\n\n /** True iff `entryId` is a live draft owned by `entityId`. */\n async isLiveDraft(entryId: string, entityId: string, tx?: SQLiteAdapter): Promise<boolean> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}entries\n WHERE id = ? AND entity_id = ? AND deleted_at IS NULL AND lifecycle_status = 'draft'`,\n [entryId, entityId],\n );\n return row != null;\n }\n\n /**\n * Live untyped facts eligible for ontology backfill, oldest first.\n * Skips facts checked within the recheck cooldown (ontology_checked_at > recheckCutoff).\n */\n async findUntypedByEntityId(entityId: string, limit: number, recheckCutoff: number, tx?: SQLiteAdapter): Promise<WikiFact[]> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}entries\n WHERE entity_id = ? AND okf_type IS NULL AND deleted_at IS NULL\n AND (ontology_checked_at IS NULL OR ontology_checked_at <= ?)\n ORDER BY updated_at ASC LIMIT ?`,\n [entityId, recheckCutoff, limit],\n );\n return rows.map(mapRowToFact);\n }\n\n /** Counts live untyped facts: eligible (past cooldown) vs deferred (in cooldown). */\n async countUntypedByEntityId(entityId: string, recheckCutoff: number, tx?: SQLiteAdapter): Promise<{ eligible: number; deferred: number }> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ eligible: number | null; deferred: number | null }>(\n `SELECT\n SUM(CASE WHEN ontology_checked_at IS NULL OR ontology_checked_at <= ? THEN 1 ELSE 0 END) AS eligible,\n SUM(CASE WHEN ontology_checked_at IS NOT NULL AND ontology_checked_at > ? THEN 1 ELSE 0 END) AS deferred\n FROM ${this.prefix}entries\n WHERE entity_id = ? AND okf_type IS NULL AND deleted_at IS NULL`,\n [recheckCutoff, recheckCutoff, entityId],\n );\n return { eligible: Number(row?.eligible ?? 0), deferred: Number(row?.deferred ?? 0) };\n }\n\n /**\n * Sets okf_type only when currently NULL — additive by construction: a\n * concurrently-typed fact is never overwritten. Returns changes for the caller\n * to distinguish applied vs skipped.\n */\n async updateOkfType(id: string, entityId: string, okfType: string, tx: SQLiteAdapter): Promise<{ changes: number }> {\n const result = await tx.runAsync(\n `UPDATE ${this.prefix}entries SET okf_type = ?\n WHERE id = ? AND entity_id = ? AND okf_type IS NULL AND deleted_at IS NULL`,\n [okfType, id, entityId],\n );\n return { changes: result.changes };\n }\n\n /**\n * Stamps the backfill recheck cooldown. NEVER touches updated_at — import\n * merge resolution is last-write-wins on updated_at and a bump here would\n * make an unchanged local fact beat a genuinely newer remote edit.\n */\n async markOntologyChecked(ids: string[], entityId: string, now: number, tx: SQLiteAdapter): Promise<void> {\n if (ids.length === 0) return;\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n await tx.runAsync(\n `UPDATE ${this.prefix}entries SET ontology_checked_at = ?\n WHERE id IN (${placeholders}) AND entity_id = ? AND deleted_at IS NULL`,\n [now, ...chunk, entityId],\n );\n }\n }\n\n /**\n * Lightweight full-breadth title index (id, title, okf_type) over all live\n * typed facts. Used by ontology backfill edge resolution — a recent-N window\n * would miss an old fact's contemporaries. Untyped rows are excluded: they\n * can never pass the edge target-type check, and batch facts typed during\n * the run are re-added to the in-memory index by the caller.\n */\n async findTitleIndexByEntityId(entityId: string, tx?: SQLiteAdapter): Promise<Array<{ id: string; title: string; okf_type: string | null }>> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<{ id: string; title: string; okf_type: string | null }>(\n `SELECT id, title, okf_type FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL AND okf_type IS NOT NULL`,\n [entityId],\n );\n return rows.map(r => ({ id: r.id, title: r.title, okf_type: r.okf_type ?? null }));\n }\n\n /** Counts live mutable facts: eligible (past cooldown) vs deferred (in cooldown). */\n async countHealCandidatesByEntityId(\n entityId: string,\n recheckCutoff: number,\n tx?: SQLiteAdapter,\n ): Promise<{ eligible: number; deferred: number }> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const row = await executor.getFirstAsync<{ eligible: number | null; deferred: number | null }>(\n `SELECT\n SUM(CASE WHEN heal_checked_at IS NULL OR heal_checked_at <= ? THEN 1 ELSE 0 END) AS eligible,\n SUM(CASE WHEN heal_checked_at IS NOT NULL AND heal_checked_at > ? THEN 1 ELSE 0 END) AS deferred\n FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL AND source_type != 'immutable_document'\n AND ${liveAtSql('current')}`,\n [recheckCutoff, recheckCutoff, entityId, now, now],\n );\n return { eligible: Number(row?.eligible ?? 0), deferred: Number(row?.deferred ?? 0) };\n }\n\n /**\n * Stamps the heal recheck cooldown. NEVER touches updated_at — import merge\n * resolution is last-write-wins on updated_at and a bump here would make an\n * unchanged local fact beat a genuinely newer remote edit.\n *\n * Soft-deleted rows are skipped: a candidate heal deleted earlier in the same\n * transaction is no longer a candidate under any future pass, so its cooldown\n * value is irrelevant. This means the stamped count can be lower than the\n * offered-candidate count.\n */\n async markHealChecked(ids: string[], entityId: string, now: number, tx: SQLiteAdapter): Promise<void> {\n if (ids.length === 0) return;\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n await tx.runAsync(\n `UPDATE ${this.prefix}entries SET heal_checked_at = ?\n WHERE id IN (${placeholders}) AND entity_id = ? AND deleted_at IS NULL`,\n [now, ...chunk, entityId],\n );\n }\n }\n\n /**\n * Lightweight full-breadth index (id, title) over all live librarian_inferred\n * facts. This is heal's fuzzy-dedupe corpus, deliberately kept independent of\n * the bounded candidate window: seeding dedupe from a batchSize-limited read\n * would let a synthesized fact duplicating a fact outside the window pass the\n * Jaccard check, and a convergence loop would multiply those duplicates across\n * passes. Mirrors findTitleIndexByEntityId — full breadth, two columns, cheap.\n */\n async findInferredTitlesByEntityId(\n entityId: string,\n tx?: SQLiteAdapter,\n ): Promise<Array<{ id: string; title: string }>> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<{ id: string; title: string }>(\n `SELECT id, title FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL AND source_type = 'librarian_inferred'`,\n [entityId],\n );\n return rows.map(r => ({ id: r.id, title: r.title }));\n }\n\n /**\n * Count of live facts for `entityId` with no stored embedding that are still\n * retryable (`embedding_attempts < maxAttempts`). Backs the deferred\n * maintenance pending report's `reembedPending` flag and the reembed job's\n * entity selection (PR-C 2026-09-29).\n */\n async countReembedPending(entityId: string, maxAttempts: number, tx?: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ n: number }>(\n `SELECT COUNT(*) AS n FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL AND embedding_blob IS NULL AND embedding IS NULL AND embedding_attempts < ?`,\n [entityId, maxAttempts],\n );\n return Number(row?.n ?? 0);\n }\n}\n","import { BaseRepository } from './BaseRepository';\nimport type { SQLiteAdapter } from '../types';\nimport { generateId } from '../utils/ids';\n\nexport class OutboxRepository extends BaseRepository {\n private enableOutbox: boolean;\n\n constructor(db: SQLiteAdapter, prefix: string, enableOutbox = false) {\n super(db, prefix);\n this.enableOutbox = enableOutbox;\n }\n\n /**\n * Insert a new outbox event within the provided transaction.\n * No-op when enableOutbox is false.\n * `tx` is required — callers must always pass the active transaction\n * so the write is atomic with the main table mutation.\n */\n async push(\n params: {\n entityId: string;\n tableName: string;\n recordId: string;\n operation: 'INSERT' | 'UPDATE' | 'DELETE';\n payload: any;\n },\n tx: SQLiteAdapter,\n ): Promise<void> {\n if (!this.enableOutbox) return;\n const executor = this.getExecutor(tx);\n const id = generateId('out_');\n const now = Date.now();\n await executor.runAsync(\n `INSERT INTO ${this.prefix}outbox (id, entity_id, table_name, record_id, operation, payload, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n [id, params.entityId, params.tableName, params.recordId, params.operation, JSON.stringify(params.payload), now],\n );\n }\n\n /**\n * Fetch pending outbox rows ordered by created_at ASC, rowid ASC.\n * Reads directly from `this.db` (not a transaction).\n */\n async fetchPending(limit = 50): Promise<any[]> {\n return this.db.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}outbox ORDER BY created_at ASC, rowid ASC LIMIT ?`,\n [limit],\n );\n }\n\n /**\n * Delete acknowledged outbox rows by their IDs.\n * No-op when `ids` is empty.\n * Deletes directly from `this.db` (not a transaction).\n */\n async acknowledge(ids: string[]): Promise<void> {\n if (ids.length === 0) return;\n const chunkSize = 500;\n for (let i = 0; i < ids.length; i += chunkSize) {\n const chunk = ids.slice(i, i + chunkSize);\n const placeholders = chunk.map(() => '?').join(', ');\n await this.db.runAsync(\n `DELETE FROM ${this.prefix}outbox WHERE id IN (${placeholders})`,\n chunk,\n );\n }\n }\n}\n","import type { SQLiteAdapter } from '../types';\nimport { BaseRepository } from './BaseRepository';\nimport { generateId } from '../utils/ids';\n\n/**\n * Per-(entity_id, source_hash) record of the canonical sourceRef currently\n * holding that hash. The partial UNIQUE index on (entity_id, source_hash)\n * WHERE deleted_at IS NULL enforces the sourceRef-level TOCTOU-race invariant\n * for the #79 fix. See\n * docs/superpowers/specs/2026-08-07-dependabot-concurrency-release-hygiene-design.md §B1.\n *\n * The entries table cannot express this invariant directly because a single\n * `ingestDocument` call writes N facts that all share\n * (entity_id, source_ref, source_hash); a UNIQUE index on\n * `entries(entity_id, source_hash)` would block the 2nd–Nth fact inserts in\n * the normal multi-fact path. The per-(entity, hash) granularity of\n * source_ref_index matches the TOCTOU invariant exactly.\n *\n * No outbox events: this is an internal index table whose state is fully\n * derivable from `entries`. Hosts that need CDC continue to read `entries`\n * outbox events; the index is not part of the user-visible contract.\n */\nexport class SourceRefIndexRepository extends BaseRepository {\n /**\n * Idempotent insert: the partial UNIQUE index catches concurrent inserts for\n * the same (entity_id, source_hash). The caller (IngestionService) catches\n * the resulting SQLITE_CONSTRAINT_UNIQUE and translates it to the per-mode\n * duplicate-hash outcome. Runtime IDs use the `sri_` prefix to avoid\n * collision with the deterministic `sri:<entity>:<hash>` IDs used by the v9\n * backfill (the colon separator keeps the two ID spaces disjoint).\n */\n async upsert(\n entityId: string,\n sourceHash: string,\n sourceRef: string,\n tx: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `INSERT INTO ${this.prefix}source_ref_index (id, entity_id, source_hash, source_ref, created_at, deleted_at)\n VALUES (?, ?, ?, ?, ?, NULL)`,\n [generateId('sri_'), entityId, sourceHash, sourceRef, Date.now()],\n );\n }\n\n /**\n * Idempotent soft-delete of the live row for (entity_id, source_ref).\n * Called at the start of every ingestDocument to remove the prior run's\n * index row, so the new upsert doesn't collide with itself. No-op when the\n * row is already soft-deleted or never existed.\n */\n async softDeleteByEntityAndSourceRef(\n entityId: string,\n sourceRef: string,\n tx: SQLiteAdapter,\n ): Promise<number> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const result = await executor.runAsync(\n `UPDATE ${this.prefix}source_ref_index\n SET deleted_at = ?, created_at = ?\n WHERE entity_id = ? AND source_ref = ? AND deleted_at IS NULL`,\n [now, now, entityId, sourceRef],\n );\n return result.changes;\n }\n\n /**\n * Returns the live sourceRef holding the given hash, or null when no live\n * row exists. Used by the IngestionService pre-check (line 82) and the\n * catch-and-translate canonical lookup (line 212).\n */\n async findActiveByEntityAndHash(\n entityId: string,\n sourceHash: string,\n tx?: SQLiteAdapter,\n ): Promise<string | null> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ source_ref: string }>(\n `SELECT source_ref FROM ${this.prefix}source_ref_index\n WHERE entity_id = ? AND source_hash = ? AND deleted_at IS NULL`,\n [entityId, sourceHash],\n );\n return row?.source_ref ?? null;\n }\n}\n","import { BaseRepository } from './BaseRepository';\nimport { OutboxRepository } from './OutboxRepository';\nimport type { WikiTask, SQLiteAdapter } from '../types';\nimport { parseJsonArray, parseJsonObject } from './rowMappers';\nimport { isStaleAfter, deriveTrustTier } from '@equationalapplications/core-okf';\n\nfunction mapRowToTask(row: any): WikiTask {\n const okf_verified = parseJsonArray<NonNullable<WikiTask['okf_verified']>[number]>(row.okf_verified, []);\n // Mirror EntryRepository.mapRowToFact — see that file for the rationale on\n // per-row Date.now() sampling vs. a shared per-call value.\n const now = Date.now();\n const staleAfterRaw = row.stale_after != null ? Number(row.stale_after) : null;\n\n return {\n id: row.id,\n entity_id: row.entity_id,\n description: row.description,\n status: row.status,\n priority: Number(row.priority),\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n resolved_at: row.resolved_at != null ? Number(row.resolved_at) : null,\n deleted_at: row.deleted_at != null ? Number(row.deleted_at) : null,\n okf_type: row.okf_type ?? null,\n // OKF v0.2\n lifecycle_status: (row.lifecycle_status ?? 'stable') as WikiTask['lifecycle_status'],\n stale_after: staleAfterRaw,\n generated_by: row.generated_by ?? null,\n okf_sources: parseJsonArray<NonNullable<WikiTask['okf_sources']>[number]>(row.okf_sources, []),\n okf_verified,\n okf_usage_window: parseJsonObject<NonNullable<WikiTask['okf_usage_window']>>(row.okf_usage_window),\n last_verified_at: row.last_verified_at != null ? Number(row.last_verified_at) : null,\n last_verified_by: row.last_verified_by ?? null,\n // Spec §2.7 + §5.3: hydrate so read() consumers don't re-call the helpers.\n isStale: isStaleAfter(staleAfterRaw, now),\n trustTier: deriveTrustTier(okf_verified),\n };\n}\n\nexport class TaskRepository extends BaseRepository {\n constructor(\n db: SQLiteAdapter,\n prefix: string,\n private outbox: OutboxRepository,\n ) {\n super(db, prefix);\n }\n\n /**\n * Fetch a single task by ID. Returns null if not found or soft-deleted.\n */\n async findById(id: string): Promise<WikiTask | null> {\n const row = await this.db.getFirstAsync<any>(\n `SELECT * FROM ${this.prefix}tasks WHERE id = ? AND deleted_at IS NULL`,\n [id],\n );\n return row ? mapRowToTask(row) : null;\n }\n\n /**\n * Fetch all pending/in_progress tasks for the given entity IDs.\n * Returns empty array when entityIds is empty.\n */\n async findAllPending(entityIds: string[], limit?: number): Promise<WikiTask[]> {\n if (entityIds.length === 0) return [];\n const placeholders = entityIds.map(() => '?').join(', ');\n const sql =\n `SELECT * FROM ${this.prefix}tasks ` +\n `WHERE entity_id IN (${placeholders}) AND status IN ('pending', 'in_progress') AND deleted_at IS NULL ` +\n `ORDER BY priority DESC, created_at ASC` +\n (limit != null ? ` LIMIT ?` : '');\n const params: unknown[] = limit != null ? [...entityIds, limit] : [...entityIds];\n const rows = await this.db.getAllAsync<any>(sql, params);\n return rows.map(mapRowToTask);\n }\n\n async findExistingMetadataByIds(\n ids: readonly string[],\n tx?: SQLiteAdapter,\n ): Promise<Array<{ id: string; entity_id: string; updated_at: number }>> {\n const executor = this.getExecutor(tx);\n const rows: Array<{ id: string; entity_id: string; updated_at: number }> = [];\n const chunkSize = 500;\n for (let i = 0; i < ids.length; i += chunkSize) {\n const chunk = ids.slice(i, i + chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n const chunkRows = await executor.getAllAsync<any>(\n `SELECT id, entity_id, updated_at FROM ${this.prefix}tasks WHERE id IN (${placeholders})`,\n chunk,\n );\n rows.push(...chunkRows.map((row) => ({ id: row.id, entity_id: row.entity_id, updated_at: Number(row.updated_at) })));\n }\n return rows;\n }\n\n /**\n * Upsert a WikiTask within the provided transaction.\n * Uses ON CONFLICT(id) DO UPDATE (not INSERT OR REPLACE).\n * Stages an outbox entry in the same transaction.\n * `tx` is REQUIRED.\n *\n * OKF metadata (lifecycle_status, sources, etc.) is intentionally excluded\n * from the SET clause so content writes preserve any existing row values.\n * See {@link EntryRepository.upsert} for the rationale — the same applies\n * symmetrically to tasks (spec §2.5). Callers that need to overwrite OKF\n * metadata should use {@link upsertForImport}.\n */\n async upsert(task: WikiTask, tx: SQLiteAdapter, updatedAt?: number): Promise<void> {\n const executor = this.getExecutor(tx);\n const now = Number.isFinite(updatedAt) ? updatedAt : Date.now();\n\n const existingRow = await executor.getFirstAsync<{\n id: string;\n lifecycle_status: string;\n stale_after: number | null;\n generated_by: string | null;\n okf_sources: string | null;\n okf_verified: string | null;\n okf_usage_window: string | null;\n last_verified_at: number | null;\n last_verified_by: string | null;\n }>(\n `SELECT id, lifecycle_status, stale_after, generated_by,\n okf_sources, okf_verified, okf_usage_window,\n last_verified_at, last_verified_by\n FROM ${this.prefix}tasks WHERE id = ?`,\n [task.id],\n );\n const operation = task.deleted_at != null ? 'DELETE' : (existingRow ? 'UPDATE' : 'INSERT');\n\n await executor.runAsync(\n `INSERT INTO ${this.prefix}tasks (\n id, entity_id, description, status, priority,\n created_at, updated_at, resolved_at, deleted_at,\n lifecycle_status, stale_after, generated_by, last_verified_at, last_verified_by,\n okf_sources, okf_verified, okf_usage_window\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n entity_id = excluded.entity_id,\n description = excluded.description,\n status = excluded.status,\n priority = excluded.priority,\n updated_at = excluded.updated_at,\n resolved_at = excluded.resolved_at,\n deleted_at = excluded.deleted_at`,\n [\n task.id,\n task.entity_id,\n task.description,\n task.status,\n task.priority,\n task.created_at,\n now, // updated_at set by repo or import override\n task.resolved_at ?? null,\n task.deleted_at ?? null,\n // OKF v0.2 metadata — bound for INSERT only; ON CONFLICT UPDATE\n // preserves the existing row values (these columns are intentionally\n // absent from the SET clause above).\n task.lifecycle_status ?? 'stable',\n task.stale_after ?? null,\n task.generated_by ?? null,\n task.last_verified_at ?? null,\n task.last_verified_by ?? null,\n task.okf_sources ? JSON.stringify(task.okf_sources) : null,\n task.okf_verified ? JSON.stringify(task.okf_verified) : null,\n task.okf_usage_window ? JSON.stringify(task.okf_usage_window) : null,\n ],\n );\n\n // Outbox payload mirrors what is actually persisted. On UPDATE, the SET\n // clause intentionally omits OKF metadata so prior row values win, but\n // the caller-supplied `task` would still describe state we did NOT write.\n // Re-read those columns from the stored row and overlay them onto the\n // caller-supplied payload before publishing (#90 review).\n const persistedOkf = existingRow\n ? {\n lifecycle_status: (existingRow.lifecycle_status ?? 'stable') as WikiTask['lifecycle_status'],\n stale_after: existingRow.stale_after != null ? Number(existingRow.stale_after) : null,\n generated_by: existingRow.generated_by ?? null,\n okf_sources: parseJsonArray<NonNullable<WikiTask['okf_sources']>[number]>(existingRow.okf_sources, []),\n okf_verified: parseJsonArray<NonNullable<WikiTask['okf_verified']>[number]>(existingRow.okf_verified, []),\n okf_usage_window: parseJsonObject<NonNullable<WikiTask['okf_usage_window']>>(existingRow.okf_usage_window),\n last_verified_at: existingRow.last_verified_at != null ? Number(existingRow.last_verified_at) : null,\n last_verified_by: existingRow.last_verified_by ?? null,\n }\n : null;\n await this.outbox.push(\n {\n entityId: task.entity_id,\n tableName: 'tasks',\n recordId: task.id,\n operation,\n payload: persistedOkf ? { ...task, ...persistedOkf } : task,\n },\n tx,\n );\n }\n\n async upsertForImport(task: WikiTask, tx: SQLiteAdapter, updatedAt?: number): Promise<void> {\n const executor = this.getExecutor(tx);\n const now = Number.isFinite(updatedAt) ? updatedAt : Date.now();\n\n // Import is replace semantics, mirroring EntryRepository.upsertForImport.\n // Dump is authoritative: a re-import that cleared stale_after, generated_by,\n // or verification mirrors must overwrite, not preserve.\n await executor.runAsync(\n `INSERT INTO ${this.prefix}tasks (\n id, entity_id, description, status, priority,\n created_at, updated_at, resolved_at, deleted_at, okf_type,\n lifecycle_status, stale_after, generated_by, last_verified_at, last_verified_by,\n okf_sources, okf_verified, okf_usage_window\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n entity_id = excluded.entity_id,\n description = excluded.description,\n status = excluded.status,\n priority = excluded.priority,\n updated_at = excluded.updated_at,\n resolved_at = excluded.resolved_at,\n deleted_at = excluded.deleted_at,\n okf_type = excluded.okf_type,\n lifecycle_status = excluded.lifecycle_status,\n stale_after = excluded.stale_after,\n generated_by = excluded.generated_by,\n last_verified_at = excluded.last_verified_at,\n last_verified_by = excluded.last_verified_by,\n okf_sources = excluded.okf_sources,\n okf_verified = excluded.okf_verified,\n okf_usage_window = excluded.okf_usage_window`,\n [\n task.id,\n task.entity_id,\n task.description,\n task.status,\n task.priority,\n task.created_at,\n now,\n task.resolved_at ?? null,\n task.deleted_at ?? null,\n task.okf_type ?? null,\n task.lifecycle_status ?? 'stable',\n task.stale_after ?? null,\n task.generated_by ?? null,\n task.last_verified_at ?? null,\n task.last_verified_by ?? null,\n task.okf_sources ? JSON.stringify(task.okf_sources) : null,\n task.okf_verified ? JSON.stringify(task.okf_verified) : null,\n task.okf_usage_window ? JSON.stringify(task.okf_usage_window) : null,\n ],\n );\n }\n\n /**\n * Soft-delete a task by ID. Sets deleted_at and updated_at.\n * Stages a DELETE outbox entry in the same transaction.\n * `tx` is REQUIRED.\n */\n async softDelete(id: string, entityId: string, tx: SQLiteAdapter): Promise<void> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n await executor.runAsync(\n `UPDATE ${this.prefix}tasks SET deleted_at = ?, updated_at = ? WHERE id = ? AND entity_id = ? AND deleted_at IS NULL`,\n [now, now, id, entityId],\n );\n await this.outbox.push(\n {\n entityId,\n tableName: 'tasks',\n recordId: id,\n operation: 'DELETE',\n payload: { id, entity_id: entityId, deleted_at: now },\n },\n tx,\n );\n }\n\n /**\n * Fetch all non-deleted tasks for an entity, ordered by priority DESC, created_at ASC.\n * Used by _getFullBundle().\n */\n async findAllByEntityId(entityId: string, tx?: SQLiteAdapter): Promise<WikiTask[]> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}tasks WHERE entity_id = ? AND deleted_at IS NULL ORDER BY priority DESC, created_at ASC`,\n [entityId],\n );\n return rows.map(mapRowToTask);\n }\n\n /**\n * Bulk delete pruned tasks (already soft-deleted) by cutoff date.\n * Used by runPrune(). Returns number of deleted rows.\n */\n async bulkDeletePruned(\n entityId: string,\n cutoff: number,\n tx: SQLiteAdapter,\n ): Promise<number> {\n const executor = this.getExecutor(tx);\n const rowsToDelete = await executor.getAllAsync<{ id: string; deleted_at: number }>(\n `SELECT id, deleted_at FROM ${this.prefix}tasks WHERE entity_id = ? AND deleted_at IS NOT NULL AND deleted_at <= ?`,\n [entityId, cutoff],\n );\n if (rowsToDelete.length === 0) return 0;\n\n const result = await executor.runAsync(\n `DELETE FROM ${this.prefix}tasks WHERE entity_id = ? AND deleted_at IS NOT NULL AND deleted_at <= ?`,\n [entityId, cutoff],\n );\n\n for (const row of rowsToDelete) {\n await this.outbox.push(\n {\n entityId,\n tableName: 'tasks',\n recordId: row.id,\n operation: 'DELETE',\n payload: { id: row.id, entity_id: entityId, deleted_at: row.deleted_at },\n },\n tx,\n );\n }\n\n return result.changes;\n }\n\n /**\n * Soft-delete a task by ID within a transaction.\n * Stages a DELETE outbox entry in the same transaction.\n * `tx` is REQUIRED.\n */\n async softDeleteById(\n id: string,\n entityId: string,\n tx: SQLiteAdapter,\n ): Promise<{ changes: number }> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const result = await executor.runAsync(\n `UPDATE ${this.prefix}tasks SET deleted_at = ?, updated_at = ? WHERE id = ? AND entity_id = ? AND deleted_at IS NULL`,\n [now, now, id, entityId],\n );\n if (result.changes > 0) {\n await this.outbox.push(\n {\n entityId,\n tableName: 'tasks',\n recordId: id,\n operation: 'DELETE',\n payload: { id, entity_id: entityId, deleted_at: now },\n },\n tx,\n );\n }\n return result;\n }\n\n /**\n * Bulk soft-delete all tasks for an entity.\n * Stages DELETE outbox entries for each row in the same transaction.\n * `tx` is REQUIRED.\n */\n async bulkSoftDeleteByEntityId(entityId: string, tx: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n // Get IDs before updating for outbox staging\n const idsToDelete = await executor.getAllAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}tasks WHERE entity_id = ? AND deleted_at IS NULL`,\n [entityId],\n );\n const result = await executor.runAsync(\n `UPDATE ${this.prefix}tasks SET deleted_at = ?, updated_at = ? WHERE entity_id = ? AND deleted_at IS NULL`,\n [now, now, entityId],\n );\n // Stage outbox entries for each deleted record\n for (const row of idsToDelete) {\n await this.outbox.push({\n entityId,\n tableName: 'tasks',\n recordId: row.id,\n operation: 'DELETE',\n payload: { id: row.id, entity_id: entityId, deleted_at: now },\n }, tx);\n }\n return result.changes;\n }\n\n /**\n * Count live tasks for an entity. Used by forget({ dryRun, clearAll: true }).\n */\n async countLiveByEntityId(entityId: string, tx?: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ cnt: number }>(\n `SELECT COUNT(*) AS cnt FROM ${this.prefix}tasks\n WHERE entity_id = ? AND deleted_at IS NULL`,\n [entityId],\n );\n return row?.cnt ?? 0;\n }\n}\n","import { BaseRepository } from './BaseRepository';\nimport type { WikiEvent, SQLiteAdapter } from '../types';\nimport type { LibrarianWatermark } from './MetadataRepository';\n\n/**\n * Strict-after predicate on the (created_at, id) ordering used by the\n * op-based librarian (spec 2026-09-29 §4.1). Three placeholders: `[at, at, id]`.\n */\nexport const AFTER_SQL = '((created_at > ?) OR (created_at = ? AND id > ?))';\n\nexport function afterArgs(wm: LibrarianWatermark): [number, number, string] {\n return [wm.at, wm.at, wm.id];\n}\n\n/**\n * Map a row from the `events` table to the `WikiEvent` shape returned to\n * callers. `occurred_at` is dropped when NULL so legacy librarian prompt\n * bytes are unchanged for the (current default) case where no caller has\n * supplied a real-world timestamp.\n */\nfunction mapEvent(row: WikiEvent): WikiEvent {\n if (row.occurred_at == null) {\n const rest: WikiEvent = { ...row };\n delete (rest as { occurred_at?: number | null }).occurred_at;\n return rest;\n }\n return row;\n}\n\nexport class EventRepository extends BaseRepository {\n /**\n * Insert a new event row.\n * Pass `tx` to participate in a caller-owned transaction; omit to run against the default db.\n */\n async add(event: WikiEvent, tx?: SQLiteAdapter): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `INSERT INTO ${this.prefix}events (id, entity_id, event_type, summary, related_entry_id, created_at, occurred_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n [\n event.id,\n event.entity_id,\n event.event_type,\n event.summary,\n event.related_entry_id ?? null,\n event.created_at,\n event.occurred_at ?? null,\n ],\n );\n }\n\n async addIgnoreDuplicate(event: WikiEvent, tx?: SQLiteAdapter): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `INSERT OR IGNORE INTO ${this.prefix}events (id, entity_id, event_type, summary, related_entry_id, created_at, occurred_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n [\n event.id,\n event.entity_id,\n event.event_type,\n event.summary,\n event.related_entry_id ?? null,\n event.created_at,\n event.occurred_at ?? null,\n ],\n );\n }\n\n /**\n * Return the most recent events for an entity, newest first.\n * Defaults to a limit of 50.\n */\n async getRecent(entityId: string, limit = 50): Promise<WikiEvent[]> {\n const rows = await this.db.getAllAsync<WikiEvent>(\n `SELECT * FROM ${this.prefix}events WHERE entity_id = ? ORDER BY created_at DESC LIMIT ?`,\n [entityId, limit],\n );\n return rows.map(mapEvent);\n }\n\n /**\n * Return the most recent events for the given entity IDs, newest first.\n * Defaults to a limit of 50.\n */\n async getRecentForEntities(entityIds: string[], limit = 50): Promise<WikiEvent[]> {\n if (entityIds.length === 0) return [];\n const placeholders = entityIds.map(() => '?').join(', ');\n const rows = await this.db.getAllAsync<WikiEvent>(\n `SELECT * FROM ${this.prefix}events WHERE entity_id IN (${placeholders}) ORDER BY created_at DESC LIMIT ?`,\n [...entityIds, limit],\n );\n return rows.map(mapEvent);\n }\n\n /**\n * Delete events for an entity that were created at or before the given cutoff timestamp.\n * Returns the number of deleted rows.\n */\n async prune(entityId: string, cutoff: number): Promise<{ changes: number }> {\n return this.db.runAsync(\n `DELETE FROM ${this.prefix}events WHERE entity_id = ? AND created_at <= ?`,\n [entityId, cutoff],\n );\n }\n\n /**\n * Watermark-guarded prune (spec 2026-09-29 competitive-memory §6): delete\n * events at or before `cutoff` **and** at-or-before the librarian watermark.\n * Events the librarian has not processed yet are retention-held, never\n * deleted. `wm = null` (no watermark yet) deletes nothing.\n * Used by runPrune under the deferred/ops strategies.\n */\n async pruneThrough(entityId: string, cutoff: number, wm: LibrarianWatermark | null): Promise<{ changes: number }> {\n if (!wm) return { changes: 0 };\n return this.db.runAsync(\n `DELETE FROM ${this.prefix}events WHERE entity_id = ? AND created_at <= ? AND NOT ${AFTER_SQL}`,\n [entityId, cutoff, ...afterArgs(wm)],\n );\n }\n\n /**\n * Count events at or before `cutoff` that are after the watermark — the\n * retention-held tail `pruneThrough` left in place. `wm = null` counts all\n * events at or before `cutoff` (every one of them is held back).\n */\n async countHeldBack(entityId: string, cutoff: number, wm: LibrarianWatermark | null): Promise<number> {\n const where = wm ? ` AND ${AFTER_SQL}` : '';\n const row = await this.db.getFirstAsync<{ n: number }>(\n `SELECT COUNT(*) AS n FROM ${this.prefix}events WHERE entity_id = ? AND created_at <= ?${where}`,\n [entityId, cutoff, ...(wm ? afterArgs(wm) : [])],\n );\n return Number(row?.n ?? 0);\n }\n\n /**\n * Return the total number of events stored for an entity.\n * `tx` is optional — pass an active transaction handle for atomic reads.\n */\n async count(entityId: string, tx?: SQLiteAdapter): Promise<number> {\n const executor = tx ?? this.db;\n const row = await executor.getFirstAsync<{ count: number }>(\n `SELECT COUNT(*) as count FROM ${this.prefix}events WHERE entity_id = ?`,\n [entityId],\n );\n return row?.count ?? 0;\n }\n\n /**\n * Return all events for an entity in chronological (ASC) order.\n * When limit is provided, fetches newest-first then reverses to preserve chronological order.\n */\n async getByEntityId(entityId: string, limit?: number): Promise<WikiEvent[]> {\n if (limit != null) {\n const rows = await this.db.getAllAsync<WikiEvent>(\n `SELECT * FROM ${this.prefix}events WHERE entity_id = ? ORDER BY created_at DESC LIMIT ?`,\n [entityId, limit],\n );\n return rows.map(mapEvent).slice().reverse();\n }\n const rows = await this.db.getAllAsync<WikiEvent>(\n `SELECT * FROM ${this.prefix}events WHERE entity_id = ? ORDER BY created_at ASC`,\n [entityId],\n );\n return rows.map(mapEvent);\n }\n\n /**\n * Return events for `entityId` strictly after the watermark `(at, id)` in\n * chronological (ASC, id-ASC tie-break) order. Pass `wm = null` to read\n * from the beginning of the entity's event log. `limit` caps the result.\n *\n * Used by the op-based librarian (PR-B) to enumerate its unprocessed tail.\n */\n async getAfter(\n entityId: string,\n wm: LibrarianWatermark | null,\n limit?: number,\n ): Promise<WikiEvent[]> {\n const limitClause = limit != null ? ` LIMIT ?` : '';\n const params: unknown[] = wm ? [entityId, wm.at, wm.at, wm.id] : [entityId];\n const where = wm ? `entity_id = ? AND ${AFTER_SQL}` : `entity_id = ?`;\n if (limit != null) params.push(limit);\n const rows = await this.db.getAllAsync<WikiEvent>(\n `SELECT * FROM ${this.prefix}events WHERE ${where} ORDER BY created_at ASC, id ASC${limitClause}`,\n params,\n );\n return rows.map(mapEvent);\n }\n\n /**\n * Count of events for `entityId` strictly after the watermark. Used as\n * the op-based librarian's bounded batch size and by the deferred-maintenance\n * pending report. Pass `wm = null` to count the entity's whole event log\n * (no watermark yet) — mirrors `getAfter` / `sumSummaryCharsAfter`.\n */\n async countAfter(entityId: string, wm: LibrarianWatermark | null): Promise<number> {\n const params: unknown[] = wm ? [entityId, wm.at, wm.at, wm.id] : [entityId];\n const where = wm ? `entity_id = ? AND ${AFTER_SQL}` : `entity_id = ?`;\n const row = await this.db.getFirstAsync<{ count: number }>(\n `SELECT COUNT(*) as count FROM ${this.prefix}events WHERE ${where}`,\n params,\n );\n return row?.count ?? 0;\n }\n\n /**\n * Return the event at a given chronological offset for `entityId` (0-based,\n * oldest first). Used by MaintenanceService.seedLibrarianWatermark to anchor\n * the watermark on a real row when a legacy DB first migrates to the\n * op-based librarian. The offset is clamped and truncated to defend against\n * hostile or fractional callers.\n */\n async getAtOffset(entityId: string, offset: number, tx?: SQLiteAdapter): Promise<WikiEvent | null> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<any>(\n `SELECT * FROM ${this.prefix}events WHERE entity_id = ? ORDER BY created_at ASC, id ASC LIMIT 1 OFFSET ?`,\n [entityId, Math.max(0, Math.trunc(offset))],\n );\n return row ? mapEvent(row) : null;\n }\n\n /**\n * Sum of `summary` lengths (in characters) for events for `entityId`\n * strictly after the watermark. Pass `wm = null` to sum the entity's whole\n * event log (no watermark yet). Used by the op-based librarian's token\n * budget estimator (PR-B) and by the auto-trigger's pending-size check\n * (PR-C). SQLite's `LENGTH` returns character count for UTF-8 text input.\n */\n async sumSummaryCharsAfter(entityId: string, wm: LibrarianWatermark | null, tx?: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const params: unknown[] = wm ? [entityId, wm.at, wm.at, wm.id] : [entityId];\n const where = wm ? `entity_id = ? AND ${AFTER_SQL}` : `entity_id = ?`;\n const row = await executor.getFirstAsync<{ total: number | null }>(\n `SELECT SUM(LENGTH(summary)) as total FROM ${this.prefix}events WHERE ${where}`,\n params,\n );\n return row?.total ?? 0;\n }\n}\n","import { BaseRepository } from './BaseRepository';\nimport type { WikiEdge, SQLiteAdapter } from '../types';\nimport { liveAtSql, type LiveMode } from '../utils/temporal';\n\nexport interface NeighborhoodQueryOptions {\n maxDepth: number; // already clamped to [1,3] by the caller (GraphTraversalService)\n direction: 'inbound' | 'outbound' | 'both';\n edgeTypes?: string[]; // undefined = no filter; [] = match nothing (short-circuits)\n minConfidence: 'certain' | 'inferred' | 'tentative';\n excludeSourceTypes: string[];\n maxNodes: number;\n /**\n * When true, draft facts are dead-ends for *discovered* nodes — the recursive\n * walk will not step onto a draft, and will not step *past* one either, since\n * a draft's neighbours are unreachable through it. The anchor node is exempt\n * (it is validated up-front and never gated by this flag), so callers can\n * intentionally start from a draft. Default false (drafts visible).\n */\n excludeDrafts?: boolean;\n /** Liveness gate for discovered nodes: 'current' (live now) or 'asOf' (valid time T). Always supplied by GraphTraversalService. */\n live: { mode: LiveMode; t: number };\n}\n\nconst CONFIDENCE_RANK: Record<'tentative' | 'inferred' | 'certain', number> = {\n tentative: 0,\n inferred: 1,\n certain: 2,\n};\n\nexport class EdgeRepository extends BaseRepository {\n /**\n * Insert an edge, silently skipping on primary-key or uniqueness conflicts.\n * Returns true when a row was inserted, false when skipped as a duplicate.\n * Throws when the insert was skipped due to an id collision with a different edge tuple.\n */\n async addIgnoreDuplicate(edge: WikiEdge, tx?: SQLiteAdapter): Promise<boolean> {\n const executor = this.getExecutor(tx);\n const result = await executor.runAsync(\n `INSERT OR IGNORE INTO ${this.prefix}edges (id, entity_id, source_id, target_id, edge_type, created_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n [edge.id, edge.entity_id, edge.source_id, edge.target_id, edge.edge_type, edge.created_at],\n );\n\n if (result.changes > 0) return true;\n\n const existing = await executor.getFirstAsync<{\n entity_id: string;\n source_id: string;\n target_id: string;\n edge_type: string;\n }>(\n `SELECT entity_id, source_id, target_id, edge_type FROM ${this.prefix}edges WHERE id = ?`,\n [edge.id],\n );\n\n if (!existing) return false;\n\n if (\n String(existing.entity_id) !== edge.entity_id ||\n String(existing.source_id) !== edge.source_id ||\n String(existing.target_id) !== edge.target_id ||\n String(existing.edge_type) !== edge.edge_type\n ) {\n throw new Error(\n `Edge id collision: ${JSON.stringify(edge.id)} already exists with a different (entity_id, source_id, target_id, edge_type) tuple`,\n );\n }\n\n return false;\n }\n\n async getByEntityId(entityId: string, tx?: SQLiteAdapter): Promise<WikiEdge[]> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}edges WHERE entity_id = ? ORDER BY created_at ASC`,\n [entityId],\n );\n return rows.map(mapRowToEdge);\n }\n\n /** Hard delete — edges have no soft-delete concept, only presence/absence. `tx` is REQUIRED. */\n async bulkDeleteByEntityId(entityId: string, tx: SQLiteAdapter): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(`DELETE FROM ${this.prefix}edges WHERE entity_id = ?`, [entityId]);\n }\n\n /**\n * Hard-delete every edge whose `source_id` is in `sourceFactIds`, scoped to\n * `entityId`. Returns the number of rows deleted. Edges have no soft-delete\n * concept; this method is named `softDeleteBySourceFactIds` for symmetry with\n * `EntryRepository.softDeleteBySource` (which IS a soft delete), but its\n * semantics are immediate presence/absence removal. Use ONLY inside an open\n * transaction — the method requires `tx` and performs no autocommit.\n *\n * Used by `IngestionService.upsertGraphCore` to retire the prior parse's\n * edges whose source facts are being superseded by `softDeleteBySource`.\n */\n async softDeleteBySourceFactIds(\n entityId: string,\n sourceFactIds: readonly string[],\n tx: SQLiteAdapter,\n ): Promise<number> {\n if (sourceFactIds.length === 0) return 0;\n const executor = this.getExecutor(tx);\n // SQLite's SQLITE_MAX_VARIABLE_NUMBER defaults to 32,766; binding\n // `entityId` plus every ID in one statement would overflow once a\n // single sourceRef accumulates tens of thousands of facts. Chunk to\n // stay well under the limit, reusing the supplied tx executor.\n const chunkSize = 500;\n let totalChanges = 0;\n for (let i = 0; i < sourceFactIds.length; i += chunkSize) {\n const chunk = sourceFactIds.slice(i, i + chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n const result = await executor.runAsync(\n `DELETE FROM ${this.prefix}edges\n WHERE entity_id = ? AND source_id IN (${placeholders})`,\n [entityId, ...chunk],\n );\n totalChanges += result.changes;\n }\n return totalChanges;\n }\n\n /**\n * Multi-hop traversal from `sourceId` via SQLite `WITH RECURSIVE`. All filtering,\n * dead-ending, cycle-guarding, capping, and ordering happens in this one query.\n * The anchor is validated (exists, right entity, not soft-deleted) but never gated\n * by confidence/source_type — only nodes discovered beyond it are.\n */\n async getNeighborhood(\n entityId: string,\n sourceId: string,\n opts: NeighborhoodQueryOptions,\n tx?: SQLiteAdapter,\n ): Promise<{ nodeIds: string[]; edges: WikiEdge[] }> {\n const executor = this.getExecutor(tx);\n\n if (opts.edgeTypes && opts.edgeTypes.length === 0) {\n const anchor = await executor.getFirstAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}entries WHERE id = ? AND entity_id = ? AND deleted_at IS NULL`,\n [sourceId, entityId],\n );\n return { nodeIds: anchor ? [anchor.id] : [], edges: [] };\n }\n\n const edgeTypesClause = opts.edgeTypes\n ? `e.edge_type IN (${opts.edgeTypes.map(() => '?').join(',')})`\n : '1=1';\n const excludeSourceTypesPlaceholders = opts.excludeSourceTypes.map(() => '?').join(',');\n const minConfidenceRank = CONFIDENCE_RANK[opts.minConfidence];\n\n const sql = `\n WITH RECURSIVE walk(node_id, depth, visited) AS (\n SELECT id, 0, ',' || id || ','\n FROM ${this.prefix}entries\n WHERE id = ? AND entity_id = ? AND deleted_at IS NULL\n\n UNION\n\n SELECT\n CASE WHEN e.source_id = w.node_id THEN e.target_id ELSE e.source_id END,\n w.depth + 1,\n w.visited || (CASE WHEN e.source_id = w.node_id THEN e.target_id ELSE e.source_id END) || ','\n FROM walk w\n JOIN ${this.prefix}edges e\n ON e.entity_id = ?\n AND (\n (? != 'inbound' AND e.source_id = w.node_id) OR\n (? != 'outbound' AND e.target_id = w.node_id)\n )\n AND (${edgeTypesClause})\n JOIN ${this.prefix}entries n\n ON n.id = (CASE WHEN e.source_id = w.node_id THEN e.target_id ELSE e.source_id END)\n AND n.entity_id = ?\n AND n.deleted_at IS NULL\n AND (\n CASE n.confidence\n WHEN 'tentative' THEN 0\n WHEN 'inferred' THEN 1\n WHEN 'certain' THEN 2\n ELSE -1\n END\n ) >= ?\n AND n.source_type NOT IN (${excludeSourceTypesPlaceholders})\n AND (? = 0 OR n.lifecycle_status != 'draft')\n AND ${liveAtSql(opts.live.mode, 'n.')}\n WHERE w.depth < ?\n AND instr(w.visited, ',' || (CASE WHEN e.source_id = w.node_id THEN e.target_id ELSE e.source_id END) || ',') = 0\n )\n SELECT node_id, MIN(depth) AS depth\n FROM walk\n GROUP BY node_id\n ORDER BY depth ASC, (SELECT updated_at FROM ${this.prefix}entries WHERE id = node_id) DESC\n LIMIT ?\n `;\n\n const params: unknown[] = [\n sourceId, entityId,\n entityId,\n opts.direction, opts.direction,\n ...(opts.edgeTypes ?? []),\n entityId,\n minConfidenceRank,\n ...opts.excludeSourceTypes,\n opts.excludeDrafts === true ? 1 : 0,\n opts.live.t, opts.live.t,\n opts.maxDepth,\n opts.maxNodes,\n ];\n\n const rows = await executor.getAllAsync<{ node_id: string; depth: number }>(sql, params);\n const nodeIds = rows.map((r) => r.node_id);\n if (nodeIds.length === 0) return { nodeIds: [], edges: [] };\n\n const valueRows = nodeIds.map(() => '(?)').join(', ');\n const edgeRows = await executor.getAllAsync<any>(\n `WITH neighborhood(node_id) AS (VALUES ${valueRows})\n SELECT e.* FROM ${this.prefix}edges e\n JOIN neighborhood ns ON e.source_id = ns.node_id\n JOIN neighborhood nt ON e.target_id = nt.node_id\n WHERE e.entity_id = ?`,\n [...nodeIds, entityId],\n );\n\n return { nodeIds, edges: edgeRows.map(mapRowToEdge) };\n }\n}\n\nfunction mapRowToEdge(row: any): WikiEdge {\n return {\n id: String(row.id),\n entity_id: String(row.entity_id),\n source_id: String(row.source_id),\n target_id: String(row.target_id),\n edge_type: String(row.edge_type),\n created_at: Number(row.created_at),\n };\n}\n","// packages/core/src/services/search/MiniSearchIndexStrategy.ts\n\nimport MiniSearch from 'minisearch';\nimport type {\n IndexDocument,\n IndexSearchOptions,\n IndexSearchResult,\n IndexStrategy,\n} from './IndexStrategy';\n\n/**\n * In-RAM keyword index. Extracted from `SearchService` without behavior\n * change. The strategy owns the MiniSearch instance, the `entryIdsByEntity`\n * tracking map, the `entityIdById` reverse map, and the explicit-vacuum\n * policy (#64).\n *\n * Memory cost: O(total text). The fix for #257 lives in PR-2's FTS5\n * strategy; this one stays for Expo/OPFS environments without FTS5 and for\n * hosts that explicitly pin `WikiConfig.indexStrategy: 'minisearch'`.\n */\nexport class MiniSearchIndexStrategy implements IndexStrategy {\n private index: MiniSearch<IndexDocument>;\n /**\n * Per-entity id set. `replaceEntity()` and `hasIndexedEntity()` read it;\n * `addDocuments()` and `discardIds()` keep it in sync. `SearchService` does\n * not see this map; it only sees `hasIndexedEntity`. The previous\n * `miniSearchEntryIdsByEntity` lived on `SearchService`.\n */\n private entryIdsByEntity = new Map<string, Set<string>>();\n /**\n * Reverse of `entryIdsByEntity`. `replace(entityId, ids, …)` uses it to\n * decide which ids are owned by `entityId` (the only safe membership test\n * — a rebuild that failed between its discard pass and the set replacement\n * can leave the forward set claiming ids the MiniSearch instance does not\n * hold). The pre-extraction `syncEntries` deleted from one set per id, not\n * from every entity's set.\n */\n private entityIdById = new Map<string, string>();\n\n constructor() {\n this.index = this.createIndex();\n }\n\n /**\n * Build a fresh MiniSearch instance with the project's index options.\n * Called from the constructor and from `replaceAll`. We do not use\n * `removeAll()` on an existing instance because that empties the index but\n * leaves `dirtCount` and the vacuum bookkeeping intact, which would trip\n * `syncEntries`' conditional vacuum early after a clear.\n */\n private createIndex(): MiniSearch<IndexDocument> {\n return new MiniSearch({\n fields: ['title', 'body', 'tags'],\n storeFields: ['entity_id'],\n // Vacuuming is driven explicitly at the end of each serialized rebuild\n // (see SearchService.syncEntries). Auto-vacuum fires on its own\n // schedule, asynchronously with respect to the caller, and traversing\n // the tree mid-rebuild is what threw the uncaught TypeError in\n // MiniSearch.performVacuuming (#64).\n autoVacuum: false,\n searchOptions: {\n boost: { title: 2 },\n fuzzy: 0.2,\n prefix: true,\n },\n });\n }\n\n /**\n * Incremental sync. Removes only ids currently tracked under `entityId`\n * (other entities' docs are untouched), then upserts `documents` by id.\n * The same id appearing in both `ids` and `documents` is discarded first\n * so the upsert does not throw on a duplicate id.\n *\n * Every document must carry `entityId` as its `entity_id`; a mismatch is\n * rejected before the write mutates anything. A tracking-only call\n * (`replace(entityId, [], [])`) registers the entity as indexed, matching\n * the interface contract.\n *\n * Atomicity: never awaits between the discard pass and `addDocuments`, so\n * a concurrent `search()` sees the index wholly before or wholly after,\n * never half-updated. This is the precondition the pre-extraction\n * `syncEntries` kept with its \"no await from here to `addAll`\" comment.\n */\n async replace(\n entityId: string,\n ids: readonly string[],\n documents: readonly IndexDocument[],\n ): Promise<void> {\n assertOwnedBy(entityId, documents);\n this.discardIds(ids, entityId);\n if (!this.entryIdsByEntity.has(entityId)) this.entryIdsByEntity.set(entityId, new Set());\n this.addDocuments(documents);\n }\n\n /**\n * Per-entity rebuild. Removes every id tracked under `entityId` (with the\n * `index.has(id)` guard so a stale tracking set cannot make `discard()`\n * throw), then writes `documents`. The entity stays registered as\n * indexed — even when `documents` is empty — so the next `syncEntries`\n * call can take the fast path. Every document must belong to `entityId`.\n */\n async replaceEntity(entityId: string, documents: readonly IndexDocument[]): Promise<void> {\n assertOwnedBy(entityId, documents);\n const previous = this.entryIdsByEntity.get(entityId);\n if (previous) this.discardIds([...previous]);\n // Registered even when empty, so hasIndexedEntity(entityId) === true.\n this.entryIdsByEntity.set(entityId, new Set());\n this.addDocuments(documents);\n }\n\n /**\n * Global rebuild / clear. Replaces the MiniSearch instance and clears both\n * id maps, so `hasIndexedEntity` returns `false` for every entity afterwards.\n * `SearchService.clearAll()` calls `replaceAll([])`.\n */\n async replaceAll(documents: readonly IndexDocument[]): Promise<void> {\n this.index = this.createIndex();\n this.entryIdsByEntity.clear();\n this.entityIdById.clear();\n this.addDocuments(documents);\n }\n\n /**\n * Best-match-first search over the documents whose `entity_id` is in\n * `options.entityIds`. `preFilterLimit` overrides `limit` (hybrid retrieval\n * uses this to over-fetch candidates before the `limit` cap). Scores are\n * raw BM25+ — `SearchService.getKeywordScores` and `searchKeyword` apply\n * any scaling, not the strategy.\n */\n async search(query: string, options: IndexSearchOptions): Promise<IndexSearchResult[]> {\n if (options.entityIds.length === 0) return [];\n const entityIdSet = new Set(options.entityIds);\n const limit = options.preFilterLimit ?? options.limit;\n const raw = this.index.search(query, {\n filter: (r) => entityIdSet.has(r.entity_id as string),\n combineWith: 'OR',\n });\n // Tiebreak equal-score results by id before slicing: MiniSearch breaks\n // ties by internal insertion order, which the strategy's own\n // discard/add changes. Callers truncate to a `limit`, so the ids\n // surviving a tie at the boundary must not depend on write history.\n raw.sort((a, b) => {\n const scoreDiff = b.score - a.score;\n if (!Number.isNaN(scoreDiff) && scoreDiff !== 0) return scoreDiff;\n return a.id.localeCompare(b.id);\n });\n // `storeFields: ['entity_id']` puts entity_id on every result.\n return raw.slice(0, limit).map((r) => ({\n id: r.id,\n entity_id: r.entity_id as string,\n score: r.score,\n }));\n }\n\n /**\n * Explicit vacuum. MiniSearch 7.2.0's `dirtCount` rule: search after an\n * un-vacuumed discard inverts the relative scores of term-sharing\n * documents at any index size. `SearchService.syncEntries` calls this\n * after a discard-bearing turn. No-op when `dirtCount === 0`.\n */\n async vacuum(): Promise<void> {\n if (this.index.dirtCount > 0) {\n await this.index.vacuum();\n }\n }\n\n /**\n * `true` when `entityId` has been indexed at least once under the current\n * strategy state. Backed by `entryIdsByEntity.has(entityId)`, which is\n * kept in sync by `addDocuments`, `replaceEntity`, and `replaceAll`.\n */\n hasIndexedEntity(entityId: string): boolean {\n return this.entryIdsByEntity.has(entityId);\n }\n\n /**\n * Add `documents` to the MiniSearch instance and register them in\n * `entryIdsByEntity` and `entityIdById`. MiniSearch mutates documents\n * during `add`, so each doc is copied first. `add` throws on an id the\n * index already holds — `replace` and `replaceEntity` discard first for\n * that reason.\n *\n * Adds and registers one document at a time: if a duplicate id throws\n * part-way through, every document already in the index is tracked, so\n * the next rebuild can discard it instead of failing on it again. This is\n * the precondition the per-turn recovery path relies on (#258 review).\n */\n private addDocuments(documents: readonly IndexDocument[]): void {\n for (const d of documents) {\n const doc: IndexDocument = { ...d };\n this.index.add(doc);\n const set = this.entryIdsByEntity.get(doc.entity_id) ?? new Set<string>();\n set.add(doc.id);\n this.entryIdsByEntity.set(doc.entity_id, set);\n this.entityIdById.set(doc.id, doc.entity_id);\n }\n }\n\n /**\n * Discard `ids` from the MiniSearch instance and from both id maps, but\n * only for ids currently owned by `entityId` (the second argument). When\n * `entityId` is omitted (used by `replaceEntity` for the bulk rebuild\n * path), every id is discarded regardless of owning entity.\n *\n * `index.has(id)` is the membership test of record: a rebuild that failed\n * between its own discard pass and the set replacement can leave the\n * tracking set claiming ids the index no longer holds — `discard()` throws\n * on those, so we guard.\n */\n private discardIds(ids: readonly string[], entityId?: string): void {\n for (const id of ids) {\n // Scope check first: an id not owned by `entityId` is silently ignored.\n // Doing the scope check before `index.discard` is what stops a\n // `replace(entityId, ids, …)` call from touching docs under any other\n // entity.\n const owning = this.entityIdById.get(id);\n if (owning === undefined) continue;\n if (entityId !== undefined && owning !== entityId) continue;\n if (this.index.has(id)) this.index.discard(id);\n this.entryIdsByEntity.get(owning)?.delete(id);\n this.entityIdById.delete(id);\n }\n }\n}\n\n/**\n * `replace` and `replaceEntity` write under one entity. A document carrying a\n * different `entity_id` would land in another entity's tracking set (and\n * have no safe discard path), so the write rejects before mutating anything.\n */\nfunction assertOwnedBy(entityId: string, documents: readonly IndexDocument[]): void {\n for (const doc of documents) {\n if (doc.entity_id !== entityId) {\n throw new Error(\n `IndexStrategy write for entity ${entityId} got document ${doc.id} under entity ${doc.entity_id}`,\n );\n }\n }\n}","/** Monotonic clock (ms): a wall-clock step must not stretch or skip a deadline or a cooldown. */\nexport const monotonicNow = (): number =>\n typeof performance !== 'undefined' && typeof performance.now === 'function' ? performance.now() : Date.now();\n","/**\n * Default `setupBudgetMs`: the wall time each keyword-index quantum (one per\n * `setup()` and per no-arg `syncSearchIndex()`) may spend on drain/rebuild\n * chunks, checked between chunk transactions (spec #280 Config surface).\n */\nexport const DEFAULT_SETUP_BUDGET_MS = 1500;\n","// packages/core/src/services/search/ftsQuery.ts\n\nconst TOKEN = /[\\p{L}\\p{N}]+/gu;\n\n/**\n * Turn a free-text query into an FTS5 MATCH expression that can never be a\n * syntax error: every token is a double-quoted string (FTS5 has no escapes\n * inside quotes except `\"\"`, and tokens contain no quotes), followed by `*`\n * for prefix matching. Tokens are ORed, which matches MiniSearch's\n * `prefix: true` and its `combineWith: 'OR'`. Returns `null` when no token\n * survives, and the caller returns no results.\n */\nexport function buildFtsMatchQuery(query: string): string | null {\n const seen = new Set<string>();\n for (const m of query.toLowerCase().matchAll(TOKEN)) seen.add(m[0]);\n if (seen.size === 0) return null;\n return [...seen].map((t) => `\"${t}\"*`).join(' OR ');\n}\n","// packages/core/src/services/search/Fts5IndexStrategy.ts\nimport type { SQLiteAdapter } from '../../types';\nimport type { MetadataRepository } from '../../repositories/MetadataRepository';\nimport type { DrainOptions, IndexDocument, IndexSearchOptions, IndexSearchResult, IndexStrategy } from './IndexStrategy';\nimport {\n FTS5_DRAIN_CHUNK, FTS5_RECLAIM_MERGE_PAGES, FTS5_RETIRED_COUNTER_KEY, FTS5_RETIRED_TABLES_KEY, isRetiredTableName, retiredTableName, FTS5_REBUILD_SNAPSHOT_KEY, FTS5_REBUILD_WM_KEY, FTS5_STATE_KEY, FTS5_SWEEP_CURSOR_KEY,\n sweepChunkSql, sweepHiSql, windowChunkSql, windowHiSql, drainChunkSql, drainHiSql, entityDrainChunkSql, entityDrainHiSql, fts5PendingIndexesDdl,\n fts5TablesDdl, fts5TriggerNames, fts5TriggersDdl, idDrainChunkSql, idReindexChunkSql,\n} from './fts5Sql';\nimport { readRebuildProgress, writeRebuildStart, type RebuildProgress, type RebuildWatermark } from './fts5Progress';\nimport { parseJsonArray } from '../../repositories/rowMappers';\nimport { monotonicNow } from '../../utils/monotonicNow';\nimport { DEFAULT_SETUP_BUDGET_MS } from '../../utils/setupDefaults';\nimport { buildFtsMatchQuery } from './ftsQuery';\nimport { extractSqliteCode } from '../../db/sqliteCodes';\n\n/**\n * Keyword index stored in SQLite FTS5, kept consistent with `entries` by a\n * trigger-fed ledger (`fts_pending`) that `drain()` applies in bounded, all-SQL\n * chunks. Row text never enters JS, so memory is flat at any database size.\n * Spec 2026-10-05 §PR-2 revision.\n */\nexport class Fts5IndexStrategy implements IndexStrategy {\n constructor(\n private readonly db: SQLiteAdapter,\n private readonly prefix: string,\n private readonly metadataRepo: MetadataRepository,\n private readonly budgetMs: number = DEFAULT_SETUP_BUDGET_MS,\n ) {}\n\n /**\n * Resolves the index state (spec #280 Change 3 transition table). Every\n * read-only probe runs before the one transition transaction, so a probe\n * failure leaves zero mutation (Change 4 ordering).\n */\n async init(opts: { entriesExisted?: boolean } = {}): Promise<void> {\n try {\n await this.initOnce(opts);\n } catch (err) {\n const wrapped = unwrapFtsOnly(err);\n const cls = ftsCorruptionClass(wrapped.cause);\n // Corruption confined to FTS tables: entries is untouched, so a reset re-arm is safe (spec #280 Change 4).\n if (cls === 'vtab' || (cls === 'corrupt' && wrapped.ftsOnly)) {\n await this.resetAndRearm();\n return;\n }\n throw wrapped.cause; // generic errors keep the retry -> UnavailableIndexStrategy path; pinned 'fts5' sees them raw\n }\n }\n\n /** Marks errors from statements that touch only FTS tables (entries_fts + shadows). */\n private async ftsOnly<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (err) {\n throw new FtsOnlyStatementError(err);\n }\n }\n\n private async initOnce(opts: { entriesExisted?: boolean }): Promise<void> {\n const p = this.prefix;\n const state = await this.metadataRepo.getMeta(FTS5_STATE_KEY);\n const schema = await this.readSchema();\n const ftsExists = schema.tables.has(`${p}entries_fts`);\n const mapExists = schema.tables.has(`${p}fts_map`);\n const pendingExists = schema.tables.has(`${p}fts_pending`);\n const trig = schema.triggersPresent;\n const ftsDdl = schema.tables.get(`${p}entries_fts`) ?? null;\n const tokenizerOk = ftsDdl === null || /tokenize\\s*=\\s*['\"]porter\\s+unicode61['\"]/i.test(ftsDdl);\n\n if (state === null && opts.entriesExisted === false) {\n // Fresh store: nothing to index yet.\n await this.db.withTransactionAsync(async (tx) => {\n await tx.execAsync(fts5TablesDdl(p) + fts5PendingIndexesDdl(p) + fts5TriggersDdl(p));\n await this.metadataRepo.setMeta(FTS5_STATE_KEY, 'live', tx);\n });\n return;\n }\n if (state === 'detached') return this.resetAndRearm(); // re-attach: the map is untrustworthy\n\n if (!tokenizerOk) return this.resetAndRearm();\n\n const intact = trig && ftsExists && mapExists && pendingExists;\n if (intact && state === 'rebuilding') return; // resume; each quantum re-verifies the fingerprint\n if (intact && state === 'live') {\n await this.ftsOnly(() => this.db.getFirstAsync(`SELECT rowid FROM ${p}entries_fts ORDER BY rowid DESC LIMIT 1`));\n if (await this.liveRowUnindexed()) return this.resetAndRearm();\n return; // fast path\n }\n // Marker lost, a trigger lost, or a table missing.\n if (ftsExists && mapExists && (await this.keepMapConsistent())) {\n await this.db.withTransactionAsync((tx) => this.rearmInTx(tx));\n return;\n }\n return this.resetAndRearm();\n }\n\n /**\n * The index was lost (rev 8 m3 / rev 9 m4): the oldest or the newest live entry is neither mapped nor\n * ledgered, which `live` never allows. The oldest one keeps detection armed after post-loss writes\n * repopulate the map and the ledger (#284 review). Every-open path: each side reads at most\n * FTS5_DRAIN_CHUNK entries rows (final review M1), so an all-soft-deleted store is never fully scanned;\n * a lost index whose oldest and newest rows are all deleted goes undetected.\n */\n private async liveRowUnindexed(): Promise<boolean> {\n const p = this.prefix;\n const edge = (dir: 'ASC' | 'DESC') => `SELECT id FROM (SELECT id FROM (SELECT id, deleted_at FROM ${p}entries`\n + ` ORDER BY rowid ${dir} LIMIT ${FTS5_DRAIN_CHUNK}) WHERE deleted_at IS NULL LIMIT 1)`;\n return (await this.db.getFirstAsync(\n `SELECT 1 AS x FROM (${edge('ASC')} UNION ALL ${edge('DESC')}) e\n WHERE NOT EXISTS (SELECT 1 FROM ${p}fts_map m WHERE m.id = e.id)\n AND NOT EXISTS (SELECT 1 FROM ${p}fts_pending q WHERE q.id = e.id)\n LIMIT 1`)) !== null;\n }\n\n /**\n * Read-only keep-map check (spec DDL note): every surviving entries_fts\n * rowid must have a map row. Max-rowid seek, then docsize vs map counts.\n */\n private async keepMapConsistent(): Promise<boolean> {\n const p = this.prefix;\n const fts = await this.ftsOnly(() => this.db.getFirstAsync<{ rowid: number }>(`SELECT rowid FROM ${p}entries_fts ORDER BY rowid DESC LIMIT 1`));\n const map = await this.db.getFirstAsync<{ hi: number; n: number }>(\n `SELECT coalesce(max(fts_rowid), 0) AS hi, count(*) AS n FROM ${p}fts_map`);\n if ((fts?.rowid ?? 0) > (map?.hi ?? 0)) return false;\n const doc = await this.ftsOnly(() => this.db.getFirstAsync<{ n: number }>(`SELECT count(*) AS n FROM ${p}entries_fts_docsize`));\n return (doc?.n ?? 0) === (map?.n ?? 0);\n }\n\n /** Keep-map re-arm: triggers, empty ledger, rebuild from 0, state rebuilding. One transaction. */\n private async rearmInTx(tx: SQLiteAdapter): Promise<void> {\n const p = this.prefix;\n await tx.execAsync(fts5TablesDdl(p));\n await tx.execAsync(`DELETE FROM ${p}fts_pending;`);\n await tx.execAsync(fts5PendingIndexesDdl(p) + fts5TriggersDdl(p));\n await writeRebuildStart(tx, p, this.metadataRepo);\n await this.metadataRepo.setMeta(FTS5_STATE_KEY, 'rebuilding', tx);\n }\n\n /** Reset path: retire entries_fts, recreate it empty, clear map + ledger, then the re-arm. One transaction. */\n private async resetAndRearm(): Promise<void> {\n const p = this.prefix;\n await this.db.withTransactionAsync(async (tx) => {\n await this.retireFtsTable(tx);\n await tx.execAsync(fts5TablesDdl(p));\n await tx.execAsync(`DELETE FROM ${p}fts_map; DELETE FROM ${p}fts_pending;`);\n await this.rearmInTx(tx);\n });\n }\n\n /** Rename-retire entries_fts (spec #280 rev 11); DROP only when the RENAME throws. */\n private async retireFtsTable(tx: SQLiteAdapter): Promise<void> {\n const p = this.prefix;\n if (!(await this.metadataRepo.tableExists(`${p}entries_fts`, tx))) return;\n const n = Number((await this.metadataRepo.getMeta(FTS5_RETIRED_COUNTER_KEY, tx)) ?? '0') + 1;\n const name = retiredTableName(p, n);\n try {\n await tx.execAsync(`ALTER TABLE ${p}entries_fts RENAME TO ${name}`);\n } catch (err) {\n // Not damage: SQLite may have rolled the transaction back already, so further statements would\n // autocommit one by one. Fail the reset whole instead (#284 review).\n if (isTransientOrTxFatal(err)) throw err;\n // Shadow tables too damaged to rename: today's DROP, with its measured floor, for this case only.\n await tx.execAsync(`DROP TABLE ${p}entries_fts`);\n return;\n }\n await this.metadataRepo.setMeta(FTS5_RETIRED_TABLES_KEY, JSON.stringify([...(await this.retiredList(tx)), name]), tx);\n await this.metadataRepo.setMeta(FTS5_RETIRED_COUNTER_KEY, String(n), tx);\n }\n\n private async retiredList(tx: SQLiteAdapter = this.db): Promise<string[]> {\n const raw = parseJsonArray<unknown>(await this.metadataRepo.getMeta(FTS5_RETIRED_TABLES_KEY, tx), []);\n return raw.filter((n): n is string => isRetiredTableName(this.prefix, n));\n }\n\n async drain(opts: DrainOptions = {}): Promise<void> {\n try {\n await this.drainOnce(opts);\n } catch (err) {\n // SQLITE_CORRUPT_VTAB names the FTS5 table itself, so the reset init() applies is safe here too:\n // without it every drain fails until the next open (#284 review). Other corruption may be in\n // entries, which this cannot repair: it propagates as before.\n if (ftsCorruptionClass(err) !== 'vtab') throw err;\n await this.resetAndRearm();\n // The reset cleared the ledger, so the caller's ids are re-indexed from entries: resolving\n // still means they are searchable (DrainOptions.ids), and the caller may drop them.\n if (opts.ids && opts.ids.length > 0) await this.drainIds(opts.ids, idReindexChunkSql(this.prefix));\n }\n }\n\n private async drainOnce(opts: DrainOptions): Promise<void> {\n const ids = opts.ids ?? [];\n // The caller's own ids are not deadline-bound (DrainOptions.ids): they drain to completion, and the caller drops them from its stash only once this succeeds.\n if (ids.length > 0) await this.drainIds(ids);\n if (opts.mode === 'ledger') {\n // Write turn: at most ONE foreign chunk after the caller's own ids.\n if (ids.length === 0 && opts.entityId !== undefined) await this.drainEntityChunk(opts.entityId);\n else await this.drainLedgerChunk();\n return;\n }\n await this.fullQuantum(opts.deadline ?? monotonicNow() + this.budgetMs);\n }\n\n /**\n * One full quantum (spec #280 Change 3): ledger first (at most half the\n * budget while `rebuilding`); then, while `rebuilding`, ≥1 window unless\n * the ledger drain overran the deadline, one sweep tx, and the flip check;\n * then reclamation. A `live` store reads only the state.\n */\n private async fullQuantum(deadline: number): Promise<void> {\n const rebuilding = (await this.metadataRepo.getMeta(FTS5_STATE_KEY)) === 'rebuilding';\n // While rebuilding, the ledger stops at half the remaining budget, so a steady write backlog cannot\n // starve the windows (#284 review). Overrun is still judged against the full deadline.\n const start = monotonicNow();\n const ledgerRan = await this.drainLedgerUntil(rebuilding ? start + (deadline - start) / 2 : deadline);\n const ledgerOverran = ledgerRan && monotonicNow() >= deadline;\n if (rebuilding) {\n const progress = await readRebuildProgress(this.metadataRepo);\n if (!progress || !(await this.fingerprintValid(progress.wm))) {\n // Windows resume next quantum; reclamation below still runs (#284 review).\n await this.restartRebuild();\n } else {\n if (!ledgerOverran) {\n let step: WindowStep;\n do {\n step = await this.runWindow(progress);\n } while (step === 'more' && monotonicNow() < deadline);\n // 'stale': progress moved under this quantum (a VACUUM restart, a re-anchor, a flip); the next quantum re-reads it.\n if (step !== 'stale') await this.runSweepTx(progress);\n }\n await this.tryFlip();\n }\n }\n try {\n await this.reclaimRetired(deadline);\n } catch (err) {\n // Best-effort for database errors only: a locked retired table stays listed and is retried next quantum,\n // never failing drain() or the flip. A non-SQLite error is a bug and propagates (final review I2).\n if (!isSqliteError(err)) throw err;\n }\n }\n\n /** Bounded reclamation steps, each its own tx, until the deadline or nothing is retired. */\n private async reclaimRetired(deadline: number): Promise<void> {\n while (monotonicNow() < deadline) {\n const [name] = await this.retiredList();\n if (name === undefined) return;\n try {\n // The list and the table are read once per table, not per step (#284 review).\n if (!(await this.metadataRepo.tableExists(name))) {\n await this.delistRetired(name, false);\n continue;\n }\n while (!(await this.reclaimStep(name)) && monotonicNow() < deadline);\n } catch (err) {\n if (ftsCorruptionClass(err) === null) throw err;\n // Persistently corrupt (the corruption reset is what retired it): DROP once and delist; if even\n // the DROP fails, delist anyway so no quantum re-reads its corrupt pages (final review I2).\n try {\n await this.delistRetired(name, true);\n } catch (dropErr) {\n if (!isSqliteError(dropErr)) throw dropErr;\n await this.delistRetired(name, false);\n }\n }\n }\n }\n\n /** (1) delete <=500 rows, else (2) one bounded merge, else (3) DROP + delist. True once delisted. */\n private async reclaimStep(name: string): Promise<boolean> {\n if (await this.db.getFirstAsync(`SELECT rowid FROM ${name} LIMIT 1`)) {\n await this.db.withTransactionAsync(async (tx) => {\n await tx.runAsync(`DELETE FROM ${name} WHERE rowid IN (SELECT rowid FROM ${name} ORDER BY rowid LIMIT ${FTS5_DRAIN_CHUNK})`);\n });\n return false;\n }\n let merged = false;\n await this.db.withTransactionAsync(async (tx) => {\n const before = await tx.getFirstAsync<{ n: number }>(`SELECT total_changes() AS n`);\n await tx.runAsync(`INSERT INTO ${name}(${name}, rank) VALUES('merge', ${FTS5_RECLAIM_MERGE_PAGES})`);\n const after = await tx.getFirstAsync<{ n: number }>(`SELECT total_changes() AS n`);\n merged = (after?.n ?? 0) - (before?.n ?? 0) >= 2; // FTS5 docs: < 2 means the merge did no work\n });\n if (!merged) await this.delistRetired(name, true);\n return !merged;\n }\n\n private async delistRetired(name: string, drop: boolean): Promise<void> {\n await this.db.withTransactionAsync(async (tx) => {\n if (drop) await tx.execAsync(`DROP TABLE IF EXISTS ${name}`);\n const rest = (await this.retiredList(tx)).filter((n) => n !== name);\n await this.metadataRepo.setMeta(FTS5_RETIRED_TABLES_KEY, JSON.stringify(rest), tx);\n });\n }\n\n /** The id at the watermark's rowid still matches. A null id (start, or windows complete) has nothing to check. */\n private async fingerprintValid(wm: RebuildWatermark, tx: SQLiteAdapter = this.db): Promise<boolean> {\n if (wm.id === null) return true;\n const row = await tx.getFirstAsync<{ id: string }>(`SELECT id FROM ${this.prefix}entries WHERE rowid = ?`, [wm.rowid]);\n return row?.id === wm.id;\n }\n\n /** External change under the watermark: start over (same re-arm transaction as a trigger-loss restart). */\n private async restartRebuild(): Promise<void> {\n await this.db.withTransactionAsync((tx) => this.rearmInTx(tx));\n }\n\n /**\n * Progress as stored, re-read inside a window/sweep tx: false when it no\n * longer matches what this quantum assumed (final review I1). Writing a\n * watermark or cursor computed from a stale `pr` would overwrite a\n * concurrent restart (runPrune VACUUM is not on the sync chain).\n */\n private async progressUnchanged(pr: RebuildProgress, tx: SQLiteAdapter): Promise<boolean> {\n if ((await this.metadataRepo.getMeta(FTS5_STATE_KEY, tx)) !== 'rebuilding') return false;\n const cur = await readRebuildProgress(this.metadataRepo, tx);\n return cur !== null && cur.wm.rowid === pr.wm.rowid && cur.wm.id === pr.wm.id && cur.cursor === pr.cursor\n && cur.snapshot.entries === pr.snapshot.entries && cur.snapshot.map === pr.snapshot.map;\n }\n\n /** One window tx. 'done' once no rows remain in (wm, snapshot] (the watermark is then pinned at the snapshot, F9); 'stale' when progress moved under the quantum. */\n private async runWindow(pr: RebuildProgress): Promise<WindowStep> {\n if (pr.wm.rowid >= pr.snapshot.entries) return 'done';\n const p = this.prefix;\n let next: RebuildWatermark = pr.wm;\n let more = false;\n let stale = false;\n await this.db.withTransactionAsync(async (tx) => {\n if (!(await this.progressUnchanged(pr, tx))) { stale = true; return; }\n const row = await tx.getFirstAsync<{ hi: number | null }>(windowHiSql(p), [pr.wm.rowid, pr.snapshot.entries]);\n if (row?.hi == null) {\n next = { rowid: pr.snapshot.entries, id: null };\n } else {\n for (const sql of windowChunkSql(p)) await tx.runAsync(sql, [pr.wm.rowid, row.hi]);\n const fp = await tx.getFirstAsync<{ id: string }>(`SELECT id FROM ${p}entries WHERE rowid = ?`, [row.hi]);\n next = { rowid: row.hi, id: fp!.id };\n more = true;\n }\n await this.metadataRepo.setMeta(FTS5_REBUILD_WM_KEY, JSON.stringify(next), tx);\n });\n if (stale) return 'stale';\n pr.wm = next; // only after the tx resolved\n return more ? 'more' : 'done';\n }\n\n /** At most one bounded sweep tx; the cursor advances in the same tx. */\n private async runSweepTx(pr: RebuildProgress): Promise<void> {\n if (pr.cursor >= pr.snapshot.map) return;\n const p = this.prefix;\n let next = pr.cursor;\n await this.db.withTransactionAsync(async (tx) => {\n if (!(await this.progressUnchanged(pr, tx))) return; // keep pr.cursor; the next quantum re-reads\n const row = await tx.getFirstAsync<{ hi: number | null }>(sweepHiSql(p), [pr.cursor, pr.snapshot.map]);\n const hi = row?.hi ?? pr.snapshot.map;\n for (const sql of sweepChunkSql(p)) await tx.runAsync(sql, [pr.cursor, hi]);\n await this.metadataRepo.setMeta(FTS5_SWEEP_CURSOR_KEY, String(hi), tx);\n next = hi;\n });\n pr.cursor = next;\n }\n\n /** Completion, re-checked inside the flipping tx; the residual ledger (≤ one chunk) drains in it. */\n private async tryFlip(): Promise<void> {\n const p = this.prefix;\n await this.db.withTransactionAsync(async (tx) => {\n if ((await this.metadataRepo.getMeta(FTS5_STATE_KEY, tx)) !== 'rebuilding') return;\n const pr = await readRebuildProgress(this.metadataRepo, tx);\n if (!pr || pr.wm.rowid < pr.snapshot.entries || pr.cursor < pr.snapshot.map) return;\n if (!(await this.fingerprintValid(pr.wm, tx))) return;\n const residual = await tx.getFirstAsync<{ n: number }>(\n `SELECT count(*) AS n FROM (SELECT 1 FROM ${p}fts_pending LIMIT ${FTS5_DRAIN_CHUNK + 1})`);\n if ((residual?.n ?? 0) > FTS5_DRAIN_CHUNK) return;\n const hi = await tx.getFirstAsync<{ hi: number | null }>(drainHiSql(p));\n if (hi?.hi != null) for (const sql of drainChunkSql(p)) await tx.runAsync(sql, [hi.hi]);\n await this.metadataRepo.deleteMeta(FTS5_REBUILD_WM_KEY, tx);\n await this.metadataRepo.deleteMeta(FTS5_REBUILD_SNAPSHOT_KEY, tx);\n await this.metadataRepo.deleteMeta(FTS5_SWEEP_CURSOR_KEY, tx);\n await this.metadataRepo.setMeta(FTS5_STATE_KEY, 'live', tx);\n });\n }\n\n /** Seq-ordered ledger chunks until empty or `stopAt`. True when a chunk ran. */\n private async drainLedgerUntil(stopAt: number): Promise<boolean> {\n let ran = false;\n while (await this.drainLedgerChunk()) {\n ran = true;\n if (monotonicNow() >= stopAt) break;\n }\n return ran;\n }\n\n /** The caller's own ids, to completion, ≤ FTS5_DRAIN_CHUNK per transaction. */\n private async drainIds(ids: readonly string[], chunk: readonly string[] = idDrainChunkSql(this.prefix)): Promise<void> {\n const unique = [...new Set(ids)];\n for (let i = 0; i < unique.length; i += FTS5_DRAIN_CHUNK) {\n const json = JSON.stringify(unique.slice(i, i + FTS5_DRAIN_CHUNK));\n await this.db.withTransactionAsync(async (tx) => {\n for (const sql of chunk) await tx.runAsync(sql, [json]);\n });\n }\n }\n\n /** One seq-ordered chunk. False when the ledger was empty. */\n private async drainLedgerChunk(): Promise<boolean> {\n const hiSql = drainHiSql(this.prefix);\n const chunk = drainChunkSql(this.prefix);\n // A local, not the callback's return value: host adapters may resolve withTransactionAsync to void.\n let ran = false;\n await this.db.withTransactionAsync(async (tx) => {\n const row = await tx.getFirstAsync<{ hi: number | null }>(hiSql);\n if (row?.hi == null) return;\n for (const sql of chunk) await tx.runAsync(sql, [row.hi]);\n ran = true;\n });\n return ran;\n }\n\n /** One entity-targeted chunk (ORDER BY seq, ≤ FTS5_DRAIN_CHUNK). */\n private async drainEntityChunk(entityId: string): Promise<void> {\n const hiSql = entityDrainHiSql(this.prefix);\n const chunk = entityDrainChunkSql(this.prefix);\n await this.db.withTransactionAsync(async (tx) => {\n const row = await tx.getFirstAsync<{ hi: number | null }>(hiSql, [entityId]);\n if (row?.hi == null) return;\n for (const sql of chunk) await tx.runAsync(sql, [entityId, row.hi]);\n });\n }\n\n async replace(entityId: string, ids: readonly string[], documents: readonly IndexDocument[]): Promise<void> {\n assertEntity(entityId, documents);\n const docIds = documents.map((d) => d.id);\n await this.db.withTransactionAsync(async (tx) => {\n // Caller-supplied ids are scoped to the entity; incoming document ids are\n // un-scoped so a doc that previously lived under another entity gets\n // detached (otherwise the fts_map UNIQUE(id) insert would throw).\n await this.deleteByIds(tx, entityId, ids);\n await this.deleteByIds(tx, null, docIds);\n await this.insertDocs(tx, documents);\n });\n }\n\n async replaceEntity(entityId: string, documents: readonly IndexDocument[]): Promise<void> {\n assertEntity(entityId, documents);\n const p = this.prefix;\n await this.db.withTransactionAsync(async (tx) => {\n await tx.runAsync(\n `DELETE FROM ${p}entries_fts WHERE rowid IN (SELECT fts_rowid FROM ${p}fts_map WHERE entity_id = ?)`, [entityId]);\n await tx.runAsync(`DELETE FROM ${p}fts_map WHERE entity_id = ?`, [entityId]);\n await this.insertDocs(tx, documents);\n });\n }\n\n async replaceAll(documents: readonly IndexDocument[]): Promise<void> {\n const p = this.prefix;\n await this.db.withTransactionAsync(async (tx) => {\n await tx.execAsync(`DELETE FROM ${p}entries_fts; DELETE FROM ${p}fts_map; DELETE FROM ${p}fts_pending;`);\n await this.insertDocs(tx, documents);\n });\n }\n\n async search(query: string, options: IndexSearchOptions): Promise<IndexSearchResult[]> {\n if (options.entityIds.length === 0) return [];\n const match = buildFtsMatchQuery(query);\n if (match === null) return [];\n const cap = options.preFilterLimit ?? options.limit;\n const limit = cap >= Number.MAX_SAFE_INTEGER ? -1 : cap;\n const t = `${this.prefix}entries_fts`;\n // bm25 is evaluated once per matching row in the inner query; the outer\n // SELECT only clamps and negates it. The outer ORDER BY is kept because SQL\n // does not guarantee a subquery's order survives into the outer query; it\n // sorts at most `limit` rows.\n return this.db.getAllAsync<IndexSearchResult>(\n `SELECT id, entity_id, max(0.0, -raw) AS score FROM (\n SELECT id, entity_id, bm25(${t}, 0.0, 0.0, 2.0, 1.0, 1.0) AS raw\n FROM ${t}\n WHERE ${t} MATCH ? AND entity_id IN (SELECT value FROM json_each(?))\n ORDER BY raw, id\n LIMIT ?)\n ORDER BY raw, id`,\n [match, JSON.stringify(options.entityIds), limit],\n );\n }\n\n private async deleteByIds(tx: SQLiteAdapter, entityId: string | null, ids: readonly string[]): Promise<void> {\n if (ids.length === 0) return;\n const p = this.prefix;\n const json = JSON.stringify(ids);\n const whereEntity = entityId === null ? '' : ' AND entity_id = ?';\n // `json_each(?)` is the first placeholder; the optional `entity_id = ?` follows it.\n const args: unknown[] = [json];\n if (entityId !== null) args.push(entityId);\n await tx.runAsync(\n `DELETE FROM ${p}entries_fts WHERE rowid IN (\n SELECT fts_rowid FROM ${p}fts_map WHERE id IN (SELECT value FROM json_each(?))${whereEntity})`,\n args);\n await tx.runAsync(\n `DELETE FROM ${p}fts_map WHERE id IN (SELECT value FROM json_each(?))${whereEntity}`, args);\n }\n\n /** One INSERT pair per document: a throw part-way rolls back the whole transaction. */\n private async insertDocs(tx: SQLiteAdapter, documents: readonly IndexDocument[]): Promise<void> {\n const p = this.prefix;\n for (const d of documents) {\n const { lastInsertRowId } = await tx.runAsync(\n `INSERT INTO ${p}fts_map (id, entity_id) VALUES (?, ?)`, [d.id, d.entity_id]);\n await tx.runAsync(\n `INSERT INTO ${p}entries_fts (rowid, id, entity_id, title, body, tags) VALUES (?, ?, ?, ?, ?, ?)`,\n [lastInsertRowId, d.id, d.entity_id, d.title, d.body, d.tags]);\n }\n }\n\n /** The init probes' schema facts in one sqlite_master read (#284 review): FTS tables with their DDL, and the triggers. */\n private async readSchema(): Promise<{ tables: Map<string, string | null>; triggersPresent: boolean }> {\n const p = this.prefix;\n const triggers = fts5TriggerNames(p);\n const names = [`${p}entries_fts`, `${p}fts_map`, `${p}fts_pending`, ...triggers];\n const rows = await this.db.getAllAsync<{ type: string; name: string; sql: string | null }>(\n `SELECT type, name, sql FROM sqlite_master WHERE name IN (${names.map(() => '?').join(', ')})`, names);\n const tables = new Map(rows.filter((r) => r.type === 'table').map((r) => [r.name, r.sql] as const));\n const present = new Set(rows.filter((r) => r.type === 'trigger').map((r) => r.name));\n return { tables, triggersPresent: triggers.every((n) => present.has(n)) };\n }\n}\n\ntype WindowStep = 'more' | 'done' | 'stale';\n\nclass FtsOnlyStatementError extends Error {\n readonly ftsOnlyCause: unknown;\n constructor(cause: unknown) {\n super('FTS-only statement failed');\n this.ftsOnlyCause = cause;\n }\n}\n\n/** Proxy-safe unwrap (issue #96): never `instanceof` a caught value bare. */\nfunction unwrapFtsOnly(err: unknown): { cause: unknown; ftsOnly: boolean } {\n try {\n if (err instanceof FtsOnlyStatementError) return { cause: err.ftsOnlyCause, ftsOnly: true };\n } catch { /* hostile Proxy */ }\n return { cause: err, ftsOnly: false };\n}\n\n/**\n * Proxy-safe extractSqliteCode (issue #96): any trap => undefined. Also reads\n * WikiTransactionError's `sqliteErrorCode`: the serialized adapter wraps every\n * failed transaction in one, so the driver code is not on `code` (#284 review).\n */\nfunction safeSqliteCode(err: unknown): string | undefined {\n try {\n const code = extractSqliteCode(err);\n if (code !== undefined) return code;\n const lifted = (err as { sqliteErrorCode?: unknown } | null | undefined)?.sqliteErrorCode;\n return typeof lifted === 'string' ? lifted : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Busy/locked, or a code after which SQLite may roll the transaction back (sqlite.org/lang_transaction.html). Extended codes match by primary name. */\nconst TRANSIENT_OR_TX_FATAL = ['SQLITE_BUSY', 'SQLITE_LOCKED', 'SQLITE_FULL', 'SQLITE_IOERR', 'SQLITE_NOMEM', 'SQLITE_INTERRUPT', 'SQLITE_ABORT', 'SQLITE_READONLY'];\n\nfunction isTransientOrTxFatal(err: unknown): boolean {\n const code = safeSqliteCode(err);\n return code !== undefined && TRANSIENT_OR_TX_FATAL.some((c) => code === c || code.startsWith(`${c}_`));\n}\n\n/**\n * 'vtab' for SQLITE_CORRUPT_VTAB (extended code 267, any statement), 'corrupt'\n * for another SQLITE_CORRUPT* code, else null. Proxy-safe: any trap => null.\n */\nexport function ftsCorruptionClass(err: unknown): 'vtab' | 'corrupt' | null {\n const code = safeSqliteCode(err);\n if (code === 'SQLITE_CORRUPT_VTAB') return 'vtab';\n if (code?.startsWith('SQLITE_CORRUPT')) return 'corrupt';\n return null;\n}\n\n/** A SQLite error (better-sqlite3 / expo-sqlite shapes): `code` 'SQLITE_*' or an 'Error code N:' message. Proxy-safe: any trap => false. */\nexport function isSqliteError(err: unknown): boolean {\n return safeSqliteCode(err) !== undefined;\n}\n\nfunction assertEntity(entityId: string, documents: readonly IndexDocument[]): void {\n for (const d of documents) {\n if (d.entity_id !== entityId) {\n throw new TypeError(`IndexDocument ${d.id} has entity_id ${d.entity_id}, expected ${entityId}`);\n }\n }\n}\n","// packages/core/src/services/search/createIndexStrategy.ts\nimport type { SQLiteAdapter } from '../../types';\nimport type { MetadataRepository } from '../../repositories/MetadataRepository';\nimport type { IndexStrategy } from './IndexStrategy';\nimport { Fts5IndexStrategy } from './Fts5IndexStrategy';\nimport { MiniSearchIndexStrategy } from './MiniSearchIndexStrategy';\nimport { UnavailableIndexStrategy } from './UnavailableIndexStrategy';\nimport { FTS5_STATE_KEY, fts5LedgerDropSql } from './fts5Sql';\n\nexport type IndexStrategyPreference = 'fts5' | 'minisearch' | 'auto';\n\nexport const FTS5_INIT_RETRY_MS = 250;\n\n/** True only for errors meaning the module is genuinely absent (permanent). Proxy-safe. */\nfunction isModuleAbsentError(err: unknown): boolean {\n // Walk a short cause chain: some adapters wrap the SQLite message.\n let cur: unknown = err;\n for (let depth = 0; depth < 3 && cur != null; depth++) {\n let msg = '';\n try { msg = String((cur as { message?: unknown }).message ?? cur); } catch { return false; }\n if (/no such module: fts5/i.test(msg) || /no such function: json_valid/i.test(msg)) return true;\n try { cur = (cur as { cause?: unknown }).cause; } catch { return false; }\n }\n return false;\n}\n\n/**\n * Whether this SQLite build has FTS5 and json1 (the drain needs both). The\n * probe table lives in `temp`, so the database file is never touched.\n * Returns false ONLY when the module is genuinely absent; any other error\n * (SQLITE_IOERR, NOMEM, INTERRUPT, ...) is rethrown so the caller treats it\n * as a transient init failure instead of detaching a healthy store\n * (spec #280 Change 4).\n */\nexport async function probeFts5(db: SQLiteAdapter, prefix: string): Promise<boolean> {\n const name = `temp.${prefix}fts5_probe`;\n try {\n await db.execAsync(`CREATE VIRTUAL TABLE IF NOT EXISTS ${name} USING fts5(x)`);\n const row = await db.getFirstAsync<{ ok: number }>(`SELECT json_valid('[]') AS ok`);\n return row?.ok === 1;\n } catch (err) {\n if (isModuleAbsentError(err)) return false;\n throw err;\n } finally {\n try { await db.execAsync(`DROP TABLE IF EXISTS ${name}`); } catch { /* module absent */ }\n }\n}\n\n/**\n * Stop maintaining the FTS5 ledger: drop the triggers and ordinary ledger\n * tables and mark the database detached, so a later FTS5 open rebuilds.\n * The virtual table is dropped best-effort; without the fts5 module it\n * cannot be, and the next FTS5 init recreates it anyway.\n */\nexport async function detachFts5(db: SQLiteAdapter, prefix: string, metadataRepo: MetadataRepository): Promise<void> {\n const hasLedger = await metadataRepo.tableExists(`${prefix}fts_pending`);\n const state = await metadataRepo.getMeta(FTS5_STATE_KEY);\n if (!hasLedger && state !== 'live') return;\n await db.withTransactionAsync(async (tx) => {\n await tx.execAsync(fts5LedgerDropSql(prefix));\n await metadataRepo.setMeta(FTS5_STATE_KEY, 'detached', tx);\n });\n try { await db.execAsync(`DROP TABLE IF EXISTS ${prefix}entries_fts`); } catch { /* no fts5 module */ }\n}\n\n/** Resolve the keyword-index strategy for this database. Failure ordering per spec #280 Change 4. */\nexport async function createIndexStrategy(\n db: SQLiteAdapter,\n prefix: string,\n metadataRepo: MetadataRepository,\n preferred: IndexStrategyPreference,\n opts: { setupBudgetMs?: number; entriesExisted?: boolean } = {},\n): Promise<IndexStrategy> {\n if (preferred === 'minisearch') {\n await detachFts5(db, prefix, metadataRepo); // operator's explicit choice\n return new MiniSearchIndexStrategy();\n }\n const attempt = async (): Promise<IndexStrategy | 'absent'> => {\n if (!(await probeFts5(db, prefix))) return 'absent';\n const strategy = new Fts5IndexStrategy(db, prefix, metadataRepo, opts.setupBudgetMs);\n await strategy.init({ entriesExisted: opts.entriesExisted });\n return strategy;\n };\n const absent = async (): Promise<IndexStrategy> => {\n if (preferred === 'fts5') {\n throw new Error(`indexStrategy 'fts5' was requested, but this SQLite build lacks FTS5 or json1.`);\n }\n await detachFts5(db, prefix, metadataRepo); // module genuinely absent: permanent\n return new MiniSearchIndexStrategy();\n };\n\n for (let tries = 1; ; tries++) {\n try {\n const s = await attempt();\n return s === 'absent' ? await absent() : s;\n } catch (err) {\n if (preferred === 'fts5') throw err; // pinned: surface the raw failure\n if (tries === 2) {\n // Never detachFts5 here: a transient failure must not drop the ledger and\n // route a large store into MiniSearch's full sync (measured OOM).\n console.warn('[WikiMemory] FTS5 init failed after retry; keyword search unavailable until a later open or syncSearchIndex():', err);\n return new UnavailableIndexStrategy(err);\n }\n }\n await new Promise((resolve) => setTimeout(resolve, FTS5_INIT_RETRY_MS));\n }\n}\n","import type {\n SQLiteAdapter,\n WikiOptions,\n PendingMaintenance,\n MaintenanceJob,\n MaintenanceStopReason,\n EntityMaintenanceReport,\n RunPendingMaintenanceOptions,\n RunPendingMaintenanceResult,\n HealResult,\n} from '../types';\nimport { WikiBusyError, isWikiSearchUnavailableError } from '../types';\nimport { MaintenanceService, MAX_EMBED_ATTEMPTS } from './MaintenanceService';\nimport type { LibrarianResult } from './librarian';\nimport { UsageMeter } from '../utils/usage';\nimport { MetadataRepository } from '../repositories/MetadataRepository';\nimport { EventRepository } from '../repositories/EventRepository';\nimport { EntryRepository } from '../repositories/EntryRepository';\nimport { JobManager } from './JobManager';\n\n/**\n * Read-side report for the deferred maintenance mode: which entities have\n * pending work (librarian events behind the watermark, heal backlog, unembedded\n * facts) without running anything. `run` executes the work (PR-C task 4).\n */\nexport class MaintenanceScheduler {\n constructor(\n private db: SQLiteAdapter,\n private options: WikiOptions,\n private maintenanceService: MaintenanceService,\n private metadataRepo: MetadataRepository,\n private eventRepo: EventRepository,\n private entryRepo: EntryRepository,\n private jobManager: JobManager,\n ) {}\n\n /**\n * Entities with **any** pending work only, sorted by `pendingEvents` desc\n * then `entityId` asc. Token estimate is ceil(pending summary chars / 4),\n * matching the auto-trigger's estimator (PR-B).\n */\n async getPending(entityIds?: string[]): Promise<PendingMaintenance[]> {\n const ids = entityIds ?? await this.metadataRepo.getDistinctEntityIds();\n const autoHealThreshold = this.options.config?.autoHealThreshold || 100;\n const canEmbed = typeof this.options.llmProvider.embed === 'function';\n const out: PendingMaintenance[] = [];\n for (const entityId of ids) {\n const wm = await this.metadataRepo.getLibrarianWatermark(entityId, this.db);\n const pendingEvents = await this.eventRepo.countAfter(entityId, wm);\n const chars = pendingEvents > 0 ? await this.eventRepo.sumSummaryCharsAfter(entityId, wm) : 0;\n const eventCount = await this.eventRepo.count(entityId);\n const cp = await this.metadataRepo.getCheckpoint(entityId, this.db);\n // Same clamp as WriteService.maybeRunHeal: an out-of-range checkpoint\n // (reachable after runPrune deletes events a heal pass already counted)\n // resets to ZERO, not to the event count — both views must agree that\n // the entity is fully unhealed.\n let healCheckpoint = cp.heal ?? 0;\n if (healCheckpoint > eventCount) healCheckpoint = 0;\n const healDue = eventCount - healCheckpoint >= autoHealThreshold;\n const reembedPending = canEmbed && (await this.entryRepo.countReembedPending(entityId, MAX_EMBED_ATTEMPTS)) > 0;\n if (pendingEvents > 0 || healDue || reembedPending) {\n out.push({ entityId, pendingEvents, pendingTokensEstimate: Math.ceil(chars / 4), healDue, reembedPending });\n }\n }\n return out.sort((x, y) => (y.pendingEvents - x.pendingEvents) || (x.entityId < y.entityId ? -1 : x.entityId > y.entityId ? 1 : 0));\n }\n\n /**\n * Execute pending maintenance (spec §6.2): fair-share rounds of at most one\n * unit per entity (librarian batch, else heal batch, else reembed), entities\n * ordered by `getPending` (pendingEvents desc, id asc). Holds the same\n * per-entity `JobManager` locks a manual run would; a busy entity is skipped\n * and reported, never thrown. Nothing is still running when this resolves.\n *\n * Stop precedence (spec §10 items 3-6): `deadline` > `budget_exhausted` >\n * `budget_too_small` > `complete`. `budget_too_small` means a job's smallest\n * unit needs more than the WHOLE budget — that job is skipped this run and\n * the run continues; `budget_exhausted` means a unit needs more than what\n * REMAINS — the run stops. The token budget meters `generateText` calls\n * only; embeddings are never metered.\n */\n async run(opts: RunPendingMaintenanceOptions = {}): Promise<RunPendingMaintenanceResult> {\n if (\n opts.deadlineMs !== undefined &&\n (typeof opts.deadlineMs !== 'number' || !Number.isFinite(opts.deadlineMs) || opts.deadlineMs < 0)\n ) {\n throw new TypeError('deadlineMs must be a finite number >= 0');\n }\n const meter = new UsageMeter(opts.tokenBudget);\n const budget = opts.tokenBudget;\n const deadline = opts.deadlineMs !== undefined ? Date.now() + Math.max(0, opts.deadlineMs) : Infinity;\n const jobs = new Set<MaintenanceJob>(opts.jobs ?? ['librarian', 'heal', 'reembed']);\n const pending = await this.getPending(opts.entityIds);\n\n type State = { p: PendingMaintenance; report: EntityMaintenanceReport; librarian: boolean; heal: boolean; reembed: boolean };\n const states: State[] = pending.map((p) => ({\n p,\n report: { entityId: p.entityId, librarianPasses: 0, factsWritten: 0, healPasses: 0, reembedded: false },\n librarian: jobs.has('librarian') && p.pendingEvents > 0,\n heal: jobs.has('heal') && p.healDue,\n reembed: jobs.has('reembed') && p.reembedPending,\n }));\n\n let stopped: MaintenanceStopReason = { reason: 'complete' };\n let tooSmall: MaintenanceStopReason | null = null;\n const classify = (job: 'librarian' | 'heal', entityId: string, requiredEstimate: number): 'too_small' | 'exhausted' => {\n if (budget !== undefined && requiredEstimate > budget) {\n tooSmall ??= { reason: 'budget_too_small', job, entityId, requiredEstimate };\n return 'too_small';\n }\n return 'exhausted';\n };\n // A unit that ends with the meter exhausted made real awaited LLM calls,\n // so the deadline may have lapsed mid-unit too. Precedence is deadline\n // first (spec §10): the caller must be told to retry as-is, not to raise\n // the budget. Re-checked here because the between-units deadline check\n // only runs before a unit starts, never after one ends.\n const exhaustedStop = (): MaintenanceStopReason =>\n Date.now() >= deadline ? { reason: 'deadline' } : { reason: 'budget_exhausted' };\n const markBusy = (st: State, job: MaintenanceJob) => { (st.report.busy ??= []).push(job); };\n const markSearchUnavailable = (st: State, job: MaintenanceJob) => { (st.report.searchUnavailable ??= []).push(job); };\n\n // Open job flags across all entities. Flags only ever clear, so a round\n // that clears one (a skip: busy, outage, too small, nothing processed)\n // counts as progress — it must re-run so the entity reaches its later\n // jobs — and the loop still terminates.\n const openJobs = () => states.reduce((n, s) => n + +s.librarian + +s.heal + +s.reembed, 0);\n\n rounds: for (;;) {\n let progressed = false;\n const openAtStart = openJobs();\n for (const st of states) {\n if (!st.librarian && !st.heal && !st.reembed) continue;\n if (Date.now() >= deadline) { stopped = { reason: 'deadline' }; break rounds; }\n const entityId = st.p.entityId;\n\n if (st.librarian) {\n if (this.jobManager.isBlocked('librarian', entityId)) { st.librarian = false; markBusy(st, 'librarian'); continue; }\n this.jobManager.acquireLock('librarian', entityId);\n let r: LibrarianResult;\n try {\n r = await this.maintenanceService.runLibrarianPass({ entityId, trigger: 'call', meter });\n } catch (err) {\n // Keyword outage: this entity's pass aborted with its watermark kept.\n // Skip it for this run rather than failing every other entity's work.\n if (!isWikiSearchUnavailableError(err)) throw err;\n st.librarian = false;\n markSearchUnavailable(st, 'librarian');\n continue;\n } finally {\n this.jobManager.releaseLock('librarian', entityId);\n }\n if (r.budgetStop) {\n if (classify('librarian', entityId, r.budgetStop.requiredEstimate) === 'exhausted') { stopped = exhaustedStop(); break rounds; }\n st.librarian = false;\n continue;\n }\n if (!r.processedThrough) { st.librarian = false; continue; }\n st.report.librarianPasses++;\n st.report.factsWritten += r.factsWritten;\n progressed = true;\n const wm = await this.metadataRepo.getLibrarianWatermark(entityId, this.db);\n if ((await this.eventRepo.countAfter(entityId, wm)) === 0) st.librarian = false;\n continue;\n }\n\n if (st.heal) {\n if (this.jobManager.isBlocked('heal', entityId)) { st.heal = false; markBusy(st, 'heal'); continue; }\n this.jobManager.acquireLock('heal', entityId);\n let h: HealResult;\n try {\n h = await this.maintenanceService.doRunHeal(entityId, { trigger: 'call', meter });\n } finally {\n this.jobManager.releaseLock('heal', entityId);\n }\n // Defense against future doRunHeal changes: scanned === 0 means the\n // pass bailed before any LLM call, so budgetStop cannot arise there\n // today — but if it ever did, classify it instead of mislabeling a\n // never-started job as exhausted.\n if (h.budgetStop && h.scanned === 0) {\n if (classify('heal', entityId, h.budgetStop.requiredEstimate) === 'exhausted') { stopped = exhaustedStop(); break rounds; }\n st.heal = false;\n continue;\n }\n // Nothing scanned yet candidates remain (e.g. a keyword outage skipped\n // the LLM pass): another round cannot progress, so stop healing this\n // entity for this run instead of looping forever.\n if (h.scanned === 0 && h.remaining > 0) {\n st.heal = false;\n if (h.searchUnavailable) markSearchUnavailable(st, 'heal');\n continue;\n }\n st.report.healPasses++;\n progressed = true;\n if (h.remaining === 0) {\n st.heal = false;\n await this.metadataRepo.updateCheckpoint(entityId, { heal: await this.eventRepo.count(entityId) }, this.db);\n }\n if (h.budgetStop) { stopped = exhaustedStop(); break rounds; }\n continue;\n }\n\n if (st.reembed) {\n st.reembed = false;\n try {\n await this.maintenanceService.runReembed(entityId);\n st.report.reembedded = true;\n progressed = true;\n } catch (err) {\n if (err instanceof WikiBusyError) markBusy(st, 'reembed');\n else throw err;\n }\n }\n }\n if (!progressed && openJobs() === openAtStart) break;\n }\n\n if (stopped.reason === 'complete' && tooSmall) stopped = tooSmall;\n return {\n perEntity: states.map((s) => s.report),\n tokensUsed: meter.used,\n estimated: meter.estimated,\n remaining: budget === undefined ? null : meter.remaining,\n stoppedReason: stopped,\n };\n }\n}\n","import type { OntologyMode } from '../types';\n\nconst FACT_ONTOLOGY_FIELDS = `\nEach fact may optionally include:\n- \"okf_type\": string — must be one of the node_types in the manifest\n- \"edges\": [{ \"edge_type\": string, \"target_title\": string }] — target_title must match another fact's title in this response or existing memory\n- An edge_type may appear in the manifest multiple times with different source_type/target_type; use the row whose types match your fact and target.`;\n\nconst EMERGENT_EXTRA = `\nYou may also return \"ontology_updates\" to propose new types:\n\"ontology_updates\": {\n \"node_types\": [{ \"type\": \"slug\", \"description\": \"...\", \"parent_type\": \"optional existing slug\" }],\n \"edge_types\": [{ \"type\": \"slug\", \"source_type\": \"...\", \"target_type\": \"...\", \"description\": \"...\" }]\n}\nOnly propose types not already in the manifest. Do not redefine existing types.`;\n\nexport function buildOntologyPromptAppendix(\n mode: OntologyMode,\n manifestJson: string,\n): { ontologyManifest: string; ontologyModeInstructions: string } {\n const strictRules = mode === 'strict'\n ? 'STRICT MODE: Use ONLY types defined in the manifest. If a fact does not fit any node_type, omit okf_type and edges entirely.'\n : 'EMERGENT MODE: Prefer manifest types. You may propose new types via ontology_updates when necessary.';\n\n const fallback = 'If okf_type or an edge is invalid, omit them rather than inventing unlisted types.';\n\n const ontologyModeInstructions = [\n '## Ontology constraints',\n strictRules,\n fallback,\n FACT_ONTOLOGY_FIELDS,\n mode === 'emergent' ? EMERGENT_EXTRA : '',\n 'Manifest:',\n manifestJson,\n ].filter(Boolean).join('\\n');\n\n return { ontologyManifest: manifestJson, ontologyModeInstructions };\n}\n","import type {\n OntologyConfig,\n OntologyManifest,\n OntologyMode,\n OntologyPromptContext,\n OntologyUpdates,\n ExtractedFactWithOntology,\n ExtractedFactEdge,\n SQLiteAdapter,\n WikiEdge,\n} from '../types';\nimport { WikiStrictOntologyViolation } from '../types';\nimport type { MetadataRepository } from '../repositories/MetadataRepository';\nimport type { EdgeRepository } from '../repositories/EdgeRepository';\nimport { buildOntologyPromptAppendix } from '../prompts/ontology';\nimport {\n emptyManifest,\n normalizeTitleKey,\n resolveNodeType,\n resolveEdgeDefinitions,\n typeSatisfies,\n validateInlineEdges,\n validateManifest,\n type EdgeDrop,\n} from '../utils/ontology';\nimport { generateId } from '../utils/ids';\n\nexport type TitleIndexEntry = { id: string; okf_type: string | null };\n\n/**\n * Coordinates ontology mode resolution, manifest caching, LLM output validation, and edge persistence.\n * Cache is per WikiMemory instance (single-process); not shared across instances.\n */\nexport class OntologyService {\n private cache = new Map<string, { mode: OntologyMode; manifest: OntologyManifest }>();\n\n constructor(\n private metadataRepo: MetadataRepository,\n private edgeRepo: EdgeRepository,\n private ontologyConfig?: OntologyConfig,\n ) {}\n\n resolveMode(storedMode?: OntologyMode): OntologyMode {\n return storedMode ?? this.ontologyConfig?.mode ?? 'off';\n }\n\n invalidateCache(entityId: string): void {\n this.cache.delete(entityId);\n }\n\n async getEffectiveState(entityId: string, tx?: SQLiteAdapter): Promise<{\n mode: OntologyMode;\n manifest: OntologyManifest;\n }> {\n if (!tx) {\n const cached = this.cache.get(entityId);\n if (cached) return cached;\n }\n\n const row = await this.metadataRepo.getManifest(entityId, tx);\n if (row) {\n const state = { mode: this.resolveMode(row.mode), manifest: row.manifest };\n if (!tx) this.cache.set(entityId, state);\n return state;\n }\n\n const seed = this.ontologyConfig?.seedManifests?.[entityId];\n if (seed) {\n // D11: the tx branch validates via setManifest; the cache branch did not.\n validateManifest(seed.manifest);\n const state = {\n mode: this.resolveMode(seed.mode),\n manifest: seed.manifest,\n };\n if (tx) {\n await this.metadataRepo.setManifest(entityId, state, tx);\n } else {\n this.cache.set(entityId, state);\n }\n return state;\n }\n\n return { mode: 'off', manifest: emptyManifest() };\n }\n\n async buildPromptContext(entityId: string): Promise<OntologyPromptContext | null> {\n const { mode, manifest } = await this.getEffectiveState(entityId);\n if (mode === 'off') return null;\n const manifestJson = JSON.stringify(manifest, null, 2);\n return buildOntologyPromptAppendix(mode, manifestJson);\n }\n\n async mergeEmergentUpdates(\n entityId: string,\n updates: OntologyUpdates,\n tx: SQLiteAdapter,\n ): Promise<OntologyManifest> {\n const merged = await this.metadataRepo.mergeManifestUpdates(entityId, updates, tx);\n this.invalidateCache(entityId);\n return merged;\n }\n\n validateAndNormalizeFact(\n fact: ExtractedFactWithOntology,\n manifest: OntologyManifest,\n opts?: { strict?: boolean; entityId?: string; drops?: EdgeDrop[] },\n ): { okf_type: string | null; edges: ExtractedFactEdge[] } {\n const rawType = typeof fact.okf_type === 'string' ? fact.okf_type : '';\n const strict = opts?.strict === true;\n const canonical = resolveNodeType(rawType, manifest);\n if (!canonical) {\n if (strict) throw new WikiStrictOntologyViolation(opts?.entityId ?? '', 'node', rawType);\n if (opts?.drops && Array.isArray(fact.edges)) {\n for (const edge of fact.edges) {\n opts.drops.push({\n reason: 'no_source_type',\n sourceId: null,\n edgeType: typeof edge?.edge_type === 'string' ? edge.edge_type : null,\n sourceNodeType: null,\n targetNodeType: null,\n });\n }\n }\n return { okf_type: null, edges: [] };\n }\n const edges = validateInlineEdges(canonical, null, fact.edges ?? [], manifest, opts);\n return { okf_type: canonical, edges };\n }\n\n /**\n * Pure resolver: given a source type, LLM-supplied edges, the manifest,\n * and a title index, return a list of concrete `WikiEdge` objects ready\n * for persistence. Performs no DB writes. Used by callers that batch edge\n * writes inside their own transaction (e.g. `IngestionService.ingestDocument`\n * when delegating to `upsertGraphCore`).\n */\n resolveEdges(\n entityId: string,\n sourceId: string,\n sourceType: string | null,\n edges: ExtractedFactEdge[],\n manifest: OntologyManifest,\n titleIndex: Map<string, TitleIndexEntry>,\n now: number,\n drops?: EdgeDrop[],\n ): WikiEdge[] {\n if (edges.length === 0) return [];\n if (!sourceType) {\n for (const edge of edges) {\n drops?.push({ reason: 'no_source_type', sourceId, edgeType: edge.edge_type, sourceNodeType: null, targetNodeType: null });\n }\n return [];\n }\n const out: WikiEdge[] = [];\n for (const edge of edges) {\n const candidates = resolveEdgeDefinitions(edge.edge_type, manifest)\n .filter(d => typeSatisfies(d.source_type, sourceType, manifest));\n if (candidates.length === 0) {\n drops?.push({ reason: 'type_not_in_manifest', sourceId, edgeType: edge.edge_type, sourceNodeType: sourceType, targetNodeType: null });\n continue;\n }\n\n const targetKey = normalizeTitleKey(edge.target_title);\n const target = titleIndex.get(targetKey);\n if (!target) {\n drops?.push({ reason: 'target_not_found', sourceId, edgeType: edge.edge_type, sourceNodeType: sourceType, targetNodeType: null });\n continue;\n }\n\n const targetType = (target.okf_type ?? '').trim().toLowerCase();\n const def = candidates.find(d => d.target_type.trim().toLowerCase() === targetType)\n ?? candidates.find(d => typeSatisfies(d.target_type, targetType, manifest));\n if (!def) {\n drops?.push({\n reason: 'target_type_mismatch', sourceId, edgeType: edge.edge_type,\n sourceNodeType: sourceType, targetNodeType: target.okf_type ?? null,\n });\n continue;\n }\n\n out.push({\n id: generateId(),\n entity_id: entityId,\n source_id: sourceId,\n target_id: target.id,\n edge_type: def.type,\n created_at: now,\n });\n }\n return out;\n }\n\n /**\n * Backwards-compatible wrapper: resolves edges via {@link resolveEdges},\n * then persists each via `edgeRepo.addIgnoreDuplicate` in the supplied\n * transaction. Returns the number of edges persisted. Used by paths that\n * want self-contained edge persistence (e.g. MaintenanceService heal /\n * backfill callers that do not have a separate edge-write step).\n */\n async resolveAndPersistEdges(\n entityId: string,\n sourceId: string,\n sourceType: string | null,\n edges: ExtractedFactEdge[],\n manifest: OntologyManifest,\n titleIndex: Map<string, TitleIndexEntry>,\n tx: SQLiteAdapter,\n now: number,\n drops?: EdgeDrop[],\n ): Promise<number> {\n const resolved = this.resolveEdges(entityId, sourceId, sourceType, edges, manifest, titleIndex, now, drops);\n let persisted = 0;\n for (const edge of resolved) {\n const inserted = await this.edgeRepo.addIgnoreDuplicate(edge, tx);\n if (inserted) persisted++;\n }\n return persisted;\n }\n}\n","import type { EdgeRepository, NeighborhoodQueryOptions } from '../repositories/EdgeRepository';\nimport type { EntryRepository } from '../repositories/EntryRepository';\nimport type { GraphTraversalOptions, GraphNeighborhood, WikiConfig } from '../types';\nimport { WikiInvalidReadOptions } from '../types';\nimport { isLiveAt } from '../utils/temporal';\nimport { packFactsByBudget, factTokenCost } from '../utils/budget';\n\n/**\n * Pure orchestrator — no SQL. Merges WikiConfig defaults with per-call options,\n * delegates the recursive walk to EdgeRepository, then hydrates node IDs into facts.\n */\nexport class GraphTraversalService {\n constructor(\n private edgeRepo: EdgeRepository,\n private entryRepo: EntryRepository,\n private config: WikiConfig,\n ) {}\n\n async traverseGraph(entityId: string, options: GraphTraversalOptions): Promise<GraphNeighborhood> {\n const fallbackMaxNodes = 20;\n const rawConfigDefault = this.config.maxTraversalNodes ?? fallbackMaxNodes;\n const defaultMaxNodes =\n Number.isFinite(rawConfigDefault) && rawConfigDefault >= 1\n ? Math.floor(rawConfigDefault)\n : fallbackMaxNodes;\n const rawMaxNodes = options.maxTraversalNodes ?? defaultMaxNodes;\n const maxNodes =\n Number.isFinite(rawMaxNodes) && rawMaxNodes >= 1 ? Math.floor(rawMaxNodes) : defaultMaxNodes;\n\n const rawAsOf = options.asOf;\n if (rawAsOf !== undefined && !(typeof rawAsOf === 'number' && Number.isFinite(rawAsOf) && rawAsOf >= 0)) {\n throw new WikiInvalidReadOptions('asOf', 'must be a finite epoch-ms number >= 0');\n }\n const rawTokenBudget = options.tokenBudget;\n if (rawTokenBudget !== undefined && !(typeof rawTokenBudget === 'number' && Number.isFinite(rawTokenBudget) && rawTokenBudget >= 0)) {\n throw new WikiInvalidReadOptions('tokenBudget', 'must be a finite number >= 0');\n }\n const live = rawAsOf === undefined\n ? { mode: 'current' as const, t: Date.now() }\n : { mode: 'asOf' as const, t: Math.trunc(rawAsOf) };\n\n const opts: NeighborhoodQueryOptions = {\n maxDepth: Math.max(1, Math.min(options.maxDepth ?? 1, 3)),\n direction: options.direction ?? this.config.traversalDirection ?? 'both',\n edgeTypes: options.edgeTypes,\n minConfidence: options.minTraversalConfidence ?? this.config.minTraversalConfidence ?? 'tentative',\n excludeSourceTypes: options.excludeSourceTypes ?? this.config.excludeSourceTypes ?? [],\n excludeDrafts: options.excludeDrafts ?? this.config.excludeDrafts ?? false,\n live,\n maxNodes,\n };\n\n const { nodeIds, edges } = await this.edgeRepo.getNeighborhood(entityId, options.sourceId, opts);\n if (nodeIds.length === 0) return { nodes: [], edges: [] };\n\n // Spec §10.7: a non-live anchor returns alone — both endpoints of a\n // walkable edge must be live at the query instant.\n const [anchor] = await this.entryRepo.findByIds([options.sourceId], [entityId]);\n if (anchor && !isLiveAt(anchor, live.mode, live.t)) return { nodes: [anchor], edges: [] };\n\n // findByIds() returns facts in input-ID order (Map-based lookup,\n // see packages/core/src/repositories/EntryRepository.ts:104-108) — no re-sort needed.\n const nodes = await this.entryRepo.findByIds(nodeIds, [entityId]);\n const hydratedIds = new Set(nodes.map((node) => node.id));\n const filteredEdges = edges.filter(\n (edge) => hydratedIds.has(edge.source_id) && hydratedIds.has(edge.target_id),\n );\n if (options.tokenBudget === undefined) return { nodes, edges: filteredEdges };\n const budget = Math.trunc(options.tokenBudget);\n const [anchorPacked] = packFactsByBudget([nodes[0]], budget).items;\n const kept = [anchorPacked];\n let used = factTokenCost(anchorPacked);\n for (const node of nodes.slice(1)) {\n const cost = factTokenCost(node);\n if (used + cost <= budget) { kept.push(node); used += cost; }\n }\n const keptIds = new Set(kept.map((n) => n.id));\n return { nodes: kept, edges: filteredEdges.filter((e) => keptIds.has(e.source_id) && keptIds.has(e.target_id)) };\n }\n}\n","import { BaseRepository } from './BaseRepository';\n\n/** Read-only queries for `lint` (spec §8.1). Every statement is entity-scoped. */\nexport class LintRepository extends BaseRepository {\n async countFactHealth(entityId: string): Promise<{ untypedFacts: number; drafts: number; unverifiedInferred: number }> {\n const row = await this.db.getFirstAsync<{ untyped: number | null; drafts: number | null; unverified: number | null }>(\n `SELECT\n SUM(CASE WHEN okf_type IS NULL THEN 1 ELSE 0 END) AS untyped,\n SUM(CASE WHEN lifecycle_status = 'draft' THEN 1 ELSE 0 END) AS drafts,\n SUM(CASE WHEN source_type = 'librarian_inferred'\n AND COALESCE(json_array_length(CASE WHEN json_valid(okf_verified) THEN okf_verified END), 0) = 0\n THEN 1 ELSE 0 END) AS unverified\n FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL`,\n [entityId],\n );\n return {\n untypedFacts: Number(row?.untyped ?? 0),\n drafts: Number(row?.drafts ?? 0),\n unverifiedInferred: Number(row?.unverified ?? 0),\n };\n }\n\n private danglingWhere(): string {\n const live = (col: string) =>\n `EXISTS (SELECT 1 FROM ${this.prefix}entries n WHERE n.id = e.${col} AND n.entity_id = e.entity_id AND n.deleted_at IS NULL)`;\n return `e.entity_id = ? AND (NOT ${live('source_id')} OR NOT ${live('target_id')})`;\n }\n\n async countDanglingEdges(entityId: string): Promise<number> {\n const row = await this.db.getFirstAsync<{ n: number }>(\n `SELECT COUNT(*) AS n FROM ${this.prefix}edges e WHERE ${this.danglingWhere()}`,\n [entityId],\n );\n return Number(row?.n ?? 0);\n }\n\n async sampleDanglingEdgeIds(entityId: string, limit: number): Promise<string[]> {\n const rows = await this.db.getAllAsync<{ id: string }>(\n `SELECT e.id FROM ${this.prefix}edges e WHERE ${this.danglingWhere()} ORDER BY e.id ASC LIMIT ?`,\n [entityId, limit],\n );\n return rows.map((r) => r.id);\n }\n\n /** Keyset page of edges whose endpoints are both live in this entity, with endpoint types. */\n async pageLiveEdges(\n entityId: string,\n afterId: string,\n limit: number,\n ): Promise<Array<{ id: string; edge_type: string; source_type: string | null; target_type: string | null }>> {\n return this.db.getAllAsync(\n `SELECT e.id, e.edge_type, s.okf_type AS source_type, t.okf_type AS target_type\n FROM ${this.prefix}edges e\n JOIN ${this.prefix}entries s ON s.id = e.source_id AND s.entity_id = e.entity_id AND s.deleted_at IS NULL\n JOIN ${this.prefix}entries t ON t.id = e.target_id AND t.entity_id = e.entity_id AND t.deleted_at IS NULL\n WHERE e.entity_id = ? AND e.id > ?\n ORDER BY e.id ASC\n LIMIT ?`,\n [entityId, afterId, limit],\n );\n }\n}\n","import type { WikiLintReport } from '../types';\nimport type { LintRepository } from '../repositories/LintRepository';\nimport type { OntologyService } from './OntologyService';\nimport { edgeTripleAllowed } from '../utils/ontology';\n\nconst LINT_SAMPLE_SIZE = 20;\nconst LINT_PAGE_SIZE = 500;\n\nexport class LintService {\n constructor(private lintRepo: LintRepository, private ontologyService: OntologyService) {}\n\n /**\n * Read-only (spec §8.1). Manifest violations stream the entity's live-endpoint\n * edges in keyset pages and check each triple in JS against the effective\n * manifest. `getEffectiveState` is called without a transaction, so a seed\n * manifest is cached, never persisted. Counts come from separate statements,\n * not one snapshot.\n */\n async lint(entityId: string): Promise<WikiLintReport> {\n const health = await this.lintRepo.countFactHealth(entityId);\n const danglingEdges = await this.lintRepo.countDanglingEdges(entityId);\n const danglingEdgeIds = danglingEdges > 0 ? await this.lintRepo.sampleDanglingEdgeIds(entityId, LINT_SAMPLE_SIZE) : [];\n\n const { mode, manifest } = await this.ontologyService.getEffectiveState(entityId);\n const constrained = mode !== 'off'\n && ((manifest.node_types?.length ?? 0) > 0 || (manifest.edge_types?.length ?? 0) > 0);\n let manifestViolations = 0;\n const manifestViolationEdgeIds: string[] = [];\n if (constrained) {\n let after = '';\n for (;;) {\n const page = await this.lintRepo.pageLiveEdges(entityId, after, LINT_PAGE_SIZE);\n for (const e of page) {\n if (!edgeTripleAllowed(manifest, e.edge_type, e.source_type ?? '', e.target_type ?? '')) {\n manifestViolations++;\n if (manifestViolationEdgeIds.length < LINT_SAMPLE_SIZE) manifestViolationEdgeIds.push(e.id);\n }\n }\n if (page.length < LINT_PAGE_SIZE) break;\n after = page[page.length - 1].id;\n }\n }\n\n return {\n danglingEdges,\n manifestViolations,\n ...health,\n sample: { danglingEdgeIds, manifestViolationEdgeIds },\n };\n }\n}\n","import type { SQLiteAdapter } from '../types';\nimport {\n formatSourcesJson,\n formatVerifiedJson,\n latestVerified,\n} from '@equationalapplications/core-okf';\n\nexport type OkfSource = {\n id?: string;\n resource: string;\n title?: string;\n author?: string;\n usage_count?: number;\n last_modified?: string;\n usage_window?: { from: string; to: string };\n};\nexport type OkfVerifiedEntry = { by: string; at: string };\n\n/**\n * DAO discipline (spec §8): only knowledge-content writes may bump `updated_at`.\n * Trust / provenance / lifecycle / freshness writes MUST NOT touch it. Every\n * `UPDATE` in this class is a non-content metadata write. Tests in\n * `__tests__/daoDiscipline.test.ts` and `__tests__/okfTrustWrites.test.ts`\n * snapshot the SQL via a logging adapter and assert the SET clause omits\n * `updated_at`.\n *\n * Deliberately does NOT push an outbox event, unlike `EntryRepository.upsert`\n * / `TaskRepository.upsert` (spec §8 \"Outbox/transaction scope\" note): outbox\n * delivery exists for *content* sync, and these writes are metadata, not\n * content, by the same reasoning that exempts them from `updated_at`. A\n * downstream sync consumer will not learn about a new verifier until the\n * next full re-export/re-import — accepted for v0.2.\n */\nexport class OkfTrustWritesRepository {\n constructor(private db: SQLiteAdapter, private prefix: string) {}\n\n private getExecutor(tx?: SQLiteAdapter): SQLiteAdapter {\n return tx ?? this.db;\n }\n\n /**\n * Append one or more verification events to a fact's `okf_verified` JSON\n * array, atomically, in a single SQL statement.\n *\n * The implementation uses json_each over the existing array UNION ALL'd\n * with json_each over the new events wrapped in json_group_array — a single\n * UPDATE expression. SQLite serializes this against concurrent writers on\n * the same row, so two callers appending simultaneously cannot lose each\n * other's events (the previous implementation serialized only the supplied\n * array and overwrote, dropping any pre-existing history).\n *\n * Sets the `last_verified_*` convenience columns from the latest event in\n * the union (computed in code; see {@link latestVerified}).\n */\n async writeOkfTrust(\n entryId: string,\n entityId: string,\n verified: OkfVerifiedEntry[],\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n if (verified.length === 0) return;\n const latest = latestVerified(verified, Date.now());\n const newEventsJson = JSON.stringify(verified);\n await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET okf_verified = COALESCE(\n (SELECT json_group_array(json_object('by', s.by_val, 'at', s.at_val))\n FROM (\n SELECT json_extract(value, '$.by') AS by_val,\n json_extract(value, '$.at') AS at_val\n FROM json_each(okf_verified)\n UNION ALL\n SELECT json_extract(value, '$.by'),\n json_extract(value, '$.at')\n FROM json_each(?)\n ) AS s\n ORDER BY s.at_val),\n '[]'\n ),\n last_verified_by = ?,\n last_verified_at = ?\n WHERE id = ? AND entity_id = ?`,\n [newEventsJson, latest?.by ?? null, latest?.at ?? null, entryId, entityId],\n );\n }\n\n /** Replace the `sources` list (provenance). */\n async writeOkfSources(\n entryId: string,\n entityId: string,\n sources: OkfSource[],\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n const json = formatSourcesJson(sources);\n await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET okf_sources = ?\n WHERE id = ? AND entity_id = ?`,\n [json, entryId, entityId],\n );\n }\n\n /** Set the OKF v0.2 lifecycle status. */\n async setLifecycleStatus(\n entryId: string,\n entityId: string,\n status: 'draft' | 'stable' | 'deprecated',\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET lifecycle_status = ?\n WHERE id = ? AND entity_id = ?`,\n [status, entryId, entityId],\n );\n }\n\n /** Set the absolute cutoff (epoch ms) for staleness, or NULL to clear. */\n async setStaleAfter(\n entryId: string,\n entityId: string,\n date: number | null,\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET stale_after = ?\n WHERE id = ? AND entity_id = ?`,\n [date, entryId, entityId],\n );\n }\n\n /** Set the producer / verifier actor string. Rare. */\n async setGeneratedBy(\n entryId: string,\n entityId: string,\n actor: string,\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET generated_by = ?\n WHERE id = ? AND entity_id = ?`,\n [actor, entryId, entityId],\n );\n }\n\n // The same five methods exist for tasks, with `tasks` instead of `entries`.\n // Tasks are symmetric per spec §2.5.\n\n /** Atomic append, task variant — mirrors {@link writeOkfTrust}. */\n async writeOkfTrustTask(\n taskId: string,\n entityId: string,\n verified: OkfVerifiedEntry[],\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n if (verified.length === 0) return;\n const latest = latestVerified(verified, Date.now());\n const newEventsJson = JSON.stringify(verified);\n await executor.runAsync(\n `UPDATE ${this.prefix}tasks\n SET okf_verified = COALESCE(\n (SELECT json_group_array(json_object('by', s.by_val, 'at', s.at_val))\n FROM (\n SELECT json_extract(value, '$.by') AS by_val,\n json_extract(value, '$.at') AS at_val\n FROM json_each(okf_verified)\n UNION ALL\n SELECT json_extract(value, '$.by'),\n json_extract(value, '$.at')\n FROM json_each(?)\n ) AS s\n ORDER BY s.at_val),\n '[]'\n ),\n last_verified_by = ?,\n last_verified_at = ?\n WHERE id = ? AND entity_id = ?`,\n [newEventsJson, latest?.by ?? null, latest?.at ?? null, taskId, entityId],\n );\n }\n\n async writeOkfSourcesTask(\n taskId: string,\n entityId: string,\n sources: OkfSource[],\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n const json = formatSourcesJson(sources);\n await executor.runAsync(\n `UPDATE ${this.prefix}tasks\n SET okf_sources = ?\n WHERE id = ? AND entity_id = ?`,\n [json, taskId, entityId],\n );\n }\n\n async setLifecycleStatusTask(\n taskId: string,\n entityId: string,\n status: 'draft' | 'stable' | 'deprecated',\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `UPDATE ${this.prefix}tasks\n SET lifecycle_status = ?\n WHERE id = ? AND entity_id = ?`,\n [status, taskId, entityId],\n );\n }\n\n async setStaleAfterTask(\n taskId: string,\n entityId: string,\n date: number | null,\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `UPDATE ${this.prefix}tasks\n SET stale_after = ?\n WHERE id = ? AND entity_id = ?`,\n [date, taskId, entityId],\n );\n }\n\n async setGeneratedByTask(\n taskId: string,\n entityId: string,\n actor: string,\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `UPDATE ${this.prefix}tasks\n SET generated_by = ?\n WHERE id = ? AND entity_id = ?`,\n [actor, taskId, entityId],\n );\n }\n}\n","import type { SQLiteAdapter } from './types';\nimport type { WikiOutboxEvent } from './outbox/types';\nimport { setupDatabaseWithGate } from './db/migrationGate';\nimport { detectSchemaVersion, runSourceRefNormalize, writeNormalizeStamp } from './db/sourceRefNormalize';\nimport { withSerializedTransactions } from './db/serializedAdapter';\nimport { MIGRATIONS, CURRENT_SCHEMA_VERSION, createLegacySourceTypeIndex } from './db/migrations';\nimport {\n WikiOptions,\n MemoryBundle,\n MemoryDump,\n WikiEvent,\n EntityStatus,\n ReadOptions,\n WikiSourceRefHashCollision,\n WikiDraftNotFound,\n WikiSupersedeError,\n} from './types';\nimport type { DraftPage, MigrationPolicy } from './types';\nimport type { PendingSourceStatus, WikiLintReport, WikiInstructions, PendingMaintenance, RunPendingMaintenanceOptions, RunPendingMaintenanceResult } from './types';\nimport { EntryRepository } from './repositories/EntryRepository';\nimport { OutboxRepository } from './repositories/OutboxRepository';\nimport { SourceRefIndexRepository } from './repositories/SourceRefIndexRepository';\nimport { TaskRepository } from './repositories/TaskRepository';\nimport { EventRepository } from './repositories/EventRepository';\nimport { EdgeRepository } from './repositories/EdgeRepository';\nimport { MetadataRepository, entitySummaryMetaKey } from './repositories/MetadataRepository';\nimport { SearchService } from './services/SearchService';\nimport { MiniSearchIndexStrategy } from './services/search/MiniSearchIndexStrategy';\nimport { createIndexStrategy } from './services/search/createIndexStrategy';\nimport { monotonicNow } from './utils/monotonicNow';\nimport { DEFAULT_SETUP_BUDGET_MS } from './utils/setupDefaults';\nimport { JobManager } from './services/JobManager';\nimport { normalizeSourceRef, normalizeSourceHash, validateFact, validateTask, clip, chunkText } from './utils/pure';\nimport { resolveGrounding } from './utils/grounding';\nimport { IngestionService } from './services/IngestionService';\nimport { MaintenanceService } from './services/MaintenanceService';\nimport { MaintenanceScheduler } from './services/MaintenanceScheduler';\nimport { ImportExportService } from './services/ImportExportService';\nimport { EmbeddingService } from './services/EmbeddingService';\nimport { RetrievalService } from './services/RetrievalService';\nimport { WriteService } from './services/WriteService';\nimport { PromptService } from './services/PromptService';\nimport { OntologyService } from './services/OntologyService';\nimport { GraphTraversalService } from './services/GraphTraversalService';\nimport { LintRepository } from './repositories/LintRepository';\nimport { LintService } from './services/LintService';\nimport { OkfTrustWritesRepository } from './db/okf-trust-writes';\nimport { TemporalService } from './services/TemporalService';\nimport { validateManifest } from './utils/ontology';\nimport { DiagnosticBuffer } from './utils/diagnostics';\nimport type { OntologyManifest, OntologyMode, GraphTraversalOptions, GraphNeighborhood, OntologyBackfillResult, HealResult, IngestDocumentResult, ReembedResult, SupersedeReplacement, WikiFact } from './types';\n\nexport { WikiBusyError, WikiTransactionError, PrunePartialFailureError, HOOK_TIMEOUT_MARKER, WikiStrictOntologyViolation, WikiSourceRefHashCollision, WikiParseError, WikiIngestEmptyError, WikiGraphNodeOwnershipConflict } from './types';\n\nconst TABLE_PREFIX_PATTERN = /^[A-Za-z][A-Za-z0-9_]{0,30}_$/;\n/**\n * Backoff between failed no-arg syncSearchIndex() re-init attempts (spec #280\n * Change 4): doubles per consecutive failure from the base up to the cap, and\n * is never shorter than SEARCH_REINIT_COST_FACTOR × the failed attempt's own\n * duration, so a slow attempt (backoff + rebuild under the write lock) can\n * take at most ~1/(factor+1) of wall time.\n */\nconst SEARCH_REINIT_COOLDOWN_MS = 5_000;\nconst SEARCH_REINIT_COOLDOWN_MAX_MS = 5 * 60_000;\nconst SEARCH_REINIT_COST_FACTOR = 10;\n\n/** Typed escape hatch for tests — not part of the supported consumer API. */\nexport interface WikiMemoryTestAccess {\n embeddingService: EmbeddingService;\n importExportService: ImportExportService;\n ingestionService: IngestionService;\n maintenanceService: MaintenanceService;\n maintenanceScheduler: MaintenanceScheduler;\n retrievalService: RetrievalService;\n searchService: SearchService;\n writeService: WriteService;\n promptService: PromptService;\n graphTraversalService: GraphTraversalService;\n temporalService: TemporalService;\n entryRepo: EntryRepository;\n sourceRefIndexRepo: SourceRefIndexRepository;\n metadataRepo: MetadataRepository;\n jobManager: JobManager;\n}\n\n/** `listDrafts` cursors are `${created_at}:${id}`; opaque to callers. */\nfunction decodeDraftCursor(cursor: unknown): { createdAt: number; id: string } {\n const sep = typeof cursor === 'string' ? cursor.indexOf(':') : -1;\n const createdAt = sep > 0 ? Number((cursor as string).slice(0, sep)) : Number.NaN;\n const id = sep > 0 ? (cursor as string).slice(sep + 1) : '';\n if (!Number.isSafeInteger(createdAt) || id.length === 0) {\n throw new TypeError('Invalid listDrafts cursor.');\n }\n return { createdAt, id };\n}\n\nexport class WikiMemory {\n /** Emits `__testAccess` console warning at most once per instance when NODE_ENV ≠ \"test\". */\n #testAccessNonTestEnvWarned = false;\n\n private db: SQLiteAdapter;\n private prefix: string;\n private options: WikiOptions;\n private entryRepo: EntryRepository;\n private outboxRepo: OutboxRepository;\n private sourceRefIndexRepo: SourceRefIndexRepository;\n private taskRepo: TaskRepository;\n private eventRepo: EventRepository;\n private edgeRepo: EdgeRepository;\n private metadataRepo: MetadataRepository;\n private embeddingService: EmbeddingService;\n private searchService: SearchService;\n private jobManager: JobManager;\n private ingestionService: IngestionService;\n private maintenanceService: MaintenanceService;\n private maintenanceScheduler: MaintenanceScheduler;\n private importExportService: ImportExportService;\n private retrievalService: RetrievalService;\n private writeService: WriteService;\n private promptService: PromptService;\n private ontologyService: OntologyService;\n private graphTraversalService: GraphTraversalService;\n private lintRepo: LintRepository;\n private lintService: LintService;\n private temporalService: TemporalService;\n private readonly okfTrustWrites: OkfTrustWritesRepository;\n\n constructor(db: SQLiteAdapter, options: WikiOptions) {\n // Serialize transactions on the single shared connection before the adapter\n // reaches any repository or service. See docs/superpowers/specs/2026-07-09-transaction-serialization-spec.md.\n this.db = withSerializedTransactions(db);\n this.options = options;\n this.prefix = options.config?.tablePrefix ?? 'llm_wiki_';\n if (!TABLE_PREFIX_PATTERN.test(this.prefix)) {\n throw new Error(\n `Invalid tablePrefix: ${JSON.stringify(this.prefix)}. ` +\n `Must match ${TABLE_PREFIX_PATTERN} (letter, then alphanumeric/underscore, ending in \"_\", max 32 chars total).`,\n );\n }\n this.outboxRepo = new OutboxRepository(this.db, this.prefix, !!options.config?.enableOutbox);\n this.entryRepo = new EntryRepository(this.db, this.prefix, this.outboxRepo);\n this.sourceRefIndexRepo = new SourceRefIndexRepository(this.db, this.prefix);\n this.taskRepo = new TaskRepository(this.db, this.prefix, this.outboxRepo);\n this.eventRepo = new EventRepository(this.db, this.prefix);\n this.edgeRepo = new EdgeRepository(this.db, this.prefix);\n this.metadataRepo = new MetadataRepository(this.db, this.prefix);\n this.lintRepo = new LintRepository(this.db, this.prefix);\n this.ontologyService = new OntologyService(\n this.metadataRepo,\n this.edgeRepo,\n options.config?.ontology,\n );\n this.lintService = new LintService(this.lintRepo, this.ontologyService);\n this.embeddingService = new EmbeddingService(this.db, this.options, this.entryRepo, this.metadataRepo);\n this.searchService = new SearchService(\n this.entryRepo,\n new MiniSearchIndexStrategy(),\n );\n this.temporalService = new TemporalService(this.db, this.options, this.entryRepo, this.searchService, this.embeddingService);\n this.jobManager = new JobManager(this.prefix);\n this.promptService = new PromptService(options.config?.prompts, resolveGrounding(options.config?.grounding));\n this.ingestionService = new IngestionService(\n this.db,\n this.prefix,\n this.options,\n this.entryRepo,\n this.sourceRefIndexRepo,\n this.metadataRepo,\n this.edgeRepo,\n this.searchService,\n this.jobManager,\n this.embeddingService,\n this.promptService,\n this.ontologyService,\n );\n this.maintenanceService = new MaintenanceService(\n this.db,\n this.prefix,\n this.options,\n this.entryRepo,\n this.sourceRefIndexRepo,\n this.taskRepo,\n this.eventRepo,\n this.metadataRepo,\n this.searchService,\n this.jobManager,\n this.embeddingService,\n this.promptService,\n this.ontologyService,\n );\n this.maintenanceScheduler = new MaintenanceScheduler(\n this.db,\n this.options,\n this.maintenanceService,\n this.metadataRepo,\n this.eventRepo,\n this.entryRepo,\n this.jobManager,\n );\n this.importExportService = new ImportExportService(\n this.db,\n this.entryRepo,\n this.taskRepo,\n this.eventRepo,\n this.edgeRepo,\n this.metadataRepo,\n this.searchService,\n this.jobManager,\n this.embeddingService,\n );\n this.retrievalService = new RetrievalService(\n this.options,\n this.entryRepo,\n this.taskRepo,\n this.eventRepo,\n this.metadataRepo,\n this.searchService,\n );\n this.writeService = new WriteService(\n this.db,\n this.options,\n this.entryRepo,\n this.eventRepo,\n this.metadataRepo,\n this.jobManager,\n this.maintenanceService,\n );\n this.graphTraversalService = new GraphTraversalService(\n this.edgeRepo,\n this.entryRepo,\n this.options.config ?? {},\n );\n this.okfTrustWrites = new OkfTrustWritesRepository(this.db, this.prefix);\n }\n\n /**\n * Explicit escape hatch for test suites: typed access to composed services for mocks/spies.\n * If `NODE_ENV` is not `\"test\"`, emits a single `console.warn` per instance (skipped when `process` is undefined).\n */\n get __testAccess(): WikiMemoryTestAccess {\n const processEnv = typeof globalThis !== 'undefined'\n ? (globalThis as any).process?.env\n : undefined;\n\n if (\n processEnv !== undefined &&\n processEnv.NODE_ENV !== 'test' &&\n !this.#testAccessNonTestEnvWarned\n ) {\n this.#testAccessNonTestEnvWarned = true;\n console.warn('Warning: WikiMemory.__testAccess is intended for tests (NODE_ENV !== \"test\").');\n }\n return {\n embeddingService: this.embeddingService,\n importExportService: this.importExportService,\n ingestionService: this.ingestionService,\n maintenanceService: this.maintenanceService,\n maintenanceScheduler: this.maintenanceScheduler,\n retrievalService: this.retrievalService,\n searchService: this.searchService,\n writeService: this.writeService,\n promptService: this.promptService,\n graphTraversalService: this.graphTraversalService,\n temporalService: this.temporalService,\n entryRepo: this.entryRepo,\n sourceRefIndexRepo: this.sourceRefIndexRepo,\n metadataRepo: this.metadataRepo,\n jobManager: this.jobManager,\n };\n }\n\n /** Max upsertGraph node ids held for their post-commit sync (spec #280 id threading). */\n static readonly UPSERT_ID_STASH_CAP = 10_000;\n /**\n * upsertGraph node and superseded-fact ids per entity, awaiting syncSearchIndex(), each with the\n * generation of its latest stash. Ids leave the stash only once a drain\n * succeeded, so a failed drain retries them next call.\n */\n private upsertIdStash = new Map<string, Map<string, number>>();\n /** Total ids across upsertIdStash, kept in step so the cap check is O(1). */\n private upsertIdStashSize = 0;\n /** Bumped per stashed id; a re-stash during an in-flight drain outlives that drain's drop. */\n private upsertIdStashGen = 0;\n\n private stashUpsertIds(entityId: string, ids: readonly string[]): void {\n // Only a ledger strategy drains by id; MiniSearch rebuilds the stale entity instead.\n if (!this.searchService.hasLedger()) return;\n const cap = (this.constructor as typeof WikiMemory).UPSERT_ID_STASH_CAP;\n const stash = this.upsertIdStash.get(entityId) ?? new Map<string, number>();\n for (const id of ids) {\n if (!stash.has(id)) {\n if (this.upsertIdStashSize >= cap) continue; // overflow: the entity-targeted / full-quantum drain covers the rest\n this.upsertIdStashSize++;\n }\n stash.set(id, ++this.upsertIdStashGen);\n }\n if (stash.size > 0) this.upsertIdStash.set(entityId, stash);\n }\n\n /** Snapshot of the stash (one entity, or all) with generations, without removing anything. */\n private peekStashedIds(entityId?: string): Map<string, Map<string, number>> {\n const snapshot = new Map<string, Map<string, number>>();\n for (const [id, stash] of this.upsertIdStash) {\n if (entityId === undefined || id === entityId) snapshot.set(id, new Map(stash));\n }\n return snapshot;\n }\n\n /**\n * Removes a drained snapshot. An id re-stashed after the peek has a newer\n * generation and stays: the drain may have run before that write committed.\n */\n private dropStashedIds(snapshot: Map<string, Map<string, number>>): void {\n for (const [entityId, drained] of snapshot) {\n const stash = this.upsertIdStash.get(entityId);\n if (!stash) continue;\n for (const [id, gen] of drained) {\n if (stash.get(id) === gen && stash.delete(id)) this.upsertIdStashSize--;\n }\n if (stash.size === 0) this.upsertIdStash.delete(entityId);\n }\n }\n\n /** `config.setupBudgetMs` or the default, validated: a positive finite number. */\n private setupBudgetMs(): number {\n const budget = this.options.config?.setupBudgetMs ?? DEFAULT_SETUP_BUDGET_MS;\n if (typeof budget !== 'number' || !Number.isFinite(budget) || budget <= 0) {\n throw new TypeError(`setupBudgetMs must be a positive finite number; got ${String(budget)}`);\n }\n return budget;\n }\n\n private reinitSearch: Promise<void> | null = null;\n /** Monotonic time before which a no-arg syncSearchIndex() skips the re-init (0 = no cooldown). */\n private reinitRetryAt = 0;\n /** Consecutive failed re-inits; drives the exponential backoff. */\n private reinitFailures = 0;\n\n /**\n * Opens the store: migration gate, DDL, schema migrations, then the stamped\n * source_ref normalize. Await it before any other call on this instance — the\n * normalize commits in chunks, so a sourceRef-keyed call (forget, upsertGraph,\n * hasChanged, ingest) issued before setup() resolves can see partially\n * normalized refs.\n *\n * Pass `{ migrations: 'refuse' }` from inside a writer lease: pending one-time\n * work then throws WikiMigrationRequiredError before any mutation, and the\n * host runs a plain `setup()` outside the lease.\n *\n * Keyword-index catch-up work is bounded by `config.setupBudgetMs`; anything\n * left converges on later opens and no-arg `syncSearchIndex()` calls. Not\n * bounded: an index reset (tokenizer change, re-attach after detach, a lost\n * or inconsistent index), which runs as one unchunked transaction.\n */\n async setup(opts?: { migrations?: MigrationPolicy }) {\n const setupBudgetMs = this.setupBudgetMs();\n // One deadline per open (spec #280 Change 3): captured here, never re-budgeted per turn.\n const openDeadline = monotonicNow() + setupBudgetMs;\n const entriesExistedBeforeSetup = await this.metadataRepo.tableExists(`${this.prefix}entries`);\n\n // The gate runs before any mutation: 'refuse' throws before tables are touched,\n // 'auto' lets only a pending source_ref normalize through (run below), 'allow' just sets up.\n const migrationPolicy = opts?.migrations ?? this.options.config?.migrations ?? 'allow';\n await setupDatabaseWithGate(this.db, this.prefix, this.metadataRepo, migrationPolicy);\n\n let currentVersion: number;\n\n if (!entriesExistedBeforeSetup) {\n // One transaction: a crash must never leave schema_version=14 without the index,\n // since no migration would rebuild it on the next open.\n await this.db.withTransactionAsync(async (tx) => {\n await createLegacySourceTypeIndex(tx, this.prefix);\n await writeNormalizeStamp(this.metadataRepo, tx);\n await this.metadataRepo.setMeta('schema_version', String(CURRENT_SCHEMA_VERSION), tx);\n });\n currentVersion = CURRENT_SCHEMA_VERSION;\n } else {\n currentVersion = await detectSchemaVersion(this.metadataRepo, this.prefix);\n }\n\n // Schema migrations. Under 'refuse'/'auto' the gate has already thrown if any are pending.\n for (const migration of MIGRATIONS) {\n if (migration.version > currentVersion) {\n await migration.run(this.db, this.prefix);\n await this.metadataRepo.setMeta('schema_version', String(migration.version), this.db);\n currentVersion = migration.version;\n }\n }\n\n if (entriesExistedBeforeSetup) {\n const schemaVersionCheck = await this.metadataRepo.getMeta('schema_version');\n if (!schemaVersionCheck) {\n await this.metadataRepo.setMeta('schema_version', String(currentVersion), this.db);\n }\n await this.importExportService.assertNoLegacySourceTypes();\n // Stamped, watermark-resumable normalization; no-op once the stamp matches.\n await runSourceRefNormalize(this.db, this.prefix, this.metadataRepo);\n }\n\n this.searchService.setIndexStrategy(\n await createIndexStrategy(\n this.db,\n this.prefix,\n this.metadataRepo,\n this.options.config?.indexStrategy ?? 'auto',\n { setupBudgetMs, entriesExisted: entriesExistedBeforeSetup },\n ),\n );\n // FTS5: one budgeted quantum (no global read). MiniSearch: full rebuild, as before.\n await this.searchService.sync(undefined, { deadline: openDeadline });\n }\n\n async hasChanged(\n entityId: string,\n sourceRef: string,\n sourceHash: string,\n ): Promise<boolean>;\n /**\n * Batched overload.\n *\n * `duplicateOf`, when present, is the canonical stored DIFFERENT `source_ref`\n * holding the same hash — never the incoming ref itself (the incoming ref is\n * excluded from the canonical-sort set so a self-reference is impossible).\n * `duplicateOf` reflects the *DB-side* normalized spelling; `sourceRef` in\n * each result echoes the raw caller value. Hosts should not compare these\n * two fields directly to infer canonical status.\n */\n async hasChanged(\n entityId: string,\n entries: Array<{ sourceRef: string; sourceHash: string }>,\n ): Promise<Array<{ sourceRef: string; changed: boolean; duplicateOf?: string }>>;\n async hasChanged(\n entityId: string,\n sourceRefOrEntries: string | Array<{ sourceRef: string; sourceHash: string }>,\n sourceHashArg?: string,\n ): Promise<boolean | Array<{ sourceRef: string; changed: boolean; duplicateOf?: string }>> {\n // Single-doc path: delegate to existing semantics.\n if (typeof sourceRefOrEntries === 'string') {\n const sourceRef = normalizeSourceRef(sourceRefOrEntries);\n if (!sourceRef) {\n throw new Error(`Invalid sourceRef: ${JSON.stringify(sourceRefOrEntries)}`);\n }\n const sourceHash = normalizeSourceHash(sourceHashArg!);\n if (!sourceHash) {\n throw new Error('Invalid sourceHash: must be a 64-character hex string (normalized to lowercase)');\n }\n const storedHash = await this.entryRepo.findLatestSourceHash(entityId, sourceRef);\n if (storedHash === null) return true;\n const normalizedStoredHash = normalizeSourceHash(storedHash);\n return normalizedStoredHash !== sourceHash;\n }\n\n // Batched path: empty input -> empty result, zero SQL calls.\n const entries = sourceRefOrEntries;\n if (entries.length === 0) return [];\n\n // Normalize all inputs (validation up front). Preserve the raw ref so the\n // result echoes the caller's spelling (DB refs are normalized on setup,\n // but the caller hasn't seen that normalization yet).\n const normalized = entries.map(e => {\n const r = normalizeSourceRef(e.sourceRef);\n if (!r) throw new Error(`Invalid sourceRef: ${JSON.stringify(e.sourceRef)}`);\n const h = normalizeSourceHash(e.sourceHash);\n if (!h) throw new Error('Invalid sourceHash: must be a 64-character hex string (normalized to lowercase)');\n return { rawSourceRef: e.sourceRef, sourceRef: r, sourceHash: h };\n });\n\n // 1 + H SQL queries: one batched latest-hash lookup, plus one source_ref_index\n // lookup per distinct input hash. Lookups are issued in parallel — the bound\n // is the SQL-query count, not the await count.\n const latestHashes = await this.entryRepo.findLatestSourceHashes(entityId, normalized.map(e => e.sourceRef));\n\n const distinctHashes = Array.from(new Set(normalized.map(e => e.sourceHash)));\n const dupRefs = await Promise.all(\n distinctHashes.map(h => this.sourceRefIndexRepo.findActiveByEntityAndHash(entityId, h)),\n );\n const dupMap = new Map<string, string | null>(); // hash -> canonical sourceRef (or null)\n for (let i = 0; i < distinctHashes.length; i++) {\n dupMap.set(distinctHashes[i], dupRefs[i]);\n }\n\n return normalized.map(e => {\n const stored = latestHashes.get(e.sourceRef);\n const changed = stored === undefined || stored === null || normalizeSourceHash(stored) !== e.sourceHash;\n const canonical = dupMap.get(e.sourceHash) ?? null;\n if (canonical === null || canonical === e.sourceRef) {\n return { sourceRef: e.rawSourceRef, changed };\n }\n // Canonical: the single sourceRef from source_ref_index that holds\n // this hash, if any. Because the partial UNIQUE index allows at most\n // one live row per (entity, hash), the canonical cannot be the\n // incoming ref (it would be the same sourceRef) — we filter that out\n // above. Non-ASCII sourceRefs are still compared by the DB's\n // source_ref index, so the canonical matches the DB ordering.\n return { sourceRef: e.rawSourceRef, changed, duplicateOf: canonical };\n });\n }\n\n /**\n * Batch pending state per source (spec §8.2). `current` exactly when\n * `hasChanged` is false; `partial` when live rows exist but none carries a\n * hash (a first ingest with a failed chunk, or imported rows without a\n * hash). A failed re-ingest of an already-hashed ref reports `changed`. Validation and raw-ref echo match\n * batched `hasChanged`. Input order and duplicates are preserved. A\n * non-array `sources`, or an entry that is not an object (including a hole\n * in a sparse array), throws a `TypeError` before any SQL runs.\n */\n async pendingSources(\n entityId: string,\n sources: Array<{ sourceRef: string; sourceHash: string }>,\n ): Promise<Array<{ sourceRef: string; status: PendingSourceStatus }>> {\n assertEntityId(entityId);\n if (!Array.isArray(sources)) {\n throw new TypeError('Invalid sources: must be an array of { sourceRef, sourceHash } objects.');\n }\n if (sources.length === 0) return [];\n // Array.from visits holes as undefined, so a sparse array fails the entry check.\n const normalized = Array.from(sources, (s: unknown, i) => {\n if (s === null || typeof s !== 'object') {\n throw new TypeError(`Invalid sources[${i}]: must be a { sourceRef, sourceHash } object.`);\n }\n const { sourceRef: rawSourceRef, sourceHash: rawSourceHash } = s as { sourceRef: string; sourceHash: string };\n const sourceRef = normalizeSourceRef(rawSourceRef);\n if (!sourceRef) {\n // JSON.stringify throws on a bigint; name the type for non-strings instead.\n const shown = typeof rawSourceRef === 'string' ? JSON.stringify(rawSourceRef) : `<${typeof rawSourceRef}>`;\n throw new Error(`Invalid sourceRef: ${shown}`);\n }\n const sourceHash = normalizeSourceHash(rawSourceHash);\n if (!sourceHash) throw new Error('Invalid sourceHash: must be a 64-character hex string (normalized to lowercase)');\n return { rawSourceRef, sourceRef, sourceHash };\n });\n const states = await this.entryRepo.findSourceStates(entityId, normalized.map((n) => n.sourceRef));\n return normalized.map((n) => {\n const state = states.get(n.sourceRef);\n let status: PendingSourceStatus;\n if (!state) status = 'new';\n else if (!state.anyHashed) status = 'partial';\n else if (state.latestHash !== null && normalizeSourceHash(state.latestHash) === n.sourceHash) status = 'current';\n else status = 'changed';\n return { sourceRef: n.rawSourceRef, status };\n });\n }\n\n /** Read-only maintenance report for one entity (spec §8.1). Reports, never repairs. */\n async lint(entityId: string): Promise<WikiLintReport> {\n assertEntityId(entityId);\n return this.lintService.lint(entityId);\n }\n\n /**\n * Effective system prompts for ingest, librarian, heal and ontology backfill\n * (spec §8.3). Backs the `wiki_get_instructions` tool. Templates only;\n * overrides are returned verbatim, so keep secrets out of `WikiConfig.prompts`.\n */\n async getInstructions(entityId: string): Promise<WikiInstructions> {\n assertEntityId(entityId);\n const ontologyContext = await this.ontologyService.buildPromptContext(entityId);\n return this.promptService.buildInstructionTemplates(ontologyContext);\n }\n\n /**\n * Returns the live source_refs for an entity, one row per ref, with the most\n * recently-updated live `source_hash` and a live fact count. Refs are sorted\n * `COLLATE BINARY` (no locale dependency). Used by hosts to reconcile stored\n * state against a live source, or audit duplicate-hash collisions via\n * `findSourceRefsByHash`.\n */\n async listSourceRefs(entityId: string): Promise<Array<{\n sourceRef: string;\n sourceHash: string | null;\n factCount: number;\n lastIngestedAt: number;\n }>> {\n return this.entryRepo.listSourceRefs(entityId);\n }\n\n /**\n * Returns the live source_refs for an entity that hold the given source_hash.\n * With v9, source_ref_index is the source of truth for the sourceRef-level\n * TOCTOU-race invariant: at most one sourceRef can hold a given\n * (entity_id, source_hash). The result is either a single-element array\n * (one canonical ref) or empty (no live ref holds the hash). Returned as\n * an array to preserve the existing public-API shape used by hosts\n * auditing duplicate-content collisions.\n */\n async findSourceRefsByHash(entityId: string, sourceHash: string): Promise<string[]> {\n const canonical = await this.sourceRefIndexRepo.findActiveByEntityAndHash(entityId, sourceHash);\n return canonical === null ? [] : [canonical];\n }\n\n /**\n * Returns the set of `entity_id` values with at least one row in this\n * database, INCLUDING entities whose only remaining rows are soft-deleted\n * — sorted ascending `entity_id COLLATE BINARY`. Empty array when the\n * database has no entities.\n *\n * The deliberate inclusion of soft-deleted-only entities closes the\n * decommissioned-scope leak: a scoped namespace whose documents have all\n * been forgotten or superseded must still appear so host maintenance\n * sweeps (`runLibrarian`, `runHeal`, `runOntologyBackfill`, `runPrune`)\n * can visit it and reap the soft-deleted rows.\n *\n * Read-only. Never acquires a lock. Never opens a transaction. Propagates\n * underlying read errors.\n *\n * @param options.prefix - Optional string filter applied as\n * `id.startsWith(prefix)`. O(n) over distinct ids because the\n * `(entity_id, source_ref)` index is not seekable on `entity_id`-only\n * prefix. Empty-string prefix matches every id.\n *\n * Note: this widens the coverage of `exportDump` (which delegates to\n * `MetadataRepository.getDistinctEntityIds`); exported dumps now include\n * orphaned entities. This is a deliberate widening for backup/migration\n * coverage, not a breaking change to `exportDump`'s return shape.\n */\n async listEntityIds(options?: { prefix?: string }): Promise<string[]> {\n const ids = await this.metadataRepo.getDistinctEntityIds();\n if (options?.prefix === undefined) return ids;\n return ids.filter(id => id.startsWith(options.prefix!));\n }\n\n async runPrune(\n entityId: string,\n options?: {\n retainSoftDeletedFor?: number | null;\n retainEventsFor?: number | null;\n vacuum?: boolean;\n },\n ): Promise<{ entries: number; tasks: number; events: number }> {\n return this.maintenanceService.runPrune(entityId, options);\n }\n\n async read(entityId: string | string[], query: string, options?: ReadOptions): Promise<MemoryBundle> {\n return this.retrievalService.read(entityId, query, options);\n }\n\n async traverseGraph(entityId: string, options: GraphTraversalOptions): Promise<GraphNeighborhood> {\n return this.graphTraversalService.traverseGraph(entityId, options);\n }\n\n async getMemoryBundle(entityId: string): Promise<MemoryBundle> {\n return this.importExportService.getFullBundle(entityId, { maxEvents: 10 });\n }\n\n async write(entityId: string, event: Omit<WikiEvent, 'id' | 'entity_id' | 'created_at'>): Promise<void> {\n return this.writeService.write(entityId, event);\n }\n\n /** Await auto-mode background librarian/heal jobs started by write(). No-op in 'deferred' mode. */\n async drain(): Promise<void> {\n return this.writeService.drain();\n }\n\n /**\n * Report which entities have pending maintenance work (librarian events\n * behind the watermark, heal backlog, unembedded facts) without running\n * anything. Entities with no pending work are omitted; sorted by\n * `pendingEvents` desc then `entityId` asc.\n */\n async getPendingMaintenance(entityIds?: string[]): Promise<PendingMaintenance[]> {\n return this.maintenanceScheduler.getPending(entityIds);\n }\n\n /** Run pending librarian/heal/reembed work under an optional token budget and deadline (spec §6.2). Nothing runs after it resolves. */\n async runPendingMaintenance(options?: RunPendingMaintenanceOptions): Promise<RunPendingMaintenanceResult> {\n return this.maintenanceScheduler.run(options);\n }\n\n /**\n * @param options.promptOverride - Applies only to this manual call. Does NOT affect\n * WriteService-triggered auto-runs. For persistent prompt customization across auto-runs,\n * set `options.config.prompts.librarianSystemPrompt` at WikiMemory construction time.\n */\n async runLibrarian(entityId: string, options?: { promptOverride?: string }): Promise<void> {\n return this.maintenanceService.runLibrarian(entityId, options);\n }\n\n /**\n * Reviews stored facts with the LLM: removes orphans, downgrades stale\n * inferences, synthesizes corrections.\n *\n * Bounded per call: covers at most `batchSize` candidates (default 25), so\n * one call no longer sweeps the whole entity. Hosts own the cadence; loop\n * `while (result.remaining > 0)` for convergence.\n *\n * `remaining === 0` means \"every mutable fact is inside the 7-day recheck\n * cooldown\", not \"there is no more work\" — heal's candidate set is the live\n * mutable corpus, not a draining backlog, so it climbs back as the cooldown\n * lapses and as new facts are written. Do not write a loop expecting a drain.\n *\n * @param options.promptOverride - Applies only to this manual call. Does NOT affect\n * WriteService-triggered auto-runs. For persistent prompt customization across auto-runs,\n * set `options.config.prompts.healSystemPrompt` at WikiMemory construction time.\n * @param options.batchSize - Candidates per run (default 25) for providers with\n * tighter context limits.\n */\n async runHeal(\n entityId: string,\n options?: { promptOverride?: string; batchSize?: number },\n ): Promise<HealResult> {\n return this.maintenanceService.runHeal(entityId, options);\n }\n\n /**\n * Types already-persisted untyped facts (okf_type IS NULL) in place via one\n * librarian-style LLM call. Strictly additive: never creates, deletes, or\n * rewrites facts; never overwrites an existing okf_type. Free when there is\n * nothing to do (ontology off, or zero eligible untyped facts).\n *\n * Hosts own the trigger cadence (e.g. after each sync); loop `while\n * result.remaining > 0` for convergence. Throws WikiBusyError when another\n * backfill (or conflicting maintenance op) is running for the entity.\n *\n * @param options.promptOverride - Applies only to this call. For persistent\n * customization set `options.config.prompts.ontologyBackfillSystemPrompt`.\n * @param options.batchSize - Facts per run (default 25) for providers with\n * tighter context limits.\n */\n async runOntologyBackfill(\n entityId: string,\n options?: { promptOverride?: string; batchSize?: number; classifier?: 'auto' | 'llm' },\n ): Promise<OntologyBackfillResult> {\n return this.maintenanceService.runOntologyBackfill(entityId, options);\n }\n\n async runReembed(\n entityId?: string,\n opts?: { force?: boolean; skipExisting?: boolean },\n ): Promise<ReembedResult> {\n return this.maintenanceService.runReembed(entityId, opts);\n }\n\n getEntityStatus(entityId: string): EntityStatus {\n return this.jobManager.getEntityStatus(entityId);\n }\n\n subscribeEntityStatus(\n entityId: string,\n callback: (status: EntityStatus) => void,\n ): () => void {\n return this.jobManager.subscribeEntityStatus(entityId, callback);\n }\n\n clearVectorCache(): void {\n this.searchService.evictCache();\n }\n\n /**\n * Brings the keyword search index up to date with SQLite after a host\n * transaction that used `upsertGraph` has committed. Core never sees that\n * commit, so without this the nodes stay out of keyword, hybrid and\n * fallback retrieval until the entity's next core write.\n *\n * With `entityId`: drains that entity's pending `upsertGraph` ids (its new\n * nodes and the facts they superseded) first, to completion, then at most\n * one more ledger chunk — so its new nodes are searchable, and the\n * superseded facts gone, when the call resolves, under any backlog. Without an\n * argument: drains every stashed `upsertGraph` id across entities first,\n * then runs one keyword-index quantum bounded by `config.setupBudgetMs`\n * (backlog drain, then rebuild work while the index is rebuilding). Hosts\n * with a long-lived process should call the no-arg form on their own\n * schedule: that is what converges a rebuilding index. While keyword search\n * is unavailable it first retries the index init; after a failed attempt it\n * waits at least 5 s, doubling per consecutive failure up to 5 min (longer\n * when an attempt is itself slow), before retrying again.\n *\n * Call only after the host's transaction commits: called inside it, the\n * rebuild may index rows that later roll back, or miss them and clear the\n * stale flag anyway. Serialized with core's internal index syncs and takes\n * no maintenance lock. Never rejects for a valid `entityId` — on failure the\n * entity stays stale and the next call retries it. Does not compute\n * embeddings; that remains the maintenance sweep's job.\n *\n * With the FTS5 index strategy this drains the index ledger in its own\n * transactions, so it MUST be called after the host transaction commits,\n * never from inside a `withTransactionAsync` callback. Calling it inside\n * one waits on the transaction mutex that the callback holds.\n *\n * @throws {TypeError} when `entityId` is given but is not a non-empty string.\n */\n async syncSearchIndex(entityId?: string): Promise<void> {\n if (entityId === undefined) {\n // A long-lived host that never re-opens still recovers from a failed init (spec #280 Change 4).\n // After a failed re-init, back off before the next: each attempt costs\n // the 250 ms retry backoff plus up to two rebuild transactions under the\n // write lock, and hosts call this after every write.\n if (!this.searchService.isKeywordAvailable() && monotonicNow() >= this.reinitRetryAt) {\n // One re-init at a time; concurrent callers share it.\n this.reinitSearch ??= (async () => {\n const started = monotonicNow();\n try {\n const strategy = await createIndexStrategy(\n this.db, this.prefix, this.metadataRepo, this.options.config?.indexStrategy ?? 'auto',\n { setupBudgetMs: this.setupBudgetMs() });\n this.searchService.setIndexStrategy(strategy);\n // A new MiniSearch index starts empty and needs the full sync. A ledger\n // strategy gets its one quantum from the syncStale() below (#284 review).\n if (this.searchService.isKeywordAvailable() && !this.searchService.hasLedger()) await this.searchService.sync();\n } finally {\n if (this.searchService.isKeywordAvailable()) {\n this.reinitFailures = 0;\n this.reinitRetryAt = 0;\n } else {\n const now = monotonicNow();\n const backoff = Math.min(SEARCH_REINIT_COOLDOWN_MS * 2 ** this.reinitFailures, SEARCH_REINIT_COOLDOWN_MAX_MS);\n this.reinitFailures++;\n this.reinitRetryAt = now + Math.max(backoff, SEARCH_REINIT_COST_FACTOR * (now - started));\n }\n this.reinitSearch = null;\n }\n })();\n await this.reinitSearch;\n }\n const stashed = this.peekStashedIds();\n const ids = [...stashed.values()].flatMap((m) => [...m.keys()]);\n if (await this.syncDrained(this.searchService.syncStale({ ids }))) this.dropStashedIds(stashed);\n return;\n }\n assertEntityId(entityId);\n const stashed = this.peekStashedIds(entityId);\n if (await this.syncDrained(this.searchService.syncEntries(entityId, stashed.get(entityId)?.keys() ?? []))) {\n this.dropStashedIds(stashed);\n }\n }\n\n /**\n * True when a sync applied the stashed ids. While keyword search is\n * unavailable the stand-in strategy's drain is a no-op that reports success,\n * so the ids stay stashed for the first sync after a re-init (#284 review).\n */\n private async syncDrained(sync: Promise<boolean>): Promise<boolean> {\n return (await sync) && this.searchService.isKeywordAvailable();\n }\n\n async exportDump(entityIds?: string[]): Promise<MemoryDump> {\n return this.importExportService.exportDump(entityIds);\n }\n\n /** Entity summary prose persisted from an OKF profile ≥ 1 import; null when none stored. */\n async getEntitySummary(entityId: string): Promise<string | null> {\n return this.metadataRepo.getMeta(entitySummaryMetaKey(entityId));\n }\n\n async importDump(dump: MemoryDump, opts?: { merge?: boolean }): Promise<void> {\n return this.importExportService.importDump(dump, opts);\n }\n\n async forget(\n entityId: string,\n params: { entryId?: string; taskId?: string; sourceRef?: string; sourceHash?: string; clearAll?: boolean },\n opts?: { dryRun?: boolean },\n ): Promise<{ deleted: { entries: number; tasks: number }; metadataReset?: boolean }> {\n return this.maintenanceService.forget(entityId, params, opts);\n }\n\n /**\n * End `oldId`'s validity and link it to its replacement (spec §4.3). One\n * transaction. Throws `WikiSupersedeError` for missing, foreign, already\n * superseded, immutable-document, or cyclic targets.\n */\n async supersede(\n entityId: string,\n oldId: string,\n replacement: SupersedeReplacement,\n options?: { validFrom?: number },\n ): Promise<{ newId: string }> {\n return this.temporalService.supersede(entityId, oldId, replacement, options);\n }\n\n /** The supersession chain containing `factId`, oldest first. [] when unknown. */\n async history(entityId: string, factId: string): Promise<WikiFact[]> {\n return this.temporalService.history(entityId, factId);\n }\n\n /**\n * Full and partial ingestion both reject foreign-owned generated fact IDs with\n * `WikiGraphNodeOwnershipConflict`. Such collisions are unexpected. Ingestion\n * may already have persisted ontology or other state before rejection; unlike\n * direct graph preflight, it relies on transaction rollback for atomicity.\n *\n * @param params.promptOverride - Overrides the system prompt for this ingest call only.\n * For persistent customization, set `options.config.prompts.ingestSystemPrompt` at\n * WikiMemory construction time.\n */\n async ingestDocument(\n entityId: string,\n params: {\n sourceRef: string;\n sourceHash: string;\n documentChunk: string;\n maxChunkLength?: number;\n chunkOverlap?: number;\n chunkConcurrency?: number;\n promptOverride?: string;\n },\n opts?: { onDuplicateHash?: 'ingest' | 'skip' | 'throw' },\n ): Promise<IngestDocumentResult> {\n return this.ingestionService.ingestDocument(entityId, params, opts);\n }\n\n /**\n * Deterministic write path into the graph. Accepts caller-supplied\n * `(nodes, edges)` and writes them under `(sourceRef, sourceHash)`\n * semantics identical to `ingestDocument`, minus the LLM extraction step.\n *\n * MUST be called from inside an open `db.withTransactionAsync` callback —\n * the third argument is the caller's `tx`. The method does not open a\n * nested transaction, does not acquire any lock, and does not perform\n * post-commit work (search sync, embedding, cache eviction). After the\n * transaction commits, call `syncSearchIndex(entityId)` — or\n * `syncSearchIndex()` after writing several entities in one transaction —\n * to make the new nodes keyword-searchable: both forms drain this call's node ids\n * first, to completion, so the nodes are searchable under any backlog (up to\n * `WikiMemory.UPSERT_ID_STASH_CAP` pending ids; beyond that they converge with\n * the backlog). Embeddings still come from the maintenance\n * sweep (`runLibrarian` / `runHeal` / `runOntologyBackfill` / `runPrune`,\n * scoped via `listEntityIds`).\n *\n * Contract (full pre-flight validation lives inside\n * `IngestionService.upsertGraphCore`, which this method delegates to):\n * - C2: no-op when `(entityId, sourceHash)` is already mapped to\n * `params.sourceRef`; throws `WikiSourceRefHashCollision` if mapped to\n * a different `sourceRef`.\n * - C3: edges with dangling `targetId` are stored verbatim (no FK, no\n * resolution).\n * - C4: under persisted ontology mode `'strict'`, an out-of-manifest node\n * or edge `type` throws `WikiStrictOntologyViolation` (pre-flight,\n * all-or-nothing — NONE written on failure).\n *\n * Entry IDs share one database-wide namespace. Existing rows, including\n * soft-deleted rows, reserve their IDs for their entity; same-entity updates\n * and resurrection remain supported. Hosts authenticate callers and select\n * the authorized entity ID; entity-qualified IDs are optional, not required.\n * After the live-only C2 probe above, a foreign node ID throws the fixed,\n * privacy-preserving `WikiGraphNodeOwnershipConflict` before persistent writes\n * (including seed manifests). Deleted source mappings do not trigger C2.\n *\n * Propagate later failures to roll back the host transaction. In particular,\n * foreign edge-ID collisions remain late bare `Error`s: the foreign edge is\n * not overwritten, but catching and committing can retain earlier writes.\n * This method neither commits nor rolls back the caller's transaction.\n *\n * @returns Counts: nodesWritten (validated nodes persisted), edgesWritten\n * (manifest-valid edges persisted), superseded (prior facts soft-deleted\n * plus prior source-ref edges hard-deleted).\n */\n async upsertGraph(\n entityId: string,\n params: {\n sourceRef: string;\n sourceHash: string;\n nodes: readonly { id: string; type: string; title: string; body?: string }[];\n edges: readonly { type: string; sourceId: string; targetId: string; id?: string }[];\n },\n adapter: SQLiteAdapter,\n ): Promise<{ nodesWritten: number; edgesWritten: number; superseded: number }> {\n const sourceRef = normalizeSourceRef(params.sourceRef);\n if (!sourceRef) throw new Error('Invalid sourceRef');\n const sourceHash = normalizeSourceHash(params.sourceHash);\n if (!sourceHash) throw new Error('Invalid sourceHash (must be 64-char hex string)');\n\n // C2 probe — runs inside the caller's tx so it sees the in-flight state.\n const canonical = await this.sourceRefIndexRepo.findActiveByEntityAndHash(entityId, sourceHash, adapter);\n if (canonical !== null && canonical === sourceRef) {\n return { nodesWritten: 0, edgesWritten: 0, superseded: 0 };\n }\n if (canonical !== null && canonical !== sourceRef) {\n throw new WikiSourceRefHashCollision({\n entityId,\n sourceHash,\n existingSourceRef: canonical,\n attemptedSourceRef: sourceRef,\n });\n }\n\n // Delegate to upsertGraphCore for steps a–j (manifest read, validation,\n // supersession, writes, returns counts). No opts.strict override — let\n // the persisted ontology mode drive strictness per the spec.\n // The host owns this transaction and core never sees its commit, so\n // diagnostics are delivered when upsertGraph resolves (spec §4.2.4).\n // Hosts that roll back should disregard them.\n const diagBuffer = new DiagnosticBuffer();\n const { supersededFactIds, ...result } = await this.ingestionService.upsertGraphCore(\n entityId,\n { sourceRef, sourceHash, nodes: params.nodes, edges: params.edges },\n adapter,\n { diag: { buffer: diagBuffer, operation: 'upsertGraph' } },\n );\n // Core never sees this commit. Under a ledger strategy the triggers already\n // recorded the rows: stash the node ids, and the facts this call\n // superseded (as ingestDocument threads them), so the host's post-commit\n // syncSearchIndex() drains them first, to completion, under any backlog.\n // MiniSearch has no ledger: markStale makes that sync rebuild the entity.\n this.stashUpsertIds(entityId, [...supersededFactIds, ...params.nodes.map((n) => n.id)]);\n this.searchService.markStale(entityId);\n diagBuffer.flush(this.options);\n return result;\n }\n\n /**\n * Returns up to `limit` unprocessed outbox events, oldest first.\n * Works regardless of enableOutbox value — allows draining after disabling.\n */\n async getUnprocessedOutboxEvents(limit = 100): Promise<WikiOutboxEvent[]> {\n if (Number.isFinite(limit) && limit <= 0) return [];\n const safeLimit = Number.isFinite(limit) && limit >= 1 ? Math.trunc(limit) : 100;\n const rows = await this.outboxRepo.fetchPending(safeLimit);\n return rows.map(row => {\n let payload: unknown = null;\n try {\n payload = JSON.parse(row.payload);\n } catch {\n // corrupted row — surface null payload rather than poisoning the batch\n }\n return { ...row, payload } as WikiOutboxEvent;\n });\n }\n\n /**\n * Deletes the given event IDs from the outbox table.\n * Call after successfully committing events to the external system.\n */\n async markOutboxEventsProcessed(eventIds: string[]): Promise<void> {\n await this.outboxRepo.acknowledge(eventIds);\n }\n\n /**\n * Returns the effective ontology mode and manifest for an entity.\n * Resolution order: persisted DB row → `WikiConfig.ontology.seedManifests[entityId]` → `null`.\n */\n async getOntologyManifest(entityId: string): Promise<{\n mode: OntologyMode;\n manifest: OntologyManifest;\n } | null> {\n const row = await this.metadataRepo.getManifest(entityId);\n if (row) return { mode: this.ontologyService.resolveMode(row.mode), manifest: row.manifest };\n const seed = this.options.config?.ontology?.seedManifests?.[entityId];\n if (seed) {\n return {\n mode: this.ontologyService.resolveMode(seed.mode),\n manifest: seed.manifest,\n };\n }\n return null;\n }\n\n /**\n * Seeds or replaces an entity's ontology manifest and optional mode override.\n * Validates manifest invariants (unique type slugs, edge endpoints reference node types).\n * Invalidates the in-memory ontology cache for this entity.\n *\n * Delegates to `setOntologyManifests` so there is a single write path. The\n * observable contract is unchanged: same upsert semantics, same cache\n * invalidation, same `void` result.\n */\n async setOntologyManifest(\n entityId: string,\n manifest: OntologyManifest,\n options?: { mode?: OntologyMode },\n ): Promise<void> {\n await this.setOntologyManifests([{ entityId, manifest, mode: options?.mode }]);\n }\n\n /**\n * Write several entities' ontology manifests in a single transaction.\n *\n * All succeed or none do. The transaction is opened on this instance's\n * serialized adapter — callers pass data, never a transaction handle, because\n * a consumer holds the unwrapped adapter and a transaction opened on it would\n * bypass the serialization mutex applied in the constructor.\n *\n * Returns which entities were written. `skipped` is only ever non-empty under\n * `opts.ifAbsent`.\n *\n * Sharp edge: `ifAbsent` checks for a PERSISTED row, not for an effective\n * manifest. An entity whose manifest currently comes from\n * `WikiConfig.ontology.seedManifests` has no row until the seed is\n * materialized on first access that supplies a transaction (in practice, an\n * ingest). Until then `ifAbsent` treats the entity as absent, writes the new\n * manifest over the configured seed, and reports it in `written`; the same\n * call after the seed has been materialized reports it in `skipped`. See the\n * `ifAbsent` notes in the package README.\n */\n async setOntologyManifests(\n entries: Array<{\n entityId: string;\n manifest: OntologyManifest;\n mode?: OntologyMode;\n }>,\n opts?: { ifAbsent?: boolean },\n ): Promise<{ written: string[]; skipped: string[] }> {\n // Nothing to do — and deliberately no transaction, so an empty batch never\n // takes the serialization mutex.\n if (entries.length === 0) return { written: [], skipped: [] };\n\n // Two entries naming one entity express ambiguous intent. Applying the last\n // one silently would hide a caller bug whose symptom — a manifest that is\n // not the one the caller believed it wrote — surfaces far from its cause.\n const seen = new Set<string>();\n for (const entry of entries) {\n if (seen.has(entry.entityId)) {\n throw new Error(`Duplicate entityId in batch: ${entry.entityId}`);\n }\n seen.add(entry.entityId);\n }\n\n // Validate every manifest BEFORE opening the transaction, so a doomed batch\n // never reaches the database and never takes the mutex. `setManifest`\n // validates again inside the transaction; that is the invariant protecting\n // every other repository caller, and is not redundant with this gate.\n for (const entry of entries) {\n validateManifest(entry.manifest);\n }\n\n const written: string[] = [];\n const skipped: string[] = [];\n\n await this.db.withTransactionAsync(async (tx) => {\n for (const entry of entries) {\n const mode = entry.mode ?? this.ontologyService.resolveMode();\n const wrote = await this.metadataRepo.setManifest(\n entry.entityId,\n { mode, manifest: entry.manifest },\n tx,\n { ifAbsent: opts?.ifAbsent === true },\n );\n (wrote ? written : skipped).push(entry.entityId);\n }\n });\n\n // After a successful commit, and for EVERY entry rather than just the\n // written ones: under `ifAbsent` a skipped entry means another writer won\n // the race, so this instance's cached copy may be stale and dropping it is\n // more correct than keeping it. A failed transaction throws above and never\n // reaches this loop, which is fine — a rolled-back batch changed nothing,\n // so the cache is still consistent with the database. Invalidating is cheap\n // either way: it only drops a cached copy, and the next read reloads from\n // the database.\n for (const entry of entries) {\n this.ontologyService.invalidateCache(entry.entityId);\n }\n\n return { written, skipped };\n }\n\n /** Append a verification event to a fact. Does NOT touch `updated_at`. */\n async writeOkfTrust(entryId: string, entityId: string, verified: { by: string; at: string }[]): Promise<void> {\n return this.okfTrustWrites.writeOkfTrust(entryId, entityId, verified);\n }\n\n /** Replace a fact's source list. Does NOT touch `updated_at`. */\n async writeOkfSources(entryId: string, entityId: string, sources: Array<{ resource: string; [k: string]: unknown }>): Promise<void> {\n return this.okfTrustWrites.writeOkfSources(entryId, entityId, sources as any);\n }\n\n /** Set a fact's OKF v0.2 lifecycle status. Does NOT touch `updated_at`. */\n async setLifecycleStatus(entryId: string, entityId: string, status: 'draft' | 'stable' | 'deprecated'): Promise<void> {\n return this.okfTrustWrites.setLifecycleStatus(entryId, entityId, status);\n }\n\n /**\n * Live draft facts for one entity, newest first (spec §5.2). Default page\n * size 50, clamped to [1, 500]. Pass `nextCursor` back unchanged for the next page.\n */\n async listDrafts(entityId: string, options?: { limit?: number; cursor?: string }): Promise<DraftPage> {\n const rawLimit = options?.limit;\n const limit = typeof rawLimit === 'number' && Number.isFinite(rawLimit)\n ? Math.min(500, Math.max(1, Math.floor(rawLimit)))\n : 50;\n const after = options?.cursor === undefined ? null : decodeDraftCursor(options.cursor);\n const rows = await this.entryRepo.listDraftsByEntityId(entityId, limit + 1, after);\n const facts = rows.slice(0, limit);\n const last = facts[facts.length - 1];\n return {\n facts,\n nextCursor: rows.length > limit && last ? `${last.created_at}:${last.id}` : null,\n };\n }\n\n /**\n * Promote a draft to `stable` and record who reviewed it, atomically\n * (spec §5.2). Metadata writes only: `updated_at` is not bumped and no\n * outbox event is pushed. Pass `by: 'human:<id>'` so `trustTier` becomes\n * `'human-reviewed'`.\n *\n * @throws WikiDraftNotFound when no live draft with that id exists for the entity.\n */\n async promoteDraft(entryId: string, entityId: string, reviewer: { by: string }): Promise<void> {\n const by = reviewer?.by;\n if (typeof by !== 'string' || by.trim().length === 0) {\n throw new TypeError('promoteDraft requires reviewer.by to be a non-empty string.');\n }\n await this.db.withTransactionAsync(async (tx) => {\n if (!(await this.entryRepo.isLiveDraft(entryId, entityId, tx))) {\n throw new WikiDraftNotFound();\n }\n await this.okfTrustWrites.setLifecycleStatus(entryId, entityId, 'stable', tx);\n await this.okfTrustWrites.writeOkfTrust(entryId, entityId, [{ by, at: new Date().toISOString() }], tx);\n });\n }\n\n /** Set a fact's stale_after (epoch ms) or clear it. Does NOT touch `updated_at`. */\n async setStaleAfter(entryId: string, entityId: string, date: number | null): Promise<void> {\n return this.okfTrustWrites.setStaleAfter(entryId, entityId, date);\n }\n\n /** Set a fact's generated_by actor string. Does NOT touch `updated_at`. */\n async setGeneratedBy(entryId: string, entityId: string, actor: string): Promise<void> {\n return this.okfTrustWrites.setGeneratedBy(entryId, entityId, actor);\n }\n\n /** Task variants of the same five DAO methods. Symmetric per spec §2.5. */\n async writeOkfTrustTask(taskId: string, entityId: string, verified: { by: string; at: string }[]): Promise<void> {\n return this.okfTrustWrites.writeOkfTrustTask(taskId, entityId, verified);\n }\n async writeOkfSourcesTask(taskId: string, entityId: string, sources: Array<{ resource: string; [k: string]: unknown }>): Promise<void> {\n return this.okfTrustWrites.writeOkfSourcesTask(taskId, entityId, sources as any);\n }\n async setLifecycleStatusTask(taskId: string, entityId: string, status: 'draft' | 'stable' | 'deprecated'): Promise<void> {\n return this.okfTrustWrites.setLifecycleStatusTask(taskId, entityId, status);\n }\n async setStaleAfterTask(taskId: string, entityId: string, date: number | null): Promise<void> {\n return this.okfTrustWrites.setStaleAfterTask(taskId, entityId, date);\n }\n async setGeneratedByTask(taskId: string, entityId: string, actor: string): Promise<void> {\n return this.okfTrustWrites.setGeneratedByTask(taskId, entityId, actor);\n }\n}\n\n/**\n * Shape check for the read-only reports. Deliberately looser than `write()`'s\n * rule: ingestDocument and upsertGraph accept any string id, so a report must\n * too. The value is never echoed; JSON.stringify throws on a bigint.\n */\nfunction assertEntityId(entityId: unknown): asserts entityId is string {\n if (typeof entityId !== 'string' || entityId.length === 0) {\n throw new TypeError('Invalid entityId: must be a non-empty string.');\n }\n}\n\nexport const __testables = { validateFact, validateTask, clip, chunkText };\n","import type { MemoryBundle, WikiFact, WikiTask, WikiEvent, FormatContextOptions } from '../types';\n\nfunction validateMaxOption(value: number, name: string): void {\n if (!isFinite(value) || value < 0) {\n throw new Error(`Invalid ${name}: must be a non-negative finite number`);\n }\n}\n\nconst CONFIDENCE_WEIGHT: Record<string, number> = {\n certain: 1.0,\n inferred: 0.6,\n tentative: 0.3,\n};\n\nfunction scoreFactFor(\n fact: WikiFact,\n weights: Required<NonNullable<FormatContextOptions['factWeights']>>,\n now: number\n): number {\n const confW = CONFIDENCE_WEIGHT[fact.confidence] ?? 0.3;\n const ageDays = (now - fact.updated_at) / 86400000;\n const recencyDecay = Math.exp(-ageDays / 30);\n return (\n confW * weights.confidence +\n Math.log(1 + fact.access_count) * weights.accessCount +\n recencyDecay * weights.recency\n );\n}\n\nfunction renderFactMarkdown(\n fact: WikiFact,\n includeConfidence: boolean,\n includeTags: boolean,\n includeEntityIds: boolean,\n score: number | undefined,\n): string {\n const confPart = includeConfidence ? ` (${fact.confidence})` : '';\n const tagPart = includeTags && fact.tags.length > 0 ? ` [${fact.tags.join(', ')}]` : '';\n const sourcePart = includeEntityIds ? ` {entity_id=${fact.entity_id}}` : '';\n const scorePart = score !== undefined ? ` {score=${score.toFixed(4)}}` : '';\n return `- **${fact.title}**${confPart}${tagPart}${sourcePart}${scorePart}\\n ${fact.body.replace(/\\n/g, '\\n ')}`;\n}\n\nfunction renderFactPlain(\n fact: WikiFact,\n includeConfidence: boolean,\n includeTags: boolean,\n includeEntityIds: boolean,\n score: number | undefined,\n): string {\n const confPart = includeConfidence ? ` (${fact.confidence})` : '';\n const tagPart = includeTags && fact.tags.length > 0 ? ` [${fact.tags.join(', ')}]` : '';\n const sourcePart = includeEntityIds ? ` {entity_id=${fact.entity_id}}` : '';\n const scorePart = score !== undefined ? ` {score=${score.toFixed(4)}}` : '';\n return `${fact.title}${confPart}${tagPart}${sourcePart}${scorePart}: ${fact.body}`;\n}\n\nfunction renderTaskMarkdown(task: WikiTask): string {\n return `- [P${task.priority}] ${task.description.replace(/\\n/g, '\\n ')} (${task.status})`;\n}\n\nfunction renderTaskPlain(task: WikiTask): string {\n return `[P${task.priority}] ${task.description} (${task.status})`;\n}\n\nfunction renderEventMarkdown(event: WikiEvent): string {\n const ts = new Date(event.created_at).toISOString();\n return `- [${event.event_type} @ ${ts}] ${event.summary.replace(/\\n/g, '\\n ')}`;\n}\n\nfunction renderEventPlain(event: WikiEvent): string {\n const ts = new Date(event.created_at).toISOString();\n return `[${event.event_type} @ ${ts}] ${event.summary}`;\n}\n\nexport function formatContext(\n bundle: MemoryBundle,\n options?: FormatContextOptions\n): string {\n const opts: Required<FormatContextOptions> = {\n format: options?.format ?? 'markdown',\n maxFacts: options?.maxFacts ?? 10,\n maxTasks: options?.maxTasks ?? 10,\n maxEvents: options?.maxEvents ?? 10,\n includeConfidence: !(options?.compact ?? false) && (options?.includeConfidence ?? true),\n includeTags: !(options?.compact ?? false) && (options?.includeTags ?? true),\n includeEntityIds: !(options?.compact ?? false) && (options?.includeEntityIds ?? false),\n includeFactScores: !(options?.compact ?? false) && (options?.includeFactScores ?? false),\n compact: options?.compact ?? false,\n factWeights: {\n confidence: options?.factWeights?.confidence ?? 1.0,\n accessCount: options?.factWeights?.accessCount ?? 0.3,\n recency: options?.factWeights?.recency ?? 0.5,\n },\n };\n\n validateMaxOption(opts.maxFacts, 'maxFacts');\n validateMaxOption(opts.maxTasks, 'maxTasks');\n validateMaxOption(opts.maxEvents, 'maxEvents');\n\n const weights = opts.factWeights as Required<NonNullable<FormatContextOptions['factWeights']>>;\n\n const now = Date.now();\n const sortedFacts = bundle.factScores\n ? [...bundle.facts].slice(0, opts.maxFacts)\n : [...bundle.facts]\n .sort((a, b) => scoreFactFor(b, weights, now) - scoreFactFor(a, weights, now))\n .slice(0, opts.maxFacts);\n\n const sortedTasks = [...bundle.tasks]\n .sort((a, b) => b.priority - a.priority || a.created_at - b.created_at)\n .slice(0, opts.maxTasks);\n\n const sortedEvents = [...bundle.events]\n .sort((a, b) => b.created_at - a.created_at)\n .slice(0, opts.maxEvents);\n\n if (sortedFacts.length === 0 && sortedTasks.length === 0 && sortedEvents.length === 0) {\n return '';\n }\n\n const isMarkdown = opts.format === 'markdown';\n const lines: string[] = [];\n\n if (isMarkdown) {\n lines.push('## Memory');\n\n if (sortedFacts.length > 0) {\n lines.push('');\n lines.push('### Known Facts');\n for (const fact of sortedFacts) {\n lines.push(renderFactMarkdown(fact, opts.includeConfidence, opts.includeTags, opts.includeEntityIds, opts.includeFactScores ? bundle.factScores?.[fact.id] : undefined));\n }\n }\n\n if (sortedTasks.length > 0) {\n lines.push('');\n lines.push('### Open Tasks');\n for (const task of sortedTasks) {\n lines.push(renderTaskMarkdown(task));\n }\n }\n\n if (sortedEvents.length > 0) {\n lines.push('');\n lines.push('### Recent Events');\n for (const event of sortedEvents) {\n lines.push(renderEventMarkdown(event));\n }\n }\n } else {\n if (sortedFacts.length > 0) {\n lines.push('KNOWN FACTS:');\n for (const fact of sortedFacts) {\n lines.push(renderFactPlain(fact, opts.includeConfidence, opts.includeTags, opts.includeEntityIds, opts.includeFactScores ? bundle.factScores?.[fact.id] : undefined));\n }\n }\n if (sortedTasks.length > 0) {\n lines.push('OPEN TASKS:');\n for (const task of sortedTasks) {\n lines.push(renderTaskPlain(task));\n }\n }\n if (sortedEvents.length > 0) {\n lines.push('RECENT EVENTS:');\n for (const event of sortedEvents) {\n lines.push(renderEventPlain(event));\n }\n }\n }\n\n return lines.join('\\n');\n}\n","import type { GraphNeighborhood, WikiEdge } from '../types';\n\n/**\n * Pure presenter — dense text serialization of a GraphNeighborhood for LLM prompt\n * injection. Deterministic: same input always produces byte-identical output\n * (matters for prompt caching).\n */\nexport function formatGraphContext(neighborhood: GraphNeighborhood): string {\n const { nodes, edges } = neighborhood;\n if (nodes.length === 0) return '';\n\n const nodeById = new Map(nodes.map((n) => [n.id, n]));\n const nodeIndex = new Map(nodes.map((n, i) => [n.id, i]));\n const lines: string[] = [];\n\n for (const node of nodes) {\n lines.push(`[${node.okf_type ?? 'fact'}] ${node.title} (ID: ${node.id})`);\n\n const outbound = edgesByDirection(edges, node.id, 'source_id', nodeById, nodeIndex);\n const inbound = edgesByDirection(edges, node.id, 'target_id', nodeById, nodeIndex);\n\n for (const { edge, other } of outbound) {\n lines.push(` -[${edge.edge_type}]-> [${other.okf_type ?? 'fact'}] ${other.title}`);\n }\n for (const { edge, other } of inbound) {\n lines.push(` <-[${edge.edge_type}]- [${other.okf_type ?? 'fact'}] ${other.title}`);\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction edgesByDirection(\n edges: WikiEdge[],\n nodeId: string,\n endpoint: 'source_id' | 'target_id',\n nodeById: Map<string, GraphNeighborhood['nodes'][number]>,\n nodeIndex: Map<string, number>,\n) {\n const otherEndpoint = endpoint === 'source_id' ? 'target_id' : 'source_id';\n return edges\n .filter((e) => e[endpoint] === nodeId)\n .filter((e) => {\n const otherId = e[otherEndpoint];\n const selfIdx = nodeIndex.get(nodeId)!;\n const otherIdx = nodeIndex.get(otherId);\n return otherIdx !== undefined && selfIdx < otherIdx;\n })\n .map((edge) => ({ edge, other: nodeById.get(edge[otherEndpoint])! }))\n .sort(\n (a, b) =>\n a.edge.edge_type.localeCompare(b.edge.edge_type) ||\n a.other.title.localeCompare(b.other.title) ||\n a.other.id.localeCompare(b.other.id) ||\n a.edge.id.localeCompare(b.edge.id),\n );\n}\n","function shortHash(value: string): string {\n let h1 = 5381;\n let h2 = 52711;\n for (let i = 0; i < value.length; i += 1) {\n const c = value.charCodeAt(i);\n h1 = Math.imul(h1, 33) ^ c;\n h2 = Math.imul(h2, 31) ^ c;\n }\n return (h1 >>> 0).toString(16).padStart(8, '0') + (h2 >>> 0).toString(16).padStart(8, '0');\n}\n\nconst OKF_RESERVED_CONCEPT_NAMES = new Set(['index', 'log']);\n\nconst WINDOWS_RESERVED_NAMES = new Set([\n 'con',\n 'prn',\n 'aux',\n 'nul',\n 'com1',\n 'com2',\n 'com3',\n 'com4',\n 'com5',\n 'com6',\n 'com7',\n 'com8',\n 'com9',\n 'lpt1',\n 'lpt2',\n 'lpt3',\n 'lpt4',\n 'lpt5',\n 'lpt6',\n 'lpt7',\n 'lpt8',\n 'lpt9',\n]);\n\nfunction isWindowsReservedName(name: string): boolean {\n const base = name.split('.')[0];\n return WINDOWS_RESERVED_NAMES.has(base.toLowerCase());\n}\n\nexport function sanitizeForFilename(value: string): string {\n const normalized = value.normalize('NFKC');\n const sanitized = normalized\n .replace(/[^A-Za-z0-9._-]+/g, '_')\n .replace(/^\\.+/, '_')\n .replace(/_+/g, '_')\n .replace(/^[_-]+|[_-]+$/g, '');\n\n // Enforce a max base-name length so the final filename stays within typical\n // filesystem limits (~255 bytes). Reserve ~20 chars for `-<16hexchars>`.\n const MAX_BASE = 200;\n const trimmed = sanitized.length > MAX_BASE ? sanitized.slice(0, MAX_BASE) : sanitized;\n\n let baseName = trimmed && trimmed !== '.' && trimmed !== '..' ? trimmed : 'entity';\n\n // Windows disallows trailing dots and spaces in filenames.\n const withoutTrailingDotSpace = baseName.replace(/[. ]+$/, '');\n const hadTrailingDotSpace = withoutTrailingDotSpace !== baseName;\n if (hadTrailingDotSpace) {\n baseName = withoutTrailingDotSpace || 'entity';\n }\n\n const windowsReserved = isWindowsReservedName(baseName);\n const needsSuffix =\n baseName !== value || sanitized.length > MAX_BASE || hadTrailingDotSpace || windowsReserved;\n\n if (!needsSuffix) return baseName;\n\n const suffix = `-${shortHash(value)}`;\n return `${baseName}${suffix}`;\n}\n\n/** Sanitize a fact/task id for use as a concept filename (without .md). */\nexport function sanitizeConceptId(id: string): string {\n const sanitized = sanitizeForFilename(id);\n if (OKF_RESERVED_CONCEPT_NAMES.has(sanitized.toLowerCase())) {\n return `${sanitized}-${shortHash(id)}`;\n }\n return sanitized;\n}\n","import type { MemoryDump, FormattedMemoryDump, MemoryBundle, WikiFact, WikiTask, WikiEvent } from '../types';\nimport { sanitizeForFilename } from './sanitizeForFilename';\n\nfunction renderFact(f: WikiFact): string {\n const tags = (f.tags || []).join(', ');\n const source = f.source_ref ?? f.source_type;\n return `### ${f.title}\n**Tags:** ${tags}\n**Confidence:** ${f.confidence}\n**Source:** ${source}\n\n${f.body}\n\n---\n`;\n}\n\nfunction renderTask(t: WikiTask): string {\n const checked = t.status === 'done' ? 'x' : ' ';\n const note = t.status === 'done' ? ' (done)'\n : t.status === 'abandoned' ? ' (abandoned)'\n : t.status === 'in_progress' ? ' (in progress)'\n : '';\n return `- [${checked}] ${t.description}${note}\\n`;\n}\n\nfunction renderEvent(e: WikiEvent): string {\n const ts = new Date(e.created_at).toISOString();\n return `- [${ts}] (${e.event_type}) ${e.summary}\\n`;\n}\n\nfunction renderEntity(entityId: string, bundle: MemoryBundle, generatedAt: number): string {\n const lines: string[] = [];\n lines.push(`# Memory Dump: ${entityId}`);\n lines.push(`Generated: ${new Date(generatedAt).toISOString()}`);\n lines.push('');\n lines.push('## Facts');\n lines.push('');\n if (bundle.facts.length === 0) {\n lines.push('_(none)_\\n');\n } else {\n for (const f of bundle.facts) lines.push(renderFact(f));\n }\n lines.push('## Tasks');\n lines.push('');\n if (bundle.tasks.length === 0) {\n lines.push('_(none)_\\n');\n } else {\n for (const t of bundle.tasks) lines.push(renderTask(t));\n }\n lines.push('');\n lines.push('## Recent Events');\n lines.push('');\n if (bundle.events.length === 0) {\n lines.push('_(none)_\\n');\n } else {\n for (const e of bundle.events) lines.push(renderEvent(e));\n }\n return lines.join('\\n');\n}\n\nfunction formatEntityFileName(entityId: string): string {\n return `${sanitizeForFilename(entityId)}.md`;\n}\n\nexport function formatMemoryDump(dump: MemoryDump): FormattedMemoryDump {\n const files = Object.entries(dump.entities).map(([entityId, bundle]) => ({\n name: formatEntityFileName(entityId),\n content: renderEntity(entityId, bundle, dump.generatedAt),\n }));\n\n // Strip embedding_blob from each fact before JSON-serialising the manifest.\n // exportDump() now includes raw Uint8Array blobs for importDump() round-trips,\n // but those binaries serve no purpose in a human-readable manifest and can\n // massively inflate its size for non-trivial datasets.\n const manifestDump: MemoryDump = {\n generatedAt: dump.generatedAt,\n entities: Object.fromEntries(\n Object.entries(dump.entities).map(([entityId, bundle]) => [\n entityId,\n {\n ...bundle,\n facts: bundle.facts.map(f => {\n const { embedding_blob: _blob, ...rest } = f as WikiFact & { embedding_blob?: unknown };\n return rest as WikiFact;\n }),\n },\n ])\n ),\n };\n\n return {\n manifest: JSON.stringify(manifestDump, null, 2),\n files,\n };\n}\n","import type { MemoryDump, WikiEdge, WikiFact, WikiTask, WikiEvent } from '../types';\nimport {\n appendEventIdComment,\n appendRelatedSection,\n buildConceptDocument,\n buildEntityIndexMd,\n buildRootIndexMd,\n buildLogMd,\n serializeActorString,\n type OkfFile,\n type OkfFrontmatter,\n type OkfIndexEntry,\n type OkfIndexSection,\n type OkfLogEntry,\n} from '@equationalapplications/core-okf';\nimport { sanitizeConceptId, sanitizeForFilename } from './sanitizeForFilename';\n\nexport type OkfFormatProfile = 'llm-wiki/1' | 'llm-wiki/2';\n\nexport interface FormatOkfBundleOptions {\n /** Defaults to 'llm-wiki/2'. Pass 'llm-wiki/1' to force the v0.1 subset. */\n profile?: OkfFormatProfile;\n}\n\nconst DEFAULT_PROFILE: OkfFormatProfile = 'llm-wiki/2';\n\n/**\n * Format an epoch-ms timestamp as ISO 8601 with a double fallback:\n * 1. NaN / Infinity / non-finite -> epoch (0).\n * 2. Outside JS Date's representable range (e.g. 1e300) -> epoch.\n * `new Date(finite).toISOString()` throws RangeError only when the value is\n * outside the supported range; a finite but absurd number still throws. We\n * validate the constructed Date before calling toISOString so the helper\n * never aborts the bundle export.\n */\nfunction isoOrFallback(updatedAt: number): string {\n if (!Number.isFinite(updatedAt)) return new Date(0).toISOString();\n const d = new Date(updatedAt);\n if (!Number.isFinite(d.getTime())) return new Date(0).toISOString();\n return d.toISOString();\n}\n\nfunction isoDateOrOmit(ms: number | null | undefined): string | undefined {\n if (ms == null || !Number.isFinite(ms)) return undefined;\n const d = new Date(ms);\n if (!Number.isFinite(d.getTime())) return undefined;\n return d.toISOString().slice(0, 10);\n}\n\nfunction factFrontmatterV2(f: WikiFact): OkfFrontmatter {\n return {\n type: f.okf_type ?? 'fact',\n title: f.title,\n tags: f.tags,\n // `timestamp` rides along deliberately even on the v0.2 path — a naive\n // consumer that only understands the v0.1 key still gets a readable date\n // without needing flow-mapping support. `generated.at` is the canonical\n // v0.2 field and always wins on import when both are present (spec §2.4).\n timestamp: isoOrFallback(f.updated_at),\n resource: f.source_ref ?? undefined,\n id: f.id,\n entity_id: f.entity_id,\n confidence: f.confidence,\n source_type: f.source_type,\n source_hash: f.source_hash,\n created_at: f.created_at,\n access_count: f.access_count,\n last_accessed_at: f.last_accessed_at,\n deleted_at: f.deleted_at,\n // OKF v0.2\n status: f.lifecycle_status ?? 'stable',\n ...(isoDateOrOmit(f.stale_after) ? { stale_after: isoDateOrOmit(f.stale_after) } : {}),\n // Omit `generated` entirely when there's no actor on record — never\n // fabricate a `generated_by` (mirrors the import side's rule in §4.8:\n // it never invents one either, so export must not manufacture one that\n // would then round-trip back in as if it had always been asserted).\n ...(f.generated_by ? { generated: { by: f.generated_by, at: isoOrFallback(f.updated_at) } } : {}),\n // Omit `verified`/`sources` when empty — an emitted `[]` is not the same\n // shape as an absent key (spec §5.3 derives `unverified` from \"no\n // `verified` key\", not from \"empty `verified` list\").\n ...(f.okf_verified && f.okf_verified.length > 0 ? { verified: f.okf_verified } : {}),\n ...(f.okf_sources && f.okf_sources.length > 0 ? { sources: f.okf_sources } : {}),\n ...(f.okf_usage_window ? { usage_window: f.okf_usage_window } : {}),\n // Temporal (spec 2026-09-29 §10.9): flat epoch-ms keys, like created_at.\n ...(f.valid_from != null ? { valid_from: f.valid_from } : {}),\n ...(f.valid_to != null ? { valid_to: f.valid_to } : {}),\n ...(f.superseded_by != null ? { superseded_by: f.superseded_by } : {}),\n ...(f.superseded_at != null ? { superseded_at: f.superseded_at } : {}),\n };\n}\n\nfunction taskFrontmatterV2(t: WikiTask): OkfFrontmatter {\n return {\n type: t.okf_type ?? 'task',\n title: t.description,\n timestamp: isoOrFallback(t.updated_at), // see factFrontmatterV2 comment — deliberate back-compat duplication\n id: t.id,\n entity_id: t.entity_id,\n status: t.lifecycle_status ?? 'stable', // OKF v0.2 lifecycle\n execution_status: t.status, // execution state under renamed key\n priority: t.priority,\n created_at: t.created_at,\n resolved_at: t.resolved_at,\n deleted_at: t.deleted_at,\n // OKF v0.2 — symmetric with facts (spec §2.5): stale_after applies to\n // tasks too (a hallucinated task needs a freshness signal as much as a\n // hallucinated fact does).\n ...(isoDateOrOmit(t.stale_after) ? { stale_after: isoDateOrOmit(t.stale_after) } : {}),\n ...(t.generated_by ? { generated: { by: t.generated_by, at: isoOrFallback(t.updated_at) } } : {}),\n ...(t.okf_verified && t.okf_verified.length > 0 ? { verified: t.okf_verified } : {}),\n ...(t.okf_sources && t.okf_sources.length > 0 ? { sources: t.okf_sources } : {}),\n ...(t.okf_usage_window ? { usage_window: t.okf_usage_window } : {}),\n };\n}\n\nfunction factFrontmatterV1(f: WikiFact): OkfFrontmatter {\n return {\n type: f.okf_type ?? 'fact',\n title: f.title,\n tags: f.tags,\n timestamp: isoOrFallback(f.updated_at),\n resource: f.source_ref ?? undefined,\n id: f.id,\n entity_id: f.entity_id,\n confidence: f.confidence,\n source_type: f.source_type,\n source_hash: f.source_hash,\n created_at: f.created_at,\n access_count: f.access_count,\n last_accessed_at: f.last_accessed_at,\n deleted_at: f.deleted_at,\n };\n}\n\nfunction taskFrontmatterV1(t: WikiTask): OkfFrontmatter {\n return {\n type: t.okf_type ?? 'task',\n title: t.description,\n timestamp: isoOrFallback(t.updated_at),\n id: t.id,\n entity_id: t.entity_id,\n status: t.status,\n priority: t.priority,\n created_at: t.created_at,\n resolved_at: t.resolved_at,\n deleted_at: t.deleted_at,\n };\n}\n\nfunction formatLogDate(timestampMs: number): string {\n return new Date(timestampMs).toISOString().slice(0, 10);\n}\n\nfunction conceptRelativePath(sourceFilePath: string, targetFilePath: string): string {\n const sourceDir = sourceFilePath.slice(0, sourceFilePath.lastIndexOf('/'));\n const targetDir = targetFilePath.slice(0, targetFilePath.lastIndexOf('/'));\n const targetName = targetFilePath.slice(targetFilePath.lastIndexOf('/') + 1);\n if (sourceDir === targetDir) return `./${targetName}`;\n if (sourceDir.endsWith('/facts') && targetDir.endsWith('/tasks')) return `../tasks/${targetName}`;\n if (sourceDir.endsWith('/tasks') && targetDir.endsWith('/facts')) return `../facts/${targetName}`;\n return targetFilePath.replace(/^entities\\/[^/]+\\//, '');\n}\n\nfunction buildEventLogEntries(\n events: WikiEvent[],\n factIdToFilename: Map<string, string>,\n): OkfLogEntry[] {\n return events.map(e => {\n const factFilename = e.related_entry_id ? factIdToFilename.get(e.related_entry_id) : undefined;\n const summary = e.summary\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\[/g, '\\\\[')\n .replace(/\\]/g, '\\\\]')\n .replace(/\\r?\\n/g, ' ');\n\n const text = factFilename\n ? `(${e.event_type}) [${summary}](./facts/${factFilename}.md)`\n : `(${e.event_type}) ${summary}`;\n return { date: formatLogDate(e.created_at), text: appendEventIdComment(text, e.id) };\n });\n}\n\nexport function formatOkfBundle(\n dump: MemoryDump,\n options?: FormatOkfBundleOptions,\n): { files: OkfFile[] } {\n const profile: OkfFormatProfile = options?.profile ?? DEFAULT_PROFILE;\n const okfVersion = profile === 'llm-wiki/2' ? '0.2' : '0.1';\n const factFm = profile === 'llm-wiki/2' ? factFrontmatterV2 : factFrontmatterV1;\n const taskFm = profile === 'llm-wiki/2' ? taskFrontmatterV2 : taskFrontmatterV1;\n\n const files: OkfFile[] = [];\n const rootEntries: OkfIndexEntry[] = [];\n\n for (const [entityId, bundle] of Object.entries(dump.entities)) {\n const dir = sanitizeForFilename(entityId);\n const factIdToFilename = new Map(\n bundle.facts.map(f => [f.id, sanitizeConceptId(f.id)] as const),\n );\n\n const idToConceptPath = new Map<string, string>();\n for (const f of bundle.facts) {\n idToConceptPath.set(f.id, `entities/${dir}/facts/${factIdToFilename.get(f.id)!}.md`);\n }\n for (const t of bundle.tasks) {\n idToConceptPath.set(t.id, `entities/${dir}/tasks/${sanitizeConceptId(t.id)}.md`);\n }\n\n const edgesBySource = new Map<string, WikiEdge[]>();\n for (const edge of bundle.edges ?? []) {\n const group = edgesBySource.get(edge.source_id) ?? [];\n group.push(edge);\n edgesBySource.set(edge.source_id, group);\n }\n\n function relatedLinksFor(sourcePath: string, sourceId: string) {\n return (edgesBySource.get(sourceId) ?? [])\n .map(edge => {\n const targetPath = idToConceptPath.get(edge.target_id);\n if (!targetPath) return null;\n return { edge_type: edge.edge_type, path: conceptRelativePath(sourcePath, targetPath) };\n })\n .filter((link): link is { edge_type: string; path: string } => link != null);\n }\n\n const factEntries: OkfIndexEntry[] = bundle.facts.map(f => ({\n path: `facts/${factIdToFilename.get(f.id)!}.md`,\n title: f.title,\n }));\n for (const f of bundle.facts) {\n const factPath = `entities/${dir}/facts/${factIdToFilename.get(f.id)!}.md`;\n const factBody = appendRelatedSection(f.body, relatedLinksFor(factPath, f.id));\n files.push({\n path: factPath,\n content: buildConceptDocument(factFm(f), factBody),\n });\n }\n\n const taskEntries: OkfIndexEntry[] = bundle.tasks.map(t => ({\n path: `tasks/${sanitizeConceptId(t.id)}.md`,\n title: t.description,\n }));\n for (const t of bundle.tasks) {\n const taskPath = `entities/${dir}/tasks/${sanitizeConceptId(t.id)}.md`;\n const taskBody = appendRelatedSection('', relatedLinksFor(taskPath, t.id));\n files.push({\n path: taskPath,\n content: buildConceptDocument(taskFm(t), taskBody),\n });\n }\n\n files.push({\n path: `entities/${dir}/log.md`,\n content: buildLogMd(buildEventLogEntries(bundle.events, factIdToFilename)),\n });\n\n const entityIndexSections: OkfIndexSection[] = [\n { heading: 'Facts', entries: factEntries },\n { heading: 'Tasks', entries: taskEntries },\n ];\n files.push({\n path: `entities/${dir}/index.md`,\n content: buildEntityIndexMd({\n summary: bundle.summary,\n sections: entityIndexSections,\n }),\n });\n\n rootEntries.push({ path: `entities/${dir}/index.md`, title: entityId });\n }\n\n files.push({\n path: 'index.md',\n content: buildRootIndexMd(\n okfVersion,\n rootEntries.length > 0 ? [{ heading: 'Entities', entries: rootEntries }] : [],\n { profile },\n ),\n });\n\n return { files };\n}","import type { MemoryDump, WikiFact, WikiTask, WikiEvent, WikiEdge } from '../types';\nimport type { OkfFile, OkfFrontmatter, OkfFrontmatterValue } from '@equationalapplications/core-okf';\nimport {\n parseConcept,\n parseLogMd,\n parseRootIndexMd,\n parseEntityIndexMd,\n parseEventIdComment,\n splitRelatedSection,\n isAllowedOkfPath,\n extractMarkdownLinks,\n parseVerifiedFlexible,\n parseCitationsList,\n latestVerified,\n formatVerifiedJson,\n formatSourcesJson,\n type OkfSource,\n type OkfVerified,\n} from '@equationalapplications/core-okf';\nimport { generateId } from './ids';\n\nexport interface OkfImportOptions {\n typeMapping?: Record<string, 'fact' | 'task' | 'ignore'>;\n defaultSchema?: 'fact' | 'task' | 'ignore';\n}\n\ntype Route = 'fact' | 'task' | 'ignore';\n\nconst CONFIDENCE_VALUES = new Set(['certain', 'inferred', 'tentative']);\nconst SOURCE_TYPES = new Set([\n 'user_stated',\n 'librarian_inferred',\n 'user_confirmed',\n 'immutable_document',\n]);\nconst TASK_STATUSES = new Set(['pending', 'in_progress', 'done', 'abandoned']);\nconst EVENT_TYPES = new Set(['observation', 'decision', 'action', 'outcome']);\n\nfunction basenameMd(filePath: string): string {\n const name = filePath.slice(filePath.lastIndexOf('/') + 1);\n return name.endsWith('.md') ? name.slice(0, -3) : name;\n}\n\nfunction isConceptFile(filePath: string): boolean {\n if (!filePath.endsWith('.md')) return false;\n if (filePath.endsWith('/index.md') || filePath === 'index.md') return false;\n if (filePath.endsWith('/log.md') || filePath === 'log.md') return false;\n return true;\n}\n\nfunction isStructuralPath(filePath: string): boolean {\n return (\n filePath.endsWith('/index.md') ||\n filePath === 'index.md' ||\n filePath.endsWith('/log.md') ||\n filePath === 'log.md'\n );\n}\n\nfunction posixDirname(filePath: string): string {\n const idx = filePath.lastIndexOf('/');\n return idx === -1 ? '' : filePath.slice(0, idx);\n}\n\nfunction resolveRelativePath(fromFile: string, linkPath: string): string {\n const baseDir = posixDirname(fromFile);\n const segments = [...(baseDir ? baseDir.split('/') : []), ...linkPath.split('/')];\n const resolved: string[] = [];\n for (const seg of segments) {\n if (seg === '' || seg === '.') continue;\n if (seg === '..') {\n resolved.pop();\n continue;\n }\n resolved.push(seg);\n }\n return resolved.join('/');\n}\n\nfunction decodeLinkPath(path: string): string {\n if (!path.includes('%')) return path;\n try {\n return decodeURIComponent(path);\n } catch {\n return path;\n }\n}\n\nfunction addPathAliases(map: Map<string, string>, filePath: string, resolvedId: string): void {\n map.set(filePath, resolvedId);\n const withoutDot = filePath.replace(/^\\.\\//, '');\n if (withoutDot !== filePath) map.set(withoutDot, resolvedId);\n const entityRelative = filePath.replace(/^entities\\/[^/]+\\//, '');\n if (entityRelative !== filePath) {\n map.set(entityRelative, resolvedId);\n map.set(`./${entityRelative}`, resolvedId);\n }\n}\n\nfunction lookupResolvedId(map: Map<string, string>, path: string): string | undefined {\n const normalized = path.replace(/^\\.\\//, '');\n return map.get(path) ?? map.get(normalized) ?? map.get(`./${normalized}`);\n}\n\nfunction stripLinkSuffix(linkPath: string): string {\n const hashIdx = linkPath.indexOf('#');\n const queryIdx = linkPath.indexOf('?');\n if (hashIdx === -1 && queryIdx === -1) return linkPath;\n const cut =\n hashIdx === -1 ? queryIdx : queryIdx === -1 ? hashIdx : Math.min(hashIdx, queryIdx);\n return linkPath.slice(0, cut);\n}\n\nfunction resolveRoute(filePath: string, frontmatterType: string, options?: OkfImportOptions): Route {\n if (\n options?.typeMapping &&\n Object.prototype.hasOwnProperty.call(options.typeMapping, frontmatterType)\n ) {\n return options.typeMapping[frontmatterType]!;\n }\n if (filePath.includes('/facts/')) return 'fact';\n if (filePath.includes('/tasks/')) return 'task';\n return options?.defaultSchema ?? 'fact';\n}\n\nfunction parseFrontmatterTimestamp(value: OkfFrontmatterValue | undefined, fallback: number): number {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string') {\n const parsed = Date.parse(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return fallback;\n}\n\n/**\n * Parse an OKF v0.2 `stale_after` YYYY-MM-DD wire string into an epoch ms\n * value. Returns null on non-string, regex mismatch, or a calendar-invalid\n * date — the previous inline regex accepted any three numeric components, so\n * `2026-13-45` would yield NaN and crash the SQLite bind downstream.\n */\nfunction parseStaleAfterRaw(raw: unknown): number | null {\n if (typeof raw !== 'string') return null;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(raw);\n if (!m) return null;\n const year = Number(m[1]);\n const month = Number(m[2]);\n const day = Number(m[3]);\n const ms = Date.UTC(year, month - 1, day);\n if (!Number.isFinite(ms)) return null;\n // Reject calendar-invalid dates that Date.UTC silently normalizes (e.g.\n // 2025-02-29 → 2025-03-01). Compare the round-tripped components.\n const d = new Date(ms);\n if (\n d.getUTCFullYear() !== year ||\n d.getUTCMonth() + 1 !== month ||\n d.getUTCDate() !== day\n ) {\n return null;\n }\n return ms;\n}\n\nfunction unescapeLogSummary(summary: string): string {\n return summary.replace(/\\\\\\]/g, ']').replace(/\\\\\\[/g, '[').replace(/\\\\\\\\/g, '\\\\');\n}\n\n// linear: label group cannot start a plain char on `\\` or `[` (closes CodeQL #8); plain branch starts on \\S (closes CodeQL #1)\nconst LOG_LINE_PATTERN = /^\\(([^)]+)\\)\\s*(?:\\[((?:\\\\.|[^\\[\\]\\\\])*)\\]\\(([^)]+)\\)|(\\S.*))$/;\n\nfunction parseLogEntryText(text: string): {\n event_type: WikiEvent['event_type'];\n summary: string;\n linkPath?: string;\n} | null {\n const match = LOG_LINE_PATTERN.exec(text.trim());\n if (!match) return null;\n const [, rawType, linkedSummary, linkPath, plainSummary] = match;\n const event_type = EVENT_TYPES.has(rawType) ? (rawType as WikiEvent['event_type']) : 'observation';\n if (linkPath) {\n return { event_type, summary: unescapeLogSummary(linkedSummary), linkPath };\n }\n return { event_type, summary: (plainSummary ?? '').trim() };\n}\n\nfunction frontmatterToFact(\n entityId: string,\n id: string,\n frontmatter: OkfFrontmatter,\n body: string,\n now: number,\n): WikiFact {\n const created_at = parseFrontmatterTimestamp(frontmatter.created_at, now);\n // Precedence (spec §2.4): v0.2 `generated.at` -> v0.1 `timestamp` -> legacy\n // `updated_at` -> `now`. The previous order swapped `updated_at` ahead of\n // the other two, so a present-but-finite `updated_at` clobbered\n // `generated.at`. We nest the fallbacks so the first finite wins.\n const updated_at = parseFrontmatterTimestamp(\n (frontmatter as any).generated?.at,\n parseFrontmatterTimestamp(\n frontmatter.timestamp,\n parseFrontmatterTimestamp(frontmatter.updated_at, now),\n ),\n );\n\n const verified: OkfVerified = parseVerifiedFlexible((frontmatter as any).verified);\n const rawSources = (frontmatter as any).sources;\n const hasSourcesKey = rawSources !== undefined;\n const sources: OkfSource[] = Array.isArray(rawSources) ? rawSources as OkfSource[] : [];\n const usageWindow = (frontmatter as any).usage_window && typeof (frontmatter as any).usage_window === 'object'\n ? (frontmatter as any).usage_window as { from: string; to: string }\n : null;\n const lastV = latestVerified(verified, now);\n const lifecycleRaw = (frontmatter as any).status;\n const lifecycle_status: 'draft' | 'stable' | 'deprecated' =\n lifecycleRaw === 'draft' || lifecycleRaw === 'stable' || lifecycleRaw === 'deprecated'\n ? lifecycleRaw : 'stable';\n const staleAfterRaw = (frontmatter as any).stale_after;\n const stale_after = parseStaleAfterRaw(staleAfterRaw);\n const generated_by = (frontmatter as any).generated?.by ?? null;\n\n // Spec §13.1 fallback (applies to v0.1, profile-0, AND v0.2 paths): body\n // `# Citations` -> synthetic sources, one entry per URL. The fallback only\n // fires when the `sources` key is ABSENT — a bundle that explicitly declares\n // `sources: []` (an author clearing provenance) MUST NOT have body citations\n // silently synthesized back into it. `hasSourcesKey` distinguishes absent\n // from explicitly-empty.\n if (!hasSourcesKey) {\n const urls = parseCitationsList(body);\n for (const url of urls) {\n sources.push({ resource: url });\n }\n }\n\n return {\n id,\n entity_id: entityId,\n title: typeof frontmatter.title === 'string' ? frontmatter.title : '',\n body,\n tags: Array.isArray(frontmatter.tags)\n ? frontmatter.tags.filter((t): t is string => typeof t === 'string')\n : [],\n confidence: CONFIDENCE_VALUES.has(String(frontmatter.confidence))\n ? (frontmatter.confidence as WikiFact['confidence'])\n : 'tentative',\n source_type: SOURCE_TYPES.has(String(frontmatter.source_type))\n ? (frontmatter.source_type as WikiFact['source_type'])\n : 'user_stated',\n source_hash: typeof frontmatter.source_hash === 'string' ? frontmatter.source_hash : null,\n source_ref: typeof frontmatter.resource === 'string' ? frontmatter.resource : null,\n created_at,\n updated_at,\n last_accessed_at:\n frontmatter.last_accessed_at != null\n ? parseFrontmatterTimestamp(frontmatter.last_accessed_at, now)\n : null,\n access_count: typeof frontmatter.access_count === 'number' ? frontmatter.access_count : 0,\n deleted_at:\n frontmatter.deleted_at != null ? parseFrontmatterTimestamp(frontmatter.deleted_at, 0) : null,\n okf_type: frontmatter.type,\n // OKF v0.2\n lifecycle_status,\n stale_after,\n generated_by,\n okf_sources: sources,\n okf_verified: verified,\n okf_usage_window: usageWindow,\n last_verified_at: lastV?.at ?? null,\n last_verified_by: lastV?.by ?? null,\n ...optionalEpoch('valid_from', (frontmatter as any).valid_from),\n ...optionalEpoch('valid_to', (frontmatter as any).valid_to),\n ...(typeof (frontmatter as any).superseded_by === 'string' ? { superseded_by: (frontmatter as any).superseded_by } : {}),\n ...optionalEpoch('superseded_at', (frontmatter as any).superseded_at),\n };\n}\n\n/** Temporal epoch-ms frontmatter keys (spec 2026-09-29 §10.9): keep only finite,\n * non-negative numbers; anything else means \"absent\" and the key stays off. */\nfunction optionalEpoch<K extends string>(key: K, v: unknown): Partial<Record<K, number>> {\n return typeof v === 'number' && Number.isFinite(v) && v >= 0 ? ({ [key]: Math.trunc(v) } as Record<K, number>) : {};\n}\n\nfunction frontmatterToTask(\n entityId: string,\n id: string,\n frontmatter: OkfFrontmatter,\n now: number,\n // Treat profile-1 explicit and version-only legacy the same: in both cases\n // `status` on the wire is the v0.1 execution state. Profile-2 (and unknown\n // profile with okf_version 0.2) uses the v0.2 rename rule.\n usesV1StatusRule: boolean,\n): WikiTask {\n const created_at = parseFrontmatterTimestamp(frontmatter.created_at, now);\n // Precedence (spec §2.4) — same nested-fallback chain as frontmatterToFact.\n const updated_at = parseFrontmatterTimestamp(\n (frontmatter as any).generated?.at,\n parseFrontmatterTimestamp(\n frontmatter.timestamp,\n parseFrontmatterTimestamp(frontmatter.updated_at, now),\n ),\n );\n\n const verified: OkfVerified = parseVerifiedFlexible((frontmatter as any).verified);\n const sources: OkfSource[] = Array.isArray((frontmatter as any).sources) ? (frontmatter as any).sources as OkfSource[] : [];\n const usageWindow = (frontmatter as any).usage_window && typeof (frontmatter as any).usage_window === 'object'\n ? (frontmatter as any).usage_window as { from: string; to: string }\n : null;\n const lastV = latestVerified(verified, now);\n const lifecycleRaw = (frontmatter as any).status;\n const lifecycle_status: 'draft' | 'stable' | 'deprecated' =\n lifecycleRaw === 'draft' || lifecycleRaw === 'stable' || lifecycleRaw === 'deprecated'\n ? lifecycleRaw : 'stable';\n // stale_after is symmetric with facts (spec §2.5) — parsed the same way,\n // not hardcoded to null.\n const staleAfterRaw = (frontmatter as any).stale_after;\n const stale_after = parseStaleAfterRaw(staleAfterRaw);\n\n // Status rename rule (spec §2.3):\n // - v0.2: wire `status` = lifecycle (already in lifecycle_status above);\n // wire `execution_status` = execution -> `task.status`.\n // - v0.1 / profile 0: wire `status` = execution -> `task.status`; lifecycle\n // is implicit 'stable'. Profile-1 bundles are explicit about being v0.1\n // (`profile: llm-wiki/1`); profile-0 (no profile key, `okf_version: 0.1`)\n // is the version-only fallback; both MUST use the v0.1 rule.\n const executionRaw = (frontmatter as any).execution_status;\n let executionState: WikiTask['status'];\n if (usesV1StatusRule) {\n executionState = TASK_STATUSES.has(String(frontmatter.status))\n ? (frontmatter.status as WikiTask['status']) : 'pending';\n } else {\n // v0.2 (or unknown profile — best-effort per spec §6 \"profile key unknown\").\n executionState = TASK_STATUSES.has(String(executionRaw))\n ? (executionRaw as WikiTask['status'])\n : TASK_STATUSES.has(String(frontmatter.status))\n ? (frontmatter.status as WikiTask['status'])\n : 'pending';\n }\n\n return {\n id,\n entity_id: entityId,\n description: typeof frontmatter.title === 'string' ? frontmatter.title : '',\n status: executionState,\n priority: typeof frontmatter.priority === 'number' ? frontmatter.priority : 0,\n created_at,\n updated_at,\n resolved_at:\n frontmatter.resolved_at != null\n ? parseFrontmatterTimestamp(frontmatter.resolved_at, now)\n : null,\n deleted_at:\n frontmatter.deleted_at != null ? parseFrontmatterTimestamp(frontmatter.deleted_at, 0) : null,\n okf_type: frontmatter.type,\n // OKF v0.2\n lifecycle_status,\n stale_after,\n generated_by: (frontmatter as any).generated?.by ?? null,\n okf_sources: sources,\n okf_verified: verified,\n okf_usage_window: usageWindow,\n last_verified_at: lastV?.at ?? null,\n last_verified_by: lastV?.by ?? null,\n };\n}\n\nfunction findLogMdPath(files: OkfFile[]): string | undefined {\n return files.find(f => f.path.endsWith('/log.md') || f.path === 'log.md')?.path;\n}\n\nfunction extractEdgesFromLinks(\n filePath: string,\n resolvedId: string,\n links: Array<{ text: string; path: string }>,\n pathToResolvedId: Map<string, string>,\n entityId: string,\n now: number,\n seenEdges: Set<string>,\n edges: WikiEdge[],\n): void {\n for (const link of links) {\n const strippedPath = stripLinkSuffix(decodeLinkPath(link.path));\n const directTargetId = lookupResolvedId(pathToResolvedId, strippedPath);\n const resolvedTargetPath = resolveRelativePath(filePath, strippedPath);\n if (isStructuralPath(strippedPath) || isStructuralPath(resolvedTargetPath)) continue;\n const targetId = directTargetId ?? lookupResolvedId(pathToResolvedId, resolvedTargetPath);\n if (!targetId) continue;\n const edgeKey = `${resolvedId}\\u0000${targetId}\\u0000${link.text}`;\n if (seenEdges.has(edgeKey)) continue;\n seenEdges.add(edgeKey);\n edges.push({\n id: generateId(),\n entity_id: entityId,\n source_id: resolvedId,\n target_id: targetId,\n edge_type: link.text,\n created_at: now,\n });\n }\n}\n\nexport function parseOkfBundle(\n entityId: string,\n files: OkfFile[],\n options?: OkfImportOptions,\n): MemoryDump {\n const now = Date.now();\n const normalizeOkfPath = (p: string) => p.replace(/^\\.\\//, '').replace(/\\\\/g, '/');\n\n const normalizedFiles = files.map(f => ({ ...f, path: normalizeOkfPath(f.path) }));\n\n const allowlistedFiles = normalizedFiles.filter(f => isAllowedOkfPath(f.path));\n\n const entityDirs = new Set(\n allowlistedFiles\n .map(f => /^entities\\/([^/]+)\\//.exec(f.path)?.[1])\n .filter((dir): dir is string => !!dir),\n );\n if (entityDirs.size > 1) {\n throw new Error(\n `parseOkfBundle: expected a single-entity bundle for \"${entityId}\", found entities: ${Array.from(entityDirs).join(', ')}`,\n );\n }\n const entityDir = entityDirs.values().next().value ?? entityId;\n const entityPrefix = `entities/${entityDir}/`;\n\n const allowedFiles = allowlistedFiles.filter(\n f => f.path === 'index.md' || f.path.startsWith(entityPrefix),\n );\n const rootIndex = allowedFiles.find(f => f.path === 'index.md');\n const profileMeta = rootIndex ? parseRootIndexMd(rootIndex.content) : {};\n const okfVersion = profileMeta.okf_version;\n const profile = profileMeta.profile;\n const isProfile1 = profile === 'llm-wiki/1';\n const isProfile2 = profile === 'llm-wiki/2';\n const isLegacyV1 = profile === undefined && okfVersion === '0.1';\n\n // Entity summary is a profile >= 1 feature (§4 of the profile doc). The\n // documented detection order (§4.8 detection plan) names four v0.1 and v0.2\n // entry points: explicit profile, version-only v0.1, version-only v0.2, and\n // unknown-profile v0.2 (best-effort). All four should pick up the summary.\n const isVersionOnlyV2 = profile === undefined && okfVersion === '0.2';\n const isUnknownProfileV2 = profile !== undefined && profile !== 'llm-wiki/1' && profile !== 'llm-wiki/2' && okfVersion === '0.2';\n const summaryEligible = isProfile1 || isProfile2 || isLegacyV1 || isVersionOnlyV2 || isUnknownProfileV2;\n let entitySummary: string | undefined;\n const entityIndex = allowedFiles.find(f => f.path === `${entityPrefix}index.md`);\n if (summaryEligible && entityIndex) {\n const summary = parseEntityIndexMd(entityIndex.content).summary;\n entitySummary = summary || undefined;\n }\n\n const pathToResolvedId = new Map<string, string>();\n\n for (const file of allowedFiles) {\n if (!isConceptFile(file.path)) continue;\n const { frontmatter } = parseConcept(file.content);\n const route = resolveRoute(file.path, frontmatter.type ?? '', options);\n if (route === 'ignore') continue;\n const resolvedId =\n typeof frontmatter.id === 'string' && frontmatter.id ? frontmatter.id : basenameMd(file.path);\n addPathAliases(pathToResolvedId, file.path, resolvedId);\n }\n\n const facts: WikiFact[] = [];\n const tasks: WikiTask[] = [];\n const edges: WikiEdge[] = [];\n let logContent: string | null = null;\n const logMdPath = findLogMdPath(allowedFiles);\n\n for (const file of allowedFiles) {\n if (file.path.endsWith('/log.md') || file.path === 'log.md') {\n logContent = file.content;\n continue;\n }\n if (!isConceptFile(file.path)) continue;\n\n const { frontmatter, body } = parseConcept(file.content);\n const route = resolveRoute(file.path, frontmatter.type ?? '', options);\n if (route === 'ignore') continue;\n\n const resolvedId =\n typeof frontmatter.id === 'string' && frontmatter.id ? frontmatter.id : basenameMd(file.path);\n\n const { body: storedBody, relatedLinks } = splitRelatedSection(body);\n const edgeLinks = (isProfile1 || isLegacyV1)\n ? relatedLinks\n : [...relatedLinks, ...extractMarkdownLinks(storedBody)];\n\n // Task status rename rule (spec §2.3) — v0.1 wire uses `status` as\n // execution state; v0.2 wire uses `status` as lifecycle and adds\n // `execution_status`. The flag we pass below is true when we are NOT\n // reading this task as a v0.2-style bundle.\n const usesV1StatusRule = isProfile1 || isLegacyV1 || (profile === undefined && okfVersion === undefined);\n\n if (route === 'fact') {\n facts.push(frontmatterToFact(entityId, resolvedId, frontmatter, storedBody, now));\n } else {\n tasks.push(frontmatterToTask(entityId, resolvedId, frontmatter, now, usesV1StatusRule));\n }\n\n const seenEdges = new Set<string>();\n extractEdgesFromLinks(\n file.path,\n resolvedId,\n edgeLinks,\n pathToResolvedId,\n entityId,\n now,\n seenEdges,\n edges,\n );\n }\n\n const events: WikiEvent[] = [];\n if (logContent != null) {\n const logPath = logMdPath ?? `entities/${entityId}/log.md`;\n for (const entry of parseLogMd(logContent)) {\n const { text, eventId } = parseEventIdComment(entry.text);\n const parsed = parseLogEntryText(text);\n if (!parsed) continue;\n let related_entry_id: string | null = null;\n if (parsed.linkPath) {\n const targetPath = resolveRelativePath(\n logPath,\n stripLinkSuffix(decodeLinkPath(parsed.linkPath)),\n );\n if (!isStructuralPath(targetPath) && targetPath.includes('/facts/')) {\n related_entry_id = lookupResolvedId(pathToResolvedId, targetPath) ?? null;\n }\n }\n const created_at = new Date(`${entry.date}T00:00:00.000Z`).getTime();\n if (!Number.isFinite(created_at)) continue;\n\n events.push({\n id: eventId ?? generateId('evt_'),\n entity_id: entityId,\n event_type: parsed.event_type,\n summary: parsed.summary,\n related_entry_id,\n created_at,\n });\n }\n }\n\n return {\n generatedAt: now,\n entities: {\n [entityId]: { facts, tasks, events, edges, summary: entitySummary },\n },\n };\n}\n","import type { ReadOptions } from './types';\n\nexport interface LibrarianOptions {\n /** If provided, replaces the default Librarian system instructions. */\n systemPrompt?: string;\n /** entity_id -> score multiplier, forwarded to WikiMemory.read() as tierWeights. */\n entityWeights?: Record<string, number>;\n /** Forwarded to WikiMemory.read() for zero-weight filler context. */\n includeZeroWeightEntities?: boolean;\n temperature?: number;\n}\n\nexport interface LibrarianPromptVariables {\n context: string;\n tasks: string;\n query: string;\n}\n\nexport const DEFAULT_LIBRARIAN_SYNTHESIS_PROMPT = `You are a careful memory synthesis assistant.\nUse only the retrieved context when answering the request.\nPreserve source provenance when facts come from different entity namespaces.\n\nRequest:\n{{query}}\n\nRetrieved context:\n{{context}}\n\nOpen tasks:\n{{tasks}}`;\n\nexport function hydrateLibrarianPrompt(\n template: string,\n variables: LibrarianPromptVariables,\n): string {\n return template.replace(/\\{\\{(context|tasks|query)\\}\\}/g, (_, key) => variables[key as keyof LibrarianPromptVariables]);\n}\n\nexport function validateLibrarianPromptTemplate(\n template: string,\n options: { custom: boolean; taskCount: number },\n): string[] {\n if (!options.custom) return [];\n\n const warnings: string[] = [];\n if (!template.includes('{{context}}')) {\n warnings.push('Custom Librarian systemPrompt omits {{context}}; retrieved memory will not be injected.');\n }\n if (!template.includes('{{query}}')) {\n warnings.push('Custom Librarian systemPrompt omits {{query}}; the original request will not be injected.');\n }\n if (options.taskCount > 0 && !template.includes('{{tasks}}')) {\n warnings.push('Custom Librarian systemPrompt omits {{tasks}} while retrieved tasks are available.');\n }\n return warnings;\n}\n\nexport function mapLibrarianOptionsToReadOptions(\n options: LibrarianOptions,\n): Pick<ReadOptions, 'tierWeights' | 'includeZeroWeightEntities'> {\n const readOptions: Pick<ReadOptions, 'tierWeights' | 'includeZeroWeightEntities'> = {};\n if (options.entityWeights !== undefined) readOptions.tierWeights = options.entityWeights;\n if (options.includeZeroWeightEntities !== undefined) {\n readOptions.includeZeroWeightEntities = options.includeZeroWeightEntities;\n }\n return readOptions;\n}\n","import { WikiMemory } from './WikiMemory';\nimport type { SQLiteAdapter, WikiOptions } from './types';\n\nexport * from './types';\nexport type { WikiOutboxEvent } from './outbox/types';\nexport { WikiMemory } from './WikiMemory';\nexport type { WikiMemoryTestAccess } from './WikiMemory';\nexport { formatContext } from './utils/formatContext';\nexport { formatGraphContext } from './utils/formatGraphContext';\nexport { formatMemoryDump } from './utils/formatMemoryDump';\nexport { formatOkfBundle, type FormatOkfBundleOptions, type OkfFormatProfile } from './utils/formatOkfBundle';\nexport { parseOkfBundle, type OkfImportOptions } from './utils/parseOkfBundle';\nexport { parseEmbedding } from './utils/embedding';\nexport { validateManifest } from './utils/ontology';\nexport { configureRandomSource } from './utils/ids';\nexport { chunkText, safeSlice } from './utils/pure';\nexport { DEFAULT_MAX_CHUNK_LENGTH, DEFAULT_CHUNK_OVERLAP } from './utils/chunkingDefaults';\nexport { DEFAULT_MAX_EMBED_CHARS, EMBED_CHARS_CEILING } from './utils/embedDefaults';\nexport { DEFAULT_SETUP_BUDGET_MS } from './utils/setupDefaults';\nexport * from './librarianPrompt';\nexport { PromptService } from './services/PromptService';\nexport type { EmbedFactResult, EmbedFailureKind } from './services/EmbeddingService';\nexport {\n ONTOLOGY_BACKFILL_BATCH_SIZE,\n ONTOLOGY_BACKFILL_MAX_PROMPT_CHARS,\n ONTOLOGY_BACKFILL_RECHECK_MS,\n HEAL_ANCHORS_PER_CANDIDATE,\n HEAL_BATCH_SIZE,\n HEAL_MAX_FACT_BODY_CHARS_L3,\n HEAL_MAX_TASKS,\n HEAL_RECHECK_MS,\n} from './services/MaintenanceService';\nexport { ONTOLOGY_BACKFILL_SYSTEM_PROMPT } from './prompts';\n\nexport function createWiki(db: SQLiteAdapter, options: WikiOptions): WikiMemory {\n return new WikiMemory(db, options);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/db/migrationGate.ts","../src/db/serializedAdapter.ts","../src/repositories/EntryRepository.ts","../src/repositories/OutboxRepository.ts","../src/repositories/SourceRefIndexRepository.ts","../src/repositories/TaskRepository.ts","../src/repositories/EventRepository.ts","../src/repositories/EdgeRepository.ts","../src/services/search/MiniSearchIndexStrategy.ts","../src/utils/monotonicNow.ts","../src/utils/setupDefaults.ts","../src/services/search/ftsQuery.ts","../src/services/search/Fts5IndexStrategy.ts","../src/services/search/createIndexStrategy.ts","../src/services/MaintenanceScheduler.ts","../src/prompts/ontology.ts","../src/services/OntologyService.ts","../src/services/GraphTraversalService.ts","../src/repositories/LintRepository.ts","../src/services/LintService.ts","../src/db/okf-trust-writes.ts","../src/utils/rememberInput.ts","../src/services/RememberService.ts","../src/WikiMemory.ts","../src/utils/formatContext.ts","../src/utils/formatGraphContext.ts","../src/utils/sanitizeForFilename.ts","../src/utils/formatMemoryDump.ts","../src/utils/formatOkfBundle.ts","../src/utils/parseOkfBundle.ts","../src/librarianPrompt.ts","../src/index.ts"],"names":["isStaleAfter","deriveTrustTier","rows","assertEntityId","stashed","relatedLinksFor","CONFIDENCE_VALUES","latestVerified"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { SQLiteAdapter, MigrationPolicy, PendingMigrationWork } from '../types';\nimport type { MetadataRepository } from '../repositories/MetadataRepository';\nimport { probePendingWork } from './sourceRefNormalize';\nimport { setupDatabase } from './schema';\nimport { WikiMigrationRequiredError } from '../types';\n\nconst MIGRATION_POLICIES: readonly MigrationPolicy[] = ['allow', 'refuse', 'auto'];\n\n/**\n * Runs the read-only migration gate, then setupDatabase's every-open DDL.\n * - 'allow': no gate.\n * - 'refuse': any pending work throws before any mutation.\n * - 'auto': a pending schema migration throws; a pending source_ref normalize\n * is let through and run by setup() after the DDL and migrations loop.\n */\nexport async function setupDatabaseWithGate(\n db: SQLiteAdapter,\n prefix: string,\n meta: MetadataRepository,\n migrations: MigrationPolicy = 'allow',\n): Promise<void> {\n // Fail closed: an unrecognized value (e.g. 'Refuse' from env/JSON config) must not\n // silently skip the refusal and run a migration inside a time-critical open.\n if (!MIGRATION_POLICIES.includes(migrations)) {\n throw new TypeError(`Invalid migrations policy ${JSON.stringify(migrations)}; expected 'allow', 'refuse' or 'auto'.`);\n }\n if (migrations !== 'allow') {\n const pending = await probePendingWork(db, meta, prefix);\n if (pending && (migrations === 'refuse' || pending.type === 'schema_migration')) {\n throw new WikiMigrationRequiredError(describePending(pending, migrations), pending);\n }\n }\n return setupDatabase(db, prefix);\n}\n\nfunction describePending(pending: PendingMigrationWork, policy: MigrationPolicy): string {\n const what = pending.type === 'schema_migration'\n ? `schema migration v${pending.fromVersion} -> v${pending.toVersion} is pending`\n : pending.entriesWatermark === 0 && pending.sourceRefIndexWatermark === 0\n ? 'source_ref normalize has not run on this store (normalize stamp missing or outdated; may complete with zero rewrites)'\n : 'source_ref normalize was interrupted and will resume from its watermark';\n return `Migration refused (migrations: '${policy}'): ${what}. ` +\n `Open once with setup({ migrations: 'allow' }) outside any time-critical path to complete it.`;\n}\n","import type { SQLiteAdapter } from '../types';\nimport { WikiTransactionError } from '../types';\nimport { extractSqliteCode } from './sqliteCodes';\n\nexport { extractSqliteCode };\n\n/** True when `err` carries a parseable SQLite code — gates whether the wrapper re-wraps. */\nexport function isDriverError(err: unknown): boolean {\n return extractSqliteCode(err) !== undefined;\n}\n\n/**\n * Returns an adapter with the given methods overridden, delegating everything else\n * (own or class-prototype methods) to `target`.\n *\n * Uses a `Proxy` rather than `Object.create`/object-spread: delegated methods are\n * bound to `target` before being returned, so their receiver (`this`) stays the\n * original adapter instance. That keeps ES `#private` fields and `instanceof`/identity\n * checks inside those methods working — `Object.create` would invoke them with the\n * wrapper as `this` and break both.\n */\nfunction withOverrides(target: SQLiteAdapter, overrides: Partial<SQLiteAdapter>): SQLiteAdapter {\n return new Proxy(target, {\n get(obj, prop, receiver) {\n if (prop in overrides) return Reflect.get(overrides, prop, receiver);\n const value = Reflect.get(obj, prop, obj);\n return typeof value === 'function' ? value.bind(obj) : value;\n },\n }) as SQLiteAdapter;\n}\n\n/**\n * Returns the same adapter with `withTransactionAsync` overridden to throw. Injected\n * by the serialized wrapper onto the `tx` handed to every callback so a *nested*\n * transaction fails loudly instead of deadlocking against the mutex.\n */\nexport function guardReentrancy(tx: SQLiteAdapter): SQLiteAdapter {\n return withOverrides(tx, {\n withTransactionAsync() {\n throw new Error(\n 'Nested withTransactionAsync is not supported: you are already ' +\n 'inside a transaction. Pass the current `tx` down instead of ' +\n 'opening a new transaction.'\n );\n },\n });\n}\n\nconst DEADLOCK_WARN_MS = 10_000;\n\n/**\n * Wraps `withTransactionAsync` in a promise-chain mutex so transactions on the\n * single shared connection run one at a time. Non-transactional reads/writes are\n * untouched. Applied once in the WikiMemory constructor before the adapter reaches\n * any repository or service.\n */\nexport function withSerializedTransactions(db: SQLiteAdapter): SQLiteAdapter {\n let queue: Promise<unknown> = Promise.resolve();\n return withOverrides(db, {\n withTransactionAsync<T>(fn: (tx: SQLiteAdapter) => Promise<T>): Promise<T> {\n // Warns if a call waits >10s for the lock — the signature of the closure-capture\n // deadlock (calling the outer `db` instead of `tx` inside a callback). Cleared the\n // instant the lock is acquired, so it measures queue wait only.\n const warn = setTimeout(() => {\n console.warn(\n '[core-llm-wiki] Transaction queued >10s — possible deadlock. ' +\n 'Inside a transaction callback, use the `tx` parameter, never the ' +\n 'outer database handle.'\n );\n }, DEADLOCK_WARN_MS);\n\n const run = queue\n .catch(() => undefined) // proceed from a settled state; swallow prior outcome\n .then(() => {\n clearTimeout(warn);\n // Re-wrap the tx so a nested withTransactionAsync throws synchronously.\n // Some adapters invoke the callback with no tx handle; fall back to the\n // outer db (same connection). The guard still blocks nested transactions.\n return db.withTransactionAsync((tx) => fn(guardReentrancy(tx ?? db)));\n })\n .catch((e) => {\n // Wrap only driver errors; domain errors reach the caller with instanceof intact.\n throw isDriverError(e)\n ? new WikiTransactionError('Transaction failed', { cause: e })\n : e;\n });\n\n queue = run; // advance the tail; next caller's leading .catch() absorbs this rejection\n return run as Promise<T>;\n },\n });\n}\n","import type { SQLiteAdapter, WikiFact, EmbeddingMarkerKind } from '../types';\nimport { WikiGraphNodeOwnershipConflict } from '../types';\nimport { BaseRepository } from './BaseRepository';\nimport { OutboxRepository } from './OutboxRepository';\nimport { parseJsonArray, parseJsonObject } from './rowMappers';\nimport { reanchorRebuildFingerprint } from '../services/search/fts5Progress';\nimport { liveAtSql, type LiveMode } from '../utils/temporal';\nimport { isStaleAfter, deriveTrustTier } from '@equationalapplications/core-okf';\n\n/** Subset of temporal columns that {@link EntryRepository.setTemporal} may write (spec 2026-09-29 §4.3). */\nexport type TemporalFields = {\n valid_from?: number | null;\n valid_to?: number | null;\n superseded_by?: string | null;\n superseded_at?: number | null;\n};\n\n/** Lightweight projection used by TemporalService for supersession chain walks. */\nexport type TemporalRow = {\n id: string;\n entity_id: string;\n source_type: WikiFact['source_type'];\n deleted_at: number | null;\n created_at: number;\n valid_from: number | null;\n valid_to: number | null;\n superseded_by: string | null;\n};\n\nexport type EntryRowMetadata = {\n id: string;\n entity_id: string;\n updated_at: number | null;\n access_count: number | null;\n};\n\nexport type EntryRowWithEmbeddings = EntryRowMetadata & {\n embedding_blob: Uint8Array | null;\n embedding: string | null;\n};\n\n/**\n * One row of the reembed candidate scan. `findAllForReembed` does `SELECT *`,\n * so the marker columns come back at runtime; naming them here makes that\n * dependency visible to the compiler instead of hiding it behind a cast in\n * MaintenanceService.runReembed (spec §4.4).\n */\nexport type ReembedCandidateRow = WikiFact & {\n embedding_blob?: Uint8Array | null;\n embedding_failed_at?: number | null;\n embedding_failure_kind?: string | null;\n embedding_attempts?: number | null;\n};\n\nfunction mapRowToFact(row: any): WikiFact {\n const tags: string[] = (() => {\n if (Array.isArray(row.tags)) return row.tags;\n try { const p = JSON.parse(row.tags as string); if (Array.isArray(p)) return p; } catch {}\n return [];\n })();\n\n const okf_verified = parseJsonArray<NonNullable<WikiFact['okf_verified']>[number]>(row.okf_verified, []);\n // Hydrate per spec §2.7 + §5.3: surface isStale/trustTier so hosts don't have to\n // re-call the core-okf helpers. Sampled once per row rather than once per call\n // because `now` here means \"as of this hydration\" — using a stable per-call\n // value would shift staleness while we're mapping sibling rows in the same\n // read. Date.now() is cheap enough that per-row sampling is fine.\n const now = Date.now();\n const staleAfterRaw = row.stale_after != null ? Number(row.stale_after) : null;\n\n return {\n id: row.id,\n entity_id: row.entity_id,\n title: row.title,\n body: row.body,\n tags,\n confidence: row.confidence,\n source_type: row.source_type,\n source_hash: row.source_hash ?? null,\n source_ref: row.source_ref ?? null,\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n last_accessed_at: (row.last_accessed_at === null || row.last_accessed_at === undefined)\n ? null\n : Number(row.last_accessed_at),\n deleted_at: row.deleted_at != null ? Number(row.deleted_at) : null,\n access_count: Number(row.access_count ?? 0),\n okf_type: row.okf_type ?? null,\n // OKF v0.2\n lifecycle_status: (row.lifecycle_status ?? 'stable') as WikiFact['lifecycle_status'],\n stale_after: staleAfterRaw,\n generated_by: row.generated_by ?? null,\n okf_sources: parseJsonArray<NonNullable<WikiFact['okf_sources']>[number]>(row.okf_sources, []),\n okf_verified,\n okf_usage_window: parseJsonObject<NonNullable<WikiFact['okf_usage_window']>>(row.okf_usage_window),\n last_verified_at: row.last_verified_at != null ? Number(row.last_verified_at) : null,\n last_verified_by: row.last_verified_by ?? null,\n // Spec §2.7 + §5.3: hydrate so read() consumers don't re-call the helpers.\n isStale: isStaleAfter(staleAfterRaw, now),\n trustTier: deriveTrustTier(okf_verified),\n // Temporal (spec 2026-09-29 §4, §10.8): keys appear only when set so\n // existing deep-equality assertions and host snapshots are unchanged.\n ...(row.valid_from != null ? { valid_from: Number(row.valid_from) } : {}),\n ...(row.valid_to != null ? { valid_to: Number(row.valid_to) } : {}),\n ...(row.superseded_by != null ? { superseded_by: String(row.superseded_by) } : {}),\n ...(row.superseded_at != null ? { superseded_at: Number(row.superseded_at) } : {}),\n };\n}\n\nfunction normalizeEmbeddingBlobValue(blob: unknown): Uint8Array | null {\n if (blob instanceof Uint8Array) return blob;\n if (blob !== null && blob !== undefined && typeof blob === 'object') {\n const obj = blob as Record<string, unknown>;\n if (obj['type'] === 'Buffer' && Array.isArray(obj['data'])) {\n return new Uint8Array(obj['data'] as number[]);\n }\n const entries = Object.keys(obj);\n if (entries.length > 0 && entries.every((k) => /^\\d+$/.test(k))) {\n const len = entries.length;\n const arr = new Uint8Array(len);\n for (let i = 0; i < len; i++) arr[i] = (obj[String(i)] as number) ?? 0;\n return arr;\n }\n }\n return null;\n}\n\n/** Mapper that preserves embedding_blob for export/import round-tripping. */\nfunction mapRowToFactWithBlobs(row: any): WikiFact {\n const base = mapRowToFact(row);\n const embeddingBlob = normalizeEmbeddingBlobValue(row.embedding_blob);\n return embeddingBlob ? { ...base, embedding_blob: embeddingBlob } : base;\n}\n\n\nexport class EntryRepository extends BaseRepository {\n /**\n * Column list and liveness predicate shared by findMiniSearchRows and\n * findMiniSearchRowsByIds, so the full rebuild and the incremental read\n * can never drift apart (spec 2026-09-28 §4.4: both must produce\n * identical documents).\n */\n private static readonly MINI_SEARCH_COLUMNS = 'id, entity_id, title, body, tags';\n private static readonly MINI_SEARCH_LIVE_WHERE = 'WHERE deleted_at IS NULL';\n\n private chunkSize = 500;\n\n constructor(db: SQLiteAdapter, prefix: string, private outbox: OutboxRepository) {\n super(db, prefix);\n }\n\n /** Whether the entity has any non-deleted row (librarian gate: keyword ranking over zero facts is trivially empty). */\n async hasLiveEntry(entityId: string, tx?: SQLiteAdapter): Promise<boolean> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ one: number }>(\n `SELECT 1 AS one FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL LIMIT 1`,\n [entityId],\n );\n return row != null;\n }\n\n /**\n * Fetch facts by IDs, optionally scoped to entity IDs.\n * Returns facts in the order of the input IDs (first match wins).\n */\n async findByIds(\n ids: readonly string[],\n scopedEntityIds?: readonly string[],\n tx?: SQLiteAdapter,\n ): Promise<WikiFact[]> {\n const executor = this.getExecutor(tx);\n const rows: any[] = [];\n const entityClause = scopedEntityIds && scopedEntityIds.length > 0\n ? ` AND entity_id IN (${scopedEntityIds.map(() => '?').join(',')})`\n : '';\n const entityParams = scopedEntityIds ?? [];\n\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n const chunkRows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}entries WHERE id IN (${placeholders})${entityClause} AND deleted_at IS NULL`,\n [...chunk, ...entityParams],\n );\n rows.push(...chunkRows);\n }\n\n const byId = new Map(rows.map(r => [r.id, r]));\n return ids\n .map(id => byId.get(id))\n .filter((r): r is any => r !== undefined)\n .map(mapRowToFact);\n }\n\n /**\n * Upsert a WikiFact. Nullable fields set to null when fact value is null.\n * Returns { changes, lastInsertRowId }.\n * `tx` is REQUIRED to ensure atomic outbox staging.\n *\n * OKF metadata discipline (spec §2.5 + DAO checklist §8): content writes\n * MUST NOT silently overwrite OKF metadata that a caller didn't supply. The\n * previous CASE WHEN IS NULL guards around `lifecycle_status`, etc. were\n * dead because the bind always supplied a non-null value (notably\n * `fact.lifecycle_status ?? 'stable'`), so excluded.X was never NULL and\n * an UPDATE rewrote an existing `deprecated` row to `stable`. We now omit\n * these columns from the SET clause entirely — SQLite's ON CONFLICT UPDATE\n * leaves untouched columns at their existing row value, which is exactly\n * the preservation semantics we want for content writes. Callers that\n * intentionally want to overwrite OKF metadata should use\n * {@link upsertForImport} (always-replace semantics for that path).\n * New-row INSERTs still bind a value so the column is populated; if the\n * caller supplied nothing, the schema DEFAULT 'stable' applies when the\n * bind is bound as 'stable' explicitly here.\n *\n * Marker discipline (spec §4.1): a conflict carrying a real\n * `embedding_blob` clears the embedding failure markers, because the row now\n * HAS a valid embedding and a surviving marker would be a self-contradictory\n * diagnostic that inflates runReembed's permanentlyFailed counter. A conflict\n * with no blob leaves marker state alone, matching the \"absent means don't\n * touch\" semantics used for embedding_blob itself.\n *\n * Graph node ownership (spec §2.4 + §3, REQ-OWN-01 + REQ-GRAPH-01): entry\n * IDs share one database-wide namespace, so an ID stays owned by its\n * existing entity for as long as the row exists — soft deletion included.\n * The pre-write lookup already reads the existing row for OKF metadata; we\n * project `entity_id` off that same SELECT and reject the write before\n * any outbox payload construction when the stored owner differs from\n * `fact.entity_id`. Soft-deleted foreign rows keep their IDs reserved;\n * permanent reservation is NOT introduced, so a physically absent ID may\n * still be inserted under the requested entity. The ON CONFLICT UPDATE SET\n * clause carries a final `WHERE entries.entity_id = excluded.entity_id`\n * guard so the database itself refuses a cross-owner row overwrite even if\n * a future caller bypasses the pre-write check. When `runAsync` reports\n * 0 changes (a legitimate conflict-suppressed write, OR an adapter that\n * under-reports a permitted write) we re-read the stored owner; only a\n * foreign owner throws — this is local defensive behavior, not permission\n * for adapters to under-report. The thrown error is\n * `WikiGraphNodeOwnershipConflict` (no owner, node ID, or stored content\n * is disclosed). Upserts that pass both gates retain existing same-entity\n * update + resurrection semantics.\n */\n async upsert(fact: WikiFact, tx: SQLiteAdapter): Promise<{ changes: number; lastInsertRowId: number }> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const tagsJson = JSON.stringify(fact.tags);\n const embeddingBlob = this.normalizeEmbeddingBlob(fact.embedding_blob);\n\n const existingRow = await executor.getFirstAsync<{\n id: string;\n entity_id: string;\n lifecycle_status: string;\n stale_after: number | null;\n generated_by: string | null;\n okf_sources: string | null;\n okf_verified: string | null;\n okf_usage_window: string | null;\n last_verified_at: number | null;\n last_verified_by: string | null;\n }>(\n `SELECT id, entity_id, lifecycle_status, stale_after, generated_by,\n okf_sources, okf_verified, okf_usage_window,\n last_verified_at, last_verified_by\n FROM ${this.prefix}entries WHERE id = ?`,\n [fact.id],\n );\n\n // Entry IDs share one global namespace, so an ID stays owned by its\n // existing entity for as long as the row exists — soft deletion included.\n // Reject here, before any write or outbox payload construction. This costs\n // one extra column on a SELECT the method already ran, not a new query.\n if (existingRow && existingRow.entity_id !== fact.entity_id) {\n throw new WikiGraphNodeOwnershipConflict();\n }\n\n const operation = fact.deleted_at ? 'DELETE' : (existingRow ? 'UPDATE' : 'INSERT');\n\n const result = await executor.runAsync(\n `INSERT INTO ${this.prefix}entries (\n id, entity_id, title, body, tags, confidence, source_type,\n source_hash, source_ref, created_at, updated_at, last_accessed_at, access_count,\n deleted_at, embedding_blob, embedding, okf_type,\n lifecycle_status, stale_after, generated_by, last_verified_at, last_verified_by,\n okf_sources, okf_verified, okf_usage_window\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n title = excluded.title,\n body = excluded.body,\n tags = excluded.tags,\n confidence = excluded.confidence,\n source_type = excluded.source_type,\n source_hash = excluded.source_hash,\n source_ref = excluded.source_ref,\n updated_at = excluded.updated_at,\n last_accessed_at = excluded.last_accessed_at,\n access_count = excluded.access_count,\n deleted_at = excluded.deleted_at,\n embedding_blob = CASE WHEN excluded.embedding_blob IS NULL THEN embedding_blob ELSE excluded.embedding_blob END,\n embedding = NULL,\n embedding_failed_at = CASE WHEN excluded.embedding_blob IS NOT NULL THEN NULL ELSE embedding_failed_at END,\n embedding_failure_kind = CASE WHEN excluded.embedding_blob IS NOT NULL THEN NULL ELSE embedding_failure_kind END,\n embedding_attempts = CASE WHEN excluded.embedding_blob IS NOT NULL THEN 0 ELSE embedding_attempts END,\n okf_type = excluded.okf_type\n WHERE ${this.prefix}entries.entity_id = excluded.entity_id`,\n [\n fact.id,\n fact.entity_id,\n fact.title,\n fact.body,\n tagsJson,\n fact.confidence,\n fact.source_type,\n fact.source_hash,\n fact.source_ref,\n fact.created_at,\n now,\n fact.last_accessed_at === null ? null : fact.last_accessed_at,\n fact.access_count,\n fact.deleted_at ?? null,\n embeddingBlob ?? null,\n null,\n fact.okf_type ?? null,\n // OKF v0.2 metadata — bound for INSERT only; ON CONFLICT UPDATE\n // preserves the existing row values (these columns are intentionally\n // absent from the SET clause above).\n fact.lifecycle_status ?? 'stable',\n fact.stale_after ?? null,\n fact.generated_by ?? null,\n fact.last_verified_at ?? null,\n fact.last_verified_by ?? null,\n fact.okf_sources ? JSON.stringify(fact.okf_sources) : null,\n fact.okf_verified ? JSON.stringify(fact.okf_verified) : null,\n fact.okf_usage_window ? JSON.stringify(fact.okf_usage_window) : null,\n ],\n );\n\n // A suppressed conflict-update reports 0 (see the SQLiteAdapter contract).\n // A permitted write that an adapter under-reports as 0 also lands here, so\n // confirm ownership from the stored row rather than inferring it from the\n // count. A foreign owner rejects; a missing row means the adapter dropped\n // the write (impossible under real SQLite), so fail rather than publish an\n // outbox event for state that does not exist.\n if (result.changes === 0) {\n const stored = await tx.getFirstAsync<{ entity_id: string }>(\n `SELECT entity_id FROM ${this.prefix}entries WHERE id = ?`,\n [fact.id],\n );\n if (!stored) {\n throw new Error('Entry upsert reported no change and stored no row; the SQLiteAdapter did not perform the write');\n }\n if (stored.entity_id !== fact.entity_id) {\n throw new WikiGraphNodeOwnershipConflict();\n }\n }\n\n // Outbox payload mirrors what is actually persisted. On UPDATE, the SET\n // clause intentionally omits the OKF metadata columns so the prior row\n // values win — so `fact.X` here would describe state we did NOT write.\n // Re-read those columns from the stored row and overlay them onto the\n // caller-supplied payload before publishing (#90 review).\n const persistedOkf = existingRow\n ? {\n lifecycle_status: (existingRow.lifecycle_status ?? 'stable') as WikiFact['lifecycle_status'],\n stale_after: existingRow.stale_after != null ? Number(existingRow.stale_after) : null,\n generated_by: existingRow.generated_by ?? null,\n okf_sources: parseJsonArray<NonNullable<WikiFact['okf_sources']>[number]>(existingRow.okf_sources, []),\n okf_verified: parseJsonArray<NonNullable<WikiFact['okf_verified']>[number]>(existingRow.okf_verified, []),\n okf_usage_window: parseJsonObject<NonNullable<WikiFact['okf_usage_window']>>(existingRow.okf_usage_window),\n last_verified_at: existingRow.last_verified_at != null ? Number(existingRow.last_verified_at) : null,\n last_verified_by: existingRow.last_verified_by ?? null,\n }\n : null;\n await this.outbox.push({\n entityId: fact.entity_id,\n tableName: 'entries',\n recordId: fact.id,\n operation,\n payload: persistedOkf ? { ...fact, ...persistedOkf } : fact,\n }, tx);\n\n return result;\n }\n\n /**\n * Normalize an embedding blob value to Uint8Array or null.\n */\n private normalizeEmbeddingBlob(blob: unknown): Uint8Array | null {\n return normalizeEmbeddingBlobValue(blob);\n }\n\n /**\n * Fetch existing rows by IDs and return id/entity_id/updated_at for import collision resolution.\n */\n async findExistingMetadataByIds(\n ids: readonly string[],\n tx?: SQLiteAdapter,\n ): Promise<Array<{ id: string; entity_id: string; updated_at: number }>> {\n const executor = this.getExecutor(tx);\n const rows: Array<{ id: string; entity_id: string; updated_at: number }> = [];\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n const chunkRows = await executor.getAllAsync<any>(\n `SELECT id, entity_id, updated_at FROM ${this.prefix}entries WHERE id IN (${placeholders})`,\n chunk,\n );\n rows.push(...chunkRows.map((row) => ({ id: row.id, entity_id: row.entity_id, updated_at: Number(row.updated_at) })));\n }\n return rows;\n }\n\n async findIdById(id: string, entityId: string, tx?: SQLiteAdapter): Promise<string | null> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}entries WHERE id = ? AND entity_id = ?`,\n [id, entityId],\n );\n return row?.id ?? null;\n }\n\n async findIdsBySource(\n entityId: string,\n sourceRef: string | null,\n sourceHash: string | null,\n tx?: SQLiteAdapter,\n includeDeleted = false,\n ): Promise<string[]> {\n const executor = this.getExecutor(tx);\n let sql = `SELECT id FROM ${this.prefix}entries WHERE entity_id = ?`;\n const args: unknown[] = [entityId];\n if (sourceRef !== null) {\n sql += ` AND source_ref = ?`;\n args.push(sourceRef);\n }\n if (sourceHash !== null) {\n sql += ` AND source_hash = ?`;\n args.push(sourceHash);\n }\n if (!includeDeleted) {\n sql += ` AND deleted_at IS NULL`;\n }\n const rows = await executor.getAllAsync<{ id: string }>(sql, args);\n return rows.map((row) => row.id);\n }\n\n async upsertForImport(fact: WikiFact, tx: SQLiteAdapter): Promise<{ changes: number; lastInsertRowId: number }> {\n const executor = this.getExecutor(tx);\n const tagsJson = JSON.stringify(fact.tags);\n const embeddingBlob = this.normalizeEmbeddingBlob(fact.embedding_blob);\n\n // Import is replace semantics: a re-imported fact whose OKF metadata\n // cleared (stale_after removed, generated_by removed, etc.) MUST overwrite\n // the prior row's value. The previous CASE WHEN IS NULL guards preserved\n // the old database values instead, so an \"absent in dump\" never cleared.\n // Direct `= excluded.X` ensures the dump is authoritative.\n //\n // WARNING: unlike `upsert`, this SQL re-parents a conflicting row\n // (`entity_id = excluded.entity_id`, no owner predicate). It is safe only\n // because ImportExportService skips foreign-owned IDs before calling it.\n // Do not model a new write path on this method; use `upsert`.\n const result = await executor.runAsync(\n `INSERT INTO ${this.prefix}entries (\n id, entity_id, title, body, tags, confidence, source_type,\n source_hash, source_ref, created_at, updated_at, last_accessed_at, access_count,\n deleted_at, embedding_blob, embedding, okf_type,\n lifecycle_status, stale_after, generated_by, last_verified_at, last_verified_by,\n okf_sources, okf_verified, okf_usage_window\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n entity_id = excluded.entity_id,\n title = excluded.title,\n body = excluded.body,\n tags = excluded.tags,\n confidence = excluded.confidence,\n source_type = excluded.source_type,\n source_hash = excluded.source_hash,\n source_ref = excluded.source_ref,\n created_at = excluded.created_at,\n updated_at = excluded.updated_at,\n last_accessed_at = excluded.last_accessed_at,\n access_count = excluded.access_count,\n deleted_at = excluded.deleted_at,\n embedding_blob = excluded.embedding_blob,\n embedding = NULL,\n embedding_failed_at = CASE WHEN excluded.embedding_blob IS NOT NULL THEN NULL ELSE embedding_failed_at END,\n embedding_failure_kind = CASE WHEN excluded.embedding_blob IS NOT NULL THEN NULL ELSE embedding_failure_kind END,\n embedding_attempts = CASE WHEN excluded.embedding_blob IS NOT NULL THEN 0 ELSE embedding_attempts END,\n okf_type = excluded.okf_type,\n lifecycle_status = excluded.lifecycle_status,\n stale_after = excluded.stale_after,\n generated_by = excluded.generated_by,\n last_verified_at = excluded.last_verified_at,\n last_verified_by = excluded.last_verified_by,\n okf_sources = excluded.okf_sources,\n okf_verified = excluded.okf_verified,\n okf_usage_window = excluded.okf_usage_window`,\n [\n fact.id,\n fact.entity_id,\n fact.title,\n fact.body,\n tagsJson,\n fact.confidence,\n fact.source_type,\n fact.source_hash,\n fact.source_ref,\n fact.created_at,\n fact.updated_at,\n fact.last_accessed_at === null ? null : fact.last_accessed_at,\n fact.access_count,\n fact.deleted_at ?? null,\n embeddingBlob ?? null,\n null,\n fact.okf_type ?? null,\n // Same NOT NULL DEFAULT note as in upsert above.\n fact.lifecycle_status ?? 'stable',\n fact.stale_after ?? null,\n fact.generated_by ?? null,\n fact.last_verified_at ?? null,\n fact.last_verified_by ?? null,\n fact.okf_sources ? JSON.stringify(fact.okf_sources) : null,\n fact.okf_verified ? JSON.stringify(fact.okf_verified) : null,\n fact.okf_usage_window ? JSON.stringify(fact.okf_usage_window) : null,\n ],\n );\n\n return result;\n }\n\n /**\n * Soft-delete a single entry by ID scoped to entityId. Sets deleted_at + updated_at.\n * `tx` is REQUIRED to ensure atomic outbox staging.\n */\n async softDelete(entryId: string, entityId: string, tx: SQLiteAdapter): Promise<{ changes: number }> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const result = await executor.runAsync(\n `UPDATE ${this.prefix}entries SET deleted_at = ?, updated_at = ? WHERE id = ? AND entity_id = ? AND deleted_at IS NULL`,\n [now, now, entryId, entityId],\n );\n\n await this.outbox.push({\n entityId,\n tableName: 'entries',\n recordId: entryId,\n operation: 'DELETE',\n payload: { id: entryId, entity_id: entityId, deleted_at: now },\n }, tx);\n\n return result;\n }\n\n /**\n * Soft-delete entries by source_ref and/or source_hash within a transaction.\n * Stages a DELETE outbox entry for each row in the same transaction.\n * `tx` is REQUIRED.\n * Returns the number of rows deleted.\n */\n async softDeleteBySource(\n entityId: string,\n tx: SQLiteAdapter,\n sourceRef?: string | null,\n sourceHash?: string | null,\n ): Promise<number> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n\n let q = `UPDATE ${this.prefix}entries SET deleted_at = ?, updated_at = ? WHERE entity_id = ? AND deleted_at IS NULL`;\n const args: any[] = [now, now, entityId];\n if (sourceRef) {\n q += ` AND source_ref = ?`;\n args.push(sourceRef);\n }\n if (sourceHash) {\n q += ` AND source_hash = ?`;\n args.push(sourceHash);\n }\n\n // Build a separate SELECT query to get affected IDs before updating\n let selectQ = `SELECT id FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL`;\n const selectArgs: any[] = [entityId];\n if (sourceRef) {\n selectQ += ` AND source_ref = ?`;\n selectArgs.push(sourceRef);\n }\n if (sourceHash) {\n selectQ += ` AND source_hash = ?`;\n selectArgs.push(sourceHash);\n }\n\n const idsToDelete = await executor.getAllAsync<{ id: string }>(selectQ, selectArgs);\n\n const result = await executor.runAsync(q, args);\n\n for (const row of idsToDelete) {\n await this.outbox.push({\n entityId,\n tableName: 'entries',\n recordId: row.id,\n operation: 'DELETE',\n payload: { id: row.id, entity_id: entityId, deleted_at: now },\n }, tx);\n }\n\n return result.changes;\n }\n\n /**\n * Fetch IDs + entity_ids of soft-deleted rows older than cutoff for a given entity.\n * Used by runPrune().\n */\n async getPrunableMetadata(\n entityId: string,\n cutoff: number,\n tx?: SQLiteAdapter,\n ): Promise<Array<{ id: string; entity_id: string }>> {\n const executor = this.getExecutor(tx);\n return executor.getAllAsync<{ id: string; entity_id: string }>(\n `SELECT id, entity_id FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NOT NULL AND deleted_at <= ?`,\n [entityId, cutoff],\n );\n }\n\n /**\n * Fetch all non-deleted entries for an entity, ordered by updated_at DESC.\n * Used by _getFullBundle().\n */\n async findAllByEntityId(entityId: string, tx?: SQLiteAdapter): Promise<WikiFact[]> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC`,\n [entityId],\n );\n return rows.map(mapRowToFact);\n }\n\n /**\n * Fetch live, mutable entries for an entity — everything heal is allowed to\n * downgrade or delete — oldest first, capped at `limit`, skipping anything\n * stamped inside the recheck cooldown (heal_checked_at > recheckCutoff).\n *\n * Oldest-first rather than newest-first: with a cooldown in place, newest-first\n * would keep re-selecting recently-touched facts every pass while older ones\n * wait indefinitely to even enter a batch.\n */\n async findHealCandidatesByEntityId(\n entityId: string,\n limit: number,\n recheckCutoff: number,\n tx?: SQLiteAdapter,\n ): Promise<WikiFact[]> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL AND source_type != 'immutable_document'\n AND ${liveAtSql('current')}\n AND (heal_checked_at IS NULL OR heal_checked_at <= ?)\n ORDER BY updated_at ASC LIMIT ?`,\n [entityId, now, now, recheckCutoff, limit],\n );\n return rows.map(mapRowToFact);\n }\n\n /**\n * Resolve search hits to document anchors. The MiniSearch index holds every\n * fact, not only immutable_document rows, so the source-type restriction has\n * to be applied here, after retrieval.\n */\n async findAnchorRowsByIds(\n entityId: string,\n ids: readonly string[],\n tx?: SQLiteAdapter,\n opts?: { withBody?: boolean },\n ): Promise<Array<{ id: string; title: string; source_ref: string | null; body?: string; lifecycle_status?: string }>> {\n if (ids.length === 0) return [];\n const executor = this.getExecutor(tx);\n // Bodies and status are read only for heal grounding (spec §6.3, rev 7);\n // the default projection is unchanged.\n const columns = opts?.withBody ? 'id, title, source_ref, body, lifecycle_status' : 'id, title, source_ref';\n const rows: Array<{ id: string; title: string; source_ref: string | null; body?: string; lifecycle_status?: string }> = [];\n // Chunked like every other multi-id read here. The current caller stays well\n // under SQLITE_MAX_VARIABLE_NUMBER, but that is a property of the caller,\n // not of this method.\n const now = Date.now();\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(', ');\n const chunkRows = await executor.getAllAsync<{ id: string; title: string; source_ref: string | null; body?: string; lifecycle_status?: string }>(\n `SELECT ${columns} FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL\n AND source_type = 'immutable_document'\n AND ${liveAtSql('current')}\n AND id IN (${placeholders})`,\n [entityId, now, now, ...chunk],\n );\n rows.push(...chunkRows);\n }\n return rows;\n }\n\n /**\n * Fetch recent non-deleted entries for an entity (limited), ordered by updated_at DESC.\n * Used by MaintenanceService.doRunLibrarian().\n *\n * When `excludeSourceRef` is supplied, the WHERE clause filters out that\n * sourceRef BEFORE applying LIMIT. The caller in IngestionService is\n * `findRecentByEntityId(entityId, 500, tx)` — it discards same-sourceRef\n * rows after the read to build a cross-sourceRef title index. If those\n * rows are filtered out in SQL, the limit applies to usable rows only\n * and a re-ingest where the caller's sourceRef owns most recent facts\n * still leaves cross-sourceRef entries in the index.\n */\n async findRecentByEntityId(\n entityId: string,\n limit: number,\n tx?: SQLiteAdapter,\n excludeSourceRef?: string,\n ): Promise<WikiFact[]> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n // `IS NULL OR !=` keeps NULL-source_ref rows (e.g. librarian_inferred facts)\n // in the cross-sourceRef title index. The intent of `excludeSourceRef` is\n // \"drop THIS sourceRef's rows\"; NULL rows belong to neither the current\n // sourceRef nor the replacement set, and excluding them causes edges\n // targeting legacy/non-document facts to fail to resolve.\n const excludeClause = excludeSourceRef ? ` AND (source_ref IS NULL OR source_ref != ?)` : '';\n const args: unknown[] = excludeSourceRef ? [entityId, now, now, excludeSourceRef, limit] : [entityId, now, now, limit];\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL AND ${liveAtSql('current')}${excludeClause} ORDER BY updated_at DESC LIMIT ?`,\n args,\n );\n return rows.map(mapRowToFact);\n }\n\n /**\n * Fetch all non-deleted entries for an entity with embedding blobs preserved.\n * Used by ImportExportService for export/import round-tripping.\n */\n async findAllByEntityIdWithBlobs(entityId: string, tx?: SQLiteAdapter): Promise<WikiFact[]> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC`,\n [entityId],\n );\n return rows.map(mapRowToFactWithBlobs);\n }\n\n /**\n * Count non-deleted entries for the given entities whose embedding_blob dimension\n * doesn't match queryVecLength. Used by read() to detect model-switch mismatches.\n */\n async countDimensionMismatched(\n entityIds: readonly string[],\n queryVecLength: number,\n tx?: SQLiteAdapter,\n ): Promise<number> {\n if (entityIds.length === 0) return 0;\n const executor = this.getExecutor(tx);\n const placeholders = entityIds.map(() => '?').join(',');\n const row = await executor.getFirstAsync<{ cnt: number }>(\n `SELECT COUNT(*) AS cnt FROM ${this.prefix}entries\n WHERE entity_id IN (${placeholders}) AND deleted_at IS NULL\n AND embedding_blob IS NOT NULL\n AND (CAST(length(embedding_blob) AS INTEGER) % 4 = 0)\n AND (CAST(length(embedding_blob) AS INTEGER) / 4) != ?`,\n [...entityIds, queryVecLength],\n );\n return row?.cnt ?? 0;\n }\n\n /**\n * Count non-deleted entries for entityId that are stale relative to targetDim\n * (either no blob or wrong dimension). Used by runReembed() per-entity skip logic.\n */\n async countStaleForEntity(entityId: string, targetDim: number, tx?: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ cnt: number }>(\n `SELECT COUNT(*) AS cnt FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL\n AND (\n embedding_blob IS NULL\n OR (CAST(length(embedding_blob) AS INTEGER) / 4) != ?\n )`,\n [entityId, targetDim],\n );\n return row?.cnt ?? 0;\n }\n\n /**\n * Count non-deleted entries with stale or unconverted embeddings relative to `dim`.\n * Used by _reconcileEmbeddingDimension() to decide when to promote the pending\n * embedding_dimension value.\n */\n async countStaleEmbeddings(dim: number, tx?: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ cnt: number }>(\n `SELECT COUNT(*) AS cnt FROM ${this.prefix}entries\n WHERE deleted_at IS NULL\n AND (\n (embedding_blob IS NOT NULL AND (CAST(length(embedding_blob) AS INTEGER) / 4) != ?)\n OR (embedding_blob IS NULL AND embedding IS NOT NULL)\n )`,\n [dim],\n );\n return row?.cnt ?? 0;\n }\n\n /**\n * Bulk delete pruned entries (already soft-deleted) by IDs.\n * Used by runPrune(). Returns total number of deleted rows.\n * `tx` is REQUIRED so outbox deletion events are staged atomically.\n */\n async bulkDeletePruned(\n entityId: string,\n cutoff: number,\n ids: string[],\n tx: SQLiteAdapter,\n ): Promise<number> {\n const executor = this.getExecutor(tx);\n let totalChanges = 0;\n const chunkSize = 500;\n for (let i = 0; i < ids.length; i += chunkSize) {\n const chunk = ids.slice(i, i + chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n const result = await executor.runAsync(\n `DELETE FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NOT NULL AND deleted_at <= ? AND id IN (${placeholders})`,\n [entityId, cutoff, ...chunk],\n );\n totalChanges += result.changes;\n // Stage outbox entries for permanently deleted records\n if (result.changes > 0) {\n for (const id of chunk) {\n await this.outbox.push({\n entityId,\n tableName: 'entries',\n recordId: id,\n operation: 'DELETE',\n payload: { id, entity_id: entityId, deleted_at: cutoff },\n }, tx);\n }\n }\n }\n // Spec #280 Change 3: an engine hard-delete never strands the FTS rebuild fingerprint.\n if (totalChanges > 0) await reanchorRebuildFingerprint(executor, this.prefix, ids);\n return totalChanges;\n }\n\n /**\n * Mark orphaned entries (never accessed, old) as deleted.\n * Used by MaintenanceService.doRunHeal().\n */\n async markOrphaned(\n entityId: string,\n orphanThreshold: number,\n tx: SQLiteAdapter,\n ): Promise<string[]> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const updatedRows = await executor.getAllAsync<{ id: string }>(\n `UPDATE ${this.prefix}entries\n SET deleted_at = ?, updated_at = ?\n WHERE entity_id = ? AND access_count = 0 AND created_at <= ? AND source_type != 'immutable_document' AND deleted_at IS NULL\n RETURNING id`,\n [now, now, entityId, orphanThreshold],\n );\n for (const row of updatedRows) {\n await this.outbox.push({\n entityId,\n tableName: 'entries',\n recordId: row.id,\n operation: 'DELETE',\n payload: { id: row.id, entity_id: entityId, deleted_at: now },\n }, tx);\n }\n return updatedRows.map(r => r.id);\n }\n\n /**\n * Downgrade stale inferred entries to 'tentative'.\n * Used by MaintenanceService.doRunHeal().\n *\n * Returns the ids it downgraded so the caller can fold them into\n * {@link HealResult.downgraded} without double-counting a fact the model also\n * downgraded in the same pass.\n */\n async downgradeStaleInferred(\n entityId: string,\n staleThreshold: number,\n tx: SQLiteAdapter,\n ): Promise<string[]> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const eligibleRows = await executor.getAllAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}entries\n WHERE entity_id = ? AND confidence = 'inferred'\n AND (last_accessed_at <= ? OR (last_accessed_at IS NULL AND created_at <= ?))\n AND source_type != 'immutable_document' AND deleted_at IS NULL`,\n [entityId, staleThreshold, staleThreshold],\n );\n if (eligibleRows.length === 0) return [];\n await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET confidence = 'tentative', updated_at = ?\n WHERE entity_id = ? AND confidence = 'inferred' AND (last_accessed_at <= ? OR (last_accessed_at IS NULL AND created_at <= ?)) AND source_type != 'immutable_document' AND deleted_at IS NULL`,\n [now, entityId, staleThreshold, staleThreshold],\n );\n for (const row of eligibleRows) {\n await this.outbox.push({\n entityId,\n tableName: 'entries',\n recordId: row.id,\n operation: 'UPDATE',\n payload: { id: row.id, entity_id: entityId, confidence: 'tentative', updated_at: now },\n }, tx);\n }\n return eligibleRows.map(r => r.id);\n }\n\n /**\n * Downgrade specific entries to 'tentative' by IDs.\n * Used by MaintenanceService.doRunHeal().\n */\n async downgradeByIds(\n ids: string[],\n entityId: string,\n tx: SQLiteAdapter,\n ): Promise<void> {\n if (ids.length === 0) return;\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const placeholders = ids.map(() => '?').join(',');\n await executor.runAsync(\n `UPDATE ${this.prefix}entries SET confidence = 'tentative', updated_at = ? WHERE id IN (${placeholders}) AND entity_id = ?`,\n [now, ...ids, entityId],\n );\n // Stage outbox entries for downgraded records\n for (const id of ids) {\n await this.outbox.push({\n entityId,\n tableName: 'entries',\n recordId: id,\n operation: 'UPDATE',\n payload: { id, entity_id: entityId, confidence: 'tentative', updated_at: now },\n }, tx);\n }\n }\n\n /**\n * Soft-delete specific entries by IDs.\n * Used by MaintenanceService.doRunHeal().\n */\n async softDeleteByIds(\n ids: string[],\n entityId: string,\n tx: SQLiteAdapter,\n ): Promise<void> {\n if (ids.length === 0) return;\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const placeholders = ids.map(() => '?').join(',');\n await executor.runAsync(\n `UPDATE ${this.prefix}entries SET deleted_at = ?, updated_at = ? WHERE id IN (${placeholders}) AND entity_id = ?`,\n [now, now, ...ids, entityId],\n );\n // Stage outbox entries for soft-deleted records\n for (const id of ids) {\n await this.outbox.push({\n entityId,\n tableName: 'entries',\n recordId: id,\n operation: 'DELETE',\n payload: { id, entity_id: entityId, deleted_at: now },\n }, tx);\n }\n }\n\n /** Spec §4: write any subset of the four temporal columns. Absent key = untouched; null = clear. */\n async setTemporal(\n id: string,\n entityId: string,\n fields: TemporalFields,\n tx: SQLiteAdapter,\n opts?: { outbox?: boolean },\n ): Promise<number> {\n const keys = (['valid_from', 'valid_to', 'superseded_by', 'superseded_at'] as const).filter((k) => k in fields);\n if (keys.length === 0) return 0;\n const executor = this.getExecutor(tx);\n const result = await executor.runAsync(\n `UPDATE ${this.prefix}entries SET ${keys.map((k) => `${k} = ?`).join(', ')} WHERE id = ? AND entity_id = ?`,\n [...keys.map((k) => fields[k] ?? null), id, entityId],\n );\n if (result.changes > 0 && opts?.outbox !== false) {\n const payload: Record<string, unknown> = { id, entity_id: entityId };\n for (const k of keys) payload[k] = fields[k] ?? null;\n await this.outbox.push({ entityId, tableName: 'entries', recordId: id, operation: 'UPDATE', payload }, tx);\n }\n return result.changes;\n }\n\n async findTemporalRow(id: string, tx?: SQLiteAdapter): Promise<TemporalRow | null> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<any>(\n `SELECT id, entity_id, source_type, deleted_at, created_at, valid_from, valid_to, superseded_by\n FROM ${this.prefix}entries WHERE id = ?`,\n [id],\n );\n if (!row) return null;\n return {\n id: String(row.id),\n entity_id: String(row.entity_id),\n source_type: row.source_type,\n deleted_at: row.deleted_at != null ? Number(row.deleted_at) : null,\n created_at: Number(row.created_at),\n valid_from: row.valid_from != null ? Number(row.valid_from) : null,\n valid_to: row.valid_to != null ? Number(row.valid_to) : null,\n superseded_by: row.superseded_by != null ? String(row.superseded_by) : null,\n };\n }\n\n /**\n * Ids of non-deleted facts NOT live at `t` (spec §4.2). In 'current' mode a\n * row with both validity columns NULL is always live, so the query is\n * restricted to rows that carry a validity column — served by the partial\n * entries_temporal_idx.\n */\n async findNonLiveIdsByEntityIds(\n entityIds: readonly string[],\n mode: LiveMode,\n t: number,\n tx?: SQLiteAdapter,\n ): Promise<Set<string>> {\n if (entityIds.length === 0) return new Set();\n const executor = this.getExecutor(tx);\n const placeholders = entityIds.map(() => '?').join(',');\n const temporalOnly = mode === 'current' ? ' AND (valid_from IS NOT NULL OR valid_to IS NOT NULL)' : '';\n const rows = await executor.getAllAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}entries\n WHERE entity_id IN (${placeholders}) AND deleted_at IS NULL${temporalOnly}\n AND NOT ${liveAtSql(mode)}`,\n [...entityIds, t, t],\n );\n return new Set(rows.map((r) => r.id));\n }\n\n async findSupersessionChainIds(\n entityId: string,\n factId: string,\n maxDepth: number,\n tx?: SQLiteAdapter,\n ): Promise<{ predecessors: string[]; successors: string[] }> {\n const executor = this.getExecutor(tx);\n const successors = await executor.getAllAsync<{ id: string }>(\n `WITH RECURSIVE fwd(id, depth) AS (\n SELECT superseded_by, 1 FROM ${this.prefix}entries WHERE id = ? AND entity_id = ? AND superseded_by IS NOT NULL\n UNION\n SELECT e.superseded_by, fwd.depth + 1 FROM fwd\n JOIN ${this.prefix}entries e ON e.id = fwd.id AND e.entity_id = ?\n WHERE e.superseded_by IS NOT NULL AND fwd.depth < ?\n )\n SELECT id FROM fwd ORDER BY depth ASC`,\n [factId, entityId, entityId, maxDepth],\n );\n const predecessors = await executor.getAllAsync<{ id: string }>(\n `WITH RECURSIVE bwd(id, depth) AS (\n SELECT id, 1 FROM ${this.prefix}entries WHERE entity_id = ? AND superseded_by = ?\n UNION\n SELECT e.id, bwd.depth + 1 FROM bwd\n JOIN ${this.prefix}entries e ON e.entity_id = ? AND e.superseded_by = bwd.id\n WHERE bwd.depth < ?\n )\n SELECT id FROM bwd ORDER BY depth DESC`,\n [entityId, factId, entityId, maxDepth],\n );\n const drop = (ids: Array<{ id: string }>) => ids.map((r) => r.id).filter((id) => id !== factId);\n return { predecessors: drop(predecessors), successors: drop(successors) };\n }\n\n async findExpiredIds(entityId: string, cutoff: number, tx?: SQLiteAdapter): Promise<string[]> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL AND valid_to IS NOT NULL AND valid_to <= ?\n ORDER BY valid_to ASC`,\n [entityId, cutoff],\n );\n return rows.map((r) => r.id);\n }\n\n /**\n * Bulk soft-delete all entries for an entity.\n * Stages DELETE outbox entries for each row in the same transaction.\n * `tx` is REQUIRED.\n */\n async bulkSoftDeleteByEntityId(entityId: string, tx: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n // Get IDs before updating for outbox staging\n const idsToDelete = await executor.getAllAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL`,\n [entityId],\n );\n const result = await executor.runAsync(\n `UPDATE ${this.prefix}entries SET deleted_at = ?, updated_at = ? WHERE entity_id = ? AND deleted_at IS NULL`,\n [now, now, entityId],\n );\n // Stage outbox entries for each deleted record\n for (const row of idsToDelete) {\n await this.outbox.push({\n entityId,\n tableName: 'entries',\n recordId: row.id,\n operation: 'DELETE',\n payload: { id: row.id, entity_id: entityId, deleted_at: now },\n }, tx);\n }\n return result.changes;\n }\n\n async findMiniSearchRows(\n entityId?: string,\n tx?: SQLiteAdapter,\n ): Promise<Array<{ id: string; entity_id: string; title: string; body: string; tags: string }>> {\n const executor = this.getExecutor(tx);\n if (entityId !== undefined) {\n return executor.getAllAsync(\n `SELECT ${EntryRepository.MINI_SEARCH_COLUMNS} FROM ${this.prefix}entries ${EntryRepository.MINI_SEARCH_LIVE_WHERE} AND entity_id = ?`,\n [entityId],\n );\n }\n return executor.getAllAsync(\n `SELECT ${EntryRepository.MINI_SEARCH_COLUMNS} FROM ${this.prefix}entries ${EntryRepository.MINI_SEARCH_LIVE_WHERE}`,\n );\n }\n\n /**\n * Keyword-index rows for specific ids — the incremental counterpart of\n * {@link findMiniSearchRows}, with identical columns. Soft-deleted rows and\n * rows of other entities are omitted, so a caller can pass every id a write\n * touched and get back exactly what should be indexed. Spec 2026-09-28 §4.4.\n */\n async findMiniSearchRowsByIds(\n entityId: string,\n ids: readonly string[],\n tx?: SQLiteAdapter,\n ): Promise<Array<{ id: string; entity_id: string; title: string; body: string; tags: string }>> {\n if (ids.length === 0) return [];\n const executor = this.getExecutor(tx);\n const rows: Array<{ id: string; entity_id: string; title: string; body: string; tags: string }> = [];\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n rows.push(...(await executor.getAllAsync<{ id: string; entity_id: string; title: string; body: string; tags: string }>(\n `SELECT ${EntryRepository.MINI_SEARCH_COLUMNS} FROM ${this.prefix}entries ${EntryRepository.MINI_SEARCH_LIVE_WHERE} AND entity_id = ? AND id IN (${placeholders})`,\n [entityId, ...chunk],\n )));\n }\n return rows;\n }\n\n async updateEmbeddingBlob(id: string, blob: Uint8Array, tx?: SQLiteAdapter): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET embedding_blob = ?,\n embedding = NULL,\n embedding_failed_at = NULL,\n embedding_failure_kind = NULL,\n embedding_attempts = 0\n WHERE id = ?`,\n [blob, id],\n );\n }\n\n /**\n * Record a failed embedding attempt. Deliberately does NOT touch updated_at\n * (import merge is last-write-wins on it) and pushes no outbox event —\n * embedding lifecycle is local state, not replicated. Same discipline as\n * updateEmbeddingBlob. See spec §3.5.\n *\n * Only marker-eligible kinds (spec §3.3) are accepted: `no_provider` never\n * marks and `storage_error` never marks, so retry/permanent-failure policy\n * built on these rows only ever sees real embed failures.\n */\n async markEmbeddingFailure(\n id: string,\n kind: EmbeddingMarkerKind,\n now: number,\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET embedding_failed_at = ?,\n embedding_failure_kind = ?,\n embedding_attempts = embedding_attempts + 1\n WHERE id = ?`,\n [now, kind, id],\n );\n }\n\n /**\n * Clear marker state for every marked row. Called when the embedding\n * dimension is promoted: a new model produces different vectors, so past\n * failures — including `float32_overflow`, which is otherwise terminal —\n * no longer predict future ones (spec §2.3).\n *\n * Same discipline as markEmbeddingFailure: no `updated_at` touch and no\n * outbox event, because embedding lifecycle is local state, not replicated.\n * Returns the number of rows cleared.\n */\n async clearEmbeddingFailureMarkers(tx?: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const result = await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET embedding_failed_at = NULL,\n embedding_failure_kind = NULL,\n embedding_attempts = 0\n WHERE embedding_failed_at IS NOT NULL`,\n );\n return result.changes;\n }\n\n async hasLegacySourceTypes(tx?: SQLiteAdapter): Promise<boolean> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ one: number }>(\n `SELECT 1 AS one FROM ${this.prefix}entries WHERE source_type IN ('user_document', 'agent_inferred') LIMIT 1`,\n [],\n );\n return row != null;\n }\n\n async countLegacySourceTypes(tx?: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ count: number }>(\n `SELECT COUNT(*) as count FROM ${this.prefix}entries WHERE source_type IN ('user_document', 'agent_inferred')`,\n [],\n );\n return row?.count ?? 0;\n }\n\n async findAllForReembed(entityId?: string, tx?: SQLiteAdapter): Promise<ReembedCandidateRow[]> {\n const executor = this.getExecutor(tx);\n if (entityId !== undefined) {\n return executor.getAllAsync(\n `SELECT * FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL`,\n [entityId],\n );\n }\n return executor.getAllAsync(\n `SELECT * FROM ${this.prefix}entries WHERE deleted_at IS NULL`,\n );\n }\n\n async findLatestSourceHash(entityId: string, sourceRef: string, tx?: SQLiteAdapter): Promise<string | null> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ source_hash: string | null }>(\n `SELECT source_hash FROM ${this.prefix}entries\n WHERE entity_id = ? AND source_ref = ? AND deleted_at IS NULL\n ORDER BY updated_at DESC, id ASC\n LIMIT 1`,\n [entityId, sourceRef],\n );\n return row?.source_hash ?? null;\n }\n\n /**\n * Batch version of {@link findLatestSourceHash}. Returns a Map covering every\n * requested ref, where the value is the source_hash from the row with the\n * most-recently-updated live fact for that ref, or null when no live row exists.\n *\n * The SQL uses ROW_NUMBER() OVER (PARTITION BY source_ref ORDER BY updated_at\n * DESC, id ASC) — NOT MAX(source_hash). Aggregation with MAX(source_hash) is\n * wrong because MAX computes independently across grouped rows; the hash must\n * come from the exact row that wins MAX(updated_at). The `id ASC` tie-break\n * keeps selection deterministic when two live rows share `updated_at`.\n *\n * Source refs are de-duplicated and processed in chunks so the per-query bind\n * parameter count stays under SQLite's `SQLITE_MAX_VARIABLE_NUMBER` (default\n * 999, leaving one slot for `entity_id`).\n *\n * Empty input is a synchronous early return with zero SQL calls.\n */\n async findLatestSourceHashes(\n entityId: string,\n sourceRefs: readonly string[],\n tx?: SQLiteAdapter,\n ): Promise<Map<string, string | null>> {\n const out = new Map<string, string | null>();\n if (sourceRefs.length === 0) return out;\n // Pre-populate with null for every requested ref so callers can distinguish\n // \"no live row\" (null) from \"row with a null source_hash\" (also null in this\n // shape, but at least the key is guaranteed present).\n const dedupedRefs = Array.from(new Set(sourceRefs));\n for (const ref of dedupedRefs) {\n out.set(ref, null);\n }\n const executor = this.getExecutor(tx);\n // 1 bind parameter for entity_id; remaining slots for source_ref placeholders.\n const chunkLimit = Math.max(1, this.chunkSize - 1);\n for (let i = 0; i < dedupedRefs.length; i += chunkLimit) {\n const chunk = dedupedRefs.slice(i, i + chunkLimit);\n const placeholders = chunk.map(() => '?').join(',');\n const rows = await executor.getAllAsync<{ source_ref: string; source_hash: string | null }>(\n `WITH ranked AS (\n SELECT source_ref, source_hash,\n ROW_NUMBER() OVER (\n PARTITION BY source_ref\n ORDER BY updated_at DESC, id ASC\n ) as rn\n FROM ${this.prefix}entries\n WHERE entity_id = ? AND source_ref IN (${placeholders}) AND deleted_at IS NULL\n )\n SELECT source_ref, source_hash\n FROM ranked\n WHERE rn = 1`,\n [entityId, ...chunk],\n );\n for (const r of rows) {\n out.set(r.source_ref, r.source_hash);\n }\n }\n return out;\n }\n\n /**\n * Per source ref, the hash of the latest live row (same ordering as\n * {@link findLatestSourceHashes}) and whether ANY live row carries a hash.\n * Refs with no live row are absent. Chunked under the bind-variable limit.\n */\n async findSourceStates(\n entityId: string,\n sourceRefs: readonly string[],\n tx?: SQLiteAdapter,\n ): Promise<Map<string, { latestHash: string | null; anyHashed: boolean }>> {\n const out = new Map<string, { latestHash: string | null; anyHashed: boolean }>();\n const deduped = Array.from(new Set(sourceRefs));\n if (deduped.length === 0) return out;\n const executor = this.getExecutor(tx);\n const chunkLimit = Math.max(1, this.chunkSize - 1);\n for (let i = 0; i < deduped.length; i += chunkLimit) {\n const chunk = deduped.slice(i, i + chunkLimit);\n const placeholders = chunk.map(() => '?').join(',');\n const rows = await executor.getAllAsync<{ source_ref: string; source_hash: string | null; any_hashed: number }>(\n `WITH ranked AS (\n SELECT source_ref, source_hash,\n ROW_NUMBER() OVER (PARTITION BY source_ref ORDER BY updated_at DESC, id ASC) AS rn,\n MAX(CASE WHEN source_hash IS NOT NULL THEN 1 ELSE 0 END) OVER (PARTITION BY source_ref) AS any_hashed\n FROM ${this.prefix}entries\n WHERE entity_id = ? AND source_ref IN (${placeholders}) AND deleted_at IS NULL\n )\n SELECT source_ref, source_hash, any_hashed FROM ranked WHERE rn = 1`,\n [entityId, ...chunk],\n );\n for (const r of rows) out.set(r.source_ref, { latestHash: r.source_hash, anyHashed: Number(r.any_hashed) === 1 });\n }\n return out;\n }\n\n /**\n * Return the live source_refs for an entity that hold the given source_hash.\n * Used by the ingestDocument duplicate-hash guard and by hosts auditing\n * duplicate-content collisions. Sorted `COLLATE BINARY` so the canonical\n * ref (the code-unit-minimum of the set) is stable across deploys.\n */\n async findSourceRefsByHash(\n entityId: string,\n sourceHash: string,\n tx?: SQLiteAdapter,\n ): Promise<string[]> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<{ source_ref: string }>(\n `SELECT source_ref FROM ${this.prefix}entries\n WHERE entity_id = ? AND source_hash = ? AND deleted_at IS NULL\n AND source_ref IS NOT NULL\n GROUP BY source_ref\n ORDER BY source_ref COLLATE BINARY`,\n [entityId, sourceHash],\n );\n return rows.map(r => r.source_ref);\n }\n\n /**\n * Per-sourceRef rollup for an entity: one row per live source_ref, with the\n * most-recently-updated live hash (NOT the lexically-max hash) and a live\n * fact count.\n *\n * The hash comes from the same row that wins ROW_NUMBER() over updated_at\n * DESC, so a ref with multiple live hashes (e.g. from import) reports the\n * latest one — matching single-doc `findLatestSourceHash` semantics.\n *\n * Sort is COLLATE BINARY: locale-dependent ordering re-mints identity on\n * every deploy, which is the bug this whole section exists to prevent.\n */\n async listSourceRefs(\n entityId: string,\n tx?: SQLiteAdapter,\n ): Promise<Array<{\n sourceRef: string;\n sourceHash: string | null;\n factCount: number;\n lastIngestedAt: number;\n }>> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<{\n source_ref: string;\n source_hash: string | null;\n fact_count: number;\n last_ingested_at: number;\n }>(\n `WITH ranked AS (\n SELECT source_ref, source_hash, updated_at,\n ROW_NUMBER() OVER (\n PARTITION BY source_ref\n ORDER BY updated_at DESC, id ASC\n ) AS rn,\n COUNT(*) OVER (PARTITION BY source_ref) AS fact_count\n FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL AND source_ref IS NOT NULL\n )\n SELECT source_ref,\n source_hash AS source_hash,\n fact_count AS fact_count,\n updated_at AS last_ingested_at\n FROM ranked\n WHERE rn = 1\n ORDER BY source_ref COLLATE BINARY`,\n [entityId],\n );\n return rows.map(r => ({\n sourceRef: r.source_ref,\n sourceHash: r.source_hash,\n factCount: Number(r.fact_count),\n lastIngestedAt: Number(r.last_ingested_at),\n }));\n }\n\n /**\n * Count live entries for an entity across all source_refs/source_hashes.\n * Used by forget({ dryRun, clearAll: true }).\n */\n async countLiveByEntityId(entityId: string, tx?: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ cnt: number }>(\n `SELECT COUNT(*) AS cnt FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL`,\n [entityId],\n );\n return row?.cnt ?? 0;\n }\n\n /**\n * Count live entries matching a source filter (either or both may be null).\n * Used by forget({ dryRun: true }) with sourceRef/sourceHash.\n */\n async countLiveBySource(\n entityId: string,\n sourceRef: string | null,\n sourceHash: string | null,\n tx?: SQLiteAdapter,\n ): Promise<number> {\n const executor = this.getExecutor(tx);\n let q = `SELECT COUNT(*) AS cnt FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL`;\n const args: unknown[] = [entityId];\n if (sourceRef !== null) { q += ` AND source_ref = ?`; args.push(sourceRef); }\n if (sourceHash !== null) { q += ` AND source_hash = ?`; args.push(sourceHash); }\n const row = await executor.getFirstAsync<{ cnt: number }>(q, args);\n return row?.cnt ?? 0;\n }\n\n async findMetadataByIds(ids: readonly string[], tx?: SQLiteAdapter): Promise<EntryRowMetadata[]> {\n if (ids.length === 0) return [];\n const executor = this.getExecutor(tx);\n const rows: EntryRowMetadata[] = [];\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n const chunkRows = await executor.getAllAsync<EntryRowMetadata>(\n `SELECT id, entity_id, updated_at, access_count FROM ${this.prefix}entries WHERE id IN (${placeholders}) AND deleted_at IS NULL`,\n chunk,\n );\n rows.push(...chunkRows);\n }\n return rows;\n }\n\n async findWithEmbeddingsByIds(ids: readonly string[], tx?: SQLiteAdapter): Promise<EntryRowWithEmbeddings[]> {\n if (ids.length === 0) return [];\n const executor = this.getExecutor(tx);\n const rows: EntryRowWithEmbeddings[] = [];\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n const chunkRows = await executor.getAllAsync<EntryRowWithEmbeddings>(\n `SELECT id, entity_id, embedding_blob, embedding, updated_at, access_count FROM ${this.prefix}entries WHERE id IN (${placeholders}) AND deleted_at IS NULL`,\n chunk,\n );\n rows.push(...chunkRows);\n }\n return rows;\n }\n\n async findMetadataByEntityIds(entityIds: readonly string[], tx?: SQLiteAdapter): Promise<EntryRowMetadata[]> {\n if (entityIds.length === 0) return [];\n const executor = this.getExecutor(tx);\n const placeholders = entityIds.map(() => '?').join(',');\n return executor.getAllAsync<EntryRowMetadata>(\n `SELECT id, entity_id, updated_at, access_count FROM ${this.prefix}entries WHERE entity_id IN (${placeholders}) AND deleted_at IS NULL`,\n [...entityIds],\n );\n }\n\n async findWithEmbeddingsByEntityIds(entityIds: readonly string[], tx?: SQLiteAdapter): Promise<EntryRowWithEmbeddings[]> {\n if (entityIds.length === 0) return [];\n const executor = this.getExecutor(tx);\n const placeholders = entityIds.map(() => '?').join(',');\n return executor.getAllAsync<EntryRowWithEmbeddings>(\n `SELECT id, entity_id, embedding_blob, embedding, updated_at, access_count FROM ${this.prefix}entries WHERE entity_id IN (${placeholders}) AND deleted_at IS NULL`,\n [...entityIds],\n );\n }\n\n async findEmbeddingsByIds(\n ids: readonly string[],\n tx?: SQLiteAdapter,\n ): Promise<Array<{ id: string; embedding_blob: Uint8Array | null; embedding: string | null }>> {\n if (ids.length === 0) return [];\n const executor = this.getExecutor(tx);\n const rows: Array<{ id: string; embedding_blob: Uint8Array | null; embedding: string | null }> = [];\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n const chunkRows = await executor.getAllAsync<{ id: string; embedding_blob: Uint8Array | null; embedding: string | null }>(\n `SELECT id, embedding_blob, embedding FROM ${this.prefix}entries WHERE id IN (${placeholders}) AND deleted_at IS NULL`,\n chunk,\n );\n rows.push(...chunkRows);\n }\n return rows;\n }\n\n async trackAccess(ids: readonly string[], now: number, tx?: SQLiteAdapter): Promise<void> {\n if (ids.length === 0) return;\n const executor = this.getExecutor(tx);\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n await executor.runAsync(\n `UPDATE ${this.prefix}entries SET access_count = access_count + 1, last_accessed_at = ? WHERE id IN (${placeholders})`,\n [now, ...chunk],\n );\n }\n }\n\n getLegacyMigrationSQL(): string {\n return [\n `-- Migrate legacy source_type values (targets your WikiMemory prefix: ${this.prefix})`,\n `UPDATE ${this.prefix}entries SET source_type = 'immutable_document' WHERE source_type = 'user_document';`,\n `UPDATE ${this.prefix}entries SET source_type = 'librarian_inferred' WHERE source_type = 'agent_inferred';`,\n ].join('\\n');\n }\n\n async findRecentByEntityIds(\n entityIds: readonly string[],\n limit: number,\n tx?: SQLiteAdapter,\n opts?: { excludeDrafts?: boolean; live?: { mode: LiveMode; t: number } },\n ): Promise<WikiFact[]> {\n if (entityIds.length === 0) return [];\n const executor = this.getExecutor(tx);\n const placeholders = entityIds.map(() => '?').join(',');\n const draftClause = opts?.excludeDrafts === true ? ` AND lifecycle_status != 'draft'` : '';\n const liveClause = opts?.live ? ` AND ${liveAtSql(opts.live.mode)}` : '';\n const liveArgs = opts?.live ? [opts.live.t, opts.live.t] : [];\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}entries WHERE entity_id IN (${placeholders}) AND deleted_at IS NULL${draftClause}${liveClause} ORDER BY updated_at DESC LIMIT ?`,\n [...entityIds, ...liveArgs, limit],\n );\n return rows.map(mapRowToFact);\n }\n\n /** IDs of live draft facts for the given entities (spec §5.1). Callers pass ≤ 100 entity ids. */\n async findDraftIdsByEntityIds(entityIds: readonly string[], tx?: SQLiteAdapter): Promise<Set<string>> {\n if (entityIds.length === 0) return new Set();\n const executor = this.getExecutor(tx);\n const placeholders = entityIds.map(() => '?').join(',');\n const rows = await executor.getAllAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}entries\n WHERE entity_id IN (${placeholders}) AND deleted_at IS NULL AND lifecycle_status = 'draft'`,\n [...entityIds],\n );\n return new Set(rows.map((r) => r.id));\n }\n\n /** Live drafts for one entity, newest first, keyset-paged by (created_at, id). */\n async listDraftsByEntityId(\n entityId: string,\n limit: number,\n after: { createdAt: number; id: string } | null,\n tx?: SQLiteAdapter,\n ): Promise<WikiFact[]> {\n const executor = this.getExecutor(tx);\n const afterClause = after ? ` AND (created_at < ? OR (created_at = ? AND id < ?))` : '';\n const args: unknown[] = after\n ? [entityId, after.createdAt, after.createdAt, after.id, limit]\n : [entityId, limit];\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL AND lifecycle_status = 'draft'${afterClause}\n ORDER BY created_at DESC, id DESC LIMIT ?`,\n args,\n );\n return rows.map(mapRowToFact);\n }\n\n /** True iff `entryId` is a live draft owned by `entityId`. */\n async isLiveDraft(entryId: string, entityId: string, tx?: SQLiteAdapter): Promise<boolean> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}entries\n WHERE id = ? AND entity_id = ? AND deleted_at IS NULL AND lifecycle_status = 'draft'`,\n [entryId, entityId],\n );\n return row != null;\n }\n\n /**\n * Live untyped facts eligible for ontology backfill, oldest first.\n * Skips facts checked within the recheck cooldown (ontology_checked_at > recheckCutoff).\n */\n async findUntypedByEntityId(entityId: string, limit: number, recheckCutoff: number, tx?: SQLiteAdapter): Promise<WikiFact[]> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}entries\n WHERE entity_id = ? AND okf_type IS NULL AND deleted_at IS NULL\n AND (ontology_checked_at IS NULL OR ontology_checked_at <= ?)\n ORDER BY updated_at ASC LIMIT ?`,\n [entityId, recheckCutoff, limit],\n );\n return rows.map(mapRowToFact);\n }\n\n /** Counts live untyped facts: eligible (past cooldown) vs deferred (in cooldown). */\n async countUntypedByEntityId(entityId: string, recheckCutoff: number, tx?: SQLiteAdapter): Promise<{ eligible: number; deferred: number }> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ eligible: number | null; deferred: number | null }>(\n `SELECT\n SUM(CASE WHEN ontology_checked_at IS NULL OR ontology_checked_at <= ? THEN 1 ELSE 0 END) AS eligible,\n SUM(CASE WHEN ontology_checked_at IS NOT NULL AND ontology_checked_at > ? THEN 1 ELSE 0 END) AS deferred\n FROM ${this.prefix}entries\n WHERE entity_id = ? AND okf_type IS NULL AND deleted_at IS NULL`,\n [recheckCutoff, recheckCutoff, entityId],\n );\n return { eligible: Number(row?.eligible ?? 0), deferred: Number(row?.deferred ?? 0) };\n }\n\n /**\n * Sets okf_type only when currently NULL — additive by construction: a\n * concurrently-typed fact is never overwritten. Returns changes for the caller\n * to distinguish applied vs skipped.\n */\n async updateOkfType(id: string, entityId: string, okfType: string, tx: SQLiteAdapter): Promise<{ changes: number }> {\n const result = await tx.runAsync(\n `UPDATE ${this.prefix}entries SET okf_type = ?\n WHERE id = ? AND entity_id = ? AND okf_type IS NULL AND deleted_at IS NULL`,\n [okfType, id, entityId],\n );\n return { changes: result.changes };\n }\n\n /**\n * Stamps the backfill recheck cooldown. NEVER touches updated_at — import\n * merge resolution is last-write-wins on updated_at and a bump here would\n * make an unchanged local fact beat a genuinely newer remote edit.\n */\n async markOntologyChecked(ids: string[], entityId: string, now: number, tx: SQLiteAdapter): Promise<void> {\n if (ids.length === 0) return;\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n await tx.runAsync(\n `UPDATE ${this.prefix}entries SET ontology_checked_at = ?\n WHERE id IN (${placeholders}) AND entity_id = ? AND deleted_at IS NULL`,\n [now, ...chunk, entityId],\n );\n }\n }\n\n /**\n * Lightweight full-breadth title index (id, title, okf_type) over all live\n * typed facts. Used by ontology backfill edge resolution — a recent-N window\n * would miss an old fact's contemporaries. Untyped rows are excluded: they\n * can never pass the edge target-type check, and batch facts typed during\n * the run are re-added to the in-memory index by the caller.\n */\n async findTitleIndexByEntityId(entityId: string, tx?: SQLiteAdapter): Promise<Array<{ id: string; title: string; okf_type: string | null }>> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<{ id: string; title: string; okf_type: string | null }>(\n `SELECT id, title, okf_type FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL AND okf_type IS NOT NULL`,\n [entityId],\n );\n return rows.map(r => ({ id: r.id, title: r.title, okf_type: r.okf_type ?? null }));\n }\n\n /** Counts live mutable facts: eligible (past cooldown) vs deferred (in cooldown). */\n async countHealCandidatesByEntityId(\n entityId: string,\n recheckCutoff: number,\n tx?: SQLiteAdapter,\n ): Promise<{ eligible: number; deferred: number }> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const row = await executor.getFirstAsync<{ eligible: number | null; deferred: number | null }>(\n `SELECT\n SUM(CASE WHEN heal_checked_at IS NULL OR heal_checked_at <= ? THEN 1 ELSE 0 END) AS eligible,\n SUM(CASE WHEN heal_checked_at IS NOT NULL AND heal_checked_at > ? THEN 1 ELSE 0 END) AS deferred\n FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL AND source_type != 'immutable_document'\n AND ${liveAtSql('current')}`,\n [recheckCutoff, recheckCutoff, entityId, now, now],\n );\n return { eligible: Number(row?.eligible ?? 0), deferred: Number(row?.deferred ?? 0) };\n }\n\n /**\n * Stamps the heal recheck cooldown. NEVER touches updated_at — import merge\n * resolution is last-write-wins on updated_at and a bump here would make an\n * unchanged local fact beat a genuinely newer remote edit.\n *\n * Soft-deleted rows are skipped: a candidate heal deleted earlier in the same\n * transaction is no longer a candidate under any future pass, so its cooldown\n * value is irrelevant. This means the stamped count can be lower than the\n * offered-candidate count.\n */\n async markHealChecked(ids: string[], entityId: string, now: number, tx: SQLiteAdapter): Promise<void> {\n if (ids.length === 0) return;\n for (let i = 0; i < ids.length; i += this.chunkSize) {\n const chunk = ids.slice(i, i + this.chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n await tx.runAsync(\n `UPDATE ${this.prefix}entries SET heal_checked_at = ?\n WHERE id IN (${placeholders}) AND entity_id = ? AND deleted_at IS NULL`,\n [now, ...chunk, entityId],\n );\n }\n }\n\n /**\n * Lightweight full-breadth index (id, title) over all live librarian_inferred\n * facts. This is heal's fuzzy-dedupe corpus, deliberately kept independent of\n * the bounded candidate window: seeding dedupe from a batchSize-limited read\n * would let a synthesized fact duplicating a fact outside the window pass the\n * Jaccard check, and a convergence loop would multiply those duplicates across\n * passes. Mirrors findTitleIndexByEntityId — full breadth, two columns, cheap.\n */\n async findInferredTitlesByEntityId(\n entityId: string,\n tx?: SQLiteAdapter,\n ): Promise<Array<{ id: string; title: string }>> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<{ id: string; title: string }>(\n `SELECT id, title FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL AND source_type = 'librarian_inferred'`,\n [entityId],\n );\n return rows.map(r => ({ id: r.id, title: r.title }));\n }\n\n /**\n * Count of live facts for `entityId` with no stored embedding that are still\n * retryable (`embedding_attempts < maxAttempts`). Backs the deferred\n * maintenance pending report's `reembedPending` flag and the reembed job's\n * entity selection (PR-C 2026-09-29).\n */\n async countReembedPending(entityId: string, maxAttempts: number, tx?: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ n: number }>(\n `SELECT COUNT(*) AS n FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL AND embedding_blob IS NULL AND embedding IS NULL AND embedding_attempts < ?`,\n [entityId, maxAttempts],\n );\n return Number(row?.n ?? 0);\n }\n}\n","import { BaseRepository } from './BaseRepository';\nimport type { SQLiteAdapter } from '../types';\nimport { generateId } from '../utils/ids';\n\nexport class OutboxRepository extends BaseRepository {\n private enableOutbox: boolean;\n\n constructor(db: SQLiteAdapter, prefix: string, enableOutbox = false) {\n super(db, prefix);\n this.enableOutbox = enableOutbox;\n }\n\n /**\n * Insert a new outbox event within the provided transaction.\n * No-op when enableOutbox is false.\n * `tx` is required — callers must always pass the active transaction\n * so the write is atomic with the main table mutation.\n */\n async push(\n params: {\n entityId: string;\n tableName: string;\n recordId: string;\n operation: 'INSERT' | 'UPDATE' | 'DELETE';\n payload: any;\n },\n tx: SQLiteAdapter,\n ): Promise<void> {\n if (!this.enableOutbox) return;\n const executor = this.getExecutor(tx);\n const id = generateId('out_');\n const now = Date.now();\n await executor.runAsync(\n `INSERT INTO ${this.prefix}outbox (id, entity_id, table_name, record_id, operation, payload, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n [id, params.entityId, params.tableName, params.recordId, params.operation, JSON.stringify(params.payload), now],\n );\n }\n\n /**\n * Fetch pending outbox rows ordered by created_at ASC, rowid ASC.\n * Reads directly from `this.db` (not a transaction).\n */\n async fetchPending(limit = 50): Promise<any[]> {\n return this.db.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}outbox ORDER BY created_at ASC, rowid ASC LIMIT ?`,\n [limit],\n );\n }\n\n /**\n * Delete acknowledged outbox rows by their IDs.\n * No-op when `ids` is empty.\n * Deletes directly from `this.db` (not a transaction).\n */\n async acknowledge(ids: string[]): Promise<void> {\n if (ids.length === 0) return;\n const chunkSize = 500;\n for (let i = 0; i < ids.length; i += chunkSize) {\n const chunk = ids.slice(i, i + chunkSize);\n const placeholders = chunk.map(() => '?').join(', ');\n await this.db.runAsync(\n `DELETE FROM ${this.prefix}outbox WHERE id IN (${placeholders})`,\n chunk,\n );\n }\n }\n}\n","import type { SQLiteAdapter } from '../types';\nimport { BaseRepository } from './BaseRepository';\nimport { generateId } from '../utils/ids';\n\n/**\n * Per-(entity_id, source_hash) record of the canonical sourceRef currently\n * holding that hash. The partial UNIQUE index on (entity_id, source_hash)\n * WHERE deleted_at IS NULL enforces the sourceRef-level TOCTOU-race invariant\n * for the #79 fix. See\n * docs/superpowers/specs/2026-08-07-dependabot-concurrency-release-hygiene-design.md §B1.\n *\n * The entries table cannot express this invariant directly because a single\n * `ingestDocument` call writes N facts that all share\n * (entity_id, source_ref, source_hash); a UNIQUE index on\n * `entries(entity_id, source_hash)` would block the 2nd–Nth fact inserts in\n * the normal multi-fact path. The per-(entity, hash) granularity of\n * source_ref_index matches the TOCTOU invariant exactly.\n *\n * No outbox events: this is an internal index table whose state is fully\n * derivable from `entries`. Hosts that need CDC continue to read `entries`\n * outbox events; the index is not part of the user-visible contract.\n */\nexport class SourceRefIndexRepository extends BaseRepository {\n /**\n * Idempotent insert: the partial UNIQUE index catches concurrent inserts for\n * the same (entity_id, source_hash). The caller (IngestionService) catches\n * the resulting SQLITE_CONSTRAINT_UNIQUE and translates it to the per-mode\n * duplicate-hash outcome. Runtime IDs use the `sri_` prefix to avoid\n * collision with the deterministic `sri:<entity>:<hash>` IDs used by the v9\n * backfill (the colon separator keeps the two ID spaces disjoint).\n */\n async upsert(\n entityId: string,\n sourceHash: string,\n sourceRef: string,\n tx: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `INSERT INTO ${this.prefix}source_ref_index (id, entity_id, source_hash, source_ref, created_at, deleted_at)\n VALUES (?, ?, ?, ?, ?, NULL)`,\n [generateId('sri_'), entityId, sourceHash, sourceRef, Date.now()],\n );\n }\n\n /**\n * Idempotent soft-delete of the live row for (entity_id, source_ref).\n * Called at the start of every ingestDocument to remove the prior run's\n * index row, so the new upsert doesn't collide with itself. No-op when the\n * row is already soft-deleted or never existed.\n */\n async softDeleteByEntityAndSourceRef(\n entityId: string,\n sourceRef: string,\n tx: SQLiteAdapter,\n ): Promise<number> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const result = await executor.runAsync(\n `UPDATE ${this.prefix}source_ref_index\n SET deleted_at = ?, created_at = ?\n WHERE entity_id = ? AND source_ref = ? AND deleted_at IS NULL`,\n [now, now, entityId, sourceRef],\n );\n return result.changes;\n }\n\n /**\n * Returns the live sourceRef holding the given hash, or null when no live\n * row exists. Used by the IngestionService pre-check (line 82) and the\n * catch-and-translate canonical lookup (line 212).\n */\n async findActiveByEntityAndHash(\n entityId: string,\n sourceHash: string,\n tx?: SQLiteAdapter,\n ): Promise<string | null> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ source_ref: string }>(\n `SELECT source_ref FROM ${this.prefix}source_ref_index\n WHERE entity_id = ? AND source_hash = ? AND deleted_at IS NULL`,\n [entityId, sourceHash],\n );\n return row?.source_ref ?? null;\n }\n}\n","import { BaseRepository } from './BaseRepository';\nimport { OutboxRepository } from './OutboxRepository';\nimport type { WikiTask, SQLiteAdapter } from '../types';\nimport { parseJsonArray, parseJsonObject } from './rowMappers';\nimport { isStaleAfter, deriveTrustTier } from '@equationalapplications/core-okf';\n\nfunction mapRowToTask(row: any): WikiTask {\n const okf_verified = parseJsonArray<NonNullable<WikiTask['okf_verified']>[number]>(row.okf_verified, []);\n // Mirror EntryRepository.mapRowToFact — see that file for the rationale on\n // per-row Date.now() sampling vs. a shared per-call value.\n const now = Date.now();\n const staleAfterRaw = row.stale_after != null ? Number(row.stale_after) : null;\n\n return {\n id: row.id,\n entity_id: row.entity_id,\n description: row.description,\n status: row.status,\n priority: Number(row.priority),\n created_at: Number(row.created_at),\n updated_at: Number(row.updated_at),\n resolved_at: row.resolved_at != null ? Number(row.resolved_at) : null,\n deleted_at: row.deleted_at != null ? Number(row.deleted_at) : null,\n okf_type: row.okf_type ?? null,\n // OKF v0.2\n lifecycle_status: (row.lifecycle_status ?? 'stable') as WikiTask['lifecycle_status'],\n stale_after: staleAfterRaw,\n generated_by: row.generated_by ?? null,\n okf_sources: parseJsonArray<NonNullable<WikiTask['okf_sources']>[number]>(row.okf_sources, []),\n okf_verified,\n okf_usage_window: parseJsonObject<NonNullable<WikiTask['okf_usage_window']>>(row.okf_usage_window),\n last_verified_at: row.last_verified_at != null ? Number(row.last_verified_at) : null,\n last_verified_by: row.last_verified_by ?? null,\n // Spec §2.7 + §5.3: hydrate so read() consumers don't re-call the helpers.\n isStale: isStaleAfter(staleAfterRaw, now),\n trustTier: deriveTrustTier(okf_verified),\n };\n}\n\nexport class TaskRepository extends BaseRepository {\n constructor(\n db: SQLiteAdapter,\n prefix: string,\n private outbox: OutboxRepository,\n ) {\n super(db, prefix);\n }\n\n /**\n * Fetch a single task by ID. Returns null if not found or soft-deleted.\n */\n async findById(id: string): Promise<WikiTask | null> {\n const row = await this.db.getFirstAsync<any>(\n `SELECT * FROM ${this.prefix}tasks WHERE id = ? AND deleted_at IS NULL`,\n [id],\n );\n return row ? mapRowToTask(row) : null;\n }\n\n /**\n * Fetch all pending/in_progress tasks for the given entity IDs.\n * Returns empty array when entityIds is empty.\n */\n async findAllPending(entityIds: string[], limit?: number): Promise<WikiTask[]> {\n if (entityIds.length === 0) return [];\n const placeholders = entityIds.map(() => '?').join(', ');\n const sql =\n `SELECT * FROM ${this.prefix}tasks ` +\n `WHERE entity_id IN (${placeholders}) AND status IN ('pending', 'in_progress') AND deleted_at IS NULL ` +\n `ORDER BY priority DESC, created_at ASC` +\n (limit != null ? ` LIMIT ?` : '');\n const params: unknown[] = limit != null ? [...entityIds, limit] : [...entityIds];\n const rows = await this.db.getAllAsync<any>(sql, params);\n return rows.map(mapRowToTask);\n }\n\n async findExistingMetadataByIds(\n ids: readonly string[],\n tx?: SQLiteAdapter,\n ): Promise<Array<{ id: string; entity_id: string; updated_at: number }>> {\n const executor = this.getExecutor(tx);\n const rows: Array<{ id: string; entity_id: string; updated_at: number }> = [];\n const chunkSize = 500;\n for (let i = 0; i < ids.length; i += chunkSize) {\n const chunk = ids.slice(i, i + chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n const chunkRows = await executor.getAllAsync<any>(\n `SELECT id, entity_id, updated_at FROM ${this.prefix}tasks WHERE id IN (${placeholders})`,\n chunk,\n );\n rows.push(...chunkRows.map((row) => ({ id: row.id, entity_id: row.entity_id, updated_at: Number(row.updated_at) })));\n }\n return rows;\n }\n\n /**\n * Upsert a WikiTask within the provided transaction.\n * Uses ON CONFLICT(id) DO UPDATE (not INSERT OR REPLACE).\n * Stages an outbox entry in the same transaction.\n * `tx` is REQUIRED.\n *\n * OKF metadata (lifecycle_status, sources, etc.) is intentionally excluded\n * from the SET clause so content writes preserve any existing row values.\n * See {@link EntryRepository.upsert} for the rationale — the same applies\n * symmetrically to tasks (spec §2.5). Callers that need to overwrite OKF\n * metadata should use {@link upsertForImport}.\n */\n async upsert(task: WikiTask, tx: SQLiteAdapter, updatedAt?: number): Promise<void> {\n const executor = this.getExecutor(tx);\n const now = Number.isFinite(updatedAt) ? updatedAt : Date.now();\n\n const existingRow = await executor.getFirstAsync<{\n id: string;\n lifecycle_status: string;\n stale_after: number | null;\n generated_by: string | null;\n okf_sources: string | null;\n okf_verified: string | null;\n okf_usage_window: string | null;\n last_verified_at: number | null;\n last_verified_by: string | null;\n }>(\n `SELECT id, lifecycle_status, stale_after, generated_by,\n okf_sources, okf_verified, okf_usage_window,\n last_verified_at, last_verified_by\n FROM ${this.prefix}tasks WHERE id = ?`,\n [task.id],\n );\n const operation = task.deleted_at != null ? 'DELETE' : (existingRow ? 'UPDATE' : 'INSERT');\n\n await executor.runAsync(\n `INSERT INTO ${this.prefix}tasks (\n id, entity_id, description, status, priority,\n created_at, updated_at, resolved_at, deleted_at,\n lifecycle_status, stale_after, generated_by, last_verified_at, last_verified_by,\n okf_sources, okf_verified, okf_usage_window\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n entity_id = excluded.entity_id,\n description = excluded.description,\n status = excluded.status,\n priority = excluded.priority,\n updated_at = excluded.updated_at,\n resolved_at = excluded.resolved_at,\n deleted_at = excluded.deleted_at`,\n [\n task.id,\n task.entity_id,\n task.description,\n task.status,\n task.priority,\n task.created_at,\n now, // updated_at set by repo or import override\n task.resolved_at ?? null,\n task.deleted_at ?? null,\n // OKF v0.2 metadata — bound for INSERT only; ON CONFLICT UPDATE\n // preserves the existing row values (these columns are intentionally\n // absent from the SET clause above).\n task.lifecycle_status ?? 'stable',\n task.stale_after ?? null,\n task.generated_by ?? null,\n task.last_verified_at ?? null,\n task.last_verified_by ?? null,\n task.okf_sources ? JSON.stringify(task.okf_sources) : null,\n task.okf_verified ? JSON.stringify(task.okf_verified) : null,\n task.okf_usage_window ? JSON.stringify(task.okf_usage_window) : null,\n ],\n );\n\n // Outbox payload mirrors what is actually persisted. On UPDATE, the SET\n // clause intentionally omits OKF metadata so prior row values win, but\n // the caller-supplied `task` would still describe state we did NOT write.\n // Re-read those columns from the stored row and overlay them onto the\n // caller-supplied payload before publishing (#90 review).\n const persistedOkf = existingRow\n ? {\n lifecycle_status: (existingRow.lifecycle_status ?? 'stable') as WikiTask['lifecycle_status'],\n stale_after: existingRow.stale_after != null ? Number(existingRow.stale_after) : null,\n generated_by: existingRow.generated_by ?? null,\n okf_sources: parseJsonArray<NonNullable<WikiTask['okf_sources']>[number]>(existingRow.okf_sources, []),\n okf_verified: parseJsonArray<NonNullable<WikiTask['okf_verified']>[number]>(existingRow.okf_verified, []),\n okf_usage_window: parseJsonObject<NonNullable<WikiTask['okf_usage_window']>>(existingRow.okf_usage_window),\n last_verified_at: existingRow.last_verified_at != null ? Number(existingRow.last_verified_at) : null,\n last_verified_by: existingRow.last_verified_by ?? null,\n }\n : null;\n await this.outbox.push(\n {\n entityId: task.entity_id,\n tableName: 'tasks',\n recordId: task.id,\n operation,\n payload: persistedOkf ? { ...task, ...persistedOkf } : task,\n },\n tx,\n );\n }\n\n async upsertForImport(task: WikiTask, tx: SQLiteAdapter, updatedAt?: number): Promise<void> {\n const executor = this.getExecutor(tx);\n const now = Number.isFinite(updatedAt) ? updatedAt : Date.now();\n\n // Import is replace semantics, mirroring EntryRepository.upsertForImport.\n // Dump is authoritative: a re-import that cleared stale_after, generated_by,\n // or verification mirrors must overwrite, not preserve.\n await executor.runAsync(\n `INSERT INTO ${this.prefix}tasks (\n id, entity_id, description, status, priority,\n created_at, updated_at, resolved_at, deleted_at, okf_type,\n lifecycle_status, stale_after, generated_by, last_verified_at, last_verified_by,\n okf_sources, okf_verified, okf_usage_window\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n entity_id = excluded.entity_id,\n description = excluded.description,\n status = excluded.status,\n priority = excluded.priority,\n updated_at = excluded.updated_at,\n resolved_at = excluded.resolved_at,\n deleted_at = excluded.deleted_at,\n okf_type = excluded.okf_type,\n lifecycle_status = excluded.lifecycle_status,\n stale_after = excluded.stale_after,\n generated_by = excluded.generated_by,\n last_verified_at = excluded.last_verified_at,\n last_verified_by = excluded.last_verified_by,\n okf_sources = excluded.okf_sources,\n okf_verified = excluded.okf_verified,\n okf_usage_window = excluded.okf_usage_window`,\n [\n task.id,\n task.entity_id,\n task.description,\n task.status,\n task.priority,\n task.created_at,\n now,\n task.resolved_at ?? null,\n task.deleted_at ?? null,\n task.okf_type ?? null,\n task.lifecycle_status ?? 'stable',\n task.stale_after ?? null,\n task.generated_by ?? null,\n task.last_verified_at ?? null,\n task.last_verified_by ?? null,\n task.okf_sources ? JSON.stringify(task.okf_sources) : null,\n task.okf_verified ? JSON.stringify(task.okf_verified) : null,\n task.okf_usage_window ? JSON.stringify(task.okf_usage_window) : null,\n ],\n );\n }\n\n /**\n * Soft-delete a task by ID. Sets deleted_at and updated_at.\n * Stages a DELETE outbox entry in the same transaction.\n * `tx` is REQUIRED.\n */\n async softDelete(id: string, entityId: string, tx: SQLiteAdapter): Promise<void> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n await executor.runAsync(\n `UPDATE ${this.prefix}tasks SET deleted_at = ?, updated_at = ? WHERE id = ? AND entity_id = ? AND deleted_at IS NULL`,\n [now, now, id, entityId],\n );\n await this.outbox.push(\n {\n entityId,\n tableName: 'tasks',\n recordId: id,\n operation: 'DELETE',\n payload: { id, entity_id: entityId, deleted_at: now },\n },\n tx,\n );\n }\n\n /**\n * Fetch all non-deleted tasks for an entity, ordered by priority DESC, created_at ASC.\n * Used by _getFullBundle().\n */\n async findAllByEntityId(entityId: string, tx?: SQLiteAdapter): Promise<WikiTask[]> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}tasks WHERE entity_id = ? AND deleted_at IS NULL ORDER BY priority DESC, created_at ASC`,\n [entityId],\n );\n return rows.map(mapRowToTask);\n }\n\n /**\n * Bulk delete pruned tasks (already soft-deleted) by cutoff date.\n * Used by runPrune(). Returns number of deleted rows.\n */\n async bulkDeletePruned(\n entityId: string,\n cutoff: number,\n tx: SQLiteAdapter,\n ): Promise<number> {\n const executor = this.getExecutor(tx);\n const rowsToDelete = await executor.getAllAsync<{ id: string; deleted_at: number }>(\n `SELECT id, deleted_at FROM ${this.prefix}tasks WHERE entity_id = ? AND deleted_at IS NOT NULL AND deleted_at <= ?`,\n [entityId, cutoff],\n );\n if (rowsToDelete.length === 0) return 0;\n\n const result = await executor.runAsync(\n `DELETE FROM ${this.prefix}tasks WHERE entity_id = ? AND deleted_at IS NOT NULL AND deleted_at <= ?`,\n [entityId, cutoff],\n );\n\n for (const row of rowsToDelete) {\n await this.outbox.push(\n {\n entityId,\n tableName: 'tasks',\n recordId: row.id,\n operation: 'DELETE',\n payload: { id: row.id, entity_id: entityId, deleted_at: row.deleted_at },\n },\n tx,\n );\n }\n\n return result.changes;\n }\n\n /**\n * Soft-delete a task by ID within a transaction.\n * Stages a DELETE outbox entry in the same transaction.\n * `tx` is REQUIRED.\n */\n async softDeleteById(\n id: string,\n entityId: string,\n tx: SQLiteAdapter,\n ): Promise<{ changes: number }> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n const result = await executor.runAsync(\n `UPDATE ${this.prefix}tasks SET deleted_at = ?, updated_at = ? WHERE id = ? AND entity_id = ? AND deleted_at IS NULL`,\n [now, now, id, entityId],\n );\n if (result.changes > 0) {\n await this.outbox.push(\n {\n entityId,\n tableName: 'tasks',\n recordId: id,\n operation: 'DELETE',\n payload: { id, entity_id: entityId, deleted_at: now },\n },\n tx,\n );\n }\n return result;\n }\n\n /**\n * Bulk soft-delete all tasks for an entity.\n * Stages DELETE outbox entries for each row in the same transaction.\n * `tx` is REQUIRED.\n */\n async bulkSoftDeleteByEntityId(entityId: string, tx: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const now = Date.now();\n // Get IDs before updating for outbox staging\n const idsToDelete = await executor.getAllAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}tasks WHERE entity_id = ? AND deleted_at IS NULL`,\n [entityId],\n );\n const result = await executor.runAsync(\n `UPDATE ${this.prefix}tasks SET deleted_at = ?, updated_at = ? WHERE entity_id = ? AND deleted_at IS NULL`,\n [now, now, entityId],\n );\n // Stage outbox entries for each deleted record\n for (const row of idsToDelete) {\n await this.outbox.push({\n entityId,\n tableName: 'tasks',\n recordId: row.id,\n operation: 'DELETE',\n payload: { id: row.id, entity_id: entityId, deleted_at: now },\n }, tx);\n }\n return result.changes;\n }\n\n /**\n * Count live tasks for an entity. Used by forget({ dryRun, clearAll: true }).\n */\n async countLiveByEntityId(entityId: string, tx?: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<{ cnt: number }>(\n `SELECT COUNT(*) AS cnt FROM ${this.prefix}tasks\n WHERE entity_id = ? AND deleted_at IS NULL`,\n [entityId],\n );\n return row?.cnt ?? 0;\n }\n}\n","import { BaseRepository } from './BaseRepository';\nimport type { WikiEvent, SQLiteAdapter } from '../types';\nimport type { LibrarianWatermark } from './MetadataRepository';\n\n/**\n * Strict-after predicate on the (created_at, id) ordering used by the\n * op-based librarian (spec 2026-09-29 §4.1). Three placeholders: `[at, at, id]`.\n */\nexport const AFTER_SQL = '((created_at > ?) OR (created_at = ? AND id > ?))';\n\nexport function afterArgs(wm: LibrarianWatermark): [number, number, string] {\n return [wm.at, wm.at, wm.id];\n}\n\n/**\n * Map a row from the `events` table to the `WikiEvent` shape returned to\n * callers. `occurred_at` is dropped when NULL so legacy librarian prompt\n * bytes are unchanged for the (current default) case where no caller has\n * supplied a real-world timestamp.\n */\nfunction mapEvent(row: WikiEvent): WikiEvent {\n if (row.occurred_at == null) {\n const rest: WikiEvent = { ...row };\n delete (rest as { occurred_at?: number | null }).occurred_at;\n return rest;\n }\n return row;\n}\n\nexport class EventRepository extends BaseRepository {\n /**\n * Insert a new event row.\n * Pass `tx` to participate in a caller-owned transaction; omit to run against the default db.\n */\n async add(event: WikiEvent, tx?: SQLiteAdapter): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `INSERT INTO ${this.prefix}events (id, entity_id, event_type, summary, related_entry_id, created_at, occurred_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n [\n event.id,\n event.entity_id,\n event.event_type,\n event.summary,\n event.related_entry_id ?? null,\n event.created_at,\n event.occurred_at ?? null,\n ],\n );\n }\n\n async addIgnoreDuplicate(event: WikiEvent, tx?: SQLiteAdapter): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `INSERT OR IGNORE INTO ${this.prefix}events (id, entity_id, event_type, summary, related_entry_id, created_at, occurred_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n [\n event.id,\n event.entity_id,\n event.event_type,\n event.summary,\n event.related_entry_id ?? null,\n event.created_at,\n event.occurred_at ?? null,\n ],\n );\n }\n\n /**\n * Return the most recent events for an entity, newest first.\n * Defaults to a limit of 50.\n */\n async getRecent(entityId: string, limit = 50): Promise<WikiEvent[]> {\n const rows = await this.db.getAllAsync<WikiEvent>(\n `SELECT * FROM ${this.prefix}events WHERE entity_id = ? ORDER BY created_at DESC LIMIT ?`,\n [entityId, limit],\n );\n return rows.map(mapEvent);\n }\n\n /**\n * Return the most recent events for the given entity IDs, newest first.\n * Defaults to a limit of 50.\n */\n async getRecentForEntities(entityIds: string[], limit = 50): Promise<WikiEvent[]> {\n if (entityIds.length === 0) return [];\n const placeholders = entityIds.map(() => '?').join(', ');\n const rows = await this.db.getAllAsync<WikiEvent>(\n `SELECT * FROM ${this.prefix}events WHERE entity_id IN (${placeholders}) ORDER BY created_at DESC LIMIT ?`,\n [...entityIds, limit],\n );\n return rows.map(mapEvent);\n }\n\n /**\n * Delete events for an entity that were created at or before the given cutoff timestamp.\n * Returns the number of deleted rows.\n */\n async prune(entityId: string, cutoff: number): Promise<{ changes: number }> {\n return this.db.runAsync(\n `DELETE FROM ${this.prefix}events WHERE entity_id = ? AND created_at <= ?`,\n [entityId, cutoff],\n );\n }\n\n /**\n * Watermark-guarded prune (spec 2026-09-29 competitive-memory §6): delete\n * events at or before `cutoff` **and** at-or-before the librarian watermark.\n * Events the librarian has not processed yet are retention-held, never\n * deleted. `wm = null` (no watermark yet) deletes nothing.\n * Used by runPrune under the deferred/ops strategies.\n */\n async pruneThrough(entityId: string, cutoff: number, wm: LibrarianWatermark | null): Promise<{ changes: number }> {\n if (!wm) return { changes: 0 };\n return this.db.runAsync(\n `DELETE FROM ${this.prefix}events WHERE entity_id = ? AND created_at <= ? AND NOT ${AFTER_SQL}`,\n [entityId, cutoff, ...afterArgs(wm)],\n );\n }\n\n /**\n * Count events at or before `cutoff` that are after the watermark — the\n * retention-held tail `pruneThrough` left in place. `wm = null` counts all\n * events at or before `cutoff` (every one of them is held back).\n */\n async countHeldBack(entityId: string, cutoff: number, wm: LibrarianWatermark | null): Promise<number> {\n const where = wm ? ` AND ${AFTER_SQL}` : '';\n const row = await this.db.getFirstAsync<{ n: number }>(\n `SELECT COUNT(*) AS n FROM ${this.prefix}events WHERE entity_id = ? AND created_at <= ?${where}`,\n [entityId, cutoff, ...(wm ? afterArgs(wm) : [])],\n );\n return Number(row?.n ?? 0);\n }\n\n /**\n * Return the total number of events stored for an entity.\n * `tx` is optional — pass an active transaction handle for atomic reads.\n */\n async count(entityId: string, tx?: SQLiteAdapter): Promise<number> {\n const executor = tx ?? this.db;\n const row = await executor.getFirstAsync<{ count: number }>(\n `SELECT COUNT(*) as count FROM ${this.prefix}events WHERE entity_id = ?`,\n [entityId],\n );\n return row?.count ?? 0;\n }\n\n /**\n * Return all events for an entity in chronological (ASC) order.\n * When limit is provided, fetches newest-first then reverses to preserve chronological order.\n */\n async getByEntityId(entityId: string, limit?: number): Promise<WikiEvent[]> {\n if (limit != null) {\n const rows = await this.db.getAllAsync<WikiEvent>(\n `SELECT * FROM ${this.prefix}events WHERE entity_id = ? ORDER BY created_at DESC LIMIT ?`,\n [entityId, limit],\n );\n return rows.map(mapEvent).slice().reverse();\n }\n const rows = await this.db.getAllAsync<WikiEvent>(\n `SELECT * FROM ${this.prefix}events WHERE entity_id = ? ORDER BY created_at ASC`,\n [entityId],\n );\n return rows.map(mapEvent);\n }\n\n /**\n * Return events for `entityId` strictly after the watermark `(at, id)` in\n * chronological (ASC, id-ASC tie-break) order. Pass `wm = null` to read\n * from the beginning of the entity's event log. `limit` caps the result.\n *\n * Used by the op-based librarian (PR-B) to enumerate its unprocessed tail.\n */\n async getAfter(\n entityId: string,\n wm: LibrarianWatermark | null,\n limit?: number,\n ): Promise<WikiEvent[]> {\n const limitClause = limit != null ? ` LIMIT ?` : '';\n const params: unknown[] = wm ? [entityId, wm.at, wm.at, wm.id] : [entityId];\n const where = wm ? `entity_id = ? AND ${AFTER_SQL}` : `entity_id = ?`;\n if (limit != null) params.push(limit);\n const rows = await this.db.getAllAsync<WikiEvent>(\n `SELECT * FROM ${this.prefix}events WHERE ${where} ORDER BY created_at ASC, id ASC${limitClause}`,\n params,\n );\n return rows.map(mapEvent);\n }\n\n /**\n * Count of events for `entityId` strictly after the watermark. Used as\n * the op-based librarian's bounded batch size and by the deferred-maintenance\n * pending report. Pass `wm = null` to count the entity's whole event log\n * (no watermark yet) — mirrors `getAfter` / `sumSummaryCharsAfter`.\n */\n async countAfter(entityId: string, wm: LibrarianWatermark | null): Promise<number> {\n const params: unknown[] = wm ? [entityId, wm.at, wm.at, wm.id] : [entityId];\n const where = wm ? `entity_id = ? AND ${AFTER_SQL}` : `entity_id = ?`;\n const row = await this.db.getFirstAsync<{ count: number }>(\n `SELECT COUNT(*) as count FROM ${this.prefix}events WHERE ${where}`,\n params,\n );\n return row?.count ?? 0;\n }\n\n /**\n * Return the event at a given chronological offset for `entityId` (0-based,\n * oldest first). Used by MaintenanceService.seedLibrarianWatermark to anchor\n * the watermark on a real row when a legacy DB first migrates to the\n * op-based librarian. The offset is clamped and truncated to defend against\n * hostile or fractional callers.\n */\n async getAtOffset(entityId: string, offset: number, tx?: SQLiteAdapter): Promise<WikiEvent | null> {\n const executor = this.getExecutor(tx);\n const row = await executor.getFirstAsync<any>(\n `SELECT * FROM ${this.prefix}events WHERE entity_id = ? ORDER BY created_at ASC, id ASC LIMIT 1 OFFSET ?`,\n [entityId, Math.max(0, Math.trunc(offset))],\n );\n return row ? mapEvent(row) : null;\n }\n\n /**\n * Sum of `summary` lengths (in characters) for events for `entityId`\n * strictly after the watermark. Pass `wm = null` to sum the entity's whole\n * event log (no watermark yet). Used by the op-based librarian's token\n * budget estimator (PR-B) and by the auto-trigger's pending-size check\n * (PR-C). SQLite's `LENGTH` returns character count for UTF-8 text input.\n */\n async sumSummaryCharsAfter(entityId: string, wm: LibrarianWatermark | null, tx?: SQLiteAdapter): Promise<number> {\n const executor = this.getExecutor(tx);\n const params: unknown[] = wm ? [entityId, wm.at, wm.at, wm.id] : [entityId];\n const where = wm ? `entity_id = ? AND ${AFTER_SQL}` : `entity_id = ?`;\n const row = await executor.getFirstAsync<{ total: number | null }>(\n `SELECT SUM(LENGTH(summary)) as total FROM ${this.prefix}events WHERE ${where}`,\n params,\n );\n return row?.total ?? 0;\n }\n}\n","import { BaseRepository } from './BaseRepository';\nimport type { WikiEdge, SQLiteAdapter } from '../types';\nimport { liveAtSql, type LiveMode } from '../utils/temporal';\n\nexport interface NeighborhoodQueryOptions {\n maxDepth: number; // already clamped to [1,3] by the caller (GraphTraversalService)\n direction: 'inbound' | 'outbound' | 'both';\n edgeTypes?: string[]; // undefined = no filter; [] = match nothing (short-circuits)\n minConfidence: 'certain' | 'inferred' | 'tentative';\n excludeSourceTypes: string[];\n maxNodes: number;\n /**\n * When true, draft facts are dead-ends for *discovered* nodes — the recursive\n * walk will not step onto a draft, and will not step *past* one either, since\n * a draft's neighbours are unreachable through it. The anchor node is exempt\n * (it is validated up-front and never gated by this flag), so callers can\n * intentionally start from a draft. Default false (drafts visible).\n */\n excludeDrafts?: boolean;\n /** Liveness gate for discovered nodes: 'current' (live now) or 'asOf' (valid time T). Always supplied by GraphTraversalService. */\n live: { mode: LiveMode; t: number };\n}\n\nconst CONFIDENCE_RANK: Record<'tentative' | 'inferred' | 'certain', number> = {\n tentative: 0,\n inferred: 1,\n certain: 2,\n};\n\nexport class EdgeRepository extends BaseRepository {\n /**\n * Insert an edge, silently skipping on primary-key or uniqueness conflicts.\n * Returns true when a row was inserted, false when skipped as a duplicate.\n * Throws when the insert was skipped due to an id collision with a different edge tuple.\n */\n async addIgnoreDuplicate(edge: WikiEdge, tx?: SQLiteAdapter): Promise<boolean> {\n const executor = this.getExecutor(tx);\n const result = await executor.runAsync(\n `INSERT OR IGNORE INTO ${this.prefix}edges (id, entity_id, source_id, target_id, edge_type, created_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n [edge.id, edge.entity_id, edge.source_id, edge.target_id, edge.edge_type, edge.created_at],\n );\n\n if (result.changes > 0) return true;\n\n const existing = await executor.getFirstAsync<{\n entity_id: string;\n source_id: string;\n target_id: string;\n edge_type: string;\n }>(\n `SELECT entity_id, source_id, target_id, edge_type FROM ${this.prefix}edges WHERE id = ?`,\n [edge.id],\n );\n\n if (!existing) return false;\n\n if (\n String(existing.entity_id) !== edge.entity_id ||\n String(existing.source_id) !== edge.source_id ||\n String(existing.target_id) !== edge.target_id ||\n String(existing.edge_type) !== edge.edge_type\n ) {\n throw new Error(\n `Edge id collision: ${JSON.stringify(edge.id)} already exists with a different (entity_id, source_id, target_id, edge_type) tuple`,\n );\n }\n\n return false;\n }\n\n async getByEntityId(entityId: string, tx?: SQLiteAdapter): Promise<WikiEdge[]> {\n const executor = this.getExecutor(tx);\n const rows = await executor.getAllAsync<any>(\n `SELECT * FROM ${this.prefix}edges WHERE entity_id = ? ORDER BY created_at ASC`,\n [entityId],\n );\n return rows.map(mapRowToEdge);\n }\n\n /** Hard delete — edges have no soft-delete concept, only presence/absence. `tx` is REQUIRED. */\n async bulkDeleteByEntityId(entityId: string, tx: SQLiteAdapter): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(`DELETE FROM ${this.prefix}edges WHERE entity_id = ?`, [entityId]);\n }\n\n /**\n * Hard-delete every edge whose `source_id` is in `sourceFactIds`, scoped to\n * `entityId`. Returns the number of rows deleted. Edges have no soft-delete\n * concept; this method is named `softDeleteBySourceFactIds` for symmetry with\n * `EntryRepository.softDeleteBySource` (which IS a soft delete), but its\n * semantics are immediate presence/absence removal. Use ONLY inside an open\n * transaction — the method requires `tx` and performs no autocommit.\n *\n * Used by `IngestionService.upsertGraphCore` to retire the prior parse's\n * edges whose source facts are being superseded by `softDeleteBySource`.\n */\n async softDeleteBySourceFactIds(\n entityId: string,\n sourceFactIds: readonly string[],\n tx: SQLiteAdapter,\n ): Promise<number> {\n if (sourceFactIds.length === 0) return 0;\n const executor = this.getExecutor(tx);\n // SQLite's SQLITE_MAX_VARIABLE_NUMBER defaults to 32,766; binding\n // `entityId` plus every ID in one statement would overflow once a\n // single sourceRef accumulates tens of thousands of facts. Chunk to\n // stay well under the limit, reusing the supplied tx executor.\n const chunkSize = 500;\n let totalChanges = 0;\n for (let i = 0; i < sourceFactIds.length; i += chunkSize) {\n const chunk = sourceFactIds.slice(i, i + chunkSize);\n const placeholders = chunk.map(() => '?').join(',');\n const result = await executor.runAsync(\n `DELETE FROM ${this.prefix}edges\n WHERE entity_id = ? AND source_id IN (${placeholders})`,\n [entityId, ...chunk],\n );\n totalChanges += result.changes;\n }\n return totalChanges;\n }\n\n /**\n * Multi-hop traversal from `sourceId` via SQLite `WITH RECURSIVE`. All filtering,\n * dead-ending, cycle-guarding, capping, and ordering happens in this one query.\n * The anchor is validated (exists, right entity, not soft-deleted) but never gated\n * by confidence/source_type — only nodes discovered beyond it are.\n */\n async getNeighborhood(\n entityId: string,\n sourceId: string,\n opts: NeighborhoodQueryOptions,\n tx?: SQLiteAdapter,\n ): Promise<{ nodeIds: string[]; edges: WikiEdge[] }> {\n const executor = this.getExecutor(tx);\n\n if (opts.edgeTypes && opts.edgeTypes.length === 0) {\n const anchor = await executor.getFirstAsync<{ id: string }>(\n `SELECT id FROM ${this.prefix}entries WHERE id = ? AND entity_id = ? AND deleted_at IS NULL`,\n [sourceId, entityId],\n );\n return { nodeIds: anchor ? [anchor.id] : [], edges: [] };\n }\n\n const edgeTypesClause = opts.edgeTypes\n ? `e.edge_type IN (${opts.edgeTypes.map(() => '?').join(',')})`\n : '1=1';\n const excludeSourceTypesPlaceholders = opts.excludeSourceTypes.map(() => '?').join(',');\n const minConfidenceRank = CONFIDENCE_RANK[opts.minConfidence];\n\n const sql = `\n WITH RECURSIVE walk(node_id, depth, visited) AS (\n SELECT id, 0, ',' || id || ','\n FROM ${this.prefix}entries\n WHERE id = ? AND entity_id = ? AND deleted_at IS NULL\n\n UNION\n\n SELECT\n CASE WHEN e.source_id = w.node_id THEN e.target_id ELSE e.source_id END,\n w.depth + 1,\n w.visited || (CASE WHEN e.source_id = w.node_id THEN e.target_id ELSE e.source_id END) || ','\n FROM walk w\n JOIN ${this.prefix}edges e\n ON e.entity_id = ?\n AND (\n (? != 'inbound' AND e.source_id = w.node_id) OR\n (? != 'outbound' AND e.target_id = w.node_id)\n )\n AND (${edgeTypesClause})\n JOIN ${this.prefix}entries n\n ON n.id = (CASE WHEN e.source_id = w.node_id THEN e.target_id ELSE e.source_id END)\n AND n.entity_id = ?\n AND n.deleted_at IS NULL\n AND (\n CASE n.confidence\n WHEN 'tentative' THEN 0\n WHEN 'inferred' THEN 1\n WHEN 'certain' THEN 2\n ELSE -1\n END\n ) >= ?\n AND n.source_type NOT IN (${excludeSourceTypesPlaceholders})\n AND (? = 0 OR n.lifecycle_status != 'draft')\n AND ${liveAtSql(opts.live.mode, 'n.')}\n WHERE w.depth < ?\n AND instr(w.visited, ',' || (CASE WHEN e.source_id = w.node_id THEN e.target_id ELSE e.source_id END) || ',') = 0\n )\n SELECT node_id, MIN(depth) AS depth\n FROM walk\n GROUP BY node_id\n ORDER BY depth ASC, (SELECT updated_at FROM ${this.prefix}entries WHERE id = node_id) DESC\n LIMIT ?\n `;\n\n const params: unknown[] = [\n sourceId, entityId,\n entityId,\n opts.direction, opts.direction,\n ...(opts.edgeTypes ?? []),\n entityId,\n minConfidenceRank,\n ...opts.excludeSourceTypes,\n opts.excludeDrafts === true ? 1 : 0,\n opts.live.t, opts.live.t,\n opts.maxDepth,\n opts.maxNodes,\n ];\n\n const rows = await executor.getAllAsync<{ node_id: string; depth: number }>(sql, params);\n const nodeIds = rows.map((r) => r.node_id);\n if (nodeIds.length === 0) return { nodeIds: [], edges: [] };\n\n const valueRows = nodeIds.map(() => '(?)').join(', ');\n const edgeRows = await executor.getAllAsync<any>(\n `WITH neighborhood(node_id) AS (VALUES ${valueRows})\n SELECT e.* FROM ${this.prefix}edges e\n JOIN neighborhood ns ON e.source_id = ns.node_id\n JOIN neighborhood nt ON e.target_id = nt.node_id\n WHERE e.entity_id = ?`,\n [...nodeIds, entityId],\n );\n\n return { nodeIds, edges: edgeRows.map(mapRowToEdge) };\n }\n}\n\nfunction mapRowToEdge(row: any): WikiEdge {\n return {\n id: String(row.id),\n entity_id: String(row.entity_id),\n source_id: String(row.source_id),\n target_id: String(row.target_id),\n edge_type: String(row.edge_type),\n created_at: Number(row.created_at),\n };\n}\n","// packages/core/src/services/search/MiniSearchIndexStrategy.ts\n\nimport MiniSearch from 'minisearch';\nimport type {\n IndexDocument,\n IndexSearchOptions,\n IndexSearchResult,\n IndexStrategy,\n} from './IndexStrategy';\n\n/**\n * In-RAM keyword index. Extracted from `SearchService` without behavior\n * change. The strategy owns the MiniSearch instance, the `entryIdsByEntity`\n * tracking map, the `entityIdById` reverse map, and the explicit-vacuum\n * policy (#64).\n *\n * Memory cost: O(total text). The fix for #257 lives in PR-2's FTS5\n * strategy; this one stays for Expo/OPFS environments without FTS5 and for\n * hosts that explicitly pin `WikiConfig.indexStrategy: 'minisearch'`.\n */\nexport class MiniSearchIndexStrategy implements IndexStrategy {\n private index: MiniSearch<IndexDocument>;\n /**\n * Per-entity id set. `replaceEntity()` and `hasIndexedEntity()` read it;\n * `addDocuments()` and `discardIds()` keep it in sync. `SearchService` does\n * not see this map; it only sees `hasIndexedEntity`. The previous\n * `miniSearchEntryIdsByEntity` lived on `SearchService`.\n */\n private entryIdsByEntity = new Map<string, Set<string>>();\n /**\n * Reverse of `entryIdsByEntity`. `replace(entityId, ids, …)` uses it to\n * decide which ids are owned by `entityId` (the only safe membership test\n * — a rebuild that failed between its discard pass and the set replacement\n * can leave the forward set claiming ids the MiniSearch instance does not\n * hold). The pre-extraction `syncEntries` deleted from one set per id, not\n * from every entity's set.\n */\n private entityIdById = new Map<string, string>();\n\n constructor() {\n this.index = this.createIndex();\n }\n\n /**\n * Build a fresh MiniSearch instance with the project's index options.\n * Called from the constructor and from `replaceAll`. We do not use\n * `removeAll()` on an existing instance because that empties the index but\n * leaves `dirtCount` and the vacuum bookkeeping intact, which would trip\n * `syncEntries`' conditional vacuum early after a clear.\n */\n private createIndex(): MiniSearch<IndexDocument> {\n return new MiniSearch({\n fields: ['title', 'body', 'tags'],\n storeFields: ['entity_id'],\n // Vacuuming is driven explicitly at the end of each serialized rebuild\n // (see SearchService.syncEntries). Auto-vacuum fires on its own\n // schedule, asynchronously with respect to the caller, and traversing\n // the tree mid-rebuild is what threw the uncaught TypeError in\n // MiniSearch.performVacuuming (#64).\n autoVacuum: false,\n searchOptions: {\n boost: { title: 2 },\n fuzzy: 0.2,\n prefix: true,\n },\n });\n }\n\n /**\n * Incremental sync. Removes only ids currently tracked under `entityId`\n * (other entities' docs are untouched), then upserts `documents` by id.\n * The same id appearing in both `ids` and `documents` is discarded first\n * so the upsert does not throw on a duplicate id.\n *\n * Every document must carry `entityId` as its `entity_id`; a mismatch is\n * rejected before the write mutates anything. A tracking-only call\n * (`replace(entityId, [], [])`) registers the entity as indexed, matching\n * the interface contract.\n *\n * Atomicity: never awaits between the discard pass and `addDocuments`, so\n * a concurrent `search()` sees the index wholly before or wholly after,\n * never half-updated. This is the precondition the pre-extraction\n * `syncEntries` kept with its \"no await from here to `addAll`\" comment.\n */\n async replace(\n entityId: string,\n ids: readonly string[],\n documents: readonly IndexDocument[],\n ): Promise<void> {\n assertOwnedBy(entityId, documents);\n this.discardIds(ids, entityId);\n if (!this.entryIdsByEntity.has(entityId)) this.entryIdsByEntity.set(entityId, new Set());\n this.addDocuments(documents);\n }\n\n /**\n * Per-entity rebuild. Removes every id tracked under `entityId` (with the\n * `index.has(id)` guard so a stale tracking set cannot make `discard()`\n * throw), then writes `documents`. The entity stays registered as\n * indexed — even when `documents` is empty — so the next `syncEntries`\n * call can take the fast path. Every document must belong to `entityId`.\n */\n async replaceEntity(entityId: string, documents: readonly IndexDocument[]): Promise<void> {\n assertOwnedBy(entityId, documents);\n const previous = this.entryIdsByEntity.get(entityId);\n if (previous) this.discardIds([...previous]);\n // Registered even when empty, so hasIndexedEntity(entityId) === true.\n this.entryIdsByEntity.set(entityId, new Set());\n this.addDocuments(documents);\n }\n\n /**\n * Global rebuild / clear. Replaces the MiniSearch instance and clears both\n * id maps, so `hasIndexedEntity` returns `false` for every entity afterwards.\n * `SearchService.clearAll()` calls `replaceAll([])`.\n */\n async replaceAll(documents: readonly IndexDocument[]): Promise<void> {\n this.index = this.createIndex();\n this.entryIdsByEntity.clear();\n this.entityIdById.clear();\n this.addDocuments(documents);\n }\n\n /**\n * Best-match-first search over the documents whose `entity_id` is in\n * `options.entityIds`. `preFilterLimit` overrides `limit` (hybrid retrieval\n * uses this to over-fetch candidates before the `limit` cap). Scores are\n * raw BM25+ — `SearchService.getKeywordScores` and `searchKeyword` apply\n * any scaling, not the strategy.\n */\n async search(query: string, options: IndexSearchOptions): Promise<IndexSearchResult[]> {\n if (options.entityIds.length === 0) return [];\n const entityIdSet = new Set(options.entityIds);\n const limit = options.preFilterLimit ?? options.limit;\n const raw = this.index.search(query, {\n filter: (r) => entityIdSet.has(r.entity_id as string),\n combineWith: 'OR',\n });\n // Tiebreak equal-score results by id before slicing: MiniSearch breaks\n // ties by internal insertion order, which the strategy's own\n // discard/add changes. Callers truncate to a `limit`, so the ids\n // surviving a tie at the boundary must not depend on write history.\n raw.sort((a, b) => {\n const scoreDiff = b.score - a.score;\n if (!Number.isNaN(scoreDiff) && scoreDiff !== 0) return scoreDiff;\n return a.id.localeCompare(b.id);\n });\n // `storeFields: ['entity_id']` puts entity_id on every result.\n return raw.slice(0, limit).map((r) => ({\n id: r.id,\n entity_id: r.entity_id as string,\n score: r.score,\n }));\n }\n\n /**\n * Explicit vacuum. MiniSearch 7.2.0's `dirtCount` rule: search after an\n * un-vacuumed discard inverts the relative scores of term-sharing\n * documents at any index size. `SearchService.syncEntries` calls this\n * after a discard-bearing turn. No-op when `dirtCount === 0`.\n */\n async vacuum(): Promise<void> {\n if (this.index.dirtCount > 0) {\n await this.index.vacuum();\n }\n }\n\n /**\n * `true` when `entityId` has been indexed at least once under the current\n * strategy state. Backed by `entryIdsByEntity.has(entityId)`, which is\n * kept in sync by `addDocuments`, `replaceEntity`, and `replaceAll`.\n */\n hasIndexedEntity(entityId: string): boolean {\n return this.entryIdsByEntity.has(entityId);\n }\n\n /**\n * Add `documents` to the MiniSearch instance and register them in\n * `entryIdsByEntity` and `entityIdById`. MiniSearch mutates documents\n * during `add`, so each doc is copied first. `add` throws on an id the\n * index already holds — `replace` and `replaceEntity` discard first for\n * that reason.\n *\n * Adds and registers one document at a time: if a duplicate id throws\n * part-way through, every document already in the index is tracked, so\n * the next rebuild can discard it instead of failing on it again. This is\n * the precondition the per-turn recovery path relies on (#258 review).\n */\n private addDocuments(documents: readonly IndexDocument[]): void {\n for (const d of documents) {\n const doc: IndexDocument = { ...d };\n this.index.add(doc);\n const set = this.entryIdsByEntity.get(doc.entity_id) ?? new Set<string>();\n set.add(doc.id);\n this.entryIdsByEntity.set(doc.entity_id, set);\n this.entityIdById.set(doc.id, doc.entity_id);\n }\n }\n\n /**\n * Discard `ids` from the MiniSearch instance and from both id maps, but\n * only for ids currently owned by `entityId` (the second argument). When\n * `entityId` is omitted (used by `replaceEntity` for the bulk rebuild\n * path), every id is discarded regardless of owning entity.\n *\n * `index.has(id)` is the membership test of record: a rebuild that failed\n * between its own discard pass and the set replacement can leave the\n * tracking set claiming ids the index no longer holds — `discard()` throws\n * on those, so we guard.\n */\n private discardIds(ids: readonly string[], entityId?: string): void {\n for (const id of ids) {\n // Scope check first: an id not owned by `entityId` is silently ignored.\n // Doing the scope check before `index.discard` is what stops a\n // `replace(entityId, ids, …)` call from touching docs under any other\n // entity.\n const owning = this.entityIdById.get(id);\n if (owning === undefined) continue;\n if (entityId !== undefined && owning !== entityId) continue;\n if (this.index.has(id)) this.index.discard(id);\n this.entryIdsByEntity.get(owning)?.delete(id);\n this.entityIdById.delete(id);\n }\n }\n}\n\n/**\n * `replace` and `replaceEntity` write under one entity. A document carrying a\n * different `entity_id` would land in another entity's tracking set (and\n * have no safe discard path), so the write rejects before mutating anything.\n */\nfunction assertOwnedBy(entityId: string, documents: readonly IndexDocument[]): void {\n for (const doc of documents) {\n if (doc.entity_id !== entityId) {\n throw new Error(\n `IndexStrategy write for entity ${entityId} got document ${doc.id} under entity ${doc.entity_id}`,\n );\n }\n }\n}","/** Monotonic clock (ms): a wall-clock step must not stretch or skip a deadline or a cooldown. */\nexport const monotonicNow = (): number =>\n typeof performance !== 'undefined' && typeof performance.now === 'function' ? performance.now() : Date.now();\n","/**\n * Default `setupBudgetMs`: the wall time each keyword-index quantum (one per\n * `setup()` and per no-arg `syncSearchIndex()`) may spend on drain/rebuild\n * chunks, checked between chunk transactions (spec #280 Config surface).\n */\nexport const DEFAULT_SETUP_BUDGET_MS = 1500;\n","// packages/core/src/services/search/ftsQuery.ts\n\nconst TOKEN = /[\\p{L}\\p{N}]+/gu;\n\n/**\n * Turn a free-text query into an FTS5 MATCH expression that can never be a\n * syntax error: every token is a double-quoted string (FTS5 has no escapes\n * inside quotes except `\"\"`, and tokens contain no quotes), followed by `*`\n * for prefix matching. Tokens are ORed, which matches MiniSearch's\n * `prefix: true` and its `combineWith: 'OR'`. Returns `null` when no token\n * survives, and the caller returns no results.\n */\nexport function buildFtsMatchQuery(query: string): string | null {\n const seen = new Set<string>();\n for (const m of query.toLowerCase().matchAll(TOKEN)) seen.add(m[0]);\n if (seen.size === 0) return null;\n return [...seen].map((t) => `\"${t}\"*`).join(' OR ');\n}\n","// packages/core/src/services/search/Fts5IndexStrategy.ts\nimport type { SQLiteAdapter } from '../../types';\nimport type { MetadataRepository } from '../../repositories/MetadataRepository';\nimport type { DrainOptions, IndexDocument, IndexSearchOptions, IndexSearchResult, IndexStrategy } from './IndexStrategy';\nimport {\n FTS5_DRAIN_CHUNK, FTS5_RECLAIM_MERGE_PAGES, FTS5_RETIRED_COUNTER_KEY, FTS5_RETIRED_TABLES_KEY, isRetiredTableName, retiredTableName, FTS5_REBUILD_SNAPSHOT_KEY, FTS5_REBUILD_WM_KEY, FTS5_STATE_KEY, FTS5_SWEEP_CURSOR_KEY,\n sweepChunkSql, sweepHiSql, windowChunkSql, windowHiSql, drainChunkSql, drainHiSql, entityDrainChunkSql, entityDrainHiSql, fts5PendingIndexesDdl,\n fts5TablesDdl, fts5TriggerNames, fts5TriggersDdl, idDrainChunkSql, idReindexChunkSql,\n} from './fts5Sql';\nimport { readRebuildProgress, writeRebuildStart, type RebuildProgress, type RebuildWatermark } from './fts5Progress';\nimport { parseJsonArray } from '../../repositories/rowMappers';\nimport { monotonicNow } from '../../utils/monotonicNow';\nimport { DEFAULT_SETUP_BUDGET_MS } from '../../utils/setupDefaults';\nimport { buildFtsMatchQuery } from './ftsQuery';\nimport { extractSqliteCode } from '../../db/sqliteCodes';\n\n/**\n * Keyword index stored in SQLite FTS5, kept consistent with `entries` by a\n * trigger-fed ledger (`fts_pending`) that `drain()` applies in bounded, all-SQL\n * chunks. Row text never enters JS, so memory is flat at any database size.\n * Spec 2026-10-05 §PR-2 revision.\n */\nexport class Fts5IndexStrategy implements IndexStrategy {\n constructor(\n private readonly db: SQLiteAdapter,\n private readonly prefix: string,\n private readonly metadataRepo: MetadataRepository,\n private readonly budgetMs: number = DEFAULT_SETUP_BUDGET_MS,\n ) {}\n\n /**\n * Resolves the index state (spec #280 Change 3 transition table). Every\n * read-only probe runs before the one transition transaction, so a probe\n * failure leaves zero mutation (Change 4 ordering).\n */\n async init(opts: { entriesExisted?: boolean } = {}): Promise<void> {\n try {\n await this.initOnce(opts);\n } catch (err) {\n const wrapped = unwrapFtsOnly(err);\n const cls = ftsCorruptionClass(wrapped.cause);\n // Corruption confined to FTS tables: entries is untouched, so a reset re-arm is safe (spec #280 Change 4).\n if (cls === 'vtab' || (cls === 'corrupt' && wrapped.ftsOnly)) {\n await this.resetAndRearm();\n return;\n }\n throw wrapped.cause; // generic errors keep the retry -> UnavailableIndexStrategy path; pinned 'fts5' sees them raw\n }\n }\n\n /** Marks errors from statements that touch only FTS tables (entries_fts + shadows). */\n private async ftsOnly<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (err) {\n throw new FtsOnlyStatementError(err);\n }\n }\n\n private async initOnce(opts: { entriesExisted?: boolean }): Promise<void> {\n const p = this.prefix;\n const state = await this.metadataRepo.getMeta(FTS5_STATE_KEY);\n const schema = await this.readSchema();\n const ftsExists = schema.tables.has(`${p}entries_fts`);\n const mapExists = schema.tables.has(`${p}fts_map`);\n const pendingExists = schema.tables.has(`${p}fts_pending`);\n const trig = schema.triggersPresent;\n const ftsDdl = schema.tables.get(`${p}entries_fts`) ?? null;\n const tokenizerOk = ftsDdl === null || /tokenize\\s*=\\s*['\"]porter\\s+unicode61['\"]/i.test(ftsDdl);\n\n if (state === null && opts.entriesExisted === false) {\n // Fresh store: nothing to index yet.\n await this.db.withTransactionAsync(async (tx) => {\n await tx.execAsync(fts5TablesDdl(p) + fts5PendingIndexesDdl(p) + fts5TriggersDdl(p));\n await this.metadataRepo.setMeta(FTS5_STATE_KEY, 'live', tx);\n });\n return;\n }\n if (state === 'detached') return this.resetAndRearm(); // re-attach: the map is untrustworthy\n\n if (!tokenizerOk) return this.resetAndRearm();\n\n const intact = trig && ftsExists && mapExists && pendingExists;\n if (intact && state === 'rebuilding') return; // resume; each quantum re-verifies the fingerprint\n if (intact && state === 'live') {\n await this.ftsOnly(() => this.db.getFirstAsync(`SELECT rowid FROM ${p}entries_fts ORDER BY rowid DESC LIMIT 1`));\n if (await this.liveRowUnindexed()) return this.resetAndRearm();\n return; // fast path\n }\n // Marker lost, a trigger lost, or a table missing.\n if (ftsExists && mapExists && (await this.keepMapConsistent())) {\n await this.db.withTransactionAsync((tx) => this.rearmInTx(tx));\n return;\n }\n return this.resetAndRearm();\n }\n\n /**\n * The index was lost (rev 8 m3 / rev 9 m4): the oldest or the newest live entry is neither mapped nor\n * ledgered, which `live` never allows. The oldest one keeps detection armed after post-loss writes\n * repopulate the map and the ledger (#284 review). Every-open path: each side reads at most\n * FTS5_DRAIN_CHUNK entries rows (final review M1), so an all-soft-deleted store is never fully scanned;\n * a lost index whose oldest and newest rows are all deleted goes undetected.\n */\n private async liveRowUnindexed(): Promise<boolean> {\n const p = this.prefix;\n const edge = (dir: 'ASC' | 'DESC') => `SELECT id FROM (SELECT id FROM (SELECT id, deleted_at FROM ${p}entries`\n + ` ORDER BY rowid ${dir} LIMIT ${FTS5_DRAIN_CHUNK}) WHERE deleted_at IS NULL LIMIT 1)`;\n return (await this.db.getFirstAsync(\n `SELECT 1 AS x FROM (${edge('ASC')} UNION ALL ${edge('DESC')}) e\n WHERE NOT EXISTS (SELECT 1 FROM ${p}fts_map m WHERE m.id = e.id)\n AND NOT EXISTS (SELECT 1 FROM ${p}fts_pending q WHERE q.id = e.id)\n LIMIT 1`)) !== null;\n }\n\n /**\n * Read-only keep-map check (spec DDL note): every surviving entries_fts\n * rowid must have a map row. Max-rowid seek, then docsize vs map counts.\n */\n private async keepMapConsistent(): Promise<boolean> {\n const p = this.prefix;\n const fts = await this.ftsOnly(() => this.db.getFirstAsync<{ rowid: number }>(`SELECT rowid FROM ${p}entries_fts ORDER BY rowid DESC LIMIT 1`));\n const map = await this.db.getFirstAsync<{ hi: number; n: number }>(\n `SELECT coalesce(max(fts_rowid), 0) AS hi, count(*) AS n FROM ${p}fts_map`);\n if ((fts?.rowid ?? 0) > (map?.hi ?? 0)) return false;\n const doc = await this.ftsOnly(() => this.db.getFirstAsync<{ n: number }>(`SELECT count(*) AS n FROM ${p}entries_fts_docsize`));\n return (doc?.n ?? 0) === (map?.n ?? 0);\n }\n\n /** Keep-map re-arm: triggers, empty ledger, rebuild from 0, state rebuilding. One transaction. */\n private async rearmInTx(tx: SQLiteAdapter): Promise<void> {\n const p = this.prefix;\n await tx.execAsync(fts5TablesDdl(p));\n await tx.execAsync(`DELETE FROM ${p}fts_pending;`);\n await tx.execAsync(fts5PendingIndexesDdl(p) + fts5TriggersDdl(p));\n await writeRebuildStart(tx, p, this.metadataRepo);\n await this.metadataRepo.setMeta(FTS5_STATE_KEY, 'rebuilding', tx);\n }\n\n /** Reset path: retire entries_fts, recreate it empty, clear map + ledger, then the re-arm. One transaction. */\n private async resetAndRearm(): Promise<void> {\n const p = this.prefix;\n await this.db.withTransactionAsync(async (tx) => {\n await this.retireFtsTable(tx);\n await tx.execAsync(fts5TablesDdl(p));\n await tx.execAsync(`DELETE FROM ${p}fts_map; DELETE FROM ${p}fts_pending;`);\n await this.rearmInTx(tx);\n });\n }\n\n /** Rename-retire entries_fts (spec #280 rev 11); DROP only when the RENAME throws. */\n private async retireFtsTable(tx: SQLiteAdapter): Promise<void> {\n const p = this.prefix;\n if (!(await this.metadataRepo.tableExists(`${p}entries_fts`, tx))) return;\n const n = Number((await this.metadataRepo.getMeta(FTS5_RETIRED_COUNTER_KEY, tx)) ?? '0') + 1;\n const name = retiredTableName(p, n);\n try {\n await tx.execAsync(`ALTER TABLE ${p}entries_fts RENAME TO ${name}`);\n } catch (err) {\n // Not damage: SQLite may have rolled the transaction back already, so further statements would\n // autocommit one by one. Fail the reset whole instead (#284 review).\n if (isTransientOrTxFatal(err)) throw err;\n // Shadow tables too damaged to rename: today's DROP, with its measured floor, for this case only.\n await tx.execAsync(`DROP TABLE ${p}entries_fts`);\n return;\n }\n await this.metadataRepo.setMeta(FTS5_RETIRED_TABLES_KEY, JSON.stringify([...(await this.retiredList(tx)), name]), tx);\n await this.metadataRepo.setMeta(FTS5_RETIRED_COUNTER_KEY, String(n), tx);\n }\n\n private async retiredList(tx: SQLiteAdapter = this.db): Promise<string[]> {\n const raw = parseJsonArray<unknown>(await this.metadataRepo.getMeta(FTS5_RETIRED_TABLES_KEY, tx), []);\n return raw.filter((n): n is string => isRetiredTableName(this.prefix, n));\n }\n\n async drain(opts: DrainOptions = {}): Promise<void> {\n try {\n await this.drainOnce(opts);\n } catch (err) {\n // SQLITE_CORRUPT_VTAB names the FTS5 table itself, so the reset init() applies is safe here too:\n // without it every drain fails until the next open (#284 review). Other corruption may be in\n // entries, which this cannot repair: it propagates as before.\n if (ftsCorruptionClass(err) !== 'vtab') throw err;\n await this.resetAndRearm();\n // The reset cleared the ledger, so the caller's ids are re-indexed from entries: resolving\n // still means they are searchable (DrainOptions.ids), and the caller may drop them.\n if (opts.ids && opts.ids.length > 0) await this.drainIds(opts.ids, idReindexChunkSql(this.prefix));\n }\n }\n\n private async drainOnce(opts: DrainOptions): Promise<void> {\n const ids = opts.ids ?? [];\n // The caller's own ids are not deadline-bound (DrainOptions.ids): they drain to completion, and the caller drops them from its stash only once this succeeds.\n if (ids.length > 0) await this.drainIds(ids);\n if (opts.mode === 'ledger') {\n // Write turn: at most ONE foreign chunk after the caller's own ids.\n if (ids.length === 0 && opts.entityId !== undefined) await this.drainEntityChunk(opts.entityId);\n else await this.drainLedgerChunk();\n return;\n }\n await this.fullQuantum(opts.deadline ?? monotonicNow() + this.budgetMs);\n }\n\n /**\n * One full quantum (spec #280 Change 3): ledger first (at most half the\n * budget while `rebuilding`); then, while `rebuilding`, ≥1 window unless\n * the ledger drain overran the deadline, one sweep tx, and the flip check;\n * then reclamation. A `live` store reads only the state.\n */\n private async fullQuantum(deadline: number): Promise<void> {\n const rebuilding = (await this.metadataRepo.getMeta(FTS5_STATE_KEY)) === 'rebuilding';\n // While rebuilding, the ledger stops at half the remaining budget, so a steady write backlog cannot\n // starve the windows (#284 review). Overrun is still judged against the full deadline.\n const start = monotonicNow();\n const ledgerRan = await this.drainLedgerUntil(rebuilding ? start + (deadline - start) / 2 : deadline);\n const ledgerOverran = ledgerRan && monotonicNow() >= deadline;\n if (rebuilding) {\n const progress = await readRebuildProgress(this.metadataRepo);\n if (!progress || !(await this.fingerprintValid(progress.wm))) {\n // Windows resume next quantum; reclamation below still runs (#284 review).\n await this.restartRebuild();\n } else {\n if (!ledgerOverran) {\n let step: WindowStep;\n do {\n step = await this.runWindow(progress);\n } while (step === 'more' && monotonicNow() < deadline);\n // 'stale': progress moved under this quantum (a VACUUM restart, a re-anchor, a flip); the next quantum re-reads it.\n if (step !== 'stale') await this.runSweepTx(progress);\n }\n await this.tryFlip();\n }\n }\n try {\n await this.reclaimRetired(deadline);\n } catch (err) {\n // Best-effort for database errors only: a locked retired table stays listed and is retried next quantum,\n // never failing drain() or the flip. A non-SQLite error is a bug and propagates (final review I2).\n if (!isSqliteError(err)) throw err;\n }\n }\n\n /** Bounded reclamation steps, each its own tx, until the deadline or nothing is retired. */\n private async reclaimRetired(deadline: number): Promise<void> {\n while (monotonicNow() < deadline) {\n const [name] = await this.retiredList();\n if (name === undefined) return;\n try {\n // The list and the table are read once per table, not per step (#284 review).\n if (!(await this.metadataRepo.tableExists(name))) {\n await this.delistRetired(name, false);\n continue;\n }\n while (!(await this.reclaimStep(name)) && monotonicNow() < deadline);\n } catch (err) {\n if (ftsCorruptionClass(err) === null) throw err;\n // Persistently corrupt (the corruption reset is what retired it): DROP once and delist; if even\n // the DROP fails, delist anyway so no quantum re-reads its corrupt pages (final review I2).\n try {\n await this.delistRetired(name, true);\n } catch (dropErr) {\n if (!isSqliteError(dropErr)) throw dropErr;\n await this.delistRetired(name, false);\n }\n }\n }\n }\n\n /** (1) delete <=500 rows, else (2) one bounded merge, else (3) DROP + delist. True once delisted. */\n private async reclaimStep(name: string): Promise<boolean> {\n if (await this.db.getFirstAsync(`SELECT rowid FROM ${name} LIMIT 1`)) {\n await this.db.withTransactionAsync(async (tx) => {\n await tx.runAsync(`DELETE FROM ${name} WHERE rowid IN (SELECT rowid FROM ${name} ORDER BY rowid LIMIT ${FTS5_DRAIN_CHUNK})`);\n });\n return false;\n }\n let merged = false;\n await this.db.withTransactionAsync(async (tx) => {\n const before = await tx.getFirstAsync<{ n: number }>(`SELECT total_changes() AS n`);\n await tx.runAsync(`INSERT INTO ${name}(${name}, rank) VALUES('merge', ${FTS5_RECLAIM_MERGE_PAGES})`);\n const after = await tx.getFirstAsync<{ n: number }>(`SELECT total_changes() AS n`);\n merged = (after?.n ?? 0) - (before?.n ?? 0) >= 2; // FTS5 docs: < 2 means the merge did no work\n });\n if (!merged) await this.delistRetired(name, true);\n return !merged;\n }\n\n private async delistRetired(name: string, drop: boolean): Promise<void> {\n await this.db.withTransactionAsync(async (tx) => {\n if (drop) await tx.execAsync(`DROP TABLE IF EXISTS ${name}`);\n const rest = (await this.retiredList(tx)).filter((n) => n !== name);\n await this.metadataRepo.setMeta(FTS5_RETIRED_TABLES_KEY, JSON.stringify(rest), tx);\n });\n }\n\n /** The id at the watermark's rowid still matches. A null id (start, or windows complete) has nothing to check. */\n private async fingerprintValid(wm: RebuildWatermark, tx: SQLiteAdapter = this.db): Promise<boolean> {\n if (wm.id === null) return true;\n const row = await tx.getFirstAsync<{ id: string }>(`SELECT id FROM ${this.prefix}entries WHERE rowid = ?`, [wm.rowid]);\n return row?.id === wm.id;\n }\n\n /** External change under the watermark: start over (same re-arm transaction as a trigger-loss restart). */\n private async restartRebuild(): Promise<void> {\n await this.db.withTransactionAsync((tx) => this.rearmInTx(tx));\n }\n\n /**\n * Progress as stored, re-read inside a window/sweep tx: false when it no\n * longer matches what this quantum assumed (final review I1). Writing a\n * watermark or cursor computed from a stale `pr` would overwrite a\n * concurrent restart (runPrune VACUUM is not on the sync chain).\n */\n private async progressUnchanged(pr: RebuildProgress, tx: SQLiteAdapter): Promise<boolean> {\n if ((await this.metadataRepo.getMeta(FTS5_STATE_KEY, tx)) !== 'rebuilding') return false;\n const cur = await readRebuildProgress(this.metadataRepo, tx);\n return cur !== null && cur.wm.rowid === pr.wm.rowid && cur.wm.id === pr.wm.id && cur.cursor === pr.cursor\n && cur.snapshot.entries === pr.snapshot.entries && cur.snapshot.map === pr.snapshot.map;\n }\n\n /** One window tx. 'done' once no rows remain in (wm, snapshot] (the watermark is then pinned at the snapshot, F9); 'stale' when progress moved under the quantum. */\n private async runWindow(pr: RebuildProgress): Promise<WindowStep> {\n if (pr.wm.rowid >= pr.snapshot.entries) return 'done';\n const p = this.prefix;\n let next: RebuildWatermark = pr.wm;\n let more = false;\n let stale = false;\n await this.db.withTransactionAsync(async (tx) => {\n if (!(await this.progressUnchanged(pr, tx))) { stale = true; return; }\n const row = await tx.getFirstAsync<{ hi: number | null }>(windowHiSql(p), [pr.wm.rowid, pr.snapshot.entries]);\n if (row?.hi == null) {\n next = { rowid: pr.snapshot.entries, id: null };\n } else {\n for (const sql of windowChunkSql(p)) await tx.runAsync(sql, [pr.wm.rowid, row.hi]);\n const fp = await tx.getFirstAsync<{ id: string }>(`SELECT id FROM ${p}entries WHERE rowid = ?`, [row.hi]);\n next = { rowid: row.hi, id: fp!.id };\n more = true;\n }\n await this.metadataRepo.setMeta(FTS5_REBUILD_WM_KEY, JSON.stringify(next), tx);\n });\n if (stale) return 'stale';\n pr.wm = next; // only after the tx resolved\n return more ? 'more' : 'done';\n }\n\n /** At most one bounded sweep tx; the cursor advances in the same tx. */\n private async runSweepTx(pr: RebuildProgress): Promise<void> {\n if (pr.cursor >= pr.snapshot.map) return;\n const p = this.prefix;\n let next = pr.cursor;\n await this.db.withTransactionAsync(async (tx) => {\n if (!(await this.progressUnchanged(pr, tx))) return; // keep pr.cursor; the next quantum re-reads\n const row = await tx.getFirstAsync<{ hi: number | null }>(sweepHiSql(p), [pr.cursor, pr.snapshot.map]);\n const hi = row?.hi ?? pr.snapshot.map;\n for (const sql of sweepChunkSql(p)) await tx.runAsync(sql, [pr.cursor, hi]);\n await this.metadataRepo.setMeta(FTS5_SWEEP_CURSOR_KEY, String(hi), tx);\n next = hi;\n });\n pr.cursor = next;\n }\n\n /** Completion, re-checked inside the flipping tx; the residual ledger (≤ one chunk) drains in it. */\n private async tryFlip(): Promise<void> {\n const p = this.prefix;\n await this.db.withTransactionAsync(async (tx) => {\n if ((await this.metadataRepo.getMeta(FTS5_STATE_KEY, tx)) !== 'rebuilding') return;\n const pr = await readRebuildProgress(this.metadataRepo, tx);\n if (!pr || pr.wm.rowid < pr.snapshot.entries || pr.cursor < pr.snapshot.map) return;\n if (!(await this.fingerprintValid(pr.wm, tx))) return;\n const residual = await tx.getFirstAsync<{ n: number }>(\n `SELECT count(*) AS n FROM (SELECT 1 FROM ${p}fts_pending LIMIT ${FTS5_DRAIN_CHUNK + 1})`);\n if ((residual?.n ?? 0) > FTS5_DRAIN_CHUNK) return;\n const hi = await tx.getFirstAsync<{ hi: number | null }>(drainHiSql(p));\n if (hi?.hi != null) for (const sql of drainChunkSql(p)) await tx.runAsync(sql, [hi.hi]);\n await this.metadataRepo.deleteMeta(FTS5_REBUILD_WM_KEY, tx);\n await this.metadataRepo.deleteMeta(FTS5_REBUILD_SNAPSHOT_KEY, tx);\n await this.metadataRepo.deleteMeta(FTS5_SWEEP_CURSOR_KEY, tx);\n await this.metadataRepo.setMeta(FTS5_STATE_KEY, 'live', tx);\n });\n }\n\n /** Seq-ordered ledger chunks until empty or `stopAt`. True when a chunk ran. */\n private async drainLedgerUntil(stopAt: number): Promise<boolean> {\n let ran = false;\n while (await this.drainLedgerChunk()) {\n ran = true;\n if (monotonicNow() >= stopAt) break;\n }\n return ran;\n }\n\n /** The caller's own ids, to completion, ≤ FTS5_DRAIN_CHUNK per transaction. */\n private async drainIds(ids: readonly string[], chunk: readonly string[] = idDrainChunkSql(this.prefix)): Promise<void> {\n const unique = [...new Set(ids)];\n for (let i = 0; i < unique.length; i += FTS5_DRAIN_CHUNK) {\n const json = JSON.stringify(unique.slice(i, i + FTS5_DRAIN_CHUNK));\n await this.db.withTransactionAsync(async (tx) => {\n for (const sql of chunk) await tx.runAsync(sql, [json]);\n });\n }\n }\n\n /** One seq-ordered chunk. False when the ledger was empty. */\n private async drainLedgerChunk(): Promise<boolean> {\n const hiSql = drainHiSql(this.prefix);\n const chunk = drainChunkSql(this.prefix);\n // A local, not the callback's return value: host adapters may resolve withTransactionAsync to void.\n let ran = false;\n await this.db.withTransactionAsync(async (tx) => {\n const row = await tx.getFirstAsync<{ hi: number | null }>(hiSql);\n if (row?.hi == null) return;\n for (const sql of chunk) await tx.runAsync(sql, [row.hi]);\n ran = true;\n });\n return ran;\n }\n\n /** One entity-targeted chunk (ORDER BY seq, ≤ FTS5_DRAIN_CHUNK). */\n private async drainEntityChunk(entityId: string): Promise<void> {\n const hiSql = entityDrainHiSql(this.prefix);\n const chunk = entityDrainChunkSql(this.prefix);\n await this.db.withTransactionAsync(async (tx) => {\n const row = await tx.getFirstAsync<{ hi: number | null }>(hiSql, [entityId]);\n if (row?.hi == null) return;\n for (const sql of chunk) await tx.runAsync(sql, [entityId, row.hi]);\n });\n }\n\n async replace(entityId: string, ids: readonly string[], documents: readonly IndexDocument[]): Promise<void> {\n assertEntity(entityId, documents);\n const docIds = documents.map((d) => d.id);\n await this.db.withTransactionAsync(async (tx) => {\n // Caller-supplied ids are scoped to the entity; incoming document ids are\n // un-scoped so a doc that previously lived under another entity gets\n // detached (otherwise the fts_map UNIQUE(id) insert would throw).\n await this.deleteByIds(tx, entityId, ids);\n await this.deleteByIds(tx, null, docIds);\n await this.insertDocs(tx, documents);\n });\n }\n\n async replaceEntity(entityId: string, documents: readonly IndexDocument[]): Promise<void> {\n assertEntity(entityId, documents);\n const p = this.prefix;\n await this.db.withTransactionAsync(async (tx) => {\n await tx.runAsync(\n `DELETE FROM ${p}entries_fts WHERE rowid IN (SELECT fts_rowid FROM ${p}fts_map WHERE entity_id = ?)`, [entityId]);\n await tx.runAsync(`DELETE FROM ${p}fts_map WHERE entity_id = ?`, [entityId]);\n await this.insertDocs(tx, documents);\n });\n }\n\n async replaceAll(documents: readonly IndexDocument[]): Promise<void> {\n const p = this.prefix;\n await this.db.withTransactionAsync(async (tx) => {\n await tx.execAsync(`DELETE FROM ${p}entries_fts; DELETE FROM ${p}fts_map; DELETE FROM ${p}fts_pending;`);\n await this.insertDocs(tx, documents);\n });\n }\n\n async search(query: string, options: IndexSearchOptions): Promise<IndexSearchResult[]> {\n if (options.entityIds.length === 0) return [];\n const match = buildFtsMatchQuery(query);\n if (match === null) return [];\n const cap = options.preFilterLimit ?? options.limit;\n const limit = cap >= Number.MAX_SAFE_INTEGER ? -1 : cap;\n const t = `${this.prefix}entries_fts`;\n // bm25 is evaluated once per matching row in the inner query; the outer\n // SELECT only clamps and negates it. The outer ORDER BY is kept because SQL\n // does not guarantee a subquery's order survives into the outer query; it\n // sorts at most `limit` rows.\n return this.db.getAllAsync<IndexSearchResult>(\n `SELECT id, entity_id, max(0.0, -raw) AS score FROM (\n SELECT id, entity_id, bm25(${t}, 0.0, 0.0, 2.0, 1.0, 1.0) AS raw\n FROM ${t}\n WHERE ${t} MATCH ? AND entity_id IN (SELECT value FROM json_each(?))\n ORDER BY raw, id\n LIMIT ?)\n ORDER BY raw, id`,\n [match, JSON.stringify(options.entityIds), limit],\n );\n }\n\n private async deleteByIds(tx: SQLiteAdapter, entityId: string | null, ids: readonly string[]): Promise<void> {\n if (ids.length === 0) return;\n const p = this.prefix;\n const json = JSON.stringify(ids);\n const whereEntity = entityId === null ? '' : ' AND entity_id = ?';\n // `json_each(?)` is the first placeholder; the optional `entity_id = ?` follows it.\n const args: unknown[] = [json];\n if (entityId !== null) args.push(entityId);\n await tx.runAsync(\n `DELETE FROM ${p}entries_fts WHERE rowid IN (\n SELECT fts_rowid FROM ${p}fts_map WHERE id IN (SELECT value FROM json_each(?))${whereEntity})`,\n args);\n await tx.runAsync(\n `DELETE FROM ${p}fts_map WHERE id IN (SELECT value FROM json_each(?))${whereEntity}`, args);\n }\n\n /** One INSERT pair per document: a throw part-way rolls back the whole transaction. */\n private async insertDocs(tx: SQLiteAdapter, documents: readonly IndexDocument[]): Promise<void> {\n const p = this.prefix;\n for (const d of documents) {\n const { lastInsertRowId } = await tx.runAsync(\n `INSERT INTO ${p}fts_map (id, entity_id) VALUES (?, ?)`, [d.id, d.entity_id]);\n await tx.runAsync(\n `INSERT INTO ${p}entries_fts (rowid, id, entity_id, title, body, tags) VALUES (?, ?, ?, ?, ?, ?)`,\n [lastInsertRowId, d.id, d.entity_id, d.title, d.body, d.tags]);\n }\n }\n\n /** The init probes' schema facts in one sqlite_master read (#284 review): FTS tables with their DDL, and the triggers. */\n private async readSchema(): Promise<{ tables: Map<string, string | null>; triggersPresent: boolean }> {\n const p = this.prefix;\n const triggers = fts5TriggerNames(p);\n const names = [`${p}entries_fts`, `${p}fts_map`, `${p}fts_pending`, ...triggers];\n const rows = await this.db.getAllAsync<{ type: string; name: string; sql: string | null }>(\n `SELECT type, name, sql FROM sqlite_master WHERE name IN (${names.map(() => '?').join(', ')})`, names);\n const tables = new Map(rows.filter((r) => r.type === 'table').map((r) => [r.name, r.sql] as const));\n const present = new Set(rows.filter((r) => r.type === 'trigger').map((r) => r.name));\n return { tables, triggersPresent: triggers.every((n) => present.has(n)) };\n }\n}\n\ntype WindowStep = 'more' | 'done' | 'stale';\n\nclass FtsOnlyStatementError extends Error {\n readonly ftsOnlyCause: unknown;\n constructor(cause: unknown) {\n super('FTS-only statement failed');\n this.ftsOnlyCause = cause;\n }\n}\n\n/** Proxy-safe unwrap (issue #96): never `instanceof` a caught value bare. */\nfunction unwrapFtsOnly(err: unknown): { cause: unknown; ftsOnly: boolean } {\n try {\n if (err instanceof FtsOnlyStatementError) return { cause: err.ftsOnlyCause, ftsOnly: true };\n } catch { /* hostile Proxy */ }\n return { cause: err, ftsOnly: false };\n}\n\n/**\n * Proxy-safe extractSqliteCode (issue #96): any trap => undefined. Also reads\n * WikiTransactionError's `sqliteErrorCode`: the serialized adapter wraps every\n * failed transaction in one, so the driver code is not on `code` (#284 review).\n */\nfunction safeSqliteCode(err: unknown): string | undefined {\n try {\n const code = extractSqliteCode(err);\n if (code !== undefined) return code;\n const lifted = (err as { sqliteErrorCode?: unknown } | null | undefined)?.sqliteErrorCode;\n return typeof lifted === 'string' ? lifted : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Busy/locked, or a code after which SQLite may roll the transaction back (sqlite.org/lang_transaction.html). Extended codes match by primary name. */\nconst TRANSIENT_OR_TX_FATAL = ['SQLITE_BUSY', 'SQLITE_LOCKED', 'SQLITE_FULL', 'SQLITE_IOERR', 'SQLITE_NOMEM', 'SQLITE_INTERRUPT', 'SQLITE_ABORT', 'SQLITE_READONLY'];\n\nfunction isTransientOrTxFatal(err: unknown): boolean {\n const code = safeSqliteCode(err);\n return code !== undefined && TRANSIENT_OR_TX_FATAL.some((c) => code === c || code.startsWith(`${c}_`));\n}\n\n/**\n * 'vtab' for SQLITE_CORRUPT_VTAB (extended code 267, any statement), 'corrupt'\n * for another SQLITE_CORRUPT* code, else null. Proxy-safe: any trap => null.\n */\nexport function ftsCorruptionClass(err: unknown): 'vtab' | 'corrupt' | null {\n const code = safeSqliteCode(err);\n if (code === 'SQLITE_CORRUPT_VTAB') return 'vtab';\n if (code?.startsWith('SQLITE_CORRUPT')) return 'corrupt';\n return null;\n}\n\n/** A SQLite error (better-sqlite3 / expo-sqlite shapes): `code` 'SQLITE_*' or an 'Error code N:' message. Proxy-safe: any trap => false. */\nexport function isSqliteError(err: unknown): boolean {\n return safeSqliteCode(err) !== undefined;\n}\n\nfunction assertEntity(entityId: string, documents: readonly IndexDocument[]): void {\n for (const d of documents) {\n if (d.entity_id !== entityId) {\n throw new TypeError(`IndexDocument ${d.id} has entity_id ${d.entity_id}, expected ${entityId}`);\n }\n }\n}\n","// packages/core/src/services/search/createIndexStrategy.ts\nimport type { SQLiteAdapter } from '../../types';\nimport type { MetadataRepository } from '../../repositories/MetadataRepository';\nimport type { IndexStrategy } from './IndexStrategy';\nimport { Fts5IndexStrategy } from './Fts5IndexStrategy';\nimport { MiniSearchIndexStrategy } from './MiniSearchIndexStrategy';\nimport { UnavailableIndexStrategy } from './UnavailableIndexStrategy';\nimport { FTS5_STATE_KEY, fts5LedgerDropSql } from './fts5Sql';\n\nexport type IndexStrategyPreference = 'fts5' | 'minisearch' | 'auto';\n\nexport const FTS5_INIT_RETRY_MS = 250;\n\n/** True only for errors meaning the module is genuinely absent (permanent). Proxy-safe. */\nfunction isModuleAbsentError(err: unknown): boolean {\n // Walk a short cause chain: some adapters wrap the SQLite message.\n let cur: unknown = err;\n for (let depth = 0; depth < 3 && cur != null; depth++) {\n let msg = '';\n try { msg = String((cur as { message?: unknown }).message ?? cur); } catch { return false; }\n if (/no such module: fts5/i.test(msg) || /no such function: json_valid/i.test(msg)) return true;\n try { cur = (cur as { cause?: unknown }).cause; } catch { return false; }\n }\n return false;\n}\n\n/**\n * Whether this SQLite build has FTS5 and json1 (the drain needs both). The\n * probe table lives in `temp`, so the database file is never touched.\n * Returns false ONLY when the module is genuinely absent; any other error\n * (SQLITE_IOERR, NOMEM, INTERRUPT, ...) is rethrown so the caller treats it\n * as a transient init failure instead of detaching a healthy store\n * (spec #280 Change 4).\n */\nexport async function probeFts5(db: SQLiteAdapter, prefix: string): Promise<boolean> {\n const name = `temp.${prefix}fts5_probe`;\n try {\n await db.execAsync(`CREATE VIRTUAL TABLE IF NOT EXISTS ${name} USING fts5(x)`);\n const row = await db.getFirstAsync<{ ok: number }>(`SELECT json_valid('[]') AS ok`);\n return row?.ok === 1;\n } catch (err) {\n if (isModuleAbsentError(err)) return false;\n throw err;\n } finally {\n try { await db.execAsync(`DROP TABLE IF EXISTS ${name}`); } catch { /* module absent */ }\n }\n}\n\n/**\n * Stop maintaining the FTS5 ledger: drop the triggers and ordinary ledger\n * tables and mark the database detached, so a later FTS5 open rebuilds.\n * The virtual table is dropped best-effort; without the fts5 module it\n * cannot be, and the next FTS5 init recreates it anyway.\n */\nexport async function detachFts5(db: SQLiteAdapter, prefix: string, metadataRepo: MetadataRepository): Promise<void> {\n const hasLedger = await metadataRepo.tableExists(`${prefix}fts_pending`);\n const state = await metadataRepo.getMeta(FTS5_STATE_KEY);\n if (!hasLedger && state !== 'live') return;\n await db.withTransactionAsync(async (tx) => {\n await tx.execAsync(fts5LedgerDropSql(prefix));\n await metadataRepo.setMeta(FTS5_STATE_KEY, 'detached', tx);\n });\n try { await db.execAsync(`DROP TABLE IF EXISTS ${prefix}entries_fts`); } catch { /* no fts5 module */ }\n}\n\n/** Resolve the keyword-index strategy for this database. Failure ordering per spec #280 Change 4. */\nexport async function createIndexStrategy(\n db: SQLiteAdapter,\n prefix: string,\n metadataRepo: MetadataRepository,\n preferred: IndexStrategyPreference,\n opts: { setupBudgetMs?: number; entriesExisted?: boolean } = {},\n): Promise<IndexStrategy> {\n if (preferred === 'minisearch') {\n await detachFts5(db, prefix, metadataRepo); // operator's explicit choice\n return new MiniSearchIndexStrategy();\n }\n const attempt = async (): Promise<IndexStrategy | 'absent'> => {\n if (!(await probeFts5(db, prefix))) return 'absent';\n const strategy = new Fts5IndexStrategy(db, prefix, metadataRepo, opts.setupBudgetMs);\n await strategy.init({ entriesExisted: opts.entriesExisted });\n return strategy;\n };\n const absent = async (): Promise<IndexStrategy> => {\n if (preferred === 'fts5') {\n throw new Error(`indexStrategy 'fts5' was requested, but this SQLite build lacks FTS5 or json1.`);\n }\n await detachFts5(db, prefix, metadataRepo); // module genuinely absent: permanent\n return new MiniSearchIndexStrategy();\n };\n\n for (let tries = 1; ; tries++) {\n try {\n const s = await attempt();\n return s === 'absent' ? await absent() : s;\n } catch (err) {\n if (preferred === 'fts5') throw err; // pinned: surface the raw failure\n if (tries === 2) {\n // Never detachFts5 here: a transient failure must not drop the ledger and\n // route a large store into MiniSearch's full sync (measured OOM).\n console.warn('[WikiMemory] FTS5 init failed after retry; keyword search unavailable until a later open or syncSearchIndex():', err);\n return new UnavailableIndexStrategy(err);\n }\n }\n await new Promise((resolve) => setTimeout(resolve, FTS5_INIT_RETRY_MS));\n }\n}\n","import type {\n SQLiteAdapter,\n WikiOptions,\n PendingMaintenance,\n MaintenanceJob,\n MaintenanceStopReason,\n EntityMaintenanceReport,\n RunPendingMaintenanceOptions,\n RunPendingMaintenanceResult,\n HealResult,\n} from '../types';\nimport { WikiBusyError, isWikiSearchUnavailableError } from '../types';\nimport { MaintenanceService, MAX_EMBED_ATTEMPTS } from './MaintenanceService';\nimport type { LibrarianResult } from './librarian';\nimport { UsageMeter } from '../utils/usage';\nimport { MetadataRepository } from '../repositories/MetadataRepository';\nimport { EventRepository } from '../repositories/EventRepository';\nimport { EntryRepository } from '../repositories/EntryRepository';\nimport { JobManager } from './JobManager';\n\n/**\n * Read-side report for the deferred maintenance mode: which entities have\n * pending work (librarian events behind the watermark, heal backlog, unembedded\n * facts) without running anything. `run` executes the work (PR-C task 4).\n */\nexport class MaintenanceScheduler {\n constructor(\n private db: SQLiteAdapter,\n private options: WikiOptions,\n private maintenanceService: MaintenanceService,\n private metadataRepo: MetadataRepository,\n private eventRepo: EventRepository,\n private entryRepo: EntryRepository,\n private jobManager: JobManager,\n ) {}\n\n /**\n * Entities with **any** pending work only, sorted by `pendingEvents` desc\n * then `entityId` asc. Token estimate is ceil(pending summary chars / 4),\n * matching the auto-trigger's estimator (PR-B).\n */\n async getPending(entityIds?: string[]): Promise<PendingMaintenance[]> {\n const ids = entityIds ?? await this.metadataRepo.getDistinctEntityIds();\n const autoHealThreshold = this.options.config?.autoHealThreshold || 100;\n const canEmbed = typeof this.options.llmProvider.embed === 'function';\n const out: PendingMaintenance[] = [];\n for (const entityId of ids) {\n const wm = await this.metadataRepo.getLibrarianWatermark(entityId, this.db);\n const pendingEvents = await this.eventRepo.countAfter(entityId, wm);\n const chars = pendingEvents > 0 ? await this.eventRepo.sumSummaryCharsAfter(entityId, wm) : 0;\n const eventCount = await this.eventRepo.count(entityId);\n const cp = await this.metadataRepo.getCheckpoint(entityId, this.db);\n // Same clamp as WriteService.maybeRunHeal: an out-of-range checkpoint\n // (reachable after runPrune deletes events a heal pass already counted)\n // resets to ZERO, not to the event count — both views must agree that\n // the entity is fully unhealed.\n let healCheckpoint = cp.heal ?? 0;\n if (healCheckpoint > eventCount) healCheckpoint = 0;\n const healDue = eventCount - healCheckpoint >= autoHealThreshold;\n const reembedPending = canEmbed && (await this.entryRepo.countReembedPending(entityId, MAX_EMBED_ATTEMPTS)) > 0;\n if (pendingEvents > 0 || healDue || reembedPending) {\n out.push({ entityId, pendingEvents, pendingTokensEstimate: Math.ceil(chars / 4), healDue, reembedPending });\n }\n }\n return out.sort((x, y) => (y.pendingEvents - x.pendingEvents) || (x.entityId < y.entityId ? -1 : x.entityId > y.entityId ? 1 : 0));\n }\n\n /**\n * Execute pending maintenance (spec §6.2): fair-share rounds of at most one\n * unit per entity (librarian batch, else heal batch, else reembed), entities\n * ordered by `getPending` (pendingEvents desc, id asc). Holds the same\n * per-entity `JobManager` locks a manual run would; a busy entity is skipped\n * and reported, never thrown. Nothing is still running when this resolves.\n *\n * Stop precedence (spec §10 items 3-6): `deadline` > `budget_exhausted` >\n * `budget_too_small` > `complete`. `budget_too_small` means a job's smallest\n * unit needs more than the WHOLE budget — that job is skipped this run and\n * the run continues; `budget_exhausted` means a unit needs more than what\n * REMAINS — the run stops. The token budget meters `generateText` calls\n * only; embeddings are never metered.\n */\n async run(opts: RunPendingMaintenanceOptions = {}): Promise<RunPendingMaintenanceResult> {\n if (\n opts.deadlineMs !== undefined &&\n (typeof opts.deadlineMs !== 'number' || !Number.isFinite(opts.deadlineMs) || opts.deadlineMs < 0)\n ) {\n throw new TypeError('deadlineMs must be a finite number >= 0');\n }\n const meter = new UsageMeter(opts.tokenBudget);\n const budget = opts.tokenBudget;\n const deadline = opts.deadlineMs !== undefined ? Date.now() + Math.max(0, opts.deadlineMs) : Infinity;\n const jobs = new Set<MaintenanceJob>(opts.jobs ?? ['librarian', 'heal', 'reembed']);\n const pending = await this.getPending(opts.entityIds);\n\n type State = { p: PendingMaintenance; report: EntityMaintenanceReport; librarian: boolean; heal: boolean; reembed: boolean };\n const states: State[] = pending.map((p) => ({\n p,\n report: { entityId: p.entityId, librarianPasses: 0, factsWritten: 0, healPasses: 0, reembedded: false },\n librarian: jobs.has('librarian') && p.pendingEvents > 0,\n heal: jobs.has('heal') && p.healDue,\n reembed: jobs.has('reembed') && p.reembedPending,\n }));\n\n let stopped: MaintenanceStopReason = { reason: 'complete' };\n let tooSmall: MaintenanceStopReason | null = null;\n const classify = (job: 'librarian' | 'heal', entityId: string, requiredEstimate: number): 'too_small' | 'exhausted' => {\n if (budget !== undefined && requiredEstimate > budget) {\n tooSmall ??= { reason: 'budget_too_small', job, entityId, requiredEstimate };\n return 'too_small';\n }\n return 'exhausted';\n };\n // A unit that ends with the meter exhausted made real awaited LLM calls,\n // so the deadline may have lapsed mid-unit too. Precedence is deadline\n // first (spec §10): the caller must be told to retry as-is, not to raise\n // the budget. Re-checked here because the between-units deadline check\n // only runs before a unit starts, never after one ends.\n const exhaustedStop = (): MaintenanceStopReason =>\n Date.now() >= deadline ? { reason: 'deadline' } : { reason: 'budget_exhausted' };\n const markBusy = (st: State, job: MaintenanceJob) => { (st.report.busy ??= []).push(job); };\n const markSearchUnavailable = (st: State, job: MaintenanceJob) => { (st.report.searchUnavailable ??= []).push(job); };\n\n // Open job flags across all entities. Flags only ever clear, so a round\n // that clears one (a skip: busy, outage, too small, nothing processed)\n // counts as progress — it must re-run so the entity reaches its later\n // jobs — and the loop still terminates.\n const openJobs = () => states.reduce((n, s) => n + +s.librarian + +s.heal + +s.reembed, 0);\n\n rounds: for (;;) {\n let progressed = false;\n const openAtStart = openJobs();\n for (const st of states) {\n if (!st.librarian && !st.heal && !st.reembed) continue;\n if (Date.now() >= deadline) { stopped = { reason: 'deadline' }; break rounds; }\n const entityId = st.p.entityId;\n\n if (st.librarian) {\n if (this.jobManager.isBlocked('librarian', entityId)) { st.librarian = false; markBusy(st, 'librarian'); continue; }\n this.jobManager.acquireLock('librarian', entityId);\n let r: LibrarianResult;\n try {\n r = await this.maintenanceService.runLibrarianPass({ entityId, trigger: 'call', meter });\n } catch (err) {\n // Keyword outage: this entity's pass aborted with its watermark kept.\n // Skip it for this run rather than failing every other entity's work.\n if (!isWikiSearchUnavailableError(err)) throw err;\n st.librarian = false;\n markSearchUnavailable(st, 'librarian');\n continue;\n } finally {\n this.jobManager.releaseLock('librarian', entityId);\n }\n if (r.budgetStop) {\n if (classify('librarian', entityId, r.budgetStop.requiredEstimate) === 'exhausted') { stopped = exhaustedStop(); break rounds; }\n st.librarian = false;\n continue;\n }\n if (!r.processedThrough) { st.librarian = false; continue; }\n st.report.librarianPasses++;\n st.report.factsWritten += r.factsWritten;\n progressed = true;\n const wm = await this.metadataRepo.getLibrarianWatermark(entityId, this.db);\n if ((await this.eventRepo.countAfter(entityId, wm)) === 0) st.librarian = false;\n continue;\n }\n\n if (st.heal) {\n if (this.jobManager.isBlocked('heal', entityId)) { st.heal = false; markBusy(st, 'heal'); continue; }\n this.jobManager.acquireLock('heal', entityId);\n let h: HealResult;\n try {\n h = await this.maintenanceService.doRunHeal(entityId, { trigger: 'call', meter });\n } finally {\n this.jobManager.releaseLock('heal', entityId);\n }\n // Defense against future doRunHeal changes: scanned === 0 means the\n // pass bailed before any LLM call, so budgetStop cannot arise there\n // today — but if it ever did, classify it instead of mislabeling a\n // never-started job as exhausted.\n if (h.budgetStop && h.scanned === 0) {\n if (classify('heal', entityId, h.budgetStop.requiredEstimate) === 'exhausted') { stopped = exhaustedStop(); break rounds; }\n st.heal = false;\n continue;\n }\n // Nothing scanned yet candidates remain (e.g. a keyword outage skipped\n // the LLM pass): another round cannot progress, so stop healing this\n // entity for this run instead of looping forever.\n if (h.scanned === 0 && h.remaining > 0) {\n st.heal = false;\n if (h.searchUnavailable) markSearchUnavailable(st, 'heal');\n continue;\n }\n st.report.healPasses++;\n progressed = true;\n if (h.remaining === 0) {\n st.heal = false;\n await this.metadataRepo.updateCheckpoint(entityId, { heal: await this.eventRepo.count(entityId) }, this.db);\n }\n if (h.budgetStop) { stopped = exhaustedStop(); break rounds; }\n continue;\n }\n\n if (st.reembed) {\n st.reembed = false;\n try {\n await this.maintenanceService.runReembed(entityId);\n st.report.reembedded = true;\n progressed = true;\n } catch (err) {\n if (err instanceof WikiBusyError) markBusy(st, 'reembed');\n else throw err;\n }\n }\n }\n if (!progressed && openJobs() === openAtStart) break;\n }\n\n if (stopped.reason === 'complete' && tooSmall) stopped = tooSmall;\n return {\n perEntity: states.map((s) => s.report),\n tokensUsed: meter.used,\n estimated: meter.estimated,\n remaining: budget === undefined ? null : meter.remaining,\n stoppedReason: stopped,\n };\n }\n}\n","import type { OntologyMode } from '../types';\n\nconst FACT_ONTOLOGY_FIELDS = `\nEach fact may optionally include:\n- \"okf_type\": string — must be one of the node_types in the manifest\n- \"edges\": [{ \"edge_type\": string, \"target_title\": string }] — target_title must match another fact's title in this response or existing memory\n- An edge_type may appear in the manifest multiple times with different source_type/target_type; use the row whose types match your fact and target.`;\n\nconst EMERGENT_EXTRA = `\nYou may also return \"ontology_updates\" to propose new types:\n\"ontology_updates\": {\n \"node_types\": [{ \"type\": \"slug\", \"description\": \"...\", \"parent_type\": \"optional existing slug\" }],\n \"edge_types\": [{ \"type\": \"slug\", \"source_type\": \"...\", \"target_type\": \"...\", \"description\": \"...\" }]\n}\nOnly propose types not already in the manifest. Do not redefine existing types.`;\n\nexport function buildOntologyPromptAppendix(\n mode: OntologyMode,\n manifestJson: string,\n): { ontologyManifest: string; ontologyModeInstructions: string } {\n const strictRules = mode === 'strict'\n ? 'STRICT MODE: Use ONLY types defined in the manifest. If a fact does not fit any node_type, omit okf_type and edges entirely.'\n : 'EMERGENT MODE: Prefer manifest types. You may propose new types via ontology_updates when necessary.';\n\n const fallback = 'If okf_type or an edge is invalid, omit them rather than inventing unlisted types.';\n\n const ontologyModeInstructions = [\n '## Ontology constraints',\n strictRules,\n fallback,\n FACT_ONTOLOGY_FIELDS,\n mode === 'emergent' ? EMERGENT_EXTRA : '',\n 'Manifest:',\n manifestJson,\n ].filter(Boolean).join('\\n');\n\n return { ontologyManifest: manifestJson, ontologyModeInstructions };\n}\n","import type {\n OntologyConfig,\n OntologyManifest,\n OntologyMode,\n OntologyPromptContext,\n OntologyUpdates,\n ExtractedFactWithOntology,\n ExtractedFactEdge,\n SQLiteAdapter,\n WikiEdge,\n} from '../types';\nimport { WikiStrictOntologyViolation } from '../types';\nimport type { MetadataRepository } from '../repositories/MetadataRepository';\nimport type { EdgeRepository } from '../repositories/EdgeRepository';\nimport { buildOntologyPromptAppendix } from '../prompts/ontology';\nimport {\n emptyManifest,\n normalizeTitleKey,\n resolveNodeType,\n resolveEdgeDefinitions,\n typeSatisfies,\n validateInlineEdges,\n validateManifest,\n type EdgeDrop,\n} from '../utils/ontology';\nimport { generateId } from '../utils/ids';\n\nexport type TitleIndexEntry = { id: string; okf_type: string | null };\n\n/**\n * Coordinates ontology mode resolution, manifest caching, LLM output validation, and edge persistence.\n * Cache is per WikiMemory instance (single-process); not shared across instances.\n */\nexport class OntologyService {\n private cache = new Map<string, { mode: OntologyMode; manifest: OntologyManifest }>();\n\n constructor(\n private metadataRepo: MetadataRepository,\n private edgeRepo: EdgeRepository,\n private ontologyConfig?: OntologyConfig,\n ) {}\n\n resolveMode(storedMode?: OntologyMode): OntologyMode {\n return storedMode ?? this.ontologyConfig?.mode ?? 'off';\n }\n\n invalidateCache(entityId: string): void {\n this.cache.delete(entityId);\n }\n\n async getEffectiveState(entityId: string, tx?: SQLiteAdapter): Promise<{\n mode: OntologyMode;\n manifest: OntologyManifest;\n }> {\n if (!tx) {\n const cached = this.cache.get(entityId);\n if (cached) return cached;\n }\n\n const row = await this.metadataRepo.getManifest(entityId, tx);\n if (row) {\n const state = { mode: this.resolveMode(row.mode), manifest: row.manifest };\n if (!tx) this.cache.set(entityId, state);\n return state;\n }\n\n const seed = this.ontologyConfig?.seedManifests?.[entityId];\n if (seed) {\n // D11: the tx branch validates via setManifest; the cache branch did not.\n validateManifest(seed.manifest);\n const state = {\n mode: this.resolveMode(seed.mode),\n manifest: seed.manifest,\n };\n if (tx) {\n await this.metadataRepo.setManifest(entityId, state, tx);\n } else {\n this.cache.set(entityId, state);\n }\n return state;\n }\n\n return { mode: 'off', manifest: emptyManifest() };\n }\n\n async buildPromptContext(entityId: string): Promise<OntologyPromptContext | null> {\n const { mode, manifest } = await this.getEffectiveState(entityId);\n if (mode === 'off') return null;\n const manifestJson = JSON.stringify(manifest, null, 2);\n return buildOntologyPromptAppendix(mode, manifestJson);\n }\n\n async mergeEmergentUpdates(\n entityId: string,\n updates: OntologyUpdates,\n tx: SQLiteAdapter,\n ): Promise<OntologyManifest> {\n const merged = await this.metadataRepo.mergeManifestUpdates(entityId, updates, tx);\n this.invalidateCache(entityId);\n return merged;\n }\n\n validateAndNormalizeFact(\n fact: ExtractedFactWithOntology,\n manifest: OntologyManifest,\n opts?: { strict?: boolean; entityId?: string; drops?: EdgeDrop[] },\n ): { okf_type: string | null; edges: ExtractedFactEdge[] } {\n const rawType = typeof fact.okf_type === 'string' ? fact.okf_type : '';\n const strict = opts?.strict === true;\n const canonical = resolveNodeType(rawType, manifest);\n if (!canonical) {\n if (strict) throw new WikiStrictOntologyViolation(opts?.entityId ?? '', 'node', rawType);\n if (opts?.drops && Array.isArray(fact.edges)) {\n for (const edge of fact.edges) {\n opts.drops.push({\n reason: 'no_source_type',\n sourceId: null,\n edgeType: typeof edge?.edge_type === 'string' ? edge.edge_type : null,\n sourceNodeType: null,\n targetNodeType: null,\n });\n }\n }\n return { okf_type: null, edges: [] };\n }\n const edges = validateInlineEdges(canonical, null, fact.edges ?? [], manifest, opts);\n return { okf_type: canonical, edges };\n }\n\n /**\n * Pure resolver: given a source type, LLM-supplied edges, the manifest,\n * and a title index, return a list of concrete `WikiEdge` objects ready\n * for persistence. Performs no DB writes. Used by callers that batch edge\n * writes inside their own transaction (e.g. `IngestionService.ingestDocument`\n * when delegating to `upsertGraphCore`).\n */\n resolveEdges(\n entityId: string,\n sourceId: string,\n sourceType: string | null,\n edges: ExtractedFactEdge[],\n manifest: OntologyManifest,\n titleIndex: Map<string, TitleIndexEntry>,\n now: number,\n drops?: EdgeDrop[],\n ): WikiEdge[] {\n if (edges.length === 0) return [];\n if (!sourceType) {\n for (const edge of edges) {\n drops?.push({ reason: 'no_source_type', sourceId, edgeType: edge.edge_type, sourceNodeType: null, targetNodeType: null });\n }\n return [];\n }\n const out: WikiEdge[] = [];\n for (const edge of edges) {\n const candidates = resolveEdgeDefinitions(edge.edge_type, manifest)\n .filter(d => typeSatisfies(d.source_type, sourceType, manifest));\n if (candidates.length === 0) {\n drops?.push({ reason: 'type_not_in_manifest', sourceId, edgeType: edge.edge_type, sourceNodeType: sourceType, targetNodeType: null });\n continue;\n }\n\n const targetKey = normalizeTitleKey(edge.target_title);\n const target = titleIndex.get(targetKey);\n if (!target) {\n drops?.push({ reason: 'target_not_found', sourceId, edgeType: edge.edge_type, sourceNodeType: sourceType, targetNodeType: null });\n continue;\n }\n\n const targetType = (target.okf_type ?? '').trim().toLowerCase();\n const def = candidates.find(d => d.target_type.trim().toLowerCase() === targetType)\n ?? candidates.find(d => typeSatisfies(d.target_type, targetType, manifest));\n if (!def) {\n drops?.push({\n reason: 'target_type_mismatch', sourceId, edgeType: edge.edge_type,\n sourceNodeType: sourceType, targetNodeType: target.okf_type ?? null,\n });\n continue;\n }\n\n out.push({\n id: generateId(),\n entity_id: entityId,\n source_id: sourceId,\n target_id: target.id,\n edge_type: def.type,\n created_at: now,\n });\n }\n return out;\n }\n\n /**\n * Backwards-compatible wrapper: resolves edges via {@link resolveEdges},\n * then persists each via `edgeRepo.addIgnoreDuplicate` in the supplied\n * transaction. Returns the number of edges persisted. Used by paths that\n * want self-contained edge persistence (e.g. MaintenanceService heal /\n * backfill callers that do not have a separate edge-write step).\n */\n async resolveAndPersistEdges(\n entityId: string,\n sourceId: string,\n sourceType: string | null,\n edges: ExtractedFactEdge[],\n manifest: OntologyManifest,\n titleIndex: Map<string, TitleIndexEntry>,\n tx: SQLiteAdapter,\n now: number,\n drops?: EdgeDrop[],\n ): Promise<number> {\n const resolved = this.resolveEdges(entityId, sourceId, sourceType, edges, manifest, titleIndex, now, drops);\n let persisted = 0;\n for (const edge of resolved) {\n const inserted = await this.edgeRepo.addIgnoreDuplicate(edge, tx);\n if (inserted) persisted++;\n }\n return persisted;\n }\n}\n","import type { EdgeRepository, NeighborhoodQueryOptions } from '../repositories/EdgeRepository';\nimport type { EntryRepository } from '../repositories/EntryRepository';\nimport type { GraphTraversalOptions, GraphNeighborhood, WikiConfig } from '../types';\nimport { WikiInvalidReadOptions } from '../types';\nimport { isLiveAt } from '../utils/temporal';\nimport { packFactsByBudget, factTokenCost } from '../utils/budget';\n\n/**\n * Pure orchestrator — no SQL. Merges WikiConfig defaults with per-call options,\n * delegates the recursive walk to EdgeRepository, then hydrates node IDs into facts.\n */\nexport class GraphTraversalService {\n constructor(\n private edgeRepo: EdgeRepository,\n private entryRepo: EntryRepository,\n private config: WikiConfig,\n ) {}\n\n async traverseGraph(entityId: string, options: GraphTraversalOptions): Promise<GraphNeighborhood> {\n const fallbackMaxNodes = 20;\n const rawConfigDefault = this.config.maxTraversalNodes ?? fallbackMaxNodes;\n const defaultMaxNodes =\n Number.isFinite(rawConfigDefault) && rawConfigDefault >= 1\n ? Math.floor(rawConfigDefault)\n : fallbackMaxNodes;\n const rawMaxNodes = options.maxTraversalNodes ?? defaultMaxNodes;\n const maxNodes =\n Number.isFinite(rawMaxNodes) && rawMaxNodes >= 1 ? Math.floor(rawMaxNodes) : defaultMaxNodes;\n\n const rawAsOf = options.asOf;\n if (rawAsOf !== undefined && !(typeof rawAsOf === 'number' && Number.isFinite(rawAsOf) && rawAsOf >= 0)) {\n throw new WikiInvalidReadOptions('asOf', 'must be a finite epoch-ms number >= 0');\n }\n const rawTokenBudget = options.tokenBudget;\n if (rawTokenBudget !== undefined && !(typeof rawTokenBudget === 'number' && Number.isFinite(rawTokenBudget) && rawTokenBudget >= 0)) {\n throw new WikiInvalidReadOptions('tokenBudget', 'must be a finite number >= 0');\n }\n const live = rawAsOf === undefined\n ? { mode: 'current' as const, t: Date.now() }\n : { mode: 'asOf' as const, t: Math.trunc(rawAsOf) };\n\n const opts: NeighborhoodQueryOptions = {\n maxDepth: Math.max(1, Math.min(options.maxDepth ?? 1, 3)),\n direction: options.direction ?? this.config.traversalDirection ?? 'both',\n edgeTypes: options.edgeTypes,\n minConfidence: options.minTraversalConfidence ?? this.config.minTraversalConfidence ?? 'tentative',\n excludeSourceTypes: options.excludeSourceTypes ?? this.config.excludeSourceTypes ?? [],\n excludeDrafts: options.excludeDrafts ?? this.config.excludeDrafts ?? false,\n live,\n maxNodes,\n };\n\n const { nodeIds, edges } = await this.edgeRepo.getNeighborhood(entityId, options.sourceId, opts);\n if (nodeIds.length === 0) return { nodes: [], edges: [] };\n\n // Spec §10.7: a non-live anchor returns alone — both endpoints of a\n // walkable edge must be live at the query instant.\n const [anchor] = await this.entryRepo.findByIds([options.sourceId], [entityId]);\n if (anchor && !isLiveAt(anchor, live.mode, live.t)) return { nodes: [anchor], edges: [] };\n\n // findByIds() returns facts in input-ID order (Map-based lookup,\n // see packages/core/src/repositories/EntryRepository.ts:104-108) — no re-sort needed.\n const nodes = await this.entryRepo.findByIds(nodeIds, [entityId]);\n const hydratedIds = new Set(nodes.map((node) => node.id));\n const filteredEdges = edges.filter(\n (edge) => hydratedIds.has(edge.source_id) && hydratedIds.has(edge.target_id),\n );\n if (options.tokenBudget === undefined) return { nodes, edges: filteredEdges };\n const budget = Math.trunc(options.tokenBudget);\n const [anchorPacked] = packFactsByBudget([nodes[0]], budget).items;\n const kept = [anchorPacked];\n let used = factTokenCost(anchorPacked);\n for (const node of nodes.slice(1)) {\n const cost = factTokenCost(node);\n if (used + cost <= budget) { kept.push(node); used += cost; }\n }\n const keptIds = new Set(kept.map((n) => n.id));\n return { nodes: kept, edges: filteredEdges.filter((e) => keptIds.has(e.source_id) && keptIds.has(e.target_id)) };\n }\n}\n","import { BaseRepository } from './BaseRepository';\n\n/** Read-only queries for `lint` (spec §8.1). Every statement is entity-scoped. */\nexport class LintRepository extends BaseRepository {\n async countFactHealth(entityId: string): Promise<{ untypedFacts: number; drafts: number; unverifiedInferred: number }> {\n const row = await this.db.getFirstAsync<{ untyped: number | null; drafts: number | null; unverified: number | null }>(\n `SELECT\n SUM(CASE WHEN okf_type IS NULL THEN 1 ELSE 0 END) AS untyped,\n SUM(CASE WHEN lifecycle_status = 'draft' THEN 1 ELSE 0 END) AS drafts,\n SUM(CASE WHEN source_type = 'librarian_inferred'\n AND COALESCE(json_array_length(CASE WHEN json_valid(okf_verified) THEN okf_verified END), 0) = 0\n THEN 1 ELSE 0 END) AS unverified\n FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL`,\n [entityId],\n );\n return {\n untypedFacts: Number(row?.untyped ?? 0),\n drafts: Number(row?.drafts ?? 0),\n unverifiedInferred: Number(row?.unverified ?? 0),\n };\n }\n\n private danglingWhere(): string {\n const live = (col: string) =>\n `EXISTS (SELECT 1 FROM ${this.prefix}entries n WHERE n.id = e.${col} AND n.entity_id = e.entity_id AND n.deleted_at IS NULL)`;\n return `e.entity_id = ? AND (NOT ${live('source_id')} OR NOT ${live('target_id')})`;\n }\n\n async countDanglingEdges(entityId: string): Promise<number> {\n const row = await this.db.getFirstAsync<{ n: number }>(\n `SELECT COUNT(*) AS n FROM ${this.prefix}edges e WHERE ${this.danglingWhere()}`,\n [entityId],\n );\n return Number(row?.n ?? 0);\n }\n\n async sampleDanglingEdgeIds(entityId: string, limit: number): Promise<string[]> {\n const rows = await this.db.getAllAsync<{ id: string }>(\n `SELECT e.id FROM ${this.prefix}edges e WHERE ${this.danglingWhere()} ORDER BY e.id ASC LIMIT ?`,\n [entityId, limit],\n );\n return rows.map((r) => r.id);\n }\n\n /** Keyset page of edges whose endpoints are both live in this entity, with endpoint types. */\n async pageLiveEdges(\n entityId: string,\n afterId: string,\n limit: number,\n ): Promise<Array<{ id: string; edge_type: string; source_type: string | null; target_type: string | null }>> {\n return this.db.getAllAsync(\n `SELECT e.id, e.edge_type, s.okf_type AS source_type, t.okf_type AS target_type\n FROM ${this.prefix}edges e\n JOIN ${this.prefix}entries s ON s.id = e.source_id AND s.entity_id = e.entity_id AND s.deleted_at IS NULL\n JOIN ${this.prefix}entries t ON t.id = e.target_id AND t.entity_id = e.entity_id AND t.deleted_at IS NULL\n WHERE e.entity_id = ? AND e.id > ?\n ORDER BY e.id ASC\n LIMIT ?`,\n [entityId, afterId, limit],\n );\n }\n}\n","import type { WikiLintReport } from '../types';\nimport type { LintRepository } from '../repositories/LintRepository';\nimport type { OntologyService } from './OntologyService';\nimport { edgeTripleAllowed } from '../utils/ontology';\n\nconst LINT_SAMPLE_SIZE = 20;\nconst LINT_PAGE_SIZE = 500;\n\nexport class LintService {\n constructor(private lintRepo: LintRepository, private ontologyService: OntologyService) {}\n\n /**\n * Read-only (spec §8.1). Manifest violations stream the entity's live-endpoint\n * edges in keyset pages and check each triple in JS against the effective\n * manifest. `getEffectiveState` is called without a transaction, so a seed\n * manifest is cached, never persisted. Counts come from separate statements,\n * not one snapshot.\n */\n async lint(entityId: string): Promise<WikiLintReport> {\n const health = await this.lintRepo.countFactHealth(entityId);\n const danglingEdges = await this.lintRepo.countDanglingEdges(entityId);\n const danglingEdgeIds = danglingEdges > 0 ? await this.lintRepo.sampleDanglingEdgeIds(entityId, LINT_SAMPLE_SIZE) : [];\n\n const { mode, manifest } = await this.ontologyService.getEffectiveState(entityId);\n const constrained = mode !== 'off'\n && ((manifest.node_types?.length ?? 0) > 0 || (manifest.edge_types?.length ?? 0) > 0);\n let manifestViolations = 0;\n const manifestViolationEdgeIds: string[] = [];\n if (constrained) {\n let after = '';\n for (;;) {\n const page = await this.lintRepo.pageLiveEdges(entityId, after, LINT_PAGE_SIZE);\n for (const e of page) {\n if (!edgeTripleAllowed(manifest, e.edge_type, e.source_type ?? '', e.target_type ?? '')) {\n manifestViolations++;\n if (manifestViolationEdgeIds.length < LINT_SAMPLE_SIZE) manifestViolationEdgeIds.push(e.id);\n }\n }\n if (page.length < LINT_PAGE_SIZE) break;\n after = page[page.length - 1].id;\n }\n }\n\n return {\n danglingEdges,\n manifestViolations,\n ...health,\n sample: { danglingEdgeIds, manifestViolationEdgeIds },\n };\n }\n}\n","import type { SQLiteAdapter } from '../types';\nimport {\n formatSourcesJson,\n formatVerifiedJson,\n latestVerified,\n} from '@equationalapplications/core-okf';\n\nexport type OkfSource = {\n id?: string;\n resource: string;\n title?: string;\n author?: string;\n usage_count?: number;\n last_modified?: string;\n usage_window?: { from: string; to: string };\n};\nexport type OkfVerifiedEntry = { by: string; at: string };\n\n/**\n * DAO discipline (spec §8): only knowledge-content writes may bump `updated_at`.\n * Trust / provenance / lifecycle / freshness writes MUST NOT touch it. Every\n * `UPDATE` in this class is a non-content metadata write. Tests in\n * `__tests__/daoDiscipline.test.ts` and `__tests__/okfTrustWrites.test.ts`\n * snapshot the SQL via a logging adapter and assert the SET clause omits\n * `updated_at`.\n *\n * Deliberately does NOT push an outbox event, unlike `EntryRepository.upsert`\n * / `TaskRepository.upsert` (spec §8 \"Outbox/transaction scope\" note): outbox\n * delivery exists for *content* sync, and these writes are metadata, not\n * content, by the same reasoning that exempts them from `updated_at`. A\n * downstream sync consumer will not learn about a new verifier until the\n * next full re-export/re-import — accepted for v0.2.\n */\nexport class OkfTrustWritesRepository {\n constructor(private db: SQLiteAdapter, private prefix: string) {}\n\n private getExecutor(tx?: SQLiteAdapter): SQLiteAdapter {\n return tx ?? this.db;\n }\n\n /**\n * Append one or more verification events to a fact's `okf_verified` JSON\n * array, atomically, in a single SQL statement.\n *\n * The implementation uses json_each over the existing array UNION ALL'd\n * with json_each over the new events wrapped in json_group_array — a single\n * UPDATE expression. SQLite serializes this against concurrent writers on\n * the same row, so two callers appending simultaneously cannot lose each\n * other's events (the previous implementation serialized only the supplied\n * array and overwrote, dropping any pre-existing history).\n *\n * Sets the `last_verified_*` convenience columns from the latest event in\n * the union (computed in code; see {@link latestVerified}).\n */\n async writeOkfTrust(\n entryId: string,\n entityId: string,\n verified: OkfVerifiedEntry[],\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n if (verified.length === 0) return;\n const latest = latestVerified(verified, Date.now());\n const newEventsJson = JSON.stringify(verified);\n await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET okf_verified = COALESCE(\n (SELECT json_group_array(json_object('by', s.by_val, 'at', s.at_val))\n FROM (\n SELECT json_extract(value, '$.by') AS by_val,\n json_extract(value, '$.at') AS at_val\n FROM json_each(okf_verified)\n UNION ALL\n SELECT json_extract(value, '$.by'),\n json_extract(value, '$.at')\n FROM json_each(?)\n ) AS s\n ORDER BY s.at_val),\n '[]'\n ),\n last_verified_by = ?,\n last_verified_at = ?\n WHERE id = ? AND entity_id = ?`,\n [newEventsJson, latest?.by ?? null, latest?.at ?? null, entryId, entityId],\n );\n }\n\n /** Replace the `sources` list (provenance). */\n async writeOkfSources(\n entryId: string,\n entityId: string,\n sources: OkfSource[],\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n const json = formatSourcesJson(sources);\n await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET okf_sources = ?\n WHERE id = ? AND entity_id = ?`,\n [json, entryId, entityId],\n );\n }\n\n /** Set the OKF v0.2 lifecycle status. */\n async setLifecycleStatus(\n entryId: string,\n entityId: string,\n status: 'draft' | 'stable' | 'deprecated',\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET lifecycle_status = ?\n WHERE id = ? AND entity_id = ?`,\n [status, entryId, entityId],\n );\n }\n\n /** Set the absolute cutoff (epoch ms) for staleness, or NULL to clear. */\n async setStaleAfter(\n entryId: string,\n entityId: string,\n date: number | null,\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET stale_after = ?\n WHERE id = ? AND entity_id = ?`,\n [date, entryId, entityId],\n );\n }\n\n /** Set the producer / verifier actor string. Rare. */\n async setGeneratedBy(\n entryId: string,\n entityId: string,\n actor: string,\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `UPDATE ${this.prefix}entries\n SET generated_by = ?\n WHERE id = ? AND entity_id = ?`,\n [actor, entryId, entityId],\n );\n }\n\n // The same five methods exist for tasks, with `tasks` instead of `entries`.\n // Tasks are symmetric per spec §2.5.\n\n /** Atomic append, task variant — mirrors {@link writeOkfTrust}. */\n async writeOkfTrustTask(\n taskId: string,\n entityId: string,\n verified: OkfVerifiedEntry[],\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n if (verified.length === 0) return;\n const latest = latestVerified(verified, Date.now());\n const newEventsJson = JSON.stringify(verified);\n await executor.runAsync(\n `UPDATE ${this.prefix}tasks\n SET okf_verified = COALESCE(\n (SELECT json_group_array(json_object('by', s.by_val, 'at', s.at_val))\n FROM (\n SELECT json_extract(value, '$.by') AS by_val,\n json_extract(value, '$.at') AS at_val\n FROM json_each(okf_verified)\n UNION ALL\n SELECT json_extract(value, '$.by'),\n json_extract(value, '$.at')\n FROM json_each(?)\n ) AS s\n ORDER BY s.at_val),\n '[]'\n ),\n last_verified_by = ?,\n last_verified_at = ?\n WHERE id = ? AND entity_id = ?`,\n [newEventsJson, latest?.by ?? null, latest?.at ?? null, taskId, entityId],\n );\n }\n\n async writeOkfSourcesTask(\n taskId: string,\n entityId: string,\n sources: OkfSource[],\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n const json = formatSourcesJson(sources);\n await executor.runAsync(\n `UPDATE ${this.prefix}tasks\n SET okf_sources = ?\n WHERE id = ? AND entity_id = ?`,\n [json, taskId, entityId],\n );\n }\n\n async setLifecycleStatusTask(\n taskId: string,\n entityId: string,\n status: 'draft' | 'stable' | 'deprecated',\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `UPDATE ${this.prefix}tasks\n SET lifecycle_status = ?\n WHERE id = ? AND entity_id = ?`,\n [status, taskId, entityId],\n );\n }\n\n async setStaleAfterTask(\n taskId: string,\n entityId: string,\n date: number | null,\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `UPDATE ${this.prefix}tasks\n SET stale_after = ?\n WHERE id = ? AND entity_id = ?`,\n [date, taskId, entityId],\n );\n }\n\n async setGeneratedByTask(\n taskId: string,\n entityId: string,\n actor: string,\n tx?: SQLiteAdapter,\n ): Promise<void> {\n const executor = this.getExecutor(tx);\n await executor.runAsync(\n `UPDATE ${this.prefix}tasks\n SET generated_by = ?\n WHERE id = ? AND entity_id = ?`,\n [actor, taskId, entityId],\n );\n }\n}\n","import type { RememberInput, WikiFact } from '../types';\nimport { assertEntityId } from './entityId';\nimport { generateId } from './ids';\nimport { assertEpochMs } from './temporal';\n\nconst CONFIDENCE_VALUES: ReadonlySet<string> = new Set(['certain', 'inferred', 'tentative']);\nconst SOURCE_TYPE_VALUES: ReadonlySet<string> = new Set(['user_stated', 'user_confirmed']);\n\nexport interface NormalizedRememberInput {\n /** The row to upsert. `okf_type` is null here; RememberService resolves `okfType` against the manifest. */\n fact: WikiFact;\n /** Truncated epoch ms, or undefined when the caller gave none. */\n validFrom?: number;\n /** The caller's raw type slug, or null. */\n okfType: string | null;\n}\n\n/**\n * Every validation rule of remember() (spec §3.2), with no I/O. Throws\n * TypeError; never clips or coerces. `now` is injected so tests are stable.\n */\nexport function normalizeRememberInput(entityId: string, input: RememberInput, now: number): NormalizedRememberInput {\n assertEntityId(entityId);\n if (input === null || typeof input !== 'object' || Array.isArray(input)) {\n throw new TypeError('remember(): input must be a non-null object.');\n }\n if (typeof input.title !== 'string' || input.title.trim() === '') {\n throw new TypeError('remember(): input.title must be a non-empty string.');\n }\n if (typeof input.body !== 'string') {\n throw new TypeError('remember(): input.body must be a string.');\n }\n let tags: string[] = [];\n if (input.tags !== undefined) {\n if (!Array.isArray(input.tags)) {\n throw new TypeError('remember(): input.tags must be an array of strings.');\n }\n // Index-based loop on purpose: Array.prototype.every skips holes, so a\n // sparse array (e.g. new Array(2)) would otherwise pass validation.\n for (let i = 0; i < input.tags.length; i++) {\n if (typeof input.tags[i] !== 'string') {\n throw new TypeError('remember(): input.tags must be an array of strings.');\n }\n }\n tags = [...(input.tags as string[])];\n }\n // null is a supplied value, not absence (spec §3.2: nothing coerced silently);\n // it fails the Set check below with the same message as any other bad value.\n const confidence = input.confidence === undefined ? 'certain' : input.confidence;\n if (!CONFIDENCE_VALUES.has(confidence)) {\n throw new TypeError(`remember(): input.confidence must be certain | inferred | tentative; got ${JSON.stringify(input.confidence)}.`);\n }\n const sourceType = input.source_type === undefined ? 'user_stated' : input.source_type;\n if (!SOURCE_TYPE_VALUES.has(sourceType)) {\n throw new TypeError(`remember(): input.source_type must be user_stated | user_confirmed; got ${JSON.stringify(input.source_type)}.`);\n }\n let okfType: string | null = null;\n if (input.okf_type !== undefined && input.okf_type !== null) {\n if (typeof input.okf_type !== 'string' || input.okf_type.trim() === '') {\n throw new TypeError('remember(): input.okf_type must be a non-empty string or null.');\n }\n okfType = input.okf_type;\n }\n const validFrom = input.valid_from === undefined ? undefined : assertEpochMs('input.valid_from', input.valid_from);\n\n const fact: WikiFact = {\n id: generateId('fact_'),\n entity_id: entityId,\n title: input.title,\n body: input.body,\n tags,\n confidence,\n source_type: sourceType,\n source_hash: null,\n source_ref: null,\n created_at: now,\n updated_at: now,\n last_accessed_at: null,\n access_count: 0,\n deleted_at: null,\n okf_type: null,\n };\n return { fact, validFrom, okfType };\n}\n","import type { SQLiteAdapter, WikiFact, RememberInput, ExtractedFactWithOntology } from '../types';\nimport type { EntryRepository } from '../repositories/EntryRepository';\nimport type { OntologyService } from './OntologyService';\nimport type { SearchService } from './SearchService';\nimport type { EmbeddingService } from './EmbeddingService';\nimport { normalizeRememberInput } from '../utils/rememberInput';\n\n/** Direct mutable-fact writes (spec `specs/core-remember/spec.md` §3.3–§3.6). */\nexport class RememberService {\n constructor(\n private db: SQLiteAdapter,\n private entryRepo: EntryRepository,\n private ontologyService: OntologyService,\n private searchService: SearchService,\n private embeddingService: EmbeddingService,\n ) {}\n\n async remember(entityId: string, input: RememberInput): Promise<WikiFact> {\n const now = Date.now();\n const { fact, validFrom, okfType } = normalizeRememberInput(entityId, input, now);\n let stored: WikiFact | undefined;\n\n await this.db.withTransactionAsync(async (tx) => {\n if (okfType !== null) {\n // Same rule as an upsertGraph node type (IngestionService.upsertGraphCore):\n // canonical slug when the manifest knows it, a throw under strict, null otherwise.\n const { mode, manifest } = await this.ontologyService.getEffectiveState(entityId, tx);\n const factLike = { okf_type: okfType, edges: [] } as unknown as ExtractedFactWithOntology;\n fact.okf_type = this.ontologyService.validateAndNormalizeFact(factLike, manifest, {\n strict: mode === 'strict',\n entityId,\n }).okf_type;\n }\n await this.entryRepo.upsert(fact, tx);\n if (validFrom !== undefined) {\n await this.entryRepo.setTemporal(fact.id, entityId, { valid_from: validFrom }, tx);\n }\n // The return value is the stored row, not the literal: defaults the INSERT\n // bound and the read-time isStale / trustTier come from the mapper.\n const [readBack] = await this.entryRepo.findByIds([fact.id], [entityId], tx);\n if (!readBack) {\n throw new Error('remember(): the stored fact could not be read back; the SQLiteAdapter did not perform the write');\n }\n stored = readBack;\n });\n\n await this.searchService.syncEntries(entityId, [fact.id]);\n await this.embeddingService.embedFact(\n { id: fact.id, entity_id: entityId, title: fact.title, body: fact.body, tags: fact.tags },\n { operation: 'remember', trigger: 'call' },\n );\n this.searchService.evictCache(entityId);\n return stored!;\n }\n}\n","import type { SQLiteAdapter } from './types';\nimport type { WikiOutboxEvent } from './outbox/types';\nimport { setupDatabaseWithGate } from './db/migrationGate';\nimport { detectSchemaVersion, runSourceRefNormalize, writeNormalizeStamp } from './db/sourceRefNormalize';\nimport { withSerializedTransactions } from './db/serializedAdapter';\nimport { MIGRATIONS, CURRENT_SCHEMA_VERSION, createLegacySourceTypeIndex } from './db/migrations';\nimport {\n WikiOptions,\n MemoryBundle,\n MemoryDump,\n WikiEvent,\n EntityStatus,\n ReadOptions,\n WikiSourceRefHashCollision,\n WikiDraftNotFound,\n WikiSupersedeError,\n} from './types';\nimport type { DraftPage, MigrationPolicy } from './types';\nimport type { PendingSourceStatus, WikiLintReport, WikiInstructions, PendingMaintenance, RunPendingMaintenanceOptions, RunPendingMaintenanceResult } from './types';\nimport { EntryRepository } from './repositories/EntryRepository';\nimport { OutboxRepository } from './repositories/OutboxRepository';\nimport { SourceRefIndexRepository } from './repositories/SourceRefIndexRepository';\nimport { TaskRepository } from './repositories/TaskRepository';\nimport { EventRepository } from './repositories/EventRepository';\nimport { EdgeRepository } from './repositories/EdgeRepository';\nimport { MetadataRepository, entitySummaryMetaKey } from './repositories/MetadataRepository';\nimport { SearchService } from './services/SearchService';\nimport { MiniSearchIndexStrategy } from './services/search/MiniSearchIndexStrategy';\nimport { createIndexStrategy } from './services/search/createIndexStrategy';\nimport { monotonicNow } from './utils/monotonicNow';\nimport { DEFAULT_SETUP_BUDGET_MS } from './utils/setupDefaults';\nimport { JobManager } from './services/JobManager';\nimport { normalizeSourceRef, normalizeSourceHash, validateFact, validateTask, clip, chunkText } from './utils/pure';\nimport { resolveGrounding } from './utils/grounding';\nimport { IngestionService } from './services/IngestionService';\nimport { MaintenanceService } from './services/MaintenanceService';\nimport { MaintenanceScheduler } from './services/MaintenanceScheduler';\nimport { ImportExportService } from './services/ImportExportService';\nimport { EmbeddingService } from './services/EmbeddingService';\nimport { RetrievalService } from './services/RetrievalService';\nimport { WriteService } from './services/WriteService';\nimport { PromptService } from './services/PromptService';\nimport { OntologyService } from './services/OntologyService';\nimport { GraphTraversalService } from './services/GraphTraversalService';\nimport { LintRepository } from './repositories/LintRepository';\nimport { LintService } from './services/LintService';\nimport { OkfTrustWritesRepository } from './db/okf-trust-writes';\nimport { TemporalService } from './services/TemporalService';\nimport { RememberService } from './services/RememberService';\nimport { validateManifest } from './utils/ontology';\nimport { DiagnosticBuffer } from './utils/diagnostics';\nimport type { OntologyManifest, OntologyMode, GraphTraversalOptions, GraphNeighborhood, OntologyBackfillResult, HealResult, IngestDocumentResult, ReembedResult, SupersedeReplacement, WikiFact, RememberInput } from './types';\n\nexport { WikiBusyError, WikiTransactionError, PrunePartialFailureError, HOOK_TIMEOUT_MARKER, WikiStrictOntologyViolation, WikiSourceRefHashCollision, WikiParseError, WikiIngestEmptyError, WikiGraphNodeOwnershipConflict } from './types';\n\nconst TABLE_PREFIX_PATTERN = /^[A-Za-z][A-Za-z0-9_]{0,30}_$/;\n/**\n * Backoff between failed no-arg syncSearchIndex() re-init attempts (spec #280\n * Change 4): doubles per consecutive failure from the base up to the cap, and\n * is never shorter than SEARCH_REINIT_COST_FACTOR × the failed attempt's own\n * duration, so a slow attempt (backoff + rebuild under the write lock) can\n * take at most ~1/(factor+1) of wall time.\n */\nconst SEARCH_REINIT_COOLDOWN_MS = 5_000;\nconst SEARCH_REINIT_COOLDOWN_MAX_MS = 5 * 60_000;\nconst SEARCH_REINIT_COST_FACTOR = 10;\n\n/** Typed escape hatch for tests — not part of the supported consumer API. */\nexport interface WikiMemoryTestAccess {\n embeddingService: EmbeddingService;\n importExportService: ImportExportService;\n ingestionService: IngestionService;\n maintenanceService: MaintenanceService;\n maintenanceScheduler: MaintenanceScheduler;\n retrievalService: RetrievalService;\n searchService: SearchService;\n writeService: WriteService;\n promptService: PromptService;\n graphTraversalService: GraphTraversalService;\n temporalService: TemporalService;\n rememberService: RememberService;\n entryRepo: EntryRepository;\n sourceRefIndexRepo: SourceRefIndexRepository;\n metadataRepo: MetadataRepository;\n jobManager: JobManager;\n}\n\n/** `listDrafts` cursors are `${created_at}:${id}`; opaque to callers. */\nfunction decodeDraftCursor(cursor: unknown): { createdAt: number; id: string } {\n const sep = typeof cursor === 'string' ? cursor.indexOf(':') : -1;\n const createdAt = sep > 0 ? Number((cursor as string).slice(0, sep)) : Number.NaN;\n const id = sep > 0 ? (cursor as string).slice(sep + 1) : '';\n if (!Number.isSafeInteger(createdAt) || id.length === 0) {\n throw new TypeError('Invalid listDrafts cursor.');\n }\n return { createdAt, id };\n}\n\nexport class WikiMemory {\n /** Emits `__testAccess` console warning at most once per instance when NODE_ENV ≠ \"test\". */\n #testAccessNonTestEnvWarned = false;\n\n private db: SQLiteAdapter;\n private prefix: string;\n private options: WikiOptions;\n private entryRepo: EntryRepository;\n private outboxRepo: OutboxRepository;\n private sourceRefIndexRepo: SourceRefIndexRepository;\n private taskRepo: TaskRepository;\n private eventRepo: EventRepository;\n private edgeRepo: EdgeRepository;\n private metadataRepo: MetadataRepository;\n private embeddingService: EmbeddingService;\n private searchService: SearchService;\n private jobManager: JobManager;\n private ingestionService: IngestionService;\n private maintenanceService: MaintenanceService;\n private maintenanceScheduler: MaintenanceScheduler;\n private importExportService: ImportExportService;\n private retrievalService: RetrievalService;\n private writeService: WriteService;\n private promptService: PromptService;\n private ontologyService: OntologyService;\n private graphTraversalService: GraphTraversalService;\n private lintRepo: LintRepository;\n private lintService: LintService;\n private temporalService: TemporalService;\n private rememberService: RememberService;\n private readonly okfTrustWrites: OkfTrustWritesRepository;\n\n constructor(db: SQLiteAdapter, options: WikiOptions) {\n // Serialize transactions on the single shared connection before the adapter\n // reaches any repository or service. See docs/superpowers/specs/2026-07-09-transaction-serialization-spec.md.\n this.db = withSerializedTransactions(db);\n this.options = options;\n this.prefix = options.config?.tablePrefix ?? 'llm_wiki_';\n if (!TABLE_PREFIX_PATTERN.test(this.prefix)) {\n throw new Error(\n `Invalid tablePrefix: ${JSON.stringify(this.prefix)}. ` +\n `Must match ${TABLE_PREFIX_PATTERN} (letter, then alphanumeric/underscore, ending in \"_\", max 32 chars total).`,\n );\n }\n this.outboxRepo = new OutboxRepository(this.db, this.prefix, !!options.config?.enableOutbox);\n this.entryRepo = new EntryRepository(this.db, this.prefix, this.outboxRepo);\n this.sourceRefIndexRepo = new SourceRefIndexRepository(this.db, this.prefix);\n this.taskRepo = new TaskRepository(this.db, this.prefix, this.outboxRepo);\n this.eventRepo = new EventRepository(this.db, this.prefix);\n this.edgeRepo = new EdgeRepository(this.db, this.prefix);\n this.metadataRepo = new MetadataRepository(this.db, this.prefix);\n this.lintRepo = new LintRepository(this.db, this.prefix);\n this.ontologyService = new OntologyService(\n this.metadataRepo,\n this.edgeRepo,\n options.config?.ontology,\n );\n this.lintService = new LintService(this.lintRepo, this.ontologyService);\n this.embeddingService = new EmbeddingService(this.db, this.options, this.entryRepo, this.metadataRepo);\n this.searchService = new SearchService(\n this.entryRepo,\n new MiniSearchIndexStrategy(),\n );\n this.temporalService = new TemporalService(this.db, this.options, this.entryRepo, this.searchService, this.embeddingService);\n this.rememberService = new RememberService(this.db, this.entryRepo, this.ontologyService, this.searchService, this.embeddingService);\n this.jobManager = new JobManager(this.prefix);\n this.promptService = new PromptService(options.config?.prompts, resolveGrounding(options.config?.grounding));\n this.ingestionService = new IngestionService(\n this.db,\n this.prefix,\n this.options,\n this.entryRepo,\n this.sourceRefIndexRepo,\n this.metadataRepo,\n this.edgeRepo,\n this.searchService,\n this.jobManager,\n this.embeddingService,\n this.promptService,\n this.ontologyService,\n );\n this.maintenanceService = new MaintenanceService(\n this.db,\n this.prefix,\n this.options,\n this.entryRepo,\n this.sourceRefIndexRepo,\n this.taskRepo,\n this.eventRepo,\n this.metadataRepo,\n this.searchService,\n this.jobManager,\n this.embeddingService,\n this.promptService,\n this.ontologyService,\n );\n this.maintenanceScheduler = new MaintenanceScheduler(\n this.db,\n this.options,\n this.maintenanceService,\n this.metadataRepo,\n this.eventRepo,\n this.entryRepo,\n this.jobManager,\n );\n this.importExportService = new ImportExportService(\n this.db,\n this.entryRepo,\n this.taskRepo,\n this.eventRepo,\n this.edgeRepo,\n this.metadataRepo,\n this.searchService,\n this.jobManager,\n this.embeddingService,\n );\n this.retrievalService = new RetrievalService(\n this.options,\n this.entryRepo,\n this.taskRepo,\n this.eventRepo,\n this.metadataRepo,\n this.searchService,\n );\n this.writeService = new WriteService(\n this.db,\n this.options,\n this.entryRepo,\n this.eventRepo,\n this.metadataRepo,\n this.jobManager,\n this.maintenanceService,\n );\n this.graphTraversalService = new GraphTraversalService(\n this.edgeRepo,\n this.entryRepo,\n this.options.config ?? {},\n );\n this.okfTrustWrites = new OkfTrustWritesRepository(this.db, this.prefix);\n }\n\n /**\n * Explicit escape hatch for test suites: typed access to composed services for mocks/spies.\n * If `NODE_ENV` is not `\"test\"`, emits a single `console.warn` per instance (skipped when `process` is undefined).\n */\n get __testAccess(): WikiMemoryTestAccess {\n const processEnv = typeof globalThis !== 'undefined'\n ? (globalThis as any).process?.env\n : undefined;\n\n if (\n processEnv !== undefined &&\n processEnv.NODE_ENV !== 'test' &&\n !this.#testAccessNonTestEnvWarned\n ) {\n this.#testAccessNonTestEnvWarned = true;\n console.warn('Warning: WikiMemory.__testAccess is intended for tests (NODE_ENV !== \"test\").');\n }\n return {\n embeddingService: this.embeddingService,\n importExportService: this.importExportService,\n ingestionService: this.ingestionService,\n maintenanceService: this.maintenanceService,\n maintenanceScheduler: this.maintenanceScheduler,\n retrievalService: this.retrievalService,\n searchService: this.searchService,\n writeService: this.writeService,\n promptService: this.promptService,\n graphTraversalService: this.graphTraversalService,\n temporalService: this.temporalService,\n rememberService: this.rememberService,\n entryRepo: this.entryRepo,\n sourceRefIndexRepo: this.sourceRefIndexRepo,\n metadataRepo: this.metadataRepo,\n jobManager: this.jobManager,\n };\n }\n\n /** Max upsertGraph node ids held for their post-commit sync (spec #280 id threading). */\n static readonly UPSERT_ID_STASH_CAP = 10_000;\n /**\n * upsertGraph node and superseded-fact ids per entity, awaiting syncSearchIndex(), each with the\n * generation of its latest stash. Ids leave the stash only once a drain\n * succeeded, so a failed drain retries them next call.\n */\n private upsertIdStash = new Map<string, Map<string, number>>();\n /** Total ids across upsertIdStash, kept in step so the cap check is O(1). */\n private upsertIdStashSize = 0;\n /** Bumped per stashed id; a re-stash during an in-flight drain outlives that drain's drop. */\n private upsertIdStashGen = 0;\n\n private stashUpsertIds(entityId: string, ids: readonly string[]): void {\n // Only a ledger strategy drains by id; MiniSearch rebuilds the stale entity instead.\n if (!this.searchService.hasLedger()) return;\n const cap = (this.constructor as typeof WikiMemory).UPSERT_ID_STASH_CAP;\n const stash = this.upsertIdStash.get(entityId) ?? new Map<string, number>();\n for (const id of ids) {\n if (!stash.has(id)) {\n if (this.upsertIdStashSize >= cap) continue; // overflow: the entity-targeted / full-quantum drain covers the rest\n this.upsertIdStashSize++;\n }\n stash.set(id, ++this.upsertIdStashGen);\n }\n if (stash.size > 0) this.upsertIdStash.set(entityId, stash);\n }\n\n /** Snapshot of the stash (one entity, or all) with generations, without removing anything. */\n private peekStashedIds(entityId?: string): Map<string, Map<string, number>> {\n const snapshot = new Map<string, Map<string, number>>();\n for (const [id, stash] of this.upsertIdStash) {\n if (entityId === undefined || id === entityId) snapshot.set(id, new Map(stash));\n }\n return snapshot;\n }\n\n /**\n * Removes a drained snapshot. An id re-stashed after the peek has a newer\n * generation and stays: the drain may have run before that write committed.\n */\n private dropStashedIds(snapshot: Map<string, Map<string, number>>): void {\n for (const [entityId, drained] of snapshot) {\n const stash = this.upsertIdStash.get(entityId);\n if (!stash) continue;\n for (const [id, gen] of drained) {\n if (stash.get(id) === gen && stash.delete(id)) this.upsertIdStashSize--;\n }\n if (stash.size === 0) this.upsertIdStash.delete(entityId);\n }\n }\n\n /** `config.setupBudgetMs` or the default, validated: a positive finite number. */\n private setupBudgetMs(): number {\n const budget = this.options.config?.setupBudgetMs ?? DEFAULT_SETUP_BUDGET_MS;\n if (typeof budget !== 'number' || !Number.isFinite(budget) || budget <= 0) {\n throw new TypeError(`setupBudgetMs must be a positive finite number; got ${String(budget)}`);\n }\n return budget;\n }\n\n private reinitSearch: Promise<void> | null = null;\n /** Monotonic time before which a no-arg syncSearchIndex() skips the re-init (0 = no cooldown). */\n private reinitRetryAt = 0;\n /** Consecutive failed re-inits; drives the exponential backoff. */\n private reinitFailures = 0;\n\n /**\n * Opens the store: migration gate, DDL, schema migrations, then the stamped\n * source_ref normalize. Await it before any other call on this instance — the\n * normalize commits in chunks, so a sourceRef-keyed call (forget, upsertGraph,\n * hasChanged, ingest) issued before setup() resolves can see partially\n * normalized refs.\n *\n * Pass `{ migrations: 'refuse' }` from inside a writer lease: pending one-time\n * work then throws WikiMigrationRequiredError before any mutation, and the\n * host runs a plain `setup()` outside the lease.\n *\n * Keyword-index catch-up work is bounded by `config.setupBudgetMs`; anything\n * left converges on later opens and no-arg `syncSearchIndex()` calls. Not\n * bounded: an index reset (tokenizer change, re-attach after detach, a lost\n * or inconsistent index), which runs as one unchunked transaction.\n */\n async setup(opts?: { migrations?: MigrationPolicy }) {\n const setupBudgetMs = this.setupBudgetMs();\n // One deadline per open (spec #280 Change 3): captured here, never re-budgeted per turn.\n const openDeadline = monotonicNow() + setupBudgetMs;\n const entriesExistedBeforeSetup = await this.metadataRepo.tableExists(`${this.prefix}entries`);\n\n // The gate runs before any mutation: 'refuse' throws before tables are touched,\n // 'auto' lets only a pending source_ref normalize through (run below), 'allow' just sets up.\n const migrationPolicy = opts?.migrations ?? this.options.config?.migrations ?? 'allow';\n await setupDatabaseWithGate(this.db, this.prefix, this.metadataRepo, migrationPolicy);\n\n let currentVersion: number;\n\n if (!entriesExistedBeforeSetup) {\n // One transaction: a crash must never leave schema_version=14 without the index,\n // since no migration would rebuild it on the next open.\n await this.db.withTransactionAsync(async (tx) => {\n await createLegacySourceTypeIndex(tx, this.prefix);\n await writeNormalizeStamp(this.metadataRepo, tx);\n await this.metadataRepo.setMeta('schema_version', String(CURRENT_SCHEMA_VERSION), tx);\n });\n currentVersion = CURRENT_SCHEMA_VERSION;\n } else {\n currentVersion = await detectSchemaVersion(this.metadataRepo, this.prefix);\n }\n\n // Schema migrations. Under 'refuse'/'auto' the gate has already thrown if any are pending.\n for (const migration of MIGRATIONS) {\n if (migration.version > currentVersion) {\n await migration.run(this.db, this.prefix);\n await this.metadataRepo.setMeta('schema_version', String(migration.version), this.db);\n currentVersion = migration.version;\n }\n }\n\n if (entriesExistedBeforeSetup) {\n const schemaVersionCheck = await this.metadataRepo.getMeta('schema_version');\n if (!schemaVersionCheck) {\n await this.metadataRepo.setMeta('schema_version', String(currentVersion), this.db);\n }\n await this.importExportService.assertNoLegacySourceTypes();\n // Stamped, watermark-resumable normalization; no-op once the stamp matches.\n await runSourceRefNormalize(this.db, this.prefix, this.metadataRepo);\n }\n\n this.searchService.setIndexStrategy(\n await createIndexStrategy(\n this.db,\n this.prefix,\n this.metadataRepo,\n this.options.config?.indexStrategy ?? 'auto',\n { setupBudgetMs, entriesExisted: entriesExistedBeforeSetup },\n ),\n );\n // FTS5: one budgeted quantum (no global read). MiniSearch: full rebuild, as before.\n await this.searchService.sync(undefined, { deadline: openDeadline });\n }\n\n async hasChanged(\n entityId: string,\n sourceRef: string,\n sourceHash: string,\n ): Promise<boolean>;\n /**\n * Batched overload.\n *\n * `duplicateOf`, when present, is the canonical stored DIFFERENT `source_ref`\n * holding the same hash — never the incoming ref itself (the incoming ref is\n * excluded from the canonical-sort set so a self-reference is impossible).\n * `duplicateOf` reflects the *DB-side* normalized spelling; `sourceRef` in\n * each result echoes the raw caller value. Hosts should not compare these\n * two fields directly to infer canonical status.\n */\n async hasChanged(\n entityId: string,\n entries: Array<{ sourceRef: string; sourceHash: string }>,\n ): Promise<Array<{ sourceRef: string; changed: boolean; duplicateOf?: string }>>;\n async hasChanged(\n entityId: string,\n sourceRefOrEntries: string | Array<{ sourceRef: string; sourceHash: string }>,\n sourceHashArg?: string,\n ): Promise<boolean | Array<{ sourceRef: string; changed: boolean; duplicateOf?: string }>> {\n // Single-doc path: delegate to existing semantics.\n if (typeof sourceRefOrEntries === 'string') {\n const sourceRef = normalizeSourceRef(sourceRefOrEntries);\n if (!sourceRef) {\n throw new Error(`Invalid sourceRef: ${JSON.stringify(sourceRefOrEntries)}`);\n }\n const sourceHash = normalizeSourceHash(sourceHashArg!);\n if (!sourceHash) {\n throw new Error('Invalid sourceHash: must be a 64-character hex string (normalized to lowercase)');\n }\n const storedHash = await this.entryRepo.findLatestSourceHash(entityId, sourceRef);\n if (storedHash === null) return true;\n const normalizedStoredHash = normalizeSourceHash(storedHash);\n return normalizedStoredHash !== sourceHash;\n }\n\n // Batched path: empty input -> empty result, zero SQL calls.\n const entries = sourceRefOrEntries;\n if (entries.length === 0) return [];\n\n // Normalize all inputs (validation up front). Preserve the raw ref so the\n // result echoes the caller's spelling (DB refs are normalized on setup,\n // but the caller hasn't seen that normalization yet).\n const normalized = entries.map(e => {\n const r = normalizeSourceRef(e.sourceRef);\n if (!r) throw new Error(`Invalid sourceRef: ${JSON.stringify(e.sourceRef)}`);\n const h = normalizeSourceHash(e.sourceHash);\n if (!h) throw new Error('Invalid sourceHash: must be a 64-character hex string (normalized to lowercase)');\n return { rawSourceRef: e.sourceRef, sourceRef: r, sourceHash: h };\n });\n\n // 1 + H SQL queries: one batched latest-hash lookup, plus one source_ref_index\n // lookup per distinct input hash. Lookups are issued in parallel — the bound\n // is the SQL-query count, not the await count.\n const latestHashes = await this.entryRepo.findLatestSourceHashes(entityId, normalized.map(e => e.sourceRef));\n\n const distinctHashes = Array.from(new Set(normalized.map(e => e.sourceHash)));\n const dupRefs = await Promise.all(\n distinctHashes.map(h => this.sourceRefIndexRepo.findActiveByEntityAndHash(entityId, h)),\n );\n const dupMap = new Map<string, string | null>(); // hash -> canonical sourceRef (or null)\n for (let i = 0; i < distinctHashes.length; i++) {\n dupMap.set(distinctHashes[i], dupRefs[i]);\n }\n\n return normalized.map(e => {\n const stored = latestHashes.get(e.sourceRef);\n const changed = stored === undefined || stored === null || normalizeSourceHash(stored) !== e.sourceHash;\n const canonical = dupMap.get(e.sourceHash) ?? null;\n if (canonical === null || canonical === e.sourceRef) {\n return { sourceRef: e.rawSourceRef, changed };\n }\n // Canonical: the single sourceRef from source_ref_index that holds\n // this hash, if any. Because the partial UNIQUE index allows at most\n // one live row per (entity, hash), the canonical cannot be the\n // incoming ref (it would be the same sourceRef) — we filter that out\n // above. Non-ASCII sourceRefs are still compared by the DB's\n // source_ref index, so the canonical matches the DB ordering.\n return { sourceRef: e.rawSourceRef, changed, duplicateOf: canonical };\n });\n }\n\n /**\n * Batch pending state per source (spec §8.2). `current` exactly when\n * `hasChanged` is false; `partial` when live rows exist but none carries a\n * hash (a first ingest with a failed chunk, or imported rows without a\n * hash). A failed re-ingest of an already-hashed ref reports `changed`. Validation and raw-ref echo match\n * batched `hasChanged`. Input order and duplicates are preserved. A\n * non-array `sources`, or an entry that is not an object (including a hole\n * in a sparse array), throws a `TypeError` before any SQL runs.\n */\n async pendingSources(\n entityId: string,\n sources: Array<{ sourceRef: string; sourceHash: string }>,\n ): Promise<Array<{ sourceRef: string; status: PendingSourceStatus }>> {\n assertEntityId(entityId);\n if (!Array.isArray(sources)) {\n throw new TypeError('Invalid sources: must be an array of { sourceRef, sourceHash } objects.');\n }\n if (sources.length === 0) return [];\n // Array.from visits holes as undefined, so a sparse array fails the entry check.\n const normalized = Array.from(sources, (s: unknown, i) => {\n if (s === null || typeof s !== 'object') {\n throw new TypeError(`Invalid sources[${i}]: must be a { sourceRef, sourceHash } object.`);\n }\n const { sourceRef: rawSourceRef, sourceHash: rawSourceHash } = s as { sourceRef: string; sourceHash: string };\n const sourceRef = normalizeSourceRef(rawSourceRef);\n if (!sourceRef) {\n // JSON.stringify throws on a bigint; name the type for non-strings instead.\n const shown = typeof rawSourceRef === 'string' ? JSON.stringify(rawSourceRef) : `<${typeof rawSourceRef}>`;\n throw new Error(`Invalid sourceRef: ${shown}`);\n }\n const sourceHash = normalizeSourceHash(rawSourceHash);\n if (!sourceHash) throw new Error('Invalid sourceHash: must be a 64-character hex string (normalized to lowercase)');\n return { rawSourceRef, sourceRef, sourceHash };\n });\n const states = await this.entryRepo.findSourceStates(entityId, normalized.map((n) => n.sourceRef));\n return normalized.map((n) => {\n const state = states.get(n.sourceRef);\n let status: PendingSourceStatus;\n if (!state) status = 'new';\n else if (!state.anyHashed) status = 'partial';\n else if (state.latestHash !== null && normalizeSourceHash(state.latestHash) === n.sourceHash) status = 'current';\n else status = 'changed';\n return { sourceRef: n.rawSourceRef, status };\n });\n }\n\n /** Read-only maintenance report for one entity (spec §8.1). Reports, never repairs. */\n async lint(entityId: string): Promise<WikiLintReport> {\n assertEntityId(entityId);\n return this.lintService.lint(entityId);\n }\n\n /**\n * Effective system prompts for ingest, librarian, heal and ontology backfill\n * (spec §8.3). Backs the `wiki_get_instructions` tool. Templates only;\n * overrides are returned verbatim, so keep secrets out of `WikiConfig.prompts`.\n */\n async getInstructions(entityId: string): Promise<WikiInstructions> {\n assertEntityId(entityId);\n const ontologyContext = await this.ontologyService.buildPromptContext(entityId);\n return this.promptService.buildInstructionTemplates(ontologyContext);\n }\n\n /**\n * Returns the live source_refs for an entity, one row per ref, with the most\n * recently-updated live `source_hash` and a live fact count. Refs are sorted\n * `COLLATE BINARY` (no locale dependency). Used by hosts to reconcile stored\n * state against a live source, or audit duplicate-hash collisions via\n * `findSourceRefsByHash`.\n */\n async listSourceRefs(entityId: string): Promise<Array<{\n sourceRef: string;\n sourceHash: string | null;\n factCount: number;\n lastIngestedAt: number;\n }>> {\n return this.entryRepo.listSourceRefs(entityId);\n }\n\n /**\n * Returns the live source_refs for an entity that hold the given source_hash.\n * With v9, source_ref_index is the source of truth for the sourceRef-level\n * TOCTOU-race invariant: at most one sourceRef can hold a given\n * (entity_id, source_hash). The result is either a single-element array\n * (one canonical ref) or empty (no live ref holds the hash). Returned as\n * an array to preserve the existing public-API shape used by hosts\n * auditing duplicate-content collisions.\n */\n async findSourceRefsByHash(entityId: string, sourceHash: string): Promise<string[]> {\n const canonical = await this.sourceRefIndexRepo.findActiveByEntityAndHash(entityId, sourceHash);\n return canonical === null ? [] : [canonical];\n }\n\n /**\n * Returns the set of `entity_id` values with at least one row in this\n * database, INCLUDING entities whose only remaining rows are soft-deleted\n * — sorted ascending `entity_id COLLATE BINARY`. Empty array when the\n * database has no entities.\n *\n * The deliberate inclusion of soft-deleted-only entities closes the\n * decommissioned-scope leak: a scoped namespace whose documents have all\n * been forgotten or superseded must still appear so host maintenance\n * sweeps (`runLibrarian`, `runHeal`, `runOntologyBackfill`, `runPrune`)\n * can visit it and reap the soft-deleted rows.\n *\n * Read-only. Never acquires a lock. Never opens a transaction. Propagates\n * underlying read errors.\n *\n * @param options.prefix - Optional string filter applied as\n * `id.startsWith(prefix)`. O(n) over distinct ids because the\n * `(entity_id, source_ref)` index is not seekable on `entity_id`-only\n * prefix. Empty-string prefix matches every id.\n *\n * Note: this widens the coverage of `exportDump` (which delegates to\n * `MetadataRepository.getDistinctEntityIds`); exported dumps now include\n * orphaned entities. This is a deliberate widening for backup/migration\n * coverage, not a breaking change to `exportDump`'s return shape.\n */\n async listEntityIds(options?: { prefix?: string }): Promise<string[]> {\n const ids = await this.metadataRepo.getDistinctEntityIds();\n if (options?.prefix === undefined) return ids;\n return ids.filter(id => id.startsWith(options.prefix!));\n }\n\n async runPrune(\n entityId: string,\n options?: {\n retainSoftDeletedFor?: number | null;\n retainEventsFor?: number | null;\n vacuum?: boolean;\n },\n ): Promise<{ entries: number; tasks: number; events: number }> {\n return this.maintenanceService.runPrune(entityId, options);\n }\n\n async read(entityId: string | string[], query: string, options?: ReadOptions): Promise<MemoryBundle> {\n return this.retrievalService.read(entityId, query, options);\n }\n\n async traverseGraph(entityId: string, options: GraphTraversalOptions): Promise<GraphNeighborhood> {\n return this.graphTraversalService.traverseGraph(entityId, options);\n }\n\n async getMemoryBundle(entityId: string): Promise<MemoryBundle> {\n return this.importExportService.getFullBundle(entityId, { maxEvents: 10 });\n }\n\n async write(entityId: string, event: Omit<WikiEvent, 'id' | 'entity_id' | 'created_at'>): Promise<void> {\n return this.writeService.write(entityId, event);\n }\n\n /** Await auto-mode background librarian/heal jobs started by write(). No-op in 'deferred' mode. */\n async drain(): Promise<void> {\n return this.writeService.drain();\n }\n\n /**\n * Report which entities have pending maintenance work (librarian events\n * behind the watermark, heal backlog, unembedded facts) without running\n * anything. Entities with no pending work are omitted; sorted by\n * `pendingEvents` desc then `entityId` asc.\n */\n async getPendingMaintenance(entityIds?: string[]): Promise<PendingMaintenance[]> {\n return this.maintenanceScheduler.getPending(entityIds);\n }\n\n /** Run pending librarian/heal/reembed work under an optional token budget and deadline (spec §6.2). Nothing runs after it resolves. */\n async runPendingMaintenance(options?: RunPendingMaintenanceOptions): Promise<RunPendingMaintenanceResult> {\n return this.maintenanceScheduler.run(options);\n }\n\n /**\n * @param options.promptOverride - Applies only to this manual call. Does NOT affect\n * WriteService-triggered auto-runs. For persistent prompt customization across auto-runs,\n * set `options.config.prompts.librarianSystemPrompt` at WikiMemory construction time.\n */\n async runLibrarian(entityId: string, options?: { promptOverride?: string }): Promise<void> {\n return this.maintenanceService.runLibrarian(entityId, options);\n }\n\n /**\n * Reviews stored facts with the LLM: removes orphans, downgrades stale\n * inferences, synthesizes corrections.\n *\n * Bounded per call: covers at most `batchSize` candidates (default 25), so\n * one call no longer sweeps the whole entity. Hosts own the cadence; loop\n * `while (result.remaining > 0)` for convergence.\n *\n * `remaining === 0` means \"every mutable fact is inside the 7-day recheck\n * cooldown\", not \"there is no more work\" — heal's candidate set is the live\n * mutable corpus, not a draining backlog, so it climbs back as the cooldown\n * lapses and as new facts are written. Do not write a loop expecting a drain.\n *\n * @param options.promptOverride - Applies only to this manual call. Does NOT affect\n * WriteService-triggered auto-runs. For persistent prompt customization across auto-runs,\n * set `options.config.prompts.healSystemPrompt` at WikiMemory construction time.\n * @param options.batchSize - Candidates per run (default 25) for providers with\n * tighter context limits.\n */\n async runHeal(\n entityId: string,\n options?: { promptOverride?: string; batchSize?: number },\n ): Promise<HealResult> {\n return this.maintenanceService.runHeal(entityId, options);\n }\n\n /**\n * Types already-persisted untyped facts (okf_type IS NULL) in place via one\n * librarian-style LLM call. Strictly additive: never creates, deletes, or\n * rewrites facts; never overwrites an existing okf_type. Free when there is\n * nothing to do (ontology off, or zero eligible untyped facts).\n *\n * Hosts own the trigger cadence (e.g. after each sync); loop `while\n * result.remaining > 0` for convergence. Throws WikiBusyError when another\n * backfill (or conflicting maintenance op) is running for the entity.\n *\n * @param options.promptOverride - Applies only to this call. For persistent\n * customization set `options.config.prompts.ontologyBackfillSystemPrompt`.\n * @param options.batchSize - Facts per run (default 25) for providers with\n * tighter context limits.\n */\n async runOntologyBackfill(\n entityId: string,\n options?: { promptOverride?: string; batchSize?: number; classifier?: 'auto' | 'llm' },\n ): Promise<OntologyBackfillResult> {\n return this.maintenanceService.runOntologyBackfill(entityId, options);\n }\n\n async runReembed(\n entityId?: string,\n opts?: { force?: boolean; skipExisting?: boolean },\n ): Promise<ReembedResult> {\n return this.maintenanceService.runReembed(entityId, opts);\n }\n\n getEntityStatus(entityId: string): EntityStatus {\n return this.jobManager.getEntityStatus(entityId);\n }\n\n subscribeEntityStatus(\n entityId: string,\n callback: (status: EntityStatus) => void,\n ): () => void {\n return this.jobManager.subscribeEntityStatus(entityId, callback);\n }\n\n clearVectorCache(): void {\n this.searchService.evictCache();\n }\n\n /**\n * Brings the keyword search index up to date with SQLite after a host\n * transaction that used `upsertGraph` has committed. Core never sees that\n * commit, so without this the nodes stay out of keyword, hybrid and\n * fallback retrieval until the entity's next core write.\n *\n * With `entityId`: drains that entity's pending `upsertGraph` ids (its new\n * nodes and the facts they superseded) first, to completion, then at most\n * one more ledger chunk — so its new nodes are searchable, and the\n * superseded facts gone, when the call resolves, under any backlog. Without an\n * argument: drains every stashed `upsertGraph` id across entities first,\n * then runs one keyword-index quantum bounded by `config.setupBudgetMs`\n * (backlog drain, then rebuild work while the index is rebuilding). Hosts\n * with a long-lived process should call the no-arg form on their own\n * schedule: that is what converges a rebuilding index. While keyword search\n * is unavailable it first retries the index init; after a failed attempt it\n * waits at least 5 s, doubling per consecutive failure up to 5 min (longer\n * when an attempt is itself slow), before retrying again.\n *\n * Call only after the host's transaction commits: called inside it, the\n * rebuild may index rows that later roll back, or miss them and clear the\n * stale flag anyway. Serialized with core's internal index syncs and takes\n * no maintenance lock. Never rejects for a valid `entityId` — on failure the\n * entity stays stale and the next call retries it. Does not compute\n * embeddings; that remains the maintenance sweep's job.\n *\n * With the FTS5 index strategy this drains the index ledger in its own\n * transactions, so it MUST be called after the host transaction commits,\n * never from inside a `withTransactionAsync` callback. Calling it inside\n * one waits on the transaction mutex that the callback holds.\n *\n * @throws {TypeError} when `entityId` is given but is not a non-empty string.\n */\n async syncSearchIndex(entityId?: string): Promise<void> {\n if (entityId === undefined) {\n // A long-lived host that never re-opens still recovers from a failed init (spec #280 Change 4).\n // After a failed re-init, back off before the next: each attempt costs\n // the 250 ms retry backoff plus up to two rebuild transactions under the\n // write lock, and hosts call this after every write.\n if (!this.searchService.isKeywordAvailable() && monotonicNow() >= this.reinitRetryAt) {\n // One re-init at a time; concurrent callers share it.\n this.reinitSearch ??= (async () => {\n const started = monotonicNow();\n try {\n const strategy = await createIndexStrategy(\n this.db, this.prefix, this.metadataRepo, this.options.config?.indexStrategy ?? 'auto',\n { setupBudgetMs: this.setupBudgetMs() });\n this.searchService.setIndexStrategy(strategy);\n // A new MiniSearch index starts empty and needs the full sync. A ledger\n // strategy gets its one quantum from the syncStale() below (#284 review).\n if (this.searchService.isKeywordAvailable() && !this.searchService.hasLedger()) await this.searchService.sync();\n } finally {\n if (this.searchService.isKeywordAvailable()) {\n this.reinitFailures = 0;\n this.reinitRetryAt = 0;\n } else {\n const now = monotonicNow();\n const backoff = Math.min(SEARCH_REINIT_COOLDOWN_MS * 2 ** this.reinitFailures, SEARCH_REINIT_COOLDOWN_MAX_MS);\n this.reinitFailures++;\n this.reinitRetryAt = now + Math.max(backoff, SEARCH_REINIT_COST_FACTOR * (now - started));\n }\n this.reinitSearch = null;\n }\n })();\n await this.reinitSearch;\n }\n const stashed = this.peekStashedIds();\n const ids = [...stashed.values()].flatMap((m) => [...m.keys()]);\n if (await this.syncDrained(this.searchService.syncStale({ ids }))) this.dropStashedIds(stashed);\n return;\n }\n assertEntityId(entityId);\n const stashed = this.peekStashedIds(entityId);\n if (await this.syncDrained(this.searchService.syncEntries(entityId, stashed.get(entityId)?.keys() ?? []))) {\n this.dropStashedIds(stashed);\n }\n }\n\n /**\n * True when a sync applied the stashed ids. While keyword search is\n * unavailable the stand-in strategy's drain is a no-op that reports success,\n * so the ids stay stashed for the first sync after a re-init (#284 review).\n */\n private async syncDrained(sync: Promise<boolean>): Promise<boolean> {\n return (await sync) && this.searchService.isKeywordAvailable();\n }\n\n async exportDump(entityIds?: string[]): Promise<MemoryDump> {\n return this.importExportService.exportDump(entityIds);\n }\n\n /** Entity summary prose persisted from an OKF profile ≥ 1 import; null when none stored. */\n async getEntitySummary(entityId: string): Promise<string | null> {\n return this.metadataRepo.getMeta(entitySummaryMetaKey(entityId));\n }\n\n async importDump(dump: MemoryDump, opts?: { merge?: boolean }): Promise<void> {\n return this.importExportService.importDump(dump, opts);\n }\n\n async forget(\n entityId: string,\n params: { entryId?: string; taskId?: string; sourceRef?: string; sourceHash?: string; clearAll?: boolean },\n opts?: { dryRun?: boolean },\n ): Promise<{ deleted: { entries: number; tasks: number }; metadataReset?: boolean }> {\n return this.maintenanceService.forget(entityId, params, opts);\n }\n\n /**\n * End `oldId`'s validity and link it to its replacement (spec §4.3). One\n * transaction. Throws `WikiSupersedeError` for missing, foreign, already\n * superseded, immutable-document, or cyclic targets.\n */\n async supersede(\n entityId: string,\n oldId: string,\n replacement: SupersedeReplacement,\n options?: { validFrom?: number },\n ): Promise<{ newId: string }> {\n return this.temporalService.supersede(entityId, oldId, replacement, options);\n }\n\n /** The supersession chain containing `factId`, oldest first. [] when unknown. */\n async history(entityId: string, factId: string): Promise<WikiFact[]> {\n return this.temporalService.history(entityId, factId);\n }\n\n /**\n * Store one mutable fact directly, with no LLM step (spec\n * `specs/core-remember/spec.md`). One transaction; resolves with the stored\n * row read back (`id`, timestamps, defaults, `isStale`, `trustTier`). Never\n * starts the librarian or heal and writes no event, in `'auto'` and\n * `'deferred'` mode alike. Embeds through `llmProvider.embed` when present;\n * keyword-only otherwise. Not idempotent. To replace an existing fact use\n * `supersede()` so history is kept. Opens its own transaction: do not call\n * it inside `withTransactionAsync` (the serialized adapter would deadlock).\n *\n * Throws `TypeError` on invalid input and `WikiStrictOntologyViolation` for\n * an `okf_type` the entity's strict manifest does not define; nothing is\n * written in either case.\n */\n async remember(entityId: string, input: RememberInput): Promise<WikiFact> {\n return this.rememberService.remember(entityId, input);\n }\n\n /**\n * Full and partial ingestion both reject foreign-owned generated fact IDs with\n * `WikiGraphNodeOwnershipConflict`. Such collisions are unexpected. Ingestion\n * may already have persisted ontology or other state before rejection; unlike\n * direct graph preflight, it relies on transaction rollback for atomicity.\n *\n * @param params.promptOverride - Overrides the system prompt for this ingest call only.\n * For persistent customization, set `options.config.prompts.ingestSystemPrompt` at\n * WikiMemory construction time.\n */\n async ingestDocument(\n entityId: string,\n params: {\n sourceRef: string;\n sourceHash: string;\n documentChunk: string;\n maxChunkLength?: number;\n chunkOverlap?: number;\n chunkConcurrency?: number;\n promptOverride?: string;\n },\n opts?: { onDuplicateHash?: 'ingest' | 'skip' | 'throw' },\n ): Promise<IngestDocumentResult> {\n return this.ingestionService.ingestDocument(entityId, params, opts);\n }\n\n /**\n * Deterministic write path into the graph. Accepts caller-supplied\n * `(nodes, edges)` and writes them under `(sourceRef, sourceHash)`\n * semantics identical to `ingestDocument`, minus the LLM extraction step.\n *\n * MUST be called from inside an open `db.withTransactionAsync` callback —\n * the third argument is the caller's `tx`. The method does not open a\n * nested transaction, does not acquire any lock, and does not perform\n * post-commit work (search sync, embedding, cache eviction). After the\n * transaction commits, call `syncSearchIndex(entityId)` — or\n * `syncSearchIndex()` after writing several entities in one transaction —\n * to make the new nodes keyword-searchable: both forms drain this call's node ids\n * first, to completion, so the nodes are searchable under any backlog (up to\n * `WikiMemory.UPSERT_ID_STASH_CAP` pending ids; beyond that they converge with\n * the backlog). Embeddings still come from the maintenance\n * sweep (`runLibrarian` / `runHeal` / `runOntologyBackfill` / `runPrune`,\n * scoped via `listEntityIds`).\n *\n * Contract (full pre-flight validation lives inside\n * `IngestionService.upsertGraphCore`, which this method delegates to):\n * - C2: no-op when `(entityId, sourceHash)` is already mapped to\n * `params.sourceRef`; throws `WikiSourceRefHashCollision` if mapped to\n * a different `sourceRef`.\n * - C3: edges with dangling `targetId` are stored verbatim (no FK, no\n * resolution).\n * - C4: under persisted ontology mode `'strict'`, an out-of-manifest node\n * or edge `type` throws `WikiStrictOntologyViolation` (pre-flight,\n * all-or-nothing — NONE written on failure).\n *\n * Entry IDs share one database-wide namespace. Existing rows, including\n * soft-deleted rows, reserve their IDs for their entity; same-entity updates\n * and resurrection remain supported. Hosts authenticate callers and select\n * the authorized entity ID; entity-qualified IDs are optional, not required.\n * After the live-only C2 probe above, a foreign node ID throws the fixed,\n * privacy-preserving `WikiGraphNodeOwnershipConflict` before persistent writes\n * (including seed manifests). Deleted source mappings do not trigger C2.\n *\n * Propagate later failures to roll back the host transaction. In particular,\n * foreign edge-ID collisions remain late bare `Error`s: the foreign edge is\n * not overwritten, but catching and committing can retain earlier writes.\n * This method neither commits nor rolls back the caller's transaction.\n *\n * @returns Counts: nodesWritten (validated nodes persisted), edgesWritten\n * (manifest-valid edges persisted), superseded (prior facts soft-deleted\n * plus prior source-ref edges hard-deleted).\n */\n async upsertGraph(\n entityId: string,\n params: {\n sourceRef: string;\n sourceHash: string;\n nodes: readonly { id: string; type: string; title: string; body?: string }[];\n edges: readonly { type: string; sourceId: string; targetId: string; id?: string }[];\n },\n adapter: SQLiteAdapter,\n ): Promise<{ nodesWritten: number; edgesWritten: number; superseded: number }> {\n const sourceRef = normalizeSourceRef(params.sourceRef);\n if (!sourceRef) throw new Error('Invalid sourceRef');\n const sourceHash = normalizeSourceHash(params.sourceHash);\n if (!sourceHash) throw new Error('Invalid sourceHash (must be 64-char hex string)');\n\n // C2 probe — runs inside the caller's tx so it sees the in-flight state.\n const canonical = await this.sourceRefIndexRepo.findActiveByEntityAndHash(entityId, sourceHash, adapter);\n if (canonical !== null && canonical === sourceRef) {\n return { nodesWritten: 0, edgesWritten: 0, superseded: 0 };\n }\n if (canonical !== null && canonical !== sourceRef) {\n throw new WikiSourceRefHashCollision({\n entityId,\n sourceHash,\n existingSourceRef: canonical,\n attemptedSourceRef: sourceRef,\n });\n }\n\n // Delegate to upsertGraphCore for steps a–j (manifest read, validation,\n // supersession, writes, returns counts). No opts.strict override — let\n // the persisted ontology mode drive strictness per the spec.\n // The host owns this transaction and core never sees its commit, so\n // diagnostics are delivered when upsertGraph resolves (spec §4.2.4).\n // Hosts that roll back should disregard them.\n const diagBuffer = new DiagnosticBuffer();\n const { supersededFactIds, ...result } = await this.ingestionService.upsertGraphCore(\n entityId,\n { sourceRef, sourceHash, nodes: params.nodes, edges: params.edges },\n adapter,\n { diag: { buffer: diagBuffer, operation: 'upsertGraph' } },\n );\n // Core never sees this commit. Under a ledger strategy the triggers already\n // recorded the rows: stash the node ids, and the facts this call\n // superseded (as ingestDocument threads them), so the host's post-commit\n // syncSearchIndex() drains them first, to completion, under any backlog.\n // MiniSearch has no ledger: markStale makes that sync rebuild the entity.\n this.stashUpsertIds(entityId, [...supersededFactIds, ...params.nodes.map((n) => n.id)]);\n this.searchService.markStale(entityId);\n diagBuffer.flush(this.options);\n return result;\n }\n\n /**\n * Returns up to `limit` unprocessed outbox events, oldest first.\n * Works regardless of enableOutbox value — allows draining after disabling.\n */\n async getUnprocessedOutboxEvents(limit = 100): Promise<WikiOutboxEvent[]> {\n if (Number.isFinite(limit) && limit <= 0) return [];\n const safeLimit = Number.isFinite(limit) && limit >= 1 ? Math.trunc(limit) : 100;\n const rows = await this.outboxRepo.fetchPending(safeLimit);\n return rows.map(row => {\n let payload: unknown = null;\n try {\n payload = JSON.parse(row.payload);\n } catch {\n // corrupted row — surface null payload rather than poisoning the batch\n }\n return { ...row, payload } as WikiOutboxEvent;\n });\n }\n\n /**\n * Deletes the given event IDs from the outbox table.\n * Call after successfully committing events to the external system.\n */\n async markOutboxEventsProcessed(eventIds: string[]): Promise<void> {\n await this.outboxRepo.acknowledge(eventIds);\n }\n\n /**\n * Returns the effective ontology mode and manifest for an entity.\n * Resolution order: persisted DB row → `WikiConfig.ontology.seedManifests[entityId]` → `null`.\n */\n async getOntologyManifest(entityId: string): Promise<{\n mode: OntologyMode;\n manifest: OntologyManifest;\n } | null> {\n const row = await this.metadataRepo.getManifest(entityId);\n if (row) return { mode: this.ontologyService.resolveMode(row.mode), manifest: row.manifest };\n const seed = this.options.config?.ontology?.seedManifests?.[entityId];\n if (seed) {\n return {\n mode: this.ontologyService.resolveMode(seed.mode),\n manifest: seed.manifest,\n };\n }\n return null;\n }\n\n /**\n * Seeds or replaces an entity's ontology manifest and optional mode override.\n * Validates manifest invariants (unique type slugs, edge endpoints reference node types).\n * Invalidates the in-memory ontology cache for this entity.\n *\n * Delegates to `setOntologyManifests` so there is a single write path. The\n * observable contract is unchanged: same upsert semantics, same cache\n * invalidation, same `void` result.\n */\n async setOntologyManifest(\n entityId: string,\n manifest: OntologyManifest,\n options?: { mode?: OntologyMode },\n ): Promise<void> {\n await this.setOntologyManifests([{ entityId, manifest, mode: options?.mode }]);\n }\n\n /**\n * Write several entities' ontology manifests in a single transaction.\n *\n * All succeed or none do. The transaction is opened on this instance's\n * serialized adapter — callers pass data, never a transaction handle, because\n * a consumer holds the unwrapped adapter and a transaction opened on it would\n * bypass the serialization mutex applied in the constructor.\n *\n * Returns which entities were written. `skipped` is only ever non-empty under\n * `opts.ifAbsent`.\n *\n * Sharp edge: `ifAbsent` checks for a PERSISTED row, not for an effective\n * manifest. An entity whose manifest currently comes from\n * `WikiConfig.ontology.seedManifests` has no row until the seed is\n * materialized on first access that supplies a transaction (in practice, an\n * ingest). Until then `ifAbsent` treats the entity as absent, writes the new\n * manifest over the configured seed, and reports it in `written`; the same\n * call after the seed has been materialized reports it in `skipped`. See the\n * `ifAbsent` notes in the package README.\n */\n async setOntologyManifests(\n entries: Array<{\n entityId: string;\n manifest: OntologyManifest;\n mode?: OntologyMode;\n }>,\n opts?: { ifAbsent?: boolean },\n ): Promise<{ written: string[]; skipped: string[] }> {\n // Nothing to do — and deliberately no transaction, so an empty batch never\n // takes the serialization mutex.\n if (entries.length === 0) return { written: [], skipped: [] };\n\n // Two entries naming one entity express ambiguous intent. Applying the last\n // one silently would hide a caller bug whose symptom — a manifest that is\n // not the one the caller believed it wrote — surfaces far from its cause.\n const seen = new Set<string>();\n for (const entry of entries) {\n if (seen.has(entry.entityId)) {\n throw new Error(`Duplicate entityId in batch: ${entry.entityId}`);\n }\n seen.add(entry.entityId);\n }\n\n // Validate every manifest BEFORE opening the transaction, so a doomed batch\n // never reaches the database and never takes the mutex. `setManifest`\n // validates again inside the transaction; that is the invariant protecting\n // every other repository caller, and is not redundant with this gate.\n for (const entry of entries) {\n validateManifest(entry.manifest);\n }\n\n const written: string[] = [];\n const skipped: string[] = [];\n\n await this.db.withTransactionAsync(async (tx) => {\n for (const entry of entries) {\n const mode = entry.mode ?? this.ontologyService.resolveMode();\n const wrote = await this.metadataRepo.setManifest(\n entry.entityId,\n { mode, manifest: entry.manifest },\n tx,\n { ifAbsent: opts?.ifAbsent === true },\n );\n (wrote ? written : skipped).push(entry.entityId);\n }\n });\n\n // After a successful commit, and for EVERY entry rather than just the\n // written ones: under `ifAbsent` a skipped entry means another writer won\n // the race, so this instance's cached copy may be stale and dropping it is\n // more correct than keeping it. A failed transaction throws above and never\n // reaches this loop, which is fine — a rolled-back batch changed nothing,\n // so the cache is still consistent with the database. Invalidating is cheap\n // either way: it only drops a cached copy, and the next read reloads from\n // the database.\n for (const entry of entries) {\n this.ontologyService.invalidateCache(entry.entityId);\n }\n\n return { written, skipped };\n }\n\n /** Append a verification event to a fact. Does NOT touch `updated_at`. */\n async writeOkfTrust(entryId: string, entityId: string, verified: { by: string; at: string }[]): Promise<void> {\n return this.okfTrustWrites.writeOkfTrust(entryId, entityId, verified);\n }\n\n /** Replace a fact's source list. Does NOT touch `updated_at`. */\n async writeOkfSources(entryId: string, entityId: string, sources: Array<{ resource: string; [k: string]: unknown }>): Promise<void> {\n return this.okfTrustWrites.writeOkfSources(entryId, entityId, sources as any);\n }\n\n /** Set a fact's OKF v0.2 lifecycle status. Does NOT touch `updated_at`. */\n async setLifecycleStatus(entryId: string, entityId: string, status: 'draft' | 'stable' | 'deprecated'): Promise<void> {\n return this.okfTrustWrites.setLifecycleStatus(entryId, entityId, status);\n }\n\n /**\n * Live draft facts for one entity, newest first (spec §5.2). Default page\n * size 50, clamped to [1, 500]. Pass `nextCursor` back unchanged for the next page.\n */\n async listDrafts(entityId: string, options?: { limit?: number; cursor?: string }): Promise<DraftPage> {\n const rawLimit = options?.limit;\n const limit = typeof rawLimit === 'number' && Number.isFinite(rawLimit)\n ? Math.min(500, Math.max(1, Math.floor(rawLimit)))\n : 50;\n const after = options?.cursor === undefined ? null : decodeDraftCursor(options.cursor);\n const rows = await this.entryRepo.listDraftsByEntityId(entityId, limit + 1, after);\n const facts = rows.slice(0, limit);\n const last = facts[facts.length - 1];\n return {\n facts,\n nextCursor: rows.length > limit && last ? `${last.created_at}:${last.id}` : null,\n };\n }\n\n /**\n * Promote a draft to `stable` and record who reviewed it, atomically\n * (spec §5.2). Metadata writes only: `updated_at` is not bumped and no\n * outbox event is pushed. Pass `by: 'human:<id>'` so `trustTier` becomes\n * `'human-reviewed'`.\n *\n * @throws WikiDraftNotFound when no live draft with that id exists for the entity.\n */\n async promoteDraft(entryId: string, entityId: string, reviewer: { by: string }): Promise<void> {\n const by = reviewer?.by;\n if (typeof by !== 'string' || by.trim().length === 0) {\n throw new TypeError('promoteDraft requires reviewer.by to be a non-empty string.');\n }\n await this.db.withTransactionAsync(async (tx) => {\n if (!(await this.entryRepo.isLiveDraft(entryId, entityId, tx))) {\n throw new WikiDraftNotFound();\n }\n await this.okfTrustWrites.setLifecycleStatus(entryId, entityId, 'stable', tx);\n await this.okfTrustWrites.writeOkfTrust(entryId, entityId, [{ by, at: new Date().toISOString() }], tx);\n });\n }\n\n /** Set a fact's stale_after (epoch ms) or clear it. Does NOT touch `updated_at`. */\n async setStaleAfter(entryId: string, entityId: string, date: number | null): Promise<void> {\n return this.okfTrustWrites.setStaleAfter(entryId, entityId, date);\n }\n\n /** Set a fact's generated_by actor string. Does NOT touch `updated_at`. */\n async setGeneratedBy(entryId: string, entityId: string, actor: string): Promise<void> {\n return this.okfTrustWrites.setGeneratedBy(entryId, entityId, actor);\n }\n\n /** Task variants of the same five DAO methods. Symmetric per spec §2.5. */\n async writeOkfTrustTask(taskId: string, entityId: string, verified: { by: string; at: string }[]): Promise<void> {\n return this.okfTrustWrites.writeOkfTrustTask(taskId, entityId, verified);\n }\n async writeOkfSourcesTask(taskId: string, entityId: string, sources: Array<{ resource: string; [k: string]: unknown }>): Promise<void> {\n return this.okfTrustWrites.writeOkfSourcesTask(taskId, entityId, sources as any);\n }\n async setLifecycleStatusTask(taskId: string, entityId: string, status: 'draft' | 'stable' | 'deprecated'): Promise<void> {\n return this.okfTrustWrites.setLifecycleStatusTask(taskId, entityId, status);\n }\n async setStaleAfterTask(taskId: string, entityId: string, date: number | null): Promise<void> {\n return this.okfTrustWrites.setStaleAfterTask(taskId, entityId, date);\n }\n async setGeneratedByTask(taskId: string, entityId: string, actor: string): Promise<void> {\n return this.okfTrustWrites.setGeneratedByTask(taskId, entityId, actor);\n }\n}\n\n/**\n * Shape check for the read-only reports. Deliberately looser than `write()`'s\n * rule: ingestDocument and upsertGraph accept any string id, so a report must\n * too. The value is never echoed; JSON.stringify throws on a bigint.\n */\nfunction assertEntityId(entityId: unknown): asserts entityId is string {\n if (typeof entityId !== 'string' || entityId.length === 0) {\n throw new TypeError('Invalid entityId: must be a non-empty string.');\n }\n}\n\nexport const __testables = { validateFact, validateTask, clip, chunkText };\n","import type { MemoryBundle, WikiFact, WikiTask, WikiEvent, FormatContextOptions } from '../types';\n\nfunction validateMaxOption(value: number, name: string): void {\n if (!isFinite(value) || value < 0) {\n throw new Error(`Invalid ${name}: must be a non-negative finite number`);\n }\n}\n\nconst CONFIDENCE_WEIGHT: Record<string, number> = {\n certain: 1.0,\n inferred: 0.6,\n tentative: 0.3,\n};\n\nfunction scoreFactFor(\n fact: WikiFact,\n weights: Required<NonNullable<FormatContextOptions['factWeights']>>,\n now: number\n): number {\n const confW = CONFIDENCE_WEIGHT[fact.confidence] ?? 0.3;\n const ageDays = (now - fact.updated_at) / 86400000;\n const recencyDecay = Math.exp(-ageDays / 30);\n return (\n confW * weights.confidence +\n Math.log(1 + fact.access_count) * weights.accessCount +\n recencyDecay * weights.recency\n );\n}\n\nfunction renderFactMarkdown(\n fact: WikiFact,\n includeConfidence: boolean,\n includeTags: boolean,\n includeEntityIds: boolean,\n score: number | undefined,\n): string {\n const confPart = includeConfidence ? ` (${fact.confidence})` : '';\n const tagPart = includeTags && fact.tags.length > 0 ? ` [${fact.tags.join(', ')}]` : '';\n const sourcePart = includeEntityIds ? ` {entity_id=${fact.entity_id}}` : '';\n const scorePart = score !== undefined ? ` {score=${score.toFixed(4)}}` : '';\n return `- **${fact.title}**${confPart}${tagPart}${sourcePart}${scorePart}\\n ${fact.body.replace(/\\n/g, '\\n ')}`;\n}\n\nfunction renderFactPlain(\n fact: WikiFact,\n includeConfidence: boolean,\n includeTags: boolean,\n includeEntityIds: boolean,\n score: number | undefined,\n): string {\n const confPart = includeConfidence ? ` (${fact.confidence})` : '';\n const tagPart = includeTags && fact.tags.length > 0 ? ` [${fact.tags.join(', ')}]` : '';\n const sourcePart = includeEntityIds ? ` {entity_id=${fact.entity_id}}` : '';\n const scorePart = score !== undefined ? ` {score=${score.toFixed(4)}}` : '';\n return `${fact.title}${confPart}${tagPart}${sourcePart}${scorePart}: ${fact.body}`;\n}\n\nfunction renderTaskMarkdown(task: WikiTask): string {\n return `- [P${task.priority}] ${task.description.replace(/\\n/g, '\\n ')} (${task.status})`;\n}\n\nfunction renderTaskPlain(task: WikiTask): string {\n return `[P${task.priority}] ${task.description} (${task.status})`;\n}\n\nfunction renderEventMarkdown(event: WikiEvent): string {\n const ts = new Date(event.created_at).toISOString();\n return `- [${event.event_type} @ ${ts}] ${event.summary.replace(/\\n/g, '\\n ')}`;\n}\n\nfunction renderEventPlain(event: WikiEvent): string {\n const ts = new Date(event.created_at).toISOString();\n return `[${event.event_type} @ ${ts}] ${event.summary}`;\n}\n\nexport function formatContext(\n bundle: MemoryBundle,\n options?: FormatContextOptions\n): string {\n const opts: Required<FormatContextOptions> = {\n format: options?.format ?? 'markdown',\n maxFacts: options?.maxFacts ?? 10,\n maxTasks: options?.maxTasks ?? 10,\n maxEvents: options?.maxEvents ?? 10,\n includeConfidence: !(options?.compact ?? false) && (options?.includeConfidence ?? true),\n includeTags: !(options?.compact ?? false) && (options?.includeTags ?? true),\n includeEntityIds: !(options?.compact ?? false) && (options?.includeEntityIds ?? false),\n includeFactScores: !(options?.compact ?? false) && (options?.includeFactScores ?? false),\n compact: options?.compact ?? false,\n factWeights: {\n confidence: options?.factWeights?.confidence ?? 1.0,\n accessCount: options?.factWeights?.accessCount ?? 0.3,\n recency: options?.factWeights?.recency ?? 0.5,\n },\n };\n\n validateMaxOption(opts.maxFacts, 'maxFacts');\n validateMaxOption(opts.maxTasks, 'maxTasks');\n validateMaxOption(opts.maxEvents, 'maxEvents');\n\n const weights = opts.factWeights as Required<NonNullable<FormatContextOptions['factWeights']>>;\n\n const now = Date.now();\n const sortedFacts = bundle.factScores\n ? [...bundle.facts].slice(0, opts.maxFacts)\n : [...bundle.facts]\n .sort((a, b) => scoreFactFor(b, weights, now) - scoreFactFor(a, weights, now))\n .slice(0, opts.maxFacts);\n\n const sortedTasks = [...bundle.tasks]\n .sort((a, b) => b.priority - a.priority || a.created_at - b.created_at)\n .slice(0, opts.maxTasks);\n\n const sortedEvents = [...bundle.events]\n .sort((a, b) => b.created_at - a.created_at)\n .slice(0, opts.maxEvents);\n\n if (sortedFacts.length === 0 && sortedTasks.length === 0 && sortedEvents.length === 0) {\n return '';\n }\n\n const isMarkdown = opts.format === 'markdown';\n const lines: string[] = [];\n\n if (isMarkdown) {\n lines.push('## Memory');\n\n if (sortedFacts.length > 0) {\n lines.push('');\n lines.push('### Known Facts');\n for (const fact of sortedFacts) {\n lines.push(renderFactMarkdown(fact, opts.includeConfidence, opts.includeTags, opts.includeEntityIds, opts.includeFactScores ? bundle.factScores?.[fact.id] : undefined));\n }\n }\n\n if (sortedTasks.length > 0) {\n lines.push('');\n lines.push('### Open Tasks');\n for (const task of sortedTasks) {\n lines.push(renderTaskMarkdown(task));\n }\n }\n\n if (sortedEvents.length > 0) {\n lines.push('');\n lines.push('### Recent Events');\n for (const event of sortedEvents) {\n lines.push(renderEventMarkdown(event));\n }\n }\n } else {\n if (sortedFacts.length > 0) {\n lines.push('KNOWN FACTS:');\n for (const fact of sortedFacts) {\n lines.push(renderFactPlain(fact, opts.includeConfidence, opts.includeTags, opts.includeEntityIds, opts.includeFactScores ? bundle.factScores?.[fact.id] : undefined));\n }\n }\n if (sortedTasks.length > 0) {\n lines.push('OPEN TASKS:');\n for (const task of sortedTasks) {\n lines.push(renderTaskPlain(task));\n }\n }\n if (sortedEvents.length > 0) {\n lines.push('RECENT EVENTS:');\n for (const event of sortedEvents) {\n lines.push(renderEventPlain(event));\n }\n }\n }\n\n return lines.join('\\n');\n}\n","import type { GraphNeighborhood, WikiEdge } from '../types';\n\n/**\n * Pure presenter — dense text serialization of a GraphNeighborhood for LLM prompt\n * injection. Deterministic: same input always produces byte-identical output\n * (matters for prompt caching).\n */\nexport function formatGraphContext(neighborhood: GraphNeighborhood): string {\n const { nodes, edges } = neighborhood;\n if (nodes.length === 0) return '';\n\n const nodeById = new Map(nodes.map((n) => [n.id, n]));\n const nodeIndex = new Map(nodes.map((n, i) => [n.id, i]));\n const lines: string[] = [];\n\n for (const node of nodes) {\n lines.push(`[${node.okf_type ?? 'fact'}] ${node.title} (ID: ${node.id})`);\n\n const outbound = edgesByDirection(edges, node.id, 'source_id', nodeById, nodeIndex);\n const inbound = edgesByDirection(edges, node.id, 'target_id', nodeById, nodeIndex);\n\n for (const { edge, other } of outbound) {\n lines.push(` -[${edge.edge_type}]-> [${other.okf_type ?? 'fact'}] ${other.title}`);\n }\n for (const { edge, other } of inbound) {\n lines.push(` <-[${edge.edge_type}]- [${other.okf_type ?? 'fact'}] ${other.title}`);\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction edgesByDirection(\n edges: WikiEdge[],\n nodeId: string,\n endpoint: 'source_id' | 'target_id',\n nodeById: Map<string, GraphNeighborhood['nodes'][number]>,\n nodeIndex: Map<string, number>,\n) {\n const otherEndpoint = endpoint === 'source_id' ? 'target_id' : 'source_id';\n return edges\n .filter((e) => e[endpoint] === nodeId)\n .filter((e) => {\n const otherId = e[otherEndpoint];\n const selfIdx = nodeIndex.get(nodeId)!;\n const otherIdx = nodeIndex.get(otherId);\n return otherIdx !== undefined && selfIdx < otherIdx;\n })\n .map((edge) => ({ edge, other: nodeById.get(edge[otherEndpoint])! }))\n .sort(\n (a, b) =>\n a.edge.edge_type.localeCompare(b.edge.edge_type) ||\n a.other.title.localeCompare(b.other.title) ||\n a.other.id.localeCompare(b.other.id) ||\n a.edge.id.localeCompare(b.edge.id),\n );\n}\n","function shortHash(value: string): string {\n let h1 = 5381;\n let h2 = 52711;\n for (let i = 0; i < value.length; i += 1) {\n const c = value.charCodeAt(i);\n h1 = Math.imul(h1, 33) ^ c;\n h2 = Math.imul(h2, 31) ^ c;\n }\n return (h1 >>> 0).toString(16).padStart(8, '0') + (h2 >>> 0).toString(16).padStart(8, '0');\n}\n\nconst OKF_RESERVED_CONCEPT_NAMES = new Set(['index', 'log']);\n\nconst WINDOWS_RESERVED_NAMES = new Set([\n 'con',\n 'prn',\n 'aux',\n 'nul',\n 'com1',\n 'com2',\n 'com3',\n 'com4',\n 'com5',\n 'com6',\n 'com7',\n 'com8',\n 'com9',\n 'lpt1',\n 'lpt2',\n 'lpt3',\n 'lpt4',\n 'lpt5',\n 'lpt6',\n 'lpt7',\n 'lpt8',\n 'lpt9',\n]);\n\nfunction isWindowsReservedName(name: string): boolean {\n const base = name.split('.')[0];\n return WINDOWS_RESERVED_NAMES.has(base.toLowerCase());\n}\n\nexport function sanitizeForFilename(value: string): string {\n const normalized = value.normalize('NFKC');\n const sanitized = normalized\n .replace(/[^A-Za-z0-9._-]+/g, '_')\n .replace(/^\\.+/, '_')\n .replace(/_+/g, '_')\n .replace(/^[_-]+|[_-]+$/g, '');\n\n // Enforce a max base-name length so the final filename stays within typical\n // filesystem limits (~255 bytes). Reserve ~20 chars for `-<16hexchars>`.\n const MAX_BASE = 200;\n const trimmed = sanitized.length > MAX_BASE ? sanitized.slice(0, MAX_BASE) : sanitized;\n\n let baseName = trimmed && trimmed !== '.' && trimmed !== '..' ? trimmed : 'entity';\n\n // Windows disallows trailing dots and spaces in filenames.\n const withoutTrailingDotSpace = baseName.replace(/[. ]+$/, '');\n const hadTrailingDotSpace = withoutTrailingDotSpace !== baseName;\n if (hadTrailingDotSpace) {\n baseName = withoutTrailingDotSpace || 'entity';\n }\n\n const windowsReserved = isWindowsReservedName(baseName);\n const needsSuffix =\n baseName !== value || sanitized.length > MAX_BASE || hadTrailingDotSpace || windowsReserved;\n\n if (!needsSuffix) return baseName;\n\n const suffix = `-${shortHash(value)}`;\n return `${baseName}${suffix}`;\n}\n\n/** Sanitize a fact/task id for use as a concept filename (without .md). */\nexport function sanitizeConceptId(id: string): string {\n const sanitized = sanitizeForFilename(id);\n if (OKF_RESERVED_CONCEPT_NAMES.has(sanitized.toLowerCase())) {\n return `${sanitized}-${shortHash(id)}`;\n }\n return sanitized;\n}\n","import type { MemoryDump, FormattedMemoryDump, MemoryBundle, WikiFact, WikiTask, WikiEvent } from '../types';\nimport { sanitizeForFilename } from './sanitizeForFilename';\n\nfunction renderFact(f: WikiFact): string {\n const tags = (f.tags || []).join(', ');\n const source = f.source_ref ?? f.source_type;\n return `### ${f.title}\n**Tags:** ${tags}\n**Confidence:** ${f.confidence}\n**Source:** ${source}\n\n${f.body}\n\n---\n`;\n}\n\nfunction renderTask(t: WikiTask): string {\n const checked = t.status === 'done' ? 'x' : ' ';\n const note = t.status === 'done' ? ' (done)'\n : t.status === 'abandoned' ? ' (abandoned)'\n : t.status === 'in_progress' ? ' (in progress)'\n : '';\n return `- [${checked}] ${t.description}${note}\\n`;\n}\n\nfunction renderEvent(e: WikiEvent): string {\n const ts = new Date(e.created_at).toISOString();\n return `- [${ts}] (${e.event_type}) ${e.summary}\\n`;\n}\n\nfunction renderEntity(entityId: string, bundle: MemoryBundle, generatedAt: number): string {\n const lines: string[] = [];\n lines.push(`# Memory Dump: ${entityId}`);\n lines.push(`Generated: ${new Date(generatedAt).toISOString()}`);\n lines.push('');\n lines.push('## Facts');\n lines.push('');\n if (bundle.facts.length === 0) {\n lines.push('_(none)_\\n');\n } else {\n for (const f of bundle.facts) lines.push(renderFact(f));\n }\n lines.push('## Tasks');\n lines.push('');\n if (bundle.tasks.length === 0) {\n lines.push('_(none)_\\n');\n } else {\n for (const t of bundle.tasks) lines.push(renderTask(t));\n }\n lines.push('');\n lines.push('## Recent Events');\n lines.push('');\n if (bundle.events.length === 0) {\n lines.push('_(none)_\\n');\n } else {\n for (const e of bundle.events) lines.push(renderEvent(e));\n }\n return lines.join('\\n');\n}\n\nfunction formatEntityFileName(entityId: string): string {\n return `${sanitizeForFilename(entityId)}.md`;\n}\n\nexport function formatMemoryDump(dump: MemoryDump): FormattedMemoryDump {\n const files = Object.entries(dump.entities).map(([entityId, bundle]) => ({\n name: formatEntityFileName(entityId),\n content: renderEntity(entityId, bundle, dump.generatedAt),\n }));\n\n // Strip embedding_blob from each fact before JSON-serialising the manifest.\n // exportDump() now includes raw Uint8Array blobs for importDump() round-trips,\n // but those binaries serve no purpose in a human-readable manifest and can\n // massively inflate its size for non-trivial datasets.\n const manifestDump: MemoryDump = {\n generatedAt: dump.generatedAt,\n entities: Object.fromEntries(\n Object.entries(dump.entities).map(([entityId, bundle]) => [\n entityId,\n {\n ...bundle,\n facts: bundle.facts.map(f => {\n const { embedding_blob: _blob, ...rest } = f as WikiFact & { embedding_blob?: unknown };\n return rest as WikiFact;\n }),\n },\n ])\n ),\n };\n\n return {\n manifest: JSON.stringify(manifestDump, null, 2),\n files,\n };\n}\n","import type { MemoryDump, WikiEdge, WikiFact, WikiTask, WikiEvent } from '../types';\nimport {\n appendEventIdComment,\n appendRelatedSection,\n buildConceptDocument,\n buildEntityIndexMd,\n buildRootIndexMd,\n buildLogMd,\n serializeActorString,\n type OkfFile,\n type OkfFrontmatter,\n type OkfIndexEntry,\n type OkfIndexSection,\n type OkfLogEntry,\n} from '@equationalapplications/core-okf';\nimport { sanitizeConceptId, sanitizeForFilename } from './sanitizeForFilename';\n\nexport type OkfFormatProfile = 'llm-wiki/1' | 'llm-wiki/2';\n\nexport interface FormatOkfBundleOptions {\n /** Defaults to 'llm-wiki/2'. Pass 'llm-wiki/1' to force the v0.1 subset. */\n profile?: OkfFormatProfile;\n}\n\nconst DEFAULT_PROFILE: OkfFormatProfile = 'llm-wiki/2';\n\n/**\n * Format an epoch-ms timestamp as ISO 8601 with a double fallback:\n * 1. NaN / Infinity / non-finite -> epoch (0).\n * 2. Outside JS Date's representable range (e.g. 1e300) -> epoch.\n * `new Date(finite).toISOString()` throws RangeError only when the value is\n * outside the supported range; a finite but absurd number still throws. We\n * validate the constructed Date before calling toISOString so the helper\n * never aborts the bundle export.\n */\nfunction isoOrFallback(updatedAt: number): string {\n if (!Number.isFinite(updatedAt)) return new Date(0).toISOString();\n const d = new Date(updatedAt);\n if (!Number.isFinite(d.getTime())) return new Date(0).toISOString();\n return d.toISOString();\n}\n\nfunction isoDateOrOmit(ms: number | null | undefined): string | undefined {\n if (ms == null || !Number.isFinite(ms)) return undefined;\n const d = new Date(ms);\n if (!Number.isFinite(d.getTime())) return undefined;\n return d.toISOString().slice(0, 10);\n}\n\nfunction factFrontmatterV2(f: WikiFact): OkfFrontmatter {\n return {\n type: f.okf_type ?? 'fact',\n title: f.title,\n tags: f.tags,\n // `timestamp` rides along deliberately even on the v0.2 path — a naive\n // consumer that only understands the v0.1 key still gets a readable date\n // without needing flow-mapping support. `generated.at` is the canonical\n // v0.2 field and always wins on import when both are present (spec §2.4).\n timestamp: isoOrFallback(f.updated_at),\n resource: f.source_ref ?? undefined,\n id: f.id,\n entity_id: f.entity_id,\n confidence: f.confidence,\n source_type: f.source_type,\n source_hash: f.source_hash,\n created_at: f.created_at,\n access_count: f.access_count,\n last_accessed_at: f.last_accessed_at,\n deleted_at: f.deleted_at,\n // OKF v0.2\n status: f.lifecycle_status ?? 'stable',\n ...(isoDateOrOmit(f.stale_after) ? { stale_after: isoDateOrOmit(f.stale_after) } : {}),\n // Omit `generated` entirely when there's no actor on record — never\n // fabricate a `generated_by` (mirrors the import side's rule in §4.8:\n // it never invents one either, so export must not manufacture one that\n // would then round-trip back in as if it had always been asserted).\n ...(f.generated_by ? { generated: { by: f.generated_by, at: isoOrFallback(f.updated_at) } } : {}),\n // Omit `verified`/`sources` when empty — an emitted `[]` is not the same\n // shape as an absent key (spec §5.3 derives `unverified` from \"no\n // `verified` key\", not from \"empty `verified` list\").\n ...(f.okf_verified && f.okf_verified.length > 0 ? { verified: f.okf_verified } : {}),\n ...(f.okf_sources && f.okf_sources.length > 0 ? { sources: f.okf_sources } : {}),\n ...(f.okf_usage_window ? { usage_window: f.okf_usage_window } : {}),\n // Temporal (spec 2026-09-29 §10.9): flat epoch-ms keys, like created_at.\n ...(f.valid_from != null ? { valid_from: f.valid_from } : {}),\n ...(f.valid_to != null ? { valid_to: f.valid_to } : {}),\n ...(f.superseded_by != null ? { superseded_by: f.superseded_by } : {}),\n ...(f.superseded_at != null ? { superseded_at: f.superseded_at } : {}),\n };\n}\n\nfunction taskFrontmatterV2(t: WikiTask): OkfFrontmatter {\n return {\n type: t.okf_type ?? 'task',\n title: t.description,\n timestamp: isoOrFallback(t.updated_at), // see factFrontmatterV2 comment — deliberate back-compat duplication\n id: t.id,\n entity_id: t.entity_id,\n status: t.lifecycle_status ?? 'stable', // OKF v0.2 lifecycle\n execution_status: t.status, // execution state under renamed key\n priority: t.priority,\n created_at: t.created_at,\n resolved_at: t.resolved_at,\n deleted_at: t.deleted_at,\n // OKF v0.2 — symmetric with facts (spec §2.5): stale_after applies to\n // tasks too (a hallucinated task needs a freshness signal as much as a\n // hallucinated fact does).\n ...(isoDateOrOmit(t.stale_after) ? { stale_after: isoDateOrOmit(t.stale_after) } : {}),\n ...(t.generated_by ? { generated: { by: t.generated_by, at: isoOrFallback(t.updated_at) } } : {}),\n ...(t.okf_verified && t.okf_verified.length > 0 ? { verified: t.okf_verified } : {}),\n ...(t.okf_sources && t.okf_sources.length > 0 ? { sources: t.okf_sources } : {}),\n ...(t.okf_usage_window ? { usage_window: t.okf_usage_window } : {}),\n };\n}\n\nfunction factFrontmatterV1(f: WikiFact): OkfFrontmatter {\n return {\n type: f.okf_type ?? 'fact',\n title: f.title,\n tags: f.tags,\n timestamp: isoOrFallback(f.updated_at),\n resource: f.source_ref ?? undefined,\n id: f.id,\n entity_id: f.entity_id,\n confidence: f.confidence,\n source_type: f.source_type,\n source_hash: f.source_hash,\n created_at: f.created_at,\n access_count: f.access_count,\n last_accessed_at: f.last_accessed_at,\n deleted_at: f.deleted_at,\n };\n}\n\nfunction taskFrontmatterV1(t: WikiTask): OkfFrontmatter {\n return {\n type: t.okf_type ?? 'task',\n title: t.description,\n timestamp: isoOrFallback(t.updated_at),\n id: t.id,\n entity_id: t.entity_id,\n status: t.status,\n priority: t.priority,\n created_at: t.created_at,\n resolved_at: t.resolved_at,\n deleted_at: t.deleted_at,\n };\n}\n\nfunction formatLogDate(timestampMs: number): string {\n return new Date(timestampMs).toISOString().slice(0, 10);\n}\n\nfunction conceptRelativePath(sourceFilePath: string, targetFilePath: string): string {\n const sourceDir = sourceFilePath.slice(0, sourceFilePath.lastIndexOf('/'));\n const targetDir = targetFilePath.slice(0, targetFilePath.lastIndexOf('/'));\n const targetName = targetFilePath.slice(targetFilePath.lastIndexOf('/') + 1);\n if (sourceDir === targetDir) return `./${targetName}`;\n if (sourceDir.endsWith('/facts') && targetDir.endsWith('/tasks')) return `../tasks/${targetName}`;\n if (sourceDir.endsWith('/tasks') && targetDir.endsWith('/facts')) return `../facts/${targetName}`;\n return targetFilePath.replace(/^entities\\/[^/]+\\//, '');\n}\n\nfunction buildEventLogEntries(\n events: WikiEvent[],\n factIdToFilename: Map<string, string>,\n): OkfLogEntry[] {\n return events.map(e => {\n const factFilename = e.related_entry_id ? factIdToFilename.get(e.related_entry_id) : undefined;\n const summary = e.summary\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\[/g, '\\\\[')\n .replace(/\\]/g, '\\\\]')\n .replace(/\\r?\\n/g, ' ');\n\n const text = factFilename\n ? `(${e.event_type}) [${summary}](./facts/${factFilename}.md)`\n : `(${e.event_type}) ${summary}`;\n return { date: formatLogDate(e.created_at), text: appendEventIdComment(text, e.id) };\n });\n}\n\nexport function formatOkfBundle(\n dump: MemoryDump,\n options?: FormatOkfBundleOptions,\n): { files: OkfFile[] } {\n const profile: OkfFormatProfile = options?.profile ?? DEFAULT_PROFILE;\n const okfVersion = profile === 'llm-wiki/2' ? '0.2' : '0.1';\n const factFm = profile === 'llm-wiki/2' ? factFrontmatterV2 : factFrontmatterV1;\n const taskFm = profile === 'llm-wiki/2' ? taskFrontmatterV2 : taskFrontmatterV1;\n\n const files: OkfFile[] = [];\n const rootEntries: OkfIndexEntry[] = [];\n\n for (const [entityId, bundle] of Object.entries(dump.entities)) {\n const dir = sanitizeForFilename(entityId);\n const factIdToFilename = new Map(\n bundle.facts.map(f => [f.id, sanitizeConceptId(f.id)] as const),\n );\n\n const idToConceptPath = new Map<string, string>();\n for (const f of bundle.facts) {\n idToConceptPath.set(f.id, `entities/${dir}/facts/${factIdToFilename.get(f.id)!}.md`);\n }\n for (const t of bundle.tasks) {\n idToConceptPath.set(t.id, `entities/${dir}/tasks/${sanitizeConceptId(t.id)}.md`);\n }\n\n const edgesBySource = new Map<string, WikiEdge[]>();\n for (const edge of bundle.edges ?? []) {\n const group = edgesBySource.get(edge.source_id) ?? [];\n group.push(edge);\n edgesBySource.set(edge.source_id, group);\n }\n\n function relatedLinksFor(sourcePath: string, sourceId: string) {\n return (edgesBySource.get(sourceId) ?? [])\n .map(edge => {\n const targetPath = idToConceptPath.get(edge.target_id);\n if (!targetPath) return null;\n return { edge_type: edge.edge_type, path: conceptRelativePath(sourcePath, targetPath) };\n })\n .filter((link): link is { edge_type: string; path: string } => link != null);\n }\n\n const factEntries: OkfIndexEntry[] = bundle.facts.map(f => ({\n path: `facts/${factIdToFilename.get(f.id)!}.md`,\n title: f.title,\n }));\n for (const f of bundle.facts) {\n const factPath = `entities/${dir}/facts/${factIdToFilename.get(f.id)!}.md`;\n const factBody = appendRelatedSection(f.body, relatedLinksFor(factPath, f.id));\n files.push({\n path: factPath,\n content: buildConceptDocument(factFm(f), factBody),\n });\n }\n\n const taskEntries: OkfIndexEntry[] = bundle.tasks.map(t => ({\n path: `tasks/${sanitizeConceptId(t.id)}.md`,\n title: t.description,\n }));\n for (const t of bundle.tasks) {\n const taskPath = `entities/${dir}/tasks/${sanitizeConceptId(t.id)}.md`;\n const taskBody = appendRelatedSection('', relatedLinksFor(taskPath, t.id));\n files.push({\n path: taskPath,\n content: buildConceptDocument(taskFm(t), taskBody),\n });\n }\n\n files.push({\n path: `entities/${dir}/log.md`,\n content: buildLogMd(buildEventLogEntries(bundle.events, factIdToFilename)),\n });\n\n const entityIndexSections: OkfIndexSection[] = [\n { heading: 'Facts', entries: factEntries },\n { heading: 'Tasks', entries: taskEntries },\n ];\n files.push({\n path: `entities/${dir}/index.md`,\n content: buildEntityIndexMd({\n summary: bundle.summary,\n sections: entityIndexSections,\n }),\n });\n\n rootEntries.push({ path: `entities/${dir}/index.md`, title: entityId });\n }\n\n files.push({\n path: 'index.md',\n content: buildRootIndexMd(\n okfVersion,\n rootEntries.length > 0 ? [{ heading: 'Entities', entries: rootEntries }] : [],\n { profile },\n ),\n });\n\n return { files };\n}","import type { MemoryDump, WikiFact, WikiTask, WikiEvent, WikiEdge } from '../types';\nimport type { OkfFile, OkfFrontmatter, OkfFrontmatterValue } from '@equationalapplications/core-okf';\nimport {\n parseConcept,\n parseLogMd,\n parseRootIndexMd,\n parseEntityIndexMd,\n parseEventIdComment,\n splitRelatedSection,\n isAllowedOkfPath,\n extractMarkdownLinks,\n parseVerifiedFlexible,\n parseCitationsList,\n latestVerified,\n formatVerifiedJson,\n formatSourcesJson,\n type OkfSource,\n type OkfVerified,\n} from '@equationalapplications/core-okf';\nimport { generateId } from './ids';\n\nexport interface OkfImportOptions {\n typeMapping?: Record<string, 'fact' | 'task' | 'ignore'>;\n defaultSchema?: 'fact' | 'task' | 'ignore';\n}\n\ntype Route = 'fact' | 'task' | 'ignore';\n\nconst CONFIDENCE_VALUES = new Set(['certain', 'inferred', 'tentative']);\nconst SOURCE_TYPES = new Set([\n 'user_stated',\n 'librarian_inferred',\n 'user_confirmed',\n 'immutable_document',\n]);\nconst TASK_STATUSES = new Set(['pending', 'in_progress', 'done', 'abandoned']);\nconst EVENT_TYPES = new Set(['observation', 'decision', 'action', 'outcome']);\n\nfunction basenameMd(filePath: string): string {\n const name = filePath.slice(filePath.lastIndexOf('/') + 1);\n return name.endsWith('.md') ? name.slice(0, -3) : name;\n}\n\nfunction isConceptFile(filePath: string): boolean {\n if (!filePath.endsWith('.md')) return false;\n if (filePath.endsWith('/index.md') || filePath === 'index.md') return false;\n if (filePath.endsWith('/log.md') || filePath === 'log.md') return false;\n return true;\n}\n\nfunction isStructuralPath(filePath: string): boolean {\n return (\n filePath.endsWith('/index.md') ||\n filePath === 'index.md' ||\n filePath.endsWith('/log.md') ||\n filePath === 'log.md'\n );\n}\n\nfunction posixDirname(filePath: string): string {\n const idx = filePath.lastIndexOf('/');\n return idx === -1 ? '' : filePath.slice(0, idx);\n}\n\nfunction resolveRelativePath(fromFile: string, linkPath: string): string {\n const baseDir = posixDirname(fromFile);\n const segments = [...(baseDir ? baseDir.split('/') : []), ...linkPath.split('/')];\n const resolved: string[] = [];\n for (const seg of segments) {\n if (seg === '' || seg === '.') continue;\n if (seg === '..') {\n resolved.pop();\n continue;\n }\n resolved.push(seg);\n }\n return resolved.join('/');\n}\n\nfunction decodeLinkPath(path: string): string {\n if (!path.includes('%')) return path;\n try {\n return decodeURIComponent(path);\n } catch {\n return path;\n }\n}\n\nfunction addPathAliases(map: Map<string, string>, filePath: string, resolvedId: string): void {\n map.set(filePath, resolvedId);\n const withoutDot = filePath.replace(/^\\.\\//, '');\n if (withoutDot !== filePath) map.set(withoutDot, resolvedId);\n const entityRelative = filePath.replace(/^entities\\/[^/]+\\//, '');\n if (entityRelative !== filePath) {\n map.set(entityRelative, resolvedId);\n map.set(`./${entityRelative}`, resolvedId);\n }\n}\n\nfunction lookupResolvedId(map: Map<string, string>, path: string): string | undefined {\n const normalized = path.replace(/^\\.\\//, '');\n return map.get(path) ?? map.get(normalized) ?? map.get(`./${normalized}`);\n}\n\nfunction stripLinkSuffix(linkPath: string): string {\n const hashIdx = linkPath.indexOf('#');\n const queryIdx = linkPath.indexOf('?');\n if (hashIdx === -1 && queryIdx === -1) return linkPath;\n const cut =\n hashIdx === -1 ? queryIdx : queryIdx === -1 ? hashIdx : Math.min(hashIdx, queryIdx);\n return linkPath.slice(0, cut);\n}\n\nfunction resolveRoute(filePath: string, frontmatterType: string, options?: OkfImportOptions): Route {\n if (\n options?.typeMapping &&\n Object.prototype.hasOwnProperty.call(options.typeMapping, frontmatterType)\n ) {\n return options.typeMapping[frontmatterType]!;\n }\n if (filePath.includes('/facts/')) return 'fact';\n if (filePath.includes('/tasks/')) return 'task';\n return options?.defaultSchema ?? 'fact';\n}\n\nfunction parseFrontmatterTimestamp(value: OkfFrontmatterValue | undefined, fallback: number): number {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string') {\n const parsed = Date.parse(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return fallback;\n}\n\n/**\n * Parse an OKF v0.2 `stale_after` YYYY-MM-DD wire string into an epoch ms\n * value. Returns null on non-string, regex mismatch, or a calendar-invalid\n * date — the previous inline regex accepted any three numeric components, so\n * `2026-13-45` would yield NaN and crash the SQLite bind downstream.\n */\nfunction parseStaleAfterRaw(raw: unknown): number | null {\n if (typeof raw !== 'string') return null;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(raw);\n if (!m) return null;\n const year = Number(m[1]);\n const month = Number(m[2]);\n const day = Number(m[3]);\n const ms = Date.UTC(year, month - 1, day);\n if (!Number.isFinite(ms)) return null;\n // Reject calendar-invalid dates that Date.UTC silently normalizes (e.g.\n // 2025-02-29 → 2025-03-01). Compare the round-tripped components.\n const d = new Date(ms);\n if (\n d.getUTCFullYear() !== year ||\n d.getUTCMonth() + 1 !== month ||\n d.getUTCDate() !== day\n ) {\n return null;\n }\n return ms;\n}\n\nfunction unescapeLogSummary(summary: string): string {\n return summary.replace(/\\\\\\]/g, ']').replace(/\\\\\\[/g, '[').replace(/\\\\\\\\/g, '\\\\');\n}\n\n// linear: label group cannot start a plain char on `\\` or `[` (closes CodeQL #8); plain branch starts on \\S (closes CodeQL #1)\nconst LOG_LINE_PATTERN = /^\\(([^)]+)\\)\\s*(?:\\[((?:\\\\.|[^\\[\\]\\\\])*)\\]\\(([^)]+)\\)|(\\S.*))$/;\n\nfunction parseLogEntryText(text: string): {\n event_type: WikiEvent['event_type'];\n summary: string;\n linkPath?: string;\n} | null {\n const match = LOG_LINE_PATTERN.exec(text.trim());\n if (!match) return null;\n const [, rawType, linkedSummary, linkPath, plainSummary] = match;\n const event_type = EVENT_TYPES.has(rawType) ? (rawType as WikiEvent['event_type']) : 'observation';\n if (linkPath) {\n return { event_type, summary: unescapeLogSummary(linkedSummary), linkPath };\n }\n return { event_type, summary: (plainSummary ?? '').trim() };\n}\n\nfunction frontmatterToFact(\n entityId: string,\n id: string,\n frontmatter: OkfFrontmatter,\n body: string,\n now: number,\n): WikiFact {\n const created_at = parseFrontmatterTimestamp(frontmatter.created_at, now);\n // Precedence (spec §2.4): v0.2 `generated.at` -> v0.1 `timestamp` -> legacy\n // `updated_at` -> `now`. The previous order swapped `updated_at` ahead of\n // the other two, so a present-but-finite `updated_at` clobbered\n // `generated.at`. We nest the fallbacks so the first finite wins.\n const updated_at = parseFrontmatterTimestamp(\n (frontmatter as any).generated?.at,\n parseFrontmatterTimestamp(\n frontmatter.timestamp,\n parseFrontmatterTimestamp(frontmatter.updated_at, now),\n ),\n );\n\n const verified: OkfVerified = parseVerifiedFlexible((frontmatter as any).verified);\n const rawSources = (frontmatter as any).sources;\n const hasSourcesKey = rawSources !== undefined;\n const sources: OkfSource[] = Array.isArray(rawSources) ? rawSources as OkfSource[] : [];\n const usageWindow = (frontmatter as any).usage_window && typeof (frontmatter as any).usage_window === 'object'\n ? (frontmatter as any).usage_window as { from: string; to: string }\n : null;\n const lastV = latestVerified(verified, now);\n const lifecycleRaw = (frontmatter as any).status;\n const lifecycle_status: 'draft' | 'stable' | 'deprecated' =\n lifecycleRaw === 'draft' || lifecycleRaw === 'stable' || lifecycleRaw === 'deprecated'\n ? lifecycleRaw : 'stable';\n const staleAfterRaw = (frontmatter as any).stale_after;\n const stale_after = parseStaleAfterRaw(staleAfterRaw);\n const generated_by = (frontmatter as any).generated?.by ?? null;\n\n // Spec §13.1 fallback (applies to v0.1, profile-0, AND v0.2 paths): body\n // `# Citations` -> synthetic sources, one entry per URL. The fallback only\n // fires when the `sources` key is ABSENT — a bundle that explicitly declares\n // `sources: []` (an author clearing provenance) MUST NOT have body citations\n // silently synthesized back into it. `hasSourcesKey` distinguishes absent\n // from explicitly-empty.\n if (!hasSourcesKey) {\n const urls = parseCitationsList(body);\n for (const url of urls) {\n sources.push({ resource: url });\n }\n }\n\n return {\n id,\n entity_id: entityId,\n title: typeof frontmatter.title === 'string' ? frontmatter.title : '',\n body,\n tags: Array.isArray(frontmatter.tags)\n ? frontmatter.tags.filter((t): t is string => typeof t === 'string')\n : [],\n confidence: CONFIDENCE_VALUES.has(String(frontmatter.confidence))\n ? (frontmatter.confidence as WikiFact['confidence'])\n : 'tentative',\n source_type: SOURCE_TYPES.has(String(frontmatter.source_type))\n ? (frontmatter.source_type as WikiFact['source_type'])\n : 'user_stated',\n source_hash: typeof frontmatter.source_hash === 'string' ? frontmatter.source_hash : null,\n source_ref: typeof frontmatter.resource === 'string' ? frontmatter.resource : null,\n created_at,\n updated_at,\n last_accessed_at:\n frontmatter.last_accessed_at != null\n ? parseFrontmatterTimestamp(frontmatter.last_accessed_at, now)\n : null,\n access_count: typeof frontmatter.access_count === 'number' ? frontmatter.access_count : 0,\n deleted_at:\n frontmatter.deleted_at != null ? parseFrontmatterTimestamp(frontmatter.deleted_at, 0) : null,\n okf_type: frontmatter.type,\n // OKF v0.2\n lifecycle_status,\n stale_after,\n generated_by,\n okf_sources: sources,\n okf_verified: verified,\n okf_usage_window: usageWindow,\n last_verified_at: lastV?.at ?? null,\n last_verified_by: lastV?.by ?? null,\n ...optionalEpoch('valid_from', (frontmatter as any).valid_from),\n ...optionalEpoch('valid_to', (frontmatter as any).valid_to),\n ...(typeof (frontmatter as any).superseded_by === 'string' ? { superseded_by: (frontmatter as any).superseded_by } : {}),\n ...optionalEpoch('superseded_at', (frontmatter as any).superseded_at),\n };\n}\n\n/** Temporal epoch-ms frontmatter keys (spec 2026-09-29 §10.9): keep only finite,\n * non-negative numbers; anything else means \"absent\" and the key stays off. */\nfunction optionalEpoch<K extends string>(key: K, v: unknown): Partial<Record<K, number>> {\n return typeof v === 'number' && Number.isFinite(v) && v >= 0 ? ({ [key]: Math.trunc(v) } as Record<K, number>) : {};\n}\n\nfunction frontmatterToTask(\n entityId: string,\n id: string,\n frontmatter: OkfFrontmatter,\n now: number,\n // Treat profile-1 explicit and version-only legacy the same: in both cases\n // `status` on the wire is the v0.1 execution state. Profile-2 (and unknown\n // profile with okf_version 0.2) uses the v0.2 rename rule.\n usesV1StatusRule: boolean,\n): WikiTask {\n const created_at = parseFrontmatterTimestamp(frontmatter.created_at, now);\n // Precedence (spec §2.4) — same nested-fallback chain as frontmatterToFact.\n const updated_at = parseFrontmatterTimestamp(\n (frontmatter as any).generated?.at,\n parseFrontmatterTimestamp(\n frontmatter.timestamp,\n parseFrontmatterTimestamp(frontmatter.updated_at, now),\n ),\n );\n\n const verified: OkfVerified = parseVerifiedFlexible((frontmatter as any).verified);\n const sources: OkfSource[] = Array.isArray((frontmatter as any).sources) ? (frontmatter as any).sources as OkfSource[] : [];\n const usageWindow = (frontmatter as any).usage_window && typeof (frontmatter as any).usage_window === 'object'\n ? (frontmatter as any).usage_window as { from: string; to: string }\n : null;\n const lastV = latestVerified(verified, now);\n const lifecycleRaw = (frontmatter as any).status;\n const lifecycle_status: 'draft' | 'stable' | 'deprecated' =\n lifecycleRaw === 'draft' || lifecycleRaw === 'stable' || lifecycleRaw === 'deprecated'\n ? lifecycleRaw : 'stable';\n // stale_after is symmetric with facts (spec §2.5) — parsed the same way,\n // not hardcoded to null.\n const staleAfterRaw = (frontmatter as any).stale_after;\n const stale_after = parseStaleAfterRaw(staleAfterRaw);\n\n // Status rename rule (spec §2.3):\n // - v0.2: wire `status` = lifecycle (already in lifecycle_status above);\n // wire `execution_status` = execution -> `task.status`.\n // - v0.1 / profile 0: wire `status` = execution -> `task.status`; lifecycle\n // is implicit 'stable'. Profile-1 bundles are explicit about being v0.1\n // (`profile: llm-wiki/1`); profile-0 (no profile key, `okf_version: 0.1`)\n // is the version-only fallback; both MUST use the v0.1 rule.\n const executionRaw = (frontmatter as any).execution_status;\n let executionState: WikiTask['status'];\n if (usesV1StatusRule) {\n executionState = TASK_STATUSES.has(String(frontmatter.status))\n ? (frontmatter.status as WikiTask['status']) : 'pending';\n } else {\n // v0.2 (or unknown profile — best-effort per spec §6 \"profile key unknown\").\n executionState = TASK_STATUSES.has(String(executionRaw))\n ? (executionRaw as WikiTask['status'])\n : TASK_STATUSES.has(String(frontmatter.status))\n ? (frontmatter.status as WikiTask['status'])\n : 'pending';\n }\n\n return {\n id,\n entity_id: entityId,\n description: typeof frontmatter.title === 'string' ? frontmatter.title : '',\n status: executionState,\n priority: typeof frontmatter.priority === 'number' ? frontmatter.priority : 0,\n created_at,\n updated_at,\n resolved_at:\n frontmatter.resolved_at != null\n ? parseFrontmatterTimestamp(frontmatter.resolved_at, now)\n : null,\n deleted_at:\n frontmatter.deleted_at != null ? parseFrontmatterTimestamp(frontmatter.deleted_at, 0) : null,\n okf_type: frontmatter.type,\n // OKF v0.2\n lifecycle_status,\n stale_after,\n generated_by: (frontmatter as any).generated?.by ?? null,\n okf_sources: sources,\n okf_verified: verified,\n okf_usage_window: usageWindow,\n last_verified_at: lastV?.at ?? null,\n last_verified_by: lastV?.by ?? null,\n };\n}\n\nfunction findLogMdPath(files: OkfFile[]): string | undefined {\n return files.find(f => f.path.endsWith('/log.md') || f.path === 'log.md')?.path;\n}\n\nfunction extractEdgesFromLinks(\n filePath: string,\n resolvedId: string,\n links: Array<{ text: string; path: string }>,\n pathToResolvedId: Map<string, string>,\n entityId: string,\n now: number,\n seenEdges: Set<string>,\n edges: WikiEdge[],\n): void {\n for (const link of links) {\n const strippedPath = stripLinkSuffix(decodeLinkPath(link.path));\n const directTargetId = lookupResolvedId(pathToResolvedId, strippedPath);\n const resolvedTargetPath = resolveRelativePath(filePath, strippedPath);\n if (isStructuralPath(strippedPath) || isStructuralPath(resolvedTargetPath)) continue;\n const targetId = directTargetId ?? lookupResolvedId(pathToResolvedId, resolvedTargetPath);\n if (!targetId) continue;\n const edgeKey = `${resolvedId}\\u0000${targetId}\\u0000${link.text}`;\n if (seenEdges.has(edgeKey)) continue;\n seenEdges.add(edgeKey);\n edges.push({\n id: generateId(),\n entity_id: entityId,\n source_id: resolvedId,\n target_id: targetId,\n edge_type: link.text,\n created_at: now,\n });\n }\n}\n\nexport function parseOkfBundle(\n entityId: string,\n files: OkfFile[],\n options?: OkfImportOptions,\n): MemoryDump {\n const now = Date.now();\n const normalizeOkfPath = (p: string) => p.replace(/^\\.\\//, '').replace(/\\\\/g, '/');\n\n const normalizedFiles = files.map(f => ({ ...f, path: normalizeOkfPath(f.path) }));\n\n const allowlistedFiles = normalizedFiles.filter(f => isAllowedOkfPath(f.path));\n\n const entityDirs = new Set(\n allowlistedFiles\n .map(f => /^entities\\/([^/]+)\\//.exec(f.path)?.[1])\n .filter((dir): dir is string => !!dir),\n );\n if (entityDirs.size > 1) {\n throw new Error(\n `parseOkfBundle: expected a single-entity bundle for \"${entityId}\", found entities: ${Array.from(entityDirs).join(', ')}`,\n );\n }\n const entityDir = entityDirs.values().next().value ?? entityId;\n const entityPrefix = `entities/${entityDir}/`;\n\n const allowedFiles = allowlistedFiles.filter(\n f => f.path === 'index.md' || f.path.startsWith(entityPrefix),\n );\n const rootIndex = allowedFiles.find(f => f.path === 'index.md');\n const profileMeta = rootIndex ? parseRootIndexMd(rootIndex.content) : {};\n const okfVersion = profileMeta.okf_version;\n const profile = profileMeta.profile;\n const isProfile1 = profile === 'llm-wiki/1';\n const isProfile2 = profile === 'llm-wiki/2';\n const isLegacyV1 = profile === undefined && okfVersion === '0.1';\n\n // Entity summary is a profile >= 1 feature (§4 of the profile doc). The\n // documented detection order (§4.8 detection plan) names four v0.1 and v0.2\n // entry points: explicit profile, version-only v0.1, version-only v0.2, and\n // unknown-profile v0.2 (best-effort). All four should pick up the summary.\n const isVersionOnlyV2 = profile === undefined && okfVersion === '0.2';\n const isUnknownProfileV2 = profile !== undefined && profile !== 'llm-wiki/1' && profile !== 'llm-wiki/2' && okfVersion === '0.2';\n const summaryEligible = isProfile1 || isProfile2 || isLegacyV1 || isVersionOnlyV2 || isUnknownProfileV2;\n let entitySummary: string | undefined;\n const entityIndex = allowedFiles.find(f => f.path === `${entityPrefix}index.md`);\n if (summaryEligible && entityIndex) {\n const summary = parseEntityIndexMd(entityIndex.content).summary;\n entitySummary = summary || undefined;\n }\n\n const pathToResolvedId = new Map<string, string>();\n\n for (const file of allowedFiles) {\n if (!isConceptFile(file.path)) continue;\n const { frontmatter } = parseConcept(file.content);\n const route = resolveRoute(file.path, frontmatter.type ?? '', options);\n if (route === 'ignore') continue;\n const resolvedId =\n typeof frontmatter.id === 'string' && frontmatter.id ? frontmatter.id : basenameMd(file.path);\n addPathAliases(pathToResolvedId, file.path, resolvedId);\n }\n\n const facts: WikiFact[] = [];\n const tasks: WikiTask[] = [];\n const edges: WikiEdge[] = [];\n let logContent: string | null = null;\n const logMdPath = findLogMdPath(allowedFiles);\n\n for (const file of allowedFiles) {\n if (file.path.endsWith('/log.md') || file.path === 'log.md') {\n logContent = file.content;\n continue;\n }\n if (!isConceptFile(file.path)) continue;\n\n const { frontmatter, body } = parseConcept(file.content);\n const route = resolveRoute(file.path, frontmatter.type ?? '', options);\n if (route === 'ignore') continue;\n\n const resolvedId =\n typeof frontmatter.id === 'string' && frontmatter.id ? frontmatter.id : basenameMd(file.path);\n\n const { body: storedBody, relatedLinks } = splitRelatedSection(body);\n const edgeLinks = (isProfile1 || isLegacyV1)\n ? relatedLinks\n : [...relatedLinks, ...extractMarkdownLinks(storedBody)];\n\n // Task status rename rule (spec §2.3) — v0.1 wire uses `status` as\n // execution state; v0.2 wire uses `status` as lifecycle and adds\n // `execution_status`. The flag we pass below is true when we are NOT\n // reading this task as a v0.2-style bundle.\n const usesV1StatusRule = isProfile1 || isLegacyV1 || (profile === undefined && okfVersion === undefined);\n\n if (route === 'fact') {\n facts.push(frontmatterToFact(entityId, resolvedId, frontmatter, storedBody, now));\n } else {\n tasks.push(frontmatterToTask(entityId, resolvedId, frontmatter, now, usesV1StatusRule));\n }\n\n const seenEdges = new Set<string>();\n extractEdgesFromLinks(\n file.path,\n resolvedId,\n edgeLinks,\n pathToResolvedId,\n entityId,\n now,\n seenEdges,\n edges,\n );\n }\n\n const events: WikiEvent[] = [];\n if (logContent != null) {\n const logPath = logMdPath ?? `entities/${entityId}/log.md`;\n for (const entry of parseLogMd(logContent)) {\n const { text, eventId } = parseEventIdComment(entry.text);\n const parsed = parseLogEntryText(text);\n if (!parsed) continue;\n let related_entry_id: string | null = null;\n if (parsed.linkPath) {\n const targetPath = resolveRelativePath(\n logPath,\n stripLinkSuffix(decodeLinkPath(parsed.linkPath)),\n );\n if (!isStructuralPath(targetPath) && targetPath.includes('/facts/')) {\n related_entry_id = lookupResolvedId(pathToResolvedId, targetPath) ?? null;\n }\n }\n const created_at = new Date(`${entry.date}T00:00:00.000Z`).getTime();\n if (!Number.isFinite(created_at)) continue;\n\n events.push({\n id: eventId ?? generateId('evt_'),\n entity_id: entityId,\n event_type: parsed.event_type,\n summary: parsed.summary,\n related_entry_id,\n created_at,\n });\n }\n }\n\n return {\n generatedAt: now,\n entities: {\n [entityId]: { facts, tasks, events, edges, summary: entitySummary },\n },\n };\n}\n","import type { ReadOptions } from './types';\n\nexport interface LibrarianOptions {\n /** If provided, replaces the default Librarian system instructions. */\n systemPrompt?: string;\n /** entity_id -> score multiplier, forwarded to WikiMemory.read() as tierWeights. */\n entityWeights?: Record<string, number>;\n /** Forwarded to WikiMemory.read() for zero-weight filler context. */\n includeZeroWeightEntities?: boolean;\n temperature?: number;\n}\n\nexport interface LibrarianPromptVariables {\n context: string;\n tasks: string;\n query: string;\n}\n\nexport const DEFAULT_LIBRARIAN_SYNTHESIS_PROMPT = `You are a careful memory synthesis assistant.\nUse only the retrieved context when answering the request.\nPreserve source provenance when facts come from different entity namespaces.\n\nRequest:\n{{query}}\n\nRetrieved context:\n{{context}}\n\nOpen tasks:\n{{tasks}}`;\n\nexport function hydrateLibrarianPrompt(\n template: string,\n variables: LibrarianPromptVariables,\n): string {\n return template.replace(/\\{\\{(context|tasks|query)\\}\\}/g, (_, key) => variables[key as keyof LibrarianPromptVariables]);\n}\n\nexport function validateLibrarianPromptTemplate(\n template: string,\n options: { custom: boolean; taskCount: number },\n): string[] {\n if (!options.custom) return [];\n\n const warnings: string[] = [];\n if (!template.includes('{{context}}')) {\n warnings.push('Custom Librarian systemPrompt omits {{context}}; retrieved memory will not be injected.');\n }\n if (!template.includes('{{query}}')) {\n warnings.push('Custom Librarian systemPrompt omits {{query}}; the original request will not be injected.');\n }\n if (options.taskCount > 0 && !template.includes('{{tasks}}')) {\n warnings.push('Custom Librarian systemPrompt omits {{tasks}} while retrieved tasks are available.');\n }\n return warnings;\n}\n\nexport function mapLibrarianOptionsToReadOptions(\n options: LibrarianOptions,\n): Pick<ReadOptions, 'tierWeights' | 'includeZeroWeightEntities'> {\n const readOptions: Pick<ReadOptions, 'tierWeights' | 'includeZeroWeightEntities'> = {};\n if (options.entityWeights !== undefined) readOptions.tierWeights = options.entityWeights;\n if (options.includeZeroWeightEntities !== undefined) {\n readOptions.includeZeroWeightEntities = options.includeZeroWeightEntities;\n }\n return readOptions;\n}\n","import { WikiMemory } from './WikiMemory';\nimport type { SQLiteAdapter, WikiOptions } from './types';\n\nexport * from './types';\nexport type { WikiOutboxEvent } from './outbox/types';\nexport { WikiMemory } from './WikiMemory';\nexport type { WikiMemoryTestAccess } from './WikiMemory';\nexport { formatContext } from './utils/formatContext';\nexport { formatGraphContext } from './utils/formatGraphContext';\nexport { formatMemoryDump } from './utils/formatMemoryDump';\nexport { formatOkfBundle, type FormatOkfBundleOptions, type OkfFormatProfile } from './utils/formatOkfBundle';\nexport { parseOkfBundle, type OkfImportOptions } from './utils/parseOkfBundle';\nexport { parseEmbedding } from './utils/embedding';\nexport { validateManifest } from './utils/ontology';\nexport { configureRandomSource } from './utils/ids';\nexport { chunkText, safeSlice } from './utils/pure';\nexport { DEFAULT_MAX_CHUNK_LENGTH, DEFAULT_CHUNK_OVERLAP } from './utils/chunkingDefaults';\nexport { DEFAULT_MAX_EMBED_CHARS, EMBED_CHARS_CEILING } from './utils/embedDefaults';\nexport { DEFAULT_SETUP_BUDGET_MS } from './utils/setupDefaults';\nexport * from './librarianPrompt';\nexport { PromptService } from './services/PromptService';\nexport type { EmbedFactResult, EmbedFailureKind } from './services/EmbeddingService';\nexport {\n ONTOLOGY_BACKFILL_BATCH_SIZE,\n ONTOLOGY_BACKFILL_MAX_PROMPT_CHARS,\n ONTOLOGY_BACKFILL_RECHECK_MS,\n HEAL_ANCHORS_PER_CANDIDATE,\n HEAL_BATCH_SIZE,\n HEAL_MAX_FACT_BODY_CHARS_L3,\n HEAL_MAX_TASKS,\n HEAL_RECHECK_MS,\n} from './services/MaintenanceService';\nexport { ONTOLOGY_BACKFILL_SYSTEM_PROMPT } from './prompts';\n\nexport function createWiki(db: SQLiteAdapter, options: WikiOptions): WikiMemory {\n return new WikiMemory(db, options);\n}\n"]}
|