{"version":3,"sources":["../src/db/schema.ts","../src/db/serializedAdapter.ts","../src/db/migrations.ts","../src/repositories/EntryRepository.ts","../src/repositories/OutboxRepository.ts","../src/repositories/TaskRepository.ts","../src/repositories/EventRepository.ts","../src/repositories/EdgeRepository.ts","../src/prompts/ontology.ts","../src/services/OntologyService.ts","../src/services/GraphTraversalService.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":["relatedLinksFor"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { SQLiteAdapter } from '../types';\n\nexport async function setupDatabase(db: SQLiteAdapter, prefix: string) {\n  await db.execAsync(`\n    CREATE TABLE IF NOT EXISTS ${prefix}entries (\n      id TEXT PRIMARY KEY,\n      entity_id TEXT NOT NULL,\n      title TEXT NOT NULL,\n      body TEXT NOT NULL,\n      tags TEXT NOT NULL DEFAULT '[]',\n      confidence TEXT NOT NULL DEFAULT 'inferred',\n      source_type TEXT NOT NULL DEFAULT 'librarian_inferred',\n      source_hash TEXT,\n      source_ref TEXT,\n      created_at INTEGER NOT NULL,\n      updated_at INTEGER NOT NULL,\n      last_accessed_at INTEGER,\n      access_count INTEGER NOT NULL DEFAULT 0,\n      deleted_at INTEGER,\n      embedding TEXT,\n      embedding_blob BLOB,\n      okf_type TEXT,\n      ontology_checked_at INTEGER\n    );\n\n    CREATE INDEX IF NOT EXISTS ${prefix}entries_entity_idx ON ${prefix}entries(entity_id);\n    CREATE INDEX IF NOT EXISTS ${prefix}entries_source_ref_idx ON ${prefix}entries(entity_id, source_ref);\n    CREATE INDEX IF NOT EXISTS ${prefix}entries_source_hash_idx ON ${prefix}entries(entity_id, source_hash) WHERE source_hash IS NOT NULL;\n    CREATE INDEX IF NOT EXISTS ${prefix}entries_updated_idx ON ${prefix}entries(updated_at DESC);\n\n    CREATE TABLE IF NOT EXISTS ${prefix}tasks (\n      id TEXT PRIMARY KEY,\n      entity_id TEXT NOT NULL,\n      description TEXT NOT NULL,\n      status TEXT NOT NULL DEFAULT 'pending',\n      priority INTEGER NOT NULL DEFAULT 0,\n      created_at INTEGER NOT NULL,\n      updated_at INTEGER NOT NULL,\n      resolved_at INTEGER,\n      deleted_at INTEGER,\n      okf_type TEXT\n    );\n\n    CREATE INDEX IF NOT EXISTS ${prefix}tasks_entity_idx ON ${prefix}tasks(entity_id, status);\n\n    CREATE TABLE IF NOT EXISTS ${prefix}edges (\n      id TEXT PRIMARY KEY,\n      entity_id TEXT NOT NULL,\n      source_id TEXT NOT NULL,\n      target_id TEXT NOT NULL,\n      edge_type TEXT NOT NULL,\n      created_at INTEGER NOT NULL,\n      UNIQUE(entity_id, source_id, target_id, edge_type)\n    );\n\n    CREATE INDEX IF NOT EXISTS ${prefix}edges_entity_idx ON ${prefix}edges(entity_id);\n\n    CREATE TABLE IF NOT EXISTS ${prefix}events (\n      id TEXT PRIMARY KEY,\n      entity_id TEXT NOT NULL,\n      event_type TEXT NOT NULL,\n      summary TEXT NOT NULL,\n      related_entry_id TEXT,\n      created_at INTEGER NOT NULL\n    );\n\n    CREATE INDEX IF NOT EXISTS ${prefix}events_entity_idx ON ${prefix}events(entity_id, created_at DESC);\n\n    CREATE TABLE IF NOT EXISTS ${prefix}checkpoints (\n      entity_id TEXT PRIMARY KEY,\n      heal_checkpoint INTEGER NOT NULL DEFAULT 0,\n      memory_checkpoint INTEGER NOT NULL DEFAULT 0\n    );\n\n    CREATE TABLE IF NOT EXISTS ${prefix}entity_manifests (\n      entity_id TEXT PRIMARY KEY,\n      mode TEXT NOT NULL DEFAULT 'off',\n      manifest_json TEXT NOT NULL DEFAULT '{\"node_types\":[],\"edge_types\":[]}',\n      updated_at INTEGER NOT NULL\n    );\n\n    CREATE TABLE IF NOT EXISTS ${prefix}meta (\n      key TEXT PRIMARY KEY,\n      value TEXT NOT NULL\n    );\n\n    CREATE TABLE IF NOT EXISTS ${prefix}outbox (\n      id TEXT PRIMARY KEY,\n      entity_id TEXT NOT NULL,\n      table_name TEXT NOT NULL,\n      record_id TEXT NOT NULL,\n      operation TEXT NOT NULL,\n      payload TEXT NOT NULL,\n      created_at INTEGER NOT NULL\n    );\n\n    CREATE INDEX IF NOT EXISTS ${prefix}outbox_entity_id_created_at\n      ON ${prefix}outbox (entity_id, created_at);\n\n    CREATE INDEX IF NOT EXISTS ${prefix}outbox_created_at\n      ON ${prefix}outbox (created_at);\n  `);\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 } from '../types';\n\nexport interface Migration {\n  version: number;\n  description: string;\n  run: (db: SQLiteAdapter, prefix: string) => Promise<void>;\n}\n\nexport const MIGRATIONS: Migration[] = [\n  {\n    version: 1,\n    description: 'Rebuild FTS5 with porter unicode61 tokenizer (superseded by v2)',\n    run: async (_db, _prefix) => {\n      // This migration is superseded by v2 which drops FTS5 entirely.\n      // It is kept as a no-op so upgrade paths from v0 do not require FTS5 support.\n    },\n  },\n  {\n    version: 2,\n    description: 'Remove FTS5; add embedding column for semantic retrieval',\n    run: async (db, prefix) => {\n      // Drop FTS5 artifacts in a transaction.\n      await db.withTransactionAsync(async (tx) => {\n        await tx.execAsync(`\n          DROP TRIGGER IF EXISTS ${prefix}entries_ai;\n          DROP TRIGGER IF EXISTS ${prefix}entries_ad;\n          DROP TRIGGER IF EXISTS ${prefix}entries_au;\n          DROP TABLE IF EXISTS ${prefix}entries_fts;\n        `);\n      });\n      // ALTER TABLE ADD COLUMN must run outside any explicit transaction —\n      // SQLite (and expo-sqlite) do not permit schema alterations inside\n      // a BEGIN...COMMIT block.\n      const cols = await db.getAllAsync<{ name: string }>(\n        `PRAGMA table_info(${prefix}entries)`\n      );\n      if (!cols.some(c => c.name === 'embedding')) {\n        await db.execAsync(`ALTER TABLE ${prefix}entries ADD COLUMN embedding TEXT`);\n      }\n    },\n  },\n  {\n    version: 3,\n    description: 'Add embedding_blob BLOB column for Float32Array vector storage',\n    run: async (db, prefix) => {\n      const cols = await db.getAllAsync<{ name: string }>(\n        `PRAGMA table_info(${prefix}entries)`\n      );\n      if (!cols.some(c => c.name === 'embedding_blob')) {\n        await db.execAsync(\n          `ALTER TABLE ${prefix}entries ADD COLUMN embedding_blob BLOB`\n        );\n      }\n    },\n  },\n  {\n    version: 4,\n    description: 'Create outbox table for change data capture',\n    run: async (db, prefix) => {\n      await db.execAsync(`\n        CREATE TABLE IF NOT EXISTS ${prefix}outbox (\n          id TEXT PRIMARY KEY,\n          entity_id TEXT NOT NULL,\n          table_name TEXT NOT NULL,\n          record_id TEXT NOT NULL,\n          operation TEXT NOT NULL,\n          payload TEXT NOT NULL,\n          created_at INTEGER NOT NULL\n        );\n        CREATE INDEX IF NOT EXISTS ${prefix}outbox_entity_id_created_at\n          ON ${prefix}outbox (entity_id, created_at);\n      `);\n    },\n  },\n  {\n    version: 5,\n    description: 'Add okf_type to entries/tasks for OKF type fidelity; create edges table for OKF graph import',\n    run: async (db, prefix) => {\n      for (const table of ['entries', 'tasks'] as const) {\n        const cols = await db.getAllAsync<{ name: string }>(\n          `PRAGMA table_info(${prefix}${table})`\n        );\n        if (!cols.some(c => c.name === 'okf_type')) {\n          await db.execAsync(`ALTER TABLE ${prefix}${table} ADD COLUMN okf_type TEXT`);\n        }\n      }\n      await db.execAsync(`\n        CREATE TABLE IF NOT EXISTS ${prefix}edges (\n          id TEXT PRIMARY KEY,\n          entity_id TEXT NOT NULL,\n          source_id TEXT NOT NULL,\n          target_id TEXT NOT NULL,\n          edge_type TEXT NOT NULL,\n          created_at INTEGER NOT NULL,\n          UNIQUE(entity_id, source_id, target_id, edge_type)\n        );\n        CREATE INDEX IF NOT EXISTS ${prefix}edges_entity_idx ON ${prefix}edges (entity_id);\n      `);\n    },\n  },\n  {\n    version: 6,\n    description: 'Add entity_manifests table for per-entity ontology state',\n    run: async (db, prefix) => {\n      await db.execAsync(`\n        CREATE TABLE IF NOT EXISTS ${prefix}entity_manifests (\n          entity_id TEXT PRIMARY KEY,\n          mode TEXT NOT NULL DEFAULT 'off',\n          manifest_json TEXT NOT NULL DEFAULT '{\"node_types\":[],\"edge_types\":[]}',\n          updated_at INTEGER NOT NULL\n        );\n      `);\n    },\n  },\n  {\n    version: 7,\n    description: 'Add ontology_checked_at to entries for ontology backfill recheck cooldown',\n    run: async (db, prefix) => {\n      // ALTER TABLE ADD COLUMN must run outside any explicit transaction —\n      // SQLite (and expo-sqlite) do not permit schema alterations inside\n      // a BEGIN...COMMIT block. Same pattern as v2/v3/v5.\n      const cols = await db.getAllAsync<{ name: string }>(\n        `PRAGMA table_info(${prefix}entries)`\n      );\n      if (!cols.some(c => c.name === 'ontology_checked_at')) {\n        await db.execAsync(\n          `ALTER TABLE ${prefix}entries ADD COLUMN ontology_checked_at INTEGER`\n        );\n      }\n    },\n  },\n];\n\n// Verify MIGRATIONS are in strictly ascending version order at module load time.\n// This prevents skipped or repeated migrations caused by out-of-order entries.\nfor (let i = 1; i < MIGRATIONS.length; i++) {\n  if (MIGRATIONS[i].version <= MIGRATIONS[i - 1].version) {\n    throw new Error(\n      `migrations.ts: MIGRATIONS must be in strictly ascending version order. ` +\n      `Found version ${MIGRATIONS[i].version} after ${MIGRATIONS[i - 1].version} at index ${i}.`\n    );\n  }\n}\n\n// Derived from the last (highest) migration version so it never drifts out of sync.\nexport const CURRENT_SCHEMA_VERSION =\n  MIGRATIONS.length > 0 ? MIGRATIONS[MIGRATIONS.length - 1].version : 0;\n","import type { SQLiteAdapter, WikiFact } from '../types';\nimport { BaseRepository } from './BaseRepository';\nimport { OutboxRepository } from './OutboxRepository';\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\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  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  };\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  private chunkSize = 500;\n\n  constructor(db: SQLiteAdapter, prefix: string, private outbox: OutboxRepository) {\n    super(db, prefix);\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  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<{ id: string }>(\n      `SELECT id FROM ${this.prefix}entries WHERE id = ?`,\n      [fact.id],\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      ) 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        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        okf_type = excluded.okf_type`,\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      ],\n    );\n\n    await this.outbox.push({\n      entityId: fact.entity_id,\n      tableName: 'entries',\n      recordId: fact.id,\n      operation,\n      payload: 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    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      ) 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        okf_type = excluded.okf_type`,\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      ],\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 recent non-deleted entries for an entity (limited), ordered by updated_at DESC.\n   * Used by MaintenanceService.doRunLibrarian().\n   */\n  async findRecentByEntityId(entityId: string, limit: number, 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 LIMIT ?`,\n      [entityId, limit],\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    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  async downgradeStaleInferred(\n    entityId: string,\n    staleThreshold: number,\n    tx: SQLiteAdapter,\n  ): Promise<number> {\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 0;\n    const result = 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 result.changes;\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  /**\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 id, entity_id, title, body, tags FROM ${this.prefix}entries WHERE deleted_at IS NULL AND entity_id = ?`,\n        [entityId],\n      );\n    }\n    return executor.getAllAsync(\n      `SELECT id, entity_id, title, body, tags FROM ${this.prefix}entries WHERE deleted_at IS NULL`,\n    );\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 SET embedding_blob = ?, embedding = NULL WHERE id = ?`,\n      [blob, id],\n    );\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<Array<WikiFact & { embedding_blob?: Uint8Array | null }>> {\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 findRowsForSourceRefMigration(tx?: SQLiteAdapter): Promise<Array<{ rowid: number; source_ref: string }>> {\n    const executor = this.getExecutor(tx);\n    return executor.getAllAsync(\n      `SELECT rowid, source_ref FROM ${this.prefix}entries\n       WHERE source_ref IS NOT NULL\n         AND (\n           TRIM(source_ref) != source_ref\n           OR INSTR(source_ref, '/') > 0\n           OR INSTR(source_ref, '\\\\') > 0\n           OR INSTR(source_ref, CHAR(0)) > 0\n           OR source_ref GLOB '*[^-A-Za-z0-9._ ]*'\n         )`,\n    );\n  }\n\n  async updateSourceRefByRowid(rowid: number, sourceRef: string | null, tx: SQLiteAdapter): Promise<void> {\n    const executor = this.getExecutor(tx);\n    await executor.runAsync(\n      `UPDATE ${this.prefix}entries SET source_ref = ? WHERE rowid = ?`,\n      [sourceRef, rowid],\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\n       LIMIT 1`,\n      [entityId, sourceRef],\n    );\n    return row?.source_hash ?? null;\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(entityIds: readonly string[], limit: number, tx?: SQLiteAdapter): Promise<WikiFact[]> {\n    if (entityIds.length === 0) return [];\n    const executor = this.getExecutor(tx);\n    const placeholders = entityIds.map(() => '?').join(',');\n    const rows = await executor.getAllAsync<any>(\n      `SELECT * FROM ${this.prefix}entries WHERE entity_id IN (${placeholders}) AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?`,\n      [...entityIds, limit],\n    );\n    return rows.map(mapRowToFact);\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","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 { BaseRepository } from './BaseRepository';\nimport { OutboxRepository } from './OutboxRepository';\nimport type { WikiTask, SQLiteAdapter } from '../types';\n\nfunction mapRowToTask(row: any): WikiTask {\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  };\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  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<{ id: string }>(\n      `SELECT id 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      ) 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      ],\n    );\n\n    await this.outbox.push(\n      {\n        entityId: task.entity_id,\n        tableName: 'tasks',\n        recordId: task.id,\n        operation,\n        payload: 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    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      ) 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      [\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      ],\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","import { BaseRepository } from './BaseRepository';\nimport type { WikiEvent, SQLiteAdapter } from '../types';\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)\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      ],\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)\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      ],\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    return this.db.getAllAsync<WikiEvent>(\n      `SELECT * FROM ${this.prefix}events WHERE entity_id = ? ORDER BY created_at DESC LIMIT ?`,\n      [entityId, limit],\n    );\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    return 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  }\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   * 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.slice().reverse();\n    }\n    return this.db.getAllAsync<WikiEvent>(\n      `SELECT * FROM ${this.prefix}events WHERE entity_id = ? ORDER BY created_at ASC`,\n      [entityId],\n    );\n  }\n}\n","import { BaseRepository } from './BaseRepository';\nimport type { WikiEdge, SQLiteAdapter } from '../types';\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\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   * 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        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.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","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\": \"...\" }],\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 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  validateInlineEdges,\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      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  ): { okf_type: string | null; edges: ExtractedFactEdge[] } {\n    const rawType = typeof fact.okf_type === 'string' ? fact.okf_type : '';\n    const canonical = resolveNodeType(rawType, manifest);\n    if (!canonical) return { okf_type: null, edges: [] };\n    const edges = validateInlineEdges(canonical, null, fact.edges ?? [], manifest);\n    return { okf_type: canonical, edges };\n  }\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  ): Promise<number> {\n    if (!sourceType || edges.length === 0) return 0;\n\n    let persisted = 0;\n    for (const edge of edges) {\n      const candidates = resolveEdgeDefinitions(edge.edge_type, manifest)\n        .filter(d => d.source_type.toLowerCase() === sourceType.toLowerCase());\n      if (candidates.length === 0) continue;\n\n      const targetKey = normalizeTitleKey(edge.target_title);\n      const target = titleIndex.get(targetKey);\n      if (!target) continue;\n\n      const def = candidates.find(\n        d => d.target_type.toLowerCase() === (target.okf_type ?? '').toLowerCase(),\n      );\n      if (!def) continue;\n\n      const wikiEdge: WikiEdge = {\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      const inserted = await this.edgeRepo.addIgnoreDuplicate(wikiEdge, 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';\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 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      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    // 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    return { nodes, edges: filteredEdges };\n  }\n}\n","import type { SQLiteAdapter } from './types';\nimport type { WikiOutboxEvent } from './outbox/types';\nimport { setupDatabase } from './db/schema';\nimport { withSerializedTransactions } from './db/serializedAdapter';\nimport { MIGRATIONS, CURRENT_SCHEMA_VERSION } from './db/migrations';\nimport {\n  WikiOptions,\n  MemoryBundle,\n  MemoryDump,\n  WikiEvent,\n  EntityStatus,\n  ReadOptions,\n} from './types';\nimport { EntryRepository } from './repositories/EntryRepository';\nimport { OutboxRepository } from './repositories/OutboxRepository';\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 { JobManager } from './services/JobManager';\nimport { normalizeSourceRef, normalizeSourceHash, validateFact, validateTask, clip, chunkText } from './utils/pure';\nimport { IngestionService } from './services/IngestionService';\nimport { MaintenanceService } from './services/MaintenanceService';\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 type { OntologyManifest, OntologyMode, GraphTraversalOptions, GraphNeighborhood, OntologyBackfillResult } from './types';\n\nexport { WikiBusyError, WikiTransactionError, PrunePartialFailureError, HOOK_TIMEOUT_MARKER } from './types';\n\nconst TABLE_PREFIX_PATTERN = /^[A-Za-z][A-Za-z0-9_]{0,30}_$/;\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  retrievalService: RetrievalService;\n  searchService: SearchService;\n  writeService: WriteService;\n  promptService: PromptService;\n  graphTraversalService: GraphTraversalService;\n  entryRepo: EntryRepository;\n  metadataRepo: MetadataRepository;\n  jobManager: JobManager;\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 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 importExportService: ImportExportService;\n  private retrievalService: RetrievalService;\n  private writeService: WriteService;\n  private promptService: PromptService;\n  private ontologyService: OntologyService;\n  private graphTraversalService: GraphTraversalService;\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.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.ontologyService = new OntologyService(\n      this.metadataRepo,\n      this.edgeRepo,\n      options.config?.ontology,\n    );\n    this.embeddingService = new EmbeddingService(this.db, this.options, this.entryRepo, this.metadataRepo);\n    this.searchService = new SearchService(this.entryRepo);\n    this.jobManager = new JobManager(this.prefix);\n    this.promptService = new PromptService(options.config?.prompts);\n    this.ingestionService = new IngestionService(\n      this.db,\n      this.prefix,\n      this.options,\n      this.entryRepo,\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.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.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  }\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      retrievalService: this.retrievalService,\n      searchService: this.searchService,\n      writeService: this.writeService,\n      promptService: this.promptService,\n      graphTraversalService: this.graphTraversalService,\n      entryRepo: this.entryRepo,\n      metadataRepo: this.metadataRepo,\n      jobManager: this.jobManager,\n    };\n  }\n\n  async setup() {\n    const entriesExistedBeforeSetup = await this.metadataRepo.tableExists(`${this.prefix}entries`);\n\n    await setupDatabase(this.db, this.prefix);\n\n    let currentVersion: number;\n\n    if (!entriesExistedBeforeSetup) {\n      await this.metadataRepo.setMeta('schema_version', String(CURRENT_SCHEMA_VERSION), this.db);\n      currentVersion = CURRENT_SCHEMA_VERSION;\n    } else {\n      const schemaVersionValue = await this.metadataRepo.getMeta('schema_version');\n\n      if (schemaVersionValue) {\n        currentVersion = parseInt(schemaVersionValue, 10);\n        if (!Number.isFinite(currentVersion)) currentVersion = 0;\n      } else {\n        const ftsDdl = await this.metadataRepo.getTableDdl(`${this.prefix}entries_fts`);\n        const hasPorter = /tokenize\\s*=\\s*['\"]porter\\s+unicode61['\"]/i.test(ftsDdl ?? '');\n        currentVersion = hasPorter ? 1 : 0;\n      }\n    }\n\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    }\n\n    if (entriesExistedBeforeSetup) {\n      await this.importExportService.assertNoLegacySourceTypes();\n    }\n\n    const rows = await this.entryRepo.findRowsForSourceRefMigration();\n    await this.db.withTransactionAsync(async (tx) => {\n      for (const row of rows) {\n        const normalized = normalizeSourceRef(row.source_ref);\n        if (normalized !== row.source_ref) {\n          await this.entryRepo.updateSourceRefByRowid(row.rowid, normalized, tx);\n        }\n      }\n    });\n\n    await this.searchService.sync();\n  }\n\n  async hasChanged(entityId: string, sourceRef: string, sourceHash: string): Promise<boolean> {\n    const normalizedRef = normalizeSourceRef(sourceRef);\n    if (!normalizedRef) {\n      throw new Error(`Invalid sourceRef: ${JSON.stringify(sourceRef)}`);\n    }\n    const normalizedHash = normalizeSourceHash(sourceHash);\n    if (!normalizedHash) {\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, normalizedRef);\n    if (storedHash === null) return true;\n    const normalizedStoredHash = normalizeSourceHash(storedHash);\n    return normalizedStoredHash !== normalizedHash;\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  /**\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   * @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   */\n  async runHeal(entityId: string, options?: { promptOverride?: string }): Promise<void> {\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 },\n  ): Promise<OntologyBackfillResult> {\n    return this.maintenanceService.runOntologyBackfill(entityId, options);\n  }\n\n  async runReembed(entityId?: string, opts?: { force?: boolean; skipExisting?: boolean }): Promise<{ embedded: number; skipped: number; failed: number }> {\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  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(entityId: string, params: { entryId?: string; taskId?: string; sourceRef?: string; sourceHash?: string; clearAll?: boolean }): Promise<{ deleted: { entries: number; tasks: number } }> {\n    return this.maintenanceService.forget(entityId, params);\n  }\n\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  ): Promise<{ truncated: boolean; chunks: number }> {\n    return this.ingestionService.ingestDocument(entityId, params);\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  async setOntologyManifest(\n    entityId: string,\n    manifest: OntologyManifest,\n    options?: { mode?: OntologyMode },\n  ): Promise<void> {\n    const mode = options?.mode ?? this.ontologyService.resolveMode();\n    await this.db.withTransactionAsync(tx =>\n      this.metadataRepo.setManifest(entityId, { mode, manifest }, tx),\n    );\n    this.ontologyService.invalidateCache(entityId);\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?.includeConfidence ?? true,\n    includeTags: options?.includeTags ?? true,\n    includeEntityIds: options?.includeEntityIds ?? false,\n    includeFactScores: options?.includeFactScores ?? 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  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\nconst LLM_WIKI_PROFILE = 'llm-wiki/1';\n\nfunction factFrontmatter(f: WikiFact): OkfFrontmatter {\n  return {\n    type: f.okf_type ?? 'fact',\n    title: f.title,\n    tags: f.tags,\n    timestamp: new Date(f.updated_at).toISOString(),\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 taskFrontmatter(t: WikiTask): OkfFrontmatter {\n  return {\n    type: t.okf_type ?? 'task',\n    title: t.description,\n    timestamp: new Date(t.updated_at).toISOString(),\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(dump: MemoryDump): { files: OkfFile[] } {\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(factFrontmatter(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(taskFrontmatter(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      '0.1',\n      rootEntries.length > 0 ? [{ heading: 'Entities', entries: rootEntries }] : [],\n      { profile: LLM_WIKI_PROFILE },\n    ),\n  });\n\n  return { files };\n}\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} 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\nfunction unescapeLogSummary(summary: string): string {\n  return summary.replace(/\\\\\\]/g, ']').replace(/\\\\\\[/g, '[').replace(/\\\\\\\\/g, '\\\\');\n}\n\nconst LOG_LINE_PATTERN = /^\\(([^)]+)\\)\\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  const updated_at = parseFrontmatterTimestamp(\n    frontmatter.timestamp,\n    parseFrontmatterTimestamp(frontmatter.updated_at, now),\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  };\n}\n\nfunction frontmatterToTask(\n  entityId: string,\n  id: string,\n  frontmatter: OkfFrontmatter,\n  now: number,\n): WikiTask {\n  const created_at = parseFrontmatterTimestamp(frontmatter.created_at, now);\n  const updated_at = parseFrontmatterTimestamp(\n    frontmatter.timestamp,\n    parseFrontmatterTimestamp(frontmatter.updated_at, now),\n  );\n\n  return {\n    id,\n    entity_id: entityId,\n    description: typeof frontmatter.title === 'string' ? frontmatter.title : '',\n    status: TASK_STATUSES.has(String(frontmatter.status))\n      ? (frontmatter.status as WikiTask['status'])\n      : 'pending',\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  };\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 isProfile1 = profileMeta.profile === 'llm-wiki/1';\n\n  let entitySummary: string | undefined;\n  const entityIndex = allowedFiles.find(f => f.path === `${entityPrefix}index.md`);\n  if (isProfile1 && 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\n      ? relatedLinks\n      : [...relatedLinks, ...extractMarkdownLinks(storedBody)];\n\n    if (route === 'fact') {\n      facts.push(frontmatterToFact(entityId, resolvedId, frontmatter, storedBody, now));\n    } else {\n      tasks.push(frontmatterToTask(entityId, resolvedId, frontmatter, now));\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 } 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 * from './librarianPrompt';\nexport { PromptService } from './services/PromptService';\nexport {\n  ONTOLOGY_BACKFILL_BATCH_SIZE,\n  ONTOLOGY_BACKFILL_MAX_PROMPT_CHARS,\n  ONTOLOGY_BACKFILL_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"]}