@equationalapplications/core-llm-wiki 2.4.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +46 -12
- package/dist/index.d.ts +46 -12
- package/dist/index.js +447 -138
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +443 -138
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/db/schema.ts","../src/db/migrations.ts","../src/types.ts","../src/prompts.ts","../src/WikiMemory.ts","../src/utils/formatContext.ts","../src/utils/formatMemoryDump.ts","../src/index.ts"],"names":[],"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 'agent_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 );\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 -- FTS5 Virtual Table for full-text search\n CREATE VIRTUAL TABLE IF NOT EXISTS ${prefix}entries_fts USING fts5(\n title,\n body,\n tags,\n content='${prefix}entries',\n content_rowid='rowid',\n tokenize='porter unicode61'\n );\n\n -- Triggers to keep FTS5 in sync with entries\n CREATE TRIGGER IF NOT EXISTS ${prefix}entries_ai AFTER INSERT ON ${prefix}entries BEGIN\n INSERT INTO ${prefix}entries_fts(rowid, title, body, tags) \n VALUES (new.rowid, new.title, new.body, new.tags);\n END;\n\n CREATE TRIGGER IF NOT EXISTS ${prefix}entries_ad AFTER DELETE ON ${prefix}entries BEGIN\n INSERT INTO ${prefix}entries_fts(${prefix}entries_fts, rowid, title, body, tags) \n VALUES ('delete', old.rowid, old.title, old.body, old.tags);\n END;\n\n CREATE TRIGGER IF NOT EXISTS ${prefix}entries_au AFTER UPDATE ON ${prefix}entries BEGIN\n INSERT INTO ${prefix}entries_fts(${prefix}entries_fts, rowid, title, body, tags) \n VALUES ('delete', old.rowid, old.title, old.body, old.tags);\n INSERT INTO ${prefix}entries_fts(rowid, title, body, tags) \n VALUES (new.rowid, new.title, new.body, new.tags);\n END;\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 );\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}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}meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\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',\n run: async (db, prefix) => {\n await db.withTransactionAsync(async () => {\n await db.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 CREATE VIRTUAL TABLE ${prefix}entries_fts USING fts5(\n title,\n body,\n tags,\n content='${prefix}entries',\n content_rowid='rowid',\n tokenize='porter unicode61'\n );\n INSERT INTO ${prefix}entries_fts(rowid, title, body, tags)\n SELECT rowid, title, body, tags FROM ${prefix}entries;\n CREATE TRIGGER ${prefix}entries_ai AFTER INSERT ON ${prefix}entries BEGIN\n INSERT INTO ${prefix}entries_fts(rowid, title, body, tags)\n VALUES (new.rowid, new.title, new.body, new.tags);\n END;\n CREATE TRIGGER ${prefix}entries_ad AFTER DELETE ON ${prefix}entries BEGIN\n INSERT INTO ${prefix}entries_fts(${prefix}entries_fts, rowid, title, body, tags)\n VALUES ('delete', old.rowid, old.title, old.body, old.tags);\n END;\n CREATE TRIGGER ${prefix}entries_au AFTER UPDATE ON ${prefix}entries BEGIN\n INSERT INTO ${prefix}entries_fts(${prefix}entries_fts, rowid, title, body, tags)\n VALUES ('delete', old.rowid, old.title, old.body, old.tags);\n INSERT INTO ${prefix}entries_fts(rowid, title, body, tags)\n VALUES (new.rowid, new.title, new.body, new.tags);\n END;\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","/**\n * Platform-agnostic SQLite driver interface.\n * Each platform package (wiki-expo, wiki-react) provides an adapter\n * that wraps its native driver behind this interface.\n */\nexport interface SQLiteAdapter {\n execAsync(sql: string): Promise<void>;\n runAsync(sql: string, params?: unknown[]): Promise<{ changes: number; lastInsertRowId: number }>;\n getAllAsync<T>(sql: string, params?: unknown[]): Promise<T[]>;\n getFirstAsync<T>(sql: string, params?: unknown[]): Promise<T | null>;\n withTransactionAsync<T>(fn: () => Promise<T>): Promise<T>;\n closeAsync(): Promise<void>;\n}\n\nexport interface WikiConfig {\n tablePrefix?: string;\n maxFtsResults?: number;\n pruneEventsAfter?: number;\n pruneRetainSoftDeletedFor?: number;\n autoLibrarianThreshold?: number;\n autoHealThreshold?: number;\n orphanAfterDays?: number | null;\n staleInferredAfterDays?: number | null;\n maxChunkLength?: number;\n chunkOverlap?: number;\n chunkConcurrency?: number;\n /**\n * Static caller-supplied synonym expansions applied at query time.\n * Keys must match the same normalization pipeline used by query formatting:\n * the query is lowercased, stripped to `[a-z0-9 ]`, split into tokens, and\n * only tokens with length >= 3 are considered for synonym lookup.\n * Values are appended to the FTS5 query token list (multi-word values are\n * split into tokens), then deduped and sliced to 12.\n */\n synonymMap?: Record<string, string[]>;\n}\n\nexport interface WikiFact {\n id: string;\n entity_id: string;\n title: string;\n body: string;\n tags: string[];\n confidence: 'certain' | 'inferred' | 'tentative';\n source_type: 'user_stated' | 'agent_inferred' | 'user_confirmed' | 'user_document';\n source_hash: string | null;\n source_ref: string | null;\n created_at: number;\n updated_at: number;\n last_accessed_at: number | null;\n access_count: number;\n deleted_at: number | null;\n}\n\nexport interface WikiTask {\n id: string;\n entity_id: string;\n description: string;\n status: 'pending' | 'in_progress' | 'done' | 'abandoned';\n priority: number;\n created_at: number;\n updated_at: number;\n resolved_at: number | null;\n deleted_at: number | null;\n}\n\nexport interface WikiEvent {\n id: string;\n entity_id: string;\n event_type: 'observation' | 'decision' | 'action' | 'outcome';\n summary: string;\n related_entry_id?: string | null;\n created_at: number;\n}\n\nexport interface WikiCheckpoint {\n entity_id: string;\n heal_checkpoint: number;\n memory_checkpoint: number;\n}\n\nexport interface ExtractedFact {\n title: string;\n body: string;\n tags: string[];\n confidence: 'certain' | 'inferred' | 'tentative';\n}\n\nexport interface ExtractedTask {\n description: string;\n priority: number;\n}\n\nexport interface LLMProvider {\n /**\n * Generates text using the developer's LLM of choice.\n * Expected to return the raw text response (typically a JSON string).\n */\n generateText: (params: { systemPrompt: string; userPrompt: string }) => Promise<string>;\n}\n\nexport interface WikiOptions {\n config?: WikiConfig;\n llmProvider: LLMProvider;\n}\n\nexport interface MemoryBundle {\n facts: WikiFact[];\n tasks: WikiTask[];\n events: WikiEvent[];\n}\n\nexport interface MemoryDump {\n generatedAt: number;\n entities: Record<string, MemoryBundle>;\n}\n\nexport interface FormattedMemoryDump {\n manifest: string;\n files: Array<{ name: string; content: string }>;\n}\n\nexport interface FormatContextOptions {\n format?: 'markdown' | 'plain';\n maxFacts?: number;\n maxTasks?: number;\n maxEvents?: number;\n includeConfidence?: boolean;\n includeTags?: boolean;\n factWeights?: {\n confidence?: number;\n accessCount?: number;\n recency?: number;\n };\n}\n\nexport interface EntityStatus {\n ingesting: boolean;\n librarian: boolean;\n heal: boolean;\n}\n\nexport class WikiBusyError extends Error {\n readonly operation: 'ingest' | 'librarian' | 'heal' | 'prune';\n readonly entityId: string;\n\n constructor(operation: 'ingest' | 'librarian' | 'heal' | 'prune', entityId: string) {\n super(`${operation} already running for entity ${entityId}`);\n this.name = 'WikiBusyError';\n this.operation = operation;\n this.entityId = entityId;\n }\n}\n","export const LIBRARIAN_SYSTEM_PROMPT = `You are a knowledge extraction agent. Your job is to analyze recent episodic events and extract stable facts and actionable tasks about the user or entity.\nReturn ONLY a valid JSON object matching this schema:\n{\n \"facts\": [{ \"title\": \"string (max 80 chars)\", \"body\": \"string (max 800 chars)\", \"tags\": [\"string\"], \"confidence\": \"certain|inferred|tentative\" }],\n \"tasks\": [{ \"description\": \"string\", \"priority\": \"number (0-10)\" }]\n}\nKeep facts concise. Do not return markdown, just raw JSON.`;\n\nexport const HEAL_SYSTEM_PROMPT = `You are a memory grooming agent. Your job is to review a full dump of facts and recent events to resolve contradictions, downgrade stale claims, and flag obsolete facts for deletion.\nReturn ONLY a valid JSON object matching this schema:\n{\n \"downgraded\": [\"string (fact IDs)\"],\n \"deleted\": [\"string (fact IDs)\"],\n \"newFacts\": [{ \"title\": \"string (max 80 chars)\", \"body\": \"string (max 800 chars)\", \"tags\": [\"string\"], \"confidence\": \"certain|inferred|tentative\" }]\n}\nDo not return markdown, just raw JSON.`;\n\nexport const INGEST_SYSTEM_PROMPT = `You are a document ingestion agent. Your job is to extract factual knowledge from the provided document chunk.\nReturn ONLY a valid JSON object matching this schema:\n{\n \"facts\": [{ \"title\": \"string (max 80 chars)\", \"body\": \"string (max 800 chars)\", \"tags\": [\"string\"], \"confidence\": \"certain|inferred|tentative\" }]\n}\nExtract verbatim factual content. Do not return markdown, just raw JSON.`;\n","import type { SQLiteAdapter } from './types';\nimport { setupDatabase } from './db/schema';\nimport { MIGRATIONS, CURRENT_SCHEMA_VERSION } from './db/migrations';\nimport { WikiOptions, MemoryBundle, MemoryDump, WikiEvent, WikiFact, WikiTask, WikiCheckpoint, ExtractedFact, ExtractedTask, WikiBusyError, EntityStatus } from './types';\nimport { LIBRARIAN_SYSTEM_PROMPT, HEAL_SYSTEM_PROMPT, INGEST_SYSTEM_PROMPT } from './prompts';\n\nexport { WikiBusyError } from './types';\n\nfunction parseJsonResponse<T>(text: string): T {\n const firstBrace = text.indexOf('{');\n const firstBracket = text.indexOf('[');\n\n let start: number;\n let openChar: string;\n let closeChar: string;\n\n if (firstBrace !== -1 && (firstBracket === -1 || firstBrace < firstBracket)) {\n start = firstBrace;\n openChar = '{';\n closeChar = '}';\n } else if (firstBracket !== -1) {\n start = firstBracket;\n openChar = '[';\n closeChar = ']';\n } else {\n throw new SyntaxError('No JSON object/array found in LLM response');\n }\n\n // Walk from `start`, tracking nesting depth and skipping strings/escapes,\n // so we stop at the true matching close bracket rather than the last one.\n let depth = 0;\n let inString = false;\n let escape = false;\n let end = -1;\n for (let i = start; i < text.length; i++) {\n const ch = text[i];\n if (escape) { escape = false; continue; }\n if (ch === '\\\\' && inString) { escape = true; continue; }\n if (ch === '\"') { inString = !inString; continue; }\n if (inString) continue;\n if (ch === openChar) { depth++; continue; }\n if (ch === closeChar) {\n depth--;\n if (depth === 0) { end = i; break; }\n }\n }\n\n if (end === -1) throw new SyntaxError('No JSON object/array found in LLM response');\n return JSON.parse(text.slice(start, end + 1)) as T;\n}\n\nfunction generateId(prefix: string = '') {\n return prefix + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);\n}\n\nfunction safeSlice(value: string, start: number, end?: number): string {\n const length = value.length;\n let safeStart = start < 0 ? Math.max(length + start, 0) : Math.min(start, length);\n let safeEnd = end === undefined\n ? length\n : end < 0\n ? Math.max(length + end, 0)\n : Math.min(end, length);\n\n if (safeStart > safeEnd) {\n [safeStart, safeEnd] = [safeEnd, safeStart];\n }\n\n if (\n safeStart > 0 &&\n safeStart < length &&\n value.charCodeAt(safeStart) >= 0xDC00 &&\n value.charCodeAt(safeStart) <= 0xDFFF &&\n value.charCodeAt(safeStart - 1) >= 0xD800 &&\n value.charCodeAt(safeStart - 1) <= 0xDBFF\n ) {\n safeStart--;\n }\n\n if (\n safeEnd > 0 &&\n safeEnd < length &&\n value.charCodeAt(safeEnd - 1) >= 0xD800 &&\n value.charCodeAt(safeEnd - 1) <= 0xDBFF &&\n value.charCodeAt(safeEnd) >= 0xDC00 &&\n value.charCodeAt(safeEnd) <= 0xDFFF\n ) {\n safeEnd--;\n }\n\n return value.slice(safeStart, safeEnd);\n}\n\nfunction chunkText(\n input: string,\n maxChunkLength: number,\n overlap: number\n): { chunks: string[]; truncated: boolean } {\n const text = input.trim();\n if (text.length === 0) return { chunks: [], truncated: false };\n if (!Number.isInteger(maxChunkLength) || maxChunkLength < 2) {\n throw new Error('maxChunkLength must be an integer >= 2');\n }\n if (!Number.isInteger(overlap) || overlap < 0 || overlap >= maxChunkLength) {\n throw new Error('overlap must be a non-negative integer < maxChunkLength');\n }\n\n const chunks: string[] = [];\n let truncated = false;\n let cursor = 0;\n const halfMax = Math.floor(maxChunkLength / 2);\n\n while (cursor < text.length) {\n const remaining = text.length - cursor;\n if (remaining <= maxChunkLength) {\n chunks.push(safeSlice(text, cursor, text.length));\n break;\n }\n\n const windowEnd = cursor + maxChunkLength;\n const minSplit = cursor + halfMax;\n\n // 1. paragraph break\n let splitPoint = -1;\n const paraIdx = text.lastIndexOf('\\n\\n', windowEnd);\n if (paraIdx >= minSplit && paraIdx + 2 <= windowEnd) {\n splitPoint = paraIdx + 2;\n }\n\n // 2. sentence terminator (single left-to-right pass, no lookahead regex)\n if (splitPoint === -1) {\n let lastTerm = -1;\n for (let i = minSplit; i < windowEnd - 1; i++) {\n const ch = text[i];\n if ((ch === '.' || ch === '!' || ch === '?') && /\\s/.test(text[i + 1])) {\n lastTerm = i + 2; // include the terminator + whitespace\n }\n }\n if (lastTerm !== -1 && lastTerm <= windowEnd) splitPoint = lastTerm;\n }\n\n // 3. whitespace\n if (splitPoint === -1) {\n for (let i = windowEnd - 1; i >= minSplit; i--) {\n if (/\\s/.test(text[i])) {\n splitPoint = i + 1;\n break;\n }\n }\n }\n\n // 4. hard cut\n if (splitPoint === -1) {\n truncated = true;\n splitPoint = windowEnd;\n }\n\n chunks.push(safeSlice(text, cursor, splitPoint));\n const next = Math.max(splitPoint - overlap, cursor + 1);\n cursor = next;\n }\n\n return { chunks, truncated };\n}\n\nasync function withConcurrency<T>(tasks: Array<() => Promise<T>>, limit: number): Promise<T[]> {\n const results: T[] = new Array(tasks.length);\n let index = 0;\n let failed = false;\n let firstError: unknown;\n async function worker() {\n while (index < tasks.length && !failed) {\n const i = index++;\n try {\n results[i] = await tasks[i]();\n } catch (e) {\n if (!failed) { failed = true; firstError = e; }\n return;\n }\n }\n }\n const workerCount = tasks.length === 0 ? 0 : Math.min(Math.max(limit, 1), tasks.length);\n await Promise.allSettled(Array.from({ length: workerCount }, worker));\n if (failed) throw firstError;\n return results;\n}\n\nfunction clip(value: string, max: number): string {\n if (typeof value !== 'string') return '';\n const s = value.trim();\n return s.length <= max ? s : safeSlice(s, 0, max).trimEnd();\n}\n\nfunction validateTags(tags: any[]): string[] {\n if (!Array.isArray(tags)) return [];\n return tags\n .filter(t => typeof t === 'string')\n .map(t => t.trim().toLowerCase())\n .filter(t => t.length > 0 && t.length <= 40)\n .slice(0, 6);\n}\n\nfunction validateFact(fact: any): ExtractedFact | null {\n if (typeof fact?.title !== 'string' || typeof fact?.body !== 'string') return null;\n const title = clip(fact.title, 80);\n const body = clip(fact.body, 800);\n if (!title || !body) return null;\n \n let confidence = fact.confidence;\n if (confidence !== 'certain' && confidence !== 'tentative') confidence = 'inferred';\n \n return {\n ...fact,\n title,\n body,\n confidence,\n tags: validateTags(fact.tags)\n };\n}\n\nfunction validateTask(task: any): ExtractedTask | null {\n if (typeof task?.description !== 'string') return null;\n const description = clip(task.description, 200);\n if (!description) return null;\n \n let priority = task.priority;\n if (typeof priority !== 'number' || !isFinite(priority)) priority = 0;\n \n return {\n ...task,\n description,\n priority\n };\n}\n\nfunction normalizeSourceRef(value: string): string | null {\n if (typeof value !== 'string') return null;\n const cleaned = value.replace(/[^A-Za-z0-9._\\- ]/g, '').trim().slice(0, 255);\n return cleaned.length > 0 ? cleaned : null;\n}\n\nfunction normalizeSourceHash(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n return /^[0-9a-f]{64}$/i.test(value) ? value.toLowerCase() : null;\n}\n\n\nfunction titleTokens(title: string): Set<string> {\n return new Set(title.toLowerCase().replace(/[^a-z0-9\\s]/g, '').split(/\\s+/).filter(t => t.length >= 3));\n}\n\nfunction jaccardScore(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 && b.size === 0) return 0;\n const intersection = new Set([...a].filter(x => b.has(x)));\n const union = new Set([...a, ...b]);\n return intersection.size / union.size;\n}\n\nconst FUZZY_THRESHOLD = 0.5;\nconst MIN_TOKENS_TO_QUALIFY = 3;\n\nexport class WikiMemory {\n private db: SQLiteAdapter;\n private prefix: string;\n private options: WikiOptions;\n private activeMaintenanceJobs = new Set<string>();\n private activeIngestJobs = new Set<string>();\n\n private _librarianKey(entityId: string) { return `${this.prefix}:${entityId}:librarian`; }\n private _healKey(entityId: string) { return `${this.prefix}:${entityId}:heal`; }\n private _warnCrossEntityCollision(type: 'entry' | 'task', id: string, existingEntityId: string, targetEntityId: string): void {\n console.warn(`[WikiMemory] importDump: ${type} id \"${id}\" already belongs to entity \"${existingEntityId}\"; skipping for entity \"${targetEntityId}\"`);\n }\n\n constructor(db: SQLiteAdapter, options: WikiOptions) {\n this.db = db;\n this.options = options;\n this.prefix = options.config?.tablePrefix || 'llm_wiki_';\n }\n\n async setup() {\n // Probe entries-table existence BEFORE creating any tables. setupDatabase()\n // uses IF NOT EXISTS throughout, so once it has run the entries table always\n // exists and the fresh-install branch would be unreachable. Future migrations\n // that ALTER TABLE would also fail if run against a schema already at the\n // target version but inferred as legacy because the probe ran too late.\n const entriesExistedBeforeSetup = await this.db.getFirstAsync<{ name: string }>(\n `SELECT name FROM sqlite_master WHERE type='table' AND name=?`,\n [`${this.prefix}entries`]\n );\n\n await setupDatabase(this.db, this.prefix);\n\n let currentVersion: number;\n\n if (!entriesExistedBeforeSetup) {\n // Fresh install — all tables just created at current schema; no migrations needed.\n await this.db.runAsync(\n `INSERT OR REPLACE INTO ${this.prefix}meta (key, value) VALUES ('schema_version', ?)`,\n [String(CURRENT_SCHEMA_VERSION)]\n );\n currentVersion = CURRENT_SCHEMA_VERSION;\n } else {\n // Existing install — check meta for schema version.\n const metaRow = await this.db.getFirstAsync<{ value: string }>(\n `SELECT value FROM ${this.prefix}meta WHERE key = 'schema_version'`\n );\n\n if (metaRow) {\n currentVersion = parseInt(metaRow.value, 10);\n if (!Number.isFinite(currentVersion)) currentVersion = 0;\n } else {\n // Legacy install without meta row — infer version from porter probe.\n const ftsMeta = await this.db.getFirstAsync<{ sql: string | null }>(\n `SELECT sql FROM sqlite_master WHERE type='table' AND name=?`,\n [`${this.prefix}entries_fts`]\n );\n const hasPorter = /tokenize\\s*=\\s*['\"]porter\\s+unicode61['\"]/i.test(ftsMeta?.sql ?? '');\n currentVersion = hasPorter ? 1 : 0;\n }\n }\n\n // Run pending migrations in order.\n for (const migration of MIGRATIONS) {\n if (migration.version > currentVersion) {\n await migration.run(this.db, this.prefix);\n await this.db.runAsync(\n `INSERT OR REPLACE INTO ${this.prefix}meta (key, value) VALUES ('schema_version', ?)`,\n [String(migration.version)]\n );\n currentVersion = migration.version;\n }\n }\n\n // Ensure meta row exists for legacy installs already at current version\n // (porter present, no meta row) — the migration loop may not have written it.\n if (entriesExistedBeforeSetup) {\n const metaCheck = await this.db.getFirstAsync<{ value: string }>(\n `SELECT value FROM ${this.prefix}meta WHERE key = 'schema_version'`\n );\n if (!metaCheck) {\n await this.db.runAsync(\n `INSERT OR REPLACE INTO ${this.prefix}meta (key, value) VALUES ('schema_version', ?)`,\n [String(currentVersion)]\n );\n }\n }\n\n // Migration: normalize any existing source_ref values that were stored before the\n // allowlist rule ([^A-Za-z0-9._\\- ] → strip) was introduced. Read-then-update in\n // JS so the normalization is guaranteed to match what normalizeSourceRef() produces,\n // regardless of which characters the old normalization left behind.\n // The WHERE clause pre-filters to rows that contain any character outside the\n // allowlist (checking leading/trailing whitespace, slashes, backslashes, NUL, and\n // the full ASCII non-allowlist range via GLOB) so that already-normalized\n // rows are never fetched. Idempotent: after the first run no rows match the filter.\n type Row = { rowid: number; source_ref: string };\n const rows = await this.db.getAllAsync<Row>(`\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 await this.db.withTransactionAsync(async () => {\n for (const row of rows) {\n const normalized = normalizeSourceRef(row.source_ref);\n if (normalized !== row.source_ref) {\n await this.db.runAsync(\n `UPDATE ${this.prefix}entries SET source_ref = ? WHERE rowid = ?`,\n [normalized, row.rowid]\n );\n }\n }\n });\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: \"${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 row = await this.db.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, normalizedRef]\n );\n if (!row) return true;\n const normalizedStoredHash = row.source_hash ? normalizeSourceHash(row.source_hash) : null;\n return normalizedStoredHash !== normalizedHash;\n }\n\n private _pruneKey(entityId: string) { return `${this.prefix}:${entityId}:prune`; }\n\n private _validatePruneDuration(value: number | null | undefined, name: string): void {\n if (value !== null && value !== undefined && (typeof value !== 'number' || !isFinite(value) || value < 0)) {\n throw new Error(`Invalid ${name}: must be a non-negative finite number or null`);\n }\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 const pruneKey = this._pruneKey(entityId);\n // Prune must not run concurrently with librarian, heal, ingest, or another\n // prune for the same entity.\n const ingestPrefix = `${this.prefix}:${entityId}:`;\n let isIngestRunning = false;\n for (const k of this.activeIngestJobs) {\n if (k.startsWith(ingestPrefix)) { isIngestRunning = true; break; }\n }\n let blockingOperation: 'prune' | 'librarian' | 'heal' | 'ingest' | null = null;\n if (this.activeMaintenanceJobs.has(pruneKey)) {\n blockingOperation = 'prune';\n } else if (this.activeMaintenanceJobs.has(this._librarianKey(entityId))) {\n blockingOperation = 'librarian';\n } else if (this.activeMaintenanceJobs.has(this._healKey(entityId))) {\n blockingOperation = 'heal';\n } else if (isIngestRunning) {\n blockingOperation = 'ingest';\n }\n if (blockingOperation !== null) {\n throw new WikiBusyError(blockingOperation, entityId);\n }\n this.activeMaintenanceJobs.add(pruneKey);\n try {\n const retainSoftDeletedFor = options?.retainSoftDeletedFor !== undefined\n ? options.retainSoftDeletedFor\n : (this.options.config?.pruneRetainSoftDeletedFor ?? 7);\n const retainEventsFor = options?.retainEventsFor !== undefined\n ? options.retainEventsFor\n : (this.options.config?.pruneEventsAfter ?? 30);\n const vacuum = options?.vacuum ?? false;\n\n this._validatePruneDuration(retainSoftDeletedFor, 'retainSoftDeletedFor');\n this._validatePruneDuration(retainEventsFor, 'retainEventsFor');\n\n const now = Date.now();\n let deletedEntries = 0;\n let deletedTasks = 0;\n let deletedEvents = 0;\n\n if (retainSoftDeletedFor !== null) {\n const cutoff = now - retainSoftDeletedFor * 86400000;\n const entryResult = await this.db.runAsync(\n `DELETE FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NOT NULL AND deleted_at < ?`,\n [entityId, cutoff]\n );\n deletedEntries = entryResult.changes;\n\n const taskResult = await this.db.runAsync(\n `DELETE FROM ${this.prefix}tasks\n WHERE entity_id = ? AND deleted_at IS NOT NULL AND deleted_at < ?`,\n [entityId, cutoff]\n );\n deletedTasks = taskResult.changes;\n }\n\n if (retainEventsFor !== null) {\n const cutoff = now - retainEventsFor * 86400000;\n const eventResult = await this.db.runAsync(\n `DELETE FROM ${this.prefix}events\n WHERE entity_id = ? AND created_at < ?`,\n [entityId, cutoff]\n );\n deletedEvents = eventResult.changes;\n }\n\n if (vacuum) {\n await this.db.execAsync(`PRAGMA wal_checkpoint(TRUNCATE)`);\n await this.db.execAsync(`VACUUM`);\n }\n\n return { entries: deletedEntries, tasks: deletedTasks, events: deletedEvents };\n } finally {\n this.activeMaintenanceJobs.delete(pruneKey);\n }\n }\n\n private formatSearchQuery(query: string): string {\n const normalizeTokens = (value: string): string[] =>\n value\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .split(/\\s+/)\n .filter(t => t.length >= 3);\n\n const baseTokens = normalizeTokens(query);\n if (baseTokens.length === 0) return '';\n\n const synonymMap = this.options.config?.synonymMap;\n const expanded: string[] = [];\n const seen = new Set<string>();\n const pushNormalized = (value: string): boolean => {\n for (const token of normalizeTokens(value)) {\n if (expanded.length >= 12) return false;\n if (seen.has(token)) continue;\n seen.add(token);\n expanded.push(token);\n }\n return true;\n };\n\n for (const t of baseTokens) {\n if (!pushNormalized(t)) break;\n if (synonymMap) {\n const synonyms = synonymMap[t];\n if (Array.isArray(synonyms)) {\n for (const s of synonyms) {\n if (typeof s === 'string') {\n if (!pushNormalized(s)) break;\n }\n }\n }\n }\n }\n\n return expanded.map(t => `\"${t}\"*`).join(' OR ');\n }\n\n async read(entityId: string, query: string): Promise<MemoryBundle> {\n const ftsQuery = this.formatSearchQuery(query);\n const maxResults = this.options.config?.maxFtsResults || 10;\n \n let factsPromise: Promise<WikiFact[]>;\n\n if (ftsQuery) {\n factsPromise = this.db.getAllAsync<WikiFact>(`\n SELECT e.* FROM ${this.prefix}entries e\n JOIN ${this.prefix}entries_fts fts ON e.rowid = fts.rowid\n WHERE fts.${this.prefix}entries_fts MATCH ?\n AND e.entity_id = ?\n AND e.deleted_at IS NULL\n ORDER BY e.confidence DESC, e.access_count DESC, e.updated_at DESC\n LIMIT ?\n `, [ftsQuery, entityId, maxResults]);\n } else {\n factsPromise = this.db.getAllAsync<WikiFact>(`\n SELECT * FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL\n ORDER BY updated_at DESC\n LIMIT ?\n `, [entityId, maxResults]);\n }\n\n const tasksPromise = this.db.getAllAsync<WikiTask>(`\n SELECT * FROM ${this.prefix}tasks\n WHERE entity_id = ? AND status IN ('pending', 'in_progress') AND deleted_at IS NULL\n ORDER BY priority DESC, created_at ASC\n `, [entityId]);\n\n const eventsPromise = this.db.getAllAsync<WikiEvent>(`\n SELECT * FROM ${this.prefix}events\n WHERE entity_id = ?\n ORDER BY created_at DESC\n LIMIT 10\n `, [entityId]);\n\n const [factsRaw, tasks, events] = await Promise.all([factsPromise, tasksPromise, eventsPromise]);\n\n if (ftsQuery && factsRaw.length > 0) {\n const ids = factsRaw.map(f => f.id);\n const placeholders = ids.map(() => '?').join(',');\n const now = Date.now();\n await this.db.runAsync(`\n UPDATE ${this.prefix}entries \n SET access_count = access_count + 1, last_accessed_at = ?\n WHERE id IN (${placeholders})\n `, [now, ...ids]);\n }\n\n const facts = factsRaw.map(f => ({\n ...f,\n tags: typeof f.tags === 'string' ? JSON.parse(f.tags) : f.tags\n }));\n\n return { facts, tasks, events: events.reverse() };\n }\n\n async getMemoryBundle(entityId: string): Promise<MemoryBundle> {\n return this._getFullBundle(entityId, { maxEvents: 10 });\n }\n\n async write(entityId: string, event: Omit<WikiEvent, 'id' | 'entity_id' | 'created_at'>): Promise<void> {\n const id = generateId('evt_');\n const now = Date.now();\n \n let eventType = event.event_type;\n if (!['observation', 'decision', 'action', 'outcome'].includes(eventType)) {\n eventType = 'observation';\n }\n\n await this.db.runAsync(`\n INSERT INTO ${this.prefix}events (id, entity_id, event_type, summary, related_entry_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `, [id, entityId, eventType, event.summary, event.related_entry_id || null, now]);\n\n const threshold = this.options.config?.autoLibrarianThreshold || 20;\n \n const [row, cp] = await Promise.all([\n this.db.getFirstAsync<{ count: number }>(`SELECT COUNT(*) as count FROM ${this.prefix}events WHERE entity_id = ?`, [entityId]),\n this.db.getFirstAsync<WikiCheckpoint>(`SELECT * FROM ${this.prefix}checkpoints WHERE entity_id = ?`, [entityId])\n ]);\n \n const count = row?.count || 0;\n let memoryCheckpoint = cp?.memory_checkpoint || 0;\n if (memoryCheckpoint > count) memoryCheckpoint = 0;\n\n if (count - memoryCheckpoint >= threshold) {\n const jobKey = this._librarianKey(entityId);\n if (\n !this.activeMaintenanceJobs.has(jobKey) &&\n !this.activeMaintenanceJobs.has(this._pruneKey(entityId))\n ) {\n this.activeMaintenanceJobs.add(jobKey);\n this.runLibrarianThenMaybeHeal(entityId, count)\n .catch(console.error)\n .finally(() => this.activeMaintenanceJobs.delete(jobKey));\n }\n }\n }\n\n private async runLibrarianThenMaybeHeal(entityId: string, currentEventCount: number) {\n await this._doRunLibrarian(entityId);\n \n await this.db.runAsync(`\n INSERT INTO ${this.prefix}checkpoints (entity_id, memory_checkpoint) \n VALUES (?, ?) \n ON CONFLICT(entity_id) DO UPDATE SET memory_checkpoint = ?\n `, [entityId, currentEventCount, currentEventCount]);\n \n const autoHealThreshold = this.options.config?.autoHealThreshold || 100;\n const cp = await this.db.getFirstAsync<WikiCheckpoint>(`SELECT * FROM ${this.prefix}checkpoints WHERE entity_id = ?`, [entityId]);\n let healCheckpoint = cp?.heal_checkpoint || 0;\n if (healCheckpoint > currentEventCount) healCheckpoint = 0;\n \n if (currentEventCount - healCheckpoint >= autoHealThreshold) {\n const healKey = this._healKey(entityId);\n if (!this.activeMaintenanceJobs.has(healKey)) {\n this.activeMaintenanceJobs.add(healKey);\n try {\n await this._doRunHeal(entityId);\n await this.db.runAsync(`\n INSERT INTO ${this.prefix}checkpoints (entity_id, heal_checkpoint) \n VALUES (?, ?) \n ON CONFLICT(entity_id) DO UPDATE SET heal_checkpoint = ?\n `, [entityId, currentEventCount, currentEventCount]);\n } finally {\n this.activeMaintenanceJobs.delete(healKey);\n }\n }\n }\n }\n\n private async _doRunLibrarian(entityId: string): Promise<void> {\n const events = await this.db.getAllAsync<WikiEvent>(`\n SELECT * FROM ${this.prefix}events\n WHERE entity_id = ?\n ORDER BY created_at DESC\n LIMIT 50\n `, [entityId]);\n\n const currentFactsRows = await this.db.getAllAsync<WikiFact>(`\n SELECT * FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL\n ORDER BY updated_at DESC\n LIMIT 100\n `, [entityId]);\n\n const currentFacts = currentFactsRows.map(f => ({\n ...f,\n tags: typeof f.tags === 'string' ? JSON.parse(f.tags) : f.tags\n }));\n\n const userPrompt = `Events:\\n${JSON.stringify(events.reverse(), null, 2)}\\n\\nCurrent Facts:\\n${JSON.stringify(currentFacts, null, 2)}`;\n \n const responseText = await this.options.llmProvider.generateText({\n systemPrompt: LIBRARIAN_SYSTEM_PROMPT,\n userPrompt,\n });\n\n const result = parseJsonResponse<{ facts: ExtractedFact[], tasks: ExtractedTask[] }>(responseText);\n const facts = Array.isArray(result.facts) ? result.facts : [];\n const tasks = Array.isArray(result.tasks) ? result.tasks : [];\n const validFacts = facts.map(validateFact).filter((f): f is ExtractedFact => f !== null);\n const validTasks = tasks.map(validateTask).filter((t): t is ExtractedTask => t !== null);\n\n const now = Date.now();\n\n await this.db.withTransactionAsync(async () => {\n for (const fact of validFacts) {\n const newTokens = titleTokens(fact.title);\n let skip = false;\n if (newTokens.size >= MIN_TOKENS_TO_QUALIFY) {\n for (const existing of currentFactsRows) {\n if (existing.source_type !== 'agent_inferred') continue;\n const existingTokens = titleTokens(existing.title);\n if (existingTokens.size >= MIN_TOKENS_TO_QUALIFY) {\n if (jaccardScore(newTokens, existingTokens) >= FUZZY_THRESHOLD) {\n skip = true;\n break;\n }\n }\n }\n }\n if (skip) continue;\n\n const id = generateId('fact_');\n await this.db.runAsync(`\n INSERT INTO ${this.prefix}entries (id, entity_id, title, body, tags, confidence, source_type, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `, [id, entityId, fact.title, fact.body, JSON.stringify(fact.tags), fact.confidence, 'agent_inferred', now, now]);\n }\n\n for (const task of validTasks) {\n const id = generateId('task_');\n await this.db.runAsync(`\n INSERT INTO ${this.prefix}tasks (id, entity_id, description, status, priority, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `, [id, entityId, task.description, 'pending', task.priority, now, now]);\n }\n });\n }\n\n private async _doRunHeal(entityId: string): Promise<void> {\n const now = Date.now();\n const orphanAfterDays = this.options.config?.orphanAfterDays !== undefined ? this.options.config.orphanAfterDays : 30;\n const staleInferredAfterDays = this.options.config?.staleInferredAfterDays !== undefined ? this.options.config.staleInferredAfterDays : 60;\n const MS_PER_DAY = 24 * 60 * 60 * 1000;\n\n if (orphanAfterDays !== null && (typeof orphanAfterDays !== 'number' || !Number.isFinite(orphanAfterDays) || orphanAfterDays < 0)) {\n throw new Error('Invalid orphanAfterDays: must be a finite number >= 0 or null');\n }\n if (staleInferredAfterDays !== null && (typeof staleInferredAfterDays !== 'number' || !Number.isFinite(staleInferredAfterDays) || staleInferredAfterDays < 0)) {\n throw new Error('Invalid staleInferredAfterDays: must be a finite number >= 0 or null');\n }\n\n await this.db.withTransactionAsync(async () => {\n if (orphanAfterDays !== null) {\n const orphanThreshold = now - (orphanAfterDays * MS_PER_DAY);\n await this.db.runAsync(`\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 != 'user_document' AND deleted_at IS NULL\n `, [now, now, entityId, orphanThreshold]);\n }\n\n if (staleInferredAfterDays !== null) {\n const staleThreshold = now - (staleInferredAfterDays * MS_PER_DAY);\n await this.db.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 != 'user_document' AND deleted_at IS NULL\n `, [now, entityId, staleThreshold, staleThreshold]);\n }\n });\n\n const allFactsRows = await this.db.getAllAsync<WikiFact>(`SELECT * FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL`, [entityId]);\n const allTasks = await this.db.getAllAsync<WikiTask>(`SELECT * FROM ${this.prefix}tasks WHERE entity_id = ? AND status IN ('pending', 'in_progress') AND deleted_at IS NULL`, [entityId]);\n const recentEvents = await this.db.getAllAsync<WikiEvent>(`SELECT * FROM ${this.prefix}events WHERE entity_id = ? ORDER BY created_at DESC LIMIT 20`, [entityId]);\n\n const healCandidates = allFactsRows.filter(f => f.source_type !== 'user_document');\n const documentAnchors = allFactsRows\n .filter(f => f.source_type === 'user_document')\n .map(({ id, title, source_ref }) => ({ id, title, source_ref }));\n\n const userPrompt = `Heal Candidates:\\n${JSON.stringify(healCandidates.map(f => ({...f, tags: typeof f.tags === 'string' ? JSON.parse(f.tags) : f.tags})), null, 2)}\n\\nDocument Anchors (DO NOT MODIFY OR DELETE):\\n${JSON.stringify(documentAnchors, null, 2)}\n\\nAll Tasks:\\n${JSON.stringify(allTasks, null, 2)}\n\\nRecent Events:\\n${JSON.stringify(recentEvents, null, 2)}\n\\nThe following document anchors are provided for contradiction detection only. Do not include them in \\`downgraded\\`, \\`deleted\\`, or \\`newFacts\\`.`;\n \n const responseText = await this.options.llmProvider.generateText({\n systemPrompt: HEAL_SYSTEM_PROMPT,\n userPrompt,\n });\n\n const result = parseJsonResponse<{ downgraded: string[], deleted: string[], newFacts: ExtractedFact[] }>(responseText);\n\n const mutableIds = new Set(healCandidates.map(f => f.id));\n const downgraded = Array.isArray(result.downgraded) ? result.downgraded : [];\n const deleted = Array.isArray(result.deleted) ? result.deleted : [];\n const newFacts = Array.isArray(result.newFacts) ? result.newFacts : [];\n const safeDowngraded = downgraded.filter(id => mutableIds.has(id));\n const safeDeleted = deleted.filter(id => mutableIds.has(id));\n const validNewFacts = newFacts.map(validateFact).filter((f): f is ExtractedFact => f !== null);\n\n await this.db.withTransactionAsync(async () => {\n for (const id of safeDowngraded) {\n await this.db.runAsync(`UPDATE ${this.prefix}entries SET confidence = 'tentative', updated_at = ? WHERE id = ? AND entity_id = ?`, [now, id, entityId]);\n }\n for (const id of safeDeleted) {\n await this.db.runAsync(`UPDATE ${this.prefix}entries SET deleted_at = ?, updated_at = ? WHERE id = ? AND entity_id = ?`, [now, now, id, entityId]);\n }\n for (const fact of validNewFacts) {\n const id = generateId('fact_');\n await this.db.runAsync(`\n INSERT INTO ${this.prefix}entries (id, entity_id, title, body, tags, confidence, source_type, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `, [id, entityId, fact.title, fact.body, JSON.stringify(fact.tags), fact.confidence, 'agent_inferred', now, now]);\n }\n });\n }\n\n async runLibrarian(entityId: string): Promise<void> {\n const jobKey = this._librarianKey(entityId);\n if (this.activeMaintenanceJobs.has(jobKey)) {\n throw new WikiBusyError('librarian', entityId);\n }\n if (this.activeMaintenanceJobs.has(this._pruneKey(entityId))) {\n throw new WikiBusyError('prune', entityId);\n }\n this.activeMaintenanceJobs.add(jobKey);\n try {\n await this._doRunLibrarian(entityId);\n } finally {\n this.activeMaintenanceJobs.delete(jobKey);\n }\n }\n\n async runHeal(entityId: string): Promise<void> {\n const jobKey = this._healKey(entityId);\n if (this.activeMaintenanceJobs.has(jobKey)) {\n throw new WikiBusyError('heal', entityId);\n }\n if (this.activeMaintenanceJobs.has(this._pruneKey(entityId))) {\n throw new WikiBusyError('prune', entityId);\n }\n this.activeMaintenanceJobs.add(jobKey);\n try {\n await this._doRunHeal(entityId);\n } finally {\n this.activeMaintenanceJobs.delete(jobKey);\n }\n }\n\n getEntityStatus(entityId: string): EntityStatus {\n const ingestPrefix = `${this.prefix}:${entityId}:`;\n let ingesting = false;\n for (const k of this.activeIngestJobs) {\n if (k.startsWith(ingestPrefix)) { ingesting = true; break; }\n }\n\n return {\n ingesting,\n librarian: this.activeMaintenanceJobs.has(this._librarianKey(entityId)),\n heal: this.activeMaintenanceJobs.has(this._healKey(entityId)),\n };\n }\n\n private async _getFullBundle(entityId: string, opts?: { maxEvents?: number }): Promise<MemoryBundle> {\n const maxEvents = opts?.maxEvents;\n const eventsQuery = maxEvents != null\n ? `SELECT * FROM ${this.prefix}events WHERE entity_id = ? ORDER BY created_at DESC LIMIT ?`\n : `SELECT * FROM ${this.prefix}events WHERE entity_id = ? ORDER BY created_at ASC`;\n const eventsParams: (string | number)[] = maxEvents != null ? [entityId, maxEvents] : [entityId];\n\n const [factsRaw, tasks, eventsRaw] = await Promise.all([\n this.db.getAllAsync<WikiFact>(\n `SELECT * FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC`,\n [entityId]\n ),\n this.db.getAllAsync<WikiTask>(\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 this.db.getAllAsync<WikiEvent>(eventsQuery, eventsParams),\n ]);\n const facts = factsRaw.map(f => ({\n ...f,\n tags: typeof f.tags === 'string' ? JSON.parse(f.tags) : f.tags,\n }));\n // When limited, results arrive newest-first; reverse to chronological order.\n const events = maxEvents != null ? eventsRaw.slice().reverse() : eventsRaw;\n return { facts, tasks, events };\n }\n\n async exportDump(entityIds?: string[]): Promise<MemoryDump> {\n let ids: string[];\n if (entityIds && entityIds.length > 0) {\n ids = Array.from(new Set(entityIds));\n } else {\n // Collect all distinct entity_ids across entries, tasks, events\n const rows = await this.db.getAllAsync<{ entity_id: string }>(`\n SELECT DISTINCT entity_id FROM (\n SELECT entity_id FROM ${this.prefix}entries WHERE deleted_at IS NULL\n UNION\n SELECT entity_id FROM ${this.prefix}tasks WHERE deleted_at IS NULL\n UNION\n SELECT entity_id FROM ${this.prefix}events\n ) ORDER BY entity_id\n `);\n ids = rows.map(r => r.entity_id);\n }\n\n const entities: Record<string, MemoryBundle> = {};\n const BATCH = 3;\n for (let i = 0; i < ids.length; i += BATCH) {\n const batch = ids.slice(i, i + BATCH);\n const batchResults = await Promise.all(\n batch.map(async (id): Promise<[string, MemoryBundle]> => [id, await this._getFullBundle(id)])\n );\n for (const [id, bundle] of batchResults) {\n entities[id] = bundle;\n }\n }\n\n return { generatedAt: Date.now(), entities };\n }\n\n async importDump(dump: MemoryDump, opts?: { merge?: boolean }): Promise<void> {\n const merge = opts?.merge ?? false;\n\n for (const [entityId, bundle] of Object.entries(dump.entities)) {\n await this.db.withTransactionAsync(async () => {\n if (!merge) {\n const now = Date.now();\n await this.db.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 await this.db.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 await this.db.runAsync(\n `DELETE FROM ${this.prefix}checkpoints WHERE entity_id = ?`,\n [entityId]\n );\n }\n\n const factIds = bundle.facts.map((fact) => fact.id);\n const existingFactsById = new Map<string, { id: string; entity_id: string; updated_at: number }>();\n const factLookupChunkSize = 500;\n for (let i = 0; i < factIds.length; i += factLookupChunkSize) {\n const factIdChunk = factIds.slice(i, i + factLookupChunkSize);\n if (factIdChunk.length === 0) continue;\n const placeholders = factIdChunk.map(() => '?').join(', ');\n const existingFacts = await this.db.getAllAsync<{ id: string; entity_id: string; updated_at: number }>(\n `SELECT id, entity_id, updated_at FROM ${this.prefix}entries WHERE id IN (${placeholders})`,\n factIdChunk\n );\n for (const existingFact of existingFacts) {\n existingFactsById.set(existingFact.id, existingFact);\n }\n }\n\n for (const fact of bundle.facts) {\n const tagsJson = JSON.stringify(Array.isArray(fact.tags) ? fact.tags : []);\n // Normalize once: non-finite (undefined/null/NaN) → 0 so we never persist an\n // invalid value to the DB and ORDER BY updated_at remains meaningful.\n const safeUpdatedAt = Number.isFinite(fact.updated_at) ? fact.updated_at : 0;\n const existing = existingFactsById.get(fact.id);\n if (existing) {\n if (existing.entity_id !== entityId) {\n this._warnCrossEntityCollision('entry', fact.id, existing.entity_id, entityId);\n continue;\n }\n if (merge) {\n // LWW: incoming wins only if its updated_at is strictly newer than local.\n // 0 (epoch) never beats a real timestamp, so invalid incoming rows are skipped.\n if (safeUpdatedAt <= existing.updated_at) continue;\n }\n // replace mode (or merge LWW winner): update the existing row (restores if soft-deleted)\n await this.db.runAsync(\n `UPDATE ${this.prefix}entries SET entity_id = ?, title = ?, body = ?, tags = ?, confidence = ?, source_type = ?, source_hash = ?, source_ref = ?, created_at = ?, updated_at = ?, last_accessed_at = ?, access_count = ?, deleted_at = ? WHERE id = ?`,\n [entityId, fact.title, fact.body, tagsJson, fact.confidence, fact.source_type, fact.source_hash, fact.source_ref, fact.created_at, safeUpdatedAt, fact.last_accessed_at, fact.access_count, fact.deleted_at, fact.id]\n );\n existingFactsById.set(fact.id, { id: fact.id, entity_id: entityId, updated_at: safeUpdatedAt });\n } else {\n await this.db.runAsync(\n `INSERT INTO ${this.prefix}entries (id, entity_id, title, body, tags, confidence, source_type, source_hash, source_ref, created_at, updated_at, last_accessed_at, access_count, deleted_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [fact.id, entityId, fact.title, fact.body, tagsJson, fact.confidence, fact.source_type, fact.source_hash, fact.source_ref, fact.created_at, safeUpdatedAt, fact.last_accessed_at, fact.access_count, fact.deleted_at]\n );\n existingFactsById.set(fact.id, { id: fact.id, entity_id: entityId, updated_at: safeUpdatedAt });\n }\n }\n\n const taskIds = bundle.tasks.map((task) => task.id);\n const existingTasksById = new Map<string, { id: string; entity_id: string; updated_at: number }>();\n const taskLookupChunkSize = 500;\n\n for (let i = 0; i < taskIds.length; i += taskLookupChunkSize) {\n const taskIdChunk = taskIds.slice(i, i + taskLookupChunkSize);\n if (taskIdChunk.length === 0) continue;\n\n const placeholders = taskIdChunk.map(() => '?').join(', ');\n const existingTasks = await this.db.getAllAsync<{ id: string; entity_id: string; updated_at: number }>(\n `SELECT id, entity_id, updated_at FROM ${this.prefix}tasks WHERE id IN (${placeholders})`,\n taskIdChunk\n );\n\n for (const existingTask of existingTasks) {\n existingTasksById.set(existingTask.id, existingTask);\n }\n }\n\n for (const task of bundle.tasks) {\n // Normalize once: non-finite (undefined/null/NaN) → 0 so we never persist an\n // invalid value to the DB and ORDER BY updated_at remains meaningful.\n const safeUpdatedAt = Number.isFinite(task.updated_at) ? task.updated_at : 0;\n const existing = existingTasksById.get(task.id);\n if (existing) {\n if (existing.entity_id !== entityId) {\n this._warnCrossEntityCollision('task', task.id, existing.entity_id, entityId);\n continue;\n }\n if (merge) {\n // LWW: incoming wins only if its updated_at is strictly newer than local.\n // 0 (epoch) never beats a real timestamp, so invalid incoming rows are skipped.\n if (safeUpdatedAt <= existing.updated_at) continue;\n }\n // replace mode (or merge LWW winner): update the existing row (restores if soft-deleted)\n await this.db.runAsync(\n `UPDATE ${this.prefix}tasks SET entity_id = ?, description = ?, status = ?, priority = ?, created_at = ?, updated_at = ?, resolved_at = ?, deleted_at = ? WHERE id = ?`,\n [entityId, task.description, task.status, task.priority, task.created_at, safeUpdatedAt, task.resolved_at, task.deleted_at, task.id]\n );\n existingTasksById.set(task.id, { id: task.id, entity_id: entityId, updated_at: safeUpdatedAt });\n } else {\n await this.db.runAsync(\n `INSERT INTO ${this.prefix}tasks (id, entity_id, description, status, priority, created_at, updated_at, resolved_at, deleted_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [task.id, entityId, task.description, task.status, task.priority, task.created_at, safeUpdatedAt, task.resolved_at, task.deleted_at]\n );\n existingTasksById.set(task.id, { id: task.id, entity_id: entityId, updated_at: safeUpdatedAt });\n }\n }\n\n for (const event of bundle.events) {\n await this.db.runAsync(\n `INSERT OR IGNORE INTO ${this.prefix}events (id, entity_id, event_type, summary, related_entry_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n [event.id, entityId, event.event_type, event.summary, event.related_entry_id ?? null, event.created_at]\n );\n }\n });\n }\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 const now = Date.now();\n let deletedEntries = 0;\n let deletedTasks = 0;\n\n if (params.clearAll) {\n const [entriesRes, tasksRes] = await Promise.all([\n this.db.runAsync(`UPDATE ${this.prefix}entries SET deleted_at = ?, updated_at = ? WHERE entity_id = ? AND deleted_at IS NULL`, [now, now, entityId]),\n this.db.runAsync(`UPDATE ${this.prefix}tasks SET deleted_at = ?, updated_at = ? WHERE entity_id = ? AND deleted_at IS NULL`, [now, now, entityId]),\n ]);\n await this.db.runAsync(`UPDATE ${this.prefix}checkpoints SET memory_checkpoint = 0, heal_checkpoint = 0 WHERE entity_id = ?`, [entityId]);\n deletedEntries = entriesRes.changes;\n deletedTasks = tasksRes.changes;\n } else {\n const hasIdSelectors = params.entryId !== undefined || params.taskId !== undefined;\n const hasSourceSelectors = params.sourceRef !== undefined || params.sourceHash !== undefined;\n if (hasIdSelectors && hasSourceSelectors) {\n throw new Error('forget() params are mutually exclusive: use entryId/taskId together, or sourceRef/sourceHash together, but not both in the same call');\n }\n\n const sourceRef = params.sourceRef !== undefined ? normalizeSourceRef(params.sourceRef) : null;\n if (params.sourceRef !== undefined && !sourceRef) throw new Error('Invalid sourceRef');\n const sourceHash = params.sourceHash !== undefined ? normalizeSourceHash(params.sourceHash) : null;\n if (params.sourceHash !== undefined && !sourceHash) throw new Error('Invalid sourceHash (must be 64-char hex string)');\n\n const entryPromise = params.entryId\n ? this.db.runAsync(`UPDATE ${this.prefix}entries SET deleted_at = ?, updated_at = ? WHERE id = ? AND entity_id = ? AND deleted_at IS NULL`, [now, now, params.entryId, entityId])\n : null;\n\n const taskPromise = params.taskId\n ? this.db.runAsync(`UPDATE ${this.prefix}tasks SET deleted_at = ?, updated_at = ? WHERE id = ? AND entity_id = ? AND deleted_at IS NULL`, [now, now, params.taskId, entityId])\n : null;\n\n let refPromise: Promise<{ changes: number; lastInsertRowId: number }> | null = null;\n if (sourceRef || sourceHash) {\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 refPromise = this.db.runAsync(q, args);\n }\n\n const [entryResult, taskResult, refResult] = await Promise.all([\n entryPromise ?? Promise.resolve(null),\n taskPromise ?? Promise.resolve(null),\n refPromise ?? Promise.resolve(null),\n ]);\n\n if (entryResult) deletedEntries += entryResult.changes;\n if (taskResult) deletedTasks += taskResult.changes;\n if (refResult) deletedEntries += refResult.changes;\n }\n\n return { deleted: { entries: deletedEntries, tasks: deletedTasks } };\n }\n\n async ingestDocument(entityId: string, params: { sourceRef: string; sourceHash: string; documentChunk: string; maxChunkLength?: number; chunkOverlap?: number; chunkConcurrency?: number }): Promise<{ truncated: boolean; chunks: number }> {\n const sourceRef = normalizeSourceRef(params.sourceRef);\n if (!sourceRef) throw new Error('Invalid sourceRef');\n const sourceHash = normalizeSourceHash(params.sourceHash);\n if (!sourceHash) throw new Error('Invalid sourceHash (must be 64-char hex string)');\n\n const maxChunkLength = params.maxChunkLength ?? this.options.config?.maxChunkLength ?? 12000;\n const rawOverlap = params.chunkOverlap ?? this.options.config?.chunkOverlap ?? 400;\n const chunkOverlap = Math.min(\n Number.isFinite(rawOverlap) && rawOverlap >= 0 ? Math.floor(rawOverlap) : 400,\n maxChunkLength - 1\n );\n const rawConcurrency = params.chunkConcurrency ?? this.options.config?.chunkConcurrency ?? 1;\n const chunkConcurrency = Number.isFinite(rawConcurrency) && rawConcurrency >= 1\n ? Math.floor(rawConcurrency)\n : 1;\n\n if (typeof params.documentChunk !== 'string') {\n throw new Error(`documentChunk must be a string, received ${typeof params.documentChunk}`);\n }\n\n const jobKey = `${this.prefix}:${entityId}:${sourceRef}`;\n if (this.activeIngestJobs.has(jobKey)) {\n throw new WikiBusyError('ingest', entityId);\n }\n if (this.activeMaintenanceJobs.has(this._pruneKey(entityId))) {\n throw new WikiBusyError('prune', entityId);\n }\n this.activeIngestJobs.add(jobKey);\n\n try {\n const { chunks, truncated } = chunkText(params.documentChunk, maxChunkLength, chunkOverlap);\n\n if (chunks.length === 0) {\n return { truncated: false, chunks: 0 };\n }\n\n // Bounded-concurrency LLM calls — each chunk is independent\n const chunkResults = await withConcurrency(\n chunks.map((chunk) => async () => {\n const userPrompt = `Document Chunk:\\n${chunk}`;\n const responseText = await this.options.llmProvider.generateText({\n systemPrompt: INGEST_SYSTEM_PROMPT,\n userPrompt,\n });\n const result = parseJsonResponse<{ facts: ExtractedFact[] }>(responseText);\n return (Array.isArray(result.facts) ? result.facts : [])\n .map(validateFact)\n .filter((f): f is ExtractedFact => f !== null);\n }),\n chunkConcurrency\n );\n\n // Flatten in chunk order, then dedup by normalized title (first-wins)\n const seen = new Set<string>();\n const allValidFacts: ExtractedFact[] = [];\n for (const facts of chunkResults) {\n for (const fact of facts) {\n const normalized = fact.title.trim().toLowerCase().replace(/\\s+/g, ' ');\n if (!seen.has(normalized)) {\n seen.add(normalized);\n allValidFacts.push(fact);\n }\n }\n }\n\n const now = Date.now();\n await this.db.withTransactionAsync(async () => {\n await this.db.runAsync(\n `UPDATE ${this.prefix}entries SET deleted_at = ?, updated_at = ? WHERE source_ref = ? AND entity_id = ? AND deleted_at IS NULL`,\n [now, now, sourceRef, entityId]\n );\n for (const fact of allValidFacts) {\n const id = generateId('fact_');\n await this.db.runAsync(\n `INSERT INTO ${this.prefix}entries (id, entity_id, title, body, tags, confidence, source_type, source_hash, source_ref, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [id, entityId, fact.title, fact.body, JSON.stringify(fact.tags), fact.confidence, 'user_document', sourceHash, sourceRef, now, now]\n );\n }\n });\n\n return { truncated, chunks: chunks.length };\n } finally {\n this.activeIngestJobs.delete(jobKey);\n }\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): string {\n const confPart = includeConfidence ? ` (${fact.confidence})` : '';\n const tagPart =\n includeTags && fact.tags.length > 0 ? ` [${fact.tags.join(', ')}]` : '';\n return `- **${fact.title}**${confPart}${tagPart}\\n ${fact.body.replace(/\\n/g, '\\n ')}`;\n}\n\nfunction renderFactPlain(\n fact: WikiFact,\n includeConfidence: boolean,\n includeTags: boolean\n): string {\n const confPart = includeConfidence ? ` (${fact.confidence})` : '';\n const tagPart =\n includeTags && fact.tags.length > 0 ? ` [${fact.tags.join(', ')}]` : '';\n return `${fact.title}${confPart}${tagPart}: ${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 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.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));\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));\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 { MemoryDump, FormattedMemoryDump, MemoryBundle, WikiFact, WikiTask, WikiEvent } from '../types';\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 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\nfunction formatEntityFileName(entityId: string): string {\n const normalized = entityId.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>.md`.\n const MAX_BASE = 200;\n const trimmed = sanitized.length > MAX_BASE ? sanitized.slice(0, MAX_BASE) : sanitized;\n\n const baseName = trimmed && trimmed !== '.' && trimmed !== '..'\n ? trimmed\n : 'entity';\n const needsSuffix = baseName !== entityId || sanitized.length > MAX_BASE;\n const uniqueBaseName = needsSuffix ? `${baseName}-${shortHash(entityId)}` : baseName;\n\n return `${uniqueBaseName}.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 return {\n manifest: JSON.stringify(dump, null, 2),\n files,\n };\n}\n","import { WikiMemory } from './WikiMemory';\nimport type { SQLiteAdapter, WikiOptions } from './types';\n\nexport * from './types';\nexport { WikiMemory } from './WikiMemory';\nexport { formatContext } from './utils/formatContext';\nexport { formatMemoryDump } from './utils/formatMemoryDump';\n\nexport function createWiki(db: SQLiteAdapter, options: WikiOptions): WikiMemory {\n return new WikiMemory(db, options);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/db/schema.ts","../src/db/migrations.ts","../src/types.ts","../src/prompts.ts","../src/utils/cosine.ts","../src/WikiMemory.ts","../src/utils/formatContext.ts","../src/utils/formatMemoryDump.ts","../src/index.ts"],"names":["rows","documents"],"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 'agent_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 );\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 );\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}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}meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\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 () => {\n await db.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\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","/**\n * Platform-agnostic SQLite driver interface.\n * Each platform package (wiki-expo, wiki-react) provides an adapter\n * that wraps its native driver behind this interface.\n */\nexport interface SQLiteAdapter {\n execAsync(sql: string): Promise<void>;\n runAsync(sql: string, params?: unknown[]): Promise<{ changes: number; lastInsertRowId: number }>;\n getAllAsync<T>(sql: string, params?: unknown[]): Promise<T[]>;\n getFirstAsync<T>(sql: string, params?: unknown[]): Promise<T | null>;\n withTransactionAsync<T>(fn: () => Promise<T>): Promise<T>;\n closeAsync(): Promise<void>;\n}\n\nexport interface WikiConfig {\n tablePrefix?: string;\n maxResults?: number;\n /** @deprecated Use maxResults */\n maxFtsResults?: number;\n pruneEventsAfter?: number;\n pruneRetainSoftDeletedFor?: number;\n autoLibrarianThreshold?: number;\n autoHealThreshold?: number;\n orphanAfterDays?: number | null;\n staleInferredAfterDays?: number | null;\n maxChunkLength?: number;\n chunkOverlap?: number;\n chunkConcurrency?: number;\n}\n\nexport interface WikiFact {\n id: string;\n entity_id: string;\n title: string;\n body: string;\n tags: string[];\n confidence: 'certain' | 'inferred' | 'tentative';\n source_type: 'user_stated' | 'agent_inferred' | 'user_confirmed' | 'user_document';\n source_hash: string | null;\n source_ref: string | null;\n created_at: number;\n updated_at: number;\n last_accessed_at: number | null;\n access_count: number;\n deleted_at: number | null;\n}\n\nexport interface WikiTask {\n id: string;\n entity_id: string;\n description: string;\n status: 'pending' | 'in_progress' | 'done' | 'abandoned';\n priority: number;\n created_at: number;\n updated_at: number;\n resolved_at: number | null;\n deleted_at: number | null;\n}\n\nexport interface WikiEvent {\n id: string;\n entity_id: string;\n event_type: 'observation' | 'decision' | 'action' | 'outcome';\n summary: string;\n related_entry_id?: string | null;\n created_at: number;\n}\n\nexport interface WikiCheckpoint {\n entity_id: string;\n heal_checkpoint: number;\n memory_checkpoint: number;\n}\n\nexport interface ExtractedFact {\n title: string;\n body: string;\n tags: string[];\n confidence: 'certain' | 'inferred' | 'tentative';\n}\n\nexport interface ExtractedTask {\n description: string;\n priority: number;\n}\n\nexport interface LLMProvider {\n /**\n * Generates text using the developer's LLM of choice.\n * Expected to return the raw text response (typically a JSON string).\n */\n generateText: (params: { systemPrompt: string; userPrompt: string }) => Promise<string>;\n /**\n * Optional. When provided, enables semantic similarity search in `read()`.\n * Must return a stable-dimension float array for any input text.\n * Called once per fact on creation/update, and once per `read()` query.\n * When absent or throws, `read()` falls back to MiniSearch.\n */\n embed?: (text: string) => Promise<number[]>;\n}\n\nexport interface WikiOptions {\n config?: WikiConfig;\n llmProvider: LLMProvider;\n /**\n * Called when embedding-based retrieval is unavailable during `read()` and\n * MiniSearch keyword search is used instead. This can happen when:\n * - `embed()` throws (e.g. network error, model unavailable)\n * - `embed()` returns a vector with non-finite values (NaN / Infinity)\n * - The query vector's dimension doesn't match stored embeddings (model switch;\n * resolve by calling `runReembed()`)\n *\n * `read()` still returns keyword-search results — this is a notification, not an error path.\n */\n onRetrievalFallback?: (error: Error) => void;\n}\n\nexport interface MemoryBundle {\n facts: WikiFact[];\n tasks: WikiTask[];\n events: WikiEvent[];\n}\n\nexport interface MemoryDump {\n generatedAt: number;\n entities: Record<string, MemoryBundle>;\n}\n\nexport interface FormattedMemoryDump {\n manifest: string;\n files: Array<{ name: string; content: string }>;\n}\n\nexport interface FormatContextOptions {\n format?: 'markdown' | 'plain';\n maxFacts?: number;\n maxTasks?: number;\n maxEvents?: number;\n includeConfidence?: boolean;\n includeTags?: boolean;\n factWeights?: {\n confidence?: number;\n accessCount?: number;\n recency?: number;\n };\n}\n\nexport interface EntityStatus {\n ingesting: boolean;\n librarian: boolean;\n heal: boolean;\n}\n\nexport class WikiBusyError extends Error {\n readonly operation: 'ingest' | 'librarian' | 'heal' | 'prune' | 'reembed';\n readonly entityId: string;\n\n constructor(operation: 'ingest' | 'librarian' | 'heal' | 'prune' | 'reembed', entityId: string) {\n super(`${operation} already running for entity ${entityId}`);\n this.name = 'WikiBusyError';\n this.operation = operation;\n this.entityId = entityId;\n }\n}\n","export const LIBRARIAN_SYSTEM_PROMPT = `You are a knowledge extraction agent. Your job is to analyze recent episodic events and extract stable facts and actionable tasks about the user or entity.\nReturn ONLY a valid JSON object matching this schema:\n{\n \"facts\": [{ \"title\": \"string (max 80 chars)\", \"body\": \"string (max 800 chars)\", \"tags\": [\"string\"], \"confidence\": \"certain|inferred|tentative\" }],\n \"tasks\": [{ \"description\": \"string\", \"priority\": \"number (0-10)\" }]\n}\nKeep facts concise. Do not return markdown, just raw JSON.`;\n\nexport const HEAL_SYSTEM_PROMPT = `You are a memory grooming agent. Your job is to review a full dump of facts and recent events to resolve contradictions, downgrade stale claims, and flag obsolete facts for deletion.\nReturn ONLY a valid JSON object matching this schema:\n{\n \"downgraded\": [\"string (fact IDs)\"],\n \"deleted\": [\"string (fact IDs)\"],\n \"newFacts\": [{ \"title\": \"string (max 80 chars)\", \"body\": \"string (max 800 chars)\", \"tags\": [\"string\"], \"confidence\": \"certain|inferred|tentative\" }]\n}\nDo not return markdown, just raw JSON.`;\n\nexport const INGEST_SYSTEM_PROMPT = `You are a document ingestion agent. Your job is to extract factual knowledge from the provided document chunk.\nReturn ONLY a valid JSON object matching this schema:\n{\n \"facts\": [{ \"title\": \"string (max 80 chars)\", \"body\": \"string (max 800 chars)\", \"tags\": [\"string\"], \"confidence\": \"certain|inferred|tentative\" }]\n}\nExtract verbatim factual content. Do not return markdown, just raw JSON.`;\n","export function cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0, normA = 0, normB = 0;\n const len = Math.min(a.length, b.length);\n for (let i = 0; i < len; i++) {\n dot += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB);\n return denom === 0 ? 0 : dot / denom;\n}\n","import type { SQLiteAdapter } from './types';\nimport { setupDatabase } from './db/schema';\nimport { MIGRATIONS, CURRENT_SCHEMA_VERSION } from './db/migrations';\nimport { WikiOptions, MemoryBundle, MemoryDump, WikiEvent, WikiFact, WikiTask, WikiCheckpoint, ExtractedFact, ExtractedTask, WikiBusyError, EntityStatus } from './types';\nimport { LIBRARIAN_SYSTEM_PROMPT, HEAL_SYSTEM_PROMPT, INGEST_SYSTEM_PROMPT } from './prompts';\nimport MiniSearch from 'minisearch';\nimport { cosineSimilarity } from './utils/cosine';\n\nexport { WikiBusyError } from './types';\n\nfunction parseJsonResponse<T>(text: string): T {\n const firstBrace = text.indexOf('{');\n const firstBracket = text.indexOf('[');\n\n let start: number;\n let openChar: string;\n let closeChar: string;\n\n if (firstBrace !== -1 && (firstBracket === -1 || firstBrace < firstBracket)) {\n start = firstBrace;\n openChar = '{';\n closeChar = '}';\n } else if (firstBracket !== -1) {\n start = firstBracket;\n openChar = '[';\n closeChar = ']';\n } else {\n throw new SyntaxError('No JSON object/array found in LLM response');\n }\n\n // Walk from `start`, tracking nesting depth and skipping strings/escapes,\n // so we stop at the true matching close bracket rather than the last one.\n let depth = 0;\n let inString = false;\n let escape = false;\n let end = -1;\n for (let i = start; i < text.length; i++) {\n const ch = text[i];\n if (escape) { escape = false; continue; }\n if (ch === '\\\\' && inString) { escape = true; continue; }\n if (ch === '\"') { inString = !inString; continue; }\n if (inString) continue;\n if (ch === openChar) { depth++; continue; }\n if (ch === closeChar) {\n depth--;\n if (depth === 0) { end = i; break; }\n }\n }\n\n if (end === -1) throw new SyntaxError('No JSON object/array found in LLM response');\n return JSON.parse(text.slice(start, end + 1)) as T;\n}\n\nfunction generateId(prefix: string = '') {\n return prefix + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);\n}\n\nfunction safeSlice(value: string, start: number, end?: number): string {\n const length = value.length;\n let safeStart = start < 0 ? Math.max(length + start, 0) : Math.min(start, length);\n let safeEnd = end === undefined\n ? length\n : end < 0\n ? Math.max(length + end, 0)\n : Math.min(end, length);\n\n if (safeStart > safeEnd) {\n [safeStart, safeEnd] = [safeEnd, safeStart];\n }\n\n if (\n safeStart > 0 &&\n safeStart < length &&\n value.charCodeAt(safeStart) >= 0xDC00 &&\n value.charCodeAt(safeStart) <= 0xDFFF &&\n value.charCodeAt(safeStart - 1) >= 0xD800 &&\n value.charCodeAt(safeStart - 1) <= 0xDBFF\n ) {\n safeStart--;\n }\n\n if (\n safeEnd > 0 &&\n safeEnd < length &&\n value.charCodeAt(safeEnd - 1) >= 0xD800 &&\n value.charCodeAt(safeEnd - 1) <= 0xDBFF &&\n value.charCodeAt(safeEnd) >= 0xDC00 &&\n value.charCodeAt(safeEnd) <= 0xDFFF\n ) {\n safeEnd--;\n }\n\n return value.slice(safeStart, safeEnd);\n}\n\nfunction chunkText(\n input: string,\n maxChunkLength: number,\n overlap: number\n): { chunks: string[]; truncated: boolean } {\n const text = input.trim();\n if (text.length === 0) return { chunks: [], truncated: false };\n if (!Number.isInteger(maxChunkLength) || maxChunkLength < 2) {\n throw new Error('maxChunkLength must be an integer >= 2');\n }\n if (!Number.isInteger(overlap) || overlap < 0 || overlap >= maxChunkLength) {\n throw new Error('overlap must be a non-negative integer < maxChunkLength');\n }\n\n const chunks: string[] = [];\n let truncated = false;\n let cursor = 0;\n const halfMax = Math.floor(maxChunkLength / 2);\n\n while (cursor < text.length) {\n const remaining = text.length - cursor;\n if (remaining <= maxChunkLength) {\n chunks.push(safeSlice(text, cursor, text.length));\n break;\n }\n\n const windowEnd = cursor + maxChunkLength;\n const minSplit = cursor + halfMax;\n\n // 1. paragraph break\n let splitPoint = -1;\n const paraIdx = text.lastIndexOf('\\n\\n', windowEnd);\n if (paraIdx >= minSplit && paraIdx + 2 <= windowEnd) {\n splitPoint = paraIdx + 2;\n }\n\n // 2. sentence terminator (single left-to-right pass, no lookahead regex)\n if (splitPoint === -1) {\n let lastTerm = -1;\n for (let i = minSplit; i < windowEnd - 1; i++) {\n const ch = text[i];\n if ((ch === '.' || ch === '!' || ch === '?') && /\\s/.test(text[i + 1])) {\n lastTerm = i + 2; // include the terminator + whitespace\n }\n }\n if (lastTerm !== -1 && lastTerm <= windowEnd) splitPoint = lastTerm;\n }\n\n // 3. whitespace\n if (splitPoint === -1) {\n for (let i = windowEnd - 1; i >= minSplit; i--) {\n if (/\\s/.test(text[i])) {\n splitPoint = i + 1;\n break;\n }\n }\n }\n\n // 4. hard cut\n if (splitPoint === -1) {\n truncated = true;\n splitPoint = windowEnd;\n }\n\n chunks.push(safeSlice(text, cursor, splitPoint));\n const next = Math.max(splitPoint - overlap, cursor + 1);\n cursor = next;\n }\n\n return { chunks, truncated };\n}\n\nasync function withConcurrency<T>(tasks: Array<() => Promise<T>>, limit: number): Promise<T[]> {\n const results: T[] = new Array(tasks.length);\n let index = 0;\n let failed = false;\n let firstError: unknown;\n async function worker() {\n while (index < tasks.length && !failed) {\n const i = index++;\n try {\n results[i] = await tasks[i]();\n } catch (e) {\n if (!failed) { failed = true; firstError = e; }\n return;\n }\n }\n }\n const workerCount = tasks.length === 0 ? 0 : Math.min(Math.max(limit, 1), tasks.length);\n await Promise.allSettled(Array.from({ length: workerCount }, worker));\n if (failed) throw firstError;\n return results;\n}\n\nfunction clip(value: string, max: number): string {\n if (typeof value !== 'string') return '';\n const s = value.trim();\n return s.length <= max ? s : safeSlice(s, 0, max).trimEnd();\n}\n\nfunction validateTags(tags: any[]): string[] {\n if (!Array.isArray(tags)) return [];\n return tags\n .filter(t => typeof t === 'string')\n .map(t => t.trim().toLowerCase())\n .filter(t => t.length > 0 && t.length <= 40)\n .slice(0, 6);\n}\n\nfunction validateFact(fact: any): ExtractedFact | null {\n if (typeof fact?.title !== 'string' || typeof fact?.body !== 'string') return null;\n const title = clip(fact.title, 80);\n const body = clip(fact.body, 800);\n if (!title || !body) return null;\n \n let confidence = fact.confidence;\n if (confidence !== 'certain' && confidence !== 'tentative') confidence = 'inferred';\n \n return {\n ...fact,\n title,\n body,\n confidence,\n tags: validateTags(fact.tags)\n };\n}\n\nfunction validateTask(task: any): ExtractedTask | null {\n if (typeof task?.description !== 'string') return null;\n const description = clip(task.description, 200);\n if (!description) return null;\n \n let priority = task.priority;\n if (typeof priority !== 'number' || !isFinite(priority)) priority = 0;\n \n return {\n ...task,\n description,\n priority\n };\n}\n\nfunction normalizeSourceRef(value: string): string | null {\n if (typeof value !== 'string') return null;\n const cleaned = value.replace(/[^A-Za-z0-9._\\- ]/g, '').trim().slice(0, 255);\n return cleaned.length > 0 ? cleaned : null;\n}\n\nfunction normalizeSourceHash(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n return /^[0-9a-f]{64}$/i.test(value) ? value.toLowerCase() : null;\n}\n\n\nfunction titleTokens(title: string): Set<string> {\n return new Set(title.toLowerCase().replace(/[^a-z0-9\\s]/g, '').split(/\\s+/).filter(t => t.length >= 3));\n}\n\nfunction jaccardScore(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 && b.size === 0) return 0;\n const intersection = new Set([...a].filter(x => b.has(x)));\n const union = new Set([...a, ...b]);\n return intersection.size / union.size;\n}\n\nconst FUZZY_THRESHOLD = 0.5;\nconst MIN_TOKENS_TO_QUALIFY = 3;\n\nexport class WikiMemory {\n private db: SQLiteAdapter;\n private prefix: string;\n private options: WikiOptions;\n private activeMaintenanceJobs = new Set<string>();\n private activeIngestJobs = new Set<string>();\n private miniSearch = new MiniSearch<{ id: string; entity_id: string; title: string; body: string; tags: string }>({\n fields: ['title', 'body', 'tags'],\n storeFields: ['entity_id'],\n searchOptions: {\n boost: { title: 2 },\n fuzzy: 0.2,\n prefix: true,\n },\n });\n private miniSearchEntryIdsByEntity = new Map<string, Set<string>>();\n\n private normalizeMiniSearchRow(row: {\n id: string; entity_id: string; title: string; body: string; tags: string;\n }): { id: string; entity_id: string; title: string; body: string; tags: string } {\n return {\n id: row.id,\n entity_id: row.entity_id,\n title: row.title,\n body: row.body,\n tags: (() => {\n try {\n const parsed = JSON.parse(row.tags);\n return Array.isArray(parsed) ? parsed.join(' ') : row.tags;\n } catch {\n return row.tags;\n }\n })(),\n };\n }\n\n private async rebuildMiniSearchIndex(entityId?: string): Promise<void> {\n if (entityId) {\n const rows = await this.db.getAllAsync<{\n id: string; entity_id: string; title: string; body: string; tags: string;\n }>(\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 const previousIds = this.miniSearchEntryIdsByEntity.get(entityId);\n if (previousIds) {\n for (const id of previousIds) {\n this.miniSearch.discard(id);\n }\n }\n\n const documents = rows.map(row => this.normalizeMiniSearchRow(row));\n if (documents.length > 0) {\n this.miniSearch.addAll(documents);\n }\n\n this.miniSearchEntryIdsByEntity.set(entityId, new Set(documents.map(document => document.id)));\n return;\n }\n\n const rows = await this.db.getAllAsync<{\n id: string; entity_id: string; title: string; body: string; tags: string;\n }>(`SELECT id, entity_id, title, body, tags FROM ${this.prefix}entries WHERE deleted_at IS NULL`);\n\n this.miniSearch.removeAll();\n this.miniSearchEntryIdsByEntity.clear();\n\n const documents = rows.map(row => this.normalizeMiniSearchRow(row));\n if (documents.length > 0) {\n this.miniSearch.addAll(documents);\n }\n\n for (const document of documents) {\n const ids = this.miniSearchEntryIdsByEntity.get(document.entity_id) ?? new Set<string>();\n ids.add(document.id);\n this.miniSearchEntryIdsByEntity.set(document.entity_id, ids);\n }\n }\n\n private async storeEmbeddingDimension(dim: number): Promise<void> {\n const existing = await this.db.getFirstAsync<{ value: string }>(\n `SELECT value FROM ${this.prefix}meta WHERE key = 'embedding_dimension'`\n );\n if (existing) {\n const storedDim = parseInt(existing.value, 10);\n if (storedDim !== dim) {\n console.warn(\n `[WikiMemory] Embedding dimension mismatch: stored ${storedDim}, got ${dim}. ` +\n `Call runReembed() to rebuild embeddings with the new model.`\n );\n await this.db.runAsync(\n `INSERT OR REPLACE INTO ${this.prefix}meta (key, value) VALUES ('embedding_dimension_mismatch', ?)`,\n [String(dim)]\n );\n } else {\n await this.db.runAsync(\n `DELETE FROM ${this.prefix}meta WHERE key = 'embedding_dimension_mismatch'`\n );\n }\n } else {\n await this.db.runAsync(\n `INSERT OR REPLACE INTO ${this.prefix}meta (key, value) VALUES ('embedding_dimension', ?)`,\n [String(dim)]\n );\n }\n }\n\n /**\n * After a successful runReembed(), promote the pending `embedding_dimension_mismatch`\n * value to the canonical `embedding_dimension` key and clear the mismatch flag.\n * This ensures future read() calls use embedding-based retrieval rather than staying\n * stuck on the MiniSearch fallback.\n */\n private async _reconcileEmbeddingDimension(): Promise<void> {\n const mismatch = await this.db.getFirstAsync<{ value: string }>(\n `SELECT value FROM ${this.prefix}meta WHERE key = 'embedding_dimension_mismatch'`\n );\n if (mismatch) {\n await this.db.runAsync(\n `INSERT OR REPLACE INTO ${this.prefix}meta (key, value) VALUES ('embedding_dimension', ?)`,\n [mismatch.value]\n );\n await this.db.runAsync(\n `DELETE FROM ${this.prefix}meta WHERE key = 'embedding_dimension_mismatch'`\n );\n }\n }\n\n private async embedFact(fact: { id: string; title: string; body: string; tags: string | string[] }): Promise<boolean> {\n const embedFn = this.options.llmProvider.embed;\n if (!embedFn) return false;\n let tagsStr: string;\n if (Array.isArray(fact.tags)) {\n tagsStr = fact.tags.join(' ');\n } else {\n try {\n const parsed = JSON.parse(fact.tags);\n tagsStr = Array.isArray(parsed) ? parsed.join(' ') : fact.tags;\n } catch {\n tagsStr = fact.tags;\n }\n }\n const text = `${fact.title} ${fact.body} ${tagsStr}`.trim();\n try {\n const vector = await embedFn(text);\n // Validate before persisting: an empty or non-finite vector would poison\n // embedding_dimension and write unusable data to entries.embedding.\n if (vector.length === 0 || !vector.every(v => typeof v === 'number' && isFinite(v))) {\n console.warn(`[WikiMemory] embedFact: embed() returned an invalid vector for ${fact.id}; skipping.`);\n return false;\n }\n await this.storeEmbeddingDimension(vector.length);\n await this.db.runAsync(\n `UPDATE ${this.prefix}entries SET embedding = ? WHERE id = ?`,\n [JSON.stringify(vector), fact.id]\n );\n return true;\n } catch (err) {\n console.warn(`[WikiMemory] embedFact failed for ${fact.id}:`, err);\n return false;\n }\n }\n\n private _librarianKey(entityId: string) { return `${this.prefix}:${entityId}:librarian`; }\n private _healKey(entityId: string) { return `${this.prefix}:${entityId}:heal`; }\n private _warnCrossEntityCollision(type: 'entry' | 'task', id: string, existingEntityId: string, targetEntityId: string): void {\n console.warn(`[WikiMemory] importDump: ${type} id \"${id}\" already belongs to entity \"${existingEntityId}\"; skipping for entity \"${targetEntityId}\"`);\n }\n\n constructor(db: SQLiteAdapter, options: WikiOptions) {\n this.db = db;\n this.options = options;\n this.prefix = options.config?.tablePrefix || 'llm_wiki_';\n }\n\n async setup() {\n // Probe entries-table existence BEFORE creating any tables. setupDatabase()\n // uses IF NOT EXISTS throughout, so once it has run the entries table always\n // exists and the fresh-install branch would be unreachable. Future migrations\n // that ALTER TABLE would also fail if run against a schema already at the\n // target version but inferred as legacy because the probe ran too late.\n const entriesExistedBeforeSetup = await this.db.getFirstAsync<{ name: string }>(\n `SELECT name FROM sqlite_master WHERE type='table' AND name=?`,\n [`${this.prefix}entries`]\n );\n\n await setupDatabase(this.db, this.prefix);\n\n let currentVersion: number;\n\n if (!entriesExistedBeforeSetup) {\n // Fresh install — all tables just created at current schema; no migrations needed.\n await this.db.runAsync(\n `INSERT OR REPLACE INTO ${this.prefix}meta (key, value) VALUES ('schema_version', ?)`,\n [String(CURRENT_SCHEMA_VERSION)]\n );\n currentVersion = CURRENT_SCHEMA_VERSION;\n } else {\n // Existing install — check meta for schema version.\n const metaRow = await this.db.getFirstAsync<{ value: string }>(\n `SELECT value FROM ${this.prefix}meta WHERE key = 'schema_version'`\n );\n\n if (metaRow) {\n currentVersion = parseInt(metaRow.value, 10);\n if (!Number.isFinite(currentVersion)) currentVersion = 0;\n } else {\n // Legacy install without meta row — infer version from porter probe.\n const ftsMeta = await this.db.getFirstAsync<{ sql: string | null }>(\n `SELECT sql FROM sqlite_master WHERE type='table' AND name=?`,\n [`${this.prefix}entries_fts`]\n );\n const hasPorter = /tokenize\\s*=\\s*['\"]porter\\s+unicode61['\"]/i.test(ftsMeta?.sql ?? '');\n currentVersion = hasPorter ? 1 : 0;\n }\n }\n\n // Run pending migrations in order.\n for (const migration of MIGRATIONS) {\n if (migration.version > currentVersion) {\n await migration.run(this.db, this.prefix);\n await this.db.runAsync(\n `INSERT OR REPLACE INTO ${this.prefix}meta (key, value) VALUES ('schema_version', ?)`,\n [String(migration.version)]\n );\n currentVersion = migration.version;\n }\n }\n\n // Ensure meta row exists for legacy installs already at current version\n // (porter present, no meta row) — the migration loop may not have written it.\n if (entriesExistedBeforeSetup) {\n const metaCheck = await this.db.getFirstAsync<{ value: string }>(\n `SELECT value FROM ${this.prefix}meta WHERE key = 'schema_version'`\n );\n if (!metaCheck) {\n await this.db.runAsync(\n `INSERT OR REPLACE INTO ${this.prefix}meta (key, value) VALUES ('schema_version', ?)`,\n [String(currentVersion)]\n );\n }\n }\n\n // Migration: normalize any existing source_ref values that were stored before the\n // allowlist rule ([^A-Za-z0-9._\\- ] → strip) was introduced. Read-then-update in\n // JS so the normalization is guaranteed to match what normalizeSourceRef() produces,\n // regardless of which characters the old normalization left behind.\n // The WHERE clause pre-filters to rows that contain any character outside the\n // allowlist (checking leading/trailing whitespace, slashes, backslashes, NUL, and\n // the full ASCII non-allowlist range via GLOB) so that already-normalized\n // rows are never fetched. Idempotent: after the first run no rows match the filter.\n type Row = { rowid: number; source_ref: string };\n const rows = await this.db.getAllAsync<Row>(`\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 await this.db.withTransactionAsync(async () => {\n for (const row of rows) {\n const normalized = normalizeSourceRef(row.source_ref);\n if (normalized !== row.source_ref) {\n await this.db.runAsync(\n `UPDATE ${this.prefix}entries SET source_ref = ? WHERE rowid = ?`,\n [normalized, row.rowid]\n );\n }\n }\n });\n\n await this.rebuildMiniSearchIndex();\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: \"${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 row = await this.db.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, normalizedRef]\n );\n if (!row) return true;\n const normalizedStoredHash = row.source_hash ? normalizeSourceHash(row.source_hash) : null;\n return normalizedStoredHash !== normalizedHash;\n }\n\n private _pruneKey(entityId: string) { return `${this.prefix}:${entityId}:prune`; }\n private _reembedKey(entityId: string) { return `${this.prefix}:${entityId}:reembed`; }\n private _globalReembedKey() { return `${this.prefix}:reembed`; }\n private _isReembedActive(entityId: string): boolean {\n return this.activeMaintenanceJobs.has(this._reembedKey(entityId))\n || this.activeMaintenanceJobs.has(this._globalReembedKey());\n }\n /** Returns true if any maintenance job has the given operation suffix (e.g. ':prune'). */\n private _isAnyMaintenanceActiveWithSuffix(suffix: string): boolean {\n const entityKeyPrefix = `${this.prefix}:`;\n for (const k of this.activeMaintenanceJobs) {\n if (k.startsWith(entityKeyPrefix) && k.endsWith(suffix)) return true;\n }\n return false;\n }\n /** Returns true if any ingest job is active for the given entity. */\n private _isIngestActiveFor(entityId: string): boolean {\n const entityKeyPrefix = `${this.prefix}:${entityId}:`;\n for (const k of this.activeIngestJobs) {\n if (k.startsWith(entityKeyPrefix)) return true;\n }\n return false;\n }\n\n private _validatePruneDuration(value: number | null | undefined, name: string): void {\n if (value !== null && value !== undefined && (typeof value !== 'number' || !isFinite(value) || value < 0)) {\n throw new Error(`Invalid ${name}: must be a non-negative finite number or null`);\n }\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 const pruneKey = this._pruneKey(entityId);\n // Prune must not run concurrently with librarian, heal, ingest, or another\n // prune for the same entity.\n const ingestPrefix = `${this.prefix}:${entityId}:`;\n let isIngestRunning = false;\n for (const k of this.activeIngestJobs) {\n if (k.startsWith(ingestPrefix)) { isIngestRunning = true; break; }\n }\n let blockingOperation: 'prune' | 'librarian' | 'heal' | 'ingest' | 'reembed' | null = null;\n if (this.activeMaintenanceJobs.has(pruneKey)) {\n blockingOperation = 'prune';\n } else if (this.activeMaintenanceJobs.has(this._librarianKey(entityId))) {\n blockingOperation = 'librarian';\n } else if (this.activeMaintenanceJobs.has(this._healKey(entityId))) {\n blockingOperation = 'heal';\n } else if (this._isReembedActive(entityId)) {\n blockingOperation = 'reembed';\n } else if (isIngestRunning) {\n blockingOperation = 'ingest';\n }\n if (blockingOperation !== null) {\n throw new WikiBusyError(blockingOperation, entityId);\n }\n this.activeMaintenanceJobs.add(pruneKey);\n try {\n const retainSoftDeletedFor = options?.retainSoftDeletedFor !== undefined\n ? options.retainSoftDeletedFor\n : (this.options.config?.pruneRetainSoftDeletedFor ?? 7);\n const retainEventsFor = options?.retainEventsFor !== undefined\n ? options.retainEventsFor\n : (this.options.config?.pruneEventsAfter ?? 30);\n const vacuum = options?.vacuum ?? false;\n\n this._validatePruneDuration(retainSoftDeletedFor, 'retainSoftDeletedFor');\n this._validatePruneDuration(retainEventsFor, 'retainEventsFor');\n\n const now = Date.now();\n let deletedEntries = 0;\n let deletedTasks = 0;\n let deletedEvents = 0;\n\n if (retainSoftDeletedFor !== null) {\n const cutoff = now - retainSoftDeletedFor * 86400000;\n const entryResult = await this.db.runAsync(\n `DELETE FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NOT NULL AND deleted_at < ?`,\n [entityId, cutoff]\n );\n deletedEntries = entryResult.changes;\n\n const taskResult = await this.db.runAsync(\n `DELETE FROM ${this.prefix}tasks\n WHERE entity_id = ? AND deleted_at IS NOT NULL AND deleted_at < ?`,\n [entityId, cutoff]\n );\n deletedTasks = taskResult.changes;\n }\n\n if (retainEventsFor !== null) {\n const cutoff = now - retainEventsFor * 86400000;\n const eventResult = await this.db.runAsync(\n `DELETE FROM ${this.prefix}events\n WHERE entity_id = ? AND created_at < ?`,\n [entityId, cutoff]\n );\n deletedEvents = eventResult.changes;\n }\n\n if (vacuum) {\n await this.db.execAsync(`PRAGMA wal_checkpoint(TRUNCATE)`);\n await this.db.execAsync(`VACUUM`);\n }\n\n await this.rebuildMiniSearchIndex(entityId);\n return { entries: deletedEntries, tasks: deletedTasks, events: deletedEvents };\n } finally {\n this.activeMaintenanceJobs.delete(pruneKey);\n }\n }\n\n async read(entityId: string, query: string): Promise<MemoryBundle> {\n const maxResults = this.options.config?.maxResults\n ?? this.options.config?.maxFtsResults\n ?? 10;\n const embedFn = this.options.llmProvider.embed;\n const trimmedQuery = query.trim();\n\n let facts: WikiFact[] = [];\n\n if (trimmedQuery) {\n let usedEmbed = false;\n\n if (embedFn) {\n try {\n const queryVec = await embedFn(trimmedQuery);\n\n // Validate that the provider returned a well-formed vector. An empty vector\n // would cause all facts to score 0 (silently bypassing the fallback), and\n // non-finite values (NaN, Infinity) make the sort comparator unstable.\n if (queryVec.length === 0 || !queryVec.every(v => typeof v === 'number' && isFinite(v))) {\n throw new Error(\n 'embed() returned an empty or non-finite vector. Falling back to keyword search.'\n );\n }\n\n // Detect embedding dimension mismatch: if stored dimension differs from the\n // query vector, existing fact embeddings were built with a different model and\n // cosine scoring would silently produce misleading rankings. Fall back to\n // MiniSearch until the caller runs runReembed().\n const storedDimRow = await this.db.getFirstAsync<{ value: string }>(\n `SELECT value FROM ${this.prefix}meta WHERE key = 'embedding_dimension'`\n );\n if (storedDimRow) {\n const storedDim = parseInt(storedDimRow.value, 10);\n if (storedDim !== queryVec.length) {\n throw new Error(\n `Embedding dimension mismatch: stored ${storedDim}, query has ${queryVec.length}. ` +\n `Call runReembed() to rebuild embeddings with the new model.`\n );\n }\n }\n\n // Phase 1: fetch only scoring columns to avoid loading large body/tags for all rows\n const scoreRows = await this.db.getAllAsync<{\n id: string;\n embedding: string | null;\n updated_at: number | null;\n access_count: number | null;\n }>(\n `SELECT id, embedding, updated_at, access_count FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL`,\n [entityId]\n );\n const scored = scoreRows.map(row => {\n let score = 0;\n if (row.embedding) {\n try {\n const parsed: unknown = JSON.parse(row.embedding);\n if (\n Array.isArray(parsed) &&\n parsed.length === queryVec.length &&\n (parsed as number[]).every(v => typeof v === 'number' && isFinite(v))\n ) {\n score = cosineSimilarity(queryVec, parsed as number[]);\n }\n // non-array, wrong length, or non-finite values → score stays 0\n } catch {\n // corrupt JSON — treat as score 0\n }\n }\n return { row, score };\n });\n scored.sort((a, b) => {\n const scoreDiff = b.score - a.score;\n if (scoreDiff !== 0) {\n return scoreDiff;\n }\n\n const updatedAtDiff = (b.row.updated_at ?? 0) - (a.row.updated_at ?? 0);\n if (updatedAtDiff !== 0) {\n return updatedAtDiff;\n }\n\n const accessCountDiff = (b.row.access_count ?? 0) - (a.row.access_count ?? 0);\n if (accessCountDiff !== 0) {\n return accessCountDiff;\n }\n\n return a.row.id.localeCompare(b.row.id);\n });\n // Phase 2: fetch full rows only for the top results\n const topIds = scored.slice(0, maxResults).map(s => s.row.id);\n if (topIds.length > 0) {\n const placeholders = topIds.map(() => '?').join(',');\n const fullRows = await this.db.getAllAsync<WikiFact & { embedding: string | null }>(\n `SELECT * FROM ${this.prefix}entries WHERE id IN (${placeholders}) AND deleted_at IS NULL`,\n topIds\n );\n const byId = new Map(fullRows.map(r => [r.id, r]));\n facts = topIds.map(id => byId.get(id)).filter((f): f is WikiFact & { embedding: string | null } => f !== undefined);\n }\n usedEmbed = true;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.options.onRetrievalFallback?.(error);\n }\n }\n\n if (!usedEmbed) {\n // embed absent or threw — fall back to MiniSearch\n const results = this.miniSearch.search(trimmedQuery, {\n filter: (r) => (r as unknown as { entity_id: string }).entity_id === entityId,\n combineWith: 'OR',\n });\n const topIds = results.slice(0, maxResults).map((r: { id: string }) => r.id);\n if (topIds.length > 0) {\n const placeholders = topIds.map(() => '?').join(',');\n const rows = await this.db.getAllAsync<WikiFact>(\n `SELECT * FROM ${this.prefix}entries WHERE id IN (${placeholders}) AND deleted_at IS NULL`,\n topIds\n );\n const byId = new Map(rows.map(r => [r.id, r]));\n facts = topIds.map(id => byId.get(id)).filter((f): f is WikiFact => f !== undefined);\n }\n }\n\n if (facts.length > 0) {\n const ids = facts.map(f => f.id);\n const placeholders = ids.map(() => '?').join(',');\n const now = Date.now();\n await this.db.runAsync(\n `UPDATE ${this.prefix}entries\n SET access_count = access_count + 1, last_accessed_at = ?\n WHERE id IN (${placeholders})`,\n [now, ...ids]\n );\n }\n } else {\n facts = await this.db.getAllAsync<WikiFact>(\n `SELECT * FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL\n ORDER BY updated_at DESC\n LIMIT ?`,\n [entityId, maxResults]\n );\n }\n\n const [tasks, events] = await Promise.all([\n this.db.getAllAsync<WikiTask>(\n `SELECT * FROM ${this.prefix}tasks\n WHERE entity_id = ? AND status IN ('pending', 'in_progress') AND deleted_at IS NULL\n ORDER BY priority DESC, created_at ASC`,\n [entityId]\n ),\n this.db.getAllAsync<WikiEvent>(\n `SELECT * FROM ${this.prefix}events\n WHERE entity_id = ?\n ORDER BY created_at DESC\n LIMIT 10`,\n [entityId]\n ),\n ]);\n\n const parsedFacts = facts.map(f => {\n const { embedding: _embedding, ...rest } = f as WikiFact & { embedding?: unknown };\n return {\n ...rest,\n tags: typeof rest.tags === 'string' ? JSON.parse(rest.tags) : rest.tags,\n };\n });\n\n return { facts: parsedFacts, tasks, events: events.reverse() };\n }\n\n async getMemoryBundle(entityId: string): Promise<MemoryBundle> {\n return this._getFullBundle(entityId, { maxEvents: 10 });\n }\n\n async write(entityId: string, event: Omit<WikiEvent, 'id' | 'entity_id' | 'created_at'>): Promise<void> {\n const id = generateId('evt_');\n const now = Date.now();\n \n let eventType = event.event_type;\n if (!['observation', 'decision', 'action', 'outcome'].includes(eventType)) {\n eventType = 'observation';\n }\n\n await this.db.runAsync(`\n INSERT INTO ${this.prefix}events (id, entity_id, event_type, summary, related_entry_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)\n `, [id, entityId, eventType, event.summary, event.related_entry_id || null, now]);\n\n const threshold = this.options.config?.autoLibrarianThreshold || 20;\n \n const [row, cp] = await Promise.all([\n this.db.getFirstAsync<{ count: number }>(`SELECT COUNT(*) as count FROM ${this.prefix}events WHERE entity_id = ?`, [entityId]),\n this.db.getFirstAsync<WikiCheckpoint>(`SELECT * FROM ${this.prefix}checkpoints WHERE entity_id = ?`, [entityId])\n ]);\n \n const count = row?.count || 0;\n let memoryCheckpoint = cp?.memory_checkpoint || 0;\n if (memoryCheckpoint > count) memoryCheckpoint = 0;\n\n if (count - memoryCheckpoint >= threshold) {\n const jobKey = this._librarianKey(entityId);\n if (\n !this.activeMaintenanceJobs.has(jobKey) &&\n !this.activeMaintenanceJobs.has(this._pruneKey(entityId))\n ) {\n this.activeMaintenanceJobs.add(jobKey);\n this.runLibrarianThenMaybeHeal(entityId, count)\n .catch(console.error)\n .finally(() => this.activeMaintenanceJobs.delete(jobKey));\n }\n }\n }\n\n private async runLibrarianThenMaybeHeal(entityId: string, currentEventCount: number) {\n await this._doRunLibrarian(entityId);\n \n await this.db.runAsync(`\n INSERT INTO ${this.prefix}checkpoints (entity_id, memory_checkpoint) \n VALUES (?, ?) \n ON CONFLICT(entity_id) DO UPDATE SET memory_checkpoint = ?\n `, [entityId, currentEventCount, currentEventCount]);\n \n const autoHealThreshold = this.options.config?.autoHealThreshold || 100;\n const cp = await this.db.getFirstAsync<WikiCheckpoint>(`SELECT * FROM ${this.prefix}checkpoints WHERE entity_id = ?`, [entityId]);\n let healCheckpoint = cp?.heal_checkpoint || 0;\n if (healCheckpoint > currentEventCount) healCheckpoint = 0;\n \n if (currentEventCount - healCheckpoint >= autoHealThreshold) {\n const healKey = this._healKey(entityId);\n if (!this.activeMaintenanceJobs.has(healKey)) {\n this.activeMaintenanceJobs.add(healKey);\n try {\n await this._doRunHeal(entityId);\n await this.db.runAsync(`\n INSERT INTO ${this.prefix}checkpoints (entity_id, heal_checkpoint) \n VALUES (?, ?) \n ON CONFLICT(entity_id) DO UPDATE SET heal_checkpoint = ?\n `, [entityId, currentEventCount, currentEventCount]);\n } finally {\n this.activeMaintenanceJobs.delete(healKey);\n }\n }\n }\n }\n\n private async _doRunLibrarian(entityId: string): Promise<void> {\n const events = await this.db.getAllAsync<WikiEvent>(`\n SELECT * FROM ${this.prefix}events\n WHERE entity_id = ?\n ORDER BY created_at DESC\n LIMIT 50\n `, [entityId]);\n\n const currentFactsRows = await this.db.getAllAsync<WikiFact>(`\n SELECT * FROM ${this.prefix}entries\n WHERE entity_id = ? AND deleted_at IS NULL\n ORDER BY updated_at DESC\n LIMIT 100\n `, [entityId]);\n\n const currentFacts = currentFactsRows.map(f => {\n const { embedding: _embedding, ...rest } = f as WikiFact & { embedding?: unknown };\n return {\n ...rest,\n tags: typeof rest.tags === 'string' ? JSON.parse(rest.tags) : rest.tags,\n };\n });\n\n const userPrompt = `Events:\\n${JSON.stringify(events.reverse(), null, 2)}\\n\\nCurrent Facts:\\n${JSON.stringify(currentFacts, null, 2)}`;\n \n const responseText = await this.options.llmProvider.generateText({\n systemPrompt: LIBRARIAN_SYSTEM_PROMPT,\n userPrompt,\n });\n\n const result = parseJsonResponse<{ facts: ExtractedFact[], tasks: ExtractedTask[] }>(responseText);\n const facts = Array.isArray(result.facts) ? result.facts : [];\n const tasks = Array.isArray(result.tasks) ? result.tasks : [];\n const validFacts = facts.map(validateFact).filter((f): f is ExtractedFact => f !== null);\n const validTasks = tasks.map(validateTask).filter((t): t is ExtractedTask => t !== null);\n\n const now = Date.now();\n\n const insertedFacts: Array<{ id: string; title: string; body: string; tags: string }> = [];\n\n await this.db.withTransactionAsync(async () => {\n for (const fact of validFacts) {\n const newTokens = titleTokens(fact.title);\n let skip = false;\n if (newTokens.size >= MIN_TOKENS_TO_QUALIFY) {\n for (const existing of currentFactsRows) {\n if (existing.source_type !== 'agent_inferred') continue;\n const existingTokens = titleTokens(existing.title);\n if (existingTokens.size >= MIN_TOKENS_TO_QUALIFY) {\n if (jaccardScore(newTokens, existingTokens) >= FUZZY_THRESHOLD) {\n skip = true;\n break;\n }\n }\n }\n }\n if (skip) continue;\n\n const id = generateId('fact_');\n await this.db.runAsync(`\n INSERT INTO ${this.prefix}entries (id, entity_id, title, body, tags, confidence, source_type, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `, [id, entityId, fact.title, fact.body, JSON.stringify(fact.tags), fact.confidence, 'agent_inferred', now, now]);\n insertedFacts.push({ id, title: fact.title, body: fact.body, tags: JSON.stringify(fact.tags) });\n }\n\n for (const task of validTasks) {\n const id = generateId('task_');\n await this.db.runAsync(`\n INSERT INTO ${this.prefix}tasks (id, entity_id, description, status, priority, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `, [id, entityId, task.description, 'pending', task.priority, now, now]);\n }\n });\n\n for (const fact of insertedFacts) {\n await this.embedFact(fact);\n }\n await this.rebuildMiniSearchIndex(entityId);\n }\n\n private async _doRunHeal(entityId: string): Promise<void> {\n const now = Date.now();\n const orphanAfterDays = this.options.config?.orphanAfterDays !== undefined ? this.options.config.orphanAfterDays : 30;\n const staleInferredAfterDays = this.options.config?.staleInferredAfterDays !== undefined ? this.options.config.staleInferredAfterDays : 60;\n const MS_PER_DAY = 24 * 60 * 60 * 1000;\n\n if (orphanAfterDays !== null && (typeof orphanAfterDays !== 'number' || !Number.isFinite(orphanAfterDays) || orphanAfterDays < 0)) {\n throw new Error('Invalid orphanAfterDays: must be a finite number >= 0 or null');\n }\n if (staleInferredAfterDays !== null && (typeof staleInferredAfterDays !== 'number' || !Number.isFinite(staleInferredAfterDays) || staleInferredAfterDays < 0)) {\n throw new Error('Invalid staleInferredAfterDays: must be a finite number >= 0 or null');\n }\n\n await this.db.withTransactionAsync(async () => {\n if (orphanAfterDays !== null) {\n const orphanThreshold = now - (orphanAfterDays * MS_PER_DAY);\n await this.db.runAsync(`\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 != 'user_document' AND deleted_at IS NULL\n `, [now, now, entityId, orphanThreshold]);\n }\n\n if (staleInferredAfterDays !== null) {\n const staleThreshold = now - (staleInferredAfterDays * MS_PER_DAY);\n await this.db.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 != 'user_document' AND deleted_at IS NULL\n `, [now, entityId, staleThreshold, staleThreshold]);\n }\n });\n\n const allFactsRows = await this.db.getAllAsync<WikiFact>(`SELECT * FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL`, [entityId]);\n const allTasks = await this.db.getAllAsync<WikiTask>(`SELECT * FROM ${this.prefix}tasks WHERE entity_id = ? AND status IN ('pending', 'in_progress') AND deleted_at IS NULL`, [entityId]);\n const recentEvents = await this.db.getAllAsync<WikiEvent>(`SELECT * FROM ${this.prefix}events WHERE entity_id = ? ORDER BY created_at DESC LIMIT 20`, [entityId]);\n\n const healCandidates = allFactsRows.filter(f => f.source_type !== 'user_document');\n const documentAnchors = allFactsRows\n .filter(f => f.source_type === 'user_document')\n .map(({ id, title, source_ref }) => ({ id, title, source_ref }));\n\n const userPrompt = `Heal Candidates:\\n${JSON.stringify(healCandidates.map(f => {\n const { embedding: _embedding, ...rest } = f as WikiFact & { embedding?: unknown };\n return { ...rest, tags: typeof rest.tags === 'string' ? JSON.parse(rest.tags) : rest.tags };\n }), null, 2)}\n\\nDocument Anchors (DO NOT MODIFY OR DELETE):\\n${JSON.stringify(documentAnchors, null, 2)}\n\\nAll Tasks:\\n${JSON.stringify(allTasks, null, 2)}\n\\nRecent Events:\\n${JSON.stringify(recentEvents, null, 2)}\n\\nThe following document anchors are provided for contradiction detection only. Do not include them in \\`downgraded\\`, \\`deleted\\`, or \\`newFacts\\`.`;\n \n const responseText = await this.options.llmProvider.generateText({\n systemPrompt: HEAL_SYSTEM_PROMPT,\n userPrompt,\n });\n\n const result = parseJsonResponse<{ downgraded: string[], deleted: string[], newFacts: ExtractedFact[] }>(responseText);\n\n const mutableIds = new Set(healCandidates.map(f => f.id));\n const downgraded = Array.isArray(result.downgraded) ? result.downgraded : [];\n const deleted = Array.isArray(result.deleted) ? result.deleted : [];\n const newFacts = Array.isArray(result.newFacts) ? result.newFacts : [];\n const safeDowngraded = downgraded.filter(id => mutableIds.has(id));\n const safeDeleted = deleted.filter(id => mutableIds.has(id));\n const validNewFacts = newFacts.map(validateFact).filter((f): f is ExtractedFact => f !== null);\n\n const insertedFacts: Array<{ id: string; title: string; body: string; tags: string }> = [];\n\n await this.db.withTransactionAsync(async () => {\n for (const id of safeDowngraded) {\n await this.db.runAsync(`UPDATE ${this.prefix}entries SET confidence = 'tentative', updated_at = ? WHERE id = ? AND entity_id = ?`, [now, id, entityId]);\n }\n for (const id of safeDeleted) {\n await this.db.runAsync(`UPDATE ${this.prefix}entries SET deleted_at = ?, updated_at = ? WHERE id = ? AND entity_id = ?`, [now, now, id, entityId]);\n }\n for (const fact of validNewFacts) {\n const id = generateId('fact_');\n await this.db.runAsync(`\n INSERT INTO ${this.prefix}entries (id, entity_id, title, body, tags, confidence, source_type, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `, [id, entityId, fact.title, fact.body, JSON.stringify(fact.tags), fact.confidence, 'agent_inferred', now, now]);\n insertedFacts.push({ id, title: fact.title, body: fact.body, tags: JSON.stringify(fact.tags) });\n }\n });\n\n for (const fact of insertedFacts) {\n await this.embedFact(fact);\n }\n await this.rebuildMiniSearchIndex(entityId);\n }\n\n async runLibrarian(entityId: string): Promise<void> {\n const jobKey = this._librarianKey(entityId);\n if (this.activeMaintenanceJobs.has(jobKey)) {\n throw new WikiBusyError('librarian', entityId);\n }\n if (this.activeMaintenanceJobs.has(this._pruneKey(entityId))) {\n throw new WikiBusyError('prune', entityId);\n }\n if (this._isReembedActive(entityId)) {\n throw new WikiBusyError('reembed', entityId);\n }\n this.activeMaintenanceJobs.add(jobKey);\n try {\n await this._doRunLibrarian(entityId);\n } finally {\n this.activeMaintenanceJobs.delete(jobKey);\n }\n }\n\n async runHeal(entityId: string): Promise<void> {\n const jobKey = this._healKey(entityId);\n if (this.activeMaintenanceJobs.has(jobKey)) {\n throw new WikiBusyError('heal', entityId);\n }\n if (this.activeMaintenanceJobs.has(this._pruneKey(entityId))) {\n throw new WikiBusyError('prune', entityId);\n }\n if (this._isReembedActive(entityId)) {\n throw new WikiBusyError('reembed', entityId);\n }\n this.activeMaintenanceJobs.add(jobKey);\n try {\n await this._doRunHeal(entityId);\n } finally {\n this.activeMaintenanceJobs.delete(jobKey);\n }\n }\n\n async runReembed(entityId?: string): Promise<{ embedded: number; skipped: number }> {\n const embedFn = this.options.llmProvider.embed;\n if (!embedFn) return { embedded: 0, skipped: 0 };\n\n const reembedKey = entityId ? this._reembedKey(entityId) : this._globalReembedKey();\n if (this.activeMaintenanceJobs.has(reembedKey)) {\n throw new WikiBusyError('reembed', entityId ?? '*');\n }\n if (entityId) {\n // Cross-check: fail if global reembed is in-flight (it covers this entity too)\n if (this.activeMaintenanceJobs.has(this._globalReembedKey())) {\n throw new WikiBusyError('reembed', entityId);\n }\n if (this.activeMaintenanceJobs.has(this._pruneKey(entityId))) {\n throw new WikiBusyError('prune', entityId);\n }\n if (this.activeMaintenanceJobs.has(this._librarianKey(entityId))) {\n throw new WikiBusyError('librarian', entityId);\n }\n if (this.activeMaintenanceJobs.has(this._healKey(entityId))) {\n throw new WikiBusyError('heal', entityId);\n }\n if (this._isIngestActiveFor(entityId)) {\n throw new WikiBusyError('ingest', entityId);\n }\n } else {\n // Cross-check: fail if any per-entity reembed is in-flight (global covers all entities)\n if (this._isAnyMaintenanceActiveWithSuffix(':reembed')) {\n throw new WikiBusyError('reembed', '*');\n }\n if (this._isAnyMaintenanceActiveWithSuffix(':prune')) {\n throw new WikiBusyError('prune', '*');\n }\n if (this._isAnyMaintenanceActiveWithSuffix(':librarian')) {\n throw new WikiBusyError('librarian', '*');\n }\n if (this._isAnyMaintenanceActiveWithSuffix(':heal')) {\n throw new WikiBusyError('heal', '*');\n }\n if (this.activeIngestJobs.size > 0) {\n throw new WikiBusyError('ingest', '*');\n }\n }\n this.activeMaintenanceJobs.add(reembedKey);\n\n try {\n const where = entityId ? `entity_id = ? AND deleted_at IS NULL` : `deleted_at IS NULL`;\n const params = entityId ? [entityId] : [];\n const rows = await this.db.getAllAsync<WikiFact>(\n `SELECT * FROM ${this.prefix}entries WHERE ${where}`,\n params\n );\n\n let embedded = 0;\n let skipped = 0;\n for (const row of rows) {\n const success = await this.embedFact(row);\n if (success) embedded++;\n else skipped++;\n }\n // If any fact was successfully re-embedded, promote the pending dimension to\n // canonical and clear the mismatch flag so read() uses embeddings from here on.\n if (embedded > 0) {\n await this._reconcileEmbeddingDimension();\n }\n return { embedded, skipped };\n } finally {\n this.activeMaintenanceJobs.delete(reembedKey);\n }\n }\n\n getEntityStatus(entityId: string): EntityStatus {\n const ingestPrefix = `${this.prefix}:${entityId}:`;\n let ingesting = false;\n for (const k of this.activeIngestJobs) {\n if (k.startsWith(ingestPrefix)) { ingesting = true; break; }\n }\n\n return {\n ingesting,\n librarian: this.activeMaintenanceJobs.has(this._librarianKey(entityId)),\n heal: this.activeMaintenanceJobs.has(this._healKey(entityId)),\n };\n }\n\n private async _getFullBundle(entityId: string, opts?: { maxEvents?: number }): Promise<MemoryBundle> {\n const maxEvents = opts?.maxEvents;\n const eventsQuery = maxEvents != null\n ? `SELECT * FROM ${this.prefix}events WHERE entity_id = ? ORDER BY created_at DESC LIMIT ?`\n : `SELECT * FROM ${this.prefix}events WHERE entity_id = ? ORDER BY created_at ASC`;\n const eventsParams: (string | number)[] = maxEvents != null ? [entityId, maxEvents] : [entityId];\n\n const [factsRaw, tasks, eventsRaw] = await Promise.all([\n this.db.getAllAsync<WikiFact>(\n `SELECT * FROM ${this.prefix}entries WHERE entity_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC`,\n [entityId]\n ),\n this.db.getAllAsync<WikiTask>(\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 this.db.getAllAsync<WikiEvent>(eventsQuery, eventsParams),\n ]);\n const facts = factsRaw.map(f => {\n const { embedding: _embedding, ...rest } = f as WikiFact & { embedding?: unknown };\n return {\n ...rest,\n tags: typeof rest.tags === 'string' ? JSON.parse(rest.tags) : rest.tags,\n };\n });\n // When limited, results arrive newest-first; reverse to chronological order.\n const events = maxEvents != null ? eventsRaw.slice().reverse() : eventsRaw;\n return { facts, tasks, events };\n }\n\n async exportDump(entityIds?: string[]): Promise<MemoryDump> {\n let ids: string[];\n if (entityIds && entityIds.length > 0) {\n ids = Array.from(new Set(entityIds));\n } else {\n // Collect all distinct entity_ids across entries, tasks, events\n const rows = await this.db.getAllAsync<{ entity_id: string }>(`\n SELECT DISTINCT entity_id FROM (\n SELECT entity_id FROM ${this.prefix}entries WHERE deleted_at IS NULL\n UNION\n SELECT entity_id FROM ${this.prefix}tasks WHERE deleted_at IS NULL\n UNION\n SELECT entity_id FROM ${this.prefix}events\n ) ORDER BY entity_id\n `);\n ids = rows.map(r => r.entity_id);\n }\n\n const entities: Record<string, MemoryBundle> = {};\n const BATCH = 3;\n for (let i = 0; i < ids.length; i += BATCH) {\n const batch = ids.slice(i, i + BATCH);\n const batchResults = await Promise.all(\n batch.map(async (id): Promise<[string, MemoryBundle]> => [id, await this._getFullBundle(id)])\n );\n for (const [id, bundle] of batchResults) {\n entities[id] = bundle;\n }\n }\n\n return { generatedAt: Date.now(), entities };\n }\n\n async importDump(dump: MemoryDump, opts?: { merge?: boolean }): Promise<void> {\n const merge = opts?.merge ?? false;\n\n for (const [entityId, bundle] of Object.entries(dump.entities)) {\n await this.db.withTransactionAsync(async () => {\n if (!merge) {\n const now = Date.now();\n await this.db.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 await this.db.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 await this.db.runAsync(\n `DELETE FROM ${this.prefix}checkpoints WHERE entity_id = ?`,\n [entityId]\n );\n }\n\n const factIds = bundle.facts.map((fact) => fact.id);\n const existingFactsById = new Map<string, { id: string; entity_id: string; updated_at: number }>();\n const factLookupChunkSize = 500;\n for (let i = 0; i < factIds.length; i += factLookupChunkSize) {\n const factIdChunk = factIds.slice(i, i + factLookupChunkSize);\n if (factIdChunk.length === 0) continue;\n const placeholders = factIdChunk.map(() => '?').join(', ');\n const existingFacts = await this.db.getAllAsync<{ id: string; entity_id: string; updated_at: number }>(\n `SELECT id, entity_id, updated_at FROM ${this.prefix}entries WHERE id IN (${placeholders})`,\n factIdChunk\n );\n for (const existingFact of existingFacts) {\n existingFactsById.set(existingFact.id, existingFact);\n }\n }\n\n for (const fact of bundle.facts) {\n const tagsJson = JSON.stringify(Array.isArray(fact.tags) ? fact.tags : []);\n // Normalize once: non-finite (undefined/null/NaN) → 0 so we never persist an\n // invalid value to the DB and ORDER BY updated_at remains meaningful.\n const safeUpdatedAt = Number.isFinite(fact.updated_at) ? fact.updated_at : 0;\n const existing = existingFactsById.get(fact.id);\n if (existing) {\n if (existing.entity_id !== entityId) {\n this._warnCrossEntityCollision('entry', fact.id, existing.entity_id, entityId);\n continue;\n }\n if (merge) {\n // LWW: incoming wins only if its updated_at is strictly newer than local.\n // 0 (epoch) never beats a real timestamp, so invalid incoming rows are skipped.\n if (safeUpdatedAt <= existing.updated_at) continue;\n }\n // replace mode (or merge LWW winner): update the existing row (restores if soft-deleted)\n await this.db.runAsync(\n `UPDATE ${this.prefix}entries SET entity_id = ?, title = ?, body = ?, tags = ?, confidence = ?, source_type = ?, source_hash = ?, source_ref = ?, created_at = ?, updated_at = ?, last_accessed_at = ?, access_count = ?, deleted_at = ? WHERE id = ?`,\n [entityId, fact.title, fact.body, tagsJson, fact.confidence, fact.source_type, fact.source_hash, fact.source_ref, fact.created_at, safeUpdatedAt, fact.last_accessed_at, fact.access_count, fact.deleted_at, fact.id]\n );\n existingFactsById.set(fact.id, { id: fact.id, entity_id: entityId, updated_at: safeUpdatedAt });\n } else {\n await this.db.runAsync(\n `INSERT INTO ${this.prefix}entries (id, entity_id, title, body, tags, confidence, source_type, source_hash, source_ref, created_at, updated_at, last_accessed_at, access_count, deleted_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [fact.id, entityId, fact.title, fact.body, tagsJson, fact.confidence, fact.source_type, fact.source_hash, fact.source_ref, fact.created_at, safeUpdatedAt, fact.last_accessed_at, fact.access_count, fact.deleted_at]\n );\n existingFactsById.set(fact.id, { id: fact.id, entity_id: entityId, updated_at: safeUpdatedAt });\n }\n }\n\n const taskIds = bundle.tasks.map((task) => task.id);\n const existingTasksById = new Map<string, { id: string; entity_id: string; updated_at: number }>();\n const taskLookupChunkSize = 500;\n\n for (let i = 0; i < taskIds.length; i += taskLookupChunkSize) {\n const taskIdChunk = taskIds.slice(i, i + taskLookupChunkSize);\n if (taskIdChunk.length === 0) continue;\n\n const placeholders = taskIdChunk.map(() => '?').join(', ');\n const existingTasks = await this.db.getAllAsync<{ id: string; entity_id: string; updated_at: number }>(\n `SELECT id, entity_id, updated_at FROM ${this.prefix}tasks WHERE id IN (${placeholders})`,\n taskIdChunk\n );\n\n for (const existingTask of existingTasks) {\n existingTasksById.set(existingTask.id, existingTask);\n }\n }\n\n for (const task of bundle.tasks) {\n // Normalize once: non-finite (undefined/null/NaN) → 0 so we never persist an\n // invalid value to the DB and ORDER BY updated_at remains meaningful.\n const safeUpdatedAt = Number.isFinite(task.updated_at) ? task.updated_at : 0;\n const existing = existingTasksById.get(task.id);\n if (existing) {\n if (existing.entity_id !== entityId) {\n this._warnCrossEntityCollision('task', task.id, existing.entity_id, entityId);\n continue;\n }\n if (merge) {\n // LWW: incoming wins only if its updated_at is strictly newer than local.\n // 0 (epoch) never beats a real timestamp, so invalid incoming rows are skipped.\n if (safeUpdatedAt <= existing.updated_at) continue;\n }\n // replace mode (or merge LWW winner): update the existing row (restores if soft-deleted)\n await this.db.runAsync(\n `UPDATE ${this.prefix}tasks SET entity_id = ?, description = ?, status = ?, priority = ?, created_at = ?, updated_at = ?, resolved_at = ?, deleted_at = ? WHERE id = ?`,\n [entityId, task.description, task.status, task.priority, task.created_at, safeUpdatedAt, task.resolved_at, task.deleted_at, task.id]\n );\n existingTasksById.set(task.id, { id: task.id, entity_id: entityId, updated_at: safeUpdatedAt });\n } else {\n await this.db.runAsync(\n `INSERT INTO ${this.prefix}tasks (id, entity_id, description, status, priority, created_at, updated_at, resolved_at, deleted_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [task.id, entityId, task.description, task.status, task.priority, task.created_at, safeUpdatedAt, task.resolved_at, task.deleted_at]\n );\n existingTasksById.set(task.id, { id: task.id, entity_id: entityId, updated_at: safeUpdatedAt });\n }\n }\n\n for (const event of bundle.events) {\n await this.db.runAsync(\n `INSERT OR IGNORE INTO ${this.prefix}events (id, entity_id, event_type, summary, related_entry_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n [event.id, entityId, event.event_type, event.summary, event.related_entry_id ?? null, event.created_at]\n );\n }\n });\n // Embed non-deleted imported facts so they are immediately searchable.\n for (const fact of bundle.facts) {\n if (!fact.deleted_at) {\n await this.embedFact({\n id: fact.id,\n title: fact.title,\n body: fact.body,\n tags: Array.isArray(fact.tags) || typeof fact.tags === 'string' ? fact.tags : [],\n });\n }\n }\n }\n\n await this.rebuildMiniSearchIndex();\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 const now = Date.now();\n let deletedEntries = 0;\n let deletedTasks = 0;\n\n if (params.clearAll) {\n const [entriesRes, tasksRes] = await Promise.all([\n this.db.runAsync(`UPDATE ${this.prefix}entries SET deleted_at = ?, updated_at = ? WHERE entity_id = ? AND deleted_at IS NULL`, [now, now, entityId]),\n this.db.runAsync(`UPDATE ${this.prefix}tasks SET deleted_at = ?, updated_at = ? WHERE entity_id = ? AND deleted_at IS NULL`, [now, now, entityId]),\n ]);\n await this.db.runAsync(`UPDATE ${this.prefix}checkpoints SET memory_checkpoint = 0, heal_checkpoint = 0 WHERE entity_id = ?`, [entityId]);\n deletedEntries = entriesRes.changes;\n deletedTasks = tasksRes.changes;\n } else {\n const hasIdSelectors = params.entryId !== undefined || params.taskId !== undefined;\n const hasSourceSelectors = params.sourceRef !== undefined || params.sourceHash !== undefined;\n if (hasIdSelectors && hasSourceSelectors) {\n throw new Error('forget() params are mutually exclusive: use entryId/taskId together, or sourceRef/sourceHash together, but not both in the same call');\n }\n\n const sourceRef = params.sourceRef !== undefined ? normalizeSourceRef(params.sourceRef) : null;\n if (params.sourceRef !== undefined && !sourceRef) throw new Error('Invalid sourceRef');\n const sourceHash = params.sourceHash !== undefined ? normalizeSourceHash(params.sourceHash) : null;\n if (params.sourceHash !== undefined && !sourceHash) throw new Error('Invalid sourceHash (must be 64-char hex string)');\n\n const entryPromise = params.entryId\n ? this.db.runAsync(`UPDATE ${this.prefix}entries SET deleted_at = ?, updated_at = ? WHERE id = ? AND entity_id = ? AND deleted_at IS NULL`, [now, now, params.entryId, entityId])\n : null;\n\n const taskPromise = params.taskId\n ? this.db.runAsync(`UPDATE ${this.prefix}tasks SET deleted_at = ?, updated_at = ? WHERE id = ? AND entity_id = ? AND deleted_at IS NULL`, [now, now, params.taskId, entityId])\n : null;\n\n let refPromise: Promise<{ changes: number; lastInsertRowId: number }> | null = null;\n if (sourceRef || sourceHash) {\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 refPromise = this.db.runAsync(q, args);\n }\n\n const [entryResult, taskResult, refResult] = await Promise.all([\n entryPromise ?? Promise.resolve(null),\n taskPromise ?? Promise.resolve(null),\n refPromise ?? Promise.resolve(null),\n ]);\n\n if (entryResult) deletedEntries += entryResult.changes;\n if (taskResult) deletedTasks += taskResult.changes;\n if (refResult) deletedEntries += refResult.changes;\n }\n\n await this.rebuildMiniSearchIndex(entityId);\n return { deleted: { entries: deletedEntries, tasks: deletedTasks } };\n }\n\n async ingestDocument(entityId: string, params: { sourceRef: string; sourceHash: string; documentChunk: string; maxChunkLength?: number; chunkOverlap?: number; chunkConcurrency?: number }): Promise<{ truncated: boolean; chunks: number }> {\n const sourceRef = normalizeSourceRef(params.sourceRef);\n if (!sourceRef) throw new Error('Invalid sourceRef');\n const sourceHash = normalizeSourceHash(params.sourceHash);\n if (!sourceHash) throw new Error('Invalid sourceHash (must be 64-char hex string)');\n\n const maxChunkLength = params.maxChunkLength ?? this.options.config?.maxChunkLength ?? 12000;\n const rawOverlap = params.chunkOverlap ?? this.options.config?.chunkOverlap ?? 400;\n const chunkOverlap = Math.min(\n Number.isFinite(rawOverlap) && rawOverlap >= 0 ? Math.floor(rawOverlap) : 400,\n maxChunkLength - 1\n );\n const rawConcurrency = params.chunkConcurrency ?? this.options.config?.chunkConcurrency ?? 1;\n const chunkConcurrency = Number.isFinite(rawConcurrency) && rawConcurrency >= 1\n ? Math.floor(rawConcurrency)\n : 1;\n\n if (typeof params.documentChunk !== 'string') {\n throw new Error(`documentChunk must be a string, received ${typeof params.documentChunk}`);\n }\n\n const jobKey = `${this.prefix}:${entityId}:${sourceRef}`;\n if (this.activeIngestJobs.has(jobKey)) {\n throw new WikiBusyError('ingest', entityId);\n }\n if (this.activeMaintenanceJobs.has(this._pruneKey(entityId))) {\n throw new WikiBusyError('prune', entityId);\n }\n if (this._isReembedActive(entityId)) {\n throw new WikiBusyError('reembed', entityId);\n }\n this.activeIngestJobs.add(jobKey);\n\n try {\n const { chunks, truncated } = chunkText(params.documentChunk, maxChunkLength, chunkOverlap);\n\n if (chunks.length === 0) {\n return { truncated: false, chunks: 0 };\n }\n\n // Bounded-concurrency LLM calls — each chunk is independent\n const chunkResults = await withConcurrency(\n chunks.map((chunk) => async () => {\n const userPrompt = `Document Chunk:\\n${chunk}`;\n const responseText = await this.options.llmProvider.generateText({\n systemPrompt: INGEST_SYSTEM_PROMPT,\n userPrompt,\n });\n const result = parseJsonResponse<{ facts: ExtractedFact[] }>(responseText);\n return (Array.isArray(result.facts) ? result.facts : [])\n .map(validateFact)\n .filter((f): f is ExtractedFact => f !== null);\n }),\n chunkConcurrency\n );\n\n // Flatten in chunk order, then dedup by normalized title (first-wins)\n const seen = new Set<string>();\n const allValidFacts: ExtractedFact[] = [];\n for (const facts of chunkResults) {\n for (const fact of facts) {\n const normalized = fact.title.trim().toLowerCase().replace(/\\s+/g, ' ');\n if (!seen.has(normalized)) {\n seen.add(normalized);\n allValidFacts.push(fact);\n }\n }\n }\n\n const now = Date.now();\n const insertedFacts: Array<{ id: string; title: string; body: string; tags: string }> = [];\n\n await this.db.withTransactionAsync(async () => {\n await this.db.runAsync(\n `UPDATE ${this.prefix}entries SET deleted_at = ?, updated_at = ? WHERE source_ref = ? AND entity_id = ? AND deleted_at IS NULL`,\n [now, now, sourceRef, entityId]\n );\n for (const fact of allValidFacts) {\n const id = generateId('fact_');\n await this.db.runAsync(\n `INSERT INTO ${this.prefix}entries (id, entity_id, title, body, tags, confidence, source_type, source_hash, source_ref, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [id, entityId, fact.title, fact.body, JSON.stringify(fact.tags), fact.confidence, 'user_document', sourceHash, sourceRef, now, now]\n );\n insertedFacts.push({ id, title: fact.title, body: fact.body, tags: JSON.stringify(fact.tags) });\n }\n });\n\n for (const fact of insertedFacts) {\n await this.embedFact(fact);\n }\n await this.rebuildMiniSearchIndex(entityId);\n\n return { truncated, chunks: chunks.length };\n } finally {\n this.activeIngestJobs.delete(jobKey);\n }\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): string {\n const confPart = includeConfidence ? ` (${fact.confidence})` : '';\n const tagPart =\n includeTags && fact.tags.length > 0 ? ` [${fact.tags.join(', ')}]` : '';\n return `- **${fact.title}**${confPart}${tagPart}\\n ${fact.body.replace(/\\n/g, '\\n ')}`;\n}\n\nfunction renderFactPlain(\n fact: WikiFact,\n includeConfidence: boolean,\n includeTags: boolean\n): string {\n const confPart = includeConfidence ? ` (${fact.confidence})` : '';\n const tagPart =\n includeTags && fact.tags.length > 0 ? ` [${fact.tags.join(', ')}]` : '';\n return `${fact.title}${confPart}${tagPart}: ${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 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.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));\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));\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 { MemoryDump, FormattedMemoryDump, MemoryBundle, WikiFact, WikiTask, WikiEvent } from '../types';\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 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\nfunction formatEntityFileName(entityId: string): string {\n const normalized = entityId.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>.md`.\n const MAX_BASE = 200;\n const trimmed = sanitized.length > MAX_BASE ? sanitized.slice(0, MAX_BASE) : sanitized;\n\n const baseName = trimmed && trimmed !== '.' && trimmed !== '..'\n ? trimmed\n : 'entity';\n const needsSuffix = baseName !== entityId || sanitized.length > MAX_BASE;\n const uniqueBaseName = needsSuffix ? `${baseName}-${shortHash(entityId)}` : baseName;\n\n return `${uniqueBaseName}.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 return {\n manifest: JSON.stringify(dump, null, 2),\n files,\n };\n}\n","import { WikiMemory } from './WikiMemory';\nimport type { SQLiteAdapter, WikiOptions } from './types';\n\nexport * from './types';\nexport { WikiMemory } from './WikiMemory';\nexport { formatContext } from './utils/formatContext';\nexport { formatMemoryDump } from './utils/formatMemoryDump';\n\nexport function createWiki(db: SQLiteAdapter, options: WikiOptions): WikiMemory {\n return new WikiMemory(db, options);\n}\n"]}
|