@orquentra/codebuddy 2.4.1 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +25 -2
  2. package/dist/{chunk-ITGRANYW.js → chunk-6MKEIDX5.js} +2 -2
  3. package/dist/{chunk-K63EOA4B.js → chunk-776EQXDV.js} +25 -6
  4. package/dist/chunk-776EQXDV.js.map +1 -0
  5. package/dist/chunk-JFDRBPYF.js +99 -0
  6. package/dist/chunk-JFDRBPYF.js.map +1 -0
  7. package/dist/chunk-JPHJBCZB.js +99 -0
  8. package/dist/chunk-JPHJBCZB.js.map +1 -0
  9. package/dist/{chunk-IBMJYIEP.js → chunk-L5AYZC3F.js} +7 -7
  10. package/dist/{chunk-DSN5CEHO.js → chunk-N34XHWBA.js} +3 -3
  11. package/dist/{chunk-3ZELDCR3.js → chunk-PCE4STAY.js} +7 -7
  12. package/dist/{chunk-TI5TQD6D.js → chunk-QDBDYCM2.js} +2 -2
  13. package/dist/{chunk-5OWZVZSO.js → chunk-SYWJG5NA.js} +8 -165
  14. package/dist/chunk-SYWJG5NA.js.map +1 -0
  15. package/dist/chunk-U4HAJLIB.js +91 -0
  16. package/dist/chunk-U4HAJLIB.js.map +1 -0
  17. package/dist/{chunk-IE2OUO54.js → chunk-UFZD3JAA.js} +3 -3
  18. package/dist/chunk-UN57FKQX.js +4033 -0
  19. package/dist/chunk-UN57FKQX.js.map +1 -0
  20. package/dist/chunk-VAKBJV26.js +5112 -0
  21. package/dist/chunk-VAKBJV26.js.map +1 -0
  22. package/dist/chunk-XBJQKCLU.js +103 -0
  23. package/dist/chunk-XBJQKCLU.js.map +1 -0
  24. package/dist/cli/index.js +2 -2
  25. package/dist/cloud-7WM3YLI4.js +17 -0
  26. package/dist/{codebuddy-D2xJ6hFk.d.ts → codebuddy-DM-i0Fu5.d.ts} +49 -18
  27. package/dist/{config-S2TULOMK.js → config-KFEHLV6W.js} +3 -3
  28. package/dist/index.d.ts +23 -3
  29. package/dist/index.js +34 -25
  30. package/dist/langgraph/index.d.ts +1 -1
  31. package/dist/lean-command-C5YPFKHP.js +15 -0
  32. package/dist/local-OTOY56B4.js +13 -0
  33. package/dist/{main-BFDVQHKO.js → main-HFHLGID4.js} +1410 -245
  34. package/dist/main-HFHLGID4.js.map +1 -0
  35. package/dist/{memory-NIBFAMY4.js → memory-4RGVLPKG.js} +6 -6
  36. package/dist/operations-LOBAQRLO.js +24 -0
  37. package/dist/operations-LOBAQRLO.js.map +1 -0
  38. package/dist/{rerank-Q7MIFNKA.js → rerank-3P3C2UHN.js} +4 -4
  39. package/dist/{summaries-TSE44KUQ.js → summaries-ZBV5IN7Y.js} +6 -6
  40. package/dist/summaries-ZBV5IN7Y.js.map +1 -0
  41. package/dist/{zvec-F27AR357.js → zvec-MAPSJQSR.js} +3 -3
  42. package/dist/zvec-MAPSJQSR.js.map +1 -0
  43. package/package.json +6 -2
  44. package/dist/chunk-5OWZVZSO.js.map +0 -1
  45. package/dist/chunk-K63EOA4B.js.map +0 -1
  46. package/dist/chunk-OLFCOR4U.js +0 -8580
  47. package/dist/chunk-OLFCOR4U.js.map +0 -1
  48. package/dist/lean-command-D6TZJEFX.js +0 -13
  49. package/dist/main-BFDVQHKO.js.map +0 -1
  50. /package/dist/{chunk-ITGRANYW.js.map → chunk-6MKEIDX5.js.map} +0 -0
  51. /package/dist/{chunk-IBMJYIEP.js.map → chunk-L5AYZC3F.js.map} +0 -0
  52. /package/dist/{chunk-DSN5CEHO.js.map → chunk-N34XHWBA.js.map} +0 -0
  53. /package/dist/{chunk-3ZELDCR3.js.map → chunk-PCE4STAY.js.map} +0 -0
  54. /package/dist/{chunk-TI5TQD6D.js.map → chunk-QDBDYCM2.js.map} +0 -0
  55. /package/dist/{chunk-IE2OUO54.js.map → chunk-UFZD3JAA.js.map} +0 -0
  56. /package/dist/{config-S2TULOMK.js.map → cloud-7WM3YLI4.js.map} +0 -0
  57. /package/dist/{lean-command-D6TZJEFX.js.map → config-KFEHLV6W.js.map} +0 -0
  58. /package/dist/{summaries-TSE44KUQ.js.map → lean-command-C5YPFKHP.js.map} +0 -0
  59. /package/dist/{zvec-F27AR357.js.map → local-OTOY56B4.js.map} +0 -0
  60. /package/dist/{memory-NIBFAMY4.js.map → memory-4RGVLPKG.js.map} +0 -0
  61. /package/dist/{rerank-Q7MIFNKA.js.map → rerank-3P3C2UHN.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/db/schema.ts","../src/db/bootstrap.ts","../src/db/client.ts","../src/db/migrator.ts","../src/db/repository.ts","../src/core/memory-search.ts","../src/providers/embedding-space.ts","../src/core/codebuddy.ts","../src/core/memory-lifecycle.ts","../src/planner/default-policy.ts","../src/providers/huggingface.ts","../src/providers/resilience.ts","../src/tracing/langsmith.ts","../src/core/config.ts","../src/core/memory-file-store.ts","../src/core/worker.ts","../src/core/operations.ts"],"sourcesContent":["import { sql } from \"drizzle-orm\";\nimport {\n boolean,\n customType,\n index,\n integer,\n jsonb,\n numeric,\n pgEnum,\n pgTable,\n text,\n timestamp,\n uniqueIndex,\n} from \"drizzle-orm/pg-core\";\n\nexport const VECTOR_DIMENSIONS = 384;\nexport const HNSW_M = 16;\nexport const HNSW_EF_CONSTRUCTION = 64;\n\nconst vector = customType<{ data: string; driverData: string }>({\n dataType() {\n return `vector(${VECTOR_DIMENSIONS})`;\n },\n});\n\nexport const memoryTypeEnum = pgEnum(\"memory_type\", [\"interaction\", \"fact\", \"summary\"]);\nexport const interactionRoleEnum = pgEnum(\"interaction_role\", [\"user\", \"assistant\", \"system\"]);\nexport const embeddingOwnerTypeEnum = pgEnum(\"embedding_owner_type\", [\n \"interaction\",\n \"fact\",\n \"summary\",\n]);\nexport const embeddingStatusEnum = pgEnum(\"embedding_status\", [\n \"pending\",\n \"processing\",\n \"ready\",\n \"failed\",\n]);\nexport const shareModeEnum = pgEnum(\"share_mode\", [\"reference\", \"snapshot\"]);\nexport const modelCallTypeEnum = pgEnum(\"model_call_type\", [\"embedding\", \"llm\"]);\nexport const modelCallStatusEnum = pgEnum(\"model_call_status\", [\n \"success\",\n \"failed\",\n \"timeout\",\n \"rate_limited\",\n \"gated\",\n \"fallback\",\n]);\nexport const auditActionEnum = pgEnum(\"audit_action\", [\n \"remember\",\n \"remember_batch\",\n \"share\",\n \"forget\",\n \"config\",\n]);\n\nconst createdAt = timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow();\nconst updatedAt = timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow();\n\nexport const namespaces = pgTable(\n \"namespaces\",\n {\n id: text(\"id\").primaryKey(),\n name: text(\"name\").notNull(),\n createdAt,\n updatedAt,\n },\n (table) => ({\n nameUnique: uniqueIndex(\"namespaces_name_unique\").on(table.name),\n }),\n);\n\nexport const interactions = pgTable(\n \"interactions\",\n {\n id: text(\"id\").primaryKey(),\n namespaceId: text(\"namespace_id\")\n .notNull()\n .references(() => namespaces.id, { onDelete: \"cascade\" }),\n sessionId: text(\"session_id\").notNull(),\n role: interactionRoleEnum(\"role\").notNull().default(\"user\"),\n content: text(\"content\").notNull(),\n contentHash: text(\"content_hash\").notNull(),\n tokenCount: integer(\"token_count\").notNull().default(0),\n createdByAgent: text(\"created_by_agent\"),\n createdAt,\n },\n (table) => ({\n namespaceContentHashUnique: uniqueIndex(\"interactions_namespace_content_hash_unique\").on(\n table.namespaceId,\n table.contentHash,\n ),\n namespaceSessionCreatedIdx: index(\"interactions_namespace_session_created_idx\").on(\n table.namespaceId,\n table.sessionId,\n table.createdAt,\n ),\n }),\n);\n\nexport const sessionSummaries = pgTable(\n \"session_summaries\",\n {\n id: text(\"id\").primaryKey(),\n namespaceId: text(\"namespace_id\")\n .notNull()\n .references(() => namespaces.id, { onDelete: \"cascade\" }),\n sessionId: text(\"session_id\").notNull(),\n content: text(\"content\").notNull(),\n version: integer(\"version\").notNull().default(1),\n tokenCount: integer(\"token_count\").notNull().default(0),\n createdByAgent: text(\"created_by_agent\"),\n /** See facts.fileBacked. */\n fileBacked: boolean(\"file_backed\").notNull().default(false),\n createdAt,\n },\n (table) => ({\n namespaceSessionVersionIdx: index(\"session_summaries_namespace_session_version_idx\").on(\n table.namespaceId,\n table.sessionId,\n table.version,\n ),\n }),\n);\n\nexport const facts = pgTable(\n \"facts\",\n {\n id: text(\"id\").primaryKey(),\n namespaceId: text(\"namespace_id\")\n .notNull()\n .references(() => namespaces.id, { onDelete: \"cascade\" }),\n subject: text(\"subject\").notNull(),\n predicate: text(\"predicate\").notNull(),\n object: text(\"object\").notNull(),\n propositionKey: text(\"proposition_key\"),\n content: text(\"content\").notNull(),\n contentHash: text(\"content_hash\").notNull(),\n confidence: numeric(\"confidence\", { precision: 5, scale: 4 }).notNull().default(\"1\"),\n /**\n * Historical provenance only — deliberately not a foreign key. Interactions\n * are ephemeral DB rows; Markdown facts must re-import after a rebuild that\n * lost them, and the ID must survive so `sourceDeleted` can be tracked.\n */\n sourceInteractionId: text(\"source_interaction_id\"),\n sourceDeleted: boolean(\"source_deleted\").notNull().default(false),\n supersededBy: text(\"superseded_by\"),\n /**\n * True once a reindex imported this row from its Markdown file. Only such\n * rows are deleted when the file disappears; DB-only legacy rows are kept.\n */\n fileBacked: boolean(\"file_backed\").notNull().default(false),\n embeddingModel: text(\"embedding_model\"),\n createdByAgent: text(\"created_by_agent\"),\n createdAt,\n updatedAt,\n },\n (table) => ({\n namespaceContentHashUnique: uniqueIndex(\"facts_namespace_content_hash_unique\").on(\n table.namespaceId,\n table.contentHash,\n ),\n namespaceSubjectIdx: index(\"facts_namespace_subject_idx\").on(table.namespaceId, table.subject),\n sourceInteractionIdx: index(\"facts_source_interaction_idx\").on(table.sourceInteractionId),\n }),\n);\n\nexport const embeddings = pgTable(\n \"embeddings\",\n {\n id: text(\"id\").primaryKey(),\n namespaceId: text(\"namespace_id\")\n .notNull()\n .references(() => namespaces.id, { onDelete: \"cascade\" }),\n ownerType: embeddingOwnerTypeEnum(\"owner_type\").notNull(),\n ownerId: text(\"owner_id\").notNull(),\n vector: vector(\"vector\").notNull(),\n embeddingModel: text(\"embedding_model\").notNull(),\n embeddingSpace: text(\"embedding_space\"),\n status: embeddingStatusEnum(\"status\").notNull().default(\"pending\"),\n attempts: integer(\"attempts\").notNull().default(0),\n lastError: text(\"last_error\"),\n /** Lease deadline while status='processing'; null otherwise. */\n leaseUntil: timestamp(\"lease_until\", { withTimezone: true }),\n leaseToken: text(\"lease_token\"),\n createdAt,\n updatedAt,\n },\n (table) => ({\n ownerUnique: uniqueIndex(\"embeddings_owner_unique\").on(table.ownerType, table.ownerId),\n namespaceModelStatusIdx: index(\"embeddings_namespace_model_status_idx\").on(\n table.namespaceId,\n table.embeddingModel,\n table.status,\n ),\n namespaceSpaceStatusIdx: index(\"embeddings_namespace_space_status_idx\").on(\n table.namespaceId,\n table.embeddingSpace,\n table.status,\n ),\n vectorHnswIdx: index(\"embeddings_vector_hnsw_idx\").using(\n \"hnsw\",\n sql`${table.vector} vector_cosine_ops`,\n ),\n }),\n);\n\nexport const shares = pgTable(\n \"shares\",\n {\n id: text(\"id\").primaryKey(),\n fromNamespaceId: text(\"from_namespace_id\")\n .notNull()\n .references(() => namespaces.id, { onDelete: \"cascade\" }),\n toNamespaceId: text(\"to_namespace_id\")\n .notNull()\n .references(() => namespaces.id, { onDelete: \"cascade\" }),\n sourceFactId: text(\"source_fact_id\")\n .notNull()\n .references(() => facts.id, { onDelete: \"cascade\" }),\n snapshotFactId: text(\"snapshot_fact_id\").references(() => facts.id, { onDelete: \"set null\" }),\n mode: shareModeEnum(\"mode\").notNull().default(\"reference\"),\n tombstoned: boolean(\"tombstoned\").notNull().default(false),\n createdByAgent: text(\"created_by_agent\"),\n createdAt,\n },\n (table) => ({\n shareUnique: uniqueIndex(\"shares_target_source_unique\").on(\n table.toNamespaceId,\n table.sourceFactId,\n table.mode,\n ),\n fromNamespaceIdx: index(\"shares_from_namespace_idx\").on(table.fromNamespaceId),\n }),\n);\n\nexport const checkpoints = pgTable(\n \"checkpoints\",\n {\n id: text(\"id\").primaryKey(),\n namespaceId: text(\"namespace_id\")\n .notNull()\n .references(() => namespaces.id, { onDelete: \"cascade\" }),\n threadId: text(\"thread_id\").notNull(),\n checkpointId: text(\"checkpoint_id\").notNull(),\n parentId: text(\"parent_id\"),\n channelValues: jsonb(\"channel_values\").notNull().default(sql`'{}'::jsonb`),\n metadata: jsonb(\"metadata\").notNull().default(sql`'{}'::jsonb`),\n createdAt,\n },\n (table) => ({\n checkpointUnique: uniqueIndex(\"checkpoints_thread_checkpoint_unique\").on(\n table.namespaceId,\n table.threadId,\n table.checkpointId,\n ),\n }),\n);\n\nexport const modelCalls = pgTable(\n \"model_calls\",\n {\n id: text(\"id\").primaryKey(),\n namespaceId: text(\"namespace_id\").references(() => namespaces.id, { onDelete: \"set null\" }),\n model: text(\"model\").notNull(),\n type: modelCallTypeEnum(\"type\").notNull(),\n latencyMs: integer(\"latency_ms\"),\n tokens: integer(\"tokens\"),\n status: modelCallStatusEnum(\"status\").notNull(),\n error: text(\"error\"),\n metadata: jsonb(\"metadata\").notNull().default(sql`'{}'::jsonb`),\n createdAt,\n },\n (table) => ({\n modelCreatedIdx: index(\"model_calls_model_created_idx\").on(table.model, table.createdAt),\n namespaceCreatedIdx: index(\"model_calls_namespace_created_idx\").on(\n table.namespaceId,\n table.createdAt,\n ),\n }),\n);\n\nexport const auditLog = pgTable(\n \"audit_log\",\n {\n id: text(\"id\").primaryKey(),\n namespaceId: text(\"namespace_id\").references(() => namespaces.id, { onDelete: \"set null\" }),\n action: auditActionEnum(\"action\").notNull(),\n entityType: text(\"entity_type\").notNull(),\n entityId: text(\"entity_id\"),\n createdByAgent: text(\"created_by_agent\"),\n metadata: jsonb(\"metadata\").notNull().default(sql`'{}'::jsonb`),\n createdAt,\n },\n (table) => ({\n namespaceActionCreatedIdx: index(\"audit_log_namespace_action_created_idx\").on(\n table.namespaceId,\n table.action,\n table.createdAt,\n ),\n }),\n);\n","import type { Sql } from \"postgres\";\nimport { VECTOR_DIMENSIONS } from \"./schema.js\";\n\nexport type PgvectorHealth = {\n available: boolean;\n installedVersion: string | null;\n};\n\nexport type EmbeddingDimensionCheck = {\n ok: boolean;\n expectedDimensions: number;\n configuredModels: string[];\n existingModels: string[];\n reason?: string;\n};\n\nexport async function enablePgvector(sql: Sql): Promise<void> {\n await sql`create extension if not exists vector`;\n}\n\nexport async function checkPgvector(sql: Sql): Promise<PgvectorHealth> {\n const result = await sql<{ extversion: string }[]>`\n select extversion from pg_extension where extname = 'vector'\n `;\n\n return {\n available: result.length > 0,\n installedVersion: result[0]?.extversion ?? null,\n };\n}\n\nexport async function getExistingEmbeddingModels(sql: Sql): Promise<string[]> {\n const rows = await sql<{ embedding_model: string }[]>`\n select distinct embedding_model\n from embeddings\n where embedding_model is not null\n order by embedding_model\n `;\n\n return rows.map((row) => row.embedding_model);\n}\n\nexport async function checkEmbeddingDimensionCompatibility(\n sql: Sql,\n configuredModels: Array<{ id: string; dimensions?: number }>,\n expectedDimensions = VECTOR_DIMENSIONS,\n): Promise<EmbeddingDimensionCheck> {\n const mismatchedConfiguredModel = configuredModels.find(\n (model) => model.dimensions !== expectedDimensions,\n );\n\n if (mismatchedConfiguredModel) {\n return {\n ok: false,\n expectedDimensions,\n configuredModels: configuredModels.map((model) => model.id),\n existingModels: [],\n reason: `Configured embedding model ${mismatchedConfiguredModel.id} does not match ${expectedDimensions} dimensions.`,\n };\n }\n\n const existingModels = await getExistingEmbeddingModels(sql);\n const configuredModelIds = new Set(configuredModels.map((model) => model.id));\n const unknownExistingModels = existingModels.filter((model) => !configuredModelIds.has(model));\n\n if (unknownExistingModels.length > 0) {\n return {\n ok: false,\n expectedDimensions,\n configuredModels: configuredModels.map((model) => model.id),\n existingModels,\n reason: `Existing embeddings use unconfigured models: ${unknownExistingModels.join(\", \")}.`,\n };\n }\n\n return {\n ok: true,\n expectedDimensions,\n configuredModels: configuredModels.map((model) => model.id),\n existingModels,\n };\n}\n\nexport async function bootstrapDatabase(sql: Sql): Promise<PgvectorHealth> {\n await enablePgvector(sql);\n return checkPgvector(sql);\n}\n","import { drizzle } from \"drizzle-orm/postgres-js\";\nimport postgres from \"postgres\";\nimport * as schema from \"./schema.js\";\n\nexport type DatabaseClientConfig = {\n postgresUrl: string;\n maxConnections?: number;\n /** postgres.js waits 30 s by default; latency-bound callers (hooks) pass less. */\n connectTimeoutSeconds?: number;\n};\n\nexport type DatabaseClient = ReturnType<typeof createDatabaseClient>;\n\nexport function createDatabaseClient(config: DatabaseClientConfig) {\n const sql = postgres(config.postgresUrl, {\n max: config.maxConnections ?? 10,\n ...(config.connectTimeoutSeconds !== undefined\n ? { connect_timeout: config.connectTimeoutSeconds }\n : {}),\n // postgres.js logs NOTICE messages (e.g. \"extension already exists,\n // skipping\") to stdout by default. Over the MCP stdio transport stdout\n // carries JSON-RPC, so any notice corrupts the stream and the client\n // reports \"Unexpected token … is not valid JSON\". Route notices to\n // stderr instead, where logs belong.\n onnotice: (notice) => {\n process.stderr.write(`${JSON.stringify(notice)}\\n`);\n },\n });\n\n return {\n sql,\n db: drizzle(sql, { schema }),\n async close(): Promise<void> {\n await sql.end();\n },\n };\n}\n\nexport async function pingDatabase(client: Pick<ReturnType<typeof createDatabaseClient>, \"sql\">) {\n const result = await client.sql`select 1 as ok`;\n return result[0]?.ok === 1;\n}\n","import { existsSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { migrate } from \"drizzle-orm/postgres-js/migrator\";\nimport type { DatabaseClient } from \"./client.js\";\n\n/**\n * Locate the bundled migrations folder. We may be running from any of:\n * - source via tsx -> src/db/migrator.ts\n * - built dist -> dist/db.../<chunk>.js (tsup chunked layout)\n * - flat dist -> dist/index.js (single bundle)\n * - installed npm pkg -> node_modules/<pkg>/dist/... or src/db/migrations\n *\n * package.json `files` ships `src/db/migrations`, so even after publish the\n * SQL + meta files live at <pkg root>/src/db/migrations. We walk a few levels\n * up from import.meta.url looking for either `<here>/migrations` or\n * `<pkg root>/src/db/migrations`.\n */\nexport function resolveMigrationsFolder(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n // Co-located (src/db/ -> src/db/migrations)\n resolve(here, \"migrations\"),\n // Built dist (dist/<chunk>.js -> ../src/db/migrations relative paths)\n resolve(here, \"..\", \"src\", \"db\", \"migrations\"),\n resolve(here, \"..\", \"..\", \"src\", \"db\", \"migrations\"),\n resolve(here, \"..\", \"..\", \"..\", \"src\", \"db\", \"migrations\"),\n resolve(here, \"..\", \"..\", \"..\", \"..\", \"src\", \"db\", \"migrations\"),\n // CWD fallback (developer running from repo root)\n resolve(process.cwd(), \"src\", \"db\", \"migrations\"),\n ];\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n throw new Error(\n `Could not locate migrations folder. Tried:\\n ${candidates.join(\"\\n \")}\\n` +\n `If this is an npm-installed package, make sure src/db/migrations was included in the tarball.`,\n );\n}\n\nexport async function runMigrations(client: DatabaseClient): Promise<void> {\n const migrationsFolder = resolveMigrationsFolder();\n await migrate(client.db, { migrationsFolder });\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { createHash } from \"node:crypto\";\nimport { and, desc, eq, inArray, isNull, lt, ne, or, type SQL, sql } from \"drizzle-orm\";\nimport { generateEntityId } from \"../core/ids.js\";\nimport { candidateLimit, lexicalTerms, validSearchVector } from \"../core/memory-search.js\";\nimport type {\n AgentWriteBreakdown,\n AuditEntry,\n EmbeddingJob,\n EmbeddingStatusSnapshot,\n FactCursor,\n FactFileUpsert,\n FactInsert,\n FileUpsertResult,\n InteractionInsert,\n LexicalFactSearchResult,\n ListedFact,\n MemoryRepository,\n MemoryStats,\n ModelCallEntry,\n NamespaceRow,\n NamespaceSummary,\n PendingEmbeddingCounts,\n PendingEmbeddingInsert,\n ReadyEmbedding,\n RecentFact,\n RecentInteraction,\n RecentSummary,\n ShareWriteInput,\n SimilaritySearchInput,\n SimilaritySearchResult,\n SummaryFileUpsert,\n SummaryInsert,\n VectorIndexHealth,\n WriteResult,\n} from \"../core/repository.js\";\nimport { embeddingSpace, embeddingSpaceKey } from \"../providers/embedding-space.js\";\nimport type { DatabaseClient } from \"./client.js\";\nimport {\n auditLog,\n embeddings,\n facts,\n interactions,\n modelCalls,\n namespaces,\n sessionSummaries,\n shares,\n} from \"./schema.js\";\n\ntype Db = DatabaseClient[\"db\"];\n\nexport class PostgresMemoryRepository implements MemoryRepository {\n private readonly client: DatabaseClient;\n private readonly sessionTransaction = new AsyncLocalStorage<Db>();\n\n constructor(client: DatabaseClient) {\n this.client = client;\n }\n\n private get db(): Db {\n return this.sessionTransaction.getStore() ?? this.client.db;\n }\n\n async ensureNamespace(name: string): Promise<NamespaceRow> {\n const existing = await this.getNamespaceByName(name);\n if (existing) return existing;\n const id = generateEntityId(\"ns\");\n await this.db\n .insert(namespaces)\n .values({ id, name })\n .onConflictDoNothing({ target: namespaces.name });\n const row = await this.getNamespaceByName(name);\n if (!row) throw new Error(`Failed to ensure namespace ${name}.`);\n return row;\n }\n\n async getNamespaceByName(name: string): Promise<NamespaceRow | null> {\n const rows = await this.db\n .select({ id: namespaces.id, name: namespaces.name })\n .from(namespaces)\n .where(eq(namespaces.name, name))\n .limit(1);\n return rows[0] ?? null;\n }\n\n async withSessionLock<T>(\n namespaceId: string,\n sessionId: string,\n fn: () => Promise<T>,\n ): Promise<T> {\n const [k1, k2] = advisoryLockKeys(namespaceId, sessionId);\n return this.client.db.transaction(async (tx) => {\n await tx.execute(sql`select pg_advisory_xact_lock(${k1}, ${k2})`);\n // Nested repository transactions become savepoints on this connection.\n // Without this context, fn() requests a second pool connection while\n // the lock holds the first and deadlocks when the pool is exhausted.\n return this.sessionTransaction.run(tx as unknown as Db, fn);\n });\n }\n\n async writeInteraction(input: {\n interaction: InteractionInsert;\n embedding: PendingEmbeddingInsert;\n audit: AuditEntry;\n }): Promise<WriteResult> {\n return this.db.transaction(async (tx) => {\n const existing = await tx\n .select({ id: interactions.id, sessionId: interactions.sessionId })\n .from(interactions)\n .where(\n and(\n eq(interactions.namespaceId, input.interaction.namespaceId),\n eq(interactions.contentHash, input.interaction.contentHash),\n ),\n )\n .limit(1);\n const existingRow = existing[0];\n if (existingRow) {\n return {\n id: existingRow.id,\n embeddingId: \"\",\n sessionId: existingRow.sessionId,\n deduplicated: true,\n };\n }\n await tx.insert(interactions).values({\n id: input.interaction.id,\n namespaceId: input.interaction.namespaceId,\n sessionId: input.interaction.sessionId,\n content: input.interaction.content,\n contentHash: input.interaction.contentHash,\n tokenCount: input.interaction.tokenCount,\n createdByAgent: input.interaction.createdByAgent ?? null,\n });\n await tx.insert(embeddings).values({\n id: input.embedding.id,\n namespaceId: input.embedding.namespaceId,\n ownerType: input.embedding.ownerType,\n ownerId: input.embedding.ownerId,\n vector: zeroVectorLiteral(),\n embeddingModel: input.embedding.embeddingModel,\n status: \"pending\",\n });\n await tx.insert(auditLog).values(toAuditRow(input.audit));\n return {\n id: input.interaction.id,\n embeddingId: input.embedding.id,\n sessionId: input.interaction.sessionId,\n deduplicated: false,\n };\n });\n }\n\n async writeFact(input: {\n fact: FactInsert;\n embedding: PendingEmbeddingInsert;\n audit: AuditEntry;\n }): Promise<WriteResult> {\n return this.db.transaction(async (tx) => {\n const existing = await tx\n .select({ id: facts.id })\n .from(facts)\n .where(\n and(\n eq(facts.namespaceId, input.fact.namespaceId),\n eq(facts.contentHash, input.fact.contentHash),\n ),\n )\n .limit(1);\n const existingRow = existing[0];\n if (existingRow) {\n return {\n id: existingRow.id,\n embeddingId: \"\",\n sessionId: \"\",\n deduplicated: true,\n };\n }\n // Same id under a different hash (e.g. a raw DB row later rebuilt from its\n // redacted Markdown) is the same fact, not a new one.\n const sameId = await tx\n .select({ id: facts.id })\n .from(facts)\n .where(eq(facts.id, input.fact.id))\n .limit(1);\n if (sameId[0]) {\n return { id: sameId[0].id, embeddingId: \"\", sessionId: \"\", deduplicated: true };\n }\n await tx.insert(facts).values({\n id: input.fact.id,\n namespaceId: input.fact.namespaceId,\n subject: input.fact.subject,\n predicate: input.fact.predicate,\n object: input.fact.object,\n content: input.fact.content,\n contentHash: input.fact.contentHash,\n propositionKey: input.fact.propositionKey ?? null,\n confidence: String(input.fact.confidence ?? 1),\n sourceDeleted: input.fact.sourceDeleted ?? false,\n supersededBy: input.fact.supersededBy ?? null,\n ...(input.fact.createdAt ? { createdAt: input.fact.createdAt } : {}),\n sourceInteractionId: input.fact.sourceInteractionId ?? null,\n createdByAgent: input.fact.createdByAgent ?? null,\n });\n await tx.insert(embeddings).values({\n id: input.embedding.id,\n namespaceId: input.embedding.namespaceId,\n ownerType: input.embedding.ownerType,\n ownerId: input.embedding.ownerId,\n vector: zeroVectorLiteral(),\n embeddingModel: input.embedding.embeddingModel,\n status: \"pending\",\n });\n await tx.insert(auditLog).values(toAuditRow(input.audit));\n return {\n id: input.fact.id,\n embeddingId: input.embedding.id,\n sessionId: \"\",\n deduplicated: false,\n };\n });\n }\n\n async writeSummary(input: {\n summary: SummaryInsert;\n embedding: PendingEmbeddingInsert;\n audit: AuditEntry;\n }): Promise<WriteResult> {\n return this.db.transaction(async (tx) => {\n const existing = await tx\n .select({ id: sessionSummaries.id, sessionId: sessionSummaries.sessionId })\n .from(sessionSummaries)\n .where(eq(sessionSummaries.id, input.summary.id))\n .limit(1);\n const existingRow = existing[0];\n if (existingRow) {\n return {\n id: existingRow.id,\n embeddingId: \"\",\n sessionId: existingRow.sessionId,\n deduplicated: true,\n };\n }\n await tx.insert(sessionSummaries).values({\n id: input.summary.id,\n namespaceId: input.summary.namespaceId,\n sessionId: input.summary.sessionId,\n content: input.summary.content,\n version: input.summary.version ?? 1,\n tokenCount: input.summary.tokenCount,\n createdByAgent: input.summary.createdByAgent ?? null,\n });\n await tx.insert(embeddings).values({\n id: input.embedding.id,\n namespaceId: input.embedding.namespaceId,\n ownerType: input.embedding.ownerType,\n ownerId: input.embedding.ownerId,\n vector: zeroVectorLiteral(),\n embeddingModel: input.embedding.embeddingModel,\n status: \"pending\",\n });\n await tx.insert(auditLog).values(toAuditRow(input.audit));\n return {\n id: input.summary.id,\n embeddingId: input.embedding.id,\n sessionId: input.summary.sessionId,\n deduplicated: false,\n };\n });\n }\n\n async upsertFactFromFile(input: {\n fact: FactFileUpsert;\n embedding: PendingEmbeddingInsert;\n audit: AuditEntry;\n }): Promise<FileUpsertResult> {\n const fact = input.fact;\n return this.db.transaction(async (tx) => {\n const [existing] = await tx\n .select()\n .from(facts)\n .where(eq(facts.id, fact.id))\n .for(\"update\")\n .limit(1);\n if (existing && existing.namespaceId !== fact.namespaceId) {\n throw new Error(`fact ${fact.id} already belongs to another namespace`);\n }\n const [duplicate] = await tx\n .select({ id: facts.id })\n .from(facts)\n .where(\n and(\n eq(facts.namespaceId, fact.namespaceId),\n eq(facts.contentHash, fact.contentHash),\n ne(facts.id, fact.id),\n ),\n )\n .limit(1);\n if (duplicate) throw new Error(`content duplicates fact ${duplicate.id}`);\n const values = {\n subject: fact.subject,\n predicate: fact.predicate,\n object: fact.object,\n content: fact.content,\n contentHash: fact.contentHash,\n confidence: String(fact.confidence),\n sourceInteractionId: fact.sourceInteractionId ?? null,\n sourceDeleted: fact.sourceDeleted,\n supersededBy: fact.supersededBy,\n propositionKey: fact.propositionKey ?? null,\n createdByAgent: fact.createdByAgent ?? null,\n createdAt: fact.createdAt,\n fileBacked: true,\n };\n if (!existing) {\n await tx.insert(facts).values({ id: fact.id, namespaceId: fact.namespaceId, ...values });\n await upsertPendingEmbedding(tx, input.embedding, true);\n await tx.insert(auditLog).values(toAuditRow(input.audit));\n return { status: \"inserted\" };\n }\n const contentChanged = existing.content !== fact.content;\n const metadataChanged =\n existing.subject !== values.subject ||\n existing.predicate !== values.predicate ||\n existing.object !== values.object ||\n Number(existing.confidence) !== Number(fact.confidence.toFixed(4)) ||\n existing.sourceInteractionId !== values.sourceInteractionId ||\n existing.sourceDeleted !== values.sourceDeleted ||\n existing.supersededBy !== values.supersededBy ||\n existing.propositionKey !== values.propositionKey ||\n existing.createdByAgent !== values.createdByAgent ||\n existing.createdAt.getTime() !== values.createdAt.getTime();\n if (contentChanged || metadataChanged || !existing.fileBacked) {\n await tx\n .update(facts)\n .set({ ...values, updatedAt: sql`now()` })\n .where(and(eq(facts.namespaceId, fact.namespaceId), eq(facts.id, fact.id)));\n }\n // Always ensure an embedding row exists (a partial DB loss may have\n // dropped it); reset it only when the embedded text changed.\n await upsertPendingEmbedding(tx, input.embedding, contentChanged);\n if (!contentChanged && !metadataChanged) return { status: \"unchanged\" };\n await tx.insert(auditLog).values(toAuditRow(input.audit));\n return { status: \"updated\" };\n });\n }\n\n async upsertSummaryFromFile(input: {\n summary: SummaryFileUpsert;\n embedding: PendingEmbeddingInsert;\n audit: AuditEntry;\n }): Promise<FileUpsertResult> {\n const summary = input.summary;\n return this.db.transaction(async (tx) => {\n const [existing] = await tx\n .select()\n .from(sessionSummaries)\n .where(eq(sessionSummaries.id, summary.id))\n .for(\"update\")\n .limit(1);\n if (existing && existing.namespaceId !== summary.namespaceId) {\n throw new Error(`summary ${summary.id} already belongs to another namespace`);\n }\n const values = {\n sessionId: summary.sessionId,\n content: summary.content,\n version: summary.version ?? 1,\n tokenCount: summary.tokenCount,\n createdByAgent: summary.createdByAgent ?? null,\n createdAt: summary.createdAt,\n fileBacked: true,\n };\n if (!existing) {\n await tx.insert(sessionSummaries).values({\n id: summary.id,\n namespaceId: summary.namespaceId,\n ...values,\n });\n await upsertPendingEmbedding(tx, input.embedding, true);\n await tx.insert(auditLog).values(toAuditRow(input.audit));\n return { status: \"inserted\" };\n }\n const contentChanged = existing.content !== summary.content;\n const metadataChanged =\n existing.sessionId !== values.sessionId ||\n existing.version !== values.version ||\n existing.tokenCount !== values.tokenCount ||\n existing.createdByAgent !== values.createdByAgent ||\n existing.createdAt.getTime() !== values.createdAt.getTime();\n if (contentChanged || metadataChanged || !existing.fileBacked) {\n await tx\n .update(sessionSummaries)\n .set(values)\n .where(\n and(\n eq(sessionSummaries.namespaceId, summary.namespaceId),\n eq(sessionSummaries.id, summary.id),\n ),\n );\n }\n await upsertPendingEmbedding(tx, input.embedding, contentChanged);\n if (!contentChanged && !metadataChanged) return { status: \"unchanged\" };\n await tx.insert(auditLog).values(toAuditRow(input.audit));\n return { status: \"updated\" };\n });\n }\n\n async listFileBackedIds(namespaceId: string): Promise<{ facts: string[]; summaries: string[] }> {\n const [factRows, summaryRows] = await Promise.all([\n this.db\n .select({ id: facts.id })\n .from(facts)\n .where(and(eq(facts.namespaceId, namespaceId), eq(facts.fileBacked, true))),\n this.db\n .select({ id: sessionSummaries.id })\n .from(sessionSummaries)\n .where(\n and(eq(sessionSummaries.namespaceId, namespaceId), eq(sessionSummaries.fileBacked, true)),\n ),\n ]);\n return { facts: factRows.map((row) => row.id), summaries: summaryRows.map((row) => row.id) };\n }\n\n /**\n * Claim up to `limit` embeddable jobs.\n *\n * A claim is a LEASE, not just a row lock: claimed rows move to\n * status='processing' with a `lease_until` deadline, so protection survives\n * the committing transaction. Concurrent workers (e.g. Claude Desktop and\n * Codex both running `codebuddy serve`) therefore never process the same\n * item twice. Expired leases are re-claimable, so a crashed worker's work is\n * picked up again instead of being stuck forever.\n */\n async claimPendingEmbeddings(limit: number): Promise<EmbeddingJob[]> {\n const rows = await this.client.sql<\n {\n id: string;\n lease_token: string;\n namespace_id: string;\n owner_type: \"interaction\" | \"fact\" | \"summary\";\n owner_id: string;\n embedding_model: string;\n attempts: number;\n content: string;\n }[]\n >`\n with claimed as (\n select id from embeddings\n where status = 'pending'\n or (status = 'processing' and (lease_until is null or lease_until < now()))\n order by created_at asc\n for update skip locked\n limit ${limit}\n )\n update embeddings e\n set status = 'processing',\n lease_until = now() + interval '120 seconds',\n lease_token = ${generateEntityId(\"lease\")},\n updated_at = now()\n from claimed\n where e.id = claimed.id\n returning\n e.id,\n e.lease_token,\n e.namespace_id,\n e.owner_type,\n e.owner_id,\n e.embedding_model,\n e.attempts,\n coalesce(\n (select content from interactions where id = e.owner_id),\n (select content from facts where id = e.owner_id),\n (select content from session_summaries where id = e.owner_id)\n ) as content\n `;\n return rows.map((row) => ({\n id: row.id,\n leaseToken: row.lease_token,\n leaseMs: 120_000,\n namespaceId: row.namespace_id,\n ownerType: row.owner_type,\n ownerId: row.owner_id,\n embeddingModel: row.embedding_model,\n attempts: row.attempts,\n content: row.content ?? \"\",\n }));\n }\n\n async renewEmbeddingLease(id: string, leaseToken: string): Promise<boolean> {\n const rows = await this.db\n .update(embeddings)\n .set({ leaseUntil: sql`now() + interval '120 seconds'` })\n .where(\n and(\n eq(embeddings.id, id),\n eq(embeddings.leaseToken, leaseToken),\n eq(embeddings.status, \"processing\"),\n sql`${embeddings.leaseUntil} > now()`,\n ),\n )\n .returning({ id: embeddings.id });\n return rows.length > 0;\n }\n\n async markEmbeddingReady(\n id: string,\n leaseToken: string,\n vector: number[],\n model: string,\n space?: string,\n ): Promise<boolean> {\n const literal = `[${vector.join(\",\")}]`;\n const rows = await this.db\n .update(embeddings)\n .set({\n status: \"ready\",\n vector: literal,\n embeddingModel: model,\n embeddingSpace:\n space ?? embeddingSpaceKey(embeddingSpace({ model, dimensions: vector.length })),\n lastError: null,\n leaseUntil: null,\n leaseToken: null,\n updatedAt: sql`now()`,\n })\n .where(\n and(\n eq(embeddings.id, id),\n eq(embeddings.leaseToken, leaseToken),\n eq(embeddings.status, \"processing\"),\n sql`${embeddings.leaseUntil} > now()`,\n ),\n )\n .returning({ id: embeddings.id });\n return rows.length > 0;\n }\n\n /**\n * Record a failure. Below `maxAttempts`, the row goes back to\n * 'processing' with an exponentially growing lease (2s · 2^(attempts-1),\n * capped at 60s) that acts as a retry backoff timer — a rate-limited\n * endpoint is no longer hammered every poll tick. At `maxAttempts` the job\n * is parked as 'failed'.\n */\n async markEmbeddingFailed(\n id: string,\n leaseToken: string,\n error: string,\n attempts: number,\n options?: { maxAttempts?: number },\n ): Promise<boolean> {\n const maxAttempts = options?.maxAttempts ?? 5;\n const backoffSeconds = Math.min(60, 2 ** Math.max(0, attempts - 1));\n const rows = await this.db\n .update(embeddings)\n .set({\n status: sql`case when ${attempts} >= ${maxAttempts} then 'failed'::embedding_status else 'processing'::embedding_status end`,\n leaseUntil: sql`case when ${attempts} >= ${maxAttempts} then null else now() + (${backoffSeconds} || ' seconds')::interval end`,\n leaseToken: null,\n attempts,\n lastError: error,\n updatedAt: sql`now()`,\n })\n .where(\n and(\n eq(embeddings.id, id),\n eq(embeddings.leaseToken, leaseToken),\n eq(embeddings.status, \"processing\"),\n sql`${embeddings.leaseUntil} > now()`,\n ),\n )\n .returning({ id: embeddings.id });\n return rows.length > 0;\n }\n\n async getEmbeddingStatus(id: string): Promise<EmbeddingStatusSnapshot | null> {\n const rows = await this.db\n .select({\n id: embeddings.id,\n status: embeddings.status,\n attempts: embeddings.attempts,\n lastError: embeddings.lastError,\n })\n .from(embeddings)\n .where(eq(embeddings.id, id))\n .limit(1);\n const row = rows[0];\n if (!row) return null;\n return {\n id: row.id,\n status: row.status,\n attempts: row.attempts,\n lastError: row.lastError,\n };\n }\n\n async shareReference(input: ShareWriteInput): Promise<void> {\n await this.db\n .insert(shares)\n .values({\n id: input.id,\n fromNamespaceId: input.fromNamespaceId,\n toNamespaceId: input.toNamespaceId,\n sourceFactId: input.sourceFactId,\n mode: \"reference\",\n createdByAgent: input.createdByAgent ?? null,\n })\n .onConflictDoUpdate({\n target: [shares.toNamespaceId, shares.sourceFactId, shares.mode],\n set: { tombstoned: false },\n });\n }\n\n async revokeShares(\n fromNamespaceId: string,\n toNamespaceId: string,\n factIds: string[],\n ): Promise<number> {\n if (factIds.length === 0) return 0;\n const revoked = await this.db\n .update(shares)\n .set({ tombstoned: true })\n .where(\n and(\n eq(shares.fromNamespaceId, fromNamespaceId),\n eq(shares.toNamespaceId, toNamespaceId),\n eq(shares.mode, \"reference\"),\n eq(shares.tombstoned, false),\n inArray(shares.sourceFactId, factIds),\n ),\n )\n .returning({ id: shares.id });\n return revoked.length;\n }\n\n async shareSnapshot(input: {\n share: ShareWriteInput;\n snapshotFact: FactInsert;\n embedding: PendingEmbeddingInsert;\n }): Promise<{ snapshotFactId: string }> {\n return this.db.transaction(async (tx) => {\n const prior = await tx\n .select({ snapshotFactId: shares.snapshotFactId })\n .from(shares)\n .where(\n and(\n eq(shares.toNamespaceId, input.share.toNamespaceId),\n eq(shares.sourceFactId, input.share.sourceFactId),\n eq(shares.mode, \"snapshot\"),\n ),\n )\n .limit(1);\n const priorId = prior[0]?.snapshotFactId;\n if (priorId) return { snapshotFactId: priorId };\n // An identical copy may already exist (e.g. rebuilt from the target's Markdown).\n const copy = await tx\n .select({ id: facts.id })\n .from(facts)\n .where(\n and(\n eq(facts.namespaceId, input.snapshotFact.namespaceId),\n eq(facts.contentHash, input.snapshotFact.contentHash),\n ),\n )\n .limit(1);\n const snapshotFactId = copy[0]?.id ?? input.snapshotFact.id;\n if (!copy[0]) {\n await tx.insert(facts).values({\n id: input.snapshotFact.id,\n namespaceId: input.snapshotFact.namespaceId,\n subject: input.snapshotFact.subject,\n predicate: input.snapshotFact.predicate,\n object: input.snapshotFact.object,\n content: input.snapshotFact.content,\n contentHash: input.snapshotFact.contentHash,\n sourceInteractionId: input.snapshotFact.sourceInteractionId ?? null,\n createdByAgent: input.snapshotFact.createdByAgent ?? null,\n });\n await tx.insert(embeddings).values({\n id: input.embedding.id,\n namespaceId: input.embedding.namespaceId,\n ownerType: input.embedding.ownerType,\n ownerId: input.embedding.ownerId,\n vector: zeroVectorLiteral(),\n embeddingModel: input.embedding.embeddingModel,\n status: \"pending\",\n });\n }\n await tx\n .insert(shares)\n .values({\n id: input.share.id,\n fromNamespaceId: input.share.fromNamespaceId,\n toNamespaceId: input.share.toNamespaceId,\n sourceFactId: input.share.sourceFactId,\n snapshotFactId,\n mode: \"snapshot\",\n createdByAgent: input.share.createdByAgent ?? null,\n })\n .onConflictDoUpdate({\n target: [shares.toNamespaceId, shares.sourceFactId, shares.mode],\n set: { snapshotFactId },\n });\n return { snapshotFactId };\n });\n }\n\n async forgetInteraction(\n namespaceId: string,\n id: string,\n audit: AuditEntry,\n ): Promise<{ found: boolean; sourceDeletedFactIds: string[] }> {\n return this.db.transaction(async (tx) => {\n // Lock the interaction first: concurrent fact inserts referencing it\n // block on the FK check, so no dependent can slip past the marking.\n const existing = await tx\n .select({ id: interactions.id })\n .from(interactions)\n .where(and(eq(interactions.namespaceId, namespaceId), eq(interactions.id, id)))\n .for(\"update\");\n if (existing.length === 0) return { found: false, sourceDeletedFactIds: [] };\n // Mark dependents BEFORE the delete: the FK is ON DELETE SET NULL, so\n // afterwards nothing would match source_interaction_id.\n const marked = await tx\n .update(facts)\n .set({ sourceDeleted: true })\n .where(and(eq(facts.namespaceId, namespaceId), eq(facts.sourceInteractionId, id)))\n .returning({ id: facts.id });\n await tx\n .delete(interactions)\n .where(and(eq(interactions.namespaceId, namespaceId), eq(interactions.id, id)));\n await tx\n .delete(embeddings)\n .where(\n and(\n eq(embeddings.namespaceId, namespaceId),\n eq(embeddings.ownerType, \"interaction\"),\n eq(embeddings.ownerId, id),\n ),\n );\n await tx.insert(auditLog).values(toAuditRow(audit));\n return { found: true, sourceDeletedFactIds: marked.map((row) => row.id) };\n });\n }\n\n async forgetFact(\n namespaceId: string,\n id: string,\n audit: AuditEntry,\n ): Promise<{ found: boolean }> {\n return this.db.transaction(async (tx) => {\n const deleted = await tx\n .delete(facts)\n .where(and(eq(facts.namespaceId, namespaceId), eq(facts.id, id)))\n .returning({ id: facts.id });\n if (deleted.length === 0) return { found: false };\n await tx\n .delete(embeddings)\n .where(\n and(\n eq(embeddings.namespaceId, namespaceId),\n eq(embeddings.ownerType, \"fact\"),\n eq(embeddings.ownerId, id),\n ),\n );\n await tx\n .update(shares)\n .set({ tombstoned: true })\n .where(\n and(\n eq(shares.fromNamespaceId, namespaceId),\n eq(shares.sourceFactId, id),\n eq(shares.mode, \"reference\"),\n ),\n );\n await tx.insert(auditLog).values(toAuditRow(audit));\n return { found: true };\n });\n }\n\n async forgetSummary(\n namespaceId: string,\n id: string,\n audit: AuditEntry,\n ): Promise<{ found: boolean }> {\n return this.db.transaction(async (tx) => {\n const deleted = await tx\n .delete(sessionSummaries)\n .where(and(eq(sessionSummaries.namespaceId, namespaceId), eq(sessionSummaries.id, id)))\n .returning({ id: sessionSummaries.id });\n if (deleted.length === 0) return { found: false };\n await tx\n .delete(embeddings)\n .where(\n and(\n eq(embeddings.namespaceId, namespaceId),\n eq(embeddings.ownerType, \"summary\"),\n eq(embeddings.ownerId, id),\n ),\n );\n await tx.insert(auditLog).values(toAuditRow(audit));\n return { found: true };\n });\n }\n\n async recordModelCall(entry: ModelCallEntry): Promise<void> {\n await this.db.insert(modelCalls).values({\n id: entry.id,\n namespaceId: entry.namespaceId ?? null,\n model: entry.metadata.model,\n type: entry.metadata.type,\n latencyMs: entry.metadata.latencyMs,\n tokens: entry.metadata.tokens ?? null,\n status: entry.metadata.status,\n error: entry.metadata.error ?? null,\n metadata: {\n retries: entry.metadata.retries,\n fallbackTriggered: entry.metadata.fallbackTriggered,\n coldStartWaitMs: entry.metadata.coldStartWaitMs,\n },\n });\n }\n\n async recordAudit(entry: AuditEntry): Promise<void> {\n await this.db.insert(auditLog).values(toAuditRow(entry));\n }\n\n async getReadyEmbeddings(\n namespaceId: string,\n limit: number,\n space?: string,\n ): Promise<ReadyEmbedding[]> {\n const rows = await this.client.sql<\n {\n id: string;\n owner_type: \"interaction\" | \"fact\" | \"summary\";\n owner_id: string;\n embedding_model: string;\n embedding_space: string | null;\n vector: string;\n }[]\n >`\n select e.id, e.owner_type, e.owner_id, e.embedding_model, e.embedding_space,\n e.vector::text as vector\n from embeddings e\n where e.status = 'ready'\n and (${space ?? null}::text is null or e.embedding_space = ${space ?? null})\n and (\n e.namespace_id = ${namespaceId}\n or (\n e.owner_type = 'fact'\n and exists (\n select 1 from shares s\n where s.to_namespace_id = ${namespaceId}\n and s.from_namespace_id = e.namespace_id\n and s.source_fact_id = e.owner_id\n and s.mode = 'reference'\n and not s.tombstoned\n )\n )\n )\n order by e.updated_at desc\n limit ${limit}\n `;\n return rows.map((row) => ({\n embeddingId: row.id,\n ownerType: row.owner_type,\n ownerId: row.owner_id,\n embeddingModel: row.embedding_model,\n embeddingSpace: row.embedding_space,\n vector: parseVectorLiteral(row.vector),\n }));\n }\n\n async requeueEmbeddingsOutsideSpace(namespaceId: string, space: string): Promise<number> {\n const rows = await this.db\n .update(embeddings)\n .set({\n status: \"pending\",\n vector: zeroVectorLiteral(),\n attempts: 0,\n lastError: null,\n leaseUntil: null,\n leaseToken: null,\n updatedAt: sql`now()`,\n })\n .where(\n and(\n eq(embeddings.namespaceId, namespaceId),\n inArray(embeddings.status, [\"ready\", \"failed\"]),\n sql`${embeddings.embeddingSpace} is distinct from ${space}`,\n ),\n )\n .returning({ id: embeddings.id });\n return rows.length;\n }\n\n async searchSimilarEmbeddings(input: SimilaritySearchInput): Promise<SimilaritySearchResult> {\n if (!validSearchVector(input.vector))\n return { method: \"exact_pgvector\", candidates: [], compatibleReady: 0 };\n // Materialization deliberately gives exact coverage of the filtered space.\n // HNSW post-filters can underfill a namespace/model result or miss its best row.\n // Only bounded IDs/scores cross the DB boundary; never download the vectors.\n const rows = await this.db.execute<{\n id: string;\n owner_type: \"interaction\" | \"fact\" | \"summary\";\n owner_id: string;\n embedding_model: string;\n embedding_space: string | null;\n score: number;\n total: string;\n }>(sql`\n with compatible as materialized (\n select id, owner_type, owner_id, embedding_model, embedding_space, vector\n from embeddings\n where status = 'ready'\n and (\n namespace_id = ${input.namespaceId}\n or (\n owner_type = 'fact'\n and ${liveReference(input.namespaceId, sql`embeddings.namespace_id`, sql`embeddings.owner_id`)}\n )\n )\n and embedding_space = ${input.embeddingSpace}\n and embedding_model = ${input.embeddingModel}\n and vector_norm(vector) > 0\n and not exists (\n select 1 from facts f\n where owner_type = 'fact' and f.namespace_id = embeddings.namespace_id\n and f.id = embeddings.owner_id\n and (f.source_deleted or f.superseded_by is not null)\n )\n )\n select id, owner_type, owner_id, embedding_model, embedding_space,\n 1 - (vector <=> ${JSON.stringify(input.vector)}::vector) as score,\n count(*) over () as total\n from compatible\n order by vector <=> ${JSON.stringify(input.vector)}::vector, id collate \"C\"\n limit ${candidateLimit(input.limit)}\n `);\n return {\n method: \"exact_pgvector\",\n compatibleReady: Number(rows[0]?.total ?? 0),\n candidates: rows.map((row) => ({\n embeddingId: row.id,\n ownerType: row.owner_type,\n ownerId: row.owner_id,\n embeddingModel: row.embedding_model,\n embeddingSpace: row.embedding_space,\n score: Number(row.score),\n })),\n };\n }\n\n async searchFactsLexically(\n namespaceId: string,\n query: string,\n limit: number,\n ): Promise<LexicalFactSearchResult> {\n const terms = lexicalTerms(query);\n if (!terms.length) return { candidates: [], matchedFacts: 0 };\n const rows = await this.db.execute<{\n id: string;\n content: string;\n subject: string;\n predicate: string;\n object: string;\n proposition_key: string | null;\n confidence: string;\n created_by_agent: string | null;\n created_at: Date;\n score: number;\n total: string;\n }>(sql`\n with scored as materialized (\n select id, content, subject, predicate, object, proposition_key, confidence,\n created_by_agent, created_at,\n (select coalesce(sum(\n (case when strpos(' ' || regexp_replace(lower(subject || ' ' || object), '[^[:alnum:]_]+', ' ', 'g') || ' ', ' ' || term || ' ') > 0 then 2 else 0 end) +\n (case when strpos(' ' || regexp_replace(lower(content), '[^[:alnum:]_]+', ' ', 'g') || ' ', ' ' || term || ' ') > 0 then 1 else 0 end)\n ), 0)::float / ${3 * terms.length} from\n jsonb_array_elements_text(${JSON.stringify(terms)}::jsonb) term\n ) as score\n from facts\n where not source_deleted and superseded_by is null\n and (\n namespace_id = ${namespaceId}\n or ${liveReference(namespaceId, sql`facts.namespace_id`, sql`facts.id`)}\n )\n )\n select *, count(*) over () as total from scored where score > 0\n order by score desc, created_at desc, id collate \"C\"\n limit ${candidateLimit(limit)}\n `);\n return {\n matchedFacts: Number(rows[0]?.total ?? 0),\n candidates: rows.map((row) => ({\n id: row.id,\n content: row.content,\n subject: row.subject,\n predicate: row.predicate,\n object: row.object,\n propositionKey: row.proposition_key,\n confidence: Number(row.confidence),\n sourceDeleted: false,\n supersededBy: null,\n createdByAgent: row.created_by_agent,\n createdAt: new Date(row.created_at),\n score: Number(row.score),\n })),\n };\n }\n\n async getRecentInteractions(\n namespaceId: string,\n sessionId: string,\n limit: number,\n ): Promise<RecentInteraction[]> {\n const rows = await this.db\n .select({\n id: interactions.id,\n sessionId: interactions.sessionId,\n content: interactions.content,\n tokenCount: interactions.tokenCount,\n createdAt: interactions.createdAt,\n })\n .from(interactions)\n .where(and(eq(interactions.namespaceId, namespaceId), eq(interactions.sessionId, sessionId)))\n .orderBy(desc(interactions.createdAt))\n .limit(limit);\n return rows.map((row) => ({ ...row, createdAt: row.createdAt }));\n }\n\n async getRecentFacts(namespaceId: string, limit: number): Promise<RecentFact[]> {\n const rows = await this.db\n .select(recentFactColumns)\n .from(facts)\n .where(\n and(\n eq(facts.namespaceId, namespaceId),\n eq(facts.sourceDeleted, false),\n isNull(facts.supersededBy),\n ),\n )\n .orderBy(desc(facts.createdAt))\n .limit(limit);\n return rows.map((row) => ({ ...row, confidence: Number(row.confidence ?? 1) }));\n }\n\n async getLatestSummary(namespaceId: string, sessionId: string): Promise<RecentSummary | null> {\n const rows = await this.db\n .select({\n id: sessionSummaries.id,\n sessionId: sessionSummaries.sessionId,\n content: sessionSummaries.content,\n tokenCount: sessionSummaries.tokenCount,\n createdAt: sessionSummaries.createdAt,\n })\n .from(sessionSummaries)\n .where(\n and(\n eq(sessionSummaries.namespaceId, namespaceId),\n eq(sessionSummaries.sessionId, sessionId),\n ),\n )\n .orderBy(desc(sessionSummaries.version))\n .limit(1);\n return rows[0] ?? null;\n }\n\n async getInteractionsByIds(namespaceId: string, ids: string[]): Promise<RecentInteraction[]> {\n if (ids.length === 0) return [];\n const rows = await this.db\n .select({\n id: interactions.id,\n sessionId: interactions.sessionId,\n content: interactions.content,\n tokenCount: interactions.tokenCount,\n createdAt: interactions.createdAt,\n })\n .from(interactions)\n .where(and(eq(interactions.namespaceId, namespaceId), inArray(interactions.id, ids)));\n return rows;\n }\n\n async getFactsByIds(namespaceId: string, ids: string[]): Promise<RecentFact[]> {\n if (ids.length === 0) return [];\n const rows = await this.db\n .select(recentFactColumns)\n .from(facts)\n .where(\n and(\n inArray(facts.id, ids),\n isNull(facts.supersededBy),\n or(\n eq(facts.namespaceId, namespaceId),\n liveReference(namespaceId, sql`${facts.namespaceId}`, sql`${facts.id}`),\n ),\n ),\n );\n return rows.map((row) => ({ ...row, confidence: Number(row.confidence ?? 1) }));\n }\n\n async getSummariesByIds(namespaceId: string, ids: string[]): Promise<RecentSummary[]> {\n if (ids.length === 0) return [];\n const rows = await this.db\n .select({\n id: sessionSummaries.id,\n sessionId: sessionSummaries.sessionId,\n content: sessionSummaries.content,\n tokenCount: sessionSummaries.tokenCount,\n createdAt: sessionSummaries.createdAt,\n })\n .from(sessionSummaries)\n .where(and(eq(sessionSummaries.namespaceId, namespaceId), inArray(sessionSummaries.id, ids)));\n return rows;\n }\n\n async getFactById(namespaceId: string, id: string): Promise<ListedFact | null> {\n const rows = await this.db\n .select({\n id: facts.id,\n subject: facts.subject,\n predicate: facts.predicate,\n object: facts.object,\n content: facts.content,\n confidence: facts.confidence,\n sourceInteractionId: facts.sourceInteractionId,\n sourceDeleted: facts.sourceDeleted,\n supersededBy: facts.supersededBy,\n createdByAgent: facts.createdByAgent,\n createdAt: facts.createdAt,\n })\n .from(facts)\n .where(and(eq(facts.namespaceId, namespaceId), eq(facts.id, id)))\n .limit(1);\n const row = rows[0];\n if (!row) return null;\n return { ...row, confidence: Number(row.confidence ?? 1) };\n }\n\n async countEmbeddingStatuses(namespaceId: string): Promise<PendingEmbeddingCounts> {\n const rows = await this.client.sql<{ status: string; count: string }[]>`\n select status::text as status, count(*)::text as count\n from embeddings\n where namespace_id = ${namespaceId}\n group by status\n `;\n let pending = 0;\n let processing = 0;\n let failed = 0;\n let ready = 0;\n for (const row of rows) {\n const value = Number(row.count);\n if (row.status === \"pending\") pending = value;\n else if (row.status === \"processing\") processing = value;\n else if (row.status === \"failed\") failed = value;\n else if (row.status === \"ready\") ready = value;\n }\n return { pending, processing, failed, ready };\n }\n\n async listFacts(input: {\n namespaceId: string;\n subject?: string;\n limit: number;\n cursor?: FactCursor;\n }): Promise<ListedFact[]> {\n const where = [\n eq(facts.namespaceId, input.namespaceId),\n eq(facts.sourceDeleted, false),\n isNull(facts.supersededBy),\n input.subject ? eq(facts.subject, input.subject) : undefined,\n input.cursor\n ? or(\n lt(facts.createdAt, input.cursor.createdAt),\n and(eq(facts.createdAt, input.cursor.createdAt), lt(facts.id, input.cursor.id)),\n )\n : undefined,\n ].filter((clause): clause is NonNullable<typeof clause> => Boolean(clause));\n const rows = await this.db\n .select({\n id: facts.id,\n subject: facts.subject,\n predicate: facts.predicate,\n object: facts.object,\n content: facts.content,\n confidence: facts.confidence,\n sourceInteractionId: facts.sourceInteractionId,\n sourceDeleted: facts.sourceDeleted,\n supersededBy: facts.supersededBy,\n createdByAgent: facts.createdByAgent,\n createdAt: facts.createdAt,\n })\n .from(facts)\n .where(and(...where))\n .orderBy(desc(facts.createdAt), desc(facts.id))\n .limit(input.limit);\n return rows.map((row) => ({ ...row, confidence: Number(row.confidence ?? 1) }));\n }\n\n async listSummaries(input: {\n namespaceId: string;\n limit: number;\n }): Promise<import(\"../core/repository.js\").ListedSummary[]> {\n return this.db\n .select({\n id: sessionSummaries.id,\n sessionId: sessionSummaries.sessionId,\n content: sessionSummaries.content,\n version: sessionSummaries.version,\n tokenCount: sessionSummaries.tokenCount,\n createdByAgent: sessionSummaries.createdByAgent,\n createdAt: sessionSummaries.createdAt,\n })\n .from(sessionSummaries)\n .where(eq(sessionSummaries.namespaceId, input.namespaceId))\n .orderBy(desc(sessionSummaries.createdAt))\n .limit(input.limit);\n }\n\n async listNamespaces(): Promise<NamespaceSummary[]> {\n const rows = await this.client.sql<\n { name: string; fact_count: string; last_activity: Date | null }[]\n >`\n select\n n.name,\n count(f.id)::text as fact_count,\n greatest(\n max(f.created_at),\n max(i.created_at),\n max(s.created_at),\n n.updated_at\n ) as last_activity\n from namespaces n\n left join facts f on f.namespace_id = n.id and f.source_deleted = false\n left join interactions i on i.namespace_id = n.id\n left join session_summaries s on s.namespace_id = n.id\n group by n.id, n.name, n.updated_at\n order by last_activity desc nulls last, n.name asc\n `;\n return rows.map((row) => ({\n name: row.name,\n factCount: Number(row.fact_count),\n lastActivity: row.last_activity,\n }));\n }\n\n async getAgentWriteBreakdown(namespaceId?: string): Promise<AgentWriteBreakdown[]> {\n const rows = namespaceId\n ? await this.client.sql<{ agent_id: string | null; writes: string }[]>`\n select agent_id, sum(writes)::text as writes\n from (\n select created_by_agent as agent_id, count(*) as writes from interactions where namespace_id = ${namespaceId} group by created_by_agent\n union all\n select created_by_agent as agent_id, count(*) as writes from facts where namespace_id = ${namespaceId} group by created_by_agent\n union all\n select created_by_agent as agent_id, count(*) as writes from session_summaries where namespace_id = ${namespaceId} group by created_by_agent\n ) t\n group by agent_id\n order by writes desc\n `\n : await this.client.sql<{ agent_id: string | null; writes: string }[]>`\n select agent_id, sum(writes)::text as writes\n from (\n select created_by_agent as agent_id, count(*) as writes from interactions group by created_by_agent\n union all\n select created_by_agent as agent_id, count(*) as writes from facts group by created_by_agent\n union all\n select created_by_agent as agent_id, count(*) as writes from session_summaries group by created_by_agent\n ) t\n group by agent_id\n order by writes desc\n `;\n return rows.map((row) => ({ agentId: row.agent_id, writes: Number(row.writes) }));\n }\n\n async getStats(namespaceId?: string): Promise<MemoryStats> {\n const namespaceRows = await this.client.sql<\n { count: string }[]\n >`select count(*)::text as count from namespaces`;\n const interactionRows = namespaceId\n ? await this.client.sql<\n { count: string }[]\n >`select count(*)::text as count from interactions where namespace_id = ${namespaceId}`\n : await this.client.sql<\n { count: string }[]\n >`select count(*)::text as count from interactions`;\n const factRows = namespaceId\n ? await this.client.sql<\n { count: string }[]\n >`select count(*)::text as count from facts where namespace_id = ${namespaceId}`\n : await this.client.sql<{ count: string }[]>`select count(*)::text as count from facts`;\n const summaryRows = namespaceId\n ? await this.client.sql<\n { count: string }[]\n >`select count(*)::text as count from session_summaries where namespace_id = ${namespaceId}`\n : await this.client.sql<\n { count: string }[]\n >`select count(*)::text as count from session_summaries`;\n const embeddingRows = namespaceId\n ? await this.client.sql<{ status: string; count: string }[]>`\n select status::text as status, count(*)::text as count from embeddings where namespace_id = ${namespaceId} group by status\n `\n : await this.client.sql<{ status: string; count: string }[]>`\n select status::text as status, count(*)::text as count from embeddings group by status\n `;\n const callRows = namespaceId\n ? await this.client.sql<\n { last_60s: string; last_hour: string; last_24h: string; gated_failures: string }[]\n >`\n select\n count(*) filter (where created_at >= now() - interval '60 seconds')::text as last_60s,\n count(*) filter (where created_at >= now() - interval '1 hour')::text as last_hour,\n count(*) filter (where created_at >= now() - interval '24 hours')::text as last_24h,\n count(*) filter (where status = 'gated' and created_at >= now() - interval '24 hours')::text as gated_failures\n from model_calls\n where namespace_id = ${namespaceId}\n `\n : await this.client.sql<\n { last_60s: string; last_hour: string; last_24h: string; gated_failures: string }[]\n >`\n select\n count(*) filter (where created_at >= now() - interval '60 seconds')::text as last_60s,\n count(*) filter (where created_at >= now() - interval '1 hour')::text as last_hour,\n count(*) filter (where created_at >= now() - interval '24 hours')::text as last_24h,\n count(*) filter (where status = 'gated' and created_at >= now() - interval '24 hours')::text as gated_failures\n from model_calls\n `;\n const embeddingsCount = { pending: 0, processing: 0, failed: 0, ready: 0 };\n for (const row of embeddingRows) {\n if (row.status === \"pending\") embeddingsCount.pending = Number(row.count);\n if (row.status === \"processing\") embeddingsCount.processing = Number(row.count);\n if (row.status === \"failed\") embeddingsCount.failed = Number(row.count);\n if (row.status === \"ready\") embeddingsCount.ready = Number(row.count);\n }\n const calls = callRows[0] ?? {\n last_60s: \"0\",\n last_hour: \"0\",\n last_24h: \"0\",\n gated_failures: \"0\",\n };\n return {\n namespaces: Number(namespaceRows[0]?.count ?? 0),\n interactions: Number(interactionRows[0]?.count ?? 0),\n facts: Number(factRows[0]?.count ?? 0),\n summaries: Number(summaryRows[0]?.count ?? 0),\n embeddings: embeddingsCount,\n modelCalls: {\n last60s: Number(calls.last_60s),\n lastHour: Number(calls.last_hour),\n last24h: Number(calls.last_24h),\n gatedFailures: Number(calls.gated_failures),\n },\n };\n }\n\n async pruneBefore(\n cutoff: Date,\n ): Promise<{ interactions: number; facts: number; summaries: number }> {\n return this.db.transaction(async (tx) => {\n // Embeddings have no FK on owner_id, so pruned owners must have their\n // embedding rows removed explicitly — otherwise orphan vectors bloat\n // the HNSW index forever and consume recall limit slots.\n const deletedInteractions = await tx\n .delete(interactions)\n .where(lt(interactions.createdAt, cutoff))\n .returning({ id: interactions.id });\n if (deletedInteractions.length > 0) {\n await tx.delete(embeddings).where(\n and(\n eq(embeddings.ownerType, \"interaction\"),\n inArray(\n embeddings.ownerId,\n deletedInteractions.map((row) => row.id),\n ),\n ),\n );\n }\n const deletedFacts = await tx\n .delete(facts)\n .where(lt(facts.createdAt, cutoff))\n .returning({ id: facts.id });\n if (deletedFacts.length > 0) {\n await tx.delete(embeddings).where(\n and(\n eq(embeddings.ownerType, \"fact\"),\n inArray(\n embeddings.ownerId,\n deletedFacts.map((row) => row.id),\n ),\n ),\n );\n await tx\n .update(shares)\n .set({ tombstoned: true })\n .where(\n and(\n eq(shares.mode, \"reference\"),\n inArray(\n shares.sourceFactId,\n deletedFacts.map((row) => row.id),\n ),\n ),\n );\n }\n const deletedSummaries = await tx\n .delete(sessionSummaries)\n .where(lt(sessionSummaries.createdAt, cutoff))\n .returning({ id: sessionSummaries.id });\n if (deletedSummaries.length > 0) {\n await tx.delete(embeddings).where(\n and(\n eq(embeddings.ownerType, \"summary\"),\n inArray(\n embeddings.ownerId,\n deletedSummaries.map((row) => row.id),\n ),\n ),\n );\n }\n return {\n interactions: deletedInteractions.length,\n facts: deletedFacts.length,\n summaries: deletedSummaries.length,\n };\n });\n }\n\n async getVectorIndexHealth(namespaceId?: string): Promise<VectorIndexHealth> {\n const countRows = namespaceId\n ? await this.client.sql<\n { count: string }[]\n >`select count(*)::text as count from embeddings where namespace_id = ${namespaceId}`\n : await this.client.sql<{ count: string }[]>`select count(*)::text as count from embeddings`;\n const indexRows = await this.client.sql<{ indexname: string; indexdef: string }[]>`\n select indexname, indexdef from pg_indexes\n where schemaname = current_schema()\n and tablename = 'embeddings'\n and indexname = 'embeddings_vector_hnsw_idx'\n limit 1\n `;\n const vectorCount = Number(countRows[0]?.count ?? 0);\n const index = indexRows[0];\n return {\n vectorCount,\n indexName: index?.indexname ?? null,\n indexDefinition: index?.indexdef ?? null,\n needsTuning: vectorCount >= 100_000,\n };\n }\n}\n\nexport function createPostgresRepository(client: DatabaseClient): MemoryRepository {\n return new PostgresMemoryRepository(client);\n}\n\nfunction toAuditRow(entry: AuditEntry) {\n return {\n id: entry.id,\n namespaceId: entry.namespaceId,\n action: entry.action,\n entityType: entry.entityType,\n entityId: entry.entityId ?? null,\n createdByAgent: entry.createdByAgent ?? null,\n metadata: entry.metadata ?? {},\n };\n}\n\n/**\n * Ensure the owner's embedding row exists. With `reset`, an existing row goes\n * back to `pending` and drops its lease token, so a worker still embedding the\n * old text is fenced out (#50) and the new text gets a fresh vector.\n */\nasync function upsertPendingEmbedding(\n tx: Pick<Db, \"insert\">,\n embedding: PendingEmbeddingInsert,\n reset: boolean,\n): Promise<void> {\n const insert = tx.insert(embeddings).values({\n id: embedding.id,\n namespaceId: embedding.namespaceId,\n ownerType: embedding.ownerType,\n ownerId: embedding.ownerId,\n vector: zeroVectorLiteral(),\n embeddingModel: embedding.embeddingModel,\n status: \"pending\",\n });\n const target = [embeddings.ownerType, embeddings.ownerId];\n if (!reset) {\n await insert.onConflictDoNothing({ target });\n return;\n }\n await insert.onConflictDoUpdate({\n target,\n set: {\n vector: zeroVectorLiteral(),\n embeddingModel: embedding.embeddingModel,\n status: \"pending\",\n attempts: 0,\n lastError: null,\n leaseUntil: null,\n leaseToken: null,\n updatedAt: sql`now()`,\n },\n });\n}\n\nfunction zeroVectorLiteral(): string {\n return `[${Array.from({ length: 384 }, () => 0).join(\",\")}]`;\n}\n\nfunction parseVectorLiteral(literal: string): number[] {\n const trimmed = literal.startsWith(\"[\") ? literal.slice(1, -1) : literal;\n if (!trimmed) return [];\n return trimmed.split(\",\").map((value) => Number(value));\n}\n\nfunction advisoryLockKeys(namespaceId: string, sessionId: string): [number, number] {\n const digest = createHash(\"sha256\").update(`${namespaceId}\\x1f${sessionId}`).digest();\n const k1 = digest.readInt32BE(0);\n const k2 = digest.readInt32BE(4);\n return [k1, k2];\n}\n\nconst recentFactColumns = {\n id: facts.id,\n content: facts.content,\n subject: facts.subject,\n predicate: facts.predicate,\n object: facts.object,\n propositionKey: facts.propositionKey,\n confidence: facts.confidence,\n sourceDeleted: facts.sourceDeleted,\n supersededBy: facts.supersededBy,\n createdByAgent: facts.createdByAgent,\n createdAt: facts.createdAt,\n};\n\n/** A live (non-tombstoned) reference share of `factId` from its owner to `namespaceId`. */\nfunction liveReference(namespaceId: string, ownerNamespace: SQL, factId: SQL): SQL {\n return sql`exists (\n select 1 from shares s\n where s.to_namespace_id = ${namespaceId}\n and s.from_namespace_id = ${ownerNamespace}\n and s.source_fact_id = ${factId}\n and s.mode = 'reference'\n and not s.tombstoned\n )`;\n}\n","import { VECTOR_DIMENSIONS } from \"../db/schema.js\";\n\n/** Bound both DB hydration and the lexical query work independently of caller input. */\nexport function candidateLimit(limit: number): number {\n if (!Number.isFinite(limit)) return 256;\n return Math.max(1, Math.min(1024, Math.trunc(limit)));\n}\n\n/** pgvector stores float4, so values must stay finite after float4 rounding. */\nexport function validSearchVector(vector: number[]): boolean {\n return (\n vector.length === VECTOR_DIMENSIONS &&\n vector.every((value) => Number.isFinite(Math.fround(value))) &&\n vector.some((value) => value !== 0)\n );\n}\n\n/** Common prompt scaffolding should not make unrelated facts look relevant. */\nconst QUERY_STOPWORDS = new Set([\n \"a\",\n \"about\",\n \"after\",\n \"again\",\n \"all\",\n \"also\",\n \"always\",\n \"an\",\n \"and\",\n \"any\",\n \"are\",\n \"as\",\n \"at\",\n \"back\",\n \"be\",\n \"been\",\n \"before\",\n \"being\",\n \"but\",\n \"by\",\n \"can\",\n \"could\",\n \"did\",\n \"do\",\n \"does\",\n \"done\",\n \"each\",\n \"even\",\n \"ever\",\n \"for\",\n \"from\",\n \"get\",\n \"gets\",\n \"got\",\n \"had\",\n \"has\",\n \"have\",\n \"here\",\n \"how\",\n \"i\",\n \"if\",\n \"in\",\n \"into\",\n \"is\",\n \"it\",\n \"its\",\n \"just\",\n \"like\",\n \"make\",\n \"me\",\n \"more\",\n \"most\",\n \"my\",\n \"never\",\n \"no\",\n \"not\",\n \"now\",\n \"of\",\n \"on\",\n \"only\",\n \"or\",\n \"other\",\n \"our\",\n \"out\",\n \"over\",\n \"please\",\n \"really\",\n \"same\",\n \"should\",\n \"so\",\n \"some\",\n \"sometimes\",\n \"still\",\n \"such\",\n \"than\",\n \"that\",\n \"the\",\n \"their\",\n \"them\",\n \"then\",\n \"there\",\n \"these\",\n \"they\",\n \"this\",\n \"those\",\n \"through\",\n \"to\",\n \"too\",\n \"under\",\n \"up\",\n \"us\",\n \"very\",\n \"was\",\n \"we\",\n \"were\",\n \"what\",\n \"when\",\n \"where\",\n \"which\",\n \"while\",\n \"who\",\n \"why\",\n \"will\",\n \"with\",\n \"would\",\n \"yet\",\n \"you\",\n \"your\",\n]);\n\n/** Literal, case-insensitive terms; no SQL wildcard or query-language syntax. */\nexport function lexicalTerms(query: string): string[] {\n return [\n ...new Set(\n query\n .slice(0, 4096)\n .toLowerCase()\n .match(/[\\p{L}\\p{N}_]+/gu) ?? [],\n ),\n ]\n .filter((term) => !QUERY_STOPWORDS.has(term))\n .slice(0, 32)\n .map((term) => term.slice(0, 64));\n}\n\n/** Words every captured decision shares (\"we decided to use …\"); they carry no claim. */\nconst CLAIM_BOILERPLATE = new Set([\n \"decided\",\n \"decide\",\n \"decision\",\n \"made\",\n \"use\",\n \"uses\",\n \"used\",\n \"using\",\n \"now\",\n \"going\",\n \"will\",\n]);\n\n/**\n * Jaccard overlap of two texts' content words (stopwords dropped), 0..1.\n * Used to spot near-duplicate facts: at capture (so a reworded decision is not\n * saved twice) and at recall (so two copies never take two of the few slots).\n */\nexport function termOverlap(a: string, b: string): number {\n const terms = (text: string) =>\n new Set(\n (text.toLowerCase().match(/[\\p{L}\\p{N}_]+/gu) ?? []).filter(\n (term) => !QUERY_STOPWORDS.has(term) && !CLAIM_BOILERPLATE.has(term),\n ),\n );\n const left = terms(a);\n const right = terms(b);\n if (left.size === 0 || right.size === 0) return 0;\n let shared = 0;\n for (const term of left) if (right.has(term)) shared += 1;\n return shared / (left.size + right.size - shared);\n}\n\n/** Score complete-word evidence, favoring explicit fact fields over free text. */\nexport function lexicalFactScore(\n fact: { subject: string; object: string; content: string },\n terms: string[],\n): number {\n if (terms.length === 0) return 0;\n const structured = new Set(\n `${fact.subject} ${fact.object}`.toLowerCase().match(/[\\p{L}\\p{N}_]+/gu) ?? [],\n );\n const prose = new Set(fact.content.toLowerCase().match(/[\\p{L}\\p{N}_]+/gu) ?? []);\n const points = terms.reduce(\n (total, term) => total + (structured.has(term) ? 2 : 0) + (prose.has(term) ? 1 : 0),\n 0,\n );\n return points / (3 * terms.length);\n}\n\nexport function cosine(a: number[], b: number[]): number {\n if (a.length !== b.length) return 0;\n let dot = 0;\n let na = 0;\n let nb = 0;\n for (let i = 0; i < a.length; i++) {\n const av = a[i] ?? 0;\n const bv = b[i] ?? 0;\n dot += av * bv;\n na += av * av;\n nb += bv * bv;\n }\n const denom = Math.sqrt(na) * Math.sqrt(nb);\n return denom === 0 ? 0 : dot / denom;\n}\n","import type { EmbeddingResponse } from \"./adapter.js\";\n\n/** Identity of the coordinate system, including provider preprocessing. */\nexport type EmbeddingSpace = {\n model: string;\n revision: string;\n schema: string;\n dimensions: number;\n};\n\nexport type QueryEmbedding = { vector: number[]; space: EmbeddingSpace };\n\nexport function embeddingSpace(response: Omit<EmbeddingResponse, \"vectors\">): EmbeddingSpace {\n const space = {\n model: response.model,\n revision: response.revision ?? \"unversioned\",\n schema: response.schema ?? \"provider-v1\",\n dimensions: response.dimensions,\n };\n if (\n !space.model ||\n !space.revision ||\n !space.schema ||\n !Number.isSafeInteger(space.dimensions) ||\n space.dimensions <= 0\n ) {\n throw new Error(\"Invalid embedding space identity.\");\n }\n return space;\n}\n\nexport function embeddingSpaceKey(space: EmbeddingSpace): string {\n return JSON.stringify([space.model, space.revision, space.schema, space.dimensions]);\n}\n\nexport function validEmbeddingVector(vector: number[], dimensions: number): boolean {\n return dimensions > 0 && vector.length === dimensions && vector.every(Number.isFinite);\n}\n\nexport function validateEmbeddingResponse(response: EmbeddingResponse, count: number): void {\n embeddingSpace(response);\n if (\n response.vectors.length !== count ||\n response.vectors.some((vector) => !validEmbeddingVector(vector, response.dimensions))\n ) {\n throw new Error(\"Provider returned invalid embedding dimensions, values, or batch size.\");\n }\n}\n","import pTimeout from \"p-timeout\";\nimport { REDACTED, redactPersisted } from \"../memory-extract/sensitive.js\";\nimport { clampBudgetForCallerModel, countTokens } from \"../planner/budget.js\";\nimport { DefaultPolicy } from \"../planner/default-policy.js\";\nimport type { ContextPolicy, PlanInput } from \"../planner/types.js\";\nimport type { ModelProvider } from \"../providers/adapter.js\";\nimport { OpenRouterEmbeddingProvider } from \"../providers/cloud.js\";\nimport {\n embeddingSpace,\n embeddingSpaceKey,\n type QueryEmbedding,\n validateEmbeddingResponse,\n} from \"../providers/embedding-space.js\";\nimport { HuggingFaceProvider } from \"../providers/huggingface.js\";\nimport { LocalModelProvider } from \"../providers/local.js\";\nimport {\n DEFAULT_CLOUD_EMBEDDING_MODELS,\n DEFAULT_EMBEDDING_MODELS,\n EMBEDDING_DIMENSIONS,\n getModelDefinition,\n} from \"../providers/models.js\";\nimport { createTracer, type Tracer } from \"../tracing/langsmith.js\";\nimport { type ValidatedCodeBuddyConfig, validateConfig } from \"./config.js\";\nimport { defaultNamespaceForCwd, readConfigFile } from \"./config-file.js\";\nimport {\n computeContentHash,\n computeFactHash,\n generateEntityId,\n generateSessionId,\n generateUlid,\n} from \"./ids.js\";\nimport { type FactFile, MemoryFileStore, type SummaryFile } from \"./memory-file-store.js\";\nimport { isEligibleMemory } from \"./memory-lifecycle.js\";\nimport type {\n AuditEntry,\n FactInsert,\n FileUpsertResult,\n InteractionInsert,\n MemoryRepository,\n NamespaceRow,\n PendingEmbeddingInsert,\n ShareWriteInput,\n SummaryInsert,\n WriteResult,\n} from \"./repository.js\";\nimport type {\n CodeBuddyConfig,\n CodeBuddyStatus,\n ForgetResult,\n MemoryWriteType,\n RecallInput,\n RecallResult,\n RememberBatchItem,\n RememberInput,\n RememberResult,\n ShareInput,\n ShareResult,\n UnshareInput,\n UnshareResult,\n} from \"./types.js\";\nimport { EmbeddingWorker } from \"./worker.js\";\n\n/**\n * Recall is interactive: past this deadline it plans without a query vector\n * (the planner's no-vector fallback) instead of waiting out provider retries.\n * ponytail: fixed deadline; make it configurable if slow self-hosted providers need more.\n */\nexport const RECALL_EMBED_TIMEOUT_MS = 10_000;\n\nexport type CodeBuddyDependencies = {\n repository: MemoryRepository;\n memoryFileStore?: MemoryFileStore;\n provider?: ModelProvider;\n worker?: EmbeddingWorker;\n policy?: ContextPolicy;\n tracer?: Tracer;\n};\n\nexport class CodeBuddy {\n readonly config: ValidatedCodeBuddyConfig;\n private readonly repo: MemoryRepository;\n private readonly provider: ModelProvider;\n private readonly worker: EmbeddingWorker;\n private readonly policy: ContextPolicy;\n private readonly tracer: Tracer;\n private readonly memoryFileStore: MemoryFileStore | undefined;\n private namespaceId: string | null = null;\n private initialized = false;\n\n constructor(config: CodeBuddyConfig, deps?: CodeBuddyDependencies) {\n this.config = validateConfig(config);\n if (!deps?.repository) {\n throw new Error(\n \"CodeBuddy requires a MemoryRepository. Pass deps.repository (use createPostgresRepository for production).\",\n );\n }\n this.repo = deps.repository;\n this.memoryFileStore = deps.memoryFileStore;\n this.provider = deps.provider ?? buildProviderFromConfig(this.config.provider);\n this.worker =\n deps.worker ??\n new EmbeddingWorker({\n repository: this.repo,\n provider: this.provider,\n ...(this.config.worker?.pollIntervalMs !== undefined\n ? { pollIntervalMs: this.config.worker.pollIntervalMs }\n : {}),\n ...(this.config.worker?.batchSize !== undefined\n ? { batchSize: this.config.worker.batchSize }\n : {}),\n ...(this.config.worker?.maxAttempts !== undefined\n ? { maxAttempts: this.config.worker.maxAttempts }\n : {}),\n });\n this.policy = deps.policy ?? new DefaultPolicy();\n this.tracer = deps.tracer ?? createTracer();\n }\n\n async init(options: { startWorker?: boolean } = {}): Promise<CodeBuddyStatus> {\n const namespace = await this.repo.ensureNamespace(this.config.namespace);\n this.namespaceId = namespace.id;\n this.initialized = true;\n if (options.startWorker !== false) this.worker.start();\n return {\n ready: true,\n phase: \"runtime\",\n message: `CodeBuddy ready in namespace ${namespace.name}.`,\n namespaceId: namespace.id,\n };\n }\n\n async shutdown(): Promise<void> {\n await this.worker.shutdown();\n }\n\n getWorker(): EmbeddingWorker {\n return this.worker;\n }\n\n async remember(input: RememberInput): Promise<RememberResult> {\n const namespaceId = this.requireNamespaceId();\n const type: MemoryWriteType = input.type ?? \"interaction\";\n const sessionId = input.sessionId ?? generateSessionId();\n const content = input.content;\n if (!content || content.length === 0) {\n throw new Error(\"remember: content must not be empty.\");\n }\n const result = await this.repo.withSessionLock(namespaceId, sessionId, () =>\n this.writeOne({\n namespaceId,\n sessionId,\n type,\n content,\n idempotencyKey: input.idempotencyKey,\n ...(input.agentId !== undefined ? { agentId: input.agentId } : {}),\n }),\n );\n this.worker.notify();\n return {\n id: result.id,\n sessionId: result.sessionId,\n deduplicated: result.deduplicated,\n };\n }\n\n async rememberBatch(items: RememberBatchItem[]): Promise<RememberResult[]> {\n if (!Array.isArray(items) || items.length === 0) return [];\n const results: RememberResult[] = [];\n for (const item of items) {\n results.push(await this.remember(item));\n }\n return results;\n }\n\n async recall(input: RecallInput): Promise<RecallResult> {\n const namespaceId = this.requireNamespaceId();\n if (!input.query || input.query.length === 0) {\n throw new Error(\"recall: query must not be empty.\");\n }\n const requested = input.budget ?? this.config.tokenBudget ?? 4_000;\n const clamp = clampBudgetForCallerModel(requested, input.callerModel);\n const queryEmbedding = await this.embedQueryWithFallback(input.query);\n const planInput: PlanInput = {\n namespace: this.config.namespace,\n namespaceId,\n sessionId: input.sessionId,\n query: input.query,\n budget: clamp.budget,\n conflictMode: input.conflictMode ?? \"all\",\n queryEmbedding,\n repository: this.repo,\n ...(input.callerModel !== undefined ? { callerModel: input.callerModel } : {}),\n };\n\n const planned = await this.tracer.withSpan(\n \"codebuddy.recall\",\n {\n namespace: this.config.namespace,\n sessionId: input.sessionId,\n budget: clamp.budget,\n conflictMode: planInput.conflictMode,\n callerModel: input.callerModel ?? null,\n },\n () => this.policy.plan(planInput),\n );\n\n planned.stats.budgetClamped = clamp.clamped;\n if (clamp.clamped && clamp.reason) {\n planned.stats.budgetClampReason = clamp.reason;\n }\n return planned;\n }\n\n /**\n * Dense evidence for file facts supplied by the context engine: the cosine of\n * each fact whose stored vector clears the embedding model's calibrated\n * `relevanceFloor` against the task (exact pgvector search over the\n * namespace). Facts below the floor, of unknown models, or on any failure or\n * timeout are simply absent, so callers fall back to lexical evidence.\n */\n async rankContextFacts(\n task: string,\n factIds: string[],\n options: { timeoutMs?: number } = {},\n ): Promise<Record<string, number>> {\n if (!task.trim() || factIds.length === 0) return {};\n const allowed = new Set(factIds.slice(0, 256));\n try {\n return await pTimeout(\n (async () => {\n const query = await this.embedQueryWithFallback(task.slice(0, 4096));\n const floor = query\n ? (this.config.provider.relevanceFloor ??\n getModelDefinition(query.space.model)?.relevanceFloor)\n : undefined;\n if (!query || floor === undefined) return {};\n const result = await this.repo.searchSimilarEmbeddings({\n namespaceId: this.requireNamespaceId(),\n vector: query.vector,\n embeddingSpace: embeddingSpaceKey(query.space),\n embeddingModel: query.space.model,\n limit: 256,\n });\n const scores: Record<string, number> = {};\n for (const row of result.candidates) {\n if (\n row.ownerType === \"fact\" &&\n allowed.has(row.ownerId) &&\n Number.isFinite(row.score) &&\n row.score >= floor\n ) {\n scores[row.ownerId] = Math.max(scores[row.ownerId] ?? 0, Math.min(1, row.score));\n }\n }\n return scores;\n })(),\n { milliseconds: options.timeoutMs ?? 1_500 },\n );\n } catch {\n return {};\n }\n }\n\n private async embedQueryWithFallback(query: string): Promise<QueryEmbedding | null> {\n try {\n const response = await this.tracer.withSpan(\n \"codebuddy.recall.embed_query\",\n { length: query.length },\n () =>\n pTimeout(this.provider.embed({ input: query }), {\n milliseconds: RECALL_EMBED_TIMEOUT_MS,\n }),\n );\n validateEmbeddingResponse(response, 1);\n const vector = response.vectors[0];\n return vector ? { vector, space: embeddingSpace(response) } : null;\n } catch {\n return null;\n }\n }\n\n /**\n * Share facts owned by the configured namespace. A reference is a live grant\n * recorded durably in the source fact's Markdown (`sharedWith`); a snapshot is\n * a copy owned by the target and written to the target project's own store.\n */\n async share(input: ShareInput): Promise<ShareResult> {\n if (!input.from || !input.to) {\n throw new Error(\"share: both 'from' and 'to' namespaces are required.\");\n }\n if (input.from === input.to) {\n throw new Error(\"share: 'from' and 'to' must differ.\");\n }\n const fromNamespaceId = this.requireNamespaceId();\n if (input.from !== this.config.namespace) {\n throw new Error(\n `share: only facts of the configured namespace \"${this.config.namespace}\" can be shared.`,\n );\n }\n if (!Array.isArray(input.factIds) || input.factIds.length === 0) {\n return { shared: 0 };\n }\n const mode = input.mode ?? \"reference\";\n let targetStore: MemoryFileStore | undefined;\n if (mode === \"snapshot\") {\n if (input.targetProjectRoot) {\n targetStore = await resolveTargetStore(input.targetProjectRoot, input.to);\n } else if (this.memoryFileStore) {\n throw new Error(\n \"share: snapshot mode requires targetProjectRoot so the copy is durable in the target project's Markdown store.\",\n );\n }\n }\n const toNs = await this.repo.ensureNamespace(input.to);\n let shared = 0;\n const embeddingModel = DEFAULT_EMBEDDING_MODELS[0]?.id ?? \"unknown\";\n\n for (const factId of input.factIds) {\n const auditId = generateEntityId(\"aud\");\n const shareId = generateEntityId(\"shr\");\n const source = await this.repo.getFactById(fromNamespaceId, factId);\n if (!source) {\n throw new Error(`share: fact ${factId} not found in namespace \"${input.from}\".`);\n }\n if (mode === \"reference\") {\n const write: ShareWriteInput = {\n id: shareId,\n fromNamespaceId,\n toNamespaceId: toNs.id,\n sourceFactId: factId,\n mode: \"reference\",\n ...(input.agentId !== undefined ? { createdByAgent: input.agentId } : {}),\n };\n await this.repo.shareReference(write);\n await this.updateSharedWith(factId, (current) => [...current, toNs.name]);\n } else {\n // A snapshot must carry the source fact's actual knowledge. Fetch it\n // first: a missing fact id is an error, not a silently dangling\n // `__snapshot:` pointer.\n const snapshotContent = [\n `[shared from ${input.from}] ${source.subject} ${source.predicate} ${source.object}`,\n source.content,\n ].join(\"\\n\");\n const snapshotFactId = generateEntityId(\"fact\");\n const snapshotEmbeddingId = generateEntityId(\"emb\");\n const snapshotFact: FactInsert = {\n id: snapshotFactId,\n namespaceId: toNs.id,\n content: snapshotContent,\n contentHash: computeFactHash(toNs.name, snapshotContent),\n subject: source.subject,\n predicate: \"snapshot_of\",\n object: `${input.from}:${factId}`,\n ...(input.agentId !== undefined ? { createdByAgent: input.agentId } : {}),\n };\n const embedding: PendingEmbeddingInsert = {\n id: snapshotEmbeddingId,\n namespaceId: toNs.id,\n ownerType: \"fact\",\n ownerId: snapshotFactId,\n embeddingModel,\n };\n const write: ShareWriteInput = {\n id: shareId,\n fromNamespaceId,\n toNamespaceId: toNs.id,\n sourceFactId: factId,\n mode: \"snapshot\",\n snapshotFactId,\n ...(input.agentId !== undefined ? { createdByAgent: input.agentId } : {}),\n };\n const result = await this.repo.shareSnapshot({ share: write, snapshotFact, embedding });\n if (targetStore)\n await writeSnapshotFile(this.repo, targetStore, toNs, result.snapshotFactId);\n }\n const audit: AuditEntry = {\n id: auditId,\n namespaceId: fromNamespaceId,\n action: \"share\",\n entityType: \"fact\",\n entityId: factId,\n ...(input.agentId !== undefined ? { createdByAgent: input.agentId } : {}),\n metadata: { mode, toNamespace: toNs.name, shareId },\n };\n await this.repo.recordAudit(audit);\n shared += 1;\n }\n this.worker.notify();\n return { shared };\n }\n\n /** Revoke live reference shares of configured-namespace facts to `to`. */\n async unshare(input: UnshareInput): Promise<UnshareResult> {\n const fromNamespaceId = this.requireNamespaceId();\n const toNs = await this.repo.getNamespaceByName(input.to);\n if (!toNs || input.factIds.length === 0) return { revoked: 0 };\n const revoked = await this.repo.revokeShares(fromNamespaceId, toNs.id, input.factIds);\n for (const factId of input.factIds) {\n await this.updateSharedWith(factId, (current) => current.filter((ns) => ns !== toNs.name));\n }\n if (revoked > 0) {\n await this.repo.recordAudit({\n id: generateEntityId(\"aud\"),\n namespaceId: fromNamespaceId,\n action: \"share\",\n entityType: \"fact\",\n ...(input.agentId !== undefined ? { createdByAgent: input.agentId } : {}),\n metadata: { mode: \"reference\", toNamespace: toNs.name, revoked: input.factIds },\n });\n }\n return { revoked };\n }\n\n /** Keep the source fact's durable `sharedWith` list in step with the shares table. */\n private async updateSharedWith(\n factId: string,\n next: (current: string[]) => string[],\n ): Promise<void> {\n if (!this.memoryFileStore) return;\n let file: FactFile;\n try {\n file = await this.memoryFileStore.readFact(factId);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n throw error;\n }\n if (file.namespace !== this.config.namespace) return;\n await this.memoryFileStore.setFactSharedWith(factId, next(file.sharedWith));\n }\n\n async forget(id: string): Promise<ForgetResult> {\n if (!id) throw new Error(\"forget: id is required.\");\n const namespaceId = this.requireNamespaceId();\n const interactionAudit: AuditEntry = {\n id: generateEntityId(\"aud\"),\n namespaceId,\n action: \"forget\",\n entityType: \"interaction\",\n entityId: id,\n };\n const interactionResult = await this.repo.withSessionLock(\n namespaceId,\n REINDEX_LOCK_KEY,\n async () => {\n const existing = await this.repo.getInteractionsByIds(namespaceId, [id]);\n if (existing.length === 0) return { found: false, sourceDeletedFactIds: [] };\n await this.memoryFileStore?.markSourceInteractionDeleted(this.config.namespace, id);\n return this.repo.forgetInteraction(namespaceId, id, interactionAudit);\n },\n );\n if (interactionResult.found) {\n // Markdown is the source of truth: persist the lifecycle change so a\n // reindex cannot resurrect facts whose source was forgotten.\n for (const factId of interactionResult.sourceDeletedFactIds) {\n const file = await this.memoryFileStore?.readFact(factId).catch(() => null);\n if (file?.namespace === this.config.namespace) {\n await this.memoryFileStore?.markFactSourceDeleted(factId);\n }\n }\n return { ok: true, entityType: \"interaction\" };\n }\n const factAudit: AuditEntry = {\n id: generateEntityId(\"aud\"),\n namespaceId,\n action: \"forget\",\n entityType: \"fact\",\n entityId: id,\n };\n // Shares the reindex lock so a concurrent reindex that already scanned the\n // file cannot re-import the fact this call is deleting.\n const factResult = await this.repo.withSessionLock(namespaceId, REINDEX_LOCK_KEY, async () => {\n const result = await this.repo.forgetFact(namespaceId, id, factAudit);\n if (result.found) {\n const file = await this.memoryFileStore?.readFact(id).catch(() => null);\n if (file?.namespace === this.config.namespace) await this.memoryFileStore?.deleteFact(id);\n }\n return result;\n });\n if (factResult.found) return { ok: true, entityType: \"fact\" };\n return { ok: false, entityType: \"unknown\" };\n }\n\n /**\n * Reconcile the derived database with the Markdown memory files (the source\n * of truth) for this namespace: upsert by stable ID, preserving the file's\n * lifecycle metadata; re-embed only changed content; delete rows whose file\n * is gone. Only rows a reindex previously imported from Markdown\n * (`file_backed`) are ever deleted, so DB-only legacy memory survives. Each\n * file is applied independently: malformed or conflicting files are reported\n * in `failures` and never abort healthy imports (nor count as deletions).\n */\n async reindexMemory(): Promise<ReindexResult> {\n const namespaceId = this.requireNamespaceId();\n const store = this.memoryFileStore;\n if (!store) {\n throw new Error(\"Fact reindexing requires a repository-rooted MemoryFileStore.\");\n }\n const namespace = this.config.namespace;\n\n // One advisory lock per namespace serializes concurrent reindexes (two MCP\n // clients starting together) and fact forgets; files are scanned under it.\n // Each repository write inside is a savepoint, so a failing file rolls\n // back alone.\n const result = await this.repo.withSessionLock(namespaceId, REINDEX_LOCK_KEY, async () => {\n const [factScan, summaryScan] = await Promise.all([store.scanFacts(), store.scanSummaries()]);\n // Only eligible knowledge is indexed, so recall agrees with file context\n // (no deleted-source, superseded, or resolved-incident facts). An\n // ineligible file counts as absent, so its file-backed row is removed.\n const facts = factScan.facts.filter((file) => isEligibleMemory(file, { namespace }));\n const summaries = summaryScan.summaries.filter((file) => file.namespace === namespace);\n const failures: ReindexFailure[] = [\n ...factScan.invalid.map((file) => ({ kind: \"fact\" as const, ...file })),\n ...summaryScan.invalid.map((file) => ({ kind: \"summary\" as const, ...file })),\n ];\n const factCounts = emptyCounts(\n facts.length + factScan.invalid.length,\n factScan.invalid.length,\n );\n const summaryCounts = emptyCounts(\n summaries.length + summaryScan.invalid.length,\n summaryScan.invalid.length,\n );\n const apply = async (\n kind: ReindexFailure[\"kind\"],\n file: { id: string; path: string },\n counts: ReindexCounts,\n write: () => Promise<FileUpsertResult>,\n ): Promise<boolean> => {\n try {\n const { status } = await write();\n counts[status === \"inserted\" ? \"imported\" : status] += 1;\n return true;\n } catch (error) {\n counts.failed += 1;\n failures.push({ kind, id: file.id, path: file.path, error: describeError(error) });\n return false;\n }\n };\n // Remove absent file-backed rows before importing their replacements:\n // a new ID may legitimately reuse the old file's content hash. A file\n // that exists but is unreadable is not a deletion.\n const present = new Set([\n ...facts.map((file) => file.id),\n ...summaries.map((file) => file.id),\n ...factScan.invalid.map((file) => file.id),\n ...summaryScan.invalid.map((file) => file.id),\n ]);\n const owned = await this.repo.listFileBackedIds(namespaceId);\n for (const id of owned.facts.filter((id) => !present.has(id))) {\n const removed = await this.repo.forgetFact(\n namespaceId,\n id,\n reindexAudit(namespaceId, \"fact\", id),\n );\n if (removed.found) factCounts.deleted += 1;\n }\n for (const id of owned.summaries.filter((id) => !present.has(id))) {\n const removed = await this.repo.forgetSummary(\n namespaceId,\n id,\n reindexAudit(namespaceId, \"summary\", id),\n );\n if (removed.found) summaryCounts.deleted += 1;\n }\n for (const file of facts) {\n const imported = await apply(\"fact\", file, factCounts, () =>\n this.importFactFile(namespaceId, file),\n );\n // Reference shares are recorded in the source fact's front matter (#51),\n // so a rebuilt database recreates them.\n if (imported) await this.restoreShares(namespaceId, file);\n }\n for (const file of summaries) {\n await apply(\"summary\", file, summaryCounts, () =>\n this.importSummaryFile(namespaceId, file),\n );\n }\n return {\n facts: factCounts,\n summaries: summaryCounts,\n failures: failures.slice(0, MAX_REPORTED_FAILURES),\n };\n });\n // A new embedding model (or revision) is a new coordinate system: vectors\n // from the old one can never be compared, so they are embedded again.\n // Only once the new provider has embedded something: a missing key or an\n // unreachable API must not turn every working vector back into a pending one.\n const space = this.provider.space;\n const canEmbed =\n space !== undefined &&\n (await this.provider.embed({ input: \"codebuddy\" }).then(\n () => true,\n () => false,\n ));\n const reembedding =\n space && canEmbed\n ? await this.repo.requeueEmbeddingsOutsideSpace(namespaceId, embeddingSpaceKey(space))\n : 0;\n this.worker.notify();\n return { ...result, reembedding };\n }\n\n async reindexFacts(): Promise<ReindexCounts> {\n return (await this.reindexMemory()).facts;\n }\n\n private requireNamespaceId(): string {\n if (!this.initialized || !this.namespaceId) {\n throw new Error(\"CodeBuddy.init() must complete before this method is called.\");\n }\n return this.namespaceId;\n }\n\n private async writeOne(input: {\n namespaceId: string;\n sessionId: string;\n type: MemoryWriteType;\n content: string;\n idempotencyKey?: string | undefined;\n agentId?: string | undefined;\n }): Promise<WriteResult> {\n const embeddingModel = DEFAULT_EMBEDDING_MODELS[0]?.id ?? \"unknown\";\n const ownerId = generateEntityId(prefixForType(input.type));\n // Facts are redacted once, here, BEFORE any persistence, so the DB row, its\n // content hash, the embedding input and the Markdown file all agree (a later\n // reindex rebuilds the same hash from the file).\n const claim = redactPersisted({\n subject: \"__inline__\",\n predicate: \"asserts\",\n object: input.content.slice(0, 200),\n content: input.content,\n });\n const content = input.type === \"fact\" ? claim.content : input.content;\n const contentHash =\n input.idempotencyKey ??\n (input.type === \"fact\"\n ? factContentHash(this.config.namespace, ownerId, content)\n : computeContentHash(this.config.namespace, input.sessionId, input.content));\n const tokenCount = estimateTokenCount(content);\n const embeddingId = generateEntityId(\"emb\");\n const embedding: PendingEmbeddingInsert = {\n id: embeddingId,\n namespaceId: input.namespaceId,\n ownerType: input.type,\n ownerId,\n embeddingModel,\n };\n const audit: AuditEntry = {\n id: generateEntityId(\"aud\"),\n namespaceId: input.namespaceId,\n action: \"remember\",\n entityType: input.type,\n entityId: ownerId,\n ...(input.agentId !== undefined ? { createdByAgent: input.agentId } : {}),\n metadata: { sessionId: input.sessionId, type: input.type },\n };\n\n if (input.type === \"interaction\") {\n const interaction: InteractionInsert = {\n id: ownerId,\n namespaceId: input.namespaceId,\n sessionId: input.sessionId,\n content: input.content,\n contentHash,\n tokenCount,\n ...(input.agentId !== undefined ? { createdByAgent: input.agentId } : {}),\n };\n return this.repo.writeInteraction({ interaction, embedding, audit });\n }\n if (input.type === \"fact\") {\n const fact: FactInsert = {\n id: ownerId,\n namespaceId: input.namespaceId,\n content,\n contentHash,\n subject: claim.subject,\n predicate: claim.predicate,\n object: claim.object,\n ...(input.agentId !== undefined ? { createdByAgent: input.agentId } : {}),\n };\n const result = await this.repo.writeFact({ fact, embedding, audit });\n if (this.memoryFileStore) {\n if (result.deduplicated) {\n try {\n await this.memoryFileStore.readFact(result.id);\n return result;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n }\n await this.memoryFileStore.writeFact({\n id: result.id,\n namespace: this.config.namespace,\n subject: fact.subject,\n predicate: fact.predicate,\n object: fact.object,\n confidence: 1,\n createdAt: new Date().toISOString(),\n createdByAgent: input.agentId ?? null,\n sourceInteractionId: fact.sourceInteractionId ?? null,\n sourceDeleted: false,\n content: fact.content,\n });\n }\n return result;\n }\n const summary: SummaryInsert = {\n id: ownerId,\n namespaceId: input.namespaceId,\n sessionId: input.sessionId,\n content: input.content,\n tokenCount,\n ...(input.agentId !== undefined ? { createdByAgent: input.agentId } : {}),\n };\n const result = await this.repo.writeSummary({ summary, embedding, audit });\n if (this.memoryFileStore) {\n if (result.deduplicated) {\n try {\n await this.memoryFileStore.readSummary(result.id);\n return result;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n }\n await this.memoryFileStore.writeSummary({\n id: result.id,\n namespace: this.config.namespace,\n sessionId: result.sessionId,\n version: summary.version ?? 1,\n tokenCount: summary.tokenCount,\n createdAt: new Date().toISOString(),\n createdByAgent: input.agentId ?? null,\n content: summary.content,\n });\n }\n return result;\n }\n\n private async restoreShares(namespaceId: string, file: FactFile): Promise<void> {\n for (const to of file.sharedWith) {\n if (to === this.config.namespace) continue;\n const toNs = await this.repo.ensureNamespace(to);\n await this.repo.shareReference({\n id: generateEntityId(\"shr\"),\n fromNamespaceId: namespaceId,\n toNamespaceId: toNs.id,\n sourceFactId: file.id,\n mode: \"reference\",\n });\n }\n }\n\n private importFactFile(namespaceId: string, file: FactFile): Promise<FileUpsertResult> {\n return this.repo.upsertFactFromFile({\n fact: {\n id: file.id,\n namespaceId,\n content: file.content,\n contentHash: factContentHash(this.config.namespace, file.id, file.content),\n subject: file.subject,\n predicate: file.predicate,\n object: file.object,\n confidence: file.confidence,\n sourceInteractionId: file.sourceInteractionId ?? undefined,\n sourceDeleted: file.sourceDeleted,\n supersededBy: file.supersededBy,\n propositionKey: file.propositionKey ?? null,\n createdByAgent: file.createdByAgent ?? undefined,\n createdAt: new Date(file.createdAt),\n },\n embedding: pendingEmbedding(namespaceId, \"fact\", file.id),\n audit: {\n id: generateEntityId(\"aud\"),\n namespaceId,\n action: \"remember\",\n entityType: \"fact\",\n entityId: file.id,\n metadata: { source: \"reindex\", path: file.path },\n },\n });\n }\n\n private importSummaryFile(namespaceId: string, file: SummaryFile): Promise<FileUpsertResult> {\n return this.repo.upsertSummaryFromFile({\n summary: {\n id: file.id,\n namespaceId,\n sessionId: file.sessionId,\n content: file.content,\n version: file.version,\n tokenCount: file.tokenCount,\n createdByAgent: file.createdByAgent ?? undefined,\n createdAt: new Date(file.createdAt),\n },\n embedding: pendingEmbedding(namespaceId, \"summary\", file.id),\n audit: {\n id: generateEntityId(\"aud\"),\n namespaceId,\n action: \"remember\",\n entityType: \"summary\",\n entityId: file.id,\n metadata: { source: \"reindex\", path: file.path },\n },\n });\n }\n}\n\n/**\n * Resolve the target project's store explicitly and verify it belongs to the\n * target namespace, so a snapshot never lands under the wrong project.\n */\nasync function resolveTargetStore(root: string, namespace: string): Promise<MemoryFileStore> {\n const resolved = (await readConfigFile(root)).namespace ?? defaultNamespaceForCwd(root);\n if (resolved !== namespace) {\n throw new Error(\n `share: targetProjectRoot ${root} resolves to namespace \"${resolved}\", not \"${namespace}\".`,\n );\n }\n return new MemoryFileStore(root);\n}\n\nasync function writeSnapshotFile(\n repo: MemoryRepository,\n store: MemoryFileStore,\n namespace: NamespaceRow,\n factId: string,\n): Promise<void> {\n try {\n await store.readFact(factId);\n return;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n const fact = await repo.getFactById(namespace.id, factId);\n if (!fact)\n throw new Error(`share: snapshot ${factId} missing from namespace \"${namespace.name}\".`);\n await store.writeFact({\n id: fact.id,\n namespace: namespace.name,\n subject: fact.subject,\n predicate: fact.predicate,\n object: fact.object,\n confidence: fact.confidence,\n createdAt: fact.createdAt.toISOString(),\n createdByAgent: fact.createdByAgent,\n sourceInteractionId: null,\n sourceDeleted: false,\n content: fact.content,\n });\n}\n\nexport type ReindexCounts = {\n /** Managed files seen for this namespace (including malformed ones). */\n scanned: number;\n imported: number;\n updated: number;\n unchanged: number;\n /** File-backed rows removed because their Markdown file is gone. */\n deleted: number;\n failed: number;\n};\n\nexport type ReindexFailure = {\n kind: \"fact\" | \"summary\";\n id: string;\n path: string;\n error: string;\n};\n\nexport type ReindexResult = {\n facts: ReindexCounts;\n summaries: ReindexCounts;\n /** Per-file problems, capped at {@link MAX_REPORTED_FAILURES}; counts stay exact. */\n failures: ReindexFailure[];\n /** Ready vectors from another embedding space, queued to be embedded again. */\n reembedding?: number;\n};\n\nconst REINDEX_LOCK_KEY = \"__codebuddy_markdown_reindex__\";\nconst MAX_REPORTED_FAILURES = 50;\n\nfunction emptyCounts(scanned: number, failed: number): ReindexCounts {\n return { scanned, imported: 0, updated: 0, unchanged: 0, deleted: 0, failed };\n}\n\nfunction pendingEmbedding(\n namespaceId: string,\n ownerType: MemoryWriteType,\n ownerId: string,\n): PendingEmbeddingInsert {\n return {\n id: generateEntityId(\"emb\"),\n namespaceId,\n ownerType,\n ownerId,\n embeddingModel: DEFAULT_EMBEDDING_MODELS[0]?.id ?? \"unknown\",\n };\n}\n\nfunction reindexAudit(namespaceId: string, entityType: string, entityId: string): AuditEntry {\n return {\n id: generateEntityId(\"aud\"),\n namespaceId,\n action: \"forget\",\n entityType,\n entityId,\n metadata: { source: \"reindex\", reason: \"no eligible markdown file\" },\n };\n}\n\n/** Driver errors embed the full SQL and parameters; keep only the cause. */\nfunction describeError(error: unknown): string {\n const cause = (error as { cause?: unknown }).cause;\n const message = cause instanceof Error ? cause.message : (error as Error).message;\n return String(message).split(\"\\n\")[0]?.slice(0, 300) ?? \"unknown error\";\n}\n\n/**\n * Fact content hash. Facts whose content was fully redacted all share one\n * placeholder, so the fact id is mixed in to keep distinct facts distinct\n * (the hash must not collapse them, and must not derive from the raw secret).\n * writeOne and reindex both pass the fact id, so they agree on the hash.\n */\nfunction factContentHash(namespace: string, id: string, content: string): string {\n return computeFactHash(namespace, content === REDACTED ? `${REDACTED}\\x1f${id}` : content);\n}\n\nfunction prefixForType(type: MemoryWriteType): string {\n if (type === \"interaction\") return \"int\";\n if (type === \"fact\") return \"fact\";\n return \"sum\";\n}\n\nfunction estimateTokenCount(content: string): number {\n return countTokens(content);\n}\n\nexport function newEntityId(prefix: string): string {\n return `${prefix}_${generateUlid().toLowerCase()}`;\n}\n\nexport function buildProviderFromConfig(\n provider: ValidatedCodeBuddyConfig[\"provider\"],\n): ModelProvider {\n if (provider.type === \"local\") return new LocalModelProvider();\n if (provider.type === \"openrouter\") {\n const model = provider.model ?? DEFAULT_CLOUD_EMBEDDING_MODELS.openrouter;\n const apiKey = process.env.OPENROUTER_API_KEY;\n // A missing key fails each embed (recall falls back to lexical), not startup.\n if (!apiKey) return missingKeyProvider(\"OPENROUTER_API_KEY\", model);\n return new OpenRouterEmbeddingProvider({ apiKey, model });\n }\n return new HuggingFaceProvider({\n ...(provider.apiKey ? { apiKey: provider.apiKey } : {}),\n ...(provider.model\n ? {\n embeddingModels: [\n {\n id: provider.model,\n role: \"primary\" as const,\n kind: \"embedding\" as const,\n dimensions: EMBEDDING_DIMENSIONS,\n },\n ],\n }\n : {}),\n });\n}\n\nfunction missingKeyProvider(variable: string, model: string): ModelProvider {\n const fail = async (): Promise<never> => {\n throw new Error(\n `${variable} is not set; ${model} cannot embed. Export it or run \\`codebuddy models use local\\`.`,\n );\n };\n return { embed: fail, generateText: fail };\n}\n","/** Lifecycle fields shared by Markdown facts and indexed (database) fact rows. */\nexport type MemoryLifecycle = {\n namespace?: string;\n sourceDeleted: boolean;\n supersededBy?: string | null;\n category?: string;\n resolvedBy?: string | null;\n};\n\n/**\n * The single eligibility rule for durable memory evidence. A fact is eligible\n * when it belongs to the requested namespace, its source was not deleted, and\n * it was not superseded. A resolved incident is eligible only for historical\n * inspection (`includeResolved`). File context, risk signals, and database\n * recall apply this before ranking or deduplication, so ineligible evidence\n * can never displace or suppress eligible evidence.\n */\nexport function isEligibleMemory(\n fact: MemoryLifecycle,\n options: { namespace?: string; includeResolved?: boolean } = {},\n): boolean {\n if (options.namespace && fact.namespace !== options.namespace) return false;\n if (fact.sourceDeleted || fact.supersededBy) return false;\n if (fact.category === \"incident\" && fact.resolvedBy && !options.includeResolved) return false;\n return true;\n}\n","import { isEligibleMemory } from \"../core/memory-lifecycle.js\";\nimport { candidateLimit, validSearchVector } from \"../core/memory-search.js\";\nimport type {\n RecentFact,\n RecentInteraction,\n RecentSummary,\n SimilarEmbedding,\n} from \"../core/repository.js\";\nimport { embeddingSpaceKey, validEmbeddingVector } from \"../providers/embedding-space.js\";\nimport { countTokens } from \"./budget.js\";\nimport type {\n ConflictMode,\n ContextPolicy,\n FactProvenance,\n PlanInput,\n PlannedContext,\n PlannedMessage,\n PlannerStats,\n SkipReason,\n} from \"./types.js\";\n\ntype Candidate = {\n key: string;\n role: PlannedMessage[\"role\"];\n content: string;\n tokens: number;\n score: number;\n source: \"interaction\" | \"fact\" | \"summary\";\n ownerId: string;\n createdAt: number;\n confidence: number;\n isRecencyFloor: boolean;\n fact?: FactProvenance;\n};\n\nexport type DefaultPolicyOptions = {\n recencyFloorSize?: number;\n embeddingCandidateLimit?: number;\n minVectorScore?: number;\n};\n\nexport class DefaultPolicy implements ContextPolicy {\n private readonly recencyFloorSize: number;\n private readonly embeddingCandidateLimit: number;\n private readonly minVectorScore: number;\n\n constructor(options: DefaultPolicyOptions = {}) {\n this.recencyFloorSize = options.recencyFloorSize ?? 3;\n this.embeddingCandidateLimit = candidateLimit(options.embeddingCandidateLimit ?? 256);\n this.minVectorScore = options.minVectorScore ?? 0.1;\n }\n\n async plan(input: PlanInput): Promise<PlannedContext> {\n const repo = input.repository;\n const counts = await repo.countEmbeddingStatuses(input.namespaceId);\n const query = input.queryEmbedding;\n const space = query ? embeddingSpaceKey(query.space) : null;\n let fallbackReason: PlannerStats[\"fallbackReason\"];\n if (!query) fallbackReason = \"query_embedding_unavailable\";\n else if (\n !validSearchVector(query.vector) ||\n !validEmbeddingVector(query.vector, query.space.dimensions)\n )\n fallbackReason = \"invalid_query_vector\";\n // No own-namespace precheck: live reference shares (#51) are searchable\n // even when the namespace has no ready embeddings of its own.\n\n const recencyInteractions = await repo.getRecentInteractions(\n input.namespaceId,\n input.sessionId,\n this.recencyFloorSize,\n );\n const coverage: NonNullable<PlannerStats[\"candidateCoverage\"]> = {\n scope: \"full_namespace\",\n method: \"lexical\",\n compatibleReady: 0,\n candidateLimit: this.embeddingCandidateLimit,\n vectorCandidates: 0,\n lexicalCandidates: 0,\n lexicalMatchedFacts: 0,\n hydratedCandidates: 0,\n spaceFilter: space,\n };\n let candidates: Candidate[] = [];\n let fallback: PlannerStats[\"fallback\"] = \"none\";\n if (!fallbackReason && query && space) {\n const search = await repo.searchSimilarEmbeddings({\n namespaceId: input.namespaceId,\n vector: query.vector,\n embeddingSpace: space,\n embeddingModel: query.space.model,\n limit: this.embeddingCandidateLimit,\n });\n coverage.compatibleReady = search.compatibleReady;\n coverage.vectorCandidates = search.candidates.length;\n coverage.method = search.method;\n const scored = search.candidates.map((row) => ({ row, score: row.score }));\n const ownerIdsByType = groupOwnerIdsByType(scored);\n const [factRows, interactionRows, summaryRows] = await Promise.all([\n repo.getFactsByIds(input.namespaceId, ownerIdsByType.fact),\n repo.getInteractionsByIds(input.namespaceId, ownerIdsByType.interaction),\n repo.getSummariesByIds(input.namespaceId, ownerIdsByType.summary),\n ]);\n candidates = this.hydrateScored(scored, factRows, interactionRows, summaryRows);\n coverage.hydratedCandidates = candidates.length;\n if (search.compatibleReady === 0)\n fallbackReason = counts.ready === 0 ? \"no_ready_embeddings\" : \"no_compatible_embeddings\";\n else if (candidates.length === 0) fallbackReason = \"no_hydratable_candidates\";\n }\n const useFallback = fallbackReason !== undefined;\n const lexical = await repo.searchFactsLexically(\n input.namespaceId,\n input.query,\n useFallback ? this.embeddingCandidateLimit : Math.min(this.embeddingCandidateLimit, 32),\n );\n coverage.lexicalCandidates = lexical.candidates.length;\n coverage.lexicalMatchedFacts = lexical.matchedFacts;\n if (useFallback) {\n const [summary, fallbackInteractions] = await Promise.all([\n repo.getLatestSummary(input.namespaceId, input.sessionId),\n repo.getRecentInteractions(\n input.namespaceId,\n input.sessionId,\n Math.max(this.recencyFloorSize, 10),\n ),\n ]);\n candidates = this.buildFallbackCandidates(fallbackInteractions, summary);\n if (summary && fallbackInteractions.length > 0) fallback = \"recency_summary\";\n else if (summary) fallback = \"summary\";\n else fallback = \"recency\";\n }\n const byKey = new Map(candidates.map((candidate) => [candidate.key, candidate] as const));\n for (const fact of lexical.candidates) {\n if (!isEligibleMemory(fact)) continue;\n // Lexical coverage is not cosine confidence. Reserve it as bounded supporting evidence.\n const candidate = factCandidate(fact, useFallback ? fact.score : 0.35 * fact.score);\n const existing = byKey.get(candidate.key);\n if (existing) existing.score = Math.max(existing.score, candidate.score);\n else byKey.set(candidate.key, candidate);\n }\n candidates = [...byKey.values()];\n candidates = this.applyRecencyFloor(candidates, recencyInteractions);\n\n candidates = this.applyConflictMode(candidates, input.conflictMode);\n candidates.sort((a, b) => {\n if (a.isRecencyFloor !== b.isRecencyFloor) return a.isRecencyFloor ? -1 : 1;\n return b.score - a.score || b.createdAt - a.createdAt || a.key.localeCompare(b.key);\n });\n\n const skipReasons: Partial<Record<SkipReason, number>> = {};\n const included: Candidate[] = [];\n let system = buildSystemPrompt(input.namespace, fallback, useFallback);\n let tokensUsed = countTokens(system);\n let itemsSkipped = 0;\n for (const candidate of candidates) {\n if (tokensUsed + candidate.tokens > input.budget) {\n bump(skipReasons, \"budget_exhausted\");\n itemsSkipped += 1;\n continue;\n }\n if (!candidate.isRecencyFloor && candidate.score < this.minVectorScore && !useFallback) {\n bump(skipReasons, \"low_score\");\n itemsSkipped += 1;\n continue;\n }\n included.push(candidate);\n tokensUsed += candidate.tokens;\n }\n\n const unresolvedKeys = [\n ...new Set(\n included.flatMap((c) =>\n c.fact?.conflict?.unresolved ? [c.fact.propositionKey ?? \"\"] : [],\n ),\n ),\n ].sort();\n if (unresolvedKeys.length > 0) {\n // Selection already reserved the base prompt; the note is added only if\n // it still fits. Each message's `fact.conflict` carries it either way.\n const noted = `${system} Unresolved fact conflicts (compare fact provenance): ${unresolvedKeys.join(\", \")}.`;\n const withNote = tokensUsed - countTokens(system) + countTokens(noted);\n if (withNote <= input.budget) {\n system = noted;\n tokensUsed = withNote;\n }\n }\n const messages: PlannedMessage[] = included.map((candidate) => ({\n role: candidate.role,\n content: candidate.content,\n ...(candidate.fact ? { fact: candidate.fact } : {}),\n }));\n\n const stats: PlannerStats = {\n tokensUsed,\n itemsIncluded: included.length,\n itemsSkipped,\n budgetHeadroom: Math.max(0, input.budget - tokensUsed),\n fallback,\n skipReasons,\n embeddingCoverage: counts,\n candidateCoverage: coverage,\n ...(fallbackReason ? { fallbackReason } : {}),\n explain: [\n `Candidate search covers the full namespace; limit ${this.embeddingCandidateLimit} applies after ranking.`,\n `Embedding space filter: ${coverage.spaceFilter ?? \"unavailable\"}; ${coverage.compatibleReady} compatible ready vectors; ${coverage.vectorCandidates} vector candidates; ${coverage.hydratedCandidates} hydrated.`,\n `Durable lexical facts: ${coverage.lexicalCandidates} candidates of ${coverage.lexicalMatchedFacts} matches.`,\n ...(useFallback\n ? [\n `Fallback: ${fallbackReason}; ${coverage.lexicalCandidates} durable lexical candidates of ${coverage.lexicalMatchedFacts} matches.`,\n ]\n : []),\n ],\n budgetClamped: false,\n budgetStatus: tokensUsed > input.budget ? \"overflow\" : \"within_budget\",\n ...(tokensUsed > input.budget\n ? { budgetWarning: \"Required memory system prompt exceeds budget.\" }\n : {}),\n };\n\n return { system, messages, stats };\n }\n\n private hydrateScored(\n scored: Array<{ row: SimilarEmbedding; score: number }>,\n factRows: RecentFact[],\n interactionRows: RecentInteraction[],\n summaryRows: RecentSummary[],\n ): Candidate[] {\n const factById = new Map(factRows.map((row) => [row.id, row] as const));\n const interactionById = new Map(interactionRows.map((row) => [row.id, row] as const));\n const summaryById = new Map(summaryRows.map((row) => [row.id, row] as const));\n\n const out: Candidate[] = [];\n for (const { row, score } of scored) {\n if (row.ownerType === \"fact\") {\n const fact = factById.get(row.ownerId);\n if (!fact || !isEligibleMemory(fact)) continue;\n out.push(factCandidate(fact, score));\n } else if (row.ownerType === \"interaction\") {\n const interaction = interactionById.get(row.ownerId);\n if (!interaction) continue;\n out.push({\n key: `interaction:${interaction.id}`,\n role: \"user\",\n content: interaction.content,\n tokens: countTokens(interaction.content),\n score,\n source: \"interaction\",\n ownerId: interaction.id,\n createdAt: interaction.createdAt.getTime(),\n confidence: 1,\n isRecencyFloor: false,\n });\n } else {\n const summary = summaryById.get(row.ownerId);\n if (!summary) continue;\n out.push({\n key: `summary:${summary.id}`,\n role: \"system\",\n content: summary.content,\n tokens: countTokens(summary.content),\n score,\n source: \"summary\",\n ownerId: summary.id,\n createdAt: summary.createdAt.getTime(),\n confidence: 1,\n isRecencyFloor: false,\n });\n }\n }\n return out;\n }\n\n private applyRecencyFloor(candidates: Candidate[], floor: RecentInteraction[]): Candidate[] {\n const byKey = new Map<string, Candidate>();\n for (const candidate of candidates) byKey.set(candidate.key, candidate);\n for (const row of floor) {\n const key = `interaction:${row.id}`;\n const existing = byKey.get(key);\n if (existing) {\n existing.isRecencyFloor = true;\n continue;\n }\n byKey.set(key, {\n key,\n role: \"user\",\n content: row.content,\n tokens: countTokens(row.content),\n score: 1,\n source: \"interaction\",\n ownerId: row.id,\n createdAt: row.createdAt.getTime(),\n confidence: 1,\n isRecencyFloor: true,\n });\n }\n return Array.from(byKey.values());\n }\n\n private buildFallbackCandidates(\n interactions: RecentInteraction[],\n summary: RecentSummary | null,\n ): Candidate[] {\n const out: Candidate[] = [];\n if (summary) {\n out.push({\n key: `summary:${summary.id}`,\n role: \"system\",\n content: summary.content,\n tokens: countTokens(summary.content),\n score: 1,\n source: \"summary\",\n ownerId: summary.id,\n createdAt: summary.createdAt.getTime(),\n confidence: 1,\n isRecencyFloor: true,\n });\n }\n for (const row of interactions) {\n out.push({\n key: `interaction:${row.id}`,\n role: \"user\",\n content: row.content,\n tokens: countTokens(row.content),\n score: 1,\n source: \"interaction\",\n ownerId: row.id,\n createdAt: row.createdAt.getTime(),\n confidence: 1,\n isRecencyFloor: true,\n });\n }\n return out;\n }\n\n /**\n * Resolve rival assertions of the same explicit proposition key. Facts without\n * a key are treated as multi-valued and never grouped, so identical or\n * different surface text alone never merges or splits claims.\n */\n private applyConflictMode(candidates: Candidate[], mode: ConflictMode): Candidate[] {\n const groups = new Map<string, Candidate[]>();\n for (const candidate of candidates) {\n const key = candidate.fact?.propositionKey;\n if (!key) continue;\n groups.set(key, [...(groups.get(key) ?? []), candidate]);\n }\n const dropped = new Set<string>();\n for (const bucket of groups.values()) {\n if (bucket.length < 2) continue;\n bucket.sort((a, b) => compareRivals(a, b, mode));\n const winner = bucket[0] as Candidate;\n // Rivals the mode cannot separate: everything for \"all\", exact ties otherwise.\n const contenders = bucket.filter(\n (c) =>\n mode === \"all\" ||\n (c.createdAt === winner.createdAt && c.confidence === winner.confidence),\n );\n const objects = new Set(contenders.map((c) => c.fact?.object.trim().toLowerCase()));\n const conflict = {\n candidateIds: bucket.map((c) => c.ownerId).sort(),\n unresolved: objects.size > 1,\n };\n for (const candidate of bucket) {\n if (mode !== \"all\" && candidate !== winner) dropped.add(candidate.key);\n else if (candidate.fact) candidate.fact = { ...candidate.fact, conflict };\n }\n }\n return candidates.filter((candidate) => !dropped.has(candidate.key));\n }\n}\n\n/** Mode order first, the other signal second, then id so ties are deterministic. */\nfunction compareRivals(a: Candidate, b: Candidate, mode: ConflictMode): number {\n const byTime = b.createdAt - a.createdAt;\n const byConfidence = b.confidence - a.confidence;\n const ordered = mode === \"highest_confidence\" ? byConfidence || byTime : byTime || byConfidence;\n return ordered || a.ownerId.localeCompare(b.ownerId);\n}\n\nfunction groupOwnerIdsByType(scored: Array<{ row: SimilarEmbedding }>): {\n fact: string[];\n interaction: string[];\n summary: string[];\n} {\n const out = { fact: [] as string[], interaction: [] as string[], summary: [] as string[] };\n for (const { row } of scored) {\n out[row.ownerType].push(row.ownerId);\n }\n return out;\n}\n\nfunction bump(map: Partial<Record<SkipReason, number>>, key: SkipReason): void {\n map[key] = (map[key] ?? 0) + 1;\n}\n\nfunction buildSystemPrompt(\n namespace: string,\n fallback: PlannerStats[\"fallback\"],\n isFallback: boolean,\n): string {\n const base = `Memory context for namespace \"${namespace}\".`;\n if (isFallback) {\n return `${base} Fallback active (${fallback}); vector search unavailable or empty.`;\n }\n return base;\n}\n\nfunction factCandidate(fact: RecentFact, score: number): Candidate {\n return {\n key: `fact:${fact.id}`,\n role: \"system\",\n content: fact.content,\n tokens: countTokens(fact.content),\n score,\n source: \"fact\",\n ownerId: fact.id,\n createdAt: fact.createdAt.getTime(),\n confidence: fact.confidence,\n isRecencyFloor: false,\n fact: {\n id: fact.id,\n subject: fact.subject,\n predicate: fact.predicate,\n object: fact.object,\n propositionKey: fact.propositionKey,\n confidence: fact.confidence,\n createdAt: fact.createdAt.toISOString(),\n createdByAgent: fact.createdByAgent,\n },\n };\n}\n","import { HfInference, setLogger } from \"@huggingface/inference\";\nimport type {\n EmbeddingRequest,\n EmbeddingResponse,\n ModelProvider,\n ProviderDiagnosticsHook,\n TextGenerationRequest,\n TextGenerationResponse,\n} from \"./adapter.js\";\nimport { type EmbeddingSpace, validateEmbeddingResponse } from \"./embedding-space.js\";\nimport {\n assertCompatibleEmbeddingModels,\n DEFAULT_EMBEDDING_MODELS,\n DEFAULT_LLM_MODELS,\n EMBEDDING_DIMENSIONS,\n type ModelDefinition,\n} from \"./models.js\";\nimport {\n DEFAULT_RESILIENCE_OPTIONS,\n HuggingFaceResilience,\n type ResilienceOptions,\n} from \"./resilience.js\";\n\n// The library logs through `console` by default, and `console.log` is stdout:\n// the MCP JSON-RPC channel under `codebuddy serve`. Keep all of it on stderr.\nconst toStderr = (...args: unknown[]) => console.error(...args);\nsetLogger({ debug: toStderr, info: toStderr, log: toStderr, warn: toStderr, error: toStderr });\n\nexport type HuggingFaceProviderOptions = {\n apiKey?: string;\n client?: Pick<HfInference, \"featureExtraction\" | \"textGeneration\">;\n embeddingModels?: ModelDefinition[];\n llmModels?: ModelDefinition[];\n resilience?: Partial<ResilienceOptions>;\n onDiagnostic?: ProviderDiagnosticsHook;\n};\n\nexport class HuggingFaceProvider implements ModelProvider {\n private readonly client: Pick<HfInference, \"featureExtraction\" | \"textGeneration\">;\n private readonly embeddingModels: ModelDefinition[];\n private readonly llmModels: ModelDefinition[];\n private readonly resilience: HuggingFaceResilience;\n private readonly onDiagnostic: ProviderDiagnosticsHook | undefined;\n /** The primary model's space: `reindex` re-embeds rows from any other (incl. fallback) space. */\n readonly space?: EmbeddingSpace;\n\n constructor(options: HuggingFaceProviderOptions = {}) {\n this.client = options.client ?? new HfInference(options.apiKey);\n this.embeddingModels = options.embeddingModels ?? DEFAULT_EMBEDDING_MODELS;\n this.llmModels = options.llmModels ?? DEFAULT_LLM_MODELS;\n this.resilience = new HuggingFaceResilience({\n ...DEFAULT_RESILIENCE_OPTIONS,\n ...options.resilience,\n });\n this.onDiagnostic = options.onDiagnostic;\n\n assertCompatibleEmbeddingModels(this.embeddingModels);\n const primary = this.embeddingModels[0];\n if (primary) {\n this.space = {\n model: primary.id,\n revision: primary.revision ?? \"unversioned\",\n schema: primary.schema ?? \"hf-feature-extraction-v1\",\n dimensions: primary.dimensions ?? EMBEDDING_DIMENSIONS,\n };\n }\n }\n\n async embed(request: EmbeddingRequest): Promise<EmbeddingResponse> {\n const primaryModel = request.model ?? this.embeddingModels[0]?.id;\n if (!primaryModel) {\n throw new Error(\"No embedding model configured.\");\n }\n\n const fallbackModels = this.embeddingModels\n .map((model) => model.id)\n .filter((model) => model !== primaryModel);\n\n return this.resilience.execute({\n model: primaryModel,\n fallbackModels,\n type: \"embedding\",\n ...(this.onDiagnostic ? { onDiagnostic: this.onDiagnostic } : {}),\n call: async (model) => {\n const response = await this.client.featureExtraction({\n model,\n inputs: request.input,\n });\n\n const definition = this.embeddingModels.find((entry) => entry.id === model);\n const vectors = normalizeEmbeddingResponse(response);\n const dimensions = vectors[0]?.length ?? 0;\n const result = {\n model,\n revision: definition?.revision ?? \"unversioned\",\n schema: definition?.schema ?? \"hf-feature-extraction-v1\",\n dimensions,\n vectors,\n };\n validateEmbeddingResponse(\n result,\n typeof request.input === \"string\" ? 1 : request.input.length,\n );\n if (dimensions !== (definition?.dimensions ?? EMBEDDING_DIMENSIONS)) {\n throw new Error(\n `Embedding model ${model} returned unexpected dimensions: ${dimensions}.`,\n );\n }\n return result;\n },\n });\n }\n\n async generateText(request: TextGenerationRequest): Promise<TextGenerationResponse> {\n const primaryModel = request.model ?? this.llmModels[0]?.id;\n if (!primaryModel) {\n throw new Error(\"No LLM model configured.\");\n }\n\n const fallbackModels = this.llmModels\n .map((model) => model.id)\n .filter((model) => model !== primaryModel);\n\n return this.resilience.execute({\n model: primaryModel,\n fallbackModels,\n type: \"llm\",\n ...(this.onDiagnostic ? { onDiagnostic: this.onDiagnostic } : {}),\n call: async (model) => {\n const response = await this.client.textGeneration({\n model,\n inputs: request.prompt,\n });\n\n return {\n model,\n text: response.generated_text,\n };\n },\n });\n }\n}\n\nfunction normalizeEmbeddingResponse(response: unknown): number[][] {\n if (!Array.isArray(response)) {\n throw new Error(\"Unexpected Hugging Face embedding response.\");\n }\n\n if (response.every((value) => typeof value === \"number\")) {\n return [response as number[]];\n }\n\n if (\n response.every(\n (vector) => Array.isArray(vector) && vector.every((value) => typeof value === \"number\"),\n )\n ) {\n return response as number[][];\n }\n\n throw new Error(\"Unexpected Hugging Face embedding vector shape.\");\n}\n","import PQueue from \"p-queue\";\nimport pRetry, { AbortError } from \"p-retry\";\nimport pTimeout from \"p-timeout\";\nimport type { ProviderCallMetadata, ProviderCallType } from \"./adapter.js\";\n\nexport type ResilienceOptions = {\n retries: number;\n concurrency: number;\n rateLimitPerMinute: number;\n timeoutMs: number;\n warmCacheTtlMs: number;\n coldStartBufferMs: number;\n jitterMs: number;\n minRetryTimeoutMs: number;\n maxRetryTimeoutMs: number;\n};\n\nexport type ResilientCallInput<T> = {\n model: string;\n type: ProviderCallType;\n fallbackModels?: string[];\n call: (model: string) => Promise<T>;\n onDiagnostic?: ((metadata: ProviderCallMetadata) => void | Promise<void>) | undefined;\n sleep?: ((ms: number) => Promise<void>) | undefined;\n};\n\nexport type HuggingFaceErrorLike = Error & {\n status?: number;\n statusCode?: number;\n response?: {\n status?: number;\n headers?: {\n get?: (name: string) => string | null;\n };\n };\n httpResponse?: {\n status?: number;\n };\n estimated_time?: number;\n estimatedTime?: number;\n cause?: unknown;\n};\n\nexport const DEFAULT_RESILIENCE_OPTIONS: ResilienceOptions = {\n retries: 5,\n concurrency: 2,\n rateLimitPerMinute: 10,\n timeoutMs: 90_000,\n warmCacheTtlMs: 5 * 60_000,\n coldStartBufferMs: 2_000,\n jitterMs: 250,\n minRetryTimeoutMs: 1_000,\n maxRetryTimeoutMs: 30_000,\n};\n\nexport class GatedModelError extends Error {\n readonly model: string;\n\n constructor(model: string) {\n super(\n `Model ${model} is gated. Accept the license at https://huggingface.co/${model} and retry.`,\n );\n this.name = \"GatedModelError\";\n this.model = model;\n }\n}\n\nexport class UnauthorizedError extends Error {\n constructor() {\n super(\"Hugging Face rejected the API token (401). Set a valid HF token and retry.\");\n this.name = \"UnauthorizedError\";\n }\n}\n\nexport class ModelUnavailableError extends Error {\n readonly model: string;\n\n constructor(model: string, cause?: unknown) {\n super(`Model ${model} is unavailable.`);\n this.name = \"ModelUnavailableError\";\n this.model = model;\n this.cause = cause;\n }\n}\n\nexport class HuggingFaceResilience {\n private readonly options: ResilienceOptions;\n private readonly queues = new Map<string, PQueue>();\n private readonly warmUntil = new Map<string, number>();\n\n constructor(options: Partial<ResilienceOptions> = {}) {\n this.options = {\n ...DEFAULT_RESILIENCE_OPTIONS,\n ...options,\n };\n }\n\n isWarm(model: string, now = Date.now()): boolean {\n return (this.warmUntil.get(model) ?? 0) > now;\n }\n\n markWarm(model: string, now = Date.now()): void {\n this.warmUntil.set(model, now + this.options.warmCacheTtlMs);\n }\n\n async execute<T>(input: ResilientCallInput<T>): Promise<T> {\n const models = [input.model, ...(input.fallbackModels ?? [])];\n let lastError: unknown;\n\n for (const [index, model] of models.entries()) {\n const fallbackTriggered = index > 0;\n\n try {\n return await this.executeForModel(model, input, fallbackTriggered);\n } catch (error) {\n lastError = error;\n\n if (error instanceof GatedModelError || error instanceof UnauthorizedError) {\n throw error;\n }\n }\n }\n\n throw lastError instanceof Error ? lastError : new Error(\"All provider models failed.\");\n }\n\n private async executeForModel<T>(\n model: string,\n input: ResilientCallInput<T>,\n fallbackTriggered: boolean,\n ): Promise<T> {\n const queue = this.getQueue(model);\n const startedAt = Date.now();\n let retries = 0;\n let coldStartWaitMs = 0;\n let status: ProviderCallMetadata[\"status\"] = fallbackTriggered ? \"fallback\" : \"success\";\n\n try {\n const result = await queue.add(\n async () =>\n pRetry(\n async () => {\n try {\n return await pTimeout(input.call(model), {\n milliseconds: this.options.timeoutMs,\n });\n } catch (error) {\n const classified = classifyHuggingFaceError(error, model);\n\n if (classified.kind === \"gated\") {\n status = \"gated\";\n throw new AbortError(new GatedModelError(model));\n }\n\n if (classified.kind === \"unauthorized\") {\n throw new AbortError(new UnauthorizedError());\n }\n\n if (classified.kind === \"cold_start\") {\n const waitMs = this.calculateColdStartWaitMs(classified.estimatedTimeSeconds);\n coldStartWaitMs += waitMs;\n await (input.sleep ?? sleep)(waitMs);\n throw error;\n }\n\n if (classified.kind === \"rate_limited\") {\n status = \"rate_limited\";\n if (classified.retryAfterMs) {\n await (input.sleep ?? sleep)(classified.retryAfterMs);\n }\n throw error;\n }\n\n if (classified.kind === \"unavailable\") {\n throw new ModelUnavailableError(model, error);\n }\n\n if (classified.kind === \"timeout\") {\n status = \"timeout\";\n }\n\n throw error;\n }\n },\n {\n retries: this.options.retries,\n minTimeout: this.options.minRetryTimeoutMs,\n maxTimeout: this.options.maxRetryTimeoutMs,\n factor: 2,\n randomize: true,\n onFailedAttempt: (error) => {\n retries = error.attemptNumber;\n },\n },\n ),\n { throwOnTimeout: true },\n );\n\n this.markWarm(model);\n status = fallbackTriggered ? \"fallback\" : \"success\";\n await input.onDiagnostic?.({\n model,\n type: input.type,\n status,\n latencyMs: Date.now() - startedAt,\n retries,\n fallbackTriggered,\n coldStartWaitMs,\n });\n return result;\n } catch (error) {\n const finalError =\n error instanceof AbortError && error.originalError ? error.originalError : error;\n const classified = classifyHuggingFaceError(finalError, model);\n const finalStatus = statusForClassifiedError(classified.kind, status);\n\n await input.onDiagnostic?.({\n model,\n type: input.type,\n status: finalStatus,\n latencyMs: Date.now() - startedAt,\n error: finalError instanceof Error ? finalError.message : String(finalError),\n retries,\n fallbackTriggered,\n coldStartWaitMs,\n });\n\n throw finalError;\n }\n }\n\n private getQueue(model: string): PQueue {\n const existing = this.queues.get(model);\n if (existing) {\n return existing;\n }\n\n const queue = new PQueue({\n concurrency: this.options.concurrency,\n intervalCap: this.options.rateLimitPerMinute,\n interval: 60_000,\n });\n\n this.queues.set(model, queue);\n return queue;\n }\n\n private calculateColdStartWaitMs(estimatedTimeSeconds: number): number {\n return Math.ceil(\n estimatedTimeSeconds * 1_000 + this.options.coldStartBufferMs + this.randomJitter(),\n );\n }\n\n private randomJitter(): number {\n return Math.floor(Math.random() * this.options.jitterMs);\n }\n}\n\ntype ClassifiedError =\n | { kind: \"cold_start\"; estimatedTimeSeconds: number }\n | { kind: \"rate_limited\"; retryAfterMs?: number }\n | { kind: \"gated\" }\n | { kind: \"unauthorized\" }\n | { kind: \"unavailable\" }\n | { kind: \"timeout\" }\n | { kind: \"unknown\" };\n\nexport function classifyHuggingFaceError(error: unknown, model: string): ClassifiedError {\n if (error instanceof GatedModelError) {\n return { kind: \"gated\" };\n }\n\n if (error instanceof ModelUnavailableError) {\n return { kind: \"unavailable\" };\n }\n\n if (error instanceof UnauthorizedError) {\n return { kind: \"unauthorized\" };\n }\n\n if (error instanceof Error && error.name === \"TimeoutError\") {\n return { kind: \"timeout\" };\n }\n\n const hfError = error as HuggingFaceErrorLike;\n const status =\n hfError.status ??\n hfError.statusCode ??\n hfError.response?.status ??\n // @huggingface/inference 4.x errors carry the code here.\n hfError.httpResponse?.status;\n\n if (status === 401) {\n return { kind: \"unauthorized\" };\n }\n\n if (status === 403) {\n return { kind: \"gated\" };\n }\n\n if (status === 404) {\n return { kind: \"unavailable\" };\n }\n\n if (status === 429) {\n const retryAfterMs = readRetryAfterMs(hfError);\n return retryAfterMs === undefined\n ? { kind: \"rate_limited\" }\n : { kind: \"rate_limited\", retryAfterMs };\n }\n\n if (status === 503) {\n const estimatedTimeSeconds = readEstimatedTimeSeconds(hfError);\n if (estimatedTimeSeconds !== undefined) {\n return { kind: \"cold_start\", estimatedTimeSeconds };\n }\n }\n\n if (error instanceof Error && error.message.includes(\"timed out\")) {\n return { kind: \"timeout\" };\n }\n\n if (error instanceof Error && error.message.includes(model) && error.message.includes(\"gated\")) {\n return { kind: \"gated\" };\n }\n\n return { kind: \"unknown\" };\n}\n\nfunction statusForClassifiedError(\n kind: ClassifiedError[\"kind\"],\n currentStatus: ProviderCallMetadata[\"status\"],\n): ProviderCallMetadata[\"status\"] {\n if (kind === \"gated\") {\n return \"gated\";\n }\n if (kind === \"rate_limited\") {\n return \"rate_limited\";\n }\n if (kind === \"timeout\") {\n return \"timeout\";\n }\n if (currentStatus === \"fallback\") {\n return \"fallback\";\n }\n return \"failed\";\n}\n\nfunction readEstimatedTimeSeconds(error: HuggingFaceErrorLike): number | undefined {\n if (typeof error.estimated_time === \"number\") {\n return error.estimated_time;\n }\n if (typeof error.estimatedTime === \"number\") {\n return error.estimatedTime;\n }\n if (typeof error.cause === \"object\" && error.cause !== null && \"estimated_time\" in error.cause) {\n const estimatedTime = (error.cause as { estimated_time?: unknown }).estimated_time;\n return typeof estimatedTime === \"number\" ? estimatedTime : undefined;\n }\n return undefined;\n}\n\nfunction readRetryAfterMs(error: HuggingFaceErrorLike): number | undefined {\n const retryAfter = error.response?.headers?.get?.(\"retry-after\");\n if (!retryAfter) {\n return undefined;\n }\n\n const retryAfterSeconds = Number(retryAfter);\n return Number.isFinite(retryAfterSeconds) ? retryAfterSeconds * 1_000 : undefined;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","export type TraceMetadata = Record<string, unknown>;\n\nexport type TraceSpan = {\n end(metadata?: TraceMetadata): void;\n fail(error: unknown, metadata?: TraceMetadata): void;\n};\n\nexport type Tracer = {\n enabled: boolean;\n startSpan(name: string, input?: TraceMetadata): TraceSpan;\n withSpan<T>(name: string, input: TraceMetadata, fn: () => Promise<T>): Promise<T>;\n};\n\nexport function isLangSmithTracingEnabled(env: NodeJS.ProcessEnv = process.env): boolean {\n return env.LANGCHAIN_TRACING_V2 === \"true\" || env.LANGSMITH_TRACING === \"true\";\n}\n\nexport function createTracer(env: NodeJS.ProcessEnv = process.env): Tracer {\n const enabled = isLangSmithTracingEnabled(env);\n if (!enabled) {\n return {\n enabled: false,\n startSpan: () => noopSpan,\n withSpan: async (_name, _input, fn) => fn(),\n };\n }\n return {\n enabled: true,\n startSpan(name, input) {\n const started = Date.now();\n log(\"span:start\", { name, input });\n return {\n end(metadata) {\n log(\"span:end\", { name, durationMs: Date.now() - started, metadata });\n },\n fail(error, metadata) {\n log(\"span:fail\", {\n name,\n durationMs: Date.now() - started,\n error: error instanceof Error ? error.message : String(error),\n metadata,\n });\n },\n };\n },\n async withSpan(name, input, fn) {\n const span = this.startSpan(name, input);\n try {\n const result = await fn();\n span.end();\n return result;\n } catch (error) {\n span.fail(error);\n throw error;\n }\n },\n };\n}\n\nconst noopSpan: TraceSpan = {\n end: () => undefined,\n fail: () => undefined,\n};\n\nfunction log(event: string, payload: TraceMetadata): void {\n if (process.env.NODE_ENV === \"test\") return;\n process.stderr.write(`${JSON.stringify({ at: \"tracer\", event, ...payload })}\\n`);\n}\n","import { z } from \"zod\";\nimport type { CodeBuddyConfig } from \"./types.js\";\n\nconst providerSchema = z.object({\n type: z.enum([\"local\", \"huggingface\", \"openrouter\"]),\n apiKey: z.string().min(1).optional(),\n model: z.string().min(1).optional(),\n relevanceFloor: z.number().min(-1).max(1).optional(),\n});\n\nexport const codeBuddyConfigSchema = z.object({\n postgresUrl: z.string().min(1, \"postgresUrl is required\"),\n provider: providerSchema,\n namespace: z\n .string()\n .min(1, \"namespace is required\")\n .max(128, \"namespace must be 128 chars or fewer\")\n .regex(/^[a-zA-Z0-9_.:-]+$/, \"namespace must match [a-zA-Z0-9_.:-]+\"),\n projectRoot: z.string().min(1).optional(),\n tokenBudget: z.number().int().positive().max(1_000_000).optional(),\n graphify: z\n .object({\n enabled: z.boolean(),\n graphPath: z.string().min(1).optional(),\n })\n .optional(),\n worker: z\n .object({\n pollIntervalMs: z.number().int().min(50).max(60_000).optional(),\n batchSize: z.number().int().min(1).max(64).optional(),\n maxAttempts: z.number().int().min(1).max(20).optional(),\n })\n .optional(),\n});\n\nexport type ValidatedCodeBuddyConfig = z.infer<typeof codeBuddyConfigSchema>;\n\nexport function validateConfig(config: CodeBuddyConfig): ValidatedCodeBuddyConfig {\n return codeBuddyConfigSchema.parse(config);\n}\n","import { mkdir, readdir, readFile, rm } from \"node:fs/promises\";\nimport { dirname, join, relative, resolve, sep } from \"node:path\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { z } from \"zod\";\nimport { redactPersisted } from \"../memory-extract/sensitive.js\";\nimport {\n assertNoSymlinkBetween,\n composeMarkdown,\n parseFrontMatter,\n writeAtomic,\n} from \"./markdown-store-fs.js\";\nimport { isEligibleMemory } from \"./memory-lifecycle.js\";\n\nexport const FACT_CATEGORIES = [\"general\", \"incident\"] as const;\nexport type FactCategory = (typeof FACT_CATEGORIES)[number];\nexport const INCIDENT_SEVERITIES = [\"low\", \"medium\", \"high\", \"critical\"] as const;\nexport type IncidentSeverity = (typeof INCIDENT_SEVERITIES)[number];\n\nconst factFrontMatterSchema = z.object({\n schemaVersion: z.literal(1),\n id: z.string().regex(/^fact_[a-z0-9]+$/),\n namespace: z.string().min(1),\n type: z.literal(\"fact\"),\n subject: z.string(),\n predicate: z.string(),\n object: z.string(),\n /** Explicit single-valued claim identity; facts sharing it are rival assertions. */\n propositionKey: z.string().min(1).nullable().default(null),\n confidence: z.number().min(0).max(1),\n createdAt: z.preprocess(\n (value) => (value instanceof Date ? value.toISOString() : value),\n z.string().datetime(),\n ),\n createdByAgent: z.string().nullable(),\n sourceInteractionId: z.string().nullable(),\n sourceDeleted: z.boolean(),\n category: z.enum(FACT_CATEGORIES).default(\"general\"),\n paths: z.array(z.string().min(1)).default([]),\n severity: z.enum(INCIDENT_SEVERITIES).nullable().default(null),\n introducedBy: z.string().nullable().default(null),\n resolvedBy: z.string().nullable().default(null),\n fingerprint: z\n .string()\n .regex(/^[a-f0-9]{64}$/)\n .nullable()\n .default(null),\n sourcePlanId: z.string().nullable().default(null),\n sourceSessionId: z.string().nullable().default(null),\n verification: z.array(z.string()).default([]),\n supersededBy: z.string().nullable().default(null),\n /** Namespaces granted a live reference to this fact (durable form of reference shares). */\n sharedWith: z.array(z.string().min(1)).default([]),\n});\n\nconst summaryFrontMatterSchema = z.object({\n schemaVersion: z.literal(1),\n id: z.string().regex(/^sum_[a-z0-9]+$/),\n namespace: z.string().min(1),\n type: z.literal(\"summary\"),\n sessionId: z.string().min(1),\n version: z.number().int().positive(),\n tokenCount: z.number().int().nonnegative(),\n createdAt: z.preprocess(\n (value) => (value instanceof Date ? value.toISOString() : value),\n z.string().datetime(),\n ),\n createdByAgent: z.string().nullable(),\n});\n\nexport type FactFile = z.infer<typeof factFrontMatterSchema> & {\n content: string;\n path: string;\n};\n\nexport type FactFileWrite = Omit<\n FactFile,\n | \"path\"\n | \"schemaVersion\"\n | \"type\"\n | \"category\"\n | \"paths\"\n | \"severity\"\n | \"introducedBy\"\n | \"resolvedBy\"\n | \"fingerprint\"\n | \"sourcePlanId\"\n | \"sourceSessionId\"\n | \"verification\"\n | \"supersededBy\"\n | \"sharedWith\"\n | \"propositionKey\"\n> &\n Partial<\n Pick<\n FactFile,\n | \"category\"\n | \"paths\"\n | \"severity\"\n | \"introducedBy\"\n | \"resolvedBy\"\n | \"fingerprint\"\n | \"sourcePlanId\"\n | \"sourceSessionId\"\n | \"verification\"\n | \"supersededBy\"\n | \"sharedWith\"\n | \"propositionKey\"\n >\n >;\nexport type IncidentFactFile = FactFile & {\n category: \"incident\";\n severity: IncidentSeverity;\n};\nexport type SummaryFile = z.infer<typeof summaryFrontMatterSchema> & {\n content: string;\n path: string;\n};\nexport type SummaryFileWrite = Omit<SummaryFile, \"path\" | \"schemaVersion\" | \"type\">;\n/** A managed memory file that exists on disk but could not be parsed. */\nexport type InvalidMemoryFile = { id: string; path: string; error: string };\n\nexport class MemoryFileStore {\n readonly repositoryRoot: string;\n readonly factsDirectory: string;\n readonly summariesDirectory: string;\n\n constructor(repositoryRoot = process.cwd()) {\n this.repositoryRoot = resolve(repositoryRoot);\n this.factsDirectory = join(this.repositoryRoot, \".codebuddy\", \"memory\", \"facts\");\n this.summariesDirectory = join(this.repositoryRoot, \".codebuddy\", \"memory\", \"summaries\");\n }\n\n async writeFact(raw: FactFileWrite): Promise<string> {\n // Persistence boundary: every fact writer (capture, remember, outcomes,\n // migration, resolve/supersede rewrites) is redacted here.\n const input = redactPersisted(raw);\n const path = this.factPath(input.id);\n await this.prepareDirectory(this.factsDirectory);\n await assertNoSymlinkBetween(this.repositoryRoot, dirname(path));\n\n const metadata = {\n schemaVersion: 1,\n id: input.id,\n namespace: input.namespace,\n type: \"fact\",\n subject: input.subject,\n predicate: input.predicate,\n object: input.object,\n propositionKey: input.propositionKey,\n confidence: input.confidence,\n createdAt: input.createdAt,\n createdByAgent: input.createdByAgent,\n sourceInteractionId: input.sourceInteractionId,\n sourceDeleted: input.sourceDeleted,\n category: input.category,\n paths: input.paths,\n severity: input.severity,\n introducedBy: input.introducedBy,\n resolvedBy: input.resolvedBy,\n fingerprint: input.fingerprint,\n sourcePlanId: input.sourcePlanId,\n sourceSessionId: input.sourceSessionId,\n verification: input.verification,\n supersededBy: input.supersededBy,\n sharedWith: input.sharedWith,\n };\n const frontMatter = stringifyYaml(stripUndefinedAndDefaultIncidentFields(metadata));\n\n await writeAtomic(path, composeMarkdown(frontMatter, input.content));\n return path;\n }\n\n async writeSummary(input: SummaryFileWrite): Promise<string> {\n const path = this.summaryPath(input.id);\n await this.prepareDirectory(this.summariesDirectory);\n await assertNoSymlinkBetween(this.repositoryRoot, dirname(path));\n const metadata = stringifyYaml({\n schemaVersion: 1,\n id: input.id,\n namespace: input.namespace,\n type: \"summary\",\n sessionId: input.sessionId,\n version: input.version,\n tokenCount: input.tokenCount,\n createdAt: input.createdAt,\n createdByAgent: input.createdByAgent,\n });\n await writeAtomic(path, composeMarkdown(metadata, input.content));\n return path;\n }\n\n async readFact(pathOrId: string): Promise<FactFile> {\n const path = pathOrId.endsWith(\".md\") ? this.safePath(pathOrId) : this.factPath(pathOrId);\n await assertNoSymlinkBetween(this.repositoryRoot, path);\n const parsed = parseFrontMatter(await readFile(path, \"utf8\"));\n const metadata = factFrontMatterSchema.parse(parseYaml(parsed.frontMatter));\n return {\n ...metadata,\n content: parsed.content.trim(),\n path,\n };\n }\n\n async listFacts(): Promise<FactFile[]> {\n return (await this.scanFacts()).facts;\n }\n\n /**\n * Parse every managed fact file. Hand-written markdown is ignored, and a\n * schema-invalid/corrupt fact is reported in `invalid` (not thrown) so one\n * bad file can't break recall, capture or reindexing for the whole project.\n * Invalid files stay on disk for manual repair.\n */\n async scanFacts(): Promise<{ facts: FactFile[]; invalid: InvalidMemoryFile[] }> {\n const scan = await this.scan(this.factsDirectory, /^fact_[a-z0-9]+\\.md$/, (path) =>\n this.readFact(path),\n );\n return { facts: scan.items, invalid: scan.invalid };\n }\n\n /**\n * List incident facts for the namespace, ranked by severity then recency.\n * Unlike {@link findIncidentFactsForPaths} this does not filter by path, so\n * callers (e.g. the context engine's project bootstrap) can surface the\n * repository's incident hotspots before any specific edit target is known.\n */\n async listIncidentFacts(\n input: { namespace?: string; includeResolved?: boolean } = {},\n ): Promise<IncidentFactFile[]> {\n const incidents = (await this.listFacts()).filter(\n (fact): fact is IncidentFactFile =>\n fact.category === \"incident\" && Boolean(fact.severity) && isEligibleMemory(fact, input),\n );\n\n return incidents.sort((left, right) => {\n const severity = severityRank(right.severity) - severityRank(left.severity);\n if (severity !== 0) return severity;\n return right.createdAt.localeCompare(left.createdAt);\n });\n }\n\n async findIncidentFactsForPaths(input: {\n namespace?: string;\n paths: string[];\n includeResolved?: boolean;\n }): Promise<IncidentFactFile[]> {\n const wanted = new Set(input.paths.map(normalizeMemoryPath));\n if (wanted.size === 0) return [];\n\n return (\n await this.listIncidentFacts({\n ...(input.namespace !== undefined ? { namespace: input.namespace } : {}),\n ...(input.includeResolved !== undefined ? { includeResolved: input.includeResolved } : {}),\n })\n ).filter((fact) => fact.paths.map(normalizeMemoryPath).some((path) => wanted.has(path)));\n }\n\n async readSummary(pathOrId: string): Promise<SummaryFile> {\n const path = pathOrId.endsWith(\".md\") ? this.safePath(pathOrId) : this.summaryPath(pathOrId);\n await assertNoSymlinkBetween(this.repositoryRoot, path);\n const parsed = parseFrontMatter(await readFile(path, \"utf8\"));\n return {\n ...summaryFrontMatterSchema.parse(parseYaml(parsed.frontMatter)),\n content: parsed.content.trim(),\n path,\n };\n }\n\n async listSummaries(): Promise<SummaryFile[]> {\n return (await this.scanSummaries()).summaries;\n }\n\n async scanSummaries(): Promise<{ summaries: SummaryFile[]; invalid: InvalidMemoryFile[] }> {\n const scan = await this.scan(this.summariesDirectory, /^sum_[a-z0-9]+\\.md$/, (path) =>\n this.readSummary(path),\n );\n return { summaries: scan.items, invalid: scan.invalid };\n }\n\n private async scan<T extends { id: string }>(\n directory: string,\n managedName: RegExp,\n read: (path: string) => Promise<T>,\n ): Promise<{ items: T[]; invalid: InvalidMemoryFile[] }> {\n try {\n await this.prepareDirectory(directory);\n const entries = await readdir(directory, { withFileTypes: true });\n const result: { items: T[]; invalid: InvalidMemoryFile[] } = { items: [], invalid: [] };\n for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {\n if (!entry.isFile() || !managedName.test(entry.name)) continue;\n const path = join(directory, entry.name);\n try {\n const item = await read(path);\n const id = entry.name.slice(0, -\".md\".length);\n if (item.id !== id)\n throw new Error(`file ID ${id} differs from front matter ID ${item.id}`);\n result.items.push(item);\n } catch (error) {\n result.invalid.push({\n id: entry.name.slice(0, -\".md\".length),\n path,\n error: (error as Error).message.split(\"\\n\")[0]?.slice(0, 300) ?? \"unreadable\",\n });\n }\n }\n return result;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return { items: [], invalid: [] };\n throw error;\n }\n }\n\n async deleteFact(id: string): Promise<void> {\n await rm(this.factPath(id), { force: true });\n }\n\n async markIncidentResolved(id: string, resolvedBy: string): Promise<void> {\n const fact = await this.readFact(id);\n await this.writeFact(copyFact(fact, { resolvedBy }));\n }\n\n async markFactSuperseded(id: string, supersededBy: string): Promise<void> {\n const fact = await this.readFact(id);\n await this.writeFact(copyFact(fact, { supersededBy }));\n }\n\n async setFactSharedWith(id: string, sharedWith: string[]): Promise<void> {\n const fact = await this.readFact(id);\n await this.writeFact(copyFact(fact, { sharedWith: [...new Set(sharedWith)].sort() }));\n }\n\n /** Persist interaction deletion in Markdown before the derived DB is updated. */\n async markSourceInteractionDeleted(\n namespace: string,\n sourceInteractionId: string,\n ): Promise<void> {\n const { facts } = await this.scanFacts();\n for (const fact of facts) {\n if (fact.namespace !== namespace || fact.sourceInteractionId !== sourceInteractionId)\n continue;\n if (fact.sourceDeleted) continue;\n await this.writeFact(copyFact(fact, { sourceDeleted: true }));\n }\n }\n\n /** Persist that a fact's source interaction was forgotten, keeping its provenance id. */\n async markFactSourceDeleted(id: string): Promise<void> {\n const fact = await this.readFact(id);\n await this.writeFact(copyFact(fact, { sourceDeleted: true }));\n }\n\n private factPath(id: string): string {\n if (!/^fact_[a-z0-9]+$/.test(id)) {\n throw new Error(`Invalid fact id: ${id}`);\n }\n return this.safePath(join(this.factsDirectory, `${id}.md`));\n }\n\n private summaryPath(id: string): string {\n if (!/^sum_[a-z0-9]+$/.test(id)) throw new Error(`Invalid summary id: ${id}`);\n return this.safePath(join(this.summariesDirectory, `${id}.md`));\n }\n\n private safePath(path: string): string {\n const absolute = resolve(path);\n const relativePath = relative(this.repositoryRoot, absolute);\n if (relativePath === \"..\" || relativePath.startsWith(`..${sep}`) || relativePath === \"\") {\n throw new Error(`Memory path escapes repository root: ${path}`);\n }\n return absolute;\n }\n\n private async prepareDirectory(directory: string): Promise<void> {\n await assertNoSymlinkBetween(this.repositoryRoot, dirname(directory));\n await mkdir(directory, { recursive: true, mode: 0o700 });\n }\n}\n\nfunction copyFact(\n fact: FactFile,\n patch: Partial<Pick<FactFile, \"resolvedBy\" | \"supersededBy\" | \"sourceDeleted\" | \"sharedWith\">>,\n): FactFileWrite {\n const { path: _path, schemaVersion: _schemaVersion, type: _type, ...write } = fact;\n return { ...write, ...patch };\n}\n\nfunction stripUndefinedAndDefaultIncidentFields(\n metadata: Record<string, unknown>,\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(metadata).filter(([key, value]) => {\n if (value === undefined) return false;\n if (key === \"category\" && value === \"general\") return false;\n if ((key === \"paths\" || key === \"sharedWith\") && Array.isArray(value) && value.length === 0)\n return false;\n if (\n [\"severity\", \"introducedBy\", \"resolvedBy\", \"propositionKey\"].includes(key) &&\n (value === null || value === undefined)\n ) {\n return false;\n }\n return true;\n }),\n );\n}\n\nfunction normalizeMemoryPath(path: string): string {\n return path.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n}\n\nfunction severityRank(severity: IncidentSeverity): number {\n switch (severity) {\n case \"critical\":\n return 4;\n case \"high\":\n return 3;\n case \"medium\":\n return 2;\n case \"low\":\n return 1;\n }\n}\n","import type { ModelProvider } from \"../providers/adapter.js\";\nimport {\n embeddingSpace,\n embeddingSpaceKey,\n validateEmbeddingResponse,\n} from \"../providers/embedding-space.js\";\nimport { generateEntityId } from \"./ids.js\";\nimport type { EmbeddingJob, MemoryRepository, ModelCallEntry } from \"./repository.js\";\n\nexport type EmbeddingWorkerOptions = {\n repository: MemoryRepository;\n provider: ModelProvider;\n pollIntervalMs?: number;\n batchSize?: number;\n maxAttempts?: number;\n onDiagnostic?: ModelCallSink;\n};\n\nexport type ModelCallSink = (entry: ModelCallEntry) => void | Promise<void>;\n\nexport type WorkerState = \"idle\" | \"running\" | \"draining\" | \"stopped\";\n\nconst DEFAULT_POLL_MS = 250;\nconst DEFAULT_BATCH_SIZE = 8;\nconst DEFAULT_MAX_ATTEMPTS = 5;\n/** After a failed poll, wait this long before retrying so a DB outage doesn't spin. */\nconst ERROR_BACKOFF_MS = 2_000;\n\nexport class EmbeddingWorker {\n private readonly repo: MemoryRepository;\n private readonly provider: ModelProvider;\n private readonly pollIntervalMs: number;\n private readonly batchSize: number;\n private readonly maxAttempts: number;\n private readonly onDiagnostic: ModelCallSink | undefined;\n\n private state: WorkerState = \"idle\";\n private loopPromise: Promise<void> | null = null;\n private wake: (() => void) | null = null;\n private idleResolvers: Array<() => void> = [];\n private inFlight = 0;\n\n constructor(options: EmbeddingWorkerOptions) {\n this.repo = options.repository;\n this.provider = options.provider;\n this.pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_MS;\n this.batchSize = options.batchSize ?? DEFAULT_BATCH_SIZE;\n this.maxAttempts = options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;\n this.onDiagnostic = options.onDiagnostic;\n }\n\n getState(): WorkerState {\n return this.state;\n }\n\n start(): void {\n // Never run two loops at once: a start() during 'draining' must not\n // overwrite loopPromise while the old loop is still finishing.\n if (this.loopPromise !== null) return;\n this.state = \"running\";\n this.loopPromise = this.loop().finally(() => {\n this.loopPromise = null;\n if (this.state === \"running\") this.state = \"idle\";\n });\n // A rejected loop must never become an unhandled rejection (Node 20 kills\n // the process); failures are contained per-iteration below.\n this.loopPromise.catch(() => {});\n }\n\n notify(): void {\n if (this.state === \"idle\" && this.loopPromise === null) this.start();\n if (this.wake) {\n const fn = this.wake;\n this.wake = null;\n fn();\n }\n }\n\n /**\n * Resolve once the worker reaches an empty poll (no in-flight jobs and\n * nothing left to claim). Retained for API compatibility: with\n * repository-side leases and backoff there is no unbounded claim window to\n * wait out anymore.\n */\n async drain(): Promise<void> {\n await new Promise<void>((resolve) => {\n this.idleResolvers.push(resolve);\n this.notify();\n });\n }\n\n async stop(): Promise<void> {\n if (this.state === \"stopped\" || this.state === \"idle\") {\n this.state = \"stopped\";\n return;\n }\n this.state = \"draining\";\n this.notify();\n if (this.loopPromise) {\n await this.loopPromise;\n }\n this.state = \"stopped\";\n }\n\n async shutdown(): Promise<void> {\n await this.stop();\n }\n\n getInFlight(): number {\n return this.inFlight;\n }\n\n private async loop(): Promise<void> {\n while (this.state === \"running\") {\n let jobs: EmbeddingJob[];\n try {\n jobs = await this.repo.claimPendingEmbeddings(this.batchSize);\n } catch (error) {\n // A transient DB error must never escape the loop — an escaping\n // rejection used to crash the whole MCP server process.\n console.error(\n `[worker] claimPendingEmbeddings failed: ${error instanceof Error ? error.message : String(error)}; retrying`,\n );\n if (this.state !== \"running\") break;\n // Do not let notify() interrupt outage backoff and create a hot loop.\n await new Promise((resolve) => setTimeout(resolve, ERROR_BACKOFF_MS));\n continue;\n }\n if (jobs.length === 0) {\n this.flushIdleResolvers();\n if (this.state !== \"running\") break;\n await this.sleep();\n continue;\n }\n\n this.inFlight += jobs.length;\n try {\n const outcomes = await Promise.allSettled(jobs.map((job) => this.processJob(job)));\n for (const outcome of outcomes) {\n if (outcome.status === \"rejected\") {\n console.error(`[worker] embedding job failed unexpectedly: ${String(outcome.reason)}`);\n }\n }\n } finally {\n this.inFlight -= jobs.length;\n }\n }\n this.flushIdleResolvers();\n }\n\n private flushIdleResolvers(): void {\n if (this.inFlight > 0) return;\n const resolvers = this.idleResolvers;\n this.idleResolvers = [];\n for (const resolve of resolvers) resolve();\n }\n\n private async processJob(job: EmbeddingJob): Promise<void> {\n let leaseLost = false;\n const renewal = setInterval(\n () => {\n void this.repo\n .renewEmbeddingLease(job.id, job.leaseToken)\n .then((renewed) => {\n if (!renewed) leaseLost = true;\n })\n .catch(() => {\n leaseLost = true;\n });\n },\n Math.max(250, Math.floor(job.leaseMs / 3)),\n );\n try {\n const response = await this.provider.embed({\n input: job.content,\n model: job.embeddingModel,\n });\n validateEmbeddingResponse(response, 1);\n const vector = response.vectors[0];\n if (!vector || vector.length === 0) {\n throw new Error(\"Provider returned no embedding vector.\");\n }\n if (\n leaseLost ||\n !(await this.repo.markEmbeddingReady(\n job.id,\n job.leaseToken,\n vector,\n response.model,\n embeddingSpaceKey(embeddingSpace(response)),\n ))\n )\n return;\n await this.emitDiagnostic({\n id: generateEntityId(\"mc\"),\n namespaceId: job.namespaceId,\n metadata: {\n model: response.model,\n type: \"embedding\",\n status: \"success\",\n latencyMs: 0,\n retries: 0,\n fallbackTriggered: false,\n coldStartWaitMs: 0,\n },\n });\n } catch (error) {\n const attempts = job.attempts + 1;\n const message = error instanceof Error ? error.message : String(error);\n if (leaseLost) return;\n try {\n if (\n !(await this.repo.markEmbeddingFailed(job.id, job.leaseToken, message, attempts, {\n maxAttempts: this.maxAttempts,\n }))\n )\n return;\n } catch (persistenceError) {\n console.error(\n `[worker] could not persist embedding failure: ${persistenceError instanceof Error ? persistenceError.message : String(persistenceError)}`,\n );\n return;\n }\n await this.emitDiagnostic({\n id: generateEntityId(\"mc\"),\n namespaceId: job.namespaceId,\n metadata: {\n model: job.embeddingModel,\n type: \"embedding\",\n status: attempts >= this.maxAttempts ? \"failed\" : \"fallback\",\n latencyMs: 0,\n error: message,\n retries: attempts,\n fallbackTriggered: false,\n coldStartWaitMs: 0,\n },\n });\n } finally {\n clearInterval(renewal);\n }\n }\n\n private emitDiagnostic(entry: ModelCallEntry): Promise<void> {\n const sink = this.onDiagnostic;\n if (!sink) return Promise.resolve();\n return Promise.resolve()\n .then(() => sink(entry))\n .catch(() => {\n /* diagnostic sink failure must not crash the worker */\n });\n }\n\n private sleep(ms?: number): Promise<void> {\n return new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n this.wake = null;\n resolve();\n }, ms ?? this.pollIntervalMs);\n this.wake = () => {\n clearTimeout(timer);\n resolve();\n };\n });\n }\n}\n","import { bootstrapDatabase, checkPgvector } from \"../db/bootstrap.js\";\nimport { createDatabaseClient, pingDatabase } from \"../db/client.js\";\nimport { runMigrations } from \"../db/migrator.js\";\nimport { createPostgresRepository } from \"../db/repository.js\";\nimport type { ModelProvider } from \"../providers/adapter.js\";\nimport { DEFAULT_EMBEDDING_MODELS, DEFAULT_LLM_MODELS } from \"../providers/models.js\";\nimport { CodeBuddy } from \"./codebuddy.js\";\nimport {\n checkConfigPermissions,\n checkProjectScaffold,\n defaultNamespaceForCwd,\n loadRuntimeConfig,\n MISSING_DATABASE_URL,\n readConfigFile,\n redactSecrets,\n} from \"./config-file.js\";\nimport { MemoryFileStore } from \"./memory-file-store.js\";\nimport type { MemoryRepository } from \"./repository.js\";\nimport type { CodeBuddyConfig } from \"./types.js\";\n\nexport type RuntimeHandle = {\n memory: CodeBuddy;\n repository: MemoryRepository;\n close(): Promise<void>;\n};\n\nexport type CreateRuntimeOptions = {\n /**\n * When true (default for `serve`), enable pgvector and apply any pending\n * SQL migrations before the SDK initialises. Safe to run repeatedly —\n * Drizzle skips migrations it has already applied.\n */\n autoBootstrap?: boolean;\n repositoryRoot?: string;\n /** false: read-only use (the prompt hook) that must not start embedding jobs. */\n startWorker?: boolean;\n connectTimeoutSeconds?: number;\n};\n\nexport async function createRuntime(\n config?: CodeBuddyConfig,\n options: CreateRuntimeOptions = {},\n): Promise<RuntimeHandle> {\n const runtimeConfig = config ?? (await loadRuntimeConfig());\n if (!runtimeConfig.postgresUrl) throw new Error(MISSING_DATABASE_URL);\n const client = createDatabaseClient({\n postgresUrl: runtimeConfig.postgresUrl,\n ...(options.connectTimeoutSeconds !== undefined\n ? { connectTimeoutSeconds: options.connectTimeoutSeconds }\n : {}),\n });\n try {\n if (options.autoBootstrap) {\n await bootstrapDatabase(client.sql);\n await runMigrations(client);\n }\n const repository = createPostgresRepository(client);\n const memory = new CodeBuddy(runtimeConfig, {\n repository,\n memoryFileStore: new MemoryFileStore(\n options.repositoryRoot ?? runtimeConfig.projectRoot ?? process.cwd(),\n ),\n });\n // init() starts the embedding worker only after its last fallible step,\n // so a failure here leaves just the pool to release.\n await memory.init(options.startWorker === false ? { startWorker: false } : {});\n return {\n memory,\n repository,\n async close() {\n await memory.shutdown();\n await client.close();\n },\n };\n } catch (error) {\n await client.close().catch(() => undefined);\n throw error;\n }\n}\n\nexport function encodeFactCursor(fact: { createdAt: Date; id: string }): string {\n return Buffer.from(JSON.stringify([fact.createdAt.toISOString(), fact.id]), \"utf8\").toString(\n \"base64url\",\n );\n}\n\nexport function decodeFactCursor(cursor: string): { createdAt: Date; id: string } {\n let parsed: unknown;\n try {\n parsed = JSON.parse(Buffer.from(cursor, \"base64url\").toString(\"utf8\"));\n } catch {\n throw new Error(\"Invalid cursor: expected a base64url-encoded [createdAt, id] pair.\");\n }\n if (\n !Array.isArray(parsed) ||\n parsed.length !== 2 ||\n typeof parsed[0] !== \"string\" ||\n typeof parsed[1] !== \"string\" ||\n Number.isNaN(Date.parse(parsed[0]))\n ) {\n throw new Error(\"Invalid cursor: expected a base64url-encoded [createdAt, id] pair.\");\n }\n const [createdAt, id] = parsed as [string, string];\n return { createdAt: new Date(createdAt), id };\n}\n\nexport async function listFactsPage(\n memory: CodeBuddy,\n repository: MemoryRepository,\n input: { subject?: string; limit?: number; cursor?: string },\n) {\n const namespace = await repository.ensureNamespace(memory.config.namespace);\n const requestedLimit = input.limit ?? 50;\n const limit = Math.max(1, Math.min(100, requestedLimit));\n const facts = await repository.listFacts({\n namespaceId: namespace.id,\n ...(input.subject ? { subject: input.subject } : {}),\n limit: limit + 1,\n ...(input.cursor ? { cursor: decodeFactCursor(input.cursor) } : {}),\n });\n const page = facts.slice(0, limit);\n const next = facts.length > limit ? page.at(-1) : undefined;\n return {\n facts: page,\n ...(next ? { nextCursor: encodeFactCursor(next) } : {}),\n };\n}\n\nexport async function inspectNamespace(repository: MemoryRepository, namespace?: string) {\n if (!namespace) {\n return {\n namespaces: await repository.listNamespaces(),\n agents: await repository.getAgentWriteBreakdown(),\n };\n }\n const row = await repository.getNamespaceByName(namespace);\n if (!row) return { namespace, exists: false, facts: [], agents: [] };\n return {\n namespace,\n exists: true,\n facts: await repository.listFacts({ namespaceId: row.id, limit: 50 }),\n agents: await repository.getAgentWriteBreakdown(row.id),\n };\n}\n\nexport type DoctorReport = {\n db: { ok: boolean; error?: string; canConnect?: boolean; postgresUrlSource?: string };\n pgvector: { ok: boolean; error?: string };\n vectors: { count: number; index: string | null; needsTuning: boolean };\n models: {\n id: string;\n reachable: boolean;\n status: \"unknown\" | \"warm\" | \"cold\" | \"gated\" | \"failed\";\n error?: string;\n }[];\n usage: {\n last60s: number;\n lastHour: number;\n last24h: number;\n estimatedDailyCapRemaining: number;\n warning80Percent: boolean;\n };\n scaffold: Awaited<ReturnType<typeof checkProjectScaffold>>;\n config: Awaited<ReturnType<typeof checkConfigPermissions>>;\n namespace: {\n expectedDefault: string;\n configured: string | null;\n runtime: string | null;\n ok: boolean;\n warning?: string;\n };\n};\n\nexport async function runDoctor(\n options: {\n config?: CodeBuddyConfig;\n repository?: MemoryRepository;\n provider?: ModelProvider;\n skipModelCheck?: boolean;\n } = {},\n): Promise<DoctorReport> {\n const fileConfig = await readConfigFile();\n const scaffold = await checkProjectScaffold();\n const configPermissions = await checkConfigPermissions();\n // Same helper the runtime and every CLI command use — one rule everywhere.\n const expectedDefaultNamespace = defaultNamespaceForCwd();\n const runtimeNamespace =\n process.env.CODEBUDDY_NAMESPACE ?? fileConfig.namespace ?? options.config?.namespace ?? null;\n const namespaceReport: DoctorReport[\"namespace\"] = {\n expectedDefault: expectedDefaultNamespace,\n configured: fileConfig.namespace ?? null,\n runtime: runtimeNamespace,\n ok:\n !fileConfig.namespace ||\n fileConfig.namespace === expectedDefaultNamespace ||\n process.env.CODEBUDDY_NAMESPACE !== undefined,\n ...(!fileConfig.namespace ||\n fileConfig.namespace === expectedDefaultNamespace ||\n process.env.CODEBUDDY_NAMESPACE !== undefined\n ? {}\n : {\n warning: `Configured namespace \"${fileConfig.namespace}\" differs from this folder's default \"${expectedDefaultNamespace}\". Confirm your MCP entries point at the intended namespace.`,\n }),\n };\n\n let config = options.config;\n if (!config) {\n try {\n config = await loadRuntimeConfig();\n } catch (error) {\n const message = String(redactSecrets((error as Error).message));\n return {\n db: {\n ok: false,\n error: message,\n canConnect: false,\n postgresUrlSource: \"missing\",\n },\n pgvector: { ok: false, error: \"Postgres is not configured yet.\" },\n vectors: { count: 0, index: null, needsTuning: false },\n models: await checkModels(options.provider, true),\n usage: {\n last60s: 0,\n lastHour: 0,\n last24h: 0,\n estimatedDailyCapRemaining: 10_000,\n warning80Percent: false,\n },\n scaffold,\n config: configPermissions,\n namespace: namespaceReport,\n };\n }\n }\n\n let repository = options.repository;\n let close: (() => Promise<void>) | undefined;\n let db = { ok: true } as DoctorReport[\"db\"];\n let pgvector = { ok: true } as DoctorReport[\"pgvector\"];\n\n if (!repository) {\n const postgresUrlSource =\n options.config?.postgresUrl !== undefined\n ? \"explicit\"\n : process.env.DATABASE_URL\n ? \"environment\"\n : fileConfig.postgresUrl\n ? \"config\"\n : \"missing\";\n const client = createDatabaseClient({ postgresUrl: config.postgresUrl });\n repository = createPostgresRepository(client);\n close = () => client.close();\n try {\n const canConnect = await pingDatabase(client);\n db = { ok: canConnect, canConnect, postgresUrlSource };\n if (!canConnect) db.error = \"Postgres did not respond to a simple ping.\";\n } catch (error) {\n db = {\n ok: false,\n canConnect: false,\n postgresUrlSource,\n error: String(redactSecrets((error as Error).message)),\n };\n }\n try {\n const health = await checkPgvector(client.sql);\n pgvector = {\n ok: health.available,\n ...(health.available ? {} : { error: \"pgvector extension is not installed.\" }),\n };\n } catch (error) {\n pgvector = { ok: false, error: String(redactSecrets((error as Error).message)) };\n }\n }\n\n try {\n if (!db.ok) {\n return {\n db,\n pgvector,\n vectors: { count: 0, index: null, needsTuning: false },\n models: await checkModels(options.provider, true),\n usage: {\n last60s: 0,\n lastHour: 0,\n last24h: 0,\n estimatedDailyCapRemaining: 10_000,\n warning80Percent: false,\n },\n scaffold,\n config: configPermissions,\n namespace: namespaceReport,\n };\n }\n const namespace = await repository.ensureNamespace(config.namespace);\n const [stats, vectorHealth] = await Promise.all([\n repository.getStats(namespace.id),\n repository.getVectorIndexHealth(namespace.id),\n ]);\n const models = await checkModels(options.provider, options.skipModelCheck);\n const dailyCap = 10_000;\n const used = stats.modelCalls.last24h;\n return {\n db,\n pgvector,\n vectors: {\n count: vectorHealth.vectorCount,\n index: vectorHealth.indexName,\n needsTuning: vectorHealth.needsTuning,\n },\n models,\n usage: {\n last60s: stats.modelCalls.last60s,\n lastHour: stats.modelCalls.lastHour,\n last24h: used,\n estimatedDailyCapRemaining: Math.max(0, dailyCap - used),\n warning80Percent: used >= dailyCap * 0.8,\n },\n scaffold,\n config: configPermissions,\n namespace: namespaceReport,\n };\n } finally {\n await close?.();\n }\n}\n\nasync function checkModels(\n provider?: ModelProvider,\n skip = false,\n): Promise<DoctorReport[\"models\"]> {\n const ids = [...DEFAULT_EMBEDDING_MODELS, ...DEFAULT_LLM_MODELS].map((model) => model.id);\n if (!provider || skip) {\n return ids.map((id) => ({ id, reachable: false, status: \"unknown\" }));\n }\n const results: DoctorReport[\"models\"] = [];\n for (const id of ids) {\n try {\n if (DEFAULT_EMBEDDING_MODELS.some((model) => model.id === id)) {\n await provider.embed({ model: id, input: \"doctor\" });\n } else {\n await provider.generateText({ model: id, prompt: \"doctor\" });\n }\n results.push({ id, reachable: true, status: \"warm\" });\n } catch (error) {\n const message = String(redactSecrets((error as Error).message));\n results.push({\n id,\n reachable: false,\n status: /gated|403/i.test(message)\n ? \"gated\"\n : /cold|503/i.test(message)\n ? \"cold\"\n : \"failed\",\n error: message,\n });\n }\n }\n return results;\n}\n"],"mappings":"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","names":["sql","sql","sql","sql","vector","text","vector","sql","vector","index","pTimeout","interactions","index","resolve","vector","dirname","resolve","z","z","resolve","dirname","facts","resolve","vector","pTimeout","vector","facts","id","result","createdAt","facts"]}