@edihasaj/recall 0.5.8 → 0.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/{chunk-K5FZ47NN.js → chunk-7XCLKPJ3.js} +6 -8
- package/dist/{chunk-K5FZ47NN.js.map → chunk-7XCLKPJ3.js.map} +1 -1
- package/dist/{chunk-A5UIRZU6.js → chunk-A6XEULA4.js} +3 -2
- package/dist/chunk-A6XEULA4.js.map +1 -0
- package/dist/{chunk-F56Y3SHS.js → chunk-E4HJDGCW.js} +7 -9
- package/dist/{chunk-F56Y3SHS.js.map → chunk-E4HJDGCW.js.map} +1 -1
- package/dist/{chunk-IILLSHLM.js → chunk-KAGIAOD7.js} +2583 -84
- package/dist/chunk-KAGIAOD7.js.map +1 -0
- package/dist/{chunk-FHKV6ELT.js → chunk-MJ4GGBTL.js} +11 -13
- package/dist/{chunk-FHKV6ELT.js.map → chunk-MJ4GGBTL.js.map} +1 -1
- package/dist/{chunk-LVQW6WHK.js → chunk-XUM7JEJU.js} +2 -2
- package/dist/{cleanup-TVOX2S2S.js → cleanup-MYSQ44EP.js} +4 -4
- package/dist/cli.js +206 -33
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +60 -49
- package/dist/daemon.js.map +1 -1
- package/dist/dispatcher-SUUX5AX6.js +16 -0
- package/dist/mcp.js +5 -5
- package/dist/{quality-Z7LPMMBC.js → quality-YTQKAEY6.js} +3 -3
- package/dist/{tasks-UOLSPXJQ.js → tasks-GSQUHD4F.js} +6 -3
- package/dist/{usage-CY3V72YN.js → usage-DU4TKVJH.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-A5UIRZU6.js.map +0 -1
- package/dist/chunk-GC5XMBG4.js +0 -551
- package/dist/chunk-GC5XMBG4.js.map +0 -1
- package/dist/chunk-IILLSHLM.js.map +0 -1
- package/dist/chunk-VEPXEHRZ.js +0 -1763
- package/dist/chunk-VEPXEHRZ.js.map +0 -1
- package/dist/dispatcher-UGMU6THT.js +0 -15
- /package/dist/{chunk-LVQW6WHK.js.map → chunk-XUM7JEJU.js.map} +0 -0
- /package/dist/{cleanup-TVOX2S2S.js.map → cleanup-MYSQ44EP.js.map} +0 -0
- /package/dist/{dispatcher-UGMU6THT.js.map → dispatcher-SUUX5AX6.js.map} +0 -0
- /package/dist/{quality-Z7LPMMBC.js.map → quality-YTQKAEY6.js.map} +0 -0
- /package/dist/{tasks-UOLSPXJQ.js.map → tasks-GSQUHD4F.js.map} +0 -0
- /package/dist/{usage-CY3V72YN.js.map → usage-DU4TKVJH.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/db/client.ts","../src/scanner/repo.ts","../src/scanner/signal.ts","../src/history/snippets.ts","../src/history/retrieval.ts","../src/vector/sqlite-vec-history.ts","../src/vector/sqlite-fts-history.ts","../src/models/memory-injections.ts","../src/models/history-injections.ts","../src/compiler/context.ts","../src/adapters/markdown.ts","../src/repo/discovery.ts","../src/artifacts/context.ts","../src/eval/harness.ts","../src/eval/retrieval.ts","../src/feedback/implicit.ts","../src/policy/engine.ts","../src/pruning/pruner.ts","../src/models/activity.ts","../src/session/lifecycle.ts","../src/mcp/fallback.ts"],"sourcesContent":["import Database from \"better-sqlite3\";\nimport { drizzle } from \"drizzle-orm/better-sqlite3\";\nimport { migrate } from \"drizzle-orm/better-sqlite3/migrator\";\nimport * as schema from \"./schema.js\";\nimport { join, dirname } from \"node:path\";\nimport { mkdirSync, existsSync, rmSync, statSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { getEmbeddingCacheRoot } from \"../embeddings/cache.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nexport const RECALL_DB_USER_VERSION = 9;\n\nexport function getDbPath(): string {\n const dataDir =\n process.env.RECALL_DATA_DIR ??\n join(\n process.env.HOME ?? process.env.USERPROFILE ?? \".\",\n \".recall\",\n );\n mkdirSync(dataDir, { recursive: true });\n return join(dataDir, \"recall.db\");\n}\n\nfunction getMigrationsPath(): string {\n // Walk up from __dirname until we find drizzle/meta/_journal.json\n let dir = __dirname;\n for (let i = 0; i < 5; i++) {\n const candidate = join(dir, \"drizzle\");\n if (existsSync(join(candidate, \"meta\", \"_journal.json\"))) {\n return candidate;\n }\n dir = dirname(dir);\n }\n // Fallback: relative to __dirname (works in bundled dist/)\n return join(__dirname, \"..\", \"drizzle\");\n}\n\nlet _sqlite: Database.Database | null = null;\nlet _db: ReturnType<typeof makeDb> | null = null;\nlet _dbPath: string | null = null;\n\nfunction makeDb(sqlite: Database.Database) {\n return drizzle(sqlite, { schema });\n}\n\nconst STARTUP_WAL_TRUNCATE_BYTES = (() => {\n const raw = process.env.RECALL_SQLITE_STARTUP_WAL_TRUNCATE_BYTES;\n const parsed = raw ? parseInt(raw, 10) : 32 * 1024 * 1024;\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;\n})();\n\nfunction applyPragmas(sqlite: Database.Database) {\n sqlite.pragma(\"journal_mode = WAL\");\n sqlite.pragma(\"foreign_keys = ON\");\n truncateWalIfLarge(sqlite);\n}\n\nfunction truncateWalIfLarge(sqlite: Database.Database) {\n if (STARTUP_WAL_TRUNCATE_BYTES <= 0) return;\n try {\n const walPath = `${sqlite.name}-wal`;\n if (!existsSync(walPath)) return;\n if (statSync(walPath).size < STARTUP_WAL_TRUNCATE_BYTES) return;\n sqlite.pragma(\"wal_checkpoint(TRUNCATE)\");\n } catch {\n // best-effort: never block db open\n }\n}\n\nfunction setDbUserVersion(sqlite: Database.Database, version = RECALL_DB_USER_VERSION) {\n sqlite.pragma(`user_version = ${version}`);\n}\n\nexport type RecallDb = ReturnType<typeof makeDb>;\n\nexport function getDb(dbPath?: string): RecallDb {\n if (!_db) {\n const path = dbPath ?? getDbPath();\n _sqlite = new Database(path);\n applyPragmas(_sqlite);\n _db = makeDb(_sqlite);\n _dbPath = path;\n }\n return _db;\n}\n\n/** Create a standalone DB instance (useful for tests). */\nexport function createStandaloneDb(dbPath: string): { db: RecallDb; sqlite: Database.Database } {\n const sqlite = new Database(dbPath);\n applyPragmas(sqlite);\n const db = makeDb(sqlite);\n return { db, sqlite };\n}\n\nexport function initDb(dbPath?: string): RecallDb {\n const db = getDb(dbPath);\n migrate(db, { migrationsFolder: getMigrationsPath() });\n setDbUserVersion(db.$client);\n return db;\n}\n\n/** Init a standalone DB (for tests — no module-level singleton). */\nexport function initStandaloneDb(dbPath: string): RecallDb {\n const { db, sqlite } = createStandaloneDb(dbPath);\n migrate(db, { migrationsFolder: getMigrationsPath() });\n setDbUserVersion(sqlite);\n return db;\n}\n\nexport function closeDb() {\n if (_sqlite) {\n _sqlite.close();\n }\n _sqlite = null;\n _db = null;\n _dbPath = null;\n}\n\nexport function getDbUserVersion(dbPath?: string): number {\n const path = dbPath ?? getDbPath();\n if (!existsSync(path)) return 0;\n\n const sqlite = new Database(path, { readonly: true, fileMustExist: true });\n try {\n return Number(sqlite.pragma(\"user_version\", { simple: true }) ?? 0);\n } finally {\n sqlite.close();\n }\n}\n\nexport function resetDb(\n dbPath?: string,\n options: { purgeModels?: boolean } = {},\n) {\n const path = dbPath ?? getDbPath();\n\n if (_dbPath === path) {\n closeDb();\n }\n\n for (const suffix of [\"\", \"-shm\", \"-wal\"]) {\n const candidate = `${path}${suffix}`;\n if (existsSync(candidate)) {\n rmSync(candidate, { force: true });\n }\n }\n\n if (options.purgeModels) {\n rmSync(getEmbeddingCacheRoot(), { recursive: true, force: true });\n }\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport { join, basename } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport { eq } from \"drizzle-orm\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { memories } from \"../db/schema.js\";\nimport { queueMemoryEmbeddingSync } from \"../embeddings/embeddings.js\";\nimport { createMemory, queryMemories, statusFromConfidence, type CreateMemoryInput } from \"../models/memory.js\";\nimport { getRepoQualityProfile, seedScannedConfidence } from \"../repo/quality.js\";\nimport { evaluateScannedMemory } from \"./signal.js\";\n\ninterface ScanResult {\n candidates: CreateMemoryInput[];\n repo: string;\n}\n\nexport function scanRepo(repoPath: string): ScanResult {\n const repoName = inferRepoName(repoPath);\n const candidates: CreateMemoryInput[] = [];\n\n // Package.json scripts\n candidates.push(...scanPackageJson(repoPath, repoName));\n\n // Makefile targets\n candidates.push(...scanMakefile(repoPath, repoName));\n\n // CI config\n candidates.push(...scanCIConfig(repoPath, repoName));\n\n // Existing instruction files\n candidates.push(...scanInstructionFiles(repoPath, repoName));\n\n // Linter/formatter configs\n candidates.push(...scanLinterConfigs(repoPath, repoName));\n\n // README setup sections\n candidates.push(...scanReadme(repoPath, repoName));\n\n // Python project\n candidates.push(...scanPythonProject(repoPath, repoName));\n\n return { candidates, repo: repoName };\n}\n\nexport function scanAndStore(db: RecallDb, repoPath: string): string[] {\n const { candidates, repo } = scanRepo(repoPath);\n const profile = getRepoQualityProfile(db, repo);\n const existing = queryMemories(db, { repo })\n .filter((mem) => mem.status !== \"rejected\");\n const ids: string[] = [];\n\n for (const candidate of candidates) {\n const evaluated = evaluateScannedMemory({\n text: candidate.text,\n type: candidate.type,\n source: candidate.source,\n confidence: seedScannedConfidence(\n candidate.confidence ?? 0.5,\n profile,\n ),\n });\n if (evaluated.action === \"reject\") {\n continue;\n }\n\n const seededConfidence = evaluated.confidence;\n const normalizedCandidate = {\n ...candidate,\n text: evaluated.text,\n };\n const duplicate = existing.find((mem) =>\n mem.type === normalizedCandidate.type &&\n mem.source === normalizedCandidate.source &&\n mem.text === normalizedCandidate.text\n );\n if (duplicate) {\n if (duplicate.confidence < seededConfidence) {\n db.update(memories)\n .set({\n confidence: seededConfidence,\n status: statusFromConfidence(seededConfidence),\n text: normalizedCandidate.text,\n updated_at: new Date().toISOString(),\n })\n .where(eq(memories.id, duplicate.id))\n .run();\n queueMemoryEmbeddingSync(db, duplicate.id);\n }\n ids.push(duplicate.id);\n continue;\n }\n\n normalizedCandidate.confidence = seededConfidence;\n const id = createMemory(db, normalizedCandidate);\n ids.push(id);\n existing.push({\n ...queryMemories(db, { repo }).find((mem) => mem.id === id)!,\n confidence: seededConfidence,\n status: statusFromConfidence(seededConfidence),\n });\n }\n\n return ids;\n}\n\n// --- Scanners ---\n\nfunction scanPackageJson(\n repoPath: string,\n repo: string,\n): CreateMemoryInput[] {\n const pkgPath = join(repoPath, \"package.json\");\n if (!existsSync(pkgPath)) return [];\n\n const results: CreateMemoryInput[] = [];\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n\n // Package manager detection\n if (pkg.packageManager) {\n const pm = pkg.packageManager.split(\"@\")[0];\n results.push(makeCommand(\n `Use ${pm} as the package manager (lockfile: ${pm === \"pnpm\" ? \"pnpm-lock.yaml\" : pm === \"yarn\" ? \"yarn.lock\" : \"package-lock.json\"})`,\n repo,\n \"package.json\",\n ));\n } else if (existsSync(join(repoPath, \"pnpm-lock.yaml\"))) {\n results.push(makeCommand(\"Use pnpm as the package manager\", repo, \"package.json\"));\n } else if (existsSync(join(repoPath, \"yarn.lock\"))) {\n results.push(makeCommand(\"Use yarn as the package manager\", repo, \"package.json\"));\n } else if (existsSync(join(repoPath, \"bun.lockb\")) || existsSync(join(repoPath, \"bun.lock\"))) {\n results.push(makeCommand(\"Use bun as the package manager\", repo, \"package.json\"));\n }\n\n // Key scripts\n const scripts = pkg.scripts ?? {};\n const importantScripts = [\"test\", \"build\", \"lint\", \"dev\", \"start\", \"typecheck\", \"check\"];\n for (const name of importantScripts) {\n if (scripts[name]) {\n results.push({\n type: \"command\",\n text: `${name}: \\`${scripts[name]}\\``,\n scope: \"repo\",\n repo,\n source: \"config_parse\",\n confidence: 0.65,\n evidence: [\n { type: \"repo_scan\", file: \"package.json\", timestamp: now() },\n ],\n });\n }\n }\n\n // Framework detection\n const allDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n if (allDeps.next) results.push(makeGotcha(\"Next.js project\", repo, \"package.json\"));\n if (allDeps.react && !allDeps.next) results.push(makeGotcha(\"React project (no Next.js)\", repo, \"package.json\"));\n if (allDeps.vue) results.push(makeGotcha(\"Vue.js project\", repo, \"package.json\"));\n if (allDeps.svelte) results.push(makeGotcha(\"Svelte project\", repo, \"package.json\"));\n if (allDeps.express || allDeps.fastify || allDeps.hono)\n results.push(makeGotcha(`Server framework: ${allDeps.express ? \"Express\" : allDeps.fastify ? \"Fastify\" : \"Hono\"}`, repo, \"package.json\"));\n\n } catch {\n // bad JSON, skip\n }\n\n return results;\n}\n\nfunction scanMakefile(\n repoPath: string,\n repo: string,\n): CreateMemoryInput[] {\n const mkPath = join(repoPath, \"Makefile\");\n if (!existsSync(mkPath)) return [];\n\n const results: CreateMemoryInput[] = [];\n try {\n const content = readFileSync(mkPath, \"utf-8\");\n const targets = content.match(/^([a-zA-Z_-]+):/gm);\n if (targets) {\n const key = targets\n .map((t) => t.replace(\":\", \"\"))\n .filter((t) =>\n [\"test\", \"build\", \"lint\", \"dev\", \"run\", \"deploy\", \"install\", \"setup\", \"clean\"].includes(t),\n );\n if (key.length > 0) {\n results.push({\n type: \"command\",\n text: `Makefile targets: ${key.map((t) => `\\`make ${t}\\``).join(\", \")}`,\n scope: \"repo\",\n repo,\n source: \"config_parse\",\n confidence: 0.65,\n evidence: [{ type: \"repo_scan\", file: \"Makefile\", timestamp: now() }],\n });\n }\n }\n } catch {}\n\n return results;\n}\n\nfunction scanCIConfig(\n repoPath: string,\n repo: string,\n): CreateMemoryInput[] {\n const results: CreateMemoryInput[] = [];\n\n // GitHub Actions\n const ghDir = join(repoPath, \".github\", \"workflows\");\n if (existsSync(ghDir)) {\n results.push({\n type: \"gotcha\",\n text: \"CI: GitHub Actions (check .github/workflows/ for pipeline config)\",\n scope: \"repo\",\n repo,\n source: \"repo_scan\",\n confidence: 0.6,\n evidence: [{ type: \"repo_scan\", file: \".github/workflows/\", timestamp: now() }],\n });\n }\n\n // GitLab CI\n if (existsSync(join(repoPath, \".gitlab-ci.yml\"))) {\n results.push(makeGotcha(\"CI: GitLab CI\", repo, \".gitlab-ci.yml\"));\n }\n\n return results;\n}\n\nfunction scanInstructionFiles(\n repoPath: string,\n repo: string,\n): CreateMemoryInput[] {\n const results: CreateMemoryInput[] = [];\n const instructionFiles = [\n \"CLAUDE.md\",\n \"AGENTS.md\",\n \".github/copilot-instructions.md\",\n \".cursorrules\",\n ];\n\n for (const file of instructionFiles) {\n const fPath = join(repoPath, file);\n if (!existsSync(fPath)) continue;\n\n try {\n const content = readFileSync(fPath, \"utf-8\");\n // Extract key rules (lines with \"always\", \"never\", \"must\", \"don't\")\n const rules = content\n .split(\"\\n\")\n .filter((line) =>\n /\\b(always|never|must|don't|do not|required|forbidden)\\b/i.test(line),\n )\n .map((l) => l.replace(/^[-*#>\\s]+/, \"\").trim())\n .filter((l) => l.length > 10 && l.length < 200);\n\n for (const rule of rules.slice(0, 5)) {\n results.push({\n type: \"rule\",\n text: rule,\n scope: \"repo\",\n repo,\n source: \"repo_scan\",\n confidence: 0.7, // high — explicit instruction files\n evidence: [{ type: \"repo_scan\", file, timestamp: now() }],\n });\n }\n } catch {}\n }\n\n return results;\n}\n\nfunction scanLinterConfigs(\n repoPath: string,\n repo: string,\n): CreateMemoryInput[] {\n const results: CreateMemoryInput[] = [];\n\n const configs: [string, string][] = [\n [\".eslintrc.json\", \"ESLint\"],\n [\".eslintrc.js\", \"ESLint\"],\n [\".eslintrc.cjs\", \"ESLint\"],\n [\"eslint.config.js\", \"ESLint (flat config)\"],\n [\"eslint.config.mjs\", \"ESLint (flat config)\"],\n [\".prettierrc\", \"Prettier\"],\n [\"prettier.config.js\", \"Prettier\"],\n [\"biome.json\", \"Biome\"],\n [\"biome.jsonc\", \"Biome\"],\n [\".rustfmt.toml\", \"rustfmt\"],\n [\"ruff.toml\", \"Ruff\"],\n [\"pyproject.toml\", \"Python project (pyproject.toml)\"],\n ];\n\n const found: string[] = [];\n for (const [file, name] of configs) {\n if (existsSync(join(repoPath, file))) {\n found.push(name);\n }\n }\n\n if (found.length > 0) {\n results.push({\n type: \"rule\",\n text: `Linting/formatting: ${[...new Set(found)].join(\", \")}`,\n scope: \"repo\",\n repo,\n source: \"config_parse\",\n confidence: 0.65,\n evidence: [{ type: \"repo_scan\", file: \"config files\", timestamp: now() }],\n });\n }\n\n return results;\n}\n\nfunction scanReadme(\n repoPath: string,\n repo: string,\n): CreateMemoryInput[] {\n const results: CreateMemoryInput[] = [];\n const readmePath = join(repoPath, \"README.md\");\n if (!existsSync(readmePath)) return [];\n\n try {\n const content = readFileSync(readmePath, \"utf-8\");\n\n // Look for setup/install/getting-started sections\n const setupMatch = content.match(\n /^##\\s*(setup|install|getting.started|quick.start|development)\\s*\\n([\\s\\S]*?)(?=^##\\s|\\z)/im,\n );\n\n if (setupMatch) {\n // Extract code blocks from setup section\n const codeBlocks = setupMatch[2].match(/```(?:sh|bash|shell|zsh)?\\n([\\s\\S]*?)```/g);\n if (codeBlocks && codeBlocks.length > 0) {\n const commands = codeBlocks\n .map((b) => b.replace(/```(?:sh|bash|shell|zsh)?\\n?/, \"\").replace(/```$/, \"\").trim())\n .join(\"\\n\");\n\n if (commands.length < 500) {\n results.push({\n type: \"command\",\n text: `Setup commands from README:\\n${commands}`,\n scope: \"repo\",\n repo,\n source: \"repo_scan\",\n confidence: 0.5,\n evidence: [{ type: \"repo_scan\", file: \"README.md\", timestamp: now() }],\n });\n }\n }\n }\n } catch {}\n\n return results;\n}\n\nfunction scanPythonProject(\n repoPath: string,\n repo: string,\n): CreateMemoryInput[] {\n const results: CreateMemoryInput[] = [];\n\n if (existsSync(join(repoPath, \"pyproject.toml\"))) {\n // Check for uv\n if (existsSync(join(repoPath, \"uv.lock\"))) {\n results.push(makeCommand(\"Use `uv` for Python dependency management\", repo, \"uv.lock\"));\n } else if (existsSync(join(repoPath, \"poetry.lock\"))) {\n results.push(makeCommand(\"Use `poetry` for Python dependency management\", repo, \"poetry.lock\"));\n }\n\n // Check for alembic\n if (existsSync(join(repoPath, \"alembic.ini\")) || existsSync(join(repoPath, \"alembic\"))) {\n results.push(makeGotcha(\"Uses Alembic for database migrations\", repo, \"alembic.ini\"));\n }\n }\n\n return results;\n}\n\n// --- Helpers ---\n\nfunction now(): string {\n return new Date().toISOString();\n}\n\nfunction inferRepoName(repoPath: string): string {\n try {\n const remote = execSync(\"git remote get-url origin\", {\n cwd: repoPath,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n const repo = extractRepoSlugFromRemote(remote);\n if (repo) return repo;\n } catch {}\n return basename(repoPath);\n}\n\nfunction extractRepoSlugFromRemote(remote: string): string | null {\n const trimmed = remote.trim().replace(/\\.git$/, \"\");\n const parts = trimmed.split(/[:/]/).filter(Boolean);\n if (parts.length < 2) return null;\n return `${parts.at(-2)}/${parts.at(-1)}`;\n}\n\nfunction makeCommand(text: string, repo: string, file: string): CreateMemoryInput {\n return {\n type: \"command\",\n text,\n scope: \"repo\",\n repo,\n source: \"config_parse\",\n confidence: 0.65,\n evidence: [{ type: \"repo_scan\", file, timestamp: now() }],\n };\n}\n\nfunction makeGotcha(text: string, repo: string, file: string): CreateMemoryInput {\n return {\n type: \"gotcha\",\n text,\n scope: \"repo\",\n repo,\n source: \"repo_scan\",\n confidence: 0.6,\n evidence: [{ type: \"repo_scan\", file, timestamp: now() }],\n };\n}\n","import { CONFIDENCE, type MemorySource, type MemoryType } from \"../types.js\";\n\nexport interface ScannedMemoryLike {\n text: string;\n type: MemoryType;\n source: MemorySource;\n confidence: number;\n}\n\nexport interface EvaluatedScannedMemory {\n action: \"keep\" | \"reject\";\n text: string;\n confidence: number;\n reason?: string;\n}\n\nconst ACTIVE_COMMAND_PATTERNS = [\n /^use\\b/i,\n /^(test|build|lint|dev|start|typecheck|check):\\s*`.+`$/i,\n /^makefile targets:/i,\n];\n\nconst CANDIDATE_GOTCHA_PATTERNS = [\n /^next\\.js project$/i,\n /^react project\\b/i,\n /^vue\\.js project$/i,\n /^svelte project$/i,\n /^server framework:/i,\n /^uses alembic\\b/i,\n];\n\nconst ACTIONABLE_RULE_PATTERN = /\\b(always|never|must|don't|do not|required|prefer|avoid|use|keep|run|update|add|remove|check|only)\\b/i;\n\nexport function evaluateScannedMemory(\n input: ScannedMemoryLike,\n): EvaluatedScannedMemory {\n const normalized = normalizeScannedText(input.text);\n const lower = normalized.toLowerCase();\n\n if (!normalized || normalized.length < 12) {\n return reject(normalized, \"too_short\");\n }\n\n if (lower.startsWith(\"setup commands from readme:\")) {\n return reject(normalized, \"readme_setup_noise\");\n }\n\n if (lower === \"what we do not build\") {\n return reject(normalized, \"section_heading\");\n }\n\n if (/^ci:\\s*(github actions|gitlab ci)\\b/i.test(normalized)) {\n return reject(normalized, \"generic_ci\");\n }\n\n if (/^req-[a-z0-9-]+:/i.test(lower)) {\n return reject(normalized, \"spec_requirement\");\n }\n\n if (/^[A-Z][A-Za-z0-9 /_-]{1,80}:$/.test(normalized)) {\n return reject(normalized, \"heading\");\n }\n\n if (input.source === \"config_parse\" && lower.startsWith(\"linting/formatting: python project\")) {\n return reject(normalized, \"generic_tooling\");\n }\n\n if (input.source === \"config_parse\" && lower.startsWith(\"linting/formatting:\")) {\n return keep(normalized, toCandidateConfidence(input.confidence));\n }\n\n if (ACTIVE_COMMAND_PATTERNS.some((pattern) => pattern.test(normalized))) {\n return keep(normalized, Math.max(input.confidence, 0.62));\n }\n\n if (input.type === \"command\") {\n return keep(normalized, toCandidateConfidence(input.confidence));\n }\n\n if (input.type === \"gotcha\") {\n if (CANDIDATE_GOTCHA_PATTERNS.some((pattern) => pattern.test(normalized))) {\n return keep(normalized, toCandidateConfidence(input.confidence));\n }\n return reject(normalized, \"generic_gotcha\");\n }\n\n if (input.type === \"rule\") {\n if (!ACTIONABLE_RULE_PATTERN.test(normalized)) {\n return reject(normalized, \"non_actionable_rule\");\n }\n return keep(normalized, toCandidateConfidence(input.confidence));\n }\n\n return keep(normalized, toCandidateConfidence(input.confidence));\n}\n\nfunction normalizeScannedText(text: string): string {\n return text\n .replace(/\\*\\*/g, \"\")\n .split(\"\\n\")\n .map((line) => line.replace(/^[-*#>\\s]+/, \"\").replace(/^\\d+\\.\\s+/, \"\").trim())\n .filter(Boolean)\n .join(\"\\n\")\n .replace(/[ \\t]+/g, \" \")\n .trim();\n}\n\nfunction toCandidateConfidence(confidence: number): number {\n return clamp(confidence, CONFIDENCE.TRANSIENT_MAX + 0.05, CONFIDENCE.ACTIVE_MIN - 0.01);\n}\n\nfunction keep(text: string, confidence: number): EvaluatedScannedMemory {\n return { action: \"keep\", text, confidence: clamp(confidence) };\n}\n\nfunction reject(text: string, reason: string): EvaluatedScannedMemory {\n return { action: \"reject\", text, confidence: 0, reason };\n}\n\nfunction clamp(n: number, min = 0, max = 1): number {\n return Math.max(min, Math.min(max, n));\n}\n","import { desc, eq, and } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { historySnippets } from \"../db/schema.js\";\nimport { historySnippetDedupeKey } from \"../models/dedupe.js\";\nimport type { HistorySnippet, HistorySnippetKind } from \"../types.js\";\n\ntype HistorySnippetRow = typeof historySnippets.$inferSelect;\n\nexport interface CreateHistorySnippetInput {\n repo?: string | null;\n session_id?: string | null;\n kind: HistorySnippetKind;\n text: string;\n source_activity_ids?: string[];\n}\n\nexport function createHistorySnippet(\n db: RecallDb,\n input: CreateHistorySnippetInput,\n): string {\n const dedupeKey = historySnippetDedupeKey(input);\n const existing = db.select().from(historySnippets)\n .where(eq(historySnippets.dedupe_key, dedupeKey))\n .get();\n if (existing) return existing.id;\n\n const id = randomUUID();\n const now = new Date().toISOString();\n db.insert(historySnippets)\n .values({\n id,\n repo: input.repo ?? null,\n session_id: input.session_id ?? null,\n kind: input.kind,\n text: input.text,\n dedupe_key: dedupeKey,\n source_activity_ids: input.source_activity_ids ?? [],\n created_at: now,\n updated_at: now,\n })\n .run();\n return id;\n}\n\nexport function getHistorySnippet(\n db: RecallDb,\n id: string,\n): HistorySnippet | undefined {\n const row = db.select().from(historySnippets).where(eq(historySnippets.id, id)).get();\n return row ? rowToHistorySnippet(row) : undefined;\n}\n\nexport function listHistorySnippets(\n db: RecallDb,\n query: {\n repo?: string;\n session_id?: string;\n kind?: HistorySnippetKind;\n limit?: number;\n } = {},\n): HistorySnippet[] {\n const conditions = [];\n if (query.repo) conditions.push(eq(historySnippets.repo, query.repo));\n if (query.session_id) conditions.push(eq(historySnippets.session_id, query.session_id));\n if (query.kind) conditions.push(eq(historySnippets.kind, query.kind));\n\n let stmt = db.select().from(historySnippets).$dynamic();\n if (conditions.length > 0) {\n stmt = stmt.where(and(...conditions));\n }\n stmt = stmt.orderBy(desc(historySnippets.updated_at));\n if (query.limit != null) {\n stmt = stmt.limit(query.limit);\n }\n\n return stmt.all().map(rowToHistorySnippet);\n}\n\nexport function findHistorySnippetBySession(\n db: RecallDb,\n sessionId: string,\n kind: HistorySnippetKind = \"session_summary\",\n): HistorySnippet | undefined {\n const row = db.select().from(historySnippets)\n .where(and(\n eq(historySnippets.session_id, sessionId),\n eq(historySnippets.kind, kind),\n ))\n .get();\n return row ? rowToHistorySnippet(row) : undefined;\n}\n\nexport function findHistorySnippetByRepoKind(\n db: RecallDb,\n repo: string,\n kind: HistorySnippetKind,\n): HistorySnippet | undefined {\n const row = db.select().from(historySnippets)\n .where(and(\n eq(historySnippets.repo, repo),\n eq(historySnippets.kind, kind),\n ))\n .get();\n return row ? rowToHistorySnippet(row) : undefined;\n}\n\nexport function updateHistorySnippet(\n db: RecallDb,\n id: string,\n updates: Partial<Pick<HistorySnippet, \"text\">> & {\n source_activity_ids?: string[];\n },\n) {\n const current = getHistorySnippet(db, id);\n if (!current) return;\n const nextText = updates.text ?? current.text;\n const dedupeKey = historySnippetDedupeKey({\n repo: current.repo,\n session_id: current.session_id,\n kind: current.kind,\n text: nextText,\n });\n const collision = db.select().from(historySnippets)\n .where(eq(historySnippets.dedupe_key, dedupeKey))\n .get();\n if (collision && collision.id !== id) return;\n\n db.update(historySnippets)\n .set({\n ...(updates.text != null ? { text: updates.text } : {}),\n dedupe_key: dedupeKey,\n ...(updates.source_activity_ids ? { source_activity_ids: updates.source_activity_ids as any } : {}),\n updated_at: new Date().toISOString(),\n })\n .where(eq(historySnippets.id, id))\n .run();\n}\n\nfunction rowToHistorySnippet(row: HistorySnippetRow): HistorySnippet {\n const sourceActivityIds =\n typeof row.source_activity_ids === \"string\"\n ? JSON.parse(row.source_activity_ids)\n : Array.isArray(row.source_activity_ids)\n ? row.source_activity_ids\n : [];\n\n return {\n id: row.id,\n repo: row.repo,\n session_id: row.session_id,\n kind: row.kind,\n text: row.text,\n source_activity_ids: sourceActivityIds,\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n}\n","import { createHash } from \"node:crypto\";\nimport { eq } from \"drizzle-orm\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { historySnippetEmbeddings, historySnippets } from \"../db/schema.js\";\nimport type { EmbeddingConfig, HistorySnippet } from \"../types.js\";\nimport { generateEmbedding, generateEmbeddings, loadEmbeddingConfigFromEnv, projectEmbeddingToIndex } from \"../embeddings/embeddings.js\";\nimport { resolveProvider } from \"../embeddings/providers/index.js\";\nimport {\n rebuildHistoryVecIndex,\n removeHistoryVecRow,\n searchHistoryVecIndex,\n upsertHistoryVecRow,\n verifyHistoryVecIndex,\n} from \"../vector/sqlite-vec-history.js\";\nimport {\n rebuildHistoryFtsIndex,\n searchHistoryFtsIndex,\n syncHistoryFtsIndex,\n verifyHistoryFtsIndex,\n} from \"../vector/sqlite-fts-history.js\";\n\ntype HistorySnippetRow = typeof historySnippets.$inferSelect;\ntype HistorySnippetEmbeddingRow = typeof historySnippetEmbeddings.$inferSelect;\n\nfunction hashText(text: string) {\n return createHash(\"sha256\").update(text).digest(\"hex\");\n}\n\nfunction version(config: EmbeddingConfig) {\n return config.version || `${config.provider}:${config.model}:${config.dimensions}`;\n}\n\nfunction rowNeedsRefresh(\n row: Pick<HistorySnippetRow, \"text\">,\n existing: HistorySnippetEmbeddingRow | undefined,\n config: EmbeddingConfig,\n) {\n const metadata = resolveProvider(config).metadata();\n if (!existing) return true;\n return (\n existing.model !== config.model ||\n existing.embedding_dimensions !== metadata.canonical_dimensions ||\n existing.index_dimensions !== metadata.index_dimensions ||\n existing.version !== version(config) ||\n existing.content_hash !== hashText(row.text)\n );\n}\n\nfunction deserializeEmbedding(buffer: Buffer): Float32Array {\n return new Float32Array(\n buffer.buffer,\n buffer.byteOffset,\n buffer.byteLength / Float32Array.BYTES_PER_ELEMENT,\n );\n}\n\nfunction rowToHistorySnippet(row: HistorySnippetRow): HistorySnippet {\n const sourceActivityIds =\n typeof row.source_activity_ids === \"string\"\n ? JSON.parse(row.source_activity_ids)\n : Array.isArray(row.source_activity_ids)\n ? row.source_activity_ids\n : [];\n return {\n id: row.id,\n repo: row.repo,\n session_id: row.session_id,\n kind: row.kind,\n text: row.text,\n source_activity_ids: sourceActivityIds,\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n}\n\nexport function storeHistoryEmbedding(\n db: RecallDb,\n snippetId: string,\n text: string,\n embedding: Float32Array,\n config: EmbeddingConfig,\n) {\n const now = new Date().toISOString();\n const metadata = resolveProvider(config).metadata();\n const payload = {\n snippet_id: snippetId,\n model: config.model,\n embedding_dimensions: metadata.canonical_dimensions,\n index_dimensions: metadata.index_dimensions,\n version: version(config),\n content_hash: hashText(text),\n updated_at: now,\n embedding: Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength),\n };\n\n db.insert(historySnippetEmbeddings)\n .values(payload)\n .onConflictDoUpdate({\n target: historySnippetEmbeddings.snippet_id,\n set: {\n model: payload.model,\n embedding_dimensions: payload.embedding_dimensions,\n index_dimensions: payload.index_dimensions,\n version: payload.version,\n content_hash: payload.content_hash,\n updated_at: payload.updated_at,\n embedding: payload.embedding,\n },\n })\n .run();\n}\n\nexport function loadHistoryEmbedding(\n db: RecallDb,\n snippetId: string,\n): Float32Array | null {\n const row = db.select({ embedding: historySnippetEmbeddings.embedding })\n .from(historySnippetEmbeddings)\n .where(eq(historySnippetEmbeddings.snippet_id, snippetId))\n .get();\n return row?.embedding ? deserializeEmbedding(row.embedding as Buffer) : null;\n}\n\nexport function removeStoredHistoryEmbedding(\n db: RecallDb,\n snippetId: string,\n) {\n return db.delete(historySnippetEmbeddings)\n .where(eq(historySnippetEmbeddings.snippet_id, snippetId))\n .run().changes > 0;\n}\n\nexport async function syncHistorySnippetEmbedding(\n db: RecallDb,\n snippetId: string,\n config: EmbeddingConfig,\n): Promise<\"stored\" | \"updated\" | \"removed\" | \"skipped\"> {\n const snippet = db.select().from(historySnippets)\n .where(eq(historySnippets.id, snippetId))\n .get();\n\n syncHistoryFtsIndex(db, snippetId);\n if (!snippet) {\n removeStoredHistoryEmbedding(db, snippetId);\n removeHistoryVecRow(db, snippetId);\n return \"removed\";\n }\n\n const existing = db.select().from(historySnippetEmbeddings)\n .where(eq(historySnippetEmbeddings.snippet_id, snippetId))\n .get();\n\n if (!rowNeedsRefresh(snippet, existing, config)) {\n if (existing) upsertHistoryVecRow(db, snippet, existing);\n return \"skipped\";\n }\n\n const embedding = await generateEmbedding(snippet.text, config, \"document\");\n storeHistoryEmbedding(db, snippet.id, snippet.text, embedding, config);\n const refreshed = db.select().from(historySnippetEmbeddings)\n .where(eq(historySnippetEmbeddings.snippet_id, snippet.id))\n .get();\n if (!refreshed) throw new Error(`Failed to reload history embedding row for ${snippet.id}`);\n upsertHistoryVecRow(db, snippet, refreshed);\n return existing ? \"updated\" : \"stored\";\n}\n\nexport async function bootstrapHistoryEmbeddings(\n db: RecallDb,\n config: EmbeddingConfig,\n options: { repo?: string } = {},\n) {\n const rows = db.select().from(historySnippets).all()\n .filter((row) => !options.repo || row.repo === options.repo);\n const existing = new Map(\n db.select().from(historySnippetEmbeddings).all().map((row) => [row.snippet_id, row]),\n );\n\n const pending = rows.filter((row) => rowNeedsRefresh(row, existing.get(row.id), config));\n\n for (const row of rows) {\n syncHistoryFtsIndex(db, row.id);\n }\n\n const BATCH_SIZE = 100;\n let total = 0;\n for (let i = 0; i < pending.length; i += BATCH_SIZE) {\n const batch = pending.slice(i, i + BATCH_SIZE);\n const embeddings = await generateEmbeddings(batch.map((row) => row.text), config, \"document\");\n for (let j = 0; j < batch.length; j++) {\n storeHistoryEmbedding(db, batch[j].id, batch[j].text, embeddings[j], config);\n total++;\n }\n }\n\n rebuildHistoryFtsIndex(db, options);\n rebuildHistoryVecIndex(db, config, options);\n return total;\n}\n\nexport function verifyHistoryEmbeddings(\n db: RecallDb,\n config: EmbeddingConfig,\n options: { repo?: string } = {},\n) {\n const rows = db.select().from(historySnippets).all()\n .filter((row) => !options.repo || row.repo === options.repo);\n const embeddings = db.select().from(historySnippetEmbeddings).all();\n const byId = new Map(embeddings.map((row) => [row.snippet_id, row]));\n\n let eligible = 0;\n let stale = 0;\n for (const row of rows) {\n eligible++;\n if (rowNeedsRefresh(row, byId.get(row.id), config)) stale++;\n }\n\n const vec = verifyHistoryVecIndex(db, options);\n const fts = verifyHistoryFtsIndex(db, options);\n\n return {\n eligible,\n stored: embeddings.filter((row) => {\n if (!options.repo) return true;\n const snippet = rows.find((item) => item.id === row.snippet_id);\n return snippet?.repo === options.repo;\n }).length,\n stale,\n indexed: vec.indexed,\n index_drift: vec.drift,\n lexical_indexed: fts.indexed,\n lexical_drift: fts.drift,\n };\n}\n\nfunction lexicalRankToScore(rank: number, position: number) {\n const safeRank = Number.isFinite(rank) ? Math.abs(rank) : position + 1;\n return 1 / (1 + safeRank + position);\n}\n\nexport async function searchHistorySnippets(\n db: RecallDb,\n query: string,\n options: { repo?: string; limit?: number } = {},\n) {\n const limit = options.limit ?? 10;\n const lexicalMatches = searchHistoryFtsIndex(db, query, {\n repo: options.repo,\n limit: Math.max(limit * 2, 20),\n });\n\n const config = loadEmbeddingConfigFromEnv();\n const vectorMatches = config\n ? searchHistoryVecIndex(db, projectEmbeddingToIndex(\n await generateEmbedding(query, config, \"query\"),\n resolveProvider(config).metadata().index_dimensions,\n ), {\n repo: options.repo,\n limit: Math.max(limit * 2, 20),\n })\n : [];\n\n const rowsById = new Map(\n db.select().from(historySnippets).all().map((row) => [row.id, row]),\n );\n\n const merged = new Map<string, {\n snippet: HistorySnippet;\n score: number;\n similarity: number;\n lexical_score: number;\n }>();\n\n for (let i = 0; i < lexicalMatches.length; i++) {\n const match = lexicalMatches[i];\n const row = rowsById.get(match.snippet_id);\n if (!row) continue;\n const lexicalScore = lexicalRankToScore(match.lexical_rank, i);\n merged.set(match.snippet_id, {\n snippet: rowToHistorySnippet(row),\n score: lexicalScore * 0.35,\n similarity: 0,\n lexical_score: lexicalScore,\n });\n }\n\n for (const match of vectorMatches) {\n const row = rowsById.get(match.snippet_id);\n if (!row) continue;\n const similarity = Math.max(0, 1 - match.distance);\n const existing = merged.get(match.snippet_id);\n if (existing) {\n existing.similarity = similarity;\n existing.score = similarity * 0.65 + existing.lexical_score * 0.35;\n } else {\n merged.set(match.snippet_id, {\n snippet: rowToHistorySnippet(row),\n score: similarity * 0.65,\n similarity,\n lexical_score: 0,\n });\n }\n }\n\n return [...merged.values()]\n .sort((a, b) => b.score - a.score)\n .slice(0, limit);\n}\n","import * as sqliteVec from \"sqlite-vec\";\nimport { eq } from \"drizzle-orm\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { historySnippetEmbeddings, historySnippets } from \"../db/schema.js\";\nimport type { EmbeddingConfig } from \"../types.js\";\n\nconst VEC_HISTORY_INDEX = \"vec_history_index\";\nconst loadedClients = new WeakSet<object>();\n\nfunction getSqlite(db: RecallDb) {\n return db.$client;\n}\n\nfunction hasHistoryVecIndex(db: RecallDb): boolean {\n return Boolean(\n getSqlite(db)\n .prepare(\"select 1 from sqlite_master where type = 'table' and name = ?\")\n .get(VEC_HISTORY_INDEX),\n );\n}\n\nfunction ensureLoaded(db: RecallDb) {\n const sqlite = getSqlite(db);\n if (loadedClients.has(sqlite)) return;\n sqliteVec.load(sqlite);\n loadedClients.add(sqlite);\n}\n\nfunction getHistoryVecDimension(\n rows: Array<Pick<typeof historySnippetEmbeddings.$inferSelect, \"index_dimensions\">>,\n): number | null {\n const dimensions = [...new Set(rows.map((row) => row.index_dimensions))];\n if (dimensions.length === 0) return null;\n if (dimensions.length > 1) {\n throw new Error(\n `sqlite-vec history index rebuild refused mixed history embedding dimensions: ${dimensions.join(\", \")}.`,\n );\n }\n return dimensions[0];\n}\n\nexport function ensureHistoryVecIndex(db: RecallDb, dimensions: number) {\n ensureLoaded(db);\n const sqlite = getSqlite(db);\n const existing = sqlite\n .prepare(\"select sql from sqlite_master where type = 'table' and name = ?\")\n .get(VEC_HISTORY_INDEX) as { sql?: string } | undefined;\n\n const expectedDimension = `float[${dimensions}]`;\n if (existing?.sql && !existing.sql.includes(expectedDimension)) {\n throw new Error(\n `sqlite-vec history index dimension mismatch. Expected ${expectedDimension}. Run history index rebuild.`,\n );\n }\n\n sqlite.exec(`\n create virtual table if not exists ${VEC_HISTORY_INDEX} using vec0(\n embedding float[${dimensions}] distance_metric=cosine,\n snippet_id text,\n repo text,\n kind text\n );\n `);\n}\n\nexport function removeHistoryVecRow(db: RecallDb, snippetId: string) {\n ensureLoaded(db);\n if (!hasHistoryVecIndex(db)) return;\n getSqlite(db).prepare(`delete from ${VEC_HISTORY_INDEX} where snippet_id = ?`).run(snippetId);\n}\n\nexport function upsertHistoryVecRow(\n db: RecallDb,\n snippet: Pick<typeof historySnippets.$inferSelect, \"id\" | \"repo\" | \"kind\">,\n embeddingRow: Pick<typeof historySnippetEmbeddings.$inferSelect, \"embedding\" | \"index_dimensions\">,\n) {\n ensureHistoryVecIndex(db, embeddingRow.index_dimensions);\n const sqlite = getSqlite(db);\n sqlite.prepare(`delete from ${VEC_HISTORY_INDEX} where snippet_id = ?`).run(snippet.id);\n sqlite.prepare(`\n insert into ${VEC_HISTORY_INDEX} (\n embedding,\n snippet_id,\n repo,\n kind\n ) values (?, ?, ?, ?)\n `).run(\n projectIndexBuffer(embeddingRow.embedding, embeddingRow.index_dimensions),\n snippet.id,\n snippet.repo ?? \"\",\n snippet.kind,\n );\n}\n\nexport function rebuildHistoryVecIndex(\n db: RecallDb,\n config: EmbeddingConfig,\n options: { repo?: string } = {},\n) {\n const rows = db.select({\n id: historySnippets.id,\n repo: historySnippets.repo,\n kind: historySnippets.kind,\n index_dimensions: historySnippetEmbeddings.index_dimensions,\n embedding: historySnippetEmbeddings.embedding,\n })\n .from(historySnippets)\n .innerJoin(historySnippetEmbeddings, eq(historySnippetEmbeddings.snippet_id, historySnippets.id))\n .all()\n .filter((row) => !options.repo || row.repo === options.repo);\n\n const storedDimension = getHistoryVecDimension(rows);\n const targetDimension = storedDimension ?? config.dimensions;\n const sqlite = getSqlite(db);\n\n if (options.repo) {\n if (rows.length > 0) {\n ensureHistoryVecIndex(db, targetDimension);\n }\n if (!hasHistoryVecIndex(db)) return 0;\n sqlite.prepare(`delete from ${VEC_HISTORY_INDEX} where repo = ?`).run(options.repo);\n if (rows.length === 0) return 0;\n } else {\n sqlite.exec(`drop table if exists ${VEC_HISTORY_INDEX};`);\n ensureHistoryVecIndex(db, targetDimension);\n }\n\n const stmt = getSqlite(db).prepare(`\n insert into ${VEC_HISTORY_INDEX} (\n embedding,\n snippet_id,\n repo,\n kind\n ) values (?, ?, ?, ?)\n `);\n\n const insertMany = getSqlite(db).transaction((batch: typeof rows) => {\n for (const row of batch) {\n stmt.run(projectIndexBuffer(row.embedding, row.index_dimensions), row.id, row.repo ?? \"\", row.kind);\n }\n });\n\n insertMany(rows);\n return rows.length;\n}\n\nfunction projectIndexBuffer(buffer: Buffer, indexDimensions: number): Buffer {\n const embedding = new Float32Array(\n buffer.buffer,\n buffer.byteOffset,\n buffer.byteLength / Float32Array.BYTES_PER_ELEMENT,\n );\n if (embedding.length === indexDimensions) {\n return buffer;\n }\n if (embedding.length < indexDimensions) {\n throw new Error(`Canonical history embedding width ${embedding.length} is smaller than index width ${indexDimensions}.`);\n }\n const sliced = embedding.slice(0, indexDimensions);\n let norm = 0;\n for (const value of sliced) norm += value * value;\n const scale = Math.sqrt(norm) || 1;\n for (let i = 0; i < sliced.length; i++) {\n sliced[i] /= scale;\n }\n return Buffer.from(sliced.buffer, sliced.byteOffset, sliced.byteLength);\n}\n\nexport function verifyHistoryVecIndex(\n db: RecallDb,\n options: { repo?: string } = {},\n) {\n ensureLoaded(db);\n const sqlite = getSqlite(db);\n const exists = sqlite\n .prepare(\"select 1 from sqlite_master where type = 'table' and name = ?\")\n .get(VEC_HISTORY_INDEX);\n\n const expected = db.select({\n snippet_id: historySnippetEmbeddings.snippet_id,\n repo: historySnippets.repo,\n })\n .from(historySnippetEmbeddings)\n .innerJoin(historySnippets, eq(historySnippets.id, historySnippetEmbeddings.snippet_id))\n .all()\n .filter((row) => !options.repo || row.repo === options.repo).length;\n\n let indexed = 0;\n if (exists) {\n if (options.repo) {\n indexed = (sqlite.prepare(`select count(*) as count from ${VEC_HISTORY_INDEX} where repo = ?`).get(options.repo) as { count: number }).count;\n } else {\n indexed = (sqlite.prepare(`select count(*) as count from ${VEC_HISTORY_INDEX}`).get() as { count: number }).count;\n }\n }\n\n return { expected, indexed, drift: expected - indexed };\n}\n\nexport function searchHistoryVecIndex(\n db: RecallDb,\n queryEmbedding: Float32Array,\n options: { repo?: string; limit?: number } = {},\n): Array<{ snippet_id: string; distance: number }> {\n ensureLoaded(db);\n const sqlite = getSqlite(db);\n const exists = sqlite\n .prepare(\"select 1 from sqlite_master where type = 'table' and name = ?\")\n .get(VEC_HISTORY_INDEX);\n if (!exists) return [];\n\n const limit = options.limit ?? 10;\n if (options.repo) {\n return sqlite.prepare(`\n select snippet_id, distance\n from ${VEC_HISTORY_INDEX}\n where embedding match ?\n and k = ?\n and repo = ?\n order by distance\n `).all(queryEmbedding, limit, options.repo) as Array<{ snippet_id: string; distance: number }>;\n }\n\n return sqlite.prepare(`\n select snippet_id, distance\n from ${VEC_HISTORY_INDEX}\n where embedding match ?\n and k = ?\n order by distance\n `).all(queryEmbedding, limit) as Array<{ snippet_id: string; distance: number }>;\n}\n","import { eq } from \"drizzle-orm\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { historySnippets } from \"../db/schema.js\";\n\nconst FTS_HISTORY_INDEX = \"fts_history_index\";\n\nfunction getSqlite(db: RecallDb) {\n return db.$client;\n}\n\nexport function ensureHistoryFtsIndex(db: RecallDb) {\n getSqlite(db).exec(`\n create virtual table if not exists ${FTS_HISTORY_INDEX} using fts5(\n snippet_id UNINDEXED,\n text,\n repo UNINDEXED,\n kind UNINDEXED\n );\n `);\n}\n\nexport function removeHistoryFtsRow(db: RecallDb, snippetId: string) {\n const sqlite = getSqlite(db);\n const exists = sqlite\n .prepare(\"select 1 from sqlite_master where type = 'table' and name = ?\")\n .get(FTS_HISTORY_INDEX);\n if (!exists) return;\n sqlite.prepare(`delete from ${FTS_HISTORY_INDEX} where snippet_id = ?`).run(snippetId);\n}\n\nexport function upsertHistoryFtsRow(\n db: RecallDb,\n snippet: Pick<typeof historySnippets.$inferSelect, \"id\" | \"text\" | \"repo\" | \"kind\">,\n) {\n ensureHistoryFtsIndex(db);\n const sqlite = getSqlite(db);\n sqlite.prepare(`delete from ${FTS_HISTORY_INDEX} where snippet_id = ?`).run(snippet.id);\n sqlite.prepare(`\n insert into ${FTS_HISTORY_INDEX} (\n snippet_id,\n text,\n repo,\n kind\n ) values (?, ?, ?, ?)\n `).run(snippet.id, snippet.text, snippet.repo ?? \"\", snippet.kind);\n}\n\nexport function syncHistoryFtsIndex(db: RecallDb, snippetId: string) {\n const snippet = db.select().from(historySnippets).where(eq(historySnippets.id, snippetId)).get();\n if (!snippet) {\n removeHistoryFtsRow(db, snippetId);\n return \"removed\";\n }\n upsertHistoryFtsRow(db, snippet);\n return \"stored\";\n}\n\nexport function rebuildHistoryFtsIndex(\n db: RecallDb,\n options: { repo?: string } = {},\n) {\n const sqlite = getSqlite(db);\n if (options.repo) {\n ensureHistoryFtsIndex(db);\n sqlite.prepare(`delete from ${FTS_HISTORY_INDEX} where repo = ?`).run(options.repo);\n } else {\n sqlite.exec(`drop table if exists ${FTS_HISTORY_INDEX};`);\n ensureHistoryFtsIndex(db);\n }\n\n const rows = db.select().from(historySnippets).all()\n .filter((row) => !options.repo || row.repo === options.repo);\n\n const stmt = sqlite.prepare(`\n insert into ${FTS_HISTORY_INDEX} (\n snippet_id,\n text,\n repo,\n kind\n ) values (?, ?, ?, ?)\n `);\n const insertMany = sqlite.transaction((batch: typeof rows) => {\n for (const row of batch) {\n stmt.run(row.id, row.text, row.repo ?? \"\", row.kind);\n }\n });\n insertMany(rows);\n return rows.length;\n}\n\nexport function verifyHistoryFtsIndex(\n db: RecallDb,\n options: { repo?: string } = {},\n) {\n const sqlite = getSqlite(db);\n const exists = sqlite\n .prepare(\"select 1 from sqlite_master where type = 'table' and name = ?\")\n .get(FTS_HISTORY_INDEX);\n const expected = db.select().from(historySnippets).all()\n .filter((row) => !options.repo || row.repo === options.repo).length;\n\n let indexed = 0;\n if (exists) {\n if (options.repo) {\n indexed = (sqlite.prepare(`select count(*) as count from ${FTS_HISTORY_INDEX} where repo = ?`).get(options.repo) as { count: number }).count;\n } else {\n indexed = (sqlite.prepare(`select count(*) as count from ${FTS_HISTORY_INDEX}`).get() as { count: number }).count;\n }\n }\n return { expected, indexed, drift: expected - indexed };\n}\n\nfunction buildFtsQuery(query: string) {\n const tokens = query\n .match(/[A-Za-z0-9_.:/-]+/g)\n ?.map((token) => token.replace(/\"/g, '\"\"'))\n .filter(Boolean) ?? [];\n if (tokens.length === 0) return null;\n return tokens.map((token) => `\"${token}\"`).join(\" \");\n}\n\nexport function searchHistoryFtsIndex(\n db: RecallDb,\n query: string,\n options: { repo?: string; limit?: number } = {},\n): Array<{ snippet_id: string; lexical_rank: number }> {\n ensureHistoryFtsIndex(db);\n const ftsQuery = buildFtsQuery(query);\n if (!ftsQuery) return [];\n const sqlite = getSqlite(db);\n const limit = options.limit ?? 10;\n\n if (options.repo) {\n return sqlite.prepare(`\n select snippet_id, bm25(${FTS_HISTORY_INDEX}) as lexical_rank\n from ${FTS_HISTORY_INDEX}\n where ${FTS_HISTORY_INDEX} match ?\n and repo = ?\n order by lexical_rank\n limit ?\n `).all(ftsQuery, options.repo, limit) as Array<{ snippet_id: string; lexical_rank: number }>;\n }\n\n return sqlite.prepare(`\n select snippet_id, bm25(${FTS_HISTORY_INDEX}) as lexical_rank\n from ${FTS_HISTORY_INDEX}\n where ${FTS_HISTORY_INDEX} match ?\n order by lexical_rank\n limit ?\n `).all(ftsQuery, limit) as Array<{ snippet_id: string; lexical_rank: number }>;\n}\n","import { and, asc, eq, gt, isNull } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { memoryInjections } from \"../db/schema.js\";\nimport type { FeedbackOutcome, MemoryInjection, MemoryItem } from \"../types.js\";\nimport { getMemory } from \"./memory.js\";\nimport type { RecentToolCall } from \"../agents/types.js\";\n\ntype MemoryInjectionRow = typeof memoryInjections.$inferSelect;\n\nexport function recordMemoryInjections(\n db: RecallDb,\n input: {\n memory_ids: readonly string[];\n session_id?: string;\n repo?: string | null;\n },\n): number {\n if (!input.session_id || input.memory_ids.length === 0) return 0;\n\n const injectedAt = new Date().toISOString();\n let inserted = 0;\n for (const memoryId of input.memory_ids) {\n const result = db.insert(memoryInjections)\n .values({\n id: randomUUID(),\n memory_id: memoryId,\n session_id: input.session_id,\n repo: input.repo ?? null,\n injected_at: injectedAt,\n outcome: null,\n outcome_at: null,\n })\n .onConflictDoNothing({\n target: [memoryInjections.memory_id, memoryInjections.session_id],\n })\n .run();\n inserted += Number(result.changes ?? 0);\n }\n\n return inserted;\n}\n\nexport function listInjectedMemoryIdsForSession(\n db: RecallDb,\n sessionId: string,\n): Set<string> {\n const rows = db.select({ memory_id: memoryInjections.memory_id })\n .from(memoryInjections)\n .where(eq(memoryInjections.session_id, sessionId))\n .all();\n return new Set(rows.map((row) => row.memory_id));\n}\n\nexport function listPendingMemoryInjections(\n db: RecallDb,\n sessionId: string,\n): Array<MemoryInjection & { memory: MemoryItem | null }> {\n const rows = db.select()\n .from(memoryInjections)\n .where(and(\n eq(memoryInjections.session_id, sessionId),\n isNull(memoryInjections.outcome),\n ))\n .orderBy(asc(memoryInjections.injected_at))\n .all();\n\n return rows.map((row) => ({\n ...rowToMemoryInjection(row),\n memory: getMemory(db, row.memory_id) ?? null,\n }));\n}\n\nexport function resolveMemoryInjectionOutcome(\n db: RecallDb,\n memoryId: string,\n sessionId: string,\n outcome: FeedbackOutcome,\n): boolean {\n const outcomeAt = new Date().toISOString();\n const result = db.update(memoryInjections)\n .set({\n outcome,\n outcome_at: outcomeAt,\n })\n .where(and(\n eq(memoryInjections.memory_id, memoryId),\n eq(memoryInjections.session_id, sessionId),\n isNull(memoryInjections.outcome),\n ))\n .run();\n\n return Number(result.changes ?? 0) > 0;\n}\n\nexport function listToolCallsSince(\n db: RecallDb,\n sessionId: string,\n injectedAt: string,\n): RecentToolCall[] {\n const rows = db.select()\n .from(memoryInjections)\n .where(gt(memoryInjections.injected_at, injectedAt))\n .all();\n void rows;\n return [];\n}\n\nexport function pathMatchesMemory(mem: MemoryItem, targetPath?: string): boolean {\n if (!targetPath) return mem.scope === \"repo\" || mem.scope === \"team\";\n if (mem.scope === \"repo\" || mem.scope === \"team\") return true;\n if (!mem.path_scope) return true;\n\n const pattern = mem.path_scope;\n if (pattern.endsWith(\"**\")) {\n return targetPath.startsWith(pattern.slice(0, -2));\n }\n if (pattern.includes(\"*\")) {\n const regex = new RegExp(\n \"^\" + pattern.replace(/\\*/g, \"[^/]*\").replace(/\\*\\*/g, \".*\") + \"$\",\n );\n return regex.test(targetPath);\n }\n return targetPath.startsWith(pattern);\n}\n\nexport function toolCallTouchesMemory(\n mem: MemoryItem,\n toolCall: RecentToolCall,\n): boolean {\n if (toolCall.path && pathMatchesMemory(mem, toolCall.path)) return true;\n if (toolCall.input_summary) {\n const inferredPath = extractPath(toolCall.input_summary);\n if (inferredPath && pathMatchesMemory(mem, inferredPath)) return true;\n }\n return mem.scope === \"repo\" || mem.scope === \"team\";\n}\n\nfunction rowToMemoryInjection(row: MemoryInjectionRow): MemoryInjection {\n return {\n id: row.id,\n memory_id: row.memory_id,\n session_id: row.session_id,\n repo: row.repo,\n injected_at: row.injected_at,\n outcome: row.outcome,\n outcome_at: row.outcome_at,\n };\n}\n\nfunction extractPath(text: string): string | undefined {\n const match = text.match(\n /\\b((?:src|lib|app|components|utils|test|spec)\\/[\\w./-]+|[\\w./-]+\\.(?:ts|tsx|js|jsx|py|rs|go|swift|java|rb|json|toml|ya?ml))\\b/,\n );\n return match?.[1];\n}\n","import { eq } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { historyInjections } from \"../db/schema.js\";\n\nexport function recordHistoryInjections(\n db: RecallDb,\n input: {\n snippet_ids: readonly string[];\n session_id?: string;\n repo?: string | null;\n },\n): number {\n if (!input.session_id || input.snippet_ids.length === 0) return 0;\n\n const injectedAt = new Date().toISOString();\n let inserted = 0;\n for (const snippetId of input.snippet_ids) {\n const result = db.insert(historyInjections)\n .values({\n id: randomUUID(),\n snippet_id: snippetId,\n session_id: input.session_id,\n repo: input.repo ?? null,\n injected_at: injectedAt,\n })\n .onConflictDoNothing({\n target: [historyInjections.snippet_id, historyInjections.session_id],\n })\n .run();\n inserted += Number(result.changes ?? 0);\n }\n\n return inserted;\n}\n\nexport function listInjectedHistoryIdsForSession(\n db: RecallDb,\n sessionId: string,\n): Set<string> {\n const rows = db.select({ snippet_id: historyInjections.snippet_id })\n .from(historyInjections)\n .where(eq(historyInjections.session_id, sessionId))\n .all();\n return new Set(rows.map((row) => row.snippet_id));\n}\n","import { queryMemories, getMemoryFeedbackSummaries, feedbackWeightedScore } from \"../models/memory.js\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { recordMemoryInjections } from \"../models/memory-injections.js\";\nimport { recordHistoryInjections } from \"../models/history-injections.js\";\nimport { CONFIDENCE, type CompilerConfig, type EmbeddingConfig, type HistorySnippet, type MemoryItem } from \"../types.js\";\nimport { getRepoQualityProfile } from \"../repo/quality.js\";\nimport { hybridSearch, loadEmbeddingConfigFromEnv } from \"../embeddings/embeddings.js\";\nimport { listHistorySnippets } from \"../history/snippets.js\";\nimport { searchHistorySnippets } from \"../history/retrieval.js\";\n\nconst DEFAULT_CONFIG: CompilerConfig = {\n confidence_threshold: CONFIDENCE.ACTIVE_MIN,\n max_lines: 15,\n max_commands: 3,\n max_gotchas: 3,\n max_history_snippets: 2,\n token_budget: 2000,\n include_candidates: false,\n};\nconst QUERY_RESULT_LIMIT = 2;\nconst QUERY_VECTOR_RELEVANCE_FLOOR = 0.7;\n\nexport interface CompileRequest {\n repo: string;\n path?: string;\n query_text?: string;\n session_id?: string;\n config?: Partial<CompilerConfig>;\n embedding_config?: EmbeddingConfig | null;\n}\n\nexport interface CompiledContext {\n text: string;\n memories_included: string[];\n memories_dropped: string[];\n history_included: string[];\n token_estimate: number;\n}\n\nexport function compileContext(\n db: RecallDb,\n req: CompileRequest,\n): CompiledContext {\n const profile = getRepoQualityProfile(db, req.repo);\n const config = {\n ...DEFAULT_CONFIG,\n ...req.config,\n confidence_threshold:\n req.config?.confidence_threshold ?? profile.compile_confidence_threshold,\n };\n const selectedHistory = selectRepoHistory(db, req.repo, config.max_history_snippets);\n\n // 1. Pull repo-scoped + path-scoped memories. Skip rows that have been\n // suppressed from auto-injection (still queryable via MCP). Also include\n // scope='global' rules — those apply across every repo.\n const repoActive = queryMemories(db, {\n repo: req.repo,\n status: \"active\",\n auto_inject: true,\n });\n const globalActive = queryMemories(db, {\n scope: \"global\",\n status: \"active\",\n auto_inject: true,\n });\n const allActive = dedupeById([...repoActive, ...globalActive]);\n\n // 2. Filter by path scope if provided\n const scoped = req.path\n ? allActive.filter((m) => pathMatches(m, req.path!))\n : allActive;\n\n // 3. Apply hard confidence threshold\n const passing = scoped.filter(\n (m) => m.confidence >= config.confidence_threshold,\n );\n const dropped = scoped.filter(\n (m) => m.confidence < config.confidence_threshold,\n );\n\n if (passing.length === 0 && selectedHistory.length === 0) {\n return {\n text: \"\",\n memories_included: [],\n memories_dropped: dropped.map((m) => m.id),\n history_included: [],\n token_estimate: 0,\n };\n }\n\n // 4. Sort by feedback-weighted score (cold-start = confidence; matures\n // into followed-rate as resolved samples accumulate). Type priority still\n // groups rules ahead of commands.\n const summaries = getMemoryFeedbackSummaries(db, passing.map((m) => m.id));\n const scored = passing.map((m) => ({\n mem: m,\n score: feedbackWeightedScore(m.confidence, summaries.get(m.id) ?? {\n followed: 0, overridden: 0, contradicted: 0, ignored: 0, resolved: 0,\n }),\n }));\n const sorted = scored\n .sort((a, b) => {\n const typePrio = typePriority(a.mem.type) - typePriority(b.mem.type);\n if (typePrio !== 0) return typePrio;\n return b.score - a.score;\n })\n .map((s) => s.mem);\n const deduped = dedupeMemoriesForInjection(sorted);\n\n // 5. Budget: pick memories that fit\n const selected: MemoryItem[] = [];\n let commandCount = 0;\n let gotchaCount = 0;\n let lineCount = 0;\n\n for (const mem of deduped) {\n const memLines = renderMemoryText(mem).split(\"\\n\").length;\n\n if (lineCount + memLines > config.max_lines) continue;\n if (mem.type === \"command\" && commandCount >= config.max_commands) continue;\n if (mem.type === \"gotcha\" && gotchaCount >= config.max_gotchas) continue;\n\n selected.push(mem);\n lineCount += memLines;\n if (mem.type === \"command\") commandCount++;\n if (mem.type === \"gotcha\") gotchaCount++;\n }\n\n // 6. Compile into text\n const text = renderPack(selected, req.repo, selectedHistory);\n const tokenEstimate = Math.ceil(text.length / 4); // rough chars-to-tokens\n\n if (tokenEstimate > config.token_budget) {\n // Trim from the bottom (lowest confidence)\n while (\n selected.length > 1 &&\n Math.ceil(renderPack(selected, req.repo, selectedHistory).length / 4) >\n config.token_budget\n ) {\n selected.pop();\n }\n }\n\n const finalText = renderPack(selected, req.repo, selectedHistory);\n recordMemoryInjections(db, {\n memory_ids: selected.map((memory) => memory.id),\n session_id: req.session_id,\n repo: req.repo,\n });\n recordHistoryInjections(db, {\n snippet_ids: selectedHistory.map((snippet) => snippet.id),\n session_id: req.session_id,\n repo: req.repo,\n });\n\n return {\n text: finalText,\n memories_included: selected.map((m) => m.id),\n memories_dropped: [\n ...dropped.map((m) => m.id),\n ...sorted\n .filter((m) => !selected.includes(m))\n .map((m) => m.id),\n ],\n history_included: selectedHistory.map((snippet) => snippet.id),\n token_estimate: Math.ceil(finalText.length / 4),\n };\n}\n\nexport async function compileContextHybrid(\n db: RecallDb,\n req: CompileRequest,\n): Promise<CompiledContext> {\n const embeddingConfig = req.embedding_config ?? loadEmbeddingConfigFromEnv();\n const profile = getRepoQualityProfile(db, req.repo);\n const config = {\n ...DEFAULT_CONFIG,\n ...req.config,\n confidence_threshold:\n req.config?.confidence_threshold ?? profile.compile_confidence_threshold,\n };\n const selectedHistory = req.query_text\n ? await selectRelevantHistory(db, req.repo, req.query_text, config.max_history_snippets)\n : selectRepoHistory(db, req.repo, config.max_history_snippets);\n\n const repoMemories = queryMemories(db, { repo: req.repo });\n const globalMemories = queryMemories(db, { scope: \"global\" });\n const allMemories = dedupeById([...repoMemories, ...globalMemories]).filter((memory) =>\n memory.auto_inject &&\n (memory.status === \"active\" ||\n (config.include_candidates && memory.status === \"candidate\"))\n );\n\n const scoped = req.path\n ? allMemories.filter((memory) => pathMatches(memory, req.path!))\n : allMemories;\n\n const candidateConfidenceFloor = Math.min(config.confidence_threshold, 0.45);\n const passing = scoped.filter((memory) => {\n if (memory.status === \"active\") {\n return memory.confidence >= config.confidence_threshold;\n }\n if (memory.status === \"candidate\" && config.include_candidates) {\n return memory.confidence >= candidateConfidenceFloor;\n }\n return false;\n });\n\n const dropped = scoped.filter((memory) => !passing.includes(memory));\n\n if (passing.length === 0 && selectedHistory.length === 0) {\n return {\n text: \"\",\n memories_included: [],\n memories_dropped: dropped.map((m) => m.id),\n history_included: [],\n token_estimate: 0,\n };\n }\n\n const retrieval = req.query_text\n ? await hybridSearch(db, req.query_text, embeddingConfig, {\n repo: req.repo,\n limit: QUERY_RESULT_LIMIT,\n })\n : [];\n\n const retrievalById = new Map(\n retrieval.map((item) => [item.memory.id, item]),\n );\n\n const summaries = getMemoryFeedbackSummaries(db, passing.map((m) => m.id));\n const emptySummary = { followed: 0, overridden: 0, contradicted: 0, ignored: 0, resolved: 0 };\n\n const ranked = passing\n .filter((memory) => {\n const retrievalItem = retrievalById.get(memory.id);\n if (req.query_text) {\n if (!retrievalItem) return false;\n if (embeddingConfig && retrievalItem.similarity < QUERY_VECTOR_RELEVANCE_FLOOR) {\n return false;\n }\n return true;\n }\n if (memory.status !== \"candidate\") return true;\n const retrievalScore = retrievalItem?.score ?? 0;\n return retrievalScore >= 0.2;\n })\n .map((memory) => {\n const retrievalScore = retrievalById.get(memory.id)?.score ?? 0;\n const weighted = feedbackWeightedScore(memory.confidence, summaries.get(memory.id) ?? emptySummary);\n const score = req.query_text\n ? (retrievalScore * 0.45) +\n (weighted * 0.25) +\n (scopeScore(memory, req.path) * 0.15) +\n (freshnessScore(memory) * 0.05) +\n (typeScore(memory.type) * 0.10)\n : (weighted * 0.55) +\n (scopeScore(memory, req.path) * 0.20) +\n (freshnessScore(memory) * 0.10) +\n (typeScore(memory.type) * 0.15);\n\n return { memory, score };\n })\n .sort((a, b) => b.score - a.score);\n const dedupedRanked = dedupeRankedMemoriesForInjection(ranked);\n\n const selected: MemoryItem[] = [];\n let commandCount = 0;\n let gotchaCount = 0;\n let lineCount = 0;\n\n for (const item of dedupedRanked) {\n const memory = item.memory;\n const memLines = renderMemoryText(memory).split(\"\\n\").length;\n\n if (lineCount + memLines > config.max_lines) continue;\n if (memory.type === \"command\" && commandCount >= config.max_commands) continue;\n if (memory.type === \"gotcha\" && gotchaCount >= config.max_gotchas) continue;\n\n selected.push(memory);\n lineCount += memLines;\n if (memory.type === \"command\") commandCount++;\n if (memory.type === \"gotcha\") gotchaCount++;\n }\n\n if (selected.length === 0) {\n const historyOnlyText = renderPack([], req.repo, selectedHistory);\n if (historyOnlyText) {\n recordHistoryInjections(db, {\n snippet_ids: selectedHistory.map((snippet) => snippet.id),\n session_id: req.session_id,\n repo: req.repo,\n });\n return {\n text: historyOnlyText,\n memories_included: [],\n memories_dropped: [...dropped, ...passing].map((m) => m.id),\n history_included: selectedHistory.map((snippet) => snippet.id),\n token_estimate: Math.ceil(historyOnlyText.length / 4),\n };\n }\n\n return {\n text: \"\",\n memories_included: [],\n memories_dropped: [...dropped, ...passing].map((m) => m.id),\n history_included: [],\n token_estimate: 0,\n };\n }\n\n while (\n selected.length > 1 &&\n Math.ceil(renderPack(selected, req.repo, selectedHistory).length / 4) > config.token_budget\n ) {\n selected.pop();\n }\n\n const finalText = renderPack(selected, req.repo, selectedHistory);\n recordMemoryInjections(db, {\n memory_ids: selected.map((memory) => memory.id),\n session_id: req.session_id,\n repo: req.repo,\n });\n recordHistoryInjections(db, {\n snippet_ids: selectedHistory.map((snippet) => snippet.id),\n session_id: req.session_id,\n repo: req.repo,\n });\n return {\n text: finalText,\n memories_included: selected.map((m) => m.id),\n memories_dropped: [\n ...dropped.map((m) => m.id),\n ...ranked\n .map((item) => item.memory)\n .filter((memory) => !selected.includes(memory))\n .map((memory) => memory.id),\n ],\n history_included: selectedHistory.map((snippet) => snippet.id),\n token_estimate: Math.ceil(finalText.length / 4),\n };\n}\n\n// --- Render ---\n\nfunction renderPack(items: MemoryItem[], repo: string, history: HistorySnippet[] = []): string {\n if (items.length === 0 && history.length === 0) return \"\";\n\n const rules = items.filter((m) => m.type === \"rule\" || m.type === \"decision\");\n const commands = items.filter((m) => m.type === \"command\");\n const gotchas = items.filter(\n (m) => m.type === \"gotcha\" || m.type === \"review_pattern\",\n );\n\n const sections: string[] = [];\n\n if (rules.length > 0) {\n sections.push(\n \"## Rules\\n\" + rules.map(renderMemoryBullet).join(\"\\n\"),\n );\n }\n\n if (commands.length > 0) {\n sections.push(\n \"## Commands\\n\" + commands.map(renderMemoryBullet).join(\"\\n\"),\n );\n }\n\n if (gotchas.length > 0) {\n sections.push(\n \"## Gotchas\\n\" + gotchas.map(renderMemoryBullet).join(\"\\n\"),\n );\n }\n\n if (history.length > 0) {\n sections.push(\n \"## History\\n\" + history.map(renderHistorySnippet).join(\"\\n\"),\n );\n }\n\n return `# Recall: ${repo}\\n\\n${sections.join(\"\\n\\n\")}\\n`;\n}\n\n// Mark global-scope memories with a `[global]` tag so foreign sessions can see\n// at a glance that the line is a cross-repo rule injected via Recall, not a\n// project-specific instruction. Without the tag, an imperative line like\n// \"When user says X, do Y\" reads as suspicious in an unrelated repo.\nfunction renderMemoryBullet(memory: MemoryItem): string {\n const prefix = memory.scope === \"global\" ? \"[global] \" : \"\";\n return `- ${prefix}${renderMemoryText(memory)}`;\n}\n\nfunction renderMemoryText(memory: MemoryItem): string {\n const text = memory.text.replace(/\\r\\n/g, \"\\n\").trim();\n const injectedHeading = text.search(/##\\s+(Rules|Commands|Gotchas|History)\\b/i);\n const stripped = injectedHeading > 0 ? text.slice(0, injectedHeading).trim() : text;\n return stripped.replace(/\\s+/g, \" \");\n}\n\nfunction dedupeMemoriesForInjection(memories: MemoryItem[]): MemoryItem[] {\n const seen = new Set<string>();\n return memories.filter((memory) => {\n const key = canonicalInjectionText(memory);\n if (!key) return false;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nfunction dedupeRankedMemoriesForInjection<T extends { memory: MemoryItem }>(ranked: T[]): T[] {\n const seen = new Set<string>();\n return ranked.filter((item) => {\n const key = canonicalInjectionText(item.memory);\n if (!key) return false;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nfunction canonicalInjectionText(memory: MemoryItem): string {\n return renderMemoryText(memory)\n .toLowerCase()\n .replace(/[`*_]/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nconst HISTORY_KINDS = new Set([\n \"decision_summary\",\n \"correction_summary\",\n \"review_summary\",\n \"repo_synthesis\",\n]);\n\nfunction selectRepoHistory(\n db: RecallDb,\n repo: string,\n limit: number,\n): HistorySnippet[] {\n if (limit <= 0) return [];\n return listHistorySnippets(db, { repo, limit: Math.max(limit * 3, 6) })\n .filter((snippet) => !snippet.session_id && HISTORY_KINDS.has(snippet.kind))\n .slice(0, limit);\n}\n\nasync function selectRelevantHistory(\n db: RecallDb,\n repo: string,\n query: string,\n limit: number,\n): Promise<HistorySnippet[]> {\n if (limit <= 0) return [];\n const results = await searchHistorySnippets(db, query, {\n repo,\n limit: Math.max(limit * 3, 6),\n });\n return results\n .map((result) => result.snippet)\n .filter((snippet) => HISTORY_KINDS.has(snippet.kind))\n .slice(0, limit);\n}\n\nconst HISTORY_ENTRY_MAX_CHARS = 120;\nconst HISTORY_MAX_ENTRIES_PER_SNIPPET = 2;\n\nfunction renderHistorySnippet(snippet: HistorySnippet): string {\n const lines = snippet.text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean)\n .filter((line) => !line.startsWith(\"Repo: \") && !line.endsWith(\":\"));\n\n const entries = lines\n .slice(0, HISTORY_MAX_ENTRIES_PER_SNIPPET)\n .map((line) =>\n line.length > HISTORY_ENTRY_MAX_CHARS\n ? line.slice(0, HISTORY_ENTRY_MAX_CHARS - 1).trimEnd() + \"…\"\n : line,\n );\n\n const body = entries.length > 0 ? entries.join(\" | \") : \"\";\n return `- [${snippet.kind}] ${body}`;\n}\n\n// --- Path matching ---\n\nfunction pathMatches(mem: MemoryItem, targetPath: string): boolean {\n // Repo, team, and global memories always match\n if (mem.scope === \"repo\" || mem.scope === \"team\" || mem.scope === \"global\") return true;\n if (!mem.path_scope) return true;\n\n // Simple glob-like matching\n const pattern = mem.path_scope;\n if (pattern.endsWith(\"**\")) {\n const prefix = pattern.slice(0, -2);\n return targetPath.startsWith(prefix);\n }\n if (pattern.includes(\"*\")) {\n const regex = new RegExp(\n \"^\" + pattern.replace(/\\*/g, \"[^/]*\").replace(/\\*\\*/g, \".*\") + \"$\",\n );\n return regex.test(targetPath);\n }\n return targetPath.startsWith(pattern);\n}\n\nfunction scopeScore(mem: MemoryItem, targetPath?: string): number {\n if (!targetPath) {\n if (mem.scope === \"repo\" || mem.scope === \"team\") return 0.9;\n if (mem.scope === \"global\") return 0.8;\n return 0.7;\n }\n if (mem.scope === \"global\") return 0.8;\n if (mem.scope === \"path\" && mem.path_scope) return 1;\n if (mem.scope === \"repo\" || mem.scope === \"team\") return 0.75;\n return pathMatches(mem, targetPath) ? 0.6 : 0;\n}\n\nfunction freshnessScore(mem: MemoryItem): number {\n const basis = mem.last_validated_at ?? mem.last_injected_at ?? mem.updated_at;\n const ageMs = Date.now() - new Date(basis).getTime();\n const ageDays = ageMs / 86_400_000;\n return Math.max(0, 1 - (ageDays / 180));\n}\n\n// --- Type priority (lower = higher priority) ---\n\nfunction typePriority(type: MemoryItem[\"type\"]): number {\n switch (type) {\n case \"rule\":\n return 0;\n case \"command\":\n return 1;\n case \"gotcha\":\n return 2;\n case \"review_pattern\":\n return 3;\n case \"decision\":\n return 4;\n default:\n return 5;\n }\n}\n\nfunction typeScore(type: MemoryItem[\"type\"]): number {\n switch (type) {\n case \"rule\":\n return 1.0;\n case \"command\":\n return 0.95;\n case \"decision\":\n return 0.9;\n case \"gotcha\":\n return 0.8;\n case \"review_pattern\":\n return 0.75;\n default:\n return 0.5;\n }\n}\n\n// A memory with scope='global' and a non-null repo (its origin) is returned by\n// both `queryMemories({ repo })` and `queryMemories({ scope: \"global\" })`.\n// Dedupe by id so it's rendered once per compile pass.\nfunction dedupeById(memories: MemoryItem[]): MemoryItem[] {\n const seen = new Set<string>();\n const out: MemoryItem[] = [];\n for (const m of memories) {\n if (seen.has(m.id)) continue;\n seen.add(m.id);\n out.push(m);\n }\n return out;\n}\n","import { compileContext } from \"../compiler/context.js\";\nimport type { RecallDb } from \"../db/client.js\";\n\nexport function exportMarkdown(db: RecallDb, repo: string): string {\n const result = compileContext(db, { repo });\n if (!result.text) {\n return `# ${repo}\\n\\nNo active memories above confidence threshold.\\n`;\n }\n return result.text;\n}\n\nexport function exportClaude(db: RecallDb, repo: string): string {\n const result = compileContext(db, { repo });\n if (!result.text) return \"\";\n\n return `# CLAUDE.md — Auto-generated by Recall\n# Do not edit manually. Run \\`recall export -r ${repo} -f claude\\` to regenerate.\n\n${result.text}`;\n}\n\nexport function exportCodex(db: RecallDb, repo: string): string {\n const result = compileContext(db, { repo });\n if (!result.text) return \"\";\n\n return `# AGENTS.md — Auto-generated by Recall\n# Do not edit manually. Run \\`recall export -r ${repo} -f codex\\` to regenerate.\n\n${result.text}`;\n}\n","import { existsSync, readdirSync } from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport { join, resolve } from \"node:path\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { queryMemories } from \"../models/memory.js\";\nimport { scanAndStore } from \"../scanner/repo.js\";\n\nconst repoPathCache = new Map<string, string | null>();\nconst SKIP_DIRS = new Set([\n \".git\",\n \"node_modules\",\n \"dist\",\n \"build\",\n \"coverage\",\n \".next\",\n \".turbo\",\n \".venv\",\n \"venv\",\n]);\n\nexport interface RepoBootstrapOptions {\n repo?: string | null;\n repoPathHint?: string | null;\n searchRoots?: string[];\n}\n\nexport interface RepoBootstrapResult {\n repo: string | null;\n repo_path: string | null;\n created_ids: string[];\n status:\n | \"skipped\"\n | \"already_known\"\n | \"bootstrapped\"\n | \"scanned_empty\"\n | \"unresolved\";\n}\n\nexport interface DiscoveredRepo {\n repo: string | null;\n repo_path: string;\n}\n\nexport function ensureRepoBootstrapped(\n db: RecallDb,\n opts: RepoBootstrapOptions,\n): RepoBootstrapResult {\n const repo = normalizeRepoSlug(opts.repo);\n const repoPathHint = opts.repoPathHint ?? null;\n\n if (!repo && !repoPathHint) {\n return {\n repo: null,\n repo_path: null,\n created_ids: [],\n status: \"skipped\",\n };\n }\n\n const resolvedRepo = repo ?? inferRepoSlugFromPath(repoPathHint);\n if (!resolvedRepo) {\n return {\n repo: null,\n repo_path: null,\n created_ids: [],\n status: \"unresolved\",\n };\n }\n\n if (queryMemories(db, { repo: resolvedRepo }).length > 0) {\n return {\n repo: resolvedRepo,\n repo_path: null,\n created_ids: [],\n status: \"already_known\",\n };\n }\n\n const repoPath = resolveLocalRepoPath(resolvedRepo, {\n repoPathHint,\n searchRoots: opts.searchRoots,\n });\n if (!repoPath) {\n return {\n repo: resolvedRepo,\n repo_path: null,\n created_ids: [],\n status: \"unresolved\",\n };\n }\n\n const createdIds = scanAndStore(db, repoPath);\n return {\n repo: resolvedRepo,\n repo_path: repoPath,\n created_ids: createdIds,\n status: createdIds.length > 0 ? \"bootstrapped\" : \"scanned_empty\",\n };\n}\n\nexport function resolveLocalRepoPath(\n repo: string,\n opts: Omit<RepoBootstrapOptions, \"repo\"> = {},\n): string | null {\n const normalizedRepo = normalizeRepoSlug(repo);\n if (!normalizedRepo) return null;\n\n if (repoPathCache.has(normalizedRepo)) {\n return repoPathCache.get(normalizedRepo) ?? null;\n }\n\n const directHint = normalizeRepoPathHint(opts.repoPathHint);\n if (directHint && pathMatchesRepo(directHint, normalizedRepo)) {\n repoPathCache.set(normalizedRepo, directHint);\n return directHint;\n }\n\n const candidates = collectCandidateRepos(opts.searchRoots ?? getDefaultSearchRoots());\n const basenameMatches: string[] = [];\n\n for (const candidate of candidates) {\n const candidateRepo = inferRepoSlugFromPath(candidate);\n if (candidateRepo === normalizedRepo) {\n repoPathCache.set(normalizedRepo, candidate);\n return candidate;\n }\n if (candidate.endsWith(`/${normalizedRepo.split(\"/\").at(-1)}`)) {\n basenameMatches.push(candidate);\n }\n }\n\n const fallback = basenameMatches.length === 1 ? basenameMatches[0] : null;\n repoPathCache.set(normalizedRepo, fallback);\n return fallback;\n}\n\nexport function inferRepoSlugFromPath(repoPath?: string | null): string | null {\n const root = normalizeRepoPathHint(repoPath);\n if (!root) return null;\n\n try {\n const remote = execFileSync(\n \"git\",\n [\"-C\", root, \"remote\", \"get-url\", \"origin\"],\n { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n ).trim();\n return extractRepoSlugFromRemote(remote);\n } catch {\n const parts = root.split(\"/\").filter(Boolean);\n return parts.at(-1) ?? null;\n }\n}\n\nexport function discoverLocalRepos(searchRoots?: string[]): DiscoveredRepo[] {\n const seen = new Set<string>();\n const repos: DiscoveredRepo[] = [];\n\n for (const repoPath of collectCandidateRepos(searchRoots ?? getDefaultSearchRoots())) {\n const repo = inferRepoSlugFromPath(repoPath);\n const key = `${repo ?? \"-\"}::${repoPath}`;\n if (seen.has(key)) continue;\n seen.add(key);\n repos.push({ repo, repo_path: repoPath });\n }\n\n return repos;\n}\n\nexport function extractRepoSlugFromRemote(remote: string): string | null {\n const trimmed = remote.trim().replace(/\\.git$/, \"\");\n const parts = trimmed.split(/[:/]/).filter(Boolean);\n if (parts.length < 2) return null;\n return `${parts.at(-2)}/${parts.at(-1)}`;\n}\n\nfunction pathMatchesRepo(repoPath: string, repo: string): boolean {\n const inferred = inferRepoSlugFromPath(repoPath);\n if (inferred === repo) return true;\n return repoPath.endsWith(`/${repo.split(\"/\").at(-1)}`);\n}\n\nfunction normalizeRepoSlug(repo?: string | null): string | null {\n if (!repo) return null;\n const trimmed = repo.trim().replace(/\\.git$/, \"\").replace(/^https?:\\/\\/[^/]+\\//, \"\");\n if (!trimmed.includes(\"/\")) return null;\n return trimmed.replace(/^git@[^:]+:/, \"\");\n}\n\nfunction normalizeRepoPathHint(repoPath?: string | null): string | null {\n if (!repoPath) return null;\n const expanded = repoPath.trim().replace(/^~(?=\\/)/, process.env.HOME ?? \"~\");\n try {\n const root = execFileSync(\n \"git\",\n [\"-C\", expanded, \"rev-parse\", \"--show-toplevel\"],\n { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n ).trim();\n return root || null;\n } catch {\n const resolved = resolve(expanded);\n return existsSync(join(resolved, \".git\")) ? resolved : null;\n }\n}\n\nfunction getDefaultSearchRoots(): string[] {\n const configured = process.env.RECALL_REPO_ROOTS\n ?.split(\",\")\n .map((value) => value.trim())\n .filter(Boolean);\n if (configured?.length) return configured;\n\n const home = process.env.HOME ?? process.cwd();\n return [join(home, \"Projects\")];\n}\n\nfunction collectCandidateRepos(searchRoots: string[]): string[] {\n const seen = new Set<string>();\n const repos: string[] = [];\n\n for (const root of searchRoots) {\n walkRepos(resolve(root), 4, seen, repos);\n }\n\n return repos;\n}\n\nfunction walkRepos(\n dir: string,\n depthRemaining: number,\n seen: Set<string>,\n repos: string[],\n): void {\n if (depthRemaining < 0 || seen.has(dir) || !existsSync(dir)) return;\n seen.add(dir);\n\n if (existsSync(join(dir, \".git\"))) {\n repos.push(dir);\n return;\n }\n\n let entries;\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (SKIP_DIRS.has(entry.name)) continue;\n walkRepos(join(dir, entry.name), depthRemaining - 1, seen, repos);\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { exportMarkdown } from \"../adapters/markdown.js\";\nimport { inferRepoSlugFromPath, resolveLocalRepoPath } from \"../repo/discovery.js\";\n\nexport interface RepoContextArtifactResult {\n repo: string | null;\n repo_path: string | null;\n output_path: string | null;\n written: boolean;\n}\n\nexport function getRepoContextArtifactPath(repoPath: string): string {\n return join(repoPath, \".recall\", \"context.md\");\n}\n\nexport function renderRepoContextArtifact(db: RecallDb, repo: string): string {\n const compiled = exportMarkdown(db, repo).trimEnd();\n const generatedAt = new Date().toISOString();\n\n return [\n \"<!-- Auto-generated by Recall. Do not edit manually. -->\",\n `<!-- Generated at: ${generatedAt} -->`,\n \"\",\n \"# Recall Context\",\n \"\",\n `Repo: \\`${repo}\\``,\n \"\",\n \"Read this file before making repo-specific assumptions.\",\n \"\",\n compiled,\n \"\",\n ].join(\"\\n\");\n}\n\nexport function writeRepoContextArtifact(\n db: RecallDb,\n input: { repo?: string | null; repo_path?: string | null },\n): RepoContextArtifactResult {\n const repo = input.repo ?? inferRepoSlugFromPath(input.repo_path) ?? null;\n const repoPath = input.repo_path ?? (repo ? resolveLocalRepoPath(repo) : null);\n\n if (!repo || !repoPath) {\n return {\n repo,\n repo_path: repoPath,\n output_path: null,\n written: false,\n };\n }\n\n const outputPath = getRepoContextArtifactPath(repoPath);\n mkdirSync(join(repoPath, \".recall\"), { recursive: true });\n ensureRepoContextExcluded(repoPath);\n\n const content = renderRepoContextArtifact(db, repo);\n const existing = existsSync(outputPath) ? readFileSync(outputPath, \"utf-8\") : null;\n if (existing !== content) {\n writeFileSync(outputPath, content);\n }\n\n return {\n repo,\n repo_path: repoPath,\n output_path: outputPath,\n written: existing !== content,\n };\n}\n\nfunction ensureRepoContextExcluded(repoPath: string): void {\n try {\n const excludePath = execFileSync(\n \"git\",\n [\"-C\", repoPath, \"rev-parse\", \"--git-path\", \"info/exclude\"],\n { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n ).trim();\n if (!excludePath) return;\n\n const existing = existsSync(excludePath) ? readFileSync(excludePath, \"utf-8\") : \"\";\n if (existing.split(\"\\n\").some((line) => line.trim() === \".recall/\")) return;\n\n const prefix = existing && !existing.endsWith(\"\\n\") ? \"\\n\" : \"\";\n writeFileSync(\n excludePath,\n `${existing}${prefix}# Recall generated context\\n.recall/\\n`,\n );\n } catch {\n // ignore if repo is not a standard git checkout\n }\n}\n","/**\n * Evaluation harness — tracks memory effectiveness metrics per session.\n * Answers: are memories actually helping? Are they trusted?\n */\n\nimport { eq, sql, and, gte, like } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport type { RecallDb } from \"../db/client.js\";\nimport {\n auditTrail,\n evalSessions,\n feedbackEvents,\n memories,\n memoryMaintenanceTasks,\n} from \"../db/schema.js\";\nimport type {\n EvalMetrics,\n EvalSession,\n MaintenanceEvalMetrics,\n MaintenanceTaskKind,\n} from \"../types.js\";\n\n// --- Session lifecycle ---\n\nexport function startEvalSession(\n db: RecallDb,\n repo: string,\n): string {\n const id = randomUUID();\n db.insert(evalSessions)\n .values({\n id,\n repo,\n started_at: new Date().toISOString(),\n })\n .run();\n return id;\n}\n\nexport function endEvalSession(db: RecallDb, sessionId: string) {\n db.update(evalSessions)\n .set({ ended_at: new Date().toISOString() })\n .where(eq(evalSessions.id, sessionId))\n .run();\n}\n\nexport function getEvalSession(\n db: RecallDb,\n sessionId: string,\n): EvalSession | undefined {\n const row = db\n .select()\n .from(evalSessions)\n .where(eq(evalSessions.id, sessionId))\n .get();\n return row as EvalSession | undefined;\n}\n\n// --- Increment counters ---\n\ntype CounterField =\n | \"memories_injected\"\n | \"memories_followed\"\n | \"memories_overridden\"\n | \"user_corrections\"\n | \"test_passes\"\n | \"test_failures\";\n\nexport function incrementEvalCounter(\n db: RecallDb,\n sessionId: string,\n field: CounterField,\n amount: number = 1,\n) {\n const col = evalSessions[field];\n db.update(evalSessions)\n .set({ [field]: sql`${col} + ${amount}` })\n .where(eq(evalSessions.id, sessionId))\n .run();\n}\n\n// --- Compute metrics ---\n\nexport function computeMetrics(\n db: RecallDb,\n options: { repo?: string; since?: string } = {},\n): EvalMetrics {\n const conditions = [];\n if (options.repo) conditions.push(eq(evalSessions.repo, options.repo));\n if (options.since) conditions.push(gte(evalSessions.started_at, options.since));\n\n const sessions =\n conditions.length > 0\n ? db\n .select()\n .from(evalSessions)\n .where(and(...conditions))\n .all()\n : db.select().from(evalSessions).all();\n\n if (sessions.length === 0) {\n const maintenance = computeMaintenanceMetrics(db);\n return {\n total_sessions: 0,\n injection_rate: 0,\n follow_rate: 0,\n override_rate: 0,\n correction_frequency: 0,\n avg_confidence_at_injection: 0,\n memory_effectiveness: 0,\n ...(maintenance ? { maintenance } : {}),\n };\n }\n\n const totals = sessions.reduce(\n (acc, s) => ({\n injected: acc.injected + s.memories_injected,\n followed: acc.followed + s.memories_followed,\n overridden: acc.overridden + s.memories_overridden,\n corrections: acc.corrections + s.user_corrections,\n test_passes: acc.test_passes + s.test_passes,\n test_failures: acc.test_failures + s.test_failures,\n }),\n {\n injected: 0,\n followed: 0,\n overridden: 0,\n corrections: 0,\n test_passes: 0,\n test_failures: 0,\n },\n );\n\n const totalTests = totals.test_passes + totals.test_failures;\n\n // Get average confidence of injected memories from feedback events\n const feedbackRows = db.select().from(feedbackEvents).all();\n const injectedFeedback = feedbackRows.filter((f) => f.injected);\n let avgConfidence = 0;\n if (injectedFeedback.length > 0) {\n const memIds = [...new Set(injectedFeedback.map((f) => f.memory_id))];\n let totalConf = 0;\n let count = 0;\n for (const memId of memIds) {\n const mem = db\n .select({ confidence: memories.confidence })\n .from(memories)\n .where(eq(memories.id, memId))\n .get();\n if (mem) {\n totalConf += mem.confidence;\n count++;\n }\n }\n avgConfidence = count > 0 ? totalConf / count : 0;\n }\n\n // Memory effectiveness = (followed - overridden) / injected\n const effectiveness =\n totals.injected > 0\n ? (totals.followed - totals.overridden) / totals.injected\n : 0;\n\n const maintenance = computeMaintenanceMetrics(db);\n\n return {\n total_sessions: sessions.length,\n injection_rate:\n totals.injected / Math.max(sessions.length, 1),\n follow_rate:\n totals.injected > 0 ? totals.followed / totals.injected : 0,\n override_rate:\n totals.injected > 0 ? totals.overridden / totals.injected : 0,\n correction_frequency:\n totals.corrections / Math.max(sessions.length, 1),\n avg_confidence_at_injection: avgConfidence,\n memory_effectiveness: effectiveness,\n ...(maintenance ? { maintenance } : {}),\n };\n}\n\nexport function computeMaintenanceMetrics(db: RecallDb): MaintenanceEvalMetrics | undefined {\n const rows = db.select().from(memoryMaintenanceTasks).all();\n if (rows.length === 0) return undefined;\n\n let completed = 0;\n let abandoned = 0;\n const completed_by_kind: Record<string, number> = {};\n let completionDurations: number[] = [];\n let mergeCompleted = 0;\n\n for (const row of rows) {\n if (row.status === \"completed\") {\n completed += 1;\n completed_by_kind[row.kind] = (completed_by_kind[row.kind] ?? 0) + 1;\n if (row.kind === \"merge_duplicates\") mergeCompleted += 1;\n if (row.completed_at) {\n const delta = new Date(row.completed_at).getTime() - new Date(row.created_at).getTime();\n if (Number.isFinite(delta) && delta >= 0) completionDurations.push(delta);\n }\n } else if (row.status === \"abandoned\") {\n abandoned += 1;\n }\n }\n\n // Merge precision: fraction of merge-touched memories NOT subsequently rolled back.\n // Audit rows tagged with reason LIKE 'merged_%' (actor = 'maintenance:<agent>')\n // are the universe; rolled_back entries on the same memory_id are the regressions.\n const mergeTouched = db.select().from(auditTrail)\n .where(and(\n like(auditTrail.reason, \"merged_%\"),\n like(auditTrail.actor, \"maintenance:%\"),\n ))\n .all();\n const touchedMemoryIds = new Set(mergeTouched.map((r) => r.memory_id));\n\n let mergeRollbacks = 0;\n if (touchedMemoryIds.size > 0) {\n const rollbacks = db.select().from(auditTrail)\n .where(eq(auditTrail.action, \"rolled_back\"))\n .all();\n for (const r of rollbacks) {\n if (touchedMemoryIds.has(r.memory_id)) mergeRollbacks += 1;\n }\n }\n\n const merge_precision = mergeCompleted >= 5 && touchedMemoryIds.size > 0\n ? Math.max(0, 1 - mergeRollbacks / touchedMemoryIds.size)\n : null;\n\n const mean_completion_ms = completionDurations.length\n ? completionDurations.reduce((a, b) => a + b, 0) / completionDurations.length\n : null;\n\n return {\n total_completed: completed,\n total_abandoned: abandoned,\n abandon_rate: completed + abandoned > 0 ? abandoned / (completed + abandoned) : 0,\n mean_completion_ms,\n completed_by_kind: completed_by_kind as Record<MaintenanceTaskKind, number>,\n merge_precision,\n merge_rollbacks: mergeRollbacks,\n };\n}\n\n// --- Report formatting ---\n\nexport function formatMetricsReport(metrics: EvalMetrics): string {\n const pct = (n: number) => `${(n * 100).toFixed(1)}%`;\n const lines = [\n `# Recall Evaluation Report`,\n ``,\n `Sessions: ${metrics.total_sessions}`,\n `Avg memories injected/session: ${metrics.injection_rate.toFixed(1)}`,\n ``,\n `## Trust`,\n `Follow rate: ${pct(metrics.follow_rate)}`,\n `Override rate: ${pct(metrics.override_rate)}`,\n `Effectiveness: ${pct(metrics.memory_effectiveness)}`,\n ``,\n `## Learning`,\n `Corrections/session: ${metrics.correction_frequency.toFixed(1)}`,\n `Avg confidence at injection: ${metrics.avg_confidence_at_injection.toFixed(2)}`,\n ];\n if (metrics.maintenance) {\n const m = metrics.maintenance;\n lines.push(``, `## Maintenance (tier-2)`);\n lines.push(`Completed tasks: ${m.total_completed}`);\n lines.push(`Abandoned tasks: ${m.total_abandoned}`);\n lines.push(`Abandon rate: ${pct(m.abandon_rate)}`);\n if (m.mean_completion_ms != null) {\n lines.push(`Mean completion: ${(m.mean_completion_ms / 1000).toFixed(1)}s`);\n }\n if (m.merge_precision != null) {\n lines.push(`Merge precision: ${pct(m.merge_precision)} (rollbacks: ${m.merge_rollbacks})`);\n }\n const kinds = Object.entries(m.completed_by_kind)\n .sort((a, b) => b[1] - a[1])\n .map(([k, n]) => `${k}=${n}`)\n .join(\", \");\n if (kinds) lines.push(`By kind: ${kinds}`);\n }\n return lines.join(\"\\n\");\n}\n","import { readFileSync } from \"node:fs\";\nimport { compileContext, compileContextHybrid } from \"../compiler/context.js\";\nimport type { RecallDb } from \"../db/client.js\";\nimport type { EmbeddingConfig } from \"../types.js\";\nimport { getMemory } from \"../models/memory.js\";\nimport { bootstrapEmbeddings, loadEmbeddingConfigFromEnv } from \"../embeddings/embeddings.js\";\nimport {\n RetrievalEvalCase,\n RetrievalEvalFile,\n type CompilerConfig,\n type RetrievalEvalFile as RetrievalEvalFileType,\n} from \"../types.js\";\n\ntype EvalRunName = \"baseline\" | \"hybrid\";\ntype RetrievalEvalProvider = EmbeddingConfig[\"provider\"] | \"current\";\n\ninterface RetrievalRunResult {\n included_ids: string[];\n included_texts: string[];\n token_estimate: number;\n passed: boolean;\n expected_all_missing: string[];\n expected_any_hit: boolean;\n forbidden_hits: string[];\n first_expected_rank: number | null;\n count_violation?: string;\n}\n\nexport interface RetrievalEvalCaseResult {\n name: string;\n baseline: RetrievalRunResult;\n hybrid: RetrievalRunResult;\n improved: boolean;\n regressed: boolean;\n}\n\nexport interface RetrievalEvalSummary {\n total_cases: number;\n baseline_passed: number;\n hybrid_passed: number;\n improved_cases: number;\n regressed_cases: number;\n baseline_expected_any_hit_rate: number;\n hybrid_expected_any_hit_rate: number;\n baseline_forbidden_hit_rate: number;\n hybrid_forbidden_hit_rate: number;\n}\n\nexport interface RetrievalEvalReport {\n summary: RetrievalEvalSummary;\n cases: RetrievalEvalCaseResult[];\n provider_reports: RetrievalEvalProviderReport[];\n}\n\nexport interface RetrievalEvalProviderMetrics {\n recall_at_k: number;\n mrr: number;\n override_rate: number;\n}\n\nexport interface RetrievalEvalProviderReport {\n provider: RetrievalEvalProvider;\n summary: RetrievalEvalSummary;\n metrics: RetrievalEvalProviderMetrics;\n cases: RetrievalEvalCaseResult[];\n}\n\nexport function loadRetrievalEvalFile(path: string): RetrievalEvalFileType {\n return RetrievalEvalFile.parse(JSON.parse(readFileSync(path, \"utf8\")));\n}\n\nexport async function runRetrievalEval(\n db: RecallDb,\n input: RetrievalEvalFileType,\n options: { providers?: RetrievalEvalProvider[] } = {},\n): Promise<RetrievalEvalReport> {\n const providers: RetrievalEvalProvider[] = options.providers?.length ? options.providers : [\"current\"];\n const providerReports: RetrievalEvalProviderReport[] = [];\n\n for (const provider of providers) {\n const cases: RetrievalEvalCaseResult[] = [];\n const embeddingConfig = provider === \"current\"\n ? loadEmbeddingConfigFromEnv()\n : embeddingConfigForProvider(provider);\n\n if (embeddingConfig) {\n await bootstrapEmbeddings(db, embeddingConfig);\n }\n\n for (const raw of input.cases) {\n const testCase = RetrievalEvalCase.parse(raw);\n const config = caseConfig(testCase);\n\n const baselineCompiled = compileContext(db, {\n repo: testCase.repo,\n path: testCase.path,\n config,\n });\n const hybridCompiled = await compileContextHybrid(db, {\n repo: testCase.repo,\n path: testCase.path,\n query_text: testCase.query_text,\n config: {\n ...config,\n include_candidates: testCase.include_candidates,\n },\n embedding_config: embeddingConfig,\n });\n\n const baseline = evaluateCaseRun(db, testCase, baselineCompiled.memories_included, baselineCompiled.token_estimate);\n const hybrid = evaluateCaseRun(db, testCase, hybridCompiled.memories_included, hybridCompiled.token_estimate);\n\n cases.push({\n name: testCase.name,\n baseline,\n hybrid,\n improved: !baseline.passed && hybrid.passed,\n regressed: baseline.passed && !hybrid.passed,\n });\n }\n\n const total = cases.length;\n const baselinePassed = cases.filter((item) => item.baseline.passed).length;\n const hybridPassed = cases.filter((item) => item.hybrid.passed).length;\n const improved = cases.filter((item) => item.improved).length;\n const regressed = cases.filter((item) => item.regressed).length;\n\n const baselineExpectedAnyHits = cases.filter((item) => item.baseline.expected_any_hit).length;\n const hybridExpectedAnyHits = cases.filter((item) => item.hybrid.expected_any_hit).length;\n const baselineForbiddenHits = cases.filter((item) => item.baseline.forbidden_hits.length > 0).length;\n const hybridForbiddenHits = cases.filter((item) => item.hybrid.forbidden_hits.length > 0).length;\n const reciprocalRanks = cases\n .map((item) => item.hybrid.first_expected_rank)\n .filter((rank): rank is number => rank != null)\n .map((rank) => 1 / rank);\n\n providerReports.push({\n provider,\n summary: {\n total_cases: total,\n baseline_passed: baselinePassed,\n hybrid_passed: hybridPassed,\n improved_cases: improved,\n regressed_cases: regressed,\n baseline_expected_any_hit_rate: ratio(baselineExpectedAnyHits, total),\n hybrid_expected_any_hit_rate: ratio(hybridExpectedAnyHits, total),\n baseline_forbidden_hit_rate: ratio(baselineForbiddenHits, total),\n hybrid_forbidden_hit_rate: ratio(hybridForbiddenHits, total),\n },\n metrics: {\n recall_at_k: ratio(hybridExpectedAnyHits, total),\n mrr: reciprocalRanks.length > 0\n ? reciprocalRanks.reduce((sum, value) => sum + value, 0) / total\n : 0,\n override_rate: ratio(hybridForbiddenHits, total),\n },\n cases,\n });\n }\n\n return {\n summary: providerReports[0].summary,\n cases: providerReports[0].cases,\n provider_reports: providerReports,\n };\n}\n\nexport function formatRetrievalEvalReport(report: RetrievalEvalReport): string {\n const pct = (value: number) => `${(value * 100).toFixed(1)}%`;\n if (report.provider_reports.length > 1) {\n const lines = [\n \"# Retrieval Eval\",\n \"\",\n \"## Provider Comparison\",\n ];\n\n for (const provider of report.provider_reports) {\n lines.push(\n `- ${provider.provider}: passed=${provider.summary.hybrid_passed}/${provider.summary.total_cases} recall@k=${pct(provider.metrics.recall_at_k)} mrr=${provider.metrics.mrr.toFixed(3)} override=${pct(provider.metrics.override_rate)}`,\n );\n }\n\n for (const provider of report.provider_reports) {\n lines.push(\"\", `## ${provider.provider}`);\n lines.push(formatSingleProviderReport(provider.summary, provider.cases));\n }\n\n return lines.join(\"\\n\");\n }\n\n return formatSingleProviderReport(report.summary, report.cases);\n}\n\nfunction formatSingleProviderReport(\n summary: RetrievalEvalSummary,\n cases: RetrievalEvalCaseResult[],\n) {\n const pct = (value: number) => `${(value * 100).toFixed(1)}%`;\n const lines = [\n \"# Retrieval Eval\",\n \"\",\n `Cases: ${summary.total_cases}`,\n `Baseline passed: ${summary.baseline_passed}`,\n `Hybrid passed: ${summary.hybrid_passed}`,\n `Improved: ${summary.improved_cases}`,\n `Regressed: ${summary.regressed_cases}`,\n \"\",\n `Baseline expected-any hit rate: ${pct(summary.baseline_expected_any_hit_rate)}`,\n `Hybrid expected-any hit rate: ${pct(summary.hybrid_expected_any_hit_rate)}`,\n `Baseline forbidden hit rate: ${pct(summary.baseline_forbidden_hit_rate)}`,\n `Hybrid forbidden hit rate: ${pct(summary.hybrid_forbidden_hit_rate)}`,\n ];\n\n const failedCases = cases.filter((item) => !item.hybrid.passed || item.regressed || item.improved);\n if (failedCases.length > 0) {\n lines.push(\"\", \"## Case Details\");\n for (const item of failedCases) {\n lines.push(`- ${item.name}`);\n lines.push(` baseline: ${describeRun(item.baseline)}`);\n lines.push(` hybrid: ${describeRun(item.hybrid)}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction caseConfig(testCase: RetrievalEvalCase): Partial<CompilerConfig> {\n return {\n ...(testCase.confidence_threshold != null ? { confidence_threshold: testCase.confidence_threshold } : {}),\n ...(testCase.max_lines != null ? { max_lines: testCase.max_lines } : {}),\n ...(testCase.max_commands != null ? { max_commands: testCase.max_commands } : {}),\n ...(testCase.max_gotchas != null ? { max_gotchas: testCase.max_gotchas } : {}),\n ...(testCase.token_budget != null ? { token_budget: testCase.token_budget } : {}),\n };\n}\n\nfunction evaluateCaseRun(\n db: RecallDb,\n testCase: RetrievalEvalCase,\n memoryIds: string[],\n tokenEstimate: number,\n): RetrievalRunResult {\n const includedTexts = memoryIds\n .map((id) => getMemory(db, id)?.text)\n .filter((text): text is string => Boolean(text));\n\n const expectedAllMissing = testCase.expected_all_texts.filter((expected) => !includedTexts.includes(expected));\n const expectedAnyHit = testCase.expected_any_texts.length === 0\n ? true\n : testCase.expected_any_texts.some((expected) => includedTexts.includes(expected));\n const forbiddenHits = testCase.forbidden_texts.filter((forbidden) => includedTexts.includes(forbidden));\n const relevantTexts = [\n ...testCase.expected_all_texts,\n ...testCase.expected_any_texts,\n ];\n const firstExpectedRank = relevantTexts.length === 0\n ? null\n : includedTexts.findIndex((text) => relevantTexts.includes(text)) + 1 || null;\n\n let countViolation: string | undefined;\n if (testCase.min_included != null && memoryIds.length < testCase.min_included) {\n countViolation = `included ${memoryIds.length} < min ${testCase.min_included}`;\n } else if (testCase.max_included != null && memoryIds.length > testCase.max_included) {\n countViolation = `included ${memoryIds.length} > max ${testCase.max_included}`;\n }\n\n const passed =\n expectedAllMissing.length === 0 &&\n expectedAnyHit &&\n forbiddenHits.length === 0 &&\n !countViolation;\n\n return {\n included_ids: memoryIds,\n included_texts: includedTexts,\n token_estimate: tokenEstimate,\n passed,\n expected_all_missing: expectedAllMissing,\n expected_any_hit: expectedAnyHit,\n forbidden_hits: forbiddenHits,\n first_expected_rank: firstExpectedRank,\n count_violation: countViolation,\n };\n}\n\nfunction describeRun(result: RetrievalRunResult) {\n const parts = [\n result.passed ? \"pass\" : \"fail\",\n `included=${result.included_ids.length}`,\n ];\n if (result.expected_all_missing.length > 0) {\n parts.push(`missing_all=${result.expected_all_missing.join(\" | \")}`);\n }\n if (!result.expected_any_hit) {\n parts.push(\"expected_any=miss\");\n }\n if (result.forbidden_hits.length > 0) {\n parts.push(`forbidden=${result.forbidden_hits.join(\" | \")}`);\n }\n if (result.count_violation) {\n parts.push(result.count_violation);\n }\n return parts.join(\" ; \");\n}\n\nfunction ratio(value: number, total: number) {\n return total > 0 ? value / total : 0;\n}\n\nfunction embeddingConfigForProvider(provider: Exclude<RetrievalEvalProvider, \"current\">): EmbeddingConfig {\n const overrideDimensions = process.env.RECALL_EMBEDDING_DIMS\n ? parseInt(process.env.RECALL_EMBEDDING_DIMS, 10)\n : null;\n if (provider === \"bge-small-en-v1.5\") {\n return {\n provider,\n model: \"Xenova/bge-small-en-v1.5\",\n dimensions: overrideDimensions ?? 384,\n version: \"eval\",\n similarity_threshold: 0.8,\n };\n }\n if (provider === \"multilingual-e5\") {\n return {\n provider,\n model: \"Xenova/multilingual-e5-small\",\n dimensions: overrideDimensions ?? 384,\n version: \"eval\",\n similarity_threshold: 0.8,\n };\n }\n\n return {\n provider: \"nomic\",\n model: \"nomic-ai/nomic-embed-text-v1.5\",\n dimensions: overrideDimensions ?? 512,\n version: \"eval\",\n similarity_threshold: 0.8,\n };\n}\n","/**\n * Implicit feedback signals — infer memory quality from indirect signals:\n * - test pass/fail after injection\n * - file unchanged vs rewritten after injection\n * - task acceptance/rejection\n *\n * These signals feed back into confidence adjustments.\n */\n\nimport { eq } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport { execSync } from \"node:child_process\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { implicitSignals, memories } from \"../db/schema.js\";\nimport { promoteMemory, demoteMemory } from \"../models/memory.js\";\n\ntype SignalType =\n | \"test_pass\"\n | \"test_fail\"\n | \"file_unchanged\"\n | \"file_rewritten\"\n | \"task_accepted\"\n | \"task_rejected\";\n\n// --- Signal weights (how much each signal affects confidence) ---\n\nconst SIGNAL_WEIGHTS: Record<SignalType, number> = {\n test_pass: 0.03,\n test_fail: -0.15,\n file_unchanged: 0.02,\n file_rewritten: -0.1,\n task_accepted: 0.05,\n task_rejected: -0.2,\n};\n\n// --- Record a signal ---\n\nexport function recordSignal(\n db: RecallDb,\n memoryId: string,\n sessionId: string,\n signalType: SignalType,\n context?: string,\n): string {\n const id = randomUUID();\n db.insert(implicitSignals)\n .values({\n id,\n memory_id: memoryId,\n session_id: sessionId,\n signal_type: signalType,\n timestamp: new Date().toISOString(),\n context: context ?? null,\n })\n .run();\n\n // Apply confidence adjustment\n const weight = SIGNAL_WEIGHTS[signalType];\n if (weight > 0) {\n promoteMemory(db, memoryId, \"passive_gain\");\n } else if (weight < 0) {\n demoteMemory(db, memoryId, `implicit:${signalType}`);\n }\n\n return id;\n}\n\n// --- Get signals for a memory ---\n\nexport function getSignals(db: RecallDb, memoryId: string) {\n return db\n .select()\n .from(implicitSignals)\n .where(eq(implicitSignals.memory_id, memoryId))\n .all();\n}\n\n// --- Detect test results ---\n\nexport interface TestResult {\n passed: boolean;\n output?: string;\n}\n\nexport function runTests(\n repoPath: string,\n command: string,\n): TestResult {\n try {\n const output = execSync(command, {\n cwd: repoPath,\n encoding: \"utf-8\",\n timeout: 120_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return { passed: true, output };\n } catch (err: any) {\n return {\n passed: false,\n output: err.stdout ?? err.stderr ?? err.message,\n };\n }\n}\n\n/**\n * After running tests, record implicit signals for all memories\n * that were injected in the current session.\n */\nexport function recordTestSignals(\n db: RecallDb,\n sessionId: string,\n injectedMemoryIds: string[],\n testResult: TestResult,\n): string[] {\n const signalType: SignalType = testResult.passed ? \"test_pass\" : \"test_fail\";\n const ids: string[] = [];\n\n for (const memId of injectedMemoryIds) {\n const id = recordSignal(\n db,\n memId,\n sessionId,\n signalType,\n testResult.output?.slice(0, 500),\n );\n ids.push(id);\n }\n\n return ids;\n}\n\n// --- Detect file changes (post-injection) ---\n\n/**\n * Check if files were modified after memory injection.\n * Compares git diff to see if agent output was rewritten.\n */\nexport function detectFileChanges(\n repoPath: string,\n files: string[],\n): Map<string, \"unchanged\" | \"rewritten\"> {\n const results = new Map<string, \"unchanged\" | \"rewritten\">();\n\n try {\n const diff = execSync(\"git diff --name-only\", {\n cwd: repoPath,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n\n const changedFiles = new Set(diff.split(\"\\n\").filter(Boolean));\n\n for (const file of files) {\n results.set(\n file,\n changedFiles.has(file) ? \"rewritten\" : \"unchanged\",\n );\n }\n } catch {\n // Not a git repo or git error — mark all as unchanged\n for (const file of files) {\n results.set(file, \"unchanged\");\n }\n }\n\n return results;\n}\n\n/**\n * Record file-change signals for injected memories.\n */\nexport function recordFileChangeSignals(\n db: RecallDb,\n sessionId: string,\n memoryIds: string[],\n changes: Map<string, \"unchanged\" | \"rewritten\">,\n): string[] {\n const ids: string[] = [];\n const hasRewrites = [...changes.values()].some((v) => v === \"rewritten\");\n\n const signalType: SignalType = hasRewrites\n ? \"file_rewritten\"\n : \"file_unchanged\";\n\n for (const memId of memoryIds) {\n const id = recordSignal(\n db,\n memId,\n sessionId,\n signalType,\n `files: ${[...changes.entries()].map(([f, s]) => `${f}:${s}`).join(\", \")}`,\n );\n ids.push(id);\n }\n\n return ids;\n}\n\n// --- Aggregate signal stats ---\n\nexport function getSignalStats(\n db: RecallDb,\n memoryId: string,\n): Record<SignalType, number> {\n const signals = getSignals(db, memoryId);\n const stats: Record<string, number> = {\n test_pass: 0,\n test_fail: 0,\n file_unchanged: 0,\n file_rewritten: 0,\n task_accepted: 0,\n task_rejected: 0,\n };\n\n for (const s of signals) {\n stats[s.signal_type] = (stats[s.signal_type] ?? 0) + 1;\n }\n\n return stats as Record<SignalType, number>;\n}\n","/**\n * Org-level policy engine + approval workflows.\n *\n * Policy rules control what memories can be promoted, what needs approval,\n * and what's automatically accepted. Admins set policy, members submit\n * memories, admins approve.\n */\n\nimport { eq, and } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { policyRules, approvalRequests, memories } from \"../db/schema.js\";\nimport { getMemory, confirmMemory, rejectMemory, queryMemories } from \"../models/memory.js\";\nimport { recordAudit } from \"../audit/trail.js\";\nimport type { PolicyRule, ApprovalStatus, MemoryItem } from \"../types.js\";\n\n// --- Policy CRUD ---\n\nexport function createPolicy(\n db: RecallDb,\n orgId: string,\n ruleType: PolicyRule[\"rule_type\"],\n config: Record<string, unknown>,\n): string {\n const id = randomUUID();\n const now = new Date().toISOString();\n db.insert(policyRules)\n .values({\n id,\n org_id: orgId,\n rule_type: ruleType,\n config: config as any,\n enabled: true,\n created_at: now,\n updated_at: now,\n })\n .run();\n return id;\n}\n\nexport function listPolicies(db: RecallDb, orgId: string): PolicyRule[] {\n return db\n .select()\n .from(policyRules)\n .where(eq(policyRules.org_id, orgId))\n .all()\n .map(rowToPolicy);\n}\n\nexport function togglePolicy(db: RecallDb, policyId: string, enabled: boolean) {\n db.update(policyRules)\n .set({ enabled, updated_at: new Date().toISOString() })\n .where(eq(policyRules.id, policyId))\n .run();\n}\n\nexport function deletePolicy(db: RecallDb, policyId: string) {\n db.delete(policyRules).where(eq(policyRules.id, policyId)).run();\n}\n\n// --- Policy evaluation ---\n\nexport interface PolicyViolation {\n rule_id: string;\n rule_type: string;\n message: string;\n blocking: boolean;\n}\n\nexport function evaluatePolicy(\n db: RecallDb,\n orgId: string,\n memory: MemoryItem,\n): PolicyViolation[] {\n const rules = listPolicies(db, orgId).filter((r) => r.enabled);\n const violations: PolicyViolation[] = [];\n\n for (const rule of rules) {\n const cfg = rule.config as Record<string, any>;\n\n switch (rule.rule_type) {\n case \"min_confidence\": {\n const min = cfg.min_confidence ?? 0.6;\n if (memory.confidence < min) {\n violations.push({\n rule_id: rule.id,\n rule_type: rule.rule_type,\n message: `Confidence ${memory.confidence.toFixed(2)} below minimum ${min}`,\n blocking: true,\n });\n }\n break;\n }\n\n case \"require_approval\": {\n const forTypes = cfg.for_types as string[] | undefined;\n if (!forTypes || forTypes.includes(memory.type)) {\n violations.push({\n rule_id: rule.id,\n rule_type: rule.rule_type,\n message: `Memory type \"${memory.type}\" requires approval before activation`,\n blocking: true,\n });\n }\n break;\n }\n\n case \"allowed_sources\": {\n const allowed = cfg.sources as string[] | undefined;\n if (allowed && !allowed.includes(memory.source)) {\n violations.push({\n rule_id: rule.id,\n rule_type: rule.rule_type,\n message: `Source \"${memory.source}\" not in allowed list: ${allowed.join(\", \")}`,\n blocking: true,\n });\n }\n break;\n }\n\n case \"blocked_scopes\": {\n const blocked = cfg.scopes as string[] | undefined;\n if (blocked && blocked.includes(memory.scope)) {\n violations.push({\n rule_id: rule.id,\n rule_type: rule.rule_type,\n message: `Scope \"${memory.scope}\" is blocked by policy`,\n blocking: true,\n });\n }\n break;\n }\n\n case \"max_active_per_repo\": {\n const max = cfg.max ?? 50;\n if (memory.repo) {\n const active = queryMemories(db, { repo: memory.repo, status: \"active\" });\n if (active.length >= max) {\n violations.push({\n rule_id: rule.id,\n rule_type: rule.rule_type,\n message: `Repo \"${memory.repo}\" has ${active.length}/${max} active memories`,\n blocking: true,\n });\n }\n }\n break;\n }\n\n case \"require_evidence_count\": {\n const minEvidence = cfg.min_evidence ?? 2;\n if (memory.evidence.length < minEvidence) {\n violations.push({\n rule_id: rule.id,\n rule_type: rule.rule_type,\n message: `Memory has ${memory.evidence.length} evidence entries, needs ${minEvidence}`,\n blocking: true,\n });\n }\n break;\n }\n\n case \"auto_approve_pattern\": {\n // Not a violation — handled separately\n break;\n }\n }\n }\n\n return violations;\n}\n\n/** Check if a memory matches any auto-approve pattern */\nexport function matchesAutoApprove(\n db: RecallDb,\n orgId: string,\n memory: MemoryItem,\n): boolean {\n const rules = listPolicies(db, orgId).filter(\n (r) => r.enabled && r.rule_type === \"auto_approve_pattern\",\n );\n\n for (const rule of rules) {\n const cfg = rule.config as Record<string, any>;\n const pattern = cfg.pattern as string | undefined;\n if (pattern) {\n try {\n const regex = new RegExp(pattern, \"i\");\n if (regex.test(memory.text)) return true;\n } catch {\n // Invalid regex, skip\n }\n }\n\n const sources = cfg.sources as string[] | undefined;\n if (sources && sources.includes(memory.source)) return true;\n\n const types = cfg.types as string[] | undefined;\n if (types && types.includes(memory.type)) return true;\n }\n\n return false;\n}\n\n// --- Approval queue ---\n\nexport function requestApproval(\n db: RecallDb,\n memoryId: string,\n orgId: string,\n requestedBy: string,\n): string {\n const id = randomUUID();\n const now = new Date().toISOString();\n\n db.insert(approvalRequests)\n .values({\n id,\n memory_id: memoryId,\n org_id: orgId,\n requested_by: requestedBy,\n status: \"pending\",\n created_at: now,\n })\n .run();\n\n recordAudit(db, memoryId, \"approval_requested\", requestedBy, null);\n return id;\n}\n\nexport function resolveApproval(\n db: RecallDb,\n approvalId: string,\n status: \"approved\" | \"denied\",\n reviewedBy: string,\n reason?: string,\n): boolean {\n const row = db\n .select()\n .from(approvalRequests)\n .where(eq(approvalRequests.id, approvalId))\n .get();\n if (!row) return false;\n\n const now = new Date().toISOString();\n db.update(approvalRequests)\n .set({\n status,\n reviewed_by: reviewedBy,\n reason: reason ?? null,\n resolved_at: now,\n })\n .where(eq(approvalRequests.id, approvalId))\n .run();\n\n // Apply the decision\n if (status === \"approved\") {\n confirmMemory(db, row.memory_id);\n } else {\n rejectMemory(db, row.memory_id);\n }\n\n recordAudit(db, row.memory_id, \"approval_resolved\", reviewedBy, reason ?? null);\n return true;\n}\n\nexport function listPendingApprovals(\n db: RecallDb,\n orgId: string,\n) {\n return db\n .select()\n .from(approvalRequests)\n .where(\n and(\n eq(approvalRequests.org_id, orgId),\n eq(approvalRequests.status, \"pending\"),\n ),\n )\n .all();\n}\n\nexport function getApproval(db: RecallDb, id: string) {\n return db\n .select()\n .from(approvalRequests)\n .where(eq(approvalRequests.id, id))\n .get();\n}\n\n// --- Helpers ---\n\nfunction rowToPolicy(row: any): PolicyRule {\n return {\n ...row,\n config:\n typeof row.config === \"string\" ? JSON.parse(row.config) : row.config ?? {},\n enabled: Boolean(row.enabled),\n };\n}\n","/**\n * Auto-pruning and stale memory handling.\n *\n * - Archive memories not injected/validated in N days\n * - Prune rejected memories older than threshold\n * - Compact transient memories\n * - Configurable retention policies\n */\n\nimport { eq } from \"drizzle-orm\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { memories } from \"../db/schema.js\";\nimport { queueMemoryEmbeddingSync } from \"../embeddings/embeddings.js\";\nimport { queryMemories } from \"../models/memory.js\";\nimport { computeHealthScore } from \"../health/scoring.js\";\nimport { recordAudit } from \"../audit/trail.js\";\nimport type { PruneConfig } from \"../types.js\";\n\nconst DEFAULT_CONFIG: PruneConfig = {\n stale_days: 90,\n rejected_retention_days: 30,\n transient_retention_days: 7,\n min_health_score: 0.2,\n dry_run: false,\n};\n\nexport interface PruneResult {\n stale_rejected: string[];\n rejected_pruned: string[];\n transient_pruned: string[];\n unhealthy_demoted: string[];\n total: number;\n}\n\nexport function pruneMemories(\n db: RecallDb,\n config: Partial<PruneConfig> = {},\n): PruneResult {\n const cfg = { ...DEFAULT_CONFIG, ...config };\n const now = Date.now();\n const dayMs = 86_400_000;\n\n const result: PruneResult = {\n stale_rejected: [],\n rejected_pruned: [],\n transient_pruned: [],\n unhealthy_demoted: [],\n total: 0,\n };\n\n // 1. Archive stale active/candidate memories\n const staleCutoff = new Date(now - cfg.stale_days * dayMs).toISOString();\n const staleCandidates = queryMemories(db, {\n repo: cfg.repo,\n limit: undefined,\n }).filter((mem) => mem.status !== \"rejected\" && mem.status !== \"transient\");\n\n for (const mem of staleCandidates) {\n const lastActivity =\n mem.last_validated_at ?? mem.last_injected_at ?? mem.updated_at;\n\n if (lastActivity < staleCutoff) {\n if (!cfg.dry_run) {\n db.update(memories)\n .set({ status: \"rejected\", dedupe_key: null, updated_at: new Date().toISOString() })\n .where(eq(memories.id, mem.id))\n .run();\n queueMemoryEmbeddingSync(db, mem.id);\n recordAudit(db, mem.id, \"rejected\", \"auto-pruner\", `Stale: no activity since ${lastActivity}`);\n }\n result.stale_rejected.push(mem.id);\n }\n }\n\n // 2. Delete rejected memories past retention\n const rejectedCutoff = new Date(\n now - cfg.rejected_retention_days * dayMs,\n ).toISOString();\n const rejectedMemories = queryMemories(db, {\n repo: cfg.repo,\n status: \"rejected\",\n });\n\n for (const mem of rejectedMemories) {\n if (mem.updated_at < rejectedCutoff) {\n if (!cfg.dry_run) {\n // Soft delete — keep audit trail but remove from memories\n db.delete(memories).where(eq(memories.id, mem.id)).run();\n recordAudit(db, mem.id, \"pruned\", \"auto-pruner\", `Rejected memory past ${cfg.rejected_retention_days}d retention`);\n }\n result.rejected_pruned.push(mem.id);\n }\n }\n\n // 3. Compact transient memories\n const transientCutoff = new Date(\n now - cfg.transient_retention_days * dayMs,\n ).toISOString();\n const transientMemories = queryMemories(db, {\n repo: cfg.repo,\n status: \"transient\",\n });\n\n for (const mem of transientMemories) {\n if (mem.updated_at < transientCutoff) {\n if (!cfg.dry_run) {\n db.delete(memories).where(eq(memories.id, mem.id)).run();\n recordAudit(db, mem.id, \"pruned\", \"auto-pruner\", `Transient memory past ${cfg.transient_retention_days}d retention`);\n }\n result.transient_pruned.push(mem.id);\n }\n }\n\n // 4. Demote unhealthy active memories\n const activeMemories = queryMemories(db, {\n repo: cfg.repo,\n status: \"active\",\n });\n for (const mem of activeMemories) {\n const health = computeHealthScore(db, mem.id);\n if (health && health.score < cfg.min_health_score) {\n if (!cfg.dry_run) {\n db.update(memories)\n .set({ status: \"candidate\", updated_at: new Date().toISOString() })\n .where(eq(memories.id, mem.id))\n .run();\n queueMemoryEmbeddingSync(db, mem.id);\n recordAudit(\n db,\n mem.id,\n \"demoted\",\n \"auto-pruner\",\n `Health score ${health.score.toFixed(2)} below threshold ${cfg.min_health_score}`,\n );\n }\n result.unhealthy_demoted.push(mem.id);\n }\n }\n\n result.total =\n result.stale_rejected.length +\n result.rejected_pruned.length +\n result.transient_pruned.length +\n result.unhealthy_demoted.length;\n\n return result;\n}\n\n// --- Format prune report ---\n\nexport function formatPruneReport(result: PruneResult, dryRun: boolean): string {\n const prefix = dryRun ? \"[DRY RUN] \" : \"\";\n const lines = [\n `${prefix}Prune Report`,\n ``,\n `Stale rejected: ${result.stale_rejected.length}`,\n `Rejected pruned: ${result.rejected_pruned.length}`,\n `Transient pruned: ${result.transient_pruned.length}`,\n `Unhealthy demoted: ${result.unhealthy_demoted.length}`,\n `Total affected: ${result.total}`,\n ];\n\n if (result.stale_rejected.length > 0) {\n lines.push(\"\", \"Stale Rejected:\");\n for (const id of result.stale_rejected.slice(0, 10)) {\n lines.push(` ${id.slice(0, 8)}`);\n }\n }\n\n if (result.unhealthy_demoted.length > 0) {\n lines.push(\"\", \"Unhealthy:\");\n for (const id of result.unhealthy_demoted.slice(0, 10)) {\n lines.push(` ${id.slice(0, 8)}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n","import { and, desc, eq, gte } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { activityEvents } from \"../db/schema.js\";\nimport { activityEventDedupeKey } from \"./dedupe.js\";\nimport type {\n ActivityEvent,\n ActivityEventQuery,\n ActivityEventType,\n ActivitySource,\n} from \"../types.js\";\n\ntype ActivityRow = typeof activityEvents.$inferSelect;\n\nexport interface CreateActivityEventInput {\n session_id?: string | null;\n repo?: string | null;\n path?: string | null;\n source: ActivitySource;\n event_type: ActivityEventType;\n memory_ids?: string[];\n request?: Record<string, unknown>;\n result?: Record<string, unknown>;\n}\n\nexport function createActivityEvent(\n db: RecallDb,\n input: CreateActivityEventInput,\n): string {\n const dedupeKey = activityEventDedupeKey(input);\n\n if (dedupeKey) {\n const existingId = findActivityEventByDedupeKey(db, dedupeKey);\n if (existingId) return existingId;\n } else {\n const fuzzyId = findRecentDuplicateActivityEvent(db, input);\n if (fuzzyId) return fuzzyId;\n }\n\n const id = randomUUID();\n const result = db.insert(activityEvents)\n .values({\n id,\n session_id: input.session_id ?? null,\n repo: input.repo ?? null,\n path: input.path ?? null,\n source: input.source,\n event_type: input.event_type,\n memory_ids: input.memory_ids ?? [],\n dedupe_key: dedupeKey,\n request: input.request ?? {},\n result: input.result ?? {},\n created_at: new Date().toISOString(),\n })\n .onConflictDoNothing({ target: activityEvents.dedupe_key })\n .run();\n\n if (Number(result.changes ?? 0) === 0 && dedupeKey) {\n const existingId = findActivityEventByDedupeKey(db, dedupeKey);\n if (existingId) return existingId;\n }\n return id;\n}\n\nfunction findActivityEventByDedupeKey(\n db: RecallDb,\n dedupeKey: string,\n): string | null {\n const row = db\n .select({ id: activityEvents.id })\n .from(activityEvents)\n .where(eq(activityEvents.dedupe_key, dedupeKey))\n .get();\n return row?.id ?? null;\n}\n\nfunction findRecentDuplicateActivityEvent(\n db: RecallDb,\n input: CreateActivityEventInput,\n): string | null {\n if (!input.session_id) return null;\n\n const since = new Date(Date.now() - 2_000).toISOString();\n const rows = db.select().from(activityEvents)\n .where(and(\n eq(activityEvents.session_id, input.session_id),\n eq(activityEvents.source, input.source),\n eq(activityEvents.event_type, input.event_type),\n gte(activityEvents.created_at, since),\n ))\n .all();\n\n const requestKey = JSON.stringify(input.request ?? {});\n const resultKey = JSON.stringify(input.result ?? {});\n const repo = input.repo ?? null;\n const path = input.path ?? null;\n\n for (const row of rows) {\n if (row.repo !== repo || row.path !== path) continue;\n const request =\n typeof row.request === \"string\"\n ? JSON.parse(row.request)\n : row.request ?? {};\n const result =\n typeof row.result === \"string\"\n ? JSON.parse(row.result)\n : row.result ?? {};\n if (\n JSON.stringify(request) === requestKey &&\n JSON.stringify(result) === resultKey\n ) {\n return row.id;\n }\n }\n\n return null;\n}\n\nexport function getActivityEvent(\n db: RecallDb,\n id: string,\n): ActivityEvent | undefined {\n const row = db.select().from(activityEvents).where(eq(activityEvents.id, id)).get();\n return row ? rowToActivityEvent(row) : undefined;\n}\n\nexport function listActivityEvents(\n db: RecallDb,\n query: ActivityEventQuery = {},\n): ActivityEvent[] {\n const conditions = [];\n\n if (query.repo) conditions.push(eq(activityEvents.repo, query.repo));\n if (query.session_id) conditions.push(eq(activityEvents.session_id, query.session_id));\n if (query.source) conditions.push(eq(activityEvents.source, query.source));\n if (query.event_type) conditions.push(eq(activityEvents.event_type, query.event_type));\n if (query.since) conditions.push(gte(activityEvents.created_at, query.since));\n\n const base = db.select().from(activityEvents);\n const rows = conditions.length > 0\n ? base.where(and(...conditions)).orderBy(desc(activityEvents.created_at)).all()\n : base.orderBy(desc(activityEvents.created_at)).all();\n\n const limited = query.limit ? rows.slice(0, query.limit) : rows;\n return limited.map(rowToActivityEvent);\n}\n\nexport function listActivitySessions(\n db: RecallDb,\n query: Omit<ActivityEventQuery, \"session_id\"> & { limit?: number } = {},\n): Array<{\n session_id: string;\n repo: string | null;\n event_count: number;\n event_types: ActivityEventType[];\n first_at: string;\n last_at: string;\n}> {\n const events = listActivityEvents(db, query).filter((event) => event.session_id);\n const grouped = new Map<string, ActivityEvent[]>();\n\n for (const event of events) {\n const sessionId = event.session_id!;\n const bucket = grouped.get(sessionId) ?? [];\n bucket.push(event);\n grouped.set(sessionId, bucket);\n }\n\n const sessions = [...grouped.entries()].map(([session_id, items]) => {\n const sorted = [...items].sort((a, b) => a.created_at.localeCompare(b.created_at));\n return {\n session_id,\n repo: sorted[0]?.repo ?? null,\n event_count: items.length,\n event_types: [...new Set(items.map((item) => item.event_type))],\n first_at: sorted[0]!.created_at,\n last_at: sorted[sorted.length - 1]!.created_at,\n };\n });\n\n sessions.sort((a, b) => b.last_at.localeCompare(a.last_at));\n return query.limit ? sessions.slice(0, query.limit) : sessions;\n}\n\nfunction rowToActivityEvent(row: ActivityRow): ActivityEvent {\n const memory_ids =\n typeof row.memory_ids === \"string\"\n ? JSON.parse(row.memory_ids)\n : Array.isArray(row.memory_ids)\n ? row.memory_ids\n : [];\n const request =\n typeof row.request === \"string\"\n ? JSON.parse(row.request)\n : row.request ?? {};\n const result =\n typeof row.result === \"string\"\n ? JSON.parse(row.result)\n : row.result ?? {};\n\n return {\n id: row.id,\n session_id: row.session_id,\n repo: row.repo,\n path: row.path,\n source: row.source,\n event_type: row.event_type,\n memory_ids,\n request: request as Record<string, unknown>,\n result: result as Record<string, unknown>,\n created_at: row.created_at,\n };\n}\n","import type { RecallDb } from \"../db/client.js\";\nimport { createActivityEvent } from \"../models/activity.js\";\nimport { ensureRepoBootstrapped, inferRepoSlugFromPath } from \"../repo/discovery.js\";\nimport { writeRepoContextArtifact } from \"../artifacts/context.js\";\nimport type { ActivitySource } from \"../types.js\";\nimport { tagActivitySource } from \"../types.js\";\n\nexport interface SessionLifecycleInput {\n session_id: string;\n client?: string | null;\n repo?: string | null;\n repo_path?: string | null;\n path?: string | null;\n meta?: Record<string, unknown>;\n source?: ActivitySource;\n}\n\nfunction resolveLifecycleSource(input: SessionLifecycleInput): ActivitySource {\n if (input.source) return input.source;\n return input.client ? tagActivitySource(\"hook\", input.client) : \"daemon\";\n}\n\nexport interface SessionLifecycleResult {\n session_id: string;\n repo: string | null;\n repo_path: string | null;\n bootstrap_status:\n | \"skipped\"\n | \"already_known\"\n | \"bootstrapped\"\n | \"scanned_empty\"\n | \"unresolved\";\n created_ids: string[];\n}\n\nexport function startSessionLifecycle(\n db: RecallDb,\n input: SessionLifecycleInput,\n): SessionLifecycleResult {\n const repo = input.repo ?? inferRepoSlugFromPath(input.repo_path) ?? null;\n const bootstrap = ensureRepoBootstrapped(db, {\n repo,\n repoPathHint: input.repo_path,\n });\n\n if (bootstrap.status === \"bootstrapped\" || bootstrap.status === \"scanned_empty\") {\n createActivityEvent(db, {\n session_id: input.session_id,\n repo: bootstrap.repo,\n path: input.path ?? null,\n source: resolveLifecycleSource(input),\n event_type: \"scan\",\n memory_ids: bootstrap.created_ids,\n request: {\n repo_path: bootstrap.repo_path,\n client: input.client ?? null,\n trigger: \"session_start_bootstrap\",\n },\n result: {\n created: bootstrap.created_ids.length,\n status: bootstrap.status,\n },\n });\n }\n\n const artifact = writeRepoContextArtifact(db, {\n repo: bootstrap.repo,\n repo_path: bootstrap.repo_path ?? input.repo_path ?? null,\n });\n\n createActivityEvent(db, {\n session_id: input.session_id,\n repo: bootstrap.repo,\n path: input.path ?? null,\n source: resolveLifecycleSource(input),\n event_type: \"session_start\",\n request: {\n client: input.client ?? null,\n repo_path: bootstrap.repo_path ?? input.repo_path ?? null,\n meta: input.meta ?? {},\n },\n result: {\n bootstrap_status: bootstrap.status,\n created: bootstrap.created_ids.length,\n artifact_path: artifact.output_path,\n artifact_written: artifact.written,\n },\n });\n\n return {\n session_id: input.session_id,\n repo: bootstrap.repo,\n repo_path: bootstrap.repo_path ?? input.repo_path ?? null,\n bootstrap_status: bootstrap.status,\n created_ids: bootstrap.created_ids,\n };\n}\n\nexport function recordSessionLifecycleEvent(\n db: RecallDb,\n input: SessionLifecycleInput & {\n name: string;\n payload?: Record<string, unknown>;\n },\n): SessionLifecycleResult {\n const repo = input.repo ?? inferRepoSlugFromPath(input.repo_path) ?? null;\n\n createActivityEvent(db, {\n session_id: input.session_id,\n repo,\n path: input.path ?? null,\n source: resolveLifecycleSource(input),\n event_type: \"session_event\",\n request: {\n client: input.client ?? null,\n name: input.name,\n repo_path: input.repo_path ?? null,\n meta: input.meta ?? {},\n },\n result: input.payload ?? {},\n });\n\n return {\n session_id: input.session_id,\n repo,\n repo_path: input.repo_path ?? null,\n bootstrap_status: \"skipped\",\n created_ids: [],\n };\n}\n\nexport function endSessionLifecycle(\n db: RecallDb,\n input: SessionLifecycleInput & {\n payload?: Record<string, unknown>;\n },\n): SessionLifecycleResult {\n const repo = input.repo ?? inferRepoSlugFromPath(input.repo_path) ?? null;\n\n createActivityEvent(db, {\n session_id: input.session_id,\n repo,\n path: input.path ?? null,\n source: resolveLifecycleSource(input),\n event_type: \"session_end\",\n request: {\n client: input.client ?? null,\n repo_path: input.repo_path ?? null,\n meta: input.meta ?? {},\n },\n result: input.payload ?? {},\n });\n\n return {\n session_id: input.session_id,\n repo,\n repo_path: input.repo_path ?? null,\n bootstrap_status: \"skipped\",\n created_ids: [],\n };\n}\n","import type { RecallDb } from \"../db/client.js\";\nimport { processCorrection } from \"../capture/correction.js\";\nimport { recordFeedback, getMemory } from \"../models/memory.js\";\nimport { createActivityEvent } from \"../models/activity.js\";\nimport { endSessionLifecycle } from \"../session/lifecycle.js\";\nimport type { ActivitySource, FeedbackOutcome } from \"../types.js\";\nimport type { RecentToolCall } from \"../agents/types.js\";\nimport { resolveMemoryInjectionOutcome } from \"../models/memory-injections.js\";\n\nexport interface CaptureCorrectionInput {\n text: string;\n repo?: string;\n path?: string;\n session_id?: string;\n agent?: string;\n prev_assistant_turn?: string;\n recent_tool_calls?: readonly RecentToolCall[];\n}\n\nexport interface CaptureCorrectionResult {\n ids: string[];\n session_id: string;\n}\n\nexport interface SignalOutcomeInput {\n memory_id: string;\n session_id: string;\n injected?: boolean;\n outcome: FeedbackOutcome;\n context?: string;\n}\n\nexport interface SignalOutcomeResult {\n feedback_id: string;\n}\n\nexport interface SessionEndInput {\n session_id: string;\n repo?: string;\n repo_path?: string;\n path?: string;\n agent?: string;\n turn_count?: number;\n}\n\nexport interface SessionEndResult {\n session_id: string;\n repo: string | null;\n}\n\nexport async function captureCorrectionFallback(\n db: RecallDb,\n input: CaptureCorrectionInput,\n source: ActivitySource,\n): Promise<CaptureCorrectionResult> {\n const sessionId = input.session_id ?? `${source}-capture`;\n const ids = await processCorrection(db, input.text, {\n sessionId,\n repo: input.repo,\n path: input.path,\n agent: input.agent,\n prev_assistant_turn: input.prev_assistant_turn,\n recent_tool_calls: input.recent_tool_calls,\n });\n\n createActivityEvent(db, {\n session_id: sessionId,\n repo: input.repo ?? null,\n path: input.path ?? null,\n source,\n event_type: \"correction\",\n memory_ids: ids,\n request: {\n agent: input.agent ?? null,\n prev_assistant_turn: input.prev_assistant_turn ?? null,\n recent_tool_calls: normalizeRecentToolCalls(input.recent_tool_calls),\n text: input.text,\n },\n result: {\n created: ids,\n created_count: ids.length,\n },\n });\n\n return {\n ids,\n session_id: sessionId,\n };\n}\n\nexport function signalOutcomeFallback(\n db: RecallDb,\n input: SignalOutcomeInput,\n source: ActivitySource,\n): SignalOutcomeResult {\n const feedbackId = recordFeedback(\n db,\n input.memory_id,\n input.session_id,\n input.injected ?? true,\n input.outcome,\n );\n resolveMemoryInjectionOutcome(db, input.memory_id, input.session_id, input.outcome);\n const memory = getMemory(db, input.memory_id);\n\n createActivityEvent(db, {\n session_id: input.session_id,\n repo: memory?.repo ?? null,\n path: memory?.path_scope ?? null,\n source,\n event_type: \"feedback\",\n memory_ids: [input.memory_id],\n request: {\n context: input.context ?? null,\n injected: input.injected ?? true,\n outcome: input.outcome,\n },\n result: {\n feedback_id: feedbackId,\n },\n });\n\n return {\n feedback_id: feedbackId,\n };\n}\n\nexport function sessionEndFallback(\n db: RecallDb,\n input: SessionEndInput,\n): SessionEndResult {\n const result = endSessionLifecycle(db, {\n session_id: input.session_id,\n client: input.agent ?? \"mcp\",\n repo: input.repo ?? null,\n repo_path: input.repo_path ?? null,\n path: input.path ?? null,\n payload: {\n ended_at: new Date().toISOString(),\n turn_count: input.turn_count ?? null,\n },\n });\n\n return {\n session_id: result.session_id,\n repo: result.repo,\n };\n}\n\nfunction normalizeRecentToolCalls(\n toolCalls: readonly RecentToolCall[] | undefined,\n): RecentToolCall[] {\n if (!toolCalls) return [];\n return toolCalls.map((toolCall) => ({\n name: toolCall.name,\n path: toolCall.path,\n input_summary: toolCall.input_summary,\n exit_code: toolCall.exit_code,\n }));\n}\n"],"mappings":"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","names":["version","existsSync","join","join","existsSync","eq","eq","now","eq","eq","eq","eq","getSqlite","eq","rowToHistorySnippet","now","rowToHistorySnippet","and","eq","randomUUID","randomUUID","eq","and","eq","randomUUID","randomUUID","eq","memories","existsSync","join","extractRepoSlugFromRemote","extractRepoSlugFromRemote","existsSync","join","existsSync","mkdirSync","readFileSync","join","execFileSync","join","mkdirSync","existsSync","readFileSync","execFileSync","eq","and","randomUUID","randomUUID","eq","eq","and","maintenance","readFileSync","readFileSync","eq","randomUUID","execSync","randomUUID","eq","execSync","eq","and","randomUUID","randomUUID","now","eq","randomUUID","now","eq","and","eq","DEFAULT_CONFIG","now","eq","and","desc","eq","gte","randomUUID","randomUUID","eq","and","gte","eq","gte","and","desc"]}
|
|
1
|
+
{"version":3,"sources":["../src/db/client.ts","../src/scanner/repo.ts","../src/scanner/signal.ts","../src/history/snippets.ts","../src/history/retrieval.ts","../src/vector/sqlite-vec-history.ts","../src/vector/sqlite-fts-history.ts","../src/models/memory-injections.ts","../src/models/history-injections.ts","../src/compiler/context.ts","../src/adapters/markdown.ts","../src/repo/discovery.ts","../src/artifacts/context.ts","../src/eval/harness.ts","../src/eval/retrieval.ts","../src/feedback/implicit.ts","../src/policy/engine.ts","../src/pruning/pruner.ts","../src/models/activity.ts","../src/session/lifecycle.ts","../src/mcp/fallback.ts"],"sourcesContent":["import Database from \"better-sqlite3\";\nimport { drizzle } from \"drizzle-orm/better-sqlite3\";\nimport { migrate } from \"drizzle-orm/better-sqlite3/migrator\";\nimport * as schema from \"./schema.js\";\nimport { join, dirname } from \"node:path\";\nimport { mkdirSync, existsSync, rmSync, statSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { getEmbeddingCacheRoot } from \"../embeddings/cache.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nexport const RECALL_DB_USER_VERSION = 9;\n\nexport function getDbPath(): string {\n const dataDir =\n process.env.RECALL_DATA_DIR ??\n join(\n process.env.HOME ?? process.env.USERPROFILE ?? \".\",\n \".recall\",\n );\n mkdirSync(dataDir, { recursive: true });\n return join(dataDir, \"recall.db\");\n}\n\nfunction getMigrationsPath(): string {\n // Walk up from __dirname until we find drizzle/meta/_journal.json\n let dir = __dirname;\n for (let i = 0; i < 5; i++) {\n const candidate = join(dir, \"drizzle\");\n if (existsSync(join(candidate, \"meta\", \"_journal.json\"))) {\n return candidate;\n }\n dir = dirname(dir);\n }\n // Fallback: relative to __dirname (works in bundled dist/)\n return join(__dirname, \"..\", \"drizzle\");\n}\n\nlet _sqlite: Database.Database | null = null;\nlet _db: ReturnType<typeof makeDb> | null = null;\nlet _dbPath: string | null = null;\n\nfunction makeDb(sqlite: Database.Database) {\n return drizzle(sqlite, { schema });\n}\n\nconst STARTUP_WAL_TRUNCATE_BYTES = (() => {\n const raw = process.env.RECALL_SQLITE_STARTUP_WAL_TRUNCATE_BYTES;\n const parsed = raw ? parseInt(raw, 10) : 32 * 1024 * 1024;\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;\n})();\n\nfunction applyPragmas(sqlite: Database.Database) {\n sqlite.pragma(\"journal_mode = WAL\");\n sqlite.pragma(\"foreign_keys = ON\");\n truncateWalIfLarge(sqlite);\n}\n\nfunction truncateWalIfLarge(sqlite: Database.Database) {\n if (STARTUP_WAL_TRUNCATE_BYTES <= 0) return;\n try {\n const walPath = `${sqlite.name}-wal`;\n if (!existsSync(walPath)) return;\n if (statSync(walPath).size < STARTUP_WAL_TRUNCATE_BYTES) return;\n sqlite.pragma(\"wal_checkpoint(TRUNCATE)\");\n } catch {\n // best-effort: never block db open\n }\n}\n\nfunction setDbUserVersion(sqlite: Database.Database, version = RECALL_DB_USER_VERSION) {\n sqlite.pragma(`user_version = ${version}`);\n}\n\nexport type RecallDb = ReturnType<typeof makeDb>;\n\nexport function getDb(dbPath?: string): RecallDb {\n if (!_db) {\n const path = dbPath ?? getDbPath();\n _sqlite = new Database(path);\n applyPragmas(_sqlite);\n _db = makeDb(_sqlite);\n _dbPath = path;\n }\n return _db;\n}\n\n/** Create a standalone DB instance (useful for tests). */\nexport function createStandaloneDb(dbPath: string): { db: RecallDb; sqlite: Database.Database } {\n const sqlite = new Database(dbPath);\n applyPragmas(sqlite);\n const db = makeDb(sqlite);\n return { db, sqlite };\n}\n\nexport function initDb(dbPath?: string): RecallDb {\n const db = getDb(dbPath);\n migrate(db, { migrationsFolder: getMigrationsPath() });\n setDbUserVersion(db.$client);\n return db;\n}\n\n/** Init a standalone DB (for tests — no module-level singleton). */\nexport function initStandaloneDb(dbPath: string): RecallDb {\n const { db, sqlite } = createStandaloneDb(dbPath);\n migrate(db, { migrationsFolder: getMigrationsPath() });\n setDbUserVersion(sqlite);\n return db;\n}\n\nexport function closeDb() {\n if (_sqlite) {\n _sqlite.close();\n }\n _sqlite = null;\n _db = null;\n _dbPath = null;\n}\n\nexport function getDbUserVersion(dbPath?: string): number {\n const path = dbPath ?? getDbPath();\n if (!existsSync(path)) return 0;\n\n const sqlite = new Database(path, { readonly: true, fileMustExist: true });\n try {\n return Number(sqlite.pragma(\"user_version\", { simple: true }) ?? 0);\n } finally {\n sqlite.close();\n }\n}\n\nexport function resetDb(\n dbPath?: string,\n options: { purgeModels?: boolean } = {},\n) {\n const path = dbPath ?? getDbPath();\n\n if (_dbPath === path) {\n closeDb();\n }\n\n for (const suffix of [\"\", \"-shm\", \"-wal\"]) {\n const candidate = `${path}${suffix}`;\n if (existsSync(candidate)) {\n rmSync(candidate, { force: true });\n }\n }\n\n if (options.purgeModels) {\n rmSync(getEmbeddingCacheRoot(), { recursive: true, force: true });\n }\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport { join, basename } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport { eq } from \"drizzle-orm\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { memories } from \"../db/schema.js\";\nimport { queueMemoryEmbeddingSync } from \"../embeddings/embeddings.js\";\nimport { createMemory, queryMemories, statusFromConfidence, type CreateMemoryInput } from \"../models/memory.js\";\nimport { getRepoQualityProfile, seedScannedConfidence } from \"../repo/quality.js\";\nimport { evaluateScannedMemory } from \"./signal.js\";\n\ninterface ScanResult {\n candidates: CreateMemoryInput[];\n repo: string;\n}\n\nexport function scanRepo(repoPath: string): ScanResult {\n const repoName = inferRepoName(repoPath);\n const candidates: CreateMemoryInput[] = [];\n\n // Package.json scripts\n candidates.push(...scanPackageJson(repoPath, repoName));\n\n // Makefile targets\n candidates.push(...scanMakefile(repoPath, repoName));\n\n // CI config\n candidates.push(...scanCIConfig(repoPath, repoName));\n\n // Existing instruction files\n candidates.push(...scanInstructionFiles(repoPath, repoName));\n\n // Linter/formatter configs\n candidates.push(...scanLinterConfigs(repoPath, repoName));\n\n // README setup sections\n candidates.push(...scanReadme(repoPath, repoName));\n\n // Python project\n candidates.push(...scanPythonProject(repoPath, repoName));\n\n return { candidates, repo: repoName };\n}\n\nexport function scanAndStore(db: RecallDb, repoPath: string): string[] {\n const { candidates, repo } = scanRepo(repoPath);\n const profile = getRepoQualityProfile(db, repo);\n const existing = queryMemories(db, { repo })\n .filter((mem) => mem.status !== \"rejected\");\n const ids: string[] = [];\n\n for (const candidate of candidates) {\n const evaluated = evaluateScannedMemory({\n text: candidate.text,\n type: candidate.type,\n source: candidate.source,\n confidence: seedScannedConfidence(\n candidate.confidence ?? 0.5,\n profile,\n ),\n });\n if (evaluated.action === \"reject\") {\n continue;\n }\n\n const seededConfidence = evaluated.confidence;\n const normalizedCandidate = {\n ...candidate,\n text: evaluated.text,\n };\n const duplicate = existing.find((mem) =>\n mem.type === normalizedCandidate.type &&\n mem.source === normalizedCandidate.source &&\n mem.text === normalizedCandidate.text\n );\n if (duplicate) {\n if (duplicate.confidence < seededConfidence) {\n db.update(memories)\n .set({\n confidence: seededConfidence,\n status: statusFromConfidence(seededConfidence),\n text: normalizedCandidate.text,\n updated_at: new Date().toISOString(),\n })\n .where(eq(memories.id, duplicate.id))\n .run();\n queueMemoryEmbeddingSync(db, duplicate.id);\n }\n ids.push(duplicate.id);\n continue;\n }\n\n normalizedCandidate.confidence = seededConfidence;\n const id = createMemory(db, normalizedCandidate);\n ids.push(id);\n existing.push({\n ...queryMemories(db, { repo }).find((mem) => mem.id === id)!,\n confidence: seededConfidence,\n status: statusFromConfidence(seededConfidence),\n });\n }\n\n return ids;\n}\n\n// --- Scanners ---\n\nfunction scanPackageJson(\n repoPath: string,\n repo: string,\n): CreateMemoryInput[] {\n const pkgPath = join(repoPath, \"package.json\");\n if (!existsSync(pkgPath)) return [];\n\n const results: CreateMemoryInput[] = [];\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n\n // Package manager detection\n if (pkg.packageManager) {\n const pm = pkg.packageManager.split(\"@\")[0];\n results.push(makeCommand(\n `Use ${pm} as the package manager (lockfile: ${pm === \"pnpm\" ? \"pnpm-lock.yaml\" : pm === \"yarn\" ? \"yarn.lock\" : \"package-lock.json\"})`,\n repo,\n \"package.json\",\n ));\n } else if (existsSync(join(repoPath, \"pnpm-lock.yaml\"))) {\n results.push(makeCommand(\"Use pnpm as the package manager\", repo, \"package.json\"));\n } else if (existsSync(join(repoPath, \"yarn.lock\"))) {\n results.push(makeCommand(\"Use yarn as the package manager\", repo, \"package.json\"));\n } else if (existsSync(join(repoPath, \"bun.lockb\")) || existsSync(join(repoPath, \"bun.lock\"))) {\n results.push(makeCommand(\"Use bun as the package manager\", repo, \"package.json\"));\n }\n\n // Key scripts\n const scripts = pkg.scripts ?? {};\n const importantScripts = [\"test\", \"build\", \"lint\", \"dev\", \"start\", \"typecheck\", \"check\"];\n for (const name of importantScripts) {\n if (scripts[name]) {\n results.push({\n type: \"command\",\n text: `${name}: \\`${scripts[name]}\\``,\n scope: \"repo\",\n repo,\n source: \"config_parse\",\n confidence: 0.65,\n evidence: [\n { type: \"repo_scan\", file: \"package.json\", timestamp: now() },\n ],\n });\n }\n }\n\n // Framework detection\n const allDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n if (allDeps.next) results.push(makeGotcha(\"Next.js project\", repo, \"package.json\"));\n if (allDeps.react && !allDeps.next) results.push(makeGotcha(\"React project (no Next.js)\", repo, \"package.json\"));\n if (allDeps.vue) results.push(makeGotcha(\"Vue.js project\", repo, \"package.json\"));\n if (allDeps.svelte) results.push(makeGotcha(\"Svelte project\", repo, \"package.json\"));\n if (allDeps.express || allDeps.fastify || allDeps.hono)\n results.push(makeGotcha(`Server framework: ${allDeps.express ? \"Express\" : allDeps.fastify ? \"Fastify\" : \"Hono\"}`, repo, \"package.json\"));\n\n } catch {\n // bad JSON, skip\n }\n\n return results;\n}\n\nfunction scanMakefile(\n repoPath: string,\n repo: string,\n): CreateMemoryInput[] {\n const mkPath = join(repoPath, \"Makefile\");\n if (!existsSync(mkPath)) return [];\n\n const results: CreateMemoryInput[] = [];\n try {\n const content = readFileSync(mkPath, \"utf-8\");\n const targets = content.match(/^([a-zA-Z_-]+):/gm);\n if (targets) {\n const key = targets\n .map((t) => t.replace(\":\", \"\"))\n .filter((t) =>\n [\"test\", \"build\", \"lint\", \"dev\", \"run\", \"deploy\", \"install\", \"setup\", \"clean\"].includes(t),\n );\n if (key.length > 0) {\n results.push({\n type: \"command\",\n text: `Makefile targets: ${key.map((t) => `\\`make ${t}\\``).join(\", \")}`,\n scope: \"repo\",\n repo,\n source: \"config_parse\",\n confidence: 0.65,\n evidence: [{ type: \"repo_scan\", file: \"Makefile\", timestamp: now() }],\n });\n }\n }\n } catch {}\n\n return results;\n}\n\nfunction scanCIConfig(\n repoPath: string,\n repo: string,\n): CreateMemoryInput[] {\n const results: CreateMemoryInput[] = [];\n\n // GitHub Actions\n const ghDir = join(repoPath, \".github\", \"workflows\");\n if (existsSync(ghDir)) {\n results.push({\n type: \"gotcha\",\n text: \"CI: GitHub Actions (check .github/workflows/ for pipeline config)\",\n scope: \"repo\",\n repo,\n source: \"repo_scan\",\n confidence: 0.6,\n evidence: [{ type: \"repo_scan\", file: \".github/workflows/\", timestamp: now() }],\n });\n }\n\n // GitLab CI\n if (existsSync(join(repoPath, \".gitlab-ci.yml\"))) {\n results.push(makeGotcha(\"CI: GitLab CI\", repo, \".gitlab-ci.yml\"));\n }\n\n return results;\n}\n\nfunction scanInstructionFiles(\n repoPath: string,\n repo: string,\n): CreateMemoryInput[] {\n const results: CreateMemoryInput[] = [];\n const instructionFiles = [\n \"CLAUDE.md\",\n \"AGENTS.md\",\n \".github/copilot-instructions.md\",\n \".cursorrules\",\n ];\n\n for (const file of instructionFiles) {\n const fPath = join(repoPath, file);\n if (!existsSync(fPath)) continue;\n\n try {\n const content = readFileSync(fPath, \"utf-8\");\n // Extract key rules (lines with \"always\", \"never\", \"must\", \"don't\")\n const rules = content\n .split(\"\\n\")\n .filter((line) =>\n /\\b(always|never|must|don't|do not|required|forbidden)\\b/i.test(line),\n )\n .map((l) => l.replace(/^[-*#>\\s]+/, \"\").trim())\n .filter((l) => l.length > 10 && l.length < 200);\n\n for (const rule of rules.slice(0, 5)) {\n results.push({\n type: \"rule\",\n text: rule,\n scope: \"repo\",\n repo,\n source: \"repo_scan\",\n confidence: 0.7, // high — explicit instruction files\n evidence: [{ type: \"repo_scan\", file, timestamp: now() }],\n });\n }\n } catch {}\n }\n\n return results;\n}\n\nfunction scanLinterConfigs(\n repoPath: string,\n repo: string,\n): CreateMemoryInput[] {\n const results: CreateMemoryInput[] = [];\n\n const configs: [string, string][] = [\n [\".eslintrc.json\", \"ESLint\"],\n [\".eslintrc.js\", \"ESLint\"],\n [\".eslintrc.cjs\", \"ESLint\"],\n [\"eslint.config.js\", \"ESLint (flat config)\"],\n [\"eslint.config.mjs\", \"ESLint (flat config)\"],\n [\".prettierrc\", \"Prettier\"],\n [\"prettier.config.js\", \"Prettier\"],\n [\"biome.json\", \"Biome\"],\n [\"biome.jsonc\", \"Biome\"],\n [\".rustfmt.toml\", \"rustfmt\"],\n [\"ruff.toml\", \"Ruff\"],\n [\"pyproject.toml\", \"Python project (pyproject.toml)\"],\n ];\n\n const found: string[] = [];\n for (const [file, name] of configs) {\n if (existsSync(join(repoPath, file))) {\n found.push(name);\n }\n }\n\n if (found.length > 0) {\n results.push({\n type: \"rule\",\n text: `Linting/formatting: ${[...new Set(found)].join(\", \")}`,\n scope: \"repo\",\n repo,\n source: \"config_parse\",\n confidence: 0.65,\n evidence: [{ type: \"repo_scan\", file: \"config files\", timestamp: now() }],\n });\n }\n\n return results;\n}\n\nfunction scanReadme(\n repoPath: string,\n repo: string,\n): CreateMemoryInput[] {\n const results: CreateMemoryInput[] = [];\n const readmePath = join(repoPath, \"README.md\");\n if (!existsSync(readmePath)) return [];\n\n try {\n const content = readFileSync(readmePath, \"utf-8\");\n\n // Look for setup/install/getting-started sections\n const setupMatch = content.match(\n /^##\\s*(setup|install|getting.started|quick.start|development)\\s*\\n([\\s\\S]*?)(?=^##\\s|\\z)/im,\n );\n\n if (setupMatch) {\n // Extract code blocks from setup section\n const codeBlocks = setupMatch[2].match(/```(?:sh|bash|shell|zsh)?\\n([\\s\\S]*?)```/g);\n if (codeBlocks && codeBlocks.length > 0) {\n const commands = codeBlocks\n .map((b) => b.replace(/```(?:sh|bash|shell|zsh)?\\n?/, \"\").replace(/```$/, \"\").trim())\n .join(\"\\n\");\n\n if (commands.length < 500) {\n results.push({\n type: \"command\",\n text: `Setup commands from README:\\n${commands}`,\n scope: \"repo\",\n repo,\n source: \"repo_scan\",\n confidence: 0.5,\n evidence: [{ type: \"repo_scan\", file: \"README.md\", timestamp: now() }],\n });\n }\n }\n }\n } catch {}\n\n return results;\n}\n\nfunction scanPythonProject(\n repoPath: string,\n repo: string,\n): CreateMemoryInput[] {\n const results: CreateMemoryInput[] = [];\n\n if (existsSync(join(repoPath, \"pyproject.toml\"))) {\n // Check for uv\n if (existsSync(join(repoPath, \"uv.lock\"))) {\n results.push(makeCommand(\"Use `uv` for Python dependency management\", repo, \"uv.lock\"));\n } else if (existsSync(join(repoPath, \"poetry.lock\"))) {\n results.push(makeCommand(\"Use `poetry` for Python dependency management\", repo, \"poetry.lock\"));\n }\n\n // Check for alembic\n if (existsSync(join(repoPath, \"alembic.ini\")) || existsSync(join(repoPath, \"alembic\"))) {\n results.push(makeGotcha(\"Uses Alembic for database migrations\", repo, \"alembic.ini\"));\n }\n }\n\n return results;\n}\n\n// --- Helpers ---\n\nfunction now(): string {\n return new Date().toISOString();\n}\n\nfunction inferRepoName(repoPath: string): string {\n try {\n const remote = execSync(\"git remote get-url origin\", {\n cwd: repoPath,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n const repo = extractRepoSlugFromRemote(remote);\n if (repo) return repo;\n } catch {}\n return basename(repoPath);\n}\n\nfunction extractRepoSlugFromRemote(remote: string): string | null {\n const trimmed = remote.trim().replace(/\\.git$/, \"\");\n const parts = trimmed.split(/[:/]/).filter(Boolean);\n if (parts.length < 2) return null;\n return `${parts.at(-2)}/${parts.at(-1)}`;\n}\n\nfunction makeCommand(text: string, repo: string, file: string): CreateMemoryInput {\n return {\n type: \"command\",\n text,\n scope: \"repo\",\n repo,\n source: \"config_parse\",\n confidence: 0.65,\n evidence: [{ type: \"repo_scan\", file, timestamp: now() }],\n };\n}\n\nfunction makeGotcha(text: string, repo: string, file: string): CreateMemoryInput {\n return {\n type: \"gotcha\",\n text,\n scope: \"repo\",\n repo,\n source: \"repo_scan\",\n confidence: 0.6,\n evidence: [{ type: \"repo_scan\", file, timestamp: now() }],\n };\n}\n","import { CONFIDENCE, type MemorySource, type MemoryType } from \"../types.js\";\n\nexport interface ScannedMemoryLike {\n text: string;\n type: MemoryType;\n source: MemorySource;\n confidence: number;\n}\n\nexport interface EvaluatedScannedMemory {\n action: \"keep\" | \"reject\";\n text: string;\n confidence: number;\n reason?: string;\n}\n\nconst ACTIVE_COMMAND_PATTERNS = [\n /^use\\b/i,\n /^(test|build|lint|dev|start|typecheck|check):\\s*`.+`$/i,\n /^makefile targets:/i,\n];\n\nconst CANDIDATE_GOTCHA_PATTERNS = [\n /^next\\.js project$/i,\n /^react project\\b/i,\n /^vue\\.js project$/i,\n /^svelte project$/i,\n /^server framework:/i,\n /^uses alembic\\b/i,\n];\n\nconst ACTIONABLE_RULE_PATTERN = /\\b(always|never|must|don't|do not|required|prefer|avoid|use|keep|run|update|add|remove|check|only)\\b/i;\n\nexport function evaluateScannedMemory(\n input: ScannedMemoryLike,\n): EvaluatedScannedMemory {\n const normalized = normalizeScannedText(input.text);\n const lower = normalized.toLowerCase();\n\n if (!normalized || normalized.length < 12) {\n return reject(normalized, \"too_short\");\n }\n\n if (lower.startsWith(\"setup commands from readme:\")) {\n return reject(normalized, \"readme_setup_noise\");\n }\n\n if (lower === \"what we do not build\") {\n return reject(normalized, \"section_heading\");\n }\n\n if (/^ci:\\s*(github actions|gitlab ci)\\b/i.test(normalized)) {\n return reject(normalized, \"generic_ci\");\n }\n\n if (/^req-[a-z0-9-]+:/i.test(lower)) {\n return reject(normalized, \"spec_requirement\");\n }\n\n if (/^[A-Z][A-Za-z0-9 /_-]{1,80}:$/.test(normalized)) {\n return reject(normalized, \"heading\");\n }\n\n if (input.source === \"config_parse\" && lower.startsWith(\"linting/formatting: python project\")) {\n return reject(normalized, \"generic_tooling\");\n }\n\n if (input.source === \"config_parse\" && lower.startsWith(\"linting/formatting:\")) {\n return keep(normalized, toCandidateConfidence(input.confidence));\n }\n\n if (ACTIVE_COMMAND_PATTERNS.some((pattern) => pattern.test(normalized))) {\n return keep(normalized, Math.max(input.confidence, 0.62));\n }\n\n if (input.type === \"command\") {\n return keep(normalized, toCandidateConfidence(input.confidence));\n }\n\n if (input.type === \"gotcha\") {\n if (CANDIDATE_GOTCHA_PATTERNS.some((pattern) => pattern.test(normalized))) {\n return keep(normalized, toCandidateConfidence(input.confidence));\n }\n return reject(normalized, \"generic_gotcha\");\n }\n\n if (input.type === \"rule\") {\n if (!ACTIONABLE_RULE_PATTERN.test(normalized)) {\n return reject(normalized, \"non_actionable_rule\");\n }\n return keep(normalized, toCandidateConfidence(input.confidence));\n }\n\n return keep(normalized, toCandidateConfidence(input.confidence));\n}\n\nfunction normalizeScannedText(text: string): string {\n return text\n .replace(/\\*\\*/g, \"\")\n .split(\"\\n\")\n .map((line) => line.replace(/^[-*#>\\s]+/, \"\").replace(/^\\d+\\.\\s+/, \"\").trim())\n .filter(Boolean)\n .join(\"\\n\")\n .replace(/[ \\t]+/g, \" \")\n .trim();\n}\n\nfunction toCandidateConfidence(confidence: number): number {\n return clamp(confidence, CONFIDENCE.TRANSIENT_MAX + 0.05, CONFIDENCE.ACTIVE_MIN - 0.01);\n}\n\nfunction keep(text: string, confidence: number): EvaluatedScannedMemory {\n return { action: \"keep\", text, confidence: clamp(confidence) };\n}\n\nfunction reject(text: string, reason: string): EvaluatedScannedMemory {\n return { action: \"reject\", text, confidence: 0, reason };\n}\n\nfunction clamp(n: number, min = 0, max = 1): number {\n return Math.max(min, Math.min(max, n));\n}\n","import { desc, eq, and } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { historySnippets } from \"../db/schema.js\";\nimport { historySnippetDedupeKey } from \"../models/dedupe.js\";\nimport type { HistorySnippet, HistorySnippetKind } from \"../types.js\";\n\ntype HistorySnippetRow = typeof historySnippets.$inferSelect;\n\nexport interface CreateHistorySnippetInput {\n repo?: string | null;\n session_id?: string | null;\n kind: HistorySnippetKind;\n text: string;\n source_activity_ids?: string[];\n}\n\nexport function createHistorySnippet(\n db: RecallDb,\n input: CreateHistorySnippetInput,\n): string {\n const dedupeKey = historySnippetDedupeKey(input);\n const existing = db.select().from(historySnippets)\n .where(eq(historySnippets.dedupe_key, dedupeKey))\n .get();\n if (existing) return existing.id;\n\n const id = randomUUID();\n const now = new Date().toISOString();\n db.insert(historySnippets)\n .values({\n id,\n repo: input.repo ?? null,\n session_id: input.session_id ?? null,\n kind: input.kind,\n text: input.text,\n dedupe_key: dedupeKey,\n source_activity_ids: input.source_activity_ids ?? [],\n created_at: now,\n updated_at: now,\n })\n .run();\n return id;\n}\n\nexport function getHistorySnippet(\n db: RecallDb,\n id: string,\n): HistorySnippet | undefined {\n const row = db.select().from(historySnippets).where(eq(historySnippets.id, id)).get();\n return row ? rowToHistorySnippet(row) : undefined;\n}\n\nexport function listHistorySnippets(\n db: RecallDb,\n query: {\n repo?: string;\n session_id?: string;\n kind?: HistorySnippetKind;\n limit?: number;\n } = {},\n): HistorySnippet[] {\n const conditions = [];\n if (query.repo) conditions.push(eq(historySnippets.repo, query.repo));\n if (query.session_id) conditions.push(eq(historySnippets.session_id, query.session_id));\n if (query.kind) conditions.push(eq(historySnippets.kind, query.kind));\n\n let stmt = db.select().from(historySnippets).$dynamic();\n if (conditions.length > 0) {\n stmt = stmt.where(and(...conditions));\n }\n stmt = stmt.orderBy(desc(historySnippets.updated_at));\n if (query.limit != null) {\n stmt = stmt.limit(query.limit);\n }\n\n return stmt.all().map(rowToHistorySnippet);\n}\n\nexport function findHistorySnippetBySession(\n db: RecallDb,\n sessionId: string,\n kind: HistorySnippetKind = \"session_summary\",\n): HistorySnippet | undefined {\n const row = db.select().from(historySnippets)\n .where(and(\n eq(historySnippets.session_id, sessionId),\n eq(historySnippets.kind, kind),\n ))\n .get();\n return row ? rowToHistorySnippet(row) : undefined;\n}\n\nexport function findHistorySnippetByRepoKind(\n db: RecallDb,\n repo: string,\n kind: HistorySnippetKind,\n): HistorySnippet | undefined {\n const row = db.select().from(historySnippets)\n .where(and(\n eq(historySnippets.repo, repo),\n eq(historySnippets.kind, kind),\n ))\n .get();\n return row ? rowToHistorySnippet(row) : undefined;\n}\n\nexport function updateHistorySnippet(\n db: RecallDb,\n id: string,\n updates: Partial<Pick<HistorySnippet, \"text\">> & {\n source_activity_ids?: string[];\n },\n) {\n const current = getHistorySnippet(db, id);\n if (!current) return;\n const nextText = updates.text ?? current.text;\n const dedupeKey = historySnippetDedupeKey({\n repo: current.repo,\n session_id: current.session_id,\n kind: current.kind,\n text: nextText,\n });\n const collision = db.select().from(historySnippets)\n .where(eq(historySnippets.dedupe_key, dedupeKey))\n .get();\n if (collision && collision.id !== id) return;\n\n db.update(historySnippets)\n .set({\n ...(updates.text != null ? { text: updates.text } : {}),\n dedupe_key: dedupeKey,\n ...(updates.source_activity_ids ? { source_activity_ids: updates.source_activity_ids as any } : {}),\n updated_at: new Date().toISOString(),\n })\n .where(eq(historySnippets.id, id))\n .run();\n}\n\nfunction rowToHistorySnippet(row: HistorySnippetRow): HistorySnippet {\n const sourceActivityIds =\n typeof row.source_activity_ids === \"string\"\n ? JSON.parse(row.source_activity_ids)\n : Array.isArray(row.source_activity_ids)\n ? row.source_activity_ids\n : [];\n\n return {\n id: row.id,\n repo: row.repo,\n session_id: row.session_id,\n kind: row.kind,\n text: row.text,\n source_activity_ids: sourceActivityIds,\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n}\n","import { createHash } from \"node:crypto\";\nimport { eq } from \"drizzle-orm\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { historySnippetEmbeddings, historySnippets } from \"../db/schema.js\";\nimport type { EmbeddingConfig, HistorySnippet } from \"../types.js\";\nimport { generateEmbedding, generateEmbeddings, loadEmbeddingConfigFromEnv, projectEmbeddingToIndex } from \"../embeddings/embeddings.js\";\nimport { resolveProvider } from \"../embeddings/providers/index.js\";\nimport {\n rebuildHistoryVecIndex,\n removeHistoryVecRow,\n searchHistoryVecIndex,\n upsertHistoryVecRow,\n verifyHistoryVecIndex,\n} from \"../vector/sqlite-vec-history.js\";\nimport {\n rebuildHistoryFtsIndex,\n searchHistoryFtsIndex,\n syncHistoryFtsIndex,\n verifyHistoryFtsIndex,\n} from \"../vector/sqlite-fts-history.js\";\n\ntype HistorySnippetRow = typeof historySnippets.$inferSelect;\ntype HistorySnippetEmbeddingRow = typeof historySnippetEmbeddings.$inferSelect;\n\nfunction hashText(text: string) {\n return createHash(\"sha256\").update(text).digest(\"hex\");\n}\n\nfunction version(config: EmbeddingConfig) {\n return config.version || `${config.provider}:${config.model}:${config.dimensions}`;\n}\n\nfunction rowNeedsRefresh(\n row: Pick<HistorySnippetRow, \"text\">,\n existing: HistorySnippetEmbeddingRow | undefined,\n config: EmbeddingConfig,\n) {\n const metadata = resolveProvider(config).metadata();\n if (!existing) return true;\n return (\n existing.model !== config.model ||\n existing.embedding_dimensions !== metadata.canonical_dimensions ||\n existing.index_dimensions !== metadata.index_dimensions ||\n existing.version !== version(config) ||\n existing.content_hash !== hashText(row.text)\n );\n}\n\nfunction deserializeEmbedding(buffer: Buffer): Float32Array {\n return new Float32Array(\n buffer.buffer,\n buffer.byteOffset,\n buffer.byteLength / Float32Array.BYTES_PER_ELEMENT,\n );\n}\n\nfunction rowToHistorySnippet(row: HistorySnippetRow): HistorySnippet {\n const sourceActivityIds =\n typeof row.source_activity_ids === \"string\"\n ? JSON.parse(row.source_activity_ids)\n : Array.isArray(row.source_activity_ids)\n ? row.source_activity_ids\n : [];\n return {\n id: row.id,\n repo: row.repo,\n session_id: row.session_id,\n kind: row.kind,\n text: row.text,\n source_activity_ids: sourceActivityIds,\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n}\n\nexport function storeHistoryEmbedding(\n db: RecallDb,\n snippetId: string,\n text: string,\n embedding: Float32Array,\n config: EmbeddingConfig,\n) {\n const now = new Date().toISOString();\n const metadata = resolveProvider(config).metadata();\n const payload = {\n snippet_id: snippetId,\n model: config.model,\n embedding_dimensions: metadata.canonical_dimensions,\n index_dimensions: metadata.index_dimensions,\n version: version(config),\n content_hash: hashText(text),\n updated_at: now,\n embedding: Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength),\n };\n\n db.insert(historySnippetEmbeddings)\n .values(payload)\n .onConflictDoUpdate({\n target: historySnippetEmbeddings.snippet_id,\n set: {\n model: payload.model,\n embedding_dimensions: payload.embedding_dimensions,\n index_dimensions: payload.index_dimensions,\n version: payload.version,\n content_hash: payload.content_hash,\n updated_at: payload.updated_at,\n embedding: payload.embedding,\n },\n })\n .run();\n}\n\nexport function loadHistoryEmbedding(\n db: RecallDb,\n snippetId: string,\n): Float32Array | null {\n const row = db.select({ embedding: historySnippetEmbeddings.embedding })\n .from(historySnippetEmbeddings)\n .where(eq(historySnippetEmbeddings.snippet_id, snippetId))\n .get();\n return row?.embedding ? deserializeEmbedding(row.embedding as Buffer) : null;\n}\n\nexport function removeStoredHistoryEmbedding(\n db: RecallDb,\n snippetId: string,\n) {\n return db.delete(historySnippetEmbeddings)\n .where(eq(historySnippetEmbeddings.snippet_id, snippetId))\n .run().changes > 0;\n}\n\nexport async function syncHistorySnippetEmbedding(\n db: RecallDb,\n snippetId: string,\n config: EmbeddingConfig,\n): Promise<\"stored\" | \"updated\" | \"removed\" | \"skipped\"> {\n const snippet = db.select().from(historySnippets)\n .where(eq(historySnippets.id, snippetId))\n .get();\n\n syncHistoryFtsIndex(db, snippetId);\n if (!snippet) {\n removeStoredHistoryEmbedding(db, snippetId);\n removeHistoryVecRow(db, snippetId);\n return \"removed\";\n }\n\n const existing = db.select().from(historySnippetEmbeddings)\n .where(eq(historySnippetEmbeddings.snippet_id, snippetId))\n .get();\n\n if (!rowNeedsRefresh(snippet, existing, config)) {\n if (existing) upsertHistoryVecRow(db, snippet, existing);\n return \"skipped\";\n }\n\n const embedding = await generateEmbedding(snippet.text, config, \"document\");\n storeHistoryEmbedding(db, snippet.id, snippet.text, embedding, config);\n const refreshed = db.select().from(historySnippetEmbeddings)\n .where(eq(historySnippetEmbeddings.snippet_id, snippet.id))\n .get();\n if (!refreshed) throw new Error(`Failed to reload history embedding row for ${snippet.id}`);\n upsertHistoryVecRow(db, snippet, refreshed);\n return existing ? \"updated\" : \"stored\";\n}\n\nexport async function bootstrapHistoryEmbeddings(\n db: RecallDb,\n config: EmbeddingConfig,\n options: { repo?: string } = {},\n) {\n const rows = db.select().from(historySnippets).all()\n .filter((row) => !options.repo || row.repo === options.repo);\n const existing = new Map(\n db.select().from(historySnippetEmbeddings).all().map((row) => [row.snippet_id, row]),\n );\n\n const pending = rows.filter((row) => rowNeedsRefresh(row, existing.get(row.id), config));\n\n for (const row of rows) {\n syncHistoryFtsIndex(db, row.id);\n }\n\n const BATCH_SIZE = 100;\n let total = 0;\n for (let i = 0; i < pending.length; i += BATCH_SIZE) {\n const batch = pending.slice(i, i + BATCH_SIZE);\n const embeddings = await generateEmbeddings(batch.map((row) => row.text), config, \"document\");\n for (let j = 0; j < batch.length; j++) {\n storeHistoryEmbedding(db, batch[j].id, batch[j].text, embeddings[j], config);\n total++;\n }\n }\n\n rebuildHistoryFtsIndex(db, options);\n rebuildHistoryVecIndex(db, config, options);\n return total;\n}\n\nexport function verifyHistoryEmbeddings(\n db: RecallDb,\n config: EmbeddingConfig,\n options: { repo?: string } = {},\n) {\n const rows = db.select().from(historySnippets).all()\n .filter((row) => !options.repo || row.repo === options.repo);\n const embeddings = db.select().from(historySnippetEmbeddings).all();\n const byId = new Map(embeddings.map((row) => [row.snippet_id, row]));\n\n let eligible = 0;\n let stale = 0;\n for (const row of rows) {\n eligible++;\n if (rowNeedsRefresh(row, byId.get(row.id), config)) stale++;\n }\n\n const vec = verifyHistoryVecIndex(db, options);\n const fts = verifyHistoryFtsIndex(db, options);\n\n return {\n eligible,\n stored: embeddings.filter((row) => {\n if (!options.repo) return true;\n const snippet = rows.find((item) => item.id === row.snippet_id);\n return snippet?.repo === options.repo;\n }).length,\n stale,\n indexed: vec.indexed,\n index_drift: vec.drift,\n lexical_indexed: fts.indexed,\n lexical_drift: fts.drift,\n };\n}\n\nfunction lexicalRankToScore(rank: number, position: number) {\n const safeRank = Number.isFinite(rank) ? Math.abs(rank) : position + 1;\n return 1 / (1 + safeRank + position);\n}\n\nexport async function searchHistorySnippets(\n db: RecallDb,\n query: string,\n options: { repo?: string; limit?: number } = {},\n) {\n const limit = options.limit ?? 10;\n const lexicalMatches = searchHistoryFtsIndex(db, query, {\n repo: options.repo,\n limit: Math.max(limit * 2, 20),\n });\n\n const config = loadEmbeddingConfigFromEnv();\n const vectorMatches = config\n ? searchHistoryVecIndex(db, projectEmbeddingToIndex(\n await generateEmbedding(query, config, \"query\"),\n resolveProvider(config).metadata().index_dimensions,\n ), {\n repo: options.repo,\n limit: Math.max(limit * 2, 20),\n })\n : [];\n\n const rowsById = new Map(\n db.select().from(historySnippets).all().map((row) => [row.id, row]),\n );\n\n const merged = new Map<string, {\n snippet: HistorySnippet;\n score: number;\n similarity: number;\n lexical_score: number;\n }>();\n\n for (let i = 0; i < lexicalMatches.length; i++) {\n const match = lexicalMatches[i];\n const row = rowsById.get(match.snippet_id);\n if (!row) continue;\n const lexicalScore = lexicalRankToScore(match.lexical_rank, i);\n merged.set(match.snippet_id, {\n snippet: rowToHistorySnippet(row),\n score: lexicalScore * 0.35,\n similarity: 0,\n lexical_score: lexicalScore,\n });\n }\n\n for (const match of vectorMatches) {\n const row = rowsById.get(match.snippet_id);\n if (!row) continue;\n const similarity = Math.max(0, 1 - match.distance);\n const existing = merged.get(match.snippet_id);\n if (existing) {\n existing.similarity = similarity;\n existing.score = similarity * 0.65 + existing.lexical_score * 0.35;\n } else {\n merged.set(match.snippet_id, {\n snippet: rowToHistorySnippet(row),\n score: similarity * 0.65,\n similarity,\n lexical_score: 0,\n });\n }\n }\n\n return [...merged.values()]\n .sort((a, b) => b.score - a.score)\n .slice(0, limit);\n}\n","import * as sqliteVec from \"sqlite-vec\";\nimport { eq } from \"drizzle-orm\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { historySnippetEmbeddings, historySnippets } from \"../db/schema.js\";\nimport type { EmbeddingConfig } from \"../types.js\";\n\nconst VEC_HISTORY_INDEX = \"vec_history_index\";\nconst loadedClients = new WeakSet<object>();\n\nfunction getSqlite(db: RecallDb) {\n return db.$client;\n}\n\nfunction hasHistoryVecIndex(db: RecallDb): boolean {\n return Boolean(\n getSqlite(db)\n .prepare(\"select 1 from sqlite_master where type = 'table' and name = ?\")\n .get(VEC_HISTORY_INDEX),\n );\n}\n\nfunction ensureLoaded(db: RecallDb) {\n const sqlite = getSqlite(db);\n if (loadedClients.has(sqlite)) return;\n sqliteVec.load(sqlite);\n loadedClients.add(sqlite);\n}\n\nfunction getHistoryVecDimension(\n rows: Array<Pick<typeof historySnippetEmbeddings.$inferSelect, \"index_dimensions\">>,\n): number | null {\n const dimensions = [...new Set(rows.map((row) => row.index_dimensions))];\n if (dimensions.length === 0) return null;\n if (dimensions.length > 1) {\n throw new Error(\n `sqlite-vec history index rebuild refused mixed history embedding dimensions: ${dimensions.join(\", \")}.`,\n );\n }\n return dimensions[0];\n}\n\nexport function ensureHistoryVecIndex(db: RecallDb, dimensions: number) {\n ensureLoaded(db);\n const sqlite = getSqlite(db);\n const existing = sqlite\n .prepare(\"select sql from sqlite_master where type = 'table' and name = ?\")\n .get(VEC_HISTORY_INDEX) as { sql?: string } | undefined;\n\n const expectedDimension = `float[${dimensions}]`;\n if (existing?.sql && !existing.sql.includes(expectedDimension)) {\n throw new Error(\n `sqlite-vec history index dimension mismatch. Expected ${expectedDimension}. Run history index rebuild.`,\n );\n }\n\n sqlite.exec(`\n create virtual table if not exists ${VEC_HISTORY_INDEX} using vec0(\n embedding float[${dimensions}] distance_metric=cosine,\n snippet_id text,\n repo text,\n kind text\n );\n `);\n}\n\nexport function removeHistoryVecRow(db: RecallDb, snippetId: string) {\n ensureLoaded(db);\n if (!hasHistoryVecIndex(db)) return;\n getSqlite(db).prepare(`delete from ${VEC_HISTORY_INDEX} where snippet_id = ?`).run(snippetId);\n}\n\nexport function upsertHistoryVecRow(\n db: RecallDb,\n snippet: Pick<typeof historySnippets.$inferSelect, \"id\" | \"repo\" | \"kind\">,\n embeddingRow: Pick<typeof historySnippetEmbeddings.$inferSelect, \"embedding\" | \"index_dimensions\">,\n) {\n ensureHistoryVecIndex(db, embeddingRow.index_dimensions);\n const sqlite = getSqlite(db);\n sqlite.prepare(`delete from ${VEC_HISTORY_INDEX} where snippet_id = ?`).run(snippet.id);\n sqlite.prepare(`\n insert into ${VEC_HISTORY_INDEX} (\n embedding,\n snippet_id,\n repo,\n kind\n ) values (?, ?, ?, ?)\n `).run(\n projectIndexBuffer(embeddingRow.embedding, embeddingRow.index_dimensions),\n snippet.id,\n snippet.repo ?? \"\",\n snippet.kind,\n );\n}\n\nexport function rebuildHistoryVecIndex(\n db: RecallDb,\n config: EmbeddingConfig,\n options: { repo?: string } = {},\n) {\n const rows = db.select({\n id: historySnippets.id,\n repo: historySnippets.repo,\n kind: historySnippets.kind,\n index_dimensions: historySnippetEmbeddings.index_dimensions,\n embedding: historySnippetEmbeddings.embedding,\n })\n .from(historySnippets)\n .innerJoin(historySnippetEmbeddings, eq(historySnippetEmbeddings.snippet_id, historySnippets.id))\n .all()\n .filter((row) => !options.repo || row.repo === options.repo);\n\n const storedDimension = getHistoryVecDimension(rows);\n const targetDimension = storedDimension ?? config.dimensions;\n const sqlite = getSqlite(db);\n\n if (options.repo) {\n if (rows.length > 0) {\n ensureHistoryVecIndex(db, targetDimension);\n }\n if (!hasHistoryVecIndex(db)) return 0;\n sqlite.prepare(`delete from ${VEC_HISTORY_INDEX} where repo = ?`).run(options.repo);\n if (rows.length === 0) return 0;\n } else {\n sqlite.exec(`drop table if exists ${VEC_HISTORY_INDEX};`);\n ensureHistoryVecIndex(db, targetDimension);\n }\n\n const stmt = getSqlite(db).prepare(`\n insert into ${VEC_HISTORY_INDEX} (\n embedding,\n snippet_id,\n repo,\n kind\n ) values (?, ?, ?, ?)\n `);\n\n const insertMany = getSqlite(db).transaction((batch: typeof rows) => {\n for (const row of batch) {\n stmt.run(projectIndexBuffer(row.embedding, row.index_dimensions), row.id, row.repo ?? \"\", row.kind);\n }\n });\n\n insertMany(rows);\n return rows.length;\n}\n\nfunction projectIndexBuffer(buffer: Buffer, indexDimensions: number): Buffer {\n const embedding = new Float32Array(\n buffer.buffer,\n buffer.byteOffset,\n buffer.byteLength / Float32Array.BYTES_PER_ELEMENT,\n );\n if (embedding.length === indexDimensions) {\n return buffer;\n }\n if (embedding.length < indexDimensions) {\n throw new Error(`Canonical history embedding width ${embedding.length} is smaller than index width ${indexDimensions}.`);\n }\n const sliced = embedding.slice(0, indexDimensions);\n let norm = 0;\n for (const value of sliced) norm += value * value;\n const scale = Math.sqrt(norm) || 1;\n for (let i = 0; i < sliced.length; i++) {\n sliced[i] /= scale;\n }\n return Buffer.from(sliced.buffer, sliced.byteOffset, sliced.byteLength);\n}\n\nexport function verifyHistoryVecIndex(\n db: RecallDb,\n options: { repo?: string } = {},\n) {\n ensureLoaded(db);\n const sqlite = getSqlite(db);\n const exists = sqlite\n .prepare(\"select 1 from sqlite_master where type = 'table' and name = ?\")\n .get(VEC_HISTORY_INDEX);\n\n const expected = db.select({\n snippet_id: historySnippetEmbeddings.snippet_id,\n repo: historySnippets.repo,\n })\n .from(historySnippetEmbeddings)\n .innerJoin(historySnippets, eq(historySnippets.id, historySnippetEmbeddings.snippet_id))\n .all()\n .filter((row) => !options.repo || row.repo === options.repo).length;\n\n let indexed = 0;\n if (exists) {\n if (options.repo) {\n indexed = (sqlite.prepare(`select count(*) as count from ${VEC_HISTORY_INDEX} where repo = ?`).get(options.repo) as { count: number }).count;\n } else {\n indexed = (sqlite.prepare(`select count(*) as count from ${VEC_HISTORY_INDEX}`).get() as { count: number }).count;\n }\n }\n\n return { expected, indexed, drift: expected - indexed };\n}\n\nexport function searchHistoryVecIndex(\n db: RecallDb,\n queryEmbedding: Float32Array,\n options: { repo?: string; limit?: number } = {},\n): Array<{ snippet_id: string; distance: number }> {\n ensureLoaded(db);\n const sqlite = getSqlite(db);\n const exists = sqlite\n .prepare(\"select 1 from sqlite_master where type = 'table' and name = ?\")\n .get(VEC_HISTORY_INDEX);\n if (!exists) return [];\n\n const limit = options.limit ?? 10;\n if (options.repo) {\n return sqlite.prepare(`\n select snippet_id, distance\n from ${VEC_HISTORY_INDEX}\n where embedding match ?\n and k = ?\n and repo = ?\n order by distance\n `).all(queryEmbedding, limit, options.repo) as Array<{ snippet_id: string; distance: number }>;\n }\n\n return sqlite.prepare(`\n select snippet_id, distance\n from ${VEC_HISTORY_INDEX}\n where embedding match ?\n and k = ?\n order by distance\n `).all(queryEmbedding, limit) as Array<{ snippet_id: string; distance: number }>;\n}\n","import { eq } from \"drizzle-orm\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { historySnippets } from \"../db/schema.js\";\n\nconst FTS_HISTORY_INDEX = \"fts_history_index\";\n\nfunction getSqlite(db: RecallDb) {\n return db.$client;\n}\n\nexport function ensureHistoryFtsIndex(db: RecallDb) {\n getSqlite(db).exec(`\n create virtual table if not exists ${FTS_HISTORY_INDEX} using fts5(\n snippet_id UNINDEXED,\n text,\n repo UNINDEXED,\n kind UNINDEXED\n );\n `);\n}\n\nexport function removeHistoryFtsRow(db: RecallDb, snippetId: string) {\n const sqlite = getSqlite(db);\n const exists = sqlite\n .prepare(\"select 1 from sqlite_master where type = 'table' and name = ?\")\n .get(FTS_HISTORY_INDEX);\n if (!exists) return;\n sqlite.prepare(`delete from ${FTS_HISTORY_INDEX} where snippet_id = ?`).run(snippetId);\n}\n\nexport function upsertHistoryFtsRow(\n db: RecallDb,\n snippet: Pick<typeof historySnippets.$inferSelect, \"id\" | \"text\" | \"repo\" | \"kind\">,\n) {\n ensureHistoryFtsIndex(db);\n const sqlite = getSqlite(db);\n sqlite.prepare(`delete from ${FTS_HISTORY_INDEX} where snippet_id = ?`).run(snippet.id);\n sqlite.prepare(`\n insert into ${FTS_HISTORY_INDEX} (\n snippet_id,\n text,\n repo,\n kind\n ) values (?, ?, ?, ?)\n `).run(snippet.id, snippet.text, snippet.repo ?? \"\", snippet.kind);\n}\n\nexport function syncHistoryFtsIndex(db: RecallDb, snippetId: string) {\n const snippet = db.select().from(historySnippets).where(eq(historySnippets.id, snippetId)).get();\n if (!snippet) {\n removeHistoryFtsRow(db, snippetId);\n return \"removed\";\n }\n upsertHistoryFtsRow(db, snippet);\n return \"stored\";\n}\n\nexport function rebuildHistoryFtsIndex(\n db: RecallDb,\n options: { repo?: string } = {},\n) {\n const sqlite = getSqlite(db);\n if (options.repo) {\n ensureHistoryFtsIndex(db);\n sqlite.prepare(`delete from ${FTS_HISTORY_INDEX} where repo = ?`).run(options.repo);\n } else {\n sqlite.exec(`drop table if exists ${FTS_HISTORY_INDEX};`);\n ensureHistoryFtsIndex(db);\n }\n\n const rows = db.select().from(historySnippets).all()\n .filter((row) => !options.repo || row.repo === options.repo);\n\n const stmt = sqlite.prepare(`\n insert into ${FTS_HISTORY_INDEX} (\n snippet_id,\n text,\n repo,\n kind\n ) values (?, ?, ?, ?)\n `);\n const insertMany = sqlite.transaction((batch: typeof rows) => {\n for (const row of batch) {\n stmt.run(row.id, row.text, row.repo ?? \"\", row.kind);\n }\n });\n insertMany(rows);\n return rows.length;\n}\n\nexport function verifyHistoryFtsIndex(\n db: RecallDb,\n options: { repo?: string } = {},\n) {\n const sqlite = getSqlite(db);\n const exists = sqlite\n .prepare(\"select 1 from sqlite_master where type = 'table' and name = ?\")\n .get(FTS_HISTORY_INDEX);\n const expected = db.select().from(historySnippets).all()\n .filter((row) => !options.repo || row.repo === options.repo).length;\n\n let indexed = 0;\n if (exists) {\n if (options.repo) {\n indexed = (sqlite.prepare(`select count(*) as count from ${FTS_HISTORY_INDEX} where repo = ?`).get(options.repo) as { count: number }).count;\n } else {\n indexed = (sqlite.prepare(`select count(*) as count from ${FTS_HISTORY_INDEX}`).get() as { count: number }).count;\n }\n }\n return { expected, indexed, drift: expected - indexed };\n}\n\nfunction buildFtsQuery(query: string) {\n const tokens = query\n .match(/[A-Za-z0-9_.:/-]+/g)\n ?.map((token) => token.replace(/\"/g, '\"\"'))\n .filter(Boolean) ?? [];\n if (tokens.length === 0) return null;\n return tokens.map((token) => `\"${token}\"`).join(\" \");\n}\n\nexport function searchHistoryFtsIndex(\n db: RecallDb,\n query: string,\n options: { repo?: string; limit?: number } = {},\n): Array<{ snippet_id: string; lexical_rank: number }> {\n ensureHistoryFtsIndex(db);\n const ftsQuery = buildFtsQuery(query);\n if (!ftsQuery) return [];\n const sqlite = getSqlite(db);\n const limit = options.limit ?? 10;\n\n if (options.repo) {\n return sqlite.prepare(`\n select snippet_id, bm25(${FTS_HISTORY_INDEX}) as lexical_rank\n from ${FTS_HISTORY_INDEX}\n where ${FTS_HISTORY_INDEX} match ?\n and repo = ?\n order by lexical_rank\n limit ?\n `).all(ftsQuery, options.repo, limit) as Array<{ snippet_id: string; lexical_rank: number }>;\n }\n\n return sqlite.prepare(`\n select snippet_id, bm25(${FTS_HISTORY_INDEX}) as lexical_rank\n from ${FTS_HISTORY_INDEX}\n where ${FTS_HISTORY_INDEX} match ?\n order by lexical_rank\n limit ?\n `).all(ftsQuery, limit) as Array<{ snippet_id: string; lexical_rank: number }>;\n}\n","import { and, asc, eq, gt, isNull } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { memoryInjections } from \"../db/schema.js\";\nimport type { FeedbackOutcome, MemoryInjection, MemoryItem } from \"../types.js\";\nimport { getMemory } from \"./memory.js\";\nimport type { RecentToolCall } from \"../agents/types.js\";\n\ntype MemoryInjectionRow = typeof memoryInjections.$inferSelect;\n\nexport function recordMemoryInjections(\n db: RecallDb,\n input: {\n memory_ids: readonly string[];\n session_id?: string;\n repo?: string | null;\n },\n): number {\n if (!input.session_id || input.memory_ids.length === 0) return 0;\n\n const injectedAt = new Date().toISOString();\n let inserted = 0;\n for (const memoryId of input.memory_ids) {\n const result = db.insert(memoryInjections)\n .values({\n id: randomUUID(),\n memory_id: memoryId,\n session_id: input.session_id,\n repo: input.repo ?? null,\n injected_at: injectedAt,\n outcome: null,\n outcome_at: null,\n })\n .onConflictDoNothing({\n target: [memoryInjections.memory_id, memoryInjections.session_id],\n })\n .run();\n inserted += Number(result.changes ?? 0);\n }\n\n return inserted;\n}\n\nexport function listInjectedMemoryIdsForSession(\n db: RecallDb,\n sessionId: string,\n): Set<string> {\n const rows = db.select({ memory_id: memoryInjections.memory_id })\n .from(memoryInjections)\n .where(eq(memoryInjections.session_id, sessionId))\n .all();\n return new Set(rows.map((row) => row.memory_id));\n}\n\nexport function listPendingMemoryInjections(\n db: RecallDb,\n sessionId: string,\n): Array<MemoryInjection & { memory: MemoryItem | null }> {\n const rows = db.select()\n .from(memoryInjections)\n .where(and(\n eq(memoryInjections.session_id, sessionId),\n isNull(memoryInjections.outcome),\n ))\n .orderBy(asc(memoryInjections.injected_at))\n .all();\n\n return rows.map((row) => ({\n ...rowToMemoryInjection(row),\n memory: getMemory(db, row.memory_id) ?? null,\n }));\n}\n\nexport function resolveMemoryInjectionOutcome(\n db: RecallDb,\n memoryId: string,\n sessionId: string,\n outcome: FeedbackOutcome,\n): boolean {\n const outcomeAt = new Date().toISOString();\n const result = db.update(memoryInjections)\n .set({\n outcome,\n outcome_at: outcomeAt,\n })\n .where(and(\n eq(memoryInjections.memory_id, memoryId),\n eq(memoryInjections.session_id, sessionId),\n isNull(memoryInjections.outcome),\n ))\n .run();\n\n return Number(result.changes ?? 0) > 0;\n}\n\nexport function listToolCallsSince(\n db: RecallDb,\n sessionId: string,\n injectedAt: string,\n): RecentToolCall[] {\n const rows = db.select()\n .from(memoryInjections)\n .where(gt(memoryInjections.injected_at, injectedAt))\n .all();\n void rows;\n return [];\n}\n\nexport function pathMatchesMemory(mem: MemoryItem, targetPath?: string): boolean {\n if (!targetPath) return mem.scope === \"repo\" || mem.scope === \"team\";\n if (mem.scope === \"repo\" || mem.scope === \"team\") return true;\n if (!mem.path_scope) return true;\n\n const pattern = mem.path_scope;\n if (pattern.endsWith(\"**\")) {\n return targetPath.startsWith(pattern.slice(0, -2));\n }\n if (pattern.includes(\"*\")) {\n const regex = new RegExp(\n \"^\" + pattern.replace(/\\*/g, \"[^/]*\").replace(/\\*\\*/g, \".*\") + \"$\",\n );\n return regex.test(targetPath);\n }\n return targetPath.startsWith(pattern);\n}\n\nexport function toolCallTouchesMemory(\n mem: MemoryItem,\n toolCall: RecentToolCall,\n): boolean {\n if (toolCall.path && pathMatchesMemory(mem, toolCall.path)) return true;\n if (toolCall.input_summary) {\n const inferredPath = extractPath(toolCall.input_summary);\n if (inferredPath && pathMatchesMemory(mem, inferredPath)) return true;\n }\n return mem.scope === \"repo\" || mem.scope === \"team\";\n}\n\nfunction rowToMemoryInjection(row: MemoryInjectionRow): MemoryInjection {\n return {\n id: row.id,\n memory_id: row.memory_id,\n session_id: row.session_id,\n repo: row.repo,\n injected_at: row.injected_at,\n outcome: row.outcome,\n outcome_at: row.outcome_at,\n };\n}\n\nfunction extractPath(text: string): string | undefined {\n const match = text.match(\n /\\b((?:src|lib|app|components|utils|test|spec)\\/[\\w./-]+|[\\w./-]+\\.(?:ts|tsx|js|jsx|py|rs|go|swift|java|rb|json|toml|ya?ml))\\b/,\n );\n return match?.[1];\n}\n","import { eq } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { historyInjections } from \"../db/schema.js\";\n\nexport function recordHistoryInjections(\n db: RecallDb,\n input: {\n snippet_ids: readonly string[];\n session_id?: string;\n repo?: string | null;\n },\n): number {\n if (!input.session_id || input.snippet_ids.length === 0) return 0;\n\n const injectedAt = new Date().toISOString();\n let inserted = 0;\n for (const snippetId of input.snippet_ids) {\n const result = db.insert(historyInjections)\n .values({\n id: randomUUID(),\n snippet_id: snippetId,\n session_id: input.session_id,\n repo: input.repo ?? null,\n injected_at: injectedAt,\n })\n .onConflictDoNothing({\n target: [historyInjections.snippet_id, historyInjections.session_id],\n })\n .run();\n inserted += Number(result.changes ?? 0);\n }\n\n return inserted;\n}\n\nexport function listInjectedHistoryIdsForSession(\n db: RecallDb,\n sessionId: string,\n): Set<string> {\n const rows = db.select({ snippet_id: historyInjections.snippet_id })\n .from(historyInjections)\n .where(eq(historyInjections.session_id, sessionId))\n .all();\n return new Set(rows.map((row) => row.snippet_id));\n}\n","import { queryMemories, getMemoryFeedbackSummaries, feedbackWeightedScore } from \"../models/memory.js\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { recordMemoryInjections } from \"../models/memory-injections.js\";\nimport { recordHistoryInjections } from \"../models/history-injections.js\";\nimport { CONFIDENCE, type CompilerConfig, type EmbeddingConfig, type HistorySnippet, type MemoryItem } from \"../types.js\";\nimport { getRepoQualityProfile } from \"../repo/quality.js\";\nimport { hybridSearch, loadEmbeddingConfigFromEnv } from \"../embeddings/embeddings.js\";\nimport { listHistorySnippets } from \"../history/snippets.js\";\nimport { searchHistorySnippets } from \"../history/retrieval.js\";\n\nconst DEFAULT_CONFIG: CompilerConfig = {\n confidence_threshold: CONFIDENCE.ACTIVE_MIN,\n max_lines: 15,\n max_commands: 3,\n max_gotchas: 3,\n max_history_snippets: 2,\n token_budget: 2000,\n include_candidates: false,\n};\nconst QUERY_RESULT_LIMIT = 2;\nconst QUERY_VECTOR_RELEVANCE_FLOOR = 0.7;\n\nexport interface CompileRequest {\n repo: string;\n path?: string;\n query_text?: string;\n session_id?: string;\n config?: Partial<CompilerConfig>;\n embedding_config?: EmbeddingConfig | null;\n}\n\nexport interface CompiledContext {\n text: string;\n memories_included: string[];\n memories_dropped: string[];\n history_included: string[];\n token_estimate: number;\n}\n\nexport function compileContext(\n db: RecallDb,\n req: CompileRequest,\n): CompiledContext {\n const profile = getRepoQualityProfile(db, req.repo);\n const config = {\n ...DEFAULT_CONFIG,\n ...req.config,\n confidence_threshold:\n req.config?.confidence_threshold ?? profile.compile_confidence_threshold,\n };\n const selectedHistory = selectRepoHistory(db, req.repo, config.max_history_snippets);\n\n // 1. Pull repo-scoped + path-scoped memories. Skip rows that have been\n // suppressed from auto-injection (still queryable via MCP). Also include\n // scope='global' rules — those apply across every repo.\n const repoActive = queryMemories(db, {\n repo: req.repo,\n status: \"active\",\n auto_inject: true,\n });\n const globalActive = queryMemories(db, {\n scope: \"global\",\n status: \"active\",\n auto_inject: true,\n });\n const allActive = dedupeById([...repoActive, ...globalActive]);\n\n // 2. Filter by path scope if provided\n const scoped = req.path\n ? allActive.filter((m) => pathMatches(m, req.path!))\n : allActive;\n\n // 3. Apply hard confidence threshold\n const passing = scoped.filter(\n (m) => m.confidence >= config.confidence_threshold,\n );\n const dropped = scoped.filter(\n (m) => m.confidence < config.confidence_threshold,\n );\n\n if (passing.length === 0 && selectedHistory.length === 0) {\n return {\n text: \"\",\n memories_included: [],\n memories_dropped: dropped.map((m) => m.id),\n history_included: [],\n token_estimate: 0,\n };\n }\n\n // 4. Sort by feedback-weighted score (cold-start = confidence; matures\n // into followed-rate as resolved samples accumulate). Type priority still\n // groups rules ahead of commands.\n const summaries = getMemoryFeedbackSummaries(db, passing.map((m) => m.id));\n const scored = passing.map((m) => ({\n mem: m,\n score: feedbackWeightedScore(m.confidence, summaries.get(m.id) ?? {\n followed: 0, overridden: 0, contradicted: 0, ignored: 0, resolved: 0,\n }),\n }));\n const sorted = scored\n .sort((a, b) => {\n const typePrio = typePriority(a.mem.type) - typePriority(b.mem.type);\n if (typePrio !== 0) return typePrio;\n return b.score - a.score;\n })\n .map((s) => s.mem);\n const deduped = dedupeMemoriesForInjection(sorted);\n\n // 5. Budget: pick memories that fit\n const selected: MemoryItem[] = [];\n let commandCount = 0;\n let gotchaCount = 0;\n let lineCount = 0;\n\n for (const mem of deduped) {\n const memLines = renderMemoryText(mem).split(\"\\n\").length;\n\n if (lineCount + memLines > config.max_lines) continue;\n if (mem.type === \"command\" && commandCount >= config.max_commands) continue;\n if (mem.type === \"gotcha\" && gotchaCount >= config.max_gotchas) continue;\n\n selected.push(mem);\n lineCount += memLines;\n if (mem.type === \"command\") commandCount++;\n if (mem.type === \"gotcha\") gotchaCount++;\n }\n\n // 6. Compile into text\n const text = renderPack(selected, req.repo, selectedHistory);\n const tokenEstimate = Math.ceil(text.length / 4); // rough chars-to-tokens\n\n if (tokenEstimate > config.token_budget) {\n // Trim from the bottom (lowest confidence)\n while (\n selected.length > 1 &&\n Math.ceil(renderPack(selected, req.repo, selectedHistory).length / 4) >\n config.token_budget\n ) {\n selected.pop();\n }\n }\n\n const finalText = renderPack(selected, req.repo, selectedHistory);\n recordMemoryInjections(db, {\n memory_ids: selected.map((memory) => memory.id),\n session_id: req.session_id,\n repo: req.repo,\n });\n recordHistoryInjections(db, {\n snippet_ids: selectedHistory.map((snippet) => snippet.id),\n session_id: req.session_id,\n repo: req.repo,\n });\n\n return {\n text: finalText,\n memories_included: selected.map((m) => m.id),\n memories_dropped: [\n ...dropped.map((m) => m.id),\n ...sorted\n .filter((m) => !selected.includes(m))\n .map((m) => m.id),\n ],\n history_included: selectedHistory.map((snippet) => snippet.id),\n token_estimate: Math.ceil(finalText.length / 4),\n };\n}\n\nexport async function compileContextHybrid(\n db: RecallDb,\n req: CompileRequest,\n): Promise<CompiledContext> {\n const embeddingConfig = req.embedding_config ?? loadEmbeddingConfigFromEnv();\n const profile = getRepoQualityProfile(db, req.repo);\n const config = {\n ...DEFAULT_CONFIG,\n ...req.config,\n confidence_threshold:\n req.config?.confidence_threshold ?? profile.compile_confidence_threshold,\n };\n const selectedHistory = req.query_text\n ? await selectRelevantHistory(db, req.repo, req.query_text, config.max_history_snippets)\n : selectRepoHistory(db, req.repo, config.max_history_snippets);\n\n const repoMemories = queryMemories(db, { repo: req.repo });\n const globalMemories = queryMemories(db, { scope: \"global\" });\n const allMemories = dedupeById([...repoMemories, ...globalMemories]).filter((memory) =>\n memory.auto_inject &&\n (memory.status === \"active\" ||\n (config.include_candidates && memory.status === \"candidate\"))\n );\n\n const scoped = req.path\n ? allMemories.filter((memory) => pathMatches(memory, req.path!))\n : allMemories;\n\n const candidateConfidenceFloor = Math.min(config.confidence_threshold, 0.45);\n const passing = scoped.filter((memory) => {\n if (memory.status === \"active\") {\n return memory.confidence >= config.confidence_threshold;\n }\n if (memory.status === \"candidate\" && config.include_candidates) {\n return memory.confidence >= candidateConfidenceFloor;\n }\n return false;\n });\n\n const dropped = scoped.filter((memory) => !passing.includes(memory));\n\n if (passing.length === 0 && selectedHistory.length === 0) {\n return {\n text: \"\",\n memories_included: [],\n memories_dropped: dropped.map((m) => m.id),\n history_included: [],\n token_estimate: 0,\n };\n }\n\n const retrieval = req.query_text\n ? await hybridSearch(db, req.query_text, embeddingConfig, {\n repo: req.repo,\n limit: QUERY_RESULT_LIMIT,\n })\n : [];\n\n const retrievalById = new Map(\n retrieval.map((item) => [item.memory.id, item]),\n );\n\n const summaries = getMemoryFeedbackSummaries(db, passing.map((m) => m.id));\n const emptySummary = { followed: 0, overridden: 0, contradicted: 0, ignored: 0, resolved: 0 };\n\n const ranked = passing\n .filter((memory) => {\n const retrievalItem = retrievalById.get(memory.id);\n if (req.query_text) {\n if (!retrievalItem) return false;\n if (embeddingConfig && retrievalItem.similarity < QUERY_VECTOR_RELEVANCE_FLOOR) {\n return false;\n }\n return true;\n }\n if (memory.status !== \"candidate\") return true;\n const retrievalScore = retrievalItem?.score ?? 0;\n return retrievalScore >= 0.2;\n })\n .map((memory) => {\n const retrievalScore = retrievalById.get(memory.id)?.score ?? 0;\n const weighted = feedbackWeightedScore(memory.confidence, summaries.get(memory.id) ?? emptySummary);\n const score = req.query_text\n ? (retrievalScore * 0.45) +\n (weighted * 0.25) +\n (scopeScore(memory, req.path) * 0.15) +\n (freshnessScore(memory) * 0.05) +\n (typeScore(memory.type) * 0.10)\n : (weighted * 0.55) +\n (scopeScore(memory, req.path) * 0.20) +\n (freshnessScore(memory) * 0.10) +\n (typeScore(memory.type) * 0.15);\n\n return { memory, score };\n })\n .sort((a, b) => b.score - a.score);\n const dedupedRanked = dedupeRankedMemoriesForInjection(ranked);\n\n const selected: MemoryItem[] = [];\n let commandCount = 0;\n let gotchaCount = 0;\n let lineCount = 0;\n\n for (const item of dedupedRanked) {\n const memory = item.memory;\n const memLines = renderMemoryText(memory).split(\"\\n\").length;\n\n if (lineCount + memLines > config.max_lines) continue;\n if (memory.type === \"command\" && commandCount >= config.max_commands) continue;\n if (memory.type === \"gotcha\" && gotchaCount >= config.max_gotchas) continue;\n\n selected.push(memory);\n lineCount += memLines;\n if (memory.type === \"command\") commandCount++;\n if (memory.type === \"gotcha\") gotchaCount++;\n }\n\n if (selected.length === 0) {\n const historyOnlyText = renderPack([], req.repo, selectedHistory);\n if (historyOnlyText) {\n recordHistoryInjections(db, {\n snippet_ids: selectedHistory.map((snippet) => snippet.id),\n session_id: req.session_id,\n repo: req.repo,\n });\n return {\n text: historyOnlyText,\n memories_included: [],\n memories_dropped: [...dropped, ...passing].map((m) => m.id),\n history_included: selectedHistory.map((snippet) => snippet.id),\n token_estimate: Math.ceil(historyOnlyText.length / 4),\n };\n }\n\n return {\n text: \"\",\n memories_included: [],\n memories_dropped: [...dropped, ...passing].map((m) => m.id),\n history_included: [],\n token_estimate: 0,\n };\n }\n\n while (\n selected.length > 1 &&\n Math.ceil(renderPack(selected, req.repo, selectedHistory).length / 4) > config.token_budget\n ) {\n selected.pop();\n }\n\n const finalText = renderPack(selected, req.repo, selectedHistory);\n recordMemoryInjections(db, {\n memory_ids: selected.map((memory) => memory.id),\n session_id: req.session_id,\n repo: req.repo,\n });\n recordHistoryInjections(db, {\n snippet_ids: selectedHistory.map((snippet) => snippet.id),\n session_id: req.session_id,\n repo: req.repo,\n });\n return {\n text: finalText,\n memories_included: selected.map((m) => m.id),\n memories_dropped: [\n ...dropped.map((m) => m.id),\n ...ranked\n .map((item) => item.memory)\n .filter((memory) => !selected.includes(memory))\n .map((memory) => memory.id),\n ],\n history_included: selectedHistory.map((snippet) => snippet.id),\n token_estimate: Math.ceil(finalText.length / 4),\n };\n}\n\n// --- Render ---\n\nfunction renderPack(items: MemoryItem[], repo: string, history: HistorySnippet[] = []): string {\n if (items.length === 0 && history.length === 0) return \"\";\n\n const rules = items.filter((m) => m.type === \"rule\" || m.type === \"decision\");\n const commands = items.filter((m) => m.type === \"command\");\n const gotchas = items.filter(\n (m) => m.type === \"gotcha\" || m.type === \"review_pattern\",\n );\n\n const sections: string[] = [];\n\n if (rules.length > 0) {\n sections.push(\n \"## Rules\\n\" + rules.map(renderMemoryBullet).join(\"\\n\"),\n );\n }\n\n if (commands.length > 0) {\n sections.push(\n \"## Commands\\n\" + commands.map(renderMemoryBullet).join(\"\\n\"),\n );\n }\n\n if (gotchas.length > 0) {\n sections.push(\n \"## Gotchas\\n\" + gotchas.map(renderMemoryBullet).join(\"\\n\"),\n );\n }\n\n if (history.length > 0) {\n sections.push(\n \"## History\\n\" + history.map(renderHistorySnippet).join(\"\\n\"),\n );\n }\n\n return `# Recall: ${repo}\\n\\n${sections.join(\"\\n\\n\")}\\n`;\n}\n\n// Mark global-scope memories with a `[global]` tag so foreign sessions can see\n// at a glance that the line is a cross-repo rule injected via Recall, not a\n// project-specific instruction. Without the tag, an imperative line like\n// \"When user says X, do Y\" reads as suspicious in an unrelated repo.\nfunction renderMemoryBullet(memory: MemoryItem): string {\n const prefix = memory.scope === \"global\" ? \"[global] \" : \"\";\n return `- ${prefix}${renderMemoryText(memory)}`;\n}\n\nfunction renderMemoryText(memory: MemoryItem): string {\n const text = memory.text.replace(/\\r\\n/g, \"\\n\").trim();\n const injectedHeading = text.search(/##\\s+(Rules|Commands|Gotchas|History)\\b/i);\n const stripped = injectedHeading > 0 ? text.slice(0, injectedHeading).trim() : text;\n return stripped.replace(/\\s+/g, \" \");\n}\n\nfunction dedupeMemoriesForInjection(memories: MemoryItem[]): MemoryItem[] {\n const seen = new Set<string>();\n return memories.filter((memory) => {\n const key = canonicalInjectionText(memory);\n if (!key) return false;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nfunction dedupeRankedMemoriesForInjection<T extends { memory: MemoryItem }>(ranked: T[]): T[] {\n const seen = new Set<string>();\n return ranked.filter((item) => {\n const key = canonicalInjectionText(item.memory);\n if (!key) return false;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nfunction canonicalInjectionText(memory: MemoryItem): string {\n return renderMemoryText(memory)\n .toLowerCase()\n .replace(/[`*_]/g, \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nconst HISTORY_KINDS = new Set([\n \"decision_summary\",\n \"correction_summary\",\n \"review_summary\",\n \"repo_synthesis\",\n]);\n\nfunction selectRepoHistory(\n db: RecallDb,\n repo: string,\n limit: number,\n): HistorySnippet[] {\n if (limit <= 0) return [];\n return listHistorySnippets(db, { repo, limit: Math.max(limit * 3, 6) })\n .filter((snippet) => !snippet.session_id && HISTORY_KINDS.has(snippet.kind))\n .slice(0, limit);\n}\n\nasync function selectRelevantHistory(\n db: RecallDb,\n repo: string,\n query: string,\n limit: number,\n): Promise<HistorySnippet[]> {\n if (limit <= 0) return [];\n const results = await searchHistorySnippets(db, query, {\n repo,\n limit: Math.max(limit * 3, 6),\n });\n return results\n .map((result) => result.snippet)\n .filter((snippet) => HISTORY_KINDS.has(snippet.kind))\n .slice(0, limit);\n}\n\nconst HISTORY_ENTRY_MAX_CHARS = 120;\nconst HISTORY_MAX_ENTRIES_PER_SNIPPET = 2;\n\nfunction renderHistorySnippet(snippet: HistorySnippet): string {\n const lines = snippet.text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean)\n .filter((line) => !line.startsWith(\"Repo: \") && !line.endsWith(\":\"));\n\n const entries = lines\n .slice(0, HISTORY_MAX_ENTRIES_PER_SNIPPET)\n .map((line) =>\n line.length > HISTORY_ENTRY_MAX_CHARS\n ? line.slice(0, HISTORY_ENTRY_MAX_CHARS - 1).trimEnd() + \"…\"\n : line,\n );\n\n const body = entries.length > 0 ? entries.join(\" | \") : \"\";\n return `- [${snippet.kind}] ${body}`;\n}\n\n// --- Path matching ---\n\nfunction pathMatches(mem: MemoryItem, targetPath: string): boolean {\n // Repo, team, and global memories always match\n if (mem.scope === \"repo\" || mem.scope === \"team\" || mem.scope === \"global\") return true;\n if (!mem.path_scope) return true;\n\n // Simple glob-like matching\n const pattern = mem.path_scope;\n if (pattern.endsWith(\"**\")) {\n const prefix = pattern.slice(0, -2);\n return targetPath.startsWith(prefix);\n }\n if (pattern.includes(\"*\")) {\n const regex = new RegExp(\n \"^\" + pattern.replace(/\\*/g, \"[^/]*\").replace(/\\*\\*/g, \".*\") + \"$\",\n );\n return regex.test(targetPath);\n }\n return targetPath.startsWith(pattern);\n}\n\nfunction scopeScore(mem: MemoryItem, targetPath?: string): number {\n if (!targetPath) {\n if (mem.scope === \"repo\" || mem.scope === \"team\") return 0.9;\n if (mem.scope === \"global\") return 0.8;\n return 0.7;\n }\n if (mem.scope === \"global\") return 0.8;\n if (mem.scope === \"path\" && mem.path_scope) return 1;\n if (mem.scope === \"repo\" || mem.scope === \"team\") return 0.75;\n return pathMatches(mem, targetPath) ? 0.6 : 0;\n}\n\nfunction freshnessScore(mem: MemoryItem): number {\n const basis = mem.last_validated_at ?? mem.last_injected_at ?? mem.updated_at;\n const ageMs = Date.now() - new Date(basis).getTime();\n const ageDays = ageMs / 86_400_000;\n return Math.max(0, 1 - (ageDays / 180));\n}\n\n// --- Type priority (lower = higher priority) ---\n\nfunction typePriority(type: MemoryItem[\"type\"]): number {\n switch (type) {\n case \"rule\":\n return 0;\n case \"command\":\n return 1;\n case \"gotcha\":\n return 2;\n case \"review_pattern\":\n return 3;\n case \"decision\":\n return 4;\n default:\n return 5;\n }\n}\n\nfunction typeScore(type: MemoryItem[\"type\"]): number {\n switch (type) {\n case \"rule\":\n return 1.0;\n case \"command\":\n return 0.95;\n case \"decision\":\n return 0.9;\n case \"gotcha\":\n return 0.8;\n case \"review_pattern\":\n return 0.75;\n default:\n return 0.5;\n }\n}\n\n// A memory with scope='global' and a non-null repo (its origin) is returned by\n// both `queryMemories({ repo })` and `queryMemories({ scope: \"global\" })`.\n// Dedupe by id so it's rendered once per compile pass.\nfunction dedupeById(memories: MemoryItem[]): MemoryItem[] {\n const seen = new Set<string>();\n const out: MemoryItem[] = [];\n for (const m of memories) {\n if (seen.has(m.id)) continue;\n seen.add(m.id);\n out.push(m);\n }\n return out;\n}\n","import { compileContext } from \"../compiler/context.js\";\nimport type { RecallDb } from \"../db/client.js\";\n\nexport function exportMarkdown(db: RecallDb, repo: string): string {\n const result = compileContext(db, { repo });\n if (!result.text) {\n return `# ${repo}\\n\\nNo active memories above confidence threshold.\\n`;\n }\n return result.text;\n}\n\nexport function exportClaude(db: RecallDb, repo: string): string {\n const result = compileContext(db, { repo });\n if (!result.text) return \"\";\n\n return `# CLAUDE.md — Auto-generated by Recall\n# Do not edit manually. Run \\`recall export -r ${repo} -f claude\\` to regenerate.\n\n${result.text}`;\n}\n\nexport function exportCodex(db: RecallDb, repo: string): string {\n const result = compileContext(db, { repo });\n if (!result.text) return \"\";\n\n return `# AGENTS.md — Auto-generated by Recall\n# Do not edit manually. Run \\`recall export -r ${repo} -f codex\\` to regenerate.\n\n${result.text}`;\n}\n","import { existsSync, readdirSync } from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport { join, resolve } from \"node:path\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { queryMemories } from \"../models/memory.js\";\nimport { scanAndStore } from \"../scanner/repo.js\";\n\nconst repoPathCache = new Map<string, string | null>();\nconst SKIP_DIRS = new Set([\n \".git\",\n \"node_modules\",\n \"dist\",\n \"build\",\n \"coverage\",\n \".next\",\n \".turbo\",\n \".venv\",\n \"venv\",\n]);\n\nexport interface RepoBootstrapOptions {\n repo?: string | null;\n repoPathHint?: string | null;\n searchRoots?: string[];\n}\n\nexport interface RepoBootstrapResult {\n repo: string | null;\n repo_path: string | null;\n created_ids: string[];\n status:\n | \"skipped\"\n | \"already_known\"\n | \"bootstrapped\"\n | \"scanned_empty\"\n | \"unresolved\";\n}\n\nexport interface DiscoveredRepo {\n repo: string | null;\n repo_path: string;\n}\n\nexport function ensureRepoBootstrapped(\n db: RecallDb,\n opts: RepoBootstrapOptions,\n): RepoBootstrapResult {\n const repo = normalizeRepoSlug(opts.repo);\n const repoPathHint = opts.repoPathHint ?? null;\n\n if (!repo && !repoPathHint) {\n return {\n repo: null,\n repo_path: null,\n created_ids: [],\n status: \"skipped\",\n };\n }\n\n const resolvedRepo = repo ?? inferRepoSlugFromPath(repoPathHint);\n if (!resolvedRepo) {\n return {\n repo: null,\n repo_path: null,\n created_ids: [],\n status: \"unresolved\",\n };\n }\n\n if (queryMemories(db, { repo: resolvedRepo }).length > 0) {\n return {\n repo: resolvedRepo,\n repo_path: null,\n created_ids: [],\n status: \"already_known\",\n };\n }\n\n const repoPath = resolveLocalRepoPath(resolvedRepo, {\n repoPathHint,\n searchRoots: opts.searchRoots,\n });\n if (!repoPath) {\n return {\n repo: resolvedRepo,\n repo_path: null,\n created_ids: [],\n status: \"unresolved\",\n };\n }\n\n const createdIds = scanAndStore(db, repoPath);\n return {\n repo: resolvedRepo,\n repo_path: repoPath,\n created_ids: createdIds,\n status: createdIds.length > 0 ? \"bootstrapped\" : \"scanned_empty\",\n };\n}\n\nexport function resolveLocalRepoPath(\n repo: string,\n opts: Omit<RepoBootstrapOptions, \"repo\"> = {},\n): string | null {\n const normalizedRepo = normalizeRepoSlug(repo);\n if (!normalizedRepo) return null;\n\n if (repoPathCache.has(normalizedRepo)) {\n return repoPathCache.get(normalizedRepo) ?? null;\n }\n\n const directHint = normalizeRepoPathHint(opts.repoPathHint);\n if (directHint && pathMatchesRepo(directHint, normalizedRepo)) {\n repoPathCache.set(normalizedRepo, directHint);\n return directHint;\n }\n\n const candidates = collectCandidateRepos(opts.searchRoots ?? getDefaultSearchRoots());\n const basenameMatches: string[] = [];\n\n for (const candidate of candidates) {\n const candidateRepo = inferRepoSlugFromPath(candidate);\n if (candidateRepo === normalizedRepo) {\n repoPathCache.set(normalizedRepo, candidate);\n return candidate;\n }\n if (candidate.endsWith(`/${normalizedRepo.split(\"/\").at(-1)}`)) {\n basenameMatches.push(candidate);\n }\n }\n\n const fallback = basenameMatches.length === 1 ? basenameMatches[0] : null;\n repoPathCache.set(normalizedRepo, fallback);\n return fallback;\n}\n\nexport function inferRepoSlugFromPath(repoPath?: string | null): string | null {\n const root = normalizeRepoPathHint(repoPath);\n if (!root) return null;\n\n try {\n const remote = execFileSync(\n \"git\",\n [\"-C\", root, \"remote\", \"get-url\", \"origin\"],\n { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n ).trim();\n return extractRepoSlugFromRemote(remote);\n } catch {\n const parts = root.split(\"/\").filter(Boolean);\n return parts.at(-1) ?? null;\n }\n}\n\nexport function discoverLocalRepos(searchRoots?: string[]): DiscoveredRepo[] {\n const seen = new Set<string>();\n const repos: DiscoveredRepo[] = [];\n\n for (const repoPath of collectCandidateRepos(searchRoots ?? getDefaultSearchRoots())) {\n const repo = inferRepoSlugFromPath(repoPath);\n const key = `${repo ?? \"-\"}::${repoPath}`;\n if (seen.has(key)) continue;\n seen.add(key);\n repos.push({ repo, repo_path: repoPath });\n }\n\n return repos;\n}\n\nexport function extractRepoSlugFromRemote(remote: string): string | null {\n const trimmed = remote.trim().replace(/\\.git$/, \"\");\n const parts = trimmed.split(/[:/]/).filter(Boolean);\n if (parts.length < 2) return null;\n return `${parts.at(-2)}/${parts.at(-1)}`;\n}\n\nfunction pathMatchesRepo(repoPath: string, repo: string): boolean {\n const inferred = inferRepoSlugFromPath(repoPath);\n if (inferred === repo) return true;\n return repoPath.endsWith(`/${repo.split(\"/\").at(-1)}`);\n}\n\nfunction normalizeRepoSlug(repo?: string | null): string | null {\n if (!repo) return null;\n const trimmed = repo.trim().replace(/\\.git$/, \"\").replace(/^https?:\\/\\/[^/]+\\//, \"\");\n if (!trimmed.includes(\"/\")) return null;\n return trimmed.replace(/^git@[^:]+:/, \"\");\n}\n\nfunction normalizeRepoPathHint(repoPath?: string | null): string | null {\n if (!repoPath) return null;\n const expanded = repoPath.trim().replace(/^~(?=\\/)/, process.env.HOME ?? \"~\");\n try {\n const root = execFileSync(\n \"git\",\n [\"-C\", expanded, \"rev-parse\", \"--show-toplevel\"],\n { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n ).trim();\n return root || null;\n } catch {\n const resolved = resolve(expanded);\n return existsSync(join(resolved, \".git\")) ? resolved : null;\n }\n}\n\nfunction getDefaultSearchRoots(): string[] {\n const configured = process.env.RECALL_REPO_ROOTS\n ?.split(\",\")\n .map((value) => value.trim())\n .filter(Boolean);\n if (configured?.length) return configured;\n\n const home = process.env.HOME ?? process.cwd();\n return [join(home, \"Projects\")];\n}\n\nfunction collectCandidateRepos(searchRoots: string[]): string[] {\n const seen = new Set<string>();\n const repos: string[] = [];\n\n for (const root of searchRoots) {\n walkRepos(resolve(root), 4, seen, repos);\n }\n\n return repos;\n}\n\nfunction walkRepos(\n dir: string,\n depthRemaining: number,\n seen: Set<string>,\n repos: string[],\n): void {\n if (depthRemaining < 0 || seen.has(dir) || !existsSync(dir)) return;\n seen.add(dir);\n\n if (existsSync(join(dir, \".git\"))) {\n repos.push(dir);\n return;\n }\n\n let entries;\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (SKIP_DIRS.has(entry.name)) continue;\n walkRepos(join(dir, entry.name), depthRemaining - 1, seen, repos);\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { exportMarkdown } from \"../adapters/markdown.js\";\nimport { inferRepoSlugFromPath, resolveLocalRepoPath } from \"../repo/discovery.js\";\n\nexport interface RepoContextArtifactResult {\n repo: string | null;\n repo_path: string | null;\n output_path: string | null;\n written: boolean;\n}\n\nexport function getRepoContextArtifactPath(repoPath: string): string {\n return join(repoPath, \".recall\", \"context.md\");\n}\n\nexport function renderRepoContextArtifact(db: RecallDb, repo: string): string {\n const compiled = exportMarkdown(db, repo).trimEnd();\n const generatedAt = new Date().toISOString();\n\n return [\n \"<!-- Auto-generated by Recall. Do not edit manually. -->\",\n `<!-- Generated at: ${generatedAt} -->`,\n \"\",\n \"# Recall Context\",\n \"\",\n `Repo: \\`${repo}\\``,\n \"\",\n \"Read this file before making repo-specific assumptions.\",\n \"\",\n compiled,\n \"\",\n ].join(\"\\n\");\n}\n\nexport function writeRepoContextArtifact(\n db: RecallDb,\n input: { repo?: string | null; repo_path?: string | null },\n): RepoContextArtifactResult {\n const repo = input.repo ?? inferRepoSlugFromPath(input.repo_path) ?? null;\n const repoPath = input.repo_path ?? (repo ? resolveLocalRepoPath(repo) : null);\n\n if (!repo || !repoPath) {\n return {\n repo,\n repo_path: repoPath,\n output_path: null,\n written: false,\n };\n }\n\n const outputPath = getRepoContextArtifactPath(repoPath);\n mkdirSync(join(repoPath, \".recall\"), { recursive: true });\n ensureRepoContextExcluded(repoPath);\n\n const content = renderRepoContextArtifact(db, repo);\n const existing = existsSync(outputPath) ? readFileSync(outputPath, \"utf-8\") : null;\n if (existing !== content) {\n writeFileSync(outputPath, content);\n }\n\n return {\n repo,\n repo_path: repoPath,\n output_path: outputPath,\n written: existing !== content,\n };\n}\n\nfunction ensureRepoContextExcluded(repoPath: string): void {\n try {\n const excludePath = execFileSync(\n \"git\",\n [\"-C\", repoPath, \"rev-parse\", \"--git-path\", \"info/exclude\"],\n { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n ).trim();\n if (!excludePath) return;\n\n const existing = existsSync(excludePath) ? readFileSync(excludePath, \"utf-8\") : \"\";\n if (existing.split(\"\\n\").some((line) => line.trim() === \".recall/\")) return;\n\n const prefix = existing && !existing.endsWith(\"\\n\") ? \"\\n\" : \"\";\n writeFileSync(\n excludePath,\n `${existing}${prefix}# Recall generated context\\n.recall/\\n`,\n );\n } catch {\n // ignore if repo is not a standard git checkout\n }\n}\n","/**\n * Evaluation harness — tracks memory effectiveness metrics per session.\n * Answers: are memories actually helping? Are they trusted?\n */\n\nimport { eq, sql, and, gte, like } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport type { RecallDb } from \"../db/client.js\";\nimport {\n auditTrail,\n evalSessions,\n feedbackEvents,\n memories,\n memoryMaintenanceTasks,\n} from \"../db/schema.js\";\nimport type {\n EvalMetrics,\n EvalSession,\n MaintenanceEvalMetrics,\n MaintenanceTaskKind,\n} from \"../types.js\";\n\n// --- Session lifecycle ---\n\nexport function startEvalSession(\n db: RecallDb,\n repo: string,\n): string {\n const id = randomUUID();\n db.insert(evalSessions)\n .values({\n id,\n repo,\n started_at: new Date().toISOString(),\n })\n .run();\n return id;\n}\n\nexport function endEvalSession(db: RecallDb, sessionId: string) {\n db.update(evalSessions)\n .set({ ended_at: new Date().toISOString() })\n .where(eq(evalSessions.id, sessionId))\n .run();\n}\n\nexport function getEvalSession(\n db: RecallDb,\n sessionId: string,\n): EvalSession | undefined {\n const row = db\n .select()\n .from(evalSessions)\n .where(eq(evalSessions.id, sessionId))\n .get();\n return row as EvalSession | undefined;\n}\n\n// --- Increment counters ---\n\ntype CounterField =\n | \"memories_injected\"\n | \"memories_followed\"\n | \"memories_overridden\"\n | \"user_corrections\"\n | \"test_passes\"\n | \"test_failures\";\n\nexport function incrementEvalCounter(\n db: RecallDb,\n sessionId: string,\n field: CounterField,\n amount: number = 1,\n) {\n const col = evalSessions[field];\n db.update(evalSessions)\n .set({ [field]: sql`${col} + ${amount}` })\n .where(eq(evalSessions.id, sessionId))\n .run();\n}\n\n// --- Compute metrics ---\n\nexport function computeMetrics(\n db: RecallDb,\n options: { repo?: string; since?: string } = {},\n): EvalMetrics {\n const conditions = [];\n if (options.repo) conditions.push(eq(evalSessions.repo, options.repo));\n if (options.since) conditions.push(gte(evalSessions.started_at, options.since));\n\n const sessions =\n conditions.length > 0\n ? db\n .select()\n .from(evalSessions)\n .where(and(...conditions))\n .all()\n : db.select().from(evalSessions).all();\n\n if (sessions.length === 0) {\n const maintenance = computeMaintenanceMetrics(db);\n return {\n total_sessions: 0,\n injection_rate: 0,\n follow_rate: 0,\n override_rate: 0,\n correction_frequency: 0,\n avg_confidence_at_injection: 0,\n memory_effectiveness: 0,\n ...(maintenance ? { maintenance } : {}),\n };\n }\n\n const totals = sessions.reduce(\n (acc, s) => ({\n injected: acc.injected + s.memories_injected,\n followed: acc.followed + s.memories_followed,\n overridden: acc.overridden + s.memories_overridden,\n corrections: acc.corrections + s.user_corrections,\n test_passes: acc.test_passes + s.test_passes,\n test_failures: acc.test_failures + s.test_failures,\n }),\n {\n injected: 0,\n followed: 0,\n overridden: 0,\n corrections: 0,\n test_passes: 0,\n test_failures: 0,\n },\n );\n\n const totalTests = totals.test_passes + totals.test_failures;\n\n // Get average confidence of injected memories from feedback events\n const feedbackRows = db.select().from(feedbackEvents).all();\n const injectedFeedback = feedbackRows.filter((f) => f.injected);\n let avgConfidence = 0;\n if (injectedFeedback.length > 0) {\n const memIds = [...new Set(injectedFeedback.map((f) => f.memory_id))];\n let totalConf = 0;\n let count = 0;\n for (const memId of memIds) {\n const mem = db\n .select({ confidence: memories.confidence })\n .from(memories)\n .where(eq(memories.id, memId))\n .get();\n if (mem) {\n totalConf += mem.confidence;\n count++;\n }\n }\n avgConfidence = count > 0 ? totalConf / count : 0;\n }\n\n // Memory effectiveness = (followed - overridden) / injected\n const effectiveness =\n totals.injected > 0\n ? (totals.followed - totals.overridden) / totals.injected\n : 0;\n\n const maintenance = computeMaintenanceMetrics(db);\n\n return {\n total_sessions: sessions.length,\n injection_rate:\n totals.injected / Math.max(sessions.length, 1),\n follow_rate:\n totals.injected > 0 ? totals.followed / totals.injected : 0,\n override_rate:\n totals.injected > 0 ? totals.overridden / totals.injected : 0,\n correction_frequency:\n totals.corrections / Math.max(sessions.length, 1),\n avg_confidence_at_injection: avgConfidence,\n memory_effectiveness: effectiveness,\n ...(maintenance ? { maintenance } : {}),\n };\n}\n\nexport function computeMaintenanceMetrics(db: RecallDb): MaintenanceEvalMetrics | undefined {\n const rows = db.select().from(memoryMaintenanceTasks).all();\n if (rows.length === 0) return undefined;\n\n let completed = 0;\n let abandoned = 0;\n const completed_by_kind: Record<string, number> = {};\n let completionDurations: number[] = [];\n let mergeCompleted = 0;\n\n for (const row of rows) {\n if (row.status === \"completed\") {\n completed += 1;\n completed_by_kind[row.kind] = (completed_by_kind[row.kind] ?? 0) + 1;\n if (row.kind === \"merge_duplicates\") mergeCompleted += 1;\n if (row.completed_at) {\n const delta = new Date(row.completed_at).getTime() - new Date(row.created_at).getTime();\n if (Number.isFinite(delta) && delta >= 0) completionDurations.push(delta);\n }\n } else if (row.status === \"abandoned\") {\n abandoned += 1;\n }\n }\n\n // Merge precision: fraction of merge-touched memories NOT subsequently rolled back.\n // Audit rows tagged with reason LIKE 'merged_%' (actor = 'maintenance:<agent>')\n // are the universe; rolled_back entries on the same memory_id are the regressions.\n const mergeTouched = db.select().from(auditTrail)\n .where(and(\n like(auditTrail.reason, \"merged_%\"),\n like(auditTrail.actor, \"maintenance:%\"),\n ))\n .all();\n const touchedMemoryIds = new Set(mergeTouched.map((r) => r.memory_id));\n\n let mergeRollbacks = 0;\n if (touchedMemoryIds.size > 0) {\n const rollbacks = db.select().from(auditTrail)\n .where(eq(auditTrail.action, \"rolled_back\"))\n .all();\n for (const r of rollbacks) {\n if (touchedMemoryIds.has(r.memory_id)) mergeRollbacks += 1;\n }\n }\n\n const merge_precision = mergeCompleted >= 5 && touchedMemoryIds.size > 0\n ? Math.max(0, 1 - mergeRollbacks / touchedMemoryIds.size)\n : null;\n\n const mean_completion_ms = completionDurations.length\n ? completionDurations.reduce((a, b) => a + b, 0) / completionDurations.length\n : null;\n\n return {\n total_completed: completed,\n total_abandoned: abandoned,\n abandon_rate: completed + abandoned > 0 ? abandoned / (completed + abandoned) : 0,\n mean_completion_ms,\n completed_by_kind: completed_by_kind as Record<MaintenanceTaskKind, number>,\n merge_precision,\n merge_rollbacks: mergeRollbacks,\n };\n}\n\n// --- Report formatting ---\n\nexport function formatMetricsReport(metrics: EvalMetrics): string {\n const pct = (n: number) => `${(n * 100).toFixed(1)}%`;\n const lines = [\n `# Recall Evaluation Report`,\n ``,\n `Sessions: ${metrics.total_sessions}`,\n `Avg memories injected/session: ${metrics.injection_rate.toFixed(1)}`,\n ``,\n `## Trust`,\n `Follow rate: ${pct(metrics.follow_rate)}`,\n `Override rate: ${pct(metrics.override_rate)}`,\n `Effectiveness: ${pct(metrics.memory_effectiveness)}`,\n ``,\n `## Learning`,\n `Corrections/session: ${metrics.correction_frequency.toFixed(1)}`,\n `Avg confidence at injection: ${metrics.avg_confidence_at_injection.toFixed(2)}`,\n ];\n if (metrics.maintenance) {\n const m = metrics.maintenance;\n lines.push(``, `## Maintenance (tier-2)`);\n lines.push(`Completed tasks: ${m.total_completed}`);\n lines.push(`Abandoned tasks: ${m.total_abandoned}`);\n lines.push(`Abandon rate: ${pct(m.abandon_rate)}`);\n if (m.mean_completion_ms != null) {\n lines.push(`Mean completion: ${(m.mean_completion_ms / 1000).toFixed(1)}s`);\n }\n if (m.merge_precision != null) {\n lines.push(`Merge precision: ${pct(m.merge_precision)} (rollbacks: ${m.merge_rollbacks})`);\n }\n const kinds = Object.entries(m.completed_by_kind)\n .sort((a, b) => b[1] - a[1])\n .map(([k, n]) => `${k}=${n}`)\n .join(\", \");\n if (kinds) lines.push(`By kind: ${kinds}`);\n }\n return lines.join(\"\\n\");\n}\n","import { readFileSync } from \"node:fs\";\nimport { compileContext, compileContextHybrid } from \"../compiler/context.js\";\nimport type { RecallDb } from \"../db/client.js\";\nimport type { EmbeddingConfig } from \"../types.js\";\nimport { getMemory } from \"../models/memory.js\";\nimport { bootstrapEmbeddings, loadEmbeddingConfigFromEnv } from \"../embeddings/embeddings.js\";\nimport {\n RetrievalEvalCase,\n RetrievalEvalFile,\n type CompilerConfig,\n type RetrievalEvalFile as RetrievalEvalFileType,\n} from \"../types.js\";\n\ntype EvalRunName = \"baseline\" | \"hybrid\";\ntype RetrievalEvalProvider = EmbeddingConfig[\"provider\"] | \"current\";\n\ninterface RetrievalRunResult {\n included_ids: string[];\n included_texts: string[];\n token_estimate: number;\n passed: boolean;\n expected_all_missing: string[];\n expected_any_hit: boolean;\n forbidden_hits: string[];\n first_expected_rank: number | null;\n count_violation?: string;\n}\n\nexport interface RetrievalEvalCaseResult {\n name: string;\n baseline: RetrievalRunResult;\n hybrid: RetrievalRunResult;\n improved: boolean;\n regressed: boolean;\n}\n\nexport interface RetrievalEvalSummary {\n total_cases: number;\n baseline_passed: number;\n hybrid_passed: number;\n improved_cases: number;\n regressed_cases: number;\n baseline_expected_any_hit_rate: number;\n hybrid_expected_any_hit_rate: number;\n baseline_forbidden_hit_rate: number;\n hybrid_forbidden_hit_rate: number;\n}\n\nexport interface RetrievalEvalReport {\n summary: RetrievalEvalSummary;\n cases: RetrievalEvalCaseResult[];\n provider_reports: RetrievalEvalProviderReport[];\n}\n\nexport interface RetrievalEvalProviderMetrics {\n recall_at_k: number;\n mrr: number;\n override_rate: number;\n}\n\nexport interface RetrievalEvalProviderReport {\n provider: RetrievalEvalProvider;\n summary: RetrievalEvalSummary;\n metrics: RetrievalEvalProviderMetrics;\n cases: RetrievalEvalCaseResult[];\n}\n\nexport function loadRetrievalEvalFile(path: string): RetrievalEvalFileType {\n return RetrievalEvalFile.parse(JSON.parse(readFileSync(path, \"utf8\")));\n}\n\nexport async function runRetrievalEval(\n db: RecallDb,\n input: RetrievalEvalFileType,\n options: { providers?: RetrievalEvalProvider[] } = {},\n): Promise<RetrievalEvalReport> {\n const providers: RetrievalEvalProvider[] = options.providers?.length ? options.providers : [\"current\"];\n const providerReports: RetrievalEvalProviderReport[] = [];\n\n for (const provider of providers) {\n const cases: RetrievalEvalCaseResult[] = [];\n const embeddingConfig = provider === \"current\"\n ? loadEmbeddingConfigFromEnv()\n : embeddingConfigForProvider(provider);\n\n if (embeddingConfig) {\n await bootstrapEmbeddings(db, embeddingConfig);\n }\n\n for (const raw of input.cases) {\n const testCase = RetrievalEvalCase.parse(raw);\n const config = caseConfig(testCase);\n\n const baselineCompiled = compileContext(db, {\n repo: testCase.repo,\n path: testCase.path,\n config,\n });\n const hybridCompiled = await compileContextHybrid(db, {\n repo: testCase.repo,\n path: testCase.path,\n query_text: testCase.query_text,\n config: {\n ...config,\n include_candidates: testCase.include_candidates,\n },\n embedding_config: embeddingConfig,\n });\n\n const baseline = evaluateCaseRun(db, testCase, baselineCompiled.memories_included, baselineCompiled.token_estimate);\n const hybrid = evaluateCaseRun(db, testCase, hybridCompiled.memories_included, hybridCompiled.token_estimate);\n\n cases.push({\n name: testCase.name,\n baseline,\n hybrid,\n improved: !baseline.passed && hybrid.passed,\n regressed: baseline.passed && !hybrid.passed,\n });\n }\n\n const total = cases.length;\n const baselinePassed = cases.filter((item) => item.baseline.passed).length;\n const hybridPassed = cases.filter((item) => item.hybrid.passed).length;\n const improved = cases.filter((item) => item.improved).length;\n const regressed = cases.filter((item) => item.regressed).length;\n\n const baselineExpectedAnyHits = cases.filter((item) => item.baseline.expected_any_hit).length;\n const hybridExpectedAnyHits = cases.filter((item) => item.hybrid.expected_any_hit).length;\n const baselineForbiddenHits = cases.filter((item) => item.baseline.forbidden_hits.length > 0).length;\n const hybridForbiddenHits = cases.filter((item) => item.hybrid.forbidden_hits.length > 0).length;\n const reciprocalRanks = cases\n .map((item) => item.hybrid.first_expected_rank)\n .filter((rank): rank is number => rank != null)\n .map((rank) => 1 / rank);\n\n providerReports.push({\n provider,\n summary: {\n total_cases: total,\n baseline_passed: baselinePassed,\n hybrid_passed: hybridPassed,\n improved_cases: improved,\n regressed_cases: regressed,\n baseline_expected_any_hit_rate: ratio(baselineExpectedAnyHits, total),\n hybrid_expected_any_hit_rate: ratio(hybridExpectedAnyHits, total),\n baseline_forbidden_hit_rate: ratio(baselineForbiddenHits, total),\n hybrid_forbidden_hit_rate: ratio(hybridForbiddenHits, total),\n },\n metrics: {\n recall_at_k: ratio(hybridExpectedAnyHits, total),\n mrr: reciprocalRanks.length > 0\n ? reciprocalRanks.reduce((sum, value) => sum + value, 0) / total\n : 0,\n override_rate: ratio(hybridForbiddenHits, total),\n },\n cases,\n });\n }\n\n return {\n summary: providerReports[0].summary,\n cases: providerReports[0].cases,\n provider_reports: providerReports,\n };\n}\n\nexport function formatRetrievalEvalReport(report: RetrievalEvalReport): string {\n const pct = (value: number) => `${(value * 100).toFixed(1)}%`;\n if (report.provider_reports.length > 1) {\n const lines = [\n \"# Retrieval Eval\",\n \"\",\n \"## Provider Comparison\",\n ];\n\n for (const provider of report.provider_reports) {\n lines.push(\n `- ${provider.provider}: passed=${provider.summary.hybrid_passed}/${provider.summary.total_cases} recall@k=${pct(provider.metrics.recall_at_k)} mrr=${provider.metrics.mrr.toFixed(3)} override=${pct(provider.metrics.override_rate)}`,\n );\n }\n\n for (const provider of report.provider_reports) {\n lines.push(\"\", `## ${provider.provider}`);\n lines.push(formatSingleProviderReport(provider.summary, provider.cases));\n }\n\n return lines.join(\"\\n\");\n }\n\n return formatSingleProviderReport(report.summary, report.cases);\n}\n\nfunction formatSingleProviderReport(\n summary: RetrievalEvalSummary,\n cases: RetrievalEvalCaseResult[],\n) {\n const pct = (value: number) => `${(value * 100).toFixed(1)}%`;\n const lines = [\n \"# Retrieval Eval\",\n \"\",\n `Cases: ${summary.total_cases}`,\n `Baseline passed: ${summary.baseline_passed}`,\n `Hybrid passed: ${summary.hybrid_passed}`,\n `Improved: ${summary.improved_cases}`,\n `Regressed: ${summary.regressed_cases}`,\n \"\",\n `Baseline expected-any hit rate: ${pct(summary.baseline_expected_any_hit_rate)}`,\n `Hybrid expected-any hit rate: ${pct(summary.hybrid_expected_any_hit_rate)}`,\n `Baseline forbidden hit rate: ${pct(summary.baseline_forbidden_hit_rate)}`,\n `Hybrid forbidden hit rate: ${pct(summary.hybrid_forbidden_hit_rate)}`,\n ];\n\n const failedCases = cases.filter((item) => !item.hybrid.passed || item.regressed || item.improved);\n if (failedCases.length > 0) {\n lines.push(\"\", \"## Case Details\");\n for (const item of failedCases) {\n lines.push(`- ${item.name}`);\n lines.push(` baseline: ${describeRun(item.baseline)}`);\n lines.push(` hybrid: ${describeRun(item.hybrid)}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction caseConfig(testCase: RetrievalEvalCase): Partial<CompilerConfig> {\n return {\n ...(testCase.confidence_threshold != null ? { confidence_threshold: testCase.confidence_threshold } : {}),\n ...(testCase.max_lines != null ? { max_lines: testCase.max_lines } : {}),\n ...(testCase.max_commands != null ? { max_commands: testCase.max_commands } : {}),\n ...(testCase.max_gotchas != null ? { max_gotchas: testCase.max_gotchas } : {}),\n ...(testCase.token_budget != null ? { token_budget: testCase.token_budget } : {}),\n };\n}\n\nfunction evaluateCaseRun(\n db: RecallDb,\n testCase: RetrievalEvalCase,\n memoryIds: string[],\n tokenEstimate: number,\n): RetrievalRunResult {\n const includedTexts = memoryIds\n .map((id) => getMemory(db, id)?.text)\n .filter((text): text is string => Boolean(text));\n\n const expectedAllMissing = testCase.expected_all_texts.filter((expected) => !includedTexts.includes(expected));\n const expectedAnyHit = testCase.expected_any_texts.length === 0\n ? true\n : testCase.expected_any_texts.some((expected) => includedTexts.includes(expected));\n const forbiddenHits = testCase.forbidden_texts.filter((forbidden) => includedTexts.includes(forbidden));\n const relevantTexts = [\n ...testCase.expected_all_texts,\n ...testCase.expected_any_texts,\n ];\n const firstExpectedRank = relevantTexts.length === 0\n ? null\n : includedTexts.findIndex((text) => relevantTexts.includes(text)) + 1 || null;\n\n let countViolation: string | undefined;\n if (testCase.min_included != null && memoryIds.length < testCase.min_included) {\n countViolation = `included ${memoryIds.length} < min ${testCase.min_included}`;\n } else if (testCase.max_included != null && memoryIds.length > testCase.max_included) {\n countViolation = `included ${memoryIds.length} > max ${testCase.max_included}`;\n }\n\n const passed =\n expectedAllMissing.length === 0 &&\n expectedAnyHit &&\n forbiddenHits.length === 0 &&\n !countViolation;\n\n return {\n included_ids: memoryIds,\n included_texts: includedTexts,\n token_estimate: tokenEstimate,\n passed,\n expected_all_missing: expectedAllMissing,\n expected_any_hit: expectedAnyHit,\n forbidden_hits: forbiddenHits,\n first_expected_rank: firstExpectedRank,\n count_violation: countViolation,\n };\n}\n\nfunction describeRun(result: RetrievalRunResult) {\n const parts = [\n result.passed ? \"pass\" : \"fail\",\n `included=${result.included_ids.length}`,\n ];\n if (result.expected_all_missing.length > 0) {\n parts.push(`missing_all=${result.expected_all_missing.join(\" | \")}`);\n }\n if (!result.expected_any_hit) {\n parts.push(\"expected_any=miss\");\n }\n if (result.forbidden_hits.length > 0) {\n parts.push(`forbidden=${result.forbidden_hits.join(\" | \")}`);\n }\n if (result.count_violation) {\n parts.push(result.count_violation);\n }\n return parts.join(\" ; \");\n}\n\nfunction ratio(value: number, total: number) {\n return total > 0 ? value / total : 0;\n}\n\nfunction embeddingConfigForProvider(provider: Exclude<RetrievalEvalProvider, \"current\">): EmbeddingConfig {\n const overrideDimensions = process.env.RECALL_EMBEDDING_DIMS\n ? parseInt(process.env.RECALL_EMBEDDING_DIMS, 10)\n : null;\n if (provider === \"bge-small-en-v1.5\") {\n return {\n provider,\n model: \"Xenova/bge-small-en-v1.5\",\n dimensions: overrideDimensions ?? 384,\n version: \"eval\",\n similarity_threshold: 0.8,\n };\n }\n if (provider === \"multilingual-e5\") {\n return {\n provider,\n model: \"Xenova/multilingual-e5-small\",\n dimensions: overrideDimensions ?? 384,\n version: \"eval\",\n similarity_threshold: 0.8,\n };\n }\n\n return {\n provider: \"nomic\",\n model: \"nomic-ai/nomic-embed-text-v1.5\",\n dimensions: overrideDimensions ?? 512,\n version: \"eval\",\n similarity_threshold: 0.8,\n };\n}\n","/**\n * Implicit feedback signals — infer memory quality from indirect signals:\n * - test pass/fail after injection\n * - file unchanged vs rewritten after injection\n * - task acceptance/rejection\n *\n * These signals feed back into confidence adjustments.\n */\n\nimport { eq } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport { execSync } from \"node:child_process\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { implicitSignals, memories } from \"../db/schema.js\";\nimport { promoteMemory, demoteMemory } from \"../models/memory.js\";\n\ntype SignalType =\n | \"test_pass\"\n | \"test_fail\"\n | \"file_unchanged\"\n | \"file_rewritten\"\n | \"task_accepted\"\n | \"task_rejected\";\n\n// --- Signal weights (how much each signal affects confidence) ---\n\nconst SIGNAL_WEIGHTS: Record<SignalType, number> = {\n test_pass: 0.03,\n test_fail: -0.15,\n file_unchanged: 0.02,\n file_rewritten: -0.1,\n task_accepted: 0.05,\n task_rejected: -0.2,\n};\n\n// --- Record a signal ---\n\nexport function recordSignal(\n db: RecallDb,\n memoryId: string,\n sessionId: string,\n signalType: SignalType,\n context?: string,\n): string {\n const id = randomUUID();\n db.insert(implicitSignals)\n .values({\n id,\n memory_id: memoryId,\n session_id: sessionId,\n signal_type: signalType,\n timestamp: new Date().toISOString(),\n context: context ?? null,\n })\n .run();\n\n // Apply confidence adjustment\n const weight = SIGNAL_WEIGHTS[signalType];\n if (weight > 0) {\n promoteMemory(db, memoryId, \"passive_gain\");\n } else if (weight < 0) {\n demoteMemory(db, memoryId, `implicit:${signalType}`);\n }\n\n return id;\n}\n\n// --- Get signals for a memory ---\n\nexport function getSignals(db: RecallDb, memoryId: string) {\n return db\n .select()\n .from(implicitSignals)\n .where(eq(implicitSignals.memory_id, memoryId))\n .all();\n}\n\n// --- Detect test results ---\n\nexport interface TestResult {\n passed: boolean;\n output?: string;\n}\n\nexport function runTests(\n repoPath: string,\n command: string,\n): TestResult {\n try {\n const output = execSync(command, {\n cwd: repoPath,\n encoding: \"utf-8\",\n timeout: 120_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return { passed: true, output };\n } catch (err: any) {\n return {\n passed: false,\n output: err.stdout ?? err.stderr ?? err.message,\n };\n }\n}\n\n/**\n * After running tests, record implicit signals for all memories\n * that were injected in the current session.\n */\nexport function recordTestSignals(\n db: RecallDb,\n sessionId: string,\n injectedMemoryIds: string[],\n testResult: TestResult,\n): string[] {\n const signalType: SignalType = testResult.passed ? \"test_pass\" : \"test_fail\";\n const ids: string[] = [];\n\n for (const memId of injectedMemoryIds) {\n const id = recordSignal(\n db,\n memId,\n sessionId,\n signalType,\n testResult.output?.slice(0, 500),\n );\n ids.push(id);\n }\n\n return ids;\n}\n\n// --- Detect file changes (post-injection) ---\n\n/**\n * Check if files were modified after memory injection.\n * Compares git diff to see if agent output was rewritten.\n */\nexport function detectFileChanges(\n repoPath: string,\n files: string[],\n): Map<string, \"unchanged\" | \"rewritten\"> {\n const results = new Map<string, \"unchanged\" | \"rewritten\">();\n\n try {\n const diff = execSync(\"git diff --name-only\", {\n cwd: repoPath,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n\n const changedFiles = new Set(diff.split(\"\\n\").filter(Boolean));\n\n for (const file of files) {\n results.set(\n file,\n changedFiles.has(file) ? \"rewritten\" : \"unchanged\",\n );\n }\n } catch {\n // Not a git repo or git error — mark all as unchanged\n for (const file of files) {\n results.set(file, \"unchanged\");\n }\n }\n\n return results;\n}\n\n/**\n * Record file-change signals for injected memories.\n */\nexport function recordFileChangeSignals(\n db: RecallDb,\n sessionId: string,\n memoryIds: string[],\n changes: Map<string, \"unchanged\" | \"rewritten\">,\n): string[] {\n const ids: string[] = [];\n const hasRewrites = [...changes.values()].some((v) => v === \"rewritten\");\n\n const signalType: SignalType = hasRewrites\n ? \"file_rewritten\"\n : \"file_unchanged\";\n\n for (const memId of memoryIds) {\n const id = recordSignal(\n db,\n memId,\n sessionId,\n signalType,\n `files: ${[...changes.entries()].map(([f, s]) => `${f}:${s}`).join(\", \")}`,\n );\n ids.push(id);\n }\n\n return ids;\n}\n\n// --- Aggregate signal stats ---\n\nexport function getSignalStats(\n db: RecallDb,\n memoryId: string,\n): Record<SignalType, number> {\n const signals = getSignals(db, memoryId);\n const stats: Record<string, number> = {\n test_pass: 0,\n test_fail: 0,\n file_unchanged: 0,\n file_rewritten: 0,\n task_accepted: 0,\n task_rejected: 0,\n };\n\n for (const s of signals) {\n stats[s.signal_type] = (stats[s.signal_type] ?? 0) + 1;\n }\n\n return stats as Record<SignalType, number>;\n}\n","/**\n * Org-level policy engine + approval workflows.\n *\n * Policy rules control what memories can be promoted, what needs approval,\n * and what's automatically accepted. Admins set policy, members submit\n * memories, admins approve.\n */\n\nimport { eq, and } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { policyRules, approvalRequests, memories } from \"../db/schema.js\";\nimport { getMemory, confirmMemory, rejectMemory, queryMemories } from \"../models/memory.js\";\nimport { recordAudit } from \"../audit/trail.js\";\nimport type { PolicyRule, ApprovalStatus, MemoryItem } from \"../types.js\";\n\n// --- Policy CRUD ---\n\nexport function createPolicy(\n db: RecallDb,\n orgId: string,\n ruleType: PolicyRule[\"rule_type\"],\n config: Record<string, unknown>,\n): string {\n const id = randomUUID();\n const now = new Date().toISOString();\n db.insert(policyRules)\n .values({\n id,\n org_id: orgId,\n rule_type: ruleType,\n config: config as any,\n enabled: true,\n created_at: now,\n updated_at: now,\n })\n .run();\n return id;\n}\n\nexport function listPolicies(db: RecallDb, orgId: string): PolicyRule[] {\n return db\n .select()\n .from(policyRules)\n .where(eq(policyRules.org_id, orgId))\n .all()\n .map(rowToPolicy);\n}\n\nexport function togglePolicy(db: RecallDb, policyId: string, enabled: boolean) {\n db.update(policyRules)\n .set({ enabled, updated_at: new Date().toISOString() })\n .where(eq(policyRules.id, policyId))\n .run();\n}\n\nexport function deletePolicy(db: RecallDb, policyId: string) {\n db.delete(policyRules).where(eq(policyRules.id, policyId)).run();\n}\n\n// --- Policy evaluation ---\n\nexport interface PolicyViolation {\n rule_id: string;\n rule_type: string;\n message: string;\n blocking: boolean;\n}\n\nexport function evaluatePolicy(\n db: RecallDb,\n orgId: string,\n memory: MemoryItem,\n): PolicyViolation[] {\n const rules = listPolicies(db, orgId).filter((r) => r.enabled);\n const violations: PolicyViolation[] = [];\n\n for (const rule of rules) {\n const cfg = rule.config as Record<string, any>;\n\n switch (rule.rule_type) {\n case \"min_confidence\": {\n const min = cfg.min_confidence ?? 0.6;\n if (memory.confidence < min) {\n violations.push({\n rule_id: rule.id,\n rule_type: rule.rule_type,\n message: `Confidence ${memory.confidence.toFixed(2)} below minimum ${min}`,\n blocking: true,\n });\n }\n break;\n }\n\n case \"require_approval\": {\n const forTypes = cfg.for_types as string[] | undefined;\n if (!forTypes || forTypes.includes(memory.type)) {\n violations.push({\n rule_id: rule.id,\n rule_type: rule.rule_type,\n message: `Memory type \"${memory.type}\" requires approval before activation`,\n blocking: true,\n });\n }\n break;\n }\n\n case \"allowed_sources\": {\n const allowed = cfg.sources as string[] | undefined;\n if (allowed && !allowed.includes(memory.source)) {\n violations.push({\n rule_id: rule.id,\n rule_type: rule.rule_type,\n message: `Source \"${memory.source}\" not in allowed list: ${allowed.join(\", \")}`,\n blocking: true,\n });\n }\n break;\n }\n\n case \"blocked_scopes\": {\n const blocked = cfg.scopes as string[] | undefined;\n if (blocked && blocked.includes(memory.scope)) {\n violations.push({\n rule_id: rule.id,\n rule_type: rule.rule_type,\n message: `Scope \"${memory.scope}\" is blocked by policy`,\n blocking: true,\n });\n }\n break;\n }\n\n case \"max_active_per_repo\": {\n const max = cfg.max ?? 50;\n if (memory.repo) {\n const active = queryMemories(db, { repo: memory.repo, status: \"active\" });\n if (active.length >= max) {\n violations.push({\n rule_id: rule.id,\n rule_type: rule.rule_type,\n message: `Repo \"${memory.repo}\" has ${active.length}/${max} active memories`,\n blocking: true,\n });\n }\n }\n break;\n }\n\n case \"require_evidence_count\": {\n const minEvidence = cfg.min_evidence ?? 2;\n if (memory.evidence.length < minEvidence) {\n violations.push({\n rule_id: rule.id,\n rule_type: rule.rule_type,\n message: `Memory has ${memory.evidence.length} evidence entries, needs ${minEvidence}`,\n blocking: true,\n });\n }\n break;\n }\n\n case \"auto_approve_pattern\": {\n // Not a violation — handled separately\n break;\n }\n }\n }\n\n return violations;\n}\n\n/** Check if a memory matches any auto-approve pattern */\nexport function matchesAutoApprove(\n db: RecallDb,\n orgId: string,\n memory: MemoryItem,\n): boolean {\n const rules = listPolicies(db, orgId).filter(\n (r) => r.enabled && r.rule_type === \"auto_approve_pattern\",\n );\n\n for (const rule of rules) {\n const cfg = rule.config as Record<string, any>;\n const pattern = cfg.pattern as string | undefined;\n if (pattern) {\n try {\n const regex = new RegExp(pattern, \"i\");\n if (regex.test(memory.text)) return true;\n } catch {\n // Invalid regex, skip\n }\n }\n\n const sources = cfg.sources as string[] | undefined;\n if (sources && sources.includes(memory.source)) return true;\n\n const types = cfg.types as string[] | undefined;\n if (types && types.includes(memory.type)) return true;\n }\n\n return false;\n}\n\n// --- Approval queue ---\n\nexport function requestApproval(\n db: RecallDb,\n memoryId: string,\n orgId: string,\n requestedBy: string,\n): string {\n const id = randomUUID();\n const now = new Date().toISOString();\n\n db.insert(approvalRequests)\n .values({\n id,\n memory_id: memoryId,\n org_id: orgId,\n requested_by: requestedBy,\n status: \"pending\",\n created_at: now,\n })\n .run();\n\n recordAudit(db, memoryId, \"approval_requested\", requestedBy, null);\n return id;\n}\n\nexport function resolveApproval(\n db: RecallDb,\n approvalId: string,\n status: \"approved\" | \"denied\",\n reviewedBy: string,\n reason?: string,\n): boolean {\n const row = db\n .select()\n .from(approvalRequests)\n .where(eq(approvalRequests.id, approvalId))\n .get();\n if (!row) return false;\n\n const now = new Date().toISOString();\n db.update(approvalRequests)\n .set({\n status,\n reviewed_by: reviewedBy,\n reason: reason ?? null,\n resolved_at: now,\n })\n .where(eq(approvalRequests.id, approvalId))\n .run();\n\n // Apply the decision\n if (status === \"approved\") {\n confirmMemory(db, row.memory_id);\n } else {\n rejectMemory(db, row.memory_id);\n }\n\n recordAudit(db, row.memory_id, \"approval_resolved\", reviewedBy, reason ?? null);\n return true;\n}\n\nexport function listPendingApprovals(\n db: RecallDb,\n orgId: string,\n) {\n return db\n .select()\n .from(approvalRequests)\n .where(\n and(\n eq(approvalRequests.org_id, orgId),\n eq(approvalRequests.status, \"pending\"),\n ),\n )\n .all();\n}\n\nexport function getApproval(db: RecallDb, id: string) {\n return db\n .select()\n .from(approvalRequests)\n .where(eq(approvalRequests.id, id))\n .get();\n}\n\n// --- Helpers ---\n\nfunction rowToPolicy(row: any): PolicyRule {\n return {\n ...row,\n config:\n typeof row.config === \"string\" ? JSON.parse(row.config) : row.config ?? {},\n enabled: Boolean(row.enabled),\n };\n}\n","/**\n * Auto-pruning and stale memory handling.\n *\n * - Archive memories not injected/validated in N days\n * - Prune rejected memories older than threshold\n * - Compact transient memories\n * - Configurable retention policies\n */\n\nimport { eq } from \"drizzle-orm\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { memories } from \"../db/schema.js\";\nimport { queueMemoryEmbeddingSync } from \"../embeddings/embeddings.js\";\nimport { queryMemories } from \"../models/memory.js\";\nimport { computeHealthScore } from \"../health/scoring.js\";\nimport { recordAudit } from \"../audit/trail.js\";\nimport type { PruneConfig } from \"../types.js\";\n\nconst DEFAULT_CONFIG: PruneConfig = {\n stale_days: 90,\n rejected_retention_days: 30,\n transient_retention_days: 7,\n min_health_score: 0.2,\n dry_run: false,\n};\n\nexport interface PruneResult {\n stale_rejected: string[];\n rejected_pruned: string[];\n transient_pruned: string[];\n unhealthy_demoted: string[];\n total: number;\n}\n\nexport function pruneMemories(\n db: RecallDb,\n config: Partial<PruneConfig> = {},\n): PruneResult {\n const cfg = { ...DEFAULT_CONFIG, ...config };\n const now = Date.now();\n const dayMs = 86_400_000;\n\n const result: PruneResult = {\n stale_rejected: [],\n rejected_pruned: [],\n transient_pruned: [],\n unhealthy_demoted: [],\n total: 0,\n };\n\n // 1. Archive stale active/candidate memories\n const staleCutoff = new Date(now - cfg.stale_days * dayMs).toISOString();\n const staleCandidates = queryMemories(db, {\n repo: cfg.repo,\n limit: undefined,\n }).filter((mem) => mem.status !== \"rejected\" && mem.status !== \"transient\");\n\n for (const mem of staleCandidates) {\n const lastActivity =\n mem.last_validated_at ?? mem.last_injected_at ?? mem.updated_at;\n\n if (lastActivity < staleCutoff) {\n if (!cfg.dry_run) {\n db.update(memories)\n .set({ status: \"rejected\", dedupe_key: null, updated_at: new Date().toISOString() })\n .where(eq(memories.id, mem.id))\n .run();\n queueMemoryEmbeddingSync(db, mem.id);\n recordAudit(db, mem.id, \"rejected\", \"auto-pruner\", `Stale: no activity since ${lastActivity}`);\n }\n result.stale_rejected.push(mem.id);\n }\n }\n\n // 2. Delete rejected memories past retention\n const rejectedCutoff = new Date(\n now - cfg.rejected_retention_days * dayMs,\n ).toISOString();\n const rejectedMemories = queryMemories(db, {\n repo: cfg.repo,\n status: \"rejected\",\n });\n\n for (const mem of rejectedMemories) {\n if (mem.updated_at < rejectedCutoff) {\n if (!cfg.dry_run) {\n // Soft delete — keep audit trail but remove from memories\n db.delete(memories).where(eq(memories.id, mem.id)).run();\n recordAudit(db, mem.id, \"pruned\", \"auto-pruner\", `Rejected memory past ${cfg.rejected_retention_days}d retention`);\n }\n result.rejected_pruned.push(mem.id);\n }\n }\n\n // 3. Compact transient memories\n const transientCutoff = new Date(\n now - cfg.transient_retention_days * dayMs,\n ).toISOString();\n const transientMemories = queryMemories(db, {\n repo: cfg.repo,\n status: \"transient\",\n });\n\n for (const mem of transientMemories) {\n if (mem.updated_at < transientCutoff) {\n if (!cfg.dry_run) {\n db.delete(memories).where(eq(memories.id, mem.id)).run();\n recordAudit(db, mem.id, \"pruned\", \"auto-pruner\", `Transient memory past ${cfg.transient_retention_days}d retention`);\n }\n result.transient_pruned.push(mem.id);\n }\n }\n\n // 4. Demote unhealthy active memories\n const activeMemories = queryMemories(db, {\n repo: cfg.repo,\n status: \"active\",\n });\n for (const mem of activeMemories) {\n const health = computeHealthScore(db, mem.id);\n if (health && health.score < cfg.min_health_score) {\n if (!cfg.dry_run) {\n db.update(memories)\n .set({ status: \"candidate\", updated_at: new Date().toISOString() })\n .where(eq(memories.id, mem.id))\n .run();\n queueMemoryEmbeddingSync(db, mem.id);\n recordAudit(\n db,\n mem.id,\n \"demoted\",\n \"auto-pruner\",\n `Health score ${health.score.toFixed(2)} below threshold ${cfg.min_health_score}`,\n );\n }\n result.unhealthy_demoted.push(mem.id);\n }\n }\n\n result.total =\n result.stale_rejected.length +\n result.rejected_pruned.length +\n result.transient_pruned.length +\n result.unhealthy_demoted.length;\n\n return result;\n}\n\n// --- Format prune report ---\n\nexport function formatPruneReport(result: PruneResult, dryRun: boolean): string {\n const prefix = dryRun ? \"[DRY RUN] \" : \"\";\n const lines = [\n `${prefix}Prune Report`,\n ``,\n `Stale rejected: ${result.stale_rejected.length}`,\n `Rejected pruned: ${result.rejected_pruned.length}`,\n `Transient pruned: ${result.transient_pruned.length}`,\n `Unhealthy demoted: ${result.unhealthy_demoted.length}`,\n `Total affected: ${result.total}`,\n ];\n\n if (result.stale_rejected.length > 0) {\n lines.push(\"\", \"Stale Rejected:\");\n for (const id of result.stale_rejected.slice(0, 10)) {\n lines.push(` ${id.slice(0, 8)}`);\n }\n }\n\n if (result.unhealthy_demoted.length > 0) {\n lines.push(\"\", \"Unhealthy:\");\n for (const id of result.unhealthy_demoted.slice(0, 10)) {\n lines.push(` ${id.slice(0, 8)}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n","import { and, desc, eq, gte } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { activityEvents } from \"../db/schema.js\";\nimport { activityEventDedupeKey } from \"./dedupe.js\";\nimport type {\n ActivityEvent,\n ActivityEventQuery,\n ActivityEventType,\n ActivitySource,\n} from \"../types.js\";\n\ntype ActivityRow = typeof activityEvents.$inferSelect;\n\nexport interface CreateActivityEventInput {\n session_id?: string | null;\n repo?: string | null;\n path?: string | null;\n source: ActivitySource;\n event_type: ActivityEventType;\n memory_ids?: string[];\n request?: Record<string, unknown>;\n result?: Record<string, unknown>;\n}\n\nexport function createActivityEvent(\n db: RecallDb,\n input: CreateActivityEventInput,\n): string {\n const dedupeKey = activityEventDedupeKey(input);\n\n if (dedupeKey) {\n const existingId = findActivityEventByDedupeKey(db, dedupeKey);\n if (existingId) return existingId;\n } else {\n const fuzzyId = findRecentDuplicateActivityEvent(db, input);\n if (fuzzyId) return fuzzyId;\n }\n\n const id = randomUUID();\n const result = db.insert(activityEvents)\n .values({\n id,\n session_id: input.session_id ?? null,\n repo: input.repo ?? null,\n path: input.path ?? null,\n source: input.source,\n event_type: input.event_type,\n memory_ids: input.memory_ids ?? [],\n dedupe_key: dedupeKey,\n request: input.request ?? {},\n result: input.result ?? {},\n created_at: new Date().toISOString(),\n })\n .onConflictDoNothing({ target: activityEvents.dedupe_key })\n .run();\n\n if (Number(result.changes ?? 0) === 0 && dedupeKey) {\n const existingId = findActivityEventByDedupeKey(db, dedupeKey);\n if (existingId) return existingId;\n }\n return id;\n}\n\nfunction findActivityEventByDedupeKey(\n db: RecallDb,\n dedupeKey: string,\n): string | null {\n const row = db\n .select({ id: activityEvents.id })\n .from(activityEvents)\n .where(eq(activityEvents.dedupe_key, dedupeKey))\n .get();\n return row?.id ?? null;\n}\n\nfunction findRecentDuplicateActivityEvent(\n db: RecallDb,\n input: CreateActivityEventInput,\n): string | null {\n if (!input.session_id) return null;\n\n const since = new Date(Date.now() - 2_000).toISOString();\n const rows = db.select().from(activityEvents)\n .where(and(\n eq(activityEvents.session_id, input.session_id),\n eq(activityEvents.source, input.source),\n eq(activityEvents.event_type, input.event_type),\n gte(activityEvents.created_at, since),\n ))\n .all();\n\n const requestKey = JSON.stringify(input.request ?? {});\n const resultKey = JSON.stringify(input.result ?? {});\n const repo = input.repo ?? null;\n const path = input.path ?? null;\n\n for (const row of rows) {\n if (row.repo !== repo || row.path !== path) continue;\n const request =\n typeof row.request === \"string\"\n ? JSON.parse(row.request)\n : row.request ?? {};\n const result =\n typeof row.result === \"string\"\n ? JSON.parse(row.result)\n : row.result ?? {};\n if (\n JSON.stringify(request) === requestKey &&\n JSON.stringify(result) === resultKey\n ) {\n return row.id;\n }\n }\n\n return null;\n}\n\nexport function getActivityEvent(\n db: RecallDb,\n id: string,\n): ActivityEvent | undefined {\n const row = db.select().from(activityEvents).where(eq(activityEvents.id, id)).get();\n return row ? rowToActivityEvent(row) : undefined;\n}\n\nexport function listActivityEvents(\n db: RecallDb,\n query: ActivityEventQuery = {},\n): ActivityEvent[] {\n const conditions = [];\n\n if (query.repo) conditions.push(eq(activityEvents.repo, query.repo));\n if (query.session_id) conditions.push(eq(activityEvents.session_id, query.session_id));\n if (query.source) conditions.push(eq(activityEvents.source, query.source));\n if (query.event_type) conditions.push(eq(activityEvents.event_type, query.event_type));\n if (query.since) conditions.push(gte(activityEvents.created_at, query.since));\n\n const base = db.select().from(activityEvents);\n const rows = conditions.length > 0\n ? base.where(and(...conditions)).orderBy(desc(activityEvents.created_at)).all()\n : base.orderBy(desc(activityEvents.created_at)).all();\n\n const limited = query.limit ? rows.slice(0, query.limit) : rows;\n return limited.map(rowToActivityEvent);\n}\n\nexport function listActivitySessions(\n db: RecallDb,\n query: Omit<ActivityEventQuery, \"session_id\"> & { limit?: number } = {},\n): Array<{\n session_id: string;\n repo: string | null;\n event_count: number;\n event_types: ActivityEventType[];\n first_at: string;\n last_at: string;\n}> {\n const events = listActivityEvents(db, query).filter((event) => event.session_id);\n const grouped = new Map<string, ActivityEvent[]>();\n\n for (const event of events) {\n const sessionId = event.session_id!;\n const bucket = grouped.get(sessionId) ?? [];\n bucket.push(event);\n grouped.set(sessionId, bucket);\n }\n\n const sessions = [...grouped.entries()].map(([session_id, items]) => {\n const sorted = [...items].sort((a, b) => a.created_at.localeCompare(b.created_at));\n return {\n session_id,\n repo: sorted[0]?.repo ?? null,\n event_count: items.length,\n event_types: [...new Set(items.map((item) => item.event_type))],\n first_at: sorted[0]!.created_at,\n last_at: sorted[sorted.length - 1]!.created_at,\n };\n });\n\n sessions.sort((a, b) => b.last_at.localeCompare(a.last_at));\n return query.limit ? sessions.slice(0, query.limit) : sessions;\n}\n\nfunction rowToActivityEvent(row: ActivityRow): ActivityEvent {\n const memory_ids =\n typeof row.memory_ids === \"string\"\n ? JSON.parse(row.memory_ids)\n : Array.isArray(row.memory_ids)\n ? row.memory_ids\n : [];\n const request =\n typeof row.request === \"string\"\n ? JSON.parse(row.request)\n : row.request ?? {};\n const result =\n typeof row.result === \"string\"\n ? JSON.parse(row.result)\n : row.result ?? {};\n\n return {\n id: row.id,\n session_id: row.session_id,\n repo: row.repo,\n path: row.path,\n source: row.source,\n event_type: row.event_type,\n memory_ids,\n request: request as Record<string, unknown>,\n result: result as Record<string, unknown>,\n created_at: row.created_at,\n };\n}\n","import type { RecallDb } from \"../db/client.js\";\nimport { createActivityEvent } from \"../models/activity.js\";\nimport { ensureRepoBootstrapped, inferRepoSlugFromPath } from \"../repo/discovery.js\";\nimport { writeRepoContextArtifact } from \"../artifacts/context.js\";\nimport type { ActivitySource } from \"../types.js\";\nimport { tagActivitySource } from \"../types.js\";\n\nexport interface SessionLifecycleInput {\n session_id: string;\n client?: string | null;\n repo?: string | null;\n repo_path?: string | null;\n path?: string | null;\n meta?: Record<string, unknown>;\n source?: ActivitySource;\n}\n\nfunction resolveLifecycleSource(input: SessionLifecycleInput): ActivitySource {\n if (input.source) return input.source;\n return input.client ? tagActivitySource(\"hook\", input.client) : \"daemon\";\n}\n\nexport interface SessionLifecycleResult {\n session_id: string;\n repo: string | null;\n repo_path: string | null;\n bootstrap_status:\n | \"skipped\"\n | \"already_known\"\n | \"bootstrapped\"\n | \"scanned_empty\"\n | \"unresolved\";\n created_ids: string[];\n}\n\nexport function startSessionLifecycle(\n db: RecallDb,\n input: SessionLifecycleInput,\n): SessionLifecycleResult {\n const repo = input.repo ?? inferRepoSlugFromPath(input.repo_path) ?? null;\n const bootstrap = ensureRepoBootstrapped(db, {\n repo,\n repoPathHint: input.repo_path,\n });\n\n if (bootstrap.status === \"bootstrapped\" || bootstrap.status === \"scanned_empty\") {\n createActivityEvent(db, {\n session_id: input.session_id,\n repo: bootstrap.repo,\n path: input.path ?? null,\n source: resolveLifecycleSource(input),\n event_type: \"scan\",\n memory_ids: bootstrap.created_ids,\n request: {\n repo_path: bootstrap.repo_path,\n client: input.client ?? null,\n trigger: \"session_start_bootstrap\",\n },\n result: {\n created: bootstrap.created_ids.length,\n status: bootstrap.status,\n },\n });\n }\n\n const artifact = writeRepoContextArtifact(db, {\n repo: bootstrap.repo,\n repo_path: bootstrap.repo_path ?? input.repo_path ?? null,\n });\n\n createActivityEvent(db, {\n session_id: input.session_id,\n repo: bootstrap.repo,\n path: input.path ?? null,\n source: resolveLifecycleSource(input),\n event_type: \"session_start\",\n request: {\n client: input.client ?? null,\n repo_path: bootstrap.repo_path ?? input.repo_path ?? null,\n meta: input.meta ?? {},\n },\n result: {\n bootstrap_status: bootstrap.status,\n created: bootstrap.created_ids.length,\n artifact_path: artifact.output_path,\n artifact_written: artifact.written,\n },\n });\n\n return {\n session_id: input.session_id,\n repo: bootstrap.repo,\n repo_path: bootstrap.repo_path ?? input.repo_path ?? null,\n bootstrap_status: bootstrap.status,\n created_ids: bootstrap.created_ids,\n };\n}\n\nexport function recordSessionLifecycleEvent(\n db: RecallDb,\n input: SessionLifecycleInput & {\n name: string;\n payload?: Record<string, unknown>;\n },\n): SessionLifecycleResult {\n const repo = input.repo ?? inferRepoSlugFromPath(input.repo_path) ?? null;\n\n createActivityEvent(db, {\n session_id: input.session_id,\n repo,\n path: input.path ?? null,\n source: resolveLifecycleSource(input),\n event_type: \"session_event\",\n request: {\n client: input.client ?? null,\n name: input.name,\n repo_path: input.repo_path ?? null,\n meta: input.meta ?? {},\n },\n result: input.payload ?? {},\n });\n\n return {\n session_id: input.session_id,\n repo,\n repo_path: input.repo_path ?? null,\n bootstrap_status: \"skipped\",\n created_ids: [],\n };\n}\n\nexport function endSessionLifecycle(\n db: RecallDb,\n input: SessionLifecycleInput & {\n payload?: Record<string, unknown>;\n },\n): SessionLifecycleResult {\n const repo = input.repo ?? inferRepoSlugFromPath(input.repo_path) ?? null;\n\n createActivityEvent(db, {\n session_id: input.session_id,\n repo,\n path: input.path ?? null,\n source: resolveLifecycleSource(input),\n event_type: \"session_end\",\n request: {\n client: input.client ?? null,\n repo_path: input.repo_path ?? null,\n meta: input.meta ?? {},\n },\n result: input.payload ?? {},\n });\n\n return {\n session_id: input.session_id,\n repo,\n repo_path: input.repo_path ?? null,\n bootstrap_status: \"skipped\",\n created_ids: [],\n };\n}\n","import type { RecallDb } from \"../db/client.js\";\nimport { processCorrection } from \"../capture/correction.js\";\nimport { recordFeedback, getMemory } from \"../models/memory.js\";\nimport { createActivityEvent } from \"../models/activity.js\";\nimport { endSessionLifecycle } from \"../session/lifecycle.js\";\nimport type { ActivitySource, FeedbackOutcome } from \"../types.js\";\nimport type { RecentToolCall } from \"../agents/types.js\";\nimport { resolveMemoryInjectionOutcome } from \"../models/memory-injections.js\";\n\nexport interface CaptureCorrectionInput {\n text: string;\n repo?: string;\n path?: string;\n session_id?: string;\n agent?: string;\n prev_assistant_turn?: string;\n recent_tool_calls?: readonly RecentToolCall[];\n}\n\nexport interface CaptureCorrectionResult {\n ids: string[];\n session_id: string;\n}\n\nexport interface SignalOutcomeInput {\n memory_id: string;\n session_id: string;\n injected?: boolean;\n outcome: FeedbackOutcome;\n context?: string;\n}\n\nexport interface SignalOutcomeResult {\n feedback_id: string;\n}\n\nexport interface SessionEndInput {\n session_id: string;\n repo?: string;\n repo_path?: string;\n path?: string;\n agent?: string;\n turn_count?: number;\n}\n\nexport interface SessionEndResult {\n session_id: string;\n repo: string | null;\n}\n\nexport async function captureCorrectionFallback(\n db: RecallDb,\n input: CaptureCorrectionInput,\n source: ActivitySource,\n): Promise<CaptureCorrectionResult> {\n const sessionId = input.session_id ?? `${source}-capture`;\n const ids = await processCorrection(db, input.text, {\n sessionId,\n repo: input.repo,\n path: input.path,\n agent: input.agent,\n prev_assistant_turn: input.prev_assistant_turn,\n recent_tool_calls: input.recent_tool_calls,\n });\n\n createActivityEvent(db, {\n session_id: sessionId,\n repo: input.repo ?? null,\n path: input.path ?? null,\n source,\n event_type: \"correction\",\n memory_ids: ids,\n request: {\n agent: input.agent ?? null,\n prev_assistant_turn: input.prev_assistant_turn ?? null,\n recent_tool_calls: normalizeRecentToolCalls(input.recent_tool_calls),\n text: input.text,\n },\n result: {\n created: ids,\n created_count: ids.length,\n },\n });\n\n return {\n ids,\n session_id: sessionId,\n };\n}\n\nexport function signalOutcomeFallback(\n db: RecallDb,\n input: SignalOutcomeInput,\n source: ActivitySource,\n): SignalOutcomeResult {\n const feedbackId = recordFeedback(\n db,\n input.memory_id,\n input.session_id,\n input.injected ?? true,\n input.outcome,\n );\n resolveMemoryInjectionOutcome(db, input.memory_id, input.session_id, input.outcome);\n const memory = getMemory(db, input.memory_id);\n\n createActivityEvent(db, {\n session_id: input.session_id,\n repo: memory?.repo ?? null,\n path: memory?.path_scope ?? null,\n source,\n event_type: \"feedback\",\n memory_ids: [input.memory_id],\n request: {\n context: input.context ?? null,\n injected: input.injected ?? true,\n outcome: input.outcome,\n },\n result: {\n feedback_id: feedbackId,\n },\n });\n\n return {\n feedback_id: feedbackId,\n };\n}\n\nexport function sessionEndFallback(\n db: RecallDb,\n input: SessionEndInput,\n): SessionEndResult {\n const result = endSessionLifecycle(db, {\n session_id: input.session_id,\n client: input.agent ?? \"mcp\",\n repo: input.repo ?? null,\n repo_path: input.repo_path ?? null,\n path: input.path ?? null,\n payload: {\n ended_at: new Date().toISOString(),\n turn_count: input.turn_count ?? null,\n },\n });\n\n return {\n session_id: result.session_id,\n repo: result.repo,\n };\n}\n\nfunction normalizeRecentToolCalls(\n toolCalls: readonly RecentToolCall[] | undefined,\n): RecentToolCall[] {\n if (!toolCalls) return [];\n return toolCalls.map((toolCall) => ({\n name: toolCall.name,\n path: toolCall.path,\n input_summary: toolCall.input_summary,\n exit_code: toolCall.exit_code,\n }));\n}\n"],"mappings":"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","names":["version","existsSync","join","join","existsSync","eq","eq","now","eq","eq","eq","eq","getSqlite","eq","rowToHistorySnippet","now","rowToHistorySnippet","and","eq","randomUUID","randomUUID","eq","and","eq","randomUUID","randomUUID","eq","memories","existsSync","join","extractRepoSlugFromRemote","extractRepoSlugFromRemote","existsSync","join","existsSync","mkdirSync","readFileSync","join","execFileSync","join","mkdirSync","existsSync","readFileSync","execFileSync","eq","and","randomUUID","randomUUID","eq","eq","and","maintenance","readFileSync","readFileSync","eq","randomUUID","execSync","randomUUID","eq","execSync","eq","and","randomUUID","randomUUID","now","eq","randomUUID","now","eq","and","eq","DEFAULT_CONFIG","now","eq","and","desc","eq","gte","randomUUID","randomUUID","eq","and","gte","eq","gte","and","desc"]}
|