claude-memory-layer 1.0.46 → 1.0.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/cli/index.js +72 -5
- package/dist/cli/index.js.map +2 -2
- package/dist/core/index.js +1072 -4
- package/dist/core/index.js.map +4 -4
- package/dist/hooks/post-tool-use.js +71 -4
- package/dist/hooks/post-tool-use.js.map +2 -2
- package/dist/hooks/semantic-daemon.js +71 -4
- package/dist/hooks/semantic-daemon.js.map +2 -2
- package/dist/hooks/session-end.js +71 -4
- package/dist/hooks/session-end.js.map +2 -2
- package/dist/hooks/session-start.js +71 -4
- package/dist/hooks/session-start.js.map +2 -2
- package/dist/hooks/stop.js +71 -4
- package/dist/hooks/stop.js.map +2 -2
- package/dist/hooks/user-prompt-submit.js +71 -4
- package/dist/hooks/user-prompt-submit.js.map +2 -2
- package/dist/index.js +1078 -10
- package/dist/index.js.map +4 -4
- package/dist/mcp/index.js +142 -8
- package/dist/mcp/index.js.map +2 -2
- package/dist/server/api/index.js +71 -4
- package/dist/server/api/index.js.map +2 -2
- package/dist/server/index.js +71 -4
- package/dist/server/index.js.map +2 -2
- package/dist/services/memory-service.js +71 -4
- package/dist/services/memory-service.js.map +2 -2
- package/package.json +3 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/adapters/claude/hooks/semantic-daemon.ts", "../../src/services/memory-service.ts", "../../src/core/engine/memory-service-composition.ts", "../../src/core/metadata-extractor.ts", "../../src/core/engine/embedding-maintenance-service.ts", "../../src/extensions/endless-memory/endless-memory-services.ts", "../../src/core/working-set-store.ts", "../../src/core/db-wrapper.ts", "../../src/core/consolidated-store.ts", "../../src/core/consolidation-worker.ts", "../../src/core/continuity-manager.ts", "../../src/core/engine/memory-engine-services.ts", "../../src/extensions/vector/embedder.ts", "../../src/core/graduation.ts", "../../src/core/matcher.ts", "../../src/core/md-mirror.ts", "../../src/core/sqlite-event-store.ts", "../../src/core/canonical-key.ts", "../../src/core/registry/project-path.ts", "../../src/core/sqlite-wrapper.ts", "../../src/core/markdown-mirror.ts", "../../src/core/vector-outbox.ts", "../../src/core/retrieval-debug-lanes.ts", "../../src/core/operations/facets.ts", "../../src/core/operations/facet-repository.ts", "../../src/core/operations/governance-audit.ts", "../../src/core/operations/actions.ts", "../../src/core/operations/frontier-service.ts", "../../src/core/operations/action-projector.ts", "../../src/core/operations/retention-policy.ts", "../../src/core/operations/retention-repository.ts", "../../src/core/types.ts", "../../src/core/operations/retention-audit.ts", "../../src/core/operations/governance-service.ts", "../../src/core/operations/graph-path-service.ts", "../../src/core/operations/query-entity-extractor.ts", "../../src/core/operations/lesson-candidate-service.ts", "../../src/core/operations/lesson-service.ts", "../../src/core/operations/actor-repository.ts", "../../src/core/operations/session-actor-repository.ts", "../../src/core/operations/perspective-observation-repository.ts", "../../src/core/operations/perspective-deriver.ts", "../../src/core/vector-store.ts", "../../src/core/ingest-interceptor.ts", "../../src/core/tag-taxonomy.ts", "../../src/core/derive/summary-deriver.ts", "../../src/core/engine/memory-ingest-service.ts", "../../src/core/engine/memory-query-service.ts", "../../src/core/retrieval-quality.ts", "../../src/core/retriever.ts", "../../src/core/engine/retrieval-analytics-service.ts", "../../src/core/engine/retrieval-disclosure-service.ts", "../../src/core/engine/retrieval-orchestrator.ts", "../../src/core/engine/retrieval-services.ts", "../../src/core/graduation-worker.ts", "../../src/core/vector-worker.ts", "../../src/core/engine/memory-runtime-service.ts", "../../src/extensions/shared-memory/shared-memory-services.ts", "../../src/core/shared-event-store.ts", "../../src/core/shared-promoter.ts", "../../src/core/shared-store.ts", "../../src/core/shared-vector-store.ts", "../../src/core/registry/session-registry.ts", "../../src/services/memory-service-config.ts", "../../src/services/memory-service-registry.ts", "../../src/hooks/semantic-daemon.ts"],
|
|
4
|
-
"sourcesContent": ["import * as fs from 'fs';\nimport * as net from 'net';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { DISABLED_SHARED_STORE_CONFIG, MemoryService } from '../../../services/memory-service.js';\nimport { getProjectStoragePath } from '../../../core/registry/project-path.js';\nimport { getSessionProject } from '../../../core/registry/session-registry.js';\n\nexport interface SemanticDaemonRequest {\n type?: 'retrieve';\n sessionId?: string;\n prompt?: string;\n topK?: number;\n minScore?: number;\n}\n\nexport interface SemanticMemory {\n type: string;\n content: string;\n id?: string;\n score?: number;\n}\n\nexport interface SemanticDaemonResponse {\n ok: boolean;\n memories?: SemanticMemory[];\n error?: string;\n}\n\nconst SOCKET_PATH = process.env.CLAUDE_MEMORY_SEMANTIC_SOCKET || path.join(\n os.homedir(),\n '.claude-code',\n 'memory',\n 'semantic-daemon.sock'\n);\n\nconst IDLE_TIMEOUT_MS = parseInt(process.env.CLAUDE_MEMORY_SEMANTIC_DAEMON_IDLE_MS || '600000');\nconst serviceCache = new Map<string, MemoryService>();\n\nlet server: net.Server | null = null;\nlet idleTimer: NodeJS.Timeout | null = null;\nlet shuttingDown = false;\nlet processHandlersInstalled = false;\n\nfunction scheduleIdleShutdown(): void {\n if (idleTimer) {\n clearTimeout(idleTimer);\n }\n\n idleTimer = setTimeout(() => {\n shutdown(0).catch(() => {\n process.exit(0);\n });\n }, IDLE_TIMEOUT_MS);\n idleTimer.unref();\n}\n\nexport function parseSemanticDaemonRequest(raw: string): SemanticDaemonRequest {\n try {\n return JSON.parse(raw) as SemanticDaemonRequest;\n } catch {\n return {};\n }\n}\n\nexport function isValidSemanticDaemonRequest(\n input: SemanticDaemonRequest\n): input is Required<SemanticDaemonRequest> {\n return input.type === 'retrieve'\n && typeof input.sessionId === 'string'\n && input.sessionId.length > 0\n && typeof input.prompt === 'string'\n && input.prompt.length > 0\n && Number.isFinite(input.topK)\n && Number.isFinite(input.minScore);\n}\n\nexport function makeSemanticDaemonErrorResponse(error: unknown): SemanticDaemonResponse {\n return { ok: false, error: error instanceof Error ? error.message : 'unknown daemon error' };\n}\n\nexport function isVectorSessionFilterError(error: unknown): boolean {\n const message = error instanceof Error ? error.message.toLowerCase() : '';\n return message.includes('no field named sessionid');\n}\n\nfunction getServiceForSession(sessionId: string): MemoryService {\n const projectInfo = getSessionProject(sessionId);\n const key = projectInfo?.projectHash || '__global__';\n\n if (serviceCache.has(key)) {\n return serviceCache.get(key)!;\n }\n\n const service = new MemoryService({\n storagePath: projectInfo\n ? getProjectStoragePath(projectInfo.projectPath)\n : path.join(os.homedir(), '.claude-code', 'memory'),\n projectHash: projectInfo?.projectHash,\n projectPath: projectInfo?.projectPath,\n readOnly: false,\n embeddingOnly: true,\n analyticsEnabled: false,\n sharedStoreConfig: DISABLED_SHARED_STORE_CONFIG\n });\n\n serviceCache.set(key, service);\n return service;\n}\n\nexport async function handleSemanticDaemonRequest(raw: string): Promise<SemanticDaemonResponse> {\n const input = parseSemanticDaemonRequest(raw);\n if (!isValidSemanticDaemonRequest(input)) {\n return { ok: false, error: 'invalid request' };\n }\n\n try {\n const service = getServiceForSession(input.sessionId);\n let result;\n try {\n result = await service.retrieveMemories(input.prompt, {\n topK: input.topK,\n minScore: input.minScore,\n sessionId: input.sessionId,\n intentRewrite: true,\n adaptiveRerank: true,\n projectScopeMode: 'strict'\n });\n } catch (error) {\n if (!isVectorSessionFilterError(error)) {\n throw error;\n }\n\n // LanceDB field-case mismatch can fail sessionId filtering.\n // Retry without session filter and keep project strict scoping.\n result = await service.retrieveMemories(input.prompt, {\n topK: input.topK,\n minScore: input.minScore,\n intentRewrite: true,\n adaptiveRerank: true,\n projectScopeMode: 'strict'\n });\n }\n\n const memories = result.memories.map((m) => ({\n type: m.event.eventType,\n content: m.event.content,\n id: m.event.id,\n score: m.score\n }));\n\n return { ok: true, memories };\n } catch (error) {\n return makeSemanticDaemonErrorResponse(error);\n }\n}\n\nfunction createServer(): net.Server {\n return net.createServer({ allowHalfOpen: true }, (socket) => {\n scheduleIdleShutdown();\n socket.setEncoding('utf8');\n\n let requestRaw = '';\n\n socket.on('data', (chunk) => {\n requestRaw += chunk;\n if (requestRaw.length > 1024 * 1024) {\n socket.end(JSON.stringify({ ok: false, error: 'request too large' }));\n }\n });\n\n socket.on('end', async () => {\n const response = await handleSemanticDaemonRequest(requestRaw);\n socket.end(JSON.stringify(response));\n scheduleIdleShutdown();\n });\n\n socket.on('error', () => {\n // Ignore per-socket errors to keep daemon process alive.\n });\n });\n}\n\nasync function socketInUse(p: string): Promise<boolean> {\n if (!fs.existsSync(p)) return false;\n return new Promise((resolve) => {\n let settled = false;\n const client = net.createConnection(p);\n const done = (alive: boolean) => {\n if (settled) return;\n settled = true;\n client.destroy();\n resolve(alive);\n };\n client.on('connect', () => done(true));\n client.on('error', () => done(false));\n setTimeout(() => done(false), 120).unref();\n });\n}\n\nasync function listenServer(): Promise<void> {\n const socketDir = path.dirname(SOCKET_PATH);\n if (!fs.existsSync(socketDir)) {\n fs.mkdirSync(socketDir, { recursive: true });\n }\n\n if (await socketInUse(SOCKET_PATH)) {\n process.exit(0);\n }\n\n if (fs.existsSync(SOCKET_PATH)) {\n try {\n fs.unlinkSync(SOCKET_PATH);\n } catch {\n // Ignore stale socket unlink failures.\n }\n }\n\n server = createServer();\n\n await new Promise<void>((resolve, reject) => {\n if (!server) {\n reject(new Error('daemon server not initialized'));\n return;\n }\n\n server.once('error', reject);\n server.listen(SOCKET_PATH, () => {\n server?.off('error', reject);\n resolve();\n });\n });\n}\n\nasync function shutdown(code: number): Promise<void> {\n if (shuttingDown) return;\n shuttingDown = true;\n\n if (idleTimer) {\n clearTimeout(idleTimer);\n }\n idleTimer = null;\n\n const closePromises: Promise<void>[] = [];\n for (const service of serviceCache.values()) {\n closePromises.push(service.shutdown().catch(() => undefined));\n }\n await Promise.all(closePromises);\n serviceCache.clear();\n\n if (server) {\n await new Promise<void>((resolve) => {\n server?.close(() => resolve());\n });\n }\n server = null;\n\n if (fs.existsSync(SOCKET_PATH)) {\n try {\n fs.unlinkSync(SOCKET_PATH);\n } catch {\n // Ignore socket cleanup failure.\n }\n }\n\n process.exit(code);\n}\n\nfunction installProcessHandlers(): void {\n if (processHandlersInstalled) return;\n processHandlersInstalled = true;\n\n process.on('SIGINT', () => { shutdown(0).catch(() => process.exit(0)); });\n process.on('SIGTERM', () => { shutdown(0).catch(() => process.exit(0)); });\n process.on('uncaughtException', () => { shutdown(1).catch(() => process.exit(1)); });\n process.on('unhandledRejection', () => { shutdown(1).catch(() => process.exit(1)); });\n}\n\nexport async function main(): Promise<void> {\n installProcessHandlers();\n await listenServer();\n scheduleIdleShutdown();\n}\n", "/**\n * Memory Service - Main entry point for memory operations\n * Coordinates EventStore, VectorStore, Retriever, and Graduation\n */\n\nimport * as os from 'os';\n\nimport type { RetrievalResult, UnifiedRetrievalResult } from '../core/retriever.js';\nimport type { PromotionResult } from '../core/shared-promoter.js';\nimport type { SharedMemoryServices } from '../extensions/shared-memory/index.js';\nimport type {\n AppendResult,\n MemoryEvent,\n ToolObservationPayload,\n MemoryMode,\n EndlessModeConfig,\n WorkingSet,\n ConsolidatedMemory,\n EndlessModeStatus,\n ContinuityScore,\n SharedStoreConfig,\n Entry,\n OutboxStats,\n OutboxStatsOptions,\n OutboxRecoveryOptions,\n OutboxRecoveryResult,\n ProjectScopeRepairOptions,\n ProjectScopeRepairResult\n} from '../core/types.js';\nimport type { EndlessMemoryServices } from '../extensions/endless-memory/index.js';\nimport {\n type EmbeddingMaintenanceService,\n type EmbeddingModelMaintenanceOptions,\n type EmbeddingModelMaintenanceResult\n} from '../core/engine/embedding-maintenance-service.js';\nimport type { MemoryRuntimeService } from '../core/engine/memory-runtime-service.js';\nimport type { GraduationRunResult } from '../core/graduation-worker.js';\nimport type { IngestInterceptor } from '../core/ingest-interceptor.js';\nimport type { MemoryIngestService } from '../core/engine/memory-ingest-service.js';\nimport type { MemoryQueryService } from '../core/engine/memory-query-service.js';\nimport { createMemoryServiceComposition } from '../core/engine/memory-service-composition.js';\nimport {\n getProjectStoragePath as defaultGetProjectStoragePath,\n hashProjectPath as defaultHashProjectPath\n} from '../core/registry/project-path.js';\nimport { getSessionProject as defaultGetSessionProject } from '../core/registry/session-registry.js';\nimport {\n DEFAULT_ENABLED_SHARED_STORE_CONFIG,\n DEFAULT_SHARED_STORAGE_PATH,\n DISABLED_SHARED_STORE_CONFIG,\n type MemoryServiceConfig\n} from './memory-service-config.js';\nimport { createMemoryServiceRegistry } from './memory-service-registry.js';\nimport {\n type AccessedMemory,\n type HelpfulMemory,\n type HelpfulnessStats,\n type RecordQueryTraceInput,\n type RetrievalAnalyticsService,\n type RetrievalDisclosureExpansion,\n type RetrievalDisclosureExpandOptions,\n type RetrievalDisclosureSearchOptions,\n type RetrievalDisclosureSearchResponse,\n type RetrievalDisclosureService,\n type RetrievalDisclosureSource,\n type RetrievalOrchestrator,\n type RetrievalTrace,\n type RetrievalTraceStats,\n type RetrieveMemoriesOptions\n} from '../core/engine/retrieval-services.js';\nexport { getProjectStoragePath, hashProjectPath } from '../core/registry/project-path.js';\nexport {\n getSessionProject,\n registerSession,\n type SessionRegistry,\n type SessionRegistryEntry,\n loadSessionRegistry\n} from '../core/registry/session-registry.js';\n\nexport {\n DEFAULT_ENABLED_SHARED_STORE_CONFIG,\n DEFAULT_SHARED_STORAGE_PATH,\n DISABLED_SHARED_STORE_CONFIG,\n type MemoryServiceConfig\n} from './memory-service-config.js';\n\nexport class MemoryService {\n private readonly retrievalOrchestrator: RetrievalOrchestrator;\n private readonly retrievalDisclosureService: RetrievalDisclosureService;\n private readonly retrievalAnalyticsService: RetrievalAnalyticsService;\n private readonly embeddingMaintenanceService: EmbeddingMaintenanceService;\n private readonly runtimeService: MemoryRuntimeService;\n\n // Endless Mode components\n private readonly endlessMemoryServices: EndlessMemoryServices;\n\n // Shared Store components (cross-project knowledge)\n private sharedMemoryServices!: SharedMemoryServices;\n private projectHash: string | null = null;\n private projectPath: string | null = null;\n\n private readonly readOnly: boolean;\n private readonly lightweightMode: boolean;\n private readonly embeddingOnly: boolean;\n private readonly ingestService: MemoryIngestService;\n private readonly queryService: MemoryQueryService;\n\n constructor(config: MemoryServiceConfig & { projectHash?: string; projectPath?: string; sharedStoreConfig?: SharedStoreConfig }) {\n this.readOnly = config.readOnly ?? false;\n this.lightweightMode = config.lightweightMode ?? false;\n this.embeddingOnly = config.embeddingOnly ?? false;\n\n // Store project hash for shared store operations\n this.projectHash = config.projectHash || null;\n this.projectPath = config.projectPath || null;\n const sharedStoreConfig = config.sharedStoreConfig ?? DEFAULT_ENABLED_SHARED_STORE_CONFIG;\n\n const composition = createMemoryServiceComposition({\n config: {\n ...config,\n storagePath: config.storagePath,\n readOnly: this.readOnly,\n lightweightMode: this.lightweightMode,\n embeddingOnly: this.embeddingOnly,\n sharedStoreConfig\n },\n defaultSharedStoragePath: DEFAULT_SHARED_STORAGE_PATH,\n defaultSharedStoreConfig: DEFAULT_ENABLED_SHARED_STORE_CONFIG,\n initialize: () => this.initialize(),\n getProjectHash: () => this.projectHash,\n getProjectPath: () => this.projectPath\n });\n\n this.retrievalOrchestrator = composition.retrievalOrchestrator;\n this.retrievalDisclosureService = composition.retrievalDisclosureService;\n this.retrievalAnalyticsService = composition.retrievalAnalyticsService;\n this.ingestService = composition.ingestService;\n this.queryService = composition.queryService;\n this.endlessMemoryServices = composition.endlessMemoryServices;\n this.sharedMemoryServices = composition.sharedMemoryServices;\n this.runtimeService = composition.runtimeService;\n this.embeddingMaintenanceService = composition.embeddingMaintenanceService;\n }\n\n /**\n * Initialize all components\n */\n async initialize(): Promise<void> {\n await this.runtimeService.initialize();\n }\n\n registerIngestBefore(interceptor: IngestInterceptor): () => void {\n return this.ingestService.registerIngestBefore(interceptor);\n }\n\n registerIngestAfter(interceptor: IngestInterceptor): () => void {\n return this.ingestService.registerIngestAfter(interceptor);\n }\n\n registerIngestOnError(interceptor: IngestInterceptor): () => void {\n return this.ingestService.registerIngestOnError(interceptor);\n }\n\n /**\n * Start a new session\n */\n async startSession(sessionId: string, projectPath?: string): Promise<void> {\n return this.ingestService.startSession(sessionId, projectPath);\n }\n\n /**\n * End a session\n */\n async endSession(sessionId: string, summary?: string): Promise<void> {\n return this.ingestService.endSession(sessionId, summary);\n }\n\n /**\n * Store a user prompt\n */\n async storeUserPrompt(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestService.storeUserPrompt(sessionId, content, metadata);\n }\n\n /**\n * Store an agent response\n */\n async storeAgentResponse(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestService.storeAgentResponse(sessionId, content, metadata);\n }\n\n /**\n * Store a session summary\n */\n async storeSessionSummary(\n sessionId: string,\n summary: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestService.storeSessionSummary(sessionId, summary, metadata);\n }\n\n /**\n * Backfill session summaries for recent sessions that are missing them.\n * Called from session-start hook to catch sessions that ended without Stop hook.\n */\n async backfillMissingSummaries(currentSessionId: string, limit = 5): Promise<void> {\n return this.ingestService.backfillMissingSummaries(currentSessionId, limit);\n }\n\n /**\n * Generate a rule-based session summary from stored events.\n * Called at session end (Stop hook) when no LLM-generated summary exists.\n * Skips if a summary already exists for this session.\n */\n async generateSessionSummary(sessionId: string): Promise<void> {\n return this.ingestService.generateSessionSummary(sessionId);\n }\n\n /**\n * Store a tool observation\n */\n async storeToolObservation(\n sessionId: string,\n payload: ToolObservationPayload\n ): Promise<AppendResult> {\n return this.ingestService.storeToolObservation(sessionId, payload);\n }\n\n /**\n * Retrieve relevant memories for a query\n */\n async retrieveMemories(\n query: string,\n options?: RetrieveMemoriesOptions\n ): Promise<UnifiedRetrievalResult> {\n return this.retrievalOrchestrator.retrieveMemories(query, options);\n }\n\n /**\n * Layer 1 retrieval disclosure: lightweight search envelopes for UI/API/agent use.\n */\n async searchDisclosure(\n query: string,\n options?: RetrievalDisclosureSearchOptions\n ): Promise<RetrievalDisclosureSearchResponse> {\n return this.retrievalDisclosureService.search(query, options);\n }\n\n /**\n * Layer 2 retrieval disclosure: expand a search result into surrounding timeline context.\n */\n async expandDisclosure(\n resultId: string,\n options?: RetrievalDisclosureExpandOptions\n ): Promise<RetrievalDisclosureExpansion | null> {\n return this.retrievalDisclosureService.expand(resultId, options);\n }\n\n /**\n * Layer 3 retrieval disclosure: resolve a search result to its raw source event.\n */\n async sourceDisclosure(resultId: string): Promise<RetrievalDisclosureSource | null> {\n return this.retrievalDisclosureService.source(resultId);\n }\n\n /**\n * Fast keyword search using SQLite FTS5\n * Much faster than vector search - no embedding model needed\n */\n async keywordSearch(\n query: string,\n options?: { topK?: number; minScore?: number }\n ): Promise<Array<{event: MemoryEvent; score: number}>> {\n return this.queryService.keywordSearch(query, options);\n }\n\n /**\n * Rebuild FTS index (call after database upgrade)\n */\n async rebuildFtsIndex(): Promise<number> {\n return this.queryService.rebuildFtsIndex();\n }\n\n /**\n * Get session history\n */\n async getSessionHistory(sessionId: string): Promise<MemoryEvent[]> {\n return this.queryService.getSessionHistory(sessionId);\n }\n\n /**\n * Get recent events\n */\n async getRecentEvents(limit: number = 100): Promise<MemoryEvent[]> {\n return this.queryService.getRecentEvents(limit);\n }\n\n /**\n * Get memory statistics\n */\n\n async getOutboxStats(options?: OutboxStatsOptions): Promise<OutboxStats> {\n return this.queryService.getOutboxStats(options);\n }\n\n async recoverStuckOutboxItems(options?: OutboxRecoveryOptions): Promise<OutboxRecoveryResult> {\n return this.queryService.recoverStuckOutboxItems(options);\n }\n\n async repairLegacyProjectScope(options?: ProjectScopeRepairOptions): Promise<ProjectScopeRepairResult> {\n return this.queryService.repairLegacyProjectScope(options);\n }\n\n async getRetrievalTraceStats(): Promise<RetrievalTraceStats> {\n return this.retrievalAnalyticsService.getRetrievalTraceStats();\n }\n\n async getRecentRetrievalTraces(limit: number = 50): Promise<RetrievalTrace[]> {\n return this.retrievalAnalyticsService.getRecentRetrievalTraces(limit);\n }\n\n async getStats(): Promise<{\n totalEvents: number;\n vectorCount: number;\n levelStats: Array<{ level: string; count: number }>;\n }> {\n return this.queryService.getStats();\n }\n\n /**\n * Process pending embeddings\n */\n async processPendingEmbeddings(): Promise<number> {\n return this.runtimeService.processPendingEmbeddings();\n }\n\n /**\n * Get events by memory level\n */\n async getEventsByLevel(level: string, options?: { limit?: number; offset?: number }): Promise<MemoryEvent[]> {\n return this.queryService.getEventsByLevel(level, options);\n }\n\n /**\n * Get memory level for a specific event\n */\n async getEventLevel(eventId: string): Promise<string | null> {\n return this.queryService.getEventLevel(eventId);\n }\n\n /**\n * Format retrieval results as context for Claude\n */\n formatAsContext(result: RetrievalResult): string {\n return this.retrievalOrchestrator.formatAsContext(result);\n }\n\n // ============================================================\n // Shared Store Methods (Cross-Project Knowledge)\n // ============================================================\n\n /**\n * Check if shared store is enabled and initialized\n */\n isSharedStoreEnabled(): boolean {\n return this.sharedMemoryServices.isEnabled();\n }\n\n /**\n * Promote an entry to shared storage\n */\n async promoteToShared(entry: Entry): Promise<PromotionResult> {\n return this.sharedMemoryServices.promoteToShared(entry, this.projectHash);\n }\n\n /**\n * Get shared store statistics\n */\n async getSharedStoreStats(): Promise<{\n total: number;\n averageConfidence: number;\n topTopics: Array<{ topic: string; count: number }>;\n totalUsageCount: number;\n } | null> {\n return this.sharedMemoryServices.getStats();\n }\n\n /**\n * Search shared troubleshooting entries\n */\n async searchShared(\n query: string,\n options?: { topK?: number; minConfidence?: number }\n ) {\n return this.sharedMemoryServices.search(query, options);\n }\n\n /**\n * Get project hash for this service\n */\n getProjectHash(): string | null {\n return this.projectHash;\n }\n\n // ============================================================\n // Endless Mode Methods\n // ============================================================\n\n /**\n * Initialize Endless Mode components\n */\n async initializeEndlessMode(): Promise<void> {\n return this.endlessMemoryServices.initializeEndlessMode();\n }\n\n /**\n * Get Endless Mode configuration\n */\n async getEndlessConfig(): Promise<EndlessModeConfig> {\n return this.endlessMemoryServices.getEndlessConfig();\n }\n\n /**\n * Set Endless Mode configuration\n */\n async setEndlessConfig(config: Partial<EndlessModeConfig>): Promise<void> {\n return this.endlessMemoryServices.setEndlessConfig(config);\n }\n\n /**\n * Set memory mode (session or endless)\n */\n async setMode(mode: MemoryMode): Promise<void> {\n return this.endlessMemoryServices.setMode(mode);\n }\n\n /**\n * Get current memory mode\n */\n getMode(): MemoryMode {\n return this.endlessMemoryServices.getMode();\n }\n\n /**\n * Check if endless mode is active\n */\n isEndlessModeActive(): boolean {\n return this.endlessMemoryServices.isEndlessModeActive();\n }\n\n /**\n * Add event to Working Set (Endless Mode)\n */\n async addToWorkingSet(eventId: string, relevanceScore?: number): Promise<void> {\n return this.endlessMemoryServices.addToWorkingSet(eventId, relevanceScore);\n }\n\n /**\n * Get the current Working Set\n */\n async getWorkingSet(): Promise<WorkingSet | null> {\n return this.endlessMemoryServices.getWorkingSet();\n }\n\n /**\n * Search consolidated memories\n */\n async searchConsolidated(\n query: string,\n options?: { topK?: number }\n ): Promise<ConsolidatedMemory[]> {\n return this.endlessMemoryServices.searchConsolidated(query, options);\n }\n\n /**\n * Get all consolidated memories\n */\n async getConsolidatedMemories(limit?: number): Promise<ConsolidatedMemory[]> {\n return this.endlessMemoryServices.getConsolidatedMemories(limit);\n }\n\n /**\n * Increment access count for memories that were used in prompts\n */\n async incrementMemoryAccess(eventIds: string[]): Promise<void> {\n return this.retrievalOrchestrator.incrementMemoryAccess(eventIds);\n }\n\n /**\n * Get most accessed memories from events\n */\n async getMostAccessedMemories(limit: number = 10): Promise<AccessedMemory[]> {\n return this.retrievalAnalyticsService.getMostAccessedMemories(limit);\n }\n\n /**\n * Record a memory retrieval for helpfulness tracking\n */\n async recordRetrieval(eventId: string, sessionId: string, score: number, query: string): Promise<void> {\n return this.retrievalOrchestrator.recordRetrieval(eventId, sessionId, score, query);\n }\n\n /**\n * Record a query-level retrieval trace (used by user-prompt-submit hook).\n * Feeds the retrieval_traces table that powers dashboard stats.\n */\n async recordQueryTrace(input: RecordQueryTraceInput): Promise<void> {\n return this.retrievalOrchestrator.recordQueryTrace(input);\n }\n\n /**\n * Evaluate helpfulness of retrievals in a session (called at session end)\n */\n async evaluateSessionHelpfulness(sessionId: string): Promise<void> {\n await this.retrievalAnalyticsService.evaluateSessionHelpfulness(sessionId);\n }\n\n /**\n * Backfill helpfulness evaluation for sessions that ended without Stop hook.\n * Call on first turn of a new session to catch missed evaluations.\n */\n async evaluatePendingSessions(currentSessionId: string): Promise<void> {\n await this.retrievalAnalyticsService.evaluatePendingSessions(currentSessionId);\n }\n\n /**\n * Get most helpful memories ranked by helpfulness score\n */\n async getHelpfulMemories(limit: number = 10): Promise<HelpfulMemory[]> {\n return this.retrievalAnalyticsService.getHelpfulMemories(limit);\n }\n\n /**\n * Get helpfulness statistics for dashboard\n */\n async getHelpfulnessStats(since?: Date): Promise<HelpfulnessStats> {\n return this.retrievalAnalyticsService.getHelpfulnessStats(since);\n }\n\n /**\n * Mark a consolidated memory as accessed\n */\n async markMemoryAccessed(memoryId: string): Promise<void> {\n return this.endlessMemoryServices.markMemoryAccessed(memoryId);\n }\n\n /**\n * Calculate continuity score for current context\n */\n async calculateContinuity(\n content: string,\n metadata?: { files?: string[]; entities?: string[] }\n ): Promise<ContinuityScore | null> {\n return this.endlessMemoryServices.calculateContinuity(content, metadata);\n }\n\n /**\n * Record activity (for consolidation idle trigger)\n */\n recordActivity(): void {\n this.endlessMemoryServices.recordActivity();\n }\n\n /**\n * Force a consolidation run\n */\n async forceConsolidation(): Promise<number> {\n return this.endlessMemoryServices.forceConsolidation();\n }\n\n /**\n * Get Endless Mode status\n */\n async getEndlessModeStatus(): Promise<EndlessModeStatus> {\n return this.endlessMemoryServices.getEndlessModeStatus();\n }\n\n // ============================================================\n // Turn Grouping Methods\n // ============================================================\n\n /**\n * Get events grouped by turn for a session\n */\n async getSessionTurns(sessionId: string, options?: { limit?: number; offset?: number }): Promise<Array<{\n turnId: string;\n events: MemoryEvent[];\n startedAt: Date;\n promptPreview: string;\n eventCount: number;\n toolCount: number;\n hasResponse: boolean;\n }>> {\n return this.queryService.getSessionTurns(sessionId, options);\n }\n\n /**\n * Get all events for a specific turn\n */\n async getEventsByTurn(turnId: string): Promise<MemoryEvent[]> {\n return this.queryService.getEventsByTurn(turnId);\n }\n\n /**\n * Count total turns for a session\n */\n async countSessionTurns(sessionId: string): Promise<number> {\n return this.queryService.countSessionTurns(sessionId);\n }\n\n /**\n * Backfill turn_ids from metadata for events stored before the migration\n */\n async backfillTurnIds(): Promise<number> {\n return this.queryService.backfillTurnIds();\n }\n\n /**\n * Delete all events for a session (for force reimport)\n */\n async deleteSessionEvents(sessionId: string): Promise<number> {\n return this.queryService.deleteSessionEvents(sessionId);\n }\n\n /**\n * Format Endless Mode context for Claude\n */\n async formatEndlessContext(query: string): Promise<string> {\n return this.endlessMemoryServices.formatEndlessContext(query);\n }\n\n /**\n * Force a graduation evaluation run\n */\n async forceGraduation(): Promise<GraduationRunResult> {\n return this.runtimeService.forceGraduation();\n }\n\n /**\n * Record access to a memory event (for graduation scoring)\n */\n recordMemoryAccess(eventId: string, sessionId: string, confidence: number = 1.0): void {\n this.runtimeService.recordMemoryAccess(eventId, sessionId, confidence);\n }\n\n getEmbeddingModelName(): string {\n return this.embeddingMaintenanceService.getEmbeddingModelName();\n }\n\n /**\n * Ensure embedding model metadata is in sync and optionally migrate vectors.\n * Migration strategy: clear vector index + clear embedding outbox + re-enqueue all events.\n */\n async ensureEmbeddingModelForImport(\n options?: EmbeddingModelMaintenanceOptions\n ): Promise<EmbeddingModelMaintenanceResult> {\n return this.embeddingMaintenanceService.ensureEmbeddingModelForImport(options);\n }\n\n /**\n * Backward-compatible alias used by some hooks\n */\n async close(): Promise<void> {\n await this.shutdown();\n }\n\n /**\n * Shutdown service\n */\n async shutdown(): Promise<void> {\n await this.runtimeService.shutdown();\n }\n}\n\nconst defaultRegistry = createMemoryServiceRegistry<MemoryService>({\n createService: (config) => new MemoryService(config),\n hashProjectPath: defaultHashProjectPath,\n getProjectStoragePath: defaultGetProjectStoragePath,\n getSessionProject: defaultGetSessionProject,\n homedir: os.homedir,\n disabledSharedStoreConfig: DISABLED_SHARED_STORE_CONFIG\n});\n\nexport const getDefaultMemoryService = defaultRegistry.getDefaultMemoryService;\nexport const getReadOnlyMemoryService = defaultRegistry.getReadOnlyMemoryService;\nexport const getMemoryServiceForProject = defaultRegistry.getMemoryServiceForProject;\nexport const getMemoryServiceForSession = defaultRegistry.getMemoryServiceForSession;\nexport const getLightweightMemoryService = defaultRegistry.getLightweightMemoryService;\nexport const getLightweightMemoryServiceForProject = defaultRegistry.getLightweightMemoryServiceForProject;\nexport const createMemoryService = defaultRegistry.createMemoryService;\n", "/**\n * Memory Service Composition\n *\n * Owns constructor-time service graph wiring for MemoryService so the public\n * facade can stay focused on state assignment and method delegation.\n */\n\nimport * as os from 'os';\nimport * as path from 'path';\n\nimport type { EventStore } from '../event-store.js';\nimport type { Embedder } from '../embedder.js';\nimport type { GraduationPipeline } from '../graduation.js';\nimport { createToolObservationEmbedding as defaultCreateToolObservationEmbedding } from '../metadata-extractor.js';\nimport type { Retriever } from '../retriever.js';\nimport type { SQLiteEventStore } from '../sqlite-event-store.js';\nimport type { ToolObservationPayload, SharedStoreConfig, MemoryOperationsConfig } from '../types.js';\nimport type { VectorStore } from '../vector-store.js';\nimport {\n createEmbeddingMaintenanceService as defaultCreateEmbeddingMaintenanceService,\n type EmbeddingMaintenanceService,\n type EmbeddingMaintenanceServiceOptions\n} from './embedding-maintenance-service.js';\nimport {\n createEndlessMemoryServices as defaultCreateEndlessMemoryServices,\n type EndlessMemoryServices,\n type EndlessMemoryServicesOptions\n} from './endless-memory-services.js';\nimport {\n createMemoryEngineServices as defaultCreateMemoryEngineServices,\n type MemoryEngineServices,\n type MemoryEngineServicesOptions\n} from './memory-engine-services.js';\nimport {\n createMemoryRuntimeService as defaultCreateMemoryRuntimeService,\n type MemoryRuntimeService,\n type MemoryRuntimeServicesDeps\n} from './memory-runtime-service.js';\nimport type {\n MemoryIngestService\n} from './memory-ingest-service.js';\nimport type {\n MemoryQueryService\n} from './memory-query-service.js';\nimport {\n createSharedMemoryServices as defaultCreateSharedMemoryServices,\n type SharedMemoryServices,\n type SharedMemoryServicesOptions\n} from './shared-memory-services.js';\nimport type {\n RetrievalAnalyticsService,\n RetrievalDisclosureService,\n RetrievalOrchestrator\n} from './retrieval-services.js';\n\nexport interface MemoryServiceCompositionConfig {\n storagePath: string;\n embeddingModel?: string;\n readOnly?: boolean;\n lightweightMode?: boolean;\n embeddingOnly?: boolean;\n projectHash?: string;\n projectPath?: string;\n sharedStoreConfig?: SharedStoreConfig;\n operations?: MemoryOperationsConfig;\n}\n\nexport interface MemoryServiceCompositionFactories {\n expandPath?: (targetPath: string) => string;\n createToolObservationEmbedding?: (\n toolName: string,\n metadata: Record<string, unknown>,\n success: boolean\n ) => string;\n createMemoryEngineServices?: (options: MemoryEngineServicesOptions) => MemoryEngineServices;\n createEndlessMemoryServices?: (options: EndlessMemoryServicesOptions) => EndlessMemoryServices;\n createSharedMemoryServices?: (options: SharedMemoryServicesOptions) => SharedMemoryServices;\n createMemoryRuntimeService?: (deps: MemoryRuntimeServicesDeps) => MemoryRuntimeService;\n createEmbeddingMaintenanceService?: (\n options: EmbeddingMaintenanceServiceOptions\n ) => EmbeddingMaintenanceService;\n}\n\nexport interface MemoryServiceCompositionOptions {\n config: MemoryServiceCompositionConfig;\n defaultSharedStoragePath: string;\n defaultSharedStoreConfig?: SharedStoreConfig;\n initialize: () => Promise<void>;\n getProjectHash: () => string | null;\n getProjectPath?: () => string | null;\n factories?: MemoryServiceCompositionFactories;\n}\n\nexport interface MemoryServiceComposition {\n storagePath: string;\n readOnly: boolean;\n lightweightMode: boolean;\n embeddingOnly: boolean;\n sqliteStore: SQLiteEventStore;\n vectorStore: VectorStore;\n embedder: Embedder;\n retriever: Retriever;\n retrievalOrchestrator: RetrievalOrchestrator;\n retrievalDisclosureService: RetrievalDisclosureService;\n retrievalAnalyticsService: RetrievalAnalyticsService;\n embeddingMaintenanceService: EmbeddingMaintenanceService;\n runtimeService: MemoryRuntimeService;\n graduation: GraduationPipeline;\n endlessMemoryServices: EndlessMemoryServices;\n sharedMemoryServices: SharedMemoryServices;\n ingestService: MemoryIngestService;\n queryService: MemoryQueryService;\n}\n\nexport function createMemoryServiceComposition(\n options: MemoryServiceCompositionOptions\n): MemoryServiceComposition {\n const factories = options.factories ?? {};\n const expandPath = factories.expandPath ?? defaultExpandPath;\n const createToolEmbedding = factories.createToolObservationEmbedding ?? defaultCreateToolObservationEmbedding;\n\n const storagePath = expandPath(options.config.storagePath);\n const projectPathForMirror = options.getProjectPath?.() ?? options.config.projectPath ?? process.cwd();\n const readOnly = options.config.readOnly ?? false;\n const lightweightMode = options.config.lightweightMode ?? false;\n const embeddingOnly = options.config.embeddingOnly ?? false;\n const sharedStoreConfig = options.config.sharedStoreConfig ?? options.defaultSharedStoreConfig ?? {\n enabled: true,\n autoPromote: true,\n searchShared: true,\n minConfidenceForPromotion: 0.8,\n sharedStoragePath: options.defaultSharedStoragePath\n };\n\n let sharedMemoryServices: SharedMemoryServices | null = null;\n\n const engineServices = (factories.createMemoryEngineServices ?? defaultCreateMemoryEngineServices)({\n storagePath,\n readOnly,\n embeddingModel: options.config.embeddingModel,\n cwd: projectPathForMirror,\n initialize: options.initialize,\n getProjectHash: options.getProjectHash,\n getProjectPath: options.getProjectPath,\n hasSharedStore: () => sharedMemoryServices?.isEnabled() ?? false,\n memoryOperationsConfig: options.config.operations,\n sharedStore: {\n get: (entryId: string) => sharedMemoryServices?.getEntryForDisclosure(entryId) ?? Promise.resolve(null)\n },\n createToolObservationEmbedding: (payload: ToolObservationPayload) => createToolEmbedding(\n payload.toolName,\n payload.metadata || {},\n payload.success\n )\n });\n\n const endlessMemoryServices = (factories.createEndlessMemoryServices ?? defaultCreateEndlessMemoryServices)({\n eventStore: engineServices.sqliteStore as unknown as EventStore,\n configStore: engineServices.sqliteStore,\n initialize: options.initialize\n });\n\n sharedMemoryServices = (factories.createSharedMemoryServices ?? defaultCreateSharedMemoryServices)({\n config: sharedStoreConfig,\n defaultSharedStoragePath: options.defaultSharedStoragePath,\n readOnly,\n expandPath,\n embedder: engineServices.embedder,\n retriever: engineServices.retriever\n });\n\n const runtimeService = (factories.createMemoryRuntimeService ?? defaultCreateMemoryRuntimeService)({\n sqliteStore: engineServices.sqliteStore,\n eventStore: engineServices.sqliteStore as unknown as EventStore,\n vectorStore: engineServices.vectorStore,\n embedder: engineServices.embedder,\n retriever: engineServices.retriever,\n graduation: engineServices.graduation,\n endlessMemoryServices,\n sharedMemoryServices,\n readOnly,\n lightweightMode,\n embeddingOnly\n });\n\n const embeddingMaintenanceService = (\n factories.createEmbeddingMaintenanceService ?? defaultCreateEmbeddingMaintenanceService\n )({\n storagePath,\n initialize: options.initialize,\n getEmbeddingModelName: () => engineServices.embedder.getModelName(),\n vectorStore: engineServices.vectorStore,\n eventStore: {\n clearEmbeddingOutbox: () => engineServices.sqliteStore.clearEmbeddingOutbox(),\n getEventsPage: async (limit, offset) => {\n const events = await engineServices.sqliteStore.getEventsPage(limit, offset);\n return events.map((event) => ({ id: event.id, content: event.content }));\n },\n enqueueForEmbedding: async (eventId, content) => {\n await engineServices.sqliteStore.enqueueForEmbedding(eventId, content);\n }\n },\n getVectorWorker: () => runtimeService.getVectorWorker()\n });\n\n return {\n storagePath,\n readOnly,\n lightweightMode,\n embeddingOnly,\n sqliteStore: engineServices.sqliteStore,\n vectorStore: engineServices.vectorStore,\n embedder: engineServices.embedder,\n retriever: engineServices.retriever,\n retrievalOrchestrator: engineServices.retrievalOrchestrator,\n retrievalDisclosureService: engineServices.retrievalDisclosureService,\n retrievalAnalyticsService: engineServices.retrievalAnalyticsService,\n embeddingMaintenanceService,\n runtimeService,\n graduation: engineServices.graduation,\n endlessMemoryServices,\n sharedMemoryServices,\n ingestService: engineServices.ingestService,\n queryService: engineServices.queryService\n };\n}\n\nfunction defaultExpandPath(targetPath: string): string {\n if (targetPath.startsWith('~')) {\n return path.join(os.homedir(), targetPath.slice(1));\n }\n return targetPath;\n}\n", "/**\n * Metadata Extractor\n * Extracts tool-specific metadata from tool inputs and outputs\n */\n\nimport type { ToolMetadata } from './types.js';\n\n/**\n * Get file type from path\n */\nfunction getFileType(filePath: string): string | undefined {\n const ext = filePath.split('.').pop()?.toLowerCase();\n if (!ext) return undefined;\n\n const typeMap: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n py: 'python',\n rb: 'ruby',\n go: 'go',\n rs: 'rust',\n java: 'java',\n kt: 'kotlin',\n swift: 'swift',\n c: 'c',\n cpp: 'cpp',\n h: 'header',\n hpp: 'header',\n cs: 'csharp',\n php: 'php',\n html: 'html',\n css: 'css',\n scss: 'scss',\n json: 'json',\n yaml: 'yaml',\n yml: 'yaml',\n xml: 'xml',\n md: 'markdown',\n sql: 'sql',\n sh: 'shell',\n bash: 'shell',\n zsh: 'shell'\n };\n\n return typeMap[ext];\n}\n\n/**\n * Count lines in content\n */\nfunction countLines(content: string): number {\n return content.split('\\n').length;\n}\n\n/**\n * Extract bash command (without arguments that might contain secrets)\n */\nfunction extractCommand(fullCommand: string): string {\n // Get first word (command name)\n const parts = fullCommand.trim().split(/\\s+/);\n const command = parts[0];\n\n // For common commands, include safe arguments\n const safeCommands = ['git', 'npm', 'yarn', 'pnpm', 'node', 'python', 'go', 'cargo', 'make'];\n if (safeCommands.includes(command) && parts.length > 1) {\n // Include subcommand for these\n return `${command} ${parts[1]}`;\n }\n\n return command;\n}\n\n/**\n * Extract metadata from tool usage\n */\nexport function extractMetadata(\n toolName: string,\n input: Record<string, unknown>,\n output: string,\n success: boolean\n): ToolMetadata {\n switch (toolName) {\n case 'Read': {\n const filePath = input.file_path as string | undefined;\n return {\n filePath,\n fileType: filePath ? getFileType(filePath) : undefined,\n lineCount: success ? countLines(output) : undefined\n };\n }\n\n case 'Write': {\n const filePath = input.file_path as string | undefined;\n const content = input.content as string | undefined;\n return {\n filePath,\n fileType: filePath ? getFileType(filePath) : undefined,\n lineCount: content ? countLines(content) : undefined\n };\n }\n\n case 'Edit': {\n const filePath = input.file_path as string | undefined;\n return {\n filePath,\n fileType: filePath ? getFileType(filePath) : undefined\n };\n }\n\n case 'Bash': {\n const fullCommand = input.command as string | undefined;\n return {\n command: fullCommand ? extractCommand(fullCommand) : undefined\n };\n }\n\n case 'Grep': {\n const pattern = input.pattern as string | undefined;\n // Count matches from output\n const matchCount = success\n ? (output.match(/\\n/g) || []).length + (output.trim() ? 1 : 0)\n : undefined;\n return {\n pattern,\n matchCount\n };\n }\n\n case 'Glob': {\n const pattern = input.pattern as string | undefined;\n const matchCount = success\n ? (output.match(/\\n/g) || []).length + (output.trim() ? 1 : 0)\n : undefined;\n return {\n pattern,\n matchCount\n };\n }\n\n case 'WebFetch': {\n const url = input.url as string | undefined;\n // Try to extract status code from output\n const statusMatch = output.match(/status:\\s*(\\d{3})/i);\n return {\n url,\n statusCode: statusMatch ? parseInt(statusMatch[1], 10) : undefined\n };\n }\n\n case 'WebSearch': {\n return {};\n }\n\n case 'NotebookEdit': {\n const notebookPath = input.notebook_path as string | undefined;\n return {\n filePath: notebookPath,\n fileType: 'jupyter'\n };\n }\n\n default:\n return {};\n }\n}\n\n/**\n * Create embedding content for tool observation\n */\nexport function createToolObservationEmbedding(\n toolName: string,\n metadata: ToolMetadata,\n success: boolean\n): string {\n const parts: string[] = [];\n\n parts.push(`Tool: ${toolName}`);\n\n if (metadata.filePath) {\n parts.push(`File: ${metadata.filePath}`);\n }\n if (metadata.command) {\n parts.push(`Command: ${metadata.command}`);\n }\n if (metadata.pattern) {\n parts.push(`Pattern: ${metadata.pattern}`);\n }\n if (metadata.url) {\n // Only include domain for privacy\n try {\n const url = new URL(metadata.url);\n parts.push(`URL: ${url.hostname}`);\n } catch {\n // Invalid URL, skip\n }\n }\n\n parts.push(`Result: ${success ? 'Success' : 'Failed'}`);\n\n return parts.join('\\n');\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface EmbeddingMaintenanceEvent {\n id: string;\n content: string;\n}\n\nexport interface EmbeddingMaintenanceEventStore {\n clearEmbeddingOutbox(): Promise<void>;\n getEventsPage(limit: number, offset: number): Promise<EmbeddingMaintenanceEvent[]>;\n enqueueForEmbedding(eventId: string, content: string): Promise<void>;\n}\n\nexport interface EmbeddingMaintenanceVectorStore {\n count(): Promise<number>;\n clearAll(): Promise<void>;\n}\n\nexport interface EmbeddingMaintenanceVectorWorker {\n isRunning(): boolean;\n stop(): void;\n start(): void;\n}\n\nexport interface EmbeddingMaintenanceFileSystem {\n existsSync(targetPath: string): boolean;\n readFileSync(targetPath: string, encoding: BufferEncoding): string;\n writeFileSync(targetPath: string, content: string): void;\n}\n\nexport interface EmbeddingModelMaintenanceOptions {\n autoMigrate?: boolean;\n}\n\nexport interface EmbeddingModelMaintenanceResult {\n changed: boolean;\n previousModel: string | null;\n currentModel: string;\n enqueued: number;\n reason?: string;\n}\n\nexport interface EmbeddingMaintenanceServiceOptions {\n storagePath: string;\n initialize: () => Promise<void>;\n getEmbeddingModelName: () => string;\n vectorStore: EmbeddingMaintenanceVectorStore;\n eventStore: EmbeddingMaintenanceEventStore;\n getVectorWorker: () => EmbeddingMaintenanceVectorWorker | null;\n fileSystem?: EmbeddingMaintenanceFileSystem;\n}\n\nexport interface EmbeddingMaintenanceService {\n getEmbeddingModelName(): string;\n ensureEmbeddingModelForImport(options?: EmbeddingModelMaintenanceOptions): Promise<EmbeddingModelMaintenanceResult>;\n}\n\nconst DEFAULT_PAGE_SIZE = 1000;\n\nconst defaultFileSystem: EmbeddingMaintenanceFileSystem = {\n existsSync: fs.existsSync,\n readFileSync: (targetPath, encoding) => fs.readFileSync(targetPath, encoding),\n writeFileSync: (targetPath, content) => fs.writeFileSync(targetPath, content)\n};\n\nclass DefaultEmbeddingMaintenanceService implements EmbeddingMaintenanceService {\n private readonly fileSystem: EmbeddingMaintenanceFileSystem;\n\n constructor(private readonly options: EmbeddingMaintenanceServiceOptions) {\n this.fileSystem = options.fileSystem ?? defaultFileSystem;\n }\n\n getEmbeddingModelName(): string {\n return this.options.getEmbeddingModelName();\n }\n\n async ensureEmbeddingModelForImport(\n options?: EmbeddingModelMaintenanceOptions\n ): Promise<EmbeddingModelMaintenanceResult> {\n await this.options.initialize();\n\n const currentModel = this.getEmbeddingModelName();\n const metaPath = path.join(this.options.storagePath, 'embedding-meta.json');\n const previousModel = this.readPreviousModel(metaPath);\n const vectorCount = await this.options.vectorStore.count();\n const hasExistingVectors = vectorCount > 0;\n\n // First-time metadata write (no migration needed unless legacy vectors exist)\n if (!previousModel && !hasExistingVectors) {\n this.fileSystem.writeFileSync(\n metaPath,\n JSON.stringify({ model: currentModel, updatedAt: new Date().toISOString() }, null, 2)\n );\n return { changed: false, previousModel: null, currentModel, enqueued: 0, reason: 'initialized-meta' };\n }\n\n const modelChanged = previousModel !== currentModel;\n const legacyUnknownButVectorsExist = !previousModel && hasExistingVectors;\n\n if (!modelChanged && !legacyUnknownButVectorsExist) {\n return { changed: false, previousModel, currentModel, enqueued: 0 };\n }\n\n if (options?.autoMigrate === false) {\n return {\n changed: true,\n previousModel,\n currentModel,\n enqueued: 0,\n reason: legacyUnknownButVectorsExist ? 'legacy-vectors-without-meta' : 'model-mismatch'\n };\n }\n\n const worker = this.options.getVectorWorker();\n const wasRunning = worker?.isRunning() || false;\n if (wasRunning) worker?.stop();\n\n await this.options.vectorStore.clearAll();\n await this.options.eventStore.clearEmbeddingOutbox();\n\n const enqueued = await this.reenqueueAllEvents();\n\n this.fileSystem.writeFileSync(\n metaPath,\n JSON.stringify(\n {\n model: currentModel,\n previousModel,\n migratedAt: new Date().toISOString(),\n enqueued\n },\n null,\n 2\n )\n );\n\n if (wasRunning) worker?.start();\n\n return {\n changed: true,\n previousModel,\n currentModel,\n enqueued,\n reason: legacyUnknownButVectorsExist ? 'legacy-vectors-without-meta' : 'model-mismatch'\n };\n }\n\n private readPreviousModel(metaPath: string): string | null {\n try {\n if (this.fileSystem.existsSync(metaPath)) {\n const parsed = JSON.parse(this.fileSystem.readFileSync(metaPath, 'utf-8')) as { model?: string };\n return parsed?.model || null;\n }\n } catch {\n return null;\n }\n\n return null;\n }\n\n private async reenqueueAllEvents(): Promise<number> {\n let offset = 0;\n let enqueued = 0;\n\n while (true) {\n const page = await this.options.eventStore.getEventsPage(DEFAULT_PAGE_SIZE, offset);\n if (page.length === 0) break;\n\n for (const event of page) {\n await this.options.eventStore.enqueueForEmbedding(event.id, event.content);\n enqueued += 1;\n }\n\n offset += page.length;\n if (page.length < DEFAULT_PAGE_SIZE) break;\n }\n\n return enqueued;\n }\n}\n\nexport function createEmbeddingMaintenanceService(\n options: EmbeddingMaintenanceServiceOptions\n): EmbeddingMaintenanceService {\n return new DefaultEmbeddingMaintenanceService(options);\n}\n", "import { randomUUID } from 'crypto';\n\nimport type { EventStore } from '../../core/event-store.js';\nimport {\n createWorkingSetStore,\n type WorkingSetStore\n} from '../../core/working-set-store.js';\nimport {\n createConsolidatedStore,\n type ConsolidatedStore\n} from '../../core/consolidated-store.js';\nimport {\n createConsolidationWorker,\n type ConsolidationWorker\n} from '../../core/consolidation-worker.js';\nimport {\n createContinuityManager,\n type ContinuityManager\n} from '../../core/continuity-manager.js';\nimport type {\n ConsolidatedMemory,\n ContinuityScore,\n EndlessModeConfig,\n EndlessModeStatus,\n MemoryMode,\n WorkingSet\n} from '../../core/types.js';\n\nexport interface EndlessConfigStore {\n getEndlessConfig(key: string): Promise<unknown>;\n setEndlessConfig(key: string, value: unknown): Promise<void>;\n}\n\nexport interface WorkingSetStorePort {\n add(eventId: string, relevanceScore?: number): Promise<void>;\n get(): Promise<WorkingSet>;\n count(): Promise<number>;\n}\n\nexport interface ConsolidatedStorePort {\n search(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]>;\n getAll(options?: { limit?: number }): Promise<ConsolidatedMemory[]>;\n markAccessed(memoryId: string): Promise<void>;\n count(): Promise<number>;\n getLastConsolidationTime(): Promise<Date | null>;\n}\n\nexport interface ConsolidationWorkerPort {\n start(): void;\n stop(): void;\n recordActivity(): void;\n forceRun(): Promise<number>;\n}\n\nexport interface ContinuityManagerPort {\n createSnapshot(\n id: string,\n content: string,\n metadata?: { files?: string[]; entities?: string[] }\n ): unknown;\n calculateScore(snapshot: unknown): Promise<ContinuityScore>;\n}\n\nexport interface EndlessMemoryServicesFactories {\n createWorkingSetStore: (eventStore: EventStore, config: EndlessModeConfig) => WorkingSetStorePort;\n createConsolidatedStore: (eventStore: EventStore) => ConsolidatedStorePort;\n createConsolidationWorker: (\n workingSetStore: WorkingSetStorePort,\n consolidatedStore: ConsolidatedStorePort,\n config: EndlessModeConfig\n ) => ConsolidationWorkerPort;\n createContinuityManager: (eventStore: EventStore, config: EndlessModeConfig) => ContinuityManagerPort;\n randomUUID?: () => string;\n}\n\nexport interface EndlessMemoryServicesOptions {\n eventStore: EventStore;\n configStore: EndlessConfigStore;\n initialize: () => Promise<void>;\n factories?: EndlessMemoryServicesFactories;\n}\n\nexport interface EndlessMemoryServices {\n initializeFromSavedMode(): Promise<void>;\n initializeEndlessMode(): Promise<void>;\n getEndlessConfig(): Promise<EndlessModeConfig>;\n setEndlessConfig(config: Partial<EndlessModeConfig>): Promise<void>;\n setMode(mode: MemoryMode): Promise<void>;\n getMode(): MemoryMode;\n isEndlessModeActive(): boolean;\n addToWorkingSet(eventId: string, relevanceScore?: number): Promise<void>;\n getWorkingSet(): Promise<WorkingSet | null>;\n searchConsolidated(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]>;\n getConsolidatedMemories(limit?: number): Promise<ConsolidatedMemory[]>;\n markMemoryAccessed(memoryId: string): Promise<void>;\n calculateContinuity(\n content: string,\n metadata?: { files?: string[]; entities?: string[] }\n ): Promise<ContinuityScore | null>;\n recordActivity(): void;\n forceConsolidation(): Promise<number>;\n getEndlessModeStatus(): Promise<EndlessModeStatus>;\n formatEndlessContext(query: string): Promise<string>;\n shutdown(): void;\n}\n\nfunction getDefaultEndlessConfig(): EndlessModeConfig {\n return {\n enabled: true,\n workingSet: {\n maxEvents: 100,\n timeWindowHours: 24,\n minRelevanceScore: 0.5\n },\n consolidation: {\n triggerIntervalMs: 3600000,\n triggerEventCount: 100,\n triggerIdleMs: 1800000,\n useLLMSummarization: false\n },\n continuity: {\n minScoreForSeamless: 0.7,\n topicDecayHours: 48\n }\n };\n}\n\nconst defaultFactories: Required<EndlessMemoryServicesFactories> = {\n createWorkingSetStore: (eventStore, config) => createWorkingSetStore(eventStore, config) as WorkingSetStore,\n createConsolidatedStore: (eventStore) => createConsolidatedStore(eventStore) as ConsolidatedStore,\n createConsolidationWorker: (workingSetStore, consolidatedStore, config) => createConsolidationWorker(\n workingSetStore as WorkingSetStore,\n consolidatedStore as ConsolidatedStore,\n config\n ) as ConsolidationWorker,\n createContinuityManager: (eventStore, config) => createContinuityManager(eventStore, config) as ContinuityManager,\n randomUUID\n};\n\nclass DefaultEndlessMemoryServices implements EndlessMemoryServices {\n private readonly factories: Required<EndlessMemoryServicesFactories>;\n private workingSetStore: WorkingSetStorePort | null = null;\n private consolidatedStore: ConsolidatedStorePort | null = null;\n private consolidationWorker: ConsolidationWorkerPort | null = null;\n private continuityManager: ContinuityManagerPort | null = null;\n private mode: MemoryMode = 'session';\n\n constructor(private readonly options: EndlessMemoryServicesOptions) {\n this.factories = options.factories\n ? { ...options.factories, randomUUID: options.factories.randomUUID ?? randomUUID }\n : defaultFactories;\n }\n\n async initializeFromSavedMode(): Promise<void> {\n const savedMode = await this.options.configStore.getEndlessConfig('mode') as MemoryMode | null;\n if (savedMode === 'endless') {\n this.mode = 'endless';\n await this.initializeEndlessMode();\n }\n }\n\n async initializeEndlessMode(): Promise<void> {\n if (this.consolidationWorker) return;\n\n const config = await this.getEndlessConfig();\n const workingSetStore = this.factories.createWorkingSetStore(this.options.eventStore, config);\n const consolidatedStore = this.factories.createConsolidatedStore(this.options.eventStore);\n const consolidationWorker = this.factories.createConsolidationWorker(\n workingSetStore,\n consolidatedStore,\n config\n );\n const continuityManager = this.factories.createContinuityManager(this.options.eventStore, config);\n\n try {\n consolidationWorker.start();\n } catch (error) {\n consolidationWorker.stop();\n throw error;\n }\n\n this.workingSetStore = workingSetStore;\n this.consolidatedStore = consolidatedStore;\n this.consolidationWorker = consolidationWorker;\n this.continuityManager = continuityManager;\n }\n\n async getEndlessConfig(): Promise<EndlessModeConfig> {\n const savedConfig = await this.options.configStore.getEndlessConfig('config') as EndlessModeConfig | null;\n return savedConfig || getDefaultEndlessConfig();\n }\n\n async setEndlessConfig(config: Partial<EndlessModeConfig>): Promise<void> {\n const current = await this.getEndlessConfig();\n const merged = { ...current, ...config };\n await this.options.configStore.setEndlessConfig('config', merged);\n }\n\n async setMode(mode: MemoryMode): Promise<void> {\n await this.options.initialize();\n if (mode === this.mode) return;\n\n this.mode = mode;\n await this.options.configStore.setEndlessConfig('mode', mode);\n\n if (mode === 'endless') {\n await this.initializeEndlessMode();\n } else {\n this.stopEndlessMode();\n }\n }\n\n getMode(): MemoryMode {\n return this.mode;\n }\n\n isEndlessModeActive(): boolean {\n return this.mode === 'endless';\n }\n\n async addToWorkingSet(eventId: string, relevanceScore?: number): Promise<void> {\n if (!this.workingSetStore) return;\n await this.workingSetStore.add(eventId, relevanceScore);\n }\n\n async getWorkingSet(): Promise<WorkingSet | null> {\n if (!this.workingSetStore) return null;\n return this.workingSetStore.get();\n }\n\n async searchConsolidated(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]> {\n if (!this.consolidatedStore) return [];\n return this.consolidatedStore.search(query, options);\n }\n\n async getConsolidatedMemories(limit?: number): Promise<ConsolidatedMemory[]> {\n if (!this.consolidatedStore) return [];\n return this.consolidatedStore.getAll({ limit });\n }\n\n async markMemoryAccessed(memoryId: string): Promise<void> {\n if (!this.consolidatedStore) return;\n await this.consolidatedStore.markAccessed(memoryId);\n }\n\n async calculateContinuity(\n content: string,\n metadata?: { files?: string[]; entities?: string[] }\n ): Promise<ContinuityScore | null> {\n if (!this.continuityManager) return null;\n const snapshot = this.continuityManager.createSnapshot(\n this.factories.randomUUID(),\n content,\n metadata\n );\n return this.continuityManager.calculateScore(snapshot);\n }\n\n recordActivity(): void {\n this.consolidationWorker?.recordActivity();\n }\n\n async forceConsolidation(): Promise<number> {\n if (!this.consolidationWorker) return 0;\n return this.consolidationWorker.forceRun();\n }\n\n async getEndlessModeStatus(): Promise<EndlessModeStatus> {\n await this.options.initialize();\n\n let workingSetSize = 0;\n let continuityScore = 0.5;\n let consolidatedCount = 0;\n let lastConsolidation: Date | null = null;\n\n if (this.workingSetStore) {\n workingSetSize = await this.workingSetStore.count();\n const workingSet = await this.workingSetStore.get();\n continuityScore = workingSet.continuityScore;\n }\n\n if (this.consolidatedStore) {\n consolidatedCount = await this.consolidatedStore.count();\n lastConsolidation = await this.consolidatedStore.getLastConsolidationTime();\n }\n\n return {\n mode: this.mode,\n workingSetSize,\n continuityScore,\n consolidatedCount,\n lastConsolidation\n };\n }\n\n async formatEndlessContext(query: string): Promise<string> {\n if (!this.isEndlessModeActive()) {\n return '';\n }\n\n const workingSet = await this.getWorkingSet();\n const consolidated = await this.searchConsolidated(query, { topK: 3 });\n const continuity = await this.calculateContinuity(query);\n\n const parts: string[] = [];\n\n if (continuity) {\n const statusEmoji = continuity.transitionType === 'seamless' ? '\uD83D\uDD17' :\n continuity.transitionType === 'topic_shift' ? '\u21AA\uFE0F' : '\uD83C\uDD95';\n parts.push(`${statusEmoji} Context: ${continuity.transitionType} (score: ${continuity.score.toFixed(2)})`);\n }\n\n if (workingSet && workingSet.recentEvents.length > 0) {\n parts.push('\\n## Recent Context (Working Set)');\n const recent = workingSet.recentEvents.slice(0, 5);\n for (const event of recent) {\n const preview = event.content.slice(0, 80) + (event.content.length > 80 ? '...' : '');\n const time = event.timestamp.toLocaleTimeString();\n parts.push(`- ${time} [${event.eventType}] ${preview}`);\n }\n }\n\n if (consolidated.length > 0) {\n parts.push('\\n## Related Knowledge (Consolidated)');\n for (const memory of consolidated) {\n parts.push(`- ${memory.topics.slice(0, 3).join(', ')}: ${memory.summary.slice(0, 100)}...`);\n }\n }\n\n return parts.join('\\n');\n }\n\n shutdown(): void {\n this.stopEndlessMode();\n }\n\n private stopEndlessMode(): void {\n if (this.consolidationWorker) {\n this.consolidationWorker.stop();\n }\n this.workingSetStore = null;\n this.consolidatedStore = null;\n this.consolidationWorker = null;\n this.continuityManager = null;\n }\n}\n\nexport function createEndlessMemoryServices(options: EndlessMemoryServicesOptions): EndlessMemoryServices {\n return new DefaultEndlessMemoryServices(options);\n}\n", "/**\n * Working Set Store\n * Manages the active memory window for Endless Mode\n * Biomimetic: Simulates human working memory (7\u00B12 items, 15-30s duration)\n */\n\nimport { randomUUID } from 'crypto';\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport type {\n MemoryEvent,\n EndlessModeConfig,\n WorkingSet,\n WorkingSetItem\n} from './types.js';\nimport { EventStore } from './event-store.js';\n\nexport class WorkingSetStore {\n constructor(\n private eventStore: EventStore,\n private config: EndlessModeConfig\n ) {}\n\n private get db(): Database {\n return this.eventStore.getDatabase();\n }\n\n /**\n * Add an event to the working set\n */\n async add(eventId: string, relevanceScore: number = 1.0, topics?: string[]): Promise<void> {\n const expiresAt = new Date(\n Date.now() + this.config.workingSet.timeWindowHours * 60 * 60 * 1000\n );\n\n await dbRun(\n this.db,\n `INSERT OR REPLACE INTO working_set (id, event_id, added_at, relevance_score, topics, expires_at)\n VALUES (?, ?, CURRENT_TIMESTAMP, ?, ?, ?)`,\n [\n randomUUID(),\n eventId,\n relevanceScore,\n JSON.stringify(topics || []),\n expiresAt.toISOString()\n ]\n );\n\n // Enforce size limit\n await this.enforceLimit();\n }\n\n /**\n * Get the current working set\n */\n async get(): Promise<WorkingSet> {\n // Clean up expired items first\n await this.cleanup();\n\n // Get working set items with their events\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT ws.*, e.*\n FROM working_set ws\n JOIN events e ON ws.event_id = e.id\n ORDER BY ws.relevance_score DESC, ws.added_at DESC\n LIMIT ?`,\n [this.config.workingSet.maxEvents]\n );\n\n const events: MemoryEvent[] = rows.map(row => ({\n id: row.id as string,\n eventType: row.event_type as 'user_prompt' | 'agent_response' | 'session_summary' | 'tool_observation',\n sessionId: row.session_id as string,\n timestamp: toDate(row.timestamp),\n content: row.content as string,\n canonicalKey: row.canonical_key as string,\n dedupeKey: row.dedupe_key as string,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined\n }));\n\n return {\n recentEvents: events,\n lastActivity: events.length > 0 ? events[0].timestamp : new Date(),\n continuityScore: await this.calculateContinuityScore()\n };\n }\n\n /**\n * Get working set items (metadata only)\n */\n async getItems(): Promise<WorkingSetItem[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM working_set ORDER BY relevance_score DESC, added_at DESC`\n );\n\n return rows.map(row => ({\n id: row.id as string,\n eventId: row.event_id as string,\n addedAt: toDate(row.added_at),\n relevanceScore: row.relevance_score as number,\n topics: row.topics ? JSON.parse(row.topics as string) : undefined,\n expiresAt: toDate(row.expires_at)\n }));\n }\n\n /**\n * Update relevance score for an event\n */\n async updateRelevance(eventId: string, score: number): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE working_set SET relevance_score = ? WHERE event_id = ?`,\n [score, eventId]\n );\n }\n\n /**\n * Prune specific events from working set (after consolidation)\n */\n async prune(eventIds: string[]): Promise<void> {\n if (eventIds.length === 0) return;\n\n const placeholders = eventIds.map(() => '?').join(',');\n await dbRun(\n this.db,\n `DELETE FROM working_set WHERE event_id IN (${placeholders})`,\n eventIds\n );\n }\n\n /**\n * Get the count of items in working set\n */\n async count(): Promise<number> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM working_set`\n );\n return result[0]?.count || 0;\n }\n\n /**\n * Clear the entire working set\n */\n async clear(): Promise<void> {\n await dbRun(this.db, `DELETE FROM working_set`);\n }\n\n /**\n * Check if an event is in the working set\n */\n async contains(eventId: string): Promise<boolean> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM working_set WHERE event_id = ?`,\n [eventId]\n );\n return (result[0]?.count || 0) > 0;\n }\n\n /**\n * Refresh expiration for an event (rehears al - keep relevant items longer)\n */\n async refresh(eventId: string): Promise<void> {\n const newExpiresAt = new Date(\n Date.now() + this.config.workingSet.timeWindowHours * 60 * 60 * 1000\n );\n\n await dbRun(\n this.db,\n `UPDATE working_set SET expires_at = ? WHERE event_id = ?`,\n [newExpiresAt.toISOString(), eventId]\n );\n }\n\n /**\n * Clean up expired items\n */\n private async cleanup(): Promise<void> {\n await dbRun(\n this.db,\n `DELETE FROM working_set WHERE expires_at < datetime('now')`\n );\n }\n\n /**\n * Enforce the maximum size limit\n * Removes lowest relevance items when over limit\n */\n private async enforceLimit(): Promise<void> {\n const maxEvents = this.config.workingSet.maxEvents;\n\n // Get IDs to keep (highest relevance, most recent)\n const keepIds = await dbAll<{ id: string }>(\n this.db,\n `SELECT id FROM working_set\n ORDER BY relevance_score DESC, added_at DESC\n LIMIT ?`,\n [maxEvents]\n );\n\n if (keepIds.length === 0) return;\n\n const keepIdList = keepIds.map(r => r.id);\n const placeholders = keepIdList.map(() => '?').join(',');\n\n // Delete everything not in the keep list\n await dbRun(\n this.db,\n `DELETE FROM working_set WHERE id NOT IN (${placeholders})`,\n keepIdList\n );\n }\n\n /**\n * Calculate continuity score based on recent context transitions\n */\n private async calculateContinuityScore(): Promise<number> {\n const result = await dbAll<{ avg_score: number | null }>(\n this.db,\n `SELECT AVG(continuity_score) as avg_score\n FROM continuity_log\n WHERE created_at > datetime('now', '-1 hour')`\n );\n\n return result[0]?.avg_score ?? 0.5;\n }\n\n /**\n * Get topics from current working set for context matching\n */\n async getActiveTopics(): Promise<string[]> {\n const rows = await dbAll<{ topics: string }>(\n this.db,\n `SELECT topics FROM working_set WHERE topics IS NOT NULL`\n );\n\n const allTopics = new Set<string>();\n for (const row of rows) {\n const topics = JSON.parse(row.topics) as string[];\n topics.forEach(t => allTopics.add(t));\n }\n\n return Array.from(allTopics);\n }\n}\n\n/**\n * Create a Working Set Store instance\n */\nexport function createWorkingSetStore(\n eventStore: EventStore,\n config: EndlessModeConfig\n): WorkingSetStore {\n return new WorkingSetStore(eventStore, config);\n}\n", "/**\n * SQLite Database Wrapper\n * Provides Promise-based interface over better-sqlite3 synchronous API\n */\n\nimport BetterSqlite3 from 'better-sqlite3';\n\nexport type Database = BetterSqlite3.Database;\n\n/**\n * Safely converts a value to a Date object\n */\nexport function toDate(value: unknown): Date {\n if (value instanceof Date) return value;\n if (typeof value === 'string') return new Date(value);\n if (typeof value === 'number') return new Date(value);\n return new Date(String(value));\n}\n\nexport interface DatabaseOptions {\n readOnly?: boolean;\n}\n\n/**\n * Creates a new SQLite database connection\n */\nexport function createDatabase(dbPath: string, options?: DatabaseOptions): Database {\n return new BetterSqlite3(dbPath, { readonly: options?.readOnly });\n}\n\n/**\n * Executes a statement that doesn't return rows\n */\nexport function dbRun(db: Database, sql: string, params: unknown[] = []): Promise<void> {\n db.prepare(sql).run(...(params as never[]));\n return Promise.resolve();\n}\n\n/**\n * Executes a query and returns all rows\n */\nexport function dbAll<T = Record<string, unknown>>(\n db: Database,\n sql: string,\n params: unknown[] = []\n): Promise<T[]> {\n return Promise.resolve(db.prepare(sql).all(...(params as never[])) as T[]);\n}\n\n/**\n * Closes the database connection\n */\nexport function dbClose(db: Database): Promise<void> {\n db.close();\n return Promise.resolve();\n}\n\n/**\n * Executes multiple statements\n */\nexport function dbExec(db: Database, sql: string): Promise<void> {\n db.exec(sql);\n return Promise.resolve();\n}\n", "/**\n * Consolidated Store\n * Manages long-term integrated memories for Endless Mode\n * Biomimetic: Simulates memory consolidation that occurs during sleep\n */\n\nimport { randomUUID } from 'crypto';\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport type {\n ConsolidatedMemory,\n ConsolidatedMemoryInput,\n ConsolidationRule,\n ConsolidationRuleInput\n} from './types.js';\nimport { EventStore } from './event-store.js';\n\nexport class ConsolidatedStore {\n constructor(private eventStore: EventStore) {}\n\n private get db(): Database {\n return this.eventStore.getDatabase();\n }\n\n /**\n * Create a new consolidated memory\n */\n async create(input: ConsolidatedMemoryInput): Promise<string> {\n const memoryId = randomUUID();\n\n await dbRun(\n this.db,\n `INSERT INTO consolidated_memories\n (memory_id, summary, topics, source_events, confidence, created_at)\n VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)`,\n [\n memoryId,\n input.summary,\n JSON.stringify(input.topics),\n JSON.stringify(input.sourceEvents),\n input.confidence\n ]\n );\n\n return memoryId;\n }\n\n /**\n * Get a consolidated memory by ID\n */\n async get(memoryId: string): Promise<ConsolidatedMemory | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories WHERE memory_id = ?`,\n [memoryId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToMemory(rows[0]);\n }\n\n /**\n * Search consolidated memories by query (simple text search)\n */\n async search(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]> {\n const topK = options?.topK || 5;\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n WHERE summary LIKE ?\n ORDER BY confidence DESC\n LIMIT ?`,\n [`%${query}%`, topK]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Search by topics\n */\n async searchByTopics(topics: string[], options?: { topK?: number }): Promise<ConsolidatedMemory[]> {\n const topK = options?.topK || 5;\n\n // Build topic filter\n const topicConditions = topics.map(() => `topics LIKE ?`).join(' OR ');\n const topicParams = topics.map(t => `%\"${t}\"%`);\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n WHERE ${topicConditions}\n ORDER BY confidence DESC\n LIMIT ?`,\n [...topicParams, topK]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Get all consolidated memories ordered by confidence\n */\n async getAll(options?: { limit?: number }): Promise<ConsolidatedMemory[]> {\n const limit = options?.limit || 100;\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n ORDER BY confidence DESC, created_at DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Get recently created memories\n */\n async getRecent(options?: { limit?: number; hours?: number }): Promise<ConsolidatedMemory[]> {\n const limit = options?.limit || 10;\n const hours = options?.hours || 24;\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n WHERE created_at > datetime('now', '-${hours} hours')\n ORDER BY created_at DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Mark a memory as accessed (tracks usage for importance scoring)\n */\n async markAccessed(memoryId: string): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE consolidated_memories\n SET accessed_at = CURRENT_TIMESTAMP,\n access_count = access_count + 1\n WHERE memory_id = ?`,\n [memoryId]\n );\n }\n\n /**\n * Update confidence score for a memory\n */\n async updateConfidence(memoryId: string, confidence: number): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE consolidated_memories\n SET confidence = ?\n WHERE memory_id = ?`,\n [confidence, memoryId]\n );\n }\n\n /**\n * Delete a consolidated memory\n */\n async delete(memoryId: string): Promise<void> {\n await dbRun(\n this.db,\n `DELETE FROM consolidated_memories WHERE memory_id = ?`,\n [memoryId]\n );\n }\n\n /**\n * Create a long-term rule promoted from stable summaries\n */\n async createRule(input: ConsolidationRuleInput): Promise<string> {\n const ruleId = randomUUID();\n\n await dbRun(\n this.db,\n `INSERT INTO consolidated_rules\n (rule_id, rule, topics, source_memory_ids, source_events, confidence, created_at)\n VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)`,\n [\n ruleId,\n input.rule,\n JSON.stringify(input.topics),\n JSON.stringify(input.sourceMemoryIds),\n JSON.stringify(input.sourceEvents),\n input.confidence\n ]\n );\n\n return ruleId;\n }\n\n async getRules(options?: { limit?: number }): Promise<ConsolidationRule[]> {\n const limit = options?.limit || 100;\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_rules ORDER BY confidence DESC, created_at DESC LIMIT ?`,\n [limit]\n );\n\n return rows.map((row) => ({\n ruleId: row.rule_id as string,\n rule: row.rule as string,\n topics: JSON.parse((row.topics as string) || '[]'),\n sourceMemoryIds: JSON.parse((row.source_memory_ids as string) || '[]'),\n sourceEvents: JSON.parse((row.source_events as string) || '[]'),\n confidence: Number(row.confidence ?? 0.5),\n createdAt: toDate(row.created_at) || new Date()\n }));\n }\n\n async countRules(): Promise<number> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_rules`\n );\n return result[0]?.count || 0;\n }\n\n async hasRuleForSourceMemory(memoryId: string): Promise<boolean> {\n const rows = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_rules WHERE source_memory_ids LIKE ?`,\n [`%\"${memoryId}\"%`]\n );\n return (rows[0]?.count || 0) > 0;\n }\n\n /**\n * Get count of consolidated memories\n */\n async count(): Promise<number> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_memories`\n );\n return result[0]?.count || 0;\n }\n\n /**\n * Get most accessed memories (for importance scoring)\n */\n async getMostAccessed(limit: number = 10): Promise<ConsolidatedMemory[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n WHERE access_count > 0\n ORDER BY access_count DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Get statistics about consolidated memories\n */\n async getStats(): Promise<{\n total: number;\n averageConfidence: number;\n topicCounts: Record<string, number>;\n recentCount: number;\n }> {\n const total = await this.count();\n\n const avgResult = await dbAll<{ avg: number | null }>(\n this.db,\n `SELECT AVG(confidence) as avg FROM consolidated_memories`\n );\n const averageConfidence = avgResult[0]?.avg || 0;\n\n const recentResult = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_memories\n WHERE created_at > datetime('now', '-24 hours')`\n );\n const recentCount = recentResult[0]?.count || 0;\n\n // Get topic counts\n const allMemories = await this.getAll({ limit: 1000 });\n const topicCounts: Record<string, number> = {};\n for (const memory of allMemories) {\n for (const topic of memory.topics) {\n topicCounts[topic] = (topicCounts[topic] || 0) + 1;\n }\n }\n\n return {\n total,\n averageConfidence,\n topicCounts,\n recentCount\n };\n }\n\n /**\n * Check if source events are already consolidated\n */\n async isAlreadyConsolidated(eventIds: string[]): Promise<boolean> {\n for (const eventId of eventIds) {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_memories\n WHERE source_events LIKE ?`,\n [`%\"${eventId}\"%`]\n );\n if ((result[0]?.count || 0) > 0) return true;\n }\n return false;\n }\n\n /**\n * Get the last consolidation time\n */\n async getLastConsolidationTime(): Promise<Date | null> {\n const result = await dbAll<{ created_at: string }>(\n this.db,\n `SELECT created_at FROM consolidated_memories\n ORDER BY created_at DESC\n LIMIT 1`\n );\n\n if (result.length === 0) return null;\n return new Date(result[0].created_at);\n }\n\n /**\n * Convert database row to ConsolidatedMemory\n */\n private rowToMemory(row: Record<string, unknown>): ConsolidatedMemory {\n return {\n memoryId: row.memory_id as string,\n summary: row.summary as string,\n topics: JSON.parse(row.topics as string || '[]'),\n sourceEvents: JSON.parse(row.source_events as string || '[]'),\n confidence: row.confidence as number,\n createdAt: toDate(row.created_at),\n accessedAt: row.accessed_at ? toDate(row.accessed_at) : undefined,\n accessCount: row.access_count as number || 0\n };\n }\n}\n\n/**\n * Create a Consolidated Store instance\n */\nexport function createConsolidatedStore(eventStore: EventStore): ConsolidatedStore {\n return new ConsolidatedStore(eventStore);\n}\n", "/**\n * Consolidation Worker\n * Periodically consolidates working set into long-term memory\n * Biomimetic: Simulates memory consolidation during sleep/idle periods\n */\n\nimport type {\n EndlessModeConfig,\n MemoryEvent,\n EventGroup,\n WorkingSet,\n ConsolidationCostQualityReport\n} from './types.js';\nimport { WorkingSetStore } from './working-set-store.js';\nimport { ConsolidatedStore } from './consolidated-store.js';\n\nexport class ConsolidationWorker {\n private running = false;\n private timeout: NodeJS.Timeout | null = null;\n private lastActivity: Date = new Date();\n\n constructor(\n private workingSetStore: WorkingSetStore,\n private consolidatedStore: ConsolidatedStore,\n private config: EndlessModeConfig\n ) {}\n\n /**\n * Start the consolidation worker\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.scheduleNext();\n }\n\n /**\n * Stop the consolidation worker\n */\n stop(): void {\n this.running = false;\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n }\n\n /**\n * Record activity (resets idle timer)\n */\n recordActivity(): void {\n this.lastActivity = new Date();\n }\n\n /**\n * Check if currently running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Force a consolidation run (manual trigger)\n */\n async forceRun(): Promise<number> {\n const out = await this.consolidateWithReport();\n return out.consolidatedCount;\n }\n\n /**\n * Force a consolidation run and return metrics report\n */\n async forceRunWithReport(): Promise<{\n consolidatedCount: number;\n promotedRuleCount: number;\n report: ConsolidationCostQualityReport;\n }> {\n return this.consolidateWithReport();\n }\n\n /**\n * Schedule the next consolidation check\n */\n private scheduleNext(): void {\n if (!this.running) return;\n\n this.timeout = setTimeout(\n () => this.run(),\n this.config.consolidation.triggerIntervalMs\n );\n }\n\n /**\n * Run consolidation check\n */\n private async run(): Promise<void> {\n if (!this.running) return;\n\n try {\n await this.checkAndConsolidate();\n } catch (error) {\n console.error('Consolidation error:', error);\n }\n\n this.scheduleNext();\n }\n\n /**\n * Check conditions and consolidate if needed\n */\n private async checkAndConsolidate(): Promise<void> {\n const workingSet = await this.workingSetStore.get();\n\n if (!this.shouldConsolidate(workingSet)) {\n return;\n }\n\n await this.consolidate();\n }\n\n /**\n * Perform consolidation\n */\n private async consolidate(): Promise<number> {\n const out = await this.consolidateWithReport();\n return out.consolidatedCount;\n }\n\n private async consolidateWithReport(): Promise<{\n consolidatedCount: number;\n promotedRuleCount: number;\n report: ConsolidationCostQualityReport;\n }> {\n const workingSet = await this.workingSetStore.get();\n\n if (workingSet.recentEvents.length < 3) {\n return {\n consolidatedCount: 0,\n promotedRuleCount: 0,\n report: this.buildCostQualityReport(workingSet.recentEvents, [], 0)\n };\n }\n\n // Group events by topic\n const groups = this.groupByTopic(workingSet.recentEvents);\n let consolidatedCount = 0;\n const createdMemoryIds: string[] = [];\n\n for (const group of groups) {\n // Require minimum 3 events per group\n if (group.events.length < 3) continue;\n\n // Check if already consolidated\n const eventIds = group.events.map(e => e.id);\n const alreadyConsolidated = await this.consolidatedStore.isAlreadyConsolidated(eventIds);\n if (alreadyConsolidated) continue;\n\n // Generate summary\n const summary = await this.summarize(group);\n\n // Create consolidated memory\n const memoryId = await this.consolidatedStore.create({\n summary,\n topics: group.topics,\n sourceEvents: eventIds,\n confidence: this.calculateConfidence(group)\n });\n createdMemoryIds.push(memoryId);\n consolidatedCount++;\n }\n\n const promotedRuleCount = await this.promoteStableSummariesToRules(createdMemoryIds);\n\n // Prune consolidated events from working set\n if (consolidatedCount > 0) {\n const consolidatedEventIds = groups\n .filter(g => g.events.length >= 3)\n .flatMap(g => g.events.map(e => e.id));\n\n // Only prune old events (keep recent for context)\n const oldEventIds = consolidatedEventIds.filter(id => {\n const event = workingSet.recentEvents.find(e => e.id === id);\n if (!event) return false;\n const ageHours = (Date.now() - event.timestamp.getTime()) / (1000 * 60 * 60);\n return ageHours > this.config.workingSet.timeWindowHours / 2;\n });\n\n if (oldEventIds.length > 0) {\n await this.workingSetStore.prune(oldEventIds);\n }\n }\n\n const report = this.buildCostQualityReport(workingSet.recentEvents, groups, consolidatedCount);\n return { consolidatedCount, promotedRuleCount, report };\n }\n\n private async promoteStableSummariesToRules(memoryIds: string[]): Promise<number> {\n let promoted = 0;\n\n for (const memoryId of memoryIds) {\n const memory = await this.consolidatedStore.get(memoryId);\n if (!memory) continue;\n if (memory.confidence < 0.55) continue;\n if (memory.sourceEvents.length < 4) continue;\n\n const exists = await this.consolidatedStore.hasRuleForSourceMemory(memoryId);\n if (exists) continue;\n\n const rule = this.buildRuleFromSummary(memory.summary, memory.topics);\n if (!rule) continue;\n\n await this.consolidatedStore.createRule({\n rule,\n topics: memory.topics,\n sourceMemoryIds: [memory.memoryId],\n sourceEvents: memory.sourceEvents,\n confidence: Math.min(1, memory.confidence + 0.08)\n });\n promoted++;\n }\n\n return promoted;\n }\n\n private buildRuleFromSummary(summary: string, topics: string[]): string | null {\n const lines = summary\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter(Boolean)\n .filter((l) => !l.toLowerCase().startsWith('topics:'));\n\n const bullet = lines.find((l) => l.startsWith('- '))?.replace(/^-\\s*/, '');\n const seed = bullet || lines[0];\n if (!seed || seed.length < 8) return null;\n\n const topicPrefix = topics.length > 0 ? `[${topics.slice(0, 2).join(', ')}] ` : '';\n return `${topicPrefix}${seed}`;\n }\n\n private buildCostQualityReport(\n events: MemoryEvent[],\n groups: EventGroup[],\n consolidatedCount: number\n ): ConsolidationCostQualityReport {\n const beforeTokenEstimate = events.reduce((acc, e) => acc + this.estimateTokens(e.content), 0);\n\n const afterSummaries = groups\n .filter((g) => g.events.length >= 3)\n .slice(0, Math.max(consolidatedCount, 1));\n\n const afterTokenEstimate = afterSummaries.length > 0\n ? afterSummaries.reduce((acc, g) => acc + this.estimateTokens(this.ruleBasedSummary(g)), 0)\n : beforeTokenEstimate;\n\n const reductionRatio = beforeTokenEstimate > 0\n ? Math.max(0, (beforeTokenEstimate - afterTokenEstimate) / beforeTokenEstimate)\n : 0;\n\n const qualityGuardPassed = consolidatedCount === 0\n ? true\n : groups.filter((g) => g.events.length >= 3).every((g) => this.calculateConfidence(g) >= 0.55);\n\n return {\n beforeTokenEstimate,\n afterTokenEstimate,\n reductionRatio,\n qualityGuardPassed,\n details: `groups=${groups.length}, consolidated=${consolidatedCount}`\n };\n }\n\n private estimateTokens(text: string): number {\n return Math.ceil((text || '').length / 4);\n }\n\n /**\n * Check if consolidation should run\n */\n private shouldConsolidate(workingSet: WorkingSet): boolean {\n // Check event count trigger\n if (workingSet.recentEvents.length >= this.config.consolidation.triggerEventCount) {\n return true;\n }\n\n // Check idle time trigger\n const idleTime = Date.now() - this.lastActivity.getTime();\n if (idleTime >= this.config.consolidation.triggerIdleMs) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Group events by topic using simple keyword extraction\n */\n private groupByTopic(events: MemoryEvent[]): EventGroup[] {\n const groups = new Map<string, EventGroup>();\n\n for (const event of events) {\n const topics = this.extractTopics(event.content);\n\n for (const topic of topics) {\n if (!groups.has(topic)) {\n groups.set(topic, { topics: [topic], events: [] });\n }\n const group = groups.get(topic)!;\n if (!group.events.find(e => e.id === event.id)) {\n group.events.push(event);\n }\n }\n }\n\n // Merge groups with overlapping events\n const mergedGroups = this.mergeOverlappingGroups(Array.from(groups.values()));\n\n return mergedGroups;\n }\n\n /**\n * Extract topics from content using simple keyword extraction\n */\n private extractTopics(content: string): string[] {\n const topics: string[] = [];\n\n // Extract code-related keywords\n const codePatterns = [\n /\\b(function|class|interface|type|const|let|var)\\s+(\\w+)/gi,\n /\\b(import|export)\\s+.*?from\\s+['\"]([^'\"]+)['\"]/gi,\n /\\bfile[:\\s]+([^\\s,]+)/gi\n ];\n\n for (const pattern of codePatterns) {\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const keyword = match[2] || match[1];\n if (keyword && keyword.length > 2) {\n topics.push(keyword.toLowerCase());\n }\n }\n }\n\n // Extract common programming terms\n const commonTerms = [\n 'bug', 'fix', 'error', 'issue', 'feature',\n 'test', 'refactor', 'implement', 'add', 'remove',\n 'update', 'change', 'modify', 'create', 'delete'\n ];\n\n const contentLower = content.toLowerCase();\n for (const term of commonTerms) {\n if (contentLower.includes(term)) {\n topics.push(term);\n }\n }\n\n return [...new Set(topics)].slice(0, 5); // Limit to 5 topics\n }\n\n /**\n * Merge groups that have significant event overlap\n */\n private mergeOverlappingGroups(groups: EventGroup[]): EventGroup[] {\n const merged: EventGroup[] = [];\n\n for (const group of groups) {\n let foundMerge = false;\n\n for (const existing of merged) {\n const overlap = group.events.filter(e =>\n existing.events.some(ex => ex.id === e.id)\n );\n\n // If > 50% overlap, merge\n if (overlap.length > group.events.length / 2) {\n existing.topics = [...new Set([...existing.topics, ...group.topics])];\n for (const event of group.events) {\n if (!existing.events.find(e => e.id === event.id)) {\n existing.events.push(event);\n }\n }\n foundMerge = true;\n break;\n }\n }\n\n if (!foundMerge) {\n merged.push(group);\n }\n }\n\n return merged;\n }\n\n /**\n * Generate summary for a group of events\n * Rule-based extraction (no LLM by default)\n */\n private async summarize(group: EventGroup): Promise<string> {\n if (this.config.consolidation.useLLMSummarization) {\n // Future: LLM-based summarization\n return this.ruleBasedSummary(group);\n }\n\n return this.ruleBasedSummary(group);\n }\n\n /**\n * Rule-based summary generation\n */\n private ruleBasedSummary(group: EventGroup): string {\n const keyPoints: string[] = [];\n\n for (const event of group.events.slice(0, 10)) {\n const keyPoint = this.extractKeyPoint(event.content);\n if (keyPoint) {\n keyPoints.push(keyPoint);\n }\n }\n\n const topicsStr = group.topics.slice(0, 3).join(', ');\n const summary = [\n `Topics: ${topicsStr}`,\n '',\n 'Key points:',\n ...keyPoints.map(kp => `- ${kp}`)\n ].join('\\n');\n\n return summary;\n }\n\n /**\n * Extract key point from content\n */\n private extractKeyPoint(content: string): string | null {\n // Get first meaningful sentence\n const sentences = content.split(/[.!?\\n]+/).filter(s => s.trim().length > 10);\n if (sentences.length === 0) return null;\n\n const firstSentence = sentences[0].trim();\n\n // Truncate if too long\n if (firstSentence.length > 100) {\n return firstSentence.slice(0, 100) + '...';\n }\n\n return firstSentence;\n }\n\n /**\n * Calculate confidence score for a group\n */\n private calculateConfidence(group: EventGroup): number {\n // Factor 1: Event count (more events = higher confidence)\n const eventScore = Math.min(group.events.length / 10, 1);\n\n // Factor 2: Time proximity (events closer together = higher confidence)\n const timeScore = this.calculateTimeProximity(group.events);\n\n // Factor 3: Topic consistency (fewer topics per event = higher confidence)\n const topicScore = Math.min(3 / group.topics.length, 1);\n\n return (eventScore * 0.4 + timeScore * 0.4 + topicScore * 0.2);\n }\n\n /**\n * Calculate time proximity score\n */\n private calculateTimeProximity(events: MemoryEvent[]): number {\n if (events.length < 2) return 1;\n\n const timestamps = events.map(e => e.timestamp.getTime()).sort((a, b) => a - b);\n const timeSpan = timestamps[timestamps.length - 1] - timestamps[0];\n\n // Score based on average time between events\n const avgGap = timeSpan / (events.length - 1);\n const hourInMs = 60 * 60 * 1000;\n\n // Within 1 hour average = score 1, 24 hours = score 0.5, etc.\n return Math.max(0, 1 - (avgGap / (24 * hourInMs)));\n }\n}\n\n/**\n * Create a Consolidation Worker instance\n */\nexport function createConsolidationWorker(\n workingSetStore: WorkingSetStore,\n consolidatedStore: ConsolidatedStore,\n config: EndlessModeConfig\n): ConsolidationWorker {\n return new ConsolidationWorker(workingSetStore, consolidatedStore, config);\n}\n", "/**\n * Continuity Manager\n * Tracks and calculates context continuity between interactions\n * Biomimetic: Simulates context-dependent memory retrieval\n */\n\nimport { randomUUID } from 'crypto';\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport type {\n EndlessModeConfig,\n ContextSnapshot,\n ContinuityScore,\n TransitionType,\n ContinuityLog\n} from './types.js';\nimport { EventStore } from './event-store.js';\n\nexport class ContinuityManager {\n private lastContext: ContextSnapshot | null = null;\n\n constructor(\n private eventStore: EventStore,\n private config: EndlessModeConfig\n ) {}\n\n private get db(): Database {\n return this.eventStore.getDatabase();\n }\n\n /**\n * Calculate continuity score between current and previous context\n */\n async calculateScore(\n currentContext: ContextSnapshot,\n previousContext?: ContextSnapshot\n ): Promise<ContinuityScore> {\n const prev = previousContext || this.lastContext;\n\n if (!prev) {\n // No previous context - this is a fresh start\n this.lastContext = currentContext;\n return { score: 0.5, transitionType: 'break' };\n }\n\n let score = 0;\n\n // Topic continuity (30%)\n const topicOverlap = this.calculateOverlap(\n currentContext.topics,\n prev.topics\n );\n score += topicOverlap * 0.3;\n\n // File continuity (20%)\n const fileOverlap = this.calculateOverlap(\n currentContext.files,\n prev.files\n );\n score += fileOverlap * 0.2;\n\n // Time proximity (30%)\n const timeDiff = currentContext.timestamp - prev.timestamp;\n const decayHours = this.config.continuity.topicDecayHours;\n const timeScore = Math.exp(-timeDiff / (decayHours * 3600000));\n score += timeScore * 0.3;\n\n // Entity continuity (20%)\n const entityOverlap = this.calculateOverlap(\n currentContext.entities,\n prev.entities\n );\n score += entityOverlap * 0.2;\n\n // Determine transition type\n const transitionType = this.determineTransitionType(score);\n\n // Log the transition\n await this.logTransition(currentContext, prev, score, transitionType);\n\n // Update last context\n this.lastContext = currentContext;\n\n return { score, transitionType };\n }\n\n /**\n * Create a context snapshot from current state\n */\n createSnapshot(\n id: string,\n content: string,\n metadata?: {\n files?: string[];\n entities?: string[];\n }\n ): ContextSnapshot {\n return {\n id,\n timestamp: Date.now(),\n topics: this.extractTopics(content),\n files: metadata?.files || this.extractFiles(content),\n entities: metadata?.entities || this.extractEntities(content)\n };\n }\n\n /**\n * Get recent continuity logs\n */\n async getRecentLogs(limit: number = 10): Promise<ContinuityLog[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM continuity_log\n ORDER BY created_at DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(row => ({\n logId: row.log_id as string,\n fromContextId: row.from_context_id as string | undefined,\n toContextId: row.to_context_id as string | undefined,\n continuityScore: row.continuity_score as number,\n transitionType: row.transition_type as TransitionType,\n createdAt: toDate(row.created_at)\n }));\n }\n\n /**\n * Get average continuity score over time period\n */\n async getAverageScore(hours: number = 1): Promise<number> {\n const result = await dbAll<{ avg_score: number | null }>(\n this.db,\n `SELECT AVG(continuity_score) as avg_score\n FROM continuity_log\n WHERE created_at > datetime('now', '-${hours} hours')`\n );\n\n return result[0]?.avg_score ?? 0.5;\n }\n\n /**\n * Get transition type distribution\n */\n async getTransitionStats(hours: number = 24): Promise<Record<TransitionType, number>> {\n const rows = await dbAll<{ transition_type: string; count: number }>(\n this.db,\n `SELECT transition_type, COUNT(*) as count\n FROM continuity_log\n WHERE created_at > datetime('now', '-${hours} hours')\n GROUP BY transition_type`\n );\n\n const stats: Record<TransitionType, number> = {\n seamless: 0,\n topic_shift: 0,\n break: 0\n };\n\n for (const row of rows) {\n stats[row.transition_type as TransitionType] = row.count;\n }\n\n return stats;\n }\n\n /**\n * Clear old continuity logs\n */\n async cleanup(olderThanDays: number = 7): Promise<number> {\n const result = await dbAll<{ changes: number }>(\n this.db,\n `DELETE FROM continuity_log\n WHERE created_at < datetime('now', '-${olderThanDays} days')\n RETURNING COUNT(*) as changes`\n );\n\n return result[0]?.changes || 0;\n }\n\n /**\n * Calculate overlap between two arrays\n */\n private calculateOverlap(a: string[], b: string[]): number {\n if (a.length === 0 || b.length === 0) return 0;\n\n const setA = new Set(a.map(s => s.toLowerCase()));\n const setB = new Set(b.map(s => s.toLowerCase()));\n\n const intersection = [...setA].filter(x => setB.has(x));\n const union = new Set([...setA, ...setB]);\n\n return intersection.length / union.size; // Jaccard similarity\n }\n\n /**\n * Determine transition type based on score\n */\n private determineTransitionType(score: number): TransitionType {\n if (score >= this.config.continuity.minScoreForSeamless) {\n return 'seamless';\n } else if (score >= 0.4) {\n return 'topic_shift';\n } else {\n return 'break';\n }\n }\n\n /**\n * Log a context transition\n */\n private async logTransition(\n current: ContextSnapshot,\n previous: ContextSnapshot,\n score: number,\n type: TransitionType\n ): Promise<void> {\n await dbRun(\n this.db,\n `INSERT INTO continuity_log\n (log_id, from_context_id, to_context_id, continuity_score, transition_type, created_at)\n VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)`,\n [randomUUID(), previous.id, current.id, score, type]\n );\n }\n\n /**\n * Extract topics from content\n */\n private extractTopics(content: string): string[] {\n const topics: string[] = [];\n const contentLower = content.toLowerCase();\n\n // Programming language keywords\n const langPatterns = [\n { pattern: /typescript|\\.ts\\b/i, topic: 'typescript' },\n { pattern: /javascript|\\.js\\b/i, topic: 'javascript' },\n { pattern: /python|\\.py\\b/i, topic: 'python' },\n { pattern: /rust|\\.rs\\b/i, topic: 'rust' },\n { pattern: /go\\b|golang/i, topic: 'go' }\n ];\n\n for (const { pattern, topic } of langPatterns) {\n if (pattern.test(content)) {\n topics.push(topic);\n }\n }\n\n // Common development topics\n const devTopics = [\n 'api', 'database', 'test', 'bug', 'feature', 'refactor',\n 'component', 'function', 'class', 'module', 'hook',\n 'deploy', 'build', 'config', 'docker', 'git'\n ];\n\n for (const topic of devTopics) {\n if (contentLower.includes(topic)) {\n topics.push(topic);\n }\n }\n\n return [...new Set(topics)].slice(0, 10);\n }\n\n /**\n * Extract file paths from content\n */\n private extractFiles(content: string): string[] {\n const filePatterns = [\n /(?:^|\\s)([a-zA-Z0-9_\\-./]+\\.[a-zA-Z0-9]+)(?:\\s|$|:)/gm,\n /['\"](\\.?\\/[^'\"]+\\.[a-zA-Z0-9]+)['\"]/g,\n /file[:\\s]+([^\\s,]+)/gi\n ];\n\n const files = new Set<string>();\n\n for (const pattern of filePatterns) {\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const file = match[1];\n if (file && file.length > 3 && file.length < 100) {\n // Filter out common non-file patterns\n if (!file.match(/^(https?:|mailto:|ftp:)/i)) {\n files.add(file);\n }\n }\n }\n }\n\n return Array.from(files).slice(0, 10);\n }\n\n /**\n * Extract entity names from content (functions, classes, variables)\n */\n private extractEntities(content: string): string[] {\n const entities = new Set<string>();\n\n const entityPatterns = [\n /\\b(function|const|let|var|class|interface|type)\\s+([a-zA-Z_][a-zA-Z0-9_]*)/g,\n /\\b([A-Z][a-zA-Z0-9_]*(?:Component|Service|Store|Manager|Handler|Factory|Provider))\\b/g,\n /\\b(use[A-Z][a-zA-Z0-9_]*)\\b/g // React hooks\n ];\n\n for (const pattern of entityPatterns) {\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const entity = match[2] || match[1];\n if (entity && entity.length > 2) {\n entities.add(entity);\n }\n }\n }\n\n return Array.from(entities).slice(0, 20);\n }\n\n /**\n * Reset the last context (for testing or manual reset)\n */\n resetLastContext(): void {\n this.lastContext = null;\n }\n\n /**\n * Get the last context snapshot\n */\n getLastContext(): ContextSnapshot | null {\n return this.lastContext;\n }\n}\n\n/**\n * Create a Continuity Manager instance\n */\nexport function createContinuityManager(\n eventStore: EventStore,\n config: EndlessModeConfig\n): ContinuityManager {\n return new ContinuityManager(eventStore, config);\n}\n", "/**\n * Memory Engine Services Bundle\n *\n * Owns construction and wiring for storage-backed engine services so\n * MemoryService can stay focused on public facade/lifecycle behavior.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nimport { Embedder, getDefaultEmbedder } from '../embedder.js';\nimport type { EventStore } from '../event-store.js';\nimport { createGraduationPipeline, type GraduationPipeline } from '../graduation.js';\nimport { getDefaultMatcher, type Matcher } from '../matcher.js';\nimport { MarkdownMirror } from '../md-mirror.js';\nimport type { Retriever } from '../retriever.js';\nimport { SQLiteEventStore } from '../sqlite-event-store.js';\nimport type { MemoryOperationsConfig, ToolObservationPayload } from '../types.js';\nimport {\n ActorRepository,\n PerspectiveObservationRepository,\n SessionActorRepository,\n createPerspectiveDeriver\n} from '../operations/index.js';\nimport { VectorStore } from '../vector-store.js';\nimport { MemoryIngestService } from './memory-ingest-service.js';\nimport { MemoryQueryService } from './memory-query-service.js';\nimport {\n createRetrievalServices,\n type RetrievalAnalyticsService,\n type RetrievalDisclosureService,\n type RetrievalDisclosureSharedStore,\n type RetrievalEventStore,\n type RetrievalOrchestrator,\n type RetrievalServices,\n type RetrievalServicesDeps\n} from './retrieval-services.js';\n\nexport interface MemoryEngineServicesOptions {\n storagePath: string;\n readOnly: boolean;\n embeddingModel?: string;\n cwd?: string;\n initialize: () => Promise<void>;\n getProjectHash: () => string | null;\n getProjectPath?: () => string | null;\n hasSharedStore: () => boolean;\n memoryOperationsConfig?: MemoryOperationsConfig;\n sharedStore?: RetrievalDisclosureSharedStore;\n createToolObservationEmbedding: (payload: ToolObservationPayload) => string;\n factories?: MemoryEngineServicesFactories;\n}\n\nexport interface MemoryEngineServicesFactories {\n createSQLiteEventStore?: (\n dbPath: string,\n options: { readonly: boolean; markdownMirrorRoot: string }\n ) => SQLiteEventStore;\n createVectorStore?: (vectorsPath: string) => VectorStore;\n createEmbedder?: (model: string) => Embedder;\n getDefaultEmbedder?: () => Embedder;\n getDefaultMatcher?: () => Matcher;\n createMarkdownMirror?: (cwd: string) => MarkdownMirror;\n createGraduationPipeline?: (eventStore: EventStore) => GraduationPipeline;\n createRetrievalServices?: (deps: RetrievalServicesDeps) => RetrievalServices;\n}\n\nexport interface MemoryEngineServices {\n storagePath: string;\n sqliteStore: SQLiteEventStore;\n vectorStore: VectorStore;\n embedder: Embedder;\n matcher: Matcher;\n retriever: Retriever;\n retrievalOrchestrator: RetrievalOrchestrator;\n retrievalDisclosureService: RetrievalDisclosureService;\n retrievalAnalyticsService: RetrievalAnalyticsService;\n graduation: GraduationPipeline;\n mdMirror: MarkdownMirror;\n ingestService: MemoryIngestService;\n queryService: MemoryQueryService;\n}\n\nexport function createMemoryEngineServices(options: MemoryEngineServicesOptions): MemoryEngineServices {\n const factories = options.factories ?? {};\n const storagePath = options.storagePath;\n\n if (!options.readOnly && !fs.existsSync(storagePath)) {\n fs.mkdirSync(storagePath, { recursive: true });\n }\n\n const sqliteStore = (factories.createSQLiteEventStore ?? defaultCreateSQLiteEventStore)(\n path.join(storagePath, 'events.sqlite'),\n {\n readonly: options.readOnly,\n markdownMirrorRoot: storagePath\n }\n );\n const vectorStore = (factories.createVectorStore ?? defaultCreateVectorStore)(\n path.join(storagePath, 'vectors')\n );\n const embeddingModel = options.embeddingModel || process.env.CLAUDE_MEMORY_EMBEDDING_MODEL;\n const embedder = embeddingModel\n ? (factories.createEmbedder ?? defaultCreateEmbedder)(embeddingModel)\n : (factories.getDefaultEmbedder ?? getDefaultEmbedder)();\n const matcher = (factories.getDefaultMatcher ?? getDefaultMatcher)();\n const mdMirror = (factories.createMarkdownMirror ?? defaultCreateMarkdownMirror)(\n options.cwd ?? process.cwd()\n );\n const graduation = (factories.createGraduationPipeline ?? defaultCreateGraduationPipeline)(\n sqliteStore as unknown as EventStore\n );\n const perspectiveDeriver = shouldEnablePerspectiveDeriver(options)\n ? createPerspectiveDeriver({\n actors: new ActorRepository(sqliteStore.getDatabase()),\n sessions: new SessionActorRepository(sqliteStore.getDatabase()),\n observations: new PerspectiveObservationRepository(sqliteStore.getDatabase()),\n config: options.memoryOperationsConfig?.perspectiveMemory\n })\n : undefined;\n\n const retrievalServices = (factories.createRetrievalServices ?? createRetrievalServices)({\n initialize: options.initialize,\n eventStore: sqliteStore as unknown as RetrievalEventStore,\n vectorStore,\n embedder,\n matcher,\n getProjectHash: options.getProjectHash,\n hasSharedStore: options.hasSharedStore,\n memoryOperationsConfig: options.memoryOperationsConfig,\n sharedStore: options.sharedStore\n });\n\n const ingestService = new MemoryIngestService({\n initialize: options.initialize,\n eventStore: sqliteStore,\n markdownMirror: mdMirror,\n createToolEmbedding: options.createToolObservationEmbedding,\n getProjectHash: options.getProjectHash,\n getProjectPath: options.getProjectPath,\n perspectiveDeriver\n });\n const queryService = new MemoryQueryService(\n () => sqliteStore.initialize(),\n sqliteStore,\n { vectorStore, graduation }\n );\n\n return {\n storagePath,\n sqliteStore,\n vectorStore,\n embedder,\n matcher,\n retriever: retrievalServices.retriever,\n retrievalOrchestrator: retrievalServices.retrievalOrchestrator,\n retrievalDisclosureService: retrievalServices.retrievalDisclosureService,\n retrievalAnalyticsService: retrievalServices.retrievalAnalyticsService,\n graduation,\n mdMirror,\n ingestService,\n queryService\n };\n}\n\nfunction shouldEnablePerspectiveDeriver(options: MemoryEngineServicesOptions): boolean {\n if (options.readOnly) return false;\n const perspectiveMemory = options.memoryOperationsConfig?.perspectiveMemory;\n return perspectiveMemory?.enabled === true && perspectiveMemory.deriver?.enabled === true;\n}\n\nfunction defaultCreateSQLiteEventStore(\n dbPath: string,\n options: { readonly: boolean; markdownMirrorRoot: string }\n): SQLiteEventStore {\n return new SQLiteEventStore(dbPath, options);\n}\n\nfunction defaultCreateVectorStore(vectorsPath: string): VectorStore {\n return new VectorStore(vectorsPath);\n}\n\nfunction defaultCreateEmbedder(model: string): Embedder {\n return new Embedder(model);\n}\n\nfunction defaultCreateMarkdownMirror(cwd: string): MarkdownMirror {\n return new MarkdownMirror(cwd);\n}\n\nfunction defaultCreateGraduationPipeline(eventStore: EventStore): GraduationPipeline {\n return createGraduationPipeline(eventStore);\n}\n", "/**\n * Local Embedding Generator using @huggingface/transformers\n * AXIOMMIND Principle 7: Standard JSON format for vectors\n */\n\nexport interface EmbeddingResult {\n vector: number[];\n model: string;\n dimensions: number;\n}\n\ntype FeatureExtractionPipelineFactory = (\n task: 'feature-extraction',\n model: string\n) => Promise<NonNullable<Embedder['pipeline']>>;\n\nexport const DEFAULT_EMBEDDING_MODEL = 'Xenova/multilingual-e5-small';\nexport const DEFAULT_EMBEDDING_FALLBACK_MODEL = 'intfloat/multilingual-e5-small';\n\nexport class Embedder {\n private pipeline: ((input: string, options?: Record<string, unknown>) => Promise<{ data: Float32Array }>) | null = null;\n private readonly modelName: string;\n private activeModelName: string;\n private initialized = false;\n\n constructor(modelName: string = DEFAULT_EMBEDDING_MODEL) {\n this.modelName = modelName;\n this.activeModelName = modelName;\n }\n\n /**\n * Initialize the embedding pipeline\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n const pipeline = await withSuppressedKnownTransformersWarnings(async () => {\n try {\n return await loadTransformersPipeline();\n } catch (error) {\n if (isMissingTransformersDependencyError(error)) {\n throw createEmbeddingBackendUnavailableError(error);\n }\n throw error;\n }\n });\n\n try {\n this.pipeline = await withSuppressedKnownTransformersWarnings(() => pipeline('feature-extraction', this.modelName));\n this.activeModelName = this.modelName;\n this.initialized = true;\n return;\n } catch (primaryError) {\n const fallbackModel = process.env.CLAUDE_MEMORY_EMBEDDING_FALLBACK_MODEL || DEFAULT_EMBEDDING_FALLBACK_MODEL;\n if (fallbackModel === this.modelName) {\n throw primaryError;\n }\n\n console.warn(`[Embedder] Primary model failed (${this.modelName}). Falling back to ${fallbackModel}`);\n this.pipeline = await withSuppressedKnownTransformersWarnings(() => pipeline('feature-extraction', fallbackModel));\n this.activeModelName = fallbackModel;\n this.initialized = true;\n }\n }\n\n // ~4 chars per token; 512 tokens * 4 = 2048, use 2000 to be safe\n private static readonly MAX_CHARS = 2000;\n\n private truncate(text: string): string {\n return text.length > Embedder.MAX_CHARS ? text.slice(0, Embedder.MAX_CHARS) : text;\n }\n\n /**\n * Generate embedding for a single text\n */\n async embed(text: string): Promise<EmbeddingResult> {\n await this.initialize();\n\n if (!this.pipeline) {\n throw new Error('Embedding pipeline not initialized');\n }\n\n const output = await this.pipeline(this.truncate(text), {\n pooling: 'mean',\n normalize: true,\n truncation: true,\n max_length: 512\n });\n\n const vector = Array.from(output.data);\n\n return {\n vector,\n model: this.activeModelName,\n dimensions: vector.length\n };\n }\n\n /**\n * Generate embeddings for multiple texts in batch\n */\n async embedBatch(texts: string[]): Promise<EmbeddingResult[]> {\n await this.initialize();\n\n if (!this.pipeline) {\n throw new Error('Embedding pipeline not initialized');\n }\n\n const results: EmbeddingResult[] = [];\n\n // Process in batches of 32 for memory efficiency\n const batchSize = 32;\n for (let i = 0; i < texts.length; i += batchSize) {\n const batch = texts.slice(i, i + batchSize);\n\n for (const text of batch) {\n const output = await this.pipeline(this.truncate(text), {\n pooling: 'mean',\n normalize: true,\n truncation: true,\n max_length: 512\n });\n\n const vector = Array.from(output.data);\n\n results.push({\n vector,\n model: this.activeModelName,\n dimensions: vector.length\n });\n }\n }\n\n return results;\n }\n\n /**\n * Get embedding dimensions for the current model\n */\n async getDimensions(): Promise<number> {\n const result = await this.embed('test');\n return result.dimensions;\n }\n\n /**\n * Check if embedder is ready\n */\n isReady(): boolean {\n return this.initialized && this.pipeline !== null;\n }\n\n /**\n * Get model name\n */\n getModelName(): string {\n return this.activeModelName;\n }\n}\n\n// Singleton instance for reuse\nlet defaultEmbedder: Embedder | null = null;\n\nexport function getDefaultEmbedder(): Embedder {\n const envModel = process.env.CLAUDE_MEMORY_EMBEDDING_MODEL;\n if (!defaultEmbedder) {\n defaultEmbedder = new Embedder(envModel || undefined);\n }\n return defaultEmbedder;\n}\n\nlet transformersWarningSuppressionDepth = 0;\nlet originalConsoleWarn: typeof console.warn | null = null;\n\nexport async function withSuppressedKnownTransformersWarnings<T>(fn: () => Promise<T>): Promise<T> {\n if (transformersWarningSuppressionDepth === 0) {\n originalConsoleWarn = console.warn;\n console.warn = (...args: unknown[]) => {\n const message = args.map(String).join(' ');\n if (isKnownBenignTransformersWarning(message)) return;\n (originalConsoleWarn ?? console.warn)(...args);\n };\n }\n transformersWarningSuppressionDepth += 1;\n\n try {\n return await fn();\n } finally {\n transformersWarningSuppressionDepth -= 1;\n if (transformersWarningSuppressionDepth === 0 && originalConsoleWarn) {\n console.warn = originalConsoleWarn;\n originalConsoleWarn = null;\n }\n }\n}\n\nexport function isKnownBenignTransformersWarning(message: string): boolean {\n return message.includes('Unknown model class \"eurobert\"') ||\n message.includes('dtype not specified for \"model\"');\n}\n\nexport function isMissingTransformersDependencyError(error: unknown): boolean {\n const maybeError = error as { code?: unknown; message?: unknown } | null;\n const message = typeof maybeError?.message === 'string' ? maybeError.message : '';\n return maybeError?.code === 'ERR_MODULE_NOT_FOUND' &&\n message.includes(\"@huggingface/transformers\");\n}\n\nexport function createEmbeddingBackendUnavailableError(cause: unknown): Error & { cause?: unknown } {\n const error = new Error(\n [\n 'Required embedding backend is not installed.',\n '',\n 'Claude Memory Layer requires @huggingface/transformers for local semantic/vector embeddings.',\n 'The backend runs on CPU-only ONNX Runtime; CUDA is not required.',\n 'Reinstall globally with:',\n ' ONNXRUNTIME_NODE_INSTALL_CUDA=skip npm install -g claude-memory-layer@latest',\n '',\n 'If you are inside a local checkout or package directory, repair only the backend with:',\n ' ONNXRUNTIME_NODE_INSTALL_CUDA=skip npm install --no-save --no-package-lock --omit=dev @huggingface/transformers@3.8.1'\n ].join('\\n')\n ) as Error & { cause?: unknown };\n error.cause = cause;\n return error;\n}\n\nasync function loadTransformersPipeline(): Promise<FeatureExtractionPipelineFactory> {\n // Keep @huggingface/transformers lazy so importing MemoryService or pure\n // adapter helpers does not eagerly dlopen onnxruntime native bindings.\n const dynamicImport = new Function('specifier', 'return import(specifier)') as (\n specifier: string\n ) => Promise<{ pipeline: unknown }>;\n const transformers = await dynamicImport('@huggingface/transformers');\n return transformers.pipeline as FeatureExtractionPipelineFactory;\n}\n", "/**\n * Memory Graduation Pipeline - AXIOMMIND L0\u2192L1\u2192L2\u2192L3\u2192L4\n *\n * L0: EventStore (raw events, append-only)\n * L1: Structured JSON (session summaries, patterns)\n * L2: Type Candidates (Idris2-inspired, validated schemas)\n * L3: Verified Knowledge (cross-session validated)\n * L4: Active/Searchable (indexed, readily available)\n */\n\nimport { EventStore } from './event-store.js';\nimport type {\n MemoryEvent,\n MemoryLevel,\n GraduationResult,\n Insight\n} from './types.js';\n\nexport interface GraduationCriteria {\n minAccessCount: number;\n minConfidence: number;\n minCrossSessionRefs: number;\n maxAgeDays: number;\n}\n\nexport interface LevelCriteria {\n L0toL1: GraduationCriteria;\n L1toL2: GraduationCriteria;\n L2toL3: GraduationCriteria;\n L3toL4: GraduationCriteria;\n}\n\nconst DEFAULT_CRITERIA: LevelCriteria = {\n L0toL1: {\n minAccessCount: 1,\n minConfidence: 0.5,\n minCrossSessionRefs: 0,\n maxAgeDays: 30\n },\n L1toL2: {\n minAccessCount: 3,\n minConfidence: 0.7,\n minCrossSessionRefs: 1,\n maxAgeDays: 60\n },\n L2toL3: {\n minAccessCount: 5,\n minConfidence: 0.85,\n minCrossSessionRefs: 2,\n maxAgeDays: 90\n },\n L3toL4: {\n minAccessCount: 10,\n minConfidence: 0.92,\n minCrossSessionRefs: 3,\n maxAgeDays: 180\n }\n};\n\nexport interface EventMetrics {\n eventId: string;\n accessCount: number;\n lastAccessed: Date;\n crossSessionRefs: number;\n confidence: number;\n}\n\nexport class GraduationPipeline {\n private readonly eventStore: EventStore;\n private readonly criteria: LevelCriteria;\n private readonly metrics: Map<string, EventMetrics> = new Map();\n\n constructor(\n eventStore: EventStore,\n criteria: Partial<LevelCriteria> = {}\n ) {\n this.eventStore = eventStore;\n this.criteria = {\n L0toL1: { ...DEFAULT_CRITERIA.L0toL1, ...criteria.L0toL1 },\n L1toL2: { ...DEFAULT_CRITERIA.L1toL2, ...criteria.L1toL2 },\n L2toL3: { ...DEFAULT_CRITERIA.L2toL3, ...criteria.L2toL3 },\n L3toL4: { ...DEFAULT_CRITERIA.L3toL4, ...criteria.L3toL4 }\n };\n }\n\n // Track which sessions have accessed each event\n private readonly sessionAccesses: Map<string, Set<string>> = new Map();\n\n /**\n * Record an access to an event (used for graduation scoring)\n */\n recordAccess(eventId: string, fromSessionId: string, confidence: number = 1.0): void {\n const existing = this.metrics.get(eventId);\n\n // Track sessions that have accessed this event\n if (!this.sessionAccesses.has(eventId)) {\n this.sessionAccesses.set(eventId, new Set());\n }\n const sessions = this.sessionAccesses.get(eventId)!;\n const isNewSession = !sessions.has(fromSessionId);\n sessions.add(fromSessionId);\n\n if (existing) {\n existing.accessCount++;\n existing.lastAccessed = new Date();\n existing.confidence = Math.max(existing.confidence, confidence);\n // Update cross-session references count\n if (isNewSession && sessions.size > 1) {\n existing.crossSessionRefs = sessions.size - 1;\n }\n } else {\n this.metrics.set(eventId, {\n eventId,\n accessCount: 1,\n lastAccessed: new Date(),\n crossSessionRefs: 0,\n confidence\n });\n }\n }\n\n /**\n * Evaluate if an event should graduate to the next level\n */\n async evaluateGraduation(eventId: string, currentLevel: MemoryLevel): Promise<GraduationResult> {\n const metrics = this.metrics.get(eventId);\n\n if (!metrics) {\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: 'No metrics available for event'\n };\n }\n\n const nextLevel = this.getNextLevel(currentLevel);\n if (!nextLevel) {\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: 'Already at maximum level'\n };\n }\n\n const criteria = this.getCriteria(currentLevel, nextLevel);\n const evaluation = this.checkCriteria(metrics, criteria);\n\n if (evaluation.passed) {\n // Update level in event store\n await this.eventStore.updateMemoryLevel(eventId, nextLevel);\n\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: nextLevel,\n success: true\n };\n }\n\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: evaluation.reason\n };\n }\n\n /**\n * Run graduation evaluation for all events at a given level\n */\n async graduateBatch(level: MemoryLevel): Promise<GraduationResult[]> {\n const results: GraduationResult[] = [];\n\n for (const eventId of this.metrics.keys()) {\n const result = await this.evaluateGraduation(eventId, level);\n results.push(result);\n }\n\n return results;\n }\n\n /**\n * Extract insights from graduated events (L1+)\n */\n extractInsights(events: MemoryEvent[]): Insight[] {\n const insights: Insight[] = [];\n\n // Pattern detection: Look for repeated themes\n const patterns = this.detectPatterns(events);\n for (const pattern of patterns) {\n insights.push({\n id: crypto.randomUUID(),\n insightType: 'pattern',\n content: pattern.description,\n canonicalKey: pattern.key,\n confidence: pattern.confidence,\n sourceEvents: pattern.eventIds,\n createdAt: new Date(),\n lastUpdated: new Date()\n });\n }\n\n // Preference detection: Look for user preferences\n const preferences = this.detectPreferences(events);\n for (const pref of preferences) {\n insights.push({\n id: crypto.randomUUID(),\n insightType: 'preference',\n content: pref.description,\n canonicalKey: pref.key,\n confidence: pref.confidence,\n sourceEvents: pref.eventIds,\n createdAt: new Date(),\n lastUpdated: new Date()\n });\n }\n\n return insights;\n }\n\n /**\n * Get the next level in the graduation pipeline\n */\n private getNextLevel(current: MemoryLevel): MemoryLevel | null {\n const levels: MemoryLevel[] = ['L0', 'L1', 'L2', 'L3', 'L4'];\n const currentIndex = levels.indexOf(current);\n\n if (currentIndex === -1 || currentIndex >= levels.length - 1) {\n return null;\n }\n\n return levels[currentIndex + 1];\n }\n\n /**\n * Get criteria for level transition\n */\n private getCriteria(from: MemoryLevel, to: MemoryLevel): GraduationCriteria {\n const key = `${from}to${to}` as keyof LevelCriteria;\n return this.criteria[key] || DEFAULT_CRITERIA.L0toL1;\n }\n\n /**\n * Check if metrics meet criteria\n */\n private checkCriteria(\n metrics: EventMetrics,\n criteria: GraduationCriteria\n ): { passed: boolean; reason?: string } {\n if (metrics.accessCount < criteria.minAccessCount) {\n return {\n passed: false,\n reason: `Access count ${metrics.accessCount} < ${criteria.minAccessCount}`\n };\n }\n\n if (metrics.confidence < criteria.minConfidence) {\n return {\n passed: false,\n reason: `Confidence ${metrics.confidence} < ${criteria.minConfidence}`\n };\n }\n\n if (metrics.crossSessionRefs < criteria.minCrossSessionRefs) {\n return {\n passed: false,\n reason: `Cross-session refs ${metrics.crossSessionRefs} < ${criteria.minCrossSessionRefs}`\n };\n }\n\n const ageDays = (Date.now() - metrics.lastAccessed.getTime()) / (1000 * 60 * 60 * 24);\n if (ageDays > criteria.maxAgeDays) {\n return {\n passed: false,\n reason: `Event too old: ${ageDays.toFixed(1)} days > ${criteria.maxAgeDays}`\n };\n }\n\n return { passed: true };\n }\n\n /**\n * Detect patterns in events\n */\n private detectPatterns(events: MemoryEvent[]): Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> {\n // Simple pattern detection: group by canonical key and look for repeats\n const keyGroups = new Map<string, MemoryEvent[]>();\n\n for (const event of events) {\n const existing = keyGroups.get(event.canonicalKey) || [];\n existing.push(event);\n keyGroups.set(event.canonicalKey, existing);\n }\n\n const patterns: Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> = [];\n\n for (const [key, groupEvents] of keyGroups) {\n if (groupEvents.length >= 2) {\n patterns.push({\n key,\n description: `Repeated topic: ${key.slice(0, 50)}`,\n confidence: Math.min(1.0, groupEvents.length / 5),\n eventIds: groupEvents.map(e => e.id)\n });\n }\n }\n\n return patterns;\n }\n\n /**\n * Detect user preferences from events\n */\n private detectPreferences(events: MemoryEvent[]): Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> {\n // Simple preference detection: look for keywords\n const preferenceKeywords = ['prefer', 'like', 'want', 'always', 'never', 'favorite'];\n const preferences: Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> = [];\n\n for (const event of events) {\n if (event.eventType !== 'user_prompt') continue;\n\n const lowerContent = event.content.toLowerCase();\n for (const keyword of preferenceKeywords) {\n if (lowerContent.includes(keyword)) {\n preferences.push({\n key: `preference_${keyword}_${event.id.slice(0, 8)}`,\n description: `User preference: ${event.content.slice(0, 100)}`,\n confidence: 0.7,\n eventIds: [event.id]\n });\n break;\n }\n }\n }\n\n return preferences;\n }\n\n /**\n * Get graduation statistics\n */\n async getStats(): Promise<{ level: string; count: number }[]> {\n return this.eventStore.getLevelStats();\n }\n}\n\n/**\n * Create graduation pipeline with default settings\n */\nexport function createGraduationPipeline(eventStore: EventStore): GraduationPipeline {\n return new GraduationPipeline(eventStore);\n}\n", "/**\n * AXIOMMIND Matcher - Weighted scoring with confidence classification\n * Implements matching thresholds: high (\u22650.92), suggested (\u22650.75), none (<0.75)\n */\n\nimport type {\n MemoryMatch,\n MatchResult,\n MatchConfidence\n} from './types.js';\nimport { SearchResult } from './vector-store.js';\n\nexport interface MatchWeights {\n semanticSimilarity: number;\n ftsScore: number;\n recencyBonus: number;\n statusWeight: number;\n}\n\nexport interface MatcherConfig {\n weights: MatchWeights;\n minCombinedScore: number;\n minGap: number;\n suggestionThreshold: number;\n}\n\nconst DEFAULT_CONFIG: MatcherConfig = {\n weights: {\n semanticSimilarity: 0.4,\n ftsScore: 0.25,\n recencyBonus: 0.2,\n statusWeight: 0.15\n },\n minCombinedScore: 0.92,\n minGap: 0.03,\n suggestionThreshold: 0.75\n};\n\nexport class Matcher {\n private readonly config: MatcherConfig;\n\n constructor(config: Partial<MatcherConfig> = {}) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n weights: { ...DEFAULT_CONFIG.weights, ...config.weights }\n };\n }\n\n /**\n * Calculate combined score using AXIOMMIND weighted formula\n */\n calculateCombinedScore(\n semanticScore: number,\n ftsScore: number = 0,\n recencyDays: number = 0,\n isActive: boolean = true\n ): number {\n const { weights } = this.config;\n\n // Recency bonus: decays over 30 days\n const recencyBonus = Math.max(0, 1 - recencyDays / 30);\n\n // Status weight: active events get full weight\n const statusMultiplier = isActive ? 1.0 : 0.7;\n\n const combinedScore =\n weights.semanticSimilarity * semanticScore +\n weights.ftsScore * ftsScore +\n weights.recencyBonus * recencyBonus +\n weights.statusWeight * statusMultiplier;\n\n return Math.min(1.0, combinedScore);\n }\n\n /**\n * Classify match confidence based on AXIOMMIND thresholds\n */\n classifyConfidence(\n topScore: number,\n secondScore: number | null\n ): MatchConfidence {\n const { minCombinedScore, minGap, suggestionThreshold } = this.config;\n\n // Calculate gap (infinity if no second match)\n const gap = secondScore !== null ? topScore - secondScore : Infinity;\n\n // High confidence: score \u2265 0.92 AND gap \u2265 0.03\n if (topScore >= minCombinedScore && gap >= minGap) {\n return 'high';\n }\n\n // Suggested: score \u2265 0.75\n if (topScore >= suggestionThreshold) {\n return 'suggested';\n }\n\n // No match\n return 'none';\n }\n\n /**\n * Match search results to find best memory\n */\n matchSearchResults(\n results: SearchResult[],\n getEventAge: (eventId: string) => number\n ): MatchResult {\n if (results.length === 0) {\n return {\n match: null,\n confidence: 'none'\n };\n }\n\n // Calculate combined scores\n const scoredResults = results.map(result => {\n const ageDays = getEventAge(result.eventId);\n const combinedScore = this.calculateCombinedScore(\n result.score,\n result.score, // Reuse the retrieval score as lexical/proxy score when no separate FTS score is provided.\n ageDays,\n true // Assume active\n );\n\n return {\n result,\n combinedScore\n };\n });\n\n // Sort by combined score\n scoredResults.sort((a, b) => b.combinedScore - a.combinedScore);\n\n const topResult = scoredResults[0];\n const secondScore = scoredResults.length > 1 ? scoredResults[1].combinedScore : null;\n\n // Classify confidence\n const confidence = this.classifyConfidence(topResult.combinedScore, secondScore);\n\n // Build match result\n const match: MemoryMatch = {\n event: {\n id: topResult.result.eventId,\n eventType: topResult.result.eventType as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: topResult.result.sessionId,\n timestamp: new Date(topResult.result.timestamp),\n content: topResult.result.content,\n canonicalKey: '', // Would need to be fetched\n dedupeKey: '' // Would need to be fetched\n },\n score: topResult.combinedScore\n };\n\n const gap = secondScore !== null ? topResult.combinedScore - secondScore : undefined;\n\n // Build alternatives for suggested matches\n const alternatives = confidence === 'suggested'\n ? scoredResults.slice(1, 4).map(sr => ({\n event: {\n id: sr.result.eventId,\n eventType: sr.result.eventType as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: sr.result.sessionId,\n timestamp: new Date(sr.result.timestamp),\n content: sr.result.content,\n canonicalKey: '',\n dedupeKey: ''\n },\n score: sr.combinedScore\n }))\n : undefined;\n\n return {\n match: confidence !== 'none' ? match : null,\n confidence,\n gap,\n alternatives\n };\n }\n\n /**\n * Calculate days between two dates\n */\n static calculateAgeDays(timestamp: Date): number {\n const now = new Date();\n const diffMs = now.getTime() - timestamp.getTime();\n return diffMs / (1000 * 60 * 60 * 24);\n }\n\n /**\n * Get current configuration\n */\n getConfig(): Readonly<MatcherConfig> {\n return { ...this.config };\n }\n}\n\n/**\n * Default matcher instance\n */\nlet defaultMatcher: Matcher | null = null;\n\nexport function getDefaultMatcher(): Matcher {\n if (!defaultMatcher) {\n defaultMatcher = new Matcher();\n }\n return defaultMatcher;\n}\n", "import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { MemoryEventInput } from './types.js';\n\nfunction sanitizeSegment(input: string | undefined, fallback: string): string {\n const v = (input || '').trim().toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/^-+|-+$/g, '');\n return v || fallback;\n}\n\nfunction getAtPath(obj: Record<string, unknown> | undefined, dotted: string): unknown {\n if (!obj) return undefined;\n return dotted.split('.').reduce<unknown>((acc, key) => {\n if (!acc || typeof acc !== 'object') return undefined;\n return (acc as Record<string, unknown>)[key];\n }, obj);\n}\n\nexport function buildMirrorPath(rootDir: string, event: MemoryEventInput): string {\n const meta = event.metadata as Record<string, unknown> | undefined;\n\n const namespaceRaw = getAtPath(meta, 'namespace') ?? getAtPath(meta, 'scope.namespace') ?? event.eventType;\n const namespace = sanitizeSegment(typeof namespaceRaw === 'string' ? namespaceRaw : undefined, 'general');\n\n const categoryRaw = getAtPath(meta, 'categoryPath') ?? getAtPath(meta, 'scope.categoryPath');\n const categoryPath = Array.isArray(categoryRaw) && categoryRaw.length > 0\n ? categoryRaw.map((x) => sanitizeSegment(typeof x === 'string' ? x : undefined, 'uncategorized'))\n : ['uncategorized'];\n\n const d = event.timestamp;\n const yyyy = d.getFullYear();\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const dd = String(d.getDate()).padStart(2, '0');\n\n return path.join(rootDir, 'memory', namespace, ...categoryPath, `${yyyy}-${mm}-${dd}.md`);\n}\n\nexport class MarkdownMirror {\n constructor(private readonly rootDir: string) {}\n\n async append(event: MemoryEventInput, eventId?: string): Promise<void> {\n const out = buildMirrorPath(this.rootDir, event);\n fs.mkdirSync(path.dirname(out), { recursive: true });\n\n const lines = [\n '',\n `## ${event.timestamp.toISOString()} | ${eventId ?? 'pending-id'}`,\n `- type: ${event.eventType}`,\n `- session: ${event.sessionId}`,\n event.content,\n ];\n\n await fs.promises.appendFile(out, lines.join('\\n'), 'utf8');\n await this.refreshIndex();\n }\n\n private async refreshIndex(): Promise<void> {\n const memoryRoot = path.join(this.rootDir, 'memory');\n await fs.promises.mkdir(memoryRoot, { recursive: true });\n\n const files: string[] = [];\n await this.walk(memoryRoot, files);\n\n const mdFiles = files\n .filter((f) => f.endsWith('.md'))\n .map((f) => path.relative(this.rootDir, f))\n .filter((rel) => rel !== path.join('memory', '_index.md'))\n .sort();\n\n const index = [\n '# Memory Index',\n '',\n 'Generated automatically by MarkdownMirror.',\n '',\n ...mdFiles.map((rel) => `- ${rel}`),\n '',\n ].join('\\n');\n\n await fs.promises.writeFile(path.join(memoryRoot, '_index.md'), index, 'utf8');\n }\n\n private async walk(dir: string, out: string[]): Promise<void> {\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n for (const e of entries) {\n const full = path.join(dir, e.name);\n if (e.isDirectory()) {\n await this.walk(full, out);\n } else {\n out.push(full);\n }\n }\n }\n}\n", "/**\n * SQLite-based EventStore implementation\n * Primary store for hooks - WAL mode enables concurrent access\n */\n\nimport { randomUUID } from 'crypto';\nimport {\n MemoryEvent,\n MemoryEventInput,\n Session,\n AppendResult,\n OutboxItem,\n OutboxStats,\n OutboxStatsOptions,\n OutboxRecoveryOptions,\n OutboxRecoveryResult,\n ProjectScopeRepairOptions,\n ProjectScopeRepairResult,\n ProjectScopeRepairSample\n} from './types.js';\nimport { makeCanonicalKey, makeDedupeKey } from './canonical-key.js';\nimport * as nodePath from 'path';\nimport { hashProjectPath } from './registry/project-path.js';\nimport {\n createSQLiteDatabase,\n sqliteRun,\n sqliteAll,\n sqliteGet,\n sqliteClose,\n sqliteExec,\n toDateFromSQLite,\n toSQLiteTimestamp,\n type SQLiteDatabase,\n type SQLiteOptions\n} from './sqlite-wrapper.js';\nimport { MarkdownMirror } from './markdown-mirror.js';\nimport { VectorOutbox, type OutboxConfig } from './vector-outbox.js';\nimport { normalizeRetrievalDebugLanes, type RetrievalDebugLane } from './retrieval-debug-lanes.js';\n\nexport interface SQLiteEventStoreOptions extends SQLiteOptions {\n markdownMirrorRoot?: string;\n vectorOutbox?: false | VectorOutbox | Partial<OutboxConfig>;\n}\n\ntype QueryRewriteKind = 'none' | 'follow-up-context' | 'intent-rewrite';\n\ntype RetrievalTraceDetailRecord = {\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n lanes?: RetrievalDebugLane[];\n};\n\nfunction normalizeRetrievalTraceDetails(details?: RetrievalTraceDetailRecord[]): RetrievalTraceDetailRecord[] {\n return (details || []).map((detail) => {\n const lanes = normalizeRetrievalDebugLanes((detail as { lanes?: unknown }).lanes);\n const normalized: RetrievalTraceDetailRecord = {\n eventId: detail.eventId,\n score: detail.score\n };\n if (detail.semanticScore !== undefined) normalized.semanticScore = detail.semanticScore;\n if (detail.lexicalScore !== undefined) normalized.lexicalScore = detail.lexicalScore;\n if (detail.recencyScore !== undefined) normalized.recencyScore = detail.recencyScore;\n if (lanes.length > 0) normalized.lanes = lanes;\n return normalized;\n });\n}\n\nfunction parseRetrievalTraceDetails(value: unknown): RetrievalTraceDetailRecord[] {\n if (typeof value !== 'string' || value.length === 0) return [];\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? normalizeRetrievalTraceDetails(parsed as RetrievalTraceDetailRecord[]) : [];\n}\n\nfunction normalizeQueryRewriteKind(value?: string | null): QueryRewriteKind {\n const normalized = (value || '').trim().toLowerCase();\n if (normalized === 'follow-up-context' || normalized === 'intent-rewrite') return normalized;\n return 'none';\n}\n\nconst REWRITTEN_QUERY_REWRITE_KIND_SQL = `LOWER(TRIM(COALESCE(query_rewrite_kind, 'none'))) IN ('follow-up-context', 'intent-rewrite')`;\nconst DEFAULT_OUTBOX_STUCK_THRESHOLD_MS = 5 * 60 * 1000;\nconst DEFAULT_OUTBOX_MAX_RETRIES = 3;\n\nfunction emptyOutboxRecoveryResult(): OutboxRecoveryResult {\n return {\n embedding: { recoveredProcessing: 0, retriedFailed: 0 },\n vector: { recoveredProcessing: 0, retriedFailed: 0 }\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction getNestedRecord(root: Record<string, unknown> | undefined, path: string[]): Record<string, unknown> | undefined {\n let cursor: unknown = root;\n for (const key of path) {\n if (!isRecord(cursor)) return undefined;\n cursor = cursor[key];\n }\n return isRecord(cursor) ? cursor : undefined;\n}\n\nfunction getNestedString(root: Record<string, unknown> | undefined, path: string[]): string | undefined {\n let cursor: unknown = root;\n for (const key of path) {\n if (!isRecord(cursor)) return undefined;\n cursor = cursor[key];\n }\n return typeof cursor === 'string' && cursor.length > 0 ? cursor : undefined;\n}\n\nfunction metadataProjectHash(metadata: Record<string, unknown> | undefined): string | undefined {\n return getNestedString(metadata, ['scope', 'project', 'hash']);\n}\n\nfunction metadataProjectPaths(metadata: Record<string, unknown> | undefined): string[] {\n const candidates = [\n getNestedString(metadata, ['projectPath']),\n getNestedString(metadata, ['sourceProjectPath']),\n getNestedString(metadata, ['scope', 'project', 'path'])\n ];\n const paths: string[] = [];\n for (const value of candidates) {\n if (value && !paths.includes(value)) paths.push(value);\n }\n return paths;\n}\n\nfunction metadataProjectPath(metadata: Record<string, unknown> | undefined): string | undefined {\n return metadataProjectPaths(metadata)[0];\n}\n\nfunction isActiveQuarantinedMetadata(metadata: Record<string, unknown> | undefined): boolean {\n const quarantine = getNestedRecord(metadata, ['quarantine']);\n return quarantine?.status === 'active';\n}\n\nfunction activeQuarantineStatusExpression(column = 'metadata'): string {\n return `COALESCE(json_extract(CASE WHEN json_valid(${column}) THEN ${column} ELSE '{}' END, '$.quarantine.status'), '')`;\n}\n\nfunction notActiveQuarantinedSql(column = 'metadata'): string {\n return `${activeQuarantineStatusExpression(column)} != 'active'`;\n}\n\ninterface QuarantineReadOptions {\n includeQuarantined?: boolean;\n}\n\nfunction maybeQuarantinePredicate(options?: QuarantineReadOptions, column = 'metadata'): string {\n return options?.includeQuarantined ? '1=1' : notActiveQuarantinedSql(column);\n}\n\nfunction safeParseMetadataValue(value: unknown): Record<string, unknown> | undefined {\n if (!value) return undefined;\n if (typeof value === 'object') return isRecord(value) ? value : undefined;\n if (typeof value !== 'string') return undefined;\n try {\n const parsed = JSON.parse(value);\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isImportedOrLegacyScopedMetadata(metadata: Record<string, unknown> | undefined): boolean {\n if (!metadata) return false;\n return Boolean(\n metadata.importedFrom\n || metadata.sourceSessionId\n || metadata.sourceSessionHash\n || metadata.hermesSource\n || metadata.projectPath\n || metadata.sourceProjectPath\n || metadata.source === 'hermes'\n || metadata.source === 'claude'\n || metadata.source === 'codex'\n );\n}\n\nfunction addMetadataTag(metadata: Record<string, unknown>, tag: string): void {\n const current = Array.isArray(metadata.tags)\n ? metadata.tags.filter((value): value is string => typeof value === 'string')\n : [];\n if (!current.includes(tag)) metadata.tags = [...current, tag];\n}\n\nfunction buildRepairResult(projectHash: string, dryRun: boolean): ProjectScopeRepairResult {\n return {\n dryRun,\n projectHash,\n scanned: 0,\n repaired: 0,\n quarantined: 0,\n alreadyScoped: 0,\n skipped: 0,\n samples: []\n };\n}\n\nfunction normalizeRepoName(value: string): string {\n return value.replace(/\\.git$/i, '').trim().toLowerCase();\n}\n\nfunction projectBasename(projectPath?: string): string | undefined {\n if (!projectPath) return undefined;\n const trimmed = projectPath.replace(/[\\\\/]+$/, '');\n const basename = nodePath.basename(trimmed);\n return basename ? normalizeRepoName(basename) : undefined;\n}\n\nfunction isProjectScopeRepairExplanation(content: string): boolean {\n const normalized = content.toLowerCase();\n const hasRepairContext = /project[- ]scope|mis[- ]scoped|quarantine|contamination|legacy|\uC624\uC5FC|\uACA9\uB9AC|repair/.test(normalized);\n const hasExplanationContext = /example|detector|trap|not a .*project task|\uAE30\uC5B5|\uBA54\uBAA8\uB9AC|\uC124\uBA85|\uC218\uC815|\uAC80\uC99D/.test(normalized);\n return hasRepairContext && hasExplanationContext;\n}\n\nfunction hasConflictingContentProjectHint(content: string, projectPath?: string): boolean {\n const currentName = projectBasename(projectPath);\n if (!currentName) return false;\n if (isProjectScopeRepairExplanation(content)) return false;\n\n const githubRepoPattern = /github\\.com[:/]([^/\\s`'\"#)]+)\\/([^/\\s`'\"#)]+)(?:\\.git)?/gi;\n let githubMatch: RegExpExecArray | null;\n while ((githubMatch = githubRepoPattern.exec(content)) !== null) {\n const repo = normalizeRepoName(githubMatch[2] || '');\n if (repo && repo !== currentName) return true;\n }\n\n const workspacePathPattern = /\\/workspace\\/([^/\\s`'\"#)]+)/gi;\n let workspaceMatch: RegExpExecArray | null;\n while ((workspaceMatch = workspacePathPattern.exec(content)) !== null) {\n const repo = normalizeRepoName(workspaceMatch[1] || '');\n if (repo && repo !== currentName) return true;\n }\n\n return false;\n}\n\nexport class SQLiteEventStore {\n private db: SQLiteDatabase;\n private initialized = false;\n private readonly readOnly: boolean;\n private readonly markdownMirror: MarkdownMirror | null;\n private readonly vectorOutbox: VectorOutbox | null;\n\n constructor(dbPath: string, options?: SQLiteEventStoreOptions) {\n this.readOnly = options?.readonly ?? false;\n this.db = createSQLiteDatabase(dbPath, {\n readonly: this.readOnly,\n walMode: !this.readOnly\n });\n this.markdownMirror = this.readOnly || !options?.markdownMirrorRoot\n ? null\n : new MarkdownMirror(options.markdownMirrorRoot);\n this.vectorOutbox = this.createVectorOutbox(options?.vectorOutbox);\n }\n\n private createVectorOutbox(option: SQLiteEventStoreOptions['vectorOutbox']): VectorOutbox | null {\n if (this.readOnly || option === false) return null;\n if (option instanceof VectorOutbox) return option;\n return new VectorOutbox(this.db, option ?? {});\n }\n\n private enqueueVectorOutboxEventSync(eventId: string): void {\n if (!this.vectorOutbox) return;\n this.vectorOutbox.enqueueSync('event', eventId);\n }\n\n private async enqueueVectorOutboxEvent(eventId: string): Promise<void> {\n this.enqueueVectorOutboxEventSync(eventId);\n }\n\n /**\n * Initialize database schema\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // In read-only mode, skip schema creation\n if (this.readOnly) {\n this.initialized = true;\n return;\n }\n\n // Create all tables in a single exec for efficiency\n sqliteExec(this.db, `\n -- L0 EventStore: Single Source of Truth (immutable, append-only)\n CREATE TABLE IF NOT EXISTS events (\n id TEXT PRIMARY KEY,\n event_type TEXT NOT NULL,\n session_id TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n content TEXT NOT NULL,\n canonical_key TEXT NOT NULL,\n dedupe_key TEXT UNIQUE,\n metadata TEXT,\n access_count INTEGER DEFAULT 0,\n last_accessed_at TEXT\n );\n\n -- Dedup table for idempotency\n CREATE TABLE IF NOT EXISTS event_dedup (\n dedupe_key TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Session metadata\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n started_at TEXT NOT NULL,\n ended_at TEXT,\n project_path TEXT,\n summary TEXT,\n tags TEXT\n );\n\n -- Insights (derived data, rebuildable)\n CREATE TABLE IF NOT EXISTS insights (\n id TEXT PRIMARY KEY,\n insight_type TEXT NOT NULL,\n content TEXT NOT NULL,\n canonical_key TEXT NOT NULL,\n confidence REAL,\n source_events TEXT,\n created_at TEXT,\n last_updated TEXT\n );\n\n -- Embedding Outbox (Single-Writer Pattern)\n CREATE TABLE IF NOT EXISTS embedding_outbox (\n id TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n content TEXT NOT NULL,\n status TEXT DEFAULT 'pending',\n retry_count INTEGER DEFAULT 0,\n created_at TEXT DEFAULT (datetime('now')),\n processed_at TEXT,\n error_message TEXT\n );\n\n -- Projection offset tracking\n CREATE TABLE IF NOT EXISTS projection_offsets (\n projection_name TEXT PRIMARY KEY,\n last_event_id TEXT,\n last_timestamp TEXT,\n updated_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Memory level tracking\n CREATE TABLE IF NOT EXISTS memory_levels (\n event_id TEXT PRIMARY KEY,\n level TEXT NOT NULL DEFAULT 'L0',\n promoted_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Entries (immutable memory units)\n CREATE TABLE IF NOT EXISTS entries (\n entry_id TEXT PRIMARY KEY,\n created_ts TEXT NOT NULL,\n entry_type TEXT NOT NULL,\n title TEXT NOT NULL,\n content_json TEXT NOT NULL,\n stage TEXT NOT NULL DEFAULT 'raw',\n status TEXT DEFAULT 'active',\n superseded_by TEXT,\n build_id TEXT,\n evidence_json TEXT,\n canonical_key TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Entities (task/condition/artifact)\n CREATE TABLE IF NOT EXISTS entities (\n entity_id TEXT PRIMARY KEY,\n entity_type TEXT NOT NULL,\n canonical_key TEXT NOT NULL,\n title TEXT NOT NULL,\n stage TEXT NOT NULL DEFAULT 'raw',\n status TEXT NOT NULL DEFAULT 'active',\n current_json TEXT NOT NULL,\n title_norm TEXT,\n search_text TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Entity aliases for canonical key lookup\n CREATE TABLE IF NOT EXISTS entity_aliases (\n entity_type TEXT NOT NULL,\n canonical_key TEXT NOT NULL,\n entity_id TEXT NOT NULL,\n is_primary INTEGER DEFAULT 0,\n created_at TEXT DEFAULT (datetime('now')),\n PRIMARY KEY(entity_type, canonical_key)\n );\n\n -- Edges (relationships between entries/entities)\n CREATE TABLE IF NOT EXISTS edges (\n edge_id TEXT PRIMARY KEY,\n src_type TEXT NOT NULL,\n src_id TEXT NOT NULL,\n rel_type TEXT NOT NULL,\n dst_type TEXT NOT NULL,\n dst_id TEXT NOT NULL,\n meta_json TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Vector Outbox V2 Table\n CREATE TABLE IF NOT EXISTS vector_outbox (\n job_id TEXT PRIMARY KEY,\n item_kind TEXT NOT NULL,\n item_id TEXT NOT NULL,\n embedding_version TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n retry_count INTEGER DEFAULT 0,\n error TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now')),\n UNIQUE(item_kind, item_id, embedding_version)\n );\n\n -- Build Runs\n CREATE TABLE IF NOT EXISTS build_runs (\n build_id TEXT PRIMARY KEY,\n started_at TEXT NOT NULL,\n finished_at TEXT,\n extractor_model TEXT NOT NULL,\n extractor_prompt_hash TEXT NOT NULL,\n embedder_model TEXT NOT NULL,\n embedding_version TEXT NOT NULL,\n idris_version TEXT NOT NULL,\n schema_version TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'running',\n error TEXT\n );\n\n -- Pipeline Metrics\n CREATE TABLE IF NOT EXISTS pipeline_metrics (\n id TEXT PRIMARY KEY,\n ts TEXT NOT NULL,\n stage TEXT NOT NULL,\n latency_ms REAL NOT NULL,\n success INTEGER NOT NULL,\n error TEXT,\n session_id TEXT\n );\n\n -- Working Set table (active memory window)\n CREATE TABLE IF NOT EXISTS working_set (\n id TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n added_at TEXT DEFAULT (datetime('now')),\n relevance_score REAL DEFAULT 1.0,\n topics TEXT,\n expires_at TEXT\n );\n\n -- Consolidated Memories table (long-term integrated memories)\n CREATE TABLE IF NOT EXISTS consolidated_memories (\n memory_id TEXT PRIMARY KEY,\n summary TEXT NOT NULL,\n topics TEXT,\n source_events TEXT,\n confidence REAL DEFAULT 0.5,\n created_at TEXT DEFAULT (datetime('now')),\n accessed_at TEXT,\n access_count INTEGER DEFAULT 0\n );\n\n -- Continuity Log table (tracks context transitions)\n CREATE TABLE IF NOT EXISTS continuity_log (\n log_id TEXT PRIMARY KEY,\n from_context_id TEXT,\n to_context_id TEXT,\n continuity_score REAL,\n transition_type TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Consolidated Rules table (long-term stable memory)\n CREATE TABLE IF NOT EXISTS consolidated_rules (\n rule_id TEXT PRIMARY KEY,\n rule TEXT NOT NULL,\n topics TEXT,\n source_memory_ids TEXT,\n source_events TEXT,\n confidence REAL DEFAULT 0.5,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Endless Mode Config table\n CREATE TABLE IF NOT EXISTS endless_config (\n key TEXT PRIMARY KEY,\n value TEXT,\n updated_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Memory Helpfulness tracking\n CREATE TABLE IF NOT EXISTS memory_helpfulness (\n id TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n retrieval_score REAL DEFAULT 0,\n query_preview TEXT,\n session_continued INTEGER DEFAULT 0,\n prompt_count_after INTEGER DEFAULT 0,\n tool_success_count INTEGER DEFAULT 0,\n tool_total_count INTEGER DEFAULT 0,\n was_reasked INTEGER DEFAULT 0,\n helpfulness_score REAL DEFAULT 0.5,\n created_at TEXT DEFAULT (datetime('now')),\n measured_at TEXT\n );\n\n -- Retrieval trace log (query -> candidates -> selected for context)\n CREATE TABLE IF NOT EXISTS retrieval_traces (\n trace_id TEXT PRIMARY KEY,\n session_id TEXT,\n project_hash TEXT,\n query_text TEXT NOT NULL,\n raw_query_text TEXT,\n query_rewrite_kind TEXT,\n strategy TEXT,\n candidate_event_ids TEXT,\n selected_event_ids TEXT,\n candidate_details_json TEXT,\n selected_details_json TEXT,\n candidate_count INTEGER DEFAULT 0,\n selected_count INTEGER DEFAULT 0,\n confidence TEXT,\n fallback_trace TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Sync position tracking (for SQLite -> DuckDB sync)\n CREATE TABLE IF NOT EXISTS sync_positions (\n target_name TEXT PRIMARY KEY,\n last_event_id TEXT,\n last_timestamp TEXT,\n updated_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Memory Operations: facet assignments (derived, rebuildable projection)\n CREATE TABLE IF NOT EXISTS memory_facets (\n id TEXT PRIMARY KEY,\n target_type TEXT NOT NULL,\n target_id TEXT NOT NULL,\n dimension TEXT NOT NULL,\n value TEXT NOT NULL,\n confidence REAL NOT NULL DEFAULT 1.0,\n source TEXT NOT NULL DEFAULT 'manual',\n evidence_event_ids TEXT NOT NULL DEFAULT '[]',\n project_hash TEXT NOT NULL DEFAULT '',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n UNIQUE(target_type, target_id, dimension, value, source, project_hash)\n );\n\n -- Memory Operations: operational action projection\n CREATE TABLE IF NOT EXISTS memory_actions (\n action_id TEXT PRIMARY KEY,\n project_hash TEXT NOT NULL,\n title TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n priority INTEGER NOT NULL DEFAULT 0,\n source_event_ids TEXT NOT NULL DEFAULT '[]',\n related_entity_ids TEXT NOT NULL DEFAULT '[]',\n current_checkpoint_id TEXT,\n lease_id TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n -- Memory Operations: action dependency/reference edges\n CREATE TABLE IF NOT EXISTS memory_action_edges (\n edge_id TEXT PRIMARY KEY,\n src_action_id TEXT NOT NULL,\n rel_type TEXT NOT NULL,\n dst_type TEXT NOT NULL,\n dst_id TEXT NOT NULL,\n confidence REAL NOT NULL DEFAULT 1.0,\n source TEXT NOT NULL DEFAULT 'manual',\n created_at TEXT NOT NULL,\n UNIQUE(src_action_id, rel_type, dst_type, dst_id, source)\n );\n\n -- Memory Operations: short-lived leases for operational work\n CREATE TABLE IF NOT EXISTS memory_leases (\n lease_id TEXT PRIMARY KEY,\n target_type TEXT NOT NULL,\n target_id TEXT NOT NULL,\n holder TEXT NOT NULL,\n expires_at TEXT NOT NULL,\n metadata_json TEXT,\n created_at TEXT NOT NULL,\n renewed_at TEXT,\n released_at TEXT\n );\n\n -- Memory Operations: resumable checkpoints for delegated or long-running work\n CREATE TABLE IF NOT EXISTS memory_checkpoints (\n checkpoint_id TEXT PRIMARY KEY,\n project_hash TEXT NOT NULL,\n action_id TEXT,\n session_id TEXT,\n title TEXT NOT NULL,\n summary TEXT NOT NULL,\n state_json TEXT NOT NULL,\n source_event_ids TEXT NOT NULL DEFAULT '[]',\n created_at TEXT NOT NULL,\n expires_at TEXT\n );\n\n -- Memory Operations: retention lifecycle score projection\n CREATE TABLE IF NOT EXISTS memory_retention_scores (\n score_id TEXT PRIMARY KEY,\n target_type TEXT NOT NULL,\n target_id TEXT NOT NULL,\n project_hash TEXT NOT NULL,\n policy_version TEXT NOT NULL,\n decision TEXT NOT NULL,\n lifecycle_score REAL NOT NULL,\n factors_json TEXT NOT NULL,\n reasons_json TEXT NOT NULL,\n dry_run_diff_json TEXT NOT NULL,\n source_event_ids TEXT NOT NULL DEFAULT '[]',\n evaluated_at TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n UNIQUE(target_type, target_id, project_hash, policy_version)\n );\n\n -- Memory Operations: procedural lessons derived from successful workflows\n CREATE TABLE IF NOT EXISTS memory_lessons (\n lesson_id TEXT PRIMARY KEY,\n project_hash TEXT NOT NULL DEFAULT '',\n name TEXT NOT NULL,\n trigger TEXT NOT NULL,\n steps_json TEXT NOT NULL,\n confidence REAL NOT NULL,\n source_session_ids TEXT NOT NULL DEFAULT '[]',\n source_event_ids TEXT NOT NULL DEFAULT '[]',\n failure_modes_json TEXT NOT NULL DEFAULT '[]',\n skill_candidate INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n UNIQUE(project_hash, name)\n );\n\n -- Perspective Memory: privacy-safe actors/peers\n CREATE TABLE IF NOT EXISTS memory_actors (\n actor_id TEXT PRIMARY KEY,\n project_hash TEXT NOT NULL DEFAULT '',\n kind TEXT NOT NULL,\n display_name TEXT NOT NULL,\n source TEXT NOT NULL,\n metadata_json TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n -- Perspective Memory: actors participating in a session and observation policy\n CREATE TABLE IF NOT EXISTS session_actors (\n project_hash TEXT NOT NULL DEFAULT '',\n session_id TEXT NOT NULL,\n actor_id TEXT NOT NULL,\n role_in_session TEXT NOT NULL,\n observe_self INTEGER NOT NULL DEFAULT 1,\n observe_others INTEGER NOT NULL DEFAULT 0,\n joined_at TEXT NOT NULL,\n left_at TEXT,\n metadata_json TEXT,\n PRIMARY KEY(project_hash, session_id, actor_id)\n );\n\n -- Perspective Memory: compact Honcho-style actor cards\n CREATE TABLE IF NOT EXISTS actor_cards (\n card_id TEXT PRIMARY KEY,\n project_hash TEXT NOT NULL DEFAULT '',\n observer_actor_id TEXT NOT NULL,\n observed_actor_id TEXT NOT NULL,\n entries_json TEXT NOT NULL,\n source_event_ids_json TEXT NOT NULL DEFAULT '[]',\n updated_by TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n UNIQUE(project_hash, observer_actor_id, observed_actor_id)\n );\n\n -- Perspective Memory: observer -> observed claims with evidence pointers\n CREATE TABLE IF NOT EXISTS perspective_observations (\n observation_id TEXT PRIMARY KEY,\n project_hash TEXT NOT NULL DEFAULT '',\n observer_actor_id TEXT NOT NULL,\n observed_actor_id TEXT NOT NULL,\n session_id TEXT,\n level TEXT NOT NULL,\n content TEXT NOT NULL,\n confidence REAL NOT NULL,\n source_event_ids_json TEXT NOT NULL DEFAULT '[]',\n source_observation_ids_json TEXT NOT NULL DEFAULT '[]',\n created_by TEXT NOT NULL,\n metadata_json TEXT,\n content_hash TEXT NOT NULL,\n source_hash TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n deleted_at TEXT,\n UNIQUE(project_hash, observer_actor_id, observed_actor_id, level, content_hash, source_hash)\n );\n\n -- Perspective Memory: FTS5 index for observation content queries.\n -- Use an external-content FTS table so the searchable projection stores the index,\n -- not a second raw copy of private observation text.\n CREATE VIRTUAL TABLE IF NOT EXISTS perspective_observations_fts USING fts5(\n content,\n observation_id UNINDEXED,\n content='perspective_observations',\n content_rowid='rowid',\n tokenize='porter unicode61'\n );\n\n -- Backfill the FTS table for writable legacy stores that predate the FTS projection.\n INSERT OR IGNORE INTO perspective_observations_fts(rowid, content, observation_id)\n SELECT rowid, content, observation_id FROM perspective_observations;\n\n CREATE TRIGGER IF NOT EXISTS perspective_observations_fts_insert AFTER INSERT ON perspective_observations BEGIN\n INSERT INTO perspective_observations_fts(rowid, content, observation_id) VALUES (NEW.rowid, NEW.content, NEW.observation_id);\n END;\n\n CREATE TRIGGER IF NOT EXISTS perspective_observations_fts_delete AFTER DELETE ON perspective_observations BEGIN\n INSERT INTO perspective_observations_fts(perspective_observations_fts, rowid, content, observation_id) VALUES('delete', OLD.rowid, OLD.content, OLD.observation_id);\n END;\n\n CREATE TRIGGER IF NOT EXISTS perspective_observations_fts_update AFTER UPDATE ON perspective_observations BEGIN\n INSERT INTO perspective_observations_fts(perspective_observations_fts, rowid, content, observation_id) VALUES('delete', OLD.rowid, OLD.content, OLD.observation_id);\n INSERT INTO perspective_observations_fts(rowid, content, observation_id) VALUES (NEW.rowid, NEW.content, NEW.observation_id);\n END;\n\n -- Memory Operations: governance/audit trail for state-changing operations\n CREATE TABLE IF NOT EXISTS memory_governance_audit (\n audit_id TEXT PRIMARY KEY,\n operation TEXT NOT NULL,\n actor TEXT NOT NULL,\n project_hash TEXT,\n target_type TEXT NOT NULL,\n target_id TEXT NOT NULL,\n before_json TEXT,\n after_json TEXT,\n source_event_ids TEXT NOT NULL DEFAULT '[]',\n created_at TEXT NOT NULL\n );\n\n -- Create indexes\n CREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id);\n CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);\n CREATE INDEX IF NOT EXISTS idx_entries_type ON entries(entry_type);\n CREATE INDEX IF NOT EXISTS idx_entries_stage ON entries(stage);\n CREATE INDEX IF NOT EXISTS idx_entries_canonical ON entries(canonical_key);\n CREATE INDEX IF NOT EXISTS idx_entities_type_key ON entities(entity_type, canonical_key);\n CREATE INDEX IF NOT EXISTS idx_entities_status ON entities(status);\n CREATE INDEX IF NOT EXISTS idx_edges_src ON edges(src_id, rel_type);\n CREATE INDEX IF NOT EXISTS idx_edges_dst ON edges(dst_id, rel_type);\n CREATE INDEX IF NOT EXISTS idx_edges_rel ON edges(rel_type);\n CREATE INDEX IF NOT EXISTS idx_outbox_status ON vector_outbox(status);\n CREATE INDEX IF NOT EXISTS idx_outbox_created ON vector_outbox(created_at);\n CREATE INDEX IF NOT EXISTS idx_working_set_expires ON working_set(expires_at);\n CREATE INDEX IF NOT EXISTS idx_working_set_relevance ON working_set(relevance_score);\n CREATE INDEX IF NOT EXISTS idx_consolidated_confidence ON consolidated_memories(confidence);\n CREATE INDEX IF NOT EXISTS idx_continuity_created ON continuity_log(created_at);\n CREATE INDEX IF NOT EXISTS idx_consolidated_rules_confidence ON consolidated_rules(confidence);\n CREATE INDEX IF NOT EXISTS idx_embedding_outbox_status ON embedding_outbox(status);\n CREATE INDEX IF NOT EXISTS idx_helpfulness_event ON memory_helpfulness(event_id);\n CREATE INDEX IF NOT EXISTS idx_helpfulness_session ON memory_helpfulness(session_id);\n CREATE INDEX IF NOT EXISTS idx_helpfulness_score ON memory_helpfulness(helpfulness_score DESC);\n CREATE INDEX IF NOT EXISTS idx_helpfulness_created_at ON memory_helpfulness(created_at);\n CREATE INDEX IF NOT EXISTS idx_helpfulness_measured_at ON memory_helpfulness(measured_at);\n CREATE INDEX IF NOT EXISTS idx_retrieval_traces_created_at ON retrieval_traces(created_at DESC);\n CREATE INDEX IF NOT EXISTS idx_retrieval_traces_project_hash ON retrieval_traces(project_hash);\n CREATE INDEX IF NOT EXISTS idx_retrieval_traces_session_id ON retrieval_traces(session_id);\n CREATE INDEX IF NOT EXISTS idx_memory_facets_project_dimension_value ON memory_facets(project_hash, dimension, value);\n CREATE INDEX IF NOT EXISTS idx_memory_facets_target ON memory_facets(target_type, target_id);\n CREATE INDEX IF NOT EXISTS idx_memory_facets_dimension_value_confidence ON memory_facets(dimension, value, confidence DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_actions_project_status_priority ON memory_actions(project_hash, status, priority DESC, updated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_action_edges_src ON memory_action_edges(src_action_id, rel_type);\n CREATE INDEX IF NOT EXISTS idx_memory_action_edges_dst ON memory_action_edges(dst_type, dst_id);\n CREATE INDEX IF NOT EXISTS idx_memory_leases_target_expires ON memory_leases(target_type, target_id, expires_at);\n CREATE INDEX IF NOT EXISTS idx_memory_checkpoints_project_action_created ON memory_checkpoints(project_hash, action_id, created_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_checkpoints_project_session_created ON memory_checkpoints(project_hash, session_id, created_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_retention_scores_project_decision_score ON memory_retention_scores(project_hash, decision, lifecycle_score ASC, evaluated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_retention_scores_target ON memory_retention_scores(target_type, target_id, project_hash);\n CREATE INDEX IF NOT EXISTS idx_memory_retention_scores_policy_evaluated ON memory_retention_scores(policy_version, evaluated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_lessons_project_confidence ON memory_lessons(project_hash, confidence DESC, updated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_lessons_skill_candidate ON memory_lessons(project_hash, skill_candidate, confidence DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_lessons_updated ON memory_lessons(updated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_actors_project_kind ON memory_actors(project_hash, kind, updated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_actors_source ON memory_actors(source, kind);\n CREATE INDEX IF NOT EXISTS idx_session_actors_session ON session_actors(project_hash, session_id, role_in_session);\n CREATE INDEX IF NOT EXISTS idx_session_actors_actor ON session_actors(actor_id, project_hash, session_id);\n CREATE INDEX IF NOT EXISTS idx_actor_cards_perspective ON actor_cards(project_hash, observer_actor_id, observed_actor_id);\n CREATE INDEX IF NOT EXISTS idx_actor_cards_updated ON actor_cards(updated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_perspective_observations_perspective_level ON perspective_observations(project_hash, observer_actor_id, observed_actor_id, level, confidence DESC, updated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_perspective_observations_session ON perspective_observations(project_hash, session_id, level, updated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_perspective_observations_source_hash ON perspective_observations(project_hash, source_hash);\n CREATE INDEX IF NOT EXISTS idx_perspective_observations_deleted ON perspective_observations(deleted_at);\n CREATE INDEX IF NOT EXISTS idx_memory_governance_audit_project_operation ON memory_governance_audit(project_hash, operation, created_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_governance_audit_target ON memory_governance_audit(target_type, target_id, created_at DESC);\n\n -- FTS5 Full-Text Search for fast keyword search\n CREATE VIRTUAL TABLE IF NOT EXISTS events_fts USING fts5(\n content,\n event_id UNINDEXED,\n tokenize='porter unicode61'\n );\n\n -- Triggers to keep FTS in sync with events table\n CREATE TRIGGER IF NOT EXISTS events_fts_insert AFTER INSERT ON events BEGIN\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END;\n\n CREATE TRIGGER IF NOT EXISTS events_fts_delete AFTER DELETE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n END;\n\n CREATE TRIGGER IF NOT EXISTS events_fts_update AFTER UPDATE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END;\n `);\n\n\n // Best-effort forward migration for action edge source ownership\n try {\n sqliteExec(this.db, `ALTER TABLE memory_action_edges ADD COLUMN source TEXT NOT NULL DEFAULT 'manual';`);\n } catch {\n // column may already exist\n }\n try {\n const edgeIndexes = sqliteAll<{ name: string; unique: number }>(this.db, `PRAGMA index_list(memory_action_edges)`, []);\n const hasSourceAwareUnique = edgeIndexes.some((index) => {\n if (Number(index.unique) !== 1) return false;\n if (!/^[A-Za-z0-9_]+$/.test(index.name)) return false;\n const escapedName = index.name.replace(/\"/g, '\"\"');\n const columns = sqliteAll<{ name: string }>(this.db, 'PRAGMA index_info(\"' + escapedName + '\")', [])\n .map((column) => column.name);\n return columns.length === 5\n && columns[0] === 'src_action_id'\n && columns[1] === 'rel_type'\n && columns[2] === 'dst_type'\n && columns[3] === 'dst_id'\n && columns[4] === 'source';\n });\n if (!hasSourceAwareUnique) {\n sqliteExec(this.db, `\n DROP TABLE IF EXISTS memory_action_edges_v2;\n CREATE TABLE memory_action_edges_v2 (\n edge_id TEXT PRIMARY KEY,\n src_action_id TEXT NOT NULL,\n rel_type TEXT NOT NULL,\n dst_type TEXT NOT NULL,\n dst_id TEXT NOT NULL,\n confidence REAL NOT NULL DEFAULT 1.0,\n source TEXT NOT NULL DEFAULT 'manual',\n created_at TEXT NOT NULL,\n UNIQUE(src_action_id, rel_type, dst_type, dst_id, source)\n );\n INSERT OR IGNORE INTO memory_action_edges_v2 (\n edge_id, src_action_id, rel_type, dst_type, dst_id, confidence, source, created_at\n )\n SELECT edge_id, src_action_id, rel_type, dst_type, dst_id, confidence, source, created_at\n FROM memory_action_edges;\n DROP TABLE memory_action_edges;\n ALTER TABLE memory_action_edges_v2 RENAME TO memory_action_edges;\n CREATE INDEX IF NOT EXISTS idx_memory_action_edges_src ON memory_action_edges(src_action_id, rel_type);\n CREATE INDEX IF NOT EXISTS idx_memory_action_edges_dst ON memory_action_edges(dst_type, dst_id);\n `);\n }\n } catch {\n // action edge table may not exist in partial migrations\n }\n\n // Best-effort forward migration for retrieval trace detail column\n try {\n sqliteExec(this.db, `ALTER TABLE retrieval_traces ADD COLUMN selected_details_json TEXT;`);\n } catch {\n // column may already exist\n }\n try {\n sqliteExec(this.db, `ALTER TABLE retrieval_traces ADD COLUMN candidate_details_json TEXT;`);\n } catch {\n // column may already exist\n }\n try {\n sqliteExec(this.db, `ALTER TABLE retrieval_traces ADD COLUMN raw_query_text TEXT;`);\n } catch {\n // column may already exist\n }\n try {\n sqliteExec(this.db, `ALTER TABLE retrieval_traces ADD COLUMN query_rewrite_kind TEXT;`);\n } catch {\n // column may already exist\n }\n try {\n sqliteExec(this.db, `CREATE INDEX IF NOT EXISTS idx_retrieval_traces_query_rewrite_kind ON retrieval_traces(query_rewrite_kind);`);\n } catch {\n // index/table may not exist in partial migrations\n }\n\n // Migrate existing events table to add new columns if they don't exist\n // Check if columns exist before trying to add them\n const tableInfo = sqliteAll(this.db, \"PRAGMA table_info(events)\", []);\n const columnNames = tableInfo.map((col: any) => col.name);\n\n if (!columnNames.includes('access_count')) {\n try {\n sqliteExec(this.db, `\n ALTER TABLE events ADD COLUMN access_count INTEGER DEFAULT 0;\n `);\n } catch (err: any) {\n console.error('Error adding access_count column:', err);\n }\n }\n\n if (!columnNames.includes('last_accessed_at')) {\n try {\n sqliteExec(this.db, `\n ALTER TABLE events ADD COLUMN last_accessed_at TEXT;\n `);\n } catch (err: any) {\n console.error('Error adding last_accessed_at column:', err);\n }\n }\n\n // Add turn_id column for grouping events within a conversation turn\n if (!columnNames.includes('turn_id')) {\n try {\n sqliteExec(this.db, `\n ALTER TABLE events ADD COLUMN turn_id TEXT;\n `);\n } catch (err: any) {\n console.error('Error adding turn_id column:', err);\n }\n }\n\n // Create indexes for new columns if they don't exist\n try {\n sqliteExec(this.db, `\n CREATE INDEX IF NOT EXISTS idx_events_access_count ON events(access_count DESC);\n `);\n } catch (err: any) {\n // Index may already exist, ignore\n }\n\n try {\n sqliteExec(this.db, `\n CREATE INDEX IF NOT EXISTS idx_events_last_accessed ON events(last_accessed_at DESC);\n `);\n } catch (err: any) {\n // Index may already exist, ignore\n }\n\n try {\n sqliteExec(this.db, `\n CREATE INDEX IF NOT EXISTS idx_events_turn_id ON events(turn_id);\n `);\n } catch (err: any) {\n // Index may already exist, ignore\n }\n\n this.initialized = true;\n }\n\n /**\n * Append event to store (Append-only, Idempotent)\n */\n async append(input: MemoryEventInput): Promise<AppendResult> {\n await this.initialize();\n\n const canonicalKey = makeCanonicalKey(input.content);\n const dedupeKey = makeDedupeKey(input.content, input.sessionId);\n\n // Check for duplicate\n const existing = sqliteGet<{ event_id: string }>(\n this.db,\n `SELECT event_id FROM event_dedup WHERE dedupe_key = ?`,\n [dedupeKey]\n );\n\n if (existing) {\n try {\n await this.enqueueVectorOutboxEvent(existing.event_id);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n return {\n success: true,\n eventId: existing.event_id,\n isDuplicate: true\n };\n }\n\n const id = randomUUID();\n const timestamp = toSQLiteTimestamp(input.timestamp);\n\n try {\n // Extract turnId from metadata if present\n const metadata = input.metadata || {};\n const turnId = (metadata.turnId as string) || null;\n\n // Use transaction for atomicity\n const insertEvent = this.db.prepare(`\n INSERT INTO events (id, event_type, session_id, timestamp, content, canonical_key, dedupe_key, metadata, turn_id)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const insertDedup = this.db.prepare(`\n INSERT INTO event_dedup (dedupe_key, event_id) VALUES (?, ?)\n `);\n\n const insertLevel = this.db.prepare(`\n INSERT INTO memory_levels (event_id, level) VALUES (?, 'L0')\n `);\n\n const transaction = this.db.transaction(() => {\n insertEvent.run(\n id,\n input.eventType,\n input.sessionId,\n timestamp,\n input.content,\n canonicalKey,\n dedupeKey,\n JSON.stringify(metadata),\n turnId\n );\n insertDedup.run(dedupeKey, id);\n insertLevel.run(id);\n this.enqueueVectorOutboxEventSync(id);\n });\n\n transaction();\n\n if (this.markdownMirror) {\n const event: MemoryEvent = {\n id,\n eventType: input.eventType,\n sessionId: input.sessionId,\n timestamp: input.timestamp,\n content: input.content,\n canonicalKey,\n dedupeKey,\n metadata\n };\n this.markdownMirror.append(event).catch((err) => {\n console.warn('[SQLiteEventStore] markdown mirror append failed:', err);\n });\n }\n\n return { success: true, eventId: id, isDuplicate: false };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Get session IDs that have events but no session_summary event.\n * Used to backfill summaries for sessions that ended without Stop hook.\n */\n async getSessionsWithoutSummary(currentSessionId: string, limit = 5): Promise<string[]> {\n await this.initialize();\n const rows = sqliteAll<{ session_id: string }>(\n this.db,\n `SELECT DISTINCT e.session_id\n FROM events e\n WHERE e.session_id != ?\n AND e.event_type != 'session_summary'\n AND e.session_id NOT IN (\n SELECT DISTINCT session_id FROM events WHERE event_type = 'session_summary'\n )\n GROUP BY e.session_id\n HAVING COUNT(*) >= 3\n ORDER BY MAX(e.timestamp) DESC\n LIMIT ?`,\n [currentSessionId, limit]\n );\n return rows.map((r) => r.session_id);\n }\n\n /**\n * Get events by session ID\n */\n async getSessionEvents(sessionId: string, options?: QuarantineReadOptions): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE session_id = ? AND ${maybeQuarantinePredicate(options)} ORDER BY timestamp ASC`,\n [sessionId]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Get recent events\n */\n async getRecentEvents(limit: number = 100, options?: QuarantineReadOptions): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE ${maybeQuarantinePredicate(options)} ORDER BY timestamp DESC LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Get event by ID\n */\n async getEvent(id: string, options?: QuarantineReadOptions): Promise<MemoryEvent | null> {\n await this.initialize();\n\n const row = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE id = ? AND ${maybeQuarantinePredicate(options)}`,\n [id]\n );\n\n if (!row) return null;\n return this.rowToEvent(row);\n }\n\n /**\n * Get events since a timestamp (for sync)\n */\n async getEventsSince(timestamp: string, limit: number = 1000, options?: QuarantineReadOptions): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE timestamp > ? AND ${maybeQuarantinePredicate(options)} ORDER BY timestamp ASC LIMIT ?`,\n [timestamp, limit]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Get events since a SQLite rowid (for robust incremental replication).\n * Rowid is monotonic for append-only tables, independent of client timestamps.\n */\n async getEventsSinceRowid(\n lastRowid: number,\n limit: number = 1000,\n options?: QuarantineReadOptions\n ): Promise<Array<{ rowid: number; event: MemoryEvent }>> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT rowid as _rowid, * FROM events WHERE rowid > ? AND ${maybeQuarantinePredicate(options)} ORDER BY rowid ASC LIMIT ?`,\n [lastRowid, limit]\n );\n\n return rows.map(row => ({\n rowid: row._rowid as number,\n event: this.rowToEvent(row)\n }));\n }\n\n /**\n * Import events with fixed IDs (used for cross-machine replication).\n * Idempotent: skips if event id or dedupeKey already exists.\n *\n * NOTE: This bypasses the append() id generation to preserve stable IDs.\n */\n async importEvents(events: MemoryEvent[]): Promise<{ inserted: number; skipped: number }> {\n if (events.length === 0) return { inserted: 0, skipped: 0 };\n if (this.readOnly) return { inserted: 0, skipped: events.length };\n\n await this.initialize();\n\n const getById = this.db.prepare(`SELECT id FROM events WHERE id = ?`);\n const getByDedupe = this.db.prepare(`SELECT event_id FROM event_dedup WHERE dedupe_key = ?`);\n\n const insertEvent = this.db.prepare(`\n INSERT INTO events (id, event_type, session_id, timestamp, content, canonical_key, dedupe_key, metadata, turn_id)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const insertDedup = this.db.prepare(`\n INSERT INTO event_dedup (dedupe_key, event_id) VALUES (?, ?)\n `);\n\n const insertLevel = this.db.prepare(`\n INSERT INTO memory_levels (event_id, level) VALUES (?, 'L0')\n `);\n\n let inserted = 0;\n let skipped = 0;\n const insertedEvents: MemoryEvent[] = [];\n\n const tx = this.db.transaction((batch: MemoryEvent[]) => {\n for (const ev of batch) {\n // Skip if already present by id\n const existingById = getById.get(ev.id) as { id: string } | undefined;\n if (existingById) {\n skipped++;\n continue;\n }\n\n const canonicalKey = ev.canonicalKey || makeCanonicalKey(ev.content);\n const dedupeKey = ev.dedupeKey || makeDedupeKey(ev.content, ev.sessionId);\n\n // Skip if already present by dedupe key\n const existingByDedupe = getByDedupe.get(dedupeKey) as { event_id: string } | undefined;\n if (existingByDedupe) {\n skipped++;\n continue;\n }\n\n const metadata = ev.metadata || {};\n const turnId = (metadata as any).turnId as string | undefined;\n\n insertEvent.run(\n ev.id,\n ev.eventType,\n ev.sessionId,\n toSQLiteTimestamp(ev.timestamp),\n ev.content,\n canonicalKey,\n dedupeKey,\n JSON.stringify(metadata),\n turnId ?? null\n );\n\n insertDedup.run(dedupeKey, ev.id);\n insertLevel.run(ev.id);\n this.enqueueVectorOutboxEventSync(ev.id);\n inserted++;\n insertedEvents.push(ev);\n }\n });\n\n tx(events);\n\n if (this.markdownMirror && insertedEvents.length > 0) {\n for (const ev of insertedEvents) {\n this.markdownMirror.append(ev).catch((err) => {\n console.warn('[SQLiteEventStore] markdown mirror append failed:', err);\n });\n }\n }\n\n return { inserted, skipped };\n }\n\n /**\n * Create or update session\n */\n async upsertSession(session: Partial<Session> & { id: string }): Promise<void> {\n await this.initialize();\n\n const existing = sqliteGet<{ id: string }>(\n this.db,\n `SELECT id FROM sessions WHERE id = ?`,\n [session.id]\n );\n\n if (!existing) {\n sqliteRun(\n this.db,\n `INSERT INTO sessions (id, started_at, project_path, tags)\n VALUES (?, ?, ?, ?)`,\n [\n session.id,\n toSQLiteTimestamp(session.startedAt || new Date()),\n session.projectPath || null,\n JSON.stringify(session.tags || [])\n ]\n );\n } else {\n const updates: string[] = [];\n const values: unknown[] = [];\n\n if (session.endedAt) {\n updates.push('ended_at = ?');\n values.push(toSQLiteTimestamp(session.endedAt));\n }\n if (session.summary) {\n updates.push('summary = ?');\n values.push(session.summary);\n }\n if (session.tags) {\n updates.push('tags = ?');\n values.push(JSON.stringify(session.tags));\n }\n\n if (updates.length > 0) {\n values.push(session.id);\n sqliteRun(\n this.db,\n `UPDATE sessions SET ${updates.join(', ')} WHERE id = ?`,\n values\n );\n }\n }\n }\n\n /**\n * Get session by ID\n */\n async getSession(id: string): Promise<Session | null> {\n await this.initialize();\n\n const row = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT * FROM sessions WHERE id = ?`,\n [id]\n );\n\n if (!row) return null;\n\n return {\n id: row.id as string,\n startedAt: toDateFromSQLite(row.started_at),\n endedAt: row.ended_at ? toDateFromSQLite(row.ended_at) : undefined,\n projectPath: row.project_path as string | undefined,\n summary: row.summary as string | undefined,\n tags: row.tags ? JSON.parse(row.tags as string) : undefined\n };\n }\n\n /**\n * Get all sessions\n */\n async getAllSessions(): Promise<Session[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM sessions ORDER BY started_at DESC`\n );\n\n return rows.map(row => ({\n id: row.id as string,\n startedAt: toDateFromSQLite(row.started_at),\n endedAt: row.ended_at ? toDateFromSQLite(row.ended_at) : undefined,\n projectPath: row.project_path as string | undefined,\n summary: row.summary as string | undefined,\n tags: row.tags ? JSON.parse(row.tags as string) : undefined\n }));\n }\n\n /**\n * Add to embedding outbox\n */\n async enqueueForEmbedding(eventId: string, content: string): Promise<string> {\n await this.initialize();\n\n const id = randomUUID();\n sqliteRun(\n this.db,\n `INSERT INTO embedding_outbox (id, event_id, content, status, retry_count)\n VALUES (?, ?, ?, 'pending', 0)`,\n [id, eventId, content]\n );\n\n return id;\n }\n\n /**\n * Get pending outbox items\n */\n async getPendingOutboxItems(limit: number = 32): Promise<OutboxItem[]> {\n await this.initialize();\n\n const pending = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM embedding_outbox\n WHERE status = 'pending'\n ORDER BY created_at\n LIMIT ?`,\n [limit]\n );\n\n if (pending.length === 0) return [];\n\n // Update status to processing and stamp the claim time so abandoned workers can be recovered safely.\n const ids = pending.map(r => r.id as string);\n const placeholders = ids.map(() => '?').join(',');\n sqliteRun(\n this.db,\n `UPDATE embedding_outbox\n SET status = 'processing', processed_at = datetime('now'), error_message = NULL\n WHERE id IN (${placeholders})`,\n ids\n );\n\n return pending.map(row => ({\n id: row.id as string,\n eventId: row.event_id as string,\n content: row.content as string,\n status: 'processing' as const,\n retryCount: row.retry_count as number,\n createdAt: toDateFromSQLite(row.created_at),\n errorMessage: row.error_message as string | undefined\n }));\n }\n\n /**\n * Mark outbox items as done\n */\n async completeOutboxItems(ids: string[]): Promise<void> {\n if (ids.length === 0) return;\n\n const placeholders = ids.map(() => '?').join(',');\n sqliteRun(\n this.db,\n `DELETE FROM embedding_outbox WHERE id IN (${placeholders})`,\n ids\n );\n }\n\n /**\n * Clear embedding outbox (used for embedding model migration)\n */\n async clearEmbeddingOutbox(): Promise<void> {\n await this.initialize();\n sqliteRun(this.db, `DELETE FROM embedding_outbox`);\n }\n\n /**\n * Count total events\n */\n async countEvents(options?: QuarantineReadOptions): Promise<number> {\n await this.initialize();\n const row = sqliteGet<{ count: number }>(this.db, `SELECT COUNT(*) as count FROM events WHERE ${maybeQuarantinePredicate(options)}`);\n return row?.count || 0;\n }\n\n /**\n * Get events page in timestamp ascending order (stable migration/reindex scans)\n */\n async getEventsPage(limit: number = 1000, offset: number = 0, options?: QuarantineReadOptions): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE ${maybeQuarantinePredicate(options)} ORDER BY timestamp ASC LIMIT ? OFFSET ?`,\n [limit, offset]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Mark outbox items as failed\n */\n async failOutboxItems(ids: string[], error: string): Promise<void> {\n if (ids.length === 0) return;\n\n const placeholders = ids.map(() => '?').join(',');\n sqliteRun(\n this.db,\n `UPDATE embedding_outbox\n SET status = CASE WHEN retry_count >= 3 THEN 'failed' ELSE 'pending' END,\n retry_count = retry_count + 1,\n error_message = ?\n WHERE id IN (${placeholders})`,\n [error, ...ids]\n );\n }\n\n /**\n * Recover abandoned outbox work after a worker/process crash.\n *\n * Rows in `processing` are claimed work. If the process exits before marking\n * them done/failed, they otherwise remain invisible to future processing.\n * Recovery is deliberately age-gated so an active worker is not disturbed.\n */\n async recoverStuckOutboxItems(options: OutboxRecoveryOptions = {}): Promise<OutboxRecoveryResult> {\n await this.initialize();\n\n const thresholdMs = Number.isFinite(options.stuckThresholdMs) && (options.stuckThresholdMs ?? 0) >= 0\n ? options.stuckThresholdMs!\n : DEFAULT_OUTBOX_STUCK_THRESHOLD_MS;\n const maxRetries = Number.isFinite(options.maxRetries) && (options.maxRetries ?? 0) > 0\n ? options.maxRetries!\n : DEFAULT_OUTBOX_MAX_RETRIES;\n const now = options.now ?? new Date();\n const threshold = new Date(now.getTime() - thresholdMs).toISOString();\n const result = emptyOutboxRecoveryResult();\n\n if (options.dryRun === true) {\n const embeddingRecovered = sqliteGet<{ count: number }>(\n this.db,\n `SELECT COUNT(*) AS count FROM embedding_outbox\n WHERE status = 'processing'\n AND datetime(COALESCE(processed_at, created_at)) < datetime(?)`,\n [threshold]\n );\n result.embedding.recoveredProcessing = Number(embeddingRecovered?.count ?? 0);\n\n const embeddingRetried = sqliteGet<{ count: number }>(\n this.db,\n `SELECT COUNT(*) AS count FROM embedding_outbox\n WHERE status = 'failed'\n AND retry_count < ?`,\n [maxRetries]\n );\n result.embedding.retriedFailed = Number(embeddingRetried?.count ?? 0);\n\n const vectorRecovered = sqliteGet<{ count: number }>(\n this.db,\n `SELECT COUNT(*) AS count FROM vector_outbox\n WHERE status = 'processing'\n AND datetime(updated_at) < datetime(?)`,\n [threshold]\n );\n result.vector.recoveredProcessing = Number(vectorRecovered?.count ?? 0);\n\n const vectorRetried = sqliteGet<{ count: number }>(\n this.db,\n `SELECT COUNT(*) AS count FROM vector_outbox\n WHERE status = 'failed'\n AND retry_count < ?`,\n [maxRetries]\n );\n result.vector.retriedFailed = Number(vectorRetried?.count ?? 0);\n\n return result;\n }\n\n const embeddingRecovered = sqliteRun(\n this.db,\n `UPDATE embedding_outbox\n SET status = 'pending', processed_at = NULL, error_message = NULL\n WHERE status = 'processing'\n AND datetime(COALESCE(processed_at, created_at)) < datetime(?)`,\n [threshold]\n );\n result.embedding.recoveredProcessing = Number(embeddingRecovered.changes ?? 0);\n\n const embeddingRetried = sqliteRun(\n this.db,\n `UPDATE embedding_outbox\n SET status = 'pending', error_message = NULL\n WHERE status = 'failed'\n AND retry_count < ?`,\n [maxRetries]\n );\n result.embedding.retriedFailed = Number(embeddingRetried.changes ?? 0);\n\n const vectorRecovered = sqliteRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'pending', updated_at = ?, error = NULL\n WHERE status = 'processing'\n AND datetime(updated_at) < datetime(?)`,\n [now.toISOString(), threshold]\n );\n result.vector.recoveredProcessing = Number(vectorRecovered.changes ?? 0);\n\n const vectorRetried = sqliteRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'pending', updated_at = ?, error = NULL\n WHERE status = 'failed'\n AND retry_count < ?`,\n [now.toISOString(), maxRetries]\n );\n result.vector.retriedFailed = Number(vectorRetried.changes ?? 0);\n\n return result;\n }\n\n\n /**\n * Repair legacy imported events that predate canonical project scope metadata.\n *\n * Same-project legacy rows are tagged with scope.project.hash. Rows that look\n * imported but cannot be proven to belong to this project are quarantined so\n * dashboard default reads/search do not surface cross-project contamination.\n */\n async repairLegacyProjectScope(options: ProjectScopeRepairOptions = {}): Promise<ProjectScopeRepairResult> {\n await this.initialize();\n\n const projectHash = options.projectHash || (options.projectPath ? hashProjectPath(options.projectPath) : undefined);\n if (!projectHash) {\n throw new Error('repairLegacyProjectScope requires projectPath or projectHash');\n }\n if (options.projectPath && options.projectHash && hashProjectPath(options.projectPath) !== options.projectHash) {\n throw new Error('repairLegacyProjectScope projectPath and projectHash refer to different project stores');\n }\n\n const dryRun = options.dryRun === true;\n const nowIso = (options.now || new Date()).toISOString();\n const result = buildRepairResult(projectHash, dryRun);\n\n const rows = sqliteAll<{\n id: string;\n content: string;\n metadata: string | null;\n session_project_path: string | null;\n }>(\n this.db,\n `SELECT e.id, e.content, e.metadata, s.project_path as session_project_path\n FROM events e\n LEFT JOIN sessions s ON s.id = e.session_id\n ORDER BY e.timestamp ASC`,\n []\n );\n\n const sample = (entry: ProjectScopeRepairSample) => {\n if (result.samples.length < 20) result.samples.push(entry);\n };\n\n for (const row of rows) {\n result.scanned++;\n\n let metadata: Record<string, unknown> = {};\n let metadataParseInvalid = false;\n if (row.metadata) {\n const parsed = safeParseMetadataValue(row.metadata);\n if (parsed) {\n metadata = parsed;\n } else {\n metadataParseInvalid = true;\n }\n }\n\n if (isActiveQuarantinedMetadata(metadata)) {\n result.skipped++;\n continue;\n }\n\n const currentHash = metadataProjectHash(metadata);\n const explicitPath = metadataProjectPath(metadata);\n const sessionProjectPath = typeof row.session_project_path === 'string' && row.session_project_path.length > 0\n ? row.session_project_path\n : undefined;\n const candidatePaths = metadataProjectPaths(metadata);\n if (sessionProjectPath && !candidatePaths.includes(sessionProjectPath)) {\n candidatePaths.push(sessionProjectPath);\n }\n const importedOrLegacy = metadataParseInvalid || isImportedOrLegacyScopedMetadata(metadata) || Boolean(sessionProjectPath);\n const pathHashes = candidatePaths.map((candidate) => {\n try {\n return { path: candidate, hash: hashProjectPath(candidate) };\n } catch {\n return { path: candidate, hash: undefined };\n }\n });\n const matchingPath = pathHashes.find((candidate) => candidate.hash === projectHash);\n const foreignPath = pathHashes.find((candidate) => candidate.hash && candidate.hash !== projectHash);\n\n let action: 'repaired' | 'quarantined' | 'skipped' = 'skipped';\n let reason: ProjectScopeRepairSample['reason'] | undefined;\n let observedProjectHash: string | undefined;\n\n if (foreignPath) {\n action = 'quarantined';\n reason = 'project-path-mismatch';\n observedProjectHash = foreignPath.hash;\n } else if (currentHash === projectHash && importedOrLegacy && hasConflictingContentProjectHint(row.content, options.projectPath)) {\n action = 'quarantined';\n reason = 'content-project-mismatch';\n } else if (currentHash === projectHash) {\n result.alreadyScoped++;\n continue;\n } else if (currentHash && currentHash !== projectHash) {\n action = 'quarantined';\n reason = 'scope-hash-mismatch';\n observedProjectHash = currentHash;\n } else if (matchingPath) {\n action = 'repaired';\n reason = matchingPath.path === sessionProjectPath && matchingPath.path !== explicitPath\n ? 'session-project-path'\n : 'same-project-path';\n } else if (candidatePaths.length > 0) {\n action = 'quarantined';\n reason = 'project-path-mismatch';\n } else if (importedOrLegacy) {\n action = 'quarantined';\n reason = 'missing-project-scope';\n }\n\n if (action === 'skipped' || !reason) {\n result.skipped++;\n continue;\n }\n\n if (action === 'repaired') {\n const scope = isRecord(metadata.scope) ? { ...metadata.scope } : {};\n const project = isRecord(scope.project) ? { ...scope.project } : {};\n project.hash = projectHash;\n scope.project = project;\n metadata.scope = scope;\n metadata.repair = {\n ...(isRecord(metadata.repair) ? metadata.repair : {}),\n legacyProjectScope: {\n action,\n reason,\n repairedAt: nowIso\n }\n };\n addMetadataTag(metadata, `proj:${projectHash}`);\n result.repaired++;\n } else {\n metadata.quarantine = {\n ...(isRecord(metadata.quarantine) ? metadata.quarantine : {}),\n status: 'active',\n category: 'project-scope',\n reason,\n detectedAt: nowIso,\n expectedProjectHash: projectHash,\n ...(observedProjectHash ? { observedProjectHash } : {})\n };\n metadata.repair = {\n ...(isRecord(metadata.repair) ? metadata.repair : {}),\n legacyProjectScope: {\n action,\n reason,\n repairedAt: nowIso\n }\n };\n addMetadataTag(metadata, 'quarantine:project-scope');\n result.quarantined++;\n }\n\n sample({ eventId: row.id, action, reason });\n if (!dryRun) {\n sqliteRun(this.db, `UPDATE events SET metadata = ? WHERE id = ?`, [JSON.stringify(metadata), row.id]);\n }\n }\n\n return result;\n }\n\n /**\n * Get embedding/vector outbox health statistics\n */\n async getOutboxStats(options: OutboxStatsOptions = {}): Promise<OutboxStats> {\n await this.initialize();\n\n const thresholdMs = Number.isFinite(options.stuckThresholdMs) && (options.stuckThresholdMs ?? 0) >= 0\n ? options.stuckThresholdMs!\n : DEFAULT_OUTBOX_STUCK_THRESHOLD_MS;\n const now = options.now ?? new Date();\n const threshold = new Date(now.getTime() - thresholdMs).toISOString();\n\n const embeddingRows = sqliteAll<{ status: string; count: number }>(\n this.db,\n `SELECT status, COUNT(*) as count FROM embedding_outbox GROUP BY status`\n );\n const vectorRows = sqliteAll<{ status: string; count: number }>(\n this.db,\n `SELECT status, COUNT(*) as count FROM vector_outbox GROUP BY status`\n );\n\n const processingAgeMs = (value: unknown): number | null => {\n if (value === null || value === undefined) return null;\n const date = toDateFromSQLite(value);\n const time = date.getTime();\n if (!Number.isFinite(time)) return null;\n return Math.max(0, now.getTime() - time);\n };\n\n const fromRows = (\n rows: Array<{ status: string; count: number }>,\n stuckProcessing: number,\n oldestProcessingAgeMs: number | null\n ) => {\n const out = { pending: 0, processing: 0, failed: 0, total: 0, stuckProcessing, oldestProcessingAgeMs };\n for (const row of rows) {\n const key = row.status as 'pending' | 'processing' | 'failed' | 'done';\n if (key === 'pending' || key === 'processing' || key === 'failed') {\n out[key] += Number(row.count ?? 0);\n }\n out.total += Number(row.count ?? 0);\n }\n return out;\n };\n\n const embeddingStuck = sqliteGet<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count\n FROM embedding_outbox\n WHERE status = 'processing'\n AND datetime(COALESCE(processed_at, created_at)) < datetime(?)`,\n [threshold]\n );\n const embeddingOldest = sqliteGet<{ oldest: string | null }>(\n this.db,\n `SELECT MIN(datetime(COALESCE(processed_at, created_at))) as oldest\n FROM embedding_outbox\n WHERE status = 'processing'`\n );\n\n const vectorStuck = sqliteGet<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count\n FROM vector_outbox\n WHERE status = 'processing'\n AND datetime(updated_at) < datetime(?)`,\n [threshold]\n );\n const vectorOldest = sqliteGet<{ oldest: string | null }>(\n this.db,\n `SELECT MIN(datetime(updated_at)) as oldest\n FROM vector_outbox\n WHERE status = 'processing'`\n );\n\n return {\n embedding: fromRows(\n embeddingRows,\n Number(embeddingStuck?.count ?? 0),\n processingAgeMs(embeddingOldest?.oldest)\n ),\n vector: fromRows(\n vectorRows,\n Number(vectorStuck?.count ?? 0),\n processingAgeMs(vectorOldest?.oldest)\n )\n };\n }\n\n /**\n * Update memory level\n */\n async updateMemoryLevel(eventId: string, level: string): Promise<void> {\n await this.initialize();\n\n sqliteRun(\n this.db,\n `UPDATE memory_levels SET level = ?, promoted_at = datetime('now') WHERE event_id = ?`,\n [level, eventId]\n );\n }\n\n /**\n * Get memory level statistics\n */\n async getLevelStats(): Promise<Array<{ level: string; count: number }>> {\n await this.initialize();\n\n const rows = sqliteAll<{ level: string; count: number }>(\n this.db,\n `SELECT ml.level, COUNT(*) as count\n FROM memory_levels ml\n INNER JOIN events e ON e.id = ml.event_id\n WHERE ${notActiveQuarantinedSql('e.metadata')}\n GROUP BY ml.level`\n );\n\n return rows;\n }\n\n /**\n * Get events by memory level\n */\n async getEventsByLevel(level: string, options?: { limit?: number; offset?: number }): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const limit = options?.limit || 50;\n const offset = options?.offset || 0;\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT e.* FROM events e\n INNER JOIN memory_levels ml ON e.id = ml.event_id\n WHERE ml.level = ?\n AND ${notActiveQuarantinedSql('e.metadata')}\n ORDER BY e.timestamp DESC\n LIMIT ? OFFSET ?`,\n [level, limit, offset]\n );\n\n return rows.map(row => this.rowToEvent(row));\n }\n\n /**\n * Get memory level for a specific event\n */\n async getEventLevel(eventId: string): Promise<string | null> {\n await this.initialize();\n\n const row = sqliteGet<{ level: string }>(\n this.db,\n `SELECT level FROM memory_levels WHERE event_id = ?`,\n [eventId]\n );\n\n return row ? row.level : null;\n }\n\n /**\n * Get sync position for a target\n */\n async getSyncPosition(targetName: string): Promise<{ lastEventId: string | null; lastTimestamp: string | null }> {\n await this.initialize();\n\n const row = sqliteGet<{ last_event_id: string | null; last_timestamp: string | null }>(\n this.db,\n `SELECT last_event_id, last_timestamp FROM sync_positions WHERE target_name = ?`,\n [targetName]\n );\n\n return {\n lastEventId: row?.last_event_id ?? null,\n lastTimestamp: row?.last_timestamp ?? null\n };\n }\n\n /**\n * Update sync position for a target\n */\n async updateSyncPosition(targetName: string, lastEventId: string, lastTimestamp: string): Promise<void> {\n await this.initialize();\n\n sqliteRun(\n this.db,\n `INSERT OR REPLACE INTO sync_positions (target_name, last_event_id, last_timestamp, updated_at)\n VALUES (?, ?, ?, datetime('now'))`,\n [targetName, lastEventId, lastTimestamp]\n );\n }\n\n /**\n * Get config value for endless mode\n */\n async getEndlessConfig(key: string): Promise<unknown | null> {\n await this.initialize();\n\n const row = sqliteGet<{ value: string }>(\n this.db,\n `SELECT value FROM endless_config WHERE key = ?`,\n [key]\n );\n\n if (!row) return null;\n return JSON.parse(row.value);\n }\n\n /**\n * Set config value for endless mode\n */\n async setEndlessConfig(key: string, value: unknown): Promise<void> {\n await this.initialize();\n\n sqliteRun(\n this.db,\n `INSERT OR REPLACE INTO endless_config (key, value, updated_at)\n VALUES (?, ?, datetime('now'))`,\n [key, JSON.stringify(value)]\n );\n }\n\n /**\n * Increment access count for events\n */\n async incrementAccessCount(eventIds: string[]): Promise<void> {\n if (eventIds.length === 0 || this.readOnly) return;\n\n await this.initialize();\n\n const placeholders = eventIds.map(() => '?').join(',');\n const currentTime = toSQLiteTimestamp(new Date());\n\n sqliteRun(\n this.db,\n `UPDATE events\n SET access_count = access_count + 1,\n last_accessed_at = ?\n WHERE id IN (${placeholders})`,\n [currentTime, ...eventIds]\n );\n }\n\n /**\n * Get most accessed memories (falls back to recent events if none accessed)\n */\n async getMostAccessed(limit: number = 10, options?: QuarantineReadOptions): Promise<MemoryEvent[]> {\n await this.initialize();\n\n // First try events with access_count > 0\n let rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events\n WHERE access_count > 0\n AND ${maybeQuarantinePredicate(options)}\n ORDER BY access_count DESC, last_accessed_at DESC\n LIMIT ?`,\n [limit]\n );\n\n // Fallback: if no accessed events, show recent events\n if (rows.length === 0) {\n rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events\n WHERE ${maybeQuarantinePredicate(options)}\n ORDER BY timestamp DESC\n LIMIT ?`,\n [limit]\n );\n }\n\n return rows.map(row => this.rowToEvent(row));\n }\n\n /**\n * Record a memory retrieval for helpfulness tracking\n */\n async recordRetrieval(eventId: string, sessionId: string, score: number, query: string): Promise<void> {\n if (this.readOnly) return;\n await this.initialize();\n\n const id = randomUUID();\n sqliteRun(\n this.db,\n `INSERT INTO memory_helpfulness (id, event_id, session_id, retrieval_score, query_preview, created_at)\n VALUES (?, ?, ?, ?, ?, datetime('now'))`,\n [id, eventId, sessionId, score, query.slice(0, 100)]\n );\n }\n\n /**\n * Get session IDs that have unevaluated retrievals (measured_at IS NULL).\n * Excludes the current session. Used to backfill sessions that ended without Stop hook.\n */\n async getUnevaluatedSessions(currentSessionId: string, limit = 5): Promise<string[]> {\n await this.initialize();\n const rows = sqliteAll<{ session_id: string }>(\n this.db,\n `SELECT DISTINCT session_id FROM memory_helpfulness\n WHERE measured_at IS NULL AND session_id != ?\n ORDER BY created_at DESC LIMIT ?`,\n [currentSessionId, limit]\n );\n return rows.map((r) => r.session_id);\n }\n\n /**\n * Evaluate helpfulness for all retrievals in a session\n * Called at session end - uses behavioral signals to compute score\n */\n async evaluateSessionHelpfulness(sessionId: string): Promise<void> {\n if (this.readOnly) return;\n await this.initialize();\n\n // Get all retrieval records for this session\n const retrievals = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM memory_helpfulness WHERE session_id = ? AND measured_at IS NULL`,\n [sessionId]\n );\n\n if (retrievals.length === 0) return;\n\n // Get session events to analyze behavior after retrieval\n const sessionEvents = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE session_id = ? ORDER BY timestamp ASC`,\n [sessionId]\n );\n\n const promptEvents = sessionEvents.filter((e: any) => e.event_type === 'user_prompt');\n const toolEvents = sessionEvents.filter((e: any) => e.event_type === 'tool_observation');\n\n // Count successful vs failed tools\n let toolSuccessCount = 0;\n let toolTotalCount = toolEvents.length;\n for (const t of toolEvents) {\n try {\n const content = JSON.parse(t.content as string);\n if (content.success !== false) toolSuccessCount++;\n } catch {\n toolSuccessCount++; // Assume success if can't parse\n }\n }\n const toolSuccessRatio = toolTotalCount > 0 ? toolSuccessCount / toolTotalCount : 0.5;\n\n for (const retrieval of retrievals) {\n const retrievalTime = retrieval.created_at as string;\n\n // 1. Session continued after retrieval?\n const eventsAfter = sessionEvents.filter((e: any) => e.timestamp > retrievalTime);\n const sessionContinued = eventsAfter.length > 0 ? 1 : 0;\n\n // 2. How many prompts came after?\n const promptsAfter = promptEvents.filter((e: any) => e.timestamp > retrievalTime);\n const promptCountAfter = promptsAfter.length;\n\n // 3. Was a similar query asked again? (simple word overlap check)\n const queryWords = new Set((retrieval.query_preview as string || '').toLowerCase().split(/\\s+/).filter(w => w.length > 2));\n let wasReasked = 0;\n for (const p of promptsAfter) {\n const pWords = new Set((p.content as string).toLowerCase().split(/\\s+/).filter((w: string) => w.length > 2));\n let overlap = 0;\n for (const w of queryWords) {\n if (pWords.has(w)) overlap++;\n }\n if (queryWords.size > 0 && overlap / queryWords.size > 0.5) {\n wasReasked = 1;\n break;\n }\n }\n\n // Calculate helpfulness score\n // Weights tuned for shopping-assistant-like corpora where sessions\n // continue on the same topic (was_reasked was over-penalising normal conversation flow)\n const retrievalScore = retrieval.retrieval_score as number || 0;\n // More prompts after retrieval = memory was actually useful to the conversation\n const promptNorm = Math.min(promptCountAfter / 2, 1.0);\n const helpfulnessScore = (\n 0.40 * Math.min(retrievalScore, 1.0) +\n 0.30 * promptNorm +\n 0.20 * toolSuccessRatio +\n 0.10 * (sessionContinued ? 1.0 : 0.0)\n );\n\n sqliteRun(\n this.db,\n `UPDATE memory_helpfulness\n SET session_continued = ?, prompt_count_after = ?,\n tool_success_count = ?, tool_total_count = ?,\n was_reasked = ?, helpfulness_score = ?,\n measured_at = datetime('now')\n WHERE id = ?`,\n [sessionContinued, promptCountAfter, toolSuccessCount, toolTotalCount,\n wasReasked, helpfulnessScore, retrieval.id]\n );\n }\n }\n\n /**\n * Get most helpful memories ranked by helpfulness score\n */\n async getHelpfulMemories(limit: number = 10): Promise<Array<{\n eventId: string;\n summary: string;\n helpfulnessScore: number;\n accessCount: number;\n evaluationCount: number;\n }>> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT\n mh.event_id,\n AVG(mh.helpfulness_score) as avg_score,\n COUNT(*) as eval_count,\n e.content,\n e.access_count\n FROM memory_helpfulness mh\n JOIN events e ON e.id = mh.event_id\n WHERE mh.measured_at IS NOT NULL\n AND ${notActiveQuarantinedSql('e.metadata')}\n GROUP BY mh.event_id\n ORDER BY avg_score DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(r => ({\n eventId: r.event_id as string,\n summary: (r.content as string).substring(0, 200) + ((r.content as string).length > 200 ? '...' : ''),\n helpfulnessScore: Math.round((r.avg_score as number) * 100) / 100,\n accessCount: (r.access_count as number) || 0,\n evaluationCount: r.eval_count as number\n }));\n }\n\n /**\n * Get helpfulness statistics for dashboard\n */\n async getHelpfulnessStats(since?: Date): Promise<{\n avgScore: number;\n totalEvaluated: number;\n totalRetrievals: number;\n helpful: number;\n neutral: number;\n unhelpful: number;\n }> {\n await this.initialize();\n\n const sinceIso = since?.toISOString();\n const evaluatedWhere = sinceIso\n ? `WHERE measured_at IS NOT NULL AND datetime(created_at) >= datetime(?)`\n : `WHERE measured_at IS NOT NULL`;\n const totalWhere = sinceIso\n ? `WHERE datetime(created_at) >= datetime(?)`\n : ``;\n\n const stats = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT\n AVG(helpfulness_score) as avg_score,\n COUNT(*) as total_evaluated,\n SUM(CASE WHEN helpfulness_score >= 0.7 THEN 1 ELSE 0 END) as helpful,\n SUM(CASE WHEN helpfulness_score >= 0.4 AND helpfulness_score < 0.7 THEN 1 ELSE 0 END) as neutral,\n SUM(CASE WHEN helpfulness_score < 0.4 THEN 1 ELSE 0 END) as unhelpful\n FROM memory_helpfulness\n ${evaluatedWhere}`,\n sinceIso ? [sinceIso] : []\n );\n\n const totalRow = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT COUNT(*) as total FROM memory_helpfulness ${totalWhere}`,\n sinceIso ? [sinceIso] : []\n );\n\n return {\n avgScore: Math.round(((stats?.avg_score as number) || 0) * 100) / 100,\n totalEvaluated: (stats?.total_evaluated as number) || 0,\n totalRetrievals: (totalRow?.total as number) || 0,\n helpful: (stats?.helpful as number) || 0,\n neutral: (stats?.neutral as number) || 0,\n unhelpful: (stats?.unhelpful as number) || 0\n };\n }\n\n /**\n * Fast keyword search using FTS5\n * Returns events matching the search query, ranked by relevance\n */\n async keywordSearch(query: string, limit: number = 10): Promise<Array<{event: MemoryEvent; rank: number}>> {\n await this.initialize();\n\n // Escape special FTS5 characters and prepare search terms\n const searchTerms = query\n .replace(/['\"(){}[\\]^~*?:\\\\/-]/g, ' ') // Remove special chars\n .split(/\\s+/)\n .filter(term => term.length > 1) // Filter short terms\n .map(term => `\"${term}\"*`) // Prefix matching\n .join(' OR ');\n\n if (!searchTerms) {\n return [];\n }\n\n try {\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT e.*, fts.rank\n FROM events_fts fts\n JOIN events e ON e.id = fts.event_id\n WHERE events_fts MATCH ?\n AND ${notActiveQuarantinedSql('e.metadata')}\n ORDER BY fts.rank\n LIMIT ?`,\n [searchTerms, limit]\n );\n\n return rows.map(row => ({\n event: this.rowToEvent(row),\n rank: row.rank as number\n }));\n } catch (error: any) {\n // FTS table might not exist yet (old database)\n // Fallback to LIKE search\n const likePattern = `%${query}%`;\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT *, 0 as rank FROM events\n WHERE content LIKE ?\n AND ${notActiveQuarantinedSql()}\n ORDER BY timestamp DESC\n LIMIT ?`,\n [likePattern, limit]\n );\n\n return rows.map(row => ({\n event: this.rowToEvent(row),\n rank: 0\n }));\n }\n }\n\n /**\n * Rebuild FTS index from existing events\n * Call this once after upgrading to FTS5\n */\n async rebuildFtsIndex(): Promise<number> {\n await this.initialize();\n\n // Get count of events to index\n const countRow = sqliteGet<{count: number}>(this.db, 'SELECT COUNT(*) as count FROM events', []);\n const totalEvents = countRow?.count ?? 0;\n\n // Clear and rebuild FTS index. Recreate the virtual table instead of\n // issuing DELETE against it: older migrated FTS5 tables/triggers can fail\n // with `no such column: T.event_id` when processing synthetic deletes.\n sqliteExec(this.db, `\n DROP TRIGGER IF EXISTS events_fts_insert;\n DROP TRIGGER IF EXISTS events_fts_delete;\n DROP TRIGGER IF EXISTS events_fts_update;\n DROP TABLE IF EXISTS events_fts;\n\n CREATE VIRTUAL TABLE events_fts USING fts5(\n content,\n event_id UNINDEXED,\n tokenize='porter unicode61'\n );\n\n INSERT INTO events_fts(rowid, content, event_id)\n SELECT rowid, content, id FROM events;\n\n CREATE TRIGGER events_fts_insert AFTER INSERT ON events BEGIN\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END;\n\n CREATE TRIGGER events_fts_delete AFTER DELETE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n END;\n\n CREATE TRIGGER events_fts_update AFTER UPDATE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END;\n `);\n\n return totalEvents;\n }\n\n /**\n * Get database instance for direct access\n */\n getDatabase(): SQLiteDatabase {\n return this.db;\n }\n\n private hasTableColumn(tableName: string, columnName: string): boolean {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(tableName)) return false;\n try {\n const rows = sqliteAll<{ name: string }>(this.db, `PRAGMA table_info(\"${tableName}\")`, []);\n return rows.some((row) => row.name === columnName);\n } catch {\n return false;\n }\n }\n\n\n async recordRetrievalTrace(input: {\n sessionId?: string;\n projectHash?: string;\n queryText: string;\n rawQueryText?: string;\n queryRewriteKind?: string;\n strategy?: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n candidateDetails?: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n lanes?: RetrievalDebugLane[];\n }>;\n selectedDetails?: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n lanes?: RetrievalDebugLane[];\n }>;\n confidence?: string;\n fallbackTrace?: string[];\n }): Promise<void> {\n await this.initialize();\n\n const traceId = randomUUID();\n const queryRewriteKind = normalizeQueryRewriteKind(input.queryRewriteKind);\n const candidateDetails = normalizeRetrievalTraceDetails(input.candidateDetails);\n const selectedDetails = normalizeRetrievalTraceDetails(input.selectedDetails);\n sqliteRun(\n this.db,\n `INSERT INTO retrieval_traces (\n trace_id, session_id, project_hash, query_text, raw_query_text, query_rewrite_kind, strategy,\n candidate_event_ids, selected_event_ids, candidate_details_json, selected_details_json,\n candidate_count, selected_count, confidence, fallback_trace\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n traceId,\n input.sessionId || null,\n input.projectHash || null,\n input.queryText,\n input.rawQueryText || null,\n queryRewriteKind,\n input.strategy || null,\n JSON.stringify(input.candidateEventIds || []),\n JSON.stringify(input.selectedEventIds || []),\n JSON.stringify(candidateDetails),\n JSON.stringify(selectedDetails),\n (input.candidateEventIds || []).length,\n (input.selectedEventIds || []).length,\n input.confidence || null,\n JSON.stringify(input.fallbackTrace || [])\n ]\n );\n }\n\n async getRecentRetrievalTraces(limit: number = 50): Promise<Array<{\n traceId: string;\n sessionId?: string;\n projectHash?: string;\n queryText: string;\n rawQueryText?: string;\n queryRewriteKind?: string;\n strategy?: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n candidateDetails: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n lanes?: RetrievalDebugLane[];\n }>;\n selectedDetails: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n lanes?: RetrievalDebugLane[];\n }>;\n candidateCount: number;\n selectedCount: number;\n confidence?: string;\n fallbackTrace: string[];\n createdAt: Date;\n }>> {\n await this.initialize();\n\n try {\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM retrieval_traces ORDER BY created_at DESC LIMIT ?`,\n [limit]\n );\n\n return rows.map((row) => ({\n traceId: row.trace_id as string,\n sessionId: (row.session_id as string) || undefined,\n projectHash: (row.project_hash as string) || undefined,\n queryText: row.query_text as string,\n rawQueryText: (row.raw_query_text as string) || undefined,\n queryRewriteKind: normalizeQueryRewriteKind(row.query_rewrite_kind as string | null),\n strategy: (row.strategy as string) || undefined,\n candidateEventIds: row.candidate_event_ids ? JSON.parse(row.candidate_event_ids as string) : [],\n selectedEventIds: row.selected_event_ids ? JSON.parse(row.selected_event_ids as string) : [],\n candidateDetails: parseRetrievalTraceDetails(row.candidate_details_json),\n selectedDetails: parseRetrievalTraceDetails(row.selected_details_json),\n candidateCount: Number(row.candidate_count || 0),\n selectedCount: Number(row.selected_count || 0),\n confidence: (row.confidence as string) || undefined,\n fallbackTrace: row.fallback_trace ? JSON.parse(row.fallback_trace as string) : [],\n createdAt: toDateFromSQLite(row.created_at),\n }));\n } catch (err: any) {\n if (err?.message?.includes('no such table')) return [];\n throw err;\n }\n }\n\n async getRetrievalTraceStats(): Promise<{\n totalQueries: number;\n avgCandidateCount: number;\n avgSelectedCount: number;\n selectionRate: number;\n rewrittenQueries: number;\n rewriteRate: number;\n rewrittenQueriesWithSelection: number;\n rawQueriesWithSelection: number;\n rewrittenSelectionRate: number;\n rawSelectionRate: number;\n avgSelectedCountForRewrittenQueries: number;\n avgSelectedCountForRawQueries: number;\n }> {\n await this.initialize();\n\n try {\n const rewrittenQueryRewriteKindSql = this.hasTableColumn('retrieval_traces', 'query_rewrite_kind')\n ? REWRITTEN_QUERY_REWRITE_KIND_SQL\n : '0';\n const row = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT\n COUNT(*) as total_queries,\n AVG(candidate_count) as avg_candidate_count,\n AVG(selected_count) as avg_selected_count,\n SUM(CASE WHEN ${rewrittenQueryRewriteKindSql} THEN 1 ELSE 0 END) as rewritten_queries,\n SUM(CASE WHEN ${rewrittenQueryRewriteKindSql} AND selected_count > 0 THEN 1 ELSE 0 END) as rewritten_queries_with_selection,\n SUM(CASE WHEN NOT (${rewrittenQueryRewriteKindSql}) AND selected_count > 0 THEN 1 ELSE 0 END) as raw_queries_with_selection,\n AVG(CASE WHEN ${rewrittenQueryRewriteKindSql} THEN selected_count END) as avg_selected_count_for_rewritten_queries,\n AVG(CASE WHEN NOT (${rewrittenQueryRewriteKindSql}) THEN selected_count END) as avg_selected_count_for_raw_queries,\n CASE\n WHEN SUM(candidate_count) > 0 THEN (SUM(selected_count) * 1.0 / SUM(candidate_count))\n ELSE 0\n END as selection_rate\n FROM retrieval_traces`,\n []\n );\n\n const totalQueries = Number(row?.total_queries || 0);\n const rewrittenQueries = Number(row?.rewritten_queries || 0);\n const rawQueries = Math.max(0, totalQueries - rewrittenQueries);\n const rewrittenQueriesWithSelection = Number(row?.rewritten_queries_with_selection || 0);\n const rawQueriesWithSelection = Number(row?.raw_queries_with_selection || 0);\n\n return {\n totalQueries,\n avgCandidateCount: Number(row?.avg_candidate_count || 0),\n avgSelectedCount: Number(row?.avg_selected_count || 0),\n selectionRate: Number(row?.selection_rate || 0),\n rewrittenQueries,\n rewriteRate: totalQueries > 0 ? rewrittenQueries / totalQueries : 0,\n rewrittenQueriesWithSelection,\n rawQueriesWithSelection,\n rewrittenSelectionRate: rewrittenQueries > 0 ? rewrittenQueriesWithSelection / rewrittenQueries : 0,\n rawSelectionRate: rawQueries > 0 ? rawQueriesWithSelection / rawQueries : 0,\n avgSelectedCountForRewrittenQueries: Number(row?.avg_selected_count_for_rewritten_queries || 0),\n avgSelectedCountForRawQueries: Number(row?.avg_selected_count_for_raw_queries || 0),\n };\n } catch (err: any) {\n if (err?.message?.includes('no such table')) {\n return {\n totalQueries: 0,\n avgCandidateCount: 0,\n avgSelectedCount: 0,\n selectionRate: 0,\n rewrittenQueries: 0,\n rewriteRate: 0,\n rewrittenQueriesWithSelection: 0,\n rawQueriesWithSelection: 0,\n rewrittenSelectionRate: 0,\n rawSelectionRate: 0,\n avgSelectedCountForRewrittenQueries: 0,\n avgSelectedCountForRawQueries: 0,\n };\n }\n throw err;\n }\n }\n\n /**\n * Close database connection\n */\n async close(): Promise<void> {\n sqliteClose(this.db);\n }\n\n /**\n * Get events grouped by turn_id for a session\n * Returns turns ordered by first event timestamp (newest first)\n */\n async getSessionTurns(sessionId: string, options?: { limit?: number; offset?: number } & QuarantineReadOptions): Promise<Array<{\n turnId: string;\n events: MemoryEvent[];\n startedAt: Date;\n promptPreview: string;\n eventCount: number;\n toolCount: number;\n hasResponse: boolean;\n }>> {\n await this.initialize();\n\n const limit = options?.limit || 20;\n const offset = options?.offset || 0;\n\n // Get distinct turn_ids for this session, ordered by first event timestamp\n const turnRows = sqliteAll<{ turn_id: string; min_ts: string }>(\n this.db,\n `SELECT turn_id, MIN(timestamp) as min_ts\n FROM events\n WHERE session_id = ? AND turn_id IS NOT NULL\n AND ${maybeQuarantinePredicate(options)}\n GROUP BY turn_id\n ORDER BY min_ts DESC\n LIMIT ? OFFSET ?`,\n [sessionId, limit, offset]\n );\n\n const turns: Array<{\n turnId: string;\n events: MemoryEvent[];\n startedAt: Date;\n promptPreview: string;\n eventCount: number;\n toolCount: number;\n hasResponse: boolean;\n }> = [];\n\n for (const turnRow of turnRows) {\n const events = await this.getEventsByTurn(turnRow.turn_id, options);\n\n const promptEvent = events.find(e => e.eventType === 'user_prompt');\n const toolEvents = events.filter(e => e.eventType === 'tool_observation');\n const hasResponse = events.some(e => e.eventType === 'agent_response');\n\n turns.push({\n turnId: turnRow.turn_id,\n events,\n startedAt: toDateFromSQLite(turnRow.min_ts),\n promptPreview: promptEvent\n ? promptEvent.content.slice(0, 200) + (promptEvent.content.length > 200 ? '...' : '')\n : '(no prompt)',\n eventCount: events.length,\n toolCount: toolEvents.length,\n hasResponse\n });\n }\n\n return turns;\n }\n\n /**\n * Get all events for a specific turn_id\n */\n async getEventsByTurn(turnId: string, options?: QuarantineReadOptions): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE turn_id = ? AND ${maybeQuarantinePredicate(options)} ORDER BY timestamp ASC`,\n [turnId]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Count total turns for a session\n */\n async countSessionTurns(sessionId: string, options?: QuarantineReadOptions): Promise<number> {\n await this.initialize();\n\n const row = sqliteGet<{ count: number }>(\n this.db,\n `SELECT COUNT(DISTINCT turn_id) as count\n FROM events\n WHERE session_id = ? AND turn_id IS NOT NULL\n AND ${maybeQuarantinePredicate(options)}`,\n [sessionId]\n );\n\n return row?.count || 0;\n }\n\n /**\n * Migrate existing events: backfill turn_id for events that have turnId in metadata\n * but no turn_id column value (for events stored before this migration)\n */\n async backfillTurnIds(): Promise<number> {\n await this.initialize();\n\n // Find events with turnId in metadata JSON but no turn_id column value\n const rows = sqliteAll<{ id: string; metadata: string }>(\n this.db,\n `SELECT id, metadata FROM events\n WHERE turn_id IS NULL AND metadata IS NOT NULL AND metadata LIKE '%turnId%'`\n );\n\n let updated = 0;\n for (const row of rows) {\n try {\n const metadata = JSON.parse(row.metadata);\n if (metadata.turnId) {\n sqliteRun(\n this.db,\n `UPDATE events SET turn_id = ? WHERE id = ?`,\n [metadata.turnId, row.id]\n );\n updated++;\n }\n } catch {\n // Skip rows with invalid JSON\n }\n }\n\n return updated;\n }\n\n /**\n * Delete all events for a session (for force reimport)\n */\n async deleteSessionEvents(sessionId: string): Promise<number> {\n await this.initialize();\n\n // Get event IDs first for cascading deletes\n const events = sqliteAll<{ id: string }>(\n this.db,\n `SELECT id FROM events WHERE session_id = ?`,\n [sessionId]\n );\n\n if (events.length === 0) return 0;\n\n const eventIds = events.map(e => e.id);\n const placeholders = eventIds.map(() => '?').join(',');\n\n // Drop FTS triggers to prevent SQLITE_CORRUPT_VTAB during bulk delete\n const ftsTriggersDropped: string[] = [];\n for (const triggerName of ['events_fts_delete', 'events_fts_update', 'events_fts_insert']) {\n try {\n sqliteRun(this.db, `DROP TRIGGER IF EXISTS ${triggerName}`);\n ftsTriggersDropped.push(triggerName);\n } catch {\n // Trigger may not exist\n }\n }\n\n // Delete from related tables first (some may not exist depending on DB version)\n for (const table of ['event_dedup', 'memory_levels', 'embedding_queue', 'embedding_outbox', 'vector_outbox']) {\n try {\n sqliteRun(this.db, `DELETE FROM ${table} WHERE event_id IN (${placeholders})`, eventIds);\n } catch {\n // Table may not exist\n }\n }\n\n // Delete events\n const result = sqliteRun(this.db, `DELETE FROM events WHERE session_id = ?`, [sessionId]);\n\n // Rebuild FTS index if we dropped triggers\n if (ftsTriggersDropped.length > 0) {\n try {\n // Rebuild FTS from remaining events\n sqliteRun(this.db, `INSERT INTO events_fts(events_fts) VALUES('rebuild')`);\n\n // Recreate triggers\n sqliteRun(this.db, `CREATE TRIGGER IF NOT EXISTS events_fts_insert AFTER INSERT ON events BEGIN\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END`);\n sqliteRun(this.db, `CREATE TRIGGER IF NOT EXISTS events_fts_delete AFTER DELETE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n END`);\n sqliteRun(this.db, `CREATE TRIGGER IF NOT EXISTS events_fts_update AFTER UPDATE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END`);\n } catch {\n // FTS rebuild failed - non-critical, will be rebuilt on next initialize\n }\n }\n\n return result.changes || 0;\n }\n\n /**\n * Convert database row to MemoryEvent\n */\n private rowToEvent(row: Record<string, unknown>): MemoryEvent {\n const event: any = {\n id: row.id as string,\n eventType: row.event_type as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: row.session_id as string,\n timestamp: toDateFromSQLite(row.timestamp),\n content: row.content as string,\n canonicalKey: row.canonical_key as string,\n dedupeKey: row.dedupe_key as string,\n metadata: safeParseMetadataValue(row.metadata)\n };\n\n // Include access tracking fields if present\n if (row.access_count !== undefined) {\n event.access_count = row.access_count;\n }\n if (row.last_accessed_at !== undefined) {\n event.last_accessed_at = row.last_accessed_at;\n }\n // Include turn_id if present\n if (row.turn_id !== undefined && row.turn_id !== null) {\n event.turn_id = row.turn_id;\n }\n\n return event;\n }\n}\n", "/**\n * AXIOMMIND canonical_key.py port\n * Deterministic normalization ensuring identical titles always map to same keys\n */\n\nimport { createHash } from 'crypto';\n\nconst MAX_KEY_LENGTH = 200;\n\n/**\n * Convert text to a normalized canonical key\n *\n * Normalization steps:\n * 1. NFKC unicode normalization\n * 2. Lowercase conversion\n * 3. Punctuation removal\n * 4. Consecutive whitespace cleanup\n * 5. Context addition (optional)\n * 6. Long key truncation with MD5\n */\nexport function makeCanonicalKey(\n title: string,\n context?: { project?: string; sessionId?: string }\n): string {\n // Step 1: NFKC normalization\n let normalized = title.normalize('NFKC');\n\n // Step 2: Lowercase conversion\n normalized = normalized.toLowerCase();\n\n // Step 3: Punctuation removal (unicode compatible)\n normalized = normalized.replace(/[^\\p{L}\\p{N}\\s]/gu, '');\n\n // Step 4: Consecutive whitespace cleanup\n normalized = normalized.replace(/\\s+/g, ' ').trim();\n\n // Step 5: Context addition\n let key = normalized;\n if (context?.project) {\n key = `${context.project}::${key}`;\n }\n\n // Step 6: Long key handling\n if (key.length > MAX_KEY_LENGTH) {\n const hashSuffix = createHash('md5').update(key).digest('hex').slice(0, 8);\n key = key.slice(0, MAX_KEY_LENGTH - 9) + '_' + hashSuffix;\n }\n\n return key;\n}\n\n/**\n * Check if two texts have the same canonical key\n */\nexport function isSameCanonicalKey(a: string, b: string): boolean {\n return makeCanonicalKey(a) === makeCanonicalKey(b);\n}\n\n/**\n * Generate dedupe key (content + session for uniqueness)\n * AXIOMMIND Principle 3: Idempotency guarantee\n */\nexport function makeDedupeKey(content: string, sessionId: string): string {\n const contentHash = createHash('sha256').update(content).digest('hex');\n return `${sessionId}:${contentHash}`;\n}\n\n/**\n * Generate content hash for deduplication\n */\nexport function hashContent(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\n// ============================================================\n// Entity Canonical Keys (Task Entity System)\n// ============================================================\n\nexport type EntityKeyType = 'task' | 'condition' | 'artifact';\n\n/**\n * Normalize text for entity key generation\n */\nfunction normalizeForKey(text: string): string {\n return text\n .normalize('NFKC')\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]/gu, '')\n .replace(/\\s+/g, '_')\n .trim();\n}\n\n/**\n * Generate canonical key for entities\n * Format: {type}:{project}:{normalized_identifier}\n */\nexport function makeEntityCanonicalKey(\n entityType: EntityKeyType,\n identifier: string,\n context?: { project?: string }\n): string {\n const project = context?.project ?? 'default';\n\n switch (entityType) {\n case 'task':\n return `task:${project}:${normalizeForKey(identifier)}`;\n case 'condition':\n return `cond:${project}:${normalizeForKey(identifier)}`;\n case 'artifact':\n return makeArtifactKey(identifier);\n }\n}\n\n/**\n * Generate canonical key for artifacts based on identifier pattern\n * - URL: art:url:{sha1(url)}\n * - JIRA key: art:jira:{key}\n * - GitHub issue: art:gh_issue:{repo}:{num}\n * - Generic: art:generic:{sha1(identifier)}\n */\nexport function makeArtifactKey(identifier: string): string {\n // URL pattern\n if (/^https?:\\/\\//.test(identifier)) {\n const hash = createHash('sha1').update(identifier).digest('hex').slice(0, 12);\n return `art:url:${hash}`;\n }\n\n // JIRA key pattern (e.g., PROJ-123)\n const jiraMatch = identifier.match(/^([A-Z]+-\\d+)$/);\n if (jiraMatch) {\n return `art:jira:${jiraMatch[1].toLowerCase()}`;\n }\n\n // GitHub issue pattern (e.g., owner/repo#123)\n const ghMatch = identifier.match(/^([^\\/]+\\/[^#]+)#(\\d+)$/);\n if (ghMatch) {\n return `art:gh_issue:${ghMatch[1]}:${ghMatch[2]}`;\n }\n\n // Generic identifier\n const hash = createHash('sha1').update(identifier).digest('hex').slice(0, 12);\n return `art:generic:${hash}`;\n}\n\n/**\n * Generate dedupe key for task events\n */\nexport function makeTaskEventDedupeKey(\n eventType: string,\n taskId: string,\n sessionId: string,\n additionalContext?: string\n): string {\n const parts = [eventType, taskId, sessionId];\n if (additionalContext) {\n parts.push(additionalContext);\n }\n const combined = parts.join(':');\n return createHash('sha256').update(combined).digest('hex');\n}\n\n/**\n * Parse entity canonical key to extract type and identifier\n */\nexport function parseEntityCanonicalKey(canonicalKey: string): {\n entityType: EntityKeyType;\n project?: string;\n identifier: string;\n} | null {\n const taskMatch = canonicalKey.match(/^task:([^:]+):(.+)$/);\n if (taskMatch) {\n return { entityType: 'task', project: taskMatch[1], identifier: taskMatch[2] };\n }\n\n const condMatch = canonicalKey.match(/^cond:([^:]+):(.+)$/);\n if (condMatch) {\n return { entityType: 'condition', project: condMatch[1], identifier: condMatch[2] };\n }\n\n const artMatch = canonicalKey.match(/^art:([^:]+):(.+)$/);\n if (artMatch) {\n return { entityType: 'artifact', identifier: artMatch[2] };\n }\n\n return null;\n}\n", "/**\n * Project path registry utilities.\n *\n * These helpers are intentionally core-level and Claude-agnostic.\n */\n\nimport * as crypto from 'crypto';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\n/**\n * Normalize and resolve a project path, handling symlinks when possible.\n */\nexport function normalizeProjectPath(projectPath: string): string {\n const expanded = projectPath.startsWith('~')\n ? path.join(os.homedir(), projectPath.slice(1))\n : projectPath;\n\n try {\n return fs.realpathSync(expanded);\n } catch {\n return path.resolve(expanded);\n }\n}\n\n/**\n * Generate a stable 8-character hash from a normalized project path.\n */\nexport function hashProjectPath(projectPath: string): string {\n const normalizedPath = normalizeProjectPath(projectPath);\n return crypto.createHash('sha256')\n .update(normalizedPath)\n .digest('hex')\n .slice(0, 8);\n}\n\n/**\n * Get the storage path for a project-local memory database.\n */\nexport function getProjectStoragePath(projectPath: string): string {\n const hash = hashProjectPath(projectPath);\n return path.join(os.homedir(), '.claude-code', 'memory', 'projects', hash);\n}\n\n/**\n * Resolve either an explicit project hash or a project path into a storage path.\n */\nexport function resolveProjectStoragePath(projectOrHash: string): string {\n const isHash = /^[a-f0-9]{8}$/.test(projectOrHash);\n return isHash\n ? path.join(os.homedir(), '.claude-code', 'memory', 'projects', projectOrHash)\n : getProjectStoragePath(projectOrHash);\n}\n", "/**\n * SQLite Wrapper with WAL Mode Support\n * Primary store for hooks - always available, no lock conflicts\n */\n\nimport Database from 'better-sqlite3';\nimport * as fs from 'fs';\nimport * as nodePath from 'path';\n\nexport type SQLiteDatabase = Database.Database;\n\nexport interface SQLiteOptions {\n readonly?: boolean;\n walMode?: boolean;\n}\n\n/**\n * Creates a new SQLite database with WAL mode\n */\nexport function createSQLiteDatabase(path: string, options?: SQLiteOptions): SQLiteDatabase {\n // Ensure parent directory exists\n const dir = nodePath.dirname(path);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const db = new Database(path, {\n readonly: options?.readonly ?? false,\n });\n\n // Enable WAL mode for concurrent access (unless read-only)\n if (!options?.readonly && (options?.walMode ?? true)) {\n db.pragma('journal_mode = WAL');\n db.pragma('synchronous = NORMAL');\n db.pragma('busy_timeout = 5000');\n }\n\n return db;\n}\n\n/**\n * Execute a statement that doesn't return rows (INSERT, UPDATE, DELETE)\n */\nexport function sqliteRun(\n db: SQLiteDatabase,\n sql: string,\n params: unknown[] = []\n): Database.RunResult {\n const stmt = db.prepare(sql);\n return stmt.run(...params);\n}\n\n/**\n * Execute a query and return all rows\n */\nexport function sqliteAll<T = Record<string, unknown>>(\n db: SQLiteDatabase,\n sql: string,\n params: unknown[] = []\n): T[] {\n const stmt = db.prepare(sql);\n return stmt.all(...params) as T[];\n}\n\n/**\n * Execute a query and return first row\n */\nexport function sqliteGet<T = Record<string, unknown>>(\n db: SQLiteDatabase,\n sql: string,\n params: unknown[] = []\n): T | undefined {\n const stmt = db.prepare(sql);\n return stmt.get(...params) as T | undefined;\n}\n\n/**\n * Execute multiple statements (for schema creation)\n */\nexport function sqliteExec(db: SQLiteDatabase, sql: string): void {\n db.exec(sql);\n}\n\n/**\n * Close database connection\n */\nexport function sqliteClose(db: SQLiteDatabase): void {\n db.close();\n}\n\n/**\n * Run multiple statements in a transaction\n */\nexport function sqliteTransaction<T>(\n db: SQLiteDatabase,\n fn: () => T\n): T {\n return db.transaction(fn)();\n}\n\n/**\n * Safely converts a value to a Date object\n */\nexport function toDateFromSQLite(value: unknown): Date {\n if (value instanceof Date) return value;\n if (typeof value === 'number') return new Date(value);\n if (typeof value === 'string') {\n // SQLite datetime('now') stores UTC timestamps without an explicit timezone\n // (for example, \"2026-05-07 16:00:00\"). JavaScript treats that shape as\n // local time, which shifts dashboard time-window calculations on non-UTC\n // machines. Normalize SQLite's timezone-less UTC shape before parsing while\n // leaving ISO strings with an explicit offset/Z untouched.\n const trimmed = value.trim();\n if (/^\\d{4}-\\d{2}-\\d{2}[ T]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?$/.test(trimmed)) {\n return new Date(trimmed.replace(' ', 'T') + 'Z');\n }\n return new Date(trimmed);\n }\n return new Date(String(value));\n}\n\n/**\n * Convert Date to ISO string for SQLite storage\n */\nexport function toSQLiteTimestamp(date: Date): string {\n return date.toISOString();\n}\n", "import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { MemoryEvent } from './types.js';\n\nconst DEFAULT_NAMESPACE = 'default';\nconst DEFAULT_CATEGORY = 'uncategorized';\n\nexport function sanitizeSegment(input: unknown, fallback: string): string {\n const raw = String(input ?? '').trim().toLowerCase();\n const safe = raw\n .normalize('NFKD')\n .replace(/[^a-z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n\n if (!safe || safe === '.' || safe === '..') return fallback;\n return safe;\n}\n\nfunction getCategorySegments(metadata: Record<string, unknown> | undefined, eventType: string): string[] {\n const raw = metadata?.categoryPath;\n if (Array.isArray(raw) && raw.length > 0) {\n return raw.map((s) => sanitizeSegment(s, DEFAULT_CATEGORY));\n }\n const single = metadata?.category;\n if (typeof single === 'string' && single.trim()) {\n return [sanitizeSegment(single, DEFAULT_CATEGORY)];\n }\n return [sanitizeSegment(eventType, DEFAULT_CATEGORY)];\n}\n\nexport function buildMirrorPath(rootDir: string, event: MemoryEvent): string {\n const metadata = event.metadata as Record<string, unknown> | undefined;\n const namespace = sanitizeSegment(metadata?.namespace, DEFAULT_NAMESPACE);\n const categories = getCategorySegments(metadata, event.eventType);\n\n const d = event.timestamp;\n const yyyy = d.getFullYear();\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const dd = String(d.getDate()).padStart(2, '0');\n\n return path.join(rootDir, 'memory', namespace, ...categories, `${yyyy}-${mm}-${dd}.md`);\n}\n\nexport function formatMirrorEntry(event: MemoryEvent): string {\n const category = Array.isArray((event.metadata as any)?.categoryPath)\n ? ((event.metadata as any).categoryPath as unknown[]).join('/')\n : String((event.metadata as any)?.category ?? event.eventType);\n\n return [\n '',\n `- ts: ${event.timestamp.toISOString()}`,\n ` id: ${event.id}`,\n ` type: ${event.eventType}`,\n ` session: ${event.sessionId}`,\n ` category: ${category}`,\n ' content: |',\n ...event.content.split('\\n').map((line) => ` ${line}`)\n ].join('\\n') + '\\n';\n}\n\nexport class MarkdownMirror {\n constructor(private readonly rootDir: string) {}\n\n async append(event: MemoryEvent): Promise<string> {\n const outPath = buildMirrorPath(this.rootDir, event);\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n await fs.appendFile(outPath, formatMirrorEntry(event), 'utf8');\n return outPath;\n }\n}\n", "/**\n * Vector Outbox V2 - Transactional Outbox Pattern\n * AXIOMMIND Principle 6: DuckDB \u2192 outbox \u2192 LanceDB unidirectional flow\n */\n\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport { randomUUID } from 'crypto';\nimport type {\n OutboxJob,\n OutboxStatus,\n OutboxItemKind\n} from './types.js';\n\nexport interface OutboxConfig {\n embeddingVersion: string;\n maxRetries: number;\n stuckThresholdMs: number;\n cleanupDays: number;\n}\n\nconst DEFAULT_CONFIG: OutboxConfig = {\n embeddingVersion: 'v1',\n maxRetries: 3,\n stuckThresholdMs: 5 * 60 * 1000, // 5 minutes\n cleanupDays: 7\n};\n\nexport interface OutboxMetrics {\n pendingCount: number;\n processingCount: number;\n doneCount: number;\n failedCount: number;\n oldestPendingAge: number | null;\n}\n\nexport interface OutboxEnqueueInput {\n itemKind: OutboxItemKind;\n itemId: string;\n embeddingVersion?: string;\n}\n\nexport type EnqueueResult =\n | { success: true; jobId: string; isNew: boolean }\n | { success: false; error: string };\n\nexport class VectorOutbox {\n private config: OutboxConfig;\n\n constructor(\n private db: Database,\n config?: Partial<OutboxConfig>\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Enqueue item for vectorization (idempotent).\n * Returns the already-existing job id when the same item/version has been enqueued before.\n */\n enqueueSync(\n itemKind: OutboxItemKind,\n itemId: string,\n embeddingVersion?: string\n ): string {\n const result = this.enqueueWithResultSync({ itemKind, itemId, embeddingVersion });\n if (result.success === false) {\n throw new Error(result.error);\n }\n return result.jobId;\n }\n\n async enqueue(\n itemKind: OutboxItemKind,\n itemId: string,\n embeddingVersion?: string\n ): Promise<string> {\n return this.enqueueSync(itemKind, itemId, embeddingVersion);\n }\n\n enqueueBatchSync(inputs: OutboxEnqueueInput[]): EnqueueResult[] {\n return inputs.map((input) => this.enqueueWithResultSync(input));\n }\n\n async enqueueBatch(inputs: OutboxEnqueueInput[]): Promise<EnqueueResult[]> {\n return this.enqueueBatchSync(inputs);\n }\n\n enqueueWithResultSync(input: OutboxEnqueueInput): EnqueueResult {\n const version = input.embeddingVersion ?? this.config.embeddingVersion;\n const jobId = randomUUID();\n const now = new Date().toISOString();\n\n try {\n const result = this.db.prepare(`INSERT INTO vector_outbox (\n job_id, item_kind, item_id, embedding_version, status, retry_count, created_at, updated_at\n ) VALUES (?, ?, ?, ?, 'pending', 0, ?, ?)\n ON CONFLICT (item_kind, item_id, embedding_version) DO NOTHING`).run(\n jobId,\n input.itemKind,\n input.itemId,\n version,\n now,\n now\n );\n\n const row = this.db.prepare(`SELECT job_id FROM vector_outbox\n WHERE item_kind = ? AND item_id = ? AND embedding_version = ?`).get(\n input.itemKind,\n input.itemId,\n version\n ) as { job_id: string } | undefined;\n\n if (!row) {\n return { success: false, error: 'vector outbox enqueue did not create or find a job' };\n }\n\n return { success: true, jobId: row.job_id, isNew: Number(result.changes ?? 0) > 0 };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n\n async enqueueWithResult(input: OutboxEnqueueInput): Promise<EnqueueResult> {\n return this.enqueueWithResultSync(input);\n }\n\n /**\n * Claim pending jobs for processing\n */\n async claimJobs(limit: number = 32): Promise<OutboxJob[]> {\n const now = new Date().toISOString();\n\n // Atomic claim using UPDATE RETURNING\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `UPDATE vector_outbox\n SET status = 'processing', updated_at = ?\n WHERE job_id IN (\n SELECT job_id FROM vector_outbox\n WHERE status = 'pending'\n ORDER BY created_at ASC\n LIMIT ?\n )\n RETURNING *`,\n [now, limit]\n );\n\n return rows.map(row => this.rowToJob(row));\n }\n\n /**\n * Mark job as done\n */\n async markDone(jobId: string): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'done', updated_at = ?\n WHERE job_id = ?`,\n [new Date().toISOString(), jobId]\n );\n }\n\n /**\n * Mark job as failed\n */\n async markFailed(jobId: string, error: string): Promise<void> {\n const now = new Date().toISOString();\n\n // Check retry count\n const rows = await dbAll<{ retry_count: number }>(\n this.db,\n `SELECT retry_count FROM vector_outbox WHERE job_id = ?`,\n [jobId]\n );\n\n if (rows.length === 0) return;\n\n const retryCount = rows[0].retry_count;\n const newStatus: OutboxStatus = retryCount >= this.config.maxRetries - 1\n ? 'failed'\n : 'pending'; // Will retry\n\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = ?, error = ?, retry_count = retry_count + 1, updated_at = ?\n WHERE job_id = ?`,\n [newStatus, error, now, jobId]\n );\n }\n\n /**\n * Get job by ID\n */\n async getJob(jobId: string): Promise<OutboxJob | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM vector_outbox WHERE job_id = ?`,\n [jobId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToJob(rows[0]);\n }\n\n /**\n * Get jobs by status\n */\n async getJobsByStatus(status: OutboxStatus, limit: number = 100): Promise<OutboxJob[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM vector_outbox\n WHERE status = ?\n ORDER BY created_at ASC\n LIMIT ?`,\n [status, limit]\n );\n\n return rows.map(row => this.rowToJob(row));\n }\n\n /**\n * Reconcile: recover stuck and retry failed jobs\n */\n async reconcile(referenceTime: Date = new Date()): Promise<{ recovered: number; retried: number }> {\n const stuckThreshold = new Date(referenceTime.getTime() - this.config.stuckThresholdMs);\n const nowIso = referenceTime.toISOString();\n\n // Recover stuck processing jobs\n const recovered = this.db.prepare(`UPDATE vector_outbox\n SET status = 'pending', updated_at = ?, error = NULL\n WHERE status = 'processing'\n AND updated_at < ?`).run(nowIso, stuckThreshold.toISOString());\n\n // Retry failed jobs that haven't exceeded max retries\n const retried = this.db.prepare(`UPDATE vector_outbox\n SET status = 'pending', updated_at = ?, error = NULL\n WHERE status = 'failed'\n AND retry_count < ?`).run(nowIso, this.config.maxRetries);\n\n return {\n recovered: Number(recovered.changes ?? 0),\n retried: Number(retried.changes ?? 0)\n };\n }\n\n /**\n * Cleanup old done jobs\n */\n async cleanup(referenceTime: Date = new Date()): Promise<number> {\n const threshold = new Date(referenceTime.getTime() - this.config.cleanupDays * 24 * 60 * 60 * 1000);\n\n const result = this.db.prepare(`DELETE FROM vector_outbox\n WHERE status = 'done'\n AND updated_at < ?`).run(threshold.toISOString());\n\n return Number(result.changes ?? 0);\n }\n\n /**\n * Get metrics\n */\n async getMetrics(): Promise<OutboxMetrics> {\n const statusCounts = await dbAll<{ status: string; count: number }>(\n this.db,\n `SELECT status, COUNT(*) as count\n FROM vector_outbox\n GROUP BY status`\n );\n\n const oldestPending = await dbAll<{ created_at: string }>(\n this.db,\n `SELECT created_at FROM vector_outbox\n WHERE status = 'pending'\n ORDER BY created_at ASC\n LIMIT 1`\n );\n\n const metrics: OutboxMetrics = {\n pendingCount: 0,\n processingCount: 0,\n doneCount: 0,\n failedCount: 0,\n oldestPendingAge: null\n };\n\n for (const row of statusCounts) {\n switch (row.status) {\n case 'pending':\n metrics.pendingCount = Number(row.count);\n break;\n case 'processing':\n metrics.processingCount = Number(row.count);\n break;\n case 'done':\n metrics.doneCount = Number(row.count);\n break;\n case 'failed':\n metrics.failedCount = Number(row.count);\n break;\n }\n }\n\n if (oldestPending.length > 0) {\n const oldestDate = new Date(oldestPending[0].created_at);\n metrics.oldestPendingAge = Date.now() - oldestDate.getTime();\n }\n\n return metrics;\n }\n\n /**\n * Validate state transition\n */\n isValidTransition(from: OutboxStatus, to: OutboxStatus): boolean {\n const validTransitions = [\n { from: 'pending', to: 'processing' },\n { from: 'processing', to: 'done' },\n { from: 'processing', to: 'failed' },\n { from: 'failed', to: 'pending' }\n ];\n\n return validTransitions.some(t => t.from === from && t.to === to);\n }\n\n /**\n * Convert database row to OutboxJob\n */\n private rowToJob(row: Record<string, unknown>): OutboxJob {\n return {\n jobId: row.job_id as string,\n itemKind: row.item_kind as OutboxItemKind,\n itemId: row.item_id as string,\n embeddingVersion: row.embedding_version as string,\n status: row.status as OutboxStatus,\n retryCount: row.retry_count as number,\n error: row.error as string | undefined,\n createdAt: toDate(row.created_at),\n updatedAt: toDate(row.updated_at)\n };\n }\n}\n", "/**\n * Privacy-safe retrieval lane metadata helpers.\n *\n * Lane details are intended for trace/debug surfaces. Keep them compact,\n * allow-listed, and free of raw private paths or credential-shaped values.\n */\n\nexport const RETRIEVAL_DEBUG_LANE_NAMES = [\n 'raw_event',\n 'session_summary',\n 'graph_path',\n 'facet_match'\n] as const;\n\nexport type RetrievalDebugLaneName = typeof RETRIEVAL_DEBUG_LANE_NAMES[number];\n\nexport interface RetrievalDebugLane {\n lane: RetrievalDebugLaneName;\n reason: string;\n score?: number;\n}\n\nconst RETRIEVAL_DEBUG_LANE_NAME_SET = new Set<string>(RETRIEVAL_DEBUG_LANE_NAMES);\n\nexport function isRetrievalDebugLaneName(value: unknown): value is RetrievalDebugLaneName {\n return typeof value === 'string' && RETRIEVAL_DEBUG_LANE_NAME_SET.has(value);\n}\n\nexport function normalizeRetrievalDebugLanes(value: unknown, maxItems = 6): RetrievalDebugLane[] {\n if (!Array.isArray(value) || maxItems <= 0) return [];\n\n const normalized: RetrievalDebugLane[] = [];\n const seen = new Set<string>();\n for (const item of value) {\n const lane = normalizeRetrievalDebugLane(item);\n if (!lane) continue;\n const key = [lane.lane, lane.reason, lane.score ?? ''].join('\\u0000');\n if (seen.has(key)) continue;\n seen.add(key);\n normalized.push(lane);\n if (normalized.length >= maxItems) break;\n }\n return normalized;\n}\n\nexport function normalizeRetrievalDebugLane(value: unknown): RetrievalDebugLane | null {\n if (!value || typeof value !== 'object') return null;\n const raw = value as Record<string, unknown>;\n if (!isRetrievalDebugLaneName(raw.lane)) return null;\n\n const reason = sanitizeRetrievalLaneReason(typeof raw.reason === 'string' ? raw.reason : '') || 'unspecified';\n const score = typeof raw.score === 'number' && Number.isFinite(raw.score)\n ? Math.max(0, Math.min(1, raw.score))\n : undefined;\n\n return score === undefined\n ? { lane: raw.lane, reason }\n : { lane: raw.lane, reason, score };\n}\n\nexport function sanitizeRetrievalLaneReason(value: string): string {\n return value\n .replace(/[\\r\\n\\t]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .replace(/[A-Za-z]:[\\\\/][^\\s'\"`<>)]*/g, '[path]')\n .replace(/\\/(?:Users|home|tmp|var\\/folders)\\/[^\\s'\"`<>)]*/g, '[path]')\n .replace(/\\\\\\\\[^\\s'\"`<>)]*/g, '[path]')\n .replace(/\\bBearer\\s+[^\\s'\"`,;]{6,}/gi, 'Bearer [REDACTED]')\n .replace(\n /([\"']?\\b(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|token|secret|password|passwd|credential)[\"']?\\s*[:=]\\s*[\"']?)[^\\s\"'`,;}]{6,}/gi,\n '$1[REDACTED]'\n )\n .replace(\n /\\b(?:gh[pousr]_[A-Za-z0-9_]{8,}|github_pat_[A-Za-z0-9_]{8,}|glpat-[A-Za-z0-9_-]{8,}|xox[a-z]-[A-Za-z0-9-]{8,}|(?:AKIA|ASIA)[A-Z0-9]{12,}|AIza[0-9A-Za-z_-]{20,}|ya29\\.[0-9A-Za-z_-]+|sk-[A-Za-z0-9_-]{12,})\\b/g,\n '[REDACTED]'\n )\n .slice(0, 120);\n}\n", "import { z } from 'zod';\n\nexport const FacetTargetTypeSchema = z.enum([\n 'event',\n 'entity',\n 'edge',\n 'consolidated_memory',\n 'lesson',\n 'action'\n]);\nexport type FacetTargetType = z.infer<typeof FacetTargetTypeSchema>;\n\nexport const BUILT_IN_FACET_DIMENSIONS = [\n 'kind',\n 'workflow',\n 'artifact',\n 'source',\n 'privacy',\n 'quality',\n 'retention',\n 'project'\n] as const;\n\nconst customDimensionPattern = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;\n\nconst TrimmedStringSchema = z.preprocess(\n (value) => typeof value === 'string' ? value.trim() : value,\n z.string().min(1)\n);\n\nexport const FacetDimensionSchema = z.preprocess(\n (value) => typeof value === 'string' ? value.trim() : value,\n z.string()\n .min(1)\n .max(64)\n .refine((value) => (BUILT_IN_FACET_DIMENSIONS as readonly string[]).indexOf(value) !== -1 || customDimensionPattern.test(value), {\n message: 'Facet dimension must be built-in or lowercase kebab-case'\n })\n);\nexport type FacetDimension = z.infer<typeof FacetDimensionSchema>;\n\nexport const FacetSourceSchema = z.enum(['manual', 'imported', 'derived', 'llm', 'system']).default('manual');\nexport type FacetSource = z.infer<typeof FacetSourceSchema>;\n\nconst EvidenceEventIdsSchema = z.preprocess(\n (value) => Array.isArray(value)\n ? value.map((item) => typeof item === 'string' ? item.trim() : item).filter(Boolean)\n : value,\n z.array(z.string().min(1)).default([])\n);\n\nconst OptionalTrimmedStringSchema = z.preprocess(\n (value) => typeof value === 'string' ? value.trim() : value,\n z.string().min(1).optional()\n);\n\nexport const MemoryFacetAssignmentInputSchema = z.object({\n targetType: FacetTargetTypeSchema,\n targetId: TrimmedStringSchema,\n dimension: FacetDimensionSchema,\n value: TrimmedStringSchema,\n confidence: z.number().min(0).max(1).default(1),\n source: FacetSourceSchema,\n evidenceEventIds: EvidenceEventIdsSchema,\n projectHash: OptionalTrimmedStringSchema,\n actor: OptionalTrimmedStringSchema\n});\nexport type FacetAssignmentInput = z.infer<typeof MemoryFacetAssignmentInputSchema>;\n\nexport const MemoryFacetAssignmentSchema = MemoryFacetAssignmentInputSchema.extend({\n id: z.string().min(1),\n createdAt: z.date(),\n updatedAt: z.date()\n});\nexport type MemoryFacetAssignment = z.infer<typeof MemoryFacetAssignmentSchema>;\n\nexport const FacetRemoveInputSchema = z.object({\n targetType: FacetTargetTypeSchema,\n targetId: TrimmedStringSchema,\n dimension: FacetDimensionSchema,\n value: TrimmedStringSchema,\n source: FacetSourceSchema,\n projectHash: OptionalTrimmedStringSchema,\n actor: OptionalTrimmedStringSchema\n});\nexport type FacetRemoveInput = z.infer<typeof FacetRemoveInputSchema>;\n\nexport const FacetQuerySchema = z.object({\n targetType: FacetTargetTypeSchema.optional(),\n targetId: OptionalTrimmedStringSchema,\n dimension: FacetDimensionSchema.optional(),\n value: OptionalTrimmedStringSchema,\n source: FacetSourceSchema.optional(),\n projectHash: OptionalTrimmedStringSchema,\n limit: z.number().int().positive().max(500).default(100)\n});\nexport type FacetQuery = z.infer<typeof FacetQuerySchema>;\n\nexport function parseFacetAssignmentInput(input: unknown): FacetAssignmentInput {\n return MemoryFacetAssignmentInputSchema.parse(input);\n}\n\nexport function parseFacetRemoveInput(input: unknown): FacetRemoveInput {\n return FacetRemoveInputSchema.parse(input);\n}\n\nexport function parseFacetQuery(input: unknown): FacetQuery {\n return FacetQuerySchema.parse(input ?? {});\n}\n", "import { randomUUID } from 'crypto';\n\nimport {\n sqliteAll,\n sqliteGet,\n sqliteRun,\n toDateFromSQLite,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\nimport {\n FacetSourceSchema,\n FacetTargetTypeSchema,\n parseFacetAssignmentInput,\n parseFacetQuery,\n parseFacetRemoveInput,\n type FacetAssignmentInput,\n type FacetQuery,\n type FacetRemoveInput,\n type FacetTargetType,\n type MemoryFacetAssignment\n} from './facets.js';\nimport { writeGovernanceAuditEntry } from './governance-audit.js';\n\ninterface MemoryFacetRow {\n id: string;\n target_type: string;\n target_id: string;\n dimension: string;\n value: string;\n confidence: number;\n source: string;\n evidence_event_ids: string;\n project_hash: string | null;\n created_at: string;\n updated_at: string;\n}\n\nfunction parseStringArray(value: unknown): string[] {\n if (typeof value !== 'string') return [];\n try {\n const parsed = JSON.parse(value);\n if (!Array.isArray(parsed)) return [];\n return parsed.filter((item): item is string => typeof item === 'string' && item.length > 0);\n } catch {\n return [];\n }\n}\n\nfunction projectHashToStorage(projectHash: string | undefined): string {\n return projectHash ?? '';\n}\n\nfunction rowToFacet(row: MemoryFacetRow): MemoryFacetAssignment {\n const projectHash = typeof row.project_hash === 'string' && row.project_hash.length > 0\n ? row.project_hash\n : undefined;\n\n return {\n id: row.id,\n targetType: FacetTargetTypeSchema.parse(row.target_type),\n targetId: row.target_id,\n dimension: row.dimension,\n value: row.value,\n confidence: Number(row.confidence),\n source: FacetSourceSchema.parse(row.source),\n evidenceEventIds: parseStringArray(row.evidence_event_ids),\n projectHash,\n createdAt: toDateFromSQLite(row.created_at),\n updatedAt: toDateFromSQLite(row.updated_at)\n };\n}\n\nfunction facetToAuditJson(facet: MemoryFacetAssignment): Record<string, unknown> {\n return {\n id: facet.id,\n targetType: facet.targetType,\n targetId: facet.targetId,\n dimension: facet.dimension,\n value: facet.value,\n confidence: facet.confidence,\n source: facet.source,\n evidenceEventIds: facet.evidenceEventIds,\n projectHash: facet.projectHash,\n createdAt: facet.createdAt.toISOString(),\n updatedAt: facet.updatedAt.toISOString()\n };\n}\n\nexport class FacetRepository {\n constructor(private readonly db: SQLiteDatabase) {}\n\n async assign(input: unknown): Promise<MemoryFacetAssignment> {\n const assignment = parseFacetAssignmentInput(input);\n const existing = this.findByUniqueKey(assignment);\n const now = new Date().toISOString();\n\n if (existing) {\n sqliteRun(\n this.db,\n `UPDATE memory_facets\n SET confidence = ?, evidence_event_ids = ?, project_hash = ?, updated_at = ?\n WHERE id = ?`,\n [\n assignment.confidence,\n JSON.stringify(assignment.evidenceEventIds),\n projectHashToStorage(assignment.projectHash),\n now,\n existing.id\n ]\n );\n const saved = this.getById(existing.id);\n await this.auditAssignment(assignment, existing, saved);\n return saved;\n }\n\n const id = randomUUID();\n sqliteRun(\n this.db,\n `INSERT INTO memory_facets (\n id, target_type, target_id, dimension, value, confidence, source,\n evidence_event_ids, project_hash, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n assignment.targetType,\n assignment.targetId,\n assignment.dimension,\n assignment.value,\n assignment.confidence,\n assignment.source,\n JSON.stringify(assignment.evidenceEventIds),\n projectHashToStorage(assignment.projectHash),\n now,\n now\n ]\n );\n\n const saved = this.getById(id);\n await this.auditAssignment(assignment, null, saved);\n return saved;\n }\n\n async remove(input: unknown): Promise<boolean> {\n const removeInput = parseFacetRemoveInput(input);\n const { sql, params } = this.removeSql(removeInput);\n const result = sqliteRun(this.db, sql, params);\n return result.changes > 0;\n }\n\n async query(input: unknown): Promise<MemoryFacetAssignment[]> {\n const query = parseFacetQuery(input);\n const { sql, params } = this.querySql(query);\n const rows = sqliteAll<MemoryFacetRow>(this.db, sql, params);\n return rows.map(rowToFacet);\n }\n\n async listForTarget(targetType: FacetTargetType, targetId: string): Promise<MemoryFacetAssignment[]> {\n const parsedTargetType = FacetTargetTypeSchema.parse(targetType);\n const trimmedTargetId = targetId.trim();\n if (!trimmedTargetId) {\n throw new Error('targetId is required');\n }\n return this.query({ targetType: parsedTargetType, targetId: trimmedTargetId, limit: 500 });\n }\n\n private getById(id: string): MemoryFacetAssignment {\n const row = sqliteGet<MemoryFacetRow>(this.db, `SELECT * FROM memory_facets WHERE id = ?`, [id]);\n if (!row) {\n throw new Error(`Memory facet not found after write: ${id}`);\n }\n return rowToFacet(row);\n }\n\n private findByUniqueKey(input: FacetAssignmentInput): MemoryFacetAssignment | null {\n const row = sqliteGet<MemoryFacetRow>(\n this.db,\n `SELECT * FROM memory_facets\n WHERE target_type = ? AND target_id = ? AND dimension = ? AND value = ? AND source = ? AND project_hash = ?`,\n [\n input.targetType,\n input.targetId,\n input.dimension,\n input.value,\n input.source,\n projectHashToStorage(input.projectHash)\n ]\n );\n return row ? rowToFacet(row) : null;\n }\n\n private async auditAssignment(\n input: FacetAssignmentInput,\n before: MemoryFacetAssignment | null,\n after: MemoryFacetAssignment\n ): Promise<void> {\n await writeGovernanceAuditEntry(this.db, {\n operation: 'facet_tag',\n actor: input.actor ?? 'cml-core',\n projectHash: input.projectHash,\n targetType: input.targetType,\n targetId: input.targetId,\n beforeJson: before ? facetToAuditJson(before) : undefined,\n afterJson: facetToAuditJson(after),\n sourceEventIds: input.evidenceEventIds\n });\n }\n\n private querySql(query: FacetQuery): { sql: string; params: unknown[] } {\n const clauses: string[] = [];\n const params: unknown[] = [];\n\n if (query.targetType) {\n clauses.push('target_type = ?');\n params.push(query.targetType);\n }\n if (query.targetId) {\n clauses.push('target_id = ?');\n params.push(query.targetId);\n }\n if (query.dimension) {\n clauses.push('dimension = ?');\n params.push(query.dimension);\n }\n if (query.value) {\n clauses.push('value = ?');\n params.push(query.value);\n }\n if (query.source) {\n clauses.push('source = ?');\n params.push(query.source);\n }\n if (query.projectHash) {\n clauses.push('project_hash = ?');\n params.push(query.projectHash);\n }\n\n const where = clauses.length > 0 ? `WHERE ${clauses.join(' AND ')}` : '';\n params.push(query.limit);\n return {\n sql: `SELECT * FROM memory_facets ${where} ORDER BY confidence DESC, updated_at DESC LIMIT ?`,\n params\n };\n }\n\n private removeSql(input: FacetRemoveInput): { sql: string; params: unknown[] } {\n const clauses = [\n 'target_type = ?',\n 'target_id = ?',\n 'dimension = ?',\n 'value = ?',\n 'source = ?',\n 'project_hash = ?'\n ];\n const params: unknown[] = [\n input.targetType,\n input.targetId,\n input.dimension,\n input.value,\n input.source,\n projectHashToStorage(input.projectHash)\n ];\n\n return {\n sql: `DELETE FROM memory_facets WHERE ${clauses.join(' AND ')}`,\n params\n };\n }\n}\n", "import { randomUUID } from 'crypto';\n\nimport {\n sqliteRun,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\n\nexport const MEMORY_GOVERNANCE_AUDIT_OPERATIONS = [\n 'facet_tag',\n 'action_update',\n 'lease_acquire',\n 'checkpoint_create',\n 'retention_score',\n 'quarantine',\n 'verify',\n 'lesson_promote',\n 'actor_card_upsert',\n 'perspective_observation_create',\n 'perspective_observation_delete'\n] as const;\n\nexport type MemoryGovernanceAuditOperation = typeof MEMORY_GOVERNANCE_AUDIT_OPERATIONS[number];\n\nexport interface GovernanceAuditEntryInput {\n operation: MemoryGovernanceAuditOperation;\n actor: string;\n projectHash?: string;\n targetType: string;\n targetId: string;\n beforeJson?: Record<string, unknown>;\n afterJson?: Record<string, unknown>;\n sourceEventIds?: string[];\n}\n\nexport interface MemoryGovernanceAuditEntry {\n auditId: string;\n operation: MemoryGovernanceAuditOperation;\n actor: string;\n projectHash?: string;\n targetType: string;\n targetId: string;\n beforeJson?: Record<string, unknown>;\n afterJson?: Record<string, unknown>;\n sourceEventIds: string[];\n createdAt: Date;\n}\n\nfunction normalizeRequiredString(value: string, fieldName: string): string {\n const normalized = value.trim();\n if (!normalized) {\n throw new Error(`${fieldName} is required`);\n }\n return normalized;\n}\n\nfunction normalizeOptionalString(value: string | undefined): string | undefined {\n const normalized = value?.trim();\n return normalized ? normalized : undefined;\n}\n\nconst REDACTED = '[REDACTED]';\nconst sensitiveKeyPattern = /(?:api[_-]?key|secret|password|passwd|token|access[_-]?token|client[_-]?secret|crtfc[_-]?key|hashkey|serviceKey)/i;\nconst POSIX_ABSOLUTE_PATH_PATTERN = /(^|[^A-Za-z0-9._\\/\\\\-])\\/(?!\\/)[^\\n\\r\"'<>|`]*/g;\nconst WINDOWS_DRIVE_PATH_PATTERN = /(^|[^A-Za-z0-9._\\/\\\\-])(?:[A-Za-z]:[\\\\/][^\\n\\r\"'<>|`]*)/g;\nconst WINDOWS_UNC_PATH_PATTERN = /(^|[^A-Za-z0-9._\\/\\\\-])(?:\\\\\\\\[^\\\\\\n\\r\"'<>|`]+\\\\[^\\n\\r\"'<>|`]*)/g;\nconst credentialQueryPattern = /\\b((?:api[_-]?key|token|access[_-]?token|client[_-]?secret|crtfc[_-]?key|hashkey|serviceKey)=)[^&\\s`\"'<>]+/gi;\nconst credentialAssignmentPattern = /\\b((?:api[_-]?key|secret|password|passwd|token|access[_-]?token|client[_-]?secret|crtfc[_-]?key|hashkey|serviceKey)\\s*[:=]\\s*)[^\\s`\"'<>},]+/gi;\n\nfunction redactAbsolutePaths(value: string): string {\n return value\n .replace(WINDOWS_UNC_PATH_PATTERN, (_match, prefix: string) => `${prefix}${REDACTED}`)\n .replace(WINDOWS_DRIVE_PATH_PATTERN, (_match, prefix: string) => `${prefix}${REDACTED}`)\n .replace(POSIX_ABSOLUTE_PATH_PATTERN, (_match, prefix: string) => `${prefix}${REDACTED}`);\n}\n\nfunction sanitizeAuditString(value: string): string {\n return redactAbsolutePaths(value)\n .replace(credentialQueryPattern, `$1${REDACTED}`)\n .replace(credentialAssignmentPattern, `$1${REDACTED}`);\n}\n\nexport function sanitizeGovernanceAuditValue(value: unknown, key?: string): unknown {\n if (key && sensitiveKeyPattern.test(key)) {\n return REDACTED;\n }\n if (typeof value === 'string') {\n return sanitizeAuditString(value);\n }\n if (value instanceof Date) {\n return sanitizeAuditString(value.toISOString());\n }\n if (Array.isArray(value)) {\n return value.map((item) => sanitizeGovernanceAuditValue(item));\n }\n if (value && typeof value === 'object') {\n const sanitized: Record<string, unknown> = {};\n for (const [entryKey, entryValue] of Object.entries(value as Record<string, unknown>)) {\n sanitized[sanitizeAuditString(entryKey)] = sanitizeGovernanceAuditValue(entryValue, entryKey);\n }\n return sanitized;\n }\n return value;\n}\n\nfunction sanitizeAuditJson(value: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n if (value === undefined) return undefined;\n return sanitizeGovernanceAuditValue(value) as Record<string, unknown>;\n}\n\nfunction normalizeSourceEventIds(sourceEventIds: string[] | undefined): string[] {\n return (sourceEventIds || [])\n .map((sourceEventId) => sanitizeAuditString(sourceEventId.trim()))\n .filter((sourceEventId) => sourceEventId.length > 0);\n}\n\nfunction normalizeOperation(operation: MemoryGovernanceAuditOperation): MemoryGovernanceAuditOperation {\n if ((MEMORY_GOVERNANCE_AUDIT_OPERATIONS as readonly string[]).indexOf(operation) === -1) {\n throw new Error(`Unsupported governance audit operation: ${operation}`);\n }\n return operation;\n}\n\nexport async function writeGovernanceAuditEntry(\n db: SQLiteDatabase,\n input: GovernanceAuditEntryInput\n): Promise<MemoryGovernanceAuditEntry> {\n const entry: MemoryGovernanceAuditEntry = {\n auditId: randomUUID(),\n operation: normalizeOperation(input.operation),\n actor: sanitizeAuditString(normalizeRequiredString(input.actor, 'actor')),\n projectHash: normalizeOptionalString(input.projectHash),\n targetType: normalizeRequiredString(input.targetType, 'targetType'),\n targetId: sanitizeAuditString(normalizeRequiredString(input.targetId, 'targetId')),\n beforeJson: sanitizeAuditJson(input.beforeJson),\n afterJson: sanitizeAuditJson(input.afterJson),\n sourceEventIds: normalizeSourceEventIds(input.sourceEventIds),\n createdAt: new Date()\n };\n\n sqliteRun(\n db,\n `INSERT INTO memory_governance_audit (\n audit_id, operation, actor, project_hash, target_type, target_id,\n before_json, after_json, source_event_ids, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n entry.auditId,\n entry.operation,\n entry.actor,\n entry.projectHash ?? null,\n entry.targetType,\n entry.targetId,\n entry.beforeJson === undefined ? null : JSON.stringify(entry.beforeJson),\n entry.afterJson === undefined ? null : JSON.stringify(entry.afterJson),\n JSON.stringify(entry.sourceEventIds),\n entry.createdAt.toISOString()\n ]\n );\n\n return entry;\n}\n", "import { z } from 'zod';\n\nconst NonEmptyStringSchema = z.string().transform((value) => value.trim()).pipe(z.string().min(1));\nconst StringArraySchema = z.array(z.string().transform((value) => value.trim()).pipe(z.string().min(1))).default([]);\nconst DateInputSchema = z.union([z.date(), z.string().datetime()]).transform((value) => value instanceof Date ? value : new Date(value));\n\nexport const MemoryActionStatusSchema = z.enum(['pending', 'in_progress', 'blocked', 'done', 'cancelled']);\nexport type MemoryActionStatus = z.infer<typeof MemoryActionStatusSchema>;\n\nexport const MemoryActionEdgeRelTypeSchema = z.enum(['depends_on', 'blocks', 'duplicates', 'derived_from', 'references']);\nexport type MemoryActionEdgeRelType = z.infer<typeof MemoryActionEdgeRelTypeSchema>;\n\nexport const MemoryActionEdgeDstTypeSchema = z.enum(['action', 'entity', 'event', 'source_ref']);\nexport type MemoryActionEdgeDstType = z.infer<typeof MemoryActionEdgeDstTypeSchema>;\n\nexport const MemoryActionEdgeSourceSchema = z.enum(['manual', 'task_projector']);\nexport type MemoryActionEdgeSource = z.infer<typeof MemoryActionEdgeSourceSchema>;\n\nexport const LeaseTargetTypeSchema = z.enum(['action', 'checkpoint', 'routine']);\nexport type LeaseTargetType = z.infer<typeof LeaseTargetTypeSchema>;\n\nexport interface MemoryAction {\n actionId: string;\n projectHash: string;\n title: string;\n status: MemoryActionStatus;\n priority: number;\n sourceEventIds: string[];\n relatedEntityIds: string[];\n currentCheckpointId?: string;\n leaseId?: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface MemoryActionEdge {\n edgeId: string;\n srcActionId: string;\n relType: MemoryActionEdgeRelType;\n dstType: MemoryActionEdgeDstType;\n dstId: string;\n confidence: number;\n source: MemoryActionEdgeSource;\n createdAt: Date;\n}\n\nexport interface MemoryLease {\n leaseId: string;\n targetType: LeaseTargetType;\n targetId: string;\n holder: string;\n expiresAt: Date;\n metadata?: Record<string, unknown>;\n createdAt: Date;\n renewedAt?: Date;\n releasedAt?: Date;\n}\n\nexport interface MemoryCheckpoint {\n checkpointId: string;\n projectHash: string;\n actionId?: string;\n sessionId?: string;\n title: string;\n summary: string;\n stateJson: Record<string, unknown>;\n sourceEventIds: string[];\n createdAt: Date;\n expiresAt?: Date;\n}\n\nexport const UpsertActionInputSchema = z.object({\n actionId: z.string().uuid().optional(),\n projectHash: NonEmptyStringSchema,\n title: NonEmptyStringSchema,\n status: MemoryActionStatusSchema.default('pending'),\n priority: z.number().int().min(0).max(100).default(0),\n sourceEventIds: StringArraySchema,\n relatedEntityIds: StringArraySchema,\n currentCheckpointId: NonEmptyStringSchema.optional(),\n leaseId: NonEmptyStringSchema.optional(),\n actor: NonEmptyStringSchema.optional()\n});\nexport type UpsertActionInput = z.infer<typeof UpsertActionInputSchema>;\n\nexport const UpdateActionInputSchema = z.object({\n actionId: z.string().uuid(),\n projectHash: NonEmptyStringSchema,\n title: NonEmptyStringSchema.optional(),\n status: MemoryActionStatusSchema.optional(),\n priority: z.number().int().min(0).max(100).optional(),\n sourceEventIds: StringArraySchema.optional(),\n relatedEntityIds: StringArraySchema.optional(),\n currentCheckpointId: NonEmptyStringSchema.nullish(),\n leaseId: NonEmptyStringSchema.nullish(),\n actor: NonEmptyStringSchema.optional(),\n note: NonEmptyStringSchema.optional()\n});\nexport type UpdateActionInput = z.infer<typeof UpdateActionInputSchema>;\n\nexport const ListActionsInputSchema = z.object({\n projectHash: NonEmptyStringSchema,\n status: MemoryActionStatusSchema.optional(),\n includeTerminal: z.boolean().default(false),\n limit: z.number().int().positive().max(500).default(50)\n});\nexport type ListActionsInput = z.infer<typeof ListActionsInputSchema>;\n\nexport const ActionEdgeInputSchema = z.object({\n srcActionId: z.string().uuid(),\n relType: MemoryActionEdgeRelTypeSchema,\n dstType: MemoryActionEdgeDstTypeSchema,\n dstId: NonEmptyStringSchema,\n confidence: z.number().min(0).max(1).default(1),\n source: MemoryActionEdgeSourceSchema.default('manual')\n});\nexport type ActionEdgeInput = z.infer<typeof ActionEdgeInputSchema>;\n\nexport const AcquireLeaseInputSchema = z.object({\n targetType: LeaseTargetTypeSchema,\n targetId: NonEmptyStringSchema,\n holder: NonEmptyStringSchema,\n expiresAt: DateInputSchema,\n now: DateInputSchema.optional(),\n metadata: z.record(z.unknown()).optional(),\n actor: NonEmptyStringSchema.optional(),\n projectHash: NonEmptyStringSchema.optional()\n});\nexport type AcquireLeaseInput = z.infer<typeof AcquireLeaseInputSchema>;\n\nexport const RenewLeaseInputSchema = z.object({\n leaseId: z.string().uuid(),\n holder: NonEmptyStringSchema,\n expiresAt: DateInputSchema,\n now: DateInputSchema.optional(),\n actor: NonEmptyStringSchema.optional(),\n projectHash: NonEmptyStringSchema.optional()\n});\nexport type RenewLeaseInput = z.infer<typeof RenewLeaseInputSchema>;\n\nexport const ReleaseLeaseInputSchema = z.object({\n leaseId: z.string().uuid(),\n holder: NonEmptyStringSchema,\n actor: NonEmptyStringSchema.optional(),\n projectHash: NonEmptyStringSchema.optional()\n});\nexport type ReleaseLeaseInput = z.infer<typeof ReleaseLeaseInputSchema>;\n\nexport const CreateCheckpointInputSchema = z.object({\n checkpointId: z.string().uuid().optional(),\n projectHash: NonEmptyStringSchema,\n actionId: NonEmptyStringSchema.optional(),\n sessionId: NonEmptyStringSchema.optional(),\n title: NonEmptyStringSchema,\n summary: NonEmptyStringSchema,\n stateJson: z.record(z.unknown()).default({}),\n sourceEventIds: StringArraySchema,\n expiresAt: DateInputSchema.optional(),\n actor: NonEmptyStringSchema.optional()\n});\nexport type CreateCheckpointInput = z.infer<typeof CreateCheckpointInputSchema>;\n\nexport const ListCheckpointsInputSchema = z.object({\n projectHash: NonEmptyStringSchema,\n actionId: NonEmptyStringSchema.optional(),\n sessionId: NonEmptyStringSchema.optional(),\n limit: z.number().int().positive().max(500).default(50)\n});\nexport type ListCheckpointsInput = z.infer<typeof ListCheckpointsInputSchema>;\n", "import { z } from 'zod';\n\nimport {\n sqliteAll,\n toDateFromSQLite,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\nimport { MemoryActionStatusSchema, type MemoryAction, type MemoryActionStatus } from './actions.js';\n\nconst NonEmptyStringSchema = z.string().transform((value) => value.trim()).pipe(z.string().min(1));\n\nexport const FrontierRankInputSchema = z.object({\n projectHash: NonEmptyStringSchema,\n includeBlocked: z.boolean().default(false),\n limit: z.number().int().positive().max(500).default(50),\n now: z.union([z.date(), z.string().datetime()]).transform((value) => value instanceof Date ? value : new Date(value)).optional()\n});\nexport type FrontierRankInput = z.infer<typeof FrontierRankInputSchema>;\n\nexport interface FrontierItem {\n action: MemoryAction;\n score: number;\n reasons: string[];\n sourceRefs: string[];\n}\n\ninterface MemoryActionRow {\n action_id: string;\n project_hash: string;\n title: string;\n status: string;\n priority: number;\n source_event_ids: string;\n related_entity_ids: string;\n current_checkpoint_id: string | null;\n lease_id: string | null;\n created_at: string;\n updated_at: string;\n}\n\ninterface MemoryActionEdgeRow {\n src_action_id: string;\n rel_type: string;\n dst_type: string;\n dst_id: string;\n confidence: number;\n}\n\ninterface MemoryLeaseRow {\n target_id: string;\n holder: string;\n}\n\ninterface MemoryFacetRow {\n target_id: string;\n dimension: string;\n value: string;\n confidence: number;\n evidence_event_ids: string;\n}\n\nfunction parseStringArray(value: unknown): string[] {\n if (typeof value !== 'string') return [];\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? parsed.filter((item): item is string => typeof item === 'string' && item.length > 0) : [];\n } catch {\n return [];\n }\n}\n\nfunction unique(values: string[]): string[] {\n return Array.from(new Set(values.filter((value) => value.length > 0)));\n}\n\nfunction rowToAction(row: MemoryActionRow): MemoryAction {\n return {\n actionId: row.action_id,\n projectHash: row.project_hash,\n title: row.title,\n status: MemoryActionStatusSchema.parse(row.status),\n priority: Number(row.priority),\n sourceEventIds: parseStringArray(row.source_event_ids),\n relatedEntityIds: parseStringArray(row.related_entity_ids),\n currentCheckpointId: row.current_checkpoint_id ?? undefined,\n leaseId: row.lease_id ?? undefined,\n createdAt: toDateFromSQLite(row.created_at),\n updatedAt: toDateFromSQLite(row.updated_at)\n };\n}\n\nfunction placeholders(values: readonly unknown[]): string {\n return values.map(() => '?').join(', ');\n}\n\nfunction terminalStatus(status: MemoryActionStatus): boolean {\n return status === 'done' || status === 'cancelled';\n}\n\nexport class FrontierService {\n constructor(private readonly db: SQLiteDatabase) {}\n\n async rank(input: unknown): Promise<FrontierItem[]> {\n const parsed = FrontierRankInputSchema.parse(input);\n const now = parsed.now ?? new Date();\n const actions = this.listCandidateActions(parsed.projectHash);\n if (actions.length === 0) return [];\n\n const actionIds = actions.map((action) => action.actionId);\n const edgesByAction = this.edgesByAction(actionIds);\n const actionStatusById = this.actionStatusesById(parsed.projectHash, this.actionStatusIds(actionIds, edgesByAction));\n const activeLeases = this.activeLeasesByAction(actionIds, now);\n const facetsByAction = this.qualityFacetsByAction(parsed.projectHash, actionIds);\n\n return actions\n .map((action) => this.scoreAction({\n action,\n now,\n includeBlocked: parsed.includeBlocked,\n edges: edgesByAction.get(action.actionId) ?? [],\n actionStatusById,\n activeLease: activeLeases.get(action.actionId),\n qualityFacets: facetsByAction.get(action.actionId) ?? []\n }))\n .sort((left, right) => {\n if (right.score !== left.score) return right.score - left.score;\n return right.action.updatedAt.getTime() - left.action.updatedAt.getTime();\n })\n .slice(0, parsed.limit);\n }\n\n private listCandidateActions(projectHash: string): MemoryAction[] {\n const rows = sqliteAll<MemoryActionRow>(\n this.db,\n `SELECT * FROM memory_actions\n WHERE project_hash = ? AND status NOT IN ('done', 'cancelled')\n ORDER BY updated_at DESC\n LIMIT ?`,\n [projectHash, 500]\n );\n return rows.map(rowToAction);\n }\n\n private edgesByAction(actionIds: string[]): Map<string, MemoryActionEdgeRow[]> {\n if (actionIds.length === 0) return new Map();\n const rows = sqliteAll<MemoryActionEdgeRow>(\n this.db,\n `SELECT src_action_id, rel_type, dst_type, dst_id, confidence\n FROM memory_action_edges\n WHERE src_action_id IN (${placeholders(actionIds)})`,\n actionIds\n );\n const grouped = new Map<string, MemoryActionEdgeRow[]>();\n for (const row of rows) {\n const current = grouped.get(row.src_action_id) ?? [];\n current.push(row);\n grouped.set(row.src_action_id, current);\n }\n return grouped;\n }\n\n private actionStatusIds(actionIds: string[], edgesByAction: Map<string, MemoryActionEdgeRow[]>): string[] {\n const ids = new Set(actionIds);\n for (const edges of Array.from(edgesByAction.values())) {\n for (const edge of edges) {\n if (edge.dst_type === 'action') ids.add(edge.dst_id);\n }\n }\n return Array.from(ids);\n }\n\n private actionStatusesById(projectHash: string, actionIds: string[]): Map<string, MemoryActionStatus> {\n if (actionIds.length === 0) return new Map();\n const rows = sqliteAll<{ action_id: string; status: string }>(\n this.db,\n `SELECT action_id, status\n FROM memory_actions\n WHERE project_hash = ? AND action_id IN (${placeholders(actionIds)})`,\n [projectHash, ...actionIds]\n );\n return new Map(rows.map((row) => [row.action_id, MemoryActionStatusSchema.parse(row.status)]));\n }\n\n private activeLeasesByAction(actionIds: string[], now: Date): Map<string, MemoryLeaseRow> {\n if (actionIds.length === 0) return new Map();\n const rows = sqliteAll<MemoryLeaseRow>(\n this.db,\n `SELECT target_id, holder\n FROM memory_leases\n WHERE target_type = 'action'\n AND released_at IS NULL\n AND expires_at > ?\n AND target_id IN (${placeholders(actionIds)})`,\n [now.toISOString(), ...actionIds]\n );\n return new Map(rows.map((row) => [row.target_id, row]));\n }\n\n private qualityFacetsByAction(projectHash: string, actionIds: string[]): Map<string, MemoryFacetRow[]> {\n if (actionIds.length === 0) return new Map();\n const rows = sqliteAll<MemoryFacetRow>(\n this.db,\n `SELECT target_id, dimension, value, confidence, evidence_event_ids\n FROM memory_facets\n WHERE project_hash = ?\n AND target_type = 'action'\n AND dimension = 'quality'\n AND value IN ('verified', 'high-quality', 'high_quality', 'high')\n AND target_id IN (${placeholders(actionIds)})`,\n [projectHash, ...actionIds]\n );\n const grouped = new Map<string, MemoryFacetRow[]>();\n for (const row of rows) {\n const current = grouped.get(row.target_id) ?? [];\n current.push(row);\n grouped.set(row.target_id, current);\n }\n return grouped;\n }\n\n private scoreAction(input: {\n action: MemoryAction;\n now: Date;\n includeBlocked: boolean;\n edges: MemoryActionEdgeRow[];\n actionStatusById: Map<string, MemoryActionStatus>;\n activeLease?: MemoryLeaseRow;\n qualityFacets: MemoryFacetRow[];\n }): FrontierItem {\n const { action, now, includeBlocked, edges, actionStatusById, activeLease, qualityFacets } = input;\n let score = action.priority * 5;\n const reasons: string[] = [`priority:${action.priority}`];\n const sourceRefs: string[] = [...action.sourceEventIds];\n\n if (action.status === 'in_progress') {\n score += 15;\n reasons.push('status:in_progress');\n } else if (action.status === 'pending') {\n score += 5;\n reasons.push('status:pending');\n } else if (action.status === 'blocked') {\n if (includeBlocked) {\n reasons.push('status:blocked_included');\n } else {\n score -= 500;\n reasons.push('status:blocked_penalty');\n }\n }\n\n const ageMs = Math.max(0, now.getTime() - action.updatedAt.getTime());\n const ageDays = ageMs / 86_400_000;\n const recencyScore = Math.max(0, 10 - ageDays * 2);\n if (recencyScore > 0) {\n score += recencyScore;\n reasons.push('recent_update');\n }\n\n if (activeLease) {\n score -= 100;\n reasons.push(`active_lease:${activeLease.holder}`);\n } else {\n score += 5;\n reasons.push('no_active_lease');\n }\n\n for (const edge of edges) {\n if (edge.dst_type === 'event' || edge.dst_type === 'source_ref') {\n sourceRefs.push(edge.dst_id);\n }\n if (this.isBlockingEdge(edge, actionStatusById)) {\n score -= Math.round(100 * Number(edge.confidence));\n reasons.push(`blocked_by:${edge.dst_type}`);\n }\n }\n\n for (const facet of qualityFacets) {\n const confidence = Math.max(0, Math.min(1, Number(facet.confidence)));\n score += Math.round(80 * confidence);\n reasons.push(`quality:${facet.value}`);\n sourceRefs.push(...parseStringArray(facet.evidence_event_ids));\n }\n\n return {\n action,\n score: Math.round(score * 1000) / 1000,\n reasons: unique(reasons),\n sourceRefs: unique(sourceRefs)\n };\n }\n\n private isBlockingEdge(edge: MemoryActionEdgeRow, actionStatusById: Map<string, MemoryActionStatus>): boolean {\n if (edge.rel_type !== 'depends_on') return false;\n if (edge.dst_type !== 'action') return true;\n const dstStatus = actionStatusById.get(edge.dst_id);\n return dstStatus === undefined || !terminalStatus(dstStatus);\n }\n}\n", "import { createHash } from 'crypto';\nimport { z } from 'zod';\n\nimport {\n sqliteAll,\n sqliteGet,\n sqliteRun,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\nimport { ActionRepository } from './action-repository.js';\nimport {\n MemoryActionStatusSchema,\n type MemoryAction,\n type MemoryActionStatus\n} from './actions.js';\n\nconst NonEmptyStringSchema = z.string().transform((value) => value.trim()).pipe(z.string().min(1));\n\nexport const ProjectTaskActionsInputSchema = z.object({\n projectHash: NonEmptyStringSchema,\n project: NonEmptyStringSchema.optional(),\n actor: NonEmptyStringSchema.optional(),\n limit: z.number().int().positive().max(500).default(100)\n});\nexport type ProjectTaskActionsInput = z.infer<typeof ProjectTaskActionsInputSchema>;\n\nexport interface ProjectTaskActionsResult {\n scanned: number;\n created: number;\n updated: number;\n unchanged: number;\n skipped: number;\n actions: MemoryAction[];\n}\n\ninterface TaskEntityRow {\n entity_id: string;\n title: string;\n current_json: string;\n}\n\ninterface EntityEdgeRow {\n rel_type: string;\n dst_type: string;\n dst_id: string;\n meta_json: string | null;\n}\n\ninterface MemoryActionEdgeRow {\n edge_id: string;\n dst_type: string;\n dst_id: string;\n}\n\ninterface EntityProjectRow {\n entity_type: string;\n current_json: string;\n}\n\nconst TASK_EVENT_TYPES = [\n 'task_created',\n 'task_status_changed',\n 'task_priority_changed',\n 'task_blockers_set',\n 'task_transition_rejected'\n] as const;\n\nconst PRIORITY_SCORE: Record<string, number> = {\n low: 25,\n medium: 50,\n high: 75,\n critical: 100\n};\n\nexport class TaskActionProjector {\n constructor(\n private readonly db: SQLiteDatabase,\n private readonly actions: ActionRepository = new ActionRepository(db)\n ) {}\n\n async project(input: unknown): Promise<ProjectTaskActionsResult> {\n const parsed = ProjectTaskActionsInputSchema.parse(input);\n const empty = (): ProjectTaskActionsResult => ({\n scanned: 0,\n created: 0,\n updated: 0,\n unchanged: 0,\n skipped: 0,\n actions: []\n });\n\n if (!parsed.project || !this.tableExists('entities')) return empty();\n const scopedInput = { ...parsed, project: parsed.project };\n\n const rows = this.listTaskEntities(scopedInput.project, scopedInput.limit);\n const result = empty();\n result.scanned = rows.length;\n\n for (const row of rows) {\n const projected = await this.projectTaskRow(row, scopedInput);\n if (!projected) {\n result.skipped += 1;\n continue;\n }\n result[projected.kind] += 1;\n result.actions.push(projected.action);\n }\n\n return result;\n }\n\n private async projectTaskRow(\n row: TaskEntityRow,\n input: ProjectTaskActionsInput & { project: string }\n ): Promise<{ kind: 'created' | 'updated' | 'unchanged'; action: MemoryAction } | null> {\n const current = parseJsonObject(row.current_json);\n if (!current) return null;\n if (current.project !== input.project) return null;\n\n const actionId = actionIdForTaskEntity(row.entity_id);\n const before = this.actions.get(actionId);\n if (before && before.projectHash !== input.projectHash) return null;\n\n const desired = {\n actionId,\n projectHash: input.projectHash,\n title: row.title,\n status: parseActionStatus(current.status),\n priority: priorityToScore(current.priority),\n sourceEventIds: this.existingEventIds(uniqueStrings([\n ...extractStringArray(current.sourceEventIds),\n ...this.sourceTaskEventIds(row.entity_id)\n ])),\n relatedEntityIds: [row.entity_id],\n actor: input.actor ?? 'cml-core'\n };\n\n let action: MemoryAction;\n let kind: 'created' | 'updated' | 'unchanged';\n if (!before) {\n action = await this.actions.upsert(desired);\n kind = 'created';\n } else if (actionMatchesDesired(before, desired)) {\n action = before;\n kind = 'unchanged';\n } else {\n action = await this.actions.update(desired);\n kind = 'updated';\n }\n\n await this.syncBlockerEdges({ actionId: action.actionId, entityId: row.entity_id, project: input.project });\n return { kind, action };\n }\n\n private tableExists(tableName: string): boolean {\n const row = sqliteGet<{ name: string }>(\n this.db,\n `SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?`,\n [tableName]\n );\n return Boolean(row);\n }\n\n private listTaskEntities(project: string, limit: number): TaskEntityRow[] {\n return sqliteAll<TaskEntityRow>(\n this.db,\n `SELECT entity_id, title, current_json\n FROM entities\n WHERE entity_type = 'task'\n AND status = 'active'\n AND CASE\n WHEN json_valid(current_json) THEN json_extract(current_json, '$.project')\n ELSE NULL\n END = ?\n ORDER BY updated_at DESC\n LIMIT ?`,\n [project, limit]\n );\n }\n\n private sourceTaskEventIds(taskId: string): string[] {\n const keys = TASK_EVENT_TYPES.map((eventType) => `task_event:${eventType}:${taskId}`);\n if (keys.length === 0) return [];\n const rows = sqliteAll<{ id: string }>(\n this.db,\n `SELECT id FROM events WHERE canonical_key IN (?, ?, ?, ?, ?) ORDER BY timestamp ASC`,\n keys\n );\n return rows.map((row) => row.id);\n }\n\n private existingEventIds(eventIds: string[]): string[] {\n if (eventIds.length === 0) return [];\n const placeholders = eventIds.map(() => '?').join(', ');\n const rows = sqliteAll<{ id: string }>(\n this.db,\n 'SELECT id FROM events WHERE id IN (' + placeholders + ')',\n eventIds\n );\n const existing = new Set(rows.map((row) => row.id));\n return eventIds.filter((eventId) => existing.has(eventId));\n }\n\n private async syncBlockerEdges(input: { actionId: string; entityId: string; project: string }): Promise<void> {\n const rows = sqliteAll<EntityEdgeRow>(\n this.db,\n `SELECT rel_type, dst_type, dst_id, meta_json\n FROM edges\n WHERE src_type = 'entity'\n AND src_id = ?\n AND rel_type IN ('blocked_by', 'blocked_by_suggested')`,\n [input.entityId]\n );\n\n const desiredEdges = rows.map((row) => {\n const dst = this.actionEdgeDestination(row, input.project);\n return {\n dstType: dst.dstType,\n dstId: dst.dstId,\n confidence: edgeConfidence(row),\n key: `${dst.dstType}:${dst.dstId}`\n };\n });\n const desiredKeys = new Set(desiredEdges.map((edge) => edge.key));\n const existingEdges = sqliteAll<MemoryActionEdgeRow>(\n this.db,\n `SELECT edge_id, dst_type, dst_id\n FROM memory_action_edges\n WHERE src_action_id = ?\n AND rel_type = 'depends_on'\n AND dst_type IN ('action', 'entity')\n AND source = 'task_projector'`,\n [input.actionId]\n );\n for (const existing of existingEdges) {\n if (!desiredKeys.has(`${existing.dst_type}:${existing.dst_id}`)) {\n sqliteRun(this.db, `DELETE FROM memory_action_edges WHERE edge_id = ?`, [existing.edge_id]);\n }\n }\n\n for (const edge of desiredEdges) {\n await this.actions.addEdge({\n srcActionId: input.actionId,\n relType: 'depends_on',\n dstType: edge.dstType,\n dstId: edge.dstId,\n confidence: edge.confidence,\n source: 'task_projector'\n });\n }\n }\n\n private actionEdgeDestination(row: EntityEdgeRow, project: string): { dstType: 'action' | 'entity'; dstId: string } {\n if (row.dst_type !== 'entity') return { dstType: 'entity', dstId: row.dst_id };\n const dstEntity = sqliteGet<EntityProjectRow>(\n this.db,\n `SELECT entity_type, current_json FROM entities WHERE entity_id = ?`,\n [row.dst_id]\n );\n if (!dstEntity || dstEntity.entity_type !== 'task') return { dstType: 'entity', dstId: row.dst_id };\n const current = parseJsonObject(dstEntity.current_json);\n if (!current || current.project !== project) return { dstType: 'entity', dstId: row.dst_id };\n return { dstType: 'action', dstId: actionIdForTaskEntity(row.dst_id) };\n }\n}\n\nexport function actionIdForTaskEntity(entityId: string): string {\n const bytes = createHash('sha256').update(`memory-action:task:${entityId}`).digest().subarray(0, 16);\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = bytes.toString('hex');\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20, 32)\n ].join('-');\n}\n\nfunction parseJsonObject(value: unknown): Record<string, unknown> | null {\n if (typeof value !== 'string') return null;\n try {\n const parsed = JSON.parse(value);\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed as Record<string, unknown> : null;\n } catch {\n return null;\n }\n}\n\nfunction parseActionStatus(value: unknown): MemoryActionStatus {\n const parsed = MemoryActionStatusSchema.safeParse(value);\n return parsed.success ? parsed.data : 'pending';\n}\n\nfunction priorityToScore(value: unknown): number {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return Math.max(0, Math.min(100, Math.round(value)));\n }\n if (typeof value !== 'string') return PRIORITY_SCORE.medium;\n return PRIORITY_SCORE[value] ?? PRIORITY_SCORE.medium;\n}\n\nfunction extractStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is string => typeof item === 'string' && item.trim().length > 0).map((item) => item.trim());\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return Array.from(new Set(values.filter((value) => value.length > 0)));\n}\n\nfunction actionMatchesDesired(\n action: MemoryAction,\n desired: {\n title: string;\n status: MemoryActionStatus;\n priority: number;\n sourceEventIds: string[];\n relatedEntityIds: string[];\n }\n): boolean {\n return action.title === desired.title\n && action.status === desired.status\n && action.priority === desired.priority\n && arraysEqual(action.sourceEventIds, desired.sourceEventIds)\n && arraysEqual(action.relatedEntityIds, desired.relatedEntityIds);\n}\n\nfunction arraysEqual(a: string[], b: string[]): boolean {\n return a.length === b.length && a.every((value, index) => value === b[index]);\n}\n\nfunction edgeConfidence(row: EntityEdgeRow): number {\n const meta = parseJsonObject(row.meta_json);\n const confidence = typeof meta?.confidence === 'number' ? meta.confidence : row.rel_type === 'blocked_by_suggested' ? 0.5 : 1;\n return Math.max(0, Math.min(1, confidence));\n}\n", "import { z } from 'zod';\n\nexport const RETENTION_POLICY_VERSION = 'v1' as const;\n\nexport const RetentionDecisionSchema = z.enum([\n 'keep',\n 'review',\n 'downgrade',\n 'quarantine',\n 'tombstone_candidate'\n]);\nexport type RetentionDecision = z.infer<typeof RetentionDecisionSchema>;\n\nexport const RetentionDryRunActionSchema = z.enum([\n 'none',\n 'already_quarantined',\n 'mark_review_required',\n 'mark_downgrade_candidate',\n 'mark_tombstone_candidate',\n 'mark_quarantine_candidate'\n]);\nexport type RetentionDryRunAction = z.infer<typeof RetentionDryRunActionSchema>;\n\nexport const RetentionTargetTypeSchema = z.enum([\n 'event',\n 'entity',\n 'edge',\n 'consolidated_memory',\n 'lesson',\n 'action'\n]);\nexport type RetentionTargetType = z.infer<typeof RetentionTargetTypeSchema>;\n\nexport const RetentionMemoryLevelSchema = z.enum(['L0', 'L1', 'L2', 'L3', 'L4']);\nexport type RetentionMemoryLevel = z.infer<typeof RetentionMemoryLevelSchema>;\n\nexport const RetentionFacetSchema = z.object({\n dimension: z.string().trim().min(1),\n value: z.string().trim().min(1),\n confidence: z.number().min(0).max(1).default(1)\n});\nexport type RetentionFacet = z.infer<typeof RetentionFacetSchema>;\n\nconst DateLikeSchema = z.preprocess((value) => {\n if (value instanceof Date) return value;\n if (typeof value === 'string' || typeof value === 'number') return new Date(value);\n return value;\n}, z.date());\n\nconst NullableDateLikeSchema = z.preprocess((value) => {\n if (value === null || value === undefined || value === '') return null;\n if (value instanceof Date) return value;\n if (typeof value === 'string' || typeof value === 'number') return new Date(value);\n return value;\n}, z.date().nullable());\n\nconst OptionalTrimmedStringSchema = z.preprocess(\n (value) => typeof value === 'string' ? value.trim() : value,\n z.string().min(1).optional()\n);\n\nexport const RetentionPolicyInputSchema = z.object({\n targetId: z.string().trim().min(1),\n targetType: RetentionTargetTypeSchema.default('event'),\n projectHash: OptionalTrimmedStringSchema,\n eventType: z.string().trim().min(1).optional(),\n memoryLevel: RetentionMemoryLevelSchema.default('L0'),\n createdAt: DateLikeSchema,\n lastAccessedAt: NullableDateLikeSchema.optional().default(null),\n retrievalCount: z.number().int().min(0).default(0),\n helpfulnessScore: z.number().min(0).max(1).optional(),\n adherenceScore: z.number().min(0).max(1).optional(),\n evidenceConfidence: z.number().min(0).max(1).optional(),\n metadata: z.record(z.unknown()).default({}),\n facets: z.array(RetentionFacetSchema).default([])\n});\nexport type RetentionPolicyInput = z.input<typeof RetentionPolicyInputSchema>;\ntype ParsedRetentionPolicyInput = z.output<typeof RetentionPolicyInputSchema>;\n\nexport interface RetentionReason {\n code: string;\n message: string;\n contribution: number;\n}\n\nexport interface RetentionScoreFactors {\n level: number;\n recency: number;\n retrieval: number;\n helpfulness: number;\n evidence: number;\n eventType: number;\n privacy: number;\n manual: number;\n}\n\nexport interface RetentionDryRunDiff {\n wouldChange: boolean;\n action: RetentionDryRunAction;\n after?: {\n retentionDecision: RetentionDecision;\n policyVersion: typeof RETENTION_POLICY_VERSION;\n };\n}\n\nexport interface RetentionPolicyResult {\n targetId: string;\n targetType: RetentionTargetType;\n projectHash?: string;\n policyVersion: typeof RETENTION_POLICY_VERSION;\n dryRun: true;\n decision: RetentionDecision;\n lifecycleScore: number;\n factors: RetentionScoreFactors;\n reasons: RetentionReason[];\n dryRunDiff: RetentionDryRunDiff;\n evaluatedAt: Date;\n}\n\nexport interface RetentionPolicyOptions {\n now?: Date | string | number;\n}\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nconst LEVEL_SCORE: Record<RetentionMemoryLevel, number> = {\n L0: 0.1,\n L1: 0.25,\n L2: 0.5,\n L3: 0.75,\n L4: 0.95\n};\n\nconst WEIGHTS: Record<keyof RetentionScoreFactors, number> = {\n level: 0.18,\n recency: 0.18,\n retrieval: 0.17,\n helpfulness: 0.18,\n evidence: 0.18,\n eventType: 0.06,\n privacy: 0.05,\n manual: 0\n};\n\nexport function evaluateRetentionPolicy(\n input: RetentionPolicyInput,\n options: RetentionPolicyOptions = {}\n): RetentionPolicyResult {\n const parsed = RetentionPolicyInputSchema.parse(input);\n const evaluatedAt = normalizeNow(options.now);\n const reasons: RetentionReason[] = [];\n const manual = manualRetentionSignals(parsed.facets);\n const privacy = privacySignals(parsed);\n const factors = scoreFactors(parsed, evaluatedAt, privacy);\n\n addFactorReasons(reasons, parsed, evaluatedAt, factors, privacy);\n addManualReasons(reasons, manual);\n\n let lifecycleScore = weightedScore(factors);\n if (manual.keep) lifecycleScore = Math.max(lifecycleScore, 0.95);\n if (manual.discard) lifecycleScore = Math.min(lifecycleScore, 0.05);\n if (privacy.activeQuarantine) lifecycleScore = Math.min(lifecycleScore, 0.1);\n\n const decision = decide(lifecycleScore, manual, privacy);\n\n return {\n targetId: parsed.targetId,\n targetType: parsed.targetType,\n projectHash: parsed.projectHash,\n policyVersion: RETENTION_POLICY_VERSION,\n dryRun: true,\n decision,\n lifecycleScore: round(lifecycleScore),\n factors,\n reasons,\n dryRunDiff: dryRunDiff(decision, privacy),\n evaluatedAt\n };\n}\n\nfunction normalizeNow(value: Date | string | number | undefined): Date {\n if (value === undefined) return new Date();\n const parsed = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(parsed.getTime())) throw new Error('Invalid retention policy now value');\n return parsed;\n}\n\nfunction scoreFactors(\n input: ParsedRetentionPolicyInput,\n now: Date,\n privacy: ReturnType<typeof privacySignals>\n): RetentionScoreFactors {\n return {\n level: LEVEL_SCORE[input.memoryLevel],\n recency: recencyScore(input, now),\n retrieval: retrievalScore(input.retrievalCount),\n helpfulness: helpfulnessScore(input.helpfulnessScore, input.adherenceScore),\n evidence: input.evidenceConfidence ?? 0.5,\n eventType: eventTypeScore(input.eventType),\n privacy: privacy.activeQuarantine ? 0 : privacy.privateSignal ? 0.35 : 1,\n manual: 0\n };\n}\n\nfunction weightedScore(factors: RetentionScoreFactors): number {\n return round(Object.entries(factors).reduce((score, [key, value]) => {\n const weight = WEIGHTS[key as keyof RetentionScoreFactors];\n return score + value * weight;\n }, 0));\n}\n\nfunction decide(\n score: number,\n manual: ReturnType<typeof manualRetentionSignals>,\n privacy: ReturnType<typeof privacySignals>\n): RetentionDecision {\n if (privacy.activeQuarantine) return 'quarantine';\n if (manual.discard) return 'tombstone_candidate';\n if (manual.review) return 'review';\n if (manual.keep) return 'keep';\n\n if (privacy.privateSignal && score < 0.45) return 'review';\n if (score >= 0.68) return 'keep';\n if (score >= 0.45) return 'review';\n if (score >= 0.25) return 'downgrade';\n return 'tombstone_candidate';\n}\n\nfunction dryRunDiff(decision: RetentionDecision, privacy: ReturnType<typeof privacySignals>): RetentionDryRunDiff {\n if (decision === 'keep') return { wouldChange: false, action: 'none' };\n if (decision === 'quarantine' && privacy.activeQuarantine) {\n return { wouldChange: false, action: 'already_quarantined' };\n }\n\n const actionByDecision: Record<Exclude<RetentionDecision, 'keep'>, RetentionDryRunAction> = {\n review: 'mark_review_required',\n downgrade: 'mark_downgrade_candidate',\n quarantine: 'mark_quarantine_candidate',\n tombstone_candidate: 'mark_tombstone_candidate'\n };\n\n return {\n wouldChange: true,\n action: actionByDecision[decision],\n after: {\n retentionDecision: decision,\n policyVersion: RETENTION_POLICY_VERSION\n }\n };\n}\n\nfunction recencyScore(input: ParsedRetentionPolicyInput, now: Date): number {\n const reference = input.lastAccessedAt ?? input.createdAt;\n const days = ageDays(reference, now);\n if (days <= 7) return 0.95;\n if (days <= 30) return 0.8;\n if (days <= 90) return 0.6;\n if (days <= 180) return 0.4;\n if (days <= 365) return 0.25;\n return 0.05;\n}\n\nfunction retrievalScore(count: number): number {\n if (count <= 0) return 0;\n if (count === 1) return 0.25;\n if (count <= 4) return 0.45;\n if (count <= 9) return 0.65;\n if (count <= 19) return 0.8;\n return 0.95;\n}\n\nfunction helpfulnessScore(helpfulness: number | undefined, adherence: number | undefined): number {\n const values = [helpfulness, adherence].filter((value): value is number => typeof value === 'number');\n if (values.length === 0) return 0.5;\n return round(values.reduce((sum, value) => sum + value, 0) / values.length);\n}\n\nfunction eventTypeScore(eventType: string | undefined): number {\n switch (eventType) {\n case 'session_summary':\n return 0.8;\n case 'agent_response':\n return 0.65;\n case 'user_prompt':\n return 0.55;\n case 'tool_observation':\n return 0.25;\n default:\n return 0.45;\n }\n}\n\nfunction manualRetentionSignals(facets: RetentionFacet[]): {\n keep: boolean;\n review: boolean;\n discard: boolean;\n} {\n return {\n keep: hasFacet(facets, 'retention', 'keep'),\n review: hasFacet(facets, 'retention', 'review'),\n discard: hasFacet(facets, 'retention', 'discard')\n };\n}\n\nfunction privacySignals(input: ParsedRetentionPolicyInput): {\n activeQuarantine: boolean;\n privateSignal: boolean;\n} {\n const quarantine = recordValue(input.metadata, 'quarantine');\n const activeQuarantine = typeof quarantine === 'object'\n && quarantine !== null\n && !Array.isArray(quarantine)\n && (quarantine as Record<string, unknown>).status === 'active';\n\n const privateMetadata = input.metadata.private === true\n || input.metadata.isPrivate === true\n || input.metadata.visibility === 'private'\n || input.metadata.privacy === 'private';\n const privateFacet = hasFacet(input.facets, 'privacy', 'private');\n\n return {\n activeQuarantine,\n privateSignal: privateMetadata || privateFacet\n };\n}\n\nfunction addFactorReasons(\n reasons: RetentionReason[],\n input: ParsedRetentionPolicyInput,\n now: Date,\n factors: RetentionScoreFactors,\n privacy: ReturnType<typeof privacySignals>\n): void {\n pushReason(reasons, 'memory_level', `Memory level ${input.memoryLevel} contributes ${formatFactor(factors.level)}.`, factors.level * WEIGHTS.level);\n\n const days = ageDays(input.lastAccessedAt ?? input.createdAt, now);\n pushReason(\n reasons,\n factors.recency <= 0.25 ? 'stale_created_at' : 'recency',\n `Recency signal uses ${Math.max(0, Math.floor(days))} days since last access or creation.`,\n factors.recency * WEIGHTS.recency\n );\n\n pushReason(\n reasons,\n input.retrievalCount <= 1 ? 'low_retrieval_count' : 'retrieval_count',\n `Retrieval count is ${input.retrievalCount}.`,\n factors.retrieval * WEIGHTS.retrieval\n );\n\n pushReason(\n reasons,\n factors.helpfulness < 0.5 ? 'low_helpfulness' : 'helpfulness',\n `Helpfulness/adherence signal is ${formatFactor(factors.helpfulness)}.`,\n factors.helpfulness * WEIGHTS.helpfulness\n );\n\n pushReason(\n reasons,\n factors.evidence < 0.5 ? 'low_evidence_confidence' : 'evidence_confidence',\n `Evidence confidence is ${formatFactor(factors.evidence)}.`,\n factors.evidence * WEIGHTS.evidence\n );\n\n pushReason(reasons, 'event_type', `Event type is ${input.eventType ?? 'unknown'}.`, factors.eventType * WEIGHTS.eventType);\n\n if (hasFacet(input.facets, 'quality', 'verified')) {\n pushReason(reasons, 'quality_verified', 'Verified quality facet supports retaining the memory.', 0.03);\n }\n\n if (privacy.privateSignal) {\n pushReason(reasons, 'private_metadata', 'Private metadata keeps lifecycle handling in review/quarantine-safe mode.', factors.privacy * WEIGHTS.privacy);\n }\n if (hasFacet(input.facets, 'privacy', 'private')) {\n pushReason(reasons, 'privacy_private_facet', 'Privacy facet marks this item as private.', 0);\n }\n if (privacy.activeQuarantine) {\n pushReason(reasons, 'active_quarantine', 'Active quarantine metadata takes precedence over retention scoring.', -1);\n }\n}\n\nfunction addManualReasons(reasons: RetentionReason[], manual: ReturnType<typeof manualRetentionSignals>): void {\n if (manual.keep) {\n pushReason(reasons, 'manual_retention_keep', 'Manual retention:keep facet requests preservation unless quarantine applies.', 1);\n }\n if (manual.review) {\n pushReason(reasons, 'manual_retention_review', 'Manual retention:review facet requests human lifecycle review.', 0);\n }\n if (manual.discard) {\n pushReason(reasons, 'manual_retention_discard', 'Manual retention:discard facet requests non-destructive tombstone candidacy.', -1);\n }\n}\n\nfunction hasFacet(facets: RetentionFacet[], dimension: string, value: string): boolean {\n return facets.some((facet) => facet.dimension === dimension && facet.value === value && facet.confidence > 0);\n}\n\nfunction recordValue(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction ageDays(date: Date, now: Date): number {\n return Math.max(0, (now.getTime() - date.getTime()) / DAY_MS);\n}\n\nfunction pushReason(reasons: RetentionReason[], code: string, message: string, contribution: number): void {\n reasons.push({ code, message, contribution: round(contribution) });\n}\n\nfunction formatFactor(value: number): string {\n return round(value).toFixed(2);\n}\n\nfunction round(value: number): number {\n return Math.round(value * 1000) / 1000;\n}\n", "import { randomUUID } from 'crypto';\nimport { z } from 'zod';\n\nimport {\n sqliteAll,\n sqliteGet,\n sqliteRun,\n toDateFromSQLite,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\nimport {\n RETENTION_POLICY_VERSION,\n RetentionDecisionSchema,\n RetentionDryRunActionSchema,\n RetentionTargetTypeSchema,\n type RetentionDecision,\n type RetentionDryRunDiff,\n type RetentionPolicyResult,\n type RetentionReason,\n type RetentionScoreFactors,\n type RetentionTargetType\n} from './retention-policy.js';\nimport { writeGovernanceAuditEntry } from './governance-audit.js';\n\nconst RequiredTrimmedStringSchema = z.string().trim().min(1);\n\nconst OptionalTrimmedStringSchema = z.string().trim().min(1).optional();\n\nconst DateLikeSchema = z.preprocess((value) => {\n if (value instanceof Date) return value;\n if (typeof value === 'string' || typeof value === 'number') return new Date(value);\n return value;\n}, z.date());\n\nconst RetentionReasonSchema = z.object({\n code: RequiredTrimmedStringSchema,\n message: z.string(),\n contribution: z.number()\n});\n\nconst RetentionScoreFactorsSchema = z.object({\n level: z.number(),\n recency: z.number(),\n retrieval: z.number(),\n helpfulness: z.number(),\n evidence: z.number(),\n eventType: z.number(),\n privacy: z.number(),\n manual: z.number()\n});\n\nconst RetentionDryRunDiffSchema = z.object({\n wouldChange: z.boolean(),\n action: RetentionDryRunActionSchema,\n after: z.object({\n retentionDecision: RetentionDecisionSchema,\n policyVersion: z.string().min(1)\n }).optional()\n});\n\nconst RetentionPolicyResultSchema = z.object({\n targetId: RequiredTrimmedStringSchema,\n targetType: RetentionTargetTypeSchema,\n projectHash: OptionalTrimmedStringSchema,\n policyVersion: z.string().min(1),\n dryRun: z.literal(true),\n decision: RetentionDecisionSchema,\n lifecycleScore: z.number().min(0).max(1),\n factors: RetentionScoreFactorsSchema,\n reasons: z.array(RetentionReasonSchema),\n dryRunDiff: RetentionDryRunDiffSchema,\n evaluatedAt: DateLikeSchema\n});\n\ntype ParsedRetentionPolicyResult = z.output<typeof RetentionPolicyResultSchema>;\n\nconst StringArraySchema = z.array(z.preprocess(\n (value) => typeof value === 'string' ? value.trim() : value,\n z.string().min(1)\n)).default([]);\n\nconst FlatUpsertInputSchema = RetentionPolicyResultSchema.extend({\n actor: OptionalTrimmedStringSchema,\n sourceEventIds: StringArraySchema\n});\n\nconst WrappedUpsertInputSchema = z.object({\n result: RetentionPolicyResultSchema,\n projectHash: OptionalTrimmedStringSchema,\n actor: OptionalTrimmedStringSchema,\n sourceEventIds: StringArraySchema\n});\n\nconst GetRetentionScoreInputSchema = z.object({\n targetType: RetentionTargetTypeSchema,\n targetId: RequiredTrimmedStringSchema,\n projectHash: RequiredTrimmedStringSchema,\n policyVersion: z.string().min(1).optional()\n});\n\nconst ListRetentionScoresInputSchema = z.object({\n projectHash: RequiredTrimmedStringSchema,\n policyVersion: z.string().min(1).optional(),\n decision: RetentionDecisionSchema.optional(),\n limit: z.number().int().min(1).max(1000).default(100)\n});\n\nexport type UpsertRetentionScoreInput = z.input<typeof FlatUpsertInputSchema> | z.input<typeof WrappedUpsertInputSchema>;\nexport type GetRetentionScoreInput = z.input<typeof GetRetentionScoreInputSchema>;\nexport type ListRetentionScoresInput = z.input<typeof ListRetentionScoresInputSchema>;\n\nexport interface MemoryRetentionScore {\n scoreId: string;\n targetType: RetentionTargetType;\n targetId: string;\n projectHash: string;\n policyVersion: string;\n decision: RetentionDecision;\n lifecycleScore: number;\n factors: RetentionScoreFactors;\n reasons: RetentionReason[];\n dryRunDiff: RetentionDryRunDiff;\n sourceEventIds: string[];\n evaluatedAt: Date;\n createdAt: Date;\n updatedAt: Date;\n}\n\ninterface MemoryRetentionScoreRow {\n score_id: string;\n target_type: string;\n target_id: string;\n project_hash: string;\n policy_version: string;\n decision: string;\n lifecycle_score: number;\n factors_json: string;\n reasons_json: string;\n dry_run_diff_json: string;\n source_event_ids: string;\n evaluated_at: string;\n created_at: string;\n updated_at: string;\n}\n\ninterface NormalizedUpsertInput {\n result: ParsedRetentionPolicyResult;\n projectHash: string;\n actor?: string;\n sourceEventIds: string[];\n}\n\nfunction parseJson<T>(value: string, schema: z.ZodType<T>): T {\n try {\n return schema.parse(JSON.parse(value));\n } catch {\n return schema.parse(undefined);\n }\n}\n\nfunction parseStringArray(value: string): string[] {\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? parsed.filter((item): item is string => typeof item === 'string' && item.length > 0) : [];\n } catch {\n return [];\n }\n}\n\nfunction rowToRetentionScore(row: MemoryRetentionScoreRow): MemoryRetentionScore {\n return {\n scoreId: row.score_id,\n targetType: RetentionTargetTypeSchema.parse(row.target_type),\n targetId: row.target_id,\n projectHash: row.project_hash,\n policyVersion: row.policy_version,\n decision: RetentionDecisionSchema.parse(row.decision),\n lifecycleScore: Number(row.lifecycle_score),\n factors: parseJson(row.factors_json, RetentionScoreFactorsSchema) as RetentionScoreFactors,\n reasons: parseJson(row.reasons_json, z.array(RetentionReasonSchema)) as RetentionReason[],\n dryRunDiff: parseJson(row.dry_run_diff_json, RetentionDryRunDiffSchema) as RetentionDryRunDiff,\n sourceEventIds: parseStringArray(row.source_event_ids),\n evaluatedAt: toDateFromSQLite(row.evaluated_at),\n createdAt: toDateFromSQLite(row.created_at),\n updatedAt: toDateFromSQLite(row.updated_at)\n };\n}\n\nfunction normalizeUpsertInput(input: unknown): NormalizedUpsertInput {\n const maybeInput = input && typeof input === 'object' ? input as Record<string, unknown> : {};\n if ('result' in maybeInput) {\n const parsed = WrappedUpsertInputSchema.parse(input);\n const resultProjectHash = parsed.result.projectHash;\n if (parsed.projectHash && resultProjectHash && parsed.projectHash !== resultProjectHash) {\n throw new Error(`projectHash mismatch: result uses ${resultProjectHash} but input uses ${parsed.projectHash}`);\n }\n const projectHash = parsed.projectHash ?? resultProjectHash;\n if (!projectHash) throw new Error('projectHash is required for retention score writes');\n return {\n result: parsed.result,\n projectHash,\n actor: parsed.actor,\n sourceEventIds: parsed.sourceEventIds\n };\n }\n\n const parsed = FlatUpsertInputSchema.parse(input);\n if (!parsed.projectHash) throw new Error('projectHash is required for retention score writes');\n return {\n result: parsed,\n projectHash: parsed.projectHash,\n actor: parsed.actor,\n sourceEventIds: parsed.sourceEventIds\n };\n}\n\nfunction retentionScoreToAuditJson(score: MemoryRetentionScore): Record<string, unknown> {\n return {\n scoreId: score.scoreId,\n targetType: score.targetType,\n targetId: score.targetId,\n projectHash: score.projectHash,\n policyVersion: score.policyVersion,\n decision: score.decision,\n lifecycleScore: score.lifecycleScore,\n factors: score.factors,\n reasons: score.reasons,\n dryRunDiff: score.dryRunDiff,\n sourceEventIds: score.sourceEventIds,\n evaluatedAt: score.evaluatedAt.toISOString(),\n createdAt: score.createdAt.toISOString(),\n updatedAt: score.updatedAt.toISOString()\n };\n}\n\nexport class RetentionRepository {\n constructor(private readonly db: SQLiteDatabase) {}\n\n async upsert(input: unknown): Promise<MemoryRetentionScore> {\n const parsed = normalizeUpsertInput(input);\n const existing = this.getLatestForTarget({\n targetType: parsed.result.targetType,\n targetId: parsed.result.targetId,\n projectHash: parsed.projectHash,\n policyVersion: parsed.result.policyVersion\n });\n const now = new Date().toISOString();\n const scoreId = existing?.scoreId ?? randomUUID();\n\n if (existing) {\n sqliteRun(\n this.db,\n `UPDATE memory_retention_scores\n SET decision = ?, lifecycle_score = ?, factors_json = ?, reasons_json = ?,\n dry_run_diff_json = ?, source_event_ids = ?, evaluated_at = ?, updated_at = ?\n WHERE score_id = ? AND project_hash = ?`,\n [\n parsed.result.decision,\n parsed.result.lifecycleScore,\n JSON.stringify(parsed.result.factors),\n JSON.stringify(parsed.result.reasons),\n JSON.stringify(parsed.result.dryRunDiff),\n JSON.stringify(parsed.sourceEventIds),\n parsed.result.evaluatedAt.toISOString(),\n now,\n scoreId,\n parsed.projectHash\n ]\n );\n } else {\n sqliteRun(\n this.db,\n `INSERT INTO memory_retention_scores (\n score_id, target_type, target_id, project_hash, policy_version, decision,\n lifecycle_score, factors_json, reasons_json, dry_run_diff_json,\n source_event_ids, evaluated_at, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n scoreId,\n parsed.result.targetType,\n parsed.result.targetId,\n parsed.projectHash,\n parsed.result.policyVersion,\n parsed.result.decision,\n parsed.result.lifecycleScore,\n JSON.stringify(parsed.result.factors),\n JSON.stringify(parsed.result.reasons),\n JSON.stringify(parsed.result.dryRunDiff),\n JSON.stringify(parsed.sourceEventIds),\n parsed.result.evaluatedAt.toISOString(),\n now,\n now\n ]\n );\n }\n\n const saved = this.require(scoreId, parsed.projectHash);\n await writeGovernanceAuditEntry(this.db, {\n operation: 'retention_score',\n actor: parsed.actor ?? 'cml-core',\n projectHash: parsed.projectHash,\n targetType: parsed.result.targetType,\n targetId: parsed.result.targetId,\n beforeJson: existing ? retentionScoreToAuditJson(existing) : undefined,\n afterJson: retentionScoreToAuditJson(saved),\n sourceEventIds: parsed.sourceEventIds\n });\n return saved;\n }\n\n getLatestForTarget(input: unknown): MemoryRetentionScore | null {\n const parsed = GetRetentionScoreInputSchema.parse(input);\n const params: unknown[] = [parsed.targetType, parsed.targetId, parsed.projectHash];\n const clauses = ['target_type = ?', 'target_id = ?', 'project_hash = ?'];\n if (parsed.policyVersion) {\n clauses.push('policy_version = ?');\n params.push(parsed.policyVersion);\n }\n const sql = 'SELECT * FROM memory_retention_scores WHERE ' + clauses.join(' AND ') + ' ORDER BY evaluated_at DESC LIMIT 1';\n const row = sqliteGet<MemoryRetentionScoreRow>(this.db, sql, params);\n return row ? rowToRetentionScore(row) : null;\n }\n\n async list(input: unknown): Promise<MemoryRetentionScore[]> {\n const parsed = ListRetentionScoresInputSchema.parse(input);\n const clauses = ['project_hash = ?'];\n const params: unknown[] = [parsed.projectHash];\n if (parsed.policyVersion) {\n clauses.push('policy_version = ?');\n params.push(parsed.policyVersion);\n }\n if (parsed.decision) {\n clauses.push('decision = ?');\n params.push(parsed.decision);\n }\n params.push(parsed.limit);\n const whereClause = clauses.join(' AND ');\n const sql = 'SELECT * FROM memory_retention_scores WHERE ' + whereClause + ' ORDER BY lifecycle_score ASC, evaluated_at DESC LIMIT ?';\n return sqliteAll<MemoryRetentionScoreRow>(this.db, sql, params).map(rowToRetentionScore);\n }\n\n private require(scoreId: string, projectHash: string): MemoryRetentionScore {\n const row = sqliteGet<MemoryRetentionScoreRow>(\n this.db,\n `SELECT * FROM memory_retention_scores WHERE score_id = ? AND project_hash = ?`,\n [scoreId, projectHash]\n );\n if (!row) throw new Error(`Memory retention score not found: ${scoreId}`);\n return rowToRetentionScore(row);\n }\n}\n\nexport function retentionScoreInputFromResult(\n result: RetentionPolicyResult,\n options: { projectHash?: string; sourceEventIds?: string[]; actor?: string } = {}\n): UpsertRetentionScoreInput {\n return {\n result,\n projectHash: options.projectHash ?? result.projectHash,\n sourceEventIds: options.sourceEventIds ?? [],\n actor: options.actor\n };\n}\n\nexport { RETENTION_POLICY_VERSION };\n", "/**\n * Core types for claude-memory-layer plugin\n * Idris2 inspired: Complete, immutable type definitions with Zod validation\n */\n\nimport { z } from 'zod';\n\n// ============================================================\n// Event Types\n// ============================================================\n\nexport const EventTypeSchema = z.enum([\n 'user_prompt',\n 'agent_response',\n 'session_summary',\n 'tool_observation'\n]);\nexport type EventType = z.infer<typeof EventTypeSchema>;\n\n// ============================================================\n// Memory Event (L0 EventStore)\n// ============================================================\n\nexport const MemoryEventSchema = z.object({\n id: z.string().uuid(),\n eventType: EventTypeSchema,\n sessionId: z.string(),\n timestamp: z.date(),\n content: z.string(),\n canonicalKey: z.string(),\n dedupeKey: z.string(),\n metadata: z.record(z.unknown()).optional()\n});\nexport type MemoryEvent = z.infer<typeof MemoryEventSchema>;\n\n// Input for creating new events (id, dedupeKey generated automatically)\nexport const MemoryEventInputSchema = MemoryEventSchema.omit({\n id: true,\n dedupeKey: true,\n canonicalKey: true\n});\nexport type MemoryEventInput = z.infer<typeof MemoryEventInputSchema>;\n\n// ============================================================\n// Session\n// ============================================================\n\nexport const SessionSchema = z.object({\n id: z.string(),\n startedAt: z.date(),\n endedAt: z.date().optional(),\n projectPath: z.string().optional(),\n summary: z.string().optional(),\n tags: z.array(z.string()).optional()\n});\nexport type Session = z.infer<typeof SessionSchema>;\n\n// ============================================================\n// Insight (L1 Structured)\n// ============================================================\n\nexport const InsightTypeSchema = z.enum([\n 'preference',\n 'pattern',\n 'expertise'\n]);\nexport type InsightType = z.infer<typeof InsightTypeSchema>;\n\nexport const InsightSchema = z.object({\n id: z.string().uuid(),\n insightType: InsightTypeSchema,\n content: z.string(),\n canonicalKey: z.string(),\n confidence: z.number().min(0).max(1),\n sourceEvents: z.array(z.string().uuid()),\n createdAt: z.date(),\n lastUpdated: z.date()\n});\nexport type Insight = z.infer<typeof InsightSchema>;\n\n// ============================================================\n// Memory Match (Search Result)\n// ============================================================\n\nexport const MemoryMatchSchema = z.object({\n event: MemoryEventSchema,\n score: z.number().min(0).max(1),\n relevanceReason: z.string().optional()\n});\nexport type MemoryMatch = z.infer<typeof MemoryMatchSchema>;\n\n// ============================================================\n// Match Confidence (AXIOMMIND)\n// ============================================================\n\nexport const MatchConfidenceSchema = z.enum(['high', 'suggested', 'none']);\nexport type MatchConfidence = z.infer<typeof MatchConfidenceSchema>;\n\nexport const MatchResultSchema = z.object({\n match: MemoryMatchSchema.nullable(),\n confidence: MatchConfidenceSchema,\n gap: z.number().optional(),\n alternatives: z.array(MemoryMatchSchema).optional()\n});\nexport type MatchResult = z.infer<typeof MatchResultSchema>;\n\n// AXIOMMIND Matching Thresholds\nexport const MATCH_THRESHOLDS = {\n minCombinedScore: 0.92,\n minGap: 0.03,\n suggestionThreshold: 0.75\n} as const;\n\n// ============================================================\n// Memory Level (Graduation Pipeline)\n// ============================================================\n\nexport const MemoryLevelSchema = z.enum(['L0', 'L1', 'L2', 'L3', 'L4']);\nexport type MemoryLevel = z.infer<typeof MemoryLevelSchema>;\n\nexport const GraduationResultSchema = z.object({\n eventId: z.string().uuid(),\n fromLevel: MemoryLevelSchema,\n toLevel: MemoryLevelSchema,\n success: z.boolean(),\n reason: z.string().optional()\n});\nexport type GraduationResult = z.infer<typeof GraduationResultSchema>;\n\n// ============================================================\n// Evidence Span (AXIOMMIND Principle 4)\n// ============================================================\n\nexport const EvidenceSpanSchema = z.object({\n start: z.number().int().nonnegative(),\n end: z.number().int().positive(),\n confidence: z.number().min(0).max(1),\n matchType: z.enum(['exact', 'fuzzy', 'none']),\n originalQuote: z.string(),\n alignedText: z.string()\n});\nexport type EvidenceSpan = z.infer<typeof EvidenceSpanSchema>;\n\n// ============================================================\n// Memory Operations Config (AgentMemory-inspired operations layer)\n// ============================================================\n\nexport const PerspectiveConsolidationSpecialistKindSchema = z.enum([\n 'deduction',\n 'induction',\n 'contradiction',\n 'actor_card_maintenance'\n]);\nexport type PerspectiveConsolidationSpecialistKind = z.infer<typeof PerspectiveConsolidationSpecialistKindSchema>;\n\nexport const MemoryOperationsConfigSchema = z.object({\n enabled: z.boolean().default(false),\n facets: z.object({\n enabled: z.boolean().default(true)\n }).default({}),\n actions: z.object({\n enabled: z.boolean().default(true)\n }).default({}),\n retention: z.object({\n enabled: z.boolean().default(false),\n policyVersion: z.string().default('v1')\n }).default({}),\n graphExpansion: z.object({\n enabled: z.boolean().default(false),\n maxHops: z.number().int().min(0).max(5).default(1)\n }).default({}),\n lessons: z.object({\n enabled: z.boolean().default(false)\n }).default({}),\n perspectiveMemory: z.object({\n enabled: z.boolean().default(false),\n deriver: z.object({\n enabled: z.boolean().default(false),\n maxEventsPerBatch: z.number().int().positive().max(100).default(20),\n maxObserversPerSession: z.number().int().positive().max(50).default(5)\n }).default({}),\n specialists: z.object({\n enabled: z.boolean().default(false),\n enabledProjectHashes: z.array(z.string().trim().min(1)).max(100).default([]),\n enabledKinds: z.array(PerspectiveConsolidationSpecialistKindSchema).default([\n 'deduction',\n 'induction',\n 'contradiction',\n 'actor_card_maintenance'\n ]),\n maxSourceObservations: z.number().int().positive().max(100).default(20),\n maxDerivedObservations: z.number().int().min(0).max(20).default(5),\n maxCardUpdates: z.number().int().min(0).max(40).default(3)\n }).default({})\n }).default({})\n}).default({});\nexport type MemoryOperationsConfig = z.infer<typeof MemoryOperationsConfigSchema>;\n\n// ============================================================\n// Procedural Lesson Types (AgentMemory-inspired operations layer)\n// ============================================================\n\nconst MemoryLessonNonEmptyStringSchema = z.string()\n .transform((value) => value.trim())\n .pipe(z.string().min(1));\n\nconst MemoryLessonStringArraySchema = z.preprocess((value) => {\n if (!Array.isArray(value)) return value;\n return value\n .map((item) => typeof item === 'string' ? item.trim() : item)\n .filter((item) => typeof item !== 'string' || item.length > 0);\n}, z.array(MemoryLessonNonEmptyStringSchema)).default([]);\n\nexport const MemoryLessonSchema = z.object({\n lessonId: z.string().uuid(),\n projectHash: MemoryLessonNonEmptyStringSchema.optional(),\n name: MemoryLessonNonEmptyStringSchema,\n trigger: MemoryLessonNonEmptyStringSchema,\n steps: MemoryLessonStringArraySchema.refine((steps) => steps.length > 0, 'steps must contain at least one step'),\n confidence: z.number().min(0).max(1),\n sourceSessionIds: MemoryLessonStringArraySchema,\n sourceEventIds: MemoryLessonStringArraySchema,\n failureModes: MemoryLessonStringArraySchema,\n skillCandidate: z.boolean().default(false),\n createdAt: z.date(),\n updatedAt: z.date()\n});\nexport type MemoryLesson = z.infer<typeof MemoryLessonSchema>;\n\nexport const UpsertMemoryLessonInputSchema = z.object({\n lessonId: z.string().uuid().optional(),\n projectHash: MemoryLessonNonEmptyStringSchema.optional(),\n name: MemoryLessonNonEmptyStringSchema,\n trigger: MemoryLessonNonEmptyStringSchema,\n steps: MemoryLessonStringArraySchema.refine((steps) => steps.length > 0, 'steps must contain at least one step'),\n confidence: z.number().min(0).max(1).default(0.5),\n sourceSessionIds: MemoryLessonStringArraySchema,\n sourceEventIds: MemoryLessonStringArraySchema,\n failureModes: MemoryLessonStringArraySchema,\n skillCandidate: z.boolean().default(false),\n actor: MemoryLessonNonEmptyStringSchema.optional()\n}).superRefine((value, ctx) => {\n if (value.sourceSessionIds.length === 0 && value.sourceEventIds.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['sourceEventIds'],\n message: 'sourceSessionIds or sourceEventIds is required'\n });\n }\n});\nexport type UpsertMemoryLessonInput = z.input<typeof UpsertMemoryLessonInputSchema>;\n\nexport const ListMemoryLessonsInputSchema = z.object({\n projectHash: MemoryLessonNonEmptyStringSchema.optional(),\n skillCandidate: z.boolean().optional(),\n limit: z.number().int().positive().max(500).default(50)\n});\nexport type ListMemoryLessonsInput = z.input<typeof ListMemoryLessonsInputSchema>;\n\n// ============================================================\n// Honcho-inspired Perspective Memory Types\n// ============================================================\n\nconst PerspectiveMemoryNonEmptyStringSchema = z.string()\n .transform((value) => value.trim())\n .pipe(z.string().min(1));\n\nconst PerspectiveMemoryOptionalStringSchema = z.preprocess((value) => {\n if (typeof value !== 'string') return value;\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}, PerspectiveMemoryNonEmptyStringSchema.optional());\n\nconst PerspectiveMemoryStringArraySchema = z.preprocess((value) => {\n if (!Array.isArray(value)) return value;\n return value\n .map((item) => typeof item === 'string' ? item.trim() : item)\n .filter((item) => typeof item !== 'string' || item.length > 0);\n}, z.array(PerspectiveMemoryNonEmptyStringSchema)).default([]);\n\nconst ActorCardSensitivePattern = /(?:\\b(?:api[_-]?key|secret|password|passwd|token|access[_-]?token|client[_-]?secret|bearer)\\b\\s*[:=])|(?:\\b(?:api[_-]?key|secret|password|passwd|token|access[_-]?token|client[_-]?secret|bearer)=)|(?:^|\\s)(?:\\/[A-Za-z0-9._-][^\\s`'\\\"]*)/i;\n\nexport const MemoryActorKindSchema = z.enum([\n 'user',\n 'assistant',\n 'subagent',\n 'tool',\n 'system',\n 'integration',\n 'unknown'\n]);\nexport type MemoryActorKind = z.infer<typeof MemoryActorKindSchema>;\n\nexport const SessionActorRoleSchema = z.enum([\n 'speaker',\n 'assistant',\n 'observer',\n 'tool',\n 'system',\n 'unknown'\n]);\nexport type SessionActorRole = z.infer<typeof SessionActorRoleSchema>;\n\nexport const PerspectiveObservationLevelSchema = z.enum([\n 'explicit',\n 'deductive',\n 'inductive',\n 'contradiction'\n]);\nexport type PerspectiveObservationLevel = z.infer<typeof PerspectiveObservationLevelSchema>;\n\nexport const PerspectiveObservationCreatedBySchema = z.enum(['rule', 'llm', 'manual', 'import']);\nexport type PerspectiveObservationCreatedBy = z.infer<typeof PerspectiveObservationCreatedBySchema>;\n\nexport const ActorCardEntryPrefixSchema = z.enum([\n 'IDENTITY',\n 'ATTRIBUTE',\n 'RELATIONSHIP',\n 'INSTRUCTION'\n]);\nexport type ActorCardEntryPrefix = z.infer<typeof ActorCardEntryPrefixSchema>;\n\nexport const ActorCardEntrySchema = z.string()\n .transform((value) => value.trim())\n .pipe(\n z.string()\n .min(1)\n .max(200, 'actor card entry must be at most 200 characters')\n .refine(\n (value) => /^(IDENTITY|ATTRIBUTE|RELATIONSHIP|INSTRUCTION):\\s*\\S/.test(value),\n 'actor card entry prefix must be one of IDENTITY:, ATTRIBUTE:, RELATIONSHIP:, or INSTRUCTION:'\n )\n .refine(\n (value) => !ActorCardSensitivePattern.test(value),\n 'actor card entry contains secret, redacted, sensitive, or path-like content'\n )\n );\nexport type ActorCardEntry = z.infer<typeof ActorCardEntrySchema>;\n\nexport const MemoryActorSchema = z.object({\n actorId: PerspectiveMemoryNonEmptyStringSchema,\n projectHash: PerspectiveMemoryOptionalStringSchema,\n kind: MemoryActorKindSchema,\n displayName: PerspectiveMemoryNonEmptyStringSchema,\n source: PerspectiveMemoryNonEmptyStringSchema,\n metadata: z.record(z.unknown()).optional(),\n createdAt: z.date(),\n updatedAt: z.date()\n});\nexport type MemoryActor = z.infer<typeof MemoryActorSchema>;\n\nexport const UpsertMemoryActorInputSchema = z.object({\n actorId: PerspectiveMemoryOptionalStringSchema,\n projectHash: PerspectiveMemoryOptionalStringSchema,\n kind: MemoryActorKindSchema.default('unknown'),\n displayName: PerspectiveMemoryNonEmptyStringSchema,\n source: PerspectiveMemoryNonEmptyStringSchema,\n metadata: z.record(z.unknown()).optional()\n});\nexport type UpsertMemoryActorInput = z.input<typeof UpsertMemoryActorInputSchema>;\n\nexport const ListMemoryActorsInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n kind: MemoryActorKindSchema.optional(),\n source: PerspectiveMemoryOptionalStringSchema,\n limit: z.number().int().positive().max(500).default(100)\n});\nexport type ListMemoryActorsInput = z.input<typeof ListMemoryActorsInputSchema>;\n\nexport const SessionActorSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n sessionId: PerspectiveMemoryNonEmptyStringSchema,\n actorId: PerspectiveMemoryNonEmptyStringSchema,\n roleInSession: SessionActorRoleSchema,\n observeSelf: z.boolean().default(true),\n observeOthers: z.boolean().default(false),\n joinedAt: z.date(),\n leftAt: z.date().optional(),\n metadata: z.record(z.unknown()).optional()\n});\nexport type SessionActor = z.infer<typeof SessionActorSchema>;\n\nexport const UpsertSessionActorInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n sessionId: PerspectiveMemoryNonEmptyStringSchema,\n actorId: PerspectiveMemoryNonEmptyStringSchema,\n roleInSession: SessionActorRoleSchema.default('unknown'),\n observeSelf: z.boolean().default(true),\n observeOthers: z.boolean().default(false),\n joinedAt: z.date().optional(),\n leftAt: z.date().optional(),\n metadata: z.record(z.unknown()).optional()\n});\nexport type UpsertSessionActorInput = z.input<typeof UpsertSessionActorInputSchema>;\n\nexport const ListSessionActorsInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n sessionId: PerspectiveMemoryNonEmptyStringSchema,\n limit: z.number().int().positive().max(500).default(100)\n});\nexport type ListSessionActorsInput = z.input<typeof ListSessionActorsInputSchema>;\n\nexport const SetSessionActorObservationPolicyInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n sessionId: PerspectiveMemoryNonEmptyStringSchema,\n actorId: PerspectiveMemoryNonEmptyStringSchema,\n observeSelf: z.boolean(),\n observeOthers: z.boolean()\n});\nexport type SetSessionActorObservationPolicyInput = z.input<typeof SetSessionActorObservationPolicyInputSchema>;\n\nexport const ActorCardSchema = z.object({\n cardId: z.string().uuid(),\n projectHash: PerspectiveMemoryOptionalStringSchema,\n observerActorId: PerspectiveMemoryNonEmptyStringSchema,\n observedActorId: PerspectiveMemoryNonEmptyStringSchema,\n entries: z.array(ActorCardEntrySchema).max(40),\n sourceEventIds: PerspectiveMemoryStringArraySchema,\n updatedBy: PerspectiveMemoryOptionalStringSchema,\n createdAt: z.date(),\n updatedAt: z.date()\n});\nexport type ActorCard = z.infer<typeof ActorCardSchema>;\n\nexport const UpsertActorCardInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n observerActorId: PerspectiveMemoryNonEmptyStringSchema,\n observedActorId: PerspectiveMemoryNonEmptyStringSchema,\n entries: z.array(ActorCardEntrySchema).min(1).max(40, 'actor card supports at most 40 entries'),\n sourceEventIds: PerspectiveMemoryStringArraySchema,\n updatedBy: PerspectiveMemoryOptionalStringSchema\n});\nexport type UpsertActorCardInput = z.input<typeof UpsertActorCardInputSchema>;\n\nexport const GetActorCardInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n observerActorId: PerspectiveMemoryNonEmptyStringSchema,\n observedActorId: PerspectiveMemoryNonEmptyStringSchema\n});\nexport type GetActorCardInput = z.input<typeof GetActorCardInputSchema>;\n\nexport const PerspectiveObservationSchema = z.object({\n observationId: z.string().uuid(),\n projectHash: PerspectiveMemoryOptionalStringSchema,\n observerActorId: PerspectiveMemoryNonEmptyStringSchema,\n observedActorId: PerspectiveMemoryNonEmptyStringSchema,\n sessionId: PerspectiveMemoryOptionalStringSchema,\n level: PerspectiveObservationLevelSchema,\n content: PerspectiveMemoryNonEmptyStringSchema,\n confidence: z.number().min(0).max(1),\n sourceEventIds: PerspectiveMemoryStringArraySchema,\n sourceObservationIds: PerspectiveMemoryStringArraySchema,\n createdBy: PerspectiveObservationCreatedBySchema,\n metadata: z.record(z.unknown()).optional(),\n createdAt: z.date(),\n updatedAt: z.date(),\n deletedAt: z.date().optional()\n});\nexport type PerspectiveObservation = z.infer<typeof PerspectiveObservationSchema>;\n\nexport const CreatePerspectiveObservationInputSchema = z.object({\n observationId: z.string().uuid().optional(),\n projectHash: PerspectiveMemoryOptionalStringSchema,\n observerActorId: PerspectiveMemoryNonEmptyStringSchema,\n observedActorId: PerspectiveMemoryNonEmptyStringSchema,\n sessionId: PerspectiveMemoryOptionalStringSchema,\n level: PerspectiveObservationLevelSchema.default('explicit'),\n content: PerspectiveMemoryNonEmptyStringSchema,\n confidence: z.number().min(0).max(1).default(0.5),\n sourceEventIds: PerspectiveMemoryStringArraySchema,\n sourceObservationIds: PerspectiveMemoryStringArraySchema,\n createdBy: PerspectiveObservationCreatedBySchema.default('manual'),\n metadata: z.record(z.unknown()).optional(),\n actor: PerspectiveMemoryOptionalStringSchema\n}).superRefine((value, ctx) => {\n const hasEvidence = value.sourceEventIds.length > 0 || value.sourceObservationIds.length > 0;\n if ((value.createdBy !== 'manual' || value.level !== 'explicit') && !hasEvidence) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['sourceEventIds'],\n message: 'source evidence is required for non-manual or derived perspective observations'\n });\n }\n});\nexport type CreatePerspectiveObservationInput = z.input<typeof CreatePerspectiveObservationInputSchema>;\n\nexport const QueryPerspectiveObservationsInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n observerActorId: PerspectiveMemoryOptionalStringSchema,\n observedActorId: PerspectiveMemoryOptionalStringSchema,\n sessionId: PerspectiveMemoryOptionalStringSchema,\n levels: z.array(PerspectiveObservationLevelSchema).optional(),\n query: PerspectiveMemoryOptionalStringSchema,\n includeDeleted: z.boolean().default(false),\n limit: z.number().int().positive().max(500).default(50)\n});\nexport type QueryPerspectiveObservationsInput = z.input<typeof QueryPerspectiveObservationsInputSchema>;\n\nexport const DeletePerspectiveObservationInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n observationId: PerspectiveMemoryNonEmptyStringSchema,\n actor: PerspectiveMemoryNonEmptyStringSchema\n});\nexport type DeletePerspectiveObservationInput = z.input<typeof DeletePerspectiveObservationInputSchema>;\n\nexport const ListPerspectiveObservationsBySourceInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n sourceEventId: PerspectiveMemoryNonEmptyStringSchema,\n limit: z.number().int().positive().max(500).default(100)\n});\nexport type ListPerspectiveObservationsBySourceInput = z.input<typeof ListPerspectiveObservationsBySourceInputSchema>;\n\n// ============================================================\n// Configuration\n// ============================================================\n\nexport const ConfigSchema = z.object({\n storage: z.object({\n path: z.string().default('~/.claude-code/memory'),\n maxSizeMB: z.number().default(500)\n }).default({}),\n embedding: z.object({\n provider: z.enum(['local', 'openai']).default('local'),\n model: z.string().default('Xenova/multilingual-e5-small'),\n openaiModel: z.string().default('Xenova/multilingual-e5-small'),\n batchSize: z.number().default(32)\n }).default({}),\n retrieval: z.object({\n topK: z.number().default(5),\n minScore: z.number().default(0.7),\n maxTokens: z.number().default(2000)\n }).default({}),\n matching: z.object({\n minCombinedScore: z.number().default(0.92),\n minGap: z.number().default(0.03),\n suggestionThreshold: z.number().default(0.75),\n weights: z.object({\n semanticSimilarity: z.number().default(0.4),\n ftsScore: z.number().default(0.25),\n recencyBonus: z.number().default(0.2),\n statusWeight: z.number().default(0.15)\n }).default({})\n }).default({}),\n privacy: z.object({\n excludePatterns: z.array(z.string()).default(['password', 'secret', 'api_key', 'token', 'bearer']),\n anonymize: z.boolean().default(false),\n privateTags: z.object({\n enabled: z.boolean().default(true),\n marker: z.enum(['[PRIVATE]', '[REDACTED]', '']).default('[PRIVATE]'),\n preserveLineCount: z.boolean().default(false),\n supportedFormats: z.array(z.enum(['xml', 'bracket', 'comment'])).default(['xml'])\n }).default({})\n }).default({}),\n toolObservation: z.object({\n enabled: z.boolean().default(true),\n excludedTools: z.array(z.string()).default(['TodoWrite', 'TodoRead']),\n minOutputLength: z.number().default(100),\n maxOutputLength: z.number().default(10000),\n maxOutputLines: z.number().default(100),\n storeOnlyOnSuccess: z.boolean().default(false)\n }).default({}),\n features: z.object({\n autoSave: z.boolean().default(true),\n sessionSummary: z.boolean().default(true),\n insightExtraction: z.boolean().default(true),\n crossProjectLearning: z.boolean().default(false),\n singleWriterMode: z.boolean().default(true),\n sharedStore: z.object({\n enabled: z.boolean().default(true),\n autoPromote: z.boolean().default(true),\n searchShared: z.boolean().default(true),\n minConfidenceForPromotion: z.number().default(0.8),\n sharedStoragePath: z.string().default('~/.claude-code/memory/shared')\n }).default({})\n }).default({}),\n operations: MemoryOperationsConfigSchema,\n mode: z.enum(['session', 'endless']).default('session'),\n endless: z.object({\n enabled: z.boolean().default(false),\n workingSet: z.object({\n maxEvents: z.number().default(100),\n timeWindowHours: z.number().default(24),\n minRelevanceScore: z.number().default(0.5)\n }).default({}),\n consolidation: z.object({\n triggerIntervalMs: z.number().default(3600000),\n triggerEventCount: z.number().default(100),\n triggerIdleMs: z.number().default(1800000),\n useLLMSummarization: z.boolean().default(false)\n }).default({}),\n continuity: z.object({\n minScoreForSeamless: z.number().default(0.7),\n topicDecayHours: z.number().default(48)\n }).default({})\n }).optional()\n});\nexport type Config = z.infer<typeof ConfigSchema>;\n\n// ============================================================\n// Append Result (AXIOMMIND Principle 2: Append-only)\n// ============================================================\n\nexport type AppendResult =\n | { success: true; eventId: string; isDuplicate: false }\n | { success: true; eventId: string; isDuplicate: true }\n | { success: false; error: string };\n\n// ============================================================\n// Hook Input/Output Types\n// ============================================================\n\nexport interface SessionStartInput {\n session_id: string;\n cwd: string;\n}\n\nexport interface SessionStartOutput {\n context?: string;\n}\n\nexport interface UserPromptSubmitInput {\n session_id: string;\n prompt: string;\n}\n\nexport interface UserPromptSubmitOutput {\n context?: string;\n}\n\n// Stop Hook Input (matches actual Claude Code hook format)\nexport interface StopInput {\n session_id: string;\n transcript_path: string;\n cwd: string;\n permission_mode: string;\n hook_event_name: string;\n stop_hook_active: boolean;\n}\n\nexport interface SessionEndInput {\n session_id: string;\n}\n\n// PostToolUse Hook Input (matches actual Claude Code hook format)\nexport interface PostToolUseInput {\n session_id: string;\n hook_event_name: string;\n tool_name: string;\n tool_input: Record<string, unknown>;\n tool_use_id: string;\n // Claude Code sends tool_response as an object, not tool_output as string\n tool_response: {\n stdout?: string;\n stderr?: string;\n content?: string;\n interrupted?: boolean;\n isImage?: boolean;\n // For non-Bash tools, response may be a plain string or other format\n [key: string]: unknown;\n };\n cwd: string;\n transcript_path: string;\n permission_mode: string;\n}\n\n// ============================================================\n// Tool Observation Types\n// ============================================================\n\nexport const ToolMetadataSchema = z.object({\n filePath: z.string().optional(),\n fileType: z.string().optional(),\n lineCount: z.number().optional(),\n command: z.string().optional(),\n exitCode: z.number().optional(),\n pattern: z.string().optional(),\n matchCount: z.number().optional(),\n url: z.string().optional(),\n statusCode: z.number().optional()\n});\nexport type ToolMetadata = z.infer<typeof ToolMetadataSchema>;\n\nexport const ToolObservationPayloadSchema = z.object({\n toolName: z.string(),\n toolInput: z.record(z.unknown()),\n toolOutput: z.string(),\n durationMs: z.number(),\n success: z.boolean(),\n errorMessage: z.string().optional(),\n metadata: ToolMetadataSchema.optional()\n});\nexport type ToolObservationPayload = z.infer<typeof ToolObservationPayloadSchema>;\n\n// ============================================================\n// Vector Record\n// ============================================================\n\nexport interface VectorRecord {\n id: string;\n eventId: string;\n sessionId: string;\n eventType: string;\n content: string;\n vector: number[];\n timestamp: string;\n metadata?: Record<string, unknown>;\n}\n\n// ============================================================\n// Outbox Item (Single-Writer Pattern)\n// ============================================================\n\nexport interface OutboxItem {\n id: string;\n eventId: string;\n content: string;\n status: 'pending' | 'processing' | 'done' | 'failed';\n retryCount: number;\n createdAt: Date;\n errorMessage?: string;\n}\n\nexport interface OutboxStatsOptions {\n /** Processing rows older than this threshold are considered abandoned/stuck. */\n stuckThresholdMs?: number;\n /** Test hook for deterministic age calculations. */\n now?: Date;\n}\n\nexport interface OutboxQueueStats {\n pending: number;\n processing: number;\n failed: number;\n total: number;\n stuckProcessing: number;\n /** Age in milliseconds for the oldest processing row, or null when none are processing. */\n oldestProcessingAgeMs: number | null;\n}\n\nexport interface OutboxStats {\n embedding: OutboxQueueStats;\n vector: OutboxQueueStats;\n}\n\nexport interface OutboxRecoveryOptions {\n /** Processing rows older than this threshold are considered abandoned. */\n stuckThresholdMs?: number;\n /** Retry failed rows whose retry_count is still below this value. */\n maxRetries?: number;\n /** Count rows that would be recovered/retried without mutating them. */\n dryRun?: boolean;\n /** Test hook for deterministic recovery cutoffs. */\n now?: Date;\n}\n\nexport interface OutboxRecoveryBucket {\n recoveredProcessing: number;\n retriedFailed: number;\n}\n\nexport interface OutboxRecoveryResult {\n embedding: OutboxRecoveryBucket;\n vector: OutboxRecoveryBucket;\n}\n\nexport interface ProjectScopeRepairOptions {\n /** Absolute or logical project path used to derive the expected project hash. */\n projectPath?: string;\n /** Explicit project hash override for hash-only repair flows. */\n projectHash?: string;\n /** Inspect and count changes without mutating event metadata. */\n dryRun?: boolean;\n /** Test hook for deterministic repair metadata. */\n now?: Date;\n}\n\nexport interface ProjectScopeRepairSample {\n eventId: string;\n action: 'repaired' | 'quarantined';\n reason: 'same-project-path' | 'session-project-path' | 'project-path-mismatch' | 'missing-project-scope' | 'scope-hash-mismatch' | 'content-project-mismatch';\n}\n\nexport interface ProjectScopeRepairResult {\n dryRun: boolean;\n projectHash: string;\n scanned: number;\n repaired: number;\n quarantined: number;\n alreadyScoped: number;\n skipped: number;\n samples: ProjectScopeRepairSample[];\n}\n\n// ============================================================\n// Entity Types (Task, Condition, Artifact)\n// ============================================================\n\nexport const EntityTypeSchema = z.enum(['task', 'condition', 'artifact']);\nexport type EntityType = z.infer<typeof EntityTypeSchema>;\n\nexport const TaskStatusSchema = z.enum([\n 'pending',\n 'in_progress',\n 'blocked',\n 'done',\n 'cancelled'\n]);\nexport type TaskStatus = z.infer<typeof TaskStatusSchema>;\n\nexport const TaskPrioritySchema = z.enum(['low', 'medium', 'high', 'critical']);\nexport type TaskPriority = z.infer<typeof TaskPrioritySchema>;\n\nexport const EntityStageSchema = z.enum([\n 'raw',\n 'working',\n 'candidate',\n 'verified',\n 'certified'\n]);\nexport type EntityStage = z.infer<typeof EntityStageSchema>;\n\nexport const EntityStatusSchema = z.enum([\n 'active',\n 'contested',\n 'deprecated',\n 'superseded'\n]);\nexport type EntityStatus = z.infer<typeof EntityStatusSchema>;\n\n// Base Entity schema\nexport const EntitySchema = z.object({\n entityId: z.string(),\n entityType: EntityTypeSchema,\n canonicalKey: z.string(),\n title: z.string(),\n stage: EntityStageSchema,\n status: EntityStatusSchema,\n currentJson: z.record(z.unknown()),\n titleNorm: z.string().optional(),\n searchText: z.string().optional(),\n createdAt: z.date(),\n updatedAt: z.date()\n});\nexport type Entity = z.infer<typeof EntitySchema>;\n\n// Task-specific current_json structure\nexport const TaskCurrentJsonSchema = z.object({\n status: TaskStatusSchema,\n priority: TaskPrioritySchema.optional(),\n blockers: z.array(z.string()).optional(),\n blockerSuggestions: z.array(z.string()).optional(),\n description: z.string().optional(),\n project: z.string().optional()\n});\nexport type TaskCurrentJson = z.infer<typeof TaskCurrentJsonSchema>;\n\n// Entity alias for canonical key lookup\nexport const EntityAliasSchema = z.object({\n entityType: EntityTypeSchema,\n canonicalKey: z.string(),\n entityId: z.string(),\n isPrimary: z.boolean()\n});\nexport type EntityAlias = z.infer<typeof EntityAliasSchema>;\n\n// ============================================================\n// Edge Types (Relationships)\n// ============================================================\n\nexport const NodeTypeSchema = z.enum(['entry', 'entity', 'event']);\nexport type NodeType = z.infer<typeof NodeTypeSchema>;\n\nexport const RelationTypeSchema = z.enum([\n 'evidence_of',\n 'blocked_by',\n 'blocked_by_suggested',\n 'resolves_to',\n 'derived_from',\n 'supersedes',\n 'source_of'\n]);\nexport type RelationType = z.infer<typeof RelationTypeSchema>;\n\nexport const EdgeSchema = z.object({\n edgeId: z.string(),\n srcType: NodeTypeSchema,\n srcId: z.string(),\n relType: RelationTypeSchema,\n dstType: NodeTypeSchema,\n dstId: z.string(),\n metaJson: z.record(z.unknown()).optional(),\n createdAt: z.date()\n});\nexport type Edge = z.infer<typeof EdgeSchema>;\n\n// ============================================================\n// Task Event Types (SoT for Task Entity)\n// ============================================================\n\nexport const TaskEventTypeSchema = z.enum([\n 'task_created',\n 'task_status_changed',\n 'task_priority_changed',\n 'task_blockers_set',\n 'task_transition_rejected',\n 'condition_declared',\n 'artifact_declared',\n 'condition_resolved_to'\n]);\nexport type TaskEventType = z.infer<typeof TaskEventTypeSchema>;\n\nexport const BlockerModeSchema = z.enum(['replace', 'suggest']);\nexport type BlockerMode = z.infer<typeof BlockerModeSchema>;\n\nexport const BlockerKindSchema = z.enum(['task', 'condition', 'artifact']);\nexport type BlockerKind = z.infer<typeof BlockerKindSchema>;\n\nexport const BlockerRefSchema = z.object({\n kind: BlockerKindSchema,\n entityId: z.string(),\n rawText: z.string().optional(),\n confidence: z.number().min(0).max(1).optional(),\n candidates: z.array(z.string()).optional()\n});\nexport type BlockerRef = z.infer<typeof BlockerRefSchema>;\n\n// Task event payloads\nexport const TaskCreatedPayloadSchema = z.object({\n taskId: z.string(),\n title: z.string(),\n canonicalKey: z.string(),\n initialStatus: TaskStatusSchema,\n priority: TaskPrioritySchema.optional(),\n description: z.string().optional(),\n project: z.string().optional()\n});\nexport type TaskCreatedPayload = z.infer<typeof TaskCreatedPayloadSchema>;\n\nexport const TaskStatusChangedPayloadSchema = z.object({\n taskId: z.string(),\n fromStatus: TaskStatusSchema,\n toStatus: TaskStatusSchema,\n reason: z.string().optional()\n});\nexport type TaskStatusChangedPayload = z.infer<typeof TaskStatusChangedPayloadSchema>;\n\nexport const TaskBlockersSetPayloadSchema = z.object({\n taskId: z.string(),\n mode: BlockerModeSchema,\n blockers: z.array(BlockerRefSchema),\n sourceEntryId: z.string().optional()\n});\nexport type TaskBlockersSetPayload = z.infer<typeof TaskBlockersSetPayloadSchema>;\n\n// ============================================================\n// Entry Types (Immutable memory units)\n// ============================================================\n\nexport const EntryTypeSchema = z.enum([\n 'fact',\n 'decision',\n 'insight',\n 'task_note',\n 'reference',\n 'preference',\n 'pattern',\n 'troubleshooting'\n]);\nexport type EntryType = z.infer<typeof EntryTypeSchema>;\n\nexport const EntrySchema = z.object({\n entryId: z.string(),\n createdTs: z.date(),\n entryType: EntryTypeSchema,\n title: z.string(),\n contentJson: z.record(z.unknown()),\n stage: EntityStageSchema,\n status: EntityStatusSchema,\n supersededBy: z.string().optional(),\n buildId: z.string().optional(),\n evidenceJson: z.record(z.unknown()).optional(),\n canonicalKey: z.string()\n});\nexport type Entry = z.infer<typeof EntrySchema>;\n\n// ============================================================\n// Evidence Aligner V2 Types\n// ============================================================\n\nexport const ExtractedEvidenceSchema = z.object({\n messageIndex: z.number().int().nonnegative(),\n quote: z.string()\n});\nexport type ExtractedEvidence = z.infer<typeof ExtractedEvidenceSchema>;\n\nexport const AlignedEvidenceSchema = z.object({\n messageIndex: z.number().int().nonnegative(),\n quote: z.string(),\n spanStart: z.number().int().nonnegative(),\n spanEnd: z.number().int().positive(),\n quoteHash: z.string(),\n confidence: z.number().min(0).max(1),\n matchMethod: z.enum(['exact', 'normalized', 'fuzzy'])\n});\nexport type AlignedEvidence = z.infer<typeof AlignedEvidenceSchema>;\n\nexport const FailedEvidenceSchema = z.object({\n messageIndex: z.number().int().nonnegative(),\n quote: z.string(),\n failureReason: z.enum(['not_found', 'below_threshold', 'ambiguous', 'empty_quote', 'invalid_index'])\n});\nexport type FailedEvidence = z.infer<typeof FailedEvidenceSchema>;\n\nexport const EvidenceAlignResultSchema = z.discriminatedUnion('aligned', [\n z.object({ aligned: z.literal(true), evidence: AlignedEvidenceSchema }),\n z.object({ aligned: z.literal(false), evidence: FailedEvidenceSchema })\n]);\nexport type EvidenceAlignResult = z.infer<typeof EvidenceAlignResultSchema>;\n\n// ============================================================\n// Vector Outbox V2 Types\n// ============================================================\n\nexport const OutboxStatusSchema = z.enum(['pending', 'processing', 'done', 'failed']);\nexport type OutboxStatus = z.infer<typeof OutboxStatusSchema>;\n\nexport const OutboxItemKindSchema = z.enum(['entry', 'task_title', 'event', 'perspective_observation']);\nexport type OutboxItemKind = z.infer<typeof OutboxItemKindSchema>;\n\nexport const OutboxJobSchema = z.object({\n jobId: z.string(),\n itemKind: OutboxItemKindSchema,\n itemId: z.string(),\n embeddingVersion: z.string(),\n status: OutboxStatusSchema,\n retryCount: z.number().int().nonnegative(),\n error: z.string().optional(),\n createdAt: z.date(),\n updatedAt: z.date()\n});\nexport type OutboxJob = z.infer<typeof OutboxJobSchema>;\n\n// Valid state transitions for outbox\nexport const VALID_OUTBOX_TRANSITIONS: Array<{ from: OutboxStatus; to: OutboxStatus }> = [\n { from: 'pending', to: 'processing' },\n { from: 'processing', to: 'done' },\n { from: 'processing', to: 'failed' },\n { from: 'failed', to: 'pending' }\n];\n\n// ============================================================\n// Build Runs (Pipeline metadata)\n// ============================================================\n\nexport const BuildRunSchema = z.object({\n buildId: z.string(),\n startedAt: z.date(),\n finishedAt: z.date().optional(),\n extractorModel: z.string(),\n extractorPromptHash: z.string(),\n embedderModel: z.string(),\n embeddingVersion: z.string(),\n idrisVersion: z.string(),\n schemaVersion: z.string(),\n status: z.enum(['running', 'success', 'failed']),\n error: z.string().optional()\n});\nexport type BuildRun = z.infer<typeof BuildRunSchema>;\n\n// ============================================================\n// Pipeline Metrics\n// ============================================================\n\nexport const PipelineMetricSchema = z.object({\n id: z.string(),\n ts: z.date(),\n stage: z.string(),\n latencyMs: z.number(),\n success: z.boolean(),\n error: z.string().optional(),\n sessionId: z.string().optional()\n});\nexport type PipelineMetric = z.infer<typeof PipelineMetricSchema>;\n\n// ============================================================\n// Progressive Disclosure Types\n// ============================================================\n\n// Layer 1: Search Index (lightweight)\nexport const SearchIndexItemSchema = z.object({\n id: z.string(),\n summary: z.string().max(100),\n score: z.number(),\n type: z.enum(['user_prompt', 'agent_response', 'session_summary', 'tool_observation']),\n timestamp: z.date(),\n sessionId: z.string()\n});\nexport type SearchIndexItem = z.infer<typeof SearchIndexItemSchema>;\n\n// Layer 2: Timeline\nexport const TimelineItemSchema = z.object({\n id: z.string(),\n timestamp: z.date(),\n type: z.enum(['user_prompt', 'agent_response', 'session_summary', 'tool_observation']),\n preview: z.string().max(200),\n isTarget: z.boolean()\n});\nexport type TimelineItem = z.infer<typeof TimelineItemSchema>;\n\n// Layer 3: Full Detail\nexport const FullDetailSchema = z.object({\n id: z.string(),\n content: z.string(),\n type: z.enum(['user_prompt', 'agent_response', 'session_summary', 'tool_observation']),\n timestamp: z.date(),\n sessionId: z.string(),\n citationId: z.string().optional(),\n metadata: z.object({\n tokenCount: z.number(),\n hasCode: z.boolean(),\n files: z.array(z.string()).optional(),\n tools: z.array(z.string()).optional()\n })\n});\nexport type FullDetail = z.infer<typeof FullDetailSchema>;\n\n// Progressive Search Result\nexport const ProgressiveSearchResultSchema = z.object({\n index: z.array(SearchIndexItemSchema),\n timeline: z.array(TimelineItemSchema).optional(),\n details: z.array(FullDetailSchema).optional(),\n meta: z.object({\n totalMatches: z.number(),\n expandedCount: z.number(),\n estimatedTokens: z.number(),\n expansionReason: z.string().optional()\n })\n});\nexport type ProgressiveSearchResult = z.infer<typeof ProgressiveSearchResultSchema>;\n\n// Progressive Disclosure Config\nexport const ProgressiveDisclosureConfigSchema = z.object({\n enabled: z.boolean().default(true),\n layer1: z.object({\n topK: z.number().default(10),\n minScore: z.number().default(0.7)\n }).default({}),\n autoExpand: z.object({\n enabled: z.boolean().default(true),\n highConfidenceThreshold: z.number().default(0.92),\n scoreGapThreshold: z.number().default(0.1),\n maxAutoExpandCount: z.number().default(3)\n }).default({}),\n tokenBudget: z.object({\n maxTotalTokens: z.number().default(2000),\n layer1PerItem: z.number().default(50),\n layer2PerItem: z.number().default(40),\n layer3PerItem: z.number().default(500)\n }).default({})\n});\nexport type ProgressiveDisclosureConfig = z.infer<typeof ProgressiveDisclosureConfigSchema>;\n\n// ============================================================\n// Citation Types\n// ============================================================\n\nexport const CitationSchema = z.object({\n citationId: z.string().length(6),\n eventId: z.string(),\n createdAt: z.date()\n});\nexport type Citation = z.infer<typeof CitationSchema>;\n\nexport const CitationUsageSchema = z.object({\n usageId: z.string(),\n citationId: z.string(),\n sessionId: z.string(),\n usedAt: z.date(),\n context: z.string().optional()\n});\nexport type CitationUsage = z.infer<typeof CitationUsageSchema>;\n\nexport interface CitedSearchResult {\n event: MemoryEvent;\n citation: Citation;\n score: number;\n}\n\nexport interface CitationStats {\n usageCount: number;\n lastUsed: Date | null;\n}\n\n// ============================================================\n// Endless Mode Types\n// ============================================================\n\nexport const MemoryModeSchema = z.enum(['session', 'endless']);\nexport type MemoryMode = z.infer<typeof MemoryModeSchema>;\n\nexport const EndlessModeConfigSchema = z.object({\n enabled: z.boolean().default(false),\n\n workingSet: z.object({\n maxEvents: z.number().default(100),\n timeWindowHours: z.number().default(24),\n minRelevanceScore: z.number().default(0.5)\n }).default({}),\n\n consolidation: z.object({\n triggerIntervalMs: z.number().default(3600000), // 1 hour\n triggerEventCount: z.number().default(100),\n triggerIdleMs: z.number().default(1800000), // 30 minutes\n useLLMSummarization: z.boolean().default(false)\n }).default({}),\n\n continuity: z.object({\n minScoreForSeamless: z.number().default(0.7),\n topicDecayHours: z.number().default(48)\n }).default({})\n});\nexport type EndlessModeConfig = z.infer<typeof EndlessModeConfigSchema>;\n\n// Working Set Item\nexport const WorkingSetItemSchema = z.object({\n id: z.string(),\n eventId: z.string(),\n addedAt: z.date(),\n relevanceScore: z.number(),\n topics: z.array(z.string()).optional(),\n expiresAt: z.date()\n});\nexport type WorkingSetItem = z.infer<typeof WorkingSetItemSchema>;\n\n// Working Set\nexport interface WorkingSet {\n recentEvents: MemoryEvent[];\n lastActivity: Date;\n continuityScore: number;\n}\n\n// Consolidated Memory\nexport const ConsolidatedMemorySchema = z.object({\n memoryId: z.string(),\n summary: z.string(),\n topics: z.array(z.string()),\n sourceEvents: z.array(z.string()),\n confidence: z.number(),\n createdAt: z.date(),\n accessedAt: z.date().optional(),\n accessCount: z.number().default(0)\n});\nexport type ConsolidatedMemory = z.infer<typeof ConsolidatedMemorySchema>;\n\n// Consolidated Memory Input (for creation)\nexport interface ConsolidatedMemoryInput {\n summary: string;\n topics: string[];\n sourceEvents: string[];\n confidence: number;\n}\n\n// Long-term Rule (promoted from stable summaries)\nexport const ConsolidationRuleSchema = z.object({\n ruleId: z.string(),\n rule: z.string(),\n topics: z.array(z.string()),\n sourceMemoryIds: z.array(z.string()),\n sourceEvents: z.array(z.string()),\n confidence: z.number(),\n createdAt: z.date()\n});\nexport type ConsolidationRule = z.infer<typeof ConsolidationRuleSchema>;\n\nexport interface ConsolidationRuleInput {\n rule: string;\n topics: string[];\n sourceMemoryIds: string[];\n sourceEvents: string[];\n confidence: number;\n}\n\nexport interface ConsolidationCostQualityReport {\n beforeTokenEstimate: number;\n afterTokenEstimate: number;\n reductionRatio: number;\n qualityGuardPassed: boolean;\n details: string;\n}\n\n// Event Group (for consolidation)\nexport interface EventGroup {\n topics: string[];\n events: MemoryEvent[];\n}\n\n// Context Snapshot (for continuity calculation)\nexport interface ContextSnapshot {\n id: string;\n timestamp: number;\n topics: string[];\n files: string[];\n entities: string[];\n}\n\n// Transition Type\nexport const TransitionTypeSchema = z.enum(['seamless', 'topic_shift', 'break']);\nexport type TransitionType = z.infer<typeof TransitionTypeSchema>;\n\n// Continuity Score Result\nexport interface ContinuityScore {\n score: number;\n transitionType: TransitionType;\n}\n\n// Continuity Log\nexport const ContinuityLogSchema = z.object({\n logId: z.string(),\n fromContextId: z.string().optional(),\n toContextId: z.string().optional(),\n continuityScore: z.number(),\n transitionType: TransitionTypeSchema,\n createdAt: z.date()\n});\nexport type ContinuityLog = z.infer<typeof ContinuityLogSchema>;\n\n// Endless Mode Status\nexport interface EndlessModeStatus {\n mode: MemoryMode;\n workingSetSize: number;\n continuityScore: number;\n consolidatedCount: number;\n lastConsolidation: Date | null;\n}\n\n// ============================================================\n// Shared Store Types (Cross-Project Knowledge)\n// ============================================================\n\nexport const SharedEntryTypeSchema = z.enum([\n 'troubleshooting',\n 'best_practice',\n 'common_error'\n]);\nexport type SharedEntryType = z.infer<typeof SharedEntryTypeSchema>;\n\nexport const SharedTroubleshootingEntrySchema = z.object({\n entryId: z.string(),\n sourceProjectHash: z.string(),\n sourceEntryId: z.string(),\n title: z.string(),\n symptoms: z.array(z.string()),\n rootCause: z.string(),\n solution: z.string(),\n topics: z.array(z.string()),\n technologies: z.array(z.string()).optional(),\n confidence: z.number().min(0).max(1),\n usageCount: z.number().default(0),\n lastUsedAt: z.date().optional(),\n promotedAt: z.date(),\n createdAt: z.date()\n});\nexport type SharedTroubleshootingEntry = z.infer<typeof SharedTroubleshootingEntrySchema>;\n\nexport interface SharedTroubleshootingInput {\n sourceProjectHash: string;\n sourceEntryId: string;\n title: string;\n symptoms: string[];\n rootCause: string;\n solution: string;\n topics: string[];\n technologies?: string[];\n confidence: number;\n}\n\nexport const SharedStoreConfigSchema = z.object({\n enabled: z.boolean().default(true),\n autoPromote: z.boolean().default(true),\n searchShared: z.boolean().default(true),\n minConfidenceForPromotion: z.number().default(0.8),\n sharedStoragePath: z.string().default('~/.claude-code/memory/shared')\n});\nexport type SharedStoreConfig = z.infer<typeof SharedStoreConfigSchema>;\n\n// Shared search result\nexport interface SharedSearchResult {\n id: string;\n entryId: string;\n content: string;\n score: number;\n entryType: SharedEntryType;\n}\n", "import { applyPrivacyFilter } from '../privacy/filter.js';\nimport {\n sqliteAll,\n sqliteGet,\n toDateFromSQLite,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\nimport { ConfigSchema } from '../types.js';\nimport {\n evaluateRetentionPolicy,\n RETENTION_POLICY_VERSION,\n type RetentionDecision,\n type RetentionDryRunAction,\n type RetentionFacet,\n type RetentionMemoryLevel,\n type RetentionPolicyInput\n} from './retention-policy.js';\n\nconst DEFAULT_AUDIT_LIMIT = 100;\nconst DEFAULT_SAMPLE_LIMIT = 20;\nconst PREVIEW_LIMIT = 180;\nconst POSIX_ABSOLUTE_PATH_PATTERN = /(^|[^A-Za-z0-9._\\/\\\\-])\\/(?!\\/)[^\\n\\r\"'<>|`]*/g;\nconst WINDOWS_DRIVE_PATH_PATTERN = /(^|[^A-Za-z0-9._\\/\\\\-])(?:[A-Za-z]:[\\\\/][^\\n\\r\"'<>|`]*)/g;\nconst WINDOWS_UNC_PATH_PATTERN = /(^|[^A-Za-z0-9._\\/\\\\-])(?:\\\\\\\\[^\\\\/\\s\"'<>|`]+[\\\\/][^\\n\\r\"'<>|`]*)/g;\nconst PRIVACY_CONFIG = ConfigSchema.parse({}).privacy;\nconst MEMORY_LEVELS = new Set<RetentionMemoryLevel>(['L0', 'L1', 'L2', 'L3', 'L4']);\nconst RETENTION_AUDIT_TARGET_TYPES = new Set(['event', 'entity', 'edge', 'consolidated_memory', 'lesson', 'action']);\n\nexport interface RetentionAuditOptions {\n projectHash: string;\n targetType?: string;\n targetId?: string;\n dryRun?: boolean;\n limit?: number;\n sampleLimit?: number;\n projectPath?: string;\n now?: Date | string | number;\n}\n\nexport interface RetentionAuditDecisionCounts {\n keep: number;\n review: number;\n downgrade: number;\n quarantine: number;\n tombstone_candidate: number;\n}\n\nexport interface RetentionAuditSample {\n targetType: 'event';\n targetId: string;\n eventType: string;\n decision: RetentionDecision;\n lifecycleScore: number;\n policyVersion: typeof RETENTION_POLICY_VERSION;\n dryRunAction: RetentionDryRunAction;\n reasonCodes: string[];\n redactedPreview: string;\n}\n\nexport interface RetentionAuditReport {\n dryRun: true;\n projectHash: string;\n policyVersion: typeof RETENTION_POLICY_VERSION;\n scanned: number;\n limit: number;\n decisions: RetentionAuditDecisionCounts;\n wouldChange: number;\n samples: RetentionAuditSample[];\n}\n\ninterface EventRow {\n id: string;\n event_type: string;\n timestamp: string;\n content: string;\n metadata: string | null;\n access_count: number | null;\n last_accessed_at: string | null;\n}\n\ninterface FacetRow {\n target_id: string;\n dimension: string;\n value: string;\n confidence: number;\n}\n\ninterface HelpfulnessRow {\n event_id: string;\n helpfulness_score: number | null;\n retrieval_score: number | null;\n}\n\ninterface RetrievalTraceRow {\n selected_event_ids: string | null;\n}\n\ninterface EvaluatedSample {\n sample: RetentionAuditSample;\n wouldChange: boolean;\n}\n\nexport function runRetentionAudit(db: SQLiteDatabase, options: RetentionAuditOptions): RetentionAuditReport {\n const projectHash = normalizeProjectHash(options.projectHash);\n if (options.dryRun === false) {\n throw new Error('retention audit is dry-run only and must not mutate memory data');\n }\n\n const limit = normalizePositiveInteger(options.limit, DEFAULT_AUDIT_LIMIT, 'retention audit limit');\n const sampleLimit = normalizePositiveInteger(options.sampleLimit, DEFAULT_SAMPLE_LIMIT, 'retention audit sample limit');\n const targetType = normalizeOptionalRetentionTargetType(options.targetType);\n const targetId = normalizeOptionalTargetId(options.targetId);\n if (targetType && targetType !== 'event') {\n return emptyRetentionAuditReport(projectHash, limit);\n }\n const facetsByTarget = loadFacetsByTarget(db, projectHash);\n const helpfulnessByEvent = loadHelpfulnessByEvent(db);\n const retrievalCounts = loadRetrievalCounts(db, projectHash);\n const eventQueryParams: Array<string | number> = [projectHash];\n const targetIdClause = targetId ? ' AND id = ?' : '';\n if (targetId) eventQueryParams.push(targetId);\n eventQueryParams.push(limit);\n\n const eventRows = sqliteAll<EventRow>(\n db,\n `SELECT id, event_type, timestamp, content, metadata, access_count, last_accessed_at\n FROM events\n WHERE COALESCE(\n json_extract(CASE WHEN json_valid(metadata) THEN metadata ELSE '{}' END, '$.scope.project.hash'),\n json_extract(CASE WHEN json_valid(metadata) THEN metadata ELSE '{}' END, '$.projectHash')\n ) = ?${targetIdClause}\n ORDER BY timestamp DESC\n LIMIT ?`,\n eventQueryParams\n );\n\n const decisions = emptyDecisionCounts();\n const evaluatedSamples: EvaluatedSample[] = [];\n let scanned = 0;\n let wouldChange = 0;\n\n for (const row of eventRows) {\n const metadata = safeParseObject(row.metadata) ?? {};\n if (!belongsToProject(metadata, projectHash)) continue;\n\n scanned++;\n const facets = facetsByTarget.get(row.id) ?? [];\n const helpfulness = helpfulnessByEvent.get(row.id);\n const retrievalCount = Math.max(0, Number(row.access_count ?? 0)) + (retrievalCounts.get(row.id) ?? 0);\n const result = evaluateRetentionPolicy({\n targetType: 'event',\n targetId: row.id,\n projectHash,\n eventType: row.event_type,\n memoryLevel: memoryLevelFromMetadata(metadata),\n createdAt: toDateFromSQLite(row.timestamp),\n lastAccessedAt: row.last_accessed_at ? toDateFromSQLite(row.last_accessed_at) : null,\n retrievalCount,\n helpfulnessScore: helpfulness?.helpfulnessScore,\n adherenceScore: helpfulness?.adherenceScore,\n evidenceConfidence: evidenceConfidenceFromFacets(facets),\n metadata,\n facets\n } satisfies RetentionPolicyInput, { now: options.now });\n\n decisions[result.decision]++;\n if (result.dryRunDiff.wouldChange) wouldChange++;\n\n evaluatedSamples.push({\n wouldChange: result.dryRunDiff.wouldChange,\n sample: {\n targetType: 'event',\n targetId: row.id,\n eventType: row.event_type,\n decision: result.decision,\n lifecycleScore: result.lifecycleScore,\n policyVersion: result.policyVersion,\n dryRunAction: result.dryRunDiff.action,\n reasonCodes: result.reasons.map((reason) => reason.code),\n redactedPreview: redactedPreview(row.content, options.projectPath)\n }\n });\n }\n\n evaluatedSamples.sort((left, right) => {\n if (left.wouldChange !== right.wouldChange) return left.wouldChange ? -1 : 1;\n return left.sample.lifecycleScore - right.sample.lifecycleScore;\n });\n\n return {\n dryRun: true,\n projectHash,\n policyVersion: RETENTION_POLICY_VERSION,\n scanned,\n limit,\n decisions,\n wouldChange,\n samples: evaluatedSamples.slice(0, sampleLimit).map((entry) => entry.sample)\n };\n}\n\nexport function emptyRetentionAuditReport(projectHash: string, limit = DEFAULT_AUDIT_LIMIT): RetentionAuditReport {\n return {\n dryRun: true,\n projectHash: normalizeProjectHash(projectHash),\n policyVersion: RETENTION_POLICY_VERSION,\n scanned: 0,\n limit: normalizePositiveInteger(limit, DEFAULT_AUDIT_LIMIT, 'retention audit limit'),\n decisions: emptyDecisionCounts(),\n wouldChange: 0,\n samples: []\n };\n}\n\nfunction loadFacetsByTarget(db: SQLiteDatabase, projectHash: string): Map<string, RetentionFacet[]> {\n if (!tableExists(db, 'memory_facets')) return new Map();\n const rows = sqliteAll<FacetRow>(\n db,\n `SELECT target_id, dimension, value, confidence\n FROM memory_facets\n WHERE target_type = 'event'\n AND project_hash = ?\n AND confidence > 0\n ORDER BY updated_at DESC`,\n [projectHash]\n );\n const facets = new Map<string, RetentionFacet[]>();\n for (const row of rows) {\n const current = facets.get(row.target_id) ?? [];\n current.push({\n dimension: row.dimension,\n value: row.value,\n confidence: Number(row.confidence)\n });\n facets.set(row.target_id, current);\n }\n return facets;\n}\n\nfunction loadHelpfulnessByEvent(db: SQLiteDatabase): Map<string, { helpfulnessScore?: number; adherenceScore?: number }> {\n if (!tableExists(db, 'memory_helpfulness')) return new Map();\n const rows = sqliteAll<HelpfulnessRow>(\n db,\n `SELECT event_id,\n AVG(helpfulness_score) AS helpfulness_score,\n AVG(retrieval_score) AS retrieval_score\n FROM memory_helpfulness\n GROUP BY event_id`,\n []\n );\n const helpfulness = new Map<string, { helpfulnessScore?: number; adherenceScore?: number }>();\n for (const row of rows) {\n helpfulness.set(row.event_id, {\n helpfulnessScore: normalizeScore(row.helpfulness_score),\n adherenceScore: normalizeScore(row.retrieval_score)\n });\n }\n return helpfulness;\n}\n\nfunction loadRetrievalCounts(db: SQLiteDatabase, projectHash: string): Map<string, number> {\n if (!tableExists(db, 'retrieval_traces')) return new Map();\n const rows = sqliteAll<RetrievalTraceRow>(\n db,\n `SELECT selected_event_ids\n FROM retrieval_traces\n WHERE project_hash = ?`,\n [projectHash]\n );\n const counts = new Map<string, number>();\n for (const row of rows) {\n for (const eventId of parseStringArray(row.selected_event_ids)) {\n counts.set(eventId, (counts.get(eventId) ?? 0) + 1);\n }\n }\n return counts;\n}\n\nfunction belongsToProject(metadata: Record<string, unknown>, projectHash: string): boolean {\n const currentHash = nestedString(metadata, ['scope', 'project', 'hash'])\n ?? nestedString(metadata, ['projectHash']);\n return currentHash === undefined || currentHash === projectHash;\n}\n\nfunction memoryLevelFromMetadata(metadata: Record<string, unknown>): RetentionMemoryLevel {\n const level = nestedString(metadata, ['memoryLevel'])\n ?? nestedString(metadata, ['memory', 'level'])\n ?? nestedString(metadata, ['level']);\n return MEMORY_LEVELS.has(level as RetentionMemoryLevel) ? level as RetentionMemoryLevel : 'L0';\n}\n\nfunction evidenceConfidenceFromFacets(facets: RetentionFacet[]): number | undefined {\n if (facets.some((facet) => facet.dimension === 'quality' && facet.value === 'verified' && facet.confidence > 0)) {\n return 0.9;\n }\n if (facets.some((facet) => facet.dimension === 'quality' && facet.value === 'disputed' && facet.confidence > 0)) {\n return 0.1;\n }\n return undefined;\n}\n\nfunction redactedPreview(content: string, projectPath?: string): string {\n return redactLocalPaths(applyPrivacyFilter(content, PRIVACY_CONFIG).content, projectPath)\n .replace(/\\s+/g, ' ')\n .trim()\n .slice(0, PREVIEW_LIMIT);\n}\n\nfunction redactLocalPaths(content: string, projectPath?: string): string {\n let filtered = content;\n if (projectPath) {\n filtered = filtered.split(projectPath).join('[REDACTED]');\n }\n return [WINDOWS_UNC_PATH_PATTERN, WINDOWS_DRIVE_PATH_PATTERN, POSIX_ABSOLUTE_PATH_PATTERN].reduce(\n (current, pattern) => current.replace(pattern, (_match, prefix: string) => `${prefix}[REDACTED]`),\n filtered\n );\n}\n\nfunction tableExists(db: SQLiteDatabase, tableName: string): boolean {\n const row = sqliteGet<{ name: string }>(\n db,\n `SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?`,\n [tableName]\n );\n return Boolean(row);\n}\n\nfunction emptyDecisionCounts(): RetentionAuditDecisionCounts {\n return {\n keep: 0,\n review: 0,\n downgrade: 0,\n quarantine: 0,\n tombstone_candidate: 0\n };\n}\n\nfunction normalizeProjectHash(value: string): string {\n const projectHash = value.trim();\n if (!/^[a-f0-9]{8}$/.test(projectHash)) {\n throw new Error('retention audit projectHash must be an 8-character lowercase hex hash');\n }\n return projectHash;\n}\n\nfunction normalizeOptionalRetentionTargetType(value: string | undefined): string | undefined {\n if (value === undefined) return undefined;\n const targetType = value.trim();\n if (!RETENTION_AUDIT_TARGET_TYPES.has(targetType)) {\n throw new Error('retention audit targetType is not supported');\n }\n return targetType;\n}\n\nfunction normalizeOptionalTargetId(value: string | undefined): string | undefined {\n if (value === undefined) return undefined;\n const targetId = value.trim();\n return targetId.length > 0 ? targetId : undefined;\n}\n\nfunction normalizePositiveInteger(value: number | undefined, fallback: number, label: string): number {\n if (value === undefined) return fallback;\n if (!Number.isInteger(value) || value <= 0 || value > 10000) {\n throw new Error(`${label} must be a positive integer <= 10000`);\n }\n return value;\n}\n\nfunction normalizeScore(value: number | null): number | undefined {\n if (typeof value !== 'number' || Number.isNaN(value)) return undefined;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction parseStringArray(value: string | null): string[] {\n if (!value) return [];\n try {\n const parsed = JSON.parse(value);\n if (!Array.isArray(parsed)) return [];\n return parsed.filter((item): item is string => typeof item === 'string' && item.length > 0);\n } catch {\n return [];\n }\n}\n\nfunction safeParseObject(value: string | null): Record<string, unknown> | undefined {\n if (!value) return undefined;\n try {\n const parsed = JSON.parse(value);\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction nestedString(root: Record<string, unknown>, path: string[]): string | undefined {\n let cursor: unknown = root;\n for (const key of path) {\n if (!isRecord(cursor)) return undefined;\n cursor = cursor[key];\n }\n return typeof cursor === 'string' && cursor.length > 0 ? cursor : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "import { randomUUID } from 'crypto';\nimport { z } from 'zod';\n\nimport {\n sanitizeGovernanceAuditValue,\n type MemoryGovernanceAuditEntry\n} from './governance-audit.js';\nimport {\n sqliteGet,\n sqliteRun,\n sqliteTransaction,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\n\nconst SafeGovernanceLabelSchema = z.string()\n .trim()\n .min(1)\n .max(128)\n .regex(/^[A-Za-z0-9][A-Za-z0-9._:-]*$/, 'must be a safe label');\n\nconst QuarantineInputSchema = z.object({\n targetType: z.literal('event'),\n targetId: z.string().trim().min(1),\n projectHash: SafeGovernanceLabelSchema,\n actor: SafeGovernanceLabelSchema.default('cml-core'),\n category: SafeGovernanceLabelSchema.default('manual'),\n reason: SafeGovernanceLabelSchema,\n sourceEventIds: z.array(z.string().trim().min(1)).default([]),\n now: z.date().optional()\n});\n\nexport type QuarantineInput = z.input<typeof QuarantineInputSchema>;\ntype ParsedQuarantineInput = z.output<typeof QuarantineInputSchema>;\n\nexport interface GovernanceQuarantineMetadata {\n status: 'active';\n category: string;\n reason: string;\n actor: string;\n expectedProjectHash: string;\n quarantinedAt: string;\n detectedAt: string;\n}\n\nexport interface GovernanceQuarantineResult {\n targetType: 'event';\n targetId: string;\n projectHash: string;\n changed: boolean;\n quarantine: GovernanceQuarantineMetadata;\n auditEntry?: MemoryGovernanceAuditEntry;\n}\n\nexport interface GovernanceServiceOptions {\n /** @internal Test hook used to simulate a stale row between validation and write. */\n beforeQuarantineUpdate?: () => void;\n}\n\ninterface EventMetadataRow {\n id: string;\n metadata: string | null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction getNestedString(root: Record<string, unknown> | undefined, path: string[]): string | undefined {\n let cursor: unknown = root;\n for (const key of path) {\n if (!isRecord(cursor)) return undefined;\n cursor = cursor[key];\n }\n return typeof cursor === 'string' && cursor.trim().length > 0 ? cursor.trim() : undefined;\n}\n\nfunction parseMetadata(value: unknown): Record<string, unknown> {\n if (!value) return {};\n if (isRecord(value)) return { ...value };\n if (typeof value !== 'string') return {};\n try {\n const parsed = JSON.parse(value);\n return isRecord(parsed) ? { ...parsed } : {};\n } catch {\n return {};\n }\n}\n\nfunction metadataProjectHash(metadata: Record<string, unknown>): string | undefined {\n return getNestedString(metadata, ['scope', 'project', 'hash'])\n ?? getNestedString(metadata, ['projectHash']);\n}\n\nfunction eventToAuditJson(row: EventMetadataRow, metadata: Record<string, unknown>): Record<string, unknown> {\n return {\n id: row.id,\n metadata\n };\n}\n\nfunction appendMetadataTag(metadata: Record<string, unknown>, tag: string): void {\n const tags = Array.isArray(metadata.tags)\n ? metadata.tags.filter((value): value is string => typeof value === 'string' && value.length > 0)\n : [];\n if (!tags.includes(tag)) metadata.tags = [...tags, tag];\n}\n\nfunction createAuditEntryInTransaction(\n db: SQLiteDatabase,\n input: ParsedQuarantineInput,\n beforeJson: Record<string, unknown>,\n afterJson: Record<string, unknown>,\n createdAt: Date\n): MemoryGovernanceAuditEntry {\n const sanitizedTargetId = sanitizeGovernanceAuditValue(input.targetId) as string;\n const sanitizedSourceEventIds = sanitizeGovernanceAuditValue(input.sourceEventIds) as string[];\n const entry: MemoryGovernanceAuditEntry = {\n auditId: randomUUID(),\n operation: 'quarantine',\n actor: input.actor,\n projectHash: input.projectHash,\n targetType: input.targetType,\n targetId: sanitizedTargetId,\n beforeJson: sanitizeGovernanceAuditValue(beforeJson) as Record<string, unknown>,\n afterJson: sanitizeGovernanceAuditValue(afterJson) as Record<string, unknown>,\n sourceEventIds: sanitizedSourceEventIds,\n createdAt\n };\n\n sqliteRun(\n db,\n `INSERT INTO memory_governance_audit (\n audit_id, operation, actor, project_hash, target_type, target_id,\n before_json, after_json, source_event_ids, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n entry.auditId,\n entry.operation,\n entry.actor,\n entry.projectHash ?? null,\n entry.targetType,\n entry.targetId,\n entry.beforeJson === undefined ? null : JSON.stringify(entry.beforeJson),\n entry.afterJson === undefined ? null : JSON.stringify(entry.afterJson),\n JSON.stringify(entry.sourceEventIds),\n entry.createdAt.toISOString()\n ]\n );\n\n return entry;\n}\n\nexport class GovernanceService {\n constructor(\n private readonly db: SQLiteDatabase,\n private readonly options: GovernanceServiceOptions = {}\n ) {}\n\n async quarantine(input: QuarantineInput): Promise<GovernanceQuarantineResult> {\n const parsed = QuarantineInputSchema.parse(input);\n\n return sqliteTransaction(this.db, () => {\n const row = sqliteGet<EventMetadataRow>(\n this.db,\n `SELECT id, metadata FROM events WHERE id = ?`,\n [parsed.targetId]\n );\n if (!row) {\n throw new Error(`event not found: ${parsed.targetId}`);\n }\n\n const metadata = parseMetadata(row.metadata);\n const currentProjectHash = metadataProjectHash(metadata);\n if (!currentProjectHash) {\n throw new Error(`Cannot quarantine event without explicit project scope: ${parsed.targetId}`);\n }\n if (currentProjectHash !== parsed.projectHash) {\n throw new Error(`event projectHash mismatch: event uses ${currentProjectHash} but input uses ${parsed.projectHash}`);\n }\n\n const now = parsed.now ?? new Date();\n const nowIso = now.toISOString();\n const quarantine: GovernanceQuarantineMetadata = {\n status: 'active',\n category: parsed.category,\n reason: parsed.reason,\n actor: parsed.actor,\n expectedProjectHash: parsed.projectHash,\n quarantinedAt: nowIso,\n detectedAt: nowIso\n };\n const beforeMetadata = { ...metadata };\n const afterMetadata: Record<string, unknown> = {\n ...metadata,\n quarantine: {\n ...(isRecord(metadata.quarantine) ? metadata.quarantine : {}),\n ...quarantine\n }\n };\n appendMetadataTag(afterMetadata, `quarantine:${parsed.category}`);\n\n const changed = JSON.stringify(beforeMetadata) !== JSON.stringify(afterMetadata);\n if (!changed) {\n return {\n targetType: parsed.targetType,\n targetId: parsed.targetId,\n projectHash: parsed.projectHash,\n changed,\n quarantine\n };\n }\n\n this.options.beforeQuarantineUpdate?.();\n const updateResult = sqliteRun(\n this.db,\n `UPDATE events SET metadata = ? WHERE id = ? AND metadata IS ?`,\n [JSON.stringify(afterMetadata), parsed.targetId, row.metadata]\n );\n if (updateResult.changes !== 1) {\n throw new Error(`event changed during quarantine validation; retry: ${parsed.targetId}`);\n }\n const auditEntry = createAuditEntryInTransaction(\n this.db,\n parsed,\n eventToAuditJson(row, beforeMetadata),\n eventToAuditJson(row, afterMetadata),\n now\n );\n\n return {\n targetType: parsed.targetType,\n targetId: parsed.targetId,\n projectHash: parsed.projectHash,\n changed,\n quarantine,\n auditEntry\n };\n });\n }\n}\n", "import { sqliteAll, type SQLiteDatabase } from '../sqlite-wrapper.js';\nimport type { NodeType, RelationType } from '../types.js';\n\nexport type GraphPathDirection = 'outgoing' | 'incoming' | 'both';\n\nexport interface GraphNodeRef {\n type: NodeType;\n id: string;\n}\n\nexport interface GraphPathNode extends GraphNodeRef {\n name: string;\n}\n\nexport interface GraphPathStep {\n edgeId: string;\n relationType: RelationType;\n direction: 'outgoing' | 'incoming';\n from: GraphPathNode;\n to: GraphPathNode;\n weight: number;\n cost: number;\n scoreContribution: number;\n}\n\nexport interface GraphPathResult {\n target: GraphPathNode;\n hops: number;\n totalCost: number;\n scoreContribution: number;\n steps: GraphPathStep[];\n}\n\nexport interface GraphPathExpandInput {\n startNodes: GraphNodeRef[];\n maxHops?: number;\n maxResults?: number;\n direction?: GraphPathDirection;\n}\n\nexport interface GraphPathExpandResult {\n startNodes: GraphPathNode[];\n effectiveMaxHops: number;\n paths: GraphPathResult[];\n}\n\ninterface EdgeRow {\n edge_id: string;\n src_type: string;\n src_id: string;\n rel_type: string;\n dst_type: string;\n dst_id: string;\n meta_json: string | null;\n}\n\ninterface EntityLabelRow {\n entity_id: string;\n title: string;\n}\n\ninterface TraversalEdge {\n toKey: string;\n step: GraphPathStep;\n}\n\ninterface PathState {\n key: string;\n hops: number;\n totalCost: number;\n steps: GraphPathStep[];\n visited: Set<string>;\n}\n\ninterface BestPath {\n hops: number;\n totalCost: number;\n signature: string;\n steps: GraphPathStep[];\n}\n\nconst DEFAULT_WEIGHT = 0.5;\nconst MAX_HOPS = 2;\nconst DEFAULT_MAX_RESULTS = 20;\nconst MAX_RESULTS = 100;\n\nexport class GraphPathService {\n constructor(private db: SQLiteDatabase) {}\n\n expand(input: GraphPathExpandInput): GraphPathExpandResult {\n const graph = this.loadGraph(input.direction ?? 'both');\n const effectiveMaxHops = normalizeMaxHops(input.maxHops);\n const maxResults = normalizeMaxResults(input.maxResults);\n const startNodes = input.startNodes.map(node => graph.node(node));\n const startKeys = new Set(input.startNodes.map(nodeKey));\n const bestByTarget = new Map<string, BestPath>();\n const queue: PathState[] = startNodes.map(node => ({\n key: nodeKey(node),\n hops: 0,\n totalCost: 0,\n steps: [],\n visited: new Set([nodeKey(node)])\n }));\n\n while (queue.length > 0) {\n queue.sort((a, b) => a.totalCost - b.totalCost || a.hops - b.hops || a.key.localeCompare(b.key));\n const current = queue.shift()!;\n if (current.hops >= effectiveMaxHops) continue;\n\n for (const edge of graph.adjacency.get(current.key) ?? []) {\n if (current.visited.has(edge.toKey)) continue;\n const nextHops = current.hops + 1;\n const nextTotalCost = current.totalCost + edge.step.cost;\n const nextSteps = [...current.steps, edge.step];\n const nextSignature = pathSignature(nextSteps);\n const existing = bestByTarget.get(edge.toKey);\n\n if (!existing || isBetterPath(nextTotalCost, nextHops, nextSignature, existing)) {\n if (!startKeys.has(edge.toKey)) {\n bestByTarget.set(edge.toKey, { hops: nextHops, totalCost: nextTotalCost, signature: nextSignature, steps: nextSteps });\n }\n const nextVisited = new Set(current.visited);\n nextVisited.add(edge.toKey);\n queue.push({\n key: edge.toKey,\n hops: nextHops,\n totalCost: nextTotalCost,\n steps: nextSteps,\n visited: nextVisited\n });\n }\n }\n }\n\n const paths = Array.from(bestByTarget.entries())\n .map(([key, path]) => ({\n target: graph.node(nodeFromKey(key)),\n hops: path.hops,\n totalCost: path.totalCost,\n scoreContribution: path.totalCost > 0 ? 1 / path.totalCost : 0,\n steps: path.steps\n }))\n .sort((a, b) => b.scoreContribution - a.scoreContribution || a.hops - b.hops || a.target.name.localeCompare(b.target.name))\n .slice(0, maxResults);\n\n return { startNodes, effectiveMaxHops, paths };\n }\n\n private loadGraph(direction: GraphPathDirection): { adjacency: Map<string, TraversalEdge[]>; node: (node: GraphNodeRef) => GraphPathNode } {\n const entityLabels = new Map(\n sqliteAll<EntityLabelRow>(this.db, `SELECT entity_id, title FROM entities WHERE status = 'active'`)\n .map(row => [row.entity_id, row.title] as const)\n );\n const labelNode = (node: GraphNodeRef): GraphPathNode => ({\n ...node,\n name: node.type === 'entity' ? entityLabels.get(node.id) ?? node.id : node.id\n });\n const adjacency = new Map<string, TraversalEdge[]>();\n const edges = sqliteAll<EdgeRow>(\n this.db,\n `SELECT edge_id, src_type, src_id, rel_type, dst_type, dst_id, meta_json FROM edges`\n );\n\n for (const edge of edges) {\n const src = labelNode({ type: edge.src_type as NodeType, id: edge.src_id });\n const dst = labelNode({ type: edge.dst_type as NodeType, id: edge.dst_id });\n const weight = edgeWeight(edge.meta_json);\n const cost = 1 / weight;\n const baseStep = {\n edgeId: edge.edge_id,\n relationType: edge.rel_type as RelationType,\n from: src,\n to: dst,\n weight,\n cost,\n scoreContribution: weight\n };\n\n if (direction === 'outgoing' || direction === 'both') {\n addTraversal(adjacency, nodeKey(src), {\n toKey: nodeKey(dst),\n step: { ...baseStep, direction: 'outgoing' }\n });\n }\n if (direction === 'incoming' || direction === 'both') {\n addTraversal(adjacency, nodeKey(dst), {\n toKey: nodeKey(src),\n step: { ...baseStep, direction: 'incoming' }\n });\n }\n }\n\n return { adjacency, node: labelNode };\n }\n}\n\nfunction addTraversal(adjacency: Map<string, TraversalEdge[]>, fromKey: string, edge: TraversalEdge): void {\n const edges = adjacency.get(fromKey) ?? [];\n edges.push(edge);\n adjacency.set(fromKey, edges);\n}\n\nfunction normalizeMaxHops(maxHops?: number): number {\n if (maxHops === undefined) return 1;\n if (!Number.isFinite(maxHops)) return MAX_HOPS;\n return Math.min(Math.max(0, Math.trunc(maxHops)), MAX_HOPS);\n}\n\nfunction normalizeMaxResults(maxResults?: number): number {\n if (maxResults === undefined) return DEFAULT_MAX_RESULTS;\n if (!Number.isFinite(maxResults)) return DEFAULT_MAX_RESULTS;\n return Math.min(Math.max(0, Math.trunc(maxResults)), MAX_RESULTS);\n}\n\nfunction isBetterPath(totalCost: number, hops: number, signature: string, existing: BestPath): boolean {\n return totalCost < existing.totalCost\n || (totalCost === existing.totalCost && hops < existing.hops)\n || (totalCost === existing.totalCost && hops === existing.hops && signature < existing.signature);\n}\n\nfunction pathSignature(steps: GraphPathStep[]): string {\n return steps\n .map(step => `${step.edgeId}:${step.direction}:${nodeKey(step.from)}>${nodeKey(step.to)}`)\n .join('|');\n}\n\nfunction edgeWeight(metaJson: string | null): number {\n const meta = parseMeta(metaJson);\n const raw = meta.weight;\n if (typeof raw === 'number' && Number.isFinite(raw) && raw > 0) return raw;\n if (typeof raw === 'string') {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed > 0) return parsed;\n }\n return DEFAULT_WEIGHT;\n}\n\nfunction parseMeta(metaJson: string | null): Record<string, unknown> {\n if (!metaJson) return {};\n try {\n const parsed = JSON.parse(metaJson);\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed as Record<string, unknown> : {};\n } catch {\n return {};\n }\n}\n\nfunction nodeKey(node: GraphNodeRef): string {\n return `${node.type}:${node.id}`;\n}\n\nfunction nodeFromKey(key: string): GraphNodeRef {\n const index = key.indexOf(':');\n if (index === -1) return { type: 'entity', id: key };\n return { type: key.slice(0, index) as NodeType, id: key.slice(index + 1) };\n}\n", "import { sqliteAll, type SQLiteDatabase } from '../sqlite-wrapper.js';\nimport type { EntityType } from '../types.js';\n\nexport type QueryEntityCandidateSource =\n | 'entity_alias'\n | 'quoted'\n | 'file_path'\n | 'package_identifier'\n | 'capitalized_term';\n\nexport interface QueryEntityCandidate {\n text: string;\n normalized: string;\n source: QueryEntityCandidateSource;\n confidence: number;\n start: number;\n end: number;\n entityId?: string;\n entityType?: EntityType;\n canonicalKey?: string;\n matchedAlias?: string;\n}\n\nexport interface QueryEntityExtractionOptions {\n maxCandidates?: number;\n includeAliases?: boolean;\n}\n\nexport interface QueryEntityExtractionResult {\n query: string;\n candidates: QueryEntityCandidate[];\n}\n\ninterface AliasRow {\n entity_id: string;\n entity_type: string;\n entity_canonical_key: string;\n alias_key: string;\n title: string;\n}\n\ninterface CandidateDraft extends QueryEntityCandidate {\n priority: number;\n}\n\ninterface TokenMatch {\n text: string;\n start: number;\n end: number;\n}\n\nconst DEFAULT_MAX_CANDIDATES = 20;\nconst MAX_CANDIDATES = 100;\nconst MAX_CANDIDATE_TEXT_LENGTH = 200;\n\nconst SOURCE_PRIORITY: Record<QueryEntityCandidateSource, number> = {\n entity_alias: 0,\n quoted: 1,\n file_path: 2,\n package_identifier: 3,\n capitalized_term: 4\n};\n\nconst SOURCE_CONFIDENCE: Record<QueryEntityCandidateSource, number> = {\n entity_alias: 0.95,\n quoted: 0.85,\n file_path: 0.8,\n package_identifier: 0.75,\n capitalized_term: 0.6\n};\n\nconst SENTENCE_START_STOPWORDS = new Set([\n 'A',\n 'An',\n 'And',\n 'Are',\n 'Can',\n 'Compare',\n 'Does',\n 'Explain',\n 'Find',\n 'How',\n 'I',\n 'If',\n 'In',\n 'Is',\n 'List',\n 'Please',\n 'Should',\n 'Show',\n 'Tell',\n 'The',\n 'This',\n 'Use',\n 'What',\n 'When',\n 'Where',\n 'Which',\n 'Why',\n 'With'\n]);\n\nexport class QueryEntityExtractor {\n constructor(private db?: SQLiteDatabase) {}\n\n extract(query: string, options: QueryEntityExtractionOptions = {}): QueryEntityExtractionResult {\n const maxCandidates = normalizeMaxCandidates(options.maxCandidates);\n const candidates: CandidateDraft[] = [];\n const quotedRanges = this.extractQuoted(query, candidates);\n\n if (options.includeAliases !== false) {\n this.extractKnownAliases(query, candidates);\n }\n\n this.extractFilePaths(query, candidates);\n this.extractPackageIdentifiers(query, candidates);\n this.extractCapitalizedTerms(query, candidates, quotedRanges);\n\n return {\n query,\n candidates: dedupeAndSort(candidates).slice(0, maxCandidates).map(stripPriority)\n };\n }\n\n private extractQuoted(query: string, candidates: CandidateDraft[]): Array<[number, number]> {\n const ranges: Array<[number, number]> = [];\n const regex = /([\"'`])((?:(?!\\1)[^\\n]){2,200})\\1/g;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(query)) !== null) {\n const text = cleanCandidateText(match[2] ?? '');\n if (!isUsefulCandidate(text)) continue;\n const start = match.index + 1;\n const end = start + text.length;\n ranges.push([match.index, match.index + match[0].length]);\n pushCandidate(candidates, {\n text,\n source: 'quoted',\n start,\n end\n });\n }\n return ranges;\n }\n\n private extractKnownAliases(query: string, candidates: CandidateDraft[]): void {\n if (!this.db) return;\n const rows = sqliteAll<AliasRow>(\n this.db,\n `SELECT\n a.entity_id,\n a.entity_type,\n a.canonical_key AS alias_key,\n e.canonical_key AS entity_canonical_key,\n e.title\n FROM entity_aliases a\n JOIN entities e ON e.entity_id = a.entity_id\n WHERE e.status = 'active'\n ORDER BY e.title COLLATE NOCASE, a.canonical_key COLLATE NOCASE`\n );\n const normalizedQuery = normalizeForContainment(query);\n const seenAliases = new Set<string>();\n\n for (const row of rows) {\n const aliasLabels = uniqueStrings([\n row.title,\n aliasLabelFromCanonicalKey(row.alias_key),\n aliasLabelFromCanonicalKey(row.entity_canonical_key)\n ]).filter(isUsefulCandidate);\n\n for (const alias of aliasLabels) {\n const normalizedAlias = normalizeForContainment(alias);\n if (!normalizedAlias || !containsPhrase(normalizedQuery, normalizedAlias)) continue;\n const aliasKey = `${row.entity_id}:${normalizedAlias}`;\n if (seenAliases.has(aliasKey)) continue;\n seenAliases.add(aliasKey);\n const range = findRange(query, alias);\n pushCandidate(candidates, {\n text: row.title,\n source: 'entity_alias',\n start: range.start,\n end: range.end,\n entityId: row.entity_id,\n entityType: row.entity_type as EntityType,\n canonicalKey: row.entity_canonical_key,\n matchedAlias: normalizedAlias\n });\n }\n }\n }\n\n private extractFilePaths(query: string, candidates: CandidateDraft[]): void {\n const regex = /(^|[\\s([{<])((?:\\.{1,2}\\/|~\\/|\\/)?(?:[A-Za-z0-9_.-]+\\/)+[A-Za-z0-9_.-]+\\.[A-Za-z0-9][A-Za-z0-9._-]*)(?=$|[\\s)\\]},>`.,;:!?])/g;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(query)) !== null) {\n const text = cleanCandidateText(match[2] ?? '');\n if (!isUsefulCandidate(text)) continue;\n const start = match.index + (match[1]?.length ?? 0);\n pushCandidate(candidates, {\n text,\n source: 'file_path',\n start,\n end: start + text.length\n });\n }\n }\n\n private extractPackageIdentifiers(query: string, candidates: CandidateDraft[]): void {\n const regex = /(^|[\\s([{<`])(@[a-z0-9][a-z0-9._-]*\\/[a-z0-9][a-z0-9._-]*|[a-z0-9][a-z0-9._]*[-_][a-z0-9._-]*)(?=$|[\\s)\\]},>`.,;:!?])/gi;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(query)) !== null) {\n const text = cleanCandidateText(match[2] ?? '');\n if (!isUsefulCandidate(text) || text.includes('/.') || text.includes('./')) continue;\n const start = match.index + (match[1]?.length ?? 0);\n pushCandidate(candidates, {\n text,\n source: 'package_identifier',\n start,\n end: start + text.length\n });\n }\n }\n\n private extractCapitalizedTerms(query: string, candidates: CandidateDraft[], ignoredRanges: Array<[number, number]>): void {\n const tokens = collectCapitalizedTokens(query)\n .filter(token => !isInsideAnyRange(token.start, ignoredRanges))\n .filter(token => !SENTENCE_START_STOPWORDS.has(token.text));\n const groups: TokenMatch[][] = [];\n let current: TokenMatch[] = [];\n\n for (const token of tokens) {\n const previous = current[current.length - 1];\n if (previous && query.slice(previous.end, token.start).match(/^\\s+$/)) {\n current.push(token);\n } else {\n if (current.length > 0) groups.push(current);\n current = [token];\n }\n }\n if (current.length > 0) groups.push(current);\n\n for (const group of groups) {\n if (group.length === 1 && !isStrongSingleCapitalized(group[0].text)) continue;\n const start = group[0].start;\n const end = group[group.length - 1].end;\n const text = query.slice(start, end);\n if (!isUsefulCandidate(text)) continue;\n pushCandidate(candidates, {\n text,\n source: 'capitalized_term',\n start,\n end\n });\n }\n }\n}\n\nfunction collectCapitalizedTokens(query: string): TokenMatch[] {\n const regex = /\\b(?:[A-Z]{2,}[A-Z0-9]*|[A-Z][A-Za-z0-9]*(?:[._-][A-Za-z0-9]+)*)\\b/g;\n const tokens: TokenMatch[] = [];\n let match: RegExpExecArray | null;\n while ((match = regex.exec(query)) !== null) {\n tokens.push({ text: match[0], start: match.index, end: match.index + match[0].length });\n }\n return tokens;\n}\n\nfunction pushCandidate(\n candidates: CandidateDraft[],\n input: Omit<CandidateDraft, 'normalized' | 'confidence' | 'priority'> & Partial<Pick<CandidateDraft, 'confidence'>>\n): void {\n const text = cleanCandidateText(input.text);\n if (!isUsefulCandidate(text)) return;\n const source = input.source;\n candidates.push({\n ...input,\n text,\n normalized: normalizeCandidate(text),\n confidence: input.confidence ?? SOURCE_CONFIDENCE[source],\n priority: SOURCE_PRIORITY[source]\n });\n}\n\nfunction dedupeAndSort(candidates: CandidateDraft[]): CandidateDraft[] {\n const sorted = [...candidates].sort(compareCandidates);\n const seenAliasKeys = new Set<string>();\n const seenNormalized = new Set<string>();\n const result: CandidateDraft[] = [];\n\n for (const candidate of sorted) {\n if (candidate.source === 'entity_alias') {\n const aliasKey = `alias:${candidate.entityId ?? ''}:${normalizeCandidate(candidate.matchedAlias ?? candidate.text)}`;\n if (seenAliasKeys.has(aliasKey)) continue;\n seenAliasKeys.add(aliasKey);\n seenNormalized.add(candidate.normalized);\n result.push(candidate);\n continue;\n }\n\n if (seenNormalized.has(candidate.normalized)) continue;\n seenNormalized.add(candidate.normalized);\n result.push(candidate);\n }\n\n return result.sort(compareCandidates);\n}\n\nfunction compareCandidates(a: CandidateDraft, b: CandidateDraft): number {\n return a.priority - b.priority\n || a.start - b.start\n || a.end - b.end\n || compareStrings(a.text, b.text)\n || compareStrings(a.entityId ?? '', b.entityId ?? '')\n || compareStrings(a.matchedAlias ?? '', b.matchedAlias ?? '');\n}\n\nfunction compareStrings(a: string, b: string): number {\n if (a === b) return 0;\n return a < b ? -1 : 1;\n}\n\nfunction stripPriority(candidate: CandidateDraft): QueryEntityCandidate {\n const { priority: _priority, ...publicCandidate } = candidate;\n return publicCandidate;\n}\n\nfunction normalizeMaxCandidates(maxCandidates?: number): number {\n if (maxCandidates === undefined) return DEFAULT_MAX_CANDIDATES;\n if (!Number.isFinite(maxCandidates)) return DEFAULT_MAX_CANDIDATES;\n return Math.min(Math.max(0, Math.trunc(maxCandidates)), MAX_CANDIDATES);\n}\n\nfunction cleanCandidateText(text: string): string {\n return text.normalize('NFKC').replace(/\\s+/g, ' ').trim().replace(/[.,;:!?]+$/g, '');\n}\n\nfunction normalizeCandidate(text: string): string {\n return cleanCandidateText(text).toLowerCase();\n}\n\nfunction normalizeForContainment(text: string): string {\n return text\n .normalize('NFKC')\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}@/._-]+/gu, ' ')\n .replace(/[._-]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nfunction containsPhrase(normalizedHaystack: string, normalizedNeedle: string): boolean {\n return (` ${normalizedHaystack} `).includes(` ${normalizedNeedle} `);\n}\n\nfunction aliasLabelFromCanonicalKey(canonicalKey: string): string {\n const raw = canonicalKey.includes(':') ? canonicalKey.slice(canonicalKey.lastIndexOf(':') + 1) : canonicalKey;\n return raw.replace(/[._-]+/g, ' ').replace(/\\s+/g, ' ').trim();\n}\n\nfunction findRange(query: string, alias: string): { start: number; end: number } {\n const normalizedAlias = normalizeForContainment(alias);\n const directIndex = query.toLowerCase().indexOf(alias.toLowerCase());\n if (directIndex >= 0) return { start: directIndex, end: directIndex + alias.length };\n\n const normalizedQuery = normalizeForContainment(query);\n const normalizedIndex = normalizedQuery.indexOf(normalizedAlias);\n if (normalizedIndex < 0) return { start: 0, end: 0 };\n\n const queryLower = query.toLowerCase();\n const words = normalizedAlias.split(' ').filter(Boolean);\n if (words.length === 0) return { start: 0, end: 0 };\n const first = queryLower.indexOf(words[0]);\n const lastWord = words[words.length - 1];\n const last = queryLower.indexOf(lastWord, first >= 0 ? first : 0);\n if (first >= 0 && last >= 0) return { start: first, end: last + lastWord.length };\n return { start: normalizedIndex, end: normalizedIndex + normalizedAlias.length };\n}\n\nfunction isUsefulCandidate(text: string): boolean {\n const cleaned = cleanCandidateText(text);\n return cleaned.length >= 2\n && cleaned.length <= MAX_CANDIDATE_TEXT_LENGTH\n && /[\\p{L}\\p{N}]/u.test(cleaned);\n}\n\nfunction isInsideAnyRange(index: number, ranges: Array<[number, number]>): boolean {\n return ranges.some(([start, end]) => index >= start && index < end);\n}\n\nfunction isStrongSingleCapitalized(text: string): boolean {\n if (/^[A-Z]{2,}[A-Z0-9]*$/.test(text)) return true;\n if (/^[A-Z][a-z]+[A-Z][A-Za-z0-9]*$/.test(text)) return true;\n return text.length >= 4 && !SENTENCE_START_STOPWORDS.has(text);\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const value of values) {\n const key = normalizeForContainment(value);\n if (!key || seen.has(key)) continue;\n seen.add(key);\n result.push(value);\n }\n return result;\n}\n", "import { createHash } from 'crypto';\nimport { z } from 'zod';\n\nimport { sqliteAll, type SQLiteDatabase } from '../sqlite-wrapper.js';\nimport { sanitizeGovernanceAuditValue } from './governance-audit.js';\n\nconst NonEmptyStringSchema = z.string()\n .transform((value) => value.trim())\n .pipe(z.string().min(1));\n\nexport const LessonCandidateInputSchema = z.object({\n projectHash: NonEmptyStringSchema,\n minSessions: z.number().int().min(2).max(10).default(2),\n limit: z.number().int().positive().max(100).default(25),\n eventLimit: z.number().int().positive().max(10_000).default(2_000),\n maxSourceEventIds: z.number().int().positive().max(100).default(20)\n});\nexport type LessonCandidateInput = z.input<typeof LessonCandidateInputSchema>;\n\ntype ParsedLessonCandidateInput = z.output<typeof LessonCandidateInputSchema>;\n\nexport interface LessonCandidate {\n candidateId: string;\n projectHash: string;\n name: string;\n trigger: string;\n steps: string[];\n confidence: number;\n sourceSessionIds: string[];\n sourceEventIds: string[];\n failureModes: string[];\n skillCandidate: boolean;\n pattern: {\n tools: string[];\n fileCategories: string[];\n taskPatterns: string[];\n };\n reasons: string[];\n}\n\nexport interface LessonCandidateResult {\n scannedSessions: number;\n eligibleSessions: number;\n skippedSessions: number;\n groupedPatterns: number;\n candidates: LessonCandidate[];\n}\n\ninterface EventRow {\n id: string;\n event_type: string;\n session_id: string;\n timestamp: string;\n content: string;\n metadata: string | null;\n}\n\ninterface SessionProfile {\n sessionId: string;\n firstTimestamp: string;\n eventIds: string[];\n sourceEventIds: string[];\n successEventIds: string[];\n tools: Set<ToolPattern>;\n fileCategories: Set<string>;\n taskPatterns: Set<string>;\n successSignals: Set<ToolPattern>;\n hasFailureSignal: boolean;\n hasPrivacyConflict: boolean;\n}\n\ntype ToolPattern = typeof TOOL_ORDER[number];\n\nconst TOOL_ORDER = [\n 'focused-test',\n 'typecheck',\n 'build',\n 'full-suite',\n 'static-privacy-scan',\n 'verified-commit',\n 'diff-check'\n] as const;\n\nconst TOOL_STEPS: Record<ToolPattern, string> = {\n 'focused-test': 'Run focused tests for the changed files',\n typecheck: 'Run typecheck',\n build: 'Run build',\n 'full-suite': 'Run the full test suite',\n 'static-privacy-scan': 'Run the static/privacy scan',\n 'verified-commit': 'Commit verified changes',\n 'diff-check': 'Run git diff checks'\n};\n\nconst TOOL_LABELS: Record<ToolPattern, string> = {\n 'focused-test': 'focused tests',\n typecheck: 'typecheck',\n build: 'build',\n 'full-suite': 'full suite',\n 'static-privacy-scan': 'static/privacy scan',\n 'verified-commit': 'verified commit',\n 'diff-check': 'diff check'\n};\n\nfunction sanitizeString(value: string): string {\n return String(sanitizeGovernanceAuditValue(value)).trim();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parseMetadata(value: unknown): Record<string, unknown> | undefined {\n if (!value) return undefined;\n if (isRecord(value)) return value;\n if (typeof value !== 'string') return undefined;\n try {\n const parsed = JSON.parse(value);\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction nestedValue(root: Record<string, unknown> | undefined, path: string[]): unknown {\n let cursor: unknown = root;\n for (const key of path) {\n if (!isRecord(cursor)) return undefined;\n cursor = cursor[key];\n }\n return cursor;\n}\n\nfunction nestedString(root: Record<string, unknown> | undefined, path: string[]): string | undefined {\n const value = nestedValue(root, path);\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction projectHashFromMetadata(metadata: Record<string, unknown> | undefined): string | undefined {\n const direct = typeof metadata?.projectHash === 'string' ? metadata.projectHash.trim() : undefined;\n return nestedString(metadata, ['scope', 'project', 'hash']) ?? direct;\n}\n\nfunction hasActiveQuarantine(metadata: Record<string, unknown> | undefined): boolean {\n const quarantine = nestedValue(metadata, ['quarantine']);\n return isRecord(quarantine) && quarantine.status === 'active';\n}\n\nfunction hasPrivacyConflict(metadata: Record<string, unknown> | undefined): boolean {\n if (!metadata) return false;\n const tags = Array.isArray(metadata.tags)\n ? metadata.tags.map((tag) => String(tag).toLowerCase())\n : [];\n const privacy = nestedString(metadata, ['privacy', 'classification'])\n ?? nestedString(metadata, ['privacy', 'level'])\n ?? (typeof metadata.privacy === 'string' ? metadata.privacy : undefined);\n return hasActiveQuarantine(metadata)\n || metadata.private === true\n || metadata.isPrivate === true\n || metadata.visibility === 'private'\n || privacy === 'private'\n || tags.includes('private')\n || tags.includes('privacy:private');\n}\n\nfunction isFailureSignal(content: string): boolean {\n const lower = content.toLowerCase();\n return /\\bexit[_ -]?code\\s*[:=]?\\s*[1-9]\\d*\\b/.test(lower)\n || /\\bfailed\\b|\\bfailure\\b|\\berror\\b|\\bblocked\\b/.test(lower)\n || /\\[blocked\\]/.test(lower);\n}\n\nfunction isSuccessSignal(content: string): boolean {\n const lower = content.toLowerCase();\n if (isFailureSignal(content)) return false;\n return /\\bexit[_ -]?code\\s*[:=]?\\s*0\\b/.test(lower)\n || /\\bpassed\\b|\\bsuccess(?:ful)?\\b|\\bcompleted\\b|\\bcommitted\\b|\\[verified\\]/.test(lower)\n || /\\bstaged_static_scan_findings\\s*=\\s*0\\b/.test(lower)\n || /\\bdoc_static_scan_findings\\s*=\\s*0\\b/.test(lower);\n}\n\nfunction extractToolPatterns(content: string): Set<ToolPattern> {\n const lower = content.toLowerCase();\n const tools = new Set<ToolPattern>();\n\n if (/\\bnpm\\s+(?:run\\s+)?test\\b|\\bvitest\\b|\\bpytest\\b/.test(lower)) {\n const focused = /\\btests?\\/|\\.test\\.|\\.spec\\.|--run\\s+tests?\\//.test(lower);\n tools.add(focused ? 'focused-test' : 'full-suite');\n }\n if (/\\bnpm\\s+run\\s+typecheck\\b|\\btsc\\s+--noemit\\b|\\btypecheck\\b/.test(lower)) {\n tools.add('typecheck');\n }\n if (/\\bnpm\\s+run\\s+build\\b|\\bpnpm\\s+build\\b|\\byarn\\s+build\\b|\\btsc\\s+-b\\b/.test(lower)) {\n tools.add('build');\n }\n if (/\\bstaged_static_scan_findings\\s*=\\s*0\\b|\\bdoc_static_scan_findings\\s*=\\s*0\\b|static\\/privacy scan|secretlint/.test(lower)) {\n tools.add('static-privacy-scan');\n }\n if (/\\bgit\\s+commit\\b|\\[verified\\]/.test(lower)) {\n tools.add('verified-commit');\n }\n if (/\\bgit\\s+diff\\b.*--check/.test(lower)) {\n tools.add('diff-check');\n }\n\n return tools;\n}\n\nfunction extractFileCategories(content: string): Set<string> {\n const categories = new Set<string>();\n const pathPattern = /(?:^|[\\s`\"'(])((?:src|tests|specs|docs)\\/[A-Za-z0-9._/@-]+(?:\\/[A-Za-z0-9._@-]+)*\\.(?:ts|tsx|js|jsx|mjs|cjs|md|json|yaml|yml|py))/g;\n let match: RegExpExecArray | null;\n while ((match = pathPattern.exec(content)) !== null) {\n const path = match[1] ?? '';\n const extensionMatch = /\\.([A-Za-z0-9]+)$/.exec(path);\n const extension = extensionMatch?.[1]?.toLowerCase();\n if (!extension) continue;\n if (path.startsWith('tests/')) {\n categories.add(`test:${extension}`);\n } else if (path.startsWith('src/')) {\n categories.add(`source:${extension}`);\n } else if (path.startsWith('docs/') || path.startsWith('specs/')) {\n categories.add(`docs:${extension}`);\n }\n }\n return categories;\n}\n\nfunction extractTaskPatterns(content: string): Set<string> {\n const lower = content.toLowerCase();\n const patterns = new Set<string>();\n if (/\\bimplement\\b|\\bcreate\\b|\\badd\\b|\\bmodify\\b|\\bpatch\\b|\\bfix\\b|\\brefactor\\b/.test(lower)) {\n patterns.add('code-change');\n }\n if (/\\btest\\b|\\btypecheck\\b|\\bbuild\\b|\\bvalidation\\b|\\bvalidate\\b/.test(lower)) {\n patterns.add('validation');\n }\n if (/\\bcommit\\b|\\[verified\\]/.test(lower)) {\n patterns.add('verified-commit');\n }\n if (/\\bdoc(?:s|umentation)?\\b|\\bspec\\b|\\bplan\\b/.test(lower)) {\n patterns.add('docs-or-spec');\n }\n return patterns;\n}\n\nfunction orderedTools(tools: Set<ToolPattern>): ToolPattern[] {\n return TOOL_ORDER.filter((tool) => tools.has(tool));\n}\n\nfunction sortedStrings(values: Iterable<string>): string[] {\n return Array.from(new Set(Array.from(values))).sort((a, b) => a.localeCompare(b));\n}\n\nfunction uniqueStrings(values: Iterable<string>, limit?: number): string[] {\n const unique: string[] = [];\n const seen = new Set<string>();\n for (const value of Array.from(values)) {\n const normalized = value.trim();\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n unique.push(normalized);\n if (limit !== undefined && unique.length >= limit) break;\n }\n return unique;\n}\n\nfunction profileSignature(profile: SessionProfile): string | null {\n const tools = orderedTools(profile.tools).filter((tool) => tool !== 'diff-check');\n const fileCategories = sortedStrings(profile.fileCategories);\n const taskPatterns = sortedStrings(profile.taskPatterns);\n if (tools.length < 2) return null;\n if (fileCategories.length === 0 && taskPatterns.length === 0) return null;\n const taskKey = taskPatterns.includes('code-change') ? 'code-change' : taskPatterns[0] ?? 'task';\n return `tools:${tools.join('+')}|files:${fileCategories.join('+') || 'none'}|task:${taskKey}`;\n}\n\nfunction hasEnoughSuccess(profile: SessionProfile): boolean {\n if (profile.hasFailureSignal) return false;\n if (profile.successEventIds.length === 0) return false;\n const successTools = profile.successSignals;\n const testSignal = successTools.has('focused-test') || successTools.has('full-suite');\n const validationSignal = successTools.has('typecheck') || successTools.has('build') || successTools.has('static-privacy-scan');\n return successTools.has('verified-commit') || (testSignal && validationSignal);\n}\n\nfunction confidenceForGroup(group: SessionProfile[], tools: ToolPattern[], fileCategories: string[], taskPatterns: string[]): number {\n const sessionBonus = Math.min(0.15, (group.length - 2) * 0.05);\n const toolBonus = Math.min(0.18, tools.length * 0.03);\n const evidenceBonus = fileCategories.length > 0 ? 0.04 : 0;\n const taskBonus = taskPatterns.length > 0 ? 0.03 : 0;\n return Math.min(0.95, Math.round((0.58 + sessionBonus + toolBonus + evidenceBonus + taskBonus) * 100) / 100);\n}\n\nfunction candidateIdFor(projectHash: string, signature: string): string {\n return `lesson-candidate:${createHash('sha256').update(`${projectHash}\\n${signature}`).digest('hex').slice(0, 16)}`;\n}\n\nfunction sanitizeArray(values: string[]): string[] {\n return values.map(sanitizeString).filter((value) => value.length > 0);\n}\n\nfunction createCandidate(\n projectHash: string,\n signature: string,\n group: SessionProfile[],\n maxSourceEventIds: number\n): LessonCandidate {\n const toolSets = group.map((profile) => profile.tools);\n const fileSets = group.map((profile) => profile.fileCategories);\n const taskSets = group.map((profile) => profile.taskPatterns);\n const tools = orderedTools(intersectionSets(toolSets)).filter((tool) => tool !== 'diff-check');\n const fileCategories = sortedStrings(intersectionSets(fileSets));\n const taskPatterns = sortedStrings(intersectionSets(taskSets));\n const sourceSessionIds = group.map((profile) => profile.sessionId).sort((a, b) => a.localeCompare(b));\n const sourceEventIds = uniqueStrings(\n group.flatMap((profile) => profile.successEventIds.length > 0 ? profile.successEventIds : profile.sourceEventIds),\n maxSourceEventIds\n );\n const labels = tools.map((tool) => TOOL_LABELS[tool]);\n const steps = tools.map((tool) => TOOL_STEPS[tool]);\n const name = `Workflow pattern: ${labels.slice(0, 4).join(' + ')}`;\n const trigger = `When ${taskPatterns.includes('code-change') ? 'code changes' : 'a project task'} repeat across ${group.length} successful sessions with ${labels.join(', ')}`;\n const reasons = [\n `${group.length} successful sessions share the same tool pattern`,\n fileCategories.length > 0 ? `Shared file categories: ${fileCategories.join(', ')}` : 'Shared task pattern without exposing source paths',\n `Successful signals include: ${labels.join(', ')}`\n ];\n\n return {\n candidateId: candidateIdFor(projectHash, signature),\n projectHash: sanitizeString(projectHash),\n name: sanitizeString(name),\n trigger: sanitizeString(trigger),\n steps: sanitizeArray(steps),\n confidence: confidenceForGroup(group, tools, fileCategories, taskPatterns),\n sourceSessionIds: sanitizeArray(sourceSessionIds),\n sourceEventIds: sanitizeArray(sourceEventIds),\n failureModes: sanitizeArray([\n 'Do not promote if any source session is quarantined or privacy-tagged',\n 'Resolve failed validation signals before treating the workflow as successful'\n ]),\n skillCandidate: true,\n pattern: {\n tools: sanitizeArray(tools),\n fileCategories: sanitizeArray(fileCategories),\n taskPatterns: sanitizeArray(taskPatterns)\n },\n reasons: sanitizeArray(reasons)\n };\n}\n\nfunction intersectionSets<T>(sets: Array<Set<T>>): Set<T> {\n if (sets.length === 0) return new Set<T>();\n const [first, ...rest] = sets;\n const result = new Set<T>();\n for (const value of Array.from(first)) {\n if (rest.every((set) => set.has(value))) result.add(value);\n }\n return result;\n}\n\nexport class LessonCandidateService {\n constructor(private readonly db: SQLiteDatabase) {}\n\n async findCandidates(input: unknown): Promise<LessonCandidateResult> {\n const parsed = LessonCandidateInputSchema.parse(input);\n const profiles = this.buildSessionProfiles(parsed);\n const scannedSessions = profiles.length;\n const eligibleProfiles: SessionProfile[] = [];\n let skippedSessions = 0;\n\n for (const profile of profiles) {\n if (this.isEligibleProfile(profile)) {\n eligibleProfiles.push(profile);\n } else {\n skippedSessions += 1;\n }\n }\n\n const groups = this.groupProfiles(eligibleProfiles, parsed.minSessions);\n const candidates = groups\n .map(([signature, group]) => createCandidate(parsed.projectHash, signature, group, parsed.maxSourceEventIds))\n .sort((a, b) => b.confidence - a.confidence\n || b.sourceSessionIds.length - a.sourceSessionIds.length\n || a.candidateId.localeCompare(b.candidateId))\n .slice(0, parsed.limit);\n\n return {\n scannedSessions,\n eligibleSessions: eligibleProfiles.length,\n skippedSessions,\n groupedPatterns: groups.length,\n candidates\n };\n }\n\n private buildSessionProfiles(input: ParsedLessonCandidateInput): SessionProfile[] {\n const rows = sqliteAll<EventRow>(\n this.db,\n `SELECT id, event_type, session_id, timestamp, content, metadata\n FROM events\n WHERE (\n json_extract(CASE WHEN json_valid(metadata) THEN metadata ELSE '{}' END, '$.scope.project.hash') = ?\n OR json_extract(CASE WHEN json_valid(metadata) THEN metadata ELSE '{}' END, '$.projectHash') = ?\n )\n ORDER BY timestamp ASC\n LIMIT ?`,\n [input.projectHash, input.projectHash, input.eventLimit]\n );\n const profilesBySession = new Map<string, SessionProfile>();\n\n for (const row of rows) {\n const metadata = parseMetadata(row.metadata);\n if (projectHashFromMetadata(metadata) !== input.projectHash) continue;\n const profile = this.ensureProfile(profilesBySession, row);\n profile.eventIds.push(row.id);\n profile.sourceEventIds.push(row.id);\n profile.hasPrivacyConflict ||= hasPrivacyConflict(metadata);\n profile.hasFailureSignal ||= isFailureSignal(row.content);\n\n const tools = extractToolPatterns(row.content);\n const success = isSuccessSignal(row.content);\n for (const tool of Array.from(tools)) {\n profile.tools.add(tool);\n if (success) profile.successSignals.add(tool);\n }\n for (const category of Array.from(extractFileCategories(row.content))) profile.fileCategories.add(category);\n for (const taskPattern of Array.from(extractTaskPatterns(row.content))) profile.taskPatterns.add(taskPattern);\n if (success) profile.successEventIds.push(row.id);\n }\n\n return Array.from(profilesBySession.values()).sort((a, b) => a.firstTimestamp.localeCompare(b.firstTimestamp));\n }\n\n private ensureProfile(profilesBySession: Map<string, SessionProfile>, row: EventRow): SessionProfile {\n let profile = profilesBySession.get(row.session_id);\n if (!profile) {\n profile = {\n sessionId: row.session_id,\n firstTimestamp: row.timestamp,\n eventIds: [],\n sourceEventIds: [],\n successEventIds: [],\n tools: new Set<ToolPattern>(),\n fileCategories: new Set<string>(),\n taskPatterns: new Set<string>(),\n successSignals: new Set<ToolPattern>(),\n hasFailureSignal: false,\n hasPrivacyConflict: false\n };\n profilesBySession.set(row.session_id, profile);\n }\n if (row.timestamp.localeCompare(profile.firstTimestamp) < 0) profile.firstTimestamp = row.timestamp;\n return profile;\n }\n\n private isEligibleProfile(profile: SessionProfile): boolean {\n return !profile.hasPrivacyConflict\n && profile.sourceEventIds.length > 0\n && hasEnoughSuccess(profile)\n && profileSignature(profile) !== null;\n }\n\n private groupProfiles(profiles: SessionProfile[], minSessions: number): Array<[string, SessionProfile[]]> {\n const grouped = new Map<string, SessionProfile[]>();\n for (const profile of profiles) {\n const signature = profileSignature(profile);\n if (!signature) continue;\n const group = grouped.get(signature) ?? [];\n group.push(profile);\n grouped.set(signature, group);\n }\n return Array.from(grouped.entries())\n .map(([signature, group]) => [\n signature,\n group.sort((a, b) => a.firstTimestamp.localeCompare(b.firstTimestamp))\n ] as [string, SessionProfile[]])\n .filter(([, group]) => group.length >= minSessions)\n .sort(([signatureA, groupA], [signatureB, groupB]) => groupB.length - groupA.length || signatureA.localeCompare(signatureB));\n }\n}\n", "import { z } from 'zod';\n\nimport { sqliteAll, type SQLiteDatabase } from '../sqlite-wrapper.js';\nimport type { MemoryLesson } from '../types.js';\nimport { LessonCandidateService, type LessonCandidate } from './lesson-candidate-service.js';\nimport { LessonRepository } from './lesson-repository.js';\n\nconst NonEmptyStringSchema = z.string()\n .transform((value) => value.trim())\n .pipe(z.string().min(1));\n\nconst PromotionStringArraySchema = z.preprocess((value) => {\n if (!Array.isArray(value)) return value;\n return value\n .map((item) => typeof item === 'string' ? item.trim() : item)\n .filter((item) => typeof item !== 'string' || item.length > 0);\n}, z.array(NonEmptyStringSchema).max(100));\n\nconst ReviewedLessonCandidateSchema = z.object({\n candidateId: NonEmptyStringSchema,\n projectHash: NonEmptyStringSchema,\n name: NonEmptyStringSchema,\n trigger: NonEmptyStringSchema,\n steps: PromotionStringArraySchema.refine((steps) => steps.length > 0, 'steps must contain at least one step'),\n confidence: z.number().min(0).max(1),\n sourceSessionIds: PromotionStringArraySchema.default([]),\n sourceEventIds: PromotionStringArraySchema.refine((sourceEventIds) => sourceEventIds.length > 0, 'sourceEventIds is required'),\n failureModes: PromotionStringArraySchema.default([]),\n skillCandidate: z.boolean().default(true)\n}).passthrough();\n\ntype ReviewedLessonCandidate = z.output<typeof ReviewedLessonCandidateSchema>;\n\nconst CandidateSearchInputSchema = z.object({\n minSessions: z.number().int().min(2).max(10).optional(),\n limit: z.number().int().positive().max(100).optional(),\n eventLimit: z.number().int().positive().max(10_000).optional(),\n maxSourceEventIds: z.number().int().positive().max(100).optional()\n}).default({});\n\nexport const PromoteLessonCandidateInputSchema = z.object({\n projectHash: NonEmptyStringSchema,\n actor: NonEmptyStringSchema,\n candidateId: NonEmptyStringSchema.optional(),\n candidate: ReviewedLessonCandidateSchema.optional(),\n approved: z.boolean().default(false),\n allowHighConfidenceRule: z.boolean().default(false),\n minHighConfidence: z.number().min(0).max(1).default(0.9),\n candidateSearch: CandidateSearchInputSchema\n}).superRefine((value, ctx) => {\n if ((value.candidateId ? 1 : 0) + (value.candidate ? 1 : 0) !== 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['candidateId'],\n message: 'exactly one of candidateId or candidate is required'\n });\n }\n});\nexport type PromoteLessonCandidateInput = z.input<typeof PromoteLessonCandidateInputSchema>;\n\ninterface SourceEventRow {\n id: string;\n session_id: string;\n metadata: string | null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parseMetadata(value: unknown): Record<string, unknown> | undefined {\n if (!value) return undefined;\n if (isRecord(value)) return value;\n if (typeof value !== 'string') return undefined;\n try {\n const parsed = JSON.parse(value);\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction nestedValue(root: Record<string, unknown> | undefined, path: string[]): unknown {\n let cursor: unknown = root;\n for (const key of path) {\n if (!isRecord(cursor)) return undefined;\n cursor = cursor[key];\n }\n return cursor;\n}\n\nfunction nestedString(root: Record<string, unknown> | undefined, path: string[]): string | undefined {\n const value = nestedValue(root, path);\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction projectHashFromMetadata(metadata: Record<string, unknown> | undefined): string | undefined {\n const direct = typeof metadata?.projectHash === 'string' ? metadata.projectHash.trim() : undefined;\n return nestedString(metadata, ['scope', 'project', 'hash']) ?? direct;\n}\n\nfunction hasActiveQuarantine(metadata: Record<string, unknown> | undefined): boolean {\n const quarantine = nestedValue(metadata, ['quarantine']);\n return isRecord(quarantine) && quarantine.status === 'active';\n}\n\nfunction numericMetadataValue(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction privacyFilterHasConflict(privacyMetadata: unknown): boolean {\n if (!isRecord(privacyMetadata)) return false;\n return privacyMetadata.hasPrivateTags === true\n || privacyMetadata.hasUnmatchedTags === true\n || numericMetadataValue(privacyMetadata.privateTagCount) > 0\n || numericMetadataValue(privacyMetadata.patternMatchCount) > 0;\n}\n\nfunction hasPrivacyConflict(metadata: Record<string, unknown> | undefined): boolean {\n if (!metadata) return false;\n const tags = Array.isArray(metadata.tags)\n ? metadata.tags.map((tag) => String(tag).toLowerCase())\n : [];\n const privacy = nestedString(metadata, ['privacy', 'classification'])\n ?? nestedString(metadata, ['privacy', 'level'])\n ?? (typeof metadata.privacy === 'string' ? metadata.privacy : undefined);\n return hasActiveQuarantine(metadata)\n || metadata.private === true\n || metadata.isPrivate === true\n || metadata.visibility === 'private'\n || privacy === 'private'\n || privacyFilterHasConflict(metadata.privacy)\n || privacyFilterHasConflict(metadata)\n || tags.includes('private')\n || tags.includes('privacy:private');\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n const unique: string[] = [];\n const seen = new Set<string>();\n for (const value of values) {\n const normalized = value.trim();\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n unique.push(normalized);\n }\n return unique;\n}\n\nfunction candidateToLessonInput(candidate: ReviewedLessonCandidate, actor: string): Record<string, unknown> {\n return {\n projectHash: candidate.projectHash,\n name: candidate.name,\n trigger: candidate.trigger,\n steps: candidate.steps,\n confidence: candidate.confidence,\n sourceSessionIds: candidate.sourceSessionIds,\n sourceEventIds: candidate.sourceEventIds,\n failureModes: candidate.failureModes,\n skillCandidate: candidate.skillCandidate,\n actor\n };\n}\n\nfunction normalizeGeneratedCandidate(candidate: LessonCandidate): ReviewedLessonCandidate {\n return ReviewedLessonCandidateSchema.parse(candidate);\n}\n\nexport class LessonService {\n private readonly candidateService: LessonCandidateService;\n private readonly lessonRepository: LessonRepository;\n\n constructor(private readonly db: SQLiteDatabase) {\n this.candidateService = new LessonCandidateService(db);\n this.lessonRepository = new LessonRepository(db);\n }\n\n async promoteCandidate(input: unknown): Promise<MemoryLesson> {\n const parsed = PromoteLessonCandidateInputSchema.parse(input);\n const candidate = parsed.candidate\n ? ReviewedLessonCandidateSchema.parse(parsed.candidate)\n : await this.resolveGeneratedCandidate(parsed.projectHash, parsed.candidateId!, parsed.candidateSearch);\n\n if (candidate.projectHash !== parsed.projectHash) {\n throw new Error('candidate projectHash mismatch');\n }\n if (!parsed.approved && !(parsed.allowHighConfidenceRule && candidate.confidence >= parsed.minHighConfidence)) {\n throw new Error('explicit approval or high-confidence rule is required for lesson promotion');\n }\n\n this.validateSourceEvents(candidate.projectHash, candidate.sourceEventIds);\n\n return this.lessonRepository.upsert(candidateToLessonInput(candidate, parsed.actor));\n }\n\n private async resolveGeneratedCandidate(\n projectHash: string,\n candidateId: string,\n candidateSearch: z.output<typeof CandidateSearchInputSchema>\n ): Promise<ReviewedLessonCandidate> {\n const result = await this.candidateService.findCandidates({\n projectHash,\n ...candidateSearch\n });\n const candidate = result.candidates.find((item) => item.candidateId === candidateId);\n if (!candidate) {\n throw new Error('lesson candidate not found for projectHash');\n }\n return normalizeGeneratedCandidate(candidate);\n }\n\n private validateSourceEvents(projectHash: string, sourceEventIds: string[]): void {\n const ids = uniqueStrings(sourceEventIds);\n if (ids.length === 0) {\n throw new Error('sourceEventIds is required for lesson promotion');\n }\n const placeholders = ids.map(() => '?').join(', ');\n const rows = sqliteAll<SourceEventRow>(\n this.db,\n `SELECT id, session_id, metadata FROM events WHERE id IN (${placeholders})`,\n ids\n );\n const rowsById = new Map(rows.map((row) => [row.id, row]));\n const missing = ids.filter((id) => !rowsById.has(id));\n if (missing.length > 0) {\n throw new Error('source event refs are unavailable for lesson promotion');\n }\n\n for (const row of rows) {\n const metadata = parseMetadata(row.metadata);\n const sourceProjectHash = projectHashFromMetadata(metadata);\n if (sourceProjectHash !== projectHash) {\n throw new Error('source event project mismatch for lesson promotion');\n }\n if (hasPrivacyConflict(metadata)) {\n throw new Error('source event privacy conflict for lesson promotion');\n }\n }\n }\n}\n", "import { z } from 'zod';\n\nimport {\n sqliteAll,\n sqliteGet,\n sqliteRun,\n toDateFromSQLite,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\nimport {\n ListMemoryActorsInputSchema,\n MemoryActorSchema,\n UpsertMemoryActorInputSchema,\n type MemoryActor,\n type MemoryActorKind,\n type MemoryEvent,\n type UpsertMemoryActorInput\n} from '../types.js';\nimport { sanitizeGovernanceAuditValue } from './governance-audit.js';\n\ninterface MemoryActorRow {\n actor_id: string;\n project_hash: string;\n kind: MemoryActorKind;\n display_name: string;\n source: string;\n metadata_json: string | null;\n created_at: string;\n updated_at: string;\n}\n\ntype ParsedActorUpsert = z.output<typeof UpsertMemoryActorInputSchema>;\n\nfunction projectHashToStorage(projectHash: string | undefined): string {\n return projectHash ?? '';\n}\n\nfunction projectHashFromStorage(projectHash: string): string | undefined {\n return projectHash.length > 0 ? projectHash : undefined;\n}\n\nfunction parseJsonRecord(value: string | null): Record<string, unknown> | undefined {\n if (!value) return undefined;\n try {\n const parsed = JSON.parse(value);\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction sanitizeString(value: string): string {\n return String(sanitizeGovernanceAuditValue(value)).trim();\n}\n\nfunction sanitizeMetadata(metadata: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n if (!metadata) return undefined;\n return sanitizeGovernanceAuditValue(metadata) as Record<string, unknown>;\n}\n\nfunction slugActorPart(value: string): string {\n const slug = value\n .normalize('NFKC')\n .toLowerCase()\n .replace(/[^a-z0-9\uAC00-\uD7A3_-]+/gi, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 64);\n return slug.length > 0 ? slug : 'unknown';\n}\n\nfunction stableActorId(input: ParsedActorUpsert): string {\n if (input.actorId) return sanitizeString(input.actorId);\n const projectPart = input.projectHash ? `project:${slugActorPart(input.projectHash)}` : 'global';\n return [\n 'actor',\n projectPart,\n slugActorPart(input.source),\n input.kind,\n slugActorPart(input.displayName)\n ].join(':');\n}\n\nfunction rowToActor(row: MemoryActorRow): MemoryActor {\n return MemoryActorSchema.parse({\n actorId: row.actor_id,\n projectHash: projectHashFromStorage(row.project_hash),\n kind: row.kind,\n displayName: row.display_name,\n source: row.source,\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toDateFromSQLite(row.created_at),\n updatedAt: toDateFromSQLite(row.updated_at)\n });\n}\n\nfunction metadataString(metadata: Record<string, unknown> | undefined, keys: string[]): string | undefined {\n if (!metadata) return undefined;\n for (const key of keys) {\n const value = metadata[key];\n if (typeof value === 'string' && value.trim().length > 0) return value.trim();\n }\n return undefined;\n}\n\nfunction metadataRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined;\n}\n\nexport interface ProjectMemoryActorFromEventOptions {\n projectHash?: string;\n}\n\nexport function buildMemoryActorId(input: unknown): string {\n const parsed = UpsertMemoryActorInputSchema.parse(input);\n return stableActorId(parsed);\n}\n\nexport function projectMemoryActorFromEvent(\n event: MemoryEvent,\n options: ProjectMemoryActorFromEventOptions = {}\n): UpsertMemoryActorInput {\n const metadata = metadataRecord(event.metadata);\n const source = metadataString(metadata, ['source', 'importSource', 'platform', 'provider']) ?? 'event';\n const model = metadataString(metadata, ['model', 'modelName']);\n\n if (event.eventType === 'user_prompt') {\n return {\n projectHash: options.projectHash,\n kind: 'user',\n displayName: metadataString(metadata, ['displayName', 'userName', 'username', 'user_id', 'userId']) ?? 'User',\n source,\n metadata: { eventType: event.eventType, ...metadata }\n };\n }\n\n if (event.eventType === 'agent_response') {\n return {\n projectHash: options.projectHash,\n kind: 'assistant',\n displayName: metadataString(metadata, ['displayName', 'agentName', 'assistantName']) ?? model ?? 'Assistant',\n source,\n metadata: { eventType: event.eventType, ...metadata }\n };\n }\n\n if (event.eventType === 'tool_observation') {\n return {\n projectHash: options.projectHash,\n kind: 'tool',\n displayName: metadataString(metadata, ['toolName', 'tool_name', 'name']) ?? 'Tool',\n source,\n metadata: { eventType: event.eventType, ...metadata }\n };\n }\n\n return {\n projectHash: options.projectHash,\n kind: 'system',\n displayName: metadataString(metadata, ['displayName', 'source']) ?? 'Session summary',\n source,\n metadata: { eventType: event.eventType, ...metadata }\n };\n}\n\nexport class ActorRepository {\n constructor(private readonly db: SQLiteDatabase) {}\n\n async upsert(input: unknown): Promise<MemoryActor> {\n const parsed = UpsertMemoryActorInputSchema.parse(input);\n const actorId = stableActorId(parsed);\n const projectHash = sanitizeString(projectHashToStorage(parsed.projectHash));\n const displayName = sanitizeString(parsed.displayName);\n const source = sanitizeString(parsed.source);\n const metadata = sanitizeMetadata(parsed.metadata);\n const existing = this.get(actorId);\n const now = new Date().toISOString();\n\n if (existing && projectHashToStorage(existing.projectHash) !== projectHash) {\n throw new Error('actor projectHash mismatch');\n }\n\n if (existing) {\n sqliteRun(\n this.db,\n `UPDATE memory_actors\n SET kind = ?, display_name = ?, source = ?, metadata_json = ?, updated_at = ?\n WHERE actor_id = ?`,\n [\n parsed.kind,\n displayName,\n source,\n metadata ? JSON.stringify(metadata) : null,\n now,\n actorId\n ]\n );\n return this.require(actorId);\n }\n\n sqliteRun(\n this.db,\n `INSERT INTO memory_actors (\n actor_id, project_hash, kind, display_name, source, metadata_json, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n actorId,\n projectHash,\n parsed.kind,\n displayName,\n source,\n metadata ? JSON.stringify(metadata) : null,\n now,\n now\n ]\n );\n return this.require(actorId);\n }\n\n get(actorId: string): MemoryActor | null {\n const row = sqliteGet<MemoryActorRow>(this.db, `SELECT * FROM memory_actors WHERE actor_id = ?`, [actorId]);\n return row ? rowToActor(row) : null;\n }\n\n require(actorId: string): MemoryActor {\n const actor = this.get(actorId);\n if (!actor) throw new Error(`Memory actor not found: ${actorId}`);\n return actor;\n }\n\n async list(input: unknown = {}): Promise<MemoryActor[]> {\n const parsed = ListMemoryActorsInputSchema.parse(input);\n const clauses = ['project_hash = ?'];\n const params: unknown[] = [projectHashToStorage(parsed.projectHash)];\n if (parsed.kind) {\n clauses.push('kind = ?');\n params.push(parsed.kind);\n }\n if (parsed.source) {\n clauses.push('source = ?');\n params.push(parsed.source);\n }\n params.push(parsed.limit);\n const rows = sqliteAll<MemoryActorRow>(\n this.db,\n `SELECT * FROM memory_actors WHERE ${clauses.join(' AND ')} ORDER BY updated_at DESC, display_name ASC LIMIT ?`,\n params\n );\n return rows.map(rowToActor);\n }\n\n async resolveFromEvent(event: MemoryEvent, options: { projectHash?: string } = {}): Promise<MemoryActor> {\n return this.upsert(projectMemoryActorFromEvent(event, options));\n }\n}\n", "import {\n sqliteAll,\n sqliteGet,\n sqliteRun,\n toDateFromSQLite,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\nimport {\n ListSessionActorsInputSchema,\n SessionActorSchema,\n SetSessionActorObservationPolicyInputSchema,\n UpsertSessionActorInputSchema,\n type SessionActor\n} from '../types.js';\nimport { sanitizeGovernanceAuditValue } from './governance-audit.js';\n\ninterface SessionActorRow {\n project_hash: string;\n session_id: string;\n actor_id: string;\n role_in_session: string;\n observe_self: number;\n observe_others: number;\n joined_at: string;\n left_at: string | null;\n metadata_json: string | null;\n}\n\nfunction projectHashToStorage(projectHash: string | undefined): string {\n return projectHash ?? '';\n}\n\nfunction projectHashFromStorage(projectHash: string): string | undefined {\n return projectHash.length > 0 ? projectHash : undefined;\n}\n\nfunction parseJsonRecord(value: string | null): Record<string, unknown> | undefined {\n if (!value) return undefined;\n try {\n const parsed = JSON.parse(value);\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction sanitizeMetadata(metadata: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n if (!metadata) return undefined;\n return sanitizeGovernanceAuditValue(metadata) as Record<string, unknown>;\n}\n\nfunction rowToSessionActor(row: SessionActorRow): SessionActor {\n return SessionActorSchema.parse({\n projectHash: projectHashFromStorage(row.project_hash),\n sessionId: row.session_id,\n actorId: row.actor_id,\n roleInSession: row.role_in_session,\n observeSelf: Number(row.observe_self) === 1,\n observeOthers: Number(row.observe_others) === 1,\n joinedAt: toDateFromSQLite(row.joined_at),\n leftAt: row.left_at ? toDateFromSQLite(row.left_at) : undefined,\n metadata: parseJsonRecord(row.metadata_json)\n });\n}\n\nexport class SessionActorRepository {\n constructor(private readonly db: SQLiteDatabase) {}\n\n async upsertMembership(input: unknown): Promise<SessionActor> {\n const parsed = UpsertSessionActorInputSchema.parse(input);\n const projectHash = projectHashToStorage(parsed.projectHash);\n const existing = this.get(projectHash, parsed.sessionId, parsed.actorId);\n const joinedAt = parsed.joinedAt?.toISOString() ?? existing?.joinedAt.toISOString() ?? new Date().toISOString();\n const leftAt = parsed.leftAt?.toISOString() ?? (existing?.leftAt ? existing.leftAt.toISOString() : null);\n const metadata = sanitizeMetadata(parsed.metadata);\n\n if (existing) {\n sqliteRun(\n this.db,\n `UPDATE session_actors\n SET role_in_session = ?, observe_self = ?, observe_others = ?, joined_at = ?, left_at = ?, metadata_json = ?\n WHERE project_hash = ? AND session_id = ? AND actor_id = ?`,\n [\n parsed.roleInSession,\n parsed.observeSelf ? 1 : 0,\n parsed.observeOthers ? 1 : 0,\n joinedAt,\n leftAt,\n metadata ? JSON.stringify(metadata) : null,\n projectHash,\n parsed.sessionId,\n parsed.actorId\n ]\n );\n } else {\n sqliteRun(\n this.db,\n `INSERT INTO session_actors (\n project_hash, session_id, actor_id, role_in_session, observe_self,\n observe_others, joined_at, left_at, metadata_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n projectHash,\n parsed.sessionId,\n parsed.actorId,\n parsed.roleInSession,\n parsed.observeSelf ? 1 : 0,\n parsed.observeOthers ? 1 : 0,\n joinedAt,\n leftAt,\n metadata ? JSON.stringify(metadata) : null\n ]\n );\n }\n\n const saved = this.get(projectHash, parsed.sessionId, parsed.actorId);\n if (!saved) throw new Error('session actor membership was not saved');\n return saved;\n }\n\n async listBySession(input: unknown): Promise<SessionActor[]> {\n const parsed = ListSessionActorsInputSchema.parse(input);\n const rows = sqliteAll<SessionActorRow>(\n this.db,\n `SELECT * FROM session_actors\n WHERE project_hash = ? AND session_id = ?\n ORDER BY role_in_session ASC, joined_at ASC\n LIMIT ?`,\n [projectHashToStorage(parsed.projectHash), parsed.sessionId, parsed.limit]\n );\n return rows.map(rowToSessionActor);\n }\n\n async setObservationPolicy(input: unknown): Promise<SessionActor> {\n const parsed = SetSessionActorObservationPolicyInputSchema.parse(input);\n const projectHash = projectHashToStorage(parsed.projectHash);\n const existing = this.get(projectHash, parsed.sessionId, parsed.actorId);\n if (!existing) {\n throw new Error('session actor membership not found');\n }\n sqliteRun(\n this.db,\n `UPDATE session_actors\n SET observe_self = ?, observe_others = ?\n WHERE project_hash = ? AND session_id = ? AND actor_id = ?`,\n [\n parsed.observeSelf ? 1 : 0,\n parsed.observeOthers ? 1 : 0,\n projectHash,\n parsed.sessionId,\n parsed.actorId\n ]\n );\n const saved = this.get(projectHash, parsed.sessionId, parsed.actorId);\n if (!saved) throw new Error('session actor membership not found after update');\n return saved;\n }\n\n private get(projectHash: string, sessionId: string, actorId: string): SessionActor | null {\n const row = sqliteGet<SessionActorRow>(\n this.db,\n `SELECT * FROM session_actors WHERE project_hash = ? AND session_id = ? AND actor_id = ?`,\n [projectHash, sessionId, actorId]\n );\n return row ? rowToSessionActor(row) : null;\n }\n}\n", "import { createHash, randomUUID } from 'crypto';\nimport { z } from 'zod';\n\nimport {\n sqliteAll,\n sqliteGet,\n sqliteRun,\n toDateFromSQLite,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\nimport {\n CreatePerspectiveObservationInputSchema,\n DeletePerspectiveObservationInputSchema,\n ListPerspectiveObservationsBySourceInputSchema,\n PerspectiveObservationSchema,\n QueryPerspectiveObservationsInputSchema,\n type PerspectiveObservation\n} from '../types.js';\nimport {\n sanitizeGovernanceAuditValue,\n writeGovernanceAuditEntry\n} from './governance-audit.js';\nimport { VectorOutbox, type OutboxConfig } from '../vector-outbox.js';\n\nexport interface PerspectiveObservationRepositoryOptions {\n vectorOutbox?: false | VectorOutbox | Partial<OutboxConfig>;\n}\n\ninterface PerspectiveObservationRow {\n observation_id: string;\n project_hash: string;\n observer_actor_id: string;\n observed_actor_id: string;\n session_id: string | null;\n level: string;\n content: string;\n confidence: number;\n source_event_ids_json: string;\n source_observation_ids_json: string;\n created_by: string;\n metadata_json: string | null;\n content_hash: string;\n source_hash: string;\n created_at: string;\n updated_at: string;\n deleted_at: string | null;\n}\n\ntype ParsedObservationCreate = z.output<typeof CreatePerspectiveObservationInputSchema>;\ntype ParsedObservationQuery = z.output<typeof QueryPerspectiveObservationsInputSchema>;\n\ntype ObservationFilter = {\n clauses: string[];\n params: unknown[];\n};\n\nfunction projectHashToStorage(projectHash: string | undefined): string {\n return projectHash ?? '';\n}\n\nfunction projectHashFromStorage(projectHash: string): string | undefined {\n return projectHash.length > 0 ? projectHash : undefined;\n}\n\nfunction parseStringArray(value: string | null): string[] {\n if (!value) return [];\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed)\n ? parsed.filter((entry): entry is string => typeof entry === 'string')\n : [];\n } catch {\n return [];\n }\n}\n\nfunction parseJsonRecord(value: string | null): Record<string, unknown> | undefined {\n if (!value) return undefined;\n try {\n const parsed = JSON.parse(value);\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction sanitizeStoredString(value: string): string {\n const sanitized = sanitizeGovernanceAuditValue(value);\n return typeof sanitized === 'string' ? sanitized.trim() : String(value).trim();\n}\n\nfunction sanitizeStoredStringArray(values: string[]): string[] {\n return values.map(sanitizeStoredString).filter((value) => value.length > 0);\n}\n\nfunction sanitizeStoredRecord(value: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n if (!value) return undefined;\n return sanitizeGovernanceAuditValue(value) as Record<string, unknown>;\n}\n\nfunction stableHash(value: unknown): string {\n return createHash('sha256').update(JSON.stringify(value)).digest('hex');\n}\n\nfunction evidenceHash(sourceEventIds: string[], sourceObservationIds: string[]): string {\n return stableHash({\n sourceEventIds: [...sourceEventIds].sort(),\n sourceObservationIds: [...sourceObservationIds].sort()\n });\n}\n\nfunction rowToObservation(row: PerspectiveObservationRow): PerspectiveObservation {\n return PerspectiveObservationSchema.parse({\n observationId: row.observation_id,\n projectHash: projectHashFromStorage(row.project_hash),\n observerActorId: row.observer_actor_id,\n observedActorId: row.observed_actor_id,\n sessionId: row.session_id ?? undefined,\n level: row.level,\n content: row.content,\n confidence: Number(row.confidence),\n sourceEventIds: parseStringArray(row.source_event_ids_json),\n sourceObservationIds: parseStringArray(row.source_observation_ids_json),\n createdBy: row.created_by,\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toDateFromSQLite(row.created_at),\n updatedAt: toDateFromSQLite(row.updated_at),\n deletedAt: row.deleted_at ? toDateFromSQLite(row.deleted_at) : undefined\n });\n}\n\nfunction sanitizedObservationSnapshot(observation: PerspectiveObservation): Record<string, unknown> {\n return sanitizeGovernanceAuditValue({\n observationId: observation.observationId,\n projectHash: observation.projectHash,\n observerActorId: observation.observerActorId,\n observedActorId: observation.observedActorId,\n sessionId: observation.sessionId,\n level: observation.level,\n content: observation.content,\n confidence: observation.confidence,\n sourceEventIds: observation.sourceEventIds,\n sourceObservationIds: observation.sourceObservationIds,\n createdBy: observation.createdBy,\n metadata: observation.metadata,\n createdAt: observation.createdAt.toISOString(),\n updatedAt: observation.updatedAt.toISOString(),\n deletedAt: observation.deletedAt?.toISOString()\n }) as Record<string, unknown>;\n}\n\nfunction queryScore(observation: PerspectiveObservation, terms: string[]): number {\n if (terms.length === 0) return 0;\n const haystack = [observation.content, observation.level, observation.sessionId ?? ''].join(' ').toLowerCase();\n return terms.reduce((score, term) => score + (haystack.includes(term) ? 1 : 0), 0);\n}\n\nfunction columnName(name: string, alias?: string): string {\n return alias ? `${alias}.${name}` : name;\n}\n\nfunction buildObservationFilter(parsed: ParsedObservationQuery, alias?: string): ObservationFilter {\n const clauses = [`${columnName('project_hash', alias)} = ?`];\n const params: unknown[] = [projectHashToStorage(parsed.projectHash)];\n\n if (parsed.observerActorId) {\n clauses.push(`${columnName('observer_actor_id', alias)} = ?`);\n params.push(parsed.observerActorId);\n }\n if (parsed.observedActorId) {\n clauses.push(`${columnName('observed_actor_id', alias)} = ?`);\n params.push(parsed.observedActorId);\n }\n if (parsed.sessionId) {\n clauses.push(`(${columnName('session_id', alias)} = ? OR ${columnName('session_id', alias)} IS NULL)`);\n params.push(parsed.sessionId);\n }\n if (parsed.levels && parsed.levels.length > 0) {\n clauses.push(`${columnName('level', alias)} IN (${parsed.levels.map(() => '?').join(', ')})`);\n params.push(...parsed.levels);\n }\n if (!parsed.includeDeleted) {\n clauses.push(`${columnName('deleted_at', alias)} IS NULL`);\n }\n\n return { clauses, params };\n}\n\nfunction buildObservationFtsQuery(query: string): string {\n return query\n .replace(/['\"(){}[\\]^~*?:\\\\/-]/g, ' ')\n .split(/\\s+/)\n .map((term) => term.trim())\n .filter((term) => term.length > 0)\n .slice(0, 32)\n .map((term) => `\"${term.replace(/\"/g, '\"\"')}\"*`)\n .join(' OR ');\n}\n\nfunction isFtsUnavailableError(error: unknown): boolean {\n const message = String(error instanceof Error ? error.message : error).toLowerCase();\n return message.includes('no such table: perspective_observations_fts')\n || message.includes('no such column: perspective_observations_fts')\n || message.includes('unable to use function match')\n || message.includes('malformed match expression');\n}\n\nexport class PerspectiveObservationRepository {\n private vectorOutbox: VectorOutbox | null = null;\n private readonly vectorOutboxOption: PerspectiveObservationRepositoryOptions['vectorOutbox'];\n\n constructor(\n private readonly db: SQLiteDatabase,\n options: PerspectiveObservationRepositoryOptions = {}\n ) {\n this.vectorOutboxOption = options.vectorOutbox;\n if (options.vectorOutbox instanceof VectorOutbox) {\n this.vectorOutbox = options.vectorOutbox;\n }\n }\n\n private getVectorOutbox(): VectorOutbox | null {\n const option = this.vectorOutboxOption;\n if (option === false) return null;\n if (option instanceof VectorOutbox) {\n this.vectorOutbox = option;\n return option;\n }\n if (!this.vectorOutbox) {\n this.vectorOutbox = new VectorOutbox(this.db, option ?? {});\n }\n return this.vectorOutbox;\n }\n\n private enqueueObservationSync(observationId: string): void {\n const outbox = this.getVectorOutbox();\n if (!outbox) return;\n outbox.enqueueSync('perspective_observation', observationId);\n }\n\n async create(input: unknown): Promise<PerspectiveObservation> {\n const parsed = CreatePerspectiveObservationInputSchema.parse(input);\n const projectHash = projectHashToStorage(parsed.projectHash);\n const observerActorId = sanitizeStoredString(parsed.observerActorId);\n const observedActorId = sanitizeStoredString(parsed.observedActorId);\n const sessionId = parsed.sessionId ? sanitizeStoredString(parsed.sessionId) : undefined;\n const content = sanitizeStoredString(parsed.content);\n const sourceEventIds = sanitizeStoredStringArray(parsed.sourceEventIds);\n const sourceObservationIds = sanitizeStoredStringArray(parsed.sourceObservationIds);\n const createdBy = parsed.createdBy;\n const actor = parsed.actor ? sanitizeStoredString(parsed.actor) : undefined;\n const now = new Date().toISOString();\n const observationId = parsed.observationId ?? randomUUID();\n const contentHash = stableHash(content);\n const sourceHash = evidenceHash(sourceEventIds, sourceObservationIds);\n const metadata = sanitizeStoredRecord(parsed.metadata);\n\n let saved: PerspectiveObservation | null = null;\n const transaction = this.db.transaction(() => {\n sqliteRun(\n this.db,\n `INSERT INTO perspective_observations (\n observation_id, project_hash, observer_actor_id, observed_actor_id, session_id,\n level, content, confidence, source_event_ids_json, source_observation_ids_json,\n created_by, metadata_json, content_hash, source_hash, created_at, updated_at, deleted_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL)\n ON CONFLICT(project_hash, observer_actor_id, observed_actor_id, level, content_hash, source_hash)\n DO UPDATE SET\n confidence = excluded.confidence,\n session_id = excluded.session_id,\n metadata_json = excluded.metadata_json,\n updated_at = excluded.updated_at,\n deleted_at = NULL`,\n [\n observationId,\n projectHash,\n observerActorId,\n observedActorId,\n sessionId ?? null,\n parsed.level,\n content,\n parsed.confidence,\n JSON.stringify(sourceEventIds),\n JSON.stringify(sourceObservationIds),\n createdBy,\n metadata ? JSON.stringify(metadata) : null,\n contentHash,\n sourceHash,\n now,\n now\n ]\n );\n\n saved = this.getByUnique(\n projectHash,\n observerActorId,\n observedActorId,\n parsed.level,\n contentHash,\n sourceHash\n );\n if (!saved) throw new Error('perspective observation was not saved');\n this.enqueueObservationSync(saved.observationId);\n });\n transaction();\n\n const savedObservation = saved;\n if (!savedObservation) throw new Error('perspective observation was not saved');\n await this.writeCreateAudit({ ...parsed, observerActorId, observedActorId, sessionId, content, sourceEventIds, sourceObservationIds, createdBy, actor, metadata }, savedObservation);\n return savedObservation;\n }\n\n async query(input: unknown): Promise<PerspectiveObservation[]> {\n const parsed = QueryPerspectiveObservationsInputSchema.parse(input);\n if (parsed.query) {\n const ftsQuery = buildObservationFtsQuery(parsed.query);\n if (ftsQuery) {\n const ftsResult = this.queryWithFts(parsed, ftsQuery);\n if (ftsResult) return ftsResult;\n }\n }\n\n return this.queryWithPrefetch(parsed);\n }\n\n private queryWithFts(parsed: ParsedObservationQuery, ftsQuery: string): PerspectiveObservation[] | null {\n const filter = buildObservationFilter(parsed, 'po');\n try {\n const rows = sqliteAll<PerspectiveObservationRow>(\n this.db,\n `SELECT po.*\n FROM perspective_observations_fts fts\n JOIN perspective_observations po ON po.rowid = fts.rowid\n WHERE perspective_observations_fts MATCH ?\n AND ${filter.clauses.join(' AND ')}\n ORDER BY fts.rank, po.confidence DESC, po.updated_at DESC\n LIMIT ?`,\n [ftsQuery, ...filter.params, parsed.limit]\n );\n return rows.map(rowToObservation);\n } catch (error) {\n if (isFtsUnavailableError(error)) return null;\n throw error;\n }\n }\n\n private queryWithPrefetch(parsed: ParsedObservationQuery): PerspectiveObservation[] {\n const filter = buildObservationFilter(parsed);\n const rowLimit = parsed.query ? Math.min(parsed.limit * 5, 500) : parsed.limit;\n const rows = sqliteAll<PerspectiveObservationRow>(\n this.db,\n `SELECT * FROM perspective_observations\n WHERE ${filter.clauses.join(' AND ')}\n ORDER BY confidence DESC, updated_at DESC\n LIMIT ?`,\n [...filter.params, rowLimit]\n );\n const observations = rows.map(rowToObservation);\n const terms = parsed.query\n ? parsed.query.toLowerCase().split(/\\s+/).map((term) => term.trim()).filter(Boolean)\n : [];\n return observations\n .map((observation) => ({ observation, score: queryScore(observation, terms) }))\n .sort((a, b) => b.score - a.score || b.observation.confidence - a.observation.confidence || b.observation.updatedAt.getTime() - a.observation.updatedAt.getTime())\n .slice(0, parsed.limit)\n .map((item) => item.observation);\n }\n\n async listBySourceEvent(input: unknown): Promise<PerspectiveObservation[]> {\n const parsed = ListPerspectiveObservationsBySourceInputSchema.parse(input);\n const rows = sqliteAll<PerspectiveObservationRow>(\n this.db,\n `SELECT * FROM perspective_observations\n WHERE project_hash = ?\n AND deleted_at IS NULL\n AND EXISTS (\n SELECT 1\n FROM json_each(perspective_observations.source_event_ids_json)\n WHERE json_each.value = ?\n )\n ORDER BY confidence DESC, updated_at DESC\n LIMIT ?`,\n [projectHashToStorage(parsed.projectHash), parsed.sourceEventId, parsed.limit]\n );\n return rows.map(rowToObservation);\n }\n\n async deleteSoft(input: unknown): Promise<PerspectiveObservation> {\n const parsed = DeletePerspectiveObservationInputSchema.parse(input);\n const projectHash = projectHashToStorage(parsed.projectHash);\n const before = this.get(projectHash, parsed.observationId);\n if (!before) throw new Error('perspective observation not found');\n const deletedAt = new Date().toISOString();\n sqliteRun(\n this.db,\n `UPDATE perspective_observations\n SET deleted_at = ?, updated_at = ?\n WHERE project_hash = ? AND observation_id = ?`,\n [deletedAt, deletedAt, projectHash, parsed.observationId]\n );\n const after = this.get(projectHash, parsed.observationId);\n if (!after) throw new Error('perspective observation not found after delete');\n await writeGovernanceAuditEntry(this.db, {\n operation: 'perspective_observation_delete',\n actor: parsed.actor,\n projectHash: parsed.projectHash,\n targetType: 'perspective_observation',\n targetId: parsed.observationId,\n beforeJson: sanitizedObservationSnapshot(before),\n afterJson: sanitizedObservationSnapshot(after),\n sourceEventIds: after.sourceEventIds\n });\n return after;\n }\n\n get(projectHash: string, observationId: string): PerspectiveObservation | null {\n const row = sqliteGet<PerspectiveObservationRow>(\n this.db,\n `SELECT * FROM perspective_observations WHERE project_hash = ? AND observation_id = ?`,\n [projectHash, observationId]\n );\n return row ? rowToObservation(row) : null;\n }\n\n private getByUnique(\n projectHash: string,\n observerActorId: string,\n observedActorId: string,\n level: string,\n contentHash: string,\n sourceHash: string\n ): PerspectiveObservation | null {\n const row = sqliteGet<PerspectiveObservationRow>(\n this.db,\n `SELECT * FROM perspective_observations\n WHERE project_hash = ? AND observer_actor_id = ? AND observed_actor_id = ?\n AND level = ? AND content_hash = ? AND source_hash = ?`,\n [projectHash, observerActorId, observedActorId, level, contentHash, sourceHash]\n );\n return row ? rowToObservation(row) : null;\n }\n\n private async writeCreateAudit(\n parsed: ParsedObservationCreate,\n after: PerspectiveObservation\n ): Promise<void> {\n await writeGovernanceAuditEntry(this.db, {\n operation: 'perspective_observation_create',\n actor: parsed.actor ?? parsed.createdBy,\n projectHash: parsed.projectHash,\n targetType: 'perspective_observation',\n targetId: after.observationId,\n afterJson: sanitizedObservationSnapshot(after),\n sourceEventIds: parsed.sourceEventIds\n });\n }\n}\n", "import { sanitizeGovernanceAuditValue } from './governance-audit.js';\nimport type {\n MemoryActor,\n MemoryEvent,\n MemoryOperationsConfig,\n PerspectiveObservation,\n PerspectiveObservationCreatedBy,\n PerspectiveObservationLevel,\n SessionActor\n} from '../types.js';\n\nexport interface PerspectiveObservationCandidate {\n content: string;\n confidence?: number;\n level?: PerspectiveObservationLevel;\n createdBy?: PerspectiveObservationCreatedBy;\n observedActorId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PerspectiveObservationExtractor {\n extract(\n event: MemoryEvent,\n context: { projectHash?: string; projectPath?: string | null }\n ): Promise<PerspectiveObservationCandidate[]>;\n}\n\nexport interface PerspectiveDeriverActors {\n resolveFromEvent(event: MemoryEvent, options?: { projectHash?: string }): Promise<MemoryActor>;\n}\n\nexport interface PerspectiveDeriverSessions {\n listBySession(input: { projectHash?: string; sessionId: string; limit?: number }): Promise<SessionActor[]>;\n upsertMembership(input: {\n projectHash?: string;\n sessionId: string;\n actorId: string;\n roleInSession: SessionActor['roleInSession'];\n observeSelf?: boolean;\n observeOthers?: boolean;\n metadata?: Record<string, unknown>;\n }): Promise<SessionActor>;\n}\n\nexport interface PerspectiveDeriverObservations {\n create(input: {\n projectHash?: string;\n observerActorId: string;\n observedActorId: string;\n sessionId?: string;\n level?: PerspectiveObservationLevel;\n content: string;\n confidence?: number;\n sourceEventIds: string[];\n sourceObservationIds?: string[];\n createdBy?: PerspectiveObservationCreatedBy;\n metadata?: Record<string, unknown>;\n actor?: string;\n }): Promise<PerspectiveObservation>;\n}\n\nexport interface PerspectiveDeriverOptions {\n actors: PerspectiveDeriverActors;\n sessions: PerspectiveDeriverSessions;\n observations: PerspectiveDeriverObservations;\n extractor?: PerspectiveObservationExtractor;\n config?: MemoryOperationsConfig['perspectiveMemory'];\n}\n\nexport type PerspectiveDerivationResult =\n | { status: 'skipped'; reason: 'disabled' | 'unsupported_event' | 'no_candidates' | 'no_observers'; created: 0; updated: 0 }\n | { status: 'ok'; created: number; updated: number }\n | { status: 'failed'; reason: 'extract_failed' | 'persist_failed'; created: number; updated: number; error: string };\n\ninterface NormalizedPerspectiveDeriverConfig {\n enabled: boolean;\n deriver: {\n enabled: boolean;\n maxEventsPerBatch: number;\n maxObserversPerSession: number;\n };\n}\n\nconst DEFAULT_CONFIG: NormalizedPerspectiveDeriverConfig = {\n enabled: false,\n deriver: {\n enabled: false,\n maxEventsPerBatch: 20,\n maxObserversPerSession: 5\n }\n};\n\nconst MAX_OBSERVATION_CONTENT_CHARS = 600;\n\nexport class RuleBasedPerspectiveObservationExtractor implements PerspectiveObservationExtractor {\n async extract(event: MemoryEvent): Promise<PerspectiveObservationCandidate[]> {\n if (!isSupportedSourceEvent(event)) return [];\n const content = normalizeObservationContent(event.content);\n if (!content) return [];\n return [{\n content,\n confidence: 0.6,\n level: 'explicit',\n createdBy: 'rule',\n metadata: {\n extractor: 'rule-based-minimal',\n sourceEventType: event.eventType\n }\n }];\n }\n}\n\nexport class PerspectiveDeriver {\n private readonly actors: PerspectiveDeriverActors;\n private readonly sessions: PerspectiveDeriverSessions;\n private readonly observations: PerspectiveDeriverObservations;\n private readonly extractor: PerspectiveObservationExtractor;\n private readonly config: NormalizedPerspectiveDeriverConfig;\n\n constructor(options: PerspectiveDeriverOptions) {\n this.actors = options.actors;\n this.sessions = options.sessions;\n this.observations = options.observations;\n this.extractor = options.extractor ?? new RuleBasedPerspectiveObservationExtractor();\n this.config = normalizeConfig(options.config);\n }\n\n async deriveFromEvent(\n event: MemoryEvent,\n context: { projectHash?: string | null; projectPath?: string | null } = {}\n ): Promise<PerspectiveDerivationResult> {\n if (!this.config.enabled || !this.config.deriver.enabled) {\n return { status: 'skipped', reason: 'disabled', created: 0, updated: 0 };\n }\n if (!isSupportedSourceEvent(event)) {\n return { status: 'skipped', reason: 'unsupported_event', created: 0, updated: 0 };\n }\n\n const projectHash = normalizeOptionalString(context.projectHash);\n const projectPath = context.projectPath ?? null;\n let candidates: PerspectiveObservationCandidate[];\n try {\n // Extraction may be backed by an LLM. Keep it before persistence writes so\n // no long-lived SQLite transaction can span an external model call.\n candidates = (await this.extractor.extract(event, { projectHash, projectPath }))\n .map(normalizeCandidate)\n .filter((candidate): candidate is NormalizedPerspectiveObservationCandidate => candidate !== null);\n } catch (error) {\n return { status: 'failed', reason: 'extract_failed', created: 0, updated: 0, error: safeErrorMessage(error) };\n }\n if (candidates.length === 0) {\n return { status: 'skipped', reason: 'no_candidates', created: 0, updated: 0 };\n }\n\n try {\n const sourceActor = await this.actors.resolveFromEvent(event, { projectHash });\n let members = await this.sessions.listBySession({\n projectHash,\n sessionId: event.sessionId,\n limit: this.config.deriver.maxObserversPerSession * 2\n });\n if (!members.some((member) => member.actorId === sourceActor.actorId)) {\n await this.sessions.upsertMembership({\n projectHash,\n sessionId: event.sessionId,\n actorId: sourceActor.actorId,\n roleInSession: roleForEvent(event),\n observeSelf: true,\n observeOthers: false,\n metadata: { source: 'perspective-deriver' }\n });\n members = await this.sessions.listBySession({\n projectHash,\n sessionId: event.sessionId,\n limit: this.config.deriver.maxObserversPerSession * 2\n });\n }\n\n let saved = 0;\n for (const candidate of candidates) {\n const observedActorId = candidate.observedActorId ?? sourceActor.actorId;\n const observers = selectObservers(members, observedActorId, this.config.deriver.maxObserversPerSession);\n if (observers.length === 0) continue;\n for (const observerActorId of observers) {\n await this.observations.create({\n projectHash,\n observerActorId,\n observedActorId,\n sessionId: event.sessionId,\n level: candidate.level,\n content: candidate.content,\n confidence: candidate.confidence,\n sourceEventIds: [event.id],\n sourceObservationIds: [],\n createdBy: candidate.createdBy,\n metadata: {\n deriver: 'minimal-perspective-deriver',\n sourceEventType: event.eventType,\n ...(candidate.metadata ?? {})\n },\n actor: 'perspective-deriver'\n });\n saved += 1;\n }\n }\n\n if (saved === 0) {\n return { status: 'skipped', reason: 'no_observers', created: 0, updated: 0 };\n }\n return { status: 'ok', created: saved, updated: 0 };\n } catch (error) {\n return { status: 'failed', reason: 'persist_failed', created: 0, updated: 0, error: safeErrorMessage(error) };\n }\n }\n}\n\ninterface NormalizedPerspectiveObservationCandidate {\n content: string;\n confidence: number;\n level: PerspectiveObservationLevel;\n createdBy: PerspectiveObservationCreatedBy;\n observedActorId?: string;\n metadata?: Record<string, unknown>;\n}\n\nfunction normalizeConfig(config: MemoryOperationsConfig['perspectiveMemory'] | undefined): NormalizedPerspectiveDeriverConfig {\n return {\n enabled: config?.enabled ?? DEFAULT_CONFIG.enabled,\n deriver: {\n enabled: config?.deriver?.enabled ?? DEFAULT_CONFIG.deriver.enabled,\n maxEventsPerBatch: clampInteger(\n config?.deriver?.maxEventsPerBatch,\n DEFAULT_CONFIG.deriver.maxEventsPerBatch,\n 1,\n 100\n ),\n maxObserversPerSession: clampInteger(\n config?.deriver?.maxObserversPerSession,\n DEFAULT_CONFIG.deriver.maxObserversPerSession,\n 1,\n 50\n )\n }\n };\n}\n\nfunction clampInteger(value: number | undefined, fallback: number, min: number, max: number): number {\n if (!Number.isFinite(value)) return fallback;\n return Math.max(min, Math.min(max, Math.trunc(Number(value))));\n}\n\nfunction isSupportedSourceEvent(event: MemoryEvent): boolean {\n return event.eventType === 'user_prompt' || event.eventType === 'agent_response';\n}\n\nfunction roleForEvent(event: MemoryEvent): SessionActor['roleInSession'] {\n if (event.eventType === 'user_prompt') return 'speaker';\n if (event.eventType === 'agent_response') return 'assistant';\n if (event.eventType === 'tool_observation') return 'tool';\n if (event.eventType === 'session_summary') return 'system';\n return 'unknown';\n}\n\nfunction normalizeCandidate(candidate: PerspectiveObservationCandidate): NormalizedPerspectiveObservationCandidate | null {\n const content = normalizeObservationContent(candidate.content);\n if (!content) return null;\n return {\n content,\n confidence: clampNumber(candidate.confidence, 0.6, 0, 1),\n level: candidate.level ?? 'explicit',\n createdBy: candidate.createdBy ?? 'rule',\n observedActorId: normalizeOptionalString(candidate.observedActorId),\n metadata: sanitizeCandidateMetadata(candidate.metadata)\n };\n}\n\nfunction normalizeObservationContent(content: string): string | null {\n const normalized = content.replace(/\\s+/g, ' ').trim();\n if (!normalized) return null;\n return normalized.slice(0, MAX_OBSERVATION_CONTENT_CHARS);\n}\n\nfunction normalizeOptionalString(value: string | null | undefined): string | undefined {\n const normalized = typeof value === 'string' ? value.trim() : '';\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction clampNumber(value: number | undefined, fallback: number, min: number, max: number): number {\n if (!Number.isFinite(value)) return fallback;\n return Math.max(min, Math.min(max, Number(value)));\n}\n\nfunction sanitizeCandidateMetadata(metadata: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n if (!metadata) return undefined;\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n result[key] = value;\n }\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction selectObservers(members: SessionActor[], observedActorId: string, maxObservers: number): string[] {\n const selected: string[] = [];\n for (const member of members) {\n const canObserve = member.actorId === observedActorId ? member.observeSelf : member.observeOthers;\n if (!canObserve) continue;\n if (!selected.includes(member.actorId)) selected.push(member.actorId);\n if (selected.length >= maxObservers) break;\n }\n return selected;\n}\n\nfunction safeErrorMessage(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n const sanitized = sanitizeGovernanceAuditValue(message);\n return String(sanitized).replace(/\\s+/g, ' ').slice(0, 160);\n}\n\nexport function createPerspectiveDeriver(options: PerspectiveDeriverOptions): PerspectiveDeriver {\n return new PerspectiveDeriver(options);\n}\n", "/**\n * LanceDB Vector Store for semantic search\n * AXIOMMIND Principle 6: Vector store consistency (DuckDB \u2192 outbox \u2192 LanceDB unidirectional)\n */\n\nimport * as lancedb from '@lancedb/lancedb';\nimport type { VectorRecord } from './types.js';\n\nexport interface SearchResult {\n id: string;\n eventId: string;\n content: string;\n score: number;\n sessionId: string;\n eventType: string;\n timestamp: string;\n}\n\ntype LanceTable = lancedb.Table;\n\ntype VectorRow = {\n id: string;\n eventId: string;\n sessionId: string;\n eventType: string;\n content: string;\n vector: number[];\n timestamp: string;\n metadata: string;\n};\n\nexport class VectorStore {\n private db: lancedb.Connection | null = null;\n private readonly tableCache = new Map<string, LanceTable>();\n private readonly defaultTableName = 'conversations';\n\n constructor(private dbPath: string) {}\n\n /**\n * Initialize LanceDB connection.\n *\n * Table handles are resolved lazily so Vector Outbox V2 can route records to\n * item-kind/embedding-version tables without eagerly touching the legacy\n * conversations table.\n */\n async initialize(): Promise<void> {\n if (this.db) return;\n this.db = await lancedb.connect(this.dbPath);\n }\n\n /**\n * Add or update vector record. Existing rows with the same stable id are\n * deleted before insertion to avoid append-only duplicates in LanceDB.\n */\n async upsert(record: VectorRecord): Promise<void> {\n await this.upsertBatch([record]);\n }\n\n /**\n * Add or update multiple vector records in batch, grouped by inferred table.\n */\n async upsertBatch(records: VectorRecord[]): Promise<void> {\n if (records.length === 0) return;\n\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const groups = new Map<string, VectorRow[]>();\n for (const record of records) {\n const tableName = this.getRecordTableName(record);\n const rows = groups.get(tableName) ?? [];\n rows.push(this.toVectorRow(record));\n groups.set(tableName, rows);\n }\n\n for (const [tableName, rows] of groups) {\n await this.upsertRows(tableName, rows);\n }\n }\n\n /**\n * Search for similar vectors in the legacy conversations table.\n */\n async search(\n queryVector: number[],\n options: {\n limit?: number;\n minScore?: number;\n sessionId?: string;\n } = {}\n ): Promise<SearchResult[]> {\n await this.initialize();\n\n const table = await this.getExistingTable(this.defaultTableName);\n if (!table) {\n return [];\n }\n\n const { limit = 5, minScore = 0.7, sessionId } = options;\n\n // Use cosine distance for semantic similarity\n let query = table\n .search(queryVector)\n .distanceType('cosine')\n .limit(limit * 2); // Get more for filtering\n\n // Apply session filter if specified\n if (sessionId) {\n query = query.where(`sessionId = ${toLanceSqlString(sessionId)}`);\n }\n\n const results = await query.toArray();\n\n return results\n .filter(r => {\n // Convert cosine distance to similarity score\n // Cosine distance ranges from 0 (identical) to 2 (opposite)\n // Score = 1 - (distance / 2) gives range [0, 1]\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return score >= minScore;\n })\n .slice(0, limit)\n .map(r => {\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return {\n id: r.id as string,\n eventId: r.eventId as string,\n content: r.content as string,\n score,\n sessionId: r.sessionId as string,\n eventType: r.eventType as string,\n timestamp: r.timestamp as string\n };\n });\n }\n\n /**\n * Delete vector by event ID from the legacy conversations table.\n */\n async delete(eventId: string): Promise<void> {\n await this.initialize();\n const table = await this.getExistingTable(this.defaultTableName);\n if (!table) return;\n await table.delete(`eventId = ${toLanceSqlString(eventId)}`);\n }\n\n /**\n * Get total count of vectors in the legacy conversations table.\n */\n async count(): Promise<number> {\n await this.initialize();\n const table = await this.getExistingTable(this.defaultTableName);\n if (!table) return 0;\n const result = await table.countRows();\n return result;\n }\n\n /**\n * Clear all legacy vectors (used for embedding model migration).\n */\n async clearAll(): Promise<void> {\n await this.initialize();\n if (!this.db) return;\n\n try {\n if (typeof (this.db as any).dropTable === 'function') {\n await (this.db as any).dropTable(this.defaultTableName);\n } else if (typeof (this.db as any).drop_table === 'function') {\n await (this.db as any).drop_table(this.defaultTableName);\n }\n } catch {\n // Ignore if table does not exist\n }\n\n this.tableCache.delete(this.defaultTableName);\n }\n\n /**\n * Check if vector exists for event in the legacy conversations table.\n */\n async exists(eventId: string): Promise<boolean> {\n await this.initialize();\n const table = await this.getExistingTable(this.defaultTableName);\n if (!table) return false;\n\n const results = await table\n .search([])\n .where(`eventId = ${toLanceSqlString(eventId)}`)\n .limit(1)\n .toArray();\n\n return results.length > 0;\n }\n\n private async upsertRows(tableName: string, rows: VectorRow[]): Promise<void> {\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const existingTable = await this.getExistingTable(tableName);\n if (existingTable) {\n for (const row of rows) {\n await existingTable.delete(`id = ${toLanceSqlString(row.id)}`);\n }\n await existingTable.add(rows);\n return;\n }\n\n try {\n const created = await this.db.createTable(tableName, rows);\n this.tableCache.set(tableName, created);\n } catch (error) {\n if (!isAlreadyExistsError(error)) {\n throw error;\n }\n const racedTable = await this.openTable(tableName);\n for (const row of rows) {\n await racedTable.delete(`id = ${toLanceSqlString(row.id)}`);\n }\n await racedTable.add(rows);\n }\n }\n\n private async getExistingTable(tableName: string): Promise<LanceTable | null> {\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const cached = this.tableCache.get(tableName);\n if (cached) return cached;\n\n const tableNames = await this.db.tableNames();\n if (!tableNames.includes(tableName)) {\n return null;\n }\n\n return this.openTable(tableName);\n }\n\n private async openTable(tableName: string): Promise<LanceTable> {\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n const table = await this.db.openTable(tableName);\n this.tableCache.set(tableName, table);\n return table;\n }\n\n private getRecordTableName(record: VectorRecord): string {\n const metadata = record.metadata ?? {};\n const itemKind = typeof metadata.itemKind === 'string' ? metadata.itemKind : null;\n const embeddingVersion = typeof metadata.embeddingVersion === 'string' ? metadata.embeddingVersion : null;\n\n if (!itemKind || !embeddingVersion) {\n return this.defaultTableName;\n }\n\n return `${slugifyTablePart(itemKind)}_vectors_${slugifyTablePart(embeddingVersion)}`;\n }\n\n private toVectorRow(record: VectorRecord): VectorRow {\n return {\n id: record.id,\n eventId: record.eventId,\n sessionId: record.sessionId,\n eventType: record.eventType,\n content: record.content,\n vector: record.vector,\n timestamp: record.timestamp,\n metadata: JSON.stringify(record.metadata || {})\n };\n }\n}\n\nfunction slugifyTablePart(value: string): string {\n return value\n .trim()\n .replace(/[^a-z0-9]+/gi, '_')\n .replace(/^_+|_+$/g, '')\n .toLowerCase() || 'default';\n}\n\nfunction toLanceSqlString(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nfunction isAlreadyExistsError(error: unknown): boolean {\n const message = String(error instanceof Error ? error.message : error).toLowerCase();\n return message.includes('already exists');\n}\n", "import type { MemoryEventInput } from './types.js';\n\nexport type IngestStage = 'before' | 'after' | 'error';\n\nexport interface IngestContext {\n stage: IngestStage;\n operation: 'user_prompt' | 'agent_response' | 'session_summary' | 'tool_observation';\n sessionId: string;\n event: MemoryEventInput;\n error?: Error;\n}\n\nexport type IngestInterceptor = (context: IngestContext) => Promise<void> | void;\n\nexport class IngestInterceptorRegistry {\n private before: IngestInterceptor[] = [];\n private after: IngestInterceptor[] = [];\n private onError: IngestInterceptor[] = [];\n\n registerBefore(interceptor: IngestInterceptor): () => void {\n this.before.push(interceptor);\n return () => {\n this.before = this.before.filter((i) => i !== interceptor);\n };\n }\n\n registerAfter(interceptor: IngestInterceptor): () => void {\n this.after.push(interceptor);\n return () => {\n this.after = this.after.filter((i) => i !== interceptor);\n };\n }\n\n registerOnError(interceptor: IngestInterceptor): () => void {\n this.onError.push(interceptor);\n return () => {\n this.onError = this.onError.filter((i) => i !== interceptor);\n };\n }\n\n async run(stage: IngestStage, context: Omit<IngestContext, 'stage'>): Promise<void> {\n const interceptors = stage === 'before'\n ? this.before\n : stage === 'after'\n ? this.after\n : this.onError;\n\n for (const interceptor of interceptors) {\n await interceptor({ ...context, stage });\n }\n }\n}\n\nexport function mergeHierarchicalMetadata(\n base: Record<string, unknown> | undefined,\n patch: Record<string, unknown> | undefined\n): Record<string, unknown> | undefined {\n if (!base && !patch) return undefined;\n if (!base) return patch;\n if (!patch) return base;\n\n const result: Record<string, unknown> = { ...base };\n\n for (const [key, value] of Object.entries(patch)) {\n const current = result[key];\n if (\n typeof current === 'object' && current !== null && !Array.isArray(current) &&\n typeof value === 'object' && value !== null && !Array.isArray(value)\n ) {\n result[key] = mergeHierarchicalMetadata(\n current as Record<string, unknown>,\n value as Record<string, unknown>\n );\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n", "export const TAG_NAMESPACES = {\n SYSTEM: 'sys:',\n QUALITY: 'q:',\n PROJECT: 'proj:',\n TOPIC: 'topic:',\n TEMPORAL: 't:',\n USER: 'user:',\n AGENT: 'agent:'\n} as const;\n\nexport const VALID_TAG_NAMESPACES = new Set<string>(Object.values(TAG_NAMESPACES));\n\nexport function parseTag(tag: string): { namespace?: string; value: string } {\n const value = (tag || '').trim();\n const idx = value.indexOf(':');\n if (idx <= 0) return { value };\n\n const namespace = `${value.slice(0, idx)}:`;\n const tagValue = value.slice(idx + 1);\n if (!tagValue) return { value };\n\n return { namespace, value: tagValue };\n}\n\nexport function validateTag(tag: string): boolean {\n const normalized = (tag || '').trim();\n if (!normalized) return false;\n\n const { namespace } = parseTag(normalized);\n if (!namespace) return true; // backward compatibility for legacy tags\n return VALID_TAG_NAMESPACES.has(namespace);\n}\n\nexport function withNamespace(value: string, namespace: string): string {\n const clean = parseTag(value).value.trim();\n return `${namespace}${clean}`;\n}\n\nexport function normalizeTags(tags: unknown): string[] {\n if (!Array.isArray(tags)) return [];\n\n const dedup = new Set<string>();\n for (const item of tags) {\n if (typeof item !== 'string') continue;\n const normalized = item.trim();\n if (!validateTag(normalized)) continue;\n dedup.add(normalized);\n }\n\n return [...dedup];\n}\n", "import type { MemoryEvent } from '../types.js';\n\nexport interface SessionSummaryDerivation {\n text: string;\n metadata: {\n generated: 'rule-based';\n eventCount: number;\n };\n}\n\nconst MAX_FIRST_PROMPT_LENGTH = 120;\nconst MAX_TOOL_NAMES = 6;\n\nexport class SummaryDeriver {\n /**\n * Derive the current lightweight rule-based session summary from raw events.\n *\n * The deriver is intentionally pure: callers own persistence and lifecycle\n * orchestration, while this class owns summary text and metadata decisions.\n */\n deriveSessionSummary(events: MemoryEvent[]): SessionSummaryDerivation | null {\n if (events.length < 3) return null;\n if (events.some((event) => event.eventType === 'session_summary')) return null;\n\n const prompts = events.filter((event) => event.eventType === 'user_prompt');\n const toolObservations = events.filter((event) => event.eventType === 'tool_observation');\n const toolNames = Array.from(new Set(\n toolObservations\n .map((event) => this.asRecord(event.metadata).toolName)\n .filter((toolName): toolName is string => typeof toolName === 'string' && toolName.length > 0)\n ));\n const errorObservations = toolObservations.filter((event) => this.isErrorObservation(event));\n\n const datePart = events[0].timestamp.toISOString().split('T')[0];\n const parts: string[] = [`[${datePart}] ${prompts.length}\uD134 \uC138\uC158`];\n\n if (prompts.length > 0) {\n parts.push(`\uC8FC\uC694 \uC791\uC5C5: ${this.firstPromptPreview(prompts[0].content)}`);\n }\n if (toolNames.length > 0) {\n parts.push(`\uC0AC\uC6A9 \uD234: ${toolNames.slice(0, MAX_TOOL_NAMES).join(', ')}`);\n }\n if (errorObservations.length > 0) {\n parts.push(`\uC624\uB958 ${errorObservations.length}\uAC74 \uBC1C\uC0DD`);\n }\n\n return {\n text: parts.join('. '),\n metadata: { generated: 'rule-based', eventCount: events.length }\n };\n }\n\n private firstPromptPreview(content: string): string {\n return content.slice(0, MAX_FIRST_PROMPT_LENGTH).replace(/\\r?\\n/g, ' ');\n }\n\n private isErrorObservation(event: MemoryEvent): boolean {\n const metadata = this.asRecord(event.metadata);\n\n if (metadata.exitCode !== undefined) {\n return metadata.exitCode !== 0;\n }\n\n return metadata.success === false;\n }\n\n private asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : {};\n }\n}\n\nexport function createSummaryDeriver(): SummaryDeriver {\n return new SummaryDeriver();\n}\n", "import {\n IngestInterceptor,\n IngestInterceptorRegistry,\n mergeHierarchicalMetadata\n} from '../ingest-interceptor.js';\nimport { normalizeTags } from '../tag-taxonomy.js';\nimport { createSummaryDeriver, type SummaryDeriver } from '../derive/summary-deriver.js';\nimport type { AppendResult, MemoryEvent, MemoryEventInput, ToolObservationPayload } from '../types.js';\n\nexport interface PerspectiveDeriverLike {\n deriveFromEvent(\n event: MemoryEvent,\n options?: { projectHash?: string | null; projectPath?: string | null }\n ): Promise<unknown>;\n}\n\ninterface SessionRecord {\n id: string;\n startedAt?: Date;\n endedAt?: Date;\n projectPath?: string;\n summary?: string;\n}\n\ninterface SessionUpsertStore {\n upsertSession(session: SessionRecord): Promise<void>;\n getSessionEvents(sessionId: string): Promise<MemoryEvent[]>;\n getSessionsWithoutSummary(currentSessionId: string, limit?: number): Promise<string[]>;\n}\n\ninterface IngestEventStore extends SessionUpsertStore {\n append(input: MemoryEventInput): Promise<AppendResult>;\n enqueueForEmbedding(eventId: string, content: string): Promise<unknown>;\n}\n\ninterface IngestMarkdownMirror {\n append(event: MemoryEventInput, eventId?: string): Promise<void>;\n}\n\nexport type IngestOperation = 'user_prompt' | 'agent_response' | 'session_summary' | 'tool_observation';\n\nexport interface MemoryIngestServiceOptions {\n initialize: () => Promise<void>;\n eventStore: IngestEventStore;\n markdownMirror: IngestMarkdownMirror;\n createToolEmbedding: (payload: ToolObservationPayload) => string;\n getProjectHash?: () => string | null;\n getProjectPath?: () => string | null;\n summaryDeriver?: SummaryDeriver;\n perspectiveDeriver?: PerspectiveDeriverLike;\n}\n\n/**\n * Thin-core ingest service for session lifecycle and event writes.\n *\n * Owns the ingest normalization/interceptor/append pipeline so the public\n * MemoryService facade can delegate ingest behavior without coordinating\n * storage-side effects itself.\n */\nexport class MemoryIngestService {\n private readonly initialize: () => Promise<void>;\n private readonly eventStore: IngestEventStore;\n private readonly markdownMirror: IngestMarkdownMirror;\n private readonly createToolEmbedding: (payload: ToolObservationPayload) => string;\n private readonly getProjectHash: () => string | null;\n private readonly getProjectPath: () => string | null;\n private readonly summaryDeriver: SummaryDeriver;\n private readonly perspectiveDeriver?: PerspectiveDeriverLike;\n private readonly ingestInterceptors = new IngestInterceptorRegistry();\n\n constructor(options: MemoryIngestServiceOptions) {\n this.initialize = options.initialize;\n this.eventStore = options.eventStore;\n this.markdownMirror = options.markdownMirror;\n this.createToolEmbedding = options.createToolEmbedding;\n this.getProjectHash = options.getProjectHash ?? (() => null);\n this.getProjectPath = options.getProjectPath ?? (() => null);\n this.summaryDeriver = options.summaryDeriver ?? createSummaryDeriver();\n this.perspectiveDeriver = options.perspectiveDeriver;\n }\n\n registerIngestBefore(interceptor: IngestInterceptor): () => void {\n return this.ingestInterceptors.registerBefore(interceptor);\n }\n\n registerIngestAfter(interceptor: IngestInterceptor): () => void {\n return this.ingestInterceptors.registerAfter(interceptor);\n }\n\n registerIngestOnError(interceptor: IngestInterceptor): () => void {\n return this.ingestInterceptors.registerOnError(interceptor);\n }\n\n async startSession(sessionId: string, projectPath?: string): Promise<void> {\n await this.initialize();\n\n await this.eventStore.upsertSession({\n id: sessionId,\n startedAt: new Date(),\n projectPath\n });\n }\n\n async endSession(sessionId: string, summary?: string): Promise<void> {\n await this.initialize();\n\n await this.eventStore.upsertSession({\n id: sessionId,\n endedAt: new Date(),\n summary\n });\n }\n\n async storeUserPrompt(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestEvent({\n operation: 'user_prompt',\n input: {\n eventType: 'user_prompt',\n sessionId,\n timestamp: new Date(),\n content,\n metadata\n },\n embeddingContent: content\n });\n }\n\n async storeAgentResponse(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestEvent({\n operation: 'agent_response',\n input: {\n eventType: 'agent_response',\n sessionId,\n timestamp: new Date(),\n content,\n metadata\n },\n embeddingContent: content\n });\n }\n\n async storeSessionSummary(\n sessionId: string,\n summary: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestEvent({\n operation: 'session_summary',\n input: {\n eventType: 'session_summary',\n sessionId,\n timestamp: new Date(),\n content: summary,\n metadata\n },\n embeddingContent: summary\n });\n }\n\n /**\n * Backfill session summaries for recent sessions that are missing them.\n * Called from session-start hook to catch sessions that ended without Stop hook.\n */\n async backfillMissingSummaries(currentSessionId: string, limit = 5): Promise<void> {\n await this.initialize();\n\n const recentSessionIds = await this.eventStore.getSessionsWithoutSummary(currentSessionId, limit);\n for (const sessionId of recentSessionIds) {\n try {\n await this.generateSessionSummary(sessionId);\n } catch {\n // non-critical backfill path\n }\n }\n }\n\n /**\n * Generate a rule-based session summary from stored events.\n * Skips short sessions and sessions that already contain a summary event.\n */\n async generateSessionSummary(sessionId: string): Promise<void> {\n await this.initialize();\n\n const events = await this.eventStore.getSessionEvents(sessionId);\n const summary = this.summaryDeriver.deriveSessionSummary(events);\n if (!summary) return;\n\n await this.storeSessionSummary(sessionId, summary.text, summary.metadata);\n }\n\n async storeToolObservation(\n sessionId: string,\n payload: ToolObservationPayload\n ): Promise<AppendResult> {\n const content = JSON.stringify(payload);\n const turnId = (payload.metadata as Record<string, unknown> | undefined)?.turnId;\n\n return this.ingestEvent({\n operation: 'tool_observation',\n input: {\n eventType: 'tool_observation',\n sessionId,\n timestamp: new Date(),\n content,\n metadata: {\n toolName: payload.toolName,\n success: payload.success,\n ...(typeof turnId === 'string' && turnId.length > 0 ? { turnId } : {})\n }\n },\n embeddingContent: this.createToolEmbedding(payload)\n });\n }\n\n private async ingestEvent(options: {\n operation: IngestOperation;\n input: MemoryEventInput;\n embeddingContent?: string;\n }): Promise<AppendResult> {\n const normalizedInput = this.normalizeInput(options.operation, options.input);\n\n await this.ingestInterceptors.run('before', {\n operation: options.operation,\n sessionId: normalizedInput.sessionId,\n event: normalizedInput\n });\n\n try {\n const result = await this.eventStore.append(normalizedInput);\n if (result.success === false) {\n await this.ingestInterceptors.run('error', {\n operation: options.operation,\n sessionId: normalizedInput.sessionId,\n event: normalizedInput,\n error: new Error(result.error)\n });\n return result;\n }\n\n if (!result.isDuplicate) {\n if (options.embeddingContent) {\n await this.eventStore.enqueueForEmbedding(result.eventId, options.embeddingContent);\n }\n try {\n await this.markdownMirror.append(normalizedInput, result.eventId);\n } catch {\n // non-breaking markdown mirror write\n }\n await this.runPerspectiveDeriver(normalizedInput, result.eventId, options.operation);\n }\n\n await this.ingestInterceptors.run('after', {\n operation: options.operation,\n sessionId: normalizedInput.sessionId,\n event: normalizedInput\n });\n\n return result;\n } catch (error) {\n const normalizedError = error instanceof Error ? error : new Error(String(error));\n await this.ingestInterceptors.run('error', {\n operation: options.operation,\n sessionId: normalizedInput.sessionId,\n event: normalizedInput,\n error: normalizedError\n });\n throw error;\n }\n }\n\n private async runPerspectiveDeriver(\n input: MemoryEventInput,\n eventId: string,\n operation: IngestOperation\n ): Promise<void> {\n if (!this.perspectiveDeriver) return;\n if (operation !== 'user_prompt' && operation !== 'agent_response') return;\n const event: MemoryEvent = {\n id: eventId,\n eventType: input.eventType,\n sessionId: input.sessionId,\n timestamp: input.timestamp,\n content: input.content,\n canonicalKey: eventId,\n dedupeKey: eventId,\n metadata: input.metadata\n };\n try {\n await this.perspectiveDeriver.deriveFromEvent(event, {\n projectHash: this.getProjectHash(),\n projectPath: this.getProjectPath()\n });\n } catch {\n // Optional perspective derivation must never block normal memory ingestion.\n }\n }\n\n private normalizeInput(operation: IngestOperation, input: MemoryEventInput): MemoryEventInput {\n const projectHash = this.getProjectHash();\n const projectPath = this.getProjectPath();\n const normalizedInput: MemoryEventInput = {\n ...input,\n metadata: mergeHierarchicalMetadata(\n {\n ingest: {\n operation,\n pipeline: 'default',\n ts: new Date().toISOString()\n },\n ...(projectHash\n ? {\n scope: {\n project: {\n hash: projectHash,\n ...(projectPath ? { path: projectPath } : {})\n }\n },\n tags: [`proj:${projectHash}`]\n }\n : {})\n },\n input.metadata\n )\n };\n\n if (projectHash && normalizedInput.metadata) {\n const meta = normalizedInput.metadata as Record<string, unknown>;\n const currentTags = Array.isArray(meta.tags)\n ? meta.tags.filter((x): x is string => typeof x === 'string')\n : [];\n const projectTag = `proj:${projectHash}`;\n if (!currentTags.includes(projectTag)) {\n meta.tags = [...currentTags, projectTag];\n }\n }\n\n if (normalizedInput.metadata) {\n const meta = normalizedInput.metadata as Record<string, unknown>;\n const normalizedTags = normalizeTags(meta.tags);\n if (normalizedTags.length > 0) {\n meta.tags = normalizedTags;\n }\n }\n\n return normalizedInput;\n }\n}\n", "import type {\n MemoryEvent,\n OutboxStats,\n OutboxStatsOptions,\n OutboxRecoveryOptions,\n OutboxRecoveryResult,\n ProjectScopeRepairOptions,\n ProjectScopeRepairResult\n} from '../types.js';\n\ninterface RankedKeywordResult {\n event: MemoryEvent;\n rank: number;\n}\n\nexport interface MemorySessionTurn {\n turnId: string;\n events: MemoryEvent[];\n startedAt: Date;\n promptPreview: string;\n eventCount: number;\n toolCount: number;\n hasResponse: boolean;\n}\n\nexport type MemoryOutboxStats = OutboxStats;\n\nexport interface MemoryStats {\n totalEvents: number;\n vectorCount: number;\n levelStats: Array<{ level: string; count: number }>;\n}\n\ninterface QueryStore {\n keywordSearch(query: string, topK: number): Promise<RankedKeywordResult[]>;\n getSessionEvents(sessionId: string): Promise<MemoryEvent[]>;\n getRecentEvents(limit: number): Promise<MemoryEvent[]>;\n}\n\ninterface QueryMaintenanceStore extends QueryStore {\n rebuildFtsIndex(): Promise<number>;\n getOutboxStats(options?: OutboxStatsOptions): Promise<MemoryOutboxStats>;\n recoverStuckOutboxItems(options?: OutboxRecoveryOptions): Promise<OutboxRecoveryResult>;\n repairLegacyProjectScope(options?: ProjectScopeRepairOptions): Promise<ProjectScopeRepairResult>;\n getEventsByLevel(level: string, options?: { limit?: number; offset?: number }): Promise<MemoryEvent[]>;\n getEventLevel(eventId: string): Promise<string | null>;\n getSessionTurns(sessionId: string, options?: { limit?: number; offset?: number }): Promise<MemorySessionTurn[]>;\n getEventsByTurn(turnId: string): Promise<MemoryEvent[]>;\n countSessionTurns(sessionId: string): Promise<number>;\n backfillTurnIds(): Promise<number>;\n deleteSessionEvents(sessionId: string): Promise<number>;\n}\n\ninterface MemoryQueryServiceDeps {\n vectorStore: { count(): Promise<number> };\n graduation: { getStats(): Promise<Array<{ level: string; count: number }>> };\n}\n\n/**\n * Thin-core query service for lightweight read and maintenance paths.\n *\n * Higher-level retrieval orchestration lives in RetrievalOrchestrator;\n * this service keeps storage-backed read models and maintenance delegates separate.\n */\nexport class MemoryQueryService {\n constructor(\n private readonly initialize: () => Promise<void>,\n private readonly queryStore: QueryStore,\n private readonly deps?: MemoryQueryServiceDeps\n ) {}\n\n async keywordSearch(\n query: string,\n options?: { topK?: number; minScore?: number }\n ): Promise<Array<{ event: MemoryEvent; score: number }>> {\n await this.initialize();\n\n const results = await this.queryStore.keywordSearch(query, options?.topK ?? 10);\n if (results.length === 0) return [];\n\n const maxRank = Math.min(...results.map((r) => r.rank), -0.001);\n const minRank = Math.max(...results.map((r) => r.rank), -1000);\n const rankRange = maxRank - minRank || 1;\n\n return results\n .map((r) => ({\n event: r.event,\n score: 1 - (r.rank - minRank) / rankRange\n }))\n .filter((r) => !options?.minScore || r.score >= options.minScore);\n }\n\n async getSessionHistory(sessionId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.queryStore.getSessionEvents(sessionId);\n }\n\n async getRecentEvents(limit: number = 100): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.queryStore.getRecentEvents(limit);\n }\n\n async rebuildFtsIndex(): Promise<number> {\n await this.initialize();\n return this.getMaintenanceStore('rebuildFtsIndex').rebuildFtsIndex();\n }\n\n async getOutboxStats(options?: OutboxStatsOptions): Promise<MemoryOutboxStats> {\n await this.initialize();\n return this.getMaintenanceStore('getOutboxStats').getOutboxStats(options);\n }\n\n async recoverStuckOutboxItems(options?: OutboxRecoveryOptions): Promise<OutboxRecoveryResult> {\n await this.initialize();\n return this.getMaintenanceStore('recoverStuckOutboxItems').recoverStuckOutboxItems(options);\n }\n\n async repairLegacyProjectScope(options?: ProjectScopeRepairOptions): Promise<ProjectScopeRepairResult> {\n await this.initialize();\n return this.getMaintenanceStore('repairLegacyProjectScope').repairLegacyProjectScope(options);\n }\n\n async getStats(): Promise<MemoryStats> {\n await this.initialize();\n\n const deps = this.getStatsDeps();\n const recentEvents = await this.queryStore.getRecentEvents(10000);\n const vectorCount = await deps.vectorStore.count();\n const levelStats = await deps.graduation.getStats();\n\n return {\n totalEvents: recentEvents.length,\n vectorCount,\n levelStats\n };\n }\n\n async getEventsByLevel(level: string, options?: { limit?: number; offset?: number }): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.getMaintenanceStore('getEventsByLevel').getEventsByLevel(level, options);\n }\n\n async getEventLevel(eventId: string): Promise<string | null> {\n await this.initialize();\n return this.getMaintenanceStore('getEventLevel').getEventLevel(eventId);\n }\n\n async getSessionTurns(\n sessionId: string,\n options?: { limit?: number; offset?: number }\n ): Promise<MemorySessionTurn[]> {\n await this.initialize();\n return this.getMaintenanceStore('getSessionTurns').getSessionTurns(sessionId, options);\n }\n\n async getEventsByTurn(turnId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.getMaintenanceStore('getEventsByTurn').getEventsByTurn(turnId);\n }\n\n async countSessionTurns(sessionId: string): Promise<number> {\n await this.initialize();\n return this.getMaintenanceStore('countSessionTurns').countSessionTurns(sessionId);\n }\n\n async backfillTurnIds(): Promise<number> {\n await this.initialize();\n return this.getMaintenanceStore('backfillTurnIds').backfillTurnIds();\n }\n\n async deleteSessionEvents(sessionId: string): Promise<number> {\n await this.initialize();\n return this.getMaintenanceStore('deleteSessionEvents').deleteSessionEvents(sessionId);\n }\n\n private getMaintenanceStore(method: keyof QueryMaintenanceStore): QueryMaintenanceStore {\n const store = this.queryStore as QueryStore & Partial<QueryMaintenanceStore>;\n if (typeof store[method] !== 'function') {\n throw new Error(`MemoryQueryService requires queryStore.${String(method)}() for this operation`);\n }\n return store as QueryMaintenanceStore;\n }\n\n private getStatsDeps(): MemoryQueryServiceDeps {\n if (!this.deps) {\n throw new Error('MemoryQueryService requires vectorStore and graduation dependencies for getStats()');\n }\n return this.deps;\n }\n}\n", "/**\n * Retrieval quality guards.\n *\n * These are deliberately small deterministic heuristics used to avoid injecting\n * obviously irrelevant memories. They are not a second source of truth; they\n * only filter candidate retrieval results before context assembly.\n */\n\nconst COMMAND_ARTIFACT_PATTERNS = [\n /<\\/?(?:local-command-(?:stdout|stderr)|command-(?:name|message))\\b/i,\n /<command-name>[\\s\\S]*?<\\/command-name>/i,\n /<local-command-stdout>[\\s\\S]*?<\\/local-command-stdout>/i,\n /<local-command-stderr>[\\s\\S]*?<\\/local-command-stderr>/i\n];\n\nconst LOW_SIGNAL_CONTEXT_PATTERNS = [\n /<environment_context\\b[\\s\\S]*<\\/environment_context>/i,\n /<turn_aborted>/i,\n /^#\\s*AGENTS\\.md\\s+instructions\\b[\\s\\S]*<INSTRUCTIONS>/i,\n /^\\s*(?:understood[,\\s.]*)?(?:stopping|stopped|pausing|paused)\\s+here\\b[\\s\\S]{0,180}\\blet\\s+me\\s+know\\s+when\\s+you(?:'d|\\s+would)?\\s+like\\s+to\\s+continue\\b/i,\n /^\\s*\\[?CONTEXT\\s+COMPACTION\\s*[\u2014-]\\s*REFERENCE\\s+ONLY\\]?\\b[\\s\\S]{0,600}\\b(?:earlier\\s+turns\\s+were\\s+compacted|handoff\\s+from\\s+a\\s+previous\\s+context\\s+window|active\\s+task)\\b/i,\n /^\\s*Summary\\s+generation\\s+was\\s+unavailable\\.\\s*\\d+\\s+message\\(s\\)\\s+were\\s+removed\\s+to\\s+free\\s+context\\s+space\\b/i,\n /^\\s*---\\s*END\\s+OF\\s+CONTEXT\\s+SUMMARY\\b/i,\n /^\\s*\\[Your\\s+active\\s+task\\s+list\\s+was\\s+preserved\\s+across\\s+context\\s+compression\\]/i,\n /^\u279C\\s+\\S+\\s+git:\\([^)]*\\)\\s+/i,\n /^\\$\\s+\\S+/i\n];\n\nconst CONTINUATION_QUERY_PATTERNS = [\n /^\\s*(?:continue|resume|next|what(?:'s| is)? next|next\\s+(?:step|task|action)|recommended\\s+(?:next\\s+)?(?:step|task|action)|what should (?:we|i) do next)\\??\\s*$/i,\n /^\\s*(?:\uC751\\s*)?(?:\uC774\uC5B4\uC11C(?:\\s*\uC9C4\uD589(?:\uD574\uC918)?)?|\uACC4\uC18D(?:\\s*\uD574\uC918)?|\uB2E4\uC74C\\s*(?:\uB2E8\uACC4|\uC791\uC5C5|\uCD94\uCC9C\\s*\uC791\uC5C5|\uCD94\uCC9C|\uD560\\s*\uC77C)?(?:\uC740|\uB294)?(?:\\s*(?:\uBB50\uC57C|\uC9C4\uD589(?:\uD574\uC918)?))?\\??|\uB0A8\uC740\\s*(?:\uCD94\uAC00(?:\uB85C)?\\s*)?(?:(?:\uD560\\s*\uB9CC\uD55C\\s*)?(?:\uC791\uC5C5|\uC77C)|\uD560\\s*\uC77C)?(?:\uC740|\uB294)?\\s*(?:\uC788\uC5B4|\uC788\uB098|\uC788\uB098\uC694|\uBB50\uC57C)\\??|\uCD94\uCC9C\\s*\uC791\uC5C5(?:\uC740|\uB294)?(?:\\s*\uBB50\uC57C)?\\??|\uC9C4\uD589\uD574\uC918)\\s*$/i\n];\n\nconst SHORT_REPAIR_FOLLOW_UP_PATTERNS = [\n /^\\s*(?:fix\\s+(?:it|that)|repair\\s+(?:it|that)|resolve\\s+(?:it|that)|that\\s+bug|same\\s+issue)\\s*$/i,\n /^\\s*(?:\uADF8\uAC70|\uADF8\uAC83|\uC774\uAC70|\uC774\uAC83)?\\s*(?:\uACE0\uCCD0\uC918|\uC218\uC815\uD574\uC918|\uD574\uACB0\uD574\uC918|\uCC98\uB9AC\uD574\uC918)\\s*$/i\n];\n\nconst CURRENT_STATE_QUERY_PATTERNS = [\n /\\bcurrent\\b.*\\b(?:state|status|deployment|blocker|pr|pull request)\\b/i,\n /\\b(?:still|as current|current)\\b.*\\b(?:unresolved|open|pending|not completed)\\b/i,\n /\\b(?:old|obsolete|stale|resolved|already resolved)\\b.*\\b(?:current|still|unresolved|open|status)\\b/i,\n /(?:\uD604\uC7AC|\uC544\uC9C1|\uC774\uC804|\uC624\uB798\uB41C|\uD574\uACB0\uB41C).*(?:\uC0C1\uD0DC|\uBBF8\uD574\uACB0|\uC5F4\uB9B0|\uBE14\uB85C\uCEE4|PR|\uD480\uB9AC\uD018\uC2A4\uD2B8)/i\n];\n\nconst STALE_CONTENT_PATTERNS = [\n /\\b(?:obsolete|superseded|outdated)\\b/i,\n /\\bstale\\s+(?:operational\\s+)?state\\b/i,\n /\\bstale\\s+after\\b/i,\n /\\bno\\s+longer\\s+(?:valid|current|applies?)\\b/i,\n /\\bearlier\\s+(?:pull request|pr)\\b[\\s\\S]{0,160}\\b(?:open|not completed|had not completed)\\b/i,\n /\\bshould\\s+not\\s+be\\s+injected\\s+as\\s+current\\s+context\\b/i,\n /(?:\uC624\uB798\uB41C|\uB354 \uC774\uC0C1 \uC720\uD6A8\uD558\uC9C0|\uD604\uC7AC \uC0C1\uD0DC\uAC00 \uC544\uB2D8)/i\n];\n\nconst CONTINUATION_EXPANSION = 'current next step plan roadmap status validation replay rerank memory usefulness continuation';\nconst REPAIR_FOLLOW_UP_EXPANSION = 'review blocker fix pattern dashboard error state metrics bucket validation sanitize rerun unresolved';\nconst RETRIEVAL_PRIVACY_DECISION_EXPANSION = 'retrieval telemetry privacy public api dashboard dashboards rawQueryText queryText raw query text expose safe trace metadata trace id reason strategy rewrite kind aggregate count counts candidate selected public panel';\n\nconst DECISION_RECALL_TERMS = new Set([\n 'decide',\n 'decided',\n 'decision',\n 'agreed',\n 'policy',\n 'constraint'\n]);\n\nconst RETRIEVAL_PRIVACY_SURFACE_TERMS = new Set([\n 'retrieval',\n 'dashboard',\n 'telemetry',\n 'trace'\n]);\n\nconst DECISION_TOPIC_WEAK_TERMS = new Set([\n 'api',\n 'dashboard',\n 'retrieval',\n 'trace',\n 'telemetry',\n 'query',\n 'raw',\n 'count',\n 'counts'\n]);\n\nconst GENERIC_TECHNICAL_TERMS = new Set([\n 'api',\n 'cli',\n 'ui',\n 'json',\n 'jsonl',\n 'html',\n 'http',\n 'https',\n 'url',\n 'uri',\n 'id',\n 'ids',\n 'uuid',\n 'db',\n 'sql'\n]);\n\nconst LOW_INFORMATION_QUERY_TERMS = new Set([\n 'the',\n 'and',\n 'or',\n 'for',\n 'from',\n 'with',\n 'without',\n 'about',\n 'what',\n 'when',\n 'where',\n 'which',\n 'who',\n 'why',\n 'how',\n 'did',\n 'does',\n 'do',\n 'we',\n 'i',\n 'in',\n 'to',\n 'of',\n 'on',\n 'as',\n 'be',\n 'was',\n 'were',\n 'decide',\n 'decided',\n 'decision',\n 'agreed',\n 'policy',\n 'constraint',\n 'showing',\n 'can',\n 'you',\n 'me',\n 'show',\n 'tell',\n 'please',\n 'should',\n 'would',\n 'could',\n 'this',\n 'that',\n 'these',\n 'those',\n 'use',\n 'using',\n 'treat',\n 'continue',\n 'resume',\n 'next',\n 'step',\n 'task',\n 'action',\n 'current',\n 'state',\n 'status',\n 'old',\n 'already',\n 'still',\n 'near',\n 'today',\n '\uC751',\n '\uADF8\uAC70',\n '\uADF8\uAC83',\n '\uC774\uAC70',\n '\uC774\uAC83',\n '\uB2E4\uC74C',\n '\uB2E8\uACC4',\n '\uC9C4\uD589',\n '\uC9C4\uD589\uD574\uC918',\n '\uACC4\uC18D',\n '\uC774\uC5B4\uC11C',\n '\uACE0\uCCD0\uC918',\n '\uC218\uC815\uD574\uC918',\n '\uD574\uACB0\uD574\uC918'\n]);\n\nexport function isCommandArtifactQuery(query: string): boolean {\n const trimmed = query.trim();\n if (!trimmed) return false;\n const normalized = trimmed.toLowerCase();\n if (normalized.includes('local-command-stdout') || normalized.includes('local-command-stderr')) return true;\n if (normalized.includes('command-name') || normalized.includes('command-message')) return true;\n return COMMAND_ARTIFACT_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nexport function isCommandArtifactContent(content: string): boolean {\n const trimmed = content.trim();\n if (!trimmed) return false;\n const normalized = trimmed.toLowerCase();\n if (normalized.includes('local-command-stdout') || normalized.includes('local-command-stderr')) return true;\n if (normalized.includes('command-name') || normalized.includes('command-message')) return true;\n return COMMAND_ARTIFACT_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nexport function isLowSignalContextContent(content: string): boolean {\n const trimmed = content.trim();\n if (!trimmed) return true;\n if (isCommandArtifactContent(trimmed)) return true;\n if (LOW_SIGNAL_CONTEXT_PATTERNS.some((pattern) => pattern.test(trimmed))) return true;\n return false;\n}\n\nexport function isGenericContinuationQuery(query: string): boolean {\n const trimmed = query.trim();\n if (!trimmed) return false;\n if (!CONTINUATION_QUERY_PATTERNS.some((pattern) => pattern.test(trimmed))) return false;\n if (extractTechnicalQueryTerms(trimmed).length > 0) return false;\n\n const tokens = trimmed.match(/[A-Za-z0-9\uAC00-\uD7A3#._/-]+/g) ?? [];\n if (tokens.length > 10) return false;\n\n return !/[A-Za-z0-9_-]+\\.[A-Za-z0-9]+/.test(trimmed) &&\n !/(?:^|\\s)(?:feat|fix|chore|refactor|docs)\\/[A-Za-z0-9._-]+/.test(trimmed) &&\n !/[A-Za-z]:?[\\\\/]|\\/Users\\/|\\.\\/|\\.\\.\\//.test(trimmed);\n}\n\nexport function isShortRepairFollowUpQuery(query: string): boolean {\n const trimmed = query.trim();\n if (!trimmed) return false;\n if (extractTechnicalQueryTerms(trimmed).length > 0) return false;\n const tokens = trimmed.match(/[A-Za-z0-9\uAC00-\uD7A3#._/-]+/g) ?? [];\n if (tokens.length > 8) return false;\n return SHORT_REPAIR_FOLLOW_UP_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nexport function isLowConfidenceContextFallbackQuery(query: string): boolean {\n const trimmed = query.trim();\n if (!trimmed) return false;\n if (isGenericContinuationQuery(trimmed) || isShortRepairFollowUpQuery(trimmed)) return true;\n\n const terms = new Set(tokenizeQualityText(trimmed));\n if ((terms.has('compacted') || terms.has('compaction')) && terms.has('handoff')) return false;\n const hasContinuationRecall = /^(?:continue|resume)\\b/i.test(trimmed) &&\n (terms.has('work') || terms.has('step') || terms.has('task') || terms.has('last') || terms.has('completed'));\n const hasValidationGateRecall = terms.has('validation') &&\n (terms.has('gate') || terms.has('check')) &&\n (terms.has('run') || terms.has('before') || terms.has('commit') || terms.has('committing') || terms.has('change'));\n\n return hasContinuationRecall || hasValidationGateRecall;\n}\n\nexport function isCurrentStateQuery(query: string): boolean {\n const trimmed = query.trim();\n if (!trimmed) return false;\n return CURRENT_STATE_QUERY_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nexport function isStaleOrSupersededContent(content: string): boolean {\n const trimmed = content.trim();\n if (!trimmed) return false;\n return STALE_CONTENT_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nexport function buildRetrievalQualityQuery(query: string): string {\n const trimmed = query.trim();\n if (!trimmed) return query;\n if (isRetrievalPrivacyDecisionQuery(trimmed)) {\n return `${trimmed} ${RETRIEVAL_PRIVACY_DECISION_EXPANSION}`;\n }\n if (isGenericContinuationQuery(trimmed)) {\n return `${trimmed} ${CONTINUATION_EXPANSION}`;\n }\n if (isShortRepairFollowUpQuery(trimmed)) {\n return `${trimmed} ${REPAIR_FOLLOW_UP_EXPANSION}`;\n }\n return query;\n}\n\nexport function isRetrievalPrivacyDecisionQuery(query: string): boolean {\n const trimmed = query.trim();\n if (!trimmed) return false;\n\n const terms = new Set(tokenizeQualityText(trimmed));\n const hasDecisionSignal = hasAnyTerm(terms, DECISION_RECALL_TERMS) || /(?:\uACB0\uC815|\uC815\uCC45|\uC6D0\uCE59)/i.test(trimmed);\n if (!hasDecisionSignal) return false;\n\n const hasRawQuerySignal = terms.has('raw') && terms.has('query');\n const hasPrivacySignal = terms.has('privacy') || terms.has('expose') || terms.has('redacted');\n const hasRetrievalSurface = hasAnyTerm(terms, RETRIEVAL_PRIVACY_SURFACE_TERMS) ||\n (terms.has('api') && terms.has('query'));\n const hasQuerySurface = terms.has('query') && (\n terms.has('dashboard') ||\n terms.has('trace') ||\n terms.has('telemetry') ||\n terms.has('api')\n );\n const hasKoreanRetrievalSurface = /(?:\uAC80\uC0C9|\uB9AC\uD2B8\uB9AC\uBC8C|retrieval|\uB300\uC2DC\uBCF4\uB4DC|\uD2B8\uB808\uC774\uC2A4|\uD154\uB808\uBA54\uD2B8\uB9AC|telemetry)/i.test(trimmed);\n const hasKoreanPrivacySurface = /(?:\uC6D0\uBB38|\uCFFC\uB9AC|\uD504\uB77C\uC774\uBC84\uC2DC|\uAC1C\uC778\uC815\uBCF4|\uB178\uCD9C|\uD2B8\uB808\uC774\uC2A4|\uBA54\uD0C0\uB370\uC774\uD130)/i.test(trimmed);\n\n return (hasRetrievalSurface || (hasKoreanRetrievalSurface && hasKoreanPrivacySurface)) &&\n (hasRawQuerySignal || hasPrivacySignal || hasQuerySurface || hasKoreanPrivacySurface);\n}\n\nexport function extractTechnicalQueryTerms(query: string): string[] {\n const matches = query.match(/[A-Za-z][A-Za-z0-9_.:-]{2,}/g) ?? [];\n const terms = matches.filter((term) => {\n const lower = term.toLowerCase();\n if (GENERIC_TECHNICAL_TERMS.has(lower)) return false;\n return /[._:-]/.test(term) || /[a-z][A-Z]/.test(term) || /[A-Z]{2,}/.test(term) || /\\d/.test(term);\n });\n\n return Array.from(new Set(terms.map((term) => term.toLowerCase())));\n}\n\nexport function hasTechnicalTermOverlap(query: string, content: string): boolean {\n const terms = extractTechnicalQueryTerms(query);\n if (terms.length === 0) return true;\n\n const normalizedContent = content.toLowerCase();\n return terms.some((term) => normalizedContent.includes(term));\n}\n\nexport function hasDiscriminativeTermOverlap(query: string, content: string): boolean {\n const queryTerms = extractDiscriminativeQueryTerms(query);\n const contentTerms = new Set(tokenizeQualityText(content));\n if (isRetrievalPrivacyDecisionQuery(query) && hasRetrievalPrivacyDecisionContent(contentTerms)) {\n return true;\n }\n if (shouldRequireDecisionTopicOverlap(query)) {\n const topicTerms = queryTerms.filter((term) => !DECISION_TOPIC_WEAK_TERMS.has(term));\n if (topicTerms.length > 0) {\n return topicTerms.some((term) => contentTerms.has(term));\n }\n }\n if (queryTerms.length < 3) return true;\n const requiredHits = queryTerms.length >= 3 ? 2 : 1;\n let hits = 0;\n for (const term of queryTerms) {\n if (contentTerms.has(term)) hits += 1;\n if (hits >= requiredHits) return true;\n }\n return false;\n}\n\nexport function shouldApplyTechnicalGuard(query: string): boolean {\n return extractTechnicalQueryTerms(query).length > 0;\n}\n\nfunction hasAnyTerm(terms: Set<string>, expectedTerms: Set<string>): boolean {\n let found = false;\n expectedTerms.forEach((term) => {\n if (terms.has(term)) found = true;\n });\n return found;\n}\n\nfunction shouldRequireDecisionTopicOverlap(query: string): boolean {\n if (isRetrievalPrivacyDecisionQuery(query)) return false;\n const trimmed = query.trim();\n if (!trimmed) return false;\n const terms = new Set(tokenizeQualityText(trimmed));\n return hasAnyTerm(terms, DECISION_RECALL_TERMS) || /(?:\uACB0\uC815|\uC815\uCC45|\uC6D0\uCE59)/i.test(trimmed);\n}\n\nfunction extractDiscriminativeQueryTerms(query: string): string[] {\n const seen = new Set<string>();\n const terms: string[] = [];\n for (const token of tokenizeQualityText(query)) {\n if (LOW_INFORMATION_QUERY_TERMS.has(token)) continue;\n if (GENERIC_TECHNICAL_TERMS.has(token)) continue;\n if (seen.has(token)) continue;\n seen.add(token);\n terms.push(token);\n }\n return terms;\n}\n\nfunction hasRetrievalPrivacyDecisionContent(contentTerms: Set<string>): boolean {\n const hasDashboardTraceMetadata = contentTerms.has('dashboard') &&\n (contentTerms.has('trace') || contentTerms.has('metadata')) &&\n (\n contentTerms.has('safe') ||\n contentTerms.has('strategy') ||\n contentTerms.has('rewrite') ||\n contentTerms.has('candidate') ||\n contentTerms.has('selected') ||\n contentTerms.has('count') ||\n contentTerms.has('reason')\n );\n const hasRawQueryPrivacyPolicy = contentTerms.has('retrieval') &&\n (\n contentTerms.has('privacy') ||\n contentTerms.has('expose') ||\n (\n contentTerms.has('raw') &&\n contentTerms.has('query') &&\n (\n contentTerms.has('dashboard') ||\n contentTerms.has('telemetry') ||\n contentTerms.has('api') ||\n contentTerms.has('public')\n )\n )\n );\n return hasDashboardTraceMetadata || hasRawQueryPrivacyPolicy;\n}\n\nfunction tokenizeQualityText(text: string): string[] {\n return text\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .toLowerCase()\n .replace(/[^A-Za-z0-9\uAC00-\uD7A3\\s_.:-]/g, ' ')\n .split(/\\s+/)\n .flatMap((token) => token.split(/(?=[._:-])|(?<=[._:-])/g))\n .map((token) => normalizeQualityToken(token.replace(/^[._:-]+|[._:-]+$/g, '')))\n .filter((token) => token.length >= 2);\n}\n\nfunction normalizeQualityToken(token: string): string {\n if (token === 'apis') return 'api';\n if (token === 'ids') return 'id';\n if (LOW_INFORMATION_QUERY_TERMS.has(token) || GENERIC_TECHNICAL_TERMS.has(token)) return token;\n if (token.length > 4 && token.endsWith('ies')) return `${token.slice(0, -3)}y`;\n if (\n token.length > 3 &&\n token.endsWith('s') &&\n !token.endsWith('ss') &&\n !token.endsWith('us') &&\n !token.endsWith('is')\n ) {\n return token.slice(0, -1);\n }\n return token;\n}\n", "/**\n * Memory Retriever - Unified retrieval interface\n * Combines vector search, keyword search, scoped filtering, and matching\n */\n\nimport { EventStore } from './event-store.js';\nimport { VectorStore, SearchResult } from './vector-store.js';\nimport { Embedder } from './embedder.js';\nimport { Matcher } from './matcher.js';\nimport { SharedStore } from './shared-store.js';\nimport { SharedVectorStore } from './shared-vector-store.js';\nimport { GraduationPipeline } from './graduation.js';\nimport { FacetRepository } from './operations/facet-repository.js';\nimport { FacetDimensionSchema, type FacetDimension } from './operations/facets.js';\nimport {\n GraphPathService,\n type GraphPathResult\n} from './operations/graph-path-service.js';\nimport { QueryEntityExtractor } from './operations/query-entity-extractor.js';\nimport type { SQLiteDatabase } from './sqlite-wrapper.js';\nimport {\n hasTechnicalTermOverlap,\n isCommandArtifactQuery,\n isCurrentStateQuery,\n isLowConfidenceContextFallbackQuery,\n isLowSignalContextContent,\n isStaleOrSupersededContent,\n buildRetrievalQualityQuery,\n hasDiscriminativeTermOverlap,\n shouldApplyTechnicalGuard\n} from './retrieval-quality.js';\nimport {\n normalizeRetrievalDebugLanes,\n type RetrievalDebugLane\n} from './retrieval-debug-lanes.js';\nimport type { MemoryEvent, MatchResult, NodeType, SharedTroubleshootingEntry } from './types.js';\n\nexport type { RetrievalDebugLane, RetrievalDebugLaneName } from './retrieval-debug-lanes.js';\n\nexport interface RetrievalScope {\n sessionId?: string;\n eventTypes?: MemoryEvent['eventType'][];\n metadata?: Record<string, unknown>;\n canonicalKeyPrefix?: string;\n sessionIdPrefix?: string;\n contentIncludes?: string[];\n}\n\nexport type RetrievalStrategy = 'auto' | 'fast' | 'deep';\nexport type ProjectScopeMode = 'strict' | 'prefer' | 'global';\ntype DecayPolicy = NonNullable<RetrievalOptions['decayPolicy']>;\ntype GraphHopOptions = NonNullable<RetrievalOptions['graphHop']>;\n\nexport interface RetrievalFacetFilter {\n dimension: FacetDimension;\n value: string;\n}\n\nexport interface RetrievalDebugDetail {\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n facetMatches?: RetrievalFacetFilter[];\n graphPaths?: RetrievalGraphPathDebug[];\n lanes?: RetrievalDebugLane[];\n}\n\nexport interface RetrievalGraphPathDebug {\n startEntityId: string;\n startEntityTitle?: string;\n targetId: string;\n targetType: NodeType;\n hops: number;\n relationPath: string[];\n}\n\ntype DebuggableSearchResult = SearchResult & {\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n facetMatches?: RetrievalFacetFilter[];\n graphPaths?: RetrievalGraphPathDebug[];\n lanes?: RetrievalDebugLane[];\n};\n\nexport interface RetrievalOptions {\n topK: number;\n minScore: number;\n sessionId?: string;\n maxTokens: number;\n includeSessionContext: boolean;\n scope?: RetrievalScope;\n strategy?: RetrievalStrategy;\n rerankWithKeyword?: boolean;\n rerankWeights?: {\n semantic?: number;\n lexical?: number;\n recency?: number;\n };\n decayPolicy?: {\n enabled?: boolean;\n windowDays?: number;\n maxPenalty?: number;\n };\n intentRewrite?: boolean;\n graphHop?: {\n enabled?: boolean;\n maxHops?: number;\n hopPenalty?: number;\n };\n projectScopeMode?: ProjectScopeMode;\n projectHash?: string;\n allowedProjectHashes?: string[];\n facets?: RetrievalFacetFilter[];\n}\n\nexport interface RetrievalResult {\n memories: MemoryWithContext[];\n matchResult: MatchResult;\n totalTokens: number;\n context: string;\n fallbackTrace?: string[];\n selectedDebug?: RetrievalDebugDetail[];\n candidateDebug?: RetrievalDebugDetail[];\n rawQueryText?: string;\n effectiveQueryText?: string;\n queryRewriteKind?: string;\n}\n\nexport interface MemoryWithContext {\n event: MemoryEvent;\n score: number;\n sessionContext?: string;\n}\n\nexport interface UnifiedRetrievalOptions extends RetrievalOptions {\n includeShared?: boolean;\n projectHash?: string;\n}\n\nexport interface UnifiedRetrievalResult extends RetrievalResult {\n sharedMemories?: SharedTroubleshootingEntry[];\n}\n\nconst DEFAULT_OPTIONS: RetrievalOptions = {\n topK: 5,\n minScore: 0.7,\n maxTokens: 2000,\n includeSessionContext: true,\n strategy: 'auto',\n rerankWithKeyword: true,\n decayPolicy: {\n enabled: true,\n windowDays: 30,\n maxPenalty: 0.15\n },\n graphHop: {\n enabled: true,\n maxHops: 1,\n hopPenalty: 0.08\n },\n projectScopeMode: 'global'\n};\n\nexport interface SharedStoreOptions {\n sharedStore?: SharedStore;\n sharedVectorStore?: SharedVectorStore;\n queryGraphExpansionEnabled?: boolean;\n}\n\ntype EventStoreLike = EventStore & {\n keywordSearch?: (query: string, limit?: number) => Promise<Array<{ event: MemoryEvent; rank: number }>>;\n getDatabase?: () => SQLiteDatabase;\n};\n\nexport class Retriever {\n private readonly eventStore: EventStoreLike;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly matcher: Matcher;\n private sharedStore?: SharedStore;\n private sharedVectorStore?: SharedVectorStore;\n private graduation?: GraduationPipeline;\n private queryRewriter?: (query: string) => Promise<string | null>;\n private readonly queryGraphExpansionEnabled: boolean;\n\n constructor(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher,\n sharedOptions?: SharedStoreOptions\n ) {\n this.eventStore = eventStore as EventStoreLike;\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.matcher = matcher;\n this.sharedStore = sharedOptions?.sharedStore;\n this.sharedVectorStore = sharedOptions?.sharedVectorStore;\n this.queryGraphExpansionEnabled = sharedOptions?.queryGraphExpansionEnabled === true;\n }\n\n setGraduationPipeline(graduation: GraduationPipeline): void {\n this.graduation = graduation;\n }\n\n setSharedStores(sharedStore: SharedStore, sharedVectorStore: SharedVectorStore): void {\n this.sharedStore = sharedStore;\n this.sharedVectorStore = sharedVectorStore;\n }\n\n setQueryRewriter(rewriter: (query: string) => Promise<string | null>): void {\n this.queryRewriter = rewriter;\n }\n\n async retrieve(\n query: string,\n options: Partial<RetrievalOptions> = {}\n ): Promise<RetrievalResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const sessionFilter = opts.scope?.sessionId ?? opts.sessionId;\n const fallbackTrace: string[] = [];\n const qualityQuery = buildRetrievalQualityQuery(query);\n\n if (isCommandArtifactQuery(query)) {\n fallbackTrace.push('guard:command-artifact-query');\n const emptyMatch = this.matcher.matchSearchResults([], () => 0);\n return {\n memories: [],\n matchResult: emptyMatch,\n totalTokens: 0,\n context: '',\n fallbackTrace,\n selectedDebug: [],\n candidateDebug: []\n };\n }\n\n const fallbackEnabled = (opts.strategy ?? 'auto') === 'auto';\n\n // Stage 1: primary retrieval\n const primaryStrategy: RetrievalStrategy = opts.strategy === 'auto' ? 'fast' : (opts.strategy || 'fast');\n let current = await this.runStage(query, {\n qualityQuery,\n strategy: primaryStrategy,\n topK: opts.topK,\n minScore: opts.minScore,\n sessionId: sessionFilter,\n scope: opts.scope,\n rerankWithKeyword: opts.rerankWithKeyword !== false,\n rerankWeights: opts.rerankWeights,\n decayPolicy: opts.decayPolicy,\n intentRewrite: opts.intentRewrite === true,\n graphHop: opts.graphHop,\n projectScopeMode: opts.projectScopeMode,\n projectHash: opts.projectHash,\n allowedProjectHashes: opts.allowedProjectHashes,\n facets: opts.facets\n });\n fallbackTrace.push(`stage:primary:${primaryStrategy}`);\n\n // Stage 2: deep fallback\n if (fallbackEnabled && this.shouldFallback(current.matchResult, current.results) && primaryStrategy !== 'deep') {\n current = await this.runStage(query, {\n qualityQuery,\n strategy: 'deep',\n topK: opts.topK,\n minScore: opts.minScore,\n sessionId: sessionFilter,\n scope: opts.scope,\n rerankWithKeyword: opts.rerankWithKeyword !== false,\n rerankWeights: opts.rerankWeights,\n decayPolicy: opts.decayPolicy,\n graphHop: opts.graphHop,\n projectScopeMode: opts.projectScopeMode,\n projectHash: opts.projectHash,\n allowedProjectHashes: opts.allowedProjectHashes,\n facets: opts.facets\n });\n fallbackTrace.push('fallback:deep');\n }\n\n // Stage 3: scope-expanded deep fallback\n if (fallbackEnabled && this.shouldFallback(current.matchResult, current.results)) {\n current = await this.runStage(query, {\n qualityQuery,\n strategy: 'deep',\n topK: opts.topK,\n minScore: Math.max(0.5, opts.minScore - 0.15),\n sessionId: undefined,\n scope: undefined,\n rerankWithKeyword: true,\n rerankWeights: opts.rerankWeights,\n decayPolicy: opts.decayPolicy,\n graphHop: opts.graphHop,\n projectScopeMode: opts.projectScopeMode,\n projectHash: opts.projectHash,\n allowedProjectHashes: opts.allowedProjectHashes,\n facets: opts.facets\n });\n fallbackTrace.push('fallback:scope-expanded');\n }\n\n // Stage 4: summary fallback\n if (fallbackEnabled && this.shouldFallback(current.matchResult, current.results)) {\n const summary = await this.buildSummaryFallback(qualityQuery, opts.topK);\n const scopedSummary = await this.applyScopeFilters(summary, {\n scope: opts.scope,\n projectScopeMode: opts.projectScopeMode,\n projectHash: opts.projectHash,\n allowedProjectHashes: opts.allowedProjectHashes,\n facets: opts.facets\n });\n const filteredSummary = this.applyQualityFilters(scopedSummary, {\n query,\n minScore: opts.minScore\n });\n current = {\n results: filteredSummary,\n candidateResults: filteredSummary,\n matchResult: this.matcher.matchSearchResults(filteredSummary, () => 0)\n };\n fallbackTrace.push('fallback:summary');\n }\n\n const selectedResults = current.results.slice(0, opts.topK).filter((result) => {\n if (current.matchResult.confidence !== 'none') return true;\n if (isLowConfidenceContextFallbackQuery(query)) {\n return (result.semanticScore ?? result.score) >= 0.5 || result.score >= 0.5;\n }\n return (result.semanticScore ?? result.score) >= 0.62 || result.score >= 0.62;\n });\n const memories = await this.enrichResults(selectedResults, opts as RetrievalOptions, query);\n const context = this.buildContext(memories, opts.maxTokens);\n\n return {\n memories,\n matchResult: current.matchResult,\n totalTokens: this.estimateTokens(context),\n context,\n fallbackTrace,\n selectedDebug: selectedResults.map((r: DebuggableSearchResult) => this.debugDetailForResult(r)),\n candidateDebug: (current.candidateResults || []).slice(0, Math.max(opts.topK * 3, 20)).map((r: DebuggableSearchResult) => this.debugDetailForResult(r)),\n rawQueryText: current.queryRewriteKind ? query : undefined,\n effectiveQueryText: current.effectiveQueryText,\n queryRewriteKind: current.queryRewriteKind\n };\n }\n\n async retrieveUnified(\n query: string,\n options: Partial<UnifiedRetrievalOptions> = {}\n ): Promise<UnifiedRetrievalResult> {\n const projectResult = await this.retrieve(query, options);\n\n if (!options.includeShared || !this.sharedStore || !this.sharedVectorStore) {\n return projectResult;\n }\n\n try {\n const queryEmbedding = await this.embedder.embed(query);\n const sharedVectorResults = await this.sharedVectorStore.search(queryEmbedding.vector, {\n limit: options.topK || 5,\n minScore: options.minScore || 0.7,\n excludeProjectHash: options.projectHash\n });\n\n const sharedMemories: SharedTroubleshootingEntry[] = [];\n for (const result of sharedVectorResults) {\n const entry = await this.sharedStore.get(result.entryId);\n if (!entry) continue;\n if (!options.projectHash || entry.sourceProjectHash !== options.projectHash) {\n sharedMemories.push(entry);\n await this.sharedStore.recordUsage(entry.entryId);\n }\n }\n\n const unifiedContext = this.buildUnifiedContext(projectResult, sharedMemories);\n return {\n ...projectResult,\n context: unifiedContext,\n totalTokens: this.estimateTokens(unifiedContext),\n sharedMemories\n };\n } catch (error) {\n console.error('Shared search failed:', error);\n return projectResult;\n }\n }\n\n private async runStage(\n query: string,\n input: {\n qualityQuery?: string;\n strategy: RetrievalStrategy;\n topK: number;\n minScore: number;\n sessionId?: string;\n scope?: RetrievalScope;\n rerankWithKeyword?: boolean;\n rerankWeights?: {\n semantic?: number;\n lexical?: number;\n recency?: number;\n };\n decayPolicy?: DecayPolicy;\n intentRewrite?: boolean;\n graphHop?: GraphHopOptions;\n projectScopeMode?: ProjectScopeMode;\n projectHash?: string;\n allowedProjectHashes?: string[];\n facets?: RetrievalFacetFilter[];\n }\n ): Promise<{\n results: DebuggableSearchResult[];\n candidateResults: DebuggableSearchResult[];\n matchResult: MatchResult;\n effectiveQueryText?: string;\n queryRewriteKind?: string;\n }> {\n const searchQuery = input.qualityQuery ?? query;\n let rerankQuery = searchQuery;\n let effectiveQueryText: string | undefined;\n let queryRewriteKind: string | undefined;\n let initialResults = await this.searchByStrategy(searchQuery, {\n strategy: input.strategy,\n topK: input.topK,\n minScore: input.minScore,\n sessionId: input.sessionId\n });\n\n if (input.intentRewrite && input.strategy === 'deep' && this.queryRewriter) {\n const rewritten = (await this.queryRewriter(query))?.trim();\n const normalizedQuery = query.trim();\n if (rewritten && rewritten !== normalizedQuery) {\n effectiveQueryText = `${normalizedQuery} ${rewritten}`.trim();\n queryRewriteKind = 'intent-rewrite';\n rerankQuery = buildRetrievalQualityQuery(effectiveQueryText);\n const rewrittenResults = await this.searchByStrategy(buildRetrievalQualityQuery(rewritten), {\n strategy: 'deep',\n topK: input.topK,\n minScore: Math.max(0.5, input.minScore - 0.1),\n sessionId: input.sessionId\n });\n initialResults = this.mergeResults(initialResults, rewrittenResults, input.topK * 3);\n }\n }\n\n const expandedResults = input.graphHop?.enabled === false\n ? initialResults\n : await this.expandGraphHops(initialResults, {\n query,\n queryGraphEnabled: this.queryGraphExpansionEnabled,\n maxHops: clampGraphHops(input.graphHop?.maxHops ?? 1),\n hopPenalty: Math.max(0, input.graphHop?.hopPenalty ?? 0.08),\n limit: input.topK * 4,\n });\n\n const rerankedResults = input.rerankWithKeyword\n ? this.rerankByKeywordOverlap(expandedResults, rerankQuery, input.rerankWeights, input.decayPolicy)\n : expandedResults;\n\n const filtered = await this.applyScopeFilters(rerankedResults, {\n scope: input.scope,\n projectScopeMode: input.projectScopeMode,\n projectHash: input.projectHash,\n allowedProjectHashes: input.allowedProjectHashes,\n facets: input.facets\n });\n const qualityFiltered = this.applyQualityFilters(filtered, {\n query,\n minScore: input.minScore\n });\n const top = qualityFiltered.slice(0, input.topK);\n const matchResult = this.matcher.matchSearchResults(top, () => 0);\n\n return { results: top, candidateResults: qualityFiltered, matchResult, effectiveQueryText, queryRewriteKind };\n }\n\n private applyQualityFilters(\n results: DebuggableSearchResult[],\n options: { query: string; minScore: number }\n ): DebuggableSearchResult[] {\n let filtered = [...results];\n\n if (isCurrentStateQuery(options.query)) {\n filtered = filtered.filter((result) => !isStaleOrSupersededContent(result.content));\n }\n\n filtered = filtered.filter((result) => !isLowSignalContextContent(result.content));\n\n filtered = filtered.filter((result) =>\n this.isGraphPathResult(result) || hasDiscriminativeTermOverlap(options.query, result.content)\n );\n\n if (shouldApplyTechnicalGuard(options.query)) {\n filtered = filtered.filter((result) =>\n this.isGraphPathResult(result) || hasTechnicalTermOverlap(options.query, result.content)\n );\n }\n\n if (filtered.length <= 2) return filtered;\n\n const topScore = filtered[0].score;\n if (topScore < 0.8) return filtered;\n\n const cliffThreshold = Math.max(options.minScore, topScore - 0.25);\n return filtered.filter((result) => result.score >= cliffThreshold);\n }\n\n private mergeResults(primary: SearchResult[], secondary: SearchResult[], limit: number): SearchResult[] {\n const byId = new Map<string, SearchResult>();\n for (const row of primary) byId.set(row.eventId, row);\n for (const row of secondary) {\n const prev = byId.get(row.eventId);\n if (!prev || row.score > prev.score) {\n byId.set(row.eventId, row);\n }\n }\n return [...byId.values()].sort((a, b) => b.score - a.score).slice(0, limit);\n }\n\n private async expandGraphHops(\n seeds: SearchResult[],\n opts: { query: string; queryGraphEnabled: boolean; maxHops: number; hopPenalty: number; limit: number }\n ): Promise<DebuggableSearchResult[]> {\n const byId = new Map<string, DebuggableSearchResult>();\n for (const s of seeds) byId.set(s.eventId, s);\n\n let frontier = seeds.map((s) => ({ row: s, hop: 0 }));\n\n for (let hop = 1; hop <= opts.maxHops; hop += 1) {\n const next: Array<{ row: SearchResult; hop: number }> = [];\n\n for (const f of frontier) {\n const ev = await this.eventStore.getEvent(f.row.eventId);\n if (!ev) continue;\n const rel = ((ev.metadata as Record<string, unknown> | undefined)?.relatedEventIds ?? []) as unknown;\n const relatedIds = Array.isArray(rel)\n ? rel.filter((x): x is string => typeof x === 'string')\n : [];\n\n for (const rid of relatedIds) {\n if (byId.has(rid)) continue;\n const target = await this.eventStore.getEvent(rid);\n if (!target) continue;\n\n const score = Math.max(0, f.row.score - opts.hopPenalty * hop);\n const row: DebuggableSearchResult = {\n id: `hop-${hop}-${rid}`,\n eventId: target.id,\n content: target.content,\n score,\n sessionId: target.sessionId,\n eventType: target.eventType,\n timestamp: target.timestamp.toISOString(),\n lanes: [{ lane: 'graph_path', reason: 'relatedEventIds', score }]\n };\n\n byId.set(row.eventId, row);\n next.push({ row, hop });\n if (byId.size >= opts.limit) break;\n }\n if (byId.size >= opts.limit) break;\n }\n\n frontier = next;\n if (frontier.length === 0 || byId.size >= opts.limit) break;\n }\n\n if (opts.queryGraphEnabled) {\n await this.expandQueryGraphPaths(opts.query, byId, opts);\n }\n\n return [...byId.values()]\n .sort((a, b) => b.score - a.score || compareStable(a.eventId, b.eventId))\n .slice(0, opts.limit);\n }\n\n private async expandQueryGraphPaths(\n query: string,\n byId: Map<string, DebuggableSearchResult>,\n opts: { maxHops: number; hopPenalty: number; limit: number }\n ): Promise<void> {\n if (!query.trim() || !this.eventStore.getDatabase) return;\n\n try {\n const db = this.eventStore.getDatabase();\n const extraction = new QueryEntityExtractor(db).extract(query, {\n maxCandidates: Math.min(8, opts.limit),\n includeAliases: true\n });\n const startCandidates = extraction.candidates\n .filter((candidate) => candidate.entityId)\n .slice(0, 8);\n const startNodes = uniqueEntityStartNodes(startCandidates);\n if (startNodes.length === 0) return;\n\n const expansion = new GraphPathService(db).expand({\n startNodes: startNodes.map((node) => ({ type: 'entity' as const, id: node.entityId })),\n maxHops: opts.maxHops,\n maxResults: opts.limit,\n direction: 'both'\n });\n const titleByEntityId = new Map(startNodes.map((node) => [node.entityId, node.title] as const));\n\n for (const path of expansion.paths) {\n if (path.target.type !== 'event') continue;\n const target = await this.eventStore.getEvent(path.target.id);\n if (!target) continue;\n\n const graphPath = toRetrievalGraphPathDebug(path, titleByEntityId);\n const score = graphPathScore(path, opts.hopPenalty);\n const existing = byId.get(target.id);\n const graphPaths = mergeGraphPaths(existing?.graphPaths ?? [], [graphPath]);\n const graphLane: RetrievalDebugLane = {\n lane: 'graph_path',\n reason: `query_graph_path:${graphPath.relationPath.join('>') || 'linked'}`,\n score\n };\n const row: DebuggableSearchResult = {\n id: existing?.id ?? `graph-path-${path.hops}-${target.id}`,\n eventId: target.id,\n content: target.content,\n score: Math.max(existing?.score ?? 0, score),\n sessionId: target.sessionId,\n eventType: target.eventType,\n timestamp: target.timestamp.toISOString(),\n semanticScore: existing?.semanticScore,\n lexicalScore: existing?.lexicalScore,\n recencyScore: existing?.recencyScore,\n facetMatches: existing?.facetMatches,\n graphPaths,\n lanes: mergeRetrievalLanes(existing?.lanes ?? [], [graphLane])\n };\n byId.set(row.eventId, row);\n if (byId.size >= opts.limit) break;\n }\n } catch {\n // Legacy SQLite stores may not have operations graph tables yet. Retrieval\n // must remain available even when graph expansion cannot run.\n }\n }\n\n private shouldFallback(matchResult: MatchResult, results: SearchResult[]): boolean {\n if (results.length === 0) return true;\n if (matchResult.confidence === 'none') return true;\n return false;\n }\n\n private async buildSummaryFallback(query: string, topK: number): Promise<DebuggableSearchResult[]> {\n const recent = await this.eventStore.getRecentEvents(Math.max(topK * 6, 20));\n const q = this.tokenize(query);\n\n const ranked = recent\n .map((e) => ({ e, overlap: this.keywordOverlap(q, this.tokenize(e.content)) }))\n .filter((r) => r.overlap > 0)\n .sort((a, b) => b.overlap - a.overlap)\n .slice(0, topK)\n .map((row, idx) => {\n const score = Math.max(0.25, 0.6 - idx * 0.05);\n return withRetrievalLane({\n id: `summary-${row.e.id}`,\n eventId: row.e.id,\n content: row.e.content,\n score,\n sessionId: row.e.sessionId,\n eventType: row.e.eventType,\n timestamp: row.e.timestamp.toISOString()\n }, { lane: 'session_summary', reason: 'summary_fallback', score });\n });\n\n return ranked;\n }\n\n private async searchByStrategy(\n query: string,\n input: { strategy: RetrievalStrategy; topK: number; minScore: number; sessionId?: string }\n ): Promise<DebuggableSearchResult[]> {\n const strategy = input.strategy === 'auto' ? 'deep' : input.strategy;\n\n if (strategy === 'fast') {\n const keyword = await this.searchByKeyword(query, {\n limit: Math.max(5, input.topK * 3),\n sessionId: input.sessionId\n });\n return keyword;\n }\n\n const queryEmbedding = await this.embedder.embed(query);\n const vectorResults = await this.vectorStore.search(queryEmbedding.vector, {\n limit: Math.max(5, input.topK * 3),\n minScore: input.minScore,\n sessionId: input.sessionId\n });\n return vectorResults.map((result) => withRetrievalLane(result, {\n lane: 'raw_event',\n reason: 'vector_search',\n score: result.score\n }));\n }\n\n private async searchByKeyword(\n query: string,\n input: { limit: number; sessionId?: string }\n ): Promise<DebuggableSearchResult[]> {\n if (this.eventStore.keywordSearch) {\n const rows = await this.eventStore.keywordSearch(query, input.limit);\n const filtered = input.sessionId ? rows.filter((r) => r.event.sessionId === input.sessionId) : rows;\n return filtered.map((row, idx) => {\n const score = Math.max(0.4, 1 - idx * 0.04);\n return withRetrievalLane({\n id: `kw-${row.event.id}`,\n eventId: row.event.id,\n content: row.event.content,\n score,\n sessionId: row.event.sessionId,\n eventType: row.event.eventType,\n timestamp: row.event.timestamp.toISOString()\n }, { lane: 'raw_event', reason: 'keyword_search', score });\n });\n }\n\n const recent = await this.eventStore.getRecentEvents(input.limit * 4);\n const tokens = this.tokenize(query);\n const filtered = recent\n .filter((e) => (input.sessionId ? e.sessionId === input.sessionId : true))\n .map((e) => ({ e, overlap: this.keywordOverlap(tokens, this.tokenize(e.content)) }))\n .filter((r) => r.overlap > 0)\n .sort((a, b) => b.overlap - a.overlap)\n .slice(0, input.limit);\n\n return filtered.map((row, idx) => {\n const score = Math.max(0.3, 0.9 - idx * 0.05);\n return withRetrievalLane({\n id: `kw-fallback-${row.e.id}`,\n eventId: row.e.id,\n content: row.e.content,\n score,\n sessionId: row.e.sessionId,\n eventType: row.e.eventType,\n timestamp: row.e.timestamp.toISOString()\n }, { lane: 'raw_event', reason: 'keyword_fallback', score });\n });\n }\n\n private rerankByKeywordOverlap(\n results: SearchResult[],\n query: string,\n weights?: { semantic?: number; lexical?: number; recency?: number },\n decayPolicy?: { enabled?: boolean; windowDays?: number; maxPenalty?: number }\n ): SearchResult[] {\n const q = this.tokenize(query);\n const now = Date.now();\n\n const sw = Math.max(0, weights?.semantic ?? 0.7);\n const lw = Math.max(0, weights?.lexical ?? 0.2);\n const rw = Math.max(0, weights?.recency ?? 0.1);\n const total = sw + lw + rw || 1;\n\n const decayEnabled = decayPolicy?.enabled !== false;\n const decayWindow = Math.max(1, decayPolicy?.windowDays ?? 30);\n const decayMaxPenalty = Math.max(0, decayPolicy?.maxPenalty ?? 0.15);\n\n return [...results]\n .map((r) => {\n const overlap = this.keywordOverlap(q, this.tokenize(r.content));\n const recencyDays = Math.max(0, (now - new Date(r.timestamp).getTime()) / (1000 * 60 * 60 * 24));\n const recency = Math.max(0, 1 - recencyDays / decayWindow);\n let blended = (r.score * sw + overlap * lw + recency * rw) / total;\n\n if (decayEnabled && recencyDays > decayWindow && overlap < 0.5) {\n const ageFactor = Math.min(1, (recencyDays - decayWindow) / decayWindow);\n blended -= decayMaxPenalty * ageFactor;\n }\n\n return { ...r, score: Math.max(0, blended), semanticScore: r.score, lexicalScore: overlap, recencyScore: recency };\n })\n .sort((a, b) => b.score - a.score);\n }\n\n private async applyScopeFilters(\n results: DebuggableSearchResult[],\n options?: {\n scope?: RetrievalScope;\n projectScopeMode?: ProjectScopeMode;\n projectHash?: string;\n allowedProjectHashes?: string[];\n facets?: RetrievalFacetFilter[];\n }\n ): Promise<DebuggableSearchResult[]> {\n const scope = options?.scope;\n const projectScopeMode = options?.projectScopeMode ?? 'global';\n const facetFilters = this.normalizeFacetFilters(options?.facets);\n const allowedProjectHashes = new Set(\n [options?.projectHash, ...(options?.allowedProjectHashes || [])].filter(\n (value): value is string => typeof value === 'string' && value.length > 0\n )\n );\n\n if (!scope && projectScopeMode === 'global' && facetFilters === null) return results;\n\n const normalizedIncludes = (scope?.contentIncludes || []).map((s) => s.toLowerCase());\n const filtered: Array<{ result: DebuggableSearchResult; projectHash?: string }> = [];\n\n for (const result of results) {\n if (scope?.sessionId && result.sessionId !== scope.sessionId) continue;\n if (scope?.sessionIdPrefix && !result.sessionId.startsWith(scope.sessionIdPrefix)) continue;\n if (scope?.eventTypes && scope.eventTypes.length > 0 && !scope.eventTypes.includes(result.eventType as MemoryEvent['eventType'])) continue;\n\n const event = await this.eventStore.getEvent(result.eventId);\n if (!event) continue;\n\n if (scope?.canonicalKeyPrefix && !event.canonicalKey.startsWith(scope.canonicalKeyPrefix)) continue;\n if (normalizedIncludes.length > 0) {\n const lc = event.content.toLowerCase();\n if (!normalizedIncludes.some((needle) => lc.includes(needle))) continue;\n }\n if (scope?.metadata && !this.matchesMetadataScope(event.metadata, scope.metadata)) continue;\n\n const projectHash = this.extractProjectHash(event.metadata);\n filtered.push({ result, projectHash });\n }\n\n let scopedResults: DebuggableSearchResult[];\n if (projectScopeMode === 'global' || allowedProjectHashes.size === 0) {\n scopedResults = filtered.map((x) => x.result);\n } else {\n const projectMatched = filtered.filter((x) => x.projectHash && allowedProjectHashes.has(x.projectHash));\n scopedResults = projectScopeMode === 'strict'\n ? projectMatched.map((x) => x.result)\n : (projectMatched.length > 0 ? projectMatched : filtered).map((x) => x.result);\n }\n\n return this.applyFacetFilters(scopedResults, {\n facets: facetFilters,\n projectHash: options?.projectHash\n });\n }\n\n private normalizeFacetFilters(facets: RetrievalFacetFilter[] | undefined): RetrievalFacetFilter[] | null {\n if (!facets || facets.length === 0) return null;\n\n const normalized: RetrievalFacetFilter[] = [];\n for (const facet of facets) {\n const parsedDimension = FacetDimensionSchema.safeParse(facet.dimension);\n const value = typeof facet.value === 'string' ? facet.value.trim() : '';\n if (!parsedDimension.success || !value) return [];\n normalized.push({ dimension: parsedDimension.data, value });\n }\n\n return normalized;\n }\n\n private async applyFacetFilters(\n results: DebuggableSearchResult[],\n options: { facets: RetrievalFacetFilter[] | null; projectHash?: string }\n ): Promise<DebuggableSearchResult[]> {\n if (options.facets === null) return results;\n if (options.facets.length === 0) return [];\n if (!options.projectHash) return [];\n if (!this.eventStore.getDatabase) return [];\n\n const repo = new FacetRepository(this.eventStore.getDatabase());\n const filtered: DebuggableSearchResult[] = [];\n\n for (const result of results) {\n const matches: RetrievalFacetFilter[] = [];\n let matchedAll = true;\n for (const facet of options.facets) {\n const rows = await repo.query({\n targetType: 'event',\n targetId: result.eventId,\n dimension: facet.dimension,\n value: facet.value,\n projectHash: options.projectHash\n });\n if (rows.length === 0) {\n matchedAll = false;\n break;\n }\n matches.push(facet);\n }\n\n if (matchedAll) {\n const facetLanes: RetrievalDebugLane[] = matches.map((match) => ({\n lane: 'facet_match',\n reason: `${match.dimension}=${match.value}`\n }));\n filtered.push({\n ...result,\n facetMatches: matches,\n lanes: mergeRetrievalLanes(result.lanes ?? [], facetLanes)\n });\n }\n }\n\n return filtered;\n }\n\n private debugDetailForResult(result: DebuggableSearchResult): RetrievalDebugDetail {\n const detail: RetrievalDebugDetail = {\n eventId: result.eventId,\n score: result.score,\n semanticScore: result.semanticScore,\n lexicalScore: result.lexicalScore,\n recencyScore: result.recencyScore\n };\n if (result.facetMatches && result.facetMatches.length > 0) {\n detail.facetMatches = result.facetMatches;\n }\n if (result.graphPaths && result.graphPaths.length > 0) {\n detail.graphPaths = result.graphPaths;\n }\n if (result.lanes && result.lanes.length > 0) {\n detail.lanes = result.lanes;\n }\n return detail;\n }\n\n private isGraphPathResult(result: DebuggableSearchResult): boolean {\n return (result.graphPaths || []).length > 0;\n }\n\n private extractProjectHash(metadata: Record<string, unknown> | undefined): string | undefined {\n if (!metadata || typeof metadata !== 'object') return undefined;\n const scope = metadata.scope;\n if (!scope || typeof scope !== 'object') return undefined;\n const project = (scope as Record<string, unknown>).project;\n if (!project || typeof project !== 'object') return undefined;\n const hash = (project as Record<string, unknown>).hash;\n return typeof hash === 'string' && hash.length > 0 ? hash : undefined;\n }\n\n async retrieveFromSession(sessionId: string): Promise<MemoryEvent[]> {\n return this.eventStore.getSessionEvents(sessionId);\n }\n\n async retrieveRecent(limit: number = 100): Promise<MemoryEvent[]> {\n return this.eventStore.getRecentEvents(limit);\n }\n\n private async enrichResults(results: SearchResult[], options: RetrievalOptions, query: string): Promise<MemoryWithContext[]> {\n const memories: MemoryWithContext[] = [];\n\n for (const result of results) {\n const event = await this.eventStore.getEvent(result.eventId);\n if (!event) continue;\n\n if (this.graduation) {\n this.graduation.recordAccess(event.id, options.sessionId || 'unknown', result.score);\n }\n\n let sessionContext: string | undefined;\n if (options.includeSessionContext) {\n sessionContext = await this.getSessionContext(event.sessionId, event.id, query);\n }\n\n memories.push({ event, score: result.score, sessionContext });\n }\n\n return memories;\n }\n\n private async getSessionContext(sessionId: string, eventId: string, query: string): Promise<string | undefined> {\n const sessionEvents = await this.eventStore.getSessionEvents(sessionId);\n const eventIndex = sessionEvents.findIndex(e => e.id === eventId);\n if (eventIndex === -1) return undefined;\n\n const start = Math.max(0, eventIndex - 1);\n const end = Math.min(sessionEvents.length, eventIndex + 2);\n const contextEvents = sessionEvents.slice(start, end);\n if (contextEvents.length <= 1) return undefined;\n\n const suppressStaleState = isCurrentStateQuery(query);\n const contextLines = contextEvents\n .filter(e => e.id !== eventId)\n .filter(e => !isLowSignalContextContent(e.content))\n .filter(e => !(suppressStaleState && isStaleOrSupersededContent(e.content)))\n .map(e => `[${e.eventType}]: ${e.content.slice(0, 200)}...`);\n\n return contextLines.length > 0 ? contextLines.join('\\n') : undefined;\n }\n\n private buildUnifiedContext(projectResult: RetrievalResult, sharedMemories: SharedTroubleshootingEntry[]): string {\n let context = projectResult.context;\n if (sharedMemories.length === 0) return context;\n\n context += '\\n\\n## Cross-Project Knowledge\\n\\n';\n for (const memory of sharedMemories.slice(0, 3)) {\n context += `### ${memory.title}\\n`;\n if (memory.symptoms.length > 0) context += `**Symptoms:** ${memory.symptoms.join(', ')}\\n`;\n context += `**Root Cause:** ${memory.rootCause}\\n`;\n context += `**Solution:** ${memory.solution}\\n`;\n if (memory.technologies && memory.technologies.length > 0) context += `**Technologies:** ${memory.technologies.join(', ')}\\n`;\n context += `_Confidence: ${(memory.confidence * 100).toFixed(0)}%_\\n\\n`;\n }\n\n return context;\n }\n\n private buildContext(memories: MemoryWithContext[], maxTokens: number): string {\n const parts: string[] = [];\n let currentTokens = 0;\n\n for (const memory of memories) {\n const memoryText = this.formatMemory(memory);\n const memoryTokens = this.estimateTokens(memoryText);\n if (currentTokens + memoryTokens > maxTokens) break;\n parts.push(memoryText);\n currentTokens += memoryTokens;\n }\n\n if (parts.length === 0) return '';\n return `## Relevant Memories\\n\\n${parts.join('\\n\\n---\\n\\n')}`;\n }\n\n private formatMemory(memory: MemoryWithContext): string {\n const { event, score, sessionContext } = memory;\n const date = event.timestamp.toISOString().split('T')[0];\n\n let text = `**${event.eventType}** (${date}, score: ${score.toFixed(2)})\\n${event.content}`;\n if (sessionContext) text += `\\n\\n_Context:_ ${sessionContext}`;\n return text;\n }\n\n private matchesMetadataScope(\n metadata: Record<string, unknown> | undefined,\n expected: Record<string, unknown>\n ): boolean {\n if (!metadata) return false;\n\n return Object.entries(expected).every(([path, value]) => {\n const actual = path.split('.').reduce<unknown>((acc, key) => {\n if (typeof acc !== 'object' || acc === null) return undefined;\n return (acc as Record<string, unknown>)[key];\n }, metadata);\n\n return actual === value;\n });\n }\n\n private tokenize(text: string): string[] {\n return text\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]/gu, ' ')\n .split(/\\s+/)\n .map((token) => this.normalizeToken(token))\n .filter((t) => t.length >= 2)\n .slice(0, 64);\n }\n\n private normalizeToken(token: string): string {\n if (token === 'apis') return 'api';\n if (token === 'ids') return 'id';\n if (token === 'does') return token;\n if (token.length > 4 && token.endsWith('ies')) return `${token.slice(0, -3)}y`;\n if (\n token.length > 3 &&\n token.endsWith('s') &&\n !token.endsWith('ss') &&\n !token.endsWith('us') &&\n !token.endsWith('is') &&\n !token.endsWith('ps')\n ) {\n return token.slice(0, -1);\n }\n return token;\n }\n\n private keywordOverlap(a: string[], b: string[]): number {\n if (a.length === 0 || b.length === 0) return 0;\n const bs = new Set(b);\n let hit = 0;\n for (const t of a) if (bs.has(t)) hit += 1;\n return hit / a.length;\n }\n\n private estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n }\n}\n\nfunction withRetrievalLane(result: SearchResult, lane: RetrievalDebugLane): DebuggableSearchResult {\n const existing = (result as DebuggableSearchResult).lanes ?? [];\n return {\n ...result,\n lanes: mergeRetrievalLanes(existing, [lane])\n };\n}\n\nfunction mergeRetrievalLanes(\n existing: RetrievalDebugLane[],\n incoming: RetrievalDebugLane[]\n): RetrievalDebugLane[] {\n return normalizeRetrievalDebugLanes([...existing, ...incoming]);\n}\n\nfunction uniqueEntityStartNodes(\n candidates: Array<{ entityId?: string; text: string }>\n): Array<{ entityId: string; title: string }> {\n const seen = new Set<string>();\n const nodes: Array<{ entityId: string; title: string }> = [];\n for (const candidate of candidates) {\n if (!candidate.entityId || seen.has(candidate.entityId)) continue;\n seen.add(candidate.entityId);\n nodes.push({ entityId: candidate.entityId, title: candidate.text });\n }\n return nodes;\n}\n\nfunction toRetrievalGraphPathDebug(\n path: GraphPathResult,\n titleByEntityId: Map<string, string>\n): RetrievalGraphPathDebug {\n const firstStep = path.steps[0];\n const startNode = firstStep?.direction === 'incoming'\n ? firstStep.to\n : firstStep?.from;\n const startEntityId = startNode?.type === 'entity' ? startNode.id : '';\n\n return {\n startEntityId,\n startEntityTitle: titleByEntityId.get(startEntityId) ?? startNode?.name,\n targetId: path.target.id,\n targetType: path.target.type,\n hops: path.hops,\n relationPath: path.steps.map((step) => step.relationType)\n };\n}\n\nfunction graphPathScore(path: GraphPathResult, hopPenalty: number): number {\n const base = Math.min(0.95, Math.max(0, path.scoreContribution));\n return Math.max(0.05, base - hopPenalty * Math.max(0, path.hops - 1));\n}\n\nfunction clampGraphHops(maxHops: number): number {\n if (!Number.isFinite(maxHops)) return 2;\n return Math.min(Math.max(0, Math.trunc(maxHops)), 2);\n}\n\nfunction mergeGraphPaths(\n existing: RetrievalGraphPathDebug[],\n incoming: RetrievalGraphPathDebug[]\n): RetrievalGraphPathDebug[] {\n const byKey = new Map<string, RetrievalGraphPathDebug>();\n for (const path of [...existing, ...incoming]) {\n const key = [path.startEntityId, path.targetType, path.targetId, path.hops, ...path.relationPath].join('\\u0000');\n if (!byKey.has(key)) byKey.set(key, path);\n }\n return [...byKey.values()]\n .sort((a, b) => a.hops - b.hops || compareStable(graphPathSignature(a), graphPathSignature(b)))\n .slice(0, 3);\n}\n\nfunction graphPathSignature(path: RetrievalGraphPathDebug): string {\n return [path.startEntityId, path.targetType, path.targetId, path.hops, ...path.relationPath].join('|');\n}\n\nfunction compareStable(a: string, b: string): number {\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n}\n\nexport function createRetriever(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher,\n sharedOptions?: SharedStoreOptions\n): Retriever {\n return new Retriever(eventStore, vectorStore, embedder, matcher, sharedOptions);\n}\n", "/**\n * Retrieval Analytics Service\n *\n * Owns retrieval telemetry read-model and helpfulness evaluation workflows so\n * MemoryService can remain a thin facade over focused engine services.\n */\n\nimport type { RetrievalDebugLane } from '../retrieval-debug-lanes.js';\nimport type { MemoryEvent } from '../types.js';\n\nexport interface RetrievalTraceStats {\n totalQueries: number;\n avgCandidateCount: number;\n avgSelectedCount: number;\n selectionRate: number;\n rewrittenQueries?: number;\n rewriteRate?: number;\n rewrittenQueriesWithSelection?: number;\n rawQueriesWithSelection?: number;\n rewrittenSelectionRate?: number;\n rawSelectionRate?: number;\n avgSelectedCountForRewrittenQueries?: number;\n avgSelectedCountForRawQueries?: number;\n}\n\nexport interface HelpfulnessStats {\n avgScore: number;\n totalEvaluated: number;\n totalRetrievals: number;\n helpful: number;\n neutral: number;\n unhelpful: number;\n}\n\nexport interface HelpfulMemory {\n eventId: string;\n summary: string;\n helpfulnessScore: number;\n accessCount: number;\n evaluationCount: number;\n}\n\nexport interface RetrievalTraceDetail {\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n lanes?: RetrievalDebugLane[];\n}\n\nexport interface RetrievalTrace {\n traceId: string;\n sessionId?: string;\n projectHash?: string;\n queryText: string;\n rawQueryText?: string;\n queryRewriteKind?: string;\n strategy?: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n candidateDetails: RetrievalTraceDetail[];\n selectedDetails: RetrievalTraceDetail[];\n candidateCount: number;\n selectedCount: number;\n confidence?: string;\n fallbackTrace: string[];\n createdAt: Date;\n}\n\nexport interface AccessedMemory {\n memoryId: string;\n summary: string;\n topics: string[];\n accessCount: number;\n lastAccessed: string | null;\n confidence: number;\n createdAt: Date;\n}\n\ntype AccessedMemoryEvent = MemoryEvent & {\n access_count?: number;\n last_accessed_at?: string | null;\n};\n\nexport interface RetrievalAnalyticsStore {\n getRetrievalTraceStats(): Promise<RetrievalTraceStats>;\n getRecentRetrievalTraces(limit?: number): Promise<RetrievalTrace[]>;\n getMostAccessed(limit?: number): Promise<AccessedMemoryEvent[]>;\n evaluateSessionHelpfulness(sessionId: string): Promise<void>;\n getUnevaluatedSessions(currentSessionId: string, limit?: number): Promise<string[]>;\n getHelpfulMemories(limit?: number): Promise<HelpfulMemory[]>;\n getHelpfulnessStats(since?: Date): Promise<HelpfulnessStats>;\n}\n\nexport interface RetrievalAnalyticsServiceDeps {\n initialize: () => Promise<void>;\n retrievalStore: RetrievalAnalyticsStore;\n}\n\nexport class RetrievalAnalyticsService {\n constructor(private readonly deps: RetrievalAnalyticsServiceDeps) {}\n\n async getRetrievalTraceStats(): Promise<RetrievalTraceStats> {\n await this.deps.initialize();\n return this.deps.retrievalStore.getRetrievalTraceStats();\n }\n\n async getRecentRetrievalTraces(limit: number = 50): Promise<RetrievalTrace[]> {\n await this.deps.initialize();\n return this.deps.retrievalStore.getRecentRetrievalTraces(limit);\n }\n\n async getMostAccessedMemories(limit: number = 10): Promise<AccessedMemory[]> {\n // Preserve the historical lightweight path: SQLiteEventStore.getMostAccessed()\n // initializes itself and no-ops safely in read-only scenarios, so dashboard\n // access summaries should not trigger vector/embedder/worker initialization.\n const events = await this.deps.retrievalStore.getMostAccessed(limit);\n\n return events.map((event) => ({\n memoryId: event.id,\n summary: event.content.substring(0, 200) + (event.content.length > 200 ? '...' : ''),\n topics: this.extractTopicsFromContent(event.content),\n accessCount: event.access_count || 0,\n lastAccessed: event.last_accessed_at || null,\n confidence: 1.0,\n createdAt: event.timestamp,\n }));\n }\n\n async evaluateSessionHelpfulness(sessionId: string): Promise<void> {\n await this.deps.initialize();\n await this.deps.retrievalStore.evaluateSessionHelpfulness(sessionId);\n }\n\n async evaluatePendingSessions(currentSessionId: string, limit: number = 5): Promise<void> {\n await this.deps.initialize();\n const sessions = await this.deps.retrievalStore.getUnevaluatedSessions(currentSessionId, limit);\n\n for (const sessionId of sessions) {\n try {\n await this.deps.retrievalStore.evaluateSessionHelpfulness(sessionId);\n } catch {\n // Best-effort backfill: one broken session should not block hook startup.\n }\n }\n }\n\n async getHelpfulMemories(limit: number = 10): Promise<HelpfulMemory[]> {\n await this.deps.initialize();\n return this.deps.retrievalStore.getHelpfulMemories(limit);\n }\n\n async getHelpfulnessStats(since?: Date): Promise<HelpfulnessStats> {\n await this.deps.initialize();\n return this.deps.retrievalStore.getHelpfulnessStats(since);\n }\n\n /**\n * Extract topic keywords from event content (markdown headings and key terms).\n */\n private extractTopicsFromContent(content: string): string[] {\n const topics: Set<string> = new Set();\n\n const headings = content.match(/^#{1,3}\\s+(.+)$/gm);\n if (headings) {\n for (const heading of headings.slice(0, 5)) {\n const text = heading.replace(/^#+\\s+/, '').replace(/[*_`#]/g, '').trim();\n if (text.length > 2 && text.length < 50) {\n topics.add(text);\n }\n }\n }\n\n const boldTerms = content.match(/\\*\\*([^*]+)\\*\\*/g);\n if (boldTerms) {\n for (const boldTerm of boldTerms.slice(0, 5)) {\n const text = boldTerm.replace(/\\*\\*/g, '').trim();\n if (text.length > 2 && text.length < 30) {\n topics.add(text);\n }\n }\n }\n\n return Array.from(topics).slice(0, 5);\n }\n}\n\nexport function createRetrievalAnalyticsService(\n deps: RetrievalAnalyticsServiceDeps\n): RetrievalAnalyticsService {\n return new RetrievalAnalyticsService(deps);\n}\n", "/**\n * Retrieval Disclosure Service\n *\n * Provides a product-facing progressive disclosure surface on top of retrieval:\n * search -> expand -> source. Search returns compact, spec-aligned result\n * envelopes; expand adds surrounding context; source resolves to canonical raw\n * events or other source references.\n */\n\nimport type { RetrievalReason, RetrievalResultEnvelope, RetrievalResultType } from '../model/retrieval-result.js';\nimport { sanitizeGovernanceAuditValue } from '../operations/governance-audit.js';\nimport type { UnifiedRetrievalResult, MemoryWithContext, RetrievalDebugDetail } from '../retriever.js';\nimport type { MemoryEvent, SharedTroubleshootingEntry } from '../types.js';\nimport type { RetrieveMemoriesOptions } from './retrieval-orchestrator.js';\n\nexport type RetrievalDisclosureResultType = RetrievalResultType;\nexport type RetrievalDisclosureReason = RetrievalReason;\nexport type RetrievalDisclosureEnvelope = RetrievalResultEnvelope;\nexport type RetrievalDisclosureSourceType =\n | 'raw_event'\n | 'transcript'\n | 'tool_output'\n | 'imported_history'\n | 'shared_troubleshooting';\n\nexport interface RetrievalDisclosureSearchResponse {\n results: RetrievalResultEnvelope[];\n meta: {\n total: number;\n usedVector: boolean;\n usedKeyword: boolean;\n fallbackApplied: boolean;\n confidence?: UnifiedRetrievalResult['matchResult']['confidence'];\n totalTokens?: number;\n fallbackTrace?: string[];\n };\n}\n\nexport interface RetrievalDisclosureSourceReference {\n sourceRef: string;\n sourceType: RetrievalDisclosureSourceType;\n eventIds: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface RetrievalDisclosureExpansion {\n target: RetrievalResultEnvelope;\n surroundingFacts?: RetrievalResultEnvelope[];\n summaries?: RetrievalResultEnvelope[];\n relatedSources?: RetrievalDisclosureSourceReference[];\n expandedContext?: string;\n}\n\nexport interface RetrievalDisclosureSource extends RetrievalDisclosureSourceReference {\n rawEvents: MemoryEvent[];\n primaryEvent?: MemoryEvent;\n}\n\nexport interface RetrievalDisclosureSearchOptions extends RetrieveMemoriesOptions {}\n\nexport interface RetrievalDisclosureExpandOptions {\n windowSize?: number;\n}\n\nexport interface RetrievalDisclosureOrchestrator {\n retrieveMemories(\n query: string,\n options?: RetrievalDisclosureSearchOptions\n ): Promise<UnifiedRetrievalResult>;\n}\n\nexport interface RetrievalDisclosureEventStore {\n getEvent(id: string): Promise<MemoryEvent | null>;\n getSessionEvents(sessionId: string): Promise<MemoryEvent[]>;\n}\n\nexport interface RetrievalDisclosureSharedStore {\n get(entryId: string): Promise<SharedTroubleshootingEntry | null>;\n}\n\nexport interface RetrievalDisclosureServiceDeps {\n initialize: () => Promise<void>;\n retrievalOrchestrator: RetrievalDisclosureOrchestrator;\n eventStore: RetrievalDisclosureEventStore;\n sharedStore?: RetrievalDisclosureSharedStore;\n}\n\nexport class RetrievalDisclosureService {\n constructor(private readonly deps: RetrievalDisclosureServiceDeps) {}\n\n async search(\n query: string,\n options?: RetrievalDisclosureSearchOptions\n ): Promise<RetrievalDisclosureSearchResponse> {\n const result = await this.deps.retrievalOrchestrator.retrieveMemories(query, options);\n const debugByEventId = this.buildDebugIndex(result);\n const projectResults = result.memories.map((memory) => this.memoryToEnvelope(\n memory,\n result,\n debugByEventId.get(memory.event.id)\n ));\n const sharedResults = (result.sharedMemories || []).map((entry) => this.sharedToEnvelope(entry));\n const results = [...projectResults, ...sharedResults];\n\n return {\n results,\n meta: {\n total: results.length,\n usedVector: this.usedVector(result),\n usedKeyword: this.usedKeyword(result),\n fallbackApplied: this.fallbackApplied(result),\n confidence: result.matchResult.confidence,\n totalTokens: result.totalTokens,\n fallbackTrace: result.fallbackTrace || []\n }\n };\n }\n\n async expand(\n resultId: string,\n options?: RetrievalDisclosureExpandOptions\n ): Promise<RetrievalDisclosureExpansion | null> {\n const parsedId = parseDisclosureResultRef(resultId);\n if (parsedId.kind === 'shared') {\n return this.expandShared(parsedId.entryId);\n }\n\n const targetEvent = await this.deps.eventStore.getEvent(parsedId.eventId);\n if (!targetEvent) return null;\n\n const windowSize = Math.max(0, options?.windowSize ?? 3);\n const sessionEvents = (await this.deps.eventStore.getSessionEvents(targetEvent.sessionId))\n .slice()\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n const targetIndex = sessionEvents.findIndex((event) => event.id === targetEvent.id);\n const surroundingEvents = targetIndex === -1\n ? []\n : sessionEvents.slice(\n Math.max(0, targetIndex - windowSize),\n Math.min(sessionEvents.length, targetIndex + windowSize + 1)\n );\n const nearbyEvents = surroundingEvents.length > 0 ? surroundingEvents : [targetEvent];\n const nonTargetEvents = nearbyEvents.filter((event) => event.id !== targetEvent.id);\n\n return {\n target: this.eventToEnvelope(targetEvent, 1, ['continuity_link']),\n surroundingFacts: nonTargetEvents.map((event) => this.eventToEnvelope(event, 1, this.reasonsForContextEvent(event))),\n summaries: nonTargetEvents\n .filter((event) => event.eventType === 'session_summary')\n .map((event) => this.eventToEnvelope(event, 1, ['summary_fallback'])),\n relatedSources: nearbyEvents.map((event) => this.sourceReferenceForEvent(event)),\n expandedContext: this.formatTimelineContext(nearbyEvents)\n };\n }\n\n async source(resultId: string): Promise<RetrievalDisclosureSource | null> {\n const parsedId = parseDisclosureResultRef(resultId);\n if (parsedId.kind === 'shared') {\n return this.sourceShared(parsedId.entryId);\n }\n\n const rawEvent = await this.deps.eventStore.getEvent(parsedId.eventId);\n if (!rawEvent) return null;\n\n return {\n ...this.sourceReferenceForEvent(rawEvent),\n rawEvents: [rawEvent],\n primaryEvent: rawEvent\n };\n }\n\n private async expandShared(entryId: string): Promise<RetrievalDisclosureExpansion | null> {\n const entry = await this.deps.sharedStore?.get(entryId);\n if (!entry) return null;\n\n return {\n target: this.sharedToEnvelope(entry),\n surroundingFacts: [],\n summaries: [],\n relatedSources: [this.sourceReferenceForShared(entry)],\n expandedContext: this.formatSharedContext(entry)\n };\n }\n\n private async sourceShared(entryId: string): Promise<RetrievalDisclosureSource | null> {\n const entry = await this.deps.sharedStore?.get(entryId);\n if (!entry) return null;\n\n const sourceReference = this.sourceReferenceForShared(entry);\n return {\n ...sourceReference,\n rawEvents: [],\n metadata: {\n ...sourceReference.metadata,\n symptoms: entry.symptoms,\n rootCause: entry.rootCause,\n solution: entry.solution,\n technologies: entry.technologies,\n confidence: entry.confidence,\n usageCount: entry.usageCount\n }\n };\n }\n\n private memoryToEnvelope(\n memory: MemoryWithContext,\n result: UnifiedRetrievalResult,\n debug?: RetrievalDebugDetail\n ): RetrievalResultEnvelope {\n return this.eventToEnvelope(\n memory.event,\n memory.score,\n this.inferReasons(memory, result, debug),\n {\n semanticScore: debug?.semanticScore,\n lexicalScore: debug?.lexicalScore,\n recencyScore: debug?.recencyScore,\n ...(debug?.facetMatches && debug.facetMatches.length > 0 ? { facetMatches: debug.facetMatches } : {}),\n ...(debug?.graphPaths && debug.graphPaths.length > 0 ? { graphPaths: this.sanitizeGraphPaths(debug.graphPaths) } : {})\n }\n );\n }\n\n private sanitizeGraphPaths(graphPaths: RetrievalDebugDetail['graphPaths']): unknown {\n return sanitizeGovernanceAuditValue(graphPaths ?? []);\n }\n\n private eventToEnvelope(\n event: MemoryEvent,\n score: number,\n reasons: RetrievalDisclosureReason[],\n extraMetadata?: Record<string, unknown>\n ): RetrievalResultEnvelope {\n return {\n id: toDisclosureResultId(event.id),\n resultType: this.resultTypeForEvent(event),\n title: this.titleForEvent(event),\n snippet: this.preview(event.content, 240),\n score,\n reasons,\n sourceRef: toDisclosureResultId(event.id),\n sessionId: event.sessionId,\n metadata: {\n eventId: event.id,\n eventType: event.eventType,\n timestamp: event.timestamp.toISOString(),\n canonicalKey: event.canonicalKey,\n ...event.metadata,\n ...extraMetadata\n }\n };\n }\n\n private sharedToEnvelope(entry: SharedTroubleshootingEntry): RetrievalResultEnvelope {\n return {\n id: `shared:${entry.entryId}`,\n resultType: 'rule',\n title: entry.title,\n snippet: this.preview(entry.solution || entry.rootCause || entry.symptoms.join(' '), 240),\n score: entry.confidence,\n reasons: ['semantic_match'],\n sourceRef: `shared:${entry.entryId}`,\n metadata: {\n sourceProjectHash: entry.sourceProjectHash,\n sourceEntryId: entry.sourceEntryId,\n topics: entry.topics,\n technologies: entry.technologies,\n confidence: entry.confidence,\n usageCount: entry.usageCount\n }\n };\n }\n\n private buildDebugIndex(result: UnifiedRetrievalResult): Map<string, RetrievalDebugDetail> {\n const byEventId = new Map<string, RetrievalDebugDetail>();\n\n for (const detail of result.candidateDebug || []) {\n byEventId.set(detail.eventId, detail);\n }\n for (const detail of result.selectedDebug || []) {\n byEventId.set(detail.eventId, detail);\n }\n\n return byEventId;\n }\n\n private inferReasons(\n memory: MemoryWithContext,\n result: UnifiedRetrievalResult,\n debug?: RetrievalDebugDetail\n ): RetrievalDisclosureReason[] {\n const reasons = new Set<RetrievalDisclosureReason>();\n\n const usedVector = this.usedVector(result);\n const usedKeyword = this.usedKeyword(result);\n\n if (usedVector && (debug?.semanticScore ?? 0) > 0) reasons.add('semantic_match');\n if ((debug?.lexicalScore ?? 0) > 0 || usedKeyword) reasons.add('keyword_match');\n if ((debug?.recencyScore ?? 0) > 0) reasons.add('recent_relevance');\n if ((debug?.facetMatches || []).length > 0) reasons.add('facet_match');\n if ((debug?.graphPaths || []).length > 0) reasons.add('entity_overlap');\n if ((result.fallbackTrace || []).some((step) => step === 'fallback:summary')) reasons.add('summary_fallback');\n if (memory.sessionContext) reasons.add('continuity_link');\n if (memory.event.eventType === 'tool_observation') reasons.add('tool_followup');\n if (reasons.size === 0) reasons.add(usedVector ? 'semantic_match' : 'keyword_match');\n\n return Array.from(reasons);\n }\n\n private reasonsForContextEvent(event: MemoryEvent): RetrievalDisclosureReason[] {\n if (event.eventType === 'tool_observation') return ['tool_followup'];\n if (event.eventType === 'session_summary') return ['summary_fallback'];\n return ['continuity_link'];\n }\n\n private resultTypeForEvent(event: MemoryEvent): RetrievalDisclosureResultType {\n if (event.eventType === 'session_summary') return 'summary';\n if (event.eventType === 'tool_observation') return 'tool_evidence';\n return 'source';\n }\n\n private sourceReferenceForEvent(event: MemoryEvent): RetrievalDisclosureSourceReference {\n return {\n sourceRef: toDisclosureResultId(event.id),\n sourceType: this.sourceTypeForEvent(event),\n eventIds: [event.id]\n };\n }\n\n private sourceReferenceForShared(entry: SharedTroubleshootingEntry): RetrievalDisclosureSourceReference {\n return {\n sourceRef: `shared:${entry.entryId}`,\n sourceType: 'shared_troubleshooting',\n eventIds: [],\n metadata: {\n sourceProjectHash: entry.sourceProjectHash,\n sourceEntryId: entry.sourceEntryId,\n topics: entry.topics\n }\n };\n }\n\n private sourceTypeForEvent(event: MemoryEvent): RetrievalDisclosureSourceType {\n const metadata = event.metadata || {};\n if (event.eventType === 'tool_observation') return 'tool_output';\n if (typeof metadata.transcriptPath === 'string') return 'transcript';\n if (typeof metadata.importedFrom === 'string') return 'imported_history';\n return 'raw_event';\n }\n\n private titleForEvent(event: MemoryEvent): string {\n if (event.eventType === 'session_summary') return 'Session summary';\n if (event.eventType === 'tool_observation') return 'Tool evidence';\n if (event.eventType === 'agent_response') return 'Agent response';\n return 'User prompt';\n }\n\n private usedVector(result: UnifiedRetrievalResult): boolean {\n return (result.fallbackTrace || []).some((step) => step.includes(':deep'));\n }\n\n private usedKeyword(result: UnifiedRetrievalResult): boolean {\n return (result.fallbackTrace || []).some((step) => step.includes(':fast')) ||\n [...(result.selectedDebug || []), ...(result.candidateDebug || [])]\n .some((detail) => (detail.lexicalScore ?? 0) > 0);\n }\n\n private fallbackApplied(result: UnifiedRetrievalResult): boolean {\n return (result.fallbackTrace || []).some((step) => step.includes('fallback'));\n }\n\n private formatTimelineContext(events: MemoryEvent[]): string {\n return events\n .map((event) => `[${event.eventType}] ${event.content}`)\n .join('\\n\\n');\n }\n\n private formatSharedContext(entry: SharedTroubleshootingEntry): string {\n return [\n `[shared_troubleshooting] ${entry.title}`,\n `Symptoms: ${entry.symptoms.join('; ')}`,\n `Root cause: ${entry.rootCause}`,\n `Solution: ${entry.solution}`,\n `Topics: ${entry.topics.join(', ')}`\n ].join('\\n');\n }\n\n private preview(content: string, maxLength: number): string {\n const normalized = content.replace(/\\s+/g, ' ').trim();\n if (normalized.length <= maxLength) return normalized;\n return `${normalized.slice(0, Math.max(0, maxLength - 3))}...`;\n }\n}\n\nexport function toDisclosureResultId(eventId: string): string {\n return eventId.startsWith('event:') ? eventId : `event:${eventId}`;\n}\n\nexport type ParsedDisclosureResultId =\n | { kind: 'event'; eventId: string }\n | { kind: 'shared'; entryId: string };\n\nexport function parseDisclosureResultId(resultId: string): string {\n return resultId.startsWith('event:') ? resultId.slice('event:'.length) : resultId;\n}\n\nexport function parseDisclosureResultRef(resultId: string): ParsedDisclosureResultId {\n if (resultId.startsWith('shared:')) {\n return { kind: 'shared', entryId: resultId.slice('shared:'.length) };\n }\n return {\n kind: 'event',\n eventId: parseDisclosureResultId(resultId)\n };\n}\n\nexport function createRetrievalDisclosureService(\n deps: RetrievalDisclosureServiceDeps\n): RetrievalDisclosureService {\n return new RetrievalDisclosureService(deps);\n}\n", "/**\n * Retrieval Orchestrator\n *\n * Coordinates MemoryService-level retrieval concerns around the lower-level\n * Retriever: initialization, rerank policy, project/shared scoping, optional\n * intent rewriting, and non-blocking retrieval trace telemetry.\n */\n\nimport {\n Retriever,\n type ProjectScopeMode,\n type RetrievalFacetFilter,\n type RetrievalResult,\n type RetrievalStrategy,\n type UnifiedRetrievalResult\n} from '../retriever.js';\nimport type { RetrievalDebugLane } from '../retrieval-debug-lanes.js';\nimport type { MemoryOperationsConfig } from '../types.js';\n\nexport interface RetrieveMemoriesOptions {\n topK?: number;\n minScore?: number;\n sessionId?: string;\n includeShared?: boolean;\n adaptiveRerank?: boolean;\n intentRewrite?: boolean;\n projectScopeMode?: ProjectScopeMode;\n allowedProjectHashes?: string[];\n facets?: RetrievalFacetFilter[];\n strategy?: RetrievalStrategy;\n graphHop?: {\n enabled?: boolean;\n maxHops?: number;\n hopPenalty?: number;\n };\n /**\n * Disable automatic retrieval trace writes for read-only/navigation callers\n * that may receive secret-bearing ad-hoc queries.\n */\n recordTrace?: boolean;\n}\n\nexport interface RecordQueryTraceInput {\n sessionId: string;\n queryText: string;\n rawQueryText?: string;\n queryRewriteKind?: string;\n strategy: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n confidence: string;\n}\n\ninterface HelpfulnessStats {\n avgScore: number;\n totalEvaluated: number;\n totalRetrievals: number;\n helpful: number;\n neutral: number;\n unhelpful: number;\n}\n\ntype RerankWeights = {\n semantic: number;\n lexical: number;\n recency: number;\n};\n\ninterface RetrievalTraceDetail {\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n lanes?: RetrievalDebugLane[];\n}\n\nexport interface RetrievalTraceStore {\n getHelpfulnessStats(): Promise<HelpfulnessStats>;\n recordRetrievalTrace(input: {\n sessionId?: string;\n projectHash?: string;\n queryText: string;\n rawQueryText?: string;\n queryRewriteKind?: string;\n strategy?: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n candidateDetails?: RetrievalTraceDetail[];\n selectedDetails?: RetrievalTraceDetail[];\n confidence?: string;\n fallbackTrace?: string[];\n }): Promise<void>;\n}\n\nexport interface RetrievalAccessStore {\n incrementAccessCount(eventIds: string[]): Promise<void>;\n recordRetrieval(eventId: string, sessionId: string, score: number, query: string): Promise<void>;\n}\n\nexport interface RetrievalOrchestratorDeps {\n initialize: () => Promise<void>;\n retriever: Retriever;\n traceStore: RetrievalTraceStore;\n accessStore: RetrievalAccessStore;\n getProjectHash: () => string | null;\n hasSharedStore: () => boolean;\n memoryOperationsConfig?: MemoryOperationsConfig;\n}\n\nexport class RetrievalOrchestrator {\n constructor(private readonly deps: RetrievalOrchestratorDeps) {\n this.deps.retriever.setQueryRewriter((query) => this.rewriteQueryIntent(query));\n }\n\n /**\n * Retrieve relevant memories for a query.\n */\n async retrieveMemories(\n query: string,\n options?: RetrieveMemoriesOptions\n ): Promise<UnifiedRetrievalResult> {\n const { recordTrace = true, ...retrieverOptions } = options ?? {};\n const lightweightFastRead = this.isLightweightFastRead(options);\n if (!lightweightFastRead) {\n await this.deps.initialize();\n }\n\n // Note: Pending embeddings are processed by the background worker.\n // Don't block retrieval - search with whatever vectors are available.\n const rerankWeights = lightweightFastRead\n ? undefined\n : await this.getRerankWeights(options?.adaptiveRerank === true);\n const projectHash = this.deps.getProjectHash();\n const projectScopeMode = retrieverOptions.projectScopeMode ?? (projectHash ? 'strict' : 'global');\n const graphHop = this.resolveGraphHopOptions(retrieverOptions.graphHop);\n\n let result: UnifiedRetrievalResult;\n\n if (retrieverOptions.includeShared && this.deps.hasSharedStore()) {\n result = await this.deps.retriever.retrieveUnified(query, {\n ...retrieverOptions,\n intentRewrite: retrieverOptions.intentRewrite === true,\n rerankWeights,\n includeShared: true,\n graphHop,\n projectHash: projectHash || undefined,\n projectScopeMode,\n allowedProjectHashes: retrieverOptions.allowedProjectHashes\n });\n } else {\n result = await this.deps.retriever.retrieve(query, {\n ...retrieverOptions,\n intentRewrite: retrieverOptions.intentRewrite === true,\n rerankWeights,\n graphHop,\n projectHash: projectHash || undefined,\n projectScopeMode,\n allowedProjectHashes: retrieverOptions.allowedProjectHashes\n });\n }\n\n if (recordTrace) {\n try {\n await this.recordAutomaticTrace(query, result, options, projectHash);\n } catch {\n // Non-blocking telemetry.\n }\n }\n\n return result;\n }\n\n /**\n * Format retrieval results as context for Claude.\n */\n formatAsContext(result: RetrievalResult): string {\n if (!result.context) {\n return '';\n }\n\n const confidence = result.matchResult.confidence;\n let header = '';\n\n if (confidence === 'high') {\n header = '\uD83C\uDFAF **High-confidence memory match found:**\\n\\n';\n } else if (confidence === 'suggested') {\n header = '\uD83D\uDCA1 **Suggested memories (may be relevant):**\\n\\n';\n }\n\n return header + result.context;\n }\n\n /**\n * Record a query-level retrieval trace used by hooks and dashboard stats.\n */\n async recordQueryTrace(input: RecordQueryTraceInput): Promise<void> {\n await this.deps.initialize();\n await this.deps.traceStore.recordRetrievalTrace({\n ...input,\n projectHash: this.deps.getProjectHash() || undefined,\n candidateDetails: [],\n selectedDetails: [],\n fallbackTrace: [],\n });\n }\n\n /**\n * Increment access count for memories that were injected into prompts.\n *\n * Access count writes are intentionally store-scoped: the SQLite access store\n * initializes itself and no-ops in read-only mode, so this avoids triggering\n * the heavier retrieval/vector initialization path for prompt telemetry.\n */\n async incrementMemoryAccess(eventIds: string[]): Promise<void> {\n if (eventIds.length === 0) return;\n\n await this.deps.accessStore.incrementAccessCount(eventIds);\n }\n\n /**\n * Record a selected retrieval for helpfulness analytics.\n */\n async recordRetrieval(\n eventId: string,\n sessionId: string,\n score: number,\n query: string\n ): Promise<void> {\n await this.deps.initialize();\n await this.deps.accessStore.recordRetrieval(eventId, sessionId, score, query);\n }\n\n private resolveGraphHopOptions(\n callerOptions: RetrieveMemoriesOptions['graphHop'] | undefined\n ): RetrieveMemoriesOptions['graphHop'] | undefined {\n const graphExpansion = this.deps.memoryOperationsConfig?.graphExpansion;\n const durableOptions = graphExpansion?.enabled === true\n ? { enabled: true, maxHops: graphExpansion.maxHops }\n : undefined;\n\n if (!callerOptions) return durableOptions;\n if (!graphExpansion) return callerOptions;\n if (graphExpansion.enabled !== true) {\n return {\n ...callerOptions,\n enabled: false,\n maxHops: graphExpansion.maxHops ?? callerOptions.maxHops\n };\n }\n\n return {\n enabled: callerOptions.enabled === false ? false : true,\n maxHops: Math.min(\n graphExpansion.maxHops ?? Number.POSITIVE_INFINITY,\n callerOptions.maxHops ?? graphExpansion.maxHops ?? 1\n ),\n hopPenalty: callerOptions.hopPenalty\n };\n }\n\n private async recordAutomaticTrace(\n query: string,\n result: UnifiedRetrievalResult,\n options: RetrieveMemoriesOptions | undefined,\n projectHash: string | null\n ): Promise<void> {\n const selectedEventIds = result.memories.map((memory) => memory.event.id);\n const selectedDetails = (result.selectedDebug || []).map((detail) => ({\n eventId: detail.eventId,\n score: detail.score,\n semanticScore: detail.semanticScore,\n lexicalScore: detail.lexicalScore,\n recencyScore: detail.recencyScore,\n lanes: detail.lanes,\n }));\n const candidateDetails = (result.candidateDebug || []).map((detail) => ({\n eventId: detail.eventId,\n score: detail.score,\n semanticScore: detail.semanticScore,\n lexicalScore: detail.lexicalScore,\n recencyScore: detail.recencyScore,\n lanes: detail.lanes,\n }));\n const candidateEventIds = candidateDetails.length > 0\n ? candidateDetails.map((detail) => detail.eventId)\n : selectedEventIds;\n\n await this.deps.traceStore.recordRetrievalTrace({\n sessionId: options?.sessionId,\n projectHash: projectHash || undefined,\n queryText: result.effectiveQueryText || query,\n rawQueryText: result.rawQueryText || (result.queryRewriteKind ? query : undefined),\n queryRewriteKind: result.queryRewriteKind || 'none',\n strategy: options?.strategy || 'auto',\n candidateEventIds,\n selectedEventIds,\n candidateDetails,\n selectedDetails,\n confidence: result.matchResult.confidence,\n fallbackTrace: result.fallbackTrace || []\n });\n }\n\n private isLightweightFastRead(options: RetrieveMemoriesOptions | undefined): boolean {\n const requiresSharedRuntime = options?.includeShared === true && this.deps.hasSharedStore();\n\n return options?.strategy === 'fast'\n && !requiresSharedRuntime\n && options.adaptiveRerank !== true;\n }\n\n private getConfiguredRerankWeights(): RerankWeights | undefined {\n const semantic = Number(process.env.MEMORY_RERANK_WEIGHT_SEMANTIC ?? '');\n const lexical = Number(process.env.MEMORY_RERANK_WEIGHT_LEXICAL ?? '');\n const recency = Number(process.env.MEMORY_RERANK_WEIGHT_RECENCY ?? '');\n\n const allFinite = [semantic, lexical, recency].every((value) => Number.isFinite(value));\n if (!allFinite) return undefined;\n\n const nonNegative = [semantic, lexical, recency].every((value) => value >= 0);\n const total = semantic + lexical + recency;\n if (!nonNegative || total <= 0) return undefined;\n\n return {\n semantic: semantic / total,\n lexical: lexical / total,\n recency: recency / total,\n };\n }\n\n private async getRerankWeights(adaptive: boolean): Promise<RerankWeights | undefined> {\n const configured = this.getConfiguredRerankWeights();\n if (configured) return configured;\n if (adaptive) return this.getAdaptiveRerankWeights();\n return undefined;\n }\n\n private async getAdaptiveRerankWeights(): Promise<RerankWeights | undefined> {\n try {\n const stats = await this.deps.traceStore.getHelpfulnessStats();\n if (stats.totalEvaluated < 20) return undefined;\n\n // Base weights.\n let semantic = 0.7;\n let lexical = 0.2;\n let recency = 0.1;\n\n if (stats.avgScore < 0.45) {\n semantic -= 0.1;\n lexical += 0.1;\n } else if (stats.avgScore > 0.75) {\n semantic += 0.05;\n lexical -= 0.05;\n }\n\n if (stats.unhelpful > stats.helpful) {\n recency += 0.05;\n semantic -= 0.03;\n lexical -= 0.02;\n }\n\n return { semantic, lexical, recency };\n } catch {\n return undefined;\n }\n }\n\n private async rewriteQueryIntent(query: string): Promise<string | null> {\n if (process.env.MEMORY_INTENT_REWRITE_ENABLED !== '1') return null;\n\n const apiUrl = process.env.COMPANY_STOCK_API_URL || process.env.COMPANY_INT_API_URL;\n if (!apiUrl) return null;\n\n const controller = new AbortController();\n const timeoutMs = Number(process.env.MEMORY_INTENT_REWRITE_TIMEOUT_MS || 5000);\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const prompt = [\n 'Rewrite user query for memory retrieval intent expansion.',\n 'Return plain text only, one line, no markdown.',\n `Query: ${query}`,\n ].join('\\n');\n\n const res = await fetch(apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: '*/*',\n Origin: process.env.COMPANY_INT_ORIGIN || 'http://company-int.aplusai.ai',\n Referer: process.env.COMPANY_INT_REFERER || 'http://company-int.aplusai.ai/',\n },\n body: JSON.stringify({\n question: prompt,\n company_name: null,\n conversation_id: null,\n }),\n signal: controller.signal,\n });\n\n const text = (await res.text()).trim();\n if (!text) return null;\n\n const oneLine = text\n .replace(/^data:\\s*/gm, '')\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .join(' ')\n .slice(0, 240);\n\n if (!oneLine || oneLine.toLowerCase() === query.toLowerCase()) return null;\n return oneLine;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n\nexport function createRetrievalOrchestrator(\n deps: RetrievalOrchestratorDeps\n): RetrievalOrchestrator {\n return new RetrievalOrchestrator(deps);\n}\n", "/**\n * Retrieval Services Bundle\n *\n * Owns construction and wiring for retrieval-facing engine services so\n * MemoryService can hold a thin facade boundary instead of directly\n * instantiating each retrieval collaborator.\n */\n\nimport type { Embedder } from '../embedder.js';\nimport type { EventStore } from '../event-store.js';\nimport type { Matcher } from '../matcher.js';\nimport type { MemoryEvent, MemoryOperationsConfig } from '../types.js';\nimport {\n createRetriever as createCoreRetriever,\n type Retriever,\n type SharedStoreOptions\n} from '../retriever.js';\nimport type { VectorStore } from '../vector-store.js';\nimport {\n createRetrievalAnalyticsService,\n type RetrievalAnalyticsService,\n type RetrievalAnalyticsStore\n} from './retrieval-analytics-service.js';\nimport {\n createRetrievalDisclosureService,\n type RetrievalDisclosureEventStore,\n type RetrievalDisclosureService,\n type RetrievalDisclosureSharedStore\n} from './retrieval-disclosure-service.js';\nimport {\n createRetrievalOrchestrator,\n type RetrievalAccessStore,\n type RetrievalOrchestrator,\n type RetrievalTraceStore\n} from './retrieval-orchestrator.js';\n\nexport interface RetrievalSourceStore {\n getRecentEvents(limit?: number): Promise<MemoryEvent[]>;\n}\n\nexport type RetrievalEventStore = RetrievalTraceStore\n & RetrievalAccessStore\n & RetrievalDisclosureEventStore\n & RetrievalAnalyticsStore\n & RetrievalSourceStore;\n\nexport type CreateRetrieverFn = (\n eventStore: RetrievalEventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher,\n options?: SharedStoreOptions\n) => Retriever;\n\nexport interface RetrievalServicesDeps {\n initialize: () => Promise<void>;\n eventStore: RetrievalEventStore;\n vectorStore: VectorStore;\n embedder: Embedder;\n matcher: Matcher;\n getProjectHash: () => string | null;\n hasSharedStore: () => boolean;\n memoryOperationsConfig?: MemoryOperationsConfig;\n sharedStore?: RetrievalDisclosureSharedStore;\n createRetriever?: CreateRetrieverFn;\n}\n\nexport interface RetrievalServices {\n retriever: Retriever;\n retrievalOrchestrator: RetrievalOrchestrator;\n retrievalDisclosureService: RetrievalDisclosureService;\n retrievalAnalyticsService: RetrievalAnalyticsService;\n}\n\nexport function createRetrievalServices(deps: RetrievalServicesDeps): RetrievalServices {\n const retrieverFactory = deps.createRetriever ?? defaultCreateRetriever;\n const retriever = retrieverFactory(\n deps.eventStore,\n deps.vectorStore,\n deps.embedder,\n deps.matcher,\n { queryGraphExpansionEnabled: deps.memoryOperationsConfig?.graphExpansion?.enabled === true }\n );\n const retrievalOrchestrator = createRetrievalOrchestrator({\n initialize: deps.initialize,\n retriever,\n traceStore: deps.eventStore,\n accessStore: deps.eventStore,\n getProjectHash: deps.getProjectHash,\n hasSharedStore: deps.hasSharedStore,\n memoryOperationsConfig: deps.memoryOperationsConfig\n });\n const retrievalDisclosureService = createRetrievalDisclosureService({\n initialize: deps.initialize,\n retrievalOrchestrator,\n eventStore: deps.eventStore,\n sharedStore: deps.sharedStore\n });\n const retrievalAnalyticsService = createRetrievalAnalyticsService({\n initialize: deps.initialize,\n retrievalStore: deps.eventStore\n });\n\n return {\n retriever,\n retrievalOrchestrator,\n retrievalDisclosureService,\n retrievalAnalyticsService\n };\n}\n\nfunction defaultCreateRetriever(\n eventStore: RetrievalEventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher,\n options?: SharedStoreOptions\n): Retriever {\n assertDefaultRetrieverStore(eventStore);\n return createCoreRetriever(\n eventStore as unknown as EventStore,\n vectorStore,\n embedder,\n matcher,\n options\n );\n}\n\nfunction assertDefaultRetrieverStore(eventStore: RetrievalEventStore): void {\n const store = eventStore as unknown as Record<string, unknown>;\n for (const method of ['getEvent', 'getSessionEvents', 'getRecentEvents']) {\n if (typeof store[method] !== 'function') {\n throw new TypeError(`Default retrieval service eventStore requires ${method}()`);\n }\n }\n}\n\nexport {\n RetrievalAnalyticsService,\n createRetrievalAnalyticsService\n} from './retrieval-analytics-service.js';\nexport type {\n AccessedMemory,\n HelpfulMemory,\n HelpfulnessStats,\n RetrievalAnalyticsServiceDeps,\n RetrievalAnalyticsStore,\n RetrievalTrace,\n RetrievalTraceStats\n} from './retrieval-analytics-service.js';\nexport {\n RetrievalDisclosureService,\n createRetrievalDisclosureService,\n parseDisclosureResultId,\n parseDisclosureResultRef,\n toDisclosureResultId\n} from './retrieval-disclosure-service.js';\nexport type {\n RetrievalDisclosureEnvelope,\n RetrievalDisclosureEventStore,\n RetrievalDisclosureExpansion,\n RetrievalDisclosureExpandOptions,\n RetrievalDisclosureOrchestrator,\n RetrievalDisclosureReason,\n RetrievalDisclosureSearchOptions,\n RetrievalDisclosureSearchResponse,\n RetrievalDisclosureServiceDeps,\n RetrievalDisclosureSharedStore,\n RetrievalDisclosureSource,\n RetrievalDisclosureSourceReference,\n RetrievalDisclosureSourceType\n} from './retrieval-disclosure-service.js';\nexport {\n RetrievalOrchestrator,\n createRetrievalOrchestrator\n} from './retrieval-orchestrator.js';\nexport type {\n RecordQueryTraceInput,\n RetrievalAccessStore,\n RetrievalOrchestratorDeps,\n RetrievalTraceStore,\n RetrieveMemoriesOptions\n} from './retrieval-orchestrator.js';\n", "/**\n * Graduation Worker\n * Periodically evaluates memory events for promotion to higher levels\n * L0 \u2192 L1 \u2192 L2 \u2192 L3 \u2192 L4 based on access patterns and confidence\n */\n\nimport type { MemoryLevel } from './types.js';\nimport { EventStore } from './event-store.js';\nimport { GraduationPipeline } from './graduation.js';\n\nexport interface GraduationWorkerConfig {\n /** How often to run graduation evaluation (ms) */\n evaluationIntervalMs: number;\n /** Batch size for graduation evaluation */\n batchSize: number;\n /** Minimum time between evaluations of the same event (ms) */\n cooldownMs: number;\n}\n\nconst DEFAULT_CONFIG: GraduationWorkerConfig = {\n evaluationIntervalMs: 300000, // 5 minutes\n batchSize: 50,\n cooldownMs: 3600000 // 1 hour cooldown between evaluations\n};\n\nexport class GraduationWorker {\n private running = false;\n private timeout: NodeJS.Timeout | null = null;\n private lastEvaluated: Map<string, number> = new Map();\n\n constructor(\n private eventStore: EventStore,\n private graduation: GraduationPipeline,\n private config: GraduationWorkerConfig = DEFAULT_CONFIG\n ) {}\n\n /**\n * Start the graduation worker\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.scheduleNext();\n }\n\n /**\n * Stop the graduation worker\n */\n stop(): void {\n this.running = false;\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n }\n\n /**\n * Check if currently running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Force a graduation evaluation run\n */\n async forceRun(): Promise<GraduationRunResult> {\n return await this.runGraduation();\n }\n\n /**\n * Schedule the next graduation check\n */\n private scheduleNext(): void {\n if (!this.running) return;\n\n this.timeout = setTimeout(\n () => this.run(),\n this.config.evaluationIntervalMs\n );\n }\n\n /**\n * Run graduation evaluation\n */\n private async run(): Promise<void> {\n if (!this.running) return;\n\n try {\n await this.runGraduation();\n } catch (error) {\n console.error('Graduation error:', error);\n }\n\n this.scheduleNext();\n }\n\n /**\n * Perform graduation evaluation across all levels\n */\n private async runGraduation(): Promise<GraduationRunResult> {\n const result: GraduationRunResult = {\n evaluated: 0,\n graduated: 0,\n byLevel: {}\n };\n\n const levels: MemoryLevel[] = ['L0', 'L1', 'L2', 'L3'];\n const now = Date.now();\n\n for (const level of levels) {\n const events = await this.eventStore.getEventsByLevel(level, {\n limit: this.config.batchSize\n });\n\n let levelGraduated = 0;\n\n for (const event of events) {\n // Check cooldown\n const lastEval = this.lastEvaluated.get(event.id);\n if (lastEval && (now - lastEval) < this.config.cooldownMs) {\n continue;\n }\n\n result.evaluated++;\n this.lastEvaluated.set(event.id, now);\n\n const gradResult = await this.graduation.evaluateGraduation(event.id, level);\n\n if (gradResult.success) {\n result.graduated++;\n levelGraduated++;\n }\n }\n\n if (levelGraduated > 0) {\n result.byLevel[level] = levelGraduated;\n }\n }\n\n // Clean up old cooldown entries (keep last 1000)\n if (this.lastEvaluated.size > 1000) {\n const entries = Array.from(this.lastEvaluated.entries());\n entries.sort((a, b) => b[1] - a[1]);\n this.lastEvaluated = new Map(entries.slice(0, 1000));\n }\n\n return result;\n }\n}\n\nexport interface GraduationRunResult {\n evaluated: number;\n graduated: number;\n byLevel: Record<string, number>;\n}\n\n/**\n * Create a Graduation Worker instance\n */\nexport function createGraduationWorker(\n eventStore: EventStore,\n graduation: GraduationPipeline,\n config?: Partial<GraduationWorkerConfig>\n): GraduationWorker {\n return new GraduationWorker(\n eventStore,\n graduation,\n { ...DEFAULT_CONFIG, ...config }\n );\n}\n", "/**\n * Vector Worker - Single-Writer Pattern Implementation\n * AXIOMMIND Principle 6: DuckDB \u2192 outbox \u2192 LanceDB unidirectional flow\n */\n\nimport { EventStore } from './event-store.js';\nimport { VectorStore } from './vector-store.js';\nimport { Embedder } from './embedder.js';\nimport type { VectorRecord } from './types.js';\n\nexport interface WorkerConfig {\n batchSize: number;\n pollIntervalMs: number;\n maxRetries: number;\n}\n\nconst DEFAULT_CONFIG: WorkerConfig = {\n batchSize: 32,\n pollIntervalMs: 1000,\n maxRetries: 3\n};\n\nfunction parseJsonArray(value: unknown): unknown[] {\n if (Array.isArray(value)) return value;\n if (typeof value !== 'string' || value.trim().length === 0) return [];\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nfunction isMissingPerspectiveObservationTable(error: unknown): boolean {\n const message = String(error instanceof Error ? error.message : error).toLowerCase();\n return message.includes('no such table: perspective_observations');\n}\n\nexport class VectorWorker {\n private readonly eventStore: EventStore;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly config: WorkerConfig;\n private running = false;\n private stopping = false;\n private pollTimeout: NodeJS.Timeout | null = null;\n\n constructor(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n config: Partial<WorkerConfig> = {}\n ) {\n this.eventStore = eventStore;\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Start the worker polling loop\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.stopping = false;\n this.poll();\n }\n\n /**\n * Stop the worker\n */\n stop(): void {\n this.running = false;\n this.stopping = true;\n if (this.pollTimeout) {\n clearTimeout(this.pollTimeout);\n this.pollTimeout = null;\n }\n }\n\n /**\n * Process a single batch of outbox items\n */\n async processBatch(): Promise<number> {\n const items = await this.eventStore.getPendingOutboxItems(this.config.batchSize);\n\n if (items.length === 0) {\n return 0;\n }\n\n const successful: string[] = [];\n const failed: string[] = [];\n\n try {\n // Generate embeddings for all items\n const embeddings = await this.embedder.embedBatch(items.map(i => i.content));\n\n // Prepare vector records\n const records: VectorRecord[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const embedding = embeddings[i];\n\n // Get event details\n const event = await this.eventStore.getEvent(item.eventId);\n if (!event) {\n failed.push(item.id);\n continue;\n }\n\n records.push({\n id: `vec_${item.id}`,\n eventId: item.eventId,\n sessionId: event.sessionId,\n eventType: event.eventType,\n content: item.content,\n vector: embedding.vector,\n timestamp: event.timestamp.toISOString(),\n metadata: event.metadata\n });\n\n successful.push(item.id);\n }\n\n // Batch insert to vector store\n if (records.length > 0) {\n await this.vectorStore.upsertBatch(records);\n }\n\n // Mark successful items as done\n if (successful.length > 0) {\n await this.eventStore.completeOutboxItems(successful);\n }\n\n // Mark failed items\n if (failed.length > 0) {\n await this.eventStore.failOutboxItems(failed, 'Event not found');\n }\n\n return successful.length;\n } catch (error) {\n // Mark all items as failed, but only if not stopping (DB might be closed)\n if (!this.stopping) {\n try {\n const allIds = items.map(i => i.id);\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.eventStore.failOutboxItems(allIds, errorMessage);\n } catch (failError) {\n // Database might be closed during shutdown, ignore\n console.warn('Could not mark outbox items as failed (database may be closed)');\n }\n }\n throw error;\n }\n }\n\n /**\n * Poll for new items\n */\n private async poll(): Promise<void> {\n if (!this.running || this.stopping) return;\n\n try {\n await this.processBatch();\n } catch (error) {\n // Only log if not stopping (error during shutdown is expected)\n if (!this.stopping) {\n console.error('Vector worker error:', error);\n }\n }\n\n // Schedule next poll only if still running\n if (this.running && !this.stopping) {\n this.pollTimeout = setTimeout(() => this.poll(), this.config.pollIntervalMs);\n }\n }\n\n /**\n * Process all pending items (blocking)\n */\n async processAll(): Promise<number> {\n let totalProcessed = 0;\n let processed: number;\n\n do {\n processed = await this.processBatch();\n totalProcessed += processed;\n } while (processed > 0);\n\n return totalProcessed;\n }\n\n /**\n * Check if worker is running\n */\n isRunning(): boolean {\n return this.running;\n }\n}\n\n/**\n * Create and start a vector worker\n */\nexport function createVectorWorker(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n config?: Partial<WorkerConfig>\n): VectorWorker {\n const worker = new VectorWorker(eventStore, vectorStore, embedder, config);\n return worker;\n}\n\n// ============================================================\n// Vector Worker V2 - Extended for Task Entity System\n// ============================================================\n\nimport { dbAll, type Database } from './db-wrapper.js';\nimport { VectorOutbox } from './vector-outbox.js';\nimport type { OutboxJob, OutboxItemKind } from './types.js';\n\nexport interface WorkerConfigV2 {\n batchSize: number;\n pollIntervalMs: number;\n maxRetries: number;\n embeddingVersion: string;\n}\n\nconst DEFAULT_CONFIG_V2: WorkerConfigV2 = {\n batchSize: 32,\n pollIntervalMs: 1000,\n maxRetries: 3,\n embeddingVersion: 'v1'\n};\n\n/**\n * Content provider interface for different item kinds\n */\nexport interface ContentProvider {\n getContent(itemKind: OutboxItemKind, itemId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null>;\n}\n\n/**\n * Default content provider using database\n */\nexport class DefaultContentProvider implements ContentProvider {\n constructor(private db: Database) {}\n\n async getContent(itemKind: OutboxItemKind, itemId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n switch (itemKind) {\n case 'entry':\n return this.getEntryContent(itemId);\n case 'task_title':\n return this.getTaskTitleContent(itemId);\n case 'event':\n return this.getEventContent(itemId);\n case 'perspective_observation':\n return this.getPerspectiveObservationContent(itemId);\n default:\n return null;\n }\n }\n\n private async getEntryContent(entryId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT title, content_json, entry_type FROM entries WHERE entry_id = ?`,\n [entryId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n const contentJson = typeof row.content_json === 'string'\n ? JSON.parse(row.content_json)\n : row.content_json;\n\n return {\n content: `${row.title}\\n${JSON.stringify(contentJson)}`,\n metadata: {\n itemKind: 'entry',\n entryType: row.entry_type\n }\n };\n }\n\n private async getTaskTitleContent(taskId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT title, search_text, current_json FROM entities\n WHERE entity_id = ? AND entity_type = 'task'`,\n [taskId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n content: row.search_text as string || row.title as string,\n metadata: {\n itemKind: 'task_title',\n entityType: 'task'\n }\n };\n }\n\n private async getEventContent(eventId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT content, event_type, session_id FROM events WHERE id = ?`,\n [eventId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n content: row.content as string,\n metadata: {\n itemKind: 'event',\n eventType: row.event_type,\n sessionId: row.session_id\n }\n };\n }\n\n private async getPerspectiveObservationContent(observationId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n let rows: Record<string, unknown>[];\n try {\n rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT project_hash, observer_actor_id, observed_actor_id, session_id, level, content,\n source_event_ids_json, source_observation_ids_json\n FROM perspective_observations\n WHERE observation_id = ? AND deleted_at IS NULL`,\n [observationId]\n );\n } catch (error) {\n if (isMissingPerspectiveObservationTable(error)) {\n return null;\n }\n throw error;\n }\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n const sourceEventIds = parseJsonArray(row.source_event_ids_json);\n const sourceObservationIds = parseJsonArray(row.source_observation_ids_json);\n\n return {\n content: row.content as string,\n metadata: {\n itemKind: 'perspective_observation',\n level: row.level,\n projectHash: row.project_hash,\n observerActorId: row.observer_actor_id,\n observedActorId: row.observed_actor_id,\n sessionId: row.session_id,\n sourceEventCount: sourceEventIds.length,\n sourceObservationCount: sourceObservationIds.length\n }\n };\n }\n}\n\n/**\n * Vector Worker V2 - Supports multiple item kinds\n */\nexport class VectorWorkerV2 {\n private readonly outbox: VectorOutbox;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly contentProvider: ContentProvider;\n private readonly config: WorkerConfigV2;\n private running = false;\n private stopping = false;\n private pollTimeout: NodeJS.Timeout | null = null;\n\n constructor(\n db: Database,\n vectorStore: VectorStore,\n embedder: Embedder,\n config: Partial<WorkerConfigV2> = {},\n contentProvider?: ContentProvider\n ) {\n this.outbox = new VectorOutbox(db, {\n embeddingVersion: config.embeddingVersion ?? DEFAULT_CONFIG_V2.embeddingVersion,\n maxRetries: config.maxRetries ?? DEFAULT_CONFIG_V2.maxRetries\n });\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.config = { ...DEFAULT_CONFIG_V2, ...config };\n this.contentProvider = contentProvider ?? new DefaultContentProvider(db);\n }\n\n /**\n * Start the worker polling loop\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.stopping = false;\n this.poll();\n }\n\n /**\n * Stop the worker\n */\n stop(): void {\n this.running = false;\n this.stopping = true;\n if (this.pollTimeout) {\n clearTimeout(this.pollTimeout);\n this.pollTimeout = null;\n }\n }\n\n /**\n * Process a single batch of outbox jobs\n */\n async processBatch(): Promise<number> {\n const jobs = await this.outbox.claimJobs(this.config.batchSize);\n\n if (jobs.length === 0) {\n return 0;\n }\n\n let successCount = 0;\n\n for (const job of jobs) {\n try {\n await this.processJob(job);\n await this.outbox.markDone(job.jobId);\n successCount++;\n } catch (error) {\n // Only try to mark as failed if not stopping (DB might be closed)\n if (!this.stopping) {\n try {\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.outbox.markFailed(job.jobId, errorMessage);\n } catch {\n // Database might be closed during shutdown, ignore\n }\n }\n }\n }\n\n return successCount;\n }\n\n /**\n * Process a single job\n */\n private async processJob(job: OutboxJob): Promise<void> {\n // Get content\n const contentData = await this.contentProvider.getContent(job.itemKind, job.itemId);\n\n if (!contentData) {\n // Item not found, mark as done (skip)\n return;\n }\n\n // Generate embedding\n const embedding = await this.embedder.embed(contentData.content);\n\n // Upsert to vector store\n const record: VectorRecord = {\n id: `${job.itemKind}_${job.itemId}_${job.embeddingVersion}`,\n eventId: job.itemKind === 'event' ? job.itemId : '',\n sessionId: (contentData.metadata.sessionId as string) ?? '',\n eventType: (contentData.metadata.eventType as string) ?? job.itemKind,\n content: contentData.content,\n vector: embedding.vector,\n timestamp: new Date().toISOString(),\n metadata: {\n ...contentData.metadata,\n embeddingVersion: job.embeddingVersion\n }\n };\n\n // Use idempotent upsert (delete + add)\n await this.vectorStore.upsertBatch([record]);\n }\n\n /**\n * Poll for new jobs\n */\n private async poll(): Promise<void> {\n if (!this.running || this.stopping) return;\n\n try {\n await this.processBatch();\n } catch (error) {\n // Only log if not stopping (error during shutdown is expected)\n if (!this.stopping) {\n console.error('Vector worker V2 error:', error);\n }\n }\n\n // Schedule next poll only if still running\n if (this.running && !this.stopping) {\n this.pollTimeout = setTimeout(() => this.poll(), this.config.pollIntervalMs);\n }\n }\n\n /**\n * Process all pending jobs (blocking)\n */\n async processAll(): Promise<number> {\n let totalProcessed = 0;\n let processed: number;\n\n do {\n processed = await this.processBatch();\n totalProcessed += processed;\n } while (processed > 0);\n\n return totalProcessed;\n }\n\n /**\n * Run reconciliation\n */\n async reconcile(): Promise<{ recovered: number; retried: number }> {\n return this.outbox.reconcile();\n }\n\n /**\n * Get metrics\n */\n async getMetrics() {\n return this.outbox.getMetrics();\n }\n\n /**\n * Check if worker is running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Get the outbox instance for direct access\n */\n getOutbox(): VectorOutbox {\n return this.outbox;\n }\n}\n\n/**\n * Create a Vector Worker V2 instance\n */\nexport function createVectorWorkerV2(\n db: Database,\n vectorStore: VectorStore,\n embedder: Embedder,\n config?: Partial<WorkerConfigV2>\n): VectorWorkerV2 {\n return new VectorWorkerV2(db, vectorStore, embedder, config);\n}\n", "/**\n * Memory Runtime Service\n * Owns MemoryService lifecycle concerns: initialization, background workers,\n * lightweight/read-only modes, and orderly shutdown.\n */\n\nimport type { EventStore } from '../event-store.js';\nimport type { Embedder } from '../embedder.js';\nimport type { GraduationPipeline } from '../graduation.js';\nimport {\n createGraduationWorker as defaultCreateGraduationWorker,\n type GraduationRunResult,\n type GraduationWorker\n} from '../graduation-worker.js';\nimport type { Retriever } from '../retriever.js';\nimport type { VectorStore } from '../vector-store.js';\nimport {\n createVectorWorker as defaultCreateVectorWorker,\n createVectorWorkerV2 as defaultCreateVectorWorkerV2,\n type VectorWorker,\n type VectorWorkerV2\n} from '../vector-worker.js';\nimport type { Database } from '../db-wrapper.js';\n\nexport interface RuntimeSQLiteStore {\n initialize(): Promise<void>;\n close(): Promise<void>;\n getDatabase?(): Database;\n}\n\nexport interface RuntimeEndlessMemoryServices {\n initializeFromSavedMode(): Promise<void>;\n shutdown(): void;\n}\n\nexport interface RuntimeSharedMemoryServices {\n initialize(): Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface MemoryRuntimeServicesFactories {\n createVectorWorker?: typeof defaultCreateVectorWorker;\n createVectorWorkerV2?: typeof defaultCreateVectorWorkerV2;\n createGraduationWorker?: typeof defaultCreateGraduationWorker;\n}\n\nexport interface MemoryRuntimeServicesDeps {\n sqliteStore: RuntimeSQLiteStore;\n eventStore: EventStore;\n vectorStore: VectorStore;\n embedder: Embedder;\n retriever: Retriever;\n graduation: GraduationPipeline;\n endlessMemoryServices: RuntimeEndlessMemoryServices;\n sharedMemoryServices: RuntimeSharedMemoryServices;\n readOnly: boolean;\n lightweightMode: boolean;\n embeddingOnly: boolean;\n factories?: MemoryRuntimeServicesFactories;\n}\n\nexport interface MemoryRuntimeService {\n initialize(): Promise<void>;\n shutdown(): Promise<void>;\n processPendingEmbeddings(): Promise<number>;\n forceGraduation(): Promise<GraduationRunResult>;\n recordMemoryAccess(eventId: string, sessionId: string, confidence?: number): void;\n getVectorWorker(): VectorWorker | null;\n getVectorWorkerV2(): VectorWorkerV2 | null;\n isInitialized(): boolean;\n}\n\nfunction createEmptyGraduationResult(): GraduationRunResult {\n return { evaluated: 0, graduated: 0, byLevel: {} };\n}\n\nexport function createMemoryRuntimeService(deps: MemoryRuntimeServicesDeps): MemoryRuntimeService {\n const createVectorWorker = deps.factories?.createVectorWorker ?? defaultCreateVectorWorker;\n const createVectorWorkerV2 = deps.factories?.createVectorWorkerV2 ?? defaultCreateVectorWorkerV2;\n const createGraduationWorker = deps.factories?.createGraduationWorker ?? defaultCreateGraduationWorker;\n\n let initialized = false;\n let vectorWorker: VectorWorker | null = null;\n let vectorWorkerV2: VectorWorkerV2 | null = null;\n let graduationWorker: GraduationWorker | null = null;\n\n return {\n async initialize(): Promise<void> {\n if (initialized) return;\n\n // Initialize PRIMARY store: SQLite (always)\n await deps.sqliteStore.initialize();\n\n // Lightweight mode: only SQLite, no embedder/vector/workers.\n // Used for hooks that just need to store data quickly.\n if (deps.lightweightMode) {\n initialized = true;\n return;\n }\n\n await deps.vectorStore.initialize();\n await deps.embedder.initialize();\n\n // Skip write-related workers in read-only mode.\n if (!deps.readOnly) {\n vectorWorker = createVectorWorker(\n deps.eventStore,\n deps.vectorStore,\n deps.embedder\n );\n vectorWorker.start();\n\n const sqliteDb = deps.sqliteStore.getDatabase?.();\n if (sqliteDb) {\n vectorWorkerV2 = createVectorWorkerV2(\n sqliteDb,\n deps.vectorStore,\n deps.embedder\n );\n vectorWorkerV2.start();\n }\n\n if (!deps.embeddingOnly) {\n deps.retriever.setGraduationPipeline(deps.graduation);\n graduationWorker = createGraduationWorker(\n deps.eventStore,\n deps.graduation\n );\n graduationWorker.start();\n }\n\n await deps.endlessMemoryServices.initializeFromSavedMode();\n await deps.sharedMemoryServices.initialize();\n }\n\n initialized = true;\n },\n\n async shutdown(): Promise<void> {\n if (graduationWorker) {\n graduationWorker.stop();\n }\n\n deps.endlessMemoryServices.shutdown();\n\n if (vectorWorker) {\n vectorWorker.stop();\n }\n if (vectorWorkerV2) {\n vectorWorkerV2.stop();\n }\n\n await deps.sharedMemoryServices.close();\n await deps.sqliteStore.close();\n },\n\n async processPendingEmbeddings(): Promise<number> {\n let processed = 0;\n if (vectorWorker) {\n processed += await vectorWorker.processAll();\n }\n if (vectorWorkerV2) {\n processed += await vectorWorkerV2.processAll();\n }\n return processed;\n },\n\n async forceGraduation(): Promise<GraduationRunResult> {\n if (!graduationWorker) {\n return createEmptyGraduationResult();\n }\n return graduationWorker.forceRun();\n },\n\n recordMemoryAccess(eventId: string, sessionId: string, confidence: number = 1.0): void {\n deps.graduation.recordAccess(eventId, sessionId, confidence);\n },\n\n getVectorWorker(): VectorWorker | null {\n return vectorWorker;\n },\n\n getVectorWorkerV2(): VectorWorkerV2 | null {\n return vectorWorkerV2;\n },\n\n isInitialized(): boolean {\n return initialized;\n }\n };\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Embedder } from '../vector/index.js';\nimport { createSharedEventStore, type SharedEventStore } from '../../core/shared-event-store.js';\nimport { createSharedPromoter, type PromotionResult, type SharedPromoter } from '../../core/shared-promoter.js';\nimport { createSharedStore, type SharedStore } from '../../core/shared-store.js';\nimport { createSharedVectorStore, type SharedVectorStore } from '../../core/shared-vector-store.js';\nimport type { Entry, SharedStoreConfig, SharedTroubleshootingEntry } from '../../core/types.js';\n\nexport interface SharedMemoryRetriever {\n setSharedStores(sharedStore: SharedStore, sharedVectorStore: SharedVectorStore): void;\n}\n\nexport interface SharedMemoryServicesFactories {\n existsSync?: (targetPath: string) => boolean;\n mkdirSync?: (targetPath: string) => void;\n createSharedEventStore?: (dbPath: string) => SharedEventStore;\n createSharedStore?: (sharedEventStore: SharedEventStore) => SharedStore;\n createSharedVectorStore?: (dbPath: string) => SharedVectorStore;\n createSharedPromoter?: (\n sharedStore: SharedStore,\n sharedVectorStore: SharedVectorStore,\n embedder: Embedder,\n config?: SharedStoreConfig\n ) => SharedPromoter;\n}\n\nexport interface SharedMemoryServicesOptions {\n config: SharedStoreConfig | null;\n defaultSharedStoragePath: string;\n readOnly: boolean;\n expandPath: (targetPath: string) => string;\n embedder: Embedder;\n retriever: SharedMemoryRetriever;\n factories?: SharedMemoryServicesFactories;\n}\n\nexport type SharedStoreStats = {\n total: number;\n averageConfidence: number;\n topTopics: Array<{ topic: string; count: number }>;\n totalUsageCount: number;\n};\n\nexport class SharedMemoryServices {\n private sharedEventStore: SharedEventStore | null = null;\n private sharedStore: SharedStore | null = null;\n private sharedVectorStore: SharedVectorStore | null = null;\n private sharedPromoter: SharedPromoter | null = null;\n private openStorePromise: Promise<SharedStore> | null = null;\n\n constructor(private readonly options: SharedMemoryServicesOptions) {}\n\n get eventStore(): SharedEventStore | null {\n return this.sharedEventStore;\n }\n\n get store(): SharedStore | null {\n return this.sharedStore;\n }\n\n get vectorStore(): SharedVectorStore | null {\n return this.sharedVectorStore;\n }\n\n get promoter(): SharedPromoter | null {\n return this.sharedPromoter;\n }\n\n isEnabled(): boolean {\n return this.sharedStore !== null;\n }\n\n getSharedStoragePath(): string {\n return this.options.config?.sharedStoragePath\n ? this.options.expandPath(this.options.config.sharedStoragePath)\n : this.options.defaultSharedStoragePath;\n }\n\n async initialize(): Promise<void> {\n if (this.options.config?.enabled === false || this.options.readOnly) return;\n\n const sharedPath = this.getSharedStoragePath();\n this.ensureDirectory(sharedPath, { allowCreate: true });\n\n const store = await this.openStore(sharedPath);\n\n this.sharedVectorStore = this.factories.createSharedVectorStore(\n path.join(sharedPath, 'vectors')\n );\n await this.sharedVectorStore.initialize();\n\n this.sharedPromoter = this.factories.createSharedPromoter(\n store,\n this.sharedVectorStore,\n this.options.embedder,\n this.options.config || undefined\n );\n\n this.options.retriever.setSharedStores(store, this.sharedVectorStore);\n }\n\n async ensureStoreForRead(): Promise<SharedStore | null> {\n if (this.options.config?.enabled === false) return null;\n if (this.sharedStore) return this.sharedStore;\n\n const sharedPath = this.getSharedStoragePath();\n const directoryReady = this.ensureDirectory(sharedPath, { allowCreate: !this.options.readOnly });\n if (!directoryReady) return null;\n\n return this.openStore(sharedPath);\n }\n\n async getEntryForDisclosure(entryId: string): Promise<SharedTroubleshootingEntry | null> {\n const store = await this.ensureStoreForRead();\n return store?.get(entryId) ?? null;\n }\n\n async promoteToShared(entry: Entry, projectHash: string | null): Promise<PromotionResult> {\n if (!this.sharedPromoter || !projectHash) {\n return {\n success: false,\n error: 'Shared store not initialized or project hash not set'\n };\n }\n\n return this.sharedPromoter.promoteEntry(entry, projectHash);\n }\n\n async getStats(): Promise<SharedStoreStats | null> {\n if (!this.sharedStore) return null;\n return this.sharedStore.getStats();\n }\n\n async search(\n query: string,\n options?: { topK?: number; minConfidence?: number }\n ): Promise<SharedTroubleshootingEntry[]> {\n if (!this.sharedStore) return [];\n return this.sharedStore.search(query, options);\n }\n\n async close(): Promise<void> {\n if (this.openStorePromise) {\n await this.openStorePromise.catch(() => null);\n }\n\n if (this.sharedEventStore) {\n await this.sharedEventStore.close();\n }\n this.sharedEventStore = null;\n this.sharedStore = null;\n this.sharedVectorStore = null;\n this.sharedPromoter = null;\n this.openStorePromise = null;\n }\n\n private async openStore(sharedPath: string): Promise<SharedStore> {\n if (this.sharedStore) return this.sharedStore;\n\n if (!this.openStorePromise) {\n this.openStorePromise = this.createOpenStorePromise(sharedPath);\n }\n\n try {\n return await this.openStorePromise;\n } finally {\n this.openStorePromise = null;\n }\n }\n\n private async createOpenStorePromise(sharedPath: string): Promise<SharedStore> {\n if (!this.sharedEventStore) {\n const sharedEventStore = this.factories.createSharedEventStore(\n path.join(sharedPath, 'shared.duckdb')\n );\n await sharedEventStore.initialize();\n this.sharedEventStore = sharedEventStore;\n }\n\n if (!this.sharedStore) {\n this.sharedStore = this.factories.createSharedStore(this.sharedEventStore);\n }\n\n return this.sharedStore;\n }\n\n private ensureDirectory(sharedPath: string, options: { allowCreate: boolean }): boolean {\n if (this.factories.existsSync(sharedPath)) return true;\n if (!options.allowCreate) return false;\n this.factories.mkdirSync(sharedPath);\n return true;\n }\n\n private get factories(): Required<SharedMemoryServicesFactories> {\n return {\n existsSync: this.options.factories?.existsSync ?? fs.existsSync,\n mkdirSync: this.options.factories?.mkdirSync ?? ((targetPath: string) => {\n fs.mkdirSync(targetPath, { recursive: true });\n }),\n createSharedEventStore: this.options.factories?.createSharedEventStore ?? createSharedEventStore,\n createSharedStore: this.options.factories?.createSharedStore ?? createSharedStore,\n createSharedVectorStore: this.options.factories?.createSharedVectorStore ?? createSharedVectorStore,\n createSharedPromoter: this.options.factories?.createSharedPromoter ?? createSharedPromoter\n };\n }\n}\n\nexport function createSharedMemoryServices(options: SharedMemoryServicesOptions): SharedMemoryServices {\n return new SharedMemoryServices(options);\n}\n", "/**\n * SharedEventStore - Global database for cross-project knowledge\n * Location: ~/.claude-code/memory/shared/\n */\n\nimport {\n createDatabase,\n dbRun,\n dbClose,\n type Database\n} from './db-wrapper.js';\n\nexport class SharedEventStore {\n private db: Database;\n private initialized = false;\n\n constructor(dbPath: string) {\n this.db = createDatabase(dbPath);\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Shared troubleshooting entries table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS shared_troubleshooting (\n entry_id VARCHAR PRIMARY KEY,\n source_project_hash VARCHAR NOT NULL,\n source_entry_id VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n symptoms JSON NOT NULL,\n root_cause TEXT NOT NULL,\n solution TEXT NOT NULL,\n topics JSON NOT NULL,\n technologies JSON,\n confidence REAL NOT NULL DEFAULT 0.8,\n usage_count INTEGER DEFAULT 0,\n last_used_at TIMESTAMP,\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(source_project_hash, source_entry_id)\n )\n `);\n\n // Future extensibility: best practices table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS shared_best_practices (\n entry_id VARCHAR PRIMARY KEY,\n source_project_hash VARCHAR NOT NULL,\n source_entry_id VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n content_json JSON NOT NULL,\n topics JSON NOT NULL,\n confidence REAL NOT NULL DEFAULT 0.8,\n usage_count INTEGER DEFAULT 0,\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(source_project_hash, source_entry_id)\n )\n `);\n\n // Future extensibility: common errors table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS shared_common_errors (\n entry_id VARCHAR PRIMARY KEY,\n source_project_hash VARCHAR NOT NULL,\n source_entry_id VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n error_pattern TEXT NOT NULL,\n solution TEXT NOT NULL,\n topics JSON NOT NULL,\n technologies JSON,\n confidence REAL NOT NULL DEFAULT 0.8,\n usage_count INTEGER DEFAULT 0,\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(source_project_hash, source_entry_id)\n )\n `);\n\n // Indexes for troubleshooting\n await dbRun(this.db, `\n CREATE INDEX IF NOT EXISTS idx_shared_ts_confidence\n ON shared_troubleshooting(confidence DESC)\n `);\n await dbRun(this.db, `\n CREATE INDEX IF NOT EXISTS idx_shared_ts_usage\n ON shared_troubleshooting(usage_count DESC)\n `);\n await dbRun(this.db, `\n CREATE INDEX IF NOT EXISTS idx_shared_ts_source\n ON shared_troubleshooting(source_project_hash)\n `);\n\n this.initialized = true;\n }\n\n getDatabase(): Database {\n return this.db;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n async close(): Promise<void> {\n await dbClose(this.db);\n this.initialized = false;\n }\n}\n\nexport function createSharedEventStore(dbPath: string): SharedEventStore {\n return new SharedEventStore(dbPath);\n}\n", "/**\n * SharedPromoter - Handles auto-promotion of verified troubleshooting entries\n * Promotes entries from project-local storage to cross-project shared storage\n */\n\nimport { randomUUID } from 'crypto';\nimport { SharedStore } from './shared-store.js';\nimport { SharedVectorStore } from './shared-vector-store.js';\nimport { Embedder } from './embedder.js';\nimport type { Entry, SharedTroubleshootingInput, SharedStoreConfig } from './types.js';\n\nexport interface TroubleshootingContent {\n symptoms?: string[];\n rootCause?: string;\n solution?: string;\n technologies?: string[];\n}\n\nexport interface PromotionResult {\n success: boolean;\n entryId?: string;\n error?: string;\n skipped?: boolean;\n skipReason?: string;\n}\n\nexport class SharedPromoter {\n constructor(\n private sharedStore: SharedStore,\n private sharedVectorStore: SharedVectorStore,\n private embedder: Embedder,\n private config?: SharedStoreConfig\n ) {}\n\n /**\n * Check if an entry is eligible for promotion\n */\n isEligibleForPromotion(entry: Entry): boolean {\n // Must be troubleshooting type\n if (entry.entryType !== 'troubleshooting') {\n return false;\n }\n\n // Must be at least 'verified' stage\n if (entry.stage !== 'verified' && entry.stage !== 'certified') {\n return false;\n }\n\n // Must be active status\n if (entry.status !== 'active') {\n return false;\n }\n\n return true;\n }\n\n /**\n * Promote a verified troubleshooting entry to shared storage\n */\n async promoteEntry(\n entry: Entry,\n projectHash: string\n ): Promise<PromotionResult> {\n // Validate eligibility\n if (!this.isEligibleForPromotion(entry)) {\n return {\n success: false,\n skipped: true,\n skipReason: `Entry not eligible: type=${entry.entryType}, stage=${entry.stage}, status=${entry.status}`\n };\n }\n\n // Check if already promoted\n const exists = await this.sharedStore.exists(projectHash, entry.entryId);\n if (exists) {\n return {\n success: true,\n skipped: true,\n skipReason: 'Entry already exists in shared store'\n };\n }\n\n try {\n const content = entry.contentJson as TroubleshootingContent;\n const confidence = this.calculateConfidence(entry);\n\n // Check minimum confidence threshold\n const minConfidence = this.config?.minConfidenceForPromotion ?? 0.8;\n if (confidence < minConfidence) {\n return {\n success: false,\n skipped: true,\n skipReason: `Confidence ${confidence} below threshold ${minConfidence}`\n };\n }\n\n const input: SharedTroubleshootingInput = {\n sourceProjectHash: projectHash,\n sourceEntryId: entry.entryId,\n title: entry.title,\n symptoms: content.symptoms || [],\n rootCause: content.rootCause || '',\n solution: content.solution || '',\n topics: this.extractTopics(entry),\n technologies: content.technologies || [],\n confidence\n };\n\n // Promote to shared store\n const entryId = await this.sharedStore.promoteEntry(input);\n\n // Create embedding for vector search\n const embeddingContent = this.createEmbeddingContent(input);\n const embedding = await this.embedder.embed(embeddingContent);\n\n await this.sharedVectorStore.upsert({\n id: randomUUID(),\n entryId,\n entryType: 'troubleshooting',\n content: embeddingContent,\n vector: embedding.vector,\n topics: input.topics,\n sourceProjectHash: projectHash\n });\n\n return {\n success: true,\n entryId\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Batch promote multiple entries\n */\n async promoteEntries(\n entries: Entry[],\n projectHash: string\n ): Promise<Map<string, PromotionResult>> {\n const results = new Map<string, PromotionResult>();\n\n for (const entry of entries) {\n const result = await this.promoteEntry(entry, projectHash);\n results.set(entry.entryId, result);\n }\n\n return results;\n }\n\n /**\n * Extract topics from entry\n */\n private extractTopics(entry: Entry): string[] {\n const topics: string[] = [];\n\n // Extract from title (meaningful words)\n const titleWords = entry.title\n .toLowerCase()\n .split(/[\\s\\-_]+/)\n .filter(w => w.length > 3 && !this.isStopWord(w));\n topics.push(...titleWords);\n\n // Extract from content if available\n const content = entry.contentJson as Record<string, unknown>;\n if (content.topics && Array.isArray(content.topics)) {\n topics.push(...content.topics.map(t => String(t).toLowerCase()));\n }\n\n // Extract technologies as topics\n if (content.technologies && Array.isArray(content.technologies)) {\n topics.push(...content.technologies.map(t => String(t).toLowerCase()));\n }\n\n // Dedupe and return\n return [...new Set(topics)];\n }\n\n /**\n * Check if word is a stop word\n */\n private isStopWord(word: string): boolean {\n const stopWords = new Set([\n 'the', 'and', 'for', 'with', 'this', 'that', 'from', 'have', 'been',\n 'were', 'are', 'was', 'had', 'has', 'will', 'would', 'could', 'should',\n 'when', 'where', 'what', 'which', 'while', 'error', 'problem', 'issue'\n ]);\n return stopWords.has(word);\n }\n\n /**\n * Calculate confidence score for entry\n */\n private calculateConfidence(entry: Entry): number {\n let confidence = 0.8; // Base confidence for verified entries\n\n // Boost if certified\n if (entry.stage === 'certified') {\n confidence = 0.95;\n }\n\n // Could add more factors:\n // - Number of evidence items\n // - Age of entry (older verified entries may be more reliable)\n // - Usage count if tracked\n\n return Math.min(confidence, 1.0);\n }\n\n /**\n * Create embedding content from input\n */\n private createEmbeddingContent(input: SharedTroubleshootingInput): string {\n const parts: string[] = [];\n\n parts.push(`Problem: ${input.title}`);\n\n if (input.symptoms.length > 0) {\n parts.push(`Symptoms: ${input.symptoms.join(', ')}`);\n }\n\n if (input.rootCause) {\n parts.push(`Root Cause: ${input.rootCause}`);\n }\n\n if (input.solution) {\n parts.push(`Solution: ${input.solution}`);\n }\n\n if (input.technologies && input.technologies.length > 0) {\n parts.push(`Technologies: ${input.technologies.join(', ')}`);\n }\n\n return parts.join('\\n');\n }\n}\n\nexport function createSharedPromoter(\n sharedStore: SharedStore,\n sharedVectorStore: SharedVectorStore,\n embedder: Embedder,\n config?: SharedStoreConfig\n): SharedPromoter {\n return new SharedPromoter(sharedStore, sharedVectorStore, embedder, config);\n}\n", "/**\n * SharedStore - Cross-project troubleshooting knowledge store\n * Manages promotion from verified entries to shared storage\n */\n\nimport { randomUUID } from 'crypto';\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport type {\n SharedTroubleshootingEntry,\n SharedTroubleshootingInput\n} from './types.js';\nimport { SharedEventStore } from './shared-event-store.js';\n\nexport class SharedStore {\n constructor(private sharedEventStore: SharedEventStore) {}\n\n private get db(): Database {\n return this.sharedEventStore.getDatabase();\n }\n\n /**\n * Promote a verified troubleshooting entry to shared storage\n */\n async promoteEntry(\n input: SharedTroubleshootingInput\n ): Promise<string> {\n const entryId = randomUUID();\n\n await dbRun(\n this.db,\n `INSERT INTO shared_troubleshooting (\n entry_id, source_project_hash, source_entry_id,\n title, symptoms, root_cause, solution, topics,\n technologies, confidence, promoted_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)\n ON CONFLICT (source_project_hash, source_entry_id)\n DO UPDATE SET\n title = excluded.title,\n symptoms = excluded.symptoms,\n root_cause = excluded.root_cause,\n solution = excluded.solution,\n topics = excluded.topics,\n technologies = excluded.technologies,\n confidence = CASE\n WHEN excluded.confidence > shared_troubleshooting.confidence\n THEN excluded.confidence\n ELSE shared_troubleshooting.confidence\n END`,\n [\n entryId,\n input.sourceProjectHash,\n input.sourceEntryId,\n input.title,\n JSON.stringify(input.symptoms),\n input.rootCause,\n input.solution,\n JSON.stringify(input.topics),\n JSON.stringify(input.technologies || []),\n input.confidence\n ]\n );\n\n return entryId;\n }\n\n /**\n * Search troubleshooting entries by text query\n */\n async search(\n query: string,\n options?: { topK?: number; minConfidence?: number }\n ): Promise<SharedTroubleshootingEntry[]> {\n const topK = options?.topK || 5;\n const minConfidence = options?.minConfidence || 0.5;\n const searchPattern = `%${query}%`;\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting\n WHERE (title LIKE ? OR root_cause LIKE ? OR solution LIKE ?)\n AND confidence >= ?\n ORDER BY confidence DESC, usage_count DESC\n LIMIT ?`,\n [searchPattern, searchPattern, searchPattern, minConfidence, topK]\n );\n\n return rows.map(this.rowToEntry);\n }\n\n /**\n * Search by topics\n */\n async searchByTopics(\n topics: string[],\n options?: { topK?: number; excludeProjectHash?: string }\n ): Promise<SharedTroubleshootingEntry[]> {\n const topK = options?.topK || 5;\n\n if (topics.length === 0) {\n return [];\n }\n\n const topicConditions = topics.map(() => `topics LIKE ?`).join(' OR ');\n const topicParams = topics.map(t => `%\"${t}\"%`);\n\n let query = `SELECT * FROM shared_troubleshooting WHERE (${topicConditions})`;\n const params: unknown[] = [...topicParams];\n\n if (options?.excludeProjectHash) {\n query += ` AND source_project_hash != ?`;\n params.push(options.excludeProjectHash);\n }\n\n query += ` ORDER BY confidence DESC, usage_count DESC LIMIT ?`;\n params.push(topK);\n\n const rows = await dbAll<Record<string, unknown>>(this.db, query, params);\n return rows.map(this.rowToEntry);\n }\n\n /**\n * Record usage of a shared entry (for ranking)\n */\n async recordUsage(entryId: string): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE shared_troubleshooting\n SET usage_count = usage_count + 1,\n last_used_at = CURRENT_TIMESTAMP\n WHERE entry_id = ?`,\n [entryId]\n );\n }\n\n /**\n * Get entry by ID\n */\n async get(entryId: string): Promise<SharedTroubleshootingEntry | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting WHERE entry_id = ?`,\n [entryId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntry(rows[0]);\n }\n\n /**\n * Get entry by source (project hash + entry ID)\n */\n async getBySource(\n projectHash: string,\n sourceEntryId: string\n ): Promise<SharedTroubleshootingEntry | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting\n WHERE source_project_hash = ? AND source_entry_id = ?`,\n [projectHash, sourceEntryId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntry(rows[0]);\n }\n\n /**\n * Check if an entry already exists in shared store\n */\n async exists(projectHash: string, sourceEntryId: string): Promise<boolean> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM shared_troubleshooting\n WHERE source_project_hash = ? AND source_entry_id = ?`,\n [projectHash, sourceEntryId]\n );\n return (result[0]?.count || 0) > 0;\n }\n\n /**\n * Get all entries (with limit for safety)\n */\n async getAll(options?: { limit?: number }): Promise<SharedTroubleshootingEntry[]> {\n const limit = options?.limit || 100;\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting\n ORDER BY confidence DESC, usage_count DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToEntry);\n }\n\n /**\n * Get total count\n */\n async count(): Promise<number> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM shared_troubleshooting`\n );\n return result[0]?.count || 0;\n }\n\n /**\n * Get statistics\n */\n async getStats(): Promise<{\n total: number;\n averageConfidence: number;\n topTopics: Array<{ topic: string; count: number }>;\n totalUsageCount: number;\n }> {\n const countResult = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM shared_troubleshooting`\n );\n const total = countResult[0]?.count || 0;\n\n const avgResult = await dbAll<{ avg: number | null }>(\n this.db,\n `SELECT AVG(confidence) as avg FROM shared_troubleshooting`\n );\n const averageConfidence = avgResult[0]?.avg || 0;\n\n const usageResult = await dbAll<{ total: number }>(\n this.db,\n `SELECT SUM(usage_count) as total FROM shared_troubleshooting`\n );\n const totalUsageCount = usageResult[0]?.total || 0;\n\n // Get topic counts\n const entries = await this.getAll({ limit: 1000 });\n const topicCounts: Record<string, number> = {};\n for (const entry of entries) {\n for (const topic of entry.topics) {\n topicCounts[topic] = (topicCounts[topic] || 0) + 1;\n }\n }\n\n const topTopics = Object.entries(topicCounts)\n .map(([topic, count]) => ({ topic, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n return { total, averageConfidence, topTopics, totalUsageCount };\n }\n\n /**\n * Delete an entry\n */\n async delete(entryId: string): Promise<boolean> {\n const before = await this.count();\n await dbRun(\n this.db,\n `DELETE FROM shared_troubleshooting WHERE entry_id = ?`,\n [entryId]\n );\n const after = await this.count();\n return before > after;\n }\n\n private rowToEntry(row: Record<string, unknown>): SharedTroubleshootingEntry {\n return {\n entryId: row.entry_id as string,\n sourceProjectHash: row.source_project_hash as string,\n sourceEntryId: row.source_entry_id as string,\n title: row.title as string,\n symptoms: JSON.parse(row.symptoms as string || '[]'),\n rootCause: row.root_cause as string,\n solution: row.solution as string,\n topics: JSON.parse(row.topics as string || '[]'),\n technologies: JSON.parse(row.technologies as string || '[]'),\n confidence: row.confidence as number,\n usageCount: row.usage_count as number || 0,\n lastUsedAt: row.last_used_at ? toDate(row.last_used_at) : undefined,\n promotedAt: toDate(row.promoted_at),\n createdAt: toDate(row.created_at)\n };\n }\n}\n\nexport function createSharedStore(\n sharedEventStore: SharedEventStore\n): SharedStore {\n return new SharedStore(sharedEventStore);\n}\n", "/**\n * SharedVectorStore - Vector store for cross-project semantic search\n * Location: ~/.claude-code/memory/shared/vectors/\n */\n\nimport * as lancedb from '@lancedb/lancedb';\nimport type { SharedEntryType, SharedSearchResult } from './types.js';\n\nexport interface SharedVectorRecord {\n id: string;\n entryId: string;\n entryType: SharedEntryType;\n content: string;\n vector: number[];\n topics: string[];\n sourceProjectHash?: string;\n}\n\nexport class SharedVectorStore {\n private db: lancedb.Connection | null = null;\n private table: lancedb.Table | null = null;\n private readonly tableName = 'shared_knowledge';\n\n constructor(private dbPath: string) {}\n\n /**\n * Initialize LanceDB connection\n */\n async initialize(): Promise<void> {\n if (this.db) return;\n\n this.db = await lancedb.connect(this.dbPath);\n\n try {\n const tables = await this.db.tableNames();\n if (tables.includes(this.tableName)) {\n this.table = await this.db.openTable(this.tableName);\n }\n } catch {\n this.table = null;\n }\n }\n\n /**\n * Add or update a shared vector record\n */\n async upsert(record: SharedVectorRecord): Promise<void> {\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = {\n id: record.id,\n entryId: record.entryId,\n entryType: record.entryType,\n content: record.content,\n vector: record.vector,\n topics: JSON.stringify(record.topics),\n sourceProjectHash: record.sourceProjectHash || ''\n };\n\n if (!this.table) {\n this.table = await this.db.createTable(this.tableName, [data]);\n } else {\n // Delete existing entry before adding (upsert behavior)\n try {\n await this.table.delete(`entryId = '${record.entryId}'`);\n } catch {\n // Entry might not exist, ignore\n }\n await this.table.add([data]);\n }\n }\n\n /**\n * Add multiple records in batch\n */\n async upsertBatch(records: SharedVectorRecord[]): Promise<void> {\n if (records.length === 0) return;\n\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = records.map(record => ({\n id: record.id,\n entryId: record.entryId,\n entryType: record.entryType,\n content: record.content,\n vector: record.vector,\n topics: JSON.stringify(record.topics),\n sourceProjectHash: record.sourceProjectHash || ''\n }));\n\n if (!this.table) {\n this.table = await this.db.createTable(this.tableName, data);\n } else {\n await this.table.add(data);\n }\n }\n\n /**\n * Search for similar vectors\n */\n async search(\n queryVector: number[],\n options: {\n limit?: number;\n minScore?: number;\n excludeProjectHash?: string;\n entryType?: SharedEntryType;\n } = {}\n ): Promise<SharedSearchResult[]> {\n await this.initialize();\n\n if (!this.table) {\n return [];\n }\n\n const { limit = 5, minScore = 0.7, excludeProjectHash, entryType } = options;\n\n let query = this.table\n .search(queryVector)\n .distanceType('cosine')\n .limit(limit * 2);\n\n // Apply filters\n const filters: string[] = [];\n if (excludeProjectHash) {\n filters.push(`sourceProjectHash != '${excludeProjectHash}'`);\n }\n if (entryType) {\n filters.push(`entryType = '${entryType}'`);\n }\n\n if (filters.length > 0) {\n query = query.where(filters.join(' AND '));\n }\n\n const results = await query.toArray();\n\n return results\n .filter(r => {\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return score >= minScore;\n })\n .slice(0, limit)\n .map(r => {\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return {\n id: r.id as string,\n entryId: r.entryId as string,\n content: r.content as string,\n score,\n entryType: r.entryType as SharedEntryType\n };\n });\n }\n\n /**\n * Delete vector by entry ID\n */\n async delete(entryId: string): Promise<void> {\n if (!this.table) return;\n await this.table.delete(`entryId = '${entryId}'`);\n }\n\n /**\n * Get total count\n */\n async count(): Promise<number> {\n if (!this.table) return 0;\n return this.table.countRows();\n }\n\n /**\n * Check if vector exists for entry\n */\n async exists(entryId: string): Promise<boolean> {\n if (!this.table) return false;\n\n try {\n const results = await this.table\n .search([])\n .where(`entryId = '${entryId}'`)\n .limit(1)\n .toArray();\n return results.length > 0;\n } catch {\n return false;\n }\n }\n}\n\nexport function createSharedVectorStore(dbPath: string): SharedVectorStore {\n return new SharedVectorStore(dbPath);\n}\n", "/**\n * Session registry for mapping Claude session IDs to project-local storage.\n */\n\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { hashProjectPath, normalizeProjectPath } from './project-path.js';\n\nconst REGISTRY_PATH = path.join(os.homedir(), '.claude-code', 'memory', 'session-registry.json');\n\nexport interface SessionRegistryEntry {\n projectPath: string;\n projectHash: string;\n registeredAt: string;\n}\n\nexport interface SessionRegistry {\n version: number;\n sessions: Record<string, SessionRegistryEntry>;\n}\n\nexport function loadSessionRegistry(): SessionRegistry {\n try {\n if (fs.existsSync(REGISTRY_PATH)) {\n const data = fs.readFileSync(REGISTRY_PATH, 'utf-8');\n return JSON.parse(data);\n }\n } catch (error) {\n console.error('Failed to load session registry:', error);\n }\n return { version: 1, sessions: {} };\n}\n\nfunction saveSessionRegistry(registry: SessionRegistry): void {\n const dir = path.dirname(REGISTRY_PATH);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const tempPath = REGISTRY_PATH + '.tmp';\n fs.writeFileSync(tempPath, JSON.stringify(registry, null, 2));\n fs.renameSync(tempPath, REGISTRY_PATH);\n}\n\nexport function registerSession(sessionId: string, projectPath: string): void {\n const registry = loadSessionRegistry();\n\n registry.sessions[sessionId] = {\n projectPath: normalizeProjectPath(projectPath),\n projectHash: hashProjectPath(projectPath),\n registeredAt: new Date().toISOString()\n };\n\n const entries = Object.entries(registry.sessions);\n if (entries.length > 1000) {\n const sorted = entries.sort((a, b) =>\n new Date(b[1].registeredAt).getTime() - new Date(a[1].registeredAt).getTime()\n );\n registry.sessions = Object.fromEntries(sorted.slice(0, 1000));\n }\n\n saveSessionRegistry(registry);\n}\n\nexport function getSessionProject(sessionId: string): SessionRegistryEntry | null {\n const registry = loadSessionRegistry();\n return registry.sessions[sessionId] || null;\n}\n", "import * as os from 'os';\nimport * as path from 'path';\n\nimport type { MemoryOperationsConfig, SharedStoreConfig } from '../core/types.js';\n\nexport interface MemoryServiceConfig {\n storagePath: string;\n embeddingModel?: string;\n readOnly?: boolean;\n /** Enable DuckDB analytics store (default: true for server, false for hooks) */\n analyticsEnabled?: boolean;\n /** Lightweight mode for hooks - skip heavy initialization (default: false) */\n lightweightMode?: boolean;\n /** Start only VectorWorker, skip GraduationWorker and SyncWorker (default: false) */\n embeddingOnly?: boolean;\n /** AgentMemory-inspired operations feature config (default: disabled). */\n operations?: MemoryOperationsConfig;\n}\n\nconst SHARED_STORAGE_PATH = path.join(os.homedir(), '.claude-code', 'memory', 'shared');\n\nexport const DISABLED_SHARED_STORE_CONFIG: SharedStoreConfig = {\n enabled: false,\n autoPromote: false,\n searchShared: false,\n minConfidenceForPromotion: 0.8,\n sharedStoragePath: SHARED_STORAGE_PATH\n};\n\nexport const DEFAULT_ENABLED_SHARED_STORE_CONFIG: SharedStoreConfig = {\n enabled: true,\n autoPromote: true,\n searchShared: true,\n minConfidenceForPromotion: 0.8,\n sharedStoragePath: SHARED_STORAGE_PATH\n};\n\nexport const DEFAULT_SHARED_STORAGE_PATH = SHARED_STORAGE_PATH;\n\nexport const DISABLED_MEMORY_OPERATIONS_CONFIG: MemoryOperationsConfig = {\n enabled: false,\n facets: { enabled: true },\n actions: { enabled: true },\n retention: { enabled: false, policyVersion: 'v1' },\n graphExpansion: { enabled: false, maxHops: 1 },\n lessons: { enabled: false },\n perspectiveMemory: {\n enabled: false,\n deriver: { enabled: false, maxEventsPerBatch: 20, maxObserversPerSession: 5 },\n specialists: {\n enabled: false,\n enabledProjectHashes: [],\n enabledKinds: ['deduction', 'induction', 'contradiction', 'actor_card_maintenance'],\n maxSourceObservations: 20,\n maxDerivedObservations: 5,\n maxCardUpdates: 3\n }\n }\n};\n\nexport const DEFAULT_ENABLED_MEMORY_OPERATIONS_CONFIG: MemoryOperationsConfig = {\n ...DISABLED_MEMORY_OPERATIONS_CONFIG,\n enabled: true\n};\n", "/**\n * Memory Service Registry\n *\n * Owns process-local MemoryService instance caching and project/session service\n * resolution. Keeping this out of MemoryService prevents the compatibility\n * facade from also being the application-level service locator.\n */\n\nimport * as path from 'path';\n\nimport type { SharedStoreConfig } from '../core/types.js';\nimport type { MemoryServiceConfig } from './memory-service-config.js';\n\nexport type MemoryServiceRegistryConfig = MemoryServiceConfig & {\n projectHash?: string;\n projectPath?: string;\n sharedStoreConfig?: SharedStoreConfig;\n};\n\nexport interface MemoryServiceRegistryDeps<TService> {\n createService: (config: MemoryServiceRegistryConfig) => TService;\n hashProjectPath: (projectPath: string) => string;\n getProjectStoragePath: (projectPath: string) => string;\n getSessionProject: (sessionId: string) => { projectHash: string; projectPath: string } | null;\n homedir: () => string;\n disabledSharedStoreConfig: SharedStoreConfig;\n serviceCache?: Map<string, TService>;\n}\n\nexport interface MemoryServiceRegistry<TService> {\n getDefaultMemoryService(): TService;\n getReadOnlyMemoryService(): TService;\n getMemoryServiceForProject(projectPath: string, sharedStoreConfig?: SharedStoreConfig): TService;\n getMemoryServiceForSession(sessionId: string): TService;\n getLightweightMemoryService(sessionId: string): TService;\n getLightweightMemoryServiceForProject(projectPath: string): TService;\n createMemoryService(config: MemoryServiceConfig): TService;\n}\n\nconst GLOBAL_KEY = '__global__';\n\nexport function createMemoryServiceRegistry<TService>(\n deps: MemoryServiceRegistryDeps<TService>\n): MemoryServiceRegistry<TService> {\n const serviceCache = deps.serviceCache ?? new Map<string, TService>();\n\n const getDefaultMemoryService = (): TService => {\n if (!serviceCache.has(GLOBAL_KEY)) {\n serviceCache.set(GLOBAL_KEY, deps.createService({\n storagePath: '~/.claude-code/memory',\n analyticsEnabled: false,\n sharedStoreConfig: deps.disabledSharedStoreConfig\n }));\n }\n return serviceCache.get(GLOBAL_KEY)!;\n };\n\n const getReadOnlyMemoryService = (): TService => deps.createService({\n storagePath: '~/.claude-code/memory',\n readOnly: true,\n analyticsEnabled: false,\n sharedStoreConfig: deps.disabledSharedStoreConfig\n });\n\n const getMemoryServiceForProject = (\n projectPath: string,\n sharedStoreConfig?: SharedStoreConfig\n ): TService => {\n const hash = deps.hashProjectPath(projectPath);\n\n if (!serviceCache.has(hash)) {\n serviceCache.set(hash, deps.createService({\n storagePath: deps.getProjectStoragePath(projectPath),\n projectHash: hash,\n projectPath,\n sharedStoreConfig: sharedStoreConfig ?? deps.disabledSharedStoreConfig,\n analyticsEnabled: false\n }));\n }\n\n // Project services are keyed only by project hash. This intentionally means\n // the first sharedStoreConfig used for a project wins; later calls for the\n // same project reuse the cached instance to preserve historical lock/cache\n // semantics instead of replacing the service graph under existing callers.\n return serviceCache.get(hash)!;\n };\n\n const getMemoryServiceForSession = (sessionId: string): TService => {\n const projectInfo = deps.getSessionProject(sessionId);\n\n if (projectInfo) {\n return getMemoryServiceForProject(projectInfo.projectPath);\n }\n\n return getDefaultMemoryService();\n };\n\n const getOrCreateLightweightProjectService = (\n projectHash: string,\n projectPath: string\n ): TService => {\n const key = `lightweight_${projectHash}`;\n if (!serviceCache.has(key)) {\n serviceCache.set(key, deps.createService({\n storagePath: deps.getProjectStoragePath(projectPath),\n projectHash,\n projectPath,\n lightweightMode: true,\n analyticsEnabled: false,\n sharedStoreConfig: deps.disabledSharedStoreConfig\n }));\n }\n\n return serviceCache.get(key)!;\n };\n\n const getLightweightMemoryService = (sessionId: string): TService => {\n const projectInfo = deps.getSessionProject(sessionId);\n if (projectInfo) {\n return getOrCreateLightweightProjectService(projectInfo.projectHash, projectInfo.projectPath);\n }\n\n const key = 'lightweight_global';\n if (!serviceCache.has(key)) {\n serviceCache.set(key, deps.createService({\n storagePath: path.join(deps.homedir(), '.claude-code', 'memory'),\n lightweightMode: true,\n analyticsEnabled: false,\n sharedStoreConfig: deps.disabledSharedStoreConfig\n }));\n }\n\n return serviceCache.get(key)!;\n };\n\n const getLightweightMemoryServiceForProject = (projectPath: string): TService => {\n const projectHash = deps.hashProjectPath(projectPath);\n return getOrCreateLightweightProjectService(projectHash, projectPath);\n };\n\n return {\n getDefaultMemoryService,\n getReadOnlyMemoryService,\n getMemoryServiceForProject,\n getMemoryServiceForSession,\n getLightweightMemoryService,\n getLightweightMemoryServiceForProject,\n createMemoryService: (config: MemoryServiceConfig): TService => deps.createService(config)\n };\n}\n", "#!/usr/bin/env node\n/**\n * Compatibility entrypoint for the Claude semantic daemon hook runtime.\n *\n * Implementation lives in the Claude adapter layer so core stays platform-agnostic.\n */\nimport { main } from '../adapters/claude/hooks/semantic-daemon.js';\n\nmain().catch(() => {\n process.exit(1);\n});\n"],
|
|
5
|
-
"mappings": "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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAiiBnB;AAID,QAAI;AACF,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",
|
|
4
|
+
"sourcesContent": ["import * as fs from 'fs';\nimport * as net from 'net';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { DISABLED_SHARED_STORE_CONFIG, MemoryService } from '../../../services/memory-service.js';\nimport { getProjectStoragePath } from '../../../core/registry/project-path.js';\nimport { getSessionProject } from '../../../core/registry/session-registry.js';\n\nexport interface SemanticDaemonRequest {\n type?: 'retrieve';\n sessionId?: string;\n prompt?: string;\n topK?: number;\n minScore?: number;\n}\n\nexport interface SemanticMemory {\n type: string;\n content: string;\n id?: string;\n score?: number;\n}\n\nexport interface SemanticDaemonResponse {\n ok: boolean;\n memories?: SemanticMemory[];\n error?: string;\n}\n\nconst SOCKET_PATH = process.env.CLAUDE_MEMORY_SEMANTIC_SOCKET || path.join(\n os.homedir(),\n '.claude-code',\n 'memory',\n 'semantic-daemon.sock'\n);\n\nconst IDLE_TIMEOUT_MS = parseInt(process.env.CLAUDE_MEMORY_SEMANTIC_DAEMON_IDLE_MS || '600000');\nconst serviceCache = new Map<string, MemoryService>();\n\nlet server: net.Server | null = null;\nlet idleTimer: NodeJS.Timeout | null = null;\nlet shuttingDown = false;\nlet processHandlersInstalled = false;\n\nfunction scheduleIdleShutdown(): void {\n if (idleTimer) {\n clearTimeout(idleTimer);\n }\n\n idleTimer = setTimeout(() => {\n shutdown(0).catch(() => {\n process.exit(0);\n });\n }, IDLE_TIMEOUT_MS);\n idleTimer.unref();\n}\n\nexport function parseSemanticDaemonRequest(raw: string): SemanticDaemonRequest {\n try {\n return JSON.parse(raw) as SemanticDaemonRequest;\n } catch {\n return {};\n }\n}\n\nexport function isValidSemanticDaemonRequest(\n input: SemanticDaemonRequest\n): input is Required<SemanticDaemonRequest> {\n return input.type === 'retrieve'\n && typeof input.sessionId === 'string'\n && input.sessionId.length > 0\n && typeof input.prompt === 'string'\n && input.prompt.length > 0\n && Number.isFinite(input.topK)\n && Number.isFinite(input.minScore);\n}\n\nexport function makeSemanticDaemonErrorResponse(error: unknown): SemanticDaemonResponse {\n return { ok: false, error: error instanceof Error ? error.message : 'unknown daemon error' };\n}\n\nexport function isVectorSessionFilterError(error: unknown): boolean {\n const message = error instanceof Error ? error.message.toLowerCase() : '';\n return message.includes('no field named sessionid');\n}\n\nfunction getServiceForSession(sessionId: string): MemoryService {\n const projectInfo = getSessionProject(sessionId);\n const key = projectInfo?.projectHash || '__global__';\n\n if (serviceCache.has(key)) {\n return serviceCache.get(key)!;\n }\n\n const service = new MemoryService({\n storagePath: projectInfo\n ? getProjectStoragePath(projectInfo.projectPath)\n : path.join(os.homedir(), '.claude-code', 'memory'),\n projectHash: projectInfo?.projectHash,\n projectPath: projectInfo?.projectPath,\n readOnly: false,\n embeddingOnly: true,\n analyticsEnabled: false,\n sharedStoreConfig: DISABLED_SHARED_STORE_CONFIG\n });\n\n serviceCache.set(key, service);\n return service;\n}\n\nexport async function handleSemanticDaemonRequest(raw: string): Promise<SemanticDaemonResponse> {\n const input = parseSemanticDaemonRequest(raw);\n if (!isValidSemanticDaemonRequest(input)) {\n return { ok: false, error: 'invalid request' };\n }\n\n try {\n const service = getServiceForSession(input.sessionId);\n let result;\n try {\n result = await service.retrieveMemories(input.prompt, {\n topK: input.topK,\n minScore: input.minScore,\n sessionId: input.sessionId,\n intentRewrite: true,\n adaptiveRerank: true,\n projectScopeMode: 'strict'\n });\n } catch (error) {\n if (!isVectorSessionFilterError(error)) {\n throw error;\n }\n\n // LanceDB field-case mismatch can fail sessionId filtering.\n // Retry without session filter and keep project strict scoping.\n result = await service.retrieveMemories(input.prompt, {\n topK: input.topK,\n minScore: input.minScore,\n intentRewrite: true,\n adaptiveRerank: true,\n projectScopeMode: 'strict'\n });\n }\n\n const memories = result.memories.map((m) => ({\n type: m.event.eventType,\n content: m.event.content,\n id: m.event.id,\n score: m.score\n }));\n\n return { ok: true, memories };\n } catch (error) {\n return makeSemanticDaemonErrorResponse(error);\n }\n}\n\nfunction createServer(): net.Server {\n return net.createServer({ allowHalfOpen: true }, (socket) => {\n scheduleIdleShutdown();\n socket.setEncoding('utf8');\n\n let requestRaw = '';\n\n socket.on('data', (chunk) => {\n requestRaw += chunk;\n if (requestRaw.length > 1024 * 1024) {\n socket.end(JSON.stringify({ ok: false, error: 'request too large' }));\n }\n });\n\n socket.on('end', async () => {\n const response = await handleSemanticDaemonRequest(requestRaw);\n socket.end(JSON.stringify(response));\n scheduleIdleShutdown();\n });\n\n socket.on('error', () => {\n // Ignore per-socket errors to keep daemon process alive.\n });\n });\n}\n\nasync function socketInUse(p: string): Promise<boolean> {\n if (!fs.existsSync(p)) return false;\n return new Promise((resolve) => {\n let settled = false;\n const client = net.createConnection(p);\n const done = (alive: boolean) => {\n if (settled) return;\n settled = true;\n client.destroy();\n resolve(alive);\n };\n client.on('connect', () => done(true));\n client.on('error', () => done(false));\n setTimeout(() => done(false), 120).unref();\n });\n}\n\nasync function listenServer(): Promise<void> {\n const socketDir = path.dirname(SOCKET_PATH);\n if (!fs.existsSync(socketDir)) {\n fs.mkdirSync(socketDir, { recursive: true });\n }\n\n if (await socketInUse(SOCKET_PATH)) {\n process.exit(0);\n }\n\n if (fs.existsSync(SOCKET_PATH)) {\n try {\n fs.unlinkSync(SOCKET_PATH);\n } catch {\n // Ignore stale socket unlink failures.\n }\n }\n\n server = createServer();\n\n await new Promise<void>((resolve, reject) => {\n if (!server) {\n reject(new Error('daemon server not initialized'));\n return;\n }\n\n server.once('error', reject);\n server.listen(SOCKET_PATH, () => {\n server?.off('error', reject);\n resolve();\n });\n });\n}\n\nasync function shutdown(code: number): Promise<void> {\n if (shuttingDown) return;\n shuttingDown = true;\n\n if (idleTimer) {\n clearTimeout(idleTimer);\n }\n idleTimer = null;\n\n const closePromises: Promise<void>[] = [];\n for (const service of serviceCache.values()) {\n closePromises.push(service.shutdown().catch(() => undefined));\n }\n await Promise.all(closePromises);\n serviceCache.clear();\n\n if (server) {\n await new Promise<void>((resolve) => {\n server?.close(() => resolve());\n });\n }\n server = null;\n\n if (fs.existsSync(SOCKET_PATH)) {\n try {\n fs.unlinkSync(SOCKET_PATH);\n } catch {\n // Ignore socket cleanup failure.\n }\n }\n\n process.exit(code);\n}\n\nfunction installProcessHandlers(): void {\n if (processHandlersInstalled) return;\n processHandlersInstalled = true;\n\n process.on('SIGINT', () => { shutdown(0).catch(() => process.exit(0)); });\n process.on('SIGTERM', () => { shutdown(0).catch(() => process.exit(0)); });\n process.on('uncaughtException', () => { shutdown(1).catch(() => process.exit(1)); });\n process.on('unhandledRejection', () => { shutdown(1).catch(() => process.exit(1)); });\n}\n\nexport async function main(): Promise<void> {\n installProcessHandlers();\n await listenServer();\n scheduleIdleShutdown();\n}\n", "/**\n * Memory Service - Main entry point for memory operations\n * Coordinates EventStore, VectorStore, Retriever, and Graduation\n */\n\nimport * as os from 'os';\n\nimport type { RetrievalResult, UnifiedRetrievalResult } from '../core/retriever.js';\nimport type { PromotionResult } from '../core/shared-promoter.js';\nimport type { SharedMemoryServices } from '../extensions/shared-memory/index.js';\nimport type {\n AppendResult,\n MemoryEvent,\n ToolObservationPayload,\n MemoryMode,\n EndlessModeConfig,\n WorkingSet,\n ConsolidatedMemory,\n EndlessModeStatus,\n ContinuityScore,\n SharedStoreConfig,\n Entry,\n OutboxStats,\n OutboxStatsOptions,\n OutboxRecoveryOptions,\n OutboxRecoveryResult,\n ProjectScopeRepairOptions,\n ProjectScopeRepairResult\n} from '../core/types.js';\nimport type { EndlessMemoryServices } from '../extensions/endless-memory/index.js';\nimport {\n type EmbeddingMaintenanceService,\n type EmbeddingModelMaintenanceOptions,\n type EmbeddingModelMaintenanceResult\n} from '../core/engine/embedding-maintenance-service.js';\nimport type { MemoryRuntimeService } from '../core/engine/memory-runtime-service.js';\nimport type { GraduationRunResult } from '../core/graduation-worker.js';\nimport type { IngestInterceptor } from '../core/ingest-interceptor.js';\nimport type { MemoryIngestService } from '../core/engine/memory-ingest-service.js';\nimport type { MemoryQueryService } from '../core/engine/memory-query-service.js';\nimport { createMemoryServiceComposition } from '../core/engine/memory-service-composition.js';\nimport {\n getProjectStoragePath as defaultGetProjectStoragePath,\n hashProjectPath as defaultHashProjectPath\n} from '../core/registry/project-path.js';\nimport { getSessionProject as defaultGetSessionProject } from '../core/registry/session-registry.js';\nimport {\n DEFAULT_ENABLED_SHARED_STORE_CONFIG,\n DEFAULT_SHARED_STORAGE_PATH,\n DISABLED_SHARED_STORE_CONFIG,\n type MemoryServiceConfig\n} from './memory-service-config.js';\nimport { createMemoryServiceRegistry } from './memory-service-registry.js';\nimport {\n type AccessedMemory,\n type HelpfulMemory,\n type HelpfulnessStats,\n type RecordQueryTraceInput,\n type RetrievalAnalyticsService,\n type RetrievalDisclosureExpansion,\n type RetrievalDisclosureExpandOptions,\n type RetrievalDisclosureSearchOptions,\n type RetrievalDisclosureSearchResponse,\n type RetrievalDisclosureService,\n type RetrievalDisclosureSource,\n type RetrievalOrchestrator,\n type RetrievalTrace,\n type RetrievalTraceStats,\n type RetrieveMemoriesOptions\n} from '../core/engine/retrieval-services.js';\nexport { getProjectStoragePath, hashProjectPath } from '../core/registry/project-path.js';\nexport {\n getSessionProject,\n registerSession,\n type SessionRegistry,\n type SessionRegistryEntry,\n loadSessionRegistry\n} from '../core/registry/session-registry.js';\n\nexport {\n DEFAULT_ENABLED_SHARED_STORE_CONFIG,\n DEFAULT_SHARED_STORAGE_PATH,\n DISABLED_SHARED_STORE_CONFIG,\n type MemoryServiceConfig\n} from './memory-service-config.js';\n\nexport class MemoryService {\n private readonly retrievalOrchestrator: RetrievalOrchestrator;\n private readonly retrievalDisclosureService: RetrievalDisclosureService;\n private readonly retrievalAnalyticsService: RetrievalAnalyticsService;\n private readonly embeddingMaintenanceService: EmbeddingMaintenanceService;\n private readonly runtimeService: MemoryRuntimeService;\n\n // Endless Mode components\n private readonly endlessMemoryServices: EndlessMemoryServices;\n\n // Shared Store components (cross-project knowledge)\n private sharedMemoryServices!: SharedMemoryServices;\n private projectHash: string | null = null;\n private projectPath: string | null = null;\n\n private readonly readOnly: boolean;\n private readonly lightweightMode: boolean;\n private readonly embeddingOnly: boolean;\n private readonly ingestService: MemoryIngestService;\n private readonly queryService: MemoryQueryService;\n\n constructor(config: MemoryServiceConfig & { projectHash?: string; projectPath?: string; sharedStoreConfig?: SharedStoreConfig }) {\n this.readOnly = config.readOnly ?? false;\n this.lightweightMode = config.lightweightMode ?? false;\n this.embeddingOnly = config.embeddingOnly ?? false;\n\n // Store project hash for shared store operations\n this.projectHash = config.projectHash || null;\n this.projectPath = config.projectPath || null;\n const sharedStoreConfig = config.sharedStoreConfig ?? DEFAULT_ENABLED_SHARED_STORE_CONFIG;\n\n const composition = createMemoryServiceComposition({\n config: {\n ...config,\n storagePath: config.storagePath,\n readOnly: this.readOnly,\n lightweightMode: this.lightweightMode,\n embeddingOnly: this.embeddingOnly,\n sharedStoreConfig\n },\n defaultSharedStoragePath: DEFAULT_SHARED_STORAGE_PATH,\n defaultSharedStoreConfig: DEFAULT_ENABLED_SHARED_STORE_CONFIG,\n initialize: () => this.initialize(),\n getProjectHash: () => this.projectHash,\n getProjectPath: () => this.projectPath\n });\n\n this.retrievalOrchestrator = composition.retrievalOrchestrator;\n this.retrievalDisclosureService = composition.retrievalDisclosureService;\n this.retrievalAnalyticsService = composition.retrievalAnalyticsService;\n this.ingestService = composition.ingestService;\n this.queryService = composition.queryService;\n this.endlessMemoryServices = composition.endlessMemoryServices;\n this.sharedMemoryServices = composition.sharedMemoryServices;\n this.runtimeService = composition.runtimeService;\n this.embeddingMaintenanceService = composition.embeddingMaintenanceService;\n }\n\n /**\n * Initialize all components\n */\n async initialize(): Promise<void> {\n await this.runtimeService.initialize();\n }\n\n registerIngestBefore(interceptor: IngestInterceptor): () => void {\n return this.ingestService.registerIngestBefore(interceptor);\n }\n\n registerIngestAfter(interceptor: IngestInterceptor): () => void {\n return this.ingestService.registerIngestAfter(interceptor);\n }\n\n registerIngestOnError(interceptor: IngestInterceptor): () => void {\n return this.ingestService.registerIngestOnError(interceptor);\n }\n\n /**\n * Start a new session\n */\n async startSession(sessionId: string, projectPath?: string): Promise<void> {\n return this.ingestService.startSession(sessionId, projectPath);\n }\n\n /**\n * End a session\n */\n async endSession(sessionId: string, summary?: string): Promise<void> {\n return this.ingestService.endSession(sessionId, summary);\n }\n\n /**\n * Store a user prompt\n */\n async storeUserPrompt(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestService.storeUserPrompt(sessionId, content, metadata);\n }\n\n /**\n * Store an agent response\n */\n async storeAgentResponse(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestService.storeAgentResponse(sessionId, content, metadata);\n }\n\n /**\n * Store a session summary\n */\n async storeSessionSummary(\n sessionId: string,\n summary: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestService.storeSessionSummary(sessionId, summary, metadata);\n }\n\n /**\n * Backfill session summaries for recent sessions that are missing them.\n * Called from session-start hook to catch sessions that ended without Stop hook.\n */\n async backfillMissingSummaries(currentSessionId: string, limit = 5): Promise<void> {\n return this.ingestService.backfillMissingSummaries(currentSessionId, limit);\n }\n\n /**\n * Generate a rule-based session summary from stored events.\n * Called at session end (Stop hook) when no LLM-generated summary exists.\n * Skips if a summary already exists for this session.\n */\n async generateSessionSummary(sessionId: string): Promise<void> {\n return this.ingestService.generateSessionSummary(sessionId);\n }\n\n /**\n * Store a tool observation\n */\n async storeToolObservation(\n sessionId: string,\n payload: ToolObservationPayload\n ): Promise<AppendResult> {\n return this.ingestService.storeToolObservation(sessionId, payload);\n }\n\n /**\n * Retrieve relevant memories for a query\n */\n async retrieveMemories(\n query: string,\n options?: RetrieveMemoriesOptions\n ): Promise<UnifiedRetrievalResult> {\n return this.retrievalOrchestrator.retrieveMemories(query, options);\n }\n\n /**\n * Layer 1 retrieval disclosure: lightweight search envelopes for UI/API/agent use.\n */\n async searchDisclosure(\n query: string,\n options?: RetrievalDisclosureSearchOptions\n ): Promise<RetrievalDisclosureSearchResponse> {\n return this.retrievalDisclosureService.search(query, options);\n }\n\n /**\n * Layer 2 retrieval disclosure: expand a search result into surrounding timeline context.\n */\n async expandDisclosure(\n resultId: string,\n options?: RetrievalDisclosureExpandOptions\n ): Promise<RetrievalDisclosureExpansion | null> {\n return this.retrievalDisclosureService.expand(resultId, options);\n }\n\n /**\n * Layer 3 retrieval disclosure: resolve a search result to its raw source event.\n */\n async sourceDisclosure(resultId: string): Promise<RetrievalDisclosureSource | null> {\n return this.retrievalDisclosureService.source(resultId);\n }\n\n /**\n * Fast keyword search using SQLite FTS5\n * Much faster than vector search - no embedding model needed\n */\n async keywordSearch(\n query: string,\n options?: { topK?: number; minScore?: number }\n ): Promise<Array<{event: MemoryEvent; score: number}>> {\n return this.queryService.keywordSearch(query, options);\n }\n\n /**\n * Rebuild FTS index (call after database upgrade)\n */\n async rebuildFtsIndex(): Promise<number> {\n return this.queryService.rebuildFtsIndex();\n }\n\n /**\n * Get session history\n */\n async getSessionHistory(sessionId: string): Promise<MemoryEvent[]> {\n return this.queryService.getSessionHistory(sessionId);\n }\n\n /**\n * Get recent events\n */\n async getRecentEvents(limit: number = 100): Promise<MemoryEvent[]> {\n return this.queryService.getRecentEvents(limit);\n }\n\n /**\n * Get memory statistics\n */\n\n async getOutboxStats(options?: OutboxStatsOptions): Promise<OutboxStats> {\n return this.queryService.getOutboxStats(options);\n }\n\n async recoverStuckOutboxItems(options?: OutboxRecoveryOptions): Promise<OutboxRecoveryResult> {\n return this.queryService.recoverStuckOutboxItems(options);\n }\n\n async repairLegacyProjectScope(options?: ProjectScopeRepairOptions): Promise<ProjectScopeRepairResult> {\n return this.queryService.repairLegacyProjectScope(options);\n }\n\n async getRetrievalTraceStats(): Promise<RetrievalTraceStats> {\n return this.retrievalAnalyticsService.getRetrievalTraceStats();\n }\n\n async getRecentRetrievalTraces(limit: number = 50): Promise<RetrievalTrace[]> {\n return this.retrievalAnalyticsService.getRecentRetrievalTraces(limit);\n }\n\n async getStats(): Promise<{\n totalEvents: number;\n vectorCount: number;\n levelStats: Array<{ level: string; count: number }>;\n }> {\n return this.queryService.getStats();\n }\n\n /**\n * Process pending embeddings\n */\n async processPendingEmbeddings(): Promise<number> {\n return this.runtimeService.processPendingEmbeddings();\n }\n\n /**\n * Get events by memory level\n */\n async getEventsByLevel(level: string, options?: { limit?: number; offset?: number }): Promise<MemoryEvent[]> {\n return this.queryService.getEventsByLevel(level, options);\n }\n\n /**\n * Get memory level for a specific event\n */\n async getEventLevel(eventId: string): Promise<string | null> {\n return this.queryService.getEventLevel(eventId);\n }\n\n /**\n * Format retrieval results as context for Claude\n */\n formatAsContext(result: RetrievalResult): string {\n return this.retrievalOrchestrator.formatAsContext(result);\n }\n\n // ============================================================\n // Shared Store Methods (Cross-Project Knowledge)\n // ============================================================\n\n /**\n * Check if shared store is enabled and initialized\n */\n isSharedStoreEnabled(): boolean {\n return this.sharedMemoryServices.isEnabled();\n }\n\n /**\n * Promote an entry to shared storage\n */\n async promoteToShared(entry: Entry): Promise<PromotionResult> {\n return this.sharedMemoryServices.promoteToShared(entry, this.projectHash);\n }\n\n /**\n * Get shared store statistics\n */\n async getSharedStoreStats(): Promise<{\n total: number;\n averageConfidence: number;\n topTopics: Array<{ topic: string; count: number }>;\n totalUsageCount: number;\n } | null> {\n return this.sharedMemoryServices.getStats();\n }\n\n /**\n * Search shared troubleshooting entries\n */\n async searchShared(\n query: string,\n options?: { topK?: number; minConfidence?: number }\n ) {\n return this.sharedMemoryServices.search(query, options);\n }\n\n /**\n * Get project hash for this service\n */\n getProjectHash(): string | null {\n return this.projectHash;\n }\n\n // ============================================================\n // Endless Mode Methods\n // ============================================================\n\n /**\n * Initialize Endless Mode components\n */\n async initializeEndlessMode(): Promise<void> {\n return this.endlessMemoryServices.initializeEndlessMode();\n }\n\n /**\n * Get Endless Mode configuration\n */\n async getEndlessConfig(): Promise<EndlessModeConfig> {\n return this.endlessMemoryServices.getEndlessConfig();\n }\n\n /**\n * Set Endless Mode configuration\n */\n async setEndlessConfig(config: Partial<EndlessModeConfig>): Promise<void> {\n return this.endlessMemoryServices.setEndlessConfig(config);\n }\n\n /**\n * Set memory mode (session or endless)\n */\n async setMode(mode: MemoryMode): Promise<void> {\n return this.endlessMemoryServices.setMode(mode);\n }\n\n /**\n * Get current memory mode\n */\n getMode(): MemoryMode {\n return this.endlessMemoryServices.getMode();\n }\n\n /**\n * Check if endless mode is active\n */\n isEndlessModeActive(): boolean {\n return this.endlessMemoryServices.isEndlessModeActive();\n }\n\n /**\n * Add event to Working Set (Endless Mode)\n */\n async addToWorkingSet(eventId: string, relevanceScore?: number): Promise<void> {\n return this.endlessMemoryServices.addToWorkingSet(eventId, relevanceScore);\n }\n\n /**\n * Get the current Working Set\n */\n async getWorkingSet(): Promise<WorkingSet | null> {\n return this.endlessMemoryServices.getWorkingSet();\n }\n\n /**\n * Search consolidated memories\n */\n async searchConsolidated(\n query: string,\n options?: { topK?: number }\n ): Promise<ConsolidatedMemory[]> {\n return this.endlessMemoryServices.searchConsolidated(query, options);\n }\n\n /**\n * Get all consolidated memories\n */\n async getConsolidatedMemories(limit?: number): Promise<ConsolidatedMemory[]> {\n return this.endlessMemoryServices.getConsolidatedMemories(limit);\n }\n\n /**\n * Increment access count for memories that were used in prompts\n */\n async incrementMemoryAccess(eventIds: string[]): Promise<void> {\n return this.retrievalOrchestrator.incrementMemoryAccess(eventIds);\n }\n\n /**\n * Get most accessed memories from events\n */\n async getMostAccessedMemories(limit: number = 10): Promise<AccessedMemory[]> {\n return this.retrievalAnalyticsService.getMostAccessedMemories(limit);\n }\n\n /**\n * Record a memory retrieval for helpfulness tracking\n */\n async recordRetrieval(eventId: string, sessionId: string, score: number, query: string): Promise<void> {\n return this.retrievalOrchestrator.recordRetrieval(eventId, sessionId, score, query);\n }\n\n /**\n * Record a query-level retrieval trace (used by user-prompt-submit hook).\n * Feeds the retrieval_traces table that powers dashboard stats.\n */\n async recordQueryTrace(input: RecordQueryTraceInput): Promise<void> {\n return this.retrievalOrchestrator.recordQueryTrace(input);\n }\n\n /**\n * Evaluate helpfulness of retrievals in a session (called at session end)\n */\n async evaluateSessionHelpfulness(sessionId: string): Promise<void> {\n await this.retrievalAnalyticsService.evaluateSessionHelpfulness(sessionId);\n }\n\n /**\n * Backfill helpfulness evaluation for sessions that ended without Stop hook.\n * Call on first turn of a new session to catch missed evaluations.\n */\n async evaluatePendingSessions(currentSessionId: string): Promise<void> {\n await this.retrievalAnalyticsService.evaluatePendingSessions(currentSessionId);\n }\n\n /**\n * Get most helpful memories ranked by helpfulness score\n */\n async getHelpfulMemories(limit: number = 10): Promise<HelpfulMemory[]> {\n return this.retrievalAnalyticsService.getHelpfulMemories(limit);\n }\n\n /**\n * Get helpfulness statistics for dashboard\n */\n async getHelpfulnessStats(since?: Date): Promise<HelpfulnessStats> {\n return this.retrievalAnalyticsService.getHelpfulnessStats(since);\n }\n\n /**\n * Mark a consolidated memory as accessed\n */\n async markMemoryAccessed(memoryId: string): Promise<void> {\n return this.endlessMemoryServices.markMemoryAccessed(memoryId);\n }\n\n /**\n * Calculate continuity score for current context\n */\n async calculateContinuity(\n content: string,\n metadata?: { files?: string[]; entities?: string[] }\n ): Promise<ContinuityScore | null> {\n return this.endlessMemoryServices.calculateContinuity(content, metadata);\n }\n\n /**\n * Record activity (for consolidation idle trigger)\n */\n recordActivity(): void {\n this.endlessMemoryServices.recordActivity();\n }\n\n /**\n * Force a consolidation run\n */\n async forceConsolidation(): Promise<number> {\n return this.endlessMemoryServices.forceConsolidation();\n }\n\n /**\n * Get Endless Mode status\n */\n async getEndlessModeStatus(): Promise<EndlessModeStatus> {\n return this.endlessMemoryServices.getEndlessModeStatus();\n }\n\n // ============================================================\n // Turn Grouping Methods\n // ============================================================\n\n /**\n * Get events grouped by turn for a session\n */\n async getSessionTurns(sessionId: string, options?: { limit?: number; offset?: number }): Promise<Array<{\n turnId: string;\n events: MemoryEvent[];\n startedAt: Date;\n promptPreview: string;\n eventCount: number;\n toolCount: number;\n hasResponse: boolean;\n }>> {\n return this.queryService.getSessionTurns(sessionId, options);\n }\n\n /**\n * Get all events for a specific turn\n */\n async getEventsByTurn(turnId: string): Promise<MemoryEvent[]> {\n return this.queryService.getEventsByTurn(turnId);\n }\n\n /**\n * Count total turns for a session\n */\n async countSessionTurns(sessionId: string): Promise<number> {\n return this.queryService.countSessionTurns(sessionId);\n }\n\n /**\n * Backfill turn_ids from metadata for events stored before the migration\n */\n async backfillTurnIds(): Promise<number> {\n return this.queryService.backfillTurnIds();\n }\n\n /**\n * Delete all events for a session (for force reimport)\n */\n async deleteSessionEvents(sessionId: string): Promise<number> {\n return this.queryService.deleteSessionEvents(sessionId);\n }\n\n /**\n * Format Endless Mode context for Claude\n */\n async formatEndlessContext(query: string): Promise<string> {\n return this.endlessMemoryServices.formatEndlessContext(query);\n }\n\n /**\n * Force a graduation evaluation run\n */\n async forceGraduation(): Promise<GraduationRunResult> {\n return this.runtimeService.forceGraduation();\n }\n\n /**\n * Record access to a memory event (for graduation scoring)\n */\n recordMemoryAccess(eventId: string, sessionId: string, confidence: number = 1.0): void {\n this.runtimeService.recordMemoryAccess(eventId, sessionId, confidence);\n }\n\n getEmbeddingModelName(): string {\n return this.embeddingMaintenanceService.getEmbeddingModelName();\n }\n\n /**\n * Ensure embedding model metadata is in sync and optionally migrate vectors.\n * Migration strategy: clear vector index + clear embedding outbox + re-enqueue all events.\n */\n async ensureEmbeddingModelForImport(\n options?: EmbeddingModelMaintenanceOptions\n ): Promise<EmbeddingModelMaintenanceResult> {\n return this.embeddingMaintenanceService.ensureEmbeddingModelForImport(options);\n }\n\n /**\n * Backward-compatible alias used by some hooks\n */\n async close(): Promise<void> {\n await this.shutdown();\n }\n\n /**\n * Shutdown service\n */\n async shutdown(): Promise<void> {\n await this.runtimeService.shutdown();\n }\n}\n\nconst defaultRegistry = createMemoryServiceRegistry<MemoryService>({\n createService: (config) => new MemoryService(config),\n hashProjectPath: defaultHashProjectPath,\n getProjectStoragePath: defaultGetProjectStoragePath,\n getSessionProject: defaultGetSessionProject,\n homedir: os.homedir,\n disabledSharedStoreConfig: DISABLED_SHARED_STORE_CONFIG\n});\n\nexport const getDefaultMemoryService = defaultRegistry.getDefaultMemoryService;\nexport const getReadOnlyMemoryService = defaultRegistry.getReadOnlyMemoryService;\nexport const getMemoryServiceForProject = defaultRegistry.getMemoryServiceForProject;\nexport const getMemoryServiceForSession = defaultRegistry.getMemoryServiceForSession;\nexport const getLightweightMemoryService = defaultRegistry.getLightweightMemoryService;\nexport const getLightweightMemoryServiceForProject = defaultRegistry.getLightweightMemoryServiceForProject;\nexport const createMemoryService = defaultRegistry.createMemoryService;\n", "/**\n * Memory Service Composition\n *\n * Owns constructor-time service graph wiring for MemoryService so the public\n * facade can stay focused on state assignment and method delegation.\n */\n\nimport * as os from 'os';\nimport * as path from 'path';\n\nimport type { EventStore } from '../event-store.js';\nimport type { Embedder } from '../embedder.js';\nimport type { GraduationPipeline } from '../graduation.js';\nimport { createToolObservationEmbedding as defaultCreateToolObservationEmbedding } from '../metadata-extractor.js';\nimport type { Retriever } from '../retriever.js';\nimport type { SQLiteEventStore } from '../sqlite-event-store.js';\nimport type { ToolObservationPayload, SharedStoreConfig, MemoryOperationsConfig } from '../types.js';\nimport type { VectorStore } from '../vector-store.js';\nimport {\n createEmbeddingMaintenanceService as defaultCreateEmbeddingMaintenanceService,\n type EmbeddingMaintenanceService,\n type EmbeddingMaintenanceServiceOptions\n} from './embedding-maintenance-service.js';\nimport {\n createEndlessMemoryServices as defaultCreateEndlessMemoryServices,\n type EndlessMemoryServices,\n type EndlessMemoryServicesOptions\n} from './endless-memory-services.js';\nimport {\n createMemoryEngineServices as defaultCreateMemoryEngineServices,\n type MemoryEngineServices,\n type MemoryEngineServicesOptions\n} from './memory-engine-services.js';\nimport {\n createMemoryRuntimeService as defaultCreateMemoryRuntimeService,\n type MemoryRuntimeService,\n type MemoryRuntimeServicesDeps\n} from './memory-runtime-service.js';\nimport type {\n MemoryIngestService\n} from './memory-ingest-service.js';\nimport type {\n MemoryQueryService\n} from './memory-query-service.js';\nimport {\n createSharedMemoryServices as defaultCreateSharedMemoryServices,\n type SharedMemoryServices,\n type SharedMemoryServicesOptions\n} from './shared-memory-services.js';\nimport type {\n RetrievalAnalyticsService,\n RetrievalDisclosureService,\n RetrievalOrchestrator\n} from './retrieval-services.js';\n\nexport interface MemoryServiceCompositionConfig {\n storagePath: string;\n embeddingModel?: string;\n readOnly?: boolean;\n lightweightMode?: boolean;\n embeddingOnly?: boolean;\n projectHash?: string;\n projectPath?: string;\n sharedStoreConfig?: SharedStoreConfig;\n operations?: MemoryOperationsConfig;\n}\n\nexport interface MemoryServiceCompositionFactories {\n expandPath?: (targetPath: string) => string;\n createToolObservationEmbedding?: (\n toolName: string,\n metadata: Record<string, unknown>,\n success: boolean\n ) => string;\n createMemoryEngineServices?: (options: MemoryEngineServicesOptions) => MemoryEngineServices;\n createEndlessMemoryServices?: (options: EndlessMemoryServicesOptions) => EndlessMemoryServices;\n createSharedMemoryServices?: (options: SharedMemoryServicesOptions) => SharedMemoryServices;\n createMemoryRuntimeService?: (deps: MemoryRuntimeServicesDeps) => MemoryRuntimeService;\n createEmbeddingMaintenanceService?: (\n options: EmbeddingMaintenanceServiceOptions\n ) => EmbeddingMaintenanceService;\n}\n\nexport interface MemoryServiceCompositionOptions {\n config: MemoryServiceCompositionConfig;\n defaultSharedStoragePath: string;\n defaultSharedStoreConfig?: SharedStoreConfig;\n initialize: () => Promise<void>;\n getProjectHash: () => string | null;\n getProjectPath?: () => string | null;\n factories?: MemoryServiceCompositionFactories;\n}\n\nexport interface MemoryServiceComposition {\n storagePath: string;\n readOnly: boolean;\n lightweightMode: boolean;\n embeddingOnly: boolean;\n sqliteStore: SQLiteEventStore;\n vectorStore: VectorStore;\n embedder: Embedder;\n retriever: Retriever;\n retrievalOrchestrator: RetrievalOrchestrator;\n retrievalDisclosureService: RetrievalDisclosureService;\n retrievalAnalyticsService: RetrievalAnalyticsService;\n embeddingMaintenanceService: EmbeddingMaintenanceService;\n runtimeService: MemoryRuntimeService;\n graduation: GraduationPipeline;\n endlessMemoryServices: EndlessMemoryServices;\n sharedMemoryServices: SharedMemoryServices;\n ingestService: MemoryIngestService;\n queryService: MemoryQueryService;\n}\n\nexport function createMemoryServiceComposition(\n options: MemoryServiceCompositionOptions\n): MemoryServiceComposition {\n const factories = options.factories ?? {};\n const expandPath = factories.expandPath ?? defaultExpandPath;\n const createToolEmbedding = factories.createToolObservationEmbedding ?? defaultCreateToolObservationEmbedding;\n\n const storagePath = expandPath(options.config.storagePath);\n const projectPathForMirror = options.getProjectPath?.() ?? options.config.projectPath ?? process.cwd();\n const readOnly = options.config.readOnly ?? false;\n const lightweightMode = options.config.lightweightMode ?? false;\n const embeddingOnly = options.config.embeddingOnly ?? false;\n const sharedStoreConfig = options.config.sharedStoreConfig ?? options.defaultSharedStoreConfig ?? {\n enabled: true,\n autoPromote: true,\n searchShared: true,\n minConfidenceForPromotion: 0.8,\n sharedStoragePath: options.defaultSharedStoragePath\n };\n\n let sharedMemoryServices: SharedMemoryServices | null = null;\n\n const engineServices = (factories.createMemoryEngineServices ?? defaultCreateMemoryEngineServices)({\n storagePath,\n readOnly,\n embeddingModel: options.config.embeddingModel,\n cwd: projectPathForMirror,\n initialize: options.initialize,\n getProjectHash: options.getProjectHash,\n getProjectPath: options.getProjectPath,\n hasSharedStore: () => sharedMemoryServices?.isEnabled() ?? false,\n memoryOperationsConfig: options.config.operations,\n sharedStore: {\n get: (entryId: string) => sharedMemoryServices?.getEntryForDisclosure(entryId) ?? Promise.resolve(null)\n },\n createToolObservationEmbedding: (payload: ToolObservationPayload) => createToolEmbedding(\n payload.toolName,\n payload.metadata || {},\n payload.success\n )\n });\n\n const endlessMemoryServices = (factories.createEndlessMemoryServices ?? defaultCreateEndlessMemoryServices)({\n eventStore: engineServices.sqliteStore as unknown as EventStore,\n configStore: engineServices.sqliteStore,\n initialize: options.initialize\n });\n\n sharedMemoryServices = (factories.createSharedMemoryServices ?? defaultCreateSharedMemoryServices)({\n config: sharedStoreConfig,\n defaultSharedStoragePath: options.defaultSharedStoragePath,\n readOnly,\n expandPath,\n embedder: engineServices.embedder,\n retriever: engineServices.retriever\n });\n\n const runtimeService = (factories.createMemoryRuntimeService ?? defaultCreateMemoryRuntimeService)({\n sqliteStore: engineServices.sqliteStore,\n eventStore: engineServices.sqliteStore as unknown as EventStore,\n vectorStore: engineServices.vectorStore,\n embedder: engineServices.embedder,\n retriever: engineServices.retriever,\n graduation: engineServices.graduation,\n endlessMemoryServices,\n sharedMemoryServices,\n readOnly,\n lightweightMode,\n embeddingOnly\n });\n\n const embeddingMaintenanceService = (\n factories.createEmbeddingMaintenanceService ?? defaultCreateEmbeddingMaintenanceService\n )({\n storagePath,\n initialize: options.initialize,\n getEmbeddingModelName: () => engineServices.embedder.getModelName(),\n vectorStore: engineServices.vectorStore,\n eventStore: {\n clearEmbeddingOutbox: () => engineServices.sqliteStore.clearEmbeddingOutbox(),\n getEventsPage: async (limit, offset) => {\n const events = await engineServices.sqliteStore.getEventsPage(limit, offset);\n return events.map((event) => ({ id: event.id, content: event.content }));\n },\n enqueueForEmbedding: async (eventId, content) => {\n await engineServices.sqliteStore.enqueueForEmbedding(eventId, content);\n }\n },\n getVectorWorker: () => runtimeService.getVectorWorker()\n });\n\n return {\n storagePath,\n readOnly,\n lightweightMode,\n embeddingOnly,\n sqliteStore: engineServices.sqliteStore,\n vectorStore: engineServices.vectorStore,\n embedder: engineServices.embedder,\n retriever: engineServices.retriever,\n retrievalOrchestrator: engineServices.retrievalOrchestrator,\n retrievalDisclosureService: engineServices.retrievalDisclosureService,\n retrievalAnalyticsService: engineServices.retrievalAnalyticsService,\n embeddingMaintenanceService,\n runtimeService,\n graduation: engineServices.graduation,\n endlessMemoryServices,\n sharedMemoryServices,\n ingestService: engineServices.ingestService,\n queryService: engineServices.queryService\n };\n}\n\nfunction defaultExpandPath(targetPath: string): string {\n if (targetPath.startsWith('~')) {\n return path.join(os.homedir(), targetPath.slice(1));\n }\n return targetPath;\n}\n", "/**\n * Metadata Extractor\n * Extracts tool-specific metadata from tool inputs and outputs\n */\n\nimport type { ToolMetadata } from './types.js';\n\n/**\n * Get file type from path\n */\nfunction getFileType(filePath: string): string | undefined {\n const ext = filePath.split('.').pop()?.toLowerCase();\n if (!ext) return undefined;\n\n const typeMap: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n py: 'python',\n rb: 'ruby',\n go: 'go',\n rs: 'rust',\n java: 'java',\n kt: 'kotlin',\n swift: 'swift',\n c: 'c',\n cpp: 'cpp',\n h: 'header',\n hpp: 'header',\n cs: 'csharp',\n php: 'php',\n html: 'html',\n css: 'css',\n scss: 'scss',\n json: 'json',\n yaml: 'yaml',\n yml: 'yaml',\n xml: 'xml',\n md: 'markdown',\n sql: 'sql',\n sh: 'shell',\n bash: 'shell',\n zsh: 'shell'\n };\n\n return typeMap[ext];\n}\n\n/**\n * Count lines in content\n */\nfunction countLines(content: string): number {\n return content.split('\\n').length;\n}\n\n/**\n * Extract bash command (without arguments that might contain secrets)\n */\nfunction extractCommand(fullCommand: string): string {\n // Get first word (command name)\n const parts = fullCommand.trim().split(/\\s+/);\n const command = parts[0];\n\n // For common commands, include safe arguments\n const safeCommands = ['git', 'npm', 'yarn', 'pnpm', 'node', 'python', 'go', 'cargo', 'make'];\n if (safeCommands.includes(command) && parts.length > 1) {\n // Include subcommand for these\n return `${command} ${parts[1]}`;\n }\n\n return command;\n}\n\n/**\n * Extract metadata from tool usage\n */\nexport function extractMetadata(\n toolName: string,\n input: Record<string, unknown>,\n output: string,\n success: boolean\n): ToolMetadata {\n switch (toolName) {\n case 'Read': {\n const filePath = input.file_path as string | undefined;\n return {\n filePath,\n fileType: filePath ? getFileType(filePath) : undefined,\n lineCount: success ? countLines(output) : undefined\n };\n }\n\n case 'Write': {\n const filePath = input.file_path as string | undefined;\n const content = input.content as string | undefined;\n return {\n filePath,\n fileType: filePath ? getFileType(filePath) : undefined,\n lineCount: content ? countLines(content) : undefined\n };\n }\n\n case 'Edit': {\n const filePath = input.file_path as string | undefined;\n return {\n filePath,\n fileType: filePath ? getFileType(filePath) : undefined\n };\n }\n\n case 'Bash': {\n const fullCommand = input.command as string | undefined;\n return {\n command: fullCommand ? extractCommand(fullCommand) : undefined\n };\n }\n\n case 'Grep': {\n const pattern = input.pattern as string | undefined;\n // Count matches from output\n const matchCount = success\n ? (output.match(/\\n/g) || []).length + (output.trim() ? 1 : 0)\n : undefined;\n return {\n pattern,\n matchCount\n };\n }\n\n case 'Glob': {\n const pattern = input.pattern as string | undefined;\n const matchCount = success\n ? (output.match(/\\n/g) || []).length + (output.trim() ? 1 : 0)\n : undefined;\n return {\n pattern,\n matchCount\n };\n }\n\n case 'WebFetch': {\n const url = input.url as string | undefined;\n // Try to extract status code from output\n const statusMatch = output.match(/status:\\s*(\\d{3})/i);\n return {\n url,\n statusCode: statusMatch ? parseInt(statusMatch[1], 10) : undefined\n };\n }\n\n case 'WebSearch': {\n return {};\n }\n\n case 'NotebookEdit': {\n const notebookPath = input.notebook_path as string | undefined;\n return {\n filePath: notebookPath,\n fileType: 'jupyter'\n };\n }\n\n default:\n return {};\n }\n}\n\n/**\n * Create embedding content for tool observation\n */\nexport function createToolObservationEmbedding(\n toolName: string,\n metadata: ToolMetadata,\n success: boolean\n): string {\n const parts: string[] = [];\n\n parts.push(`Tool: ${toolName}`);\n\n if (metadata.filePath) {\n parts.push(`File: ${metadata.filePath}`);\n }\n if (metadata.command) {\n parts.push(`Command: ${metadata.command}`);\n }\n if (metadata.pattern) {\n parts.push(`Pattern: ${metadata.pattern}`);\n }\n if (metadata.url) {\n // Only include domain for privacy\n try {\n const url = new URL(metadata.url);\n parts.push(`URL: ${url.hostname}`);\n } catch {\n // Invalid URL, skip\n }\n }\n\n parts.push(`Result: ${success ? 'Success' : 'Failed'}`);\n\n return parts.join('\\n');\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface EmbeddingMaintenanceEvent {\n id: string;\n content: string;\n}\n\nexport interface EmbeddingMaintenanceEventStore {\n clearEmbeddingOutbox(): Promise<void>;\n getEventsPage(limit: number, offset: number): Promise<EmbeddingMaintenanceEvent[]>;\n enqueueForEmbedding(eventId: string, content: string): Promise<void>;\n}\n\nexport interface EmbeddingMaintenanceVectorStore {\n count(): Promise<number>;\n clearAll(): Promise<void>;\n}\n\nexport interface EmbeddingMaintenanceVectorWorker {\n isRunning(): boolean;\n stop(): void;\n start(): void;\n}\n\nexport interface EmbeddingMaintenanceFileSystem {\n existsSync(targetPath: string): boolean;\n readFileSync(targetPath: string, encoding: BufferEncoding): string;\n writeFileSync(targetPath: string, content: string): void;\n}\n\nexport interface EmbeddingModelMaintenanceOptions {\n autoMigrate?: boolean;\n}\n\nexport interface EmbeddingModelMaintenanceResult {\n changed: boolean;\n previousModel: string | null;\n currentModel: string;\n enqueued: number;\n reason?: string;\n}\n\nexport interface EmbeddingMaintenanceServiceOptions {\n storagePath: string;\n initialize: () => Promise<void>;\n getEmbeddingModelName: () => string;\n vectorStore: EmbeddingMaintenanceVectorStore;\n eventStore: EmbeddingMaintenanceEventStore;\n getVectorWorker: () => EmbeddingMaintenanceVectorWorker | null;\n fileSystem?: EmbeddingMaintenanceFileSystem;\n}\n\nexport interface EmbeddingMaintenanceService {\n getEmbeddingModelName(): string;\n ensureEmbeddingModelForImport(options?: EmbeddingModelMaintenanceOptions): Promise<EmbeddingModelMaintenanceResult>;\n}\n\nconst DEFAULT_PAGE_SIZE = 1000;\n\nconst defaultFileSystem: EmbeddingMaintenanceFileSystem = {\n existsSync: fs.existsSync,\n readFileSync: (targetPath, encoding) => fs.readFileSync(targetPath, encoding),\n writeFileSync: (targetPath, content) => fs.writeFileSync(targetPath, content)\n};\n\nclass DefaultEmbeddingMaintenanceService implements EmbeddingMaintenanceService {\n private readonly fileSystem: EmbeddingMaintenanceFileSystem;\n\n constructor(private readonly options: EmbeddingMaintenanceServiceOptions) {\n this.fileSystem = options.fileSystem ?? defaultFileSystem;\n }\n\n getEmbeddingModelName(): string {\n return this.options.getEmbeddingModelName();\n }\n\n async ensureEmbeddingModelForImport(\n options?: EmbeddingModelMaintenanceOptions\n ): Promise<EmbeddingModelMaintenanceResult> {\n await this.options.initialize();\n\n const currentModel = this.getEmbeddingModelName();\n const metaPath = path.join(this.options.storagePath, 'embedding-meta.json');\n const previousModel = this.readPreviousModel(metaPath);\n const vectorCount = await this.options.vectorStore.count();\n const hasExistingVectors = vectorCount > 0;\n\n // First-time metadata write (no migration needed unless legacy vectors exist)\n if (!previousModel && !hasExistingVectors) {\n this.fileSystem.writeFileSync(\n metaPath,\n JSON.stringify({ model: currentModel, updatedAt: new Date().toISOString() }, null, 2)\n );\n return { changed: false, previousModel: null, currentModel, enqueued: 0, reason: 'initialized-meta' };\n }\n\n const modelChanged = previousModel !== currentModel;\n const legacyUnknownButVectorsExist = !previousModel && hasExistingVectors;\n\n if (!modelChanged && !legacyUnknownButVectorsExist) {\n return { changed: false, previousModel, currentModel, enqueued: 0 };\n }\n\n if (options?.autoMigrate === false) {\n return {\n changed: true,\n previousModel,\n currentModel,\n enqueued: 0,\n reason: legacyUnknownButVectorsExist ? 'legacy-vectors-without-meta' : 'model-mismatch'\n };\n }\n\n const worker = this.options.getVectorWorker();\n const wasRunning = worker?.isRunning() || false;\n if (wasRunning) worker?.stop();\n\n await this.options.vectorStore.clearAll();\n await this.options.eventStore.clearEmbeddingOutbox();\n\n const enqueued = await this.reenqueueAllEvents();\n\n this.fileSystem.writeFileSync(\n metaPath,\n JSON.stringify(\n {\n model: currentModel,\n previousModel,\n migratedAt: new Date().toISOString(),\n enqueued\n },\n null,\n 2\n )\n );\n\n if (wasRunning) worker?.start();\n\n return {\n changed: true,\n previousModel,\n currentModel,\n enqueued,\n reason: legacyUnknownButVectorsExist ? 'legacy-vectors-without-meta' : 'model-mismatch'\n };\n }\n\n private readPreviousModel(metaPath: string): string | null {\n try {\n if (this.fileSystem.existsSync(metaPath)) {\n const parsed = JSON.parse(this.fileSystem.readFileSync(metaPath, 'utf-8')) as { model?: string };\n return parsed?.model || null;\n }\n } catch {\n return null;\n }\n\n return null;\n }\n\n private async reenqueueAllEvents(): Promise<number> {\n let offset = 0;\n let enqueued = 0;\n\n while (true) {\n const page = await this.options.eventStore.getEventsPage(DEFAULT_PAGE_SIZE, offset);\n if (page.length === 0) break;\n\n for (const event of page) {\n await this.options.eventStore.enqueueForEmbedding(event.id, event.content);\n enqueued += 1;\n }\n\n offset += page.length;\n if (page.length < DEFAULT_PAGE_SIZE) break;\n }\n\n return enqueued;\n }\n}\n\nexport function createEmbeddingMaintenanceService(\n options: EmbeddingMaintenanceServiceOptions\n): EmbeddingMaintenanceService {\n return new DefaultEmbeddingMaintenanceService(options);\n}\n", "import { randomUUID } from 'crypto';\n\nimport type { EventStore } from '../../core/event-store.js';\nimport {\n createWorkingSetStore,\n type WorkingSetStore\n} from '../../core/working-set-store.js';\nimport {\n createConsolidatedStore,\n type ConsolidatedStore\n} from '../../core/consolidated-store.js';\nimport {\n createConsolidationWorker,\n type ConsolidationWorker\n} from '../../core/consolidation-worker.js';\nimport {\n createContinuityManager,\n type ContinuityManager\n} from '../../core/continuity-manager.js';\nimport type {\n ConsolidatedMemory,\n ContinuityScore,\n EndlessModeConfig,\n EndlessModeStatus,\n MemoryMode,\n WorkingSet\n} from '../../core/types.js';\n\nexport interface EndlessConfigStore {\n getEndlessConfig(key: string): Promise<unknown>;\n setEndlessConfig(key: string, value: unknown): Promise<void>;\n}\n\nexport interface WorkingSetStorePort {\n add(eventId: string, relevanceScore?: number): Promise<void>;\n get(): Promise<WorkingSet>;\n count(): Promise<number>;\n}\n\nexport interface ConsolidatedStorePort {\n search(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]>;\n getAll(options?: { limit?: number }): Promise<ConsolidatedMemory[]>;\n markAccessed(memoryId: string): Promise<void>;\n count(): Promise<number>;\n getLastConsolidationTime(): Promise<Date | null>;\n}\n\nexport interface ConsolidationWorkerPort {\n start(): void;\n stop(): void;\n recordActivity(): void;\n forceRun(): Promise<number>;\n}\n\nexport interface ContinuityManagerPort {\n createSnapshot(\n id: string,\n content: string,\n metadata?: { files?: string[]; entities?: string[] }\n ): unknown;\n calculateScore(snapshot: unknown): Promise<ContinuityScore>;\n}\n\nexport interface EndlessMemoryServicesFactories {\n createWorkingSetStore: (eventStore: EventStore, config: EndlessModeConfig) => WorkingSetStorePort;\n createConsolidatedStore: (eventStore: EventStore) => ConsolidatedStorePort;\n createConsolidationWorker: (\n workingSetStore: WorkingSetStorePort,\n consolidatedStore: ConsolidatedStorePort,\n config: EndlessModeConfig\n ) => ConsolidationWorkerPort;\n createContinuityManager: (eventStore: EventStore, config: EndlessModeConfig) => ContinuityManagerPort;\n randomUUID?: () => string;\n}\n\nexport interface EndlessMemoryServicesOptions {\n eventStore: EventStore;\n configStore: EndlessConfigStore;\n initialize: () => Promise<void>;\n factories?: EndlessMemoryServicesFactories;\n}\n\nexport interface EndlessMemoryServices {\n initializeFromSavedMode(): Promise<void>;\n initializeEndlessMode(): Promise<void>;\n getEndlessConfig(): Promise<EndlessModeConfig>;\n setEndlessConfig(config: Partial<EndlessModeConfig>): Promise<void>;\n setMode(mode: MemoryMode): Promise<void>;\n getMode(): MemoryMode;\n isEndlessModeActive(): boolean;\n addToWorkingSet(eventId: string, relevanceScore?: number): Promise<void>;\n getWorkingSet(): Promise<WorkingSet | null>;\n searchConsolidated(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]>;\n getConsolidatedMemories(limit?: number): Promise<ConsolidatedMemory[]>;\n markMemoryAccessed(memoryId: string): Promise<void>;\n calculateContinuity(\n content: string,\n metadata?: { files?: string[]; entities?: string[] }\n ): Promise<ContinuityScore | null>;\n recordActivity(): void;\n forceConsolidation(): Promise<number>;\n getEndlessModeStatus(): Promise<EndlessModeStatus>;\n formatEndlessContext(query: string): Promise<string>;\n shutdown(): void;\n}\n\nfunction getDefaultEndlessConfig(): EndlessModeConfig {\n return {\n enabled: true,\n workingSet: {\n maxEvents: 100,\n timeWindowHours: 24,\n minRelevanceScore: 0.5\n },\n consolidation: {\n triggerIntervalMs: 3600000,\n triggerEventCount: 100,\n triggerIdleMs: 1800000,\n useLLMSummarization: false\n },\n continuity: {\n minScoreForSeamless: 0.7,\n topicDecayHours: 48\n }\n };\n}\n\nconst defaultFactories: Required<EndlessMemoryServicesFactories> = {\n createWorkingSetStore: (eventStore, config) => createWorkingSetStore(eventStore, config) as WorkingSetStore,\n createConsolidatedStore: (eventStore) => createConsolidatedStore(eventStore) as ConsolidatedStore,\n createConsolidationWorker: (workingSetStore, consolidatedStore, config) => createConsolidationWorker(\n workingSetStore as WorkingSetStore,\n consolidatedStore as ConsolidatedStore,\n config\n ) as ConsolidationWorker,\n createContinuityManager: (eventStore, config) => createContinuityManager(eventStore, config) as ContinuityManager,\n randomUUID\n};\n\nclass DefaultEndlessMemoryServices implements EndlessMemoryServices {\n private readonly factories: Required<EndlessMemoryServicesFactories>;\n private workingSetStore: WorkingSetStorePort | null = null;\n private consolidatedStore: ConsolidatedStorePort | null = null;\n private consolidationWorker: ConsolidationWorkerPort | null = null;\n private continuityManager: ContinuityManagerPort | null = null;\n private mode: MemoryMode = 'session';\n\n constructor(private readonly options: EndlessMemoryServicesOptions) {\n this.factories = options.factories\n ? { ...options.factories, randomUUID: options.factories.randomUUID ?? randomUUID }\n : defaultFactories;\n }\n\n async initializeFromSavedMode(): Promise<void> {\n const savedMode = await this.options.configStore.getEndlessConfig('mode') as MemoryMode | null;\n if (savedMode === 'endless') {\n this.mode = 'endless';\n await this.initializeEndlessMode();\n }\n }\n\n async initializeEndlessMode(): Promise<void> {\n if (this.consolidationWorker) return;\n\n const config = await this.getEndlessConfig();\n const workingSetStore = this.factories.createWorkingSetStore(this.options.eventStore, config);\n const consolidatedStore = this.factories.createConsolidatedStore(this.options.eventStore);\n const consolidationWorker = this.factories.createConsolidationWorker(\n workingSetStore,\n consolidatedStore,\n config\n );\n const continuityManager = this.factories.createContinuityManager(this.options.eventStore, config);\n\n try {\n consolidationWorker.start();\n } catch (error) {\n consolidationWorker.stop();\n throw error;\n }\n\n this.workingSetStore = workingSetStore;\n this.consolidatedStore = consolidatedStore;\n this.consolidationWorker = consolidationWorker;\n this.continuityManager = continuityManager;\n }\n\n async getEndlessConfig(): Promise<EndlessModeConfig> {\n const savedConfig = await this.options.configStore.getEndlessConfig('config') as EndlessModeConfig | null;\n return savedConfig || getDefaultEndlessConfig();\n }\n\n async setEndlessConfig(config: Partial<EndlessModeConfig>): Promise<void> {\n const current = await this.getEndlessConfig();\n const merged = { ...current, ...config };\n await this.options.configStore.setEndlessConfig('config', merged);\n }\n\n async setMode(mode: MemoryMode): Promise<void> {\n await this.options.initialize();\n if (mode === this.mode) return;\n\n this.mode = mode;\n await this.options.configStore.setEndlessConfig('mode', mode);\n\n if (mode === 'endless') {\n await this.initializeEndlessMode();\n } else {\n this.stopEndlessMode();\n }\n }\n\n getMode(): MemoryMode {\n return this.mode;\n }\n\n isEndlessModeActive(): boolean {\n return this.mode === 'endless';\n }\n\n async addToWorkingSet(eventId: string, relevanceScore?: number): Promise<void> {\n if (!this.workingSetStore) return;\n await this.workingSetStore.add(eventId, relevanceScore);\n }\n\n async getWorkingSet(): Promise<WorkingSet | null> {\n if (!this.workingSetStore) return null;\n return this.workingSetStore.get();\n }\n\n async searchConsolidated(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]> {\n if (!this.consolidatedStore) return [];\n return this.consolidatedStore.search(query, options);\n }\n\n async getConsolidatedMemories(limit?: number): Promise<ConsolidatedMemory[]> {\n if (!this.consolidatedStore) return [];\n return this.consolidatedStore.getAll({ limit });\n }\n\n async markMemoryAccessed(memoryId: string): Promise<void> {\n if (!this.consolidatedStore) return;\n await this.consolidatedStore.markAccessed(memoryId);\n }\n\n async calculateContinuity(\n content: string,\n metadata?: { files?: string[]; entities?: string[] }\n ): Promise<ContinuityScore | null> {\n if (!this.continuityManager) return null;\n const snapshot = this.continuityManager.createSnapshot(\n this.factories.randomUUID(),\n content,\n metadata\n );\n return this.continuityManager.calculateScore(snapshot);\n }\n\n recordActivity(): void {\n this.consolidationWorker?.recordActivity();\n }\n\n async forceConsolidation(): Promise<number> {\n if (!this.consolidationWorker) return 0;\n return this.consolidationWorker.forceRun();\n }\n\n async getEndlessModeStatus(): Promise<EndlessModeStatus> {\n await this.options.initialize();\n\n let workingSetSize = 0;\n let continuityScore = 0.5;\n let consolidatedCount = 0;\n let lastConsolidation: Date | null = null;\n\n if (this.workingSetStore) {\n workingSetSize = await this.workingSetStore.count();\n const workingSet = await this.workingSetStore.get();\n continuityScore = workingSet.continuityScore;\n }\n\n if (this.consolidatedStore) {\n consolidatedCount = await this.consolidatedStore.count();\n lastConsolidation = await this.consolidatedStore.getLastConsolidationTime();\n }\n\n return {\n mode: this.mode,\n workingSetSize,\n continuityScore,\n consolidatedCount,\n lastConsolidation\n };\n }\n\n async formatEndlessContext(query: string): Promise<string> {\n if (!this.isEndlessModeActive()) {\n return '';\n }\n\n const workingSet = await this.getWorkingSet();\n const consolidated = await this.searchConsolidated(query, { topK: 3 });\n const continuity = await this.calculateContinuity(query);\n\n const parts: string[] = [];\n\n if (continuity) {\n const statusEmoji = continuity.transitionType === 'seamless' ? '\uD83D\uDD17' :\n continuity.transitionType === 'topic_shift' ? '\u21AA\uFE0F' : '\uD83C\uDD95';\n parts.push(`${statusEmoji} Context: ${continuity.transitionType} (score: ${continuity.score.toFixed(2)})`);\n }\n\n if (workingSet && workingSet.recentEvents.length > 0) {\n parts.push('\\n## Recent Context (Working Set)');\n const recent = workingSet.recentEvents.slice(0, 5);\n for (const event of recent) {\n const preview = event.content.slice(0, 80) + (event.content.length > 80 ? '...' : '');\n const time = event.timestamp.toLocaleTimeString();\n parts.push(`- ${time} [${event.eventType}] ${preview}`);\n }\n }\n\n if (consolidated.length > 0) {\n parts.push('\\n## Related Knowledge (Consolidated)');\n for (const memory of consolidated) {\n parts.push(`- ${memory.topics.slice(0, 3).join(', ')}: ${memory.summary.slice(0, 100)}...`);\n }\n }\n\n return parts.join('\\n');\n }\n\n shutdown(): void {\n this.stopEndlessMode();\n }\n\n private stopEndlessMode(): void {\n if (this.consolidationWorker) {\n this.consolidationWorker.stop();\n }\n this.workingSetStore = null;\n this.consolidatedStore = null;\n this.consolidationWorker = null;\n this.continuityManager = null;\n }\n}\n\nexport function createEndlessMemoryServices(options: EndlessMemoryServicesOptions): EndlessMemoryServices {\n return new DefaultEndlessMemoryServices(options);\n}\n", "/**\n * Working Set Store\n * Manages the active memory window for Endless Mode\n * Biomimetic: Simulates human working memory (7\u00B12 items, 15-30s duration)\n */\n\nimport { randomUUID } from 'crypto';\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport type {\n MemoryEvent,\n EndlessModeConfig,\n WorkingSet,\n WorkingSetItem\n} from './types.js';\nimport { EventStore } from './event-store.js';\n\nexport class WorkingSetStore {\n constructor(\n private eventStore: EventStore,\n private config: EndlessModeConfig\n ) {}\n\n private get db(): Database {\n return this.eventStore.getDatabase();\n }\n\n /**\n * Add an event to the working set\n */\n async add(eventId: string, relevanceScore: number = 1.0, topics?: string[]): Promise<void> {\n const expiresAt = new Date(\n Date.now() + this.config.workingSet.timeWindowHours * 60 * 60 * 1000\n );\n\n await dbRun(\n this.db,\n `INSERT OR REPLACE INTO working_set (id, event_id, added_at, relevance_score, topics, expires_at)\n VALUES (?, ?, CURRENT_TIMESTAMP, ?, ?, ?)`,\n [\n randomUUID(),\n eventId,\n relevanceScore,\n JSON.stringify(topics || []),\n expiresAt.toISOString()\n ]\n );\n\n // Enforce size limit\n await this.enforceLimit();\n }\n\n /**\n * Get the current working set\n */\n async get(): Promise<WorkingSet> {\n // Clean up expired items first\n await this.cleanup();\n\n // Get working set items with their events\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT ws.*, e.*\n FROM working_set ws\n JOIN events e ON ws.event_id = e.id\n ORDER BY ws.relevance_score DESC, ws.added_at DESC\n LIMIT ?`,\n [this.config.workingSet.maxEvents]\n );\n\n const events: MemoryEvent[] = rows.map(row => ({\n id: row.id as string,\n eventType: row.event_type as 'user_prompt' | 'agent_response' | 'session_summary' | 'tool_observation',\n sessionId: row.session_id as string,\n timestamp: toDate(row.timestamp),\n content: row.content as string,\n canonicalKey: row.canonical_key as string,\n dedupeKey: row.dedupe_key as string,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined\n }));\n\n return {\n recentEvents: events,\n lastActivity: events.length > 0 ? events[0].timestamp : new Date(),\n continuityScore: await this.calculateContinuityScore()\n };\n }\n\n /**\n * Get working set items (metadata only)\n */\n async getItems(): Promise<WorkingSetItem[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM working_set ORDER BY relevance_score DESC, added_at DESC`\n );\n\n return rows.map(row => ({\n id: row.id as string,\n eventId: row.event_id as string,\n addedAt: toDate(row.added_at),\n relevanceScore: row.relevance_score as number,\n topics: row.topics ? JSON.parse(row.topics as string) : undefined,\n expiresAt: toDate(row.expires_at)\n }));\n }\n\n /**\n * Update relevance score for an event\n */\n async updateRelevance(eventId: string, score: number): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE working_set SET relevance_score = ? WHERE event_id = ?`,\n [score, eventId]\n );\n }\n\n /**\n * Prune specific events from working set (after consolidation)\n */\n async prune(eventIds: string[]): Promise<void> {\n if (eventIds.length === 0) return;\n\n const placeholders = eventIds.map(() => '?').join(',');\n await dbRun(\n this.db,\n `DELETE FROM working_set WHERE event_id IN (${placeholders})`,\n eventIds\n );\n }\n\n /**\n * Get the count of items in working set\n */\n async count(): Promise<number> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM working_set`\n );\n return result[0]?.count || 0;\n }\n\n /**\n * Clear the entire working set\n */\n async clear(): Promise<void> {\n await dbRun(this.db, `DELETE FROM working_set`);\n }\n\n /**\n * Check if an event is in the working set\n */\n async contains(eventId: string): Promise<boolean> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM working_set WHERE event_id = ?`,\n [eventId]\n );\n return (result[0]?.count || 0) > 0;\n }\n\n /**\n * Refresh expiration for an event (rehears al - keep relevant items longer)\n */\n async refresh(eventId: string): Promise<void> {\n const newExpiresAt = new Date(\n Date.now() + this.config.workingSet.timeWindowHours * 60 * 60 * 1000\n );\n\n await dbRun(\n this.db,\n `UPDATE working_set SET expires_at = ? WHERE event_id = ?`,\n [newExpiresAt.toISOString(), eventId]\n );\n }\n\n /**\n * Clean up expired items\n */\n private async cleanup(): Promise<void> {\n await dbRun(\n this.db,\n `DELETE FROM working_set WHERE expires_at < datetime('now')`\n );\n }\n\n /**\n * Enforce the maximum size limit\n * Removes lowest relevance items when over limit\n */\n private async enforceLimit(): Promise<void> {\n const maxEvents = this.config.workingSet.maxEvents;\n\n // Get IDs to keep (highest relevance, most recent)\n const keepIds = await dbAll<{ id: string }>(\n this.db,\n `SELECT id FROM working_set\n ORDER BY relevance_score DESC, added_at DESC\n LIMIT ?`,\n [maxEvents]\n );\n\n if (keepIds.length === 0) return;\n\n const keepIdList = keepIds.map(r => r.id);\n const placeholders = keepIdList.map(() => '?').join(',');\n\n // Delete everything not in the keep list\n await dbRun(\n this.db,\n `DELETE FROM working_set WHERE id NOT IN (${placeholders})`,\n keepIdList\n );\n }\n\n /**\n * Calculate continuity score based on recent context transitions\n */\n private async calculateContinuityScore(): Promise<number> {\n const result = await dbAll<{ avg_score: number | null }>(\n this.db,\n `SELECT AVG(continuity_score) as avg_score\n FROM continuity_log\n WHERE created_at > datetime('now', '-1 hour')`\n );\n\n return result[0]?.avg_score ?? 0.5;\n }\n\n /**\n * Get topics from current working set for context matching\n */\n async getActiveTopics(): Promise<string[]> {\n const rows = await dbAll<{ topics: string }>(\n this.db,\n `SELECT topics FROM working_set WHERE topics IS NOT NULL`\n );\n\n const allTopics = new Set<string>();\n for (const row of rows) {\n const topics = JSON.parse(row.topics) as string[];\n topics.forEach(t => allTopics.add(t));\n }\n\n return Array.from(allTopics);\n }\n}\n\n/**\n * Create a Working Set Store instance\n */\nexport function createWorkingSetStore(\n eventStore: EventStore,\n config: EndlessModeConfig\n): WorkingSetStore {\n return new WorkingSetStore(eventStore, config);\n}\n", "/**\n * SQLite Database Wrapper\n * Provides Promise-based interface over better-sqlite3 synchronous API\n */\n\nimport BetterSqlite3 from 'better-sqlite3';\n\nexport type Database = BetterSqlite3.Database;\n\n/**\n * Safely converts a value to a Date object\n */\nexport function toDate(value: unknown): Date {\n if (value instanceof Date) return value;\n if (typeof value === 'string') return new Date(value);\n if (typeof value === 'number') return new Date(value);\n return new Date(String(value));\n}\n\nexport interface DatabaseOptions {\n readOnly?: boolean;\n}\n\n/**\n * Creates a new SQLite database connection\n */\nexport function createDatabase(dbPath: string, options?: DatabaseOptions): Database {\n return new BetterSqlite3(dbPath, { readonly: options?.readOnly });\n}\n\n/**\n * Executes a statement that doesn't return rows\n */\nexport function dbRun(db: Database, sql: string, params: unknown[] = []): Promise<void> {\n db.prepare(sql).run(...(params as never[]));\n return Promise.resolve();\n}\n\n/**\n * Executes a query and returns all rows\n */\nexport function dbAll<T = Record<string, unknown>>(\n db: Database,\n sql: string,\n params: unknown[] = []\n): Promise<T[]> {\n return Promise.resolve(db.prepare(sql).all(...(params as never[])) as T[]);\n}\n\n/**\n * Closes the database connection\n */\nexport function dbClose(db: Database): Promise<void> {\n db.close();\n return Promise.resolve();\n}\n\n/**\n * Executes multiple statements\n */\nexport function dbExec(db: Database, sql: string): Promise<void> {\n db.exec(sql);\n return Promise.resolve();\n}\n", "/**\n * Consolidated Store\n * Manages long-term integrated memories for Endless Mode\n * Biomimetic: Simulates memory consolidation that occurs during sleep\n */\n\nimport { randomUUID } from 'crypto';\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport type {\n ConsolidatedMemory,\n ConsolidatedMemoryInput,\n ConsolidationRule,\n ConsolidationRuleInput\n} from './types.js';\nimport { EventStore } from './event-store.js';\n\nexport class ConsolidatedStore {\n constructor(private eventStore: EventStore) {}\n\n private get db(): Database {\n return this.eventStore.getDatabase();\n }\n\n /**\n * Create a new consolidated memory\n */\n async create(input: ConsolidatedMemoryInput): Promise<string> {\n const memoryId = randomUUID();\n\n await dbRun(\n this.db,\n `INSERT INTO consolidated_memories\n (memory_id, summary, topics, source_events, confidence, created_at)\n VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)`,\n [\n memoryId,\n input.summary,\n JSON.stringify(input.topics),\n JSON.stringify(input.sourceEvents),\n input.confidence\n ]\n );\n\n return memoryId;\n }\n\n /**\n * Get a consolidated memory by ID\n */\n async get(memoryId: string): Promise<ConsolidatedMemory | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories WHERE memory_id = ?`,\n [memoryId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToMemory(rows[0]);\n }\n\n /**\n * Search consolidated memories by query (simple text search)\n */\n async search(query: string, options?: { topK?: number }): Promise<ConsolidatedMemory[]> {\n const topK = options?.topK || 5;\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n WHERE summary LIKE ?\n ORDER BY confidence DESC\n LIMIT ?`,\n [`%${query}%`, topK]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Search by topics\n */\n async searchByTopics(topics: string[], options?: { topK?: number }): Promise<ConsolidatedMemory[]> {\n const topK = options?.topK || 5;\n\n // Build topic filter\n const topicConditions = topics.map(() => `topics LIKE ?`).join(' OR ');\n const topicParams = topics.map(t => `%\"${t}\"%`);\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n WHERE ${topicConditions}\n ORDER BY confidence DESC\n LIMIT ?`,\n [...topicParams, topK]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Get all consolidated memories ordered by confidence\n */\n async getAll(options?: { limit?: number }): Promise<ConsolidatedMemory[]> {\n const limit = options?.limit || 100;\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n ORDER BY confidence DESC, created_at DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Get recently created memories\n */\n async getRecent(options?: { limit?: number; hours?: number }): Promise<ConsolidatedMemory[]> {\n const limit = options?.limit || 10;\n const hours = options?.hours || 24;\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n WHERE created_at > datetime('now', '-${hours} hours')\n ORDER BY created_at DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Mark a memory as accessed (tracks usage for importance scoring)\n */\n async markAccessed(memoryId: string): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE consolidated_memories\n SET accessed_at = CURRENT_TIMESTAMP,\n access_count = access_count + 1\n WHERE memory_id = ?`,\n [memoryId]\n );\n }\n\n /**\n * Update confidence score for a memory\n */\n async updateConfidence(memoryId: string, confidence: number): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE consolidated_memories\n SET confidence = ?\n WHERE memory_id = ?`,\n [confidence, memoryId]\n );\n }\n\n /**\n * Delete a consolidated memory\n */\n async delete(memoryId: string): Promise<void> {\n await dbRun(\n this.db,\n `DELETE FROM consolidated_memories WHERE memory_id = ?`,\n [memoryId]\n );\n }\n\n /**\n * Create a long-term rule promoted from stable summaries\n */\n async createRule(input: ConsolidationRuleInput): Promise<string> {\n const ruleId = randomUUID();\n\n await dbRun(\n this.db,\n `INSERT INTO consolidated_rules\n (rule_id, rule, topics, source_memory_ids, source_events, confidence, created_at)\n VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)`,\n [\n ruleId,\n input.rule,\n JSON.stringify(input.topics),\n JSON.stringify(input.sourceMemoryIds),\n JSON.stringify(input.sourceEvents),\n input.confidence\n ]\n );\n\n return ruleId;\n }\n\n async getRules(options?: { limit?: number }): Promise<ConsolidationRule[]> {\n const limit = options?.limit || 100;\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_rules ORDER BY confidence DESC, created_at DESC LIMIT ?`,\n [limit]\n );\n\n return rows.map((row) => ({\n ruleId: row.rule_id as string,\n rule: row.rule as string,\n topics: JSON.parse((row.topics as string) || '[]'),\n sourceMemoryIds: JSON.parse((row.source_memory_ids as string) || '[]'),\n sourceEvents: JSON.parse((row.source_events as string) || '[]'),\n confidence: Number(row.confidence ?? 0.5),\n createdAt: toDate(row.created_at) || new Date()\n }));\n }\n\n async countRules(): Promise<number> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_rules`\n );\n return result[0]?.count || 0;\n }\n\n async hasRuleForSourceMemory(memoryId: string): Promise<boolean> {\n const rows = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_rules WHERE source_memory_ids LIKE ?`,\n [`%\"${memoryId}\"%`]\n );\n return (rows[0]?.count || 0) > 0;\n }\n\n /**\n * Get count of consolidated memories\n */\n async count(): Promise<number> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_memories`\n );\n return result[0]?.count || 0;\n }\n\n /**\n * Get most accessed memories (for importance scoring)\n */\n async getMostAccessed(limit: number = 10): Promise<ConsolidatedMemory[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM consolidated_memories\n WHERE access_count > 0\n ORDER BY access_count DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToMemory);\n }\n\n /**\n * Get statistics about consolidated memories\n */\n async getStats(): Promise<{\n total: number;\n averageConfidence: number;\n topicCounts: Record<string, number>;\n recentCount: number;\n }> {\n const total = await this.count();\n\n const avgResult = await dbAll<{ avg: number | null }>(\n this.db,\n `SELECT AVG(confidence) as avg FROM consolidated_memories`\n );\n const averageConfidence = avgResult[0]?.avg || 0;\n\n const recentResult = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_memories\n WHERE created_at > datetime('now', '-24 hours')`\n );\n const recentCount = recentResult[0]?.count || 0;\n\n // Get topic counts\n const allMemories = await this.getAll({ limit: 1000 });\n const topicCounts: Record<string, number> = {};\n for (const memory of allMemories) {\n for (const topic of memory.topics) {\n topicCounts[topic] = (topicCounts[topic] || 0) + 1;\n }\n }\n\n return {\n total,\n averageConfidence,\n topicCounts,\n recentCount\n };\n }\n\n /**\n * Check if source events are already consolidated\n */\n async isAlreadyConsolidated(eventIds: string[]): Promise<boolean> {\n for (const eventId of eventIds) {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM consolidated_memories\n WHERE source_events LIKE ?`,\n [`%\"${eventId}\"%`]\n );\n if ((result[0]?.count || 0) > 0) return true;\n }\n return false;\n }\n\n /**\n * Get the last consolidation time\n */\n async getLastConsolidationTime(): Promise<Date | null> {\n const result = await dbAll<{ created_at: string }>(\n this.db,\n `SELECT created_at FROM consolidated_memories\n ORDER BY created_at DESC\n LIMIT 1`\n );\n\n if (result.length === 0) return null;\n return new Date(result[0].created_at);\n }\n\n /**\n * Convert database row to ConsolidatedMemory\n */\n private rowToMemory(row: Record<string, unknown>): ConsolidatedMemory {\n return {\n memoryId: row.memory_id as string,\n summary: row.summary as string,\n topics: JSON.parse(row.topics as string || '[]'),\n sourceEvents: JSON.parse(row.source_events as string || '[]'),\n confidence: row.confidence as number,\n createdAt: toDate(row.created_at),\n accessedAt: row.accessed_at ? toDate(row.accessed_at) : undefined,\n accessCount: row.access_count as number || 0\n };\n }\n}\n\n/**\n * Create a Consolidated Store instance\n */\nexport function createConsolidatedStore(eventStore: EventStore): ConsolidatedStore {\n return new ConsolidatedStore(eventStore);\n}\n", "/**\n * Consolidation Worker\n * Periodically consolidates working set into long-term memory\n * Biomimetic: Simulates memory consolidation during sleep/idle periods\n */\n\nimport type {\n EndlessModeConfig,\n MemoryEvent,\n EventGroup,\n WorkingSet,\n ConsolidationCostQualityReport\n} from './types.js';\nimport { WorkingSetStore } from './working-set-store.js';\nimport { ConsolidatedStore } from './consolidated-store.js';\n\nexport class ConsolidationWorker {\n private running = false;\n private timeout: NodeJS.Timeout | null = null;\n private lastActivity: Date = new Date();\n\n constructor(\n private workingSetStore: WorkingSetStore,\n private consolidatedStore: ConsolidatedStore,\n private config: EndlessModeConfig\n ) {}\n\n /**\n * Start the consolidation worker\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.scheduleNext();\n }\n\n /**\n * Stop the consolidation worker\n */\n stop(): void {\n this.running = false;\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n }\n\n /**\n * Record activity (resets idle timer)\n */\n recordActivity(): void {\n this.lastActivity = new Date();\n }\n\n /**\n * Check if currently running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Force a consolidation run (manual trigger)\n */\n async forceRun(): Promise<number> {\n const out = await this.consolidateWithReport();\n return out.consolidatedCount;\n }\n\n /**\n * Force a consolidation run and return metrics report\n */\n async forceRunWithReport(): Promise<{\n consolidatedCount: number;\n promotedRuleCount: number;\n report: ConsolidationCostQualityReport;\n }> {\n return this.consolidateWithReport();\n }\n\n /**\n * Schedule the next consolidation check\n */\n private scheduleNext(): void {\n if (!this.running) return;\n\n this.timeout = setTimeout(\n () => this.run(),\n this.config.consolidation.triggerIntervalMs\n );\n }\n\n /**\n * Run consolidation check\n */\n private async run(): Promise<void> {\n if (!this.running) return;\n\n try {\n await this.checkAndConsolidate();\n } catch (error) {\n console.error('Consolidation error:', error);\n }\n\n this.scheduleNext();\n }\n\n /**\n * Check conditions and consolidate if needed\n */\n private async checkAndConsolidate(): Promise<void> {\n const workingSet = await this.workingSetStore.get();\n\n if (!this.shouldConsolidate(workingSet)) {\n return;\n }\n\n await this.consolidate();\n }\n\n /**\n * Perform consolidation\n */\n private async consolidate(): Promise<number> {\n const out = await this.consolidateWithReport();\n return out.consolidatedCount;\n }\n\n private async consolidateWithReport(): Promise<{\n consolidatedCount: number;\n promotedRuleCount: number;\n report: ConsolidationCostQualityReport;\n }> {\n const workingSet = await this.workingSetStore.get();\n\n if (workingSet.recentEvents.length < 3) {\n return {\n consolidatedCount: 0,\n promotedRuleCount: 0,\n report: this.buildCostQualityReport(workingSet.recentEvents, [], 0)\n };\n }\n\n // Group events by topic\n const groups = this.groupByTopic(workingSet.recentEvents);\n let consolidatedCount = 0;\n const createdMemoryIds: string[] = [];\n\n for (const group of groups) {\n // Require minimum 3 events per group\n if (group.events.length < 3) continue;\n\n // Check if already consolidated\n const eventIds = group.events.map(e => e.id);\n const alreadyConsolidated = await this.consolidatedStore.isAlreadyConsolidated(eventIds);\n if (alreadyConsolidated) continue;\n\n // Generate summary\n const summary = await this.summarize(group);\n\n // Create consolidated memory\n const memoryId = await this.consolidatedStore.create({\n summary,\n topics: group.topics,\n sourceEvents: eventIds,\n confidence: this.calculateConfidence(group)\n });\n createdMemoryIds.push(memoryId);\n consolidatedCount++;\n }\n\n const promotedRuleCount = await this.promoteStableSummariesToRules(createdMemoryIds);\n\n // Prune consolidated events from working set\n if (consolidatedCount > 0) {\n const consolidatedEventIds = groups\n .filter(g => g.events.length >= 3)\n .flatMap(g => g.events.map(e => e.id));\n\n // Only prune old events (keep recent for context)\n const oldEventIds = consolidatedEventIds.filter(id => {\n const event = workingSet.recentEvents.find(e => e.id === id);\n if (!event) return false;\n const ageHours = (Date.now() - event.timestamp.getTime()) / (1000 * 60 * 60);\n return ageHours > this.config.workingSet.timeWindowHours / 2;\n });\n\n if (oldEventIds.length > 0) {\n await this.workingSetStore.prune(oldEventIds);\n }\n }\n\n const report = this.buildCostQualityReport(workingSet.recentEvents, groups, consolidatedCount);\n return { consolidatedCount, promotedRuleCount, report };\n }\n\n private async promoteStableSummariesToRules(memoryIds: string[]): Promise<number> {\n let promoted = 0;\n\n for (const memoryId of memoryIds) {\n const memory = await this.consolidatedStore.get(memoryId);\n if (!memory) continue;\n if (memory.confidence < 0.55) continue;\n if (memory.sourceEvents.length < 4) continue;\n\n const exists = await this.consolidatedStore.hasRuleForSourceMemory(memoryId);\n if (exists) continue;\n\n const rule = this.buildRuleFromSummary(memory.summary, memory.topics);\n if (!rule) continue;\n\n await this.consolidatedStore.createRule({\n rule,\n topics: memory.topics,\n sourceMemoryIds: [memory.memoryId],\n sourceEvents: memory.sourceEvents,\n confidence: Math.min(1, memory.confidence + 0.08)\n });\n promoted++;\n }\n\n return promoted;\n }\n\n private buildRuleFromSummary(summary: string, topics: string[]): string | null {\n const lines = summary\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter(Boolean)\n .filter((l) => !l.toLowerCase().startsWith('topics:'));\n\n const bullet = lines.find((l) => l.startsWith('- '))?.replace(/^-\\s*/, '');\n const seed = bullet || lines[0];\n if (!seed || seed.length < 8) return null;\n\n const topicPrefix = topics.length > 0 ? `[${topics.slice(0, 2).join(', ')}] ` : '';\n return `${topicPrefix}${seed}`;\n }\n\n private buildCostQualityReport(\n events: MemoryEvent[],\n groups: EventGroup[],\n consolidatedCount: number\n ): ConsolidationCostQualityReport {\n const beforeTokenEstimate = events.reduce((acc, e) => acc + this.estimateTokens(e.content), 0);\n\n const afterSummaries = groups\n .filter((g) => g.events.length >= 3)\n .slice(0, Math.max(consolidatedCount, 1));\n\n const afterTokenEstimate = afterSummaries.length > 0\n ? afterSummaries.reduce((acc, g) => acc + this.estimateTokens(this.ruleBasedSummary(g)), 0)\n : beforeTokenEstimate;\n\n const reductionRatio = beforeTokenEstimate > 0\n ? Math.max(0, (beforeTokenEstimate - afterTokenEstimate) / beforeTokenEstimate)\n : 0;\n\n const qualityGuardPassed = consolidatedCount === 0\n ? true\n : groups.filter((g) => g.events.length >= 3).every((g) => this.calculateConfidence(g) >= 0.55);\n\n return {\n beforeTokenEstimate,\n afterTokenEstimate,\n reductionRatio,\n qualityGuardPassed,\n details: `groups=${groups.length}, consolidated=${consolidatedCount}`\n };\n }\n\n private estimateTokens(text: string): number {\n return Math.ceil((text || '').length / 4);\n }\n\n /**\n * Check if consolidation should run\n */\n private shouldConsolidate(workingSet: WorkingSet): boolean {\n // Check event count trigger\n if (workingSet.recentEvents.length >= this.config.consolidation.triggerEventCount) {\n return true;\n }\n\n // Check idle time trigger\n const idleTime = Date.now() - this.lastActivity.getTime();\n if (idleTime >= this.config.consolidation.triggerIdleMs) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Group events by topic using simple keyword extraction\n */\n private groupByTopic(events: MemoryEvent[]): EventGroup[] {\n const groups = new Map<string, EventGroup>();\n\n for (const event of events) {\n const topics = this.extractTopics(event.content);\n\n for (const topic of topics) {\n if (!groups.has(topic)) {\n groups.set(topic, { topics: [topic], events: [] });\n }\n const group = groups.get(topic)!;\n if (!group.events.find(e => e.id === event.id)) {\n group.events.push(event);\n }\n }\n }\n\n // Merge groups with overlapping events\n const mergedGroups = this.mergeOverlappingGroups(Array.from(groups.values()));\n\n return mergedGroups;\n }\n\n /**\n * Extract topics from content using simple keyword extraction\n */\n private extractTopics(content: string): string[] {\n const topics: string[] = [];\n\n // Extract code-related keywords\n const codePatterns = [\n /\\b(function|class|interface|type|const|let|var)\\s+(\\w+)/gi,\n /\\b(import|export)\\s+.*?from\\s+['\"]([^'\"]+)['\"]/gi,\n /\\bfile[:\\s]+([^\\s,]+)/gi\n ];\n\n for (const pattern of codePatterns) {\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const keyword = match[2] || match[1];\n if (keyword && keyword.length > 2) {\n topics.push(keyword.toLowerCase());\n }\n }\n }\n\n // Extract common programming terms\n const commonTerms = [\n 'bug', 'fix', 'error', 'issue', 'feature',\n 'test', 'refactor', 'implement', 'add', 'remove',\n 'update', 'change', 'modify', 'create', 'delete'\n ];\n\n const contentLower = content.toLowerCase();\n for (const term of commonTerms) {\n if (contentLower.includes(term)) {\n topics.push(term);\n }\n }\n\n return [...new Set(topics)].slice(0, 5); // Limit to 5 topics\n }\n\n /**\n * Merge groups that have significant event overlap\n */\n private mergeOverlappingGroups(groups: EventGroup[]): EventGroup[] {\n const merged: EventGroup[] = [];\n\n for (const group of groups) {\n let foundMerge = false;\n\n for (const existing of merged) {\n const overlap = group.events.filter(e =>\n existing.events.some(ex => ex.id === e.id)\n );\n\n // If > 50% overlap, merge\n if (overlap.length > group.events.length / 2) {\n existing.topics = [...new Set([...existing.topics, ...group.topics])];\n for (const event of group.events) {\n if (!existing.events.find(e => e.id === event.id)) {\n existing.events.push(event);\n }\n }\n foundMerge = true;\n break;\n }\n }\n\n if (!foundMerge) {\n merged.push(group);\n }\n }\n\n return merged;\n }\n\n /**\n * Generate summary for a group of events\n * Rule-based extraction (no LLM by default)\n */\n private async summarize(group: EventGroup): Promise<string> {\n if (this.config.consolidation.useLLMSummarization) {\n // Future: LLM-based summarization\n return this.ruleBasedSummary(group);\n }\n\n return this.ruleBasedSummary(group);\n }\n\n /**\n * Rule-based summary generation\n */\n private ruleBasedSummary(group: EventGroup): string {\n const keyPoints: string[] = [];\n\n for (const event of group.events.slice(0, 10)) {\n const keyPoint = this.extractKeyPoint(event.content);\n if (keyPoint) {\n keyPoints.push(keyPoint);\n }\n }\n\n const topicsStr = group.topics.slice(0, 3).join(', ');\n const summary = [\n `Topics: ${topicsStr}`,\n '',\n 'Key points:',\n ...keyPoints.map(kp => `- ${kp}`)\n ].join('\\n');\n\n return summary;\n }\n\n /**\n * Extract key point from content\n */\n private extractKeyPoint(content: string): string | null {\n // Get first meaningful sentence\n const sentences = content.split(/[.!?\\n]+/).filter(s => s.trim().length > 10);\n if (sentences.length === 0) return null;\n\n const firstSentence = sentences[0].trim();\n\n // Truncate if too long\n if (firstSentence.length > 100) {\n return firstSentence.slice(0, 100) + '...';\n }\n\n return firstSentence;\n }\n\n /**\n * Calculate confidence score for a group\n */\n private calculateConfidence(group: EventGroup): number {\n // Factor 1: Event count (more events = higher confidence)\n const eventScore = Math.min(group.events.length / 10, 1);\n\n // Factor 2: Time proximity (events closer together = higher confidence)\n const timeScore = this.calculateTimeProximity(group.events);\n\n // Factor 3: Topic consistency (fewer topics per event = higher confidence)\n const topicScore = Math.min(3 / group.topics.length, 1);\n\n return (eventScore * 0.4 + timeScore * 0.4 + topicScore * 0.2);\n }\n\n /**\n * Calculate time proximity score\n */\n private calculateTimeProximity(events: MemoryEvent[]): number {\n if (events.length < 2) return 1;\n\n const timestamps = events.map(e => e.timestamp.getTime()).sort((a, b) => a - b);\n const timeSpan = timestamps[timestamps.length - 1] - timestamps[0];\n\n // Score based on average time between events\n const avgGap = timeSpan / (events.length - 1);\n const hourInMs = 60 * 60 * 1000;\n\n // Within 1 hour average = score 1, 24 hours = score 0.5, etc.\n return Math.max(0, 1 - (avgGap / (24 * hourInMs)));\n }\n}\n\n/**\n * Create a Consolidation Worker instance\n */\nexport function createConsolidationWorker(\n workingSetStore: WorkingSetStore,\n consolidatedStore: ConsolidatedStore,\n config: EndlessModeConfig\n): ConsolidationWorker {\n return new ConsolidationWorker(workingSetStore, consolidatedStore, config);\n}\n", "/**\n * Continuity Manager\n * Tracks and calculates context continuity between interactions\n * Biomimetic: Simulates context-dependent memory retrieval\n */\n\nimport { randomUUID } from 'crypto';\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport type {\n EndlessModeConfig,\n ContextSnapshot,\n ContinuityScore,\n TransitionType,\n ContinuityLog\n} from './types.js';\nimport { EventStore } from './event-store.js';\n\nexport class ContinuityManager {\n private lastContext: ContextSnapshot | null = null;\n\n constructor(\n private eventStore: EventStore,\n private config: EndlessModeConfig\n ) {}\n\n private get db(): Database {\n return this.eventStore.getDatabase();\n }\n\n /**\n * Calculate continuity score between current and previous context\n */\n async calculateScore(\n currentContext: ContextSnapshot,\n previousContext?: ContextSnapshot\n ): Promise<ContinuityScore> {\n const prev = previousContext || this.lastContext;\n\n if (!prev) {\n // No previous context - this is a fresh start\n this.lastContext = currentContext;\n return { score: 0.5, transitionType: 'break' };\n }\n\n let score = 0;\n\n // Topic continuity (30%)\n const topicOverlap = this.calculateOverlap(\n currentContext.topics,\n prev.topics\n );\n score += topicOverlap * 0.3;\n\n // File continuity (20%)\n const fileOverlap = this.calculateOverlap(\n currentContext.files,\n prev.files\n );\n score += fileOverlap * 0.2;\n\n // Time proximity (30%)\n const timeDiff = currentContext.timestamp - prev.timestamp;\n const decayHours = this.config.continuity.topicDecayHours;\n const timeScore = Math.exp(-timeDiff / (decayHours * 3600000));\n score += timeScore * 0.3;\n\n // Entity continuity (20%)\n const entityOverlap = this.calculateOverlap(\n currentContext.entities,\n prev.entities\n );\n score += entityOverlap * 0.2;\n\n // Determine transition type\n const transitionType = this.determineTransitionType(score);\n\n // Log the transition\n await this.logTransition(currentContext, prev, score, transitionType);\n\n // Update last context\n this.lastContext = currentContext;\n\n return { score, transitionType };\n }\n\n /**\n * Create a context snapshot from current state\n */\n createSnapshot(\n id: string,\n content: string,\n metadata?: {\n files?: string[];\n entities?: string[];\n }\n ): ContextSnapshot {\n return {\n id,\n timestamp: Date.now(),\n topics: this.extractTopics(content),\n files: metadata?.files || this.extractFiles(content),\n entities: metadata?.entities || this.extractEntities(content)\n };\n }\n\n /**\n * Get recent continuity logs\n */\n async getRecentLogs(limit: number = 10): Promise<ContinuityLog[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM continuity_log\n ORDER BY created_at DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(row => ({\n logId: row.log_id as string,\n fromContextId: row.from_context_id as string | undefined,\n toContextId: row.to_context_id as string | undefined,\n continuityScore: row.continuity_score as number,\n transitionType: row.transition_type as TransitionType,\n createdAt: toDate(row.created_at)\n }));\n }\n\n /**\n * Get average continuity score over time period\n */\n async getAverageScore(hours: number = 1): Promise<number> {\n const result = await dbAll<{ avg_score: number | null }>(\n this.db,\n `SELECT AVG(continuity_score) as avg_score\n FROM continuity_log\n WHERE created_at > datetime('now', '-${hours} hours')`\n );\n\n return result[0]?.avg_score ?? 0.5;\n }\n\n /**\n * Get transition type distribution\n */\n async getTransitionStats(hours: number = 24): Promise<Record<TransitionType, number>> {\n const rows = await dbAll<{ transition_type: string; count: number }>(\n this.db,\n `SELECT transition_type, COUNT(*) as count\n FROM continuity_log\n WHERE created_at > datetime('now', '-${hours} hours')\n GROUP BY transition_type`\n );\n\n const stats: Record<TransitionType, number> = {\n seamless: 0,\n topic_shift: 0,\n break: 0\n };\n\n for (const row of rows) {\n stats[row.transition_type as TransitionType] = row.count;\n }\n\n return stats;\n }\n\n /**\n * Clear old continuity logs\n */\n async cleanup(olderThanDays: number = 7): Promise<number> {\n const result = await dbAll<{ changes: number }>(\n this.db,\n `DELETE FROM continuity_log\n WHERE created_at < datetime('now', '-${olderThanDays} days')\n RETURNING COUNT(*) as changes`\n );\n\n return result[0]?.changes || 0;\n }\n\n /**\n * Calculate overlap between two arrays\n */\n private calculateOverlap(a: string[], b: string[]): number {\n if (a.length === 0 || b.length === 0) return 0;\n\n const setA = new Set(a.map(s => s.toLowerCase()));\n const setB = new Set(b.map(s => s.toLowerCase()));\n\n const intersection = [...setA].filter(x => setB.has(x));\n const union = new Set([...setA, ...setB]);\n\n return intersection.length / union.size; // Jaccard similarity\n }\n\n /**\n * Determine transition type based on score\n */\n private determineTransitionType(score: number): TransitionType {\n if (score >= this.config.continuity.minScoreForSeamless) {\n return 'seamless';\n } else if (score >= 0.4) {\n return 'topic_shift';\n } else {\n return 'break';\n }\n }\n\n /**\n * Log a context transition\n */\n private async logTransition(\n current: ContextSnapshot,\n previous: ContextSnapshot,\n score: number,\n type: TransitionType\n ): Promise<void> {\n await dbRun(\n this.db,\n `INSERT INTO continuity_log\n (log_id, from_context_id, to_context_id, continuity_score, transition_type, created_at)\n VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)`,\n [randomUUID(), previous.id, current.id, score, type]\n );\n }\n\n /**\n * Extract topics from content\n */\n private extractTopics(content: string): string[] {\n const topics: string[] = [];\n const contentLower = content.toLowerCase();\n\n // Programming language keywords\n const langPatterns = [\n { pattern: /typescript|\\.ts\\b/i, topic: 'typescript' },\n { pattern: /javascript|\\.js\\b/i, topic: 'javascript' },\n { pattern: /python|\\.py\\b/i, topic: 'python' },\n { pattern: /rust|\\.rs\\b/i, topic: 'rust' },\n { pattern: /go\\b|golang/i, topic: 'go' }\n ];\n\n for (const { pattern, topic } of langPatterns) {\n if (pattern.test(content)) {\n topics.push(topic);\n }\n }\n\n // Common development topics\n const devTopics = [\n 'api', 'database', 'test', 'bug', 'feature', 'refactor',\n 'component', 'function', 'class', 'module', 'hook',\n 'deploy', 'build', 'config', 'docker', 'git'\n ];\n\n for (const topic of devTopics) {\n if (contentLower.includes(topic)) {\n topics.push(topic);\n }\n }\n\n return [...new Set(topics)].slice(0, 10);\n }\n\n /**\n * Extract file paths from content\n */\n private extractFiles(content: string): string[] {\n const filePatterns = [\n /(?:^|\\s)([a-zA-Z0-9_\\-./]+\\.[a-zA-Z0-9]+)(?:\\s|$|:)/gm,\n /['\"](\\.?\\/[^'\"]+\\.[a-zA-Z0-9]+)['\"]/g,\n /file[:\\s]+([^\\s,]+)/gi\n ];\n\n const files = new Set<string>();\n\n for (const pattern of filePatterns) {\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const file = match[1];\n if (file && file.length > 3 && file.length < 100) {\n // Filter out common non-file patterns\n if (!file.match(/^(https?:|mailto:|ftp:)/i)) {\n files.add(file);\n }\n }\n }\n }\n\n return Array.from(files).slice(0, 10);\n }\n\n /**\n * Extract entity names from content (functions, classes, variables)\n */\n private extractEntities(content: string): string[] {\n const entities = new Set<string>();\n\n const entityPatterns = [\n /\\b(function|const|let|var|class|interface|type)\\s+([a-zA-Z_][a-zA-Z0-9_]*)/g,\n /\\b([A-Z][a-zA-Z0-9_]*(?:Component|Service|Store|Manager|Handler|Factory|Provider))\\b/g,\n /\\b(use[A-Z][a-zA-Z0-9_]*)\\b/g // React hooks\n ];\n\n for (const pattern of entityPatterns) {\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const entity = match[2] || match[1];\n if (entity && entity.length > 2) {\n entities.add(entity);\n }\n }\n }\n\n return Array.from(entities).slice(0, 20);\n }\n\n /**\n * Reset the last context (for testing or manual reset)\n */\n resetLastContext(): void {\n this.lastContext = null;\n }\n\n /**\n * Get the last context snapshot\n */\n getLastContext(): ContextSnapshot | null {\n return this.lastContext;\n }\n}\n\n/**\n * Create a Continuity Manager instance\n */\nexport function createContinuityManager(\n eventStore: EventStore,\n config: EndlessModeConfig\n): ContinuityManager {\n return new ContinuityManager(eventStore, config);\n}\n", "/**\n * Memory Engine Services Bundle\n *\n * Owns construction and wiring for storage-backed engine services so\n * MemoryService can stay focused on public facade/lifecycle behavior.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nimport { Embedder, getDefaultEmbedder } from '../embedder.js';\nimport type { EventStore } from '../event-store.js';\nimport { createGraduationPipeline, type GraduationPipeline } from '../graduation.js';\nimport { getDefaultMatcher, type Matcher } from '../matcher.js';\nimport { MarkdownMirror } from '../md-mirror.js';\nimport type { Retriever } from '../retriever.js';\nimport { SQLiteEventStore } from '../sqlite-event-store.js';\nimport type { MemoryOperationsConfig, ToolObservationPayload } from '../types.js';\nimport {\n ActorRepository,\n PerspectiveObservationRepository,\n SessionActorRepository,\n createPerspectiveDeriver\n} from '../operations/index.js';\nimport { VectorStore } from '../vector-store.js';\nimport { MemoryIngestService } from './memory-ingest-service.js';\nimport { MemoryQueryService } from './memory-query-service.js';\nimport {\n createRetrievalServices,\n type RetrievalAnalyticsService,\n type RetrievalDisclosureService,\n type RetrievalDisclosureSharedStore,\n type RetrievalEventStore,\n type RetrievalOrchestrator,\n type RetrievalServices,\n type RetrievalServicesDeps\n} from './retrieval-services.js';\n\nexport interface MemoryEngineServicesOptions {\n storagePath: string;\n readOnly: boolean;\n embeddingModel?: string;\n cwd?: string;\n initialize: () => Promise<void>;\n getProjectHash: () => string | null;\n getProjectPath?: () => string | null;\n hasSharedStore: () => boolean;\n memoryOperationsConfig?: MemoryOperationsConfig;\n sharedStore?: RetrievalDisclosureSharedStore;\n createToolObservationEmbedding: (payload: ToolObservationPayload) => string;\n factories?: MemoryEngineServicesFactories;\n}\n\nexport interface MemoryEngineServicesFactories {\n createSQLiteEventStore?: (\n dbPath: string,\n options: { readonly: boolean; markdownMirrorRoot: string }\n ) => SQLiteEventStore;\n createVectorStore?: (vectorsPath: string) => VectorStore;\n createEmbedder?: (model: string) => Embedder;\n getDefaultEmbedder?: () => Embedder;\n getDefaultMatcher?: () => Matcher;\n createMarkdownMirror?: (cwd: string) => MarkdownMirror;\n createGraduationPipeline?: (eventStore: EventStore) => GraduationPipeline;\n createRetrievalServices?: (deps: RetrievalServicesDeps) => RetrievalServices;\n}\n\nexport interface MemoryEngineServices {\n storagePath: string;\n sqliteStore: SQLiteEventStore;\n vectorStore: VectorStore;\n embedder: Embedder;\n matcher: Matcher;\n retriever: Retriever;\n retrievalOrchestrator: RetrievalOrchestrator;\n retrievalDisclosureService: RetrievalDisclosureService;\n retrievalAnalyticsService: RetrievalAnalyticsService;\n graduation: GraduationPipeline;\n mdMirror: MarkdownMirror;\n ingestService: MemoryIngestService;\n queryService: MemoryQueryService;\n}\n\nexport function createMemoryEngineServices(options: MemoryEngineServicesOptions): MemoryEngineServices {\n const factories = options.factories ?? {};\n const storagePath = options.storagePath;\n\n if (!options.readOnly && !fs.existsSync(storagePath)) {\n fs.mkdirSync(storagePath, { recursive: true });\n }\n\n const sqliteStore = (factories.createSQLiteEventStore ?? defaultCreateSQLiteEventStore)(\n path.join(storagePath, 'events.sqlite'),\n {\n readonly: options.readOnly,\n markdownMirrorRoot: storagePath\n }\n );\n const vectorStore = (factories.createVectorStore ?? defaultCreateVectorStore)(\n path.join(storagePath, 'vectors')\n );\n const embeddingModel = options.embeddingModel || process.env.CLAUDE_MEMORY_EMBEDDING_MODEL;\n const embedder = embeddingModel\n ? (factories.createEmbedder ?? defaultCreateEmbedder)(embeddingModel)\n : (factories.getDefaultEmbedder ?? getDefaultEmbedder)();\n const matcher = (factories.getDefaultMatcher ?? getDefaultMatcher)();\n const mdMirror = (factories.createMarkdownMirror ?? defaultCreateMarkdownMirror)(\n options.cwd ?? process.cwd()\n );\n const graduation = (factories.createGraduationPipeline ?? defaultCreateGraduationPipeline)(\n sqliteStore as unknown as EventStore\n );\n const perspectiveDeriver = shouldEnablePerspectiveDeriver(options)\n ? createPerspectiveDeriver({\n actors: new ActorRepository(sqliteStore.getDatabase()),\n sessions: new SessionActorRepository(sqliteStore.getDatabase()),\n observations: new PerspectiveObservationRepository(sqliteStore.getDatabase()),\n config: options.memoryOperationsConfig?.perspectiveMemory\n })\n : undefined;\n\n const retrievalServices = (factories.createRetrievalServices ?? createRetrievalServices)({\n initialize: options.initialize,\n eventStore: sqliteStore as unknown as RetrievalEventStore,\n vectorStore,\n embedder,\n matcher,\n getProjectHash: options.getProjectHash,\n hasSharedStore: options.hasSharedStore,\n memoryOperationsConfig: options.memoryOperationsConfig,\n sharedStore: options.sharedStore\n });\n\n const ingestService = new MemoryIngestService({\n initialize: options.initialize,\n eventStore: sqliteStore,\n markdownMirror: mdMirror,\n createToolEmbedding: options.createToolObservationEmbedding,\n getProjectHash: options.getProjectHash,\n getProjectPath: options.getProjectPath,\n perspectiveDeriver\n });\n const queryService = new MemoryQueryService(\n () => sqliteStore.initialize(),\n sqliteStore,\n { vectorStore, graduation }\n );\n\n return {\n storagePath,\n sqliteStore,\n vectorStore,\n embedder,\n matcher,\n retriever: retrievalServices.retriever,\n retrievalOrchestrator: retrievalServices.retrievalOrchestrator,\n retrievalDisclosureService: retrievalServices.retrievalDisclosureService,\n retrievalAnalyticsService: retrievalServices.retrievalAnalyticsService,\n graduation,\n mdMirror,\n ingestService,\n queryService\n };\n}\n\nfunction shouldEnablePerspectiveDeriver(options: MemoryEngineServicesOptions): boolean {\n if (options.readOnly) return false;\n const perspectiveMemory = options.memoryOperationsConfig?.perspectiveMemory;\n return perspectiveMemory?.enabled === true && perspectiveMemory.deriver?.enabled === true;\n}\n\nfunction defaultCreateSQLiteEventStore(\n dbPath: string,\n options: { readonly: boolean; markdownMirrorRoot: string }\n): SQLiteEventStore {\n return new SQLiteEventStore(dbPath, options);\n}\n\nfunction defaultCreateVectorStore(vectorsPath: string): VectorStore {\n return new VectorStore(vectorsPath);\n}\n\nfunction defaultCreateEmbedder(model: string): Embedder {\n return new Embedder(model);\n}\n\nfunction defaultCreateMarkdownMirror(cwd: string): MarkdownMirror {\n return new MarkdownMirror(cwd);\n}\n\nfunction defaultCreateGraduationPipeline(eventStore: EventStore): GraduationPipeline {\n return createGraduationPipeline(eventStore);\n}\n", "/**\n * Local Embedding Generator using @huggingface/transformers\n * AXIOMMIND Principle 7: Standard JSON format for vectors\n */\n\nexport interface EmbeddingResult {\n vector: number[];\n model: string;\n dimensions: number;\n}\n\ntype FeatureExtractionPipelineFactory = (\n task: 'feature-extraction',\n model: string\n) => Promise<NonNullable<Embedder['pipeline']>>;\n\nexport const DEFAULT_EMBEDDING_MODEL = 'Xenova/multilingual-e5-small';\nexport const DEFAULT_EMBEDDING_FALLBACK_MODEL = 'intfloat/multilingual-e5-small';\n\nexport class Embedder {\n private pipeline: ((input: string, options?: Record<string, unknown>) => Promise<{ data: Float32Array }>) | null = null;\n private readonly modelName: string;\n private activeModelName: string;\n private initialized = false;\n\n constructor(modelName: string = DEFAULT_EMBEDDING_MODEL) {\n this.modelName = modelName;\n this.activeModelName = modelName;\n }\n\n /**\n * Initialize the embedding pipeline\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n const pipeline = await withSuppressedKnownTransformersWarnings(async () => {\n try {\n return await loadTransformersPipeline();\n } catch (error) {\n if (isMissingTransformersDependencyError(error)) {\n throw createEmbeddingBackendUnavailableError(error);\n }\n throw error;\n }\n });\n\n try {\n this.pipeline = await withSuppressedKnownTransformersWarnings(() => pipeline('feature-extraction', this.modelName));\n this.activeModelName = this.modelName;\n this.initialized = true;\n return;\n } catch (primaryError) {\n const fallbackModel = process.env.CLAUDE_MEMORY_EMBEDDING_FALLBACK_MODEL || DEFAULT_EMBEDDING_FALLBACK_MODEL;\n if (fallbackModel === this.modelName) {\n throw primaryError;\n }\n\n console.warn(`[Embedder] Primary model failed (${this.modelName}). Falling back to ${fallbackModel}`);\n this.pipeline = await withSuppressedKnownTransformersWarnings(() => pipeline('feature-extraction', fallbackModel));\n this.activeModelName = fallbackModel;\n this.initialized = true;\n }\n }\n\n // ~4 chars per token; 512 tokens * 4 = 2048, use 2000 to be safe\n private static readonly MAX_CHARS = 2000;\n\n private truncate(text: string): string {\n return text.length > Embedder.MAX_CHARS ? text.slice(0, Embedder.MAX_CHARS) : text;\n }\n\n /**\n * Generate embedding for a single text\n */\n async embed(text: string): Promise<EmbeddingResult> {\n await this.initialize();\n\n if (!this.pipeline) {\n throw new Error('Embedding pipeline not initialized');\n }\n\n const output = await this.pipeline(this.truncate(text), {\n pooling: 'mean',\n normalize: true,\n truncation: true,\n max_length: 512\n });\n\n const vector = Array.from(output.data);\n\n return {\n vector,\n model: this.activeModelName,\n dimensions: vector.length\n };\n }\n\n /**\n * Generate embeddings for multiple texts in batch\n */\n async embedBatch(texts: string[]): Promise<EmbeddingResult[]> {\n await this.initialize();\n\n if (!this.pipeline) {\n throw new Error('Embedding pipeline not initialized');\n }\n\n const results: EmbeddingResult[] = [];\n\n // Process in batches of 32 for memory efficiency\n const batchSize = 32;\n for (let i = 0; i < texts.length; i += batchSize) {\n const batch = texts.slice(i, i + batchSize);\n\n for (const text of batch) {\n const output = await this.pipeline(this.truncate(text), {\n pooling: 'mean',\n normalize: true,\n truncation: true,\n max_length: 512\n });\n\n const vector = Array.from(output.data);\n\n results.push({\n vector,\n model: this.activeModelName,\n dimensions: vector.length\n });\n }\n }\n\n return results;\n }\n\n /**\n * Get embedding dimensions for the current model\n */\n async getDimensions(): Promise<number> {\n const result = await this.embed('test');\n return result.dimensions;\n }\n\n /**\n * Check if embedder is ready\n */\n isReady(): boolean {\n return this.initialized && this.pipeline !== null;\n }\n\n /**\n * Get model name\n */\n getModelName(): string {\n return this.activeModelName;\n }\n}\n\n// Singleton instance for reuse\nlet defaultEmbedder: Embedder | null = null;\n\nexport function getDefaultEmbedder(): Embedder {\n const envModel = process.env.CLAUDE_MEMORY_EMBEDDING_MODEL;\n if (!defaultEmbedder) {\n defaultEmbedder = new Embedder(envModel || undefined);\n }\n return defaultEmbedder;\n}\n\nlet transformersWarningSuppressionDepth = 0;\nlet originalConsoleWarn: typeof console.warn | null = null;\n\nexport async function withSuppressedKnownTransformersWarnings<T>(fn: () => Promise<T>): Promise<T> {\n if (transformersWarningSuppressionDepth === 0) {\n originalConsoleWarn = console.warn;\n console.warn = (...args: unknown[]) => {\n const message = args.map(String).join(' ');\n if (isKnownBenignTransformersWarning(message)) return;\n (originalConsoleWarn ?? console.warn)(...args);\n };\n }\n transformersWarningSuppressionDepth += 1;\n\n try {\n return await fn();\n } finally {\n transformersWarningSuppressionDepth -= 1;\n if (transformersWarningSuppressionDepth === 0 && originalConsoleWarn) {\n console.warn = originalConsoleWarn;\n originalConsoleWarn = null;\n }\n }\n}\n\nexport function isKnownBenignTransformersWarning(message: string): boolean {\n return message.includes('Unknown model class \"eurobert\"') ||\n message.includes('dtype not specified for \"model\"');\n}\n\nexport function isMissingTransformersDependencyError(error: unknown): boolean {\n const maybeError = error as { code?: unknown; message?: unknown } | null;\n const message = typeof maybeError?.message === 'string' ? maybeError.message : '';\n return maybeError?.code === 'ERR_MODULE_NOT_FOUND' &&\n message.includes(\"@huggingface/transformers\");\n}\n\nexport function createEmbeddingBackendUnavailableError(cause: unknown): Error & { cause?: unknown } {\n const error = new Error(\n [\n 'Required embedding backend is not installed.',\n '',\n 'Claude Memory Layer requires @huggingface/transformers for local semantic/vector embeddings.',\n 'The backend runs on CPU-only ONNX Runtime; CUDA is not required.',\n 'Reinstall globally with:',\n ' ONNXRUNTIME_NODE_INSTALL_CUDA=skip npm install -g claude-memory-layer@latest',\n '',\n 'If you are inside a local checkout or package directory, repair only the backend with:',\n ' ONNXRUNTIME_NODE_INSTALL_CUDA=skip npm install --no-save --no-package-lock --omit=dev @huggingface/transformers@3.8.1'\n ].join('\\n')\n ) as Error & { cause?: unknown };\n error.cause = cause;\n return error;\n}\n\nasync function loadTransformersPipeline(): Promise<FeatureExtractionPipelineFactory> {\n // Keep @huggingface/transformers lazy so importing MemoryService or pure\n // adapter helpers does not eagerly dlopen onnxruntime native bindings.\n const dynamicImport = new Function('specifier', 'return import(specifier)') as (\n specifier: string\n ) => Promise<{ pipeline: unknown }>;\n const transformers = await dynamicImport('@huggingface/transformers');\n return transformers.pipeline as FeatureExtractionPipelineFactory;\n}\n", "/**\n * Memory Graduation Pipeline - AXIOMMIND L0\u2192L1\u2192L2\u2192L3\u2192L4\n *\n * L0: EventStore (raw events, append-only)\n * L1: Structured JSON (session summaries, patterns)\n * L2: Type Candidates (Idris2-inspired, validated schemas)\n * L3: Verified Knowledge (cross-session validated)\n * L4: Active/Searchable (indexed, readily available)\n */\n\nimport { EventStore } from './event-store.js';\nimport type {\n MemoryEvent,\n MemoryLevel,\n GraduationResult,\n Insight\n} from './types.js';\n\nexport interface GraduationCriteria {\n minAccessCount: number;\n minConfidence: number;\n minCrossSessionRefs: number;\n maxAgeDays: number;\n}\n\nexport interface LevelCriteria {\n L0toL1: GraduationCriteria;\n L1toL2: GraduationCriteria;\n L2toL3: GraduationCriteria;\n L3toL4: GraduationCriteria;\n}\n\nconst DEFAULT_CRITERIA: LevelCriteria = {\n L0toL1: {\n minAccessCount: 1,\n minConfidence: 0.5,\n minCrossSessionRefs: 0,\n maxAgeDays: 30\n },\n L1toL2: {\n minAccessCount: 3,\n minConfidence: 0.7,\n minCrossSessionRefs: 1,\n maxAgeDays: 60\n },\n L2toL3: {\n minAccessCount: 5,\n minConfidence: 0.85,\n minCrossSessionRefs: 2,\n maxAgeDays: 90\n },\n L3toL4: {\n minAccessCount: 10,\n minConfidence: 0.92,\n minCrossSessionRefs: 3,\n maxAgeDays: 180\n }\n};\n\nexport interface EventMetrics {\n eventId: string;\n accessCount: number;\n lastAccessed: Date;\n crossSessionRefs: number;\n confidence: number;\n}\n\nexport class GraduationPipeline {\n private readonly eventStore: EventStore;\n private readonly criteria: LevelCriteria;\n private readonly metrics: Map<string, EventMetrics> = new Map();\n\n constructor(\n eventStore: EventStore,\n criteria: Partial<LevelCriteria> = {}\n ) {\n this.eventStore = eventStore;\n this.criteria = {\n L0toL1: { ...DEFAULT_CRITERIA.L0toL1, ...criteria.L0toL1 },\n L1toL2: { ...DEFAULT_CRITERIA.L1toL2, ...criteria.L1toL2 },\n L2toL3: { ...DEFAULT_CRITERIA.L2toL3, ...criteria.L2toL3 },\n L3toL4: { ...DEFAULT_CRITERIA.L3toL4, ...criteria.L3toL4 }\n };\n }\n\n // Track which sessions have accessed each event\n private readonly sessionAccesses: Map<string, Set<string>> = new Map();\n\n /**\n * Record an access to an event (used for graduation scoring)\n */\n recordAccess(eventId: string, fromSessionId: string, confidence: number = 1.0): void {\n const existing = this.metrics.get(eventId);\n\n // Track sessions that have accessed this event\n if (!this.sessionAccesses.has(eventId)) {\n this.sessionAccesses.set(eventId, new Set());\n }\n const sessions = this.sessionAccesses.get(eventId)!;\n const isNewSession = !sessions.has(fromSessionId);\n sessions.add(fromSessionId);\n\n if (existing) {\n existing.accessCount++;\n existing.lastAccessed = new Date();\n existing.confidence = Math.max(existing.confidence, confidence);\n // Update cross-session references count\n if (isNewSession && sessions.size > 1) {\n existing.crossSessionRefs = sessions.size - 1;\n }\n } else {\n this.metrics.set(eventId, {\n eventId,\n accessCount: 1,\n lastAccessed: new Date(),\n crossSessionRefs: 0,\n confidence\n });\n }\n }\n\n /**\n * Evaluate if an event should graduate to the next level\n */\n async evaluateGraduation(eventId: string, currentLevel: MemoryLevel): Promise<GraduationResult> {\n const metrics = this.metrics.get(eventId);\n\n if (!metrics) {\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: 'No metrics available for event'\n };\n }\n\n const nextLevel = this.getNextLevel(currentLevel);\n if (!nextLevel) {\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: 'Already at maximum level'\n };\n }\n\n const criteria = this.getCriteria(currentLevel, nextLevel);\n const evaluation = this.checkCriteria(metrics, criteria);\n\n if (evaluation.passed) {\n // Update level in event store\n await this.eventStore.updateMemoryLevel(eventId, nextLevel);\n\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: nextLevel,\n success: true\n };\n }\n\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: evaluation.reason\n };\n }\n\n /**\n * Run graduation evaluation for all events at a given level\n */\n async graduateBatch(level: MemoryLevel): Promise<GraduationResult[]> {\n const results: GraduationResult[] = [];\n\n for (const eventId of this.metrics.keys()) {\n const result = await this.evaluateGraduation(eventId, level);\n results.push(result);\n }\n\n return results;\n }\n\n /**\n * Extract insights from graduated events (L1+)\n */\n extractInsights(events: MemoryEvent[]): Insight[] {\n const insights: Insight[] = [];\n\n // Pattern detection: Look for repeated themes\n const patterns = this.detectPatterns(events);\n for (const pattern of patterns) {\n insights.push({\n id: crypto.randomUUID(),\n insightType: 'pattern',\n content: pattern.description,\n canonicalKey: pattern.key,\n confidence: pattern.confidence,\n sourceEvents: pattern.eventIds,\n createdAt: new Date(),\n lastUpdated: new Date()\n });\n }\n\n // Preference detection: Look for user preferences\n const preferences = this.detectPreferences(events);\n for (const pref of preferences) {\n insights.push({\n id: crypto.randomUUID(),\n insightType: 'preference',\n content: pref.description,\n canonicalKey: pref.key,\n confidence: pref.confidence,\n sourceEvents: pref.eventIds,\n createdAt: new Date(),\n lastUpdated: new Date()\n });\n }\n\n return insights;\n }\n\n /**\n * Get the next level in the graduation pipeline\n */\n private getNextLevel(current: MemoryLevel): MemoryLevel | null {\n const levels: MemoryLevel[] = ['L0', 'L1', 'L2', 'L3', 'L4'];\n const currentIndex = levels.indexOf(current);\n\n if (currentIndex === -1 || currentIndex >= levels.length - 1) {\n return null;\n }\n\n return levels[currentIndex + 1];\n }\n\n /**\n * Get criteria for level transition\n */\n private getCriteria(from: MemoryLevel, to: MemoryLevel): GraduationCriteria {\n const key = `${from}to${to}` as keyof LevelCriteria;\n return this.criteria[key] || DEFAULT_CRITERIA.L0toL1;\n }\n\n /**\n * Check if metrics meet criteria\n */\n private checkCriteria(\n metrics: EventMetrics,\n criteria: GraduationCriteria\n ): { passed: boolean; reason?: string } {\n if (metrics.accessCount < criteria.minAccessCount) {\n return {\n passed: false,\n reason: `Access count ${metrics.accessCount} < ${criteria.minAccessCount}`\n };\n }\n\n if (metrics.confidence < criteria.minConfidence) {\n return {\n passed: false,\n reason: `Confidence ${metrics.confidence} < ${criteria.minConfidence}`\n };\n }\n\n if (metrics.crossSessionRefs < criteria.minCrossSessionRefs) {\n return {\n passed: false,\n reason: `Cross-session refs ${metrics.crossSessionRefs} < ${criteria.minCrossSessionRefs}`\n };\n }\n\n const ageDays = (Date.now() - metrics.lastAccessed.getTime()) / (1000 * 60 * 60 * 24);\n if (ageDays > criteria.maxAgeDays) {\n return {\n passed: false,\n reason: `Event too old: ${ageDays.toFixed(1)} days > ${criteria.maxAgeDays}`\n };\n }\n\n return { passed: true };\n }\n\n /**\n * Detect patterns in events\n */\n private detectPatterns(events: MemoryEvent[]): Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> {\n // Simple pattern detection: group by canonical key and look for repeats\n const keyGroups = new Map<string, MemoryEvent[]>();\n\n for (const event of events) {\n const existing = keyGroups.get(event.canonicalKey) || [];\n existing.push(event);\n keyGroups.set(event.canonicalKey, existing);\n }\n\n const patterns: Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> = [];\n\n for (const [key, groupEvents] of keyGroups) {\n if (groupEvents.length >= 2) {\n patterns.push({\n key,\n description: `Repeated topic: ${key.slice(0, 50)}`,\n confidence: Math.min(1.0, groupEvents.length / 5),\n eventIds: groupEvents.map(e => e.id)\n });\n }\n }\n\n return patterns;\n }\n\n /**\n * Detect user preferences from events\n */\n private detectPreferences(events: MemoryEvent[]): Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> {\n // Simple preference detection: look for keywords\n const preferenceKeywords = ['prefer', 'like', 'want', 'always', 'never', 'favorite'];\n const preferences: Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> = [];\n\n for (const event of events) {\n if (event.eventType !== 'user_prompt') continue;\n\n const lowerContent = event.content.toLowerCase();\n for (const keyword of preferenceKeywords) {\n if (lowerContent.includes(keyword)) {\n preferences.push({\n key: `preference_${keyword}_${event.id.slice(0, 8)}`,\n description: `User preference: ${event.content.slice(0, 100)}`,\n confidence: 0.7,\n eventIds: [event.id]\n });\n break;\n }\n }\n }\n\n return preferences;\n }\n\n /**\n * Get graduation statistics\n */\n async getStats(): Promise<{ level: string; count: number }[]> {\n return this.eventStore.getLevelStats();\n }\n}\n\n/**\n * Create graduation pipeline with default settings\n */\nexport function createGraduationPipeline(eventStore: EventStore): GraduationPipeline {\n return new GraduationPipeline(eventStore);\n}\n", "/**\n * AXIOMMIND Matcher - Weighted scoring with confidence classification\n * Implements matching thresholds: high (\u22650.92), suggested (\u22650.75), none (<0.75)\n */\n\nimport type {\n MemoryMatch,\n MatchResult,\n MatchConfidence\n} from './types.js';\nimport { SearchResult } from './vector-store.js';\n\nexport interface MatchWeights {\n semanticSimilarity: number;\n ftsScore: number;\n recencyBonus: number;\n statusWeight: number;\n}\n\nexport interface MatcherConfig {\n weights: MatchWeights;\n minCombinedScore: number;\n minGap: number;\n suggestionThreshold: number;\n}\n\nconst DEFAULT_CONFIG: MatcherConfig = {\n weights: {\n semanticSimilarity: 0.4,\n ftsScore: 0.25,\n recencyBonus: 0.2,\n statusWeight: 0.15\n },\n minCombinedScore: 0.92,\n minGap: 0.03,\n suggestionThreshold: 0.75\n};\n\nexport class Matcher {\n private readonly config: MatcherConfig;\n\n constructor(config: Partial<MatcherConfig> = {}) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n weights: { ...DEFAULT_CONFIG.weights, ...config.weights }\n };\n }\n\n /**\n * Calculate combined score using AXIOMMIND weighted formula\n */\n calculateCombinedScore(\n semanticScore: number,\n ftsScore: number = 0,\n recencyDays: number = 0,\n isActive: boolean = true\n ): number {\n const { weights } = this.config;\n\n // Recency bonus: decays over 30 days\n const recencyBonus = Math.max(0, 1 - recencyDays / 30);\n\n // Status weight: active events get full weight\n const statusMultiplier = isActive ? 1.0 : 0.7;\n\n const combinedScore =\n weights.semanticSimilarity * semanticScore +\n weights.ftsScore * ftsScore +\n weights.recencyBonus * recencyBonus +\n weights.statusWeight * statusMultiplier;\n\n return Math.min(1.0, combinedScore);\n }\n\n /**\n * Classify match confidence based on AXIOMMIND thresholds\n */\n classifyConfidence(\n topScore: number,\n secondScore: number | null\n ): MatchConfidence {\n const { minCombinedScore, minGap, suggestionThreshold } = this.config;\n\n // Calculate gap (infinity if no second match)\n const gap = secondScore !== null ? topScore - secondScore : Infinity;\n\n // High confidence: score \u2265 0.92 AND gap \u2265 0.03\n if (topScore >= minCombinedScore && gap >= minGap) {\n return 'high';\n }\n\n // Suggested: score \u2265 0.75\n if (topScore >= suggestionThreshold) {\n return 'suggested';\n }\n\n // No match\n return 'none';\n }\n\n /**\n * Match search results to find best memory\n */\n matchSearchResults(\n results: SearchResult[],\n getEventAge: (eventId: string) => number\n ): MatchResult {\n if (results.length === 0) {\n return {\n match: null,\n confidence: 'none'\n };\n }\n\n // Calculate combined scores\n const scoredResults = results.map(result => {\n const ageDays = getEventAge(result.eventId);\n const combinedScore = this.calculateCombinedScore(\n result.score,\n result.score, // Reuse the retrieval score as lexical/proxy score when no separate FTS score is provided.\n ageDays,\n true // Assume active\n );\n\n return {\n result,\n combinedScore\n };\n });\n\n // Sort by combined score\n scoredResults.sort((a, b) => b.combinedScore - a.combinedScore);\n\n const topResult = scoredResults[0];\n const secondScore = scoredResults.length > 1 ? scoredResults[1].combinedScore : null;\n\n // Classify confidence\n const confidence = this.classifyConfidence(topResult.combinedScore, secondScore);\n\n // Build match result\n const match: MemoryMatch = {\n event: {\n id: topResult.result.eventId,\n eventType: topResult.result.eventType as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: topResult.result.sessionId,\n timestamp: new Date(topResult.result.timestamp),\n content: topResult.result.content,\n canonicalKey: '', // Would need to be fetched\n dedupeKey: '' // Would need to be fetched\n },\n score: topResult.combinedScore\n };\n\n const gap = secondScore !== null ? topResult.combinedScore - secondScore : undefined;\n\n // Build alternatives for suggested matches\n const alternatives = confidence === 'suggested'\n ? scoredResults.slice(1, 4).map(sr => ({\n event: {\n id: sr.result.eventId,\n eventType: sr.result.eventType as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: sr.result.sessionId,\n timestamp: new Date(sr.result.timestamp),\n content: sr.result.content,\n canonicalKey: '',\n dedupeKey: ''\n },\n score: sr.combinedScore\n }))\n : undefined;\n\n return {\n match: confidence !== 'none' ? match : null,\n confidence,\n gap,\n alternatives\n };\n }\n\n /**\n * Calculate days between two dates\n */\n static calculateAgeDays(timestamp: Date): number {\n const now = new Date();\n const diffMs = now.getTime() - timestamp.getTime();\n return diffMs / (1000 * 60 * 60 * 24);\n }\n\n /**\n * Get current configuration\n */\n getConfig(): Readonly<MatcherConfig> {\n return { ...this.config };\n }\n}\n\n/**\n * Default matcher instance\n */\nlet defaultMatcher: Matcher | null = null;\n\nexport function getDefaultMatcher(): Matcher {\n if (!defaultMatcher) {\n defaultMatcher = new Matcher();\n }\n return defaultMatcher;\n}\n", "import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { MemoryEventInput } from './types.js';\n\nfunction sanitizeSegment(input: string | undefined, fallback: string): string {\n const v = (input || '').trim().toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/^-+|-+$/g, '');\n return v || fallback;\n}\n\nfunction getAtPath(obj: Record<string, unknown> | undefined, dotted: string): unknown {\n if (!obj) return undefined;\n return dotted.split('.').reduce<unknown>((acc, key) => {\n if (!acc || typeof acc !== 'object') return undefined;\n return (acc as Record<string, unknown>)[key];\n }, obj);\n}\n\nexport function buildMirrorPath(rootDir: string, event: MemoryEventInput): string {\n const meta = event.metadata as Record<string, unknown> | undefined;\n\n const namespaceRaw = getAtPath(meta, 'namespace') ?? getAtPath(meta, 'scope.namespace') ?? event.eventType;\n const namespace = sanitizeSegment(typeof namespaceRaw === 'string' ? namespaceRaw : undefined, 'general');\n\n const categoryRaw = getAtPath(meta, 'categoryPath') ?? getAtPath(meta, 'scope.categoryPath');\n const categoryPath = Array.isArray(categoryRaw) && categoryRaw.length > 0\n ? categoryRaw.map((x) => sanitizeSegment(typeof x === 'string' ? x : undefined, 'uncategorized'))\n : ['uncategorized'];\n\n const d = event.timestamp;\n const yyyy = d.getFullYear();\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const dd = String(d.getDate()).padStart(2, '0');\n\n return path.join(rootDir, 'memory', namespace, ...categoryPath, `${yyyy}-${mm}-${dd}.md`);\n}\n\nexport class MarkdownMirror {\n constructor(private readonly rootDir: string) {}\n\n async append(event: MemoryEventInput, eventId?: string): Promise<void> {\n const out = buildMirrorPath(this.rootDir, event);\n fs.mkdirSync(path.dirname(out), { recursive: true });\n\n const lines = [\n '',\n `## ${event.timestamp.toISOString()} | ${eventId ?? 'pending-id'}`,\n `- type: ${event.eventType}`,\n `- session: ${event.sessionId}`,\n event.content,\n ];\n\n await fs.promises.appendFile(out, lines.join('\\n'), 'utf8');\n await this.refreshIndex();\n }\n\n private async refreshIndex(): Promise<void> {\n const memoryRoot = path.join(this.rootDir, 'memory');\n await fs.promises.mkdir(memoryRoot, { recursive: true });\n\n const files: string[] = [];\n await this.walk(memoryRoot, files);\n\n const mdFiles = files\n .filter((f) => f.endsWith('.md'))\n .map((f) => path.relative(this.rootDir, f))\n .filter((rel) => rel !== path.join('memory', '_index.md'))\n .sort();\n\n const index = [\n '# Memory Index',\n '',\n 'Generated automatically by MarkdownMirror.',\n '',\n ...mdFiles.map((rel) => `- ${rel}`),\n '',\n ].join('\\n');\n\n await fs.promises.writeFile(path.join(memoryRoot, '_index.md'), index, 'utf8');\n }\n\n private async walk(dir: string, out: string[]): Promise<void> {\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n for (const e of entries) {\n const full = path.join(dir, e.name);\n if (e.isDirectory()) {\n await this.walk(full, out);\n } else {\n out.push(full);\n }\n }\n }\n}\n", "/**\n * SQLite-based EventStore implementation\n * Primary store for hooks - WAL mode enables concurrent access\n */\n\nimport { randomUUID } from 'crypto';\nimport {\n MemoryEvent,\n MemoryEventInput,\n Session,\n AppendResult,\n OutboxItem,\n OutboxStats,\n OutboxStatsOptions,\n OutboxRecoveryOptions,\n OutboxRecoveryResult,\n ProjectScopeRepairOptions,\n ProjectScopeRepairResult,\n ProjectScopeRepairSample\n} from './types.js';\nimport { makeCanonicalKey, makeDedupeKey } from './canonical-key.js';\nimport * as nodePath from 'path';\nimport { hashProjectPath } from './registry/project-path.js';\nimport {\n createSQLiteDatabase,\n sqliteRun,\n sqliteAll,\n sqliteGet,\n sqliteClose,\n sqliteExec,\n toDateFromSQLite,\n toSQLiteTimestamp,\n type SQLiteDatabase,\n type SQLiteOptions\n} from './sqlite-wrapper.js';\nimport { MarkdownMirror } from './markdown-mirror.js';\nimport { VectorOutbox, type OutboxConfig } from './vector-outbox.js';\nimport { normalizeRetrievalDebugLanes, type RetrievalDebugLane } from './retrieval-debug-lanes.js';\n\nexport interface SQLiteEventStoreOptions extends SQLiteOptions {\n markdownMirrorRoot?: string;\n vectorOutbox?: false | VectorOutbox | Partial<OutboxConfig>;\n}\n\ntype QueryRewriteKind = 'none' | 'follow-up-context' | 'intent-rewrite';\n\ntype RetrievalTraceDetailRecord = {\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n lanes?: RetrievalDebugLane[];\n};\n\nfunction normalizeRetrievalTraceDetails(details?: RetrievalTraceDetailRecord[]): RetrievalTraceDetailRecord[] {\n return (details || []).map((detail) => {\n const lanes = normalizeRetrievalDebugLanes((detail as { lanes?: unknown }).lanes);\n const normalized: RetrievalTraceDetailRecord = {\n eventId: detail.eventId,\n score: detail.score\n };\n if (detail.semanticScore !== undefined) normalized.semanticScore = detail.semanticScore;\n if (detail.lexicalScore !== undefined) normalized.lexicalScore = detail.lexicalScore;\n if (detail.recencyScore !== undefined) normalized.recencyScore = detail.recencyScore;\n if (lanes.length > 0) normalized.lanes = lanes;\n return normalized;\n });\n}\n\nfunction parseRetrievalTraceDetails(value: unknown): RetrievalTraceDetailRecord[] {\n if (typeof value !== 'string' || value.length === 0) return [];\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? normalizeRetrievalTraceDetails(parsed as RetrievalTraceDetailRecord[]) : [];\n}\n\nfunction normalizeQueryRewriteKind(value?: string | null): QueryRewriteKind {\n const normalized = (value || '').trim().toLowerCase();\n if (normalized === 'follow-up-context' || normalized === 'intent-rewrite') return normalized;\n return 'none';\n}\n\nconst REWRITTEN_QUERY_REWRITE_KIND_SQL = `LOWER(TRIM(COALESCE(query_rewrite_kind, 'none'))) IN ('follow-up-context', 'intent-rewrite')`;\nconst DEFAULT_OUTBOX_STUCK_THRESHOLD_MS = 5 * 60 * 1000;\nconst DEFAULT_OUTBOX_MAX_RETRIES = 3;\n\nfunction emptyOutboxRecoveryResult(): OutboxRecoveryResult {\n return {\n embedding: { recoveredProcessing: 0, retriedFailed: 0 },\n vector: { recoveredProcessing: 0, retriedFailed: 0 }\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction getNestedRecord(root: Record<string, unknown> | undefined, path: string[]): Record<string, unknown> | undefined {\n let cursor: unknown = root;\n for (const key of path) {\n if (!isRecord(cursor)) return undefined;\n cursor = cursor[key];\n }\n return isRecord(cursor) ? cursor : undefined;\n}\n\nfunction getNestedString(root: Record<string, unknown> | undefined, path: string[]): string | undefined {\n let cursor: unknown = root;\n for (const key of path) {\n if (!isRecord(cursor)) return undefined;\n cursor = cursor[key];\n }\n return typeof cursor === 'string' && cursor.length > 0 ? cursor : undefined;\n}\n\nfunction metadataProjectHash(metadata: Record<string, unknown> | undefined): string | undefined {\n return getNestedString(metadata, ['scope', 'project', 'hash']);\n}\n\nfunction metadataProjectPaths(metadata: Record<string, unknown> | undefined): string[] {\n const candidates = [\n getNestedString(metadata, ['projectPath']),\n getNestedString(metadata, ['sourceProjectPath']),\n getNestedString(metadata, ['scope', 'project', 'path'])\n ];\n const paths: string[] = [];\n for (const value of candidates) {\n if (value && !paths.includes(value)) paths.push(value);\n }\n return paths;\n}\n\nfunction metadataProjectPath(metadata: Record<string, unknown> | undefined): string | undefined {\n return metadataProjectPaths(metadata)[0];\n}\n\nfunction isActiveQuarantinedMetadata(metadata: Record<string, unknown> | undefined): boolean {\n const quarantine = getNestedRecord(metadata, ['quarantine']);\n return quarantine?.status === 'active';\n}\n\nfunction activeQuarantineStatusExpression(column = 'metadata'): string {\n return `COALESCE(json_extract(CASE WHEN json_valid(${column}) THEN ${column} ELSE '{}' END, '$.quarantine.status'), '')`;\n}\n\nfunction notActiveQuarantinedSql(column = 'metadata'): string {\n return `${activeQuarantineStatusExpression(column)} != 'active'`;\n}\n\ninterface QuarantineReadOptions {\n includeQuarantined?: boolean;\n}\n\nfunction maybeQuarantinePredicate(options?: QuarantineReadOptions, column = 'metadata'): string {\n return options?.includeQuarantined ? '1=1' : notActiveQuarantinedSql(column);\n}\n\nfunction safeParseMetadataValue(value: unknown): Record<string, unknown> | undefined {\n if (!value) return undefined;\n if (typeof value === 'object') return isRecord(value) ? value : undefined;\n if (typeof value !== 'string') return undefined;\n try {\n const parsed = JSON.parse(value);\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isImportedOrLegacyScopedMetadata(metadata: Record<string, unknown> | undefined): boolean {\n if (!metadata) return false;\n return Boolean(\n metadata.importedFrom\n || metadata.sourceSessionId\n || metadata.sourceSessionHash\n || metadata.hermesSource\n || metadata.projectPath\n || metadata.sourceProjectPath\n || metadata.source === 'hermes'\n || metadata.source === 'claude'\n || metadata.source === 'codex'\n );\n}\n\nfunction addMetadataTag(metadata: Record<string, unknown>, tag: string): void {\n const current = Array.isArray(metadata.tags)\n ? metadata.tags.filter((value): value is string => typeof value === 'string')\n : [];\n if (!current.includes(tag)) metadata.tags = [...current, tag];\n}\n\nfunction buildRepairResult(projectHash: string, dryRun: boolean): ProjectScopeRepairResult {\n return {\n dryRun,\n projectHash,\n scanned: 0,\n repaired: 0,\n quarantined: 0,\n alreadyScoped: 0,\n skipped: 0,\n samples: []\n };\n}\n\nfunction normalizeRepoName(value: string): string {\n return value.replace(/\\.git$/i, '').trim().toLowerCase();\n}\n\nfunction projectBasename(projectPath?: string): string | undefined {\n if (!projectPath) return undefined;\n const trimmed = projectPath.replace(/[\\\\/]+$/, '');\n const basename = nodePath.basename(trimmed);\n return basename ? normalizeRepoName(basename) : undefined;\n}\n\nfunction isProjectScopeRepairExplanation(content: string): boolean {\n const normalized = content.toLowerCase();\n const hasRepairContext = /project[- ]scope|mis[- ]scoped|quarantine|contamination|legacy|\uC624\uC5FC|\uACA9\uB9AC|repair/.test(normalized);\n const hasExplanationContext = /example|detector|trap|not a .*project task|\uAE30\uC5B5|\uBA54\uBAA8\uB9AC|\uC124\uBA85|\uC218\uC815|\uAC80\uC99D/.test(normalized);\n return hasRepairContext && hasExplanationContext;\n}\n\nfunction hasConflictingContentProjectHint(content: string, projectPath?: string): boolean {\n const currentName = projectBasename(projectPath);\n if (!currentName) return false;\n if (isProjectScopeRepairExplanation(content)) return false;\n\n const githubRepoPattern = /github\\.com[:/]([^/\\s`'\"#)]+)\\/([^/\\s`'\"#)]+)(?:\\.git)?/gi;\n let githubMatch: RegExpExecArray | null;\n while ((githubMatch = githubRepoPattern.exec(content)) !== null) {\n const repo = normalizeRepoName(githubMatch[2] || '');\n if (repo && repo !== currentName) return true;\n }\n\n const workspacePathPattern = /\\/workspace\\/([^/\\s`'\"#)]+)/gi;\n let workspaceMatch: RegExpExecArray | null;\n while ((workspaceMatch = workspacePathPattern.exec(content)) !== null) {\n const repo = normalizeRepoName(workspaceMatch[1] || '');\n if (repo && repo !== currentName) return true;\n }\n\n return false;\n}\n\nexport class SQLiteEventStore {\n private db: SQLiteDatabase;\n private initialized = false;\n private readonly readOnly: boolean;\n private readonly markdownMirror: MarkdownMirror | null;\n private readonly vectorOutbox: VectorOutbox | null;\n\n constructor(dbPath: string, options?: SQLiteEventStoreOptions) {\n this.readOnly = options?.readonly ?? false;\n this.db = createSQLiteDatabase(dbPath, {\n readonly: this.readOnly,\n walMode: !this.readOnly\n });\n this.markdownMirror = this.readOnly || !options?.markdownMirrorRoot\n ? null\n : new MarkdownMirror(options.markdownMirrorRoot);\n this.vectorOutbox = this.createVectorOutbox(options?.vectorOutbox);\n }\n\n private createVectorOutbox(option: SQLiteEventStoreOptions['vectorOutbox']): VectorOutbox | null {\n if (this.readOnly || option === false) return null;\n if (option instanceof VectorOutbox) return option;\n return new VectorOutbox(this.db, option ?? {});\n }\n\n private enqueueVectorOutboxEventSync(eventId: string): void {\n if (!this.vectorOutbox) return;\n this.vectorOutbox.enqueueSync('event', eventId);\n }\n\n private async enqueueVectorOutboxEvent(eventId: string): Promise<void> {\n this.enqueueVectorOutboxEventSync(eventId);\n }\n\n /**\n * Initialize database schema\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // In read-only mode, skip schema creation\n if (this.readOnly) {\n this.initialized = true;\n return;\n }\n\n // Create all tables in a single exec for efficiency\n sqliteExec(this.db, `\n -- L0 EventStore: Single Source of Truth (immutable, append-only)\n CREATE TABLE IF NOT EXISTS events (\n id TEXT PRIMARY KEY,\n event_type TEXT NOT NULL,\n session_id TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n content TEXT NOT NULL,\n canonical_key TEXT NOT NULL,\n dedupe_key TEXT UNIQUE,\n metadata TEXT,\n access_count INTEGER DEFAULT 0,\n last_accessed_at TEXT\n );\n\n -- Dedup table for idempotency\n CREATE TABLE IF NOT EXISTS event_dedup (\n dedupe_key TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Session metadata\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n started_at TEXT NOT NULL,\n ended_at TEXT,\n project_path TEXT,\n summary TEXT,\n tags TEXT\n );\n\n -- Insights (derived data, rebuildable)\n CREATE TABLE IF NOT EXISTS insights (\n id TEXT PRIMARY KEY,\n insight_type TEXT NOT NULL,\n content TEXT NOT NULL,\n canonical_key TEXT NOT NULL,\n confidence REAL,\n source_events TEXT,\n created_at TEXT,\n last_updated TEXT\n );\n\n -- Embedding Outbox (Single-Writer Pattern)\n CREATE TABLE IF NOT EXISTS embedding_outbox (\n id TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n content TEXT NOT NULL,\n status TEXT DEFAULT 'pending',\n retry_count INTEGER DEFAULT 0,\n created_at TEXT DEFAULT (datetime('now')),\n processed_at TEXT,\n error_message TEXT\n );\n\n -- Projection offset tracking\n CREATE TABLE IF NOT EXISTS projection_offsets (\n projection_name TEXT PRIMARY KEY,\n last_event_id TEXT,\n last_timestamp TEXT,\n updated_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Memory level tracking\n CREATE TABLE IF NOT EXISTS memory_levels (\n event_id TEXT PRIMARY KEY,\n level TEXT NOT NULL DEFAULT 'L0',\n promoted_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Entries (immutable memory units)\n CREATE TABLE IF NOT EXISTS entries (\n entry_id TEXT PRIMARY KEY,\n created_ts TEXT NOT NULL,\n entry_type TEXT NOT NULL,\n title TEXT NOT NULL,\n content_json TEXT NOT NULL,\n stage TEXT NOT NULL DEFAULT 'raw',\n status TEXT DEFAULT 'active',\n superseded_by TEXT,\n build_id TEXT,\n evidence_json TEXT,\n canonical_key TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Entities (task/condition/artifact)\n CREATE TABLE IF NOT EXISTS entities (\n entity_id TEXT PRIMARY KEY,\n entity_type TEXT NOT NULL,\n canonical_key TEXT NOT NULL,\n title TEXT NOT NULL,\n stage TEXT NOT NULL DEFAULT 'raw',\n status TEXT NOT NULL DEFAULT 'active',\n current_json TEXT NOT NULL,\n title_norm TEXT,\n search_text TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Entity aliases for canonical key lookup\n CREATE TABLE IF NOT EXISTS entity_aliases (\n entity_type TEXT NOT NULL,\n canonical_key TEXT NOT NULL,\n entity_id TEXT NOT NULL,\n is_primary INTEGER DEFAULT 0,\n created_at TEXT DEFAULT (datetime('now')),\n PRIMARY KEY(entity_type, canonical_key)\n );\n\n -- Edges (relationships between entries/entities)\n CREATE TABLE IF NOT EXISTS edges (\n edge_id TEXT PRIMARY KEY,\n src_type TEXT NOT NULL,\n src_id TEXT NOT NULL,\n rel_type TEXT NOT NULL,\n dst_type TEXT NOT NULL,\n dst_id TEXT NOT NULL,\n meta_json TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Vector Outbox V2 Table\n CREATE TABLE IF NOT EXISTS vector_outbox (\n job_id TEXT PRIMARY KEY,\n item_kind TEXT NOT NULL,\n item_id TEXT NOT NULL,\n embedding_version TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n retry_count INTEGER DEFAULT 0,\n error TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now')),\n UNIQUE(item_kind, item_id, embedding_version)\n );\n\n -- Build Runs\n CREATE TABLE IF NOT EXISTS build_runs (\n build_id TEXT PRIMARY KEY,\n started_at TEXT NOT NULL,\n finished_at TEXT,\n extractor_model TEXT NOT NULL,\n extractor_prompt_hash TEXT NOT NULL,\n embedder_model TEXT NOT NULL,\n embedding_version TEXT NOT NULL,\n idris_version TEXT NOT NULL,\n schema_version TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'running',\n error TEXT\n );\n\n -- Pipeline Metrics\n CREATE TABLE IF NOT EXISTS pipeline_metrics (\n id TEXT PRIMARY KEY,\n ts TEXT NOT NULL,\n stage TEXT NOT NULL,\n latency_ms REAL NOT NULL,\n success INTEGER NOT NULL,\n error TEXT,\n session_id TEXT\n );\n\n -- Working Set table (active memory window)\n CREATE TABLE IF NOT EXISTS working_set (\n id TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n added_at TEXT DEFAULT (datetime('now')),\n relevance_score REAL DEFAULT 1.0,\n topics TEXT,\n expires_at TEXT\n );\n\n -- Consolidated Memories table (long-term integrated memories)\n CREATE TABLE IF NOT EXISTS consolidated_memories (\n memory_id TEXT PRIMARY KEY,\n summary TEXT NOT NULL,\n topics TEXT,\n source_events TEXT,\n confidence REAL DEFAULT 0.5,\n created_at TEXT DEFAULT (datetime('now')),\n accessed_at TEXT,\n access_count INTEGER DEFAULT 0\n );\n\n -- Continuity Log table (tracks context transitions)\n CREATE TABLE IF NOT EXISTS continuity_log (\n log_id TEXT PRIMARY KEY,\n from_context_id TEXT,\n to_context_id TEXT,\n continuity_score REAL,\n transition_type TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Consolidated Rules table (long-term stable memory)\n CREATE TABLE IF NOT EXISTS consolidated_rules (\n rule_id TEXT PRIMARY KEY,\n rule TEXT NOT NULL,\n topics TEXT,\n source_memory_ids TEXT,\n source_events TEXT,\n confidence REAL DEFAULT 0.5,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Endless Mode Config table\n CREATE TABLE IF NOT EXISTS endless_config (\n key TEXT PRIMARY KEY,\n value TEXT,\n updated_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Memory Helpfulness tracking\n CREATE TABLE IF NOT EXISTS memory_helpfulness (\n id TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n retrieval_score REAL DEFAULT 0,\n query_preview TEXT,\n session_continued INTEGER DEFAULT 0,\n prompt_count_after INTEGER DEFAULT 0,\n tool_success_count INTEGER DEFAULT 0,\n tool_total_count INTEGER DEFAULT 0,\n was_reasked INTEGER DEFAULT 0,\n helpfulness_score REAL DEFAULT 0.5,\n created_at TEXT DEFAULT (datetime('now')),\n measured_at TEXT\n );\n\n -- Retrieval trace log (query -> candidates -> selected for context)\n CREATE TABLE IF NOT EXISTS retrieval_traces (\n trace_id TEXT PRIMARY KEY,\n session_id TEXT,\n project_hash TEXT,\n query_text TEXT NOT NULL,\n raw_query_text TEXT,\n query_rewrite_kind TEXT,\n strategy TEXT,\n candidate_event_ids TEXT,\n selected_event_ids TEXT,\n candidate_details_json TEXT,\n selected_details_json TEXT,\n candidate_count INTEGER DEFAULT 0,\n selected_count INTEGER DEFAULT 0,\n confidence TEXT,\n fallback_trace TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Sync position tracking (for SQLite -> DuckDB sync)\n CREATE TABLE IF NOT EXISTS sync_positions (\n target_name TEXT PRIMARY KEY,\n last_event_id TEXT,\n last_timestamp TEXT,\n updated_at TEXT DEFAULT (datetime('now'))\n );\n\n -- Memory Operations: facet assignments (derived, rebuildable projection)\n CREATE TABLE IF NOT EXISTS memory_facets (\n id TEXT PRIMARY KEY,\n target_type TEXT NOT NULL,\n target_id TEXT NOT NULL,\n dimension TEXT NOT NULL,\n value TEXT NOT NULL,\n confidence REAL NOT NULL DEFAULT 1.0,\n source TEXT NOT NULL DEFAULT 'manual',\n evidence_event_ids TEXT NOT NULL DEFAULT '[]',\n project_hash TEXT NOT NULL DEFAULT '',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n UNIQUE(target_type, target_id, dimension, value, source, project_hash)\n );\n\n -- Memory Operations: operational action projection\n CREATE TABLE IF NOT EXISTS memory_actions (\n action_id TEXT PRIMARY KEY,\n project_hash TEXT NOT NULL,\n title TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n priority INTEGER NOT NULL DEFAULT 0,\n source_event_ids TEXT NOT NULL DEFAULT '[]',\n related_entity_ids TEXT NOT NULL DEFAULT '[]',\n current_checkpoint_id TEXT,\n lease_id TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n -- Memory Operations: action dependency/reference edges\n CREATE TABLE IF NOT EXISTS memory_action_edges (\n edge_id TEXT PRIMARY KEY,\n src_action_id TEXT NOT NULL,\n rel_type TEXT NOT NULL,\n dst_type TEXT NOT NULL,\n dst_id TEXT NOT NULL,\n confidence REAL NOT NULL DEFAULT 1.0,\n source TEXT NOT NULL DEFAULT 'manual',\n created_at TEXT NOT NULL,\n UNIQUE(src_action_id, rel_type, dst_type, dst_id, source)\n );\n\n -- Memory Operations: short-lived leases for operational work\n CREATE TABLE IF NOT EXISTS memory_leases (\n lease_id TEXT PRIMARY KEY,\n target_type TEXT NOT NULL,\n target_id TEXT NOT NULL,\n holder TEXT NOT NULL,\n expires_at TEXT NOT NULL,\n metadata_json TEXT,\n created_at TEXT NOT NULL,\n renewed_at TEXT,\n released_at TEXT\n );\n\n -- Memory Operations: resumable checkpoints for delegated or long-running work\n CREATE TABLE IF NOT EXISTS memory_checkpoints (\n checkpoint_id TEXT PRIMARY KEY,\n project_hash TEXT NOT NULL,\n action_id TEXT,\n session_id TEXT,\n title TEXT NOT NULL,\n summary TEXT NOT NULL,\n state_json TEXT NOT NULL,\n source_event_ids TEXT NOT NULL DEFAULT '[]',\n created_at TEXT NOT NULL,\n expires_at TEXT\n );\n\n -- Memory Operations: retention lifecycle score projection\n CREATE TABLE IF NOT EXISTS memory_retention_scores (\n score_id TEXT PRIMARY KEY,\n target_type TEXT NOT NULL,\n target_id TEXT NOT NULL,\n project_hash TEXT NOT NULL,\n policy_version TEXT NOT NULL,\n decision TEXT NOT NULL,\n lifecycle_score REAL NOT NULL,\n factors_json TEXT NOT NULL,\n reasons_json TEXT NOT NULL,\n dry_run_diff_json TEXT NOT NULL,\n source_event_ids TEXT NOT NULL DEFAULT '[]',\n evaluated_at TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n UNIQUE(target_type, target_id, project_hash, policy_version)\n );\n\n -- Memory Operations: procedural lessons derived from successful workflows\n CREATE TABLE IF NOT EXISTS memory_lessons (\n lesson_id TEXT PRIMARY KEY,\n project_hash TEXT NOT NULL DEFAULT '',\n name TEXT NOT NULL,\n trigger TEXT NOT NULL,\n steps_json TEXT NOT NULL,\n confidence REAL NOT NULL,\n source_session_ids TEXT NOT NULL DEFAULT '[]',\n source_event_ids TEXT NOT NULL DEFAULT '[]',\n failure_modes_json TEXT NOT NULL DEFAULT '[]',\n skill_candidate INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n UNIQUE(project_hash, name)\n );\n\n -- Perspective Memory: privacy-safe actors/peers\n CREATE TABLE IF NOT EXISTS memory_actors (\n actor_id TEXT PRIMARY KEY,\n project_hash TEXT NOT NULL DEFAULT '',\n kind TEXT NOT NULL,\n display_name TEXT NOT NULL,\n source TEXT NOT NULL,\n metadata_json TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n -- Perspective Memory: actors participating in a session and observation policy\n CREATE TABLE IF NOT EXISTS session_actors (\n project_hash TEXT NOT NULL DEFAULT '',\n session_id TEXT NOT NULL,\n actor_id TEXT NOT NULL,\n role_in_session TEXT NOT NULL,\n observe_self INTEGER NOT NULL DEFAULT 1,\n observe_others INTEGER NOT NULL DEFAULT 0,\n joined_at TEXT NOT NULL,\n left_at TEXT,\n metadata_json TEXT,\n PRIMARY KEY(project_hash, session_id, actor_id)\n );\n\n -- Perspective Memory: compact Honcho-style actor cards\n CREATE TABLE IF NOT EXISTS actor_cards (\n card_id TEXT PRIMARY KEY,\n project_hash TEXT NOT NULL DEFAULT '',\n observer_actor_id TEXT NOT NULL,\n observed_actor_id TEXT NOT NULL,\n entries_json TEXT NOT NULL,\n source_event_ids_json TEXT NOT NULL DEFAULT '[]',\n updated_by TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n UNIQUE(project_hash, observer_actor_id, observed_actor_id)\n );\n\n -- Perspective Memory: observer -> observed claims with evidence pointers\n CREATE TABLE IF NOT EXISTS perspective_observations (\n observation_id TEXT PRIMARY KEY,\n project_hash TEXT NOT NULL DEFAULT '',\n observer_actor_id TEXT NOT NULL,\n observed_actor_id TEXT NOT NULL,\n session_id TEXT,\n level TEXT NOT NULL,\n content TEXT NOT NULL,\n confidence REAL NOT NULL,\n source_event_ids_json TEXT NOT NULL DEFAULT '[]',\n source_observation_ids_json TEXT NOT NULL DEFAULT '[]',\n created_by TEXT NOT NULL,\n metadata_json TEXT,\n content_hash TEXT NOT NULL,\n source_hash TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n deleted_at TEXT,\n UNIQUE(project_hash, observer_actor_id, observed_actor_id, level, content_hash, source_hash)\n );\n\n -- Perspective Memory: FTS5 index for observation content queries.\n -- Use an external-content FTS table so the searchable projection stores the index,\n -- not a second raw copy of private observation text.\n CREATE VIRTUAL TABLE IF NOT EXISTS perspective_observations_fts USING fts5(\n content,\n observation_id UNINDEXED,\n content='perspective_observations',\n content_rowid='rowid',\n tokenize='porter unicode61'\n );\n\n -- Backfill the FTS table for writable legacy stores that predate the FTS projection.\n INSERT OR IGNORE INTO perspective_observations_fts(rowid, content, observation_id)\n SELECT rowid, content, observation_id FROM perspective_observations;\n\n CREATE TRIGGER IF NOT EXISTS perspective_observations_fts_insert AFTER INSERT ON perspective_observations BEGIN\n INSERT INTO perspective_observations_fts(rowid, content, observation_id) VALUES (NEW.rowid, NEW.content, NEW.observation_id);\n END;\n\n CREATE TRIGGER IF NOT EXISTS perspective_observations_fts_delete AFTER DELETE ON perspective_observations BEGIN\n INSERT INTO perspective_observations_fts(perspective_observations_fts, rowid, content, observation_id) VALUES('delete', OLD.rowid, OLD.content, OLD.observation_id);\n END;\n\n CREATE TRIGGER IF NOT EXISTS perspective_observations_fts_update AFTER UPDATE ON perspective_observations BEGIN\n INSERT INTO perspective_observations_fts(perspective_observations_fts, rowid, content, observation_id) VALUES('delete', OLD.rowid, OLD.content, OLD.observation_id);\n INSERT INTO perspective_observations_fts(rowid, content, observation_id) VALUES (NEW.rowid, NEW.content, NEW.observation_id);\n END;\n\n -- Memory Operations: governance/audit trail for state-changing operations\n CREATE TABLE IF NOT EXISTS memory_governance_audit (\n audit_id TEXT PRIMARY KEY,\n operation TEXT NOT NULL,\n actor TEXT NOT NULL,\n project_hash TEXT,\n target_type TEXT NOT NULL,\n target_id TEXT NOT NULL,\n before_json TEXT,\n after_json TEXT,\n source_event_ids TEXT NOT NULL DEFAULT '[]',\n created_at TEXT NOT NULL\n );\n\n -- Create indexes\n CREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id);\n CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);\n CREATE INDEX IF NOT EXISTS idx_entries_type ON entries(entry_type);\n CREATE INDEX IF NOT EXISTS idx_entries_stage ON entries(stage);\n CREATE INDEX IF NOT EXISTS idx_entries_canonical ON entries(canonical_key);\n CREATE INDEX IF NOT EXISTS idx_entities_type_key ON entities(entity_type, canonical_key);\n CREATE INDEX IF NOT EXISTS idx_entities_status ON entities(status);\n CREATE INDEX IF NOT EXISTS idx_edges_src ON edges(src_id, rel_type);\n CREATE INDEX IF NOT EXISTS idx_edges_dst ON edges(dst_id, rel_type);\n CREATE INDEX IF NOT EXISTS idx_edges_rel ON edges(rel_type);\n CREATE INDEX IF NOT EXISTS idx_outbox_status ON vector_outbox(status);\n CREATE INDEX IF NOT EXISTS idx_outbox_created ON vector_outbox(created_at);\n CREATE INDEX IF NOT EXISTS idx_working_set_expires ON working_set(expires_at);\n CREATE INDEX IF NOT EXISTS idx_working_set_relevance ON working_set(relevance_score);\n CREATE INDEX IF NOT EXISTS idx_consolidated_confidence ON consolidated_memories(confidence);\n CREATE INDEX IF NOT EXISTS idx_continuity_created ON continuity_log(created_at);\n CREATE INDEX IF NOT EXISTS idx_consolidated_rules_confidence ON consolidated_rules(confidence);\n CREATE INDEX IF NOT EXISTS idx_embedding_outbox_status ON embedding_outbox(status);\n CREATE INDEX IF NOT EXISTS idx_helpfulness_event ON memory_helpfulness(event_id);\n CREATE INDEX IF NOT EXISTS idx_helpfulness_session ON memory_helpfulness(session_id);\n CREATE INDEX IF NOT EXISTS idx_helpfulness_score ON memory_helpfulness(helpfulness_score DESC);\n CREATE INDEX IF NOT EXISTS idx_helpfulness_created_at ON memory_helpfulness(created_at);\n CREATE INDEX IF NOT EXISTS idx_helpfulness_measured_at ON memory_helpfulness(measured_at);\n CREATE INDEX IF NOT EXISTS idx_retrieval_traces_created_at ON retrieval_traces(created_at DESC);\n CREATE INDEX IF NOT EXISTS idx_retrieval_traces_project_hash ON retrieval_traces(project_hash);\n CREATE INDEX IF NOT EXISTS idx_retrieval_traces_session_id ON retrieval_traces(session_id);\n CREATE INDEX IF NOT EXISTS idx_memory_facets_project_dimension_value ON memory_facets(project_hash, dimension, value);\n CREATE INDEX IF NOT EXISTS idx_memory_facets_target ON memory_facets(target_type, target_id);\n CREATE INDEX IF NOT EXISTS idx_memory_facets_dimension_value_confidence ON memory_facets(dimension, value, confidence DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_actions_project_status_priority ON memory_actions(project_hash, status, priority DESC, updated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_action_edges_src ON memory_action_edges(src_action_id, rel_type);\n CREATE INDEX IF NOT EXISTS idx_memory_action_edges_dst ON memory_action_edges(dst_type, dst_id);\n CREATE INDEX IF NOT EXISTS idx_memory_leases_target_expires ON memory_leases(target_type, target_id, expires_at);\n CREATE INDEX IF NOT EXISTS idx_memory_checkpoints_project_action_created ON memory_checkpoints(project_hash, action_id, created_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_checkpoints_project_session_created ON memory_checkpoints(project_hash, session_id, created_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_retention_scores_project_decision_score ON memory_retention_scores(project_hash, decision, lifecycle_score ASC, evaluated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_retention_scores_target ON memory_retention_scores(target_type, target_id, project_hash);\n CREATE INDEX IF NOT EXISTS idx_memory_retention_scores_policy_evaluated ON memory_retention_scores(policy_version, evaluated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_lessons_project_confidence ON memory_lessons(project_hash, confidence DESC, updated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_lessons_skill_candidate ON memory_lessons(project_hash, skill_candidate, confidence DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_lessons_updated ON memory_lessons(updated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_actors_project_kind ON memory_actors(project_hash, kind, updated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_actors_source ON memory_actors(source, kind);\n CREATE INDEX IF NOT EXISTS idx_session_actors_session ON session_actors(project_hash, session_id, role_in_session);\n CREATE INDEX IF NOT EXISTS idx_session_actors_actor ON session_actors(actor_id, project_hash, session_id);\n CREATE INDEX IF NOT EXISTS idx_actor_cards_perspective ON actor_cards(project_hash, observer_actor_id, observed_actor_id);\n CREATE INDEX IF NOT EXISTS idx_actor_cards_updated ON actor_cards(updated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_perspective_observations_perspective_level ON perspective_observations(project_hash, observer_actor_id, observed_actor_id, level, confidence DESC, updated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_perspective_observations_session ON perspective_observations(project_hash, session_id, level, updated_at DESC);\n CREATE INDEX IF NOT EXISTS idx_perspective_observations_source_hash ON perspective_observations(project_hash, source_hash);\n CREATE INDEX IF NOT EXISTS idx_perspective_observations_deleted ON perspective_observations(deleted_at);\n CREATE INDEX IF NOT EXISTS idx_memory_governance_audit_project_operation ON memory_governance_audit(project_hash, operation, created_at DESC);\n CREATE INDEX IF NOT EXISTS idx_memory_governance_audit_target ON memory_governance_audit(target_type, target_id, created_at DESC);\n\n -- FTS5 Full-Text Search for fast keyword search\n CREATE VIRTUAL TABLE IF NOT EXISTS events_fts USING fts5(\n content,\n event_id UNINDEXED,\n tokenize='porter unicode61'\n );\n\n -- Triggers to keep FTS in sync with events table\n CREATE TRIGGER IF NOT EXISTS events_fts_insert AFTER INSERT ON events BEGIN\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END;\n\n CREATE TRIGGER IF NOT EXISTS events_fts_delete AFTER DELETE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n END;\n\n CREATE TRIGGER IF NOT EXISTS events_fts_update AFTER UPDATE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END;\n `);\n\n\n // Best-effort forward migration for action edge source ownership\n try {\n sqliteExec(this.db, `ALTER TABLE memory_action_edges ADD COLUMN source TEXT NOT NULL DEFAULT 'manual';`);\n } catch {\n // column may already exist\n }\n try {\n const edgeIndexes = sqliteAll<{ name: string; unique: number }>(this.db, `PRAGMA index_list(memory_action_edges)`, []);\n const hasSourceAwareUnique = edgeIndexes.some((index) => {\n if (Number(index.unique) !== 1) return false;\n if (!/^[A-Za-z0-9_]+$/.test(index.name)) return false;\n const escapedName = index.name.replace(/\"/g, '\"\"');\n const columns = sqliteAll<{ name: string }>(this.db, 'PRAGMA index_info(\"' + escapedName + '\")', [])\n .map((column) => column.name);\n return columns.length === 5\n && columns[0] === 'src_action_id'\n && columns[1] === 'rel_type'\n && columns[2] === 'dst_type'\n && columns[3] === 'dst_id'\n && columns[4] === 'source';\n });\n if (!hasSourceAwareUnique) {\n sqliteExec(this.db, `\n DROP TABLE IF EXISTS memory_action_edges_v2;\n CREATE TABLE memory_action_edges_v2 (\n edge_id TEXT PRIMARY KEY,\n src_action_id TEXT NOT NULL,\n rel_type TEXT NOT NULL,\n dst_type TEXT NOT NULL,\n dst_id TEXT NOT NULL,\n confidence REAL NOT NULL DEFAULT 1.0,\n source TEXT NOT NULL DEFAULT 'manual',\n created_at TEXT NOT NULL,\n UNIQUE(src_action_id, rel_type, dst_type, dst_id, source)\n );\n INSERT OR IGNORE INTO memory_action_edges_v2 (\n edge_id, src_action_id, rel_type, dst_type, dst_id, confidence, source, created_at\n )\n SELECT edge_id, src_action_id, rel_type, dst_type, dst_id, confidence, source, created_at\n FROM memory_action_edges;\n DROP TABLE memory_action_edges;\n ALTER TABLE memory_action_edges_v2 RENAME TO memory_action_edges;\n CREATE INDEX IF NOT EXISTS idx_memory_action_edges_src ON memory_action_edges(src_action_id, rel_type);\n CREATE INDEX IF NOT EXISTS idx_memory_action_edges_dst ON memory_action_edges(dst_type, dst_id);\n `);\n }\n } catch {\n // action edge table may not exist in partial migrations\n }\n\n // Best-effort forward migration for retrieval trace detail column\n try {\n sqliteExec(this.db, `ALTER TABLE retrieval_traces ADD COLUMN selected_details_json TEXT;`);\n } catch {\n // column may already exist\n }\n try {\n sqliteExec(this.db, `ALTER TABLE retrieval_traces ADD COLUMN candidate_details_json TEXT;`);\n } catch {\n // column may already exist\n }\n try {\n sqliteExec(this.db, `ALTER TABLE retrieval_traces ADD COLUMN raw_query_text TEXT;`);\n } catch {\n // column may already exist\n }\n try {\n sqliteExec(this.db, `ALTER TABLE retrieval_traces ADD COLUMN query_rewrite_kind TEXT;`);\n } catch {\n // column may already exist\n }\n try {\n sqliteExec(this.db, `CREATE INDEX IF NOT EXISTS idx_retrieval_traces_query_rewrite_kind ON retrieval_traces(query_rewrite_kind);`);\n } catch {\n // index/table may not exist in partial migrations\n }\n\n // Migrate existing events table to add new columns if they don't exist\n // Check if columns exist before trying to add them\n const tableInfo = sqliteAll(this.db, \"PRAGMA table_info(events)\", []);\n const columnNames = tableInfo.map((col: any) => col.name);\n\n if (!columnNames.includes('access_count')) {\n try {\n sqliteExec(this.db, `\n ALTER TABLE events ADD COLUMN access_count INTEGER DEFAULT 0;\n `);\n } catch (err: any) {\n console.error('Error adding access_count column:', err);\n }\n }\n\n if (!columnNames.includes('last_accessed_at')) {\n try {\n sqliteExec(this.db, `\n ALTER TABLE events ADD COLUMN last_accessed_at TEXT;\n `);\n } catch (err: any) {\n console.error('Error adding last_accessed_at column:', err);\n }\n }\n\n // Add turn_id column for grouping events within a conversation turn\n if (!columnNames.includes('turn_id')) {\n try {\n sqliteExec(this.db, `\n ALTER TABLE events ADD COLUMN turn_id TEXT;\n `);\n } catch (err: any) {\n console.error('Error adding turn_id column:', err);\n }\n }\n\n // Create indexes for new columns if they don't exist\n try {\n sqliteExec(this.db, `\n CREATE INDEX IF NOT EXISTS idx_events_access_count ON events(access_count DESC);\n `);\n } catch (err: any) {\n // Index may already exist, ignore\n }\n\n try {\n sqliteExec(this.db, `\n CREATE INDEX IF NOT EXISTS idx_events_last_accessed ON events(last_accessed_at DESC);\n `);\n } catch (err: any) {\n // Index may already exist, ignore\n }\n\n try {\n sqliteExec(this.db, `\n CREATE INDEX IF NOT EXISTS idx_events_turn_id ON events(turn_id);\n `);\n } catch (err: any) {\n // Index may already exist, ignore\n }\n\n this.initialized = true;\n }\n\n /**\n * Append event to store (Append-only, Idempotent)\n */\n async append(input: MemoryEventInput): Promise<AppendResult> {\n await this.initialize();\n\n const canonicalKey = makeCanonicalKey(input.content);\n const dedupeKey = makeDedupeKey(input.content, input.sessionId);\n\n // Check for duplicate\n const existing = sqliteGet<{ event_id: string }>(\n this.db,\n `SELECT event_id FROM event_dedup WHERE dedupe_key = ?`,\n [dedupeKey]\n );\n\n if (existing) {\n try {\n await this.enqueueVectorOutboxEvent(existing.event_id);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n return {\n success: true,\n eventId: existing.event_id,\n isDuplicate: true\n };\n }\n\n const id = randomUUID();\n const timestamp = toSQLiteTimestamp(input.timestamp);\n\n try {\n // Extract turnId from metadata if present\n const metadata = input.metadata || {};\n const turnId = (metadata.turnId as string) || null;\n\n // Use transaction for atomicity\n const insertEvent = this.db.prepare(`\n INSERT INTO events (id, event_type, session_id, timestamp, content, canonical_key, dedupe_key, metadata, turn_id)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const insertDedup = this.db.prepare(`\n INSERT INTO event_dedup (dedupe_key, event_id) VALUES (?, ?)\n `);\n\n const insertLevel = this.db.prepare(`\n INSERT INTO memory_levels (event_id, level) VALUES (?, 'L0')\n `);\n\n const transaction = this.db.transaction(() => {\n insertEvent.run(\n id,\n input.eventType,\n input.sessionId,\n timestamp,\n input.content,\n canonicalKey,\n dedupeKey,\n JSON.stringify(metadata),\n turnId\n );\n insertDedup.run(dedupeKey, id);\n insertLevel.run(id);\n this.enqueueVectorOutboxEventSync(id);\n });\n\n transaction();\n\n if (this.markdownMirror) {\n const event: MemoryEvent = {\n id,\n eventType: input.eventType,\n sessionId: input.sessionId,\n timestamp: input.timestamp,\n content: input.content,\n canonicalKey,\n dedupeKey,\n metadata\n };\n this.markdownMirror.append(event).catch((err) => {\n console.warn('[SQLiteEventStore] markdown mirror append failed:', err);\n });\n }\n\n return { success: true, eventId: id, isDuplicate: false };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Get session IDs that have events but no session_summary event.\n * Used to backfill summaries for sessions that ended without Stop hook.\n */\n async getSessionsWithoutSummary(currentSessionId: string, limit = 5): Promise<string[]> {\n await this.initialize();\n const rows = sqliteAll<{ session_id: string }>(\n this.db,\n `SELECT DISTINCT e.session_id\n FROM events e\n WHERE e.session_id != ?\n AND e.event_type != 'session_summary'\n AND e.session_id NOT IN (\n SELECT DISTINCT session_id FROM events WHERE event_type = 'session_summary'\n )\n GROUP BY e.session_id\n HAVING COUNT(*) >= 3\n ORDER BY MAX(e.timestamp) DESC\n LIMIT ?`,\n [currentSessionId, limit]\n );\n return rows.map((r) => r.session_id);\n }\n\n /**\n * Get events by session ID\n */\n async getSessionEvents(sessionId: string, options?: QuarantineReadOptions): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE session_id = ? AND ${maybeQuarantinePredicate(options)} ORDER BY timestamp ASC`,\n [sessionId]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Get recent events\n */\n async getRecentEvents(limit: number = 100, options?: QuarantineReadOptions): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE ${maybeQuarantinePredicate(options)} ORDER BY timestamp DESC LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Get event by ID\n */\n async getEvent(id: string, options?: QuarantineReadOptions): Promise<MemoryEvent | null> {\n await this.initialize();\n\n const row = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE id = ? AND ${maybeQuarantinePredicate(options)}`,\n [id]\n );\n\n if (!row) return null;\n return this.rowToEvent(row);\n }\n\n /**\n * Get events since a timestamp (for sync)\n */\n async getEventsSince(timestamp: string, limit: number = 1000, options?: QuarantineReadOptions): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE timestamp > ? AND ${maybeQuarantinePredicate(options)} ORDER BY timestamp ASC LIMIT ?`,\n [timestamp, limit]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Get events since a SQLite rowid (for robust incremental replication).\n * Rowid is monotonic for append-only tables, independent of client timestamps.\n */\n async getEventsSinceRowid(\n lastRowid: number,\n limit: number = 1000,\n options?: QuarantineReadOptions\n ): Promise<Array<{ rowid: number; event: MemoryEvent }>> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT rowid as _rowid, * FROM events WHERE rowid > ? AND ${maybeQuarantinePredicate(options)} ORDER BY rowid ASC LIMIT ?`,\n [lastRowid, limit]\n );\n\n return rows.map(row => ({\n rowid: row._rowid as number,\n event: this.rowToEvent(row)\n }));\n }\n\n /**\n * Import events with fixed IDs (used for cross-machine replication).\n * Idempotent: skips if event id or dedupeKey already exists.\n *\n * NOTE: This bypasses the append() id generation to preserve stable IDs.\n */\n async importEvents(events: MemoryEvent[]): Promise<{ inserted: number; skipped: number }> {\n if (events.length === 0) return { inserted: 0, skipped: 0 };\n if (this.readOnly) return { inserted: 0, skipped: events.length };\n\n await this.initialize();\n\n const getById = this.db.prepare(`SELECT id FROM events WHERE id = ?`);\n const getByDedupe = this.db.prepare(`SELECT event_id FROM event_dedup WHERE dedupe_key = ?`);\n\n const insertEvent = this.db.prepare(`\n INSERT INTO events (id, event_type, session_id, timestamp, content, canonical_key, dedupe_key, metadata, turn_id)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const insertDedup = this.db.prepare(`\n INSERT INTO event_dedup (dedupe_key, event_id) VALUES (?, ?)\n `);\n\n const insertLevel = this.db.prepare(`\n INSERT INTO memory_levels (event_id, level) VALUES (?, 'L0')\n `);\n\n let inserted = 0;\n let skipped = 0;\n const insertedEvents: MemoryEvent[] = [];\n\n const tx = this.db.transaction((batch: MemoryEvent[]) => {\n for (const ev of batch) {\n // Skip if already present by id\n const existingById = getById.get(ev.id) as { id: string } | undefined;\n if (existingById) {\n skipped++;\n continue;\n }\n\n const canonicalKey = ev.canonicalKey || makeCanonicalKey(ev.content);\n const dedupeKey = ev.dedupeKey || makeDedupeKey(ev.content, ev.sessionId);\n\n // Skip if already present by dedupe key\n const existingByDedupe = getByDedupe.get(dedupeKey) as { event_id: string } | undefined;\n if (existingByDedupe) {\n skipped++;\n continue;\n }\n\n const metadata = ev.metadata || {};\n const turnId = (metadata as any).turnId as string | undefined;\n\n insertEvent.run(\n ev.id,\n ev.eventType,\n ev.sessionId,\n toSQLiteTimestamp(ev.timestamp),\n ev.content,\n canonicalKey,\n dedupeKey,\n JSON.stringify(metadata),\n turnId ?? null\n );\n\n insertDedup.run(dedupeKey, ev.id);\n insertLevel.run(ev.id);\n this.enqueueVectorOutboxEventSync(ev.id);\n inserted++;\n insertedEvents.push(ev);\n }\n });\n\n tx(events);\n\n if (this.markdownMirror && insertedEvents.length > 0) {\n for (const ev of insertedEvents) {\n this.markdownMirror.append(ev).catch((err) => {\n console.warn('[SQLiteEventStore] markdown mirror append failed:', err);\n });\n }\n }\n\n return { inserted, skipped };\n }\n\n /**\n * Create or update session\n */\n async upsertSession(session: Partial<Session> & { id: string }): Promise<void> {\n await this.initialize();\n\n const existing = sqliteGet<{ id: string }>(\n this.db,\n `SELECT id FROM sessions WHERE id = ?`,\n [session.id]\n );\n\n if (!existing) {\n sqliteRun(\n this.db,\n `INSERT INTO sessions (id, started_at, project_path, tags)\n VALUES (?, ?, ?, ?)`,\n [\n session.id,\n toSQLiteTimestamp(session.startedAt || new Date()),\n session.projectPath || null,\n JSON.stringify(session.tags || [])\n ]\n );\n } else {\n const updates: string[] = [];\n const values: unknown[] = [];\n\n if (session.endedAt) {\n updates.push('ended_at = ?');\n values.push(toSQLiteTimestamp(session.endedAt));\n }\n if (session.summary) {\n updates.push('summary = ?');\n values.push(session.summary);\n }\n if (session.tags) {\n updates.push('tags = ?');\n values.push(JSON.stringify(session.tags));\n }\n\n if (updates.length > 0) {\n values.push(session.id);\n sqliteRun(\n this.db,\n `UPDATE sessions SET ${updates.join(', ')} WHERE id = ?`,\n values\n );\n }\n }\n }\n\n /**\n * Get session by ID\n */\n async getSession(id: string): Promise<Session | null> {\n await this.initialize();\n\n const row = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT * FROM sessions WHERE id = ?`,\n [id]\n );\n\n if (!row) return null;\n\n return {\n id: row.id as string,\n startedAt: toDateFromSQLite(row.started_at),\n endedAt: row.ended_at ? toDateFromSQLite(row.ended_at) : undefined,\n projectPath: row.project_path as string | undefined,\n summary: row.summary as string | undefined,\n tags: row.tags ? JSON.parse(row.tags as string) : undefined\n };\n }\n\n /**\n * Get all sessions\n */\n async getAllSessions(): Promise<Session[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM sessions ORDER BY started_at DESC`\n );\n\n return rows.map(row => ({\n id: row.id as string,\n startedAt: toDateFromSQLite(row.started_at),\n endedAt: row.ended_at ? toDateFromSQLite(row.ended_at) : undefined,\n projectPath: row.project_path as string | undefined,\n summary: row.summary as string | undefined,\n tags: row.tags ? JSON.parse(row.tags as string) : undefined\n }));\n }\n\n /**\n * Add to embedding outbox\n */\n async enqueueForEmbedding(eventId: string, content: string): Promise<string> {\n await this.initialize();\n\n const id = randomUUID();\n sqliteRun(\n this.db,\n `INSERT INTO embedding_outbox (id, event_id, content, status, retry_count)\n VALUES (?, ?, ?, 'pending', 0)`,\n [id, eventId, content]\n );\n\n return id;\n }\n\n /**\n * Get pending outbox items\n */\n async getPendingOutboxItems(limit: number = 32): Promise<OutboxItem[]> {\n await this.initialize();\n\n const pending = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM embedding_outbox\n WHERE status = 'pending'\n ORDER BY created_at\n LIMIT ?`,\n [limit]\n );\n\n if (pending.length === 0) return [];\n\n // Update status to processing and stamp the claim time so abandoned workers can be recovered safely.\n const ids = pending.map(r => r.id as string);\n const placeholders = ids.map(() => '?').join(',');\n sqliteRun(\n this.db,\n `UPDATE embedding_outbox\n SET status = 'processing', processed_at = datetime('now'), error_message = NULL\n WHERE id IN (${placeholders})`,\n ids\n );\n\n return pending.map(row => ({\n id: row.id as string,\n eventId: row.event_id as string,\n content: row.content as string,\n status: 'processing' as const,\n retryCount: row.retry_count as number,\n createdAt: toDateFromSQLite(row.created_at),\n errorMessage: row.error_message as string | undefined\n }));\n }\n\n /**\n * Mark outbox items as done\n */\n async completeOutboxItems(ids: string[]): Promise<void> {\n if (ids.length === 0) return;\n\n const placeholders = ids.map(() => '?').join(',');\n sqliteRun(\n this.db,\n `DELETE FROM embedding_outbox WHERE id IN (${placeholders})`,\n ids\n );\n }\n\n /**\n * Clear embedding outbox (used for embedding model migration)\n */\n async clearEmbeddingOutbox(): Promise<void> {\n await this.initialize();\n sqliteRun(this.db, `DELETE FROM embedding_outbox`);\n }\n\n /**\n * Count total events\n */\n async countEvents(options?: QuarantineReadOptions): Promise<number> {\n await this.initialize();\n const row = sqliteGet<{ count: number }>(this.db, `SELECT COUNT(*) as count FROM events WHERE ${maybeQuarantinePredicate(options)}`);\n return row?.count || 0;\n }\n\n /**\n * Get events page in timestamp ascending order (stable migration/reindex scans)\n */\n async getEventsPage(limit: number = 1000, offset: number = 0, options?: QuarantineReadOptions): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE ${maybeQuarantinePredicate(options)} ORDER BY timestamp ASC LIMIT ? OFFSET ?`,\n [limit, offset]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Mark outbox items as failed\n */\n async failOutboxItems(ids: string[], error: string): Promise<void> {\n if (ids.length === 0) return;\n\n const placeholders = ids.map(() => '?').join(',');\n sqliteRun(\n this.db,\n `UPDATE embedding_outbox\n SET status = CASE WHEN retry_count >= 3 THEN 'failed' ELSE 'pending' END,\n retry_count = retry_count + 1,\n error_message = ?\n WHERE id IN (${placeholders})`,\n [error, ...ids]\n );\n }\n\n /**\n * Recover abandoned outbox work after a worker/process crash.\n *\n * Rows in `processing` are claimed work. If the process exits before marking\n * them done/failed, they otherwise remain invisible to future processing.\n * Recovery is deliberately age-gated so an active worker is not disturbed.\n */\n async recoverStuckOutboxItems(options: OutboxRecoveryOptions = {}): Promise<OutboxRecoveryResult> {\n await this.initialize();\n\n const thresholdMs = Number.isFinite(options.stuckThresholdMs) && (options.stuckThresholdMs ?? 0) >= 0\n ? options.stuckThresholdMs!\n : DEFAULT_OUTBOX_STUCK_THRESHOLD_MS;\n const maxRetries = Number.isFinite(options.maxRetries) && (options.maxRetries ?? 0) > 0\n ? options.maxRetries!\n : DEFAULT_OUTBOX_MAX_RETRIES;\n const now = options.now ?? new Date();\n const threshold = new Date(now.getTime() - thresholdMs).toISOString();\n const result = emptyOutboxRecoveryResult();\n\n if (options.dryRun === true) {\n const embeddingRecovered = sqliteGet<{ count: number }>(\n this.db,\n `SELECT COUNT(*) AS count FROM embedding_outbox\n WHERE status = 'processing'\n AND datetime(COALESCE(processed_at, created_at)) < datetime(?)`,\n [threshold]\n );\n result.embedding.recoveredProcessing = Number(embeddingRecovered?.count ?? 0);\n\n const embeddingRetried = sqliteGet<{ count: number }>(\n this.db,\n `SELECT COUNT(*) AS count FROM embedding_outbox\n WHERE status = 'failed'\n AND retry_count < ?`,\n [maxRetries]\n );\n result.embedding.retriedFailed = Number(embeddingRetried?.count ?? 0);\n\n const vectorRecovered = sqliteGet<{ count: number }>(\n this.db,\n `SELECT COUNT(*) AS count FROM vector_outbox\n WHERE status = 'processing'\n AND datetime(updated_at) < datetime(?)`,\n [threshold]\n );\n result.vector.recoveredProcessing = Number(vectorRecovered?.count ?? 0);\n\n const vectorRetried = sqliteGet<{ count: number }>(\n this.db,\n `SELECT COUNT(*) AS count FROM vector_outbox\n WHERE status = 'failed'\n AND retry_count < ?`,\n [maxRetries]\n );\n result.vector.retriedFailed = Number(vectorRetried?.count ?? 0);\n\n return result;\n }\n\n const embeddingRecovered = sqliteRun(\n this.db,\n `UPDATE embedding_outbox\n SET status = 'pending', processed_at = NULL, error_message = NULL\n WHERE status = 'processing'\n AND datetime(COALESCE(processed_at, created_at)) < datetime(?)`,\n [threshold]\n );\n result.embedding.recoveredProcessing = Number(embeddingRecovered.changes ?? 0);\n\n const embeddingRetried = sqliteRun(\n this.db,\n `UPDATE embedding_outbox\n SET status = 'pending', error_message = NULL\n WHERE status = 'failed'\n AND retry_count < ?`,\n [maxRetries]\n );\n result.embedding.retriedFailed = Number(embeddingRetried.changes ?? 0);\n\n const vectorRecovered = sqliteRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'pending', updated_at = ?, error = NULL\n WHERE status = 'processing'\n AND datetime(updated_at) < datetime(?)`,\n [now.toISOString(), threshold]\n );\n result.vector.recoveredProcessing = Number(vectorRecovered.changes ?? 0);\n\n const vectorRetried = sqliteRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'pending', updated_at = ?, error = NULL\n WHERE status = 'failed'\n AND retry_count < ?`,\n [now.toISOString(), maxRetries]\n );\n result.vector.retriedFailed = Number(vectorRetried.changes ?? 0);\n\n return result;\n }\n\n\n /**\n * Repair legacy imported events that predate canonical project scope metadata.\n *\n * Same-project legacy rows are tagged with scope.project.hash. Rows that look\n * imported but cannot be proven to belong to this project are quarantined so\n * dashboard default reads/search do not surface cross-project contamination.\n */\n async repairLegacyProjectScope(options: ProjectScopeRepairOptions = {}): Promise<ProjectScopeRepairResult> {\n await this.initialize();\n\n const projectHash = options.projectHash || (options.projectPath ? hashProjectPath(options.projectPath) : undefined);\n if (!projectHash) {\n throw new Error('repairLegacyProjectScope requires projectPath or projectHash');\n }\n if (options.projectPath && options.projectHash && hashProjectPath(options.projectPath) !== options.projectHash) {\n throw new Error('repairLegacyProjectScope projectPath and projectHash refer to different project stores');\n }\n\n const dryRun = options.dryRun === true;\n const nowIso = (options.now || new Date()).toISOString();\n const result = buildRepairResult(projectHash, dryRun);\n\n const rows = sqliteAll<{\n id: string;\n content: string;\n metadata: string | null;\n session_project_path: string | null;\n }>(\n this.db,\n `SELECT e.id, e.content, e.metadata, s.project_path as session_project_path\n FROM events e\n LEFT JOIN sessions s ON s.id = e.session_id\n ORDER BY e.timestamp ASC`,\n []\n );\n\n const sample = (entry: ProjectScopeRepairSample) => {\n if (result.samples.length < 20) result.samples.push(entry);\n };\n\n for (const row of rows) {\n result.scanned++;\n\n let metadata: Record<string, unknown> = {};\n let metadataParseInvalid = false;\n if (row.metadata) {\n const parsed = safeParseMetadataValue(row.metadata);\n if (parsed) {\n metadata = parsed;\n } else {\n metadataParseInvalid = true;\n }\n }\n\n if (isActiveQuarantinedMetadata(metadata)) {\n result.skipped++;\n continue;\n }\n\n const currentHash = metadataProjectHash(metadata);\n const explicitPath = metadataProjectPath(metadata);\n const sessionProjectPath = typeof row.session_project_path === 'string' && row.session_project_path.length > 0\n ? row.session_project_path\n : undefined;\n const candidatePaths = metadataProjectPaths(metadata);\n if (sessionProjectPath && !candidatePaths.includes(sessionProjectPath)) {\n candidatePaths.push(sessionProjectPath);\n }\n const importedOrLegacy = metadataParseInvalid || isImportedOrLegacyScopedMetadata(metadata) || Boolean(sessionProjectPath);\n const pathHashes = candidatePaths.map((candidate) => {\n try {\n return { path: candidate, hash: hashProjectPath(candidate) };\n } catch {\n return { path: candidate, hash: undefined };\n }\n });\n const matchingPath = pathHashes.find((candidate) => candidate.hash === projectHash);\n const foreignPath = pathHashes.find((candidate) => candidate.hash && candidate.hash !== projectHash);\n\n let action: 'repaired' | 'quarantined' | 'skipped' = 'skipped';\n let reason: ProjectScopeRepairSample['reason'] | undefined;\n let observedProjectHash: string | undefined;\n\n if (foreignPath) {\n action = 'quarantined';\n reason = 'project-path-mismatch';\n observedProjectHash = foreignPath.hash;\n } else if (currentHash === projectHash && importedOrLegacy && hasConflictingContentProjectHint(row.content, options.projectPath)) {\n action = 'quarantined';\n reason = 'content-project-mismatch';\n } else if (currentHash === projectHash) {\n result.alreadyScoped++;\n continue;\n } else if (currentHash && currentHash !== projectHash) {\n action = 'quarantined';\n reason = 'scope-hash-mismatch';\n observedProjectHash = currentHash;\n } else if (matchingPath) {\n action = 'repaired';\n reason = matchingPath.path === sessionProjectPath && matchingPath.path !== explicitPath\n ? 'session-project-path'\n : 'same-project-path';\n } else if (candidatePaths.length > 0) {\n action = 'quarantined';\n reason = 'project-path-mismatch';\n } else if (importedOrLegacy) {\n action = 'quarantined';\n reason = 'missing-project-scope';\n }\n\n if (action === 'skipped' || !reason) {\n result.skipped++;\n continue;\n }\n\n if (action === 'repaired') {\n const scope = isRecord(metadata.scope) ? { ...metadata.scope } : {};\n const project = isRecord(scope.project) ? { ...scope.project } : {};\n project.hash = projectHash;\n scope.project = project;\n metadata.scope = scope;\n metadata.repair = {\n ...(isRecord(metadata.repair) ? metadata.repair : {}),\n legacyProjectScope: {\n action,\n reason,\n repairedAt: nowIso\n }\n };\n addMetadataTag(metadata, `proj:${projectHash}`);\n result.repaired++;\n } else {\n metadata.quarantine = {\n ...(isRecord(metadata.quarantine) ? metadata.quarantine : {}),\n status: 'active',\n category: 'project-scope',\n reason,\n detectedAt: nowIso,\n expectedProjectHash: projectHash,\n ...(observedProjectHash ? { observedProjectHash } : {})\n };\n metadata.repair = {\n ...(isRecord(metadata.repair) ? metadata.repair : {}),\n legacyProjectScope: {\n action,\n reason,\n repairedAt: nowIso\n }\n };\n addMetadataTag(metadata, 'quarantine:project-scope');\n result.quarantined++;\n }\n\n sample({ eventId: row.id, action, reason });\n if (!dryRun) {\n sqliteRun(this.db, `UPDATE events SET metadata = ? WHERE id = ?`, [JSON.stringify(metadata), row.id]);\n }\n }\n\n return result;\n }\n\n /**\n * Get embedding/vector outbox health statistics\n */\n async getOutboxStats(options: OutboxStatsOptions = {}): Promise<OutboxStats> {\n await this.initialize();\n\n const thresholdMs = Number.isFinite(options.stuckThresholdMs) && (options.stuckThresholdMs ?? 0) >= 0\n ? options.stuckThresholdMs!\n : DEFAULT_OUTBOX_STUCK_THRESHOLD_MS;\n const now = options.now ?? new Date();\n const threshold = new Date(now.getTime() - thresholdMs).toISOString();\n\n const embeddingRows = sqliteAll<{ status: string; count: number }>(\n this.db,\n `SELECT status, COUNT(*) as count FROM embedding_outbox GROUP BY status`\n );\n const vectorRows = sqliteAll<{ status: string; count: number }>(\n this.db,\n `SELECT status, COUNT(*) as count FROM vector_outbox GROUP BY status`\n );\n\n const processingAgeMs = (value: unknown): number | null => {\n if (value === null || value === undefined) return null;\n const date = toDateFromSQLite(value);\n const time = date.getTime();\n if (!Number.isFinite(time)) return null;\n return Math.max(0, now.getTime() - time);\n };\n\n const fromRows = (\n rows: Array<{ status: string; count: number }>,\n stuckProcessing: number,\n oldestProcessingAgeMs: number | null\n ) => {\n const out = { pending: 0, processing: 0, failed: 0, total: 0, stuckProcessing, oldestProcessingAgeMs };\n for (const row of rows) {\n const key = row.status as 'pending' | 'processing' | 'failed' | 'done';\n if (key === 'pending' || key === 'processing' || key === 'failed') {\n out[key] += Number(row.count ?? 0);\n }\n out.total += Number(row.count ?? 0);\n }\n return out;\n };\n\n const embeddingStuck = sqliteGet<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count\n FROM embedding_outbox\n WHERE status = 'processing'\n AND datetime(COALESCE(processed_at, created_at)) < datetime(?)`,\n [threshold]\n );\n const embeddingOldest = sqliteGet<{ oldest: string | null }>(\n this.db,\n `SELECT MIN(datetime(COALESCE(processed_at, created_at))) as oldest\n FROM embedding_outbox\n WHERE status = 'processing'`\n );\n\n const vectorStuck = sqliteGet<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count\n FROM vector_outbox\n WHERE status = 'processing'\n AND datetime(updated_at) < datetime(?)`,\n [threshold]\n );\n const vectorOldest = sqliteGet<{ oldest: string | null }>(\n this.db,\n `SELECT MIN(datetime(updated_at)) as oldest\n FROM vector_outbox\n WHERE status = 'processing'`\n );\n\n return {\n embedding: fromRows(\n embeddingRows,\n Number(embeddingStuck?.count ?? 0),\n processingAgeMs(embeddingOldest?.oldest)\n ),\n vector: fromRows(\n vectorRows,\n Number(vectorStuck?.count ?? 0),\n processingAgeMs(vectorOldest?.oldest)\n )\n };\n }\n\n /**\n * Update memory level\n */\n async updateMemoryLevel(eventId: string, level: string): Promise<void> {\n await this.initialize();\n\n sqliteRun(\n this.db,\n `UPDATE memory_levels SET level = ?, promoted_at = datetime('now') WHERE event_id = ?`,\n [level, eventId]\n );\n }\n\n /**\n * Get memory level statistics\n */\n async getLevelStats(): Promise<Array<{ level: string; count: number }>> {\n await this.initialize();\n\n const rows = sqliteAll<{ level: string; count: number }>(\n this.db,\n `SELECT ml.level, COUNT(*) as count\n FROM memory_levels ml\n INNER JOIN events e ON e.id = ml.event_id\n WHERE ${notActiveQuarantinedSql('e.metadata')}\n GROUP BY ml.level`\n );\n\n return rows;\n }\n\n /**\n * Get events by memory level\n */\n async getEventsByLevel(level: string, options?: { limit?: number; offset?: number }): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const limit = options?.limit || 50;\n const offset = options?.offset || 0;\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT e.* FROM events e\n INNER JOIN memory_levels ml ON e.id = ml.event_id\n WHERE ml.level = ?\n AND ${notActiveQuarantinedSql('e.metadata')}\n ORDER BY e.timestamp DESC\n LIMIT ? OFFSET ?`,\n [level, limit, offset]\n );\n\n return rows.map(row => this.rowToEvent(row));\n }\n\n /**\n * Get memory level for a specific event\n */\n async getEventLevel(eventId: string): Promise<string | null> {\n await this.initialize();\n\n const row = sqliteGet<{ level: string }>(\n this.db,\n `SELECT level FROM memory_levels WHERE event_id = ?`,\n [eventId]\n );\n\n return row ? row.level : null;\n }\n\n /**\n * Get sync position for a target\n */\n async getSyncPosition(targetName: string): Promise<{ lastEventId: string | null; lastTimestamp: string | null }> {\n await this.initialize();\n\n const row = sqliteGet<{ last_event_id: string | null; last_timestamp: string | null }>(\n this.db,\n `SELECT last_event_id, last_timestamp FROM sync_positions WHERE target_name = ?`,\n [targetName]\n );\n\n return {\n lastEventId: row?.last_event_id ?? null,\n lastTimestamp: row?.last_timestamp ?? null\n };\n }\n\n /**\n * Update sync position for a target\n */\n async updateSyncPosition(targetName: string, lastEventId: string, lastTimestamp: string): Promise<void> {\n await this.initialize();\n\n sqliteRun(\n this.db,\n `INSERT OR REPLACE INTO sync_positions (target_name, last_event_id, last_timestamp, updated_at)\n VALUES (?, ?, ?, datetime('now'))`,\n [targetName, lastEventId, lastTimestamp]\n );\n }\n\n /**\n * Get config value for endless mode\n */\n async getEndlessConfig(key: string): Promise<unknown | null> {\n await this.initialize();\n\n const row = sqliteGet<{ value: string }>(\n this.db,\n `SELECT value FROM endless_config WHERE key = ?`,\n [key]\n );\n\n if (!row) return null;\n return JSON.parse(row.value);\n }\n\n /**\n * Set config value for endless mode\n */\n async setEndlessConfig(key: string, value: unknown): Promise<void> {\n await this.initialize();\n\n sqliteRun(\n this.db,\n `INSERT OR REPLACE INTO endless_config (key, value, updated_at)\n VALUES (?, ?, datetime('now'))`,\n [key, JSON.stringify(value)]\n );\n }\n\n /**\n * Increment access count for events\n */\n async incrementAccessCount(eventIds: string[]): Promise<void> {\n if (eventIds.length === 0 || this.readOnly) return;\n\n await this.initialize();\n\n const placeholders = eventIds.map(() => '?').join(',');\n const currentTime = toSQLiteTimestamp(new Date());\n\n sqliteRun(\n this.db,\n `UPDATE events\n SET access_count = access_count + 1,\n last_accessed_at = ?\n WHERE id IN (${placeholders})`,\n [currentTime, ...eventIds]\n );\n }\n\n /**\n * Get most accessed memories (falls back to recent events if none accessed)\n */\n async getMostAccessed(limit: number = 10, options?: QuarantineReadOptions): Promise<MemoryEvent[]> {\n await this.initialize();\n\n // First try events with access_count > 0\n let rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events\n WHERE access_count > 0\n AND ${maybeQuarantinePredicate(options)}\n ORDER BY access_count DESC, last_accessed_at DESC\n LIMIT ?`,\n [limit]\n );\n\n // Fallback: if no accessed events, show recent events\n if (rows.length === 0) {\n rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events\n WHERE ${maybeQuarantinePredicate(options)}\n ORDER BY timestamp DESC\n LIMIT ?`,\n [limit]\n );\n }\n\n return rows.map(row => this.rowToEvent(row));\n }\n\n /**\n * Record a memory retrieval for helpfulness tracking\n */\n async recordRetrieval(eventId: string, sessionId: string, score: number, query: string): Promise<void> {\n if (this.readOnly) return;\n await this.initialize();\n\n const id = randomUUID();\n sqliteRun(\n this.db,\n `INSERT INTO memory_helpfulness (id, event_id, session_id, retrieval_score, query_preview, created_at)\n VALUES (?, ?, ?, ?, ?, datetime('now'))`,\n [id, eventId, sessionId, score, query.slice(0, 100)]\n );\n }\n\n /**\n * Get session IDs that have unevaluated retrievals (measured_at IS NULL).\n * Excludes the current session. Used to backfill sessions that ended without Stop hook.\n */\n async getUnevaluatedSessions(currentSessionId: string, limit = 5): Promise<string[]> {\n await this.initialize();\n const rows = sqliteAll<{ session_id: string }>(\n this.db,\n `SELECT DISTINCT session_id FROM memory_helpfulness\n WHERE measured_at IS NULL AND session_id != ?\n ORDER BY created_at DESC LIMIT ?`,\n [currentSessionId, limit]\n );\n return rows.map((r) => r.session_id);\n }\n\n /**\n * Evaluate helpfulness for all retrievals in a session\n * Called at session end - uses behavioral signals to compute score\n */\n async evaluateSessionHelpfulness(sessionId: string): Promise<void> {\n if (this.readOnly) return;\n await this.initialize();\n\n // Get all retrieval records for this session\n const retrievals = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM memory_helpfulness WHERE session_id = ? AND measured_at IS NULL`,\n [sessionId]\n );\n\n if (retrievals.length === 0) return;\n\n // Get session events to analyze behavior after retrieval\n const sessionEvents = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE session_id = ? ORDER BY timestamp ASC`,\n [sessionId]\n );\n\n const promptEvents = sessionEvents.filter((e: any) => e.event_type === 'user_prompt');\n const toolEvents = sessionEvents.filter((e: any) => e.event_type === 'tool_observation');\n\n // Count successful vs failed tools\n let toolSuccessCount = 0;\n let toolTotalCount = toolEvents.length;\n for (const t of toolEvents) {\n try {\n const content = JSON.parse(t.content as string);\n if (content.success !== false) toolSuccessCount++;\n } catch {\n toolSuccessCount++; // Assume success if can't parse\n }\n }\n const toolSuccessRatio = toolTotalCount > 0 ? toolSuccessCount / toolTotalCount : 0.5;\n\n for (const retrieval of retrievals) {\n const retrievalTime = retrieval.created_at as string;\n\n // 1. Session continued after retrieval?\n const eventsAfter = sessionEvents.filter((e: any) => e.timestamp > retrievalTime);\n const sessionContinued = eventsAfter.length > 0 ? 1 : 0;\n\n // 2. How many prompts came after?\n const promptsAfter = promptEvents.filter((e: any) => e.timestamp > retrievalTime);\n const promptCountAfter = promptsAfter.length;\n\n // 3. Was a similar query asked again? (simple word overlap check)\n const queryWords = new Set((retrieval.query_preview as string || '').toLowerCase().split(/\\s+/).filter(w => w.length > 2));\n let wasReasked = 0;\n for (const p of promptsAfter) {\n const pWords = new Set((p.content as string).toLowerCase().split(/\\s+/).filter((w: string) => w.length > 2));\n let overlap = 0;\n for (const w of queryWords) {\n if (pWords.has(w)) overlap++;\n }\n if (queryWords.size > 0 && overlap / queryWords.size > 0.5) {\n wasReasked = 1;\n break;\n }\n }\n\n // Calculate helpfulness score\n // Weights tuned for shopping-assistant-like corpora where sessions\n // continue on the same topic (was_reasked was over-penalising normal conversation flow)\n const retrievalScore = retrieval.retrieval_score as number || 0;\n // More prompts after retrieval = memory was actually useful to the conversation\n const promptNorm = Math.min(promptCountAfter / 2, 1.0);\n const helpfulnessScore = (\n 0.40 * Math.min(retrievalScore, 1.0) +\n 0.30 * promptNorm +\n 0.20 * toolSuccessRatio +\n 0.10 * (sessionContinued ? 1.0 : 0.0)\n );\n\n sqliteRun(\n this.db,\n `UPDATE memory_helpfulness\n SET session_continued = ?, prompt_count_after = ?,\n tool_success_count = ?, tool_total_count = ?,\n was_reasked = ?, helpfulness_score = ?,\n measured_at = datetime('now')\n WHERE id = ?`,\n [sessionContinued, promptCountAfter, toolSuccessCount, toolTotalCount,\n wasReasked, helpfulnessScore, retrieval.id]\n );\n }\n }\n\n /**\n * Get most helpful memories ranked by helpfulness score\n */\n async getHelpfulMemories(limit: number = 10): Promise<Array<{\n eventId: string;\n summary: string;\n helpfulnessScore: number;\n accessCount: number;\n evaluationCount: number;\n }>> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT\n mh.event_id,\n AVG(mh.helpfulness_score) as avg_score,\n COUNT(*) as eval_count,\n e.content,\n e.access_count\n FROM memory_helpfulness mh\n JOIN events e ON e.id = mh.event_id\n WHERE mh.measured_at IS NOT NULL\n AND ${notActiveQuarantinedSql('e.metadata')}\n GROUP BY mh.event_id\n ORDER BY avg_score DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(r => ({\n eventId: r.event_id as string,\n summary: (r.content as string).substring(0, 200) + ((r.content as string).length > 200 ? '...' : ''),\n helpfulnessScore: Math.round((r.avg_score as number) * 100) / 100,\n accessCount: (r.access_count as number) || 0,\n evaluationCount: r.eval_count as number\n }));\n }\n\n /**\n * Get helpfulness statistics for dashboard\n */\n async getHelpfulnessStats(since?: Date): Promise<{\n avgScore: number;\n totalEvaluated: number;\n totalRetrievals: number;\n helpful: number;\n neutral: number;\n unhelpful: number;\n }> {\n await this.initialize();\n\n const sinceIso = since?.toISOString();\n const evaluatedWhere = sinceIso\n ? `WHERE measured_at IS NOT NULL AND datetime(created_at) >= datetime(?)`\n : `WHERE measured_at IS NOT NULL`;\n const totalWhere = sinceIso\n ? `WHERE datetime(created_at) >= datetime(?)`\n : ``;\n\n const stats = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT\n AVG(helpfulness_score) as avg_score,\n COUNT(*) as total_evaluated,\n SUM(CASE WHEN helpfulness_score >= 0.7 THEN 1 ELSE 0 END) as helpful,\n SUM(CASE WHEN helpfulness_score >= 0.4 AND helpfulness_score < 0.7 THEN 1 ELSE 0 END) as neutral,\n SUM(CASE WHEN helpfulness_score < 0.4 THEN 1 ELSE 0 END) as unhelpful\n FROM memory_helpfulness\n ${evaluatedWhere}`,\n sinceIso ? [sinceIso] : []\n );\n\n const totalRow = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT COUNT(*) as total FROM memory_helpfulness ${totalWhere}`,\n sinceIso ? [sinceIso] : []\n );\n\n return {\n avgScore: Math.round(((stats?.avg_score as number) || 0) * 100) / 100,\n totalEvaluated: (stats?.total_evaluated as number) || 0,\n totalRetrievals: (totalRow?.total as number) || 0,\n helpful: (stats?.helpful as number) || 0,\n neutral: (stats?.neutral as number) || 0,\n unhelpful: (stats?.unhelpful as number) || 0\n };\n }\n\n /**\n * Fast keyword search using FTS5\n * Returns events matching the search query, ranked by relevance\n */\n async keywordSearch(query: string, limit: number = 10): Promise<Array<{event: MemoryEvent; rank: number}>> {\n await this.initialize();\n\n // Escape special FTS5 characters and prepare search terms\n const searchTerms = query\n .replace(/['\"(){}[\\]^~*?:\\\\/-]/g, ' ') // Remove special chars\n .split(/\\s+/)\n .filter(term => term.length > 1) // Filter short terms\n .map(term => `\"${term}\"*`) // Prefix matching\n .join(' OR ');\n\n if (!searchTerms) {\n return [];\n }\n\n try {\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT e.*, fts.rank\n FROM events_fts fts\n JOIN events e ON e.id = fts.event_id\n WHERE events_fts MATCH ?\n AND ${notActiveQuarantinedSql('e.metadata')}\n ORDER BY fts.rank\n LIMIT ?`,\n [searchTerms, limit]\n );\n\n return rows.map(row => ({\n event: this.rowToEvent(row),\n rank: row.rank as number\n }));\n } catch (error: any) {\n // FTS table might not exist yet (old database)\n // Fallback to LIKE search\n const likePattern = `%${query}%`;\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT *, 0 as rank FROM events\n WHERE content LIKE ?\n AND ${notActiveQuarantinedSql()}\n ORDER BY timestamp DESC\n LIMIT ?`,\n [likePattern, limit]\n );\n\n return rows.map(row => ({\n event: this.rowToEvent(row),\n rank: 0\n }));\n }\n }\n\n /**\n * Rebuild FTS index from existing events\n * Call this once after upgrading to FTS5\n */\n async rebuildFtsIndex(): Promise<number> {\n await this.initialize();\n\n // Get count of events to index\n const countRow = sqliteGet<{count: number}>(this.db, 'SELECT COUNT(*) as count FROM events', []);\n const totalEvents = countRow?.count ?? 0;\n\n // Clear and rebuild FTS index. Recreate the virtual table instead of\n // issuing DELETE against it: older migrated FTS5 tables/triggers can fail\n // with `no such column: T.event_id` when processing synthetic deletes.\n sqliteExec(this.db, `\n DROP TRIGGER IF EXISTS events_fts_insert;\n DROP TRIGGER IF EXISTS events_fts_delete;\n DROP TRIGGER IF EXISTS events_fts_update;\n DROP TABLE IF EXISTS events_fts;\n\n CREATE VIRTUAL TABLE events_fts USING fts5(\n content,\n event_id UNINDEXED,\n tokenize='porter unicode61'\n );\n\n INSERT INTO events_fts(rowid, content, event_id)\n SELECT rowid, content, id FROM events;\n\n CREATE TRIGGER events_fts_insert AFTER INSERT ON events BEGIN\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END;\n\n CREATE TRIGGER events_fts_delete AFTER DELETE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n END;\n\n CREATE TRIGGER events_fts_update AFTER UPDATE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END;\n `);\n\n return totalEvents;\n }\n\n /**\n * Get database instance for direct access\n */\n getDatabase(): SQLiteDatabase {\n return this.db;\n }\n\n private hasTableColumn(tableName: string, columnName: string): boolean {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(tableName)) return false;\n try {\n const rows = sqliteAll<{ name: string }>(this.db, `PRAGMA table_info(\"${tableName}\")`, []);\n return rows.some((row) => row.name === columnName);\n } catch {\n return false;\n }\n }\n\n\n async recordRetrievalTrace(input: {\n sessionId?: string;\n projectHash?: string;\n queryText: string;\n rawQueryText?: string;\n queryRewriteKind?: string;\n strategy?: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n candidateDetails?: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n lanes?: RetrievalDebugLane[];\n }>;\n selectedDetails?: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n lanes?: RetrievalDebugLane[];\n }>;\n confidence?: string;\n fallbackTrace?: string[];\n }): Promise<void> {\n await this.initialize();\n\n const traceId = randomUUID();\n const queryRewriteKind = normalizeQueryRewriteKind(input.queryRewriteKind);\n const candidateDetails = normalizeRetrievalTraceDetails(input.candidateDetails);\n const selectedDetails = normalizeRetrievalTraceDetails(input.selectedDetails);\n sqliteRun(\n this.db,\n `INSERT INTO retrieval_traces (\n trace_id, session_id, project_hash, query_text, raw_query_text, query_rewrite_kind, strategy,\n candidate_event_ids, selected_event_ids, candidate_details_json, selected_details_json,\n candidate_count, selected_count, confidence, fallback_trace\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n traceId,\n input.sessionId || null,\n input.projectHash || null,\n input.queryText,\n input.rawQueryText || null,\n queryRewriteKind,\n input.strategy || null,\n JSON.stringify(input.candidateEventIds || []),\n JSON.stringify(input.selectedEventIds || []),\n JSON.stringify(candidateDetails),\n JSON.stringify(selectedDetails),\n (input.candidateEventIds || []).length,\n (input.selectedEventIds || []).length,\n input.confidence || null,\n JSON.stringify(input.fallbackTrace || [])\n ]\n );\n }\n\n async getRecentRetrievalTraces(limit: number = 50): Promise<Array<{\n traceId: string;\n sessionId?: string;\n projectHash?: string;\n queryText: string;\n rawQueryText?: string;\n queryRewriteKind?: string;\n strategy?: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n candidateDetails: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n lanes?: RetrievalDebugLane[];\n }>;\n selectedDetails: Array<{\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n lanes?: RetrievalDebugLane[];\n }>;\n candidateCount: number;\n selectedCount: number;\n confidence?: string;\n fallbackTrace: string[];\n createdAt: Date;\n }>> {\n await this.initialize();\n\n try {\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM retrieval_traces ORDER BY created_at DESC LIMIT ?`,\n [limit]\n );\n\n return rows.map((row) => ({\n traceId: row.trace_id as string,\n sessionId: (row.session_id as string) || undefined,\n projectHash: (row.project_hash as string) || undefined,\n queryText: row.query_text as string,\n rawQueryText: (row.raw_query_text as string) || undefined,\n queryRewriteKind: normalizeQueryRewriteKind(row.query_rewrite_kind as string | null),\n strategy: (row.strategy as string) || undefined,\n candidateEventIds: row.candidate_event_ids ? JSON.parse(row.candidate_event_ids as string) : [],\n selectedEventIds: row.selected_event_ids ? JSON.parse(row.selected_event_ids as string) : [],\n candidateDetails: parseRetrievalTraceDetails(row.candidate_details_json),\n selectedDetails: parseRetrievalTraceDetails(row.selected_details_json),\n candidateCount: Number(row.candidate_count || 0),\n selectedCount: Number(row.selected_count || 0),\n confidence: (row.confidence as string) || undefined,\n fallbackTrace: row.fallback_trace ? JSON.parse(row.fallback_trace as string) : [],\n createdAt: toDateFromSQLite(row.created_at),\n }));\n } catch (err: any) {\n if (err?.message?.includes('no such table')) return [];\n throw err;\n }\n }\n\n async getRetrievalTraceStats(): Promise<{\n totalQueries: number;\n avgCandidateCount: number;\n avgSelectedCount: number;\n selectionRate: number;\n rewrittenQueries: number;\n rewriteRate: number;\n rewrittenQueriesWithSelection: number;\n rawQueriesWithSelection: number;\n rewrittenSelectionRate: number;\n rawSelectionRate: number;\n avgSelectedCountForRewrittenQueries: number;\n avgSelectedCountForRawQueries: number;\n }> {\n await this.initialize();\n\n try {\n const rewrittenQueryRewriteKindSql = this.hasTableColumn('retrieval_traces', 'query_rewrite_kind')\n ? REWRITTEN_QUERY_REWRITE_KIND_SQL\n : '0';\n const row = sqliteGet<Record<string, unknown>>(\n this.db,\n `SELECT\n COUNT(*) as total_queries,\n AVG(candidate_count) as avg_candidate_count,\n AVG(selected_count) as avg_selected_count,\n SUM(CASE WHEN ${rewrittenQueryRewriteKindSql} THEN 1 ELSE 0 END) as rewritten_queries,\n SUM(CASE WHEN ${rewrittenQueryRewriteKindSql} AND selected_count > 0 THEN 1 ELSE 0 END) as rewritten_queries_with_selection,\n SUM(CASE WHEN NOT (${rewrittenQueryRewriteKindSql}) AND selected_count > 0 THEN 1 ELSE 0 END) as raw_queries_with_selection,\n AVG(CASE WHEN ${rewrittenQueryRewriteKindSql} THEN selected_count END) as avg_selected_count_for_rewritten_queries,\n AVG(CASE WHEN NOT (${rewrittenQueryRewriteKindSql}) THEN selected_count END) as avg_selected_count_for_raw_queries,\n CASE\n WHEN SUM(candidate_count) > 0 THEN (SUM(selected_count) * 1.0 / SUM(candidate_count))\n ELSE 0\n END as selection_rate\n FROM retrieval_traces`,\n []\n );\n\n const totalQueries = Number(row?.total_queries || 0);\n const rewrittenQueries = Number(row?.rewritten_queries || 0);\n const rawQueries = Math.max(0, totalQueries - rewrittenQueries);\n const rewrittenQueriesWithSelection = Number(row?.rewritten_queries_with_selection || 0);\n const rawQueriesWithSelection = Number(row?.raw_queries_with_selection || 0);\n\n return {\n totalQueries,\n avgCandidateCount: Number(row?.avg_candidate_count || 0),\n avgSelectedCount: Number(row?.avg_selected_count || 0),\n selectionRate: Number(row?.selection_rate || 0),\n rewrittenQueries,\n rewriteRate: totalQueries > 0 ? rewrittenQueries / totalQueries : 0,\n rewrittenQueriesWithSelection,\n rawQueriesWithSelection,\n rewrittenSelectionRate: rewrittenQueries > 0 ? rewrittenQueriesWithSelection / rewrittenQueries : 0,\n rawSelectionRate: rawQueries > 0 ? rawQueriesWithSelection / rawQueries : 0,\n avgSelectedCountForRewrittenQueries: Number(row?.avg_selected_count_for_rewritten_queries || 0),\n avgSelectedCountForRawQueries: Number(row?.avg_selected_count_for_raw_queries || 0),\n };\n } catch (err: any) {\n if (err?.message?.includes('no such table')) {\n return {\n totalQueries: 0,\n avgCandidateCount: 0,\n avgSelectedCount: 0,\n selectionRate: 0,\n rewrittenQueries: 0,\n rewriteRate: 0,\n rewrittenQueriesWithSelection: 0,\n rawQueriesWithSelection: 0,\n rewrittenSelectionRate: 0,\n rawSelectionRate: 0,\n avgSelectedCountForRewrittenQueries: 0,\n avgSelectedCountForRawQueries: 0,\n };\n }\n throw err;\n }\n }\n\n /**\n * Close database connection\n */\n async close(): Promise<void> {\n sqliteClose(this.db);\n }\n\n /**\n * Get events grouped by turn_id for a session\n * Returns turns ordered by first event timestamp (newest first)\n */\n async getSessionTurns(sessionId: string, options?: { limit?: number; offset?: number } & QuarantineReadOptions): Promise<Array<{\n turnId: string;\n events: MemoryEvent[];\n startedAt: Date;\n promptPreview: string;\n eventCount: number;\n toolCount: number;\n hasResponse: boolean;\n }>> {\n await this.initialize();\n\n const limit = options?.limit || 20;\n const offset = options?.offset || 0;\n\n // Get distinct turn_ids for this session, ordered by first event timestamp\n const turnRows = sqliteAll<{ turn_id: string; min_ts: string }>(\n this.db,\n `SELECT turn_id, MIN(timestamp) as min_ts\n FROM events\n WHERE session_id = ? AND turn_id IS NOT NULL\n AND ${maybeQuarantinePredicate(options)}\n GROUP BY turn_id\n ORDER BY min_ts DESC\n LIMIT ? OFFSET ?`,\n [sessionId, limit, offset]\n );\n\n const turns: Array<{\n turnId: string;\n events: MemoryEvent[];\n startedAt: Date;\n promptPreview: string;\n eventCount: number;\n toolCount: number;\n hasResponse: boolean;\n }> = [];\n\n for (const turnRow of turnRows) {\n const events = await this.getEventsByTurn(turnRow.turn_id, options);\n\n const promptEvent = events.find(e => e.eventType === 'user_prompt');\n const toolEvents = events.filter(e => e.eventType === 'tool_observation');\n const hasResponse = events.some(e => e.eventType === 'agent_response');\n\n turns.push({\n turnId: turnRow.turn_id,\n events,\n startedAt: toDateFromSQLite(turnRow.min_ts),\n promptPreview: promptEvent\n ? promptEvent.content.slice(0, 200) + (promptEvent.content.length > 200 ? '...' : '')\n : '(no prompt)',\n eventCount: events.length,\n toolCount: toolEvents.length,\n hasResponse\n });\n }\n\n return turns;\n }\n\n /**\n * Get all events for a specific turn_id\n */\n async getEventsByTurn(turnId: string, options?: QuarantineReadOptions): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = sqliteAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE turn_id = ? AND ${maybeQuarantinePredicate(options)} ORDER BY timestamp ASC`,\n [turnId]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Count total turns for a session\n */\n async countSessionTurns(sessionId: string, options?: QuarantineReadOptions): Promise<number> {\n await this.initialize();\n\n const row = sqliteGet<{ count: number }>(\n this.db,\n `SELECT COUNT(DISTINCT turn_id) as count\n FROM events\n WHERE session_id = ? AND turn_id IS NOT NULL\n AND ${maybeQuarantinePredicate(options)}`,\n [sessionId]\n );\n\n return row?.count || 0;\n }\n\n /**\n * Migrate existing events: backfill turn_id for events that have turnId in metadata\n * but no turn_id column value (for events stored before this migration)\n */\n async backfillTurnIds(): Promise<number> {\n await this.initialize();\n\n // Find events with turnId in metadata JSON but no turn_id column value\n const rows = sqliteAll<{ id: string; metadata: string }>(\n this.db,\n `SELECT id, metadata FROM events\n WHERE turn_id IS NULL AND metadata IS NOT NULL AND metadata LIKE '%turnId%'`\n );\n\n let updated = 0;\n for (const row of rows) {\n try {\n const metadata = JSON.parse(row.metadata);\n if (metadata.turnId) {\n sqliteRun(\n this.db,\n `UPDATE events SET turn_id = ? WHERE id = ?`,\n [metadata.turnId, row.id]\n );\n updated++;\n }\n } catch {\n // Skip rows with invalid JSON\n }\n }\n\n return updated;\n }\n\n /**\n * Delete all events for a session (for force reimport)\n */\n async deleteSessionEvents(sessionId: string): Promise<number> {\n await this.initialize();\n\n // Get event IDs first for cascading deletes\n const events = sqliteAll<{ id: string }>(\n this.db,\n `SELECT id FROM events WHERE session_id = ?`,\n [sessionId]\n );\n\n if (events.length === 0) return 0;\n\n const eventIds = events.map(e => e.id);\n const placeholders = eventIds.map(() => '?').join(',');\n\n // Drop FTS triggers to prevent SQLITE_CORRUPT_VTAB during bulk delete\n const ftsTriggersDropped: string[] = [];\n for (const triggerName of ['events_fts_delete', 'events_fts_update', 'events_fts_insert']) {\n try {\n sqliteRun(this.db, `DROP TRIGGER IF EXISTS ${triggerName}`);\n ftsTriggersDropped.push(triggerName);\n } catch {\n // Trigger may not exist\n }\n }\n\n // Delete from related tables first (some may not exist depending on DB version)\n for (const table of ['event_dedup', 'memory_levels', 'embedding_queue', 'embedding_outbox', 'vector_outbox']) {\n try {\n sqliteRun(this.db, `DELETE FROM ${table} WHERE event_id IN (${placeholders})`, eventIds);\n } catch {\n // Table may not exist\n }\n }\n\n // Delete events\n const result = sqliteRun(this.db, `DELETE FROM events WHERE session_id = ?`, [sessionId]);\n\n // Rebuild FTS index if we dropped triggers\n if (ftsTriggersDropped.length > 0) {\n try {\n // Rebuild FTS from remaining events\n sqliteRun(this.db, `INSERT INTO events_fts(events_fts) VALUES('rebuild')`);\n\n // Recreate triggers\n sqliteRun(this.db, `CREATE TRIGGER IF NOT EXISTS events_fts_insert AFTER INSERT ON events BEGIN\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END`);\n sqliteRun(this.db, `CREATE TRIGGER IF NOT EXISTS events_fts_delete AFTER DELETE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n END`);\n sqliteRun(this.db, `CREATE TRIGGER IF NOT EXISTS events_fts_update AFTER UPDATE ON events BEGIN\n DELETE FROM events_fts WHERE rowid = OLD.rowid;\n INSERT INTO events_fts(rowid, content, event_id) VALUES (NEW.rowid, NEW.content, NEW.id);\n END`);\n } catch {\n // FTS rebuild failed - non-critical, will be rebuilt on next initialize\n }\n }\n\n return result.changes || 0;\n }\n\n /**\n * Convert database row to MemoryEvent\n */\n private rowToEvent(row: Record<string, unknown>): MemoryEvent {\n const event: any = {\n id: row.id as string,\n eventType: row.event_type as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: row.session_id as string,\n timestamp: toDateFromSQLite(row.timestamp),\n content: row.content as string,\n canonicalKey: row.canonical_key as string,\n dedupeKey: row.dedupe_key as string,\n metadata: safeParseMetadataValue(row.metadata)\n };\n\n // Include access tracking fields if present\n if (row.access_count !== undefined) {\n event.access_count = row.access_count;\n }\n if (row.last_accessed_at !== undefined) {\n event.last_accessed_at = row.last_accessed_at;\n }\n // Include turn_id if present\n if (row.turn_id !== undefined && row.turn_id !== null) {\n event.turn_id = row.turn_id;\n }\n\n return event;\n }\n}\n", "/**\n * AXIOMMIND canonical_key.py port\n * Deterministic normalization ensuring identical titles always map to same keys\n */\n\nimport { createHash } from 'crypto';\n\nconst MAX_KEY_LENGTH = 200;\n\n/**\n * Convert text to a normalized canonical key\n *\n * Normalization steps:\n * 1. NFKC unicode normalization\n * 2. Lowercase conversion\n * 3. Punctuation removal\n * 4. Consecutive whitespace cleanup\n * 5. Context addition (optional)\n * 6. Long key truncation with MD5\n */\nexport function makeCanonicalKey(\n title: string,\n context?: { project?: string; sessionId?: string }\n): string {\n // Step 1: NFKC normalization\n let normalized = title.normalize('NFKC');\n\n // Step 2: Lowercase conversion\n normalized = normalized.toLowerCase();\n\n // Step 3: Punctuation removal (unicode compatible)\n normalized = normalized.replace(/[^\\p{L}\\p{N}\\s]/gu, '');\n\n // Step 4: Consecutive whitespace cleanup\n normalized = normalized.replace(/\\s+/g, ' ').trim();\n\n // Step 5: Context addition\n let key = normalized;\n if (context?.project) {\n key = `${context.project}::${key}`;\n }\n\n // Step 6: Long key handling\n if (key.length > MAX_KEY_LENGTH) {\n const hashSuffix = createHash('md5').update(key).digest('hex').slice(0, 8);\n key = key.slice(0, MAX_KEY_LENGTH - 9) + '_' + hashSuffix;\n }\n\n return key;\n}\n\n/**\n * Check if two texts have the same canonical key\n */\nexport function isSameCanonicalKey(a: string, b: string): boolean {\n return makeCanonicalKey(a) === makeCanonicalKey(b);\n}\n\n/**\n * Generate dedupe key (content + session for uniqueness)\n * AXIOMMIND Principle 3: Idempotency guarantee\n */\nexport function makeDedupeKey(content: string, sessionId: string): string {\n const contentHash = createHash('sha256').update(content).digest('hex');\n return `${sessionId}:${contentHash}`;\n}\n\n/**\n * Generate content hash for deduplication\n */\nexport function hashContent(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\n// ============================================================\n// Entity Canonical Keys (Task Entity System)\n// ============================================================\n\nexport type EntityKeyType = 'task' | 'condition' | 'artifact';\n\n/**\n * Normalize text for entity key generation\n */\nfunction normalizeForKey(text: string): string {\n return text\n .normalize('NFKC')\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]/gu, '')\n .replace(/\\s+/g, '_')\n .trim();\n}\n\n/**\n * Generate canonical key for entities\n * Format: {type}:{project}:{normalized_identifier}\n */\nexport function makeEntityCanonicalKey(\n entityType: EntityKeyType,\n identifier: string,\n context?: { project?: string }\n): string {\n const project = context?.project ?? 'default';\n\n switch (entityType) {\n case 'task':\n return `task:${project}:${normalizeForKey(identifier)}`;\n case 'condition':\n return `cond:${project}:${normalizeForKey(identifier)}`;\n case 'artifact':\n return makeArtifactKey(identifier);\n }\n}\n\n/**\n * Generate canonical key for artifacts based on identifier pattern\n * - URL: art:url:{sha1(url)}\n * - JIRA key: art:jira:{key}\n * - GitHub issue: art:gh_issue:{repo}:{num}\n * - Generic: art:generic:{sha1(identifier)}\n */\nexport function makeArtifactKey(identifier: string): string {\n // URL pattern\n if (/^https?:\\/\\//.test(identifier)) {\n const hash = createHash('sha1').update(identifier).digest('hex').slice(0, 12);\n return `art:url:${hash}`;\n }\n\n // JIRA key pattern (e.g., PROJ-123)\n const jiraMatch = identifier.match(/^([A-Z]+-\\d+)$/);\n if (jiraMatch) {\n return `art:jira:${jiraMatch[1].toLowerCase()}`;\n }\n\n // GitHub issue pattern (e.g., owner/repo#123)\n const ghMatch = identifier.match(/^([^\\/]+\\/[^#]+)#(\\d+)$/);\n if (ghMatch) {\n return `art:gh_issue:${ghMatch[1]}:${ghMatch[2]}`;\n }\n\n // Generic identifier\n const hash = createHash('sha1').update(identifier).digest('hex').slice(0, 12);\n return `art:generic:${hash}`;\n}\n\n/**\n * Generate dedupe key for task events\n */\nexport function makeTaskEventDedupeKey(\n eventType: string,\n taskId: string,\n sessionId: string,\n additionalContext?: string\n): string {\n const parts = [eventType, taskId, sessionId];\n if (additionalContext) {\n parts.push(additionalContext);\n }\n const combined = parts.join(':');\n return createHash('sha256').update(combined).digest('hex');\n}\n\n/**\n * Parse entity canonical key to extract type and identifier\n */\nexport function parseEntityCanonicalKey(canonicalKey: string): {\n entityType: EntityKeyType;\n project?: string;\n identifier: string;\n} | null {\n const taskMatch = canonicalKey.match(/^task:([^:]+):(.+)$/);\n if (taskMatch) {\n return { entityType: 'task', project: taskMatch[1], identifier: taskMatch[2] };\n }\n\n const condMatch = canonicalKey.match(/^cond:([^:]+):(.+)$/);\n if (condMatch) {\n return { entityType: 'condition', project: condMatch[1], identifier: condMatch[2] };\n }\n\n const artMatch = canonicalKey.match(/^art:([^:]+):(.+)$/);\n if (artMatch) {\n return { entityType: 'artifact', identifier: artMatch[2] };\n }\n\n return null;\n}\n", "/**\n * Project path registry utilities.\n *\n * These helpers are intentionally core-level and Claude-agnostic.\n */\n\nimport * as crypto from 'crypto';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\n/**\n * Normalize and resolve a project path, handling symlinks when possible.\n */\nexport function normalizeProjectPath(projectPath: string): string {\n const expanded = projectPath.startsWith('~')\n ? path.join(os.homedir(), projectPath.slice(1))\n : projectPath;\n\n try {\n return fs.realpathSync(expanded);\n } catch {\n return path.resolve(expanded);\n }\n}\n\n/**\n * Generate a stable 8-character hash from a normalized project path.\n */\nexport function hashProjectPath(projectPath: string): string {\n const normalizedPath = normalizeProjectPath(projectPath);\n return crypto.createHash('sha256')\n .update(normalizedPath)\n .digest('hex')\n .slice(0, 8);\n}\n\n/**\n * Get the storage path for a project-local memory database.\n */\nexport function getProjectStoragePath(projectPath: string): string {\n const hash = hashProjectPath(projectPath);\n return path.join(os.homedir(), '.claude-code', 'memory', 'projects', hash);\n}\n\n/**\n * Resolve either an explicit project hash or a project path into a storage path.\n */\nexport function resolveProjectStoragePath(projectOrHash: string): string {\n const isHash = /^[a-f0-9]{8}$/.test(projectOrHash);\n return isHash\n ? path.join(os.homedir(), '.claude-code', 'memory', 'projects', projectOrHash)\n : getProjectStoragePath(projectOrHash);\n}\n", "/**\n * SQLite Wrapper with WAL Mode Support\n * Primary store for hooks - always available, no lock conflicts\n */\n\nimport Database from 'better-sqlite3';\nimport * as fs from 'fs';\nimport * as nodePath from 'path';\n\nexport type SQLiteDatabase = Database.Database;\n\nexport interface SQLiteOptions {\n readonly?: boolean;\n walMode?: boolean;\n}\n\n/**\n * Creates a new SQLite database with WAL mode\n */\nexport function createSQLiteDatabase(path: string, options?: SQLiteOptions): SQLiteDatabase {\n // Ensure parent directory exists\n const dir = nodePath.dirname(path);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const db = new Database(path, {\n readonly: options?.readonly ?? false,\n });\n\n // Enable WAL mode for concurrent access (unless read-only)\n if (!options?.readonly && (options?.walMode ?? true)) {\n db.pragma('journal_mode = WAL');\n db.pragma('synchronous = NORMAL');\n db.pragma('busy_timeout = 5000');\n }\n\n return db;\n}\n\n/**\n * Execute a statement that doesn't return rows (INSERT, UPDATE, DELETE)\n */\nexport function sqliteRun(\n db: SQLiteDatabase,\n sql: string,\n params: unknown[] = []\n): Database.RunResult {\n const stmt = db.prepare(sql);\n return stmt.run(...params);\n}\n\n/**\n * Execute a query and return all rows\n */\nexport function sqliteAll<T = Record<string, unknown>>(\n db: SQLiteDatabase,\n sql: string,\n params: unknown[] = []\n): T[] {\n const stmt = db.prepare(sql);\n return stmt.all(...params) as T[];\n}\n\n/**\n * Execute a query and return first row\n */\nexport function sqliteGet<T = Record<string, unknown>>(\n db: SQLiteDatabase,\n sql: string,\n params: unknown[] = []\n): T | undefined {\n const stmt = db.prepare(sql);\n return stmt.get(...params) as T | undefined;\n}\n\n/**\n * Execute multiple statements (for schema creation)\n */\nexport function sqliteExec(db: SQLiteDatabase, sql: string): void {\n db.exec(sql);\n}\n\n/**\n * Close database connection\n */\nexport function sqliteClose(db: SQLiteDatabase): void {\n db.close();\n}\n\n/**\n * Run multiple statements in a transaction\n */\nexport function sqliteTransaction<T>(\n db: SQLiteDatabase,\n fn: () => T\n): T {\n return db.transaction(fn)();\n}\n\n/**\n * Safely converts a value to a Date object\n */\nexport function toDateFromSQLite(value: unknown): Date {\n if (value instanceof Date) return value;\n if (typeof value === 'number') return new Date(value);\n if (typeof value === 'string') {\n // SQLite datetime('now') stores UTC timestamps without an explicit timezone\n // (for example, \"2026-05-07 16:00:00\"). JavaScript treats that shape as\n // local time, which shifts dashboard time-window calculations on non-UTC\n // machines. Normalize SQLite's timezone-less UTC shape before parsing while\n // leaving ISO strings with an explicit offset/Z untouched.\n const trimmed = value.trim();\n if (/^\\d{4}-\\d{2}-\\d{2}[ T]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?$/.test(trimmed)) {\n return new Date(trimmed.replace(' ', 'T') + 'Z');\n }\n return new Date(trimmed);\n }\n return new Date(String(value));\n}\n\n/**\n * Convert Date to ISO string for SQLite storage\n */\nexport function toSQLiteTimestamp(date: Date): string {\n return date.toISOString();\n}\n", "import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { MemoryEvent } from './types.js';\n\nconst DEFAULT_NAMESPACE = 'default';\nconst DEFAULT_CATEGORY = 'uncategorized';\n\nexport function sanitizeSegment(input: unknown, fallback: string): string {\n const raw = String(input ?? '').trim().toLowerCase();\n const safe = raw\n .normalize('NFKD')\n .replace(/[^a-z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n\n if (!safe || safe === '.' || safe === '..') return fallback;\n return safe;\n}\n\nfunction getCategorySegments(metadata: Record<string, unknown> | undefined, eventType: string): string[] {\n const raw = metadata?.categoryPath;\n if (Array.isArray(raw) && raw.length > 0) {\n return raw.map((s) => sanitizeSegment(s, DEFAULT_CATEGORY));\n }\n const single = metadata?.category;\n if (typeof single === 'string' && single.trim()) {\n return [sanitizeSegment(single, DEFAULT_CATEGORY)];\n }\n return [sanitizeSegment(eventType, DEFAULT_CATEGORY)];\n}\n\nexport function buildMirrorPath(rootDir: string, event: MemoryEvent): string {\n const metadata = event.metadata as Record<string, unknown> | undefined;\n const namespace = sanitizeSegment(metadata?.namespace, DEFAULT_NAMESPACE);\n const categories = getCategorySegments(metadata, event.eventType);\n\n const d = event.timestamp;\n const yyyy = d.getFullYear();\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const dd = String(d.getDate()).padStart(2, '0');\n\n return path.join(rootDir, 'memory', namespace, ...categories, `${yyyy}-${mm}-${dd}.md`);\n}\n\nexport function formatMirrorEntry(event: MemoryEvent): string {\n const category = Array.isArray((event.metadata as any)?.categoryPath)\n ? ((event.metadata as any).categoryPath as unknown[]).join('/')\n : String((event.metadata as any)?.category ?? event.eventType);\n\n return [\n '',\n `- ts: ${event.timestamp.toISOString()}`,\n ` id: ${event.id}`,\n ` type: ${event.eventType}`,\n ` session: ${event.sessionId}`,\n ` category: ${category}`,\n ' content: |',\n ...event.content.split('\\n').map((line) => ` ${line}`)\n ].join('\\n') + '\\n';\n}\n\nexport class MarkdownMirror {\n constructor(private readonly rootDir: string) {}\n\n async append(event: MemoryEvent): Promise<string> {\n const outPath = buildMirrorPath(this.rootDir, event);\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n await fs.appendFile(outPath, formatMirrorEntry(event), 'utf8');\n return outPath;\n }\n}\n", "/**\n * Vector Outbox V2 - Transactional Outbox Pattern\n * AXIOMMIND Principle 6: DuckDB \u2192 outbox \u2192 LanceDB unidirectional flow\n */\n\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport { randomUUID } from 'crypto';\nimport type {\n OutboxJob,\n OutboxStatus,\n OutboxItemKind\n} from './types.js';\n\nexport interface OutboxConfig {\n embeddingVersion: string;\n maxRetries: number;\n stuckThresholdMs: number;\n cleanupDays: number;\n}\n\nconst DEFAULT_CONFIG: OutboxConfig = {\n embeddingVersion: 'v1',\n maxRetries: 3,\n stuckThresholdMs: 5 * 60 * 1000, // 5 minutes\n cleanupDays: 7\n};\n\nexport interface OutboxMetrics {\n pendingCount: number;\n processingCount: number;\n doneCount: number;\n failedCount: number;\n oldestPendingAge: number | null;\n}\n\nexport interface OutboxEnqueueInput {\n itemKind: OutboxItemKind;\n itemId: string;\n embeddingVersion?: string;\n}\n\nexport type EnqueueResult =\n | { success: true; jobId: string; isNew: boolean }\n | { success: false; error: string };\n\nexport class VectorOutbox {\n private config: OutboxConfig;\n\n constructor(\n private db: Database,\n config?: Partial<OutboxConfig>\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Enqueue item for vectorization (idempotent).\n * Returns the already-existing job id when the same item/version has been enqueued before.\n */\n enqueueSync(\n itemKind: OutboxItemKind,\n itemId: string,\n embeddingVersion?: string\n ): string {\n const result = this.enqueueWithResultSync({ itemKind, itemId, embeddingVersion });\n if (result.success === false) {\n throw new Error(result.error);\n }\n return result.jobId;\n }\n\n async enqueue(\n itemKind: OutboxItemKind,\n itemId: string,\n embeddingVersion?: string\n ): Promise<string> {\n return this.enqueueSync(itemKind, itemId, embeddingVersion);\n }\n\n enqueueBatchSync(inputs: OutboxEnqueueInput[]): EnqueueResult[] {\n return inputs.map((input) => this.enqueueWithResultSync(input));\n }\n\n async enqueueBatch(inputs: OutboxEnqueueInput[]): Promise<EnqueueResult[]> {\n return this.enqueueBatchSync(inputs);\n }\n\n enqueueWithResultSync(input: OutboxEnqueueInput): EnqueueResult {\n const version = input.embeddingVersion ?? this.config.embeddingVersion;\n const jobId = randomUUID();\n const now = new Date().toISOString();\n\n try {\n const result = this.db.prepare(`INSERT INTO vector_outbox (\n job_id, item_kind, item_id, embedding_version, status, retry_count, created_at, updated_at\n ) VALUES (?, ?, ?, ?, 'pending', 0, ?, ?)\n ON CONFLICT (item_kind, item_id, embedding_version) DO NOTHING`).run(\n jobId,\n input.itemKind,\n input.itemId,\n version,\n now,\n now\n );\n\n const row = this.db.prepare(`SELECT job_id FROM vector_outbox\n WHERE item_kind = ? AND item_id = ? AND embedding_version = ?`).get(\n input.itemKind,\n input.itemId,\n version\n ) as { job_id: string } | undefined;\n\n if (!row) {\n return { success: false, error: 'vector outbox enqueue did not create or find a job' };\n }\n\n return { success: true, jobId: row.job_id, isNew: Number(result.changes ?? 0) > 0 };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n\n async enqueueWithResult(input: OutboxEnqueueInput): Promise<EnqueueResult> {\n return this.enqueueWithResultSync(input);\n }\n\n /**\n * Claim pending jobs for processing\n */\n async claimJobs(limit: number = 32): Promise<OutboxJob[]> {\n const now = new Date().toISOString();\n\n // Atomic claim using UPDATE RETURNING\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `UPDATE vector_outbox\n SET status = 'processing', updated_at = ?\n WHERE job_id IN (\n SELECT job_id FROM vector_outbox\n WHERE status = 'pending'\n ORDER BY created_at ASC\n LIMIT ?\n )\n RETURNING *`,\n [now, limit]\n );\n\n return rows.map(row => this.rowToJob(row));\n }\n\n /**\n * Mark job as done\n */\n async markDone(jobId: string): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'done', updated_at = ?\n WHERE job_id = ?`,\n [new Date().toISOString(), jobId]\n );\n }\n\n /**\n * Mark job as failed\n */\n async markFailed(jobId: string, error: string): Promise<void> {\n const now = new Date().toISOString();\n\n // Check retry count\n const rows = await dbAll<{ retry_count: number }>(\n this.db,\n `SELECT retry_count FROM vector_outbox WHERE job_id = ?`,\n [jobId]\n );\n\n if (rows.length === 0) return;\n\n const retryCount = rows[0].retry_count;\n const newStatus: OutboxStatus = retryCount >= this.config.maxRetries - 1\n ? 'failed'\n : 'pending'; // Will retry\n\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = ?, error = ?, retry_count = retry_count + 1, updated_at = ?\n WHERE job_id = ?`,\n [newStatus, error, now, jobId]\n );\n }\n\n /**\n * Get job by ID\n */\n async getJob(jobId: string): Promise<OutboxJob | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM vector_outbox WHERE job_id = ?`,\n [jobId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToJob(rows[0]);\n }\n\n /**\n * Get jobs by status\n */\n async getJobsByStatus(status: OutboxStatus, limit: number = 100): Promise<OutboxJob[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM vector_outbox\n WHERE status = ?\n ORDER BY created_at ASC\n LIMIT ?`,\n [status, limit]\n );\n\n return rows.map(row => this.rowToJob(row));\n }\n\n /**\n * Reconcile: recover stuck and retry failed jobs\n */\n async reconcile(referenceTime: Date = new Date()): Promise<{ recovered: number; retried: number }> {\n const stuckThreshold = new Date(referenceTime.getTime() - this.config.stuckThresholdMs);\n const nowIso = referenceTime.toISOString();\n\n // Recover stuck processing jobs\n const recovered = this.db.prepare(`UPDATE vector_outbox\n SET status = 'pending', updated_at = ?, error = NULL\n WHERE status = 'processing'\n AND updated_at < ?`).run(nowIso, stuckThreshold.toISOString());\n\n // Retry failed jobs that haven't exceeded max retries\n const retried = this.db.prepare(`UPDATE vector_outbox\n SET status = 'pending', updated_at = ?, error = NULL\n WHERE status = 'failed'\n AND retry_count < ?`).run(nowIso, this.config.maxRetries);\n\n return {\n recovered: Number(recovered.changes ?? 0),\n retried: Number(retried.changes ?? 0)\n };\n }\n\n /**\n * Cleanup old done jobs\n */\n async cleanup(referenceTime: Date = new Date()): Promise<number> {\n const threshold = new Date(referenceTime.getTime() - this.config.cleanupDays * 24 * 60 * 60 * 1000);\n\n const result = this.db.prepare(`DELETE FROM vector_outbox\n WHERE status = 'done'\n AND updated_at < ?`).run(threshold.toISOString());\n\n return Number(result.changes ?? 0);\n }\n\n /**\n * Get metrics\n */\n async getMetrics(): Promise<OutboxMetrics> {\n const statusCounts = await dbAll<{ status: string; count: number }>(\n this.db,\n `SELECT status, COUNT(*) as count\n FROM vector_outbox\n GROUP BY status`\n );\n\n const oldestPending = await dbAll<{ created_at: string }>(\n this.db,\n `SELECT created_at FROM vector_outbox\n WHERE status = 'pending'\n ORDER BY created_at ASC\n LIMIT 1`\n );\n\n const metrics: OutboxMetrics = {\n pendingCount: 0,\n processingCount: 0,\n doneCount: 0,\n failedCount: 0,\n oldestPendingAge: null\n };\n\n for (const row of statusCounts) {\n switch (row.status) {\n case 'pending':\n metrics.pendingCount = Number(row.count);\n break;\n case 'processing':\n metrics.processingCount = Number(row.count);\n break;\n case 'done':\n metrics.doneCount = Number(row.count);\n break;\n case 'failed':\n metrics.failedCount = Number(row.count);\n break;\n }\n }\n\n if (oldestPending.length > 0) {\n const oldestDate = new Date(oldestPending[0].created_at);\n metrics.oldestPendingAge = Date.now() - oldestDate.getTime();\n }\n\n return metrics;\n }\n\n /**\n * Validate state transition\n */\n isValidTransition(from: OutboxStatus, to: OutboxStatus): boolean {\n const validTransitions = [\n { from: 'pending', to: 'processing' },\n { from: 'processing', to: 'done' },\n { from: 'processing', to: 'failed' },\n { from: 'failed', to: 'pending' }\n ];\n\n return validTransitions.some(t => t.from === from && t.to === to);\n }\n\n /**\n * Convert database row to OutboxJob\n */\n private rowToJob(row: Record<string, unknown>): OutboxJob {\n return {\n jobId: row.job_id as string,\n itemKind: row.item_kind as OutboxItemKind,\n itemId: row.item_id as string,\n embeddingVersion: row.embedding_version as string,\n status: row.status as OutboxStatus,\n retryCount: row.retry_count as number,\n error: row.error as string | undefined,\n createdAt: toDate(row.created_at),\n updatedAt: toDate(row.updated_at)\n };\n }\n}\n", "/**\n * Privacy-safe retrieval lane metadata helpers.\n *\n * Lane details are intended for trace/debug surfaces. Keep them compact,\n * allow-listed, and free of raw private paths or credential-shaped values.\n */\n\nexport const RETRIEVAL_DEBUG_LANE_NAMES = [\n 'raw_event',\n 'session_event',\n 'session_summary',\n 'graph_path',\n 'facet_match'\n] as const;\n\nexport type RetrievalDebugLaneName = typeof RETRIEVAL_DEBUG_LANE_NAMES[number];\n\nexport interface RetrievalDebugLane {\n lane: RetrievalDebugLaneName;\n reason: string;\n score?: number;\n}\n\nconst RETRIEVAL_DEBUG_LANE_NAME_SET = new Set<string>(RETRIEVAL_DEBUG_LANE_NAMES);\n\nexport function isRetrievalDebugLaneName(value: unknown): value is RetrievalDebugLaneName {\n return typeof value === 'string' && RETRIEVAL_DEBUG_LANE_NAME_SET.has(value);\n}\n\nexport function normalizeRetrievalDebugLanes(value: unknown, maxItems = 6): RetrievalDebugLane[] {\n if (!Array.isArray(value) || maxItems <= 0) return [];\n\n const normalized: RetrievalDebugLane[] = [];\n const seen = new Set<string>();\n for (const item of value) {\n const lane = normalizeRetrievalDebugLane(item);\n if (!lane) continue;\n const key = [lane.lane, lane.reason, lane.score ?? ''].join('\\u0000');\n if (seen.has(key)) continue;\n seen.add(key);\n normalized.push(lane);\n if (normalized.length >= maxItems) break;\n }\n return normalized;\n}\n\nexport function normalizeRetrievalDebugLane(value: unknown): RetrievalDebugLane | null {\n if (!value || typeof value !== 'object') return null;\n const raw = value as Record<string, unknown>;\n if (!isRetrievalDebugLaneName(raw.lane)) return null;\n\n const reason = sanitizeRetrievalLaneReason(typeof raw.reason === 'string' ? raw.reason : '') || 'unspecified';\n const score = typeof raw.score === 'number' && Number.isFinite(raw.score)\n ? Math.max(0, Math.min(1, raw.score))\n : undefined;\n\n return score === undefined\n ? { lane: raw.lane, reason }\n : { lane: raw.lane, reason, score };\n}\n\nexport function sanitizeRetrievalLaneReason(value: string): string {\n return value\n .replace(/[\\r\\n\\t]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .replace(/[A-Za-z]:[\\\\/][^\\s'\"`<>)]*/g, '[path]')\n .replace(/\\/(?:Users|home|tmp|var\\/folders)\\/[^\\s'\"`<>)]*/g, '[path]')\n .replace(/\\\\\\\\[^\\s'\"`<>)]*/g, '[path]')\n .replace(/\\bBearer\\s+[^\\s'\"`,;]{6,}/gi, 'Bearer [REDACTED]')\n .replace(\n /([\"']?\\b(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|token|secret|password|passwd|credential)[\"']?\\s*[:=]\\s*[\"']?)[^\\s\"'`,;}]{6,}/gi,\n '$1[REDACTED]'\n )\n .replace(\n /\\b(?:gh[pousr]_[A-Za-z0-9_]{8,}|github_pat_[A-Za-z0-9_]{8,}|glpat-[A-Za-z0-9_-]{8,}|xox[a-z]-[A-Za-z0-9-]{8,}|(?:AKIA|ASIA)[A-Z0-9]{12,}|AIza[0-9A-Za-z_-]{20,}|ya29\\.[0-9A-Za-z_-]+|sk-[A-Za-z0-9_-]{12,})\\b/g,\n '[REDACTED]'\n )\n .slice(0, 120);\n}\n", "import { z } from 'zod';\n\nexport const FacetTargetTypeSchema = z.enum([\n 'event',\n 'entity',\n 'edge',\n 'consolidated_memory',\n 'lesson',\n 'action'\n]);\nexport type FacetTargetType = z.infer<typeof FacetTargetTypeSchema>;\n\nexport const BUILT_IN_FACET_DIMENSIONS = [\n 'kind',\n 'workflow',\n 'artifact',\n 'source',\n 'privacy',\n 'quality',\n 'retention',\n 'project'\n] as const;\n\nconst customDimensionPattern = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;\n\nconst TrimmedStringSchema = z.preprocess(\n (value) => typeof value === 'string' ? value.trim() : value,\n z.string().min(1)\n);\n\nexport const FacetDimensionSchema = z.preprocess(\n (value) => typeof value === 'string' ? value.trim() : value,\n z.string()\n .min(1)\n .max(64)\n .refine((value) => (BUILT_IN_FACET_DIMENSIONS as readonly string[]).indexOf(value) !== -1 || customDimensionPattern.test(value), {\n message: 'Facet dimension must be built-in or lowercase kebab-case'\n })\n);\nexport type FacetDimension = z.infer<typeof FacetDimensionSchema>;\n\nexport const FacetSourceSchema = z.enum(['manual', 'imported', 'derived', 'llm', 'system']).default('manual');\nexport type FacetSource = z.infer<typeof FacetSourceSchema>;\n\nconst EvidenceEventIdsSchema = z.preprocess(\n (value) => Array.isArray(value)\n ? value.map((item) => typeof item === 'string' ? item.trim() : item).filter(Boolean)\n : value,\n z.array(z.string().min(1)).default([])\n);\n\nconst OptionalTrimmedStringSchema = z.preprocess(\n (value) => typeof value === 'string' ? value.trim() : value,\n z.string().min(1).optional()\n);\n\nexport const MemoryFacetAssignmentInputSchema = z.object({\n targetType: FacetTargetTypeSchema,\n targetId: TrimmedStringSchema,\n dimension: FacetDimensionSchema,\n value: TrimmedStringSchema,\n confidence: z.number().min(0).max(1).default(1),\n source: FacetSourceSchema,\n evidenceEventIds: EvidenceEventIdsSchema,\n projectHash: OptionalTrimmedStringSchema,\n actor: OptionalTrimmedStringSchema\n});\nexport type FacetAssignmentInput = z.infer<typeof MemoryFacetAssignmentInputSchema>;\n\nexport const MemoryFacetAssignmentSchema = MemoryFacetAssignmentInputSchema.extend({\n id: z.string().min(1),\n createdAt: z.date(),\n updatedAt: z.date()\n});\nexport type MemoryFacetAssignment = z.infer<typeof MemoryFacetAssignmentSchema>;\n\nexport const FacetRemoveInputSchema = z.object({\n targetType: FacetTargetTypeSchema,\n targetId: TrimmedStringSchema,\n dimension: FacetDimensionSchema,\n value: TrimmedStringSchema,\n source: FacetSourceSchema,\n projectHash: OptionalTrimmedStringSchema,\n actor: OptionalTrimmedStringSchema\n});\nexport type FacetRemoveInput = z.infer<typeof FacetRemoveInputSchema>;\n\nexport const FacetQuerySchema = z.object({\n targetType: FacetTargetTypeSchema.optional(),\n targetId: OptionalTrimmedStringSchema,\n dimension: FacetDimensionSchema.optional(),\n value: OptionalTrimmedStringSchema,\n source: FacetSourceSchema.optional(),\n projectHash: OptionalTrimmedStringSchema,\n limit: z.number().int().positive().max(500).default(100)\n});\nexport type FacetQuery = z.infer<typeof FacetQuerySchema>;\n\nexport function parseFacetAssignmentInput(input: unknown): FacetAssignmentInput {\n return MemoryFacetAssignmentInputSchema.parse(input);\n}\n\nexport function parseFacetRemoveInput(input: unknown): FacetRemoveInput {\n return FacetRemoveInputSchema.parse(input);\n}\n\nexport function parseFacetQuery(input: unknown): FacetQuery {\n return FacetQuerySchema.parse(input ?? {});\n}\n", "import { randomUUID } from 'crypto';\n\nimport {\n sqliteAll,\n sqliteGet,\n sqliteRun,\n toDateFromSQLite,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\nimport {\n FacetSourceSchema,\n FacetTargetTypeSchema,\n parseFacetAssignmentInput,\n parseFacetQuery,\n parseFacetRemoveInput,\n type FacetAssignmentInput,\n type FacetQuery,\n type FacetRemoveInput,\n type FacetTargetType,\n type MemoryFacetAssignment\n} from './facets.js';\nimport { writeGovernanceAuditEntry } from './governance-audit.js';\n\ninterface MemoryFacetRow {\n id: string;\n target_type: string;\n target_id: string;\n dimension: string;\n value: string;\n confidence: number;\n source: string;\n evidence_event_ids: string;\n project_hash: string | null;\n created_at: string;\n updated_at: string;\n}\n\nfunction parseStringArray(value: unknown): string[] {\n if (typeof value !== 'string') return [];\n try {\n const parsed = JSON.parse(value);\n if (!Array.isArray(parsed)) return [];\n return parsed.filter((item): item is string => typeof item === 'string' && item.length > 0);\n } catch {\n return [];\n }\n}\n\nfunction projectHashToStorage(projectHash: string | undefined): string {\n return projectHash ?? '';\n}\n\nfunction rowToFacet(row: MemoryFacetRow): MemoryFacetAssignment {\n const projectHash = typeof row.project_hash === 'string' && row.project_hash.length > 0\n ? row.project_hash\n : undefined;\n\n return {\n id: row.id,\n targetType: FacetTargetTypeSchema.parse(row.target_type),\n targetId: row.target_id,\n dimension: row.dimension,\n value: row.value,\n confidence: Number(row.confidence),\n source: FacetSourceSchema.parse(row.source),\n evidenceEventIds: parseStringArray(row.evidence_event_ids),\n projectHash,\n createdAt: toDateFromSQLite(row.created_at),\n updatedAt: toDateFromSQLite(row.updated_at)\n };\n}\n\nfunction facetToAuditJson(facet: MemoryFacetAssignment): Record<string, unknown> {\n return {\n id: facet.id,\n targetType: facet.targetType,\n targetId: facet.targetId,\n dimension: facet.dimension,\n value: facet.value,\n confidence: facet.confidence,\n source: facet.source,\n evidenceEventIds: facet.evidenceEventIds,\n projectHash: facet.projectHash,\n createdAt: facet.createdAt.toISOString(),\n updatedAt: facet.updatedAt.toISOString()\n };\n}\n\nexport class FacetRepository {\n constructor(private readonly db: SQLiteDatabase) {}\n\n async assign(input: unknown): Promise<MemoryFacetAssignment> {\n const assignment = parseFacetAssignmentInput(input);\n const existing = this.findByUniqueKey(assignment);\n const now = new Date().toISOString();\n\n if (existing) {\n sqliteRun(\n this.db,\n `UPDATE memory_facets\n SET confidence = ?, evidence_event_ids = ?, project_hash = ?, updated_at = ?\n WHERE id = ?`,\n [\n assignment.confidence,\n JSON.stringify(assignment.evidenceEventIds),\n projectHashToStorage(assignment.projectHash),\n now,\n existing.id\n ]\n );\n const saved = this.getById(existing.id);\n await this.auditAssignment(assignment, existing, saved);\n return saved;\n }\n\n const id = randomUUID();\n sqliteRun(\n this.db,\n `INSERT INTO memory_facets (\n id, target_type, target_id, dimension, value, confidence, source,\n evidence_event_ids, project_hash, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n assignment.targetType,\n assignment.targetId,\n assignment.dimension,\n assignment.value,\n assignment.confidence,\n assignment.source,\n JSON.stringify(assignment.evidenceEventIds),\n projectHashToStorage(assignment.projectHash),\n now,\n now\n ]\n );\n\n const saved = this.getById(id);\n await this.auditAssignment(assignment, null, saved);\n return saved;\n }\n\n async remove(input: unknown): Promise<boolean> {\n const removeInput = parseFacetRemoveInput(input);\n const { sql, params } = this.removeSql(removeInput);\n const result = sqliteRun(this.db, sql, params);\n return result.changes > 0;\n }\n\n async query(input: unknown): Promise<MemoryFacetAssignment[]> {\n const query = parseFacetQuery(input);\n const { sql, params } = this.querySql(query);\n const rows = sqliteAll<MemoryFacetRow>(this.db, sql, params);\n return rows.map(rowToFacet);\n }\n\n async listForTarget(targetType: FacetTargetType, targetId: string): Promise<MemoryFacetAssignment[]> {\n const parsedTargetType = FacetTargetTypeSchema.parse(targetType);\n const trimmedTargetId = targetId.trim();\n if (!trimmedTargetId) {\n throw new Error('targetId is required');\n }\n return this.query({ targetType: parsedTargetType, targetId: trimmedTargetId, limit: 500 });\n }\n\n private getById(id: string): MemoryFacetAssignment {\n const row = sqliteGet<MemoryFacetRow>(this.db, `SELECT * FROM memory_facets WHERE id = ?`, [id]);\n if (!row) {\n throw new Error(`Memory facet not found after write: ${id}`);\n }\n return rowToFacet(row);\n }\n\n private findByUniqueKey(input: FacetAssignmentInput): MemoryFacetAssignment | null {\n const row = sqliteGet<MemoryFacetRow>(\n this.db,\n `SELECT * FROM memory_facets\n WHERE target_type = ? AND target_id = ? AND dimension = ? AND value = ? AND source = ? AND project_hash = ?`,\n [\n input.targetType,\n input.targetId,\n input.dimension,\n input.value,\n input.source,\n projectHashToStorage(input.projectHash)\n ]\n );\n return row ? rowToFacet(row) : null;\n }\n\n private async auditAssignment(\n input: FacetAssignmentInput,\n before: MemoryFacetAssignment | null,\n after: MemoryFacetAssignment\n ): Promise<void> {\n await writeGovernanceAuditEntry(this.db, {\n operation: 'facet_tag',\n actor: input.actor ?? 'cml-core',\n projectHash: input.projectHash,\n targetType: input.targetType,\n targetId: input.targetId,\n beforeJson: before ? facetToAuditJson(before) : undefined,\n afterJson: facetToAuditJson(after),\n sourceEventIds: input.evidenceEventIds\n });\n }\n\n private querySql(query: FacetQuery): { sql: string; params: unknown[] } {\n const clauses: string[] = [];\n const params: unknown[] = [];\n\n if (query.targetType) {\n clauses.push('target_type = ?');\n params.push(query.targetType);\n }\n if (query.targetId) {\n clauses.push('target_id = ?');\n params.push(query.targetId);\n }\n if (query.dimension) {\n clauses.push('dimension = ?');\n params.push(query.dimension);\n }\n if (query.value) {\n clauses.push('value = ?');\n params.push(query.value);\n }\n if (query.source) {\n clauses.push('source = ?');\n params.push(query.source);\n }\n if (query.projectHash) {\n clauses.push('project_hash = ?');\n params.push(query.projectHash);\n }\n\n const where = clauses.length > 0 ? `WHERE ${clauses.join(' AND ')}` : '';\n params.push(query.limit);\n return {\n sql: `SELECT * FROM memory_facets ${where} ORDER BY confidence DESC, updated_at DESC LIMIT ?`,\n params\n };\n }\n\n private removeSql(input: FacetRemoveInput): { sql: string; params: unknown[] } {\n const clauses = [\n 'target_type = ?',\n 'target_id = ?',\n 'dimension = ?',\n 'value = ?',\n 'source = ?',\n 'project_hash = ?'\n ];\n const params: unknown[] = [\n input.targetType,\n input.targetId,\n input.dimension,\n input.value,\n input.source,\n projectHashToStorage(input.projectHash)\n ];\n\n return {\n sql: `DELETE FROM memory_facets WHERE ${clauses.join(' AND ')}`,\n params\n };\n }\n}\n", "import { randomUUID } from 'crypto';\n\nimport {\n sqliteRun,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\n\nexport const MEMORY_GOVERNANCE_AUDIT_OPERATIONS = [\n 'facet_tag',\n 'action_update',\n 'lease_acquire',\n 'checkpoint_create',\n 'retention_score',\n 'quarantine',\n 'verify',\n 'lesson_promote',\n 'actor_card_upsert',\n 'perspective_observation_create',\n 'perspective_observation_delete'\n] as const;\n\nexport type MemoryGovernanceAuditOperation = typeof MEMORY_GOVERNANCE_AUDIT_OPERATIONS[number];\n\nexport interface GovernanceAuditEntryInput {\n operation: MemoryGovernanceAuditOperation;\n actor: string;\n projectHash?: string;\n targetType: string;\n targetId: string;\n beforeJson?: Record<string, unknown>;\n afterJson?: Record<string, unknown>;\n sourceEventIds?: string[];\n}\n\nexport interface MemoryGovernanceAuditEntry {\n auditId: string;\n operation: MemoryGovernanceAuditOperation;\n actor: string;\n projectHash?: string;\n targetType: string;\n targetId: string;\n beforeJson?: Record<string, unknown>;\n afterJson?: Record<string, unknown>;\n sourceEventIds: string[];\n createdAt: Date;\n}\n\nfunction normalizeRequiredString(value: string, fieldName: string): string {\n const normalized = value.trim();\n if (!normalized) {\n throw new Error(`${fieldName} is required`);\n }\n return normalized;\n}\n\nfunction normalizeOptionalString(value: string | undefined): string | undefined {\n const normalized = value?.trim();\n return normalized ? normalized : undefined;\n}\n\nconst REDACTED = '[REDACTED]';\nconst sensitiveKeyPattern = /(?:api[_-]?key|secret|password|passwd|token|access[_-]?token|client[_-]?secret|crtfc[_-]?key|hashkey|serviceKey)/i;\nconst POSIX_ABSOLUTE_PATH_PATTERN = /(^|[^A-Za-z0-9._\\/\\\\-])\\/(?!\\/)[^\\n\\r\"'<>|`]*/g;\nconst WINDOWS_DRIVE_PATH_PATTERN = /(^|[^A-Za-z0-9._\\/\\\\-])(?:[A-Za-z]:[\\\\/][^\\n\\r\"'<>|`]*)/g;\nconst WINDOWS_UNC_PATH_PATTERN = /(^|[^A-Za-z0-9._\\/\\\\-])(?:\\\\\\\\[^\\\\\\n\\r\"'<>|`]+\\\\[^\\n\\r\"'<>|`]*)/g;\nconst credentialQueryPattern = /\\b((?:api[_-]?key|token|access[_-]?token|client[_-]?secret|crtfc[_-]?key|hashkey|serviceKey)=)[^&\\s`\"'<>]+/gi;\nconst credentialAssignmentPattern = /\\b((?:api[_-]?key|secret|password|passwd|token|access[_-]?token|client[_-]?secret|crtfc[_-]?key|hashkey|serviceKey)\\s*[:=]\\s*)[^\\s`\"'<>},]+/gi;\n\nfunction redactAbsolutePaths(value: string): string {\n return value\n .replace(WINDOWS_UNC_PATH_PATTERN, (_match, prefix: string) => `${prefix}${REDACTED}`)\n .replace(WINDOWS_DRIVE_PATH_PATTERN, (_match, prefix: string) => `${prefix}${REDACTED}`)\n .replace(POSIX_ABSOLUTE_PATH_PATTERN, (_match, prefix: string) => `${prefix}${REDACTED}`);\n}\n\nfunction sanitizeAuditString(value: string): string {\n return redactAbsolutePaths(value)\n .replace(credentialQueryPattern, `$1${REDACTED}`)\n .replace(credentialAssignmentPattern, `$1${REDACTED}`);\n}\n\nexport function sanitizeGovernanceAuditValue(value: unknown, key?: string): unknown {\n if (key && sensitiveKeyPattern.test(key)) {\n return REDACTED;\n }\n if (typeof value === 'string') {\n return sanitizeAuditString(value);\n }\n if (value instanceof Date) {\n return sanitizeAuditString(value.toISOString());\n }\n if (Array.isArray(value)) {\n return value.map((item) => sanitizeGovernanceAuditValue(item));\n }\n if (value && typeof value === 'object') {\n const sanitized: Record<string, unknown> = {};\n for (const [entryKey, entryValue] of Object.entries(value as Record<string, unknown>)) {\n sanitized[sanitizeAuditString(entryKey)] = sanitizeGovernanceAuditValue(entryValue, entryKey);\n }\n return sanitized;\n }\n return value;\n}\n\nfunction sanitizeAuditJson(value: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n if (value === undefined) return undefined;\n return sanitizeGovernanceAuditValue(value) as Record<string, unknown>;\n}\n\nfunction normalizeSourceEventIds(sourceEventIds: string[] | undefined): string[] {\n return (sourceEventIds || [])\n .map((sourceEventId) => sanitizeAuditString(sourceEventId.trim()))\n .filter((sourceEventId) => sourceEventId.length > 0);\n}\n\nfunction normalizeOperation(operation: MemoryGovernanceAuditOperation): MemoryGovernanceAuditOperation {\n if ((MEMORY_GOVERNANCE_AUDIT_OPERATIONS as readonly string[]).indexOf(operation) === -1) {\n throw new Error(`Unsupported governance audit operation: ${operation}`);\n }\n return operation;\n}\n\nexport async function writeGovernanceAuditEntry(\n db: SQLiteDatabase,\n input: GovernanceAuditEntryInput\n): Promise<MemoryGovernanceAuditEntry> {\n const entry: MemoryGovernanceAuditEntry = {\n auditId: randomUUID(),\n operation: normalizeOperation(input.operation),\n actor: sanitizeAuditString(normalizeRequiredString(input.actor, 'actor')),\n projectHash: normalizeOptionalString(input.projectHash),\n targetType: normalizeRequiredString(input.targetType, 'targetType'),\n targetId: sanitizeAuditString(normalizeRequiredString(input.targetId, 'targetId')),\n beforeJson: sanitizeAuditJson(input.beforeJson),\n afterJson: sanitizeAuditJson(input.afterJson),\n sourceEventIds: normalizeSourceEventIds(input.sourceEventIds),\n createdAt: new Date()\n };\n\n sqliteRun(\n db,\n `INSERT INTO memory_governance_audit (\n audit_id, operation, actor, project_hash, target_type, target_id,\n before_json, after_json, source_event_ids, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n entry.auditId,\n entry.operation,\n entry.actor,\n entry.projectHash ?? null,\n entry.targetType,\n entry.targetId,\n entry.beforeJson === undefined ? null : JSON.stringify(entry.beforeJson),\n entry.afterJson === undefined ? null : JSON.stringify(entry.afterJson),\n JSON.stringify(entry.sourceEventIds),\n entry.createdAt.toISOString()\n ]\n );\n\n return entry;\n}\n", "import { z } from 'zod';\n\nconst NonEmptyStringSchema = z.string().transform((value) => value.trim()).pipe(z.string().min(1));\nconst StringArraySchema = z.array(z.string().transform((value) => value.trim()).pipe(z.string().min(1))).default([]);\nconst DateInputSchema = z.union([z.date(), z.string().datetime()]).transform((value) => value instanceof Date ? value : new Date(value));\n\nexport const MemoryActionStatusSchema = z.enum(['pending', 'in_progress', 'blocked', 'done', 'cancelled']);\nexport type MemoryActionStatus = z.infer<typeof MemoryActionStatusSchema>;\n\nexport const MemoryActionEdgeRelTypeSchema = z.enum(['depends_on', 'blocks', 'duplicates', 'derived_from', 'references']);\nexport type MemoryActionEdgeRelType = z.infer<typeof MemoryActionEdgeRelTypeSchema>;\n\nexport const MemoryActionEdgeDstTypeSchema = z.enum(['action', 'entity', 'event', 'source_ref']);\nexport type MemoryActionEdgeDstType = z.infer<typeof MemoryActionEdgeDstTypeSchema>;\n\nexport const MemoryActionEdgeSourceSchema = z.enum(['manual', 'task_projector']);\nexport type MemoryActionEdgeSource = z.infer<typeof MemoryActionEdgeSourceSchema>;\n\nexport const LeaseTargetTypeSchema = z.enum(['action', 'checkpoint', 'routine']);\nexport type LeaseTargetType = z.infer<typeof LeaseTargetTypeSchema>;\n\nexport interface MemoryAction {\n actionId: string;\n projectHash: string;\n title: string;\n status: MemoryActionStatus;\n priority: number;\n sourceEventIds: string[];\n relatedEntityIds: string[];\n currentCheckpointId?: string;\n leaseId?: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface MemoryActionEdge {\n edgeId: string;\n srcActionId: string;\n relType: MemoryActionEdgeRelType;\n dstType: MemoryActionEdgeDstType;\n dstId: string;\n confidence: number;\n source: MemoryActionEdgeSource;\n createdAt: Date;\n}\n\nexport interface MemoryLease {\n leaseId: string;\n targetType: LeaseTargetType;\n targetId: string;\n holder: string;\n expiresAt: Date;\n metadata?: Record<string, unknown>;\n createdAt: Date;\n renewedAt?: Date;\n releasedAt?: Date;\n}\n\nexport interface MemoryCheckpoint {\n checkpointId: string;\n projectHash: string;\n actionId?: string;\n sessionId?: string;\n title: string;\n summary: string;\n stateJson: Record<string, unknown>;\n sourceEventIds: string[];\n createdAt: Date;\n expiresAt?: Date;\n}\n\nexport const UpsertActionInputSchema = z.object({\n actionId: z.string().uuid().optional(),\n projectHash: NonEmptyStringSchema,\n title: NonEmptyStringSchema,\n status: MemoryActionStatusSchema.default('pending'),\n priority: z.number().int().min(0).max(100).default(0),\n sourceEventIds: StringArraySchema,\n relatedEntityIds: StringArraySchema,\n currentCheckpointId: NonEmptyStringSchema.optional(),\n leaseId: NonEmptyStringSchema.optional(),\n actor: NonEmptyStringSchema.optional()\n});\nexport type UpsertActionInput = z.infer<typeof UpsertActionInputSchema>;\n\nexport const UpdateActionInputSchema = z.object({\n actionId: z.string().uuid(),\n projectHash: NonEmptyStringSchema,\n title: NonEmptyStringSchema.optional(),\n status: MemoryActionStatusSchema.optional(),\n priority: z.number().int().min(0).max(100).optional(),\n sourceEventIds: StringArraySchema.optional(),\n relatedEntityIds: StringArraySchema.optional(),\n currentCheckpointId: NonEmptyStringSchema.nullish(),\n leaseId: NonEmptyStringSchema.nullish(),\n actor: NonEmptyStringSchema.optional(),\n note: NonEmptyStringSchema.optional()\n});\nexport type UpdateActionInput = z.infer<typeof UpdateActionInputSchema>;\n\nexport const ListActionsInputSchema = z.object({\n projectHash: NonEmptyStringSchema,\n status: MemoryActionStatusSchema.optional(),\n includeTerminal: z.boolean().default(false),\n limit: z.number().int().positive().max(500).default(50)\n});\nexport type ListActionsInput = z.infer<typeof ListActionsInputSchema>;\n\nexport const ActionEdgeInputSchema = z.object({\n srcActionId: z.string().uuid(),\n relType: MemoryActionEdgeRelTypeSchema,\n dstType: MemoryActionEdgeDstTypeSchema,\n dstId: NonEmptyStringSchema,\n confidence: z.number().min(0).max(1).default(1),\n source: MemoryActionEdgeSourceSchema.default('manual')\n});\nexport type ActionEdgeInput = z.infer<typeof ActionEdgeInputSchema>;\n\nexport const AcquireLeaseInputSchema = z.object({\n targetType: LeaseTargetTypeSchema,\n targetId: NonEmptyStringSchema,\n holder: NonEmptyStringSchema,\n expiresAt: DateInputSchema,\n now: DateInputSchema.optional(),\n metadata: z.record(z.unknown()).optional(),\n actor: NonEmptyStringSchema.optional(),\n projectHash: NonEmptyStringSchema.optional()\n});\nexport type AcquireLeaseInput = z.infer<typeof AcquireLeaseInputSchema>;\n\nexport const RenewLeaseInputSchema = z.object({\n leaseId: z.string().uuid(),\n holder: NonEmptyStringSchema,\n expiresAt: DateInputSchema,\n now: DateInputSchema.optional(),\n actor: NonEmptyStringSchema.optional(),\n projectHash: NonEmptyStringSchema.optional()\n});\nexport type RenewLeaseInput = z.infer<typeof RenewLeaseInputSchema>;\n\nexport const ReleaseLeaseInputSchema = z.object({\n leaseId: z.string().uuid(),\n holder: NonEmptyStringSchema,\n actor: NonEmptyStringSchema.optional(),\n projectHash: NonEmptyStringSchema.optional()\n});\nexport type ReleaseLeaseInput = z.infer<typeof ReleaseLeaseInputSchema>;\n\nexport const CreateCheckpointInputSchema = z.object({\n checkpointId: z.string().uuid().optional(),\n projectHash: NonEmptyStringSchema,\n actionId: NonEmptyStringSchema.optional(),\n sessionId: NonEmptyStringSchema.optional(),\n title: NonEmptyStringSchema,\n summary: NonEmptyStringSchema,\n stateJson: z.record(z.unknown()).default({}),\n sourceEventIds: StringArraySchema,\n expiresAt: DateInputSchema.optional(),\n actor: NonEmptyStringSchema.optional()\n});\nexport type CreateCheckpointInput = z.infer<typeof CreateCheckpointInputSchema>;\n\nexport const ListCheckpointsInputSchema = z.object({\n projectHash: NonEmptyStringSchema,\n actionId: NonEmptyStringSchema.optional(),\n sessionId: NonEmptyStringSchema.optional(),\n limit: z.number().int().positive().max(500).default(50)\n});\nexport type ListCheckpointsInput = z.infer<typeof ListCheckpointsInputSchema>;\n", "import { z } from 'zod';\n\nimport {\n sqliteAll,\n toDateFromSQLite,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\nimport { MemoryActionStatusSchema, type MemoryAction, type MemoryActionStatus } from './actions.js';\n\nconst NonEmptyStringSchema = z.string().transform((value) => value.trim()).pipe(z.string().min(1));\n\nexport const FrontierRankInputSchema = z.object({\n projectHash: NonEmptyStringSchema,\n includeBlocked: z.boolean().default(false),\n limit: z.number().int().positive().max(500).default(50),\n now: z.union([z.date(), z.string().datetime()]).transform((value) => value instanceof Date ? value : new Date(value)).optional()\n});\nexport type FrontierRankInput = z.infer<typeof FrontierRankInputSchema>;\n\nexport interface FrontierItem {\n action: MemoryAction;\n score: number;\n reasons: string[];\n sourceRefs: string[];\n}\n\ninterface MemoryActionRow {\n action_id: string;\n project_hash: string;\n title: string;\n status: string;\n priority: number;\n source_event_ids: string;\n related_entity_ids: string;\n current_checkpoint_id: string | null;\n lease_id: string | null;\n created_at: string;\n updated_at: string;\n}\n\ninterface MemoryActionEdgeRow {\n src_action_id: string;\n rel_type: string;\n dst_type: string;\n dst_id: string;\n confidence: number;\n}\n\ninterface MemoryLeaseRow {\n target_id: string;\n holder: string;\n}\n\ninterface MemoryFacetRow {\n target_id: string;\n dimension: string;\n value: string;\n confidence: number;\n evidence_event_ids: string;\n}\n\nfunction parseStringArray(value: unknown): string[] {\n if (typeof value !== 'string') return [];\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? parsed.filter((item): item is string => typeof item === 'string' && item.length > 0) : [];\n } catch {\n return [];\n }\n}\n\nfunction unique(values: string[]): string[] {\n return Array.from(new Set(values.filter((value) => value.length > 0)));\n}\n\nfunction rowToAction(row: MemoryActionRow): MemoryAction {\n return {\n actionId: row.action_id,\n projectHash: row.project_hash,\n title: row.title,\n status: MemoryActionStatusSchema.parse(row.status),\n priority: Number(row.priority),\n sourceEventIds: parseStringArray(row.source_event_ids),\n relatedEntityIds: parseStringArray(row.related_entity_ids),\n currentCheckpointId: row.current_checkpoint_id ?? undefined,\n leaseId: row.lease_id ?? undefined,\n createdAt: toDateFromSQLite(row.created_at),\n updatedAt: toDateFromSQLite(row.updated_at)\n };\n}\n\nfunction placeholders(values: readonly unknown[]): string {\n return values.map(() => '?').join(', ');\n}\n\nfunction terminalStatus(status: MemoryActionStatus): boolean {\n return status === 'done' || status === 'cancelled';\n}\n\nexport class FrontierService {\n constructor(private readonly db: SQLiteDatabase) {}\n\n async rank(input: unknown): Promise<FrontierItem[]> {\n const parsed = FrontierRankInputSchema.parse(input);\n const now = parsed.now ?? new Date();\n const actions = this.listCandidateActions(parsed.projectHash);\n if (actions.length === 0) return [];\n\n const actionIds = actions.map((action) => action.actionId);\n const edgesByAction = this.edgesByAction(actionIds);\n const actionStatusById = this.actionStatusesById(parsed.projectHash, this.actionStatusIds(actionIds, edgesByAction));\n const activeLeases = this.activeLeasesByAction(actionIds, now);\n const facetsByAction = this.qualityFacetsByAction(parsed.projectHash, actionIds);\n\n return actions\n .map((action) => this.scoreAction({\n action,\n now,\n includeBlocked: parsed.includeBlocked,\n edges: edgesByAction.get(action.actionId) ?? [],\n actionStatusById,\n activeLease: activeLeases.get(action.actionId),\n qualityFacets: facetsByAction.get(action.actionId) ?? []\n }))\n .sort((left, right) => {\n if (right.score !== left.score) return right.score - left.score;\n return right.action.updatedAt.getTime() - left.action.updatedAt.getTime();\n })\n .slice(0, parsed.limit);\n }\n\n private listCandidateActions(projectHash: string): MemoryAction[] {\n const rows = sqliteAll<MemoryActionRow>(\n this.db,\n `SELECT * FROM memory_actions\n WHERE project_hash = ? AND status NOT IN ('done', 'cancelled')\n ORDER BY updated_at DESC\n LIMIT ?`,\n [projectHash, 500]\n );\n return rows.map(rowToAction);\n }\n\n private edgesByAction(actionIds: string[]): Map<string, MemoryActionEdgeRow[]> {\n if (actionIds.length === 0) return new Map();\n const rows = sqliteAll<MemoryActionEdgeRow>(\n this.db,\n `SELECT src_action_id, rel_type, dst_type, dst_id, confidence\n FROM memory_action_edges\n WHERE src_action_id IN (${placeholders(actionIds)})`,\n actionIds\n );\n const grouped = new Map<string, MemoryActionEdgeRow[]>();\n for (const row of rows) {\n const current = grouped.get(row.src_action_id) ?? [];\n current.push(row);\n grouped.set(row.src_action_id, current);\n }\n return grouped;\n }\n\n private actionStatusIds(actionIds: string[], edgesByAction: Map<string, MemoryActionEdgeRow[]>): string[] {\n const ids = new Set(actionIds);\n for (const edges of Array.from(edgesByAction.values())) {\n for (const edge of edges) {\n if (edge.dst_type === 'action') ids.add(edge.dst_id);\n }\n }\n return Array.from(ids);\n }\n\n private actionStatusesById(projectHash: string, actionIds: string[]): Map<string, MemoryActionStatus> {\n if (actionIds.length === 0) return new Map();\n const rows = sqliteAll<{ action_id: string; status: string }>(\n this.db,\n `SELECT action_id, status\n FROM memory_actions\n WHERE project_hash = ? AND action_id IN (${placeholders(actionIds)})`,\n [projectHash, ...actionIds]\n );\n return new Map(rows.map((row) => [row.action_id, MemoryActionStatusSchema.parse(row.status)]));\n }\n\n private activeLeasesByAction(actionIds: string[], now: Date): Map<string, MemoryLeaseRow> {\n if (actionIds.length === 0) return new Map();\n const rows = sqliteAll<MemoryLeaseRow>(\n this.db,\n `SELECT target_id, holder\n FROM memory_leases\n WHERE target_type = 'action'\n AND released_at IS NULL\n AND expires_at > ?\n AND target_id IN (${placeholders(actionIds)})`,\n [now.toISOString(), ...actionIds]\n );\n return new Map(rows.map((row) => [row.target_id, row]));\n }\n\n private qualityFacetsByAction(projectHash: string, actionIds: string[]): Map<string, MemoryFacetRow[]> {\n if (actionIds.length === 0) return new Map();\n const rows = sqliteAll<MemoryFacetRow>(\n this.db,\n `SELECT target_id, dimension, value, confidence, evidence_event_ids\n FROM memory_facets\n WHERE project_hash = ?\n AND target_type = 'action'\n AND dimension = 'quality'\n AND value IN ('verified', 'high-quality', 'high_quality', 'high')\n AND target_id IN (${placeholders(actionIds)})`,\n [projectHash, ...actionIds]\n );\n const grouped = new Map<string, MemoryFacetRow[]>();\n for (const row of rows) {\n const current = grouped.get(row.target_id) ?? [];\n current.push(row);\n grouped.set(row.target_id, current);\n }\n return grouped;\n }\n\n private scoreAction(input: {\n action: MemoryAction;\n now: Date;\n includeBlocked: boolean;\n edges: MemoryActionEdgeRow[];\n actionStatusById: Map<string, MemoryActionStatus>;\n activeLease?: MemoryLeaseRow;\n qualityFacets: MemoryFacetRow[];\n }): FrontierItem {\n const { action, now, includeBlocked, edges, actionStatusById, activeLease, qualityFacets } = input;\n let score = action.priority * 5;\n const reasons: string[] = [`priority:${action.priority}`];\n const sourceRefs: string[] = [...action.sourceEventIds];\n\n if (action.status === 'in_progress') {\n score += 15;\n reasons.push('status:in_progress');\n } else if (action.status === 'pending') {\n score += 5;\n reasons.push('status:pending');\n } else if (action.status === 'blocked') {\n if (includeBlocked) {\n reasons.push('status:blocked_included');\n } else {\n score -= 500;\n reasons.push('status:blocked_penalty');\n }\n }\n\n const ageMs = Math.max(0, now.getTime() - action.updatedAt.getTime());\n const ageDays = ageMs / 86_400_000;\n const recencyScore = Math.max(0, 10 - ageDays * 2);\n if (recencyScore > 0) {\n score += recencyScore;\n reasons.push('recent_update');\n }\n\n if (activeLease) {\n score -= 100;\n reasons.push(`active_lease:${activeLease.holder}`);\n } else {\n score += 5;\n reasons.push('no_active_lease');\n }\n\n for (const edge of edges) {\n if (edge.dst_type === 'event' || edge.dst_type === 'source_ref') {\n sourceRefs.push(edge.dst_id);\n }\n if (this.isBlockingEdge(edge, actionStatusById)) {\n score -= Math.round(100 * Number(edge.confidence));\n reasons.push(`blocked_by:${edge.dst_type}`);\n }\n }\n\n for (const facet of qualityFacets) {\n const confidence = Math.max(0, Math.min(1, Number(facet.confidence)));\n score += Math.round(80 * confidence);\n reasons.push(`quality:${facet.value}`);\n sourceRefs.push(...parseStringArray(facet.evidence_event_ids));\n }\n\n return {\n action,\n score: Math.round(score * 1000) / 1000,\n reasons: unique(reasons),\n sourceRefs: unique(sourceRefs)\n };\n }\n\n private isBlockingEdge(edge: MemoryActionEdgeRow, actionStatusById: Map<string, MemoryActionStatus>): boolean {\n if (edge.rel_type !== 'depends_on') return false;\n if (edge.dst_type !== 'action') return true;\n const dstStatus = actionStatusById.get(edge.dst_id);\n return dstStatus === undefined || !terminalStatus(dstStatus);\n }\n}\n", "import { createHash } from 'crypto';\nimport { z } from 'zod';\n\nimport {\n sqliteAll,\n sqliteGet,\n sqliteRun,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\nimport { ActionRepository } from './action-repository.js';\nimport {\n MemoryActionStatusSchema,\n type MemoryAction,\n type MemoryActionStatus\n} from './actions.js';\n\nconst NonEmptyStringSchema = z.string().transform((value) => value.trim()).pipe(z.string().min(1));\n\nexport const ProjectTaskActionsInputSchema = z.object({\n projectHash: NonEmptyStringSchema,\n project: NonEmptyStringSchema.optional(),\n actor: NonEmptyStringSchema.optional(),\n limit: z.number().int().positive().max(500).default(100)\n});\nexport type ProjectTaskActionsInput = z.infer<typeof ProjectTaskActionsInputSchema>;\n\nexport interface ProjectTaskActionsResult {\n scanned: number;\n created: number;\n updated: number;\n unchanged: number;\n skipped: number;\n actions: MemoryAction[];\n}\n\ninterface TaskEntityRow {\n entity_id: string;\n title: string;\n current_json: string;\n}\n\ninterface EntityEdgeRow {\n rel_type: string;\n dst_type: string;\n dst_id: string;\n meta_json: string | null;\n}\n\ninterface MemoryActionEdgeRow {\n edge_id: string;\n dst_type: string;\n dst_id: string;\n}\n\ninterface EntityProjectRow {\n entity_type: string;\n current_json: string;\n}\n\nconst TASK_EVENT_TYPES = [\n 'task_created',\n 'task_status_changed',\n 'task_priority_changed',\n 'task_blockers_set',\n 'task_transition_rejected'\n] as const;\n\nconst PRIORITY_SCORE: Record<string, number> = {\n low: 25,\n medium: 50,\n high: 75,\n critical: 100\n};\n\nexport class TaskActionProjector {\n constructor(\n private readonly db: SQLiteDatabase,\n private readonly actions: ActionRepository = new ActionRepository(db)\n ) {}\n\n async project(input: unknown): Promise<ProjectTaskActionsResult> {\n const parsed = ProjectTaskActionsInputSchema.parse(input);\n const empty = (): ProjectTaskActionsResult => ({\n scanned: 0,\n created: 0,\n updated: 0,\n unchanged: 0,\n skipped: 0,\n actions: []\n });\n\n if (!parsed.project || !this.tableExists('entities')) return empty();\n const scopedInput = { ...parsed, project: parsed.project };\n\n const rows = this.listTaskEntities(scopedInput.project, scopedInput.limit);\n const result = empty();\n result.scanned = rows.length;\n\n for (const row of rows) {\n const projected = await this.projectTaskRow(row, scopedInput);\n if (!projected) {\n result.skipped += 1;\n continue;\n }\n result[projected.kind] += 1;\n result.actions.push(projected.action);\n }\n\n return result;\n }\n\n private async projectTaskRow(\n row: TaskEntityRow,\n input: ProjectTaskActionsInput & { project: string }\n ): Promise<{ kind: 'created' | 'updated' | 'unchanged'; action: MemoryAction } | null> {\n const current = parseJsonObject(row.current_json);\n if (!current) return null;\n if (current.project !== input.project) return null;\n\n const actionId = actionIdForTaskEntity(row.entity_id);\n const before = this.actions.get(actionId);\n if (before && before.projectHash !== input.projectHash) return null;\n\n const desired = {\n actionId,\n projectHash: input.projectHash,\n title: row.title,\n status: parseActionStatus(current.status),\n priority: priorityToScore(current.priority),\n sourceEventIds: this.existingEventIds(uniqueStrings([\n ...extractStringArray(current.sourceEventIds),\n ...this.sourceTaskEventIds(row.entity_id)\n ])),\n relatedEntityIds: [row.entity_id],\n actor: input.actor ?? 'cml-core'\n };\n\n let action: MemoryAction;\n let kind: 'created' | 'updated' | 'unchanged';\n if (!before) {\n action = await this.actions.upsert(desired);\n kind = 'created';\n } else if (actionMatchesDesired(before, desired)) {\n action = before;\n kind = 'unchanged';\n } else {\n action = await this.actions.update(desired);\n kind = 'updated';\n }\n\n await this.syncBlockerEdges({ actionId: action.actionId, entityId: row.entity_id, project: input.project });\n return { kind, action };\n }\n\n private tableExists(tableName: string): boolean {\n const row = sqliteGet<{ name: string }>(\n this.db,\n `SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?`,\n [tableName]\n );\n return Boolean(row);\n }\n\n private listTaskEntities(project: string, limit: number): TaskEntityRow[] {\n return sqliteAll<TaskEntityRow>(\n this.db,\n `SELECT entity_id, title, current_json\n FROM entities\n WHERE entity_type = 'task'\n AND status = 'active'\n AND CASE\n WHEN json_valid(current_json) THEN json_extract(current_json, '$.project')\n ELSE NULL\n END = ?\n ORDER BY updated_at DESC\n LIMIT ?`,\n [project, limit]\n );\n }\n\n private sourceTaskEventIds(taskId: string): string[] {\n const keys = TASK_EVENT_TYPES.map((eventType) => `task_event:${eventType}:${taskId}`);\n if (keys.length === 0) return [];\n const rows = sqliteAll<{ id: string }>(\n this.db,\n `SELECT id FROM events WHERE canonical_key IN (?, ?, ?, ?, ?) ORDER BY timestamp ASC`,\n keys\n );\n return rows.map((row) => row.id);\n }\n\n private existingEventIds(eventIds: string[]): string[] {\n if (eventIds.length === 0) return [];\n const placeholders = eventIds.map(() => '?').join(', ');\n const rows = sqliteAll<{ id: string }>(\n this.db,\n 'SELECT id FROM events WHERE id IN (' + placeholders + ')',\n eventIds\n );\n const existing = new Set(rows.map((row) => row.id));\n return eventIds.filter((eventId) => existing.has(eventId));\n }\n\n private async syncBlockerEdges(input: { actionId: string; entityId: string; project: string }): Promise<void> {\n const rows = sqliteAll<EntityEdgeRow>(\n this.db,\n `SELECT rel_type, dst_type, dst_id, meta_json\n FROM edges\n WHERE src_type = 'entity'\n AND src_id = ?\n AND rel_type IN ('blocked_by', 'blocked_by_suggested')`,\n [input.entityId]\n );\n\n const desiredEdges = rows.map((row) => {\n const dst = this.actionEdgeDestination(row, input.project);\n return {\n dstType: dst.dstType,\n dstId: dst.dstId,\n confidence: edgeConfidence(row),\n key: `${dst.dstType}:${dst.dstId}`\n };\n });\n const desiredKeys = new Set(desiredEdges.map((edge) => edge.key));\n const existingEdges = sqliteAll<MemoryActionEdgeRow>(\n this.db,\n `SELECT edge_id, dst_type, dst_id\n FROM memory_action_edges\n WHERE src_action_id = ?\n AND rel_type = 'depends_on'\n AND dst_type IN ('action', 'entity')\n AND source = 'task_projector'`,\n [input.actionId]\n );\n for (const existing of existingEdges) {\n if (!desiredKeys.has(`${existing.dst_type}:${existing.dst_id}`)) {\n sqliteRun(this.db, `DELETE FROM memory_action_edges WHERE edge_id = ?`, [existing.edge_id]);\n }\n }\n\n for (const edge of desiredEdges) {\n await this.actions.addEdge({\n srcActionId: input.actionId,\n relType: 'depends_on',\n dstType: edge.dstType,\n dstId: edge.dstId,\n confidence: edge.confidence,\n source: 'task_projector'\n });\n }\n }\n\n private actionEdgeDestination(row: EntityEdgeRow, project: string): { dstType: 'action' | 'entity'; dstId: string } {\n if (row.dst_type !== 'entity') return { dstType: 'entity', dstId: row.dst_id };\n const dstEntity = sqliteGet<EntityProjectRow>(\n this.db,\n `SELECT entity_type, current_json FROM entities WHERE entity_id = ?`,\n [row.dst_id]\n );\n if (!dstEntity || dstEntity.entity_type !== 'task') return { dstType: 'entity', dstId: row.dst_id };\n const current = parseJsonObject(dstEntity.current_json);\n if (!current || current.project !== project) return { dstType: 'entity', dstId: row.dst_id };\n return { dstType: 'action', dstId: actionIdForTaskEntity(row.dst_id) };\n }\n}\n\nexport function actionIdForTaskEntity(entityId: string): string {\n const bytes = createHash('sha256').update(`memory-action:task:${entityId}`).digest().subarray(0, 16);\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = bytes.toString('hex');\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20, 32)\n ].join('-');\n}\n\nfunction parseJsonObject(value: unknown): Record<string, unknown> | null {\n if (typeof value !== 'string') return null;\n try {\n const parsed = JSON.parse(value);\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed as Record<string, unknown> : null;\n } catch {\n return null;\n }\n}\n\nfunction parseActionStatus(value: unknown): MemoryActionStatus {\n const parsed = MemoryActionStatusSchema.safeParse(value);\n return parsed.success ? parsed.data : 'pending';\n}\n\nfunction priorityToScore(value: unknown): number {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return Math.max(0, Math.min(100, Math.round(value)));\n }\n if (typeof value !== 'string') return PRIORITY_SCORE.medium;\n return PRIORITY_SCORE[value] ?? PRIORITY_SCORE.medium;\n}\n\nfunction extractStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is string => typeof item === 'string' && item.trim().length > 0).map((item) => item.trim());\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return Array.from(new Set(values.filter((value) => value.length > 0)));\n}\n\nfunction actionMatchesDesired(\n action: MemoryAction,\n desired: {\n title: string;\n status: MemoryActionStatus;\n priority: number;\n sourceEventIds: string[];\n relatedEntityIds: string[];\n }\n): boolean {\n return action.title === desired.title\n && action.status === desired.status\n && action.priority === desired.priority\n && arraysEqual(action.sourceEventIds, desired.sourceEventIds)\n && arraysEqual(action.relatedEntityIds, desired.relatedEntityIds);\n}\n\nfunction arraysEqual(a: string[], b: string[]): boolean {\n return a.length === b.length && a.every((value, index) => value === b[index]);\n}\n\nfunction edgeConfidence(row: EntityEdgeRow): number {\n const meta = parseJsonObject(row.meta_json);\n const confidence = typeof meta?.confidence === 'number' ? meta.confidence : row.rel_type === 'blocked_by_suggested' ? 0.5 : 1;\n return Math.max(0, Math.min(1, confidence));\n}\n", "import { z } from 'zod';\n\nexport const RETENTION_POLICY_VERSION = 'v1' as const;\n\nexport const RetentionDecisionSchema = z.enum([\n 'keep',\n 'review',\n 'downgrade',\n 'quarantine',\n 'tombstone_candidate'\n]);\nexport type RetentionDecision = z.infer<typeof RetentionDecisionSchema>;\n\nexport const RetentionDryRunActionSchema = z.enum([\n 'none',\n 'already_quarantined',\n 'mark_review_required',\n 'mark_downgrade_candidate',\n 'mark_tombstone_candidate',\n 'mark_quarantine_candidate'\n]);\nexport type RetentionDryRunAction = z.infer<typeof RetentionDryRunActionSchema>;\n\nexport const RetentionTargetTypeSchema = z.enum([\n 'event',\n 'entity',\n 'edge',\n 'consolidated_memory',\n 'lesson',\n 'action'\n]);\nexport type RetentionTargetType = z.infer<typeof RetentionTargetTypeSchema>;\n\nexport const RetentionMemoryLevelSchema = z.enum(['L0', 'L1', 'L2', 'L3', 'L4']);\nexport type RetentionMemoryLevel = z.infer<typeof RetentionMemoryLevelSchema>;\n\nexport const RetentionFacetSchema = z.object({\n dimension: z.string().trim().min(1),\n value: z.string().trim().min(1),\n confidence: z.number().min(0).max(1).default(1)\n});\nexport type RetentionFacet = z.infer<typeof RetentionFacetSchema>;\n\nconst DateLikeSchema = z.preprocess((value) => {\n if (value instanceof Date) return value;\n if (typeof value === 'string' || typeof value === 'number') return new Date(value);\n return value;\n}, z.date());\n\nconst NullableDateLikeSchema = z.preprocess((value) => {\n if (value === null || value === undefined || value === '') return null;\n if (value instanceof Date) return value;\n if (typeof value === 'string' || typeof value === 'number') return new Date(value);\n return value;\n}, z.date().nullable());\n\nconst OptionalTrimmedStringSchema = z.preprocess(\n (value) => typeof value === 'string' ? value.trim() : value,\n z.string().min(1).optional()\n);\n\nexport const RetentionPolicyInputSchema = z.object({\n targetId: z.string().trim().min(1),\n targetType: RetentionTargetTypeSchema.default('event'),\n projectHash: OptionalTrimmedStringSchema,\n eventType: z.string().trim().min(1).optional(),\n memoryLevel: RetentionMemoryLevelSchema.default('L0'),\n createdAt: DateLikeSchema,\n lastAccessedAt: NullableDateLikeSchema.optional().default(null),\n retrievalCount: z.number().int().min(0).default(0),\n helpfulnessScore: z.number().min(0).max(1).optional(),\n adherenceScore: z.number().min(0).max(1).optional(),\n evidenceConfidence: z.number().min(0).max(1).optional(),\n metadata: z.record(z.unknown()).default({}),\n facets: z.array(RetentionFacetSchema).default([])\n});\nexport type RetentionPolicyInput = z.input<typeof RetentionPolicyInputSchema>;\ntype ParsedRetentionPolicyInput = z.output<typeof RetentionPolicyInputSchema>;\n\nexport interface RetentionReason {\n code: string;\n message: string;\n contribution: number;\n}\n\nexport interface RetentionScoreFactors {\n level: number;\n recency: number;\n retrieval: number;\n helpfulness: number;\n evidence: number;\n eventType: number;\n privacy: number;\n manual: number;\n}\n\nexport interface RetentionDryRunDiff {\n wouldChange: boolean;\n action: RetentionDryRunAction;\n after?: {\n retentionDecision: RetentionDecision;\n policyVersion: typeof RETENTION_POLICY_VERSION;\n };\n}\n\nexport interface RetentionPolicyResult {\n targetId: string;\n targetType: RetentionTargetType;\n projectHash?: string;\n policyVersion: typeof RETENTION_POLICY_VERSION;\n dryRun: true;\n decision: RetentionDecision;\n lifecycleScore: number;\n factors: RetentionScoreFactors;\n reasons: RetentionReason[];\n dryRunDiff: RetentionDryRunDiff;\n evaluatedAt: Date;\n}\n\nexport interface RetentionPolicyOptions {\n now?: Date | string | number;\n}\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nconst LEVEL_SCORE: Record<RetentionMemoryLevel, number> = {\n L0: 0.1,\n L1: 0.25,\n L2: 0.5,\n L3: 0.75,\n L4: 0.95\n};\n\nconst WEIGHTS: Record<keyof RetentionScoreFactors, number> = {\n level: 0.18,\n recency: 0.18,\n retrieval: 0.17,\n helpfulness: 0.18,\n evidence: 0.18,\n eventType: 0.06,\n privacy: 0.05,\n manual: 0\n};\n\nexport function evaluateRetentionPolicy(\n input: RetentionPolicyInput,\n options: RetentionPolicyOptions = {}\n): RetentionPolicyResult {\n const parsed = RetentionPolicyInputSchema.parse(input);\n const evaluatedAt = normalizeNow(options.now);\n const reasons: RetentionReason[] = [];\n const manual = manualRetentionSignals(parsed.facets);\n const privacy = privacySignals(parsed);\n const factors = scoreFactors(parsed, evaluatedAt, privacy);\n\n addFactorReasons(reasons, parsed, evaluatedAt, factors, privacy);\n addManualReasons(reasons, manual);\n\n let lifecycleScore = weightedScore(factors);\n if (manual.keep) lifecycleScore = Math.max(lifecycleScore, 0.95);\n if (manual.discard) lifecycleScore = Math.min(lifecycleScore, 0.05);\n if (privacy.activeQuarantine) lifecycleScore = Math.min(lifecycleScore, 0.1);\n\n const decision = decide(lifecycleScore, manual, privacy);\n\n return {\n targetId: parsed.targetId,\n targetType: parsed.targetType,\n projectHash: parsed.projectHash,\n policyVersion: RETENTION_POLICY_VERSION,\n dryRun: true,\n decision,\n lifecycleScore: round(lifecycleScore),\n factors,\n reasons,\n dryRunDiff: dryRunDiff(decision, privacy),\n evaluatedAt\n };\n}\n\nfunction normalizeNow(value: Date | string | number | undefined): Date {\n if (value === undefined) return new Date();\n const parsed = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(parsed.getTime())) throw new Error('Invalid retention policy now value');\n return parsed;\n}\n\nfunction scoreFactors(\n input: ParsedRetentionPolicyInput,\n now: Date,\n privacy: ReturnType<typeof privacySignals>\n): RetentionScoreFactors {\n return {\n level: LEVEL_SCORE[input.memoryLevel],\n recency: recencyScore(input, now),\n retrieval: retrievalScore(input.retrievalCount),\n helpfulness: helpfulnessScore(input.helpfulnessScore, input.adherenceScore),\n evidence: input.evidenceConfidence ?? 0.5,\n eventType: eventTypeScore(input.eventType),\n privacy: privacy.activeQuarantine ? 0 : privacy.privateSignal ? 0.35 : 1,\n manual: 0\n };\n}\n\nfunction weightedScore(factors: RetentionScoreFactors): number {\n return round(Object.entries(factors).reduce((score, [key, value]) => {\n const weight = WEIGHTS[key as keyof RetentionScoreFactors];\n return score + value * weight;\n }, 0));\n}\n\nfunction decide(\n score: number,\n manual: ReturnType<typeof manualRetentionSignals>,\n privacy: ReturnType<typeof privacySignals>\n): RetentionDecision {\n if (privacy.activeQuarantine) return 'quarantine';\n if (manual.discard) return 'tombstone_candidate';\n if (manual.review) return 'review';\n if (manual.keep) return 'keep';\n\n if (privacy.privateSignal && score < 0.45) return 'review';\n if (score >= 0.68) return 'keep';\n if (score >= 0.45) return 'review';\n if (score >= 0.25) return 'downgrade';\n return 'tombstone_candidate';\n}\n\nfunction dryRunDiff(decision: RetentionDecision, privacy: ReturnType<typeof privacySignals>): RetentionDryRunDiff {\n if (decision === 'keep') return { wouldChange: false, action: 'none' };\n if (decision === 'quarantine' && privacy.activeQuarantine) {\n return { wouldChange: false, action: 'already_quarantined' };\n }\n\n const actionByDecision: Record<Exclude<RetentionDecision, 'keep'>, RetentionDryRunAction> = {\n review: 'mark_review_required',\n downgrade: 'mark_downgrade_candidate',\n quarantine: 'mark_quarantine_candidate',\n tombstone_candidate: 'mark_tombstone_candidate'\n };\n\n return {\n wouldChange: true,\n action: actionByDecision[decision],\n after: {\n retentionDecision: decision,\n policyVersion: RETENTION_POLICY_VERSION\n }\n };\n}\n\nfunction recencyScore(input: ParsedRetentionPolicyInput, now: Date): number {\n const reference = input.lastAccessedAt ?? input.createdAt;\n const days = ageDays(reference, now);\n if (days <= 7) return 0.95;\n if (days <= 30) return 0.8;\n if (days <= 90) return 0.6;\n if (days <= 180) return 0.4;\n if (days <= 365) return 0.25;\n return 0.05;\n}\n\nfunction retrievalScore(count: number): number {\n if (count <= 0) return 0;\n if (count === 1) return 0.25;\n if (count <= 4) return 0.45;\n if (count <= 9) return 0.65;\n if (count <= 19) return 0.8;\n return 0.95;\n}\n\nfunction helpfulnessScore(helpfulness: number | undefined, adherence: number | undefined): number {\n const values = [helpfulness, adherence].filter((value): value is number => typeof value === 'number');\n if (values.length === 0) return 0.5;\n return round(values.reduce((sum, value) => sum + value, 0) / values.length);\n}\n\nfunction eventTypeScore(eventType: string | undefined): number {\n switch (eventType) {\n case 'session_summary':\n return 0.8;\n case 'agent_response':\n return 0.65;\n case 'user_prompt':\n return 0.55;\n case 'tool_observation':\n return 0.25;\n default:\n return 0.45;\n }\n}\n\nfunction manualRetentionSignals(facets: RetentionFacet[]): {\n keep: boolean;\n review: boolean;\n discard: boolean;\n} {\n return {\n keep: hasFacet(facets, 'retention', 'keep'),\n review: hasFacet(facets, 'retention', 'review'),\n discard: hasFacet(facets, 'retention', 'discard')\n };\n}\n\nfunction privacySignals(input: ParsedRetentionPolicyInput): {\n activeQuarantine: boolean;\n privateSignal: boolean;\n} {\n const quarantine = recordValue(input.metadata, 'quarantine');\n const activeQuarantine = typeof quarantine === 'object'\n && quarantine !== null\n && !Array.isArray(quarantine)\n && (quarantine as Record<string, unknown>).status === 'active';\n\n const privateMetadata = input.metadata.private === true\n || input.metadata.isPrivate === true\n || input.metadata.visibility === 'private'\n || input.metadata.privacy === 'private';\n const privateFacet = hasFacet(input.facets, 'privacy', 'private');\n\n return {\n activeQuarantine,\n privateSignal: privateMetadata || privateFacet\n };\n}\n\nfunction addFactorReasons(\n reasons: RetentionReason[],\n input: ParsedRetentionPolicyInput,\n now: Date,\n factors: RetentionScoreFactors,\n privacy: ReturnType<typeof privacySignals>\n): void {\n pushReason(reasons, 'memory_level', `Memory level ${input.memoryLevel} contributes ${formatFactor(factors.level)}.`, factors.level * WEIGHTS.level);\n\n const days = ageDays(input.lastAccessedAt ?? input.createdAt, now);\n pushReason(\n reasons,\n factors.recency <= 0.25 ? 'stale_created_at' : 'recency',\n `Recency signal uses ${Math.max(0, Math.floor(days))} days since last access or creation.`,\n factors.recency * WEIGHTS.recency\n );\n\n pushReason(\n reasons,\n input.retrievalCount <= 1 ? 'low_retrieval_count' : 'retrieval_count',\n `Retrieval count is ${input.retrievalCount}.`,\n factors.retrieval * WEIGHTS.retrieval\n );\n\n pushReason(\n reasons,\n factors.helpfulness < 0.5 ? 'low_helpfulness' : 'helpfulness',\n `Helpfulness/adherence signal is ${formatFactor(factors.helpfulness)}.`,\n factors.helpfulness * WEIGHTS.helpfulness\n );\n\n pushReason(\n reasons,\n factors.evidence < 0.5 ? 'low_evidence_confidence' : 'evidence_confidence',\n `Evidence confidence is ${formatFactor(factors.evidence)}.`,\n factors.evidence * WEIGHTS.evidence\n );\n\n pushReason(reasons, 'event_type', `Event type is ${input.eventType ?? 'unknown'}.`, factors.eventType * WEIGHTS.eventType);\n\n if (hasFacet(input.facets, 'quality', 'verified')) {\n pushReason(reasons, 'quality_verified', 'Verified quality facet supports retaining the memory.', 0.03);\n }\n\n if (privacy.privateSignal) {\n pushReason(reasons, 'private_metadata', 'Private metadata keeps lifecycle handling in review/quarantine-safe mode.', factors.privacy * WEIGHTS.privacy);\n }\n if (hasFacet(input.facets, 'privacy', 'private')) {\n pushReason(reasons, 'privacy_private_facet', 'Privacy facet marks this item as private.', 0);\n }\n if (privacy.activeQuarantine) {\n pushReason(reasons, 'active_quarantine', 'Active quarantine metadata takes precedence over retention scoring.', -1);\n }\n}\n\nfunction addManualReasons(reasons: RetentionReason[], manual: ReturnType<typeof manualRetentionSignals>): void {\n if (manual.keep) {\n pushReason(reasons, 'manual_retention_keep', 'Manual retention:keep facet requests preservation unless quarantine applies.', 1);\n }\n if (manual.review) {\n pushReason(reasons, 'manual_retention_review', 'Manual retention:review facet requests human lifecycle review.', 0);\n }\n if (manual.discard) {\n pushReason(reasons, 'manual_retention_discard', 'Manual retention:discard facet requests non-destructive tombstone candidacy.', -1);\n }\n}\n\nfunction hasFacet(facets: RetentionFacet[], dimension: string, value: string): boolean {\n return facets.some((facet) => facet.dimension === dimension && facet.value === value && facet.confidence > 0);\n}\n\nfunction recordValue(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction ageDays(date: Date, now: Date): number {\n return Math.max(0, (now.getTime() - date.getTime()) / DAY_MS);\n}\n\nfunction pushReason(reasons: RetentionReason[], code: string, message: string, contribution: number): void {\n reasons.push({ code, message, contribution: round(contribution) });\n}\n\nfunction formatFactor(value: number): string {\n return round(value).toFixed(2);\n}\n\nfunction round(value: number): number {\n return Math.round(value * 1000) / 1000;\n}\n", "import { randomUUID } from 'crypto';\nimport { z } from 'zod';\n\nimport {\n sqliteAll,\n sqliteGet,\n sqliteRun,\n toDateFromSQLite,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\nimport {\n RETENTION_POLICY_VERSION,\n RetentionDecisionSchema,\n RetentionDryRunActionSchema,\n RetentionTargetTypeSchema,\n type RetentionDecision,\n type RetentionDryRunDiff,\n type RetentionPolicyResult,\n type RetentionReason,\n type RetentionScoreFactors,\n type RetentionTargetType\n} from './retention-policy.js';\nimport { writeGovernanceAuditEntry } from './governance-audit.js';\n\nconst RequiredTrimmedStringSchema = z.string().trim().min(1);\n\nconst OptionalTrimmedStringSchema = z.string().trim().min(1).optional();\n\nconst DateLikeSchema = z.preprocess((value) => {\n if (value instanceof Date) return value;\n if (typeof value === 'string' || typeof value === 'number') return new Date(value);\n return value;\n}, z.date());\n\nconst RetentionReasonSchema = z.object({\n code: RequiredTrimmedStringSchema,\n message: z.string(),\n contribution: z.number()\n});\n\nconst RetentionScoreFactorsSchema = z.object({\n level: z.number(),\n recency: z.number(),\n retrieval: z.number(),\n helpfulness: z.number(),\n evidence: z.number(),\n eventType: z.number(),\n privacy: z.number(),\n manual: z.number()\n});\n\nconst RetentionDryRunDiffSchema = z.object({\n wouldChange: z.boolean(),\n action: RetentionDryRunActionSchema,\n after: z.object({\n retentionDecision: RetentionDecisionSchema,\n policyVersion: z.string().min(1)\n }).optional()\n});\n\nconst RetentionPolicyResultSchema = z.object({\n targetId: RequiredTrimmedStringSchema,\n targetType: RetentionTargetTypeSchema,\n projectHash: OptionalTrimmedStringSchema,\n policyVersion: z.string().min(1),\n dryRun: z.literal(true),\n decision: RetentionDecisionSchema,\n lifecycleScore: z.number().min(0).max(1),\n factors: RetentionScoreFactorsSchema,\n reasons: z.array(RetentionReasonSchema),\n dryRunDiff: RetentionDryRunDiffSchema,\n evaluatedAt: DateLikeSchema\n});\n\ntype ParsedRetentionPolicyResult = z.output<typeof RetentionPolicyResultSchema>;\n\nconst StringArraySchema = z.array(z.preprocess(\n (value) => typeof value === 'string' ? value.trim() : value,\n z.string().min(1)\n)).default([]);\n\nconst FlatUpsertInputSchema = RetentionPolicyResultSchema.extend({\n actor: OptionalTrimmedStringSchema,\n sourceEventIds: StringArraySchema\n});\n\nconst WrappedUpsertInputSchema = z.object({\n result: RetentionPolicyResultSchema,\n projectHash: OptionalTrimmedStringSchema,\n actor: OptionalTrimmedStringSchema,\n sourceEventIds: StringArraySchema\n});\n\nconst GetRetentionScoreInputSchema = z.object({\n targetType: RetentionTargetTypeSchema,\n targetId: RequiredTrimmedStringSchema,\n projectHash: RequiredTrimmedStringSchema,\n policyVersion: z.string().min(1).optional()\n});\n\nconst ListRetentionScoresInputSchema = z.object({\n projectHash: RequiredTrimmedStringSchema,\n policyVersion: z.string().min(1).optional(),\n decision: RetentionDecisionSchema.optional(),\n limit: z.number().int().min(1).max(1000).default(100)\n});\n\nexport type UpsertRetentionScoreInput = z.input<typeof FlatUpsertInputSchema> | z.input<typeof WrappedUpsertInputSchema>;\nexport type GetRetentionScoreInput = z.input<typeof GetRetentionScoreInputSchema>;\nexport type ListRetentionScoresInput = z.input<typeof ListRetentionScoresInputSchema>;\n\nexport interface MemoryRetentionScore {\n scoreId: string;\n targetType: RetentionTargetType;\n targetId: string;\n projectHash: string;\n policyVersion: string;\n decision: RetentionDecision;\n lifecycleScore: number;\n factors: RetentionScoreFactors;\n reasons: RetentionReason[];\n dryRunDiff: RetentionDryRunDiff;\n sourceEventIds: string[];\n evaluatedAt: Date;\n createdAt: Date;\n updatedAt: Date;\n}\n\ninterface MemoryRetentionScoreRow {\n score_id: string;\n target_type: string;\n target_id: string;\n project_hash: string;\n policy_version: string;\n decision: string;\n lifecycle_score: number;\n factors_json: string;\n reasons_json: string;\n dry_run_diff_json: string;\n source_event_ids: string;\n evaluated_at: string;\n created_at: string;\n updated_at: string;\n}\n\ninterface NormalizedUpsertInput {\n result: ParsedRetentionPolicyResult;\n projectHash: string;\n actor?: string;\n sourceEventIds: string[];\n}\n\nfunction parseJson<T>(value: string, schema: z.ZodType<T>): T {\n try {\n return schema.parse(JSON.parse(value));\n } catch {\n return schema.parse(undefined);\n }\n}\n\nfunction parseStringArray(value: string): string[] {\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? parsed.filter((item): item is string => typeof item === 'string' && item.length > 0) : [];\n } catch {\n return [];\n }\n}\n\nfunction rowToRetentionScore(row: MemoryRetentionScoreRow): MemoryRetentionScore {\n return {\n scoreId: row.score_id,\n targetType: RetentionTargetTypeSchema.parse(row.target_type),\n targetId: row.target_id,\n projectHash: row.project_hash,\n policyVersion: row.policy_version,\n decision: RetentionDecisionSchema.parse(row.decision),\n lifecycleScore: Number(row.lifecycle_score),\n factors: parseJson(row.factors_json, RetentionScoreFactorsSchema) as RetentionScoreFactors,\n reasons: parseJson(row.reasons_json, z.array(RetentionReasonSchema)) as RetentionReason[],\n dryRunDiff: parseJson(row.dry_run_diff_json, RetentionDryRunDiffSchema) as RetentionDryRunDiff,\n sourceEventIds: parseStringArray(row.source_event_ids),\n evaluatedAt: toDateFromSQLite(row.evaluated_at),\n createdAt: toDateFromSQLite(row.created_at),\n updatedAt: toDateFromSQLite(row.updated_at)\n };\n}\n\nfunction normalizeUpsertInput(input: unknown): NormalizedUpsertInput {\n const maybeInput = input && typeof input === 'object' ? input as Record<string, unknown> : {};\n if ('result' in maybeInput) {\n const parsed = WrappedUpsertInputSchema.parse(input);\n const resultProjectHash = parsed.result.projectHash;\n if (parsed.projectHash && resultProjectHash && parsed.projectHash !== resultProjectHash) {\n throw new Error(`projectHash mismatch: result uses ${resultProjectHash} but input uses ${parsed.projectHash}`);\n }\n const projectHash = parsed.projectHash ?? resultProjectHash;\n if (!projectHash) throw new Error('projectHash is required for retention score writes');\n return {\n result: parsed.result,\n projectHash,\n actor: parsed.actor,\n sourceEventIds: parsed.sourceEventIds\n };\n }\n\n const parsed = FlatUpsertInputSchema.parse(input);\n if (!parsed.projectHash) throw new Error('projectHash is required for retention score writes');\n return {\n result: parsed,\n projectHash: parsed.projectHash,\n actor: parsed.actor,\n sourceEventIds: parsed.sourceEventIds\n };\n}\n\nfunction retentionScoreToAuditJson(score: MemoryRetentionScore): Record<string, unknown> {\n return {\n scoreId: score.scoreId,\n targetType: score.targetType,\n targetId: score.targetId,\n projectHash: score.projectHash,\n policyVersion: score.policyVersion,\n decision: score.decision,\n lifecycleScore: score.lifecycleScore,\n factors: score.factors,\n reasons: score.reasons,\n dryRunDiff: score.dryRunDiff,\n sourceEventIds: score.sourceEventIds,\n evaluatedAt: score.evaluatedAt.toISOString(),\n createdAt: score.createdAt.toISOString(),\n updatedAt: score.updatedAt.toISOString()\n };\n}\n\nexport class RetentionRepository {\n constructor(private readonly db: SQLiteDatabase) {}\n\n async upsert(input: unknown): Promise<MemoryRetentionScore> {\n const parsed = normalizeUpsertInput(input);\n const existing = this.getLatestForTarget({\n targetType: parsed.result.targetType,\n targetId: parsed.result.targetId,\n projectHash: parsed.projectHash,\n policyVersion: parsed.result.policyVersion\n });\n const now = new Date().toISOString();\n const scoreId = existing?.scoreId ?? randomUUID();\n\n if (existing) {\n sqliteRun(\n this.db,\n `UPDATE memory_retention_scores\n SET decision = ?, lifecycle_score = ?, factors_json = ?, reasons_json = ?,\n dry_run_diff_json = ?, source_event_ids = ?, evaluated_at = ?, updated_at = ?\n WHERE score_id = ? AND project_hash = ?`,\n [\n parsed.result.decision,\n parsed.result.lifecycleScore,\n JSON.stringify(parsed.result.factors),\n JSON.stringify(parsed.result.reasons),\n JSON.stringify(parsed.result.dryRunDiff),\n JSON.stringify(parsed.sourceEventIds),\n parsed.result.evaluatedAt.toISOString(),\n now,\n scoreId,\n parsed.projectHash\n ]\n );\n } else {\n sqliteRun(\n this.db,\n `INSERT INTO memory_retention_scores (\n score_id, target_type, target_id, project_hash, policy_version, decision,\n lifecycle_score, factors_json, reasons_json, dry_run_diff_json,\n source_event_ids, evaluated_at, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n scoreId,\n parsed.result.targetType,\n parsed.result.targetId,\n parsed.projectHash,\n parsed.result.policyVersion,\n parsed.result.decision,\n parsed.result.lifecycleScore,\n JSON.stringify(parsed.result.factors),\n JSON.stringify(parsed.result.reasons),\n JSON.stringify(parsed.result.dryRunDiff),\n JSON.stringify(parsed.sourceEventIds),\n parsed.result.evaluatedAt.toISOString(),\n now,\n now\n ]\n );\n }\n\n const saved = this.require(scoreId, parsed.projectHash);\n await writeGovernanceAuditEntry(this.db, {\n operation: 'retention_score',\n actor: parsed.actor ?? 'cml-core',\n projectHash: parsed.projectHash,\n targetType: parsed.result.targetType,\n targetId: parsed.result.targetId,\n beforeJson: existing ? retentionScoreToAuditJson(existing) : undefined,\n afterJson: retentionScoreToAuditJson(saved),\n sourceEventIds: parsed.sourceEventIds\n });\n return saved;\n }\n\n getLatestForTarget(input: unknown): MemoryRetentionScore | null {\n const parsed = GetRetentionScoreInputSchema.parse(input);\n const params: unknown[] = [parsed.targetType, parsed.targetId, parsed.projectHash];\n const clauses = ['target_type = ?', 'target_id = ?', 'project_hash = ?'];\n if (parsed.policyVersion) {\n clauses.push('policy_version = ?');\n params.push(parsed.policyVersion);\n }\n const sql = 'SELECT * FROM memory_retention_scores WHERE ' + clauses.join(' AND ') + ' ORDER BY evaluated_at DESC LIMIT 1';\n const row = sqliteGet<MemoryRetentionScoreRow>(this.db, sql, params);\n return row ? rowToRetentionScore(row) : null;\n }\n\n async list(input: unknown): Promise<MemoryRetentionScore[]> {\n const parsed = ListRetentionScoresInputSchema.parse(input);\n const clauses = ['project_hash = ?'];\n const params: unknown[] = [parsed.projectHash];\n if (parsed.policyVersion) {\n clauses.push('policy_version = ?');\n params.push(parsed.policyVersion);\n }\n if (parsed.decision) {\n clauses.push('decision = ?');\n params.push(parsed.decision);\n }\n params.push(parsed.limit);\n const whereClause = clauses.join(' AND ');\n const sql = 'SELECT * FROM memory_retention_scores WHERE ' + whereClause + ' ORDER BY lifecycle_score ASC, evaluated_at DESC LIMIT ?';\n return sqliteAll<MemoryRetentionScoreRow>(this.db, sql, params).map(rowToRetentionScore);\n }\n\n private require(scoreId: string, projectHash: string): MemoryRetentionScore {\n const row = sqliteGet<MemoryRetentionScoreRow>(\n this.db,\n `SELECT * FROM memory_retention_scores WHERE score_id = ? AND project_hash = ?`,\n [scoreId, projectHash]\n );\n if (!row) throw new Error(`Memory retention score not found: ${scoreId}`);\n return rowToRetentionScore(row);\n }\n}\n\nexport function retentionScoreInputFromResult(\n result: RetentionPolicyResult,\n options: { projectHash?: string; sourceEventIds?: string[]; actor?: string } = {}\n): UpsertRetentionScoreInput {\n return {\n result,\n projectHash: options.projectHash ?? result.projectHash,\n sourceEventIds: options.sourceEventIds ?? [],\n actor: options.actor\n };\n}\n\nexport { RETENTION_POLICY_VERSION };\n", "/**\n * Core types for claude-memory-layer plugin\n * Idris2 inspired: Complete, immutable type definitions with Zod validation\n */\n\nimport { z } from 'zod';\n\n// ============================================================\n// Event Types\n// ============================================================\n\nexport const EventTypeSchema = z.enum([\n 'user_prompt',\n 'agent_response',\n 'session_summary',\n 'tool_observation'\n]);\nexport type EventType = z.infer<typeof EventTypeSchema>;\n\n// ============================================================\n// Memory Event (L0 EventStore)\n// ============================================================\n\nexport const MemoryEventSchema = z.object({\n id: z.string().uuid(),\n eventType: EventTypeSchema,\n sessionId: z.string(),\n timestamp: z.date(),\n content: z.string(),\n canonicalKey: z.string(),\n dedupeKey: z.string(),\n metadata: z.record(z.unknown()).optional()\n});\nexport type MemoryEvent = z.infer<typeof MemoryEventSchema>;\n\n// Input for creating new events (id, dedupeKey generated automatically)\nexport const MemoryEventInputSchema = MemoryEventSchema.omit({\n id: true,\n dedupeKey: true,\n canonicalKey: true\n});\nexport type MemoryEventInput = z.infer<typeof MemoryEventInputSchema>;\n\n// ============================================================\n// Session\n// ============================================================\n\nexport const SessionSchema = z.object({\n id: z.string(),\n startedAt: z.date(),\n endedAt: z.date().optional(),\n projectPath: z.string().optional(),\n summary: z.string().optional(),\n tags: z.array(z.string()).optional()\n});\nexport type Session = z.infer<typeof SessionSchema>;\n\n// ============================================================\n// Insight (L1 Structured)\n// ============================================================\n\nexport const InsightTypeSchema = z.enum([\n 'preference',\n 'pattern',\n 'expertise'\n]);\nexport type InsightType = z.infer<typeof InsightTypeSchema>;\n\nexport const InsightSchema = z.object({\n id: z.string().uuid(),\n insightType: InsightTypeSchema,\n content: z.string(),\n canonicalKey: z.string(),\n confidence: z.number().min(0).max(1),\n sourceEvents: z.array(z.string().uuid()),\n createdAt: z.date(),\n lastUpdated: z.date()\n});\nexport type Insight = z.infer<typeof InsightSchema>;\n\n// ============================================================\n// Memory Match (Search Result)\n// ============================================================\n\nexport const MemoryMatchSchema = z.object({\n event: MemoryEventSchema,\n score: z.number().min(0).max(1),\n relevanceReason: z.string().optional()\n});\nexport type MemoryMatch = z.infer<typeof MemoryMatchSchema>;\n\n// ============================================================\n// Match Confidence (AXIOMMIND)\n// ============================================================\n\nexport const MatchConfidenceSchema = z.enum(['high', 'suggested', 'none']);\nexport type MatchConfidence = z.infer<typeof MatchConfidenceSchema>;\n\nexport const MatchResultSchema = z.object({\n match: MemoryMatchSchema.nullable(),\n confidence: MatchConfidenceSchema,\n gap: z.number().optional(),\n alternatives: z.array(MemoryMatchSchema).optional()\n});\nexport type MatchResult = z.infer<typeof MatchResultSchema>;\n\n// AXIOMMIND Matching Thresholds\nexport const MATCH_THRESHOLDS = {\n minCombinedScore: 0.92,\n minGap: 0.03,\n suggestionThreshold: 0.75\n} as const;\n\n// ============================================================\n// Memory Level (Graduation Pipeline)\n// ============================================================\n\nexport const MemoryLevelSchema = z.enum(['L0', 'L1', 'L2', 'L3', 'L4']);\nexport type MemoryLevel = z.infer<typeof MemoryLevelSchema>;\n\nexport const GraduationResultSchema = z.object({\n eventId: z.string().uuid(),\n fromLevel: MemoryLevelSchema,\n toLevel: MemoryLevelSchema,\n success: z.boolean(),\n reason: z.string().optional()\n});\nexport type GraduationResult = z.infer<typeof GraduationResultSchema>;\n\n// ============================================================\n// Evidence Span (AXIOMMIND Principle 4)\n// ============================================================\n\nexport const EvidenceSpanSchema = z.object({\n start: z.number().int().nonnegative(),\n end: z.number().int().positive(),\n confidence: z.number().min(0).max(1),\n matchType: z.enum(['exact', 'fuzzy', 'none']),\n originalQuote: z.string(),\n alignedText: z.string()\n});\nexport type EvidenceSpan = z.infer<typeof EvidenceSpanSchema>;\n\n// ============================================================\n// Memory Operations Config (AgentMemory-inspired operations layer)\n// ============================================================\n\nexport const PerspectiveConsolidationSpecialistKindSchema = z.enum([\n 'deduction',\n 'induction',\n 'contradiction',\n 'actor_card_maintenance'\n]);\nexport type PerspectiveConsolidationSpecialistKind = z.infer<typeof PerspectiveConsolidationSpecialistKindSchema>;\n\nexport const MemoryOperationsConfigSchema = z.object({\n enabled: z.boolean().default(false),\n facets: z.object({\n enabled: z.boolean().default(true)\n }).default({}),\n actions: z.object({\n enabled: z.boolean().default(true)\n }).default({}),\n retention: z.object({\n enabled: z.boolean().default(false),\n policyVersion: z.string().default('v1')\n }).default({}),\n graphExpansion: z.object({\n enabled: z.boolean().default(false),\n maxHops: z.number().int().min(0).max(5).default(1)\n }).default({}),\n lessons: z.object({\n enabled: z.boolean().default(false)\n }).default({}),\n perspectiveMemory: z.object({\n enabled: z.boolean().default(false),\n deriver: z.object({\n enabled: z.boolean().default(false),\n maxEventsPerBatch: z.number().int().positive().max(100).default(20),\n maxObserversPerSession: z.number().int().positive().max(50).default(5)\n }).default({}),\n specialists: z.object({\n enabled: z.boolean().default(false),\n enabledProjectHashes: z.array(z.string().trim().min(1)).max(100).default([]),\n enabledKinds: z.array(PerspectiveConsolidationSpecialistKindSchema).default([\n 'deduction',\n 'induction',\n 'contradiction',\n 'actor_card_maintenance'\n ]),\n maxSourceObservations: z.number().int().positive().max(100).default(20),\n maxDerivedObservations: z.number().int().min(0).max(20).default(5),\n maxCardUpdates: z.number().int().min(0).max(40).default(3)\n }).default({})\n }).default({})\n}).default({});\nexport type MemoryOperationsConfig = z.infer<typeof MemoryOperationsConfigSchema>;\n\n// ============================================================\n// Procedural Lesson Types (AgentMemory-inspired operations layer)\n// ============================================================\n\nconst MemoryLessonNonEmptyStringSchema = z.string()\n .transform((value) => value.trim())\n .pipe(z.string().min(1));\n\nconst MemoryLessonStringArraySchema = z.preprocess((value) => {\n if (!Array.isArray(value)) return value;\n return value\n .map((item) => typeof item === 'string' ? item.trim() : item)\n .filter((item) => typeof item !== 'string' || item.length > 0);\n}, z.array(MemoryLessonNonEmptyStringSchema)).default([]);\n\nexport const MemoryLessonSchema = z.object({\n lessonId: z.string().uuid(),\n projectHash: MemoryLessonNonEmptyStringSchema.optional(),\n name: MemoryLessonNonEmptyStringSchema,\n trigger: MemoryLessonNonEmptyStringSchema,\n steps: MemoryLessonStringArraySchema.refine((steps) => steps.length > 0, 'steps must contain at least one step'),\n confidence: z.number().min(0).max(1),\n sourceSessionIds: MemoryLessonStringArraySchema,\n sourceEventIds: MemoryLessonStringArraySchema,\n failureModes: MemoryLessonStringArraySchema,\n skillCandidate: z.boolean().default(false),\n createdAt: z.date(),\n updatedAt: z.date()\n});\nexport type MemoryLesson = z.infer<typeof MemoryLessonSchema>;\n\nexport const UpsertMemoryLessonInputSchema = z.object({\n lessonId: z.string().uuid().optional(),\n projectHash: MemoryLessonNonEmptyStringSchema.optional(),\n name: MemoryLessonNonEmptyStringSchema,\n trigger: MemoryLessonNonEmptyStringSchema,\n steps: MemoryLessonStringArraySchema.refine((steps) => steps.length > 0, 'steps must contain at least one step'),\n confidence: z.number().min(0).max(1).default(0.5),\n sourceSessionIds: MemoryLessonStringArraySchema,\n sourceEventIds: MemoryLessonStringArraySchema,\n failureModes: MemoryLessonStringArraySchema,\n skillCandidate: z.boolean().default(false),\n actor: MemoryLessonNonEmptyStringSchema.optional()\n}).superRefine((value, ctx) => {\n if (value.sourceSessionIds.length === 0 && value.sourceEventIds.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['sourceEventIds'],\n message: 'sourceSessionIds or sourceEventIds is required'\n });\n }\n});\nexport type UpsertMemoryLessonInput = z.input<typeof UpsertMemoryLessonInputSchema>;\n\nexport const ListMemoryLessonsInputSchema = z.object({\n projectHash: MemoryLessonNonEmptyStringSchema.optional(),\n skillCandidate: z.boolean().optional(),\n limit: z.number().int().positive().max(500).default(50)\n});\nexport type ListMemoryLessonsInput = z.input<typeof ListMemoryLessonsInputSchema>;\n\n// ============================================================\n// Honcho-inspired Perspective Memory Types\n// ============================================================\n\nconst PerspectiveMemoryNonEmptyStringSchema = z.string()\n .transform((value) => value.trim())\n .pipe(z.string().min(1));\n\nconst PerspectiveMemoryOptionalStringSchema = z.preprocess((value) => {\n if (typeof value !== 'string') return value;\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}, PerspectiveMemoryNonEmptyStringSchema.optional());\n\nconst PerspectiveMemoryStringArraySchema = z.preprocess((value) => {\n if (!Array.isArray(value)) return value;\n return value\n .map((item) => typeof item === 'string' ? item.trim() : item)\n .filter((item) => typeof item !== 'string' || item.length > 0);\n}, z.array(PerspectiveMemoryNonEmptyStringSchema)).default([]);\n\nconst ActorCardSensitivePattern = /(?:\\b(?:api[_-]?key|secret|password|passwd|token|access[_-]?token|client[_-]?secret|bearer)\\b\\s*[:=])|(?:\\b(?:api[_-]?key|secret|password|passwd|token|access[_-]?token|client[_-]?secret|bearer)=)|(?:^|\\s)(?:\\/[A-Za-z0-9._-][^\\s`'\\\"]*)/i;\n\nexport const MemoryActorKindSchema = z.enum([\n 'user',\n 'assistant',\n 'subagent',\n 'tool',\n 'system',\n 'integration',\n 'unknown'\n]);\nexport type MemoryActorKind = z.infer<typeof MemoryActorKindSchema>;\n\nexport const SessionActorRoleSchema = z.enum([\n 'speaker',\n 'assistant',\n 'observer',\n 'tool',\n 'system',\n 'unknown'\n]);\nexport type SessionActorRole = z.infer<typeof SessionActorRoleSchema>;\n\nexport const PerspectiveObservationLevelSchema = z.enum([\n 'explicit',\n 'deductive',\n 'inductive',\n 'contradiction'\n]);\nexport type PerspectiveObservationLevel = z.infer<typeof PerspectiveObservationLevelSchema>;\n\nexport const PerspectiveObservationCreatedBySchema = z.enum(['rule', 'llm', 'manual', 'import']);\nexport type PerspectiveObservationCreatedBy = z.infer<typeof PerspectiveObservationCreatedBySchema>;\n\nexport const ActorCardEntryPrefixSchema = z.enum([\n 'IDENTITY',\n 'ATTRIBUTE',\n 'RELATIONSHIP',\n 'INSTRUCTION'\n]);\nexport type ActorCardEntryPrefix = z.infer<typeof ActorCardEntryPrefixSchema>;\n\nexport const ActorCardEntrySchema = z.string()\n .transform((value) => value.trim())\n .pipe(\n z.string()\n .min(1)\n .max(200, 'actor card entry must be at most 200 characters')\n .refine(\n (value) => /^(IDENTITY|ATTRIBUTE|RELATIONSHIP|INSTRUCTION):\\s*\\S/.test(value),\n 'actor card entry prefix must be one of IDENTITY:, ATTRIBUTE:, RELATIONSHIP:, or INSTRUCTION:'\n )\n .refine(\n (value) => !ActorCardSensitivePattern.test(value),\n 'actor card entry contains secret, redacted, sensitive, or path-like content'\n )\n );\nexport type ActorCardEntry = z.infer<typeof ActorCardEntrySchema>;\n\nexport const MemoryActorSchema = z.object({\n actorId: PerspectiveMemoryNonEmptyStringSchema,\n projectHash: PerspectiveMemoryOptionalStringSchema,\n kind: MemoryActorKindSchema,\n displayName: PerspectiveMemoryNonEmptyStringSchema,\n source: PerspectiveMemoryNonEmptyStringSchema,\n metadata: z.record(z.unknown()).optional(),\n createdAt: z.date(),\n updatedAt: z.date()\n});\nexport type MemoryActor = z.infer<typeof MemoryActorSchema>;\n\nexport const UpsertMemoryActorInputSchema = z.object({\n actorId: PerspectiveMemoryOptionalStringSchema,\n projectHash: PerspectiveMemoryOptionalStringSchema,\n kind: MemoryActorKindSchema.default('unknown'),\n displayName: PerspectiveMemoryNonEmptyStringSchema,\n source: PerspectiveMemoryNonEmptyStringSchema,\n metadata: z.record(z.unknown()).optional()\n});\nexport type UpsertMemoryActorInput = z.input<typeof UpsertMemoryActorInputSchema>;\n\nexport const ListMemoryActorsInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n kind: MemoryActorKindSchema.optional(),\n source: PerspectiveMemoryOptionalStringSchema,\n limit: z.number().int().positive().max(500).default(100)\n});\nexport type ListMemoryActorsInput = z.input<typeof ListMemoryActorsInputSchema>;\n\nexport const SessionActorSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n sessionId: PerspectiveMemoryNonEmptyStringSchema,\n actorId: PerspectiveMemoryNonEmptyStringSchema,\n roleInSession: SessionActorRoleSchema,\n observeSelf: z.boolean().default(true),\n observeOthers: z.boolean().default(false),\n joinedAt: z.date(),\n leftAt: z.date().optional(),\n metadata: z.record(z.unknown()).optional()\n});\nexport type SessionActor = z.infer<typeof SessionActorSchema>;\n\nexport const UpsertSessionActorInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n sessionId: PerspectiveMemoryNonEmptyStringSchema,\n actorId: PerspectiveMemoryNonEmptyStringSchema,\n roleInSession: SessionActorRoleSchema.default('unknown'),\n observeSelf: z.boolean().default(true),\n observeOthers: z.boolean().default(false),\n joinedAt: z.date().optional(),\n leftAt: z.date().optional(),\n metadata: z.record(z.unknown()).optional()\n});\nexport type UpsertSessionActorInput = z.input<typeof UpsertSessionActorInputSchema>;\n\nexport const ListSessionActorsInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n sessionId: PerspectiveMemoryNonEmptyStringSchema,\n limit: z.number().int().positive().max(500).default(100)\n});\nexport type ListSessionActorsInput = z.input<typeof ListSessionActorsInputSchema>;\n\nexport const SetSessionActorObservationPolicyInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n sessionId: PerspectiveMemoryNonEmptyStringSchema,\n actorId: PerspectiveMemoryNonEmptyStringSchema,\n observeSelf: z.boolean(),\n observeOthers: z.boolean()\n});\nexport type SetSessionActorObservationPolicyInput = z.input<typeof SetSessionActorObservationPolicyInputSchema>;\n\nexport const ActorCardSchema = z.object({\n cardId: z.string().uuid(),\n projectHash: PerspectiveMemoryOptionalStringSchema,\n observerActorId: PerspectiveMemoryNonEmptyStringSchema,\n observedActorId: PerspectiveMemoryNonEmptyStringSchema,\n entries: z.array(ActorCardEntrySchema).max(40),\n sourceEventIds: PerspectiveMemoryStringArraySchema,\n updatedBy: PerspectiveMemoryOptionalStringSchema,\n createdAt: z.date(),\n updatedAt: z.date()\n});\nexport type ActorCard = z.infer<typeof ActorCardSchema>;\n\nexport const UpsertActorCardInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n observerActorId: PerspectiveMemoryNonEmptyStringSchema,\n observedActorId: PerspectiveMemoryNonEmptyStringSchema,\n entries: z.array(ActorCardEntrySchema).min(1).max(40, 'actor card supports at most 40 entries'),\n sourceEventIds: PerspectiveMemoryStringArraySchema,\n updatedBy: PerspectiveMemoryOptionalStringSchema\n});\nexport type UpsertActorCardInput = z.input<typeof UpsertActorCardInputSchema>;\n\nexport const GetActorCardInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n observerActorId: PerspectiveMemoryNonEmptyStringSchema,\n observedActorId: PerspectiveMemoryNonEmptyStringSchema\n});\nexport type GetActorCardInput = z.input<typeof GetActorCardInputSchema>;\n\nexport const PerspectiveObservationSchema = z.object({\n observationId: z.string().uuid(),\n projectHash: PerspectiveMemoryOptionalStringSchema,\n observerActorId: PerspectiveMemoryNonEmptyStringSchema,\n observedActorId: PerspectiveMemoryNonEmptyStringSchema,\n sessionId: PerspectiveMemoryOptionalStringSchema,\n level: PerspectiveObservationLevelSchema,\n content: PerspectiveMemoryNonEmptyStringSchema,\n confidence: z.number().min(0).max(1),\n sourceEventIds: PerspectiveMemoryStringArraySchema,\n sourceObservationIds: PerspectiveMemoryStringArraySchema,\n createdBy: PerspectiveObservationCreatedBySchema,\n metadata: z.record(z.unknown()).optional(),\n createdAt: z.date(),\n updatedAt: z.date(),\n deletedAt: z.date().optional()\n});\nexport type PerspectiveObservation = z.infer<typeof PerspectiveObservationSchema>;\n\nexport const CreatePerspectiveObservationInputSchema = z.object({\n observationId: z.string().uuid().optional(),\n projectHash: PerspectiveMemoryOptionalStringSchema,\n observerActorId: PerspectiveMemoryNonEmptyStringSchema,\n observedActorId: PerspectiveMemoryNonEmptyStringSchema,\n sessionId: PerspectiveMemoryOptionalStringSchema,\n level: PerspectiveObservationLevelSchema.default('explicit'),\n content: PerspectiveMemoryNonEmptyStringSchema,\n confidence: z.number().min(0).max(1).default(0.5),\n sourceEventIds: PerspectiveMemoryStringArraySchema,\n sourceObservationIds: PerspectiveMemoryStringArraySchema,\n createdBy: PerspectiveObservationCreatedBySchema.default('manual'),\n metadata: z.record(z.unknown()).optional(),\n actor: PerspectiveMemoryOptionalStringSchema\n}).superRefine((value, ctx) => {\n const hasEvidence = value.sourceEventIds.length > 0 || value.sourceObservationIds.length > 0;\n if ((value.createdBy !== 'manual' || value.level !== 'explicit') && !hasEvidence) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['sourceEventIds'],\n message: 'source evidence is required for non-manual or derived perspective observations'\n });\n }\n});\nexport type CreatePerspectiveObservationInput = z.input<typeof CreatePerspectiveObservationInputSchema>;\n\nexport const QueryPerspectiveObservationsInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n observerActorId: PerspectiveMemoryOptionalStringSchema,\n observedActorId: PerspectiveMemoryOptionalStringSchema,\n sessionId: PerspectiveMemoryOptionalStringSchema,\n levels: z.array(PerspectiveObservationLevelSchema).optional(),\n query: PerspectiveMemoryOptionalStringSchema,\n includeDeleted: z.boolean().default(false),\n limit: z.number().int().positive().max(500).default(50)\n});\nexport type QueryPerspectiveObservationsInput = z.input<typeof QueryPerspectiveObservationsInputSchema>;\n\nexport const DeletePerspectiveObservationInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n observationId: PerspectiveMemoryNonEmptyStringSchema,\n actor: PerspectiveMemoryNonEmptyStringSchema\n});\nexport type DeletePerspectiveObservationInput = z.input<typeof DeletePerspectiveObservationInputSchema>;\n\nexport const ListPerspectiveObservationsBySourceInputSchema = z.object({\n projectHash: PerspectiveMemoryOptionalStringSchema,\n sourceEventId: PerspectiveMemoryNonEmptyStringSchema,\n limit: z.number().int().positive().max(500).default(100)\n});\nexport type ListPerspectiveObservationsBySourceInput = z.input<typeof ListPerspectiveObservationsBySourceInputSchema>;\n\n// ============================================================\n// Configuration\n// ============================================================\n\nexport const ConfigSchema = z.object({\n storage: z.object({\n path: z.string().default('~/.claude-code/memory'),\n maxSizeMB: z.number().default(500)\n }).default({}),\n embedding: z.object({\n provider: z.enum(['local', 'openai']).default('local'),\n model: z.string().default('Xenova/multilingual-e5-small'),\n openaiModel: z.string().default('Xenova/multilingual-e5-small'),\n batchSize: z.number().default(32)\n }).default({}),\n retrieval: z.object({\n topK: z.number().default(5),\n minScore: z.number().default(0.7),\n maxTokens: z.number().default(2000)\n }).default({}),\n matching: z.object({\n minCombinedScore: z.number().default(0.92),\n minGap: z.number().default(0.03),\n suggestionThreshold: z.number().default(0.75),\n weights: z.object({\n semanticSimilarity: z.number().default(0.4),\n ftsScore: z.number().default(0.25),\n recencyBonus: z.number().default(0.2),\n statusWeight: z.number().default(0.15)\n }).default({})\n }).default({}),\n privacy: z.object({\n excludePatterns: z.array(z.string()).default(['password', 'secret', 'api_key', 'token', 'bearer']),\n anonymize: z.boolean().default(false),\n privateTags: z.object({\n enabled: z.boolean().default(true),\n marker: z.enum(['[PRIVATE]', '[REDACTED]', '']).default('[PRIVATE]'),\n preserveLineCount: z.boolean().default(false),\n supportedFormats: z.array(z.enum(['xml', 'bracket', 'comment'])).default(['xml'])\n }).default({})\n }).default({}),\n toolObservation: z.object({\n enabled: z.boolean().default(true),\n excludedTools: z.array(z.string()).default(['TodoWrite', 'TodoRead']),\n minOutputLength: z.number().default(100),\n maxOutputLength: z.number().default(10000),\n maxOutputLines: z.number().default(100),\n storeOnlyOnSuccess: z.boolean().default(false)\n }).default({}),\n features: z.object({\n autoSave: z.boolean().default(true),\n sessionSummary: z.boolean().default(true),\n insightExtraction: z.boolean().default(true),\n crossProjectLearning: z.boolean().default(false),\n singleWriterMode: z.boolean().default(true),\n sharedStore: z.object({\n enabled: z.boolean().default(true),\n autoPromote: z.boolean().default(true),\n searchShared: z.boolean().default(true),\n minConfidenceForPromotion: z.number().default(0.8),\n sharedStoragePath: z.string().default('~/.claude-code/memory/shared')\n }).default({})\n }).default({}),\n operations: MemoryOperationsConfigSchema,\n mode: z.enum(['session', 'endless']).default('session'),\n endless: z.object({\n enabled: z.boolean().default(false),\n workingSet: z.object({\n maxEvents: z.number().default(100),\n timeWindowHours: z.number().default(24),\n minRelevanceScore: z.number().default(0.5)\n }).default({}),\n consolidation: z.object({\n triggerIntervalMs: z.number().default(3600000),\n triggerEventCount: z.number().default(100),\n triggerIdleMs: z.number().default(1800000),\n useLLMSummarization: z.boolean().default(false)\n }).default({}),\n continuity: z.object({\n minScoreForSeamless: z.number().default(0.7),\n topicDecayHours: z.number().default(48)\n }).default({})\n }).optional()\n});\nexport type Config = z.infer<typeof ConfigSchema>;\n\n// ============================================================\n// Append Result (AXIOMMIND Principle 2: Append-only)\n// ============================================================\n\nexport type AppendResult =\n | { success: true; eventId: string; isDuplicate: false }\n | { success: true; eventId: string; isDuplicate: true }\n | { success: false; error: string };\n\n// ============================================================\n// Hook Input/Output Types\n// ============================================================\n\nexport interface SessionStartInput {\n session_id: string;\n cwd: string;\n}\n\nexport interface SessionStartOutput {\n context?: string;\n}\n\nexport interface UserPromptSubmitInput {\n session_id: string;\n prompt: string;\n}\n\nexport interface UserPromptSubmitOutput {\n context?: string;\n}\n\n// Stop Hook Input (matches actual Claude Code hook format)\nexport interface StopInput {\n session_id: string;\n transcript_path: string;\n cwd: string;\n permission_mode: string;\n hook_event_name: string;\n stop_hook_active: boolean;\n}\n\nexport interface SessionEndInput {\n session_id: string;\n}\n\n// PostToolUse Hook Input (matches actual Claude Code hook format)\nexport interface PostToolUseInput {\n session_id: string;\n hook_event_name: string;\n tool_name: string;\n tool_input: Record<string, unknown>;\n tool_use_id: string;\n // Claude Code sends tool_response as an object, not tool_output as string\n tool_response: {\n stdout?: string;\n stderr?: string;\n content?: string;\n interrupted?: boolean;\n isImage?: boolean;\n // For non-Bash tools, response may be a plain string or other format\n [key: string]: unknown;\n };\n cwd: string;\n transcript_path: string;\n permission_mode: string;\n}\n\n// ============================================================\n// Tool Observation Types\n// ============================================================\n\nexport const ToolMetadataSchema = z.object({\n filePath: z.string().optional(),\n fileType: z.string().optional(),\n lineCount: z.number().optional(),\n command: z.string().optional(),\n exitCode: z.number().optional(),\n pattern: z.string().optional(),\n matchCount: z.number().optional(),\n url: z.string().optional(),\n statusCode: z.number().optional()\n});\nexport type ToolMetadata = z.infer<typeof ToolMetadataSchema>;\n\nexport const ToolObservationPayloadSchema = z.object({\n toolName: z.string(),\n toolInput: z.record(z.unknown()),\n toolOutput: z.string(),\n durationMs: z.number(),\n success: z.boolean(),\n errorMessage: z.string().optional(),\n metadata: ToolMetadataSchema.optional()\n});\nexport type ToolObservationPayload = z.infer<typeof ToolObservationPayloadSchema>;\n\n// ============================================================\n// Vector Record\n// ============================================================\n\nexport interface VectorRecord {\n id: string;\n eventId: string;\n sessionId: string;\n eventType: string;\n content: string;\n vector: number[];\n timestamp: string;\n metadata?: Record<string, unknown>;\n}\n\n// ============================================================\n// Outbox Item (Single-Writer Pattern)\n// ============================================================\n\nexport interface OutboxItem {\n id: string;\n eventId: string;\n content: string;\n status: 'pending' | 'processing' | 'done' | 'failed';\n retryCount: number;\n createdAt: Date;\n errorMessage?: string;\n}\n\nexport interface OutboxStatsOptions {\n /** Processing rows older than this threshold are considered abandoned/stuck. */\n stuckThresholdMs?: number;\n /** Test hook for deterministic age calculations. */\n now?: Date;\n}\n\nexport interface OutboxQueueStats {\n pending: number;\n processing: number;\n failed: number;\n total: number;\n stuckProcessing: number;\n /** Age in milliseconds for the oldest processing row, or null when none are processing. */\n oldestProcessingAgeMs: number | null;\n}\n\nexport interface OutboxStats {\n embedding: OutboxQueueStats;\n vector: OutboxQueueStats;\n}\n\nexport interface OutboxRecoveryOptions {\n /** Processing rows older than this threshold are considered abandoned. */\n stuckThresholdMs?: number;\n /** Retry failed rows whose retry_count is still below this value. */\n maxRetries?: number;\n /** Count rows that would be recovered/retried without mutating them. */\n dryRun?: boolean;\n /** Test hook for deterministic recovery cutoffs. */\n now?: Date;\n}\n\nexport interface OutboxRecoveryBucket {\n recoveredProcessing: number;\n retriedFailed: number;\n}\n\nexport interface OutboxRecoveryResult {\n embedding: OutboxRecoveryBucket;\n vector: OutboxRecoveryBucket;\n}\n\nexport interface ProjectScopeRepairOptions {\n /** Absolute or logical project path used to derive the expected project hash. */\n projectPath?: string;\n /** Explicit project hash override for hash-only repair flows. */\n projectHash?: string;\n /** Inspect and count changes without mutating event metadata. */\n dryRun?: boolean;\n /** Test hook for deterministic repair metadata. */\n now?: Date;\n}\n\nexport interface ProjectScopeRepairSample {\n eventId: string;\n action: 'repaired' | 'quarantined';\n reason: 'same-project-path' | 'session-project-path' | 'project-path-mismatch' | 'missing-project-scope' | 'scope-hash-mismatch' | 'content-project-mismatch';\n}\n\nexport interface ProjectScopeRepairResult {\n dryRun: boolean;\n projectHash: string;\n scanned: number;\n repaired: number;\n quarantined: number;\n alreadyScoped: number;\n skipped: number;\n samples: ProjectScopeRepairSample[];\n}\n\n// ============================================================\n// Entity Types (Task, Condition, Artifact)\n// ============================================================\n\nexport const EntityTypeSchema = z.enum(['task', 'condition', 'artifact']);\nexport type EntityType = z.infer<typeof EntityTypeSchema>;\n\nexport const TaskStatusSchema = z.enum([\n 'pending',\n 'in_progress',\n 'blocked',\n 'done',\n 'cancelled'\n]);\nexport type TaskStatus = z.infer<typeof TaskStatusSchema>;\n\nexport const TaskPrioritySchema = z.enum(['low', 'medium', 'high', 'critical']);\nexport type TaskPriority = z.infer<typeof TaskPrioritySchema>;\n\nexport const EntityStageSchema = z.enum([\n 'raw',\n 'working',\n 'candidate',\n 'verified',\n 'certified'\n]);\nexport type EntityStage = z.infer<typeof EntityStageSchema>;\n\nexport const EntityStatusSchema = z.enum([\n 'active',\n 'contested',\n 'deprecated',\n 'superseded'\n]);\nexport type EntityStatus = z.infer<typeof EntityStatusSchema>;\n\n// Base Entity schema\nexport const EntitySchema = z.object({\n entityId: z.string(),\n entityType: EntityTypeSchema,\n canonicalKey: z.string(),\n title: z.string(),\n stage: EntityStageSchema,\n status: EntityStatusSchema,\n currentJson: z.record(z.unknown()),\n titleNorm: z.string().optional(),\n searchText: z.string().optional(),\n createdAt: z.date(),\n updatedAt: z.date()\n});\nexport type Entity = z.infer<typeof EntitySchema>;\n\n// Task-specific current_json structure\nexport const TaskCurrentJsonSchema = z.object({\n status: TaskStatusSchema,\n priority: TaskPrioritySchema.optional(),\n blockers: z.array(z.string()).optional(),\n blockerSuggestions: z.array(z.string()).optional(),\n description: z.string().optional(),\n project: z.string().optional()\n});\nexport type TaskCurrentJson = z.infer<typeof TaskCurrentJsonSchema>;\n\n// Entity alias for canonical key lookup\nexport const EntityAliasSchema = z.object({\n entityType: EntityTypeSchema,\n canonicalKey: z.string(),\n entityId: z.string(),\n isPrimary: z.boolean()\n});\nexport type EntityAlias = z.infer<typeof EntityAliasSchema>;\n\n// ============================================================\n// Edge Types (Relationships)\n// ============================================================\n\nexport const NodeTypeSchema = z.enum(['entry', 'entity', 'event']);\nexport type NodeType = z.infer<typeof NodeTypeSchema>;\n\nexport const RelationTypeSchema = z.enum([\n 'evidence_of',\n 'blocked_by',\n 'blocked_by_suggested',\n 'resolves_to',\n 'derived_from',\n 'supersedes',\n 'source_of'\n]);\nexport type RelationType = z.infer<typeof RelationTypeSchema>;\n\nexport const EdgeSchema = z.object({\n edgeId: z.string(),\n srcType: NodeTypeSchema,\n srcId: z.string(),\n relType: RelationTypeSchema,\n dstType: NodeTypeSchema,\n dstId: z.string(),\n metaJson: z.record(z.unknown()).optional(),\n createdAt: z.date()\n});\nexport type Edge = z.infer<typeof EdgeSchema>;\n\n// ============================================================\n// Task Event Types (SoT for Task Entity)\n// ============================================================\n\nexport const TaskEventTypeSchema = z.enum([\n 'task_created',\n 'task_status_changed',\n 'task_priority_changed',\n 'task_blockers_set',\n 'task_transition_rejected',\n 'condition_declared',\n 'artifact_declared',\n 'condition_resolved_to'\n]);\nexport type TaskEventType = z.infer<typeof TaskEventTypeSchema>;\n\nexport const BlockerModeSchema = z.enum(['replace', 'suggest']);\nexport type BlockerMode = z.infer<typeof BlockerModeSchema>;\n\nexport const BlockerKindSchema = z.enum(['task', 'condition', 'artifact']);\nexport type BlockerKind = z.infer<typeof BlockerKindSchema>;\n\nexport const BlockerRefSchema = z.object({\n kind: BlockerKindSchema,\n entityId: z.string(),\n rawText: z.string().optional(),\n confidence: z.number().min(0).max(1).optional(),\n candidates: z.array(z.string()).optional()\n});\nexport type BlockerRef = z.infer<typeof BlockerRefSchema>;\n\n// Task event payloads\nexport const TaskCreatedPayloadSchema = z.object({\n taskId: z.string(),\n title: z.string(),\n canonicalKey: z.string(),\n initialStatus: TaskStatusSchema,\n priority: TaskPrioritySchema.optional(),\n description: z.string().optional(),\n project: z.string().optional()\n});\nexport type TaskCreatedPayload = z.infer<typeof TaskCreatedPayloadSchema>;\n\nexport const TaskStatusChangedPayloadSchema = z.object({\n taskId: z.string(),\n fromStatus: TaskStatusSchema,\n toStatus: TaskStatusSchema,\n reason: z.string().optional()\n});\nexport type TaskStatusChangedPayload = z.infer<typeof TaskStatusChangedPayloadSchema>;\n\nexport const TaskBlockersSetPayloadSchema = z.object({\n taskId: z.string(),\n mode: BlockerModeSchema,\n blockers: z.array(BlockerRefSchema),\n sourceEntryId: z.string().optional()\n});\nexport type TaskBlockersSetPayload = z.infer<typeof TaskBlockersSetPayloadSchema>;\n\n// ============================================================\n// Entry Types (Immutable memory units)\n// ============================================================\n\nexport const EntryTypeSchema = z.enum([\n 'fact',\n 'decision',\n 'insight',\n 'task_note',\n 'reference',\n 'preference',\n 'pattern',\n 'troubleshooting'\n]);\nexport type EntryType = z.infer<typeof EntryTypeSchema>;\n\nexport const EntrySchema = z.object({\n entryId: z.string(),\n createdTs: z.date(),\n entryType: EntryTypeSchema,\n title: z.string(),\n contentJson: z.record(z.unknown()),\n stage: EntityStageSchema,\n status: EntityStatusSchema,\n supersededBy: z.string().optional(),\n buildId: z.string().optional(),\n evidenceJson: z.record(z.unknown()).optional(),\n canonicalKey: z.string()\n});\nexport type Entry = z.infer<typeof EntrySchema>;\n\n// ============================================================\n// Evidence Aligner V2 Types\n// ============================================================\n\nexport const ExtractedEvidenceSchema = z.object({\n messageIndex: z.number().int().nonnegative(),\n quote: z.string()\n});\nexport type ExtractedEvidence = z.infer<typeof ExtractedEvidenceSchema>;\n\nexport const AlignedEvidenceSchema = z.object({\n messageIndex: z.number().int().nonnegative(),\n quote: z.string(),\n spanStart: z.number().int().nonnegative(),\n spanEnd: z.number().int().positive(),\n quoteHash: z.string(),\n confidence: z.number().min(0).max(1),\n matchMethod: z.enum(['exact', 'normalized', 'fuzzy'])\n});\nexport type AlignedEvidence = z.infer<typeof AlignedEvidenceSchema>;\n\nexport const FailedEvidenceSchema = z.object({\n messageIndex: z.number().int().nonnegative(),\n quote: z.string(),\n failureReason: z.enum(['not_found', 'below_threshold', 'ambiguous', 'empty_quote', 'invalid_index'])\n});\nexport type FailedEvidence = z.infer<typeof FailedEvidenceSchema>;\n\nexport const EvidenceAlignResultSchema = z.discriminatedUnion('aligned', [\n z.object({ aligned: z.literal(true), evidence: AlignedEvidenceSchema }),\n z.object({ aligned: z.literal(false), evidence: FailedEvidenceSchema })\n]);\nexport type EvidenceAlignResult = z.infer<typeof EvidenceAlignResultSchema>;\n\n// ============================================================\n// Vector Outbox V2 Types\n// ============================================================\n\nexport const OutboxStatusSchema = z.enum(['pending', 'processing', 'done', 'failed']);\nexport type OutboxStatus = z.infer<typeof OutboxStatusSchema>;\n\nexport const OutboxItemKindSchema = z.enum(['entry', 'task_title', 'event', 'perspective_observation']);\nexport type OutboxItemKind = z.infer<typeof OutboxItemKindSchema>;\n\nexport const OutboxJobSchema = z.object({\n jobId: z.string(),\n itemKind: OutboxItemKindSchema,\n itemId: z.string(),\n embeddingVersion: z.string(),\n status: OutboxStatusSchema,\n retryCount: z.number().int().nonnegative(),\n error: z.string().optional(),\n createdAt: z.date(),\n updatedAt: z.date()\n});\nexport type OutboxJob = z.infer<typeof OutboxJobSchema>;\n\n// Valid state transitions for outbox\nexport const VALID_OUTBOX_TRANSITIONS: Array<{ from: OutboxStatus; to: OutboxStatus }> = [\n { from: 'pending', to: 'processing' },\n { from: 'processing', to: 'done' },\n { from: 'processing', to: 'failed' },\n { from: 'failed', to: 'pending' }\n];\n\n// ============================================================\n// Build Runs (Pipeline metadata)\n// ============================================================\n\nexport const BuildRunSchema = z.object({\n buildId: z.string(),\n startedAt: z.date(),\n finishedAt: z.date().optional(),\n extractorModel: z.string(),\n extractorPromptHash: z.string(),\n embedderModel: z.string(),\n embeddingVersion: z.string(),\n idrisVersion: z.string(),\n schemaVersion: z.string(),\n status: z.enum(['running', 'success', 'failed']),\n error: z.string().optional()\n});\nexport type BuildRun = z.infer<typeof BuildRunSchema>;\n\n// ============================================================\n// Pipeline Metrics\n// ============================================================\n\nexport const PipelineMetricSchema = z.object({\n id: z.string(),\n ts: z.date(),\n stage: z.string(),\n latencyMs: z.number(),\n success: z.boolean(),\n error: z.string().optional(),\n sessionId: z.string().optional()\n});\nexport type PipelineMetric = z.infer<typeof PipelineMetricSchema>;\n\n// ============================================================\n// Progressive Disclosure Types\n// ============================================================\n\n// Layer 1: Search Index (lightweight)\nexport const SearchIndexItemSchema = z.object({\n id: z.string(),\n summary: z.string().max(100),\n score: z.number(),\n type: z.enum(['user_prompt', 'agent_response', 'session_summary', 'tool_observation']),\n timestamp: z.date(),\n sessionId: z.string()\n});\nexport type SearchIndexItem = z.infer<typeof SearchIndexItemSchema>;\n\n// Layer 2: Timeline\nexport const TimelineItemSchema = z.object({\n id: z.string(),\n timestamp: z.date(),\n type: z.enum(['user_prompt', 'agent_response', 'session_summary', 'tool_observation']),\n preview: z.string().max(200),\n isTarget: z.boolean()\n});\nexport type TimelineItem = z.infer<typeof TimelineItemSchema>;\n\n// Layer 3: Full Detail\nexport const FullDetailSchema = z.object({\n id: z.string(),\n content: z.string(),\n type: z.enum(['user_prompt', 'agent_response', 'session_summary', 'tool_observation']),\n timestamp: z.date(),\n sessionId: z.string(),\n citationId: z.string().optional(),\n metadata: z.object({\n tokenCount: z.number(),\n hasCode: z.boolean(),\n files: z.array(z.string()).optional(),\n tools: z.array(z.string()).optional()\n })\n});\nexport type FullDetail = z.infer<typeof FullDetailSchema>;\n\n// Progressive Search Result\nexport const ProgressiveSearchResultSchema = z.object({\n index: z.array(SearchIndexItemSchema),\n timeline: z.array(TimelineItemSchema).optional(),\n details: z.array(FullDetailSchema).optional(),\n meta: z.object({\n totalMatches: z.number(),\n expandedCount: z.number(),\n estimatedTokens: z.number(),\n expansionReason: z.string().optional()\n })\n});\nexport type ProgressiveSearchResult = z.infer<typeof ProgressiveSearchResultSchema>;\n\n// Progressive Disclosure Config\nexport const ProgressiveDisclosureConfigSchema = z.object({\n enabled: z.boolean().default(true),\n layer1: z.object({\n topK: z.number().default(10),\n minScore: z.number().default(0.7)\n }).default({}),\n autoExpand: z.object({\n enabled: z.boolean().default(true),\n highConfidenceThreshold: z.number().default(0.92),\n scoreGapThreshold: z.number().default(0.1),\n maxAutoExpandCount: z.number().default(3)\n }).default({}),\n tokenBudget: z.object({\n maxTotalTokens: z.number().default(2000),\n layer1PerItem: z.number().default(50),\n layer2PerItem: z.number().default(40),\n layer3PerItem: z.number().default(500)\n }).default({})\n});\nexport type ProgressiveDisclosureConfig = z.infer<typeof ProgressiveDisclosureConfigSchema>;\n\n// ============================================================\n// Citation Types\n// ============================================================\n\nexport const CitationSchema = z.object({\n citationId: z.string().length(6),\n eventId: z.string(),\n createdAt: z.date()\n});\nexport type Citation = z.infer<typeof CitationSchema>;\n\nexport const CitationUsageSchema = z.object({\n usageId: z.string(),\n citationId: z.string(),\n sessionId: z.string(),\n usedAt: z.date(),\n context: z.string().optional()\n});\nexport type CitationUsage = z.infer<typeof CitationUsageSchema>;\n\nexport interface CitedSearchResult {\n event: MemoryEvent;\n citation: Citation;\n score: number;\n}\n\nexport interface CitationStats {\n usageCount: number;\n lastUsed: Date | null;\n}\n\n// ============================================================\n// Endless Mode Types\n// ============================================================\n\nexport const MemoryModeSchema = z.enum(['session', 'endless']);\nexport type MemoryMode = z.infer<typeof MemoryModeSchema>;\n\nexport const EndlessModeConfigSchema = z.object({\n enabled: z.boolean().default(false),\n\n workingSet: z.object({\n maxEvents: z.number().default(100),\n timeWindowHours: z.number().default(24),\n minRelevanceScore: z.number().default(0.5)\n }).default({}),\n\n consolidation: z.object({\n triggerIntervalMs: z.number().default(3600000), // 1 hour\n triggerEventCount: z.number().default(100),\n triggerIdleMs: z.number().default(1800000), // 30 minutes\n useLLMSummarization: z.boolean().default(false)\n }).default({}),\n\n continuity: z.object({\n minScoreForSeamless: z.number().default(0.7),\n topicDecayHours: z.number().default(48)\n }).default({})\n});\nexport type EndlessModeConfig = z.infer<typeof EndlessModeConfigSchema>;\n\n// Working Set Item\nexport const WorkingSetItemSchema = z.object({\n id: z.string(),\n eventId: z.string(),\n addedAt: z.date(),\n relevanceScore: z.number(),\n topics: z.array(z.string()).optional(),\n expiresAt: z.date()\n});\nexport type WorkingSetItem = z.infer<typeof WorkingSetItemSchema>;\n\n// Working Set\nexport interface WorkingSet {\n recentEvents: MemoryEvent[];\n lastActivity: Date;\n continuityScore: number;\n}\n\n// Consolidated Memory\nexport const ConsolidatedMemorySchema = z.object({\n memoryId: z.string(),\n summary: z.string(),\n topics: z.array(z.string()),\n sourceEvents: z.array(z.string()),\n confidence: z.number(),\n createdAt: z.date(),\n accessedAt: z.date().optional(),\n accessCount: z.number().default(0)\n});\nexport type ConsolidatedMemory = z.infer<typeof ConsolidatedMemorySchema>;\n\n// Consolidated Memory Input (for creation)\nexport interface ConsolidatedMemoryInput {\n summary: string;\n topics: string[];\n sourceEvents: string[];\n confidence: number;\n}\n\n// Long-term Rule (promoted from stable summaries)\nexport const ConsolidationRuleSchema = z.object({\n ruleId: z.string(),\n rule: z.string(),\n topics: z.array(z.string()),\n sourceMemoryIds: z.array(z.string()),\n sourceEvents: z.array(z.string()),\n confidence: z.number(),\n createdAt: z.date()\n});\nexport type ConsolidationRule = z.infer<typeof ConsolidationRuleSchema>;\n\nexport interface ConsolidationRuleInput {\n rule: string;\n topics: string[];\n sourceMemoryIds: string[];\n sourceEvents: string[];\n confidence: number;\n}\n\nexport interface ConsolidationCostQualityReport {\n beforeTokenEstimate: number;\n afterTokenEstimate: number;\n reductionRatio: number;\n qualityGuardPassed: boolean;\n details: string;\n}\n\n// Event Group (for consolidation)\nexport interface EventGroup {\n topics: string[];\n events: MemoryEvent[];\n}\n\n// Context Snapshot (for continuity calculation)\nexport interface ContextSnapshot {\n id: string;\n timestamp: number;\n topics: string[];\n files: string[];\n entities: string[];\n}\n\n// Transition Type\nexport const TransitionTypeSchema = z.enum(['seamless', 'topic_shift', 'break']);\nexport type TransitionType = z.infer<typeof TransitionTypeSchema>;\n\n// Continuity Score Result\nexport interface ContinuityScore {\n score: number;\n transitionType: TransitionType;\n}\n\n// Continuity Log\nexport const ContinuityLogSchema = z.object({\n logId: z.string(),\n fromContextId: z.string().optional(),\n toContextId: z.string().optional(),\n continuityScore: z.number(),\n transitionType: TransitionTypeSchema,\n createdAt: z.date()\n});\nexport type ContinuityLog = z.infer<typeof ContinuityLogSchema>;\n\n// Endless Mode Status\nexport interface EndlessModeStatus {\n mode: MemoryMode;\n workingSetSize: number;\n continuityScore: number;\n consolidatedCount: number;\n lastConsolidation: Date | null;\n}\n\n// ============================================================\n// Shared Store Types (Cross-Project Knowledge)\n// ============================================================\n\nexport const SharedEntryTypeSchema = z.enum([\n 'troubleshooting',\n 'best_practice',\n 'common_error'\n]);\nexport type SharedEntryType = z.infer<typeof SharedEntryTypeSchema>;\n\nexport const SharedTroubleshootingEntrySchema = z.object({\n entryId: z.string(),\n sourceProjectHash: z.string(),\n sourceEntryId: z.string(),\n title: z.string(),\n symptoms: z.array(z.string()),\n rootCause: z.string(),\n solution: z.string(),\n topics: z.array(z.string()),\n technologies: z.array(z.string()).optional(),\n confidence: z.number().min(0).max(1),\n usageCount: z.number().default(0),\n lastUsedAt: z.date().optional(),\n promotedAt: z.date(),\n createdAt: z.date()\n});\nexport type SharedTroubleshootingEntry = z.infer<typeof SharedTroubleshootingEntrySchema>;\n\nexport interface SharedTroubleshootingInput {\n sourceProjectHash: string;\n sourceEntryId: string;\n title: string;\n symptoms: string[];\n rootCause: string;\n solution: string;\n topics: string[];\n technologies?: string[];\n confidence: number;\n}\n\nexport const SharedStoreConfigSchema = z.object({\n enabled: z.boolean().default(true),\n autoPromote: z.boolean().default(true),\n searchShared: z.boolean().default(true),\n minConfidenceForPromotion: z.number().default(0.8),\n sharedStoragePath: z.string().default('~/.claude-code/memory/shared')\n});\nexport type SharedStoreConfig = z.infer<typeof SharedStoreConfigSchema>;\n\n// Shared search result\nexport interface SharedSearchResult {\n id: string;\n entryId: string;\n content: string;\n score: number;\n entryType: SharedEntryType;\n}\n", "import { applyPrivacyFilter } from '../privacy/filter.js';\nimport {\n sqliteAll,\n sqliteGet,\n toDateFromSQLite,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\nimport { ConfigSchema } from '../types.js';\nimport {\n evaluateRetentionPolicy,\n RETENTION_POLICY_VERSION,\n type RetentionDecision,\n type RetentionDryRunAction,\n type RetentionFacet,\n type RetentionMemoryLevel,\n type RetentionPolicyInput\n} from './retention-policy.js';\n\nconst DEFAULT_AUDIT_LIMIT = 100;\nconst DEFAULT_SAMPLE_LIMIT = 20;\nconst PREVIEW_LIMIT = 180;\nconst POSIX_ABSOLUTE_PATH_PATTERN = /(^|[^A-Za-z0-9._\\/\\\\-])\\/(?!\\/)[^\\n\\r\"'<>|`]*/g;\nconst WINDOWS_DRIVE_PATH_PATTERN = /(^|[^A-Za-z0-9._\\/\\\\-])(?:[A-Za-z]:[\\\\/][^\\n\\r\"'<>|`]*)/g;\nconst WINDOWS_UNC_PATH_PATTERN = /(^|[^A-Za-z0-9._\\/\\\\-])(?:\\\\\\\\[^\\\\/\\s\"'<>|`]+[\\\\/][^\\n\\r\"'<>|`]*)/g;\nconst PRIVACY_CONFIG = ConfigSchema.parse({}).privacy;\nconst MEMORY_LEVELS = new Set<RetentionMemoryLevel>(['L0', 'L1', 'L2', 'L3', 'L4']);\nconst RETENTION_AUDIT_TARGET_TYPES = new Set(['event', 'entity', 'edge', 'consolidated_memory', 'lesson', 'action']);\n\nexport interface RetentionAuditOptions {\n projectHash: string;\n targetType?: string;\n targetId?: string;\n dryRun?: boolean;\n limit?: number;\n sampleLimit?: number;\n projectPath?: string;\n now?: Date | string | number;\n}\n\nexport interface RetentionAuditDecisionCounts {\n keep: number;\n review: number;\n downgrade: number;\n quarantine: number;\n tombstone_candidate: number;\n}\n\nexport interface RetentionAuditSample {\n targetType: 'event';\n targetId: string;\n eventType: string;\n decision: RetentionDecision;\n lifecycleScore: number;\n policyVersion: typeof RETENTION_POLICY_VERSION;\n dryRunAction: RetentionDryRunAction;\n reasonCodes: string[];\n redactedPreview: string;\n}\n\nexport interface RetentionAuditReport {\n dryRun: true;\n projectHash: string;\n policyVersion: typeof RETENTION_POLICY_VERSION;\n scanned: number;\n limit: number;\n decisions: RetentionAuditDecisionCounts;\n wouldChange: number;\n samples: RetentionAuditSample[];\n}\n\ninterface EventRow {\n id: string;\n event_type: string;\n timestamp: string;\n content: string;\n metadata: string | null;\n access_count: number | null;\n last_accessed_at: string | null;\n}\n\ninterface FacetRow {\n target_id: string;\n dimension: string;\n value: string;\n confidence: number;\n}\n\ninterface HelpfulnessRow {\n event_id: string;\n helpfulness_score: number | null;\n retrieval_score: number | null;\n}\n\ninterface RetrievalTraceRow {\n selected_event_ids: string | null;\n}\n\ninterface EvaluatedSample {\n sample: RetentionAuditSample;\n wouldChange: boolean;\n}\n\nexport function runRetentionAudit(db: SQLiteDatabase, options: RetentionAuditOptions): RetentionAuditReport {\n const projectHash = normalizeProjectHash(options.projectHash);\n if (options.dryRun === false) {\n throw new Error('retention audit is dry-run only and must not mutate memory data');\n }\n\n const limit = normalizePositiveInteger(options.limit, DEFAULT_AUDIT_LIMIT, 'retention audit limit');\n const sampleLimit = normalizePositiveInteger(options.sampleLimit, DEFAULT_SAMPLE_LIMIT, 'retention audit sample limit');\n const targetType = normalizeOptionalRetentionTargetType(options.targetType);\n const targetId = normalizeOptionalTargetId(options.targetId);\n if (targetType && targetType !== 'event') {\n return emptyRetentionAuditReport(projectHash, limit);\n }\n const facetsByTarget = loadFacetsByTarget(db, projectHash);\n const helpfulnessByEvent = loadHelpfulnessByEvent(db);\n const retrievalCounts = loadRetrievalCounts(db, projectHash);\n const eventQueryParams: Array<string | number> = [projectHash];\n const targetIdClause = targetId ? ' AND id = ?' : '';\n if (targetId) eventQueryParams.push(targetId);\n eventQueryParams.push(limit);\n\n const eventRows = sqliteAll<EventRow>(\n db,\n `SELECT id, event_type, timestamp, content, metadata, access_count, last_accessed_at\n FROM events\n WHERE COALESCE(\n json_extract(CASE WHEN json_valid(metadata) THEN metadata ELSE '{}' END, '$.scope.project.hash'),\n json_extract(CASE WHEN json_valid(metadata) THEN metadata ELSE '{}' END, '$.projectHash')\n ) = ?${targetIdClause}\n ORDER BY timestamp DESC\n LIMIT ?`,\n eventQueryParams\n );\n\n const decisions = emptyDecisionCounts();\n const evaluatedSamples: EvaluatedSample[] = [];\n let scanned = 0;\n let wouldChange = 0;\n\n for (const row of eventRows) {\n const metadata = safeParseObject(row.metadata) ?? {};\n if (!belongsToProject(metadata, projectHash)) continue;\n\n scanned++;\n const facets = facetsByTarget.get(row.id) ?? [];\n const helpfulness = helpfulnessByEvent.get(row.id);\n const retrievalCount = Math.max(0, Number(row.access_count ?? 0)) + (retrievalCounts.get(row.id) ?? 0);\n const result = evaluateRetentionPolicy({\n targetType: 'event',\n targetId: row.id,\n projectHash,\n eventType: row.event_type,\n memoryLevel: memoryLevelFromMetadata(metadata),\n createdAt: toDateFromSQLite(row.timestamp),\n lastAccessedAt: row.last_accessed_at ? toDateFromSQLite(row.last_accessed_at) : null,\n retrievalCount,\n helpfulnessScore: helpfulness?.helpfulnessScore,\n adherenceScore: helpfulness?.adherenceScore,\n evidenceConfidence: evidenceConfidenceFromFacets(facets),\n metadata,\n facets\n } satisfies RetentionPolicyInput, { now: options.now });\n\n decisions[result.decision]++;\n if (result.dryRunDiff.wouldChange) wouldChange++;\n\n evaluatedSamples.push({\n wouldChange: result.dryRunDiff.wouldChange,\n sample: {\n targetType: 'event',\n targetId: row.id,\n eventType: row.event_type,\n decision: result.decision,\n lifecycleScore: result.lifecycleScore,\n policyVersion: result.policyVersion,\n dryRunAction: result.dryRunDiff.action,\n reasonCodes: result.reasons.map((reason) => reason.code),\n redactedPreview: redactedPreview(row.content, options.projectPath)\n }\n });\n }\n\n evaluatedSamples.sort((left, right) => {\n if (left.wouldChange !== right.wouldChange) return left.wouldChange ? -1 : 1;\n return left.sample.lifecycleScore - right.sample.lifecycleScore;\n });\n\n return {\n dryRun: true,\n projectHash,\n policyVersion: RETENTION_POLICY_VERSION,\n scanned,\n limit,\n decisions,\n wouldChange,\n samples: evaluatedSamples.slice(0, sampleLimit).map((entry) => entry.sample)\n };\n}\n\nexport function emptyRetentionAuditReport(projectHash: string, limit = DEFAULT_AUDIT_LIMIT): RetentionAuditReport {\n return {\n dryRun: true,\n projectHash: normalizeProjectHash(projectHash),\n policyVersion: RETENTION_POLICY_VERSION,\n scanned: 0,\n limit: normalizePositiveInteger(limit, DEFAULT_AUDIT_LIMIT, 'retention audit limit'),\n decisions: emptyDecisionCounts(),\n wouldChange: 0,\n samples: []\n };\n}\n\nfunction loadFacetsByTarget(db: SQLiteDatabase, projectHash: string): Map<string, RetentionFacet[]> {\n if (!tableExists(db, 'memory_facets')) return new Map();\n const rows = sqliteAll<FacetRow>(\n db,\n `SELECT target_id, dimension, value, confidence\n FROM memory_facets\n WHERE target_type = 'event'\n AND project_hash = ?\n AND confidence > 0\n ORDER BY updated_at DESC`,\n [projectHash]\n );\n const facets = new Map<string, RetentionFacet[]>();\n for (const row of rows) {\n const current = facets.get(row.target_id) ?? [];\n current.push({\n dimension: row.dimension,\n value: row.value,\n confidence: Number(row.confidence)\n });\n facets.set(row.target_id, current);\n }\n return facets;\n}\n\nfunction loadHelpfulnessByEvent(db: SQLiteDatabase): Map<string, { helpfulnessScore?: number; adherenceScore?: number }> {\n if (!tableExists(db, 'memory_helpfulness')) return new Map();\n const rows = sqliteAll<HelpfulnessRow>(\n db,\n `SELECT event_id,\n AVG(helpfulness_score) AS helpfulness_score,\n AVG(retrieval_score) AS retrieval_score\n FROM memory_helpfulness\n GROUP BY event_id`,\n []\n );\n const helpfulness = new Map<string, { helpfulnessScore?: number; adherenceScore?: number }>();\n for (const row of rows) {\n helpfulness.set(row.event_id, {\n helpfulnessScore: normalizeScore(row.helpfulness_score),\n adherenceScore: normalizeScore(row.retrieval_score)\n });\n }\n return helpfulness;\n}\n\nfunction loadRetrievalCounts(db: SQLiteDatabase, projectHash: string): Map<string, number> {\n if (!tableExists(db, 'retrieval_traces')) return new Map();\n const rows = sqliteAll<RetrievalTraceRow>(\n db,\n `SELECT selected_event_ids\n FROM retrieval_traces\n WHERE project_hash = ?`,\n [projectHash]\n );\n const counts = new Map<string, number>();\n for (const row of rows) {\n for (const eventId of parseStringArray(row.selected_event_ids)) {\n counts.set(eventId, (counts.get(eventId) ?? 0) + 1);\n }\n }\n return counts;\n}\n\nfunction belongsToProject(metadata: Record<string, unknown>, projectHash: string): boolean {\n const currentHash = nestedString(metadata, ['scope', 'project', 'hash'])\n ?? nestedString(metadata, ['projectHash']);\n return currentHash === undefined || currentHash === projectHash;\n}\n\nfunction memoryLevelFromMetadata(metadata: Record<string, unknown>): RetentionMemoryLevel {\n const level = nestedString(metadata, ['memoryLevel'])\n ?? nestedString(metadata, ['memory', 'level'])\n ?? nestedString(metadata, ['level']);\n return MEMORY_LEVELS.has(level as RetentionMemoryLevel) ? level as RetentionMemoryLevel : 'L0';\n}\n\nfunction evidenceConfidenceFromFacets(facets: RetentionFacet[]): number | undefined {\n if (facets.some((facet) => facet.dimension === 'quality' && facet.value === 'verified' && facet.confidence > 0)) {\n return 0.9;\n }\n if (facets.some((facet) => facet.dimension === 'quality' && facet.value === 'disputed' && facet.confidence > 0)) {\n return 0.1;\n }\n return undefined;\n}\n\nfunction redactedPreview(content: string, projectPath?: string): string {\n return redactLocalPaths(applyPrivacyFilter(content, PRIVACY_CONFIG).content, projectPath)\n .replace(/\\s+/g, ' ')\n .trim()\n .slice(0, PREVIEW_LIMIT);\n}\n\nfunction redactLocalPaths(content: string, projectPath?: string): string {\n let filtered = content;\n if (projectPath) {\n filtered = filtered.split(projectPath).join('[REDACTED]');\n }\n return [WINDOWS_UNC_PATH_PATTERN, WINDOWS_DRIVE_PATH_PATTERN, POSIX_ABSOLUTE_PATH_PATTERN].reduce(\n (current, pattern) => current.replace(pattern, (_match, prefix: string) => `${prefix}[REDACTED]`),\n filtered\n );\n}\n\nfunction tableExists(db: SQLiteDatabase, tableName: string): boolean {\n const row = sqliteGet<{ name: string }>(\n db,\n `SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?`,\n [tableName]\n );\n return Boolean(row);\n}\n\nfunction emptyDecisionCounts(): RetentionAuditDecisionCounts {\n return {\n keep: 0,\n review: 0,\n downgrade: 0,\n quarantine: 0,\n tombstone_candidate: 0\n };\n}\n\nfunction normalizeProjectHash(value: string): string {\n const projectHash = value.trim();\n if (!/^[a-f0-9]{8}$/.test(projectHash)) {\n throw new Error('retention audit projectHash must be an 8-character lowercase hex hash');\n }\n return projectHash;\n}\n\nfunction normalizeOptionalRetentionTargetType(value: string | undefined): string | undefined {\n if (value === undefined) return undefined;\n const targetType = value.trim();\n if (!RETENTION_AUDIT_TARGET_TYPES.has(targetType)) {\n throw new Error('retention audit targetType is not supported');\n }\n return targetType;\n}\n\nfunction normalizeOptionalTargetId(value: string | undefined): string | undefined {\n if (value === undefined) return undefined;\n const targetId = value.trim();\n return targetId.length > 0 ? targetId : undefined;\n}\n\nfunction normalizePositiveInteger(value: number | undefined, fallback: number, label: string): number {\n if (value === undefined) return fallback;\n if (!Number.isInteger(value) || value <= 0 || value > 10000) {\n throw new Error(`${label} must be a positive integer <= 10000`);\n }\n return value;\n}\n\nfunction normalizeScore(value: number | null): number | undefined {\n if (typeof value !== 'number' || Number.isNaN(value)) return undefined;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction parseStringArray(value: string | null): string[] {\n if (!value) return [];\n try {\n const parsed = JSON.parse(value);\n if (!Array.isArray(parsed)) return [];\n return parsed.filter((item): item is string => typeof item === 'string' && item.length > 0);\n } catch {\n return [];\n }\n}\n\nfunction safeParseObject(value: string | null): Record<string, unknown> | undefined {\n if (!value) return undefined;\n try {\n const parsed = JSON.parse(value);\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction nestedString(root: Record<string, unknown>, path: string[]): string | undefined {\n let cursor: unknown = root;\n for (const key of path) {\n if (!isRecord(cursor)) return undefined;\n cursor = cursor[key];\n }\n return typeof cursor === 'string' && cursor.length > 0 ? cursor : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "import { randomUUID } from 'crypto';\nimport { z } from 'zod';\n\nimport {\n sanitizeGovernanceAuditValue,\n type MemoryGovernanceAuditEntry\n} from './governance-audit.js';\nimport {\n sqliteGet,\n sqliteRun,\n sqliteTransaction,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\n\nconst SafeGovernanceLabelSchema = z.string()\n .trim()\n .min(1)\n .max(128)\n .regex(/^[A-Za-z0-9][A-Za-z0-9._:-]*$/, 'must be a safe label');\n\nconst QuarantineInputSchema = z.object({\n targetType: z.literal('event'),\n targetId: z.string().trim().min(1),\n projectHash: SafeGovernanceLabelSchema,\n actor: SafeGovernanceLabelSchema.default('cml-core'),\n category: SafeGovernanceLabelSchema.default('manual'),\n reason: SafeGovernanceLabelSchema,\n sourceEventIds: z.array(z.string().trim().min(1)).default([]),\n now: z.date().optional()\n});\n\nexport type QuarantineInput = z.input<typeof QuarantineInputSchema>;\ntype ParsedQuarantineInput = z.output<typeof QuarantineInputSchema>;\n\nexport interface GovernanceQuarantineMetadata {\n status: 'active';\n category: string;\n reason: string;\n actor: string;\n expectedProjectHash: string;\n quarantinedAt: string;\n detectedAt: string;\n}\n\nexport interface GovernanceQuarantineResult {\n targetType: 'event';\n targetId: string;\n projectHash: string;\n changed: boolean;\n quarantine: GovernanceQuarantineMetadata;\n auditEntry?: MemoryGovernanceAuditEntry;\n}\n\nexport interface GovernanceServiceOptions {\n /** @internal Test hook used to simulate a stale row between validation and write. */\n beforeQuarantineUpdate?: () => void;\n}\n\ninterface EventMetadataRow {\n id: string;\n metadata: string | null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction getNestedString(root: Record<string, unknown> | undefined, path: string[]): string | undefined {\n let cursor: unknown = root;\n for (const key of path) {\n if (!isRecord(cursor)) return undefined;\n cursor = cursor[key];\n }\n return typeof cursor === 'string' && cursor.trim().length > 0 ? cursor.trim() : undefined;\n}\n\nfunction parseMetadata(value: unknown): Record<string, unknown> {\n if (!value) return {};\n if (isRecord(value)) return { ...value };\n if (typeof value !== 'string') return {};\n try {\n const parsed = JSON.parse(value);\n return isRecord(parsed) ? { ...parsed } : {};\n } catch {\n return {};\n }\n}\n\nfunction metadataProjectHash(metadata: Record<string, unknown>): string | undefined {\n return getNestedString(metadata, ['scope', 'project', 'hash'])\n ?? getNestedString(metadata, ['projectHash']);\n}\n\nfunction eventToAuditJson(row: EventMetadataRow, metadata: Record<string, unknown>): Record<string, unknown> {\n return {\n id: row.id,\n metadata\n };\n}\n\nfunction appendMetadataTag(metadata: Record<string, unknown>, tag: string): void {\n const tags = Array.isArray(metadata.tags)\n ? metadata.tags.filter((value): value is string => typeof value === 'string' && value.length > 0)\n : [];\n if (!tags.includes(tag)) metadata.tags = [...tags, tag];\n}\n\nfunction createAuditEntryInTransaction(\n db: SQLiteDatabase,\n input: ParsedQuarantineInput,\n beforeJson: Record<string, unknown>,\n afterJson: Record<string, unknown>,\n createdAt: Date\n): MemoryGovernanceAuditEntry {\n const sanitizedTargetId = sanitizeGovernanceAuditValue(input.targetId) as string;\n const sanitizedSourceEventIds = sanitizeGovernanceAuditValue(input.sourceEventIds) as string[];\n const entry: MemoryGovernanceAuditEntry = {\n auditId: randomUUID(),\n operation: 'quarantine',\n actor: input.actor,\n projectHash: input.projectHash,\n targetType: input.targetType,\n targetId: sanitizedTargetId,\n beforeJson: sanitizeGovernanceAuditValue(beforeJson) as Record<string, unknown>,\n afterJson: sanitizeGovernanceAuditValue(afterJson) as Record<string, unknown>,\n sourceEventIds: sanitizedSourceEventIds,\n createdAt\n };\n\n sqliteRun(\n db,\n `INSERT INTO memory_governance_audit (\n audit_id, operation, actor, project_hash, target_type, target_id,\n before_json, after_json, source_event_ids, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n entry.auditId,\n entry.operation,\n entry.actor,\n entry.projectHash ?? null,\n entry.targetType,\n entry.targetId,\n entry.beforeJson === undefined ? null : JSON.stringify(entry.beforeJson),\n entry.afterJson === undefined ? null : JSON.stringify(entry.afterJson),\n JSON.stringify(entry.sourceEventIds),\n entry.createdAt.toISOString()\n ]\n );\n\n return entry;\n}\n\nexport class GovernanceService {\n constructor(\n private readonly db: SQLiteDatabase,\n private readonly options: GovernanceServiceOptions = {}\n ) {}\n\n async quarantine(input: QuarantineInput): Promise<GovernanceQuarantineResult> {\n const parsed = QuarantineInputSchema.parse(input);\n\n return sqliteTransaction(this.db, () => {\n const row = sqliteGet<EventMetadataRow>(\n this.db,\n `SELECT id, metadata FROM events WHERE id = ?`,\n [parsed.targetId]\n );\n if (!row) {\n throw new Error(`event not found: ${parsed.targetId}`);\n }\n\n const metadata = parseMetadata(row.metadata);\n const currentProjectHash = metadataProjectHash(metadata);\n if (!currentProjectHash) {\n throw new Error(`Cannot quarantine event without explicit project scope: ${parsed.targetId}`);\n }\n if (currentProjectHash !== parsed.projectHash) {\n throw new Error(`event projectHash mismatch: event uses ${currentProjectHash} but input uses ${parsed.projectHash}`);\n }\n\n const now = parsed.now ?? new Date();\n const nowIso = now.toISOString();\n const quarantine: GovernanceQuarantineMetadata = {\n status: 'active',\n category: parsed.category,\n reason: parsed.reason,\n actor: parsed.actor,\n expectedProjectHash: parsed.projectHash,\n quarantinedAt: nowIso,\n detectedAt: nowIso\n };\n const beforeMetadata = { ...metadata };\n const afterMetadata: Record<string, unknown> = {\n ...metadata,\n quarantine: {\n ...(isRecord(metadata.quarantine) ? metadata.quarantine : {}),\n ...quarantine\n }\n };\n appendMetadataTag(afterMetadata, `quarantine:${parsed.category}`);\n\n const changed = JSON.stringify(beforeMetadata) !== JSON.stringify(afterMetadata);\n if (!changed) {\n return {\n targetType: parsed.targetType,\n targetId: parsed.targetId,\n projectHash: parsed.projectHash,\n changed,\n quarantine\n };\n }\n\n this.options.beforeQuarantineUpdate?.();\n const updateResult = sqliteRun(\n this.db,\n `UPDATE events SET metadata = ? WHERE id = ? AND metadata IS ?`,\n [JSON.stringify(afterMetadata), parsed.targetId, row.metadata]\n );\n if (updateResult.changes !== 1) {\n throw new Error(`event changed during quarantine validation; retry: ${parsed.targetId}`);\n }\n const auditEntry = createAuditEntryInTransaction(\n this.db,\n parsed,\n eventToAuditJson(row, beforeMetadata),\n eventToAuditJson(row, afterMetadata),\n now\n );\n\n return {\n targetType: parsed.targetType,\n targetId: parsed.targetId,\n projectHash: parsed.projectHash,\n changed,\n quarantine,\n auditEntry\n };\n });\n }\n}\n", "import { sqliteAll, type SQLiteDatabase } from '../sqlite-wrapper.js';\nimport type { NodeType, RelationType } from '../types.js';\n\nexport type GraphPathDirection = 'outgoing' | 'incoming' | 'both';\n\nexport interface GraphNodeRef {\n type: NodeType;\n id: string;\n}\n\nexport interface GraphPathNode extends GraphNodeRef {\n name: string;\n}\n\nexport interface GraphPathStep {\n edgeId: string;\n relationType: RelationType;\n direction: 'outgoing' | 'incoming';\n from: GraphPathNode;\n to: GraphPathNode;\n weight: number;\n cost: number;\n scoreContribution: number;\n}\n\nexport interface GraphPathResult {\n target: GraphPathNode;\n hops: number;\n totalCost: number;\n scoreContribution: number;\n steps: GraphPathStep[];\n}\n\nexport interface GraphPathExpandInput {\n startNodes: GraphNodeRef[];\n maxHops?: number;\n maxResults?: number;\n direction?: GraphPathDirection;\n}\n\nexport interface GraphPathExpandResult {\n startNodes: GraphPathNode[];\n effectiveMaxHops: number;\n paths: GraphPathResult[];\n}\n\ninterface EdgeRow {\n edge_id: string;\n src_type: string;\n src_id: string;\n rel_type: string;\n dst_type: string;\n dst_id: string;\n meta_json: string | null;\n}\n\ninterface EntityLabelRow {\n entity_id: string;\n title: string;\n}\n\ninterface TraversalEdge {\n toKey: string;\n step: GraphPathStep;\n}\n\ninterface PathState {\n key: string;\n hops: number;\n totalCost: number;\n steps: GraphPathStep[];\n visited: Set<string>;\n}\n\ninterface BestPath {\n hops: number;\n totalCost: number;\n signature: string;\n steps: GraphPathStep[];\n}\n\nconst DEFAULT_WEIGHT = 0.5;\nconst MAX_HOPS = 2;\nconst DEFAULT_MAX_RESULTS = 20;\nconst MAX_RESULTS = 100;\n\nexport class GraphPathService {\n constructor(private db: SQLiteDatabase) {}\n\n expand(input: GraphPathExpandInput): GraphPathExpandResult {\n const graph = this.loadGraph(input.direction ?? 'both');\n const effectiveMaxHops = normalizeMaxHops(input.maxHops);\n const maxResults = normalizeMaxResults(input.maxResults);\n const startNodes = input.startNodes.map(node => graph.node(node));\n const startKeys = new Set(input.startNodes.map(nodeKey));\n const bestByTarget = new Map<string, BestPath>();\n const queue: PathState[] = startNodes.map(node => ({\n key: nodeKey(node),\n hops: 0,\n totalCost: 0,\n steps: [],\n visited: new Set([nodeKey(node)])\n }));\n\n while (queue.length > 0) {\n queue.sort((a, b) => a.totalCost - b.totalCost || a.hops - b.hops || a.key.localeCompare(b.key));\n const current = queue.shift()!;\n if (current.hops >= effectiveMaxHops) continue;\n\n for (const edge of graph.adjacency.get(current.key) ?? []) {\n if (current.visited.has(edge.toKey)) continue;\n const nextHops = current.hops + 1;\n const nextTotalCost = current.totalCost + edge.step.cost;\n const nextSteps = [...current.steps, edge.step];\n const nextSignature = pathSignature(nextSteps);\n const existing = bestByTarget.get(edge.toKey);\n\n if (!existing || isBetterPath(nextTotalCost, nextHops, nextSignature, existing)) {\n if (!startKeys.has(edge.toKey)) {\n bestByTarget.set(edge.toKey, { hops: nextHops, totalCost: nextTotalCost, signature: nextSignature, steps: nextSteps });\n }\n const nextVisited = new Set(current.visited);\n nextVisited.add(edge.toKey);\n queue.push({\n key: edge.toKey,\n hops: nextHops,\n totalCost: nextTotalCost,\n steps: nextSteps,\n visited: nextVisited\n });\n }\n }\n }\n\n const paths = Array.from(bestByTarget.entries())\n .map(([key, path]) => ({\n target: graph.node(nodeFromKey(key)),\n hops: path.hops,\n totalCost: path.totalCost,\n scoreContribution: path.totalCost > 0 ? 1 / path.totalCost : 0,\n steps: path.steps\n }))\n .sort((a, b) => b.scoreContribution - a.scoreContribution || a.hops - b.hops || a.target.name.localeCompare(b.target.name))\n .slice(0, maxResults);\n\n return { startNodes, effectiveMaxHops, paths };\n }\n\n private loadGraph(direction: GraphPathDirection): { adjacency: Map<string, TraversalEdge[]>; node: (node: GraphNodeRef) => GraphPathNode } {\n const entityLabels = new Map(\n sqliteAll<EntityLabelRow>(this.db, `SELECT entity_id, title FROM entities WHERE status = 'active'`)\n .map(row => [row.entity_id, row.title] as const)\n );\n const labelNode = (node: GraphNodeRef): GraphPathNode => ({\n ...node,\n name: node.type === 'entity' ? entityLabels.get(node.id) ?? node.id : node.id\n });\n const adjacency = new Map<string, TraversalEdge[]>();\n const edges = sqliteAll<EdgeRow>(\n this.db,\n `SELECT edge_id, src_type, src_id, rel_type, dst_type, dst_id, meta_json FROM edges`\n );\n\n for (const edge of edges) {\n const src = labelNode({ type: edge.src_type as NodeType, id: edge.src_id });\n const dst = labelNode({ type: edge.dst_type as NodeType, id: edge.dst_id });\n const weight = edgeWeight(edge.meta_json);\n const cost = 1 / weight;\n const baseStep = {\n edgeId: edge.edge_id,\n relationType: edge.rel_type as RelationType,\n from: src,\n to: dst,\n weight,\n cost,\n scoreContribution: weight\n };\n\n if (direction === 'outgoing' || direction === 'both') {\n addTraversal(adjacency, nodeKey(src), {\n toKey: nodeKey(dst),\n step: { ...baseStep, direction: 'outgoing' }\n });\n }\n if (direction === 'incoming' || direction === 'both') {\n addTraversal(adjacency, nodeKey(dst), {\n toKey: nodeKey(src),\n step: { ...baseStep, direction: 'incoming' }\n });\n }\n }\n\n return { adjacency, node: labelNode };\n }\n}\n\nfunction addTraversal(adjacency: Map<string, TraversalEdge[]>, fromKey: string, edge: TraversalEdge): void {\n const edges = adjacency.get(fromKey) ?? [];\n edges.push(edge);\n adjacency.set(fromKey, edges);\n}\n\nfunction normalizeMaxHops(maxHops?: number): number {\n if (maxHops === undefined) return 1;\n if (!Number.isFinite(maxHops)) return MAX_HOPS;\n return Math.min(Math.max(0, Math.trunc(maxHops)), MAX_HOPS);\n}\n\nfunction normalizeMaxResults(maxResults?: number): number {\n if (maxResults === undefined) return DEFAULT_MAX_RESULTS;\n if (!Number.isFinite(maxResults)) return DEFAULT_MAX_RESULTS;\n return Math.min(Math.max(0, Math.trunc(maxResults)), MAX_RESULTS);\n}\n\nfunction isBetterPath(totalCost: number, hops: number, signature: string, existing: BestPath): boolean {\n return totalCost < existing.totalCost\n || (totalCost === existing.totalCost && hops < existing.hops)\n || (totalCost === existing.totalCost && hops === existing.hops && signature < existing.signature);\n}\n\nfunction pathSignature(steps: GraphPathStep[]): string {\n return steps\n .map(step => `${step.edgeId}:${step.direction}:${nodeKey(step.from)}>${nodeKey(step.to)}`)\n .join('|');\n}\n\nfunction edgeWeight(metaJson: string | null): number {\n const meta = parseMeta(metaJson);\n const raw = meta.weight;\n if (typeof raw === 'number' && Number.isFinite(raw) && raw > 0) return raw;\n if (typeof raw === 'string') {\n const parsed = Number(raw);\n if (Number.isFinite(parsed) && parsed > 0) return parsed;\n }\n return DEFAULT_WEIGHT;\n}\n\nfunction parseMeta(metaJson: string | null): Record<string, unknown> {\n if (!metaJson) return {};\n try {\n const parsed = JSON.parse(metaJson);\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed as Record<string, unknown> : {};\n } catch {\n return {};\n }\n}\n\nfunction nodeKey(node: GraphNodeRef): string {\n return `${node.type}:${node.id}`;\n}\n\nfunction nodeFromKey(key: string): GraphNodeRef {\n const index = key.indexOf(':');\n if (index === -1) return { type: 'entity', id: key };\n return { type: key.slice(0, index) as NodeType, id: key.slice(index + 1) };\n}\n", "import { sqliteAll, type SQLiteDatabase } from '../sqlite-wrapper.js';\nimport type { EntityType } from '../types.js';\n\nexport type QueryEntityCandidateSource =\n | 'entity_alias'\n | 'quoted'\n | 'file_path'\n | 'package_identifier'\n | 'capitalized_term';\n\nexport interface QueryEntityCandidate {\n text: string;\n normalized: string;\n source: QueryEntityCandidateSource;\n confidence: number;\n start: number;\n end: number;\n entityId?: string;\n entityType?: EntityType;\n canonicalKey?: string;\n matchedAlias?: string;\n}\n\nexport interface QueryEntityExtractionOptions {\n maxCandidates?: number;\n includeAliases?: boolean;\n}\n\nexport interface QueryEntityExtractionResult {\n query: string;\n candidates: QueryEntityCandidate[];\n}\n\ninterface AliasRow {\n entity_id: string;\n entity_type: string;\n entity_canonical_key: string;\n alias_key: string;\n title: string;\n}\n\ninterface CandidateDraft extends QueryEntityCandidate {\n priority: number;\n}\n\ninterface TokenMatch {\n text: string;\n start: number;\n end: number;\n}\n\nconst DEFAULT_MAX_CANDIDATES = 20;\nconst MAX_CANDIDATES = 100;\nconst MAX_CANDIDATE_TEXT_LENGTH = 200;\n\nconst SOURCE_PRIORITY: Record<QueryEntityCandidateSource, number> = {\n entity_alias: 0,\n quoted: 1,\n file_path: 2,\n package_identifier: 3,\n capitalized_term: 4\n};\n\nconst SOURCE_CONFIDENCE: Record<QueryEntityCandidateSource, number> = {\n entity_alias: 0.95,\n quoted: 0.85,\n file_path: 0.8,\n package_identifier: 0.75,\n capitalized_term: 0.6\n};\n\nconst SENTENCE_START_STOPWORDS = new Set([\n 'A',\n 'An',\n 'And',\n 'Are',\n 'Can',\n 'Compare',\n 'Does',\n 'Explain',\n 'Find',\n 'How',\n 'I',\n 'If',\n 'In',\n 'Is',\n 'List',\n 'Please',\n 'Should',\n 'Show',\n 'Tell',\n 'The',\n 'This',\n 'Use',\n 'What',\n 'When',\n 'Where',\n 'Which',\n 'Why',\n 'With'\n]);\n\nexport class QueryEntityExtractor {\n constructor(private db?: SQLiteDatabase) {}\n\n extract(query: string, options: QueryEntityExtractionOptions = {}): QueryEntityExtractionResult {\n const maxCandidates = normalizeMaxCandidates(options.maxCandidates);\n const candidates: CandidateDraft[] = [];\n const quotedRanges = this.extractQuoted(query, candidates);\n\n if (options.includeAliases !== false) {\n this.extractKnownAliases(query, candidates);\n }\n\n this.extractFilePaths(query, candidates);\n this.extractPackageIdentifiers(query, candidates);\n this.extractCapitalizedTerms(query, candidates, quotedRanges);\n\n return {\n query,\n candidates: dedupeAndSort(candidates).slice(0, maxCandidates).map(stripPriority)\n };\n }\n\n private extractQuoted(query: string, candidates: CandidateDraft[]): Array<[number, number]> {\n const ranges: Array<[number, number]> = [];\n const regex = /([\"'`])((?:(?!\\1)[^\\n]){2,200})\\1/g;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(query)) !== null) {\n const text = cleanCandidateText(match[2] ?? '');\n if (!isUsefulCandidate(text)) continue;\n const start = match.index + 1;\n const end = start + text.length;\n ranges.push([match.index, match.index + match[0].length]);\n pushCandidate(candidates, {\n text,\n source: 'quoted',\n start,\n end\n });\n }\n return ranges;\n }\n\n private extractKnownAliases(query: string, candidates: CandidateDraft[]): void {\n if (!this.db) return;\n const rows = sqliteAll<AliasRow>(\n this.db,\n `SELECT\n a.entity_id,\n a.entity_type,\n a.canonical_key AS alias_key,\n e.canonical_key AS entity_canonical_key,\n e.title\n FROM entity_aliases a\n JOIN entities e ON e.entity_id = a.entity_id\n WHERE e.status = 'active'\n ORDER BY e.title COLLATE NOCASE, a.canonical_key COLLATE NOCASE`\n );\n const normalizedQuery = normalizeForContainment(query);\n const seenAliases = new Set<string>();\n\n for (const row of rows) {\n const aliasLabels = uniqueStrings([\n row.title,\n aliasLabelFromCanonicalKey(row.alias_key),\n aliasLabelFromCanonicalKey(row.entity_canonical_key)\n ]).filter(isUsefulCandidate);\n\n for (const alias of aliasLabels) {\n const normalizedAlias = normalizeForContainment(alias);\n if (!normalizedAlias || !containsPhrase(normalizedQuery, normalizedAlias)) continue;\n const aliasKey = `${row.entity_id}:${normalizedAlias}`;\n if (seenAliases.has(aliasKey)) continue;\n seenAliases.add(aliasKey);\n const range = findRange(query, alias);\n pushCandidate(candidates, {\n text: row.title,\n source: 'entity_alias',\n start: range.start,\n end: range.end,\n entityId: row.entity_id,\n entityType: row.entity_type as EntityType,\n canonicalKey: row.entity_canonical_key,\n matchedAlias: normalizedAlias\n });\n }\n }\n }\n\n private extractFilePaths(query: string, candidates: CandidateDraft[]): void {\n const regex = /(^|[\\s([{<])((?:\\.{1,2}\\/|~\\/|\\/)?(?:[A-Za-z0-9_.-]+\\/)+[A-Za-z0-9_.-]+\\.[A-Za-z0-9][A-Za-z0-9._-]*)(?=$|[\\s)\\]},>`.,;:!?])/g;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(query)) !== null) {\n const text = cleanCandidateText(match[2] ?? '');\n if (!isUsefulCandidate(text)) continue;\n const start = match.index + (match[1]?.length ?? 0);\n pushCandidate(candidates, {\n text,\n source: 'file_path',\n start,\n end: start + text.length\n });\n }\n }\n\n private extractPackageIdentifiers(query: string, candidates: CandidateDraft[]): void {\n const regex = /(^|[\\s([{<`])(@[a-z0-9][a-z0-9._-]*\\/[a-z0-9][a-z0-9._-]*|[a-z0-9][a-z0-9._]*[-_][a-z0-9._-]*)(?=$|[\\s)\\]},>`.,;:!?])/gi;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(query)) !== null) {\n const text = cleanCandidateText(match[2] ?? '');\n if (!isUsefulCandidate(text) || text.includes('/.') || text.includes('./')) continue;\n const start = match.index + (match[1]?.length ?? 0);\n pushCandidate(candidates, {\n text,\n source: 'package_identifier',\n start,\n end: start + text.length\n });\n }\n }\n\n private extractCapitalizedTerms(query: string, candidates: CandidateDraft[], ignoredRanges: Array<[number, number]>): void {\n const tokens = collectCapitalizedTokens(query)\n .filter(token => !isInsideAnyRange(token.start, ignoredRanges))\n .filter(token => !SENTENCE_START_STOPWORDS.has(token.text));\n const groups: TokenMatch[][] = [];\n let current: TokenMatch[] = [];\n\n for (const token of tokens) {\n const previous = current[current.length - 1];\n if (previous && query.slice(previous.end, token.start).match(/^\\s+$/)) {\n current.push(token);\n } else {\n if (current.length > 0) groups.push(current);\n current = [token];\n }\n }\n if (current.length > 0) groups.push(current);\n\n for (const group of groups) {\n if (group.length === 1 && !isStrongSingleCapitalized(group[0].text)) continue;\n const start = group[0].start;\n const end = group[group.length - 1].end;\n const text = query.slice(start, end);\n if (!isUsefulCandidate(text)) continue;\n pushCandidate(candidates, {\n text,\n source: 'capitalized_term',\n start,\n end\n });\n }\n }\n}\n\nfunction collectCapitalizedTokens(query: string): TokenMatch[] {\n const regex = /\\b(?:[A-Z]{2,}[A-Z0-9]*|[A-Z][A-Za-z0-9]*(?:[._-][A-Za-z0-9]+)*)\\b/g;\n const tokens: TokenMatch[] = [];\n let match: RegExpExecArray | null;\n while ((match = regex.exec(query)) !== null) {\n tokens.push({ text: match[0], start: match.index, end: match.index + match[0].length });\n }\n return tokens;\n}\n\nfunction pushCandidate(\n candidates: CandidateDraft[],\n input: Omit<CandidateDraft, 'normalized' | 'confidence' | 'priority'> & Partial<Pick<CandidateDraft, 'confidence'>>\n): void {\n const text = cleanCandidateText(input.text);\n if (!isUsefulCandidate(text)) return;\n const source = input.source;\n candidates.push({\n ...input,\n text,\n normalized: normalizeCandidate(text),\n confidence: input.confidence ?? SOURCE_CONFIDENCE[source],\n priority: SOURCE_PRIORITY[source]\n });\n}\n\nfunction dedupeAndSort(candidates: CandidateDraft[]): CandidateDraft[] {\n const sorted = [...candidates].sort(compareCandidates);\n const seenAliasKeys = new Set<string>();\n const seenNormalized = new Set<string>();\n const result: CandidateDraft[] = [];\n\n for (const candidate of sorted) {\n if (candidate.source === 'entity_alias') {\n const aliasKey = `alias:${candidate.entityId ?? ''}:${normalizeCandidate(candidate.matchedAlias ?? candidate.text)}`;\n if (seenAliasKeys.has(aliasKey)) continue;\n seenAliasKeys.add(aliasKey);\n seenNormalized.add(candidate.normalized);\n result.push(candidate);\n continue;\n }\n\n if (seenNormalized.has(candidate.normalized)) continue;\n seenNormalized.add(candidate.normalized);\n result.push(candidate);\n }\n\n return result.sort(compareCandidates);\n}\n\nfunction compareCandidates(a: CandidateDraft, b: CandidateDraft): number {\n return a.priority - b.priority\n || a.start - b.start\n || a.end - b.end\n || compareStrings(a.text, b.text)\n || compareStrings(a.entityId ?? '', b.entityId ?? '')\n || compareStrings(a.matchedAlias ?? '', b.matchedAlias ?? '');\n}\n\nfunction compareStrings(a: string, b: string): number {\n if (a === b) return 0;\n return a < b ? -1 : 1;\n}\n\nfunction stripPriority(candidate: CandidateDraft): QueryEntityCandidate {\n const { priority: _priority, ...publicCandidate } = candidate;\n return publicCandidate;\n}\n\nfunction normalizeMaxCandidates(maxCandidates?: number): number {\n if (maxCandidates === undefined) return DEFAULT_MAX_CANDIDATES;\n if (!Number.isFinite(maxCandidates)) return DEFAULT_MAX_CANDIDATES;\n return Math.min(Math.max(0, Math.trunc(maxCandidates)), MAX_CANDIDATES);\n}\n\nfunction cleanCandidateText(text: string): string {\n return text.normalize('NFKC').replace(/\\s+/g, ' ').trim().replace(/[.,;:!?]+$/g, '');\n}\n\nfunction normalizeCandidate(text: string): string {\n return cleanCandidateText(text).toLowerCase();\n}\n\nfunction normalizeForContainment(text: string): string {\n return text\n .normalize('NFKC')\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}@/._-]+/gu, ' ')\n .replace(/[._-]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nfunction containsPhrase(normalizedHaystack: string, normalizedNeedle: string): boolean {\n return (` ${normalizedHaystack} `).includes(` ${normalizedNeedle} `);\n}\n\nfunction aliasLabelFromCanonicalKey(canonicalKey: string): string {\n const raw = canonicalKey.includes(':') ? canonicalKey.slice(canonicalKey.lastIndexOf(':') + 1) : canonicalKey;\n return raw.replace(/[._-]+/g, ' ').replace(/\\s+/g, ' ').trim();\n}\n\nfunction findRange(query: string, alias: string): { start: number; end: number } {\n const normalizedAlias = normalizeForContainment(alias);\n const directIndex = query.toLowerCase().indexOf(alias.toLowerCase());\n if (directIndex >= 0) return { start: directIndex, end: directIndex + alias.length };\n\n const normalizedQuery = normalizeForContainment(query);\n const normalizedIndex = normalizedQuery.indexOf(normalizedAlias);\n if (normalizedIndex < 0) return { start: 0, end: 0 };\n\n const queryLower = query.toLowerCase();\n const words = normalizedAlias.split(' ').filter(Boolean);\n if (words.length === 0) return { start: 0, end: 0 };\n const first = queryLower.indexOf(words[0]);\n const lastWord = words[words.length - 1];\n const last = queryLower.indexOf(lastWord, first >= 0 ? first : 0);\n if (first >= 0 && last >= 0) return { start: first, end: last + lastWord.length };\n return { start: normalizedIndex, end: normalizedIndex + normalizedAlias.length };\n}\n\nfunction isUsefulCandidate(text: string): boolean {\n const cleaned = cleanCandidateText(text);\n return cleaned.length >= 2\n && cleaned.length <= MAX_CANDIDATE_TEXT_LENGTH\n && /[\\p{L}\\p{N}]/u.test(cleaned);\n}\n\nfunction isInsideAnyRange(index: number, ranges: Array<[number, number]>): boolean {\n return ranges.some(([start, end]) => index >= start && index < end);\n}\n\nfunction isStrongSingleCapitalized(text: string): boolean {\n if (/^[A-Z]{2,}[A-Z0-9]*$/.test(text)) return true;\n if (/^[A-Z][a-z]+[A-Z][A-Za-z0-9]*$/.test(text)) return true;\n return text.length >= 4 && !SENTENCE_START_STOPWORDS.has(text);\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const value of values) {\n const key = normalizeForContainment(value);\n if (!key || seen.has(key)) continue;\n seen.add(key);\n result.push(value);\n }\n return result;\n}\n", "import { createHash } from 'crypto';\nimport { z } from 'zod';\n\nimport { sqliteAll, type SQLiteDatabase } from '../sqlite-wrapper.js';\nimport { sanitizeGovernanceAuditValue } from './governance-audit.js';\n\nconst NonEmptyStringSchema = z.string()\n .transform((value) => value.trim())\n .pipe(z.string().min(1));\n\nexport const LessonCandidateInputSchema = z.object({\n projectHash: NonEmptyStringSchema,\n minSessions: z.number().int().min(2).max(10).default(2),\n limit: z.number().int().positive().max(100).default(25),\n eventLimit: z.number().int().positive().max(10_000).default(2_000),\n maxSourceEventIds: z.number().int().positive().max(100).default(20)\n});\nexport type LessonCandidateInput = z.input<typeof LessonCandidateInputSchema>;\n\ntype ParsedLessonCandidateInput = z.output<typeof LessonCandidateInputSchema>;\n\nexport interface LessonCandidate {\n candidateId: string;\n projectHash: string;\n name: string;\n trigger: string;\n steps: string[];\n confidence: number;\n sourceSessionIds: string[];\n sourceEventIds: string[];\n failureModes: string[];\n skillCandidate: boolean;\n pattern: {\n tools: string[];\n fileCategories: string[];\n taskPatterns: string[];\n };\n reasons: string[];\n}\n\nexport interface LessonCandidateResult {\n scannedSessions: number;\n eligibleSessions: number;\n skippedSessions: number;\n groupedPatterns: number;\n candidates: LessonCandidate[];\n}\n\ninterface EventRow {\n id: string;\n event_type: string;\n session_id: string;\n timestamp: string;\n content: string;\n metadata: string | null;\n}\n\ninterface SessionProfile {\n sessionId: string;\n firstTimestamp: string;\n eventIds: string[];\n sourceEventIds: string[];\n successEventIds: string[];\n tools: Set<ToolPattern>;\n fileCategories: Set<string>;\n taskPatterns: Set<string>;\n successSignals: Set<ToolPattern>;\n hasFailureSignal: boolean;\n hasPrivacyConflict: boolean;\n}\n\ntype ToolPattern = typeof TOOL_ORDER[number];\n\nconst TOOL_ORDER = [\n 'focused-test',\n 'typecheck',\n 'build',\n 'full-suite',\n 'static-privacy-scan',\n 'verified-commit',\n 'diff-check'\n] as const;\n\nconst TOOL_STEPS: Record<ToolPattern, string> = {\n 'focused-test': 'Run focused tests for the changed files',\n typecheck: 'Run typecheck',\n build: 'Run build',\n 'full-suite': 'Run the full test suite',\n 'static-privacy-scan': 'Run the static/privacy scan',\n 'verified-commit': 'Commit verified changes',\n 'diff-check': 'Run git diff checks'\n};\n\nconst TOOL_LABELS: Record<ToolPattern, string> = {\n 'focused-test': 'focused tests',\n typecheck: 'typecheck',\n build: 'build',\n 'full-suite': 'full suite',\n 'static-privacy-scan': 'static/privacy scan',\n 'verified-commit': 'verified commit',\n 'diff-check': 'diff check'\n};\n\nfunction sanitizeString(value: string): string {\n return String(sanitizeGovernanceAuditValue(value)).trim();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parseMetadata(value: unknown): Record<string, unknown> | undefined {\n if (!value) return undefined;\n if (isRecord(value)) return value;\n if (typeof value !== 'string') return undefined;\n try {\n const parsed = JSON.parse(value);\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction nestedValue(root: Record<string, unknown> | undefined, path: string[]): unknown {\n let cursor: unknown = root;\n for (const key of path) {\n if (!isRecord(cursor)) return undefined;\n cursor = cursor[key];\n }\n return cursor;\n}\n\nfunction nestedString(root: Record<string, unknown> | undefined, path: string[]): string | undefined {\n const value = nestedValue(root, path);\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction projectHashFromMetadata(metadata: Record<string, unknown> | undefined): string | undefined {\n const direct = typeof metadata?.projectHash === 'string' ? metadata.projectHash.trim() : undefined;\n return nestedString(metadata, ['scope', 'project', 'hash']) ?? direct;\n}\n\nfunction hasActiveQuarantine(metadata: Record<string, unknown> | undefined): boolean {\n const quarantine = nestedValue(metadata, ['quarantine']);\n return isRecord(quarantine) && quarantine.status === 'active';\n}\n\nfunction hasPrivacyConflict(metadata: Record<string, unknown> | undefined): boolean {\n if (!metadata) return false;\n const tags = Array.isArray(metadata.tags)\n ? metadata.tags.map((tag) => String(tag).toLowerCase())\n : [];\n const privacy = nestedString(metadata, ['privacy', 'classification'])\n ?? nestedString(metadata, ['privacy', 'level'])\n ?? (typeof metadata.privacy === 'string' ? metadata.privacy : undefined);\n return hasActiveQuarantine(metadata)\n || metadata.private === true\n || metadata.isPrivate === true\n || metadata.visibility === 'private'\n || privacy === 'private'\n || tags.includes('private')\n || tags.includes('privacy:private');\n}\n\nfunction isFailureSignal(content: string): boolean {\n const lower = content.toLowerCase();\n return /\\bexit[_ -]?code\\s*[:=]?\\s*[1-9]\\d*\\b/.test(lower)\n || /\\bfailed\\b|\\bfailure\\b|\\berror\\b|\\bblocked\\b/.test(lower)\n || /\\[blocked\\]/.test(lower);\n}\n\nfunction isSuccessSignal(content: string): boolean {\n const lower = content.toLowerCase();\n if (isFailureSignal(content)) return false;\n return /\\bexit[_ -]?code\\s*[:=]?\\s*0\\b/.test(lower)\n || /\\bpassed\\b|\\bsuccess(?:ful)?\\b|\\bcompleted\\b|\\bcommitted\\b|\\[verified\\]/.test(lower)\n || /\\bstaged_static_scan_findings\\s*=\\s*0\\b/.test(lower)\n || /\\bdoc_static_scan_findings\\s*=\\s*0\\b/.test(lower);\n}\n\nfunction extractToolPatterns(content: string): Set<ToolPattern> {\n const lower = content.toLowerCase();\n const tools = new Set<ToolPattern>();\n\n if (/\\bnpm\\s+(?:run\\s+)?test\\b|\\bvitest\\b|\\bpytest\\b/.test(lower)) {\n const focused = /\\btests?\\/|\\.test\\.|\\.spec\\.|--run\\s+tests?\\//.test(lower);\n tools.add(focused ? 'focused-test' : 'full-suite');\n }\n if (/\\bnpm\\s+run\\s+typecheck\\b|\\btsc\\s+--noemit\\b|\\btypecheck\\b/.test(lower)) {\n tools.add('typecheck');\n }\n if (/\\bnpm\\s+run\\s+build\\b|\\bpnpm\\s+build\\b|\\byarn\\s+build\\b|\\btsc\\s+-b\\b/.test(lower)) {\n tools.add('build');\n }\n if (/\\bstaged_static_scan_findings\\s*=\\s*0\\b|\\bdoc_static_scan_findings\\s*=\\s*0\\b|static\\/privacy scan|secretlint/.test(lower)) {\n tools.add('static-privacy-scan');\n }\n if (/\\bgit\\s+commit\\b|\\[verified\\]/.test(lower)) {\n tools.add('verified-commit');\n }\n if (/\\bgit\\s+diff\\b.*--check/.test(lower)) {\n tools.add('diff-check');\n }\n\n return tools;\n}\n\nfunction extractFileCategories(content: string): Set<string> {\n const categories = new Set<string>();\n const pathPattern = /(?:^|[\\s`\"'(])((?:src|tests|specs|docs)\\/[A-Za-z0-9._/@-]+(?:\\/[A-Za-z0-9._@-]+)*\\.(?:ts|tsx|js|jsx|mjs|cjs|md|json|yaml|yml|py))/g;\n let match: RegExpExecArray | null;\n while ((match = pathPattern.exec(content)) !== null) {\n const path = match[1] ?? '';\n const extensionMatch = /\\.([A-Za-z0-9]+)$/.exec(path);\n const extension = extensionMatch?.[1]?.toLowerCase();\n if (!extension) continue;\n if (path.startsWith('tests/')) {\n categories.add(`test:${extension}`);\n } else if (path.startsWith('src/')) {\n categories.add(`source:${extension}`);\n } else if (path.startsWith('docs/') || path.startsWith('specs/')) {\n categories.add(`docs:${extension}`);\n }\n }\n return categories;\n}\n\nfunction extractTaskPatterns(content: string): Set<string> {\n const lower = content.toLowerCase();\n const patterns = new Set<string>();\n if (/\\bimplement\\b|\\bcreate\\b|\\badd\\b|\\bmodify\\b|\\bpatch\\b|\\bfix\\b|\\brefactor\\b/.test(lower)) {\n patterns.add('code-change');\n }\n if (/\\btest\\b|\\btypecheck\\b|\\bbuild\\b|\\bvalidation\\b|\\bvalidate\\b/.test(lower)) {\n patterns.add('validation');\n }\n if (/\\bcommit\\b|\\[verified\\]/.test(lower)) {\n patterns.add('verified-commit');\n }\n if (/\\bdoc(?:s|umentation)?\\b|\\bspec\\b|\\bplan\\b/.test(lower)) {\n patterns.add('docs-or-spec');\n }\n return patterns;\n}\n\nfunction orderedTools(tools: Set<ToolPattern>): ToolPattern[] {\n return TOOL_ORDER.filter((tool) => tools.has(tool));\n}\n\nfunction sortedStrings(values: Iterable<string>): string[] {\n return Array.from(new Set(Array.from(values))).sort((a, b) => a.localeCompare(b));\n}\n\nfunction uniqueStrings(values: Iterable<string>, limit?: number): string[] {\n const unique: string[] = [];\n const seen = new Set<string>();\n for (const value of Array.from(values)) {\n const normalized = value.trim();\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n unique.push(normalized);\n if (limit !== undefined && unique.length >= limit) break;\n }\n return unique;\n}\n\nfunction profileSignature(profile: SessionProfile): string | null {\n const tools = orderedTools(profile.tools).filter((tool) => tool !== 'diff-check');\n const fileCategories = sortedStrings(profile.fileCategories);\n const taskPatterns = sortedStrings(profile.taskPatterns);\n if (tools.length < 2) return null;\n if (fileCategories.length === 0 && taskPatterns.length === 0) return null;\n const taskKey = taskPatterns.includes('code-change') ? 'code-change' : taskPatterns[0] ?? 'task';\n return `tools:${tools.join('+')}|files:${fileCategories.join('+') || 'none'}|task:${taskKey}`;\n}\n\nfunction hasEnoughSuccess(profile: SessionProfile): boolean {\n if (profile.hasFailureSignal) return false;\n if (profile.successEventIds.length === 0) return false;\n const successTools = profile.successSignals;\n const testSignal = successTools.has('focused-test') || successTools.has('full-suite');\n const validationSignal = successTools.has('typecheck') || successTools.has('build') || successTools.has('static-privacy-scan');\n return successTools.has('verified-commit') || (testSignal && validationSignal);\n}\n\nfunction confidenceForGroup(group: SessionProfile[], tools: ToolPattern[], fileCategories: string[], taskPatterns: string[]): number {\n const sessionBonus = Math.min(0.15, (group.length - 2) * 0.05);\n const toolBonus = Math.min(0.18, tools.length * 0.03);\n const evidenceBonus = fileCategories.length > 0 ? 0.04 : 0;\n const taskBonus = taskPatterns.length > 0 ? 0.03 : 0;\n return Math.min(0.95, Math.round((0.58 + sessionBonus + toolBonus + evidenceBonus + taskBonus) * 100) / 100);\n}\n\nfunction candidateIdFor(projectHash: string, signature: string): string {\n return `lesson-candidate:${createHash('sha256').update(`${projectHash}\\n${signature}`).digest('hex').slice(0, 16)}`;\n}\n\nfunction sanitizeArray(values: string[]): string[] {\n return values.map(sanitizeString).filter((value) => value.length > 0);\n}\n\nfunction createCandidate(\n projectHash: string,\n signature: string,\n group: SessionProfile[],\n maxSourceEventIds: number\n): LessonCandidate {\n const toolSets = group.map((profile) => profile.tools);\n const fileSets = group.map((profile) => profile.fileCategories);\n const taskSets = group.map((profile) => profile.taskPatterns);\n const tools = orderedTools(intersectionSets(toolSets)).filter((tool) => tool !== 'diff-check');\n const fileCategories = sortedStrings(intersectionSets(fileSets));\n const taskPatterns = sortedStrings(intersectionSets(taskSets));\n const sourceSessionIds = group.map((profile) => profile.sessionId).sort((a, b) => a.localeCompare(b));\n const sourceEventIds = uniqueStrings(\n group.flatMap((profile) => profile.successEventIds.length > 0 ? profile.successEventIds : profile.sourceEventIds),\n maxSourceEventIds\n );\n const labels = tools.map((tool) => TOOL_LABELS[tool]);\n const steps = tools.map((tool) => TOOL_STEPS[tool]);\n const name = `Workflow pattern: ${labels.slice(0, 4).join(' + ')}`;\n const trigger = `When ${taskPatterns.includes('code-change') ? 'code changes' : 'a project task'} repeat across ${group.length} successful sessions with ${labels.join(', ')}`;\n const reasons = [\n `${group.length} successful sessions share the same tool pattern`,\n fileCategories.length > 0 ? `Shared file categories: ${fileCategories.join(', ')}` : 'Shared task pattern without exposing source paths',\n `Successful signals include: ${labels.join(', ')}`\n ];\n\n return {\n candidateId: candidateIdFor(projectHash, signature),\n projectHash: sanitizeString(projectHash),\n name: sanitizeString(name),\n trigger: sanitizeString(trigger),\n steps: sanitizeArray(steps),\n confidence: confidenceForGroup(group, tools, fileCategories, taskPatterns),\n sourceSessionIds: sanitizeArray(sourceSessionIds),\n sourceEventIds: sanitizeArray(sourceEventIds),\n failureModes: sanitizeArray([\n 'Do not promote if any source session is quarantined or privacy-tagged',\n 'Resolve failed validation signals before treating the workflow as successful'\n ]),\n skillCandidate: true,\n pattern: {\n tools: sanitizeArray(tools),\n fileCategories: sanitizeArray(fileCategories),\n taskPatterns: sanitizeArray(taskPatterns)\n },\n reasons: sanitizeArray(reasons)\n };\n}\n\nfunction intersectionSets<T>(sets: Array<Set<T>>): Set<T> {\n if (sets.length === 0) return new Set<T>();\n const [first, ...rest] = sets;\n const result = new Set<T>();\n for (const value of Array.from(first)) {\n if (rest.every((set) => set.has(value))) result.add(value);\n }\n return result;\n}\n\nexport class LessonCandidateService {\n constructor(private readonly db: SQLiteDatabase) {}\n\n async findCandidates(input: unknown): Promise<LessonCandidateResult> {\n const parsed = LessonCandidateInputSchema.parse(input);\n const profiles = this.buildSessionProfiles(parsed);\n const scannedSessions = profiles.length;\n const eligibleProfiles: SessionProfile[] = [];\n let skippedSessions = 0;\n\n for (const profile of profiles) {\n if (this.isEligibleProfile(profile)) {\n eligibleProfiles.push(profile);\n } else {\n skippedSessions += 1;\n }\n }\n\n const groups = this.groupProfiles(eligibleProfiles, parsed.minSessions);\n const candidates = groups\n .map(([signature, group]) => createCandidate(parsed.projectHash, signature, group, parsed.maxSourceEventIds))\n .sort((a, b) => b.confidence - a.confidence\n || b.sourceSessionIds.length - a.sourceSessionIds.length\n || a.candidateId.localeCompare(b.candidateId))\n .slice(0, parsed.limit);\n\n return {\n scannedSessions,\n eligibleSessions: eligibleProfiles.length,\n skippedSessions,\n groupedPatterns: groups.length,\n candidates\n };\n }\n\n private buildSessionProfiles(input: ParsedLessonCandidateInput): SessionProfile[] {\n const rows = sqliteAll<EventRow>(\n this.db,\n `SELECT id, event_type, session_id, timestamp, content, metadata\n FROM events\n WHERE (\n json_extract(CASE WHEN json_valid(metadata) THEN metadata ELSE '{}' END, '$.scope.project.hash') = ?\n OR json_extract(CASE WHEN json_valid(metadata) THEN metadata ELSE '{}' END, '$.projectHash') = ?\n )\n ORDER BY timestamp ASC\n LIMIT ?`,\n [input.projectHash, input.projectHash, input.eventLimit]\n );\n const profilesBySession = new Map<string, SessionProfile>();\n\n for (const row of rows) {\n const metadata = parseMetadata(row.metadata);\n if (projectHashFromMetadata(metadata) !== input.projectHash) continue;\n const profile = this.ensureProfile(profilesBySession, row);\n profile.eventIds.push(row.id);\n profile.sourceEventIds.push(row.id);\n profile.hasPrivacyConflict ||= hasPrivacyConflict(metadata);\n profile.hasFailureSignal ||= isFailureSignal(row.content);\n\n const tools = extractToolPatterns(row.content);\n const success = isSuccessSignal(row.content);\n for (const tool of Array.from(tools)) {\n profile.tools.add(tool);\n if (success) profile.successSignals.add(tool);\n }\n for (const category of Array.from(extractFileCategories(row.content))) profile.fileCategories.add(category);\n for (const taskPattern of Array.from(extractTaskPatterns(row.content))) profile.taskPatterns.add(taskPattern);\n if (success) profile.successEventIds.push(row.id);\n }\n\n return Array.from(profilesBySession.values()).sort((a, b) => a.firstTimestamp.localeCompare(b.firstTimestamp));\n }\n\n private ensureProfile(profilesBySession: Map<string, SessionProfile>, row: EventRow): SessionProfile {\n let profile = profilesBySession.get(row.session_id);\n if (!profile) {\n profile = {\n sessionId: row.session_id,\n firstTimestamp: row.timestamp,\n eventIds: [],\n sourceEventIds: [],\n successEventIds: [],\n tools: new Set<ToolPattern>(),\n fileCategories: new Set<string>(),\n taskPatterns: new Set<string>(),\n successSignals: new Set<ToolPattern>(),\n hasFailureSignal: false,\n hasPrivacyConflict: false\n };\n profilesBySession.set(row.session_id, profile);\n }\n if (row.timestamp.localeCompare(profile.firstTimestamp) < 0) profile.firstTimestamp = row.timestamp;\n return profile;\n }\n\n private isEligibleProfile(profile: SessionProfile): boolean {\n return !profile.hasPrivacyConflict\n && profile.sourceEventIds.length > 0\n && hasEnoughSuccess(profile)\n && profileSignature(profile) !== null;\n }\n\n private groupProfiles(profiles: SessionProfile[], minSessions: number): Array<[string, SessionProfile[]]> {\n const grouped = new Map<string, SessionProfile[]>();\n for (const profile of profiles) {\n const signature = profileSignature(profile);\n if (!signature) continue;\n const group = grouped.get(signature) ?? [];\n group.push(profile);\n grouped.set(signature, group);\n }\n return Array.from(grouped.entries())\n .map(([signature, group]) => [\n signature,\n group.sort((a, b) => a.firstTimestamp.localeCompare(b.firstTimestamp))\n ] as [string, SessionProfile[]])\n .filter(([, group]) => group.length >= minSessions)\n .sort(([signatureA, groupA], [signatureB, groupB]) => groupB.length - groupA.length || signatureA.localeCompare(signatureB));\n }\n}\n", "import { z } from 'zod';\n\nimport { sqliteAll, type SQLiteDatabase } from '../sqlite-wrapper.js';\nimport type { MemoryLesson } from '../types.js';\nimport { LessonCandidateService, type LessonCandidate } from './lesson-candidate-service.js';\nimport { LessonRepository } from './lesson-repository.js';\n\nconst NonEmptyStringSchema = z.string()\n .transform((value) => value.trim())\n .pipe(z.string().min(1));\n\nconst PromotionStringArraySchema = z.preprocess((value) => {\n if (!Array.isArray(value)) return value;\n return value\n .map((item) => typeof item === 'string' ? item.trim() : item)\n .filter((item) => typeof item !== 'string' || item.length > 0);\n}, z.array(NonEmptyStringSchema).max(100));\n\nconst ReviewedLessonCandidateSchema = z.object({\n candidateId: NonEmptyStringSchema,\n projectHash: NonEmptyStringSchema,\n name: NonEmptyStringSchema,\n trigger: NonEmptyStringSchema,\n steps: PromotionStringArraySchema.refine((steps) => steps.length > 0, 'steps must contain at least one step'),\n confidence: z.number().min(0).max(1),\n sourceSessionIds: PromotionStringArraySchema.default([]),\n sourceEventIds: PromotionStringArraySchema.refine((sourceEventIds) => sourceEventIds.length > 0, 'sourceEventIds is required'),\n failureModes: PromotionStringArraySchema.default([]),\n skillCandidate: z.boolean().default(true)\n}).passthrough();\n\ntype ReviewedLessonCandidate = z.output<typeof ReviewedLessonCandidateSchema>;\n\nconst CandidateSearchInputSchema = z.object({\n minSessions: z.number().int().min(2).max(10).optional(),\n limit: z.number().int().positive().max(100).optional(),\n eventLimit: z.number().int().positive().max(10_000).optional(),\n maxSourceEventIds: z.number().int().positive().max(100).optional()\n}).default({});\n\nexport const PromoteLessonCandidateInputSchema = z.object({\n projectHash: NonEmptyStringSchema,\n actor: NonEmptyStringSchema,\n candidateId: NonEmptyStringSchema.optional(),\n candidate: ReviewedLessonCandidateSchema.optional(),\n approved: z.boolean().default(false),\n allowHighConfidenceRule: z.boolean().default(false),\n minHighConfidence: z.number().min(0).max(1).default(0.9),\n candidateSearch: CandidateSearchInputSchema\n}).superRefine((value, ctx) => {\n if ((value.candidateId ? 1 : 0) + (value.candidate ? 1 : 0) !== 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['candidateId'],\n message: 'exactly one of candidateId or candidate is required'\n });\n }\n});\nexport type PromoteLessonCandidateInput = z.input<typeof PromoteLessonCandidateInputSchema>;\n\ninterface SourceEventRow {\n id: string;\n session_id: string;\n metadata: string | null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parseMetadata(value: unknown): Record<string, unknown> | undefined {\n if (!value) return undefined;\n if (isRecord(value)) return value;\n if (typeof value !== 'string') return undefined;\n try {\n const parsed = JSON.parse(value);\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction nestedValue(root: Record<string, unknown> | undefined, path: string[]): unknown {\n let cursor: unknown = root;\n for (const key of path) {\n if (!isRecord(cursor)) return undefined;\n cursor = cursor[key];\n }\n return cursor;\n}\n\nfunction nestedString(root: Record<string, unknown> | undefined, path: string[]): string | undefined {\n const value = nestedValue(root, path);\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction projectHashFromMetadata(metadata: Record<string, unknown> | undefined): string | undefined {\n const direct = typeof metadata?.projectHash === 'string' ? metadata.projectHash.trim() : undefined;\n return nestedString(metadata, ['scope', 'project', 'hash']) ?? direct;\n}\n\nfunction hasActiveQuarantine(metadata: Record<string, unknown> | undefined): boolean {\n const quarantine = nestedValue(metadata, ['quarantine']);\n return isRecord(quarantine) && quarantine.status === 'active';\n}\n\nfunction numericMetadataValue(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction privacyFilterHasConflict(privacyMetadata: unknown): boolean {\n if (!isRecord(privacyMetadata)) return false;\n return privacyMetadata.hasPrivateTags === true\n || privacyMetadata.hasUnmatchedTags === true\n || numericMetadataValue(privacyMetadata.privateTagCount) > 0\n || numericMetadataValue(privacyMetadata.patternMatchCount) > 0;\n}\n\nfunction hasPrivacyConflict(metadata: Record<string, unknown> | undefined): boolean {\n if (!metadata) return false;\n const tags = Array.isArray(metadata.tags)\n ? metadata.tags.map((tag) => String(tag).toLowerCase())\n : [];\n const privacy = nestedString(metadata, ['privacy', 'classification'])\n ?? nestedString(metadata, ['privacy', 'level'])\n ?? (typeof metadata.privacy === 'string' ? metadata.privacy : undefined);\n return hasActiveQuarantine(metadata)\n || metadata.private === true\n || metadata.isPrivate === true\n || metadata.visibility === 'private'\n || privacy === 'private'\n || privacyFilterHasConflict(metadata.privacy)\n || privacyFilterHasConflict(metadata)\n || tags.includes('private')\n || tags.includes('privacy:private');\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n const unique: string[] = [];\n const seen = new Set<string>();\n for (const value of values) {\n const normalized = value.trim();\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n unique.push(normalized);\n }\n return unique;\n}\n\nfunction candidateToLessonInput(candidate: ReviewedLessonCandidate, actor: string): Record<string, unknown> {\n return {\n projectHash: candidate.projectHash,\n name: candidate.name,\n trigger: candidate.trigger,\n steps: candidate.steps,\n confidence: candidate.confidence,\n sourceSessionIds: candidate.sourceSessionIds,\n sourceEventIds: candidate.sourceEventIds,\n failureModes: candidate.failureModes,\n skillCandidate: candidate.skillCandidate,\n actor\n };\n}\n\nfunction normalizeGeneratedCandidate(candidate: LessonCandidate): ReviewedLessonCandidate {\n return ReviewedLessonCandidateSchema.parse(candidate);\n}\n\nexport class LessonService {\n private readonly candidateService: LessonCandidateService;\n private readonly lessonRepository: LessonRepository;\n\n constructor(private readonly db: SQLiteDatabase) {\n this.candidateService = new LessonCandidateService(db);\n this.lessonRepository = new LessonRepository(db);\n }\n\n async promoteCandidate(input: unknown): Promise<MemoryLesson> {\n const parsed = PromoteLessonCandidateInputSchema.parse(input);\n const candidate = parsed.candidate\n ? ReviewedLessonCandidateSchema.parse(parsed.candidate)\n : await this.resolveGeneratedCandidate(parsed.projectHash, parsed.candidateId!, parsed.candidateSearch);\n\n if (candidate.projectHash !== parsed.projectHash) {\n throw new Error('candidate projectHash mismatch');\n }\n if (!parsed.approved && !(parsed.allowHighConfidenceRule && candidate.confidence >= parsed.minHighConfidence)) {\n throw new Error('explicit approval or high-confidence rule is required for lesson promotion');\n }\n\n this.validateSourceEvents(candidate.projectHash, candidate.sourceEventIds);\n\n return this.lessonRepository.upsert(candidateToLessonInput(candidate, parsed.actor));\n }\n\n private async resolveGeneratedCandidate(\n projectHash: string,\n candidateId: string,\n candidateSearch: z.output<typeof CandidateSearchInputSchema>\n ): Promise<ReviewedLessonCandidate> {\n const result = await this.candidateService.findCandidates({\n projectHash,\n ...candidateSearch\n });\n const candidate = result.candidates.find((item) => item.candidateId === candidateId);\n if (!candidate) {\n throw new Error('lesson candidate not found for projectHash');\n }\n return normalizeGeneratedCandidate(candidate);\n }\n\n private validateSourceEvents(projectHash: string, sourceEventIds: string[]): void {\n const ids = uniqueStrings(sourceEventIds);\n if (ids.length === 0) {\n throw new Error('sourceEventIds is required for lesson promotion');\n }\n const placeholders = ids.map(() => '?').join(', ');\n const rows = sqliteAll<SourceEventRow>(\n this.db,\n `SELECT id, session_id, metadata FROM events WHERE id IN (${placeholders})`,\n ids\n );\n const rowsById = new Map(rows.map((row) => [row.id, row]));\n const missing = ids.filter((id) => !rowsById.has(id));\n if (missing.length > 0) {\n throw new Error('source event refs are unavailable for lesson promotion');\n }\n\n for (const row of rows) {\n const metadata = parseMetadata(row.metadata);\n const sourceProjectHash = projectHashFromMetadata(metadata);\n if (sourceProjectHash !== projectHash) {\n throw new Error('source event project mismatch for lesson promotion');\n }\n if (hasPrivacyConflict(metadata)) {\n throw new Error('source event privacy conflict for lesson promotion');\n }\n }\n }\n}\n", "import { z } from 'zod';\n\nimport {\n sqliteAll,\n sqliteGet,\n sqliteRun,\n toDateFromSQLite,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\nimport {\n ListMemoryActorsInputSchema,\n MemoryActorSchema,\n UpsertMemoryActorInputSchema,\n type MemoryActor,\n type MemoryActorKind,\n type MemoryEvent,\n type UpsertMemoryActorInput\n} from '../types.js';\nimport { sanitizeGovernanceAuditValue } from './governance-audit.js';\n\ninterface MemoryActorRow {\n actor_id: string;\n project_hash: string;\n kind: MemoryActorKind;\n display_name: string;\n source: string;\n metadata_json: string | null;\n created_at: string;\n updated_at: string;\n}\n\ntype ParsedActorUpsert = z.output<typeof UpsertMemoryActorInputSchema>;\n\nfunction projectHashToStorage(projectHash: string | undefined): string {\n return projectHash ?? '';\n}\n\nfunction projectHashFromStorage(projectHash: string): string | undefined {\n return projectHash.length > 0 ? projectHash : undefined;\n}\n\nfunction parseJsonRecord(value: string | null): Record<string, unknown> | undefined {\n if (!value) return undefined;\n try {\n const parsed = JSON.parse(value);\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction sanitizeString(value: string): string {\n return String(sanitizeGovernanceAuditValue(value)).trim();\n}\n\nfunction sanitizeMetadata(metadata: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n if (!metadata) return undefined;\n return sanitizeGovernanceAuditValue(metadata) as Record<string, unknown>;\n}\n\nfunction slugActorPart(value: string): string {\n const slug = value\n .normalize('NFKC')\n .toLowerCase()\n .replace(/[^a-z0-9\uAC00-\uD7A3_-]+/gi, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 64);\n return slug.length > 0 ? slug : 'unknown';\n}\n\nfunction stableActorId(input: ParsedActorUpsert): string {\n if (input.actorId) return sanitizeString(input.actorId);\n const projectPart = input.projectHash ? `project:${slugActorPart(input.projectHash)}` : 'global';\n return [\n 'actor',\n projectPart,\n slugActorPart(input.source),\n input.kind,\n slugActorPart(input.displayName)\n ].join(':');\n}\n\nfunction rowToActor(row: MemoryActorRow): MemoryActor {\n return MemoryActorSchema.parse({\n actorId: row.actor_id,\n projectHash: projectHashFromStorage(row.project_hash),\n kind: row.kind,\n displayName: row.display_name,\n source: row.source,\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toDateFromSQLite(row.created_at),\n updatedAt: toDateFromSQLite(row.updated_at)\n });\n}\n\nfunction metadataString(metadata: Record<string, unknown> | undefined, keys: string[]): string | undefined {\n if (!metadata) return undefined;\n for (const key of keys) {\n const value = metadata[key];\n if (typeof value === 'string' && value.trim().length > 0) return value.trim();\n }\n return undefined;\n}\n\nfunction metadataRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined;\n}\n\nexport interface ProjectMemoryActorFromEventOptions {\n projectHash?: string;\n}\n\nexport function buildMemoryActorId(input: unknown): string {\n const parsed = UpsertMemoryActorInputSchema.parse(input);\n return stableActorId(parsed);\n}\n\nexport function projectMemoryActorFromEvent(\n event: MemoryEvent,\n options: ProjectMemoryActorFromEventOptions = {}\n): UpsertMemoryActorInput {\n const metadata = metadataRecord(event.metadata);\n const source = metadataString(metadata, ['source', 'importSource', 'platform', 'provider']) ?? 'event';\n const model = metadataString(metadata, ['model', 'modelName']);\n\n if (event.eventType === 'user_prompt') {\n return {\n projectHash: options.projectHash,\n kind: 'user',\n displayName: metadataString(metadata, ['displayName', 'userName', 'username', 'user_id', 'userId']) ?? 'User',\n source,\n metadata: { eventType: event.eventType, ...metadata }\n };\n }\n\n if (event.eventType === 'agent_response') {\n return {\n projectHash: options.projectHash,\n kind: 'assistant',\n displayName: metadataString(metadata, ['displayName', 'agentName', 'assistantName']) ?? model ?? 'Assistant',\n source,\n metadata: { eventType: event.eventType, ...metadata }\n };\n }\n\n if (event.eventType === 'tool_observation') {\n return {\n projectHash: options.projectHash,\n kind: 'tool',\n displayName: metadataString(metadata, ['toolName', 'tool_name', 'name']) ?? 'Tool',\n source,\n metadata: { eventType: event.eventType, ...metadata }\n };\n }\n\n return {\n projectHash: options.projectHash,\n kind: 'system',\n displayName: metadataString(metadata, ['displayName', 'source']) ?? 'Session summary',\n source,\n metadata: { eventType: event.eventType, ...metadata }\n };\n}\n\nexport class ActorRepository {\n constructor(private readonly db: SQLiteDatabase) {}\n\n async upsert(input: unknown): Promise<MemoryActor> {\n const parsed = UpsertMemoryActorInputSchema.parse(input);\n const actorId = stableActorId(parsed);\n const projectHash = sanitizeString(projectHashToStorage(parsed.projectHash));\n const displayName = sanitizeString(parsed.displayName);\n const source = sanitizeString(parsed.source);\n const metadata = sanitizeMetadata(parsed.metadata);\n const existing = this.get(actorId);\n const now = new Date().toISOString();\n\n if (existing && projectHashToStorage(existing.projectHash) !== projectHash) {\n throw new Error('actor projectHash mismatch');\n }\n\n if (existing) {\n sqliteRun(\n this.db,\n `UPDATE memory_actors\n SET kind = ?, display_name = ?, source = ?, metadata_json = ?, updated_at = ?\n WHERE actor_id = ?`,\n [\n parsed.kind,\n displayName,\n source,\n metadata ? JSON.stringify(metadata) : null,\n now,\n actorId\n ]\n );\n return this.require(actorId);\n }\n\n sqliteRun(\n this.db,\n `INSERT INTO memory_actors (\n actor_id, project_hash, kind, display_name, source, metadata_json, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n actorId,\n projectHash,\n parsed.kind,\n displayName,\n source,\n metadata ? JSON.stringify(metadata) : null,\n now,\n now\n ]\n );\n return this.require(actorId);\n }\n\n get(actorId: string): MemoryActor | null {\n const row = sqliteGet<MemoryActorRow>(this.db, `SELECT * FROM memory_actors WHERE actor_id = ?`, [actorId]);\n return row ? rowToActor(row) : null;\n }\n\n require(actorId: string): MemoryActor {\n const actor = this.get(actorId);\n if (!actor) throw new Error(`Memory actor not found: ${actorId}`);\n return actor;\n }\n\n async list(input: unknown = {}): Promise<MemoryActor[]> {\n const parsed = ListMemoryActorsInputSchema.parse(input);\n const clauses = ['project_hash = ?'];\n const params: unknown[] = [projectHashToStorage(parsed.projectHash)];\n if (parsed.kind) {\n clauses.push('kind = ?');\n params.push(parsed.kind);\n }\n if (parsed.source) {\n clauses.push('source = ?');\n params.push(parsed.source);\n }\n params.push(parsed.limit);\n const rows = sqliteAll<MemoryActorRow>(\n this.db,\n `SELECT * FROM memory_actors WHERE ${clauses.join(' AND ')} ORDER BY updated_at DESC, display_name ASC LIMIT ?`,\n params\n );\n return rows.map(rowToActor);\n }\n\n async resolveFromEvent(event: MemoryEvent, options: { projectHash?: string } = {}): Promise<MemoryActor> {\n return this.upsert(projectMemoryActorFromEvent(event, options));\n }\n}\n", "import {\n sqliteAll,\n sqliteGet,\n sqliteRun,\n toDateFromSQLite,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\nimport {\n ListSessionActorsInputSchema,\n SessionActorSchema,\n SetSessionActorObservationPolicyInputSchema,\n UpsertSessionActorInputSchema,\n type SessionActor\n} from '../types.js';\nimport { sanitizeGovernanceAuditValue } from './governance-audit.js';\n\ninterface SessionActorRow {\n project_hash: string;\n session_id: string;\n actor_id: string;\n role_in_session: string;\n observe_self: number;\n observe_others: number;\n joined_at: string;\n left_at: string | null;\n metadata_json: string | null;\n}\n\nfunction projectHashToStorage(projectHash: string | undefined): string {\n return projectHash ?? '';\n}\n\nfunction projectHashFromStorage(projectHash: string): string | undefined {\n return projectHash.length > 0 ? projectHash : undefined;\n}\n\nfunction parseJsonRecord(value: string | null): Record<string, unknown> | undefined {\n if (!value) return undefined;\n try {\n const parsed = JSON.parse(value);\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction sanitizeMetadata(metadata: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n if (!metadata) return undefined;\n return sanitizeGovernanceAuditValue(metadata) as Record<string, unknown>;\n}\n\nfunction rowToSessionActor(row: SessionActorRow): SessionActor {\n return SessionActorSchema.parse({\n projectHash: projectHashFromStorage(row.project_hash),\n sessionId: row.session_id,\n actorId: row.actor_id,\n roleInSession: row.role_in_session,\n observeSelf: Number(row.observe_self) === 1,\n observeOthers: Number(row.observe_others) === 1,\n joinedAt: toDateFromSQLite(row.joined_at),\n leftAt: row.left_at ? toDateFromSQLite(row.left_at) : undefined,\n metadata: parseJsonRecord(row.metadata_json)\n });\n}\n\nexport class SessionActorRepository {\n constructor(private readonly db: SQLiteDatabase) {}\n\n async upsertMembership(input: unknown): Promise<SessionActor> {\n const parsed = UpsertSessionActorInputSchema.parse(input);\n const projectHash = projectHashToStorage(parsed.projectHash);\n const existing = this.get(projectHash, parsed.sessionId, parsed.actorId);\n const joinedAt = parsed.joinedAt?.toISOString() ?? existing?.joinedAt.toISOString() ?? new Date().toISOString();\n const leftAt = parsed.leftAt?.toISOString() ?? (existing?.leftAt ? existing.leftAt.toISOString() : null);\n const metadata = sanitizeMetadata(parsed.metadata);\n\n if (existing) {\n sqliteRun(\n this.db,\n `UPDATE session_actors\n SET role_in_session = ?, observe_self = ?, observe_others = ?, joined_at = ?, left_at = ?, metadata_json = ?\n WHERE project_hash = ? AND session_id = ? AND actor_id = ?`,\n [\n parsed.roleInSession,\n parsed.observeSelf ? 1 : 0,\n parsed.observeOthers ? 1 : 0,\n joinedAt,\n leftAt,\n metadata ? JSON.stringify(metadata) : null,\n projectHash,\n parsed.sessionId,\n parsed.actorId\n ]\n );\n } else {\n sqliteRun(\n this.db,\n `INSERT INTO session_actors (\n project_hash, session_id, actor_id, role_in_session, observe_self,\n observe_others, joined_at, left_at, metadata_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n projectHash,\n parsed.sessionId,\n parsed.actorId,\n parsed.roleInSession,\n parsed.observeSelf ? 1 : 0,\n parsed.observeOthers ? 1 : 0,\n joinedAt,\n leftAt,\n metadata ? JSON.stringify(metadata) : null\n ]\n );\n }\n\n const saved = this.get(projectHash, parsed.sessionId, parsed.actorId);\n if (!saved) throw new Error('session actor membership was not saved');\n return saved;\n }\n\n async listBySession(input: unknown): Promise<SessionActor[]> {\n const parsed = ListSessionActorsInputSchema.parse(input);\n const rows = sqliteAll<SessionActorRow>(\n this.db,\n `SELECT * FROM session_actors\n WHERE project_hash = ? AND session_id = ?\n ORDER BY role_in_session ASC, joined_at ASC\n LIMIT ?`,\n [projectHashToStorage(parsed.projectHash), parsed.sessionId, parsed.limit]\n );\n return rows.map(rowToSessionActor);\n }\n\n async setObservationPolicy(input: unknown): Promise<SessionActor> {\n const parsed = SetSessionActorObservationPolicyInputSchema.parse(input);\n const projectHash = projectHashToStorage(parsed.projectHash);\n const existing = this.get(projectHash, parsed.sessionId, parsed.actorId);\n if (!existing) {\n throw new Error('session actor membership not found');\n }\n sqliteRun(\n this.db,\n `UPDATE session_actors\n SET observe_self = ?, observe_others = ?\n WHERE project_hash = ? AND session_id = ? AND actor_id = ?`,\n [\n parsed.observeSelf ? 1 : 0,\n parsed.observeOthers ? 1 : 0,\n projectHash,\n parsed.sessionId,\n parsed.actorId\n ]\n );\n const saved = this.get(projectHash, parsed.sessionId, parsed.actorId);\n if (!saved) throw new Error('session actor membership not found after update');\n return saved;\n }\n\n private get(projectHash: string, sessionId: string, actorId: string): SessionActor | null {\n const row = sqliteGet<SessionActorRow>(\n this.db,\n `SELECT * FROM session_actors WHERE project_hash = ? AND session_id = ? AND actor_id = ?`,\n [projectHash, sessionId, actorId]\n );\n return row ? rowToSessionActor(row) : null;\n }\n}\n", "import { createHash, randomUUID } from 'crypto';\nimport { z } from 'zod';\n\nimport {\n sqliteAll,\n sqliteGet,\n sqliteRun,\n toDateFromSQLite,\n type SQLiteDatabase\n} from '../sqlite-wrapper.js';\nimport {\n CreatePerspectiveObservationInputSchema,\n DeletePerspectiveObservationInputSchema,\n ListPerspectiveObservationsBySourceInputSchema,\n PerspectiveObservationSchema,\n QueryPerspectiveObservationsInputSchema,\n type PerspectiveObservation\n} from '../types.js';\nimport {\n sanitizeGovernanceAuditValue,\n writeGovernanceAuditEntry\n} from './governance-audit.js';\nimport { VectorOutbox, type OutboxConfig } from '../vector-outbox.js';\n\nexport interface PerspectiveObservationRepositoryOptions {\n vectorOutbox?: false | VectorOutbox | Partial<OutboxConfig>;\n}\n\ninterface PerspectiveObservationRow {\n observation_id: string;\n project_hash: string;\n observer_actor_id: string;\n observed_actor_id: string;\n session_id: string | null;\n level: string;\n content: string;\n confidence: number;\n source_event_ids_json: string;\n source_observation_ids_json: string;\n created_by: string;\n metadata_json: string | null;\n content_hash: string;\n source_hash: string;\n created_at: string;\n updated_at: string;\n deleted_at: string | null;\n}\n\ntype ParsedObservationCreate = z.output<typeof CreatePerspectiveObservationInputSchema>;\ntype ParsedObservationQuery = z.output<typeof QueryPerspectiveObservationsInputSchema>;\n\ntype ObservationFilter = {\n clauses: string[];\n params: unknown[];\n};\n\nfunction projectHashToStorage(projectHash: string | undefined): string {\n return projectHash ?? '';\n}\n\nfunction projectHashFromStorage(projectHash: string): string | undefined {\n return projectHash.length > 0 ? projectHash : undefined;\n}\n\nfunction parseStringArray(value: string | null): string[] {\n if (!value) return [];\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed)\n ? parsed.filter((entry): entry is string => typeof entry === 'string')\n : [];\n } catch {\n return [];\n }\n}\n\nfunction parseJsonRecord(value: string | null): Record<string, unknown> | undefined {\n if (!value) return undefined;\n try {\n const parsed = JSON.parse(value);\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction sanitizeStoredString(value: string): string {\n const sanitized = sanitizeGovernanceAuditValue(value);\n return typeof sanitized === 'string' ? sanitized.trim() : String(value).trim();\n}\n\nfunction sanitizeStoredStringArray(values: string[]): string[] {\n return values.map(sanitizeStoredString).filter((value) => value.length > 0);\n}\n\nfunction sanitizeStoredRecord(value: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n if (!value) return undefined;\n return sanitizeGovernanceAuditValue(value) as Record<string, unknown>;\n}\n\nfunction stableHash(value: unknown): string {\n return createHash('sha256').update(JSON.stringify(value)).digest('hex');\n}\n\nfunction evidenceHash(sourceEventIds: string[], sourceObservationIds: string[]): string {\n return stableHash({\n sourceEventIds: [...sourceEventIds].sort(),\n sourceObservationIds: [...sourceObservationIds].sort()\n });\n}\n\nfunction rowToObservation(row: PerspectiveObservationRow): PerspectiveObservation {\n return PerspectiveObservationSchema.parse({\n observationId: row.observation_id,\n projectHash: projectHashFromStorage(row.project_hash),\n observerActorId: row.observer_actor_id,\n observedActorId: row.observed_actor_id,\n sessionId: row.session_id ?? undefined,\n level: row.level,\n content: row.content,\n confidence: Number(row.confidence),\n sourceEventIds: parseStringArray(row.source_event_ids_json),\n sourceObservationIds: parseStringArray(row.source_observation_ids_json),\n createdBy: row.created_by,\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toDateFromSQLite(row.created_at),\n updatedAt: toDateFromSQLite(row.updated_at),\n deletedAt: row.deleted_at ? toDateFromSQLite(row.deleted_at) : undefined\n });\n}\n\nfunction sanitizedObservationSnapshot(observation: PerspectiveObservation): Record<string, unknown> {\n return sanitizeGovernanceAuditValue({\n observationId: observation.observationId,\n projectHash: observation.projectHash,\n observerActorId: observation.observerActorId,\n observedActorId: observation.observedActorId,\n sessionId: observation.sessionId,\n level: observation.level,\n content: observation.content,\n confidence: observation.confidence,\n sourceEventIds: observation.sourceEventIds,\n sourceObservationIds: observation.sourceObservationIds,\n createdBy: observation.createdBy,\n metadata: observation.metadata,\n createdAt: observation.createdAt.toISOString(),\n updatedAt: observation.updatedAt.toISOString(),\n deletedAt: observation.deletedAt?.toISOString()\n }) as Record<string, unknown>;\n}\n\nfunction queryScore(observation: PerspectiveObservation, terms: string[]): number {\n if (terms.length === 0) return 0;\n const haystack = [observation.content, observation.level, observation.sessionId ?? ''].join(' ').toLowerCase();\n return terms.reduce((score, term) => score + (haystack.includes(term) ? 1 : 0), 0);\n}\n\nfunction columnName(name: string, alias?: string): string {\n return alias ? `${alias}.${name}` : name;\n}\n\nfunction buildObservationFilter(parsed: ParsedObservationQuery, alias?: string): ObservationFilter {\n const clauses = [`${columnName('project_hash', alias)} = ?`];\n const params: unknown[] = [projectHashToStorage(parsed.projectHash)];\n\n if (parsed.observerActorId) {\n clauses.push(`${columnName('observer_actor_id', alias)} = ?`);\n params.push(parsed.observerActorId);\n }\n if (parsed.observedActorId) {\n clauses.push(`${columnName('observed_actor_id', alias)} = ?`);\n params.push(parsed.observedActorId);\n }\n if (parsed.sessionId) {\n clauses.push(`(${columnName('session_id', alias)} = ? OR ${columnName('session_id', alias)} IS NULL)`);\n params.push(parsed.sessionId);\n }\n if (parsed.levels && parsed.levels.length > 0) {\n clauses.push(`${columnName('level', alias)} IN (${parsed.levels.map(() => '?').join(', ')})`);\n params.push(...parsed.levels);\n }\n if (!parsed.includeDeleted) {\n clauses.push(`${columnName('deleted_at', alias)} IS NULL`);\n }\n\n return { clauses, params };\n}\n\nfunction buildObservationFtsQuery(query: string): string {\n return query\n .replace(/['\"(){}[\\]^~*?:\\\\/-]/g, ' ')\n .split(/\\s+/)\n .map((term) => term.trim())\n .filter((term) => term.length > 0)\n .slice(0, 32)\n .map((term) => `\"${term.replace(/\"/g, '\"\"')}\"*`)\n .join(' OR ');\n}\n\nfunction isFtsUnavailableError(error: unknown): boolean {\n const message = String(error instanceof Error ? error.message : error).toLowerCase();\n return message.includes('no such table: perspective_observations_fts')\n || message.includes('no such column: perspective_observations_fts')\n || message.includes('unable to use function match')\n || message.includes('malformed match expression');\n}\n\nexport class PerspectiveObservationRepository {\n private vectorOutbox: VectorOutbox | null = null;\n private readonly vectorOutboxOption: PerspectiveObservationRepositoryOptions['vectorOutbox'];\n\n constructor(\n private readonly db: SQLiteDatabase,\n options: PerspectiveObservationRepositoryOptions = {}\n ) {\n this.vectorOutboxOption = options.vectorOutbox;\n if (options.vectorOutbox instanceof VectorOutbox) {\n this.vectorOutbox = options.vectorOutbox;\n }\n }\n\n private getVectorOutbox(): VectorOutbox | null {\n const option = this.vectorOutboxOption;\n if (option === false) return null;\n if (option instanceof VectorOutbox) {\n this.vectorOutbox = option;\n return option;\n }\n if (!this.vectorOutbox) {\n this.vectorOutbox = new VectorOutbox(this.db, option ?? {});\n }\n return this.vectorOutbox;\n }\n\n private enqueueObservationSync(observationId: string): void {\n const outbox = this.getVectorOutbox();\n if (!outbox) return;\n outbox.enqueueSync('perspective_observation', observationId);\n }\n\n async create(input: unknown): Promise<PerspectiveObservation> {\n const parsed = CreatePerspectiveObservationInputSchema.parse(input);\n const projectHash = projectHashToStorage(parsed.projectHash);\n const observerActorId = sanitizeStoredString(parsed.observerActorId);\n const observedActorId = sanitizeStoredString(parsed.observedActorId);\n const sessionId = parsed.sessionId ? sanitizeStoredString(parsed.sessionId) : undefined;\n const content = sanitizeStoredString(parsed.content);\n const sourceEventIds = sanitizeStoredStringArray(parsed.sourceEventIds);\n const sourceObservationIds = sanitizeStoredStringArray(parsed.sourceObservationIds);\n const createdBy = parsed.createdBy;\n const actor = parsed.actor ? sanitizeStoredString(parsed.actor) : undefined;\n const now = new Date().toISOString();\n const observationId = parsed.observationId ?? randomUUID();\n const contentHash = stableHash(content);\n const sourceHash = evidenceHash(sourceEventIds, sourceObservationIds);\n const metadata = sanitizeStoredRecord(parsed.metadata);\n\n let saved: PerspectiveObservation | null = null;\n const transaction = this.db.transaction(() => {\n sqliteRun(\n this.db,\n `INSERT INTO perspective_observations (\n observation_id, project_hash, observer_actor_id, observed_actor_id, session_id,\n level, content, confidence, source_event_ids_json, source_observation_ids_json,\n created_by, metadata_json, content_hash, source_hash, created_at, updated_at, deleted_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL)\n ON CONFLICT(project_hash, observer_actor_id, observed_actor_id, level, content_hash, source_hash)\n DO UPDATE SET\n confidence = excluded.confidence,\n session_id = excluded.session_id,\n metadata_json = excluded.metadata_json,\n updated_at = excluded.updated_at,\n deleted_at = NULL`,\n [\n observationId,\n projectHash,\n observerActorId,\n observedActorId,\n sessionId ?? null,\n parsed.level,\n content,\n parsed.confidence,\n JSON.stringify(sourceEventIds),\n JSON.stringify(sourceObservationIds),\n createdBy,\n metadata ? JSON.stringify(metadata) : null,\n contentHash,\n sourceHash,\n now,\n now\n ]\n );\n\n saved = this.getByUnique(\n projectHash,\n observerActorId,\n observedActorId,\n parsed.level,\n contentHash,\n sourceHash\n );\n if (!saved) throw new Error('perspective observation was not saved');\n this.enqueueObservationSync(saved.observationId);\n });\n transaction();\n\n const savedObservation = saved;\n if (!savedObservation) throw new Error('perspective observation was not saved');\n await this.writeCreateAudit({ ...parsed, observerActorId, observedActorId, sessionId, content, sourceEventIds, sourceObservationIds, createdBy, actor, metadata }, savedObservation);\n return savedObservation;\n }\n\n async query(input: unknown): Promise<PerspectiveObservation[]> {\n const parsed = QueryPerspectiveObservationsInputSchema.parse(input);\n if (parsed.query) {\n const ftsQuery = buildObservationFtsQuery(parsed.query);\n if (ftsQuery) {\n const ftsResult = this.queryWithFts(parsed, ftsQuery);\n if (ftsResult) return ftsResult;\n }\n }\n\n return this.queryWithPrefetch(parsed);\n }\n\n private queryWithFts(parsed: ParsedObservationQuery, ftsQuery: string): PerspectiveObservation[] | null {\n const filter = buildObservationFilter(parsed, 'po');\n try {\n const rows = sqliteAll<PerspectiveObservationRow>(\n this.db,\n `SELECT po.*\n FROM perspective_observations_fts fts\n JOIN perspective_observations po ON po.rowid = fts.rowid\n WHERE perspective_observations_fts MATCH ?\n AND ${filter.clauses.join(' AND ')}\n ORDER BY fts.rank, po.confidence DESC, po.updated_at DESC\n LIMIT ?`,\n [ftsQuery, ...filter.params, parsed.limit]\n );\n return rows.map(rowToObservation);\n } catch (error) {\n if (isFtsUnavailableError(error)) return null;\n throw error;\n }\n }\n\n private queryWithPrefetch(parsed: ParsedObservationQuery): PerspectiveObservation[] {\n const filter = buildObservationFilter(parsed);\n const rowLimit = parsed.query ? Math.min(parsed.limit * 5, 500) : parsed.limit;\n const rows = sqliteAll<PerspectiveObservationRow>(\n this.db,\n `SELECT * FROM perspective_observations\n WHERE ${filter.clauses.join(' AND ')}\n ORDER BY confidence DESC, updated_at DESC\n LIMIT ?`,\n [...filter.params, rowLimit]\n );\n const observations = rows.map(rowToObservation);\n const terms = parsed.query\n ? parsed.query.toLowerCase().split(/\\s+/).map((term) => term.trim()).filter(Boolean)\n : [];\n return observations\n .map((observation) => ({ observation, score: queryScore(observation, terms) }))\n .sort((a, b) => b.score - a.score || b.observation.confidence - a.observation.confidence || b.observation.updatedAt.getTime() - a.observation.updatedAt.getTime())\n .slice(0, parsed.limit)\n .map((item) => item.observation);\n }\n\n async listBySourceEvent(input: unknown): Promise<PerspectiveObservation[]> {\n const parsed = ListPerspectiveObservationsBySourceInputSchema.parse(input);\n const rows = sqliteAll<PerspectiveObservationRow>(\n this.db,\n `SELECT * FROM perspective_observations\n WHERE project_hash = ?\n AND deleted_at IS NULL\n AND EXISTS (\n SELECT 1\n FROM json_each(perspective_observations.source_event_ids_json)\n WHERE json_each.value = ?\n )\n ORDER BY confidence DESC, updated_at DESC\n LIMIT ?`,\n [projectHashToStorage(parsed.projectHash), parsed.sourceEventId, parsed.limit]\n );\n return rows.map(rowToObservation);\n }\n\n async deleteSoft(input: unknown): Promise<PerspectiveObservation> {\n const parsed = DeletePerspectiveObservationInputSchema.parse(input);\n const projectHash = projectHashToStorage(parsed.projectHash);\n const before = this.get(projectHash, parsed.observationId);\n if (!before) throw new Error('perspective observation not found');\n const deletedAt = new Date().toISOString();\n sqliteRun(\n this.db,\n `UPDATE perspective_observations\n SET deleted_at = ?, updated_at = ?\n WHERE project_hash = ? AND observation_id = ?`,\n [deletedAt, deletedAt, projectHash, parsed.observationId]\n );\n const after = this.get(projectHash, parsed.observationId);\n if (!after) throw new Error('perspective observation not found after delete');\n await writeGovernanceAuditEntry(this.db, {\n operation: 'perspective_observation_delete',\n actor: parsed.actor,\n projectHash: parsed.projectHash,\n targetType: 'perspective_observation',\n targetId: parsed.observationId,\n beforeJson: sanitizedObservationSnapshot(before),\n afterJson: sanitizedObservationSnapshot(after),\n sourceEventIds: after.sourceEventIds\n });\n return after;\n }\n\n get(projectHash: string, observationId: string): PerspectiveObservation | null {\n const row = sqliteGet<PerspectiveObservationRow>(\n this.db,\n `SELECT * FROM perspective_observations WHERE project_hash = ? AND observation_id = ?`,\n [projectHash, observationId]\n );\n return row ? rowToObservation(row) : null;\n }\n\n private getByUnique(\n projectHash: string,\n observerActorId: string,\n observedActorId: string,\n level: string,\n contentHash: string,\n sourceHash: string\n ): PerspectiveObservation | null {\n const row = sqliteGet<PerspectiveObservationRow>(\n this.db,\n `SELECT * FROM perspective_observations\n WHERE project_hash = ? AND observer_actor_id = ? AND observed_actor_id = ?\n AND level = ? AND content_hash = ? AND source_hash = ?`,\n [projectHash, observerActorId, observedActorId, level, contentHash, sourceHash]\n );\n return row ? rowToObservation(row) : null;\n }\n\n private async writeCreateAudit(\n parsed: ParsedObservationCreate,\n after: PerspectiveObservation\n ): Promise<void> {\n await writeGovernanceAuditEntry(this.db, {\n operation: 'perspective_observation_create',\n actor: parsed.actor ?? parsed.createdBy,\n projectHash: parsed.projectHash,\n targetType: 'perspective_observation',\n targetId: after.observationId,\n afterJson: sanitizedObservationSnapshot(after),\n sourceEventIds: parsed.sourceEventIds\n });\n }\n}\n", "import { sanitizeGovernanceAuditValue } from './governance-audit.js';\nimport type {\n MemoryActor,\n MemoryEvent,\n MemoryOperationsConfig,\n PerspectiveObservation,\n PerspectiveObservationCreatedBy,\n PerspectiveObservationLevel,\n SessionActor\n} from '../types.js';\n\nexport interface PerspectiveObservationCandidate {\n content: string;\n confidence?: number;\n level?: PerspectiveObservationLevel;\n createdBy?: PerspectiveObservationCreatedBy;\n observedActorId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PerspectiveObservationExtractor {\n extract(\n event: MemoryEvent,\n context: { projectHash?: string; projectPath?: string | null }\n ): Promise<PerspectiveObservationCandidate[]>;\n}\n\nexport interface PerspectiveDeriverActors {\n resolveFromEvent(event: MemoryEvent, options?: { projectHash?: string }): Promise<MemoryActor>;\n}\n\nexport interface PerspectiveDeriverSessions {\n listBySession(input: { projectHash?: string; sessionId: string; limit?: number }): Promise<SessionActor[]>;\n upsertMembership(input: {\n projectHash?: string;\n sessionId: string;\n actorId: string;\n roleInSession: SessionActor['roleInSession'];\n observeSelf?: boolean;\n observeOthers?: boolean;\n metadata?: Record<string, unknown>;\n }): Promise<SessionActor>;\n}\n\nexport interface PerspectiveDeriverObservations {\n create(input: {\n projectHash?: string;\n observerActorId: string;\n observedActorId: string;\n sessionId?: string;\n level?: PerspectiveObservationLevel;\n content: string;\n confidence?: number;\n sourceEventIds: string[];\n sourceObservationIds?: string[];\n createdBy?: PerspectiveObservationCreatedBy;\n metadata?: Record<string, unknown>;\n actor?: string;\n }): Promise<PerspectiveObservation>;\n}\n\nexport interface PerspectiveDeriverOptions {\n actors: PerspectiveDeriverActors;\n sessions: PerspectiveDeriverSessions;\n observations: PerspectiveDeriverObservations;\n extractor?: PerspectiveObservationExtractor;\n config?: MemoryOperationsConfig['perspectiveMemory'];\n}\n\nexport type PerspectiveDerivationResult =\n | { status: 'skipped'; reason: 'disabled' | 'unsupported_event' | 'no_candidates' | 'no_observers'; created: 0; updated: 0 }\n | { status: 'ok'; created: number; updated: number }\n | { status: 'failed'; reason: 'extract_failed' | 'persist_failed'; created: number; updated: number; error: string };\n\ninterface NormalizedPerspectiveDeriverConfig {\n enabled: boolean;\n deriver: {\n enabled: boolean;\n maxEventsPerBatch: number;\n maxObserversPerSession: number;\n };\n}\n\nconst DEFAULT_CONFIG: NormalizedPerspectiveDeriverConfig = {\n enabled: false,\n deriver: {\n enabled: false,\n maxEventsPerBatch: 20,\n maxObserversPerSession: 5\n }\n};\n\nconst MAX_OBSERVATION_CONTENT_CHARS = 600;\n\nexport class RuleBasedPerspectiveObservationExtractor implements PerspectiveObservationExtractor {\n async extract(event: MemoryEvent): Promise<PerspectiveObservationCandidate[]> {\n if (!isSupportedSourceEvent(event)) return [];\n const content = normalizeObservationContent(event.content);\n if (!content) return [];\n return [{\n content,\n confidence: 0.6,\n level: 'explicit',\n createdBy: 'rule',\n metadata: {\n extractor: 'rule-based-minimal',\n sourceEventType: event.eventType\n }\n }];\n }\n}\n\nexport class PerspectiveDeriver {\n private readonly actors: PerspectiveDeriverActors;\n private readonly sessions: PerspectiveDeriverSessions;\n private readonly observations: PerspectiveDeriverObservations;\n private readonly extractor: PerspectiveObservationExtractor;\n private readonly config: NormalizedPerspectiveDeriverConfig;\n\n constructor(options: PerspectiveDeriverOptions) {\n this.actors = options.actors;\n this.sessions = options.sessions;\n this.observations = options.observations;\n this.extractor = options.extractor ?? new RuleBasedPerspectiveObservationExtractor();\n this.config = normalizeConfig(options.config);\n }\n\n async deriveFromEvent(\n event: MemoryEvent,\n context: { projectHash?: string | null; projectPath?: string | null } = {}\n ): Promise<PerspectiveDerivationResult> {\n if (!this.config.enabled || !this.config.deriver.enabled) {\n return { status: 'skipped', reason: 'disabled', created: 0, updated: 0 };\n }\n if (!isSupportedSourceEvent(event)) {\n return { status: 'skipped', reason: 'unsupported_event', created: 0, updated: 0 };\n }\n\n const projectHash = normalizeOptionalString(context.projectHash);\n const projectPath = context.projectPath ?? null;\n let candidates: PerspectiveObservationCandidate[];\n try {\n // Extraction may be backed by an LLM. Keep it before persistence writes so\n // no long-lived SQLite transaction can span an external model call.\n candidates = (await this.extractor.extract(event, { projectHash, projectPath }))\n .map(normalizeCandidate)\n .filter((candidate): candidate is NormalizedPerspectiveObservationCandidate => candidate !== null);\n } catch (error) {\n return { status: 'failed', reason: 'extract_failed', created: 0, updated: 0, error: safeErrorMessage(error) };\n }\n if (candidates.length === 0) {\n return { status: 'skipped', reason: 'no_candidates', created: 0, updated: 0 };\n }\n\n try {\n const sourceActor = await this.actors.resolveFromEvent(event, { projectHash });\n let members = await this.sessions.listBySession({\n projectHash,\n sessionId: event.sessionId,\n limit: this.config.deriver.maxObserversPerSession * 2\n });\n if (!members.some((member) => member.actorId === sourceActor.actorId)) {\n await this.sessions.upsertMembership({\n projectHash,\n sessionId: event.sessionId,\n actorId: sourceActor.actorId,\n roleInSession: roleForEvent(event),\n observeSelf: true,\n observeOthers: false,\n metadata: { source: 'perspective-deriver' }\n });\n members = await this.sessions.listBySession({\n projectHash,\n sessionId: event.sessionId,\n limit: this.config.deriver.maxObserversPerSession * 2\n });\n }\n\n let saved = 0;\n for (const candidate of candidates) {\n const observedActorId = candidate.observedActorId ?? sourceActor.actorId;\n const observers = selectObservers(members, observedActorId, this.config.deriver.maxObserversPerSession);\n if (observers.length === 0) continue;\n for (const observerActorId of observers) {\n await this.observations.create({\n projectHash,\n observerActorId,\n observedActorId,\n sessionId: event.sessionId,\n level: candidate.level,\n content: candidate.content,\n confidence: candidate.confidence,\n sourceEventIds: [event.id],\n sourceObservationIds: [],\n createdBy: candidate.createdBy,\n metadata: {\n deriver: 'minimal-perspective-deriver',\n sourceEventType: event.eventType,\n ...(candidate.metadata ?? {})\n },\n actor: 'perspective-deriver'\n });\n saved += 1;\n }\n }\n\n if (saved === 0) {\n return { status: 'skipped', reason: 'no_observers', created: 0, updated: 0 };\n }\n return { status: 'ok', created: saved, updated: 0 };\n } catch (error) {\n return { status: 'failed', reason: 'persist_failed', created: 0, updated: 0, error: safeErrorMessage(error) };\n }\n }\n}\n\ninterface NormalizedPerspectiveObservationCandidate {\n content: string;\n confidence: number;\n level: PerspectiveObservationLevel;\n createdBy: PerspectiveObservationCreatedBy;\n observedActorId?: string;\n metadata?: Record<string, unknown>;\n}\n\nfunction normalizeConfig(config: MemoryOperationsConfig['perspectiveMemory'] | undefined): NormalizedPerspectiveDeriverConfig {\n return {\n enabled: config?.enabled ?? DEFAULT_CONFIG.enabled,\n deriver: {\n enabled: config?.deriver?.enabled ?? DEFAULT_CONFIG.deriver.enabled,\n maxEventsPerBatch: clampInteger(\n config?.deriver?.maxEventsPerBatch,\n DEFAULT_CONFIG.deriver.maxEventsPerBatch,\n 1,\n 100\n ),\n maxObserversPerSession: clampInteger(\n config?.deriver?.maxObserversPerSession,\n DEFAULT_CONFIG.deriver.maxObserversPerSession,\n 1,\n 50\n )\n }\n };\n}\n\nfunction clampInteger(value: number | undefined, fallback: number, min: number, max: number): number {\n if (!Number.isFinite(value)) return fallback;\n return Math.max(min, Math.min(max, Math.trunc(Number(value))));\n}\n\nfunction isSupportedSourceEvent(event: MemoryEvent): boolean {\n return event.eventType === 'user_prompt' || event.eventType === 'agent_response';\n}\n\nfunction roleForEvent(event: MemoryEvent): SessionActor['roleInSession'] {\n if (event.eventType === 'user_prompt') return 'speaker';\n if (event.eventType === 'agent_response') return 'assistant';\n if (event.eventType === 'tool_observation') return 'tool';\n if (event.eventType === 'session_summary') return 'system';\n return 'unknown';\n}\n\nfunction normalizeCandidate(candidate: PerspectiveObservationCandidate): NormalizedPerspectiveObservationCandidate | null {\n const content = normalizeObservationContent(candidate.content);\n if (!content) return null;\n return {\n content,\n confidence: clampNumber(candidate.confidence, 0.6, 0, 1),\n level: candidate.level ?? 'explicit',\n createdBy: candidate.createdBy ?? 'rule',\n observedActorId: normalizeOptionalString(candidate.observedActorId),\n metadata: sanitizeCandidateMetadata(candidate.metadata)\n };\n}\n\nfunction normalizeObservationContent(content: string): string | null {\n const normalized = content.replace(/\\s+/g, ' ').trim();\n if (!normalized) return null;\n return normalized.slice(0, MAX_OBSERVATION_CONTENT_CHARS);\n}\n\nfunction normalizeOptionalString(value: string | null | undefined): string | undefined {\n const normalized = typeof value === 'string' ? value.trim() : '';\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction clampNumber(value: number | undefined, fallback: number, min: number, max: number): number {\n if (!Number.isFinite(value)) return fallback;\n return Math.max(min, Math.min(max, Number(value)));\n}\n\nfunction sanitizeCandidateMetadata(metadata: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n if (!metadata) return undefined;\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n result[key] = value;\n }\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction selectObservers(members: SessionActor[], observedActorId: string, maxObservers: number): string[] {\n const selected: string[] = [];\n for (const member of members) {\n const canObserve = member.actorId === observedActorId ? member.observeSelf : member.observeOthers;\n if (!canObserve) continue;\n if (!selected.includes(member.actorId)) selected.push(member.actorId);\n if (selected.length >= maxObservers) break;\n }\n return selected;\n}\n\nfunction safeErrorMessage(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n const sanitized = sanitizeGovernanceAuditValue(message);\n return String(sanitized).replace(/\\s+/g, ' ').slice(0, 160);\n}\n\nexport function createPerspectiveDeriver(options: PerspectiveDeriverOptions): PerspectiveDeriver {\n return new PerspectiveDeriver(options);\n}\n", "/**\n * LanceDB Vector Store for semantic search\n * AXIOMMIND Principle 6: Vector store consistency (DuckDB \u2192 outbox \u2192 LanceDB unidirectional)\n */\n\nimport * as lancedb from '@lancedb/lancedb';\nimport type { VectorRecord } from './types.js';\n\nexport interface SearchResult {\n id: string;\n eventId: string;\n content: string;\n score: number;\n sessionId: string;\n eventType: string;\n timestamp: string;\n}\n\ntype LanceTable = lancedb.Table;\n\ntype VectorRow = {\n id: string;\n eventId: string;\n sessionId: string;\n eventType: string;\n content: string;\n vector: number[];\n timestamp: string;\n metadata: string;\n};\n\nexport class VectorStore {\n private db: lancedb.Connection | null = null;\n private readonly tableCache = new Map<string, LanceTable>();\n private readonly defaultTableName = 'conversations';\n\n constructor(private dbPath: string) {}\n\n /**\n * Initialize LanceDB connection.\n *\n * Table handles are resolved lazily so Vector Outbox V2 can route records to\n * item-kind/embedding-version tables without eagerly touching the legacy\n * conversations table.\n */\n async initialize(): Promise<void> {\n if (this.db) return;\n this.db = await lancedb.connect(this.dbPath);\n }\n\n /**\n * Add or update vector record. Existing rows with the same stable id are\n * deleted before insertion to avoid append-only duplicates in LanceDB.\n */\n async upsert(record: VectorRecord): Promise<void> {\n await this.upsertBatch([record]);\n }\n\n /**\n * Add or update multiple vector records in batch, grouped by inferred table.\n */\n async upsertBatch(records: VectorRecord[]): Promise<void> {\n if (records.length === 0) return;\n\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const groups = new Map<string, VectorRow[]>();\n for (const record of records) {\n const tableName = this.getRecordTableName(record);\n const rows = groups.get(tableName) ?? [];\n rows.push(this.toVectorRow(record));\n groups.set(tableName, rows);\n }\n\n for (const [tableName, rows] of groups) {\n await this.upsertRows(tableName, rows);\n }\n }\n\n /**\n * Search for similar vectors in the legacy conversations table.\n */\n async search(\n queryVector: number[],\n options: {\n limit?: number;\n minScore?: number;\n sessionId?: string;\n } = {}\n ): Promise<SearchResult[]> {\n await this.initialize();\n\n const table = await this.getExistingTable(this.defaultTableName);\n if (!table) {\n return [];\n }\n\n const { limit = 5, minScore = 0.7, sessionId } = options;\n\n // Use cosine distance for semantic similarity\n let query = table\n .search(queryVector)\n .distanceType('cosine')\n .limit(limit * 2); // Get more for filtering\n\n // Apply session filter if specified\n if (sessionId) {\n query = query.where(`sessionId = ${toLanceSqlString(sessionId)}`);\n }\n\n const results = await query.toArray();\n\n return results\n .filter(r => {\n // Convert cosine distance to similarity score\n // Cosine distance ranges from 0 (identical) to 2 (opposite)\n // Score = 1 - (distance / 2) gives range [0, 1]\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return score >= minScore;\n })\n .slice(0, limit)\n .map(r => {\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return {\n id: r.id as string,\n eventId: r.eventId as string,\n content: r.content as string,\n score,\n sessionId: r.sessionId as string,\n eventType: r.eventType as string,\n timestamp: r.timestamp as string\n };\n });\n }\n\n /**\n * Delete vector by event ID from the legacy conversations table.\n */\n async delete(eventId: string): Promise<void> {\n await this.initialize();\n const table = await this.getExistingTable(this.defaultTableName);\n if (!table) return;\n await table.delete(`eventId = ${toLanceSqlString(eventId)}`);\n }\n\n /**\n * Get total count of vectors in the legacy conversations table.\n */\n async count(): Promise<number> {\n await this.initialize();\n const table = await this.getExistingTable(this.defaultTableName);\n if (!table) return 0;\n const result = await table.countRows();\n return result;\n }\n\n /**\n * Clear all legacy vectors (used for embedding model migration).\n */\n async clearAll(): Promise<void> {\n await this.initialize();\n if (!this.db) return;\n\n try {\n if (typeof (this.db as any).dropTable === 'function') {\n await (this.db as any).dropTable(this.defaultTableName);\n } else if (typeof (this.db as any).drop_table === 'function') {\n await (this.db as any).drop_table(this.defaultTableName);\n }\n } catch {\n // Ignore if table does not exist\n }\n\n this.tableCache.delete(this.defaultTableName);\n }\n\n /**\n * Check if vector exists for event in the legacy conversations table.\n */\n async exists(eventId: string): Promise<boolean> {\n await this.initialize();\n const table = await this.getExistingTable(this.defaultTableName);\n if (!table) return false;\n\n const results = await table\n .search([])\n .where(`eventId = ${toLanceSqlString(eventId)}`)\n .limit(1)\n .toArray();\n\n return results.length > 0;\n }\n\n private async upsertRows(tableName: string, rows: VectorRow[]): Promise<void> {\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const existingTable = await this.getExistingTable(tableName);\n if (existingTable) {\n for (const row of rows) {\n await existingTable.delete(`id = ${toLanceSqlString(row.id)}`);\n }\n await existingTable.add(rows);\n return;\n }\n\n try {\n const created = await this.db.createTable(tableName, rows);\n this.tableCache.set(tableName, created);\n } catch (error) {\n if (!isAlreadyExistsError(error)) {\n throw error;\n }\n const racedTable = await this.openTable(tableName);\n for (const row of rows) {\n await racedTable.delete(`id = ${toLanceSqlString(row.id)}`);\n }\n await racedTable.add(rows);\n }\n }\n\n private async getExistingTable(tableName: string): Promise<LanceTable | null> {\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const cached = this.tableCache.get(tableName);\n if (cached) return cached;\n\n const tableNames = await this.db.tableNames();\n if (!tableNames.includes(tableName)) {\n return null;\n }\n\n return this.openTable(tableName);\n }\n\n private async openTable(tableName: string): Promise<LanceTable> {\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n const table = await this.db.openTable(tableName);\n this.tableCache.set(tableName, table);\n return table;\n }\n\n private getRecordTableName(record: VectorRecord): string {\n const metadata = record.metadata ?? {};\n const itemKind = typeof metadata.itemKind === 'string' ? metadata.itemKind : null;\n const embeddingVersion = typeof metadata.embeddingVersion === 'string' ? metadata.embeddingVersion : null;\n\n if (!itemKind || !embeddingVersion) {\n return this.defaultTableName;\n }\n\n return `${slugifyTablePart(itemKind)}_vectors_${slugifyTablePart(embeddingVersion)}`;\n }\n\n private toVectorRow(record: VectorRecord): VectorRow {\n return {\n id: record.id,\n eventId: record.eventId,\n sessionId: record.sessionId,\n eventType: record.eventType,\n content: record.content,\n vector: record.vector,\n timestamp: record.timestamp,\n metadata: JSON.stringify(record.metadata || {})\n };\n }\n}\n\nfunction slugifyTablePart(value: string): string {\n return value\n .trim()\n .replace(/[^a-z0-9]+/gi, '_')\n .replace(/^_+|_+$/g, '')\n .toLowerCase() || 'default';\n}\n\nfunction toLanceSqlString(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nfunction isAlreadyExistsError(error: unknown): boolean {\n const message = String(error instanceof Error ? error.message : error).toLowerCase();\n return message.includes('already exists');\n}\n", "import type { MemoryEventInput } from './types.js';\n\nexport type IngestStage = 'before' | 'after' | 'error';\n\nexport interface IngestContext {\n stage: IngestStage;\n operation: 'user_prompt' | 'agent_response' | 'session_summary' | 'tool_observation';\n sessionId: string;\n event: MemoryEventInput;\n error?: Error;\n}\n\nexport type IngestInterceptor = (context: IngestContext) => Promise<void> | void;\n\nexport class IngestInterceptorRegistry {\n private before: IngestInterceptor[] = [];\n private after: IngestInterceptor[] = [];\n private onError: IngestInterceptor[] = [];\n\n registerBefore(interceptor: IngestInterceptor): () => void {\n this.before.push(interceptor);\n return () => {\n this.before = this.before.filter((i) => i !== interceptor);\n };\n }\n\n registerAfter(interceptor: IngestInterceptor): () => void {\n this.after.push(interceptor);\n return () => {\n this.after = this.after.filter((i) => i !== interceptor);\n };\n }\n\n registerOnError(interceptor: IngestInterceptor): () => void {\n this.onError.push(interceptor);\n return () => {\n this.onError = this.onError.filter((i) => i !== interceptor);\n };\n }\n\n async run(stage: IngestStage, context: Omit<IngestContext, 'stage'>): Promise<void> {\n const interceptors = stage === 'before'\n ? this.before\n : stage === 'after'\n ? this.after\n : this.onError;\n\n for (const interceptor of interceptors) {\n await interceptor({ ...context, stage });\n }\n }\n}\n\nexport function mergeHierarchicalMetadata(\n base: Record<string, unknown> | undefined,\n patch: Record<string, unknown> | undefined\n): Record<string, unknown> | undefined {\n if (!base && !patch) return undefined;\n if (!base) return patch;\n if (!patch) return base;\n\n const result: Record<string, unknown> = { ...base };\n\n for (const [key, value] of Object.entries(patch)) {\n const current = result[key];\n if (\n typeof current === 'object' && current !== null && !Array.isArray(current) &&\n typeof value === 'object' && value !== null && !Array.isArray(value)\n ) {\n result[key] = mergeHierarchicalMetadata(\n current as Record<string, unknown>,\n value as Record<string, unknown>\n );\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n", "export const TAG_NAMESPACES = {\n SYSTEM: 'sys:',\n QUALITY: 'q:',\n PROJECT: 'proj:',\n TOPIC: 'topic:',\n TEMPORAL: 't:',\n USER: 'user:',\n AGENT: 'agent:'\n} as const;\n\nexport const VALID_TAG_NAMESPACES = new Set<string>(Object.values(TAG_NAMESPACES));\n\nexport function parseTag(tag: string): { namespace?: string; value: string } {\n const value = (tag || '').trim();\n const idx = value.indexOf(':');\n if (idx <= 0) return { value };\n\n const namespace = `${value.slice(0, idx)}:`;\n const tagValue = value.slice(idx + 1);\n if (!tagValue) return { value };\n\n return { namespace, value: tagValue };\n}\n\nexport function validateTag(tag: string): boolean {\n const normalized = (tag || '').trim();\n if (!normalized) return false;\n\n const { namespace } = parseTag(normalized);\n if (!namespace) return true; // backward compatibility for legacy tags\n return VALID_TAG_NAMESPACES.has(namespace);\n}\n\nexport function withNamespace(value: string, namespace: string): string {\n const clean = parseTag(value).value.trim();\n return `${namespace}${clean}`;\n}\n\nexport function normalizeTags(tags: unknown): string[] {\n if (!Array.isArray(tags)) return [];\n\n const dedup = new Set<string>();\n for (const item of tags) {\n if (typeof item !== 'string') continue;\n const normalized = item.trim();\n if (!validateTag(normalized)) continue;\n dedup.add(normalized);\n }\n\n return [...dedup];\n}\n", "import type { MemoryEvent } from '../types.js';\n\nexport interface SessionSummaryDerivation {\n text: string;\n metadata: {\n generated: 'rule-based';\n eventCount: number;\n };\n}\n\nconst MAX_FIRST_PROMPT_LENGTH = 120;\nconst MAX_TOOL_NAMES = 6;\n\nexport class SummaryDeriver {\n /**\n * Derive the current lightweight rule-based session summary from raw events.\n *\n * The deriver is intentionally pure: callers own persistence and lifecycle\n * orchestration, while this class owns summary text and metadata decisions.\n */\n deriveSessionSummary(events: MemoryEvent[]): SessionSummaryDerivation | null {\n if (events.length < 3) return null;\n if (events.some((event) => event.eventType === 'session_summary')) return null;\n\n const prompts = events.filter((event) => event.eventType === 'user_prompt');\n const toolObservations = events.filter((event) => event.eventType === 'tool_observation');\n const toolNames = Array.from(new Set(\n toolObservations\n .map((event) => this.asRecord(event.metadata).toolName)\n .filter((toolName): toolName is string => typeof toolName === 'string' && toolName.length > 0)\n ));\n const errorObservations = toolObservations.filter((event) => this.isErrorObservation(event));\n\n const datePart = events[0].timestamp.toISOString().split('T')[0];\n const parts: string[] = [`[${datePart}] ${prompts.length}\uD134 \uC138\uC158`];\n\n if (prompts.length > 0) {\n parts.push(`\uC8FC\uC694 \uC791\uC5C5: ${this.firstPromptPreview(prompts[0].content)}`);\n }\n if (toolNames.length > 0) {\n parts.push(`\uC0AC\uC6A9 \uD234: ${toolNames.slice(0, MAX_TOOL_NAMES).join(', ')}`);\n }\n if (errorObservations.length > 0) {\n parts.push(`\uC624\uB958 ${errorObservations.length}\uAC74 \uBC1C\uC0DD`);\n }\n\n return {\n text: parts.join('. '),\n metadata: { generated: 'rule-based', eventCount: events.length }\n };\n }\n\n private firstPromptPreview(content: string): string {\n return content.slice(0, MAX_FIRST_PROMPT_LENGTH).replace(/\\r?\\n/g, ' ');\n }\n\n private isErrorObservation(event: MemoryEvent): boolean {\n const metadata = this.asRecord(event.metadata);\n\n if (metadata.exitCode !== undefined) {\n return metadata.exitCode !== 0;\n }\n\n return metadata.success === false;\n }\n\n private asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : {};\n }\n}\n\nexport function createSummaryDeriver(): SummaryDeriver {\n return new SummaryDeriver();\n}\n", "import {\n IngestInterceptor,\n IngestInterceptorRegistry,\n mergeHierarchicalMetadata\n} from '../ingest-interceptor.js';\nimport { normalizeTags } from '../tag-taxonomy.js';\nimport { createSummaryDeriver, type SummaryDeriver } from '../derive/summary-deriver.js';\nimport type { AppendResult, MemoryEvent, MemoryEventInput, ToolObservationPayload } from '../types.js';\n\nexport interface PerspectiveDeriverLike {\n deriveFromEvent(\n event: MemoryEvent,\n options?: { projectHash?: string | null; projectPath?: string | null }\n ): Promise<unknown>;\n}\n\ninterface SessionRecord {\n id: string;\n startedAt?: Date;\n endedAt?: Date;\n projectPath?: string;\n summary?: string;\n}\n\ninterface SessionUpsertStore {\n upsertSession(session: SessionRecord): Promise<void>;\n getSessionEvents(sessionId: string): Promise<MemoryEvent[]>;\n getSessionsWithoutSummary(currentSessionId: string, limit?: number): Promise<string[]>;\n}\n\ninterface IngestEventStore extends SessionUpsertStore {\n append(input: MemoryEventInput): Promise<AppendResult>;\n enqueueForEmbedding(eventId: string, content: string): Promise<unknown>;\n}\n\ninterface IngestMarkdownMirror {\n append(event: MemoryEventInput, eventId?: string): Promise<void>;\n}\n\nexport type IngestOperation = 'user_prompt' | 'agent_response' | 'session_summary' | 'tool_observation';\n\nexport interface MemoryIngestServiceOptions {\n initialize: () => Promise<void>;\n eventStore: IngestEventStore;\n markdownMirror: IngestMarkdownMirror;\n createToolEmbedding: (payload: ToolObservationPayload) => string;\n getProjectHash?: () => string | null;\n getProjectPath?: () => string | null;\n summaryDeriver?: SummaryDeriver;\n perspectiveDeriver?: PerspectiveDeriverLike;\n}\n\n/**\n * Thin-core ingest service for session lifecycle and event writes.\n *\n * Owns the ingest normalization/interceptor/append pipeline so the public\n * MemoryService facade can delegate ingest behavior without coordinating\n * storage-side effects itself.\n */\nexport class MemoryIngestService {\n private readonly initialize: () => Promise<void>;\n private readonly eventStore: IngestEventStore;\n private readonly markdownMirror: IngestMarkdownMirror;\n private readonly createToolEmbedding: (payload: ToolObservationPayload) => string;\n private readonly getProjectHash: () => string | null;\n private readonly getProjectPath: () => string | null;\n private readonly summaryDeriver: SummaryDeriver;\n private readonly perspectiveDeriver?: PerspectiveDeriverLike;\n private readonly ingestInterceptors = new IngestInterceptorRegistry();\n\n constructor(options: MemoryIngestServiceOptions) {\n this.initialize = options.initialize;\n this.eventStore = options.eventStore;\n this.markdownMirror = options.markdownMirror;\n this.createToolEmbedding = options.createToolEmbedding;\n this.getProjectHash = options.getProjectHash ?? (() => null);\n this.getProjectPath = options.getProjectPath ?? (() => null);\n this.summaryDeriver = options.summaryDeriver ?? createSummaryDeriver();\n this.perspectiveDeriver = options.perspectiveDeriver;\n }\n\n registerIngestBefore(interceptor: IngestInterceptor): () => void {\n return this.ingestInterceptors.registerBefore(interceptor);\n }\n\n registerIngestAfter(interceptor: IngestInterceptor): () => void {\n return this.ingestInterceptors.registerAfter(interceptor);\n }\n\n registerIngestOnError(interceptor: IngestInterceptor): () => void {\n return this.ingestInterceptors.registerOnError(interceptor);\n }\n\n async startSession(sessionId: string, projectPath?: string): Promise<void> {\n await this.initialize();\n\n await this.eventStore.upsertSession({\n id: sessionId,\n startedAt: new Date(),\n projectPath\n });\n }\n\n async endSession(sessionId: string, summary?: string): Promise<void> {\n await this.initialize();\n\n await this.eventStore.upsertSession({\n id: sessionId,\n endedAt: new Date(),\n summary\n });\n }\n\n async storeUserPrompt(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestEvent({\n operation: 'user_prompt',\n input: {\n eventType: 'user_prompt',\n sessionId,\n timestamp: new Date(),\n content,\n metadata\n },\n embeddingContent: content\n });\n }\n\n async storeAgentResponse(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestEvent({\n operation: 'agent_response',\n input: {\n eventType: 'agent_response',\n sessionId,\n timestamp: new Date(),\n content,\n metadata\n },\n embeddingContent: content\n });\n }\n\n async storeSessionSummary(\n sessionId: string,\n summary: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n return this.ingestEvent({\n operation: 'session_summary',\n input: {\n eventType: 'session_summary',\n sessionId,\n timestamp: new Date(),\n content: summary,\n metadata\n },\n embeddingContent: summary\n });\n }\n\n /**\n * Backfill session summaries for recent sessions that are missing them.\n * Called from session-start hook to catch sessions that ended without Stop hook.\n */\n async backfillMissingSummaries(currentSessionId: string, limit = 5): Promise<void> {\n await this.initialize();\n\n const recentSessionIds = await this.eventStore.getSessionsWithoutSummary(currentSessionId, limit);\n for (const sessionId of recentSessionIds) {\n try {\n await this.generateSessionSummary(sessionId);\n } catch {\n // non-critical backfill path\n }\n }\n }\n\n /**\n * Generate a rule-based session summary from stored events.\n * Skips short sessions and sessions that already contain a summary event.\n */\n async generateSessionSummary(sessionId: string): Promise<void> {\n await this.initialize();\n\n const events = await this.eventStore.getSessionEvents(sessionId);\n const summary = this.summaryDeriver.deriveSessionSummary(events);\n if (!summary) return;\n\n await this.storeSessionSummary(sessionId, summary.text, summary.metadata);\n }\n\n async storeToolObservation(\n sessionId: string,\n payload: ToolObservationPayload\n ): Promise<AppendResult> {\n const content = JSON.stringify(payload);\n const turnId = (payload.metadata as Record<string, unknown> | undefined)?.turnId;\n\n return this.ingestEvent({\n operation: 'tool_observation',\n input: {\n eventType: 'tool_observation',\n sessionId,\n timestamp: new Date(),\n content,\n metadata: {\n toolName: payload.toolName,\n success: payload.success,\n ...(typeof turnId === 'string' && turnId.length > 0 ? { turnId } : {})\n }\n },\n embeddingContent: this.createToolEmbedding(payload)\n });\n }\n\n private async ingestEvent(options: {\n operation: IngestOperation;\n input: MemoryEventInput;\n embeddingContent?: string;\n }): Promise<AppendResult> {\n const normalizedInput = this.normalizeInput(options.operation, options.input);\n\n await this.ingestInterceptors.run('before', {\n operation: options.operation,\n sessionId: normalizedInput.sessionId,\n event: normalizedInput\n });\n\n try {\n const result = await this.eventStore.append(normalizedInput);\n if (result.success === false) {\n await this.ingestInterceptors.run('error', {\n operation: options.operation,\n sessionId: normalizedInput.sessionId,\n event: normalizedInput,\n error: new Error(result.error)\n });\n return result;\n }\n\n if (!result.isDuplicate) {\n if (options.embeddingContent) {\n await this.eventStore.enqueueForEmbedding(result.eventId, options.embeddingContent);\n }\n try {\n await this.markdownMirror.append(normalizedInput, result.eventId);\n } catch {\n // non-breaking markdown mirror write\n }\n await this.runPerspectiveDeriver(normalizedInput, result.eventId, options.operation);\n }\n\n await this.ingestInterceptors.run('after', {\n operation: options.operation,\n sessionId: normalizedInput.sessionId,\n event: normalizedInput\n });\n\n return result;\n } catch (error) {\n const normalizedError = error instanceof Error ? error : new Error(String(error));\n await this.ingestInterceptors.run('error', {\n operation: options.operation,\n sessionId: normalizedInput.sessionId,\n event: normalizedInput,\n error: normalizedError\n });\n throw error;\n }\n }\n\n private async runPerspectiveDeriver(\n input: MemoryEventInput,\n eventId: string,\n operation: IngestOperation\n ): Promise<void> {\n if (!this.perspectiveDeriver) return;\n if (operation !== 'user_prompt' && operation !== 'agent_response') return;\n const event: MemoryEvent = {\n id: eventId,\n eventType: input.eventType,\n sessionId: input.sessionId,\n timestamp: input.timestamp,\n content: input.content,\n canonicalKey: eventId,\n dedupeKey: eventId,\n metadata: input.metadata\n };\n try {\n await this.perspectiveDeriver.deriveFromEvent(event, {\n projectHash: this.getProjectHash(),\n projectPath: this.getProjectPath()\n });\n } catch {\n // Optional perspective derivation must never block normal memory ingestion.\n }\n }\n\n private normalizeInput(operation: IngestOperation, input: MemoryEventInput): MemoryEventInput {\n const projectHash = this.getProjectHash();\n const projectPath = this.getProjectPath();\n const normalizedInput: MemoryEventInput = {\n ...input,\n metadata: mergeHierarchicalMetadata(\n {\n ingest: {\n operation,\n pipeline: 'default',\n ts: new Date().toISOString()\n },\n ...(projectHash\n ? {\n scope: {\n project: {\n hash: projectHash,\n ...(projectPath ? { path: projectPath } : {})\n }\n },\n tags: [`proj:${projectHash}`]\n }\n : {})\n },\n input.metadata\n )\n };\n\n if (projectHash && normalizedInput.metadata) {\n const meta = normalizedInput.metadata as Record<string, unknown>;\n const currentTags = Array.isArray(meta.tags)\n ? meta.tags.filter((x): x is string => typeof x === 'string')\n : [];\n const projectTag = `proj:${projectHash}`;\n if (!currentTags.includes(projectTag)) {\n meta.tags = [...currentTags, projectTag];\n }\n }\n\n if (normalizedInput.metadata) {\n const meta = normalizedInput.metadata as Record<string, unknown>;\n const normalizedTags = normalizeTags(meta.tags);\n if (normalizedTags.length > 0) {\n meta.tags = normalizedTags;\n }\n }\n\n return normalizedInput;\n }\n}\n", "import type {\n MemoryEvent,\n OutboxStats,\n OutboxStatsOptions,\n OutboxRecoveryOptions,\n OutboxRecoveryResult,\n ProjectScopeRepairOptions,\n ProjectScopeRepairResult\n} from '../types.js';\n\ninterface RankedKeywordResult {\n event: MemoryEvent;\n rank: number;\n}\n\nexport interface MemorySessionTurn {\n turnId: string;\n events: MemoryEvent[];\n startedAt: Date;\n promptPreview: string;\n eventCount: number;\n toolCount: number;\n hasResponse: boolean;\n}\n\nexport type MemoryOutboxStats = OutboxStats;\n\nexport interface MemoryStats {\n totalEvents: number;\n vectorCount: number;\n levelStats: Array<{ level: string; count: number }>;\n}\n\ninterface QueryStore {\n keywordSearch(query: string, topK: number): Promise<RankedKeywordResult[]>;\n getSessionEvents(sessionId: string): Promise<MemoryEvent[]>;\n getRecentEvents(limit: number): Promise<MemoryEvent[]>;\n}\n\ninterface QueryMaintenanceStore extends QueryStore {\n rebuildFtsIndex(): Promise<number>;\n getOutboxStats(options?: OutboxStatsOptions): Promise<MemoryOutboxStats>;\n recoverStuckOutboxItems(options?: OutboxRecoveryOptions): Promise<OutboxRecoveryResult>;\n repairLegacyProjectScope(options?: ProjectScopeRepairOptions): Promise<ProjectScopeRepairResult>;\n getEventsByLevel(level: string, options?: { limit?: number; offset?: number }): Promise<MemoryEvent[]>;\n getEventLevel(eventId: string): Promise<string | null>;\n getSessionTurns(sessionId: string, options?: { limit?: number; offset?: number }): Promise<MemorySessionTurn[]>;\n getEventsByTurn(turnId: string): Promise<MemoryEvent[]>;\n countSessionTurns(sessionId: string): Promise<number>;\n backfillTurnIds(): Promise<number>;\n deleteSessionEvents(sessionId: string): Promise<number>;\n}\n\ninterface MemoryQueryServiceDeps {\n vectorStore: { count(): Promise<number> };\n graduation: { getStats(): Promise<Array<{ level: string; count: number }>> };\n}\n\n/**\n * Thin-core query service for lightweight read and maintenance paths.\n *\n * Higher-level retrieval orchestration lives in RetrievalOrchestrator;\n * this service keeps storage-backed read models and maintenance delegates separate.\n */\nexport class MemoryQueryService {\n constructor(\n private readonly initialize: () => Promise<void>,\n private readonly queryStore: QueryStore,\n private readonly deps?: MemoryQueryServiceDeps\n ) {}\n\n async keywordSearch(\n query: string,\n options?: { topK?: number; minScore?: number }\n ): Promise<Array<{ event: MemoryEvent; score: number }>> {\n await this.initialize();\n\n const results = await this.queryStore.keywordSearch(query, options?.topK ?? 10);\n if (results.length === 0) return [];\n\n const maxRank = Math.min(...results.map((r) => r.rank), -0.001);\n const minRank = Math.max(...results.map((r) => r.rank), -1000);\n const rankRange = maxRank - minRank || 1;\n\n return results\n .map((r) => ({\n event: r.event,\n score: 1 - (r.rank - minRank) / rankRange\n }))\n .filter((r) => !options?.minScore || r.score >= options.minScore);\n }\n\n async getSessionHistory(sessionId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.queryStore.getSessionEvents(sessionId);\n }\n\n async getRecentEvents(limit: number = 100): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.queryStore.getRecentEvents(limit);\n }\n\n async rebuildFtsIndex(): Promise<number> {\n await this.initialize();\n return this.getMaintenanceStore('rebuildFtsIndex').rebuildFtsIndex();\n }\n\n async getOutboxStats(options?: OutboxStatsOptions): Promise<MemoryOutboxStats> {\n await this.initialize();\n return this.getMaintenanceStore('getOutboxStats').getOutboxStats(options);\n }\n\n async recoverStuckOutboxItems(options?: OutboxRecoveryOptions): Promise<OutboxRecoveryResult> {\n await this.initialize();\n return this.getMaintenanceStore('recoverStuckOutboxItems').recoverStuckOutboxItems(options);\n }\n\n async repairLegacyProjectScope(options?: ProjectScopeRepairOptions): Promise<ProjectScopeRepairResult> {\n await this.initialize();\n return this.getMaintenanceStore('repairLegacyProjectScope').repairLegacyProjectScope(options);\n }\n\n async getStats(): Promise<MemoryStats> {\n await this.initialize();\n\n const deps = this.getStatsDeps();\n const recentEvents = await this.queryStore.getRecentEvents(10000);\n const vectorCount = await deps.vectorStore.count();\n const levelStats = await deps.graduation.getStats();\n\n return {\n totalEvents: recentEvents.length,\n vectorCount,\n levelStats\n };\n }\n\n async getEventsByLevel(level: string, options?: { limit?: number; offset?: number }): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.getMaintenanceStore('getEventsByLevel').getEventsByLevel(level, options);\n }\n\n async getEventLevel(eventId: string): Promise<string | null> {\n await this.initialize();\n return this.getMaintenanceStore('getEventLevel').getEventLevel(eventId);\n }\n\n async getSessionTurns(\n sessionId: string,\n options?: { limit?: number; offset?: number }\n ): Promise<MemorySessionTurn[]> {\n await this.initialize();\n return this.getMaintenanceStore('getSessionTurns').getSessionTurns(sessionId, options);\n }\n\n async getEventsByTurn(turnId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.getMaintenanceStore('getEventsByTurn').getEventsByTurn(turnId);\n }\n\n async countSessionTurns(sessionId: string): Promise<number> {\n await this.initialize();\n return this.getMaintenanceStore('countSessionTurns').countSessionTurns(sessionId);\n }\n\n async backfillTurnIds(): Promise<number> {\n await this.initialize();\n return this.getMaintenanceStore('backfillTurnIds').backfillTurnIds();\n }\n\n async deleteSessionEvents(sessionId: string): Promise<number> {\n await this.initialize();\n return this.getMaintenanceStore('deleteSessionEvents').deleteSessionEvents(sessionId);\n }\n\n private getMaintenanceStore(method: keyof QueryMaintenanceStore): QueryMaintenanceStore {\n const store = this.queryStore as QueryStore & Partial<QueryMaintenanceStore>;\n if (typeof store[method] !== 'function') {\n throw new Error(`MemoryQueryService requires queryStore.${String(method)}() for this operation`);\n }\n return store as QueryMaintenanceStore;\n }\n\n private getStatsDeps(): MemoryQueryServiceDeps {\n if (!this.deps) {\n throw new Error('MemoryQueryService requires vectorStore and graduation dependencies for getStats()');\n }\n return this.deps;\n }\n}\n", "/**\n * Retrieval quality guards.\n *\n * These are deliberately small deterministic heuristics used to avoid injecting\n * obviously irrelevant memories. They are not a second source of truth; they\n * only filter candidate retrieval results before context assembly.\n */\n\nconst COMMAND_ARTIFACT_PATTERNS = [\n /<\\/?(?:local-command-(?:stdout|stderr)|command-(?:name|message))\\b/i,\n /<command-name>[\\s\\S]*?<\\/command-name>/i,\n /<local-command-stdout>[\\s\\S]*?<\\/local-command-stdout>/i,\n /<local-command-stderr>[\\s\\S]*?<\\/local-command-stderr>/i\n];\n\nconst LOW_SIGNAL_CONTEXT_PATTERNS = [\n /<environment_context\\b[\\s\\S]*<\\/environment_context>/i,\n /<turn_aborted>/i,\n /^#\\s*AGENTS\\.md\\s+instructions\\b[\\s\\S]*<INSTRUCTIONS>/i,\n /^\\s*(?:understood[,\\s.]*)?(?:stopping|stopped|pausing|paused)\\s+here\\b[\\s\\S]{0,180}\\blet\\s+me\\s+know\\s+when\\s+you(?:'d|\\s+would)?\\s+like\\s+to\\s+continue\\b/i,\n /^\\s*\\[?CONTEXT\\s+COMPACTION\\s*[\u2014-]\\s*REFERENCE\\s+ONLY\\]?\\b[\\s\\S]{0,600}\\b(?:earlier\\s+turns\\s+were\\s+compacted|handoff\\s+from\\s+a\\s+previous\\s+context\\s+window|active\\s+task)\\b/i,\n /^\\s*Summary\\s+generation\\s+was\\s+unavailable\\.\\s*\\d+\\s+message\\(s\\)\\s+were\\s+removed\\s+to\\s+free\\s+context\\s+space\\b/i,\n /^\\s*---\\s*END\\s+OF\\s+CONTEXT\\s+SUMMARY\\b/i,\n /^\\s*\\[Your\\s+active\\s+task\\s+list\\s+was\\s+preserved\\s+across\\s+context\\s+compression\\]/i,\n /^\u279C\\s+\\S+\\s+git:\\([^)]*\\)\\s+/i,\n /^\\$\\s+\\S+/i\n];\n\nconst CONTINUATION_QUERY_PATTERNS = [\n /^\\s*(?:continue|resume|next|what(?:'s| is)? next|next\\s+(?:step|task|action)|recommended\\s+(?:next\\s+)?(?:step|task|action)|what should (?:we|i) do next)\\??\\s*$/i,\n /^\\s*(?:\uC751\\s*)?(?:\uC774\uC5B4\uC11C(?:\\s*\uC9C4\uD589(?:\uD574\uC918)?)?|\uACC4\uC18D(?:\\s*\uD574\uC918)?|\uB2E4\uC74C\\s*(?:\uB2E8\uACC4|\uC791\uC5C5|\uCD94\uCC9C\\s*\uC791\uC5C5|\uCD94\uCC9C|\uD560\\s*\uC77C)?(?:\uC740|\uB294)?(?:\\s*(?:\uBB50\uC57C|\uC9C4\uD589(?:\uD574\uC918)?))?\\??|\uB0A8\uC740\\s*(?:\uCD94\uAC00(?:\uB85C)?\\s*)?(?:(?:\uD560\\s*\uB9CC\uD55C\\s*)?(?:\uC791\uC5C5|\uC77C)|\uD560\\s*\uC77C)?(?:\uC740|\uB294)?\\s*(?:\uC788\uC5B4|\uC788\uB098|\uC788\uB098\uC694|\uBB50\uC57C)\\??|\uCD94\uCC9C\\s*\uC791\uC5C5(?:\uC740|\uB294)?(?:\\s*\uBB50\uC57C)?\\??|\uC9C4\uD589\uD574\uC918)\\s*$/i\n];\n\nconst SHORT_REPAIR_FOLLOW_UP_PATTERNS = [\n /^\\s*(?:fix\\s+(?:it|that)|repair\\s+(?:it|that)|resolve\\s+(?:it|that)|that\\s+bug|same\\s+issue)\\s*$/i,\n /^\\s*(?:\uADF8\uAC70|\uADF8\uAC83|\uC774\uAC70|\uC774\uAC83)?\\s*(?:\uACE0\uCCD0\uC918|\uC218\uC815\uD574\uC918|\uD574\uACB0\uD574\uC918|\uCC98\uB9AC\uD574\uC918)\\s*$/i\n];\n\nconst CURRENT_STATE_QUERY_PATTERNS = [\n /\\bcurrent\\b.*\\b(?:state|status|deployment|blocker|pr|pull request)\\b/i,\n /\\b(?:still|as current|current)\\b.*\\b(?:unresolved|open|pending|not completed)\\b/i,\n /\\b(?:old|obsolete|stale|resolved|already resolved)\\b.*\\b(?:current|still|unresolved|open|status)\\b/i,\n /(?:\uD604\uC7AC|\uC544\uC9C1|\uC774\uC804|\uC624\uB798\uB41C|\uD574\uACB0\uB41C).*(?:\uC0C1\uD0DC|\uBBF8\uD574\uACB0|\uC5F4\uB9B0|\uBE14\uB85C\uCEE4|PR|\uD480\uB9AC\uD018\uC2A4\uD2B8)/i\n];\n\nconst STALE_CONTENT_PATTERNS = [\n /\\b(?:obsolete|superseded|outdated)\\b/i,\n /\\bstale\\s+(?:operational\\s+)?state\\b/i,\n /\\bstale\\s+after\\b/i,\n /\\bno\\s+longer\\s+(?:valid|current|applies?)\\b/i,\n /\\bearlier\\s+(?:pull request|pr)\\b[\\s\\S]{0,160}\\b(?:open|not completed|had not completed)\\b/i,\n /\\bshould\\s+not\\s+be\\s+injected\\s+as\\s+current\\s+context\\b/i,\n /(?:\uC624\uB798\uB41C|\uB354 \uC774\uC0C1 \uC720\uD6A8\uD558\uC9C0|\uD604\uC7AC \uC0C1\uD0DC\uAC00 \uC544\uB2D8)/i\n];\n\nconst CONTINUATION_EXPANSION = 'current next step plan roadmap status validation replay rerank memory usefulness continuation';\nconst REPAIR_FOLLOW_UP_EXPANSION = 'review blocker fix pattern dashboard error state metrics bucket validation sanitize rerun unresolved';\nconst RETRIEVAL_PRIVACY_DECISION_EXPANSION = 'retrieval telemetry privacy public api dashboard dashboards rawQueryText queryText raw query text expose safe trace metadata trace id reason strategy rewrite kind aggregate count counts candidate selected public panel';\n\nconst DECISION_RECALL_TERMS = new Set([\n 'decide',\n 'decided',\n 'decision',\n 'agreed',\n 'policy',\n 'constraint'\n]);\n\nconst RETRIEVAL_PRIVACY_SURFACE_TERMS = new Set([\n 'retrieval',\n 'dashboard',\n 'telemetry',\n 'trace'\n]);\n\nconst DECISION_TOPIC_WEAK_TERMS = new Set([\n 'api',\n 'dashboard',\n 'retrieval',\n 'trace',\n 'telemetry',\n 'query',\n 'raw',\n 'count',\n 'counts'\n]);\n\nconst GENERIC_TECHNICAL_TERMS = new Set([\n 'api',\n 'cli',\n 'ui',\n 'json',\n 'jsonl',\n 'html',\n 'http',\n 'https',\n 'url',\n 'uri',\n 'id',\n 'ids',\n 'uuid',\n 'db',\n 'sql'\n]);\n\nconst LOW_INFORMATION_QUERY_TERMS = new Set([\n 'the',\n 'and',\n 'or',\n 'for',\n 'from',\n 'with',\n 'without',\n 'about',\n 'what',\n 'when',\n 'where',\n 'which',\n 'who',\n 'why',\n 'how',\n 'did',\n 'does',\n 'do',\n 'we',\n 'i',\n 'in',\n 'to',\n 'of',\n 'on',\n 'as',\n 'be',\n 'was',\n 'were',\n 'decide',\n 'decided',\n 'decision',\n 'agreed',\n 'policy',\n 'constraint',\n 'showing',\n 'can',\n 'you',\n 'me',\n 'show',\n 'tell',\n 'please',\n 'should',\n 'would',\n 'could',\n 'this',\n 'that',\n 'these',\n 'those',\n 'use',\n 'using',\n 'treat',\n 'continue',\n 'resume',\n 'next',\n 'step',\n 'task',\n 'action',\n 'current',\n 'state',\n 'status',\n 'old',\n 'already',\n 'still',\n 'near',\n 'today',\n '\uC751',\n '\uADF8\uAC70',\n '\uADF8\uAC83',\n '\uC774\uAC70',\n '\uC774\uAC83',\n '\uB2E4\uC74C',\n '\uB2E8\uACC4',\n '\uC9C4\uD589',\n '\uC9C4\uD589\uD574\uC918',\n '\uACC4\uC18D',\n '\uC774\uC5B4\uC11C',\n '\uACE0\uCCD0\uC918',\n '\uC218\uC815\uD574\uC918',\n '\uD574\uACB0\uD574\uC918'\n]);\n\nexport function isCommandArtifactQuery(query: string): boolean {\n const trimmed = query.trim();\n if (!trimmed) return false;\n const normalized = trimmed.toLowerCase();\n if (normalized.includes('local-command-stdout') || normalized.includes('local-command-stderr')) return true;\n if (normalized.includes('command-name') || normalized.includes('command-message')) return true;\n return COMMAND_ARTIFACT_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nexport function isCommandArtifactContent(content: string): boolean {\n const trimmed = content.trim();\n if (!trimmed) return false;\n const normalized = trimmed.toLowerCase();\n if (normalized.includes('local-command-stdout') || normalized.includes('local-command-stderr')) return true;\n if (normalized.includes('command-name') || normalized.includes('command-message')) return true;\n return COMMAND_ARTIFACT_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nexport function isLowSignalContextContent(content: string): boolean {\n const trimmed = content.trim();\n if (!trimmed) return true;\n if (isCommandArtifactContent(trimmed)) return true;\n if (LOW_SIGNAL_CONTEXT_PATTERNS.some((pattern) => pattern.test(trimmed))) return true;\n return false;\n}\n\nexport function isGenericContinuationQuery(query: string): boolean {\n const trimmed = query.trim();\n if (!trimmed) return false;\n if (!CONTINUATION_QUERY_PATTERNS.some((pattern) => pattern.test(trimmed))) return false;\n if (extractTechnicalQueryTerms(trimmed).length > 0) return false;\n\n const tokens = trimmed.match(/[A-Za-z0-9\uAC00-\uD7A3#._/-]+/g) ?? [];\n if (tokens.length > 10) return false;\n\n return !/[A-Za-z0-9_-]+\\.[A-Za-z0-9]+/.test(trimmed) &&\n !/(?:^|\\s)(?:feat|fix|chore|refactor|docs)\\/[A-Za-z0-9._-]+/.test(trimmed) &&\n !/[A-Za-z]:?[\\\\/]|\\/Users\\/|\\.\\/|\\.\\.\\//.test(trimmed);\n}\n\nexport function isShortRepairFollowUpQuery(query: string): boolean {\n const trimmed = query.trim();\n if (!trimmed) return false;\n if (extractTechnicalQueryTerms(trimmed).length > 0) return false;\n const tokens = trimmed.match(/[A-Za-z0-9\uAC00-\uD7A3#._/-]+/g) ?? [];\n if (tokens.length > 8) return false;\n return SHORT_REPAIR_FOLLOW_UP_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nexport function isLowConfidenceContextFallbackQuery(query: string): boolean {\n const trimmed = query.trim();\n if (!trimmed) return false;\n if (isGenericContinuationQuery(trimmed) || isShortRepairFollowUpQuery(trimmed)) return true;\n\n const terms = new Set(tokenizeQualityText(trimmed));\n if ((terms.has('compacted') || terms.has('compaction')) && terms.has('handoff')) return false;\n const hasContinuationRecall = /^(?:continue|resume)\\b/i.test(trimmed) &&\n (terms.has('work') || terms.has('step') || terms.has('task') || terms.has('last') || terms.has('completed'));\n const hasValidationGateRecall = terms.has('validation') &&\n (terms.has('gate') || terms.has('check')) &&\n (terms.has('run') || terms.has('before') || terms.has('commit') || terms.has('committing') || terms.has('change'));\n\n return hasContinuationRecall || hasValidationGateRecall;\n}\n\nexport function isCurrentStateQuery(query: string): boolean {\n const trimmed = query.trim();\n if (!trimmed) return false;\n return CURRENT_STATE_QUERY_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nexport function isStaleOrSupersededContent(content: string): boolean {\n const trimmed = content.trim();\n if (!trimmed) return false;\n return STALE_CONTENT_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nexport function buildRetrievalQualityQuery(query: string): string {\n const trimmed = query.trim();\n if (!trimmed) return query;\n if (isRetrievalPrivacyDecisionQuery(trimmed)) {\n return `${trimmed} ${RETRIEVAL_PRIVACY_DECISION_EXPANSION}`;\n }\n if (isGenericContinuationQuery(trimmed)) {\n return `${trimmed} ${CONTINUATION_EXPANSION}`;\n }\n if (isShortRepairFollowUpQuery(trimmed)) {\n return `${trimmed} ${REPAIR_FOLLOW_UP_EXPANSION}`;\n }\n return query;\n}\n\nexport function isRetrievalPrivacyDecisionQuery(query: string): boolean {\n const trimmed = query.trim();\n if (!trimmed) return false;\n\n const terms = new Set(tokenizeQualityText(trimmed));\n const hasDecisionSignal = hasAnyTerm(terms, DECISION_RECALL_TERMS) || /(?:\uACB0\uC815|\uC815\uCC45|\uC6D0\uCE59)/i.test(trimmed);\n if (!hasDecisionSignal) return false;\n\n const hasRawQuerySignal = terms.has('raw') && terms.has('query');\n const hasPrivacySignal = terms.has('privacy') || terms.has('expose') || terms.has('redacted');\n const hasRetrievalSurface = hasAnyTerm(terms, RETRIEVAL_PRIVACY_SURFACE_TERMS) ||\n (terms.has('api') && terms.has('query'));\n const hasQuerySurface = terms.has('query') && (\n terms.has('dashboard') ||\n terms.has('trace') ||\n terms.has('telemetry') ||\n terms.has('api')\n );\n const hasKoreanRetrievalSurface = /(?:\uAC80\uC0C9|\uB9AC\uD2B8\uB9AC\uBC8C|retrieval|\uB300\uC2DC\uBCF4\uB4DC|\uD2B8\uB808\uC774\uC2A4|\uD154\uB808\uBA54\uD2B8\uB9AC|telemetry)/i.test(trimmed);\n const hasKoreanPrivacySurface = /(?:\uC6D0\uBB38|\uCFFC\uB9AC|\uD504\uB77C\uC774\uBC84\uC2DC|\uAC1C\uC778\uC815\uBCF4|\uB178\uCD9C|\uD2B8\uB808\uC774\uC2A4|\uBA54\uD0C0\uB370\uC774\uD130)/i.test(trimmed);\n\n return (hasRetrievalSurface || (hasKoreanRetrievalSurface && hasKoreanPrivacySurface)) &&\n (hasRawQuerySignal || hasPrivacySignal || hasQuerySurface || hasKoreanPrivacySurface);\n}\n\nexport function extractTechnicalQueryTerms(query: string): string[] {\n const matches = query.match(/[A-Za-z][A-Za-z0-9_.:-]{2,}/g) ?? [];\n const terms = matches.filter((term) => {\n const lower = term.toLowerCase();\n if (GENERIC_TECHNICAL_TERMS.has(lower)) return false;\n return /[._:-]/.test(term) || /[a-z][A-Z]/.test(term) || /[A-Z]{2,}/.test(term) || /\\d/.test(term);\n });\n\n return Array.from(new Set(terms.map((term) => term.toLowerCase())));\n}\n\nexport function hasTechnicalTermOverlap(query: string, content: string): boolean {\n const terms = extractTechnicalQueryTerms(query);\n if (terms.length === 0) return true;\n\n const normalizedContent = content.toLowerCase();\n return terms.some((term) => normalizedContent.includes(term));\n}\n\nexport function hasDiscriminativeTermOverlap(query: string, content: string): boolean {\n const queryTerms = extractDiscriminativeQueryTerms(query);\n const contentTerms = new Set(tokenizeQualityText(content));\n if (isRetrievalPrivacyDecisionQuery(query) && hasRetrievalPrivacyDecisionContent(contentTerms)) {\n return true;\n }\n if (shouldRequireDecisionTopicOverlap(query)) {\n const topicTerms = queryTerms.filter((term) => !DECISION_TOPIC_WEAK_TERMS.has(term));\n if (topicTerms.length > 0) {\n return topicTerms.some((term) => contentTerms.has(term));\n }\n }\n if (queryTerms.length < 3) return true;\n const requiredHits = queryTerms.length >= 3 ? 2 : 1;\n let hits = 0;\n for (const term of queryTerms) {\n if (contentTerms.has(term)) hits += 1;\n if (hits >= requiredHits) return true;\n }\n return false;\n}\n\nexport function shouldApplyTechnicalGuard(query: string): boolean {\n return extractTechnicalQueryTerms(query).length > 0;\n}\n\nfunction hasAnyTerm(terms: Set<string>, expectedTerms: Set<string>): boolean {\n let found = false;\n expectedTerms.forEach((term) => {\n if (terms.has(term)) found = true;\n });\n return found;\n}\n\nfunction shouldRequireDecisionTopicOverlap(query: string): boolean {\n if (isRetrievalPrivacyDecisionQuery(query)) return false;\n const trimmed = query.trim();\n if (!trimmed) return false;\n const terms = new Set(tokenizeQualityText(trimmed));\n return hasAnyTerm(terms, DECISION_RECALL_TERMS) || /(?:\uACB0\uC815|\uC815\uCC45|\uC6D0\uCE59)/i.test(trimmed);\n}\n\nfunction extractDiscriminativeQueryTerms(query: string): string[] {\n const seen = new Set<string>();\n const terms: string[] = [];\n for (const token of tokenizeQualityText(query)) {\n if (LOW_INFORMATION_QUERY_TERMS.has(token)) continue;\n if (GENERIC_TECHNICAL_TERMS.has(token)) continue;\n if (seen.has(token)) continue;\n seen.add(token);\n terms.push(token);\n }\n return terms;\n}\n\nfunction hasRetrievalPrivacyDecisionContent(contentTerms: Set<string>): boolean {\n const hasDashboardTraceMetadata = contentTerms.has('dashboard') &&\n (contentTerms.has('trace') || contentTerms.has('metadata')) &&\n (\n contentTerms.has('safe') ||\n contentTerms.has('strategy') ||\n contentTerms.has('rewrite') ||\n contentTerms.has('candidate') ||\n contentTerms.has('selected') ||\n contentTerms.has('count') ||\n contentTerms.has('reason')\n );\n const hasRawQueryPrivacyPolicy = contentTerms.has('retrieval') &&\n (\n contentTerms.has('privacy') ||\n contentTerms.has('expose') ||\n (\n contentTerms.has('raw') &&\n contentTerms.has('query') &&\n (\n contentTerms.has('dashboard') ||\n contentTerms.has('telemetry') ||\n contentTerms.has('api') ||\n contentTerms.has('public')\n )\n )\n );\n return hasDashboardTraceMetadata || hasRawQueryPrivacyPolicy;\n}\n\nfunction tokenizeQualityText(text: string): string[] {\n return text\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .toLowerCase()\n .replace(/[^A-Za-z0-9\uAC00-\uD7A3\\s_.:-]/g, ' ')\n .split(/\\s+/)\n .flatMap((token) => token.split(/(?=[._:-])|(?<=[._:-])/g))\n .map((token) => normalizeQualityToken(token.replace(/^[._:-]+|[._:-]+$/g, '')))\n .filter((token) => token.length >= 2);\n}\n\nfunction normalizeQualityToken(token: string): string {\n if (token === 'apis') return 'api';\n if (token === 'ids') return 'id';\n if (LOW_INFORMATION_QUERY_TERMS.has(token) || GENERIC_TECHNICAL_TERMS.has(token)) return token;\n if (token.length > 4 && token.endsWith('ies')) return `${token.slice(0, -3)}y`;\n if (\n token.length > 3 &&\n token.endsWith('s') &&\n !token.endsWith('ss') &&\n !token.endsWith('us') &&\n !token.endsWith('is')\n ) {\n return token.slice(0, -1);\n }\n return token;\n}\n", "/**\n * Memory Retriever - Unified retrieval interface\n * Combines vector search, keyword search, scoped filtering, and matching\n */\n\nimport { EventStore } from './event-store.js';\nimport { VectorStore, SearchResult } from './vector-store.js';\nimport { Embedder } from './embedder.js';\nimport { Matcher } from './matcher.js';\nimport { SharedStore } from './shared-store.js';\nimport { SharedVectorStore } from './shared-vector-store.js';\nimport { GraduationPipeline } from './graduation.js';\nimport { FacetRepository } from './operations/facet-repository.js';\nimport { FacetDimensionSchema, type FacetDimension } from './operations/facets.js';\nimport {\n GraphPathService,\n type GraphPathResult\n} from './operations/graph-path-service.js';\nimport { QueryEntityExtractor } from './operations/query-entity-extractor.js';\nimport type { SQLiteDatabase } from './sqlite-wrapper.js';\nimport {\n hasTechnicalTermOverlap,\n isCommandArtifactQuery,\n isCurrentStateQuery,\n isLowConfidenceContextFallbackQuery,\n isLowSignalContextContent,\n isStaleOrSupersededContent,\n buildRetrievalQualityQuery,\n hasDiscriminativeTermOverlap,\n shouldApplyTechnicalGuard\n} from './retrieval-quality.js';\nimport {\n normalizeRetrievalDebugLanes,\n type RetrievalDebugLane\n} from './retrieval-debug-lanes.js';\nimport type { MemoryEvent, MatchResult, NodeType, SharedTroubleshootingEntry } from './types.js';\n\nexport type { RetrievalDebugLane, RetrievalDebugLaneName } from './retrieval-debug-lanes.js';\n\nexport interface RetrievalScope {\n sessionId?: string;\n eventTypes?: MemoryEvent['eventType'][];\n metadata?: Record<string, unknown>;\n canonicalKeyPrefix?: string;\n sessionIdPrefix?: string;\n contentIncludes?: string[];\n}\n\nexport type RetrievalStrategy = 'auto' | 'fast' | 'deep';\nexport type RetrievalMode = 'event' | 'session-event-hybrid';\nexport type ProjectScopeMode = 'strict' | 'prefer' | 'global';\ntype DecayPolicy = NonNullable<RetrievalOptions['decayPolicy']>;\ntype GraphHopOptions = NonNullable<RetrievalOptions['graphHop']>;\n\nexport interface RetrievalFacetFilter {\n dimension: FacetDimension;\n value: string;\n}\n\nexport interface RetrievalDebugDetail {\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n facetMatches?: RetrievalFacetFilter[];\n graphPaths?: RetrievalGraphPathDebug[];\n lanes?: RetrievalDebugLane[];\n}\n\nexport interface RetrievalGraphPathDebug {\n startEntityId: string;\n startEntityTitle?: string;\n targetId: string;\n targetType: NodeType;\n hops: number;\n relationPath: string[];\n}\n\ntype DebuggableSearchResult = SearchResult & {\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n facetMatches?: RetrievalFacetFilter[];\n graphPaths?: RetrievalGraphPathDebug[];\n lanes?: RetrievalDebugLane[];\n};\n\nexport interface RetrievalOptions {\n topK: number;\n minScore: number;\n sessionId?: string;\n maxTokens: number;\n includeSessionContext: boolean;\n scope?: RetrievalScope;\n strategy?: RetrievalStrategy;\n rerankWithKeyword?: boolean;\n rerankWeights?: {\n semantic?: number;\n lexical?: number;\n recency?: number;\n };\n decayPolicy?: {\n enabled?: boolean;\n windowDays?: number;\n maxPenalty?: number;\n };\n intentRewrite?: boolean;\n graphHop?: {\n enabled?: boolean;\n maxHops?: number;\n hopPenalty?: number;\n };\n /**\n * event: return only directly retrieved events.\n * session-event-hybrid: also rescue query-relevant sibling events from sessions\n * that direct retrieval already hit. This is the production form of the\n * LongMemEval-inspired session+turn hybrid retrieval pattern.\n */\n retrievalMode?: RetrievalMode;\n projectScopeMode?: ProjectScopeMode;\n projectHash?: string;\n allowedProjectHashes?: string[];\n facets?: RetrievalFacetFilter[];\n}\n\nexport interface RetrievalResult {\n memories: MemoryWithContext[];\n matchResult: MatchResult;\n totalTokens: number;\n context: string;\n fallbackTrace?: string[];\n selectedDebug?: RetrievalDebugDetail[];\n candidateDebug?: RetrievalDebugDetail[];\n rawQueryText?: string;\n effectiveQueryText?: string;\n queryRewriteKind?: string;\n}\n\nexport interface MemoryWithContext {\n event: MemoryEvent;\n score: number;\n sessionContext?: string;\n}\n\nexport interface UnifiedRetrievalOptions extends RetrievalOptions {\n includeShared?: boolean;\n projectHash?: string;\n}\n\nexport interface UnifiedRetrievalResult extends RetrievalResult {\n sharedMemories?: SharedTroubleshootingEntry[];\n}\n\nconst DEFAULT_OPTIONS: RetrievalOptions = {\n topK: 5,\n minScore: 0.7,\n maxTokens: 2000,\n includeSessionContext: true,\n strategy: 'auto',\n rerankWithKeyword: true,\n decayPolicy: {\n enabled: true,\n windowDays: 30,\n maxPenalty: 0.15\n },\n graphHop: {\n enabled: true,\n maxHops: 1,\n hopPenalty: 0.08\n },\n projectScopeMode: 'global'\n};\n\nexport interface SharedStoreOptions {\n sharedStore?: SharedStore;\n sharedVectorStore?: SharedVectorStore;\n queryGraphExpansionEnabled?: boolean;\n}\n\ntype EventStoreLike = EventStore & {\n keywordSearch?: (query: string, limit?: number) => Promise<Array<{ event: MemoryEvent; rank: number }>>;\n getDatabase?: () => SQLiteDatabase;\n};\n\nexport class Retriever {\n private readonly eventStore: EventStoreLike;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly matcher: Matcher;\n private sharedStore?: SharedStore;\n private sharedVectorStore?: SharedVectorStore;\n private graduation?: GraduationPipeline;\n private queryRewriter?: (query: string) => Promise<string | null>;\n private readonly queryGraphExpansionEnabled: boolean;\n\n constructor(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher,\n sharedOptions?: SharedStoreOptions\n ) {\n this.eventStore = eventStore as EventStoreLike;\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.matcher = matcher;\n this.sharedStore = sharedOptions?.sharedStore;\n this.sharedVectorStore = sharedOptions?.sharedVectorStore;\n this.queryGraphExpansionEnabled = sharedOptions?.queryGraphExpansionEnabled === true;\n }\n\n setGraduationPipeline(graduation: GraduationPipeline): void {\n this.graduation = graduation;\n }\n\n setSharedStores(sharedStore: SharedStore, sharedVectorStore: SharedVectorStore): void {\n this.sharedStore = sharedStore;\n this.sharedVectorStore = sharedVectorStore;\n }\n\n setQueryRewriter(rewriter: (query: string) => Promise<string | null>): void {\n this.queryRewriter = rewriter;\n }\n\n async retrieve(\n query: string,\n options: Partial<RetrievalOptions> = {}\n ): Promise<RetrievalResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const retrievalMode: RetrievalMode = options.retrievalMode\n ?? ((options.strategy ?? DEFAULT_OPTIONS.strategy) === 'auto' ? 'session-event-hybrid' : 'event');\n const sessionFilter = opts.scope?.sessionId ?? opts.sessionId;\n const fallbackTrace: string[] = [];\n const qualityQuery = buildRetrievalQualityQuery(query);\n\n if (isCommandArtifactQuery(query)) {\n fallbackTrace.push('guard:command-artifact-query');\n const emptyMatch = this.matcher.matchSearchResults([], () => 0);\n return {\n memories: [],\n matchResult: emptyMatch,\n totalTokens: 0,\n context: '',\n fallbackTrace,\n selectedDebug: [],\n candidateDebug: []\n };\n }\n\n const fallbackEnabled = (opts.strategy ?? 'auto') === 'auto';\n\n // Stage 1: primary retrieval\n const primaryStrategy: RetrievalStrategy = opts.strategy === 'auto' ? 'fast' : (opts.strategy || 'fast');\n let current = await this.runStage(query, {\n qualityQuery,\n strategy: primaryStrategy,\n topK: opts.topK,\n minScore: opts.minScore,\n sessionId: sessionFilter,\n scope: opts.scope,\n rerankWithKeyword: opts.rerankWithKeyword !== false,\n rerankWeights: opts.rerankWeights,\n decayPolicy: opts.decayPolicy,\n intentRewrite: opts.intentRewrite === true,\n graphHop: opts.graphHop,\n retrievalMode,\n projectScopeMode: opts.projectScopeMode,\n projectHash: opts.projectHash,\n allowedProjectHashes: opts.allowedProjectHashes,\n facets: opts.facets\n });\n fallbackTrace.push(`stage:primary:${primaryStrategy}`);\n\n // Stage 2: deep fallback\n if (fallbackEnabled && this.shouldFallback(current.matchResult, current.results) && primaryStrategy !== 'deep') {\n current = await this.runStage(query, {\n qualityQuery,\n strategy: 'deep',\n topK: opts.topK,\n minScore: opts.minScore,\n sessionId: sessionFilter,\n scope: opts.scope,\n rerankWithKeyword: opts.rerankWithKeyword !== false,\n rerankWeights: opts.rerankWeights,\n decayPolicy: opts.decayPolicy,\n graphHop: opts.graphHop,\n retrievalMode,\n projectScopeMode: opts.projectScopeMode,\n projectHash: opts.projectHash,\n allowedProjectHashes: opts.allowedProjectHashes,\n facets: opts.facets\n });\n fallbackTrace.push('fallback:deep');\n }\n\n // Stage 3: scope-expanded deep fallback\n if (fallbackEnabled && this.shouldFallback(current.matchResult, current.results)) {\n current = await this.runStage(query, {\n qualityQuery,\n strategy: 'deep',\n topK: opts.topK,\n minScore: Math.max(0.5, opts.minScore - 0.15),\n sessionId: undefined,\n scope: undefined,\n rerankWithKeyword: true,\n rerankWeights: opts.rerankWeights,\n decayPolicy: opts.decayPolicy,\n graphHop: opts.graphHop,\n retrievalMode,\n projectScopeMode: opts.projectScopeMode,\n projectHash: opts.projectHash,\n allowedProjectHashes: opts.allowedProjectHashes,\n facets: opts.facets\n });\n fallbackTrace.push('fallback:scope-expanded');\n }\n\n // Stage 4: summary fallback\n if (fallbackEnabled && this.shouldFallback(current.matchResult, current.results)) {\n const summary = await this.buildSummaryFallback(qualityQuery, opts.topK);\n const scopedSummary = await this.applyScopeFilters(summary, {\n scope: opts.scope,\n projectScopeMode: opts.projectScopeMode,\n projectHash: opts.projectHash,\n allowedProjectHashes: opts.allowedProjectHashes,\n facets: opts.facets\n });\n const filteredSummary = this.applyQualityFilters(scopedSummary, {\n query,\n minScore: opts.minScore\n });\n const expandedSummary = retrievalMode === 'session-event-hybrid'\n ? await this.expandSessionEventHybrid(filteredSummary, {\n query: qualityQuery,\n currentStateQuery: query,\n limit: opts.topK * 4\n })\n : filteredSummary;\n const scopedExpandedSummary = retrievalMode === 'session-event-hybrid'\n ? await this.applyScopeFilters(expandedSummary, {\n scope: opts.scope,\n projectScopeMode: opts.projectScopeMode,\n projectHash: opts.projectHash,\n allowedProjectHashes: opts.allowedProjectHashes,\n facets: opts.facets\n })\n : expandedSummary;\n const finalSummary = retrievalMode === 'session-event-hybrid'\n ? this.applyQualityFilters(scopedExpandedSummary, {\n query,\n minScore: opts.minScore\n })\n : scopedExpandedSummary;\n current = {\n results: finalSummary,\n candidateResults: finalSummary,\n matchResult: this.matcher.matchSearchResults(finalSummary, () => 0)\n };\n fallbackTrace.push('fallback:summary');\n }\n\n const selectedResults = current.results.slice(0, opts.topK).filter((result) => {\n if (current.matchResult.confidence !== 'none') return true;\n if (isLowConfidenceContextFallbackQuery(query)) {\n return (result.semanticScore ?? result.score) >= 0.5 || result.score >= 0.5;\n }\n return (result.semanticScore ?? result.score) >= 0.62 || result.score >= 0.62;\n });\n const memories = await this.enrichResults(selectedResults, opts as RetrievalOptions, query);\n const context = this.buildContext(memories, opts.maxTokens);\n\n return {\n memories,\n matchResult: current.matchResult,\n totalTokens: this.estimateTokens(context),\n context,\n fallbackTrace,\n selectedDebug: selectedResults.map((r: DebuggableSearchResult) => this.debugDetailForResult(r)),\n candidateDebug: (current.candidateResults || []).slice(0, Math.max(opts.topK * 3, 20)).map((r: DebuggableSearchResult) => this.debugDetailForResult(r)),\n rawQueryText: current.queryRewriteKind ? query : undefined,\n effectiveQueryText: current.effectiveQueryText,\n queryRewriteKind: current.queryRewriteKind\n };\n }\n\n async retrieveUnified(\n query: string,\n options: Partial<UnifiedRetrievalOptions> = {}\n ): Promise<UnifiedRetrievalResult> {\n const projectResult = await this.retrieve(query, options);\n\n if (!options.includeShared || !this.sharedStore || !this.sharedVectorStore) {\n return projectResult;\n }\n\n try {\n const queryEmbedding = await this.embedder.embed(query);\n const sharedVectorResults = await this.sharedVectorStore.search(queryEmbedding.vector, {\n limit: options.topK || 5,\n minScore: options.minScore || 0.7,\n excludeProjectHash: options.projectHash\n });\n\n const sharedMemories: SharedTroubleshootingEntry[] = [];\n for (const result of sharedVectorResults) {\n const entry = await this.sharedStore.get(result.entryId);\n if (!entry) continue;\n if (!options.projectHash || entry.sourceProjectHash !== options.projectHash) {\n sharedMemories.push(entry);\n await this.sharedStore.recordUsage(entry.entryId);\n }\n }\n\n const unifiedContext = this.buildUnifiedContext(projectResult, sharedMemories);\n return {\n ...projectResult,\n context: unifiedContext,\n totalTokens: this.estimateTokens(unifiedContext),\n sharedMemories\n };\n } catch (error) {\n console.error('Shared search failed:', error);\n return projectResult;\n }\n }\n\n private async runStage(\n query: string,\n input: {\n qualityQuery?: string;\n strategy: RetrievalStrategy;\n topK: number;\n minScore: number;\n sessionId?: string;\n scope?: RetrievalScope;\n rerankWithKeyword?: boolean;\n rerankWeights?: {\n semantic?: number;\n lexical?: number;\n recency?: number;\n };\n decayPolicy?: DecayPolicy;\n intentRewrite?: boolean;\n graphHop?: GraphHopOptions;\n retrievalMode: RetrievalMode;\n projectScopeMode?: ProjectScopeMode;\n projectHash?: string;\n allowedProjectHashes?: string[];\n facets?: RetrievalFacetFilter[];\n }\n ): Promise<{\n results: DebuggableSearchResult[];\n candidateResults: DebuggableSearchResult[];\n matchResult: MatchResult;\n effectiveQueryText?: string;\n queryRewriteKind?: string;\n }> {\n const searchQuery = input.qualityQuery ?? query;\n let rerankQuery = searchQuery;\n let effectiveQueryText: string | undefined;\n let queryRewriteKind: string | undefined;\n let initialResults = await this.searchByStrategy(searchQuery, {\n strategy: input.strategy,\n topK: input.topK,\n minScore: input.minScore,\n sessionId: input.sessionId\n });\n\n if (input.intentRewrite && input.strategy === 'deep' && this.queryRewriter) {\n const rewritten = (await this.queryRewriter(query))?.trim();\n const normalizedQuery = query.trim();\n if (rewritten && rewritten !== normalizedQuery) {\n effectiveQueryText = `${normalizedQuery} ${rewritten}`.trim();\n queryRewriteKind = 'intent-rewrite';\n rerankQuery = buildRetrievalQualityQuery(effectiveQueryText);\n const rewrittenResults = await this.searchByStrategy(buildRetrievalQualityQuery(rewritten), {\n strategy: 'deep',\n topK: input.topK,\n minScore: Math.max(0.5, input.minScore - 0.1),\n sessionId: input.sessionId\n });\n initialResults = this.mergeResults(initialResults, rewrittenResults, input.topK * 3);\n }\n }\n\n const graphExpandedResults = input.graphHop?.enabled === false\n ? initialResults\n : await this.expandGraphHops(initialResults, {\n query,\n queryGraphEnabled: this.queryGraphExpansionEnabled,\n maxHops: clampGraphHops(input.graphHop?.maxHops ?? 1),\n hopPenalty: Math.max(0, input.graphHop?.hopPenalty ?? 0.08),\n limit: input.topK * 4,\n });\n\n const expandedResults = input.retrievalMode === 'session-event-hybrid'\n ? await this.expandSessionEventHybrid(graphExpandedResults, {\n query: rerankQuery,\n currentStateQuery: query,\n limit: input.topK * 4\n })\n : graphExpandedResults;\n\n const rerankedResults = input.rerankWithKeyword\n ? this.rerankByKeywordOverlap(expandedResults, rerankQuery, input.rerankWeights, input.decayPolicy)\n : expandedResults;\n\n const filtered = await this.applyScopeFilters(rerankedResults, {\n scope: input.scope,\n projectScopeMode: input.projectScopeMode,\n projectHash: input.projectHash,\n allowedProjectHashes: input.allowedProjectHashes,\n facets: input.facets\n });\n const qualityFiltered = this.applyQualityFilters(filtered, {\n query,\n minScore: input.minScore\n });\n const top = qualityFiltered.slice(0, input.topK);\n const matchResult = this.matcher.matchSearchResults(top, () => 0);\n\n return { results: top, candidateResults: qualityFiltered, matchResult, effectiveQueryText, queryRewriteKind };\n }\n\n private applyQualityFilters(\n results: DebuggableSearchResult[],\n options: { query: string; minScore: number }\n ): DebuggableSearchResult[] {\n let filtered = [...results];\n\n if (isCurrentStateQuery(options.query)) {\n filtered = filtered.filter((result) => !isStaleOrSupersededContent(result.content));\n }\n\n filtered = filtered.filter((result) => !isLowSignalContextContent(result.content));\n\n filtered = filtered.filter((result) =>\n this.isGraphPathResult(result) || hasDiscriminativeTermOverlap(options.query, result.content)\n );\n\n if (shouldApplyTechnicalGuard(options.query)) {\n filtered = filtered.filter((result) =>\n this.isGraphPathResult(result) || hasTechnicalTermOverlap(options.query, result.content)\n );\n }\n\n if (filtered.length <= 2) return filtered;\n\n const topScore = filtered[0].score;\n if (topScore < 0.8) return filtered;\n\n const cliffThreshold = Math.max(options.minScore, topScore - 0.25);\n return filtered.filter((result) => result.score >= cliffThreshold);\n }\n\n private mergeResults(primary: SearchResult[], secondary: SearchResult[], limit: number): SearchResult[] {\n const byId = new Map<string, SearchResult>();\n for (const row of primary) byId.set(row.eventId, row);\n for (const row of secondary) {\n const prev = byId.get(row.eventId);\n if (!prev || row.score > prev.score) {\n byId.set(row.eventId, row);\n }\n }\n return [...byId.values()].sort((a, b) => b.score - a.score).slice(0, limit);\n }\n\n private async expandSessionEventHybrid(\n seeds: DebuggableSearchResult[],\n opts: { query: string; currentStateQuery: string; limit: number }\n ): Promise<DebuggableSearchResult[]> {\n if (seeds.length === 0 || opts.limit <= seeds.length) return seeds;\n\n const queryTokens = this.tokenize(opts.query);\n if (queryTokens.length === 0) return seeds;\n\n const byId = new Map<string, DebuggableSearchResult>();\n for (const seed of seeds) byId.set(seed.eventId, seed);\n\n const bestSeedBySession = new Map<string, DebuggableSearchResult>();\n for (const seed of [...seeds].sort((a, b) => b.score - a.score || compareStable(a.eventId, b.eventId))) {\n if (!seed.sessionId || bestSeedBySession.has(seed.sessionId)) continue;\n bestSeedBySession.set(seed.sessionId, seed);\n }\n\n const suppressStaleState = isCurrentStateQuery(opts.currentStateQuery);\n\n for (const [sessionId, seed] of bestSeedBySession) {\n const sessionEvents = await this.eventStore.getSessionEvents(sessionId);\n for (const event of [...sessionEvents].sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime())) {\n if (byId.has(event.id)) continue;\n if (isLowSignalContextContent(event.content)) continue;\n if (suppressStaleState && isStaleOrSupersededContent(event.content)) continue;\n\n const lexicalScore = this.keywordOverlap(queryTokens, this.tokenize(event.content));\n if (lexicalScore <= 0) continue;\n if (shouldApplyTechnicalGuard(opts.query) && !hasTechnicalTermOverlap(opts.query, event.content)) continue;\n\n const score = Math.min(0.95, Math.max(0.35, seed.score * 0.72 + lexicalScore * 0.28));\n const row: DebuggableSearchResult = withRetrievalLane({\n id: `session-event-${seed.eventId}-${event.id}`,\n eventId: event.id,\n content: event.content,\n score,\n sessionId: event.sessionId,\n eventType: event.eventType,\n timestamp: event.timestamp.toISOString(),\n semanticScore: seed.semanticScore ?? seed.score,\n lexicalScore,\n recencyScore: seed.recencyScore\n }, { lane: 'session_event', reason: `same_session:${seed.eventId}`, score });\n\n byId.set(row.eventId, row);\n if (byId.size >= opts.limit) break;\n }\n if (byId.size >= opts.limit) break;\n }\n\n return [...byId.values()]\n .sort((a, b) => b.score - a.score || compareStable(a.eventId, b.eventId))\n .slice(0, opts.limit);\n }\n\n private async expandGraphHops(\n seeds: SearchResult[],\n opts: { query: string; queryGraphEnabled: boolean; maxHops: number; hopPenalty: number; limit: number }\n ): Promise<DebuggableSearchResult[]> {\n const byId = new Map<string, DebuggableSearchResult>();\n for (const s of seeds) byId.set(s.eventId, s);\n\n let frontier = seeds.map((s) => ({ row: s, hop: 0 }));\n\n for (let hop = 1; hop <= opts.maxHops; hop += 1) {\n const next: Array<{ row: SearchResult; hop: number }> = [];\n\n for (const f of frontier) {\n const ev = await this.eventStore.getEvent(f.row.eventId);\n if (!ev) continue;\n const rel = ((ev.metadata as Record<string, unknown> | undefined)?.relatedEventIds ?? []) as unknown;\n const relatedIds = Array.isArray(rel)\n ? rel.filter((x): x is string => typeof x === 'string')\n : [];\n\n for (const rid of relatedIds) {\n if (byId.has(rid)) continue;\n const target = await this.eventStore.getEvent(rid);\n if (!target) continue;\n\n const score = Math.max(0, f.row.score - opts.hopPenalty * hop);\n const row: DebuggableSearchResult = {\n id: `hop-${hop}-${rid}`,\n eventId: target.id,\n content: target.content,\n score,\n sessionId: target.sessionId,\n eventType: target.eventType,\n timestamp: target.timestamp.toISOString(),\n lanes: [{ lane: 'graph_path', reason: 'relatedEventIds', score }]\n };\n\n byId.set(row.eventId, row);\n next.push({ row, hop });\n if (byId.size >= opts.limit) break;\n }\n if (byId.size >= opts.limit) break;\n }\n\n frontier = next;\n if (frontier.length === 0 || byId.size >= opts.limit) break;\n }\n\n if (opts.queryGraphEnabled) {\n await this.expandQueryGraphPaths(opts.query, byId, opts);\n }\n\n return [...byId.values()]\n .sort((a, b) => b.score - a.score || compareStable(a.eventId, b.eventId))\n .slice(0, opts.limit);\n }\n\n private async expandQueryGraphPaths(\n query: string,\n byId: Map<string, DebuggableSearchResult>,\n opts: { maxHops: number; hopPenalty: number; limit: number }\n ): Promise<void> {\n if (!query.trim() || !this.eventStore.getDatabase) return;\n\n try {\n const db = this.eventStore.getDatabase();\n const extraction = new QueryEntityExtractor(db).extract(query, {\n maxCandidates: Math.min(8, opts.limit),\n includeAliases: true\n });\n const startCandidates = extraction.candidates\n .filter((candidate) => candidate.entityId)\n .slice(0, 8);\n const startNodes = uniqueEntityStartNodes(startCandidates);\n if (startNodes.length === 0) return;\n\n const expansion = new GraphPathService(db).expand({\n startNodes: startNodes.map((node) => ({ type: 'entity' as const, id: node.entityId })),\n maxHops: opts.maxHops,\n maxResults: opts.limit,\n direction: 'both'\n });\n const titleByEntityId = new Map(startNodes.map((node) => [node.entityId, node.title] as const));\n\n for (const path of expansion.paths) {\n if (path.target.type !== 'event') continue;\n const target = await this.eventStore.getEvent(path.target.id);\n if (!target) continue;\n\n const graphPath = toRetrievalGraphPathDebug(path, titleByEntityId);\n const score = graphPathScore(path, opts.hopPenalty);\n const existing = byId.get(target.id);\n const graphPaths = mergeGraphPaths(existing?.graphPaths ?? [], [graphPath]);\n const graphLane: RetrievalDebugLane = {\n lane: 'graph_path',\n reason: `query_graph_path:${graphPath.relationPath.join('>') || 'linked'}`,\n score\n };\n const row: DebuggableSearchResult = {\n id: existing?.id ?? `graph-path-${path.hops}-${target.id}`,\n eventId: target.id,\n content: target.content,\n score: Math.max(existing?.score ?? 0, score),\n sessionId: target.sessionId,\n eventType: target.eventType,\n timestamp: target.timestamp.toISOString(),\n semanticScore: existing?.semanticScore,\n lexicalScore: existing?.lexicalScore,\n recencyScore: existing?.recencyScore,\n facetMatches: existing?.facetMatches,\n graphPaths,\n lanes: mergeRetrievalLanes(existing?.lanes ?? [], [graphLane])\n };\n byId.set(row.eventId, row);\n if (byId.size >= opts.limit) break;\n }\n } catch {\n // Legacy SQLite stores may not have operations graph tables yet. Retrieval\n // must remain available even when graph expansion cannot run.\n }\n }\n\n private shouldFallback(matchResult: MatchResult, results: SearchResult[]): boolean {\n if (results.length === 0) return true;\n if (matchResult.confidence === 'none') return true;\n return false;\n }\n\n private async buildSummaryFallback(query: string, topK: number): Promise<DebuggableSearchResult[]> {\n const recent = await this.eventStore.getRecentEvents(Math.max(topK * 6, 20));\n const q = this.tokenize(query);\n\n const ranked = recent\n .map((e) => ({ e, overlap: this.keywordOverlap(q, this.tokenize(e.content)) }))\n .filter((r) => r.overlap > 0)\n .sort((a, b) => b.overlap - a.overlap)\n .slice(0, topK)\n .map((row, idx) => {\n const score = Math.max(0.25, 0.6 - idx * 0.05);\n return withRetrievalLane({\n id: `summary-${row.e.id}`,\n eventId: row.e.id,\n content: row.e.content,\n score,\n sessionId: row.e.sessionId,\n eventType: row.e.eventType,\n timestamp: row.e.timestamp.toISOString()\n }, { lane: 'session_summary', reason: 'summary_fallback', score });\n });\n\n return ranked;\n }\n\n private async searchByStrategy(\n query: string,\n input: { strategy: RetrievalStrategy; topK: number; minScore: number; sessionId?: string }\n ): Promise<DebuggableSearchResult[]> {\n const strategy = input.strategy === 'auto' ? 'deep' : input.strategy;\n\n if (strategy === 'fast') {\n const keyword = await this.searchByKeyword(query, {\n limit: Math.max(5, input.topK * 3),\n sessionId: input.sessionId\n });\n return keyword;\n }\n\n const queryEmbedding = await this.embedder.embed(query);\n const vectorResults = await this.vectorStore.search(queryEmbedding.vector, {\n limit: Math.max(5, input.topK * 3),\n minScore: input.minScore,\n sessionId: input.sessionId\n });\n return vectorResults.map((result) => withRetrievalLane(result, {\n lane: 'raw_event',\n reason: 'vector_search',\n score: result.score\n }));\n }\n\n private async searchByKeyword(\n query: string,\n input: { limit: number; sessionId?: string }\n ): Promise<DebuggableSearchResult[]> {\n if (this.eventStore.keywordSearch) {\n const rows = await this.eventStore.keywordSearch(query, input.limit);\n const filtered = input.sessionId ? rows.filter((r) => r.event.sessionId === input.sessionId) : rows;\n return filtered.map((row, idx) => {\n const score = Math.max(0.4, 1 - idx * 0.04);\n return withRetrievalLane({\n id: `kw-${row.event.id}`,\n eventId: row.event.id,\n content: row.event.content,\n score,\n sessionId: row.event.sessionId,\n eventType: row.event.eventType,\n timestamp: row.event.timestamp.toISOString()\n }, { lane: 'raw_event', reason: 'keyword_search', score });\n });\n }\n\n const recent = await this.eventStore.getRecentEvents(input.limit * 4);\n const tokens = this.tokenize(query);\n const filtered = recent\n .filter((e) => (input.sessionId ? e.sessionId === input.sessionId : true))\n .map((e) => ({ e, overlap: this.keywordOverlap(tokens, this.tokenize(e.content)) }))\n .filter((r) => r.overlap > 0)\n .sort((a, b) => b.overlap - a.overlap)\n .slice(0, input.limit);\n\n return filtered.map((row, idx) => {\n const score = Math.max(0.3, 0.9 - idx * 0.05);\n return withRetrievalLane({\n id: `kw-fallback-${row.e.id}`,\n eventId: row.e.id,\n content: row.e.content,\n score,\n sessionId: row.e.sessionId,\n eventType: row.e.eventType,\n timestamp: row.e.timestamp.toISOString()\n }, { lane: 'raw_event', reason: 'keyword_fallback', score });\n });\n }\n\n private rerankByKeywordOverlap(\n results: SearchResult[],\n query: string,\n weights?: { semantic?: number; lexical?: number; recency?: number },\n decayPolicy?: { enabled?: boolean; windowDays?: number; maxPenalty?: number }\n ): SearchResult[] {\n const q = this.tokenize(query);\n const now = Date.now();\n\n const sw = Math.max(0, weights?.semantic ?? 0.7);\n const lw = Math.max(0, weights?.lexical ?? 0.2);\n const rw = Math.max(0, weights?.recency ?? 0.1);\n const total = sw + lw + rw || 1;\n\n const decayEnabled = decayPolicy?.enabled !== false;\n const decayWindow = Math.max(1, decayPolicy?.windowDays ?? 30);\n const decayMaxPenalty = Math.max(0, decayPolicy?.maxPenalty ?? 0.15);\n\n return [...results]\n .map((r) => {\n const overlap = this.keywordOverlap(q, this.tokenize(r.content));\n const recencyDays = Math.max(0, (now - new Date(r.timestamp).getTime()) / (1000 * 60 * 60 * 24));\n const recency = Math.max(0, 1 - recencyDays / decayWindow);\n let blended = (r.score * sw + overlap * lw + recency * rw) / total;\n\n if (decayEnabled && recencyDays > decayWindow && overlap < 0.5) {\n const ageFactor = Math.min(1, (recencyDays - decayWindow) / decayWindow);\n blended -= decayMaxPenalty * ageFactor;\n }\n\n return { ...r, score: Math.max(0, blended), semanticScore: r.score, lexicalScore: overlap, recencyScore: recency };\n })\n .sort((a, b) => b.score - a.score);\n }\n\n private async applyScopeFilters(\n results: DebuggableSearchResult[],\n options?: {\n scope?: RetrievalScope;\n projectScopeMode?: ProjectScopeMode;\n projectHash?: string;\n allowedProjectHashes?: string[];\n facets?: RetrievalFacetFilter[];\n }\n ): Promise<DebuggableSearchResult[]> {\n const scope = options?.scope;\n const projectScopeMode = options?.projectScopeMode ?? 'global';\n const facetFilters = this.normalizeFacetFilters(options?.facets);\n const allowedProjectHashes = new Set(\n [options?.projectHash, ...(options?.allowedProjectHashes || [])].filter(\n (value): value is string => typeof value === 'string' && value.length > 0\n )\n );\n\n if (!scope && projectScopeMode === 'global' && facetFilters === null) return results;\n\n const normalizedIncludes = (scope?.contentIncludes || []).map((s) => s.toLowerCase());\n const filtered: Array<{ result: DebuggableSearchResult; projectHash?: string }> = [];\n\n for (const result of results) {\n if (scope?.sessionId && result.sessionId !== scope.sessionId) continue;\n if (scope?.sessionIdPrefix && !result.sessionId.startsWith(scope.sessionIdPrefix)) continue;\n if (scope?.eventTypes && scope.eventTypes.length > 0 && !scope.eventTypes.includes(result.eventType as MemoryEvent['eventType'])) continue;\n\n const event = await this.eventStore.getEvent(result.eventId);\n if (!event) continue;\n\n if (scope?.canonicalKeyPrefix && !event.canonicalKey.startsWith(scope.canonicalKeyPrefix)) continue;\n if (normalizedIncludes.length > 0) {\n const lc = event.content.toLowerCase();\n if (!normalizedIncludes.some((needle) => lc.includes(needle))) continue;\n }\n if (scope?.metadata && !this.matchesMetadataScope(event.metadata, scope.metadata)) continue;\n\n const projectHash = this.extractProjectHash(event.metadata);\n filtered.push({ result, projectHash });\n }\n\n let scopedResults: DebuggableSearchResult[];\n if (projectScopeMode === 'global' || allowedProjectHashes.size === 0) {\n scopedResults = filtered.map((x) => x.result);\n } else {\n const projectMatched = filtered.filter((x) => x.projectHash && allowedProjectHashes.has(x.projectHash));\n scopedResults = projectScopeMode === 'strict'\n ? projectMatched.map((x) => x.result)\n : (projectMatched.length > 0 ? projectMatched : filtered).map((x) => x.result);\n }\n\n return this.applyFacetFilters(scopedResults, {\n facets: facetFilters,\n projectHash: options?.projectHash\n });\n }\n\n private normalizeFacetFilters(facets: RetrievalFacetFilter[] | undefined): RetrievalFacetFilter[] | null {\n if (!facets || facets.length === 0) return null;\n\n const normalized: RetrievalFacetFilter[] = [];\n for (const facet of facets) {\n const parsedDimension = FacetDimensionSchema.safeParse(facet.dimension);\n const value = typeof facet.value === 'string' ? facet.value.trim() : '';\n if (!parsedDimension.success || !value) return [];\n normalized.push({ dimension: parsedDimension.data, value });\n }\n\n return normalized;\n }\n\n private async applyFacetFilters(\n results: DebuggableSearchResult[],\n options: { facets: RetrievalFacetFilter[] | null; projectHash?: string }\n ): Promise<DebuggableSearchResult[]> {\n if (options.facets === null) return results;\n if (options.facets.length === 0) return [];\n if (!options.projectHash) return [];\n if (!this.eventStore.getDatabase) return [];\n\n const repo = new FacetRepository(this.eventStore.getDatabase());\n const filtered: DebuggableSearchResult[] = [];\n\n for (const result of results) {\n const matches: RetrievalFacetFilter[] = [];\n let matchedAll = true;\n for (const facet of options.facets) {\n const rows = await repo.query({\n targetType: 'event',\n targetId: result.eventId,\n dimension: facet.dimension,\n value: facet.value,\n projectHash: options.projectHash\n });\n if (rows.length === 0) {\n matchedAll = false;\n break;\n }\n matches.push(facet);\n }\n\n if (matchedAll) {\n const facetLanes: RetrievalDebugLane[] = matches.map((match) => ({\n lane: 'facet_match',\n reason: `${match.dimension}=${match.value}`\n }));\n filtered.push({\n ...result,\n facetMatches: matches,\n lanes: mergeRetrievalLanes(result.lanes ?? [], facetLanes)\n });\n }\n }\n\n return filtered;\n }\n\n private debugDetailForResult(result: DebuggableSearchResult): RetrievalDebugDetail {\n const detail: RetrievalDebugDetail = {\n eventId: result.eventId,\n score: result.score,\n semanticScore: result.semanticScore,\n lexicalScore: result.lexicalScore,\n recencyScore: result.recencyScore\n };\n if (result.facetMatches && result.facetMatches.length > 0) {\n detail.facetMatches = result.facetMatches;\n }\n if (result.graphPaths && result.graphPaths.length > 0) {\n detail.graphPaths = result.graphPaths;\n }\n if (result.lanes && result.lanes.length > 0) {\n detail.lanes = result.lanes;\n }\n return detail;\n }\n\n private isGraphPathResult(result: DebuggableSearchResult): boolean {\n return (result.graphPaths || []).length > 0;\n }\n\n private extractProjectHash(metadata: Record<string, unknown> | undefined): string | undefined {\n if (!metadata || typeof metadata !== 'object') return undefined;\n const scope = metadata.scope;\n if (!scope || typeof scope !== 'object') return undefined;\n const project = (scope as Record<string, unknown>).project;\n if (!project || typeof project !== 'object') return undefined;\n const hash = (project as Record<string, unknown>).hash;\n return typeof hash === 'string' && hash.length > 0 ? hash : undefined;\n }\n\n async retrieveFromSession(sessionId: string): Promise<MemoryEvent[]> {\n return this.eventStore.getSessionEvents(sessionId);\n }\n\n async retrieveRecent(limit: number = 100): Promise<MemoryEvent[]> {\n return this.eventStore.getRecentEvents(limit);\n }\n\n private async enrichResults(results: SearchResult[], options: RetrievalOptions, query: string): Promise<MemoryWithContext[]> {\n const memories: MemoryWithContext[] = [];\n\n for (const result of results) {\n const event = await this.eventStore.getEvent(result.eventId);\n if (!event) continue;\n\n if (this.graduation) {\n this.graduation.recordAccess(event.id, options.sessionId || 'unknown', result.score);\n }\n\n let sessionContext: string | undefined;\n if (options.includeSessionContext) {\n sessionContext = await this.getSessionContext(event.sessionId, event.id, query);\n }\n\n memories.push({ event, score: result.score, sessionContext });\n }\n\n return memories;\n }\n\n private async getSessionContext(sessionId: string, eventId: string, query: string): Promise<string | undefined> {\n const sessionEvents = await this.eventStore.getSessionEvents(sessionId);\n const eventIndex = sessionEvents.findIndex(e => e.id === eventId);\n if (eventIndex === -1) return undefined;\n\n const start = Math.max(0, eventIndex - 1);\n const end = Math.min(sessionEvents.length, eventIndex + 2);\n const contextEvents = sessionEvents.slice(start, end);\n if (contextEvents.length <= 1) return undefined;\n\n const suppressStaleState = isCurrentStateQuery(query);\n const contextLines = contextEvents\n .filter(e => e.id !== eventId)\n .filter(e => !isLowSignalContextContent(e.content))\n .filter(e => !(suppressStaleState && isStaleOrSupersededContent(e.content)))\n .map(e => `[${e.eventType}]: ${e.content.slice(0, 200)}...`);\n\n return contextLines.length > 0 ? contextLines.join('\\n') : undefined;\n }\n\n private buildUnifiedContext(projectResult: RetrievalResult, sharedMemories: SharedTroubleshootingEntry[]): string {\n let context = projectResult.context;\n if (sharedMemories.length === 0) return context;\n\n context += '\\n\\n## Cross-Project Knowledge\\n\\n';\n for (const memory of sharedMemories.slice(0, 3)) {\n context += `### ${memory.title}\\n`;\n if (memory.symptoms.length > 0) context += `**Symptoms:** ${memory.symptoms.join(', ')}\\n`;\n context += `**Root Cause:** ${memory.rootCause}\\n`;\n context += `**Solution:** ${memory.solution}\\n`;\n if (memory.technologies && memory.technologies.length > 0) context += `**Technologies:** ${memory.technologies.join(', ')}\\n`;\n context += `_Confidence: ${(memory.confidence * 100).toFixed(0)}%_\\n\\n`;\n }\n\n return context;\n }\n\n private buildContext(memories: MemoryWithContext[], maxTokens: number): string {\n const parts: string[] = [];\n let currentTokens = 0;\n\n for (const memory of memories) {\n const memoryText = this.formatMemory(memory);\n const memoryTokens = this.estimateTokens(memoryText);\n if (currentTokens + memoryTokens > maxTokens) break;\n parts.push(memoryText);\n currentTokens += memoryTokens;\n }\n\n if (parts.length === 0) return '';\n return `## Relevant Memories\\n\\n${parts.join('\\n\\n---\\n\\n')}`;\n }\n\n private formatMemory(memory: MemoryWithContext): string {\n const { event, score, sessionContext } = memory;\n const date = event.timestamp.toISOString().split('T')[0];\n\n let text = `**${event.eventType}** (${date}, score: ${score.toFixed(2)})\\n${event.content}`;\n if (sessionContext) text += `\\n\\n_Context:_ ${sessionContext}`;\n return text;\n }\n\n private matchesMetadataScope(\n metadata: Record<string, unknown> | undefined,\n expected: Record<string, unknown>\n ): boolean {\n if (!metadata) return false;\n\n return Object.entries(expected).every(([path, value]) => {\n const actual = path.split('.').reduce<unknown>((acc, key) => {\n if (typeof acc !== 'object' || acc === null) return undefined;\n return (acc as Record<string, unknown>)[key];\n }, metadata);\n\n return actual === value;\n });\n }\n\n private tokenize(text: string): string[] {\n return text\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]/gu, ' ')\n .split(/\\s+/)\n .map((token) => this.normalizeToken(token))\n .filter((t) => t.length >= 2)\n .slice(0, 64);\n }\n\n private normalizeToken(token: string): string {\n if (token === 'apis') return 'api';\n if (token === 'ids') return 'id';\n if (token === 'does') return token;\n if (token.length > 4 && token.endsWith('ies')) return `${token.slice(0, -3)}y`;\n if (\n token.length > 3 &&\n token.endsWith('s') &&\n !token.endsWith('ss') &&\n !token.endsWith('us') &&\n !token.endsWith('is') &&\n !token.endsWith('ps')\n ) {\n return token.slice(0, -1);\n }\n return token;\n }\n\n private keywordOverlap(a: string[], b: string[]): number {\n if (a.length === 0 || b.length === 0) return 0;\n const bs = new Set(b);\n let hit = 0;\n for (const t of a) if (bs.has(t)) hit += 1;\n return hit / a.length;\n }\n\n private estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n }\n}\n\nfunction withRetrievalLane(result: DebuggableSearchResult, lane: RetrievalDebugLane): DebuggableSearchResult {\n const existing = (result as DebuggableSearchResult).lanes ?? [];\n return {\n ...result,\n lanes: mergeRetrievalLanes(existing, [lane])\n };\n}\n\nfunction mergeRetrievalLanes(\n existing: RetrievalDebugLane[],\n incoming: RetrievalDebugLane[]\n): RetrievalDebugLane[] {\n return normalizeRetrievalDebugLanes([...existing, ...incoming]);\n}\n\nfunction uniqueEntityStartNodes(\n candidates: Array<{ entityId?: string; text: string }>\n): Array<{ entityId: string; title: string }> {\n const seen = new Set<string>();\n const nodes: Array<{ entityId: string; title: string }> = [];\n for (const candidate of candidates) {\n if (!candidate.entityId || seen.has(candidate.entityId)) continue;\n seen.add(candidate.entityId);\n nodes.push({ entityId: candidate.entityId, title: candidate.text });\n }\n return nodes;\n}\n\nfunction toRetrievalGraphPathDebug(\n path: GraphPathResult,\n titleByEntityId: Map<string, string>\n): RetrievalGraphPathDebug {\n const firstStep = path.steps[0];\n const startNode = firstStep?.direction === 'incoming'\n ? firstStep.to\n : firstStep?.from;\n const startEntityId = startNode?.type === 'entity' ? startNode.id : '';\n\n return {\n startEntityId,\n startEntityTitle: titleByEntityId.get(startEntityId) ?? startNode?.name,\n targetId: path.target.id,\n targetType: path.target.type,\n hops: path.hops,\n relationPath: path.steps.map((step) => step.relationType)\n };\n}\n\nfunction graphPathScore(path: GraphPathResult, hopPenalty: number): number {\n const base = Math.min(0.95, Math.max(0, path.scoreContribution));\n return Math.max(0.05, base - hopPenalty * Math.max(0, path.hops - 1));\n}\n\nfunction clampGraphHops(maxHops: number): number {\n if (!Number.isFinite(maxHops)) return 2;\n return Math.min(Math.max(0, Math.trunc(maxHops)), 2);\n}\n\nfunction mergeGraphPaths(\n existing: RetrievalGraphPathDebug[],\n incoming: RetrievalGraphPathDebug[]\n): RetrievalGraphPathDebug[] {\n const byKey = new Map<string, RetrievalGraphPathDebug>();\n for (const path of [...existing, ...incoming]) {\n const key = [path.startEntityId, path.targetType, path.targetId, path.hops, ...path.relationPath].join('\\u0000');\n if (!byKey.has(key)) byKey.set(key, path);\n }\n return [...byKey.values()]\n .sort((a, b) => a.hops - b.hops || compareStable(graphPathSignature(a), graphPathSignature(b)))\n .slice(0, 3);\n}\n\nfunction graphPathSignature(path: RetrievalGraphPathDebug): string {\n return [path.startEntityId, path.targetType, path.targetId, path.hops, ...path.relationPath].join('|');\n}\n\nfunction compareStable(a: string, b: string): number {\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n}\n\nexport function createRetriever(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher,\n sharedOptions?: SharedStoreOptions\n): Retriever {\n return new Retriever(eventStore, vectorStore, embedder, matcher, sharedOptions);\n}\n", "/**\n * Retrieval Analytics Service\n *\n * Owns retrieval telemetry read-model and helpfulness evaluation workflows so\n * MemoryService can remain a thin facade over focused engine services.\n */\n\nimport type { RetrievalDebugLane } from '../retrieval-debug-lanes.js';\nimport type { MemoryEvent } from '../types.js';\n\nexport interface RetrievalTraceStats {\n totalQueries: number;\n avgCandidateCount: number;\n avgSelectedCount: number;\n selectionRate: number;\n rewrittenQueries?: number;\n rewriteRate?: number;\n rewrittenQueriesWithSelection?: number;\n rawQueriesWithSelection?: number;\n rewrittenSelectionRate?: number;\n rawSelectionRate?: number;\n avgSelectedCountForRewrittenQueries?: number;\n avgSelectedCountForRawQueries?: number;\n}\n\nexport interface HelpfulnessStats {\n avgScore: number;\n totalEvaluated: number;\n totalRetrievals: number;\n helpful: number;\n neutral: number;\n unhelpful: number;\n}\n\nexport interface HelpfulMemory {\n eventId: string;\n summary: string;\n helpfulnessScore: number;\n accessCount: number;\n evaluationCount: number;\n}\n\nexport interface RetrievalTraceDetail {\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n lanes?: RetrievalDebugLane[];\n}\n\nexport interface RetrievalTrace {\n traceId: string;\n sessionId?: string;\n projectHash?: string;\n queryText: string;\n rawQueryText?: string;\n queryRewriteKind?: string;\n strategy?: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n candidateDetails: RetrievalTraceDetail[];\n selectedDetails: RetrievalTraceDetail[];\n candidateCount: number;\n selectedCount: number;\n confidence?: string;\n fallbackTrace: string[];\n createdAt: Date;\n}\n\nexport interface AccessedMemory {\n memoryId: string;\n summary: string;\n topics: string[];\n accessCount: number;\n lastAccessed: string | null;\n confidence: number;\n createdAt: Date;\n}\n\ntype AccessedMemoryEvent = MemoryEvent & {\n access_count?: number;\n last_accessed_at?: string | null;\n};\n\nexport interface RetrievalAnalyticsStore {\n getRetrievalTraceStats(): Promise<RetrievalTraceStats>;\n getRecentRetrievalTraces(limit?: number): Promise<RetrievalTrace[]>;\n getMostAccessed(limit?: number): Promise<AccessedMemoryEvent[]>;\n evaluateSessionHelpfulness(sessionId: string): Promise<void>;\n getUnevaluatedSessions(currentSessionId: string, limit?: number): Promise<string[]>;\n getHelpfulMemories(limit?: number): Promise<HelpfulMemory[]>;\n getHelpfulnessStats(since?: Date): Promise<HelpfulnessStats>;\n}\n\nexport interface RetrievalAnalyticsServiceDeps {\n initialize: () => Promise<void>;\n retrievalStore: RetrievalAnalyticsStore;\n}\n\nexport class RetrievalAnalyticsService {\n constructor(private readonly deps: RetrievalAnalyticsServiceDeps) {}\n\n async getRetrievalTraceStats(): Promise<RetrievalTraceStats> {\n await this.deps.initialize();\n return this.deps.retrievalStore.getRetrievalTraceStats();\n }\n\n async getRecentRetrievalTraces(limit: number = 50): Promise<RetrievalTrace[]> {\n await this.deps.initialize();\n return this.deps.retrievalStore.getRecentRetrievalTraces(limit);\n }\n\n async getMostAccessedMemories(limit: number = 10): Promise<AccessedMemory[]> {\n // Preserve the historical lightweight path: SQLiteEventStore.getMostAccessed()\n // initializes itself and no-ops safely in read-only scenarios, so dashboard\n // access summaries should not trigger vector/embedder/worker initialization.\n const events = await this.deps.retrievalStore.getMostAccessed(limit);\n\n return events.map((event) => ({\n memoryId: event.id,\n summary: event.content.substring(0, 200) + (event.content.length > 200 ? '...' : ''),\n topics: this.extractTopicsFromContent(event.content),\n accessCount: event.access_count || 0,\n lastAccessed: event.last_accessed_at || null,\n confidence: 1.0,\n createdAt: event.timestamp,\n }));\n }\n\n async evaluateSessionHelpfulness(sessionId: string): Promise<void> {\n await this.deps.initialize();\n await this.deps.retrievalStore.evaluateSessionHelpfulness(sessionId);\n }\n\n async evaluatePendingSessions(currentSessionId: string, limit: number = 5): Promise<void> {\n await this.deps.initialize();\n const sessions = await this.deps.retrievalStore.getUnevaluatedSessions(currentSessionId, limit);\n\n for (const sessionId of sessions) {\n try {\n await this.deps.retrievalStore.evaluateSessionHelpfulness(sessionId);\n } catch {\n // Best-effort backfill: one broken session should not block hook startup.\n }\n }\n }\n\n async getHelpfulMemories(limit: number = 10): Promise<HelpfulMemory[]> {\n await this.deps.initialize();\n return this.deps.retrievalStore.getHelpfulMemories(limit);\n }\n\n async getHelpfulnessStats(since?: Date): Promise<HelpfulnessStats> {\n await this.deps.initialize();\n return this.deps.retrievalStore.getHelpfulnessStats(since);\n }\n\n /**\n * Extract topic keywords from event content (markdown headings and key terms).\n */\n private extractTopicsFromContent(content: string): string[] {\n const topics: Set<string> = new Set();\n\n const headings = content.match(/^#{1,3}\\s+(.+)$/gm);\n if (headings) {\n for (const heading of headings.slice(0, 5)) {\n const text = heading.replace(/^#+\\s+/, '').replace(/[*_`#]/g, '').trim();\n if (text.length > 2 && text.length < 50) {\n topics.add(text);\n }\n }\n }\n\n const boldTerms = content.match(/\\*\\*([^*]+)\\*\\*/g);\n if (boldTerms) {\n for (const boldTerm of boldTerms.slice(0, 5)) {\n const text = boldTerm.replace(/\\*\\*/g, '').trim();\n if (text.length > 2 && text.length < 30) {\n topics.add(text);\n }\n }\n }\n\n return Array.from(topics).slice(0, 5);\n }\n}\n\nexport function createRetrievalAnalyticsService(\n deps: RetrievalAnalyticsServiceDeps\n): RetrievalAnalyticsService {\n return new RetrievalAnalyticsService(deps);\n}\n", "/**\n * Retrieval Disclosure Service\n *\n * Provides a product-facing progressive disclosure surface on top of retrieval:\n * search -> expand -> source. Search returns compact, spec-aligned result\n * envelopes; expand adds surrounding context; source resolves to canonical raw\n * events or other source references.\n */\n\nimport type { RetrievalReason, RetrievalResultEnvelope, RetrievalResultType } from '../model/retrieval-result.js';\nimport { sanitizeGovernanceAuditValue } from '../operations/governance-audit.js';\nimport type { UnifiedRetrievalResult, MemoryWithContext, RetrievalDebugDetail } from '../retriever.js';\nimport type { MemoryEvent, SharedTroubleshootingEntry } from '../types.js';\nimport type { RetrieveMemoriesOptions } from './retrieval-orchestrator.js';\n\nexport type RetrievalDisclosureResultType = RetrievalResultType;\nexport type RetrievalDisclosureReason = RetrievalReason;\nexport type RetrievalDisclosureEnvelope = RetrievalResultEnvelope;\nexport type RetrievalDisclosureSourceType =\n | 'raw_event'\n | 'transcript'\n | 'tool_output'\n | 'imported_history'\n | 'shared_troubleshooting';\n\nexport interface RetrievalDisclosureSearchResponse {\n results: RetrievalResultEnvelope[];\n meta: {\n total: number;\n usedVector: boolean;\n usedKeyword: boolean;\n fallbackApplied: boolean;\n confidence?: UnifiedRetrievalResult['matchResult']['confidence'];\n totalTokens?: number;\n fallbackTrace?: string[];\n };\n}\n\nexport interface RetrievalDisclosureSourceReference {\n sourceRef: string;\n sourceType: RetrievalDisclosureSourceType;\n eventIds: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface RetrievalDisclosureExpansion {\n target: RetrievalResultEnvelope;\n surroundingFacts?: RetrievalResultEnvelope[];\n summaries?: RetrievalResultEnvelope[];\n relatedSources?: RetrievalDisclosureSourceReference[];\n expandedContext?: string;\n}\n\nexport interface RetrievalDisclosureSource extends RetrievalDisclosureSourceReference {\n rawEvents: MemoryEvent[];\n primaryEvent?: MemoryEvent;\n}\n\nexport interface RetrievalDisclosureSearchOptions extends RetrieveMemoriesOptions {}\n\nexport interface RetrievalDisclosureExpandOptions {\n windowSize?: number;\n}\n\nexport interface RetrievalDisclosureOrchestrator {\n retrieveMemories(\n query: string,\n options?: RetrievalDisclosureSearchOptions\n ): Promise<UnifiedRetrievalResult>;\n}\n\nexport interface RetrievalDisclosureEventStore {\n getEvent(id: string): Promise<MemoryEvent | null>;\n getSessionEvents(sessionId: string): Promise<MemoryEvent[]>;\n}\n\nexport interface RetrievalDisclosureSharedStore {\n get(entryId: string): Promise<SharedTroubleshootingEntry | null>;\n}\n\nexport interface RetrievalDisclosureServiceDeps {\n initialize: () => Promise<void>;\n retrievalOrchestrator: RetrievalDisclosureOrchestrator;\n eventStore: RetrievalDisclosureEventStore;\n sharedStore?: RetrievalDisclosureSharedStore;\n}\n\nexport class RetrievalDisclosureService {\n constructor(private readonly deps: RetrievalDisclosureServiceDeps) {}\n\n async search(\n query: string,\n options?: RetrievalDisclosureSearchOptions\n ): Promise<RetrievalDisclosureSearchResponse> {\n const result = await this.deps.retrievalOrchestrator.retrieveMemories(query, options);\n const debugByEventId = this.buildDebugIndex(result);\n const projectResults = result.memories.map((memory) => this.memoryToEnvelope(\n memory,\n result,\n debugByEventId.get(memory.event.id)\n ));\n const sharedResults = (result.sharedMemories || []).map((entry) => this.sharedToEnvelope(entry));\n const results = [...projectResults, ...sharedResults];\n\n return {\n results,\n meta: {\n total: results.length,\n usedVector: this.usedVector(result),\n usedKeyword: this.usedKeyword(result),\n fallbackApplied: this.fallbackApplied(result),\n confidence: result.matchResult.confidence,\n totalTokens: result.totalTokens,\n fallbackTrace: result.fallbackTrace || []\n }\n };\n }\n\n async expand(\n resultId: string,\n options?: RetrievalDisclosureExpandOptions\n ): Promise<RetrievalDisclosureExpansion | null> {\n const parsedId = parseDisclosureResultRef(resultId);\n if (parsedId.kind === 'shared') {\n return this.expandShared(parsedId.entryId);\n }\n\n const targetEvent = await this.deps.eventStore.getEvent(parsedId.eventId);\n if (!targetEvent) return null;\n\n const windowSize = Math.max(0, options?.windowSize ?? 3);\n const sessionEvents = (await this.deps.eventStore.getSessionEvents(targetEvent.sessionId))\n .slice()\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n const targetIndex = sessionEvents.findIndex((event) => event.id === targetEvent.id);\n const surroundingEvents = targetIndex === -1\n ? []\n : sessionEvents.slice(\n Math.max(0, targetIndex - windowSize),\n Math.min(sessionEvents.length, targetIndex + windowSize + 1)\n );\n const nearbyEvents = surroundingEvents.length > 0 ? surroundingEvents : [targetEvent];\n const nonTargetEvents = nearbyEvents.filter((event) => event.id !== targetEvent.id);\n\n return {\n target: this.eventToEnvelope(targetEvent, 1, ['continuity_link']),\n surroundingFacts: nonTargetEvents.map((event) => this.eventToEnvelope(event, 1, this.reasonsForContextEvent(event))),\n summaries: nonTargetEvents\n .filter((event) => event.eventType === 'session_summary')\n .map((event) => this.eventToEnvelope(event, 1, ['summary_fallback'])),\n relatedSources: nearbyEvents.map((event) => this.sourceReferenceForEvent(event)),\n expandedContext: this.formatTimelineContext(nearbyEvents)\n };\n }\n\n async source(resultId: string): Promise<RetrievalDisclosureSource | null> {\n const parsedId = parseDisclosureResultRef(resultId);\n if (parsedId.kind === 'shared') {\n return this.sourceShared(parsedId.entryId);\n }\n\n const rawEvent = await this.deps.eventStore.getEvent(parsedId.eventId);\n if (!rawEvent) return null;\n\n return {\n ...this.sourceReferenceForEvent(rawEvent),\n rawEvents: [rawEvent],\n primaryEvent: rawEvent\n };\n }\n\n private async expandShared(entryId: string): Promise<RetrievalDisclosureExpansion | null> {\n const entry = await this.deps.sharedStore?.get(entryId);\n if (!entry) return null;\n\n return {\n target: this.sharedToEnvelope(entry),\n surroundingFacts: [],\n summaries: [],\n relatedSources: [this.sourceReferenceForShared(entry)],\n expandedContext: this.formatSharedContext(entry)\n };\n }\n\n private async sourceShared(entryId: string): Promise<RetrievalDisclosureSource | null> {\n const entry = await this.deps.sharedStore?.get(entryId);\n if (!entry) return null;\n\n const sourceReference = this.sourceReferenceForShared(entry);\n return {\n ...sourceReference,\n rawEvents: [],\n metadata: {\n ...sourceReference.metadata,\n symptoms: entry.symptoms,\n rootCause: entry.rootCause,\n solution: entry.solution,\n technologies: entry.technologies,\n confidence: entry.confidence,\n usageCount: entry.usageCount\n }\n };\n }\n\n private memoryToEnvelope(\n memory: MemoryWithContext,\n result: UnifiedRetrievalResult,\n debug?: RetrievalDebugDetail\n ): RetrievalResultEnvelope {\n return this.eventToEnvelope(\n memory.event,\n memory.score,\n this.inferReasons(memory, result, debug),\n {\n semanticScore: debug?.semanticScore,\n lexicalScore: debug?.lexicalScore,\n recencyScore: debug?.recencyScore,\n ...(debug?.facetMatches && debug.facetMatches.length > 0 ? { facetMatches: debug.facetMatches } : {}),\n ...(debug?.graphPaths && debug.graphPaths.length > 0 ? { graphPaths: this.sanitizeGraphPaths(debug.graphPaths) } : {})\n }\n );\n }\n\n private sanitizeGraphPaths(graphPaths: RetrievalDebugDetail['graphPaths']): unknown {\n return sanitizeGovernanceAuditValue(graphPaths ?? []);\n }\n\n private eventToEnvelope(\n event: MemoryEvent,\n score: number,\n reasons: RetrievalDisclosureReason[],\n extraMetadata?: Record<string, unknown>\n ): RetrievalResultEnvelope {\n return {\n id: toDisclosureResultId(event.id),\n resultType: this.resultTypeForEvent(event),\n title: this.titleForEvent(event),\n snippet: this.preview(event.content, 240),\n score,\n reasons,\n sourceRef: toDisclosureResultId(event.id),\n sessionId: event.sessionId,\n metadata: {\n eventId: event.id,\n eventType: event.eventType,\n timestamp: event.timestamp.toISOString(),\n canonicalKey: event.canonicalKey,\n ...event.metadata,\n ...extraMetadata\n }\n };\n }\n\n private sharedToEnvelope(entry: SharedTroubleshootingEntry): RetrievalResultEnvelope {\n return {\n id: `shared:${entry.entryId}`,\n resultType: 'rule',\n title: entry.title,\n snippet: this.preview(entry.solution || entry.rootCause || entry.symptoms.join(' '), 240),\n score: entry.confidence,\n reasons: ['semantic_match'],\n sourceRef: `shared:${entry.entryId}`,\n metadata: {\n sourceProjectHash: entry.sourceProjectHash,\n sourceEntryId: entry.sourceEntryId,\n topics: entry.topics,\n technologies: entry.technologies,\n confidence: entry.confidence,\n usageCount: entry.usageCount\n }\n };\n }\n\n private buildDebugIndex(result: UnifiedRetrievalResult): Map<string, RetrievalDebugDetail> {\n const byEventId = new Map<string, RetrievalDebugDetail>();\n\n for (const detail of result.candidateDebug || []) {\n byEventId.set(detail.eventId, detail);\n }\n for (const detail of result.selectedDebug || []) {\n byEventId.set(detail.eventId, detail);\n }\n\n return byEventId;\n }\n\n private inferReasons(\n memory: MemoryWithContext,\n result: UnifiedRetrievalResult,\n debug?: RetrievalDebugDetail\n ): RetrievalDisclosureReason[] {\n const reasons = new Set<RetrievalDisclosureReason>();\n\n const usedVector = this.usedVector(result);\n const usedKeyword = this.usedKeyword(result);\n\n if (usedVector && (debug?.semanticScore ?? 0) > 0) reasons.add('semantic_match');\n if ((debug?.lexicalScore ?? 0) > 0 || usedKeyword) reasons.add('keyword_match');\n if ((debug?.recencyScore ?? 0) > 0) reasons.add('recent_relevance');\n if ((debug?.facetMatches || []).length > 0) reasons.add('facet_match');\n if ((debug?.graphPaths || []).length > 0) reasons.add('entity_overlap');\n if ((result.fallbackTrace || []).some((step) => step === 'fallback:summary')) reasons.add('summary_fallback');\n if (memory.sessionContext) reasons.add('continuity_link');\n if (memory.event.eventType === 'tool_observation') reasons.add('tool_followup');\n if (reasons.size === 0) reasons.add(usedVector ? 'semantic_match' : 'keyword_match');\n\n return Array.from(reasons);\n }\n\n private reasonsForContextEvent(event: MemoryEvent): RetrievalDisclosureReason[] {\n if (event.eventType === 'tool_observation') return ['tool_followup'];\n if (event.eventType === 'session_summary') return ['summary_fallback'];\n return ['continuity_link'];\n }\n\n private resultTypeForEvent(event: MemoryEvent): RetrievalDisclosureResultType {\n if (event.eventType === 'session_summary') return 'summary';\n if (event.eventType === 'tool_observation') return 'tool_evidence';\n return 'source';\n }\n\n private sourceReferenceForEvent(event: MemoryEvent): RetrievalDisclosureSourceReference {\n return {\n sourceRef: toDisclosureResultId(event.id),\n sourceType: this.sourceTypeForEvent(event),\n eventIds: [event.id]\n };\n }\n\n private sourceReferenceForShared(entry: SharedTroubleshootingEntry): RetrievalDisclosureSourceReference {\n return {\n sourceRef: `shared:${entry.entryId}`,\n sourceType: 'shared_troubleshooting',\n eventIds: [],\n metadata: {\n sourceProjectHash: entry.sourceProjectHash,\n sourceEntryId: entry.sourceEntryId,\n topics: entry.topics\n }\n };\n }\n\n private sourceTypeForEvent(event: MemoryEvent): RetrievalDisclosureSourceType {\n const metadata = event.metadata || {};\n if (event.eventType === 'tool_observation') return 'tool_output';\n if (typeof metadata.transcriptPath === 'string') return 'transcript';\n if (typeof metadata.importedFrom === 'string') return 'imported_history';\n return 'raw_event';\n }\n\n private titleForEvent(event: MemoryEvent): string {\n if (event.eventType === 'session_summary') return 'Session summary';\n if (event.eventType === 'tool_observation') return 'Tool evidence';\n if (event.eventType === 'agent_response') return 'Agent response';\n return 'User prompt';\n }\n\n private usedVector(result: UnifiedRetrievalResult): boolean {\n return (result.fallbackTrace || []).some((step) => step.includes(':deep'));\n }\n\n private usedKeyword(result: UnifiedRetrievalResult): boolean {\n return (result.fallbackTrace || []).some((step) => step.includes(':fast')) ||\n [...(result.selectedDebug || []), ...(result.candidateDebug || [])]\n .some((detail) => (detail.lexicalScore ?? 0) > 0);\n }\n\n private fallbackApplied(result: UnifiedRetrievalResult): boolean {\n return (result.fallbackTrace || []).some((step) => step.includes('fallback'));\n }\n\n private formatTimelineContext(events: MemoryEvent[]): string {\n return events\n .map((event) => `[${event.eventType}] ${event.content}`)\n .join('\\n\\n');\n }\n\n private formatSharedContext(entry: SharedTroubleshootingEntry): string {\n return [\n `[shared_troubleshooting] ${entry.title}`,\n `Symptoms: ${entry.symptoms.join('; ')}`,\n `Root cause: ${entry.rootCause}`,\n `Solution: ${entry.solution}`,\n `Topics: ${entry.topics.join(', ')}`\n ].join('\\n');\n }\n\n private preview(content: string, maxLength: number): string {\n const normalized = content.replace(/\\s+/g, ' ').trim();\n if (normalized.length <= maxLength) return normalized;\n return `${normalized.slice(0, Math.max(0, maxLength - 3))}...`;\n }\n}\n\nexport function toDisclosureResultId(eventId: string): string {\n return eventId.startsWith('event:') ? eventId : `event:${eventId}`;\n}\n\nexport type ParsedDisclosureResultId =\n | { kind: 'event'; eventId: string }\n | { kind: 'shared'; entryId: string };\n\nexport function parseDisclosureResultId(resultId: string): string {\n return resultId.startsWith('event:') ? resultId.slice('event:'.length) : resultId;\n}\n\nexport function parseDisclosureResultRef(resultId: string): ParsedDisclosureResultId {\n if (resultId.startsWith('shared:')) {\n return { kind: 'shared', entryId: resultId.slice('shared:'.length) };\n }\n return {\n kind: 'event',\n eventId: parseDisclosureResultId(resultId)\n };\n}\n\nexport function createRetrievalDisclosureService(\n deps: RetrievalDisclosureServiceDeps\n): RetrievalDisclosureService {\n return new RetrievalDisclosureService(deps);\n}\n", "/**\n * Retrieval Orchestrator\n *\n * Coordinates MemoryService-level retrieval concerns around the lower-level\n * Retriever: initialization, rerank policy, project/shared scoping, optional\n * intent rewriting, and non-blocking retrieval trace telemetry.\n */\n\nimport {\n Retriever,\n type ProjectScopeMode,\n type RetrievalFacetFilter,\n type RetrievalMode,\n type RetrievalResult,\n type RetrievalStrategy,\n type UnifiedRetrievalResult\n} from '../retriever.js';\nimport type { RetrievalDebugLane } from '../retrieval-debug-lanes.js';\nimport type { MemoryOperationsConfig } from '../types.js';\n\nexport interface RetrieveMemoriesOptions {\n topK?: number;\n minScore?: number;\n sessionId?: string;\n includeShared?: boolean;\n adaptiveRerank?: boolean;\n intentRewrite?: boolean;\n projectScopeMode?: ProjectScopeMode;\n allowedProjectHashes?: string[];\n facets?: RetrievalFacetFilter[];\n strategy?: RetrievalStrategy;\n retrievalMode?: RetrievalMode;\n graphHop?: {\n enabled?: boolean;\n maxHops?: number;\n hopPenalty?: number;\n };\n /**\n * Disable automatic retrieval trace writes for read-only/navigation callers\n * that may receive secret-bearing ad-hoc queries.\n */\n recordTrace?: boolean;\n}\n\nexport interface RecordQueryTraceInput {\n sessionId: string;\n queryText: string;\n rawQueryText?: string;\n queryRewriteKind?: string;\n strategy: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n confidence: string;\n}\n\ninterface HelpfulnessStats {\n avgScore: number;\n totalEvaluated: number;\n totalRetrievals: number;\n helpful: number;\n neutral: number;\n unhelpful: number;\n}\n\ntype RerankWeights = {\n semantic: number;\n lexical: number;\n recency: number;\n};\n\ninterface RetrievalTraceDetail {\n eventId: string;\n score: number;\n semanticScore?: number;\n lexicalScore?: number;\n recencyScore?: number;\n lanes?: RetrievalDebugLane[];\n}\n\nexport interface RetrievalTraceStore {\n getHelpfulnessStats(): Promise<HelpfulnessStats>;\n recordRetrievalTrace(input: {\n sessionId?: string;\n projectHash?: string;\n queryText: string;\n rawQueryText?: string;\n queryRewriteKind?: string;\n strategy?: string;\n candidateEventIds: string[];\n selectedEventIds: string[];\n candidateDetails?: RetrievalTraceDetail[];\n selectedDetails?: RetrievalTraceDetail[];\n confidence?: string;\n fallbackTrace?: string[];\n }): Promise<void>;\n}\n\nexport interface RetrievalAccessStore {\n incrementAccessCount(eventIds: string[]): Promise<void>;\n recordRetrieval(eventId: string, sessionId: string, score: number, query: string): Promise<void>;\n}\n\nexport interface RetrievalOrchestratorDeps {\n initialize: () => Promise<void>;\n retriever: Retriever;\n traceStore: RetrievalTraceStore;\n accessStore: RetrievalAccessStore;\n getProjectHash: () => string | null;\n hasSharedStore: () => boolean;\n memoryOperationsConfig?: MemoryOperationsConfig;\n}\n\nexport class RetrievalOrchestrator {\n constructor(private readonly deps: RetrievalOrchestratorDeps) {\n this.deps.retriever.setQueryRewriter((query) => this.rewriteQueryIntent(query));\n }\n\n /**\n * Retrieve relevant memories for a query.\n */\n async retrieveMemories(\n query: string,\n options?: RetrieveMemoriesOptions\n ): Promise<UnifiedRetrievalResult> {\n const { recordTrace = true, ...retrieverOptions } = options ?? {};\n const lightweightFastRead = this.isLightweightFastRead(options);\n if (!lightweightFastRead) {\n await this.deps.initialize();\n }\n\n // Note: Pending embeddings are processed by the background worker.\n // Don't block retrieval - search with whatever vectors are available.\n const rerankWeights = lightweightFastRead\n ? undefined\n : await this.getRerankWeights(options?.adaptiveRerank === true);\n const projectHash = this.deps.getProjectHash();\n const projectScopeMode = retrieverOptions.projectScopeMode ?? (projectHash ? 'strict' : 'global');\n const graphHop = this.resolveGraphHopOptions(retrieverOptions.graphHop);\n\n let result: UnifiedRetrievalResult;\n\n if (retrieverOptions.includeShared && this.deps.hasSharedStore()) {\n result = await this.deps.retriever.retrieveUnified(query, {\n ...retrieverOptions,\n intentRewrite: retrieverOptions.intentRewrite === true,\n rerankWeights,\n includeShared: true,\n graphHop,\n projectHash: projectHash || undefined,\n projectScopeMode,\n allowedProjectHashes: retrieverOptions.allowedProjectHashes\n });\n } else {\n result = await this.deps.retriever.retrieve(query, {\n ...retrieverOptions,\n intentRewrite: retrieverOptions.intentRewrite === true,\n rerankWeights,\n graphHop,\n projectHash: projectHash || undefined,\n projectScopeMode,\n allowedProjectHashes: retrieverOptions.allowedProjectHashes\n });\n }\n\n if (recordTrace) {\n try {\n await this.recordAutomaticTrace(query, result, options, projectHash);\n } catch {\n // Non-blocking telemetry.\n }\n }\n\n return result;\n }\n\n /**\n * Format retrieval results as context for Claude.\n */\n formatAsContext(result: RetrievalResult): string {\n if (!result.context) {\n return '';\n }\n\n const confidence = result.matchResult.confidence;\n let header = '';\n\n if (confidence === 'high') {\n header = '\uD83C\uDFAF **High-confidence memory match found:**\\n\\n';\n } else if (confidence === 'suggested') {\n header = '\uD83D\uDCA1 **Suggested memories (may be relevant):**\\n\\n';\n }\n\n return header + result.context;\n }\n\n /**\n * Record a query-level retrieval trace used by hooks and dashboard stats.\n */\n async recordQueryTrace(input: RecordQueryTraceInput): Promise<void> {\n await this.deps.initialize();\n await this.deps.traceStore.recordRetrievalTrace({\n ...input,\n projectHash: this.deps.getProjectHash() || undefined,\n candidateDetails: [],\n selectedDetails: [],\n fallbackTrace: [],\n });\n }\n\n /**\n * Increment access count for memories that were injected into prompts.\n *\n * Access count writes are intentionally store-scoped: the SQLite access store\n * initializes itself and no-ops in read-only mode, so this avoids triggering\n * the heavier retrieval/vector initialization path for prompt telemetry.\n */\n async incrementMemoryAccess(eventIds: string[]): Promise<void> {\n if (eventIds.length === 0) return;\n\n await this.deps.accessStore.incrementAccessCount(eventIds);\n }\n\n /**\n * Record a selected retrieval for helpfulness analytics.\n */\n async recordRetrieval(\n eventId: string,\n sessionId: string,\n score: number,\n query: string\n ): Promise<void> {\n await this.deps.initialize();\n await this.deps.accessStore.recordRetrieval(eventId, sessionId, score, query);\n }\n\n private resolveGraphHopOptions(\n callerOptions: RetrieveMemoriesOptions['graphHop'] | undefined\n ): RetrieveMemoriesOptions['graphHop'] | undefined {\n const graphExpansion = this.deps.memoryOperationsConfig?.graphExpansion;\n const durableOptions = graphExpansion?.enabled === true\n ? { enabled: true, maxHops: graphExpansion.maxHops }\n : undefined;\n\n if (!callerOptions) return durableOptions;\n if (!graphExpansion) return callerOptions;\n if (graphExpansion.enabled !== true) {\n return {\n ...callerOptions,\n enabled: false,\n maxHops: graphExpansion.maxHops ?? callerOptions.maxHops\n };\n }\n\n return {\n enabled: callerOptions.enabled === false ? false : true,\n maxHops: Math.min(\n graphExpansion.maxHops ?? Number.POSITIVE_INFINITY,\n callerOptions.maxHops ?? graphExpansion.maxHops ?? 1\n ),\n hopPenalty: callerOptions.hopPenalty\n };\n }\n\n private async recordAutomaticTrace(\n query: string,\n result: UnifiedRetrievalResult,\n options: RetrieveMemoriesOptions | undefined,\n projectHash: string | null\n ): Promise<void> {\n const selectedEventIds = result.memories.map((memory) => memory.event.id);\n const selectedDetails = (result.selectedDebug || []).map((detail) => ({\n eventId: detail.eventId,\n score: detail.score,\n semanticScore: detail.semanticScore,\n lexicalScore: detail.lexicalScore,\n recencyScore: detail.recencyScore,\n lanes: detail.lanes,\n }));\n const candidateDetails = (result.candidateDebug || []).map((detail) => ({\n eventId: detail.eventId,\n score: detail.score,\n semanticScore: detail.semanticScore,\n lexicalScore: detail.lexicalScore,\n recencyScore: detail.recencyScore,\n lanes: detail.lanes,\n }));\n const candidateEventIds = candidateDetails.length > 0\n ? candidateDetails.map((detail) => detail.eventId)\n : selectedEventIds;\n\n await this.deps.traceStore.recordRetrievalTrace({\n sessionId: options?.sessionId,\n projectHash: projectHash || undefined,\n queryText: result.effectiveQueryText || query,\n rawQueryText: result.rawQueryText || (result.queryRewriteKind ? query : undefined),\n queryRewriteKind: result.queryRewriteKind || 'none',\n strategy: options?.strategy || 'auto',\n candidateEventIds,\n selectedEventIds,\n candidateDetails,\n selectedDetails,\n confidence: result.matchResult.confidence,\n fallbackTrace: result.fallbackTrace || []\n });\n }\n\n private isLightweightFastRead(options: RetrieveMemoriesOptions | undefined): boolean {\n const requiresSharedRuntime = options?.includeShared === true && this.deps.hasSharedStore();\n\n return options?.strategy === 'fast'\n && !requiresSharedRuntime\n && options.adaptiveRerank !== true;\n }\n\n private getConfiguredRerankWeights(): RerankWeights | undefined {\n const semantic = Number(process.env.MEMORY_RERANK_WEIGHT_SEMANTIC ?? '');\n const lexical = Number(process.env.MEMORY_RERANK_WEIGHT_LEXICAL ?? '');\n const recency = Number(process.env.MEMORY_RERANK_WEIGHT_RECENCY ?? '');\n\n const allFinite = [semantic, lexical, recency].every((value) => Number.isFinite(value));\n if (!allFinite) return undefined;\n\n const nonNegative = [semantic, lexical, recency].every((value) => value >= 0);\n const total = semantic + lexical + recency;\n if (!nonNegative || total <= 0) return undefined;\n\n return {\n semantic: semantic / total,\n lexical: lexical / total,\n recency: recency / total,\n };\n }\n\n private async getRerankWeights(adaptive: boolean): Promise<RerankWeights | undefined> {\n const configured = this.getConfiguredRerankWeights();\n if (configured) return configured;\n if (adaptive) return this.getAdaptiveRerankWeights();\n return undefined;\n }\n\n private async getAdaptiveRerankWeights(): Promise<RerankWeights | undefined> {\n try {\n const stats = await this.deps.traceStore.getHelpfulnessStats();\n if (stats.totalEvaluated < 20) return undefined;\n\n // Base weights.\n let semantic = 0.7;\n let lexical = 0.2;\n let recency = 0.1;\n\n if (stats.avgScore < 0.45) {\n semantic -= 0.1;\n lexical += 0.1;\n } else if (stats.avgScore > 0.75) {\n semantic += 0.05;\n lexical -= 0.05;\n }\n\n if (stats.unhelpful > stats.helpful) {\n recency += 0.05;\n semantic -= 0.03;\n lexical -= 0.02;\n }\n\n return { semantic, lexical, recency };\n } catch {\n return undefined;\n }\n }\n\n private async rewriteQueryIntent(query: string): Promise<string | null> {\n if (process.env.MEMORY_INTENT_REWRITE_ENABLED !== '1') return null;\n\n const apiUrl = process.env.COMPANY_STOCK_API_URL || process.env.COMPANY_INT_API_URL;\n if (!apiUrl) return null;\n\n const controller = new AbortController();\n const timeoutMs = Number(process.env.MEMORY_INTENT_REWRITE_TIMEOUT_MS || 5000);\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const prompt = [\n 'Rewrite user query for memory retrieval intent expansion.',\n 'Return plain text only, one line, no markdown.',\n `Query: ${query}`,\n ].join('\\n');\n\n const res = await fetch(apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: '*/*',\n Origin: process.env.COMPANY_INT_ORIGIN || 'http://company-int.aplusai.ai',\n Referer: process.env.COMPANY_INT_REFERER || 'http://company-int.aplusai.ai/',\n },\n body: JSON.stringify({\n question: prompt,\n company_name: null,\n conversation_id: null,\n }),\n signal: controller.signal,\n });\n\n const text = (await res.text()).trim();\n if (!text) return null;\n\n const oneLine = text\n .replace(/^data:\\s*/gm, '')\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .join(' ')\n .slice(0, 240);\n\n if (!oneLine || oneLine.toLowerCase() === query.toLowerCase()) return null;\n return oneLine;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n\nexport function createRetrievalOrchestrator(\n deps: RetrievalOrchestratorDeps\n): RetrievalOrchestrator {\n return new RetrievalOrchestrator(deps);\n}\n", "/**\n * Retrieval Services Bundle\n *\n * Owns construction and wiring for retrieval-facing engine services so\n * MemoryService can hold a thin facade boundary instead of directly\n * instantiating each retrieval collaborator.\n */\n\nimport type { Embedder } from '../embedder.js';\nimport type { EventStore } from '../event-store.js';\nimport type { Matcher } from '../matcher.js';\nimport type { MemoryEvent, MemoryOperationsConfig } from '../types.js';\nimport {\n createRetriever as createCoreRetriever,\n type Retriever,\n type SharedStoreOptions\n} from '../retriever.js';\nimport type { VectorStore } from '../vector-store.js';\nimport {\n createRetrievalAnalyticsService,\n type RetrievalAnalyticsService,\n type RetrievalAnalyticsStore\n} from './retrieval-analytics-service.js';\nimport {\n createRetrievalDisclosureService,\n type RetrievalDisclosureEventStore,\n type RetrievalDisclosureService,\n type RetrievalDisclosureSharedStore\n} from './retrieval-disclosure-service.js';\nimport {\n createRetrievalOrchestrator,\n type RetrievalAccessStore,\n type RetrievalOrchestrator,\n type RetrievalTraceStore\n} from './retrieval-orchestrator.js';\n\nexport interface RetrievalSourceStore {\n getRecentEvents(limit?: number): Promise<MemoryEvent[]>;\n}\n\nexport type RetrievalEventStore = RetrievalTraceStore\n & RetrievalAccessStore\n & RetrievalDisclosureEventStore\n & RetrievalAnalyticsStore\n & RetrievalSourceStore;\n\nexport type CreateRetrieverFn = (\n eventStore: RetrievalEventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher,\n options?: SharedStoreOptions\n) => Retriever;\n\nexport interface RetrievalServicesDeps {\n initialize: () => Promise<void>;\n eventStore: RetrievalEventStore;\n vectorStore: VectorStore;\n embedder: Embedder;\n matcher: Matcher;\n getProjectHash: () => string | null;\n hasSharedStore: () => boolean;\n memoryOperationsConfig?: MemoryOperationsConfig;\n sharedStore?: RetrievalDisclosureSharedStore;\n createRetriever?: CreateRetrieverFn;\n}\n\nexport interface RetrievalServices {\n retriever: Retriever;\n retrievalOrchestrator: RetrievalOrchestrator;\n retrievalDisclosureService: RetrievalDisclosureService;\n retrievalAnalyticsService: RetrievalAnalyticsService;\n}\n\nexport function createRetrievalServices(deps: RetrievalServicesDeps): RetrievalServices {\n const retrieverFactory = deps.createRetriever ?? defaultCreateRetriever;\n const retriever = retrieverFactory(\n deps.eventStore,\n deps.vectorStore,\n deps.embedder,\n deps.matcher,\n { queryGraphExpansionEnabled: deps.memoryOperationsConfig?.graphExpansion?.enabled === true }\n );\n const retrievalOrchestrator = createRetrievalOrchestrator({\n initialize: deps.initialize,\n retriever,\n traceStore: deps.eventStore,\n accessStore: deps.eventStore,\n getProjectHash: deps.getProjectHash,\n hasSharedStore: deps.hasSharedStore,\n memoryOperationsConfig: deps.memoryOperationsConfig\n });\n const retrievalDisclosureService = createRetrievalDisclosureService({\n initialize: deps.initialize,\n retrievalOrchestrator,\n eventStore: deps.eventStore,\n sharedStore: deps.sharedStore\n });\n const retrievalAnalyticsService = createRetrievalAnalyticsService({\n initialize: deps.initialize,\n retrievalStore: deps.eventStore\n });\n\n return {\n retriever,\n retrievalOrchestrator,\n retrievalDisclosureService,\n retrievalAnalyticsService\n };\n}\n\nfunction defaultCreateRetriever(\n eventStore: RetrievalEventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher,\n options?: SharedStoreOptions\n): Retriever {\n assertDefaultRetrieverStore(eventStore);\n return createCoreRetriever(\n eventStore as unknown as EventStore,\n vectorStore,\n embedder,\n matcher,\n options\n );\n}\n\nfunction assertDefaultRetrieverStore(eventStore: RetrievalEventStore): void {\n const store = eventStore as unknown as Record<string, unknown>;\n for (const method of ['getEvent', 'getSessionEvents', 'getRecentEvents']) {\n if (typeof store[method] !== 'function') {\n throw new TypeError(`Default retrieval service eventStore requires ${method}()`);\n }\n }\n}\n\nexport {\n RetrievalAnalyticsService,\n createRetrievalAnalyticsService\n} from './retrieval-analytics-service.js';\nexport type {\n AccessedMemory,\n HelpfulMemory,\n HelpfulnessStats,\n RetrievalAnalyticsServiceDeps,\n RetrievalAnalyticsStore,\n RetrievalTrace,\n RetrievalTraceStats\n} from './retrieval-analytics-service.js';\nexport {\n RetrievalDisclosureService,\n createRetrievalDisclosureService,\n parseDisclosureResultId,\n parseDisclosureResultRef,\n toDisclosureResultId\n} from './retrieval-disclosure-service.js';\nexport type {\n RetrievalDisclosureEnvelope,\n RetrievalDisclosureEventStore,\n RetrievalDisclosureExpansion,\n RetrievalDisclosureExpandOptions,\n RetrievalDisclosureOrchestrator,\n RetrievalDisclosureReason,\n RetrievalDisclosureSearchOptions,\n RetrievalDisclosureSearchResponse,\n RetrievalDisclosureServiceDeps,\n RetrievalDisclosureSharedStore,\n RetrievalDisclosureSource,\n RetrievalDisclosureSourceReference,\n RetrievalDisclosureSourceType\n} from './retrieval-disclosure-service.js';\nexport {\n RetrievalOrchestrator,\n createRetrievalOrchestrator\n} from './retrieval-orchestrator.js';\nexport type {\n RecordQueryTraceInput,\n RetrievalAccessStore,\n RetrievalOrchestratorDeps,\n RetrievalTraceStore,\n RetrieveMemoriesOptions\n} from './retrieval-orchestrator.js';\n", "/**\n * Graduation Worker\n * Periodically evaluates memory events for promotion to higher levels\n * L0 \u2192 L1 \u2192 L2 \u2192 L3 \u2192 L4 based on access patterns and confidence\n */\n\nimport type { MemoryLevel } from './types.js';\nimport { EventStore } from './event-store.js';\nimport { GraduationPipeline } from './graduation.js';\n\nexport interface GraduationWorkerConfig {\n /** How often to run graduation evaluation (ms) */\n evaluationIntervalMs: number;\n /** Batch size for graduation evaluation */\n batchSize: number;\n /** Minimum time between evaluations of the same event (ms) */\n cooldownMs: number;\n}\n\nconst DEFAULT_CONFIG: GraduationWorkerConfig = {\n evaluationIntervalMs: 300000, // 5 minutes\n batchSize: 50,\n cooldownMs: 3600000 // 1 hour cooldown between evaluations\n};\n\nexport class GraduationWorker {\n private running = false;\n private timeout: NodeJS.Timeout | null = null;\n private lastEvaluated: Map<string, number> = new Map();\n\n constructor(\n private eventStore: EventStore,\n private graduation: GraduationPipeline,\n private config: GraduationWorkerConfig = DEFAULT_CONFIG\n ) {}\n\n /**\n * Start the graduation worker\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.scheduleNext();\n }\n\n /**\n * Stop the graduation worker\n */\n stop(): void {\n this.running = false;\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n }\n\n /**\n * Check if currently running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Force a graduation evaluation run\n */\n async forceRun(): Promise<GraduationRunResult> {\n return await this.runGraduation();\n }\n\n /**\n * Schedule the next graduation check\n */\n private scheduleNext(): void {\n if (!this.running) return;\n\n this.timeout = setTimeout(\n () => this.run(),\n this.config.evaluationIntervalMs\n );\n }\n\n /**\n * Run graduation evaluation\n */\n private async run(): Promise<void> {\n if (!this.running) return;\n\n try {\n await this.runGraduation();\n } catch (error) {\n console.error('Graduation error:', error);\n }\n\n this.scheduleNext();\n }\n\n /**\n * Perform graduation evaluation across all levels\n */\n private async runGraduation(): Promise<GraduationRunResult> {\n const result: GraduationRunResult = {\n evaluated: 0,\n graduated: 0,\n byLevel: {}\n };\n\n const levels: MemoryLevel[] = ['L0', 'L1', 'L2', 'L3'];\n const now = Date.now();\n\n for (const level of levels) {\n const events = await this.eventStore.getEventsByLevel(level, {\n limit: this.config.batchSize\n });\n\n let levelGraduated = 0;\n\n for (const event of events) {\n // Check cooldown\n const lastEval = this.lastEvaluated.get(event.id);\n if (lastEval && (now - lastEval) < this.config.cooldownMs) {\n continue;\n }\n\n result.evaluated++;\n this.lastEvaluated.set(event.id, now);\n\n const gradResult = await this.graduation.evaluateGraduation(event.id, level);\n\n if (gradResult.success) {\n result.graduated++;\n levelGraduated++;\n }\n }\n\n if (levelGraduated > 0) {\n result.byLevel[level] = levelGraduated;\n }\n }\n\n // Clean up old cooldown entries (keep last 1000)\n if (this.lastEvaluated.size > 1000) {\n const entries = Array.from(this.lastEvaluated.entries());\n entries.sort((a, b) => b[1] - a[1]);\n this.lastEvaluated = new Map(entries.slice(0, 1000));\n }\n\n return result;\n }\n}\n\nexport interface GraduationRunResult {\n evaluated: number;\n graduated: number;\n byLevel: Record<string, number>;\n}\n\n/**\n * Create a Graduation Worker instance\n */\nexport function createGraduationWorker(\n eventStore: EventStore,\n graduation: GraduationPipeline,\n config?: Partial<GraduationWorkerConfig>\n): GraduationWorker {\n return new GraduationWorker(\n eventStore,\n graduation,\n { ...DEFAULT_CONFIG, ...config }\n );\n}\n", "/**\n * Vector Worker - Single-Writer Pattern Implementation\n * AXIOMMIND Principle 6: DuckDB \u2192 outbox \u2192 LanceDB unidirectional flow\n */\n\nimport { EventStore } from './event-store.js';\nimport { VectorStore } from './vector-store.js';\nimport { Embedder } from './embedder.js';\nimport type { VectorRecord } from './types.js';\n\nexport interface WorkerConfig {\n batchSize: number;\n pollIntervalMs: number;\n maxRetries: number;\n}\n\nconst DEFAULT_CONFIG: WorkerConfig = {\n batchSize: 32,\n pollIntervalMs: 1000,\n maxRetries: 3\n};\n\nfunction parseJsonArray(value: unknown): unknown[] {\n if (Array.isArray(value)) return value;\n if (typeof value !== 'string' || value.trim().length === 0) return [];\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nfunction isMissingPerspectiveObservationTable(error: unknown): boolean {\n const message = String(error instanceof Error ? error.message : error).toLowerCase();\n return message.includes('no such table: perspective_observations');\n}\n\nexport class VectorWorker {\n private readonly eventStore: EventStore;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly config: WorkerConfig;\n private running = false;\n private stopping = false;\n private pollTimeout: NodeJS.Timeout | null = null;\n\n constructor(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n config: Partial<WorkerConfig> = {}\n ) {\n this.eventStore = eventStore;\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Start the worker polling loop\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.stopping = false;\n this.poll();\n }\n\n /**\n * Stop the worker\n */\n stop(): void {\n this.running = false;\n this.stopping = true;\n if (this.pollTimeout) {\n clearTimeout(this.pollTimeout);\n this.pollTimeout = null;\n }\n }\n\n /**\n * Process a single batch of outbox items\n */\n async processBatch(): Promise<number> {\n const items = await this.eventStore.getPendingOutboxItems(this.config.batchSize);\n\n if (items.length === 0) {\n return 0;\n }\n\n const successful: string[] = [];\n const failed: string[] = [];\n\n try {\n // Generate embeddings for all items\n const embeddings = await this.embedder.embedBatch(items.map(i => i.content));\n\n // Prepare vector records\n const records: VectorRecord[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const embedding = embeddings[i];\n\n // Get event details\n const event = await this.eventStore.getEvent(item.eventId);\n if (!event) {\n failed.push(item.id);\n continue;\n }\n\n records.push({\n id: `vec_${item.id}`,\n eventId: item.eventId,\n sessionId: event.sessionId,\n eventType: event.eventType,\n content: item.content,\n vector: embedding.vector,\n timestamp: event.timestamp.toISOString(),\n metadata: event.metadata\n });\n\n successful.push(item.id);\n }\n\n // Batch insert to vector store\n if (records.length > 0) {\n await this.vectorStore.upsertBatch(records);\n }\n\n // Mark successful items as done\n if (successful.length > 0) {\n await this.eventStore.completeOutboxItems(successful);\n }\n\n // Mark failed items\n if (failed.length > 0) {\n await this.eventStore.failOutboxItems(failed, 'Event not found');\n }\n\n return successful.length;\n } catch (error) {\n // Mark all items as failed, but only if not stopping (DB might be closed)\n if (!this.stopping) {\n try {\n const allIds = items.map(i => i.id);\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.eventStore.failOutboxItems(allIds, errorMessage);\n } catch (failError) {\n // Database might be closed during shutdown, ignore\n console.warn('Could not mark outbox items as failed (database may be closed)');\n }\n }\n throw error;\n }\n }\n\n /**\n * Poll for new items\n */\n private async poll(): Promise<void> {\n if (!this.running || this.stopping) return;\n\n try {\n await this.processBatch();\n } catch (error) {\n // Only log if not stopping (error during shutdown is expected)\n if (!this.stopping) {\n console.error('Vector worker error:', error);\n }\n }\n\n // Schedule next poll only if still running\n if (this.running && !this.stopping) {\n this.pollTimeout = setTimeout(() => this.poll(), this.config.pollIntervalMs);\n }\n }\n\n /**\n * Process all pending items (blocking)\n */\n async processAll(): Promise<number> {\n let totalProcessed = 0;\n let processed: number;\n\n do {\n processed = await this.processBatch();\n totalProcessed += processed;\n } while (processed > 0);\n\n return totalProcessed;\n }\n\n /**\n * Check if worker is running\n */\n isRunning(): boolean {\n return this.running;\n }\n}\n\n/**\n * Create and start a vector worker\n */\nexport function createVectorWorker(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n config?: Partial<WorkerConfig>\n): VectorWorker {\n const worker = new VectorWorker(eventStore, vectorStore, embedder, config);\n return worker;\n}\n\n// ============================================================\n// Vector Worker V2 - Extended for Task Entity System\n// ============================================================\n\nimport { dbAll, type Database } from './db-wrapper.js';\nimport { VectorOutbox } from './vector-outbox.js';\nimport type { OutboxJob, OutboxItemKind } from './types.js';\n\nexport interface WorkerConfigV2 {\n batchSize: number;\n pollIntervalMs: number;\n maxRetries: number;\n embeddingVersion: string;\n}\n\nconst DEFAULT_CONFIG_V2: WorkerConfigV2 = {\n batchSize: 32,\n pollIntervalMs: 1000,\n maxRetries: 3,\n embeddingVersion: 'v1'\n};\n\n/**\n * Content provider interface for different item kinds\n */\nexport interface ContentProvider {\n getContent(itemKind: OutboxItemKind, itemId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null>;\n}\n\n/**\n * Default content provider using database\n */\nexport class DefaultContentProvider implements ContentProvider {\n constructor(private db: Database) {}\n\n async getContent(itemKind: OutboxItemKind, itemId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n switch (itemKind) {\n case 'entry':\n return this.getEntryContent(itemId);\n case 'task_title':\n return this.getTaskTitleContent(itemId);\n case 'event':\n return this.getEventContent(itemId);\n case 'perspective_observation':\n return this.getPerspectiveObservationContent(itemId);\n default:\n return null;\n }\n }\n\n private async getEntryContent(entryId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT title, content_json, entry_type FROM entries WHERE entry_id = ?`,\n [entryId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n const contentJson = typeof row.content_json === 'string'\n ? JSON.parse(row.content_json)\n : row.content_json;\n\n return {\n content: `${row.title}\\n${JSON.stringify(contentJson)}`,\n metadata: {\n itemKind: 'entry',\n entryType: row.entry_type\n }\n };\n }\n\n private async getTaskTitleContent(taskId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT title, search_text, current_json FROM entities\n WHERE entity_id = ? AND entity_type = 'task'`,\n [taskId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n content: row.search_text as string || row.title as string,\n metadata: {\n itemKind: 'task_title',\n entityType: 'task'\n }\n };\n }\n\n private async getEventContent(eventId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT content, event_type, session_id FROM events WHERE id = ?`,\n [eventId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n content: row.content as string,\n metadata: {\n itemKind: 'event',\n eventType: row.event_type,\n sessionId: row.session_id\n }\n };\n }\n\n private async getPerspectiveObservationContent(observationId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n let rows: Record<string, unknown>[];\n try {\n rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT project_hash, observer_actor_id, observed_actor_id, session_id, level, content,\n source_event_ids_json, source_observation_ids_json\n FROM perspective_observations\n WHERE observation_id = ? AND deleted_at IS NULL`,\n [observationId]\n );\n } catch (error) {\n if (isMissingPerspectiveObservationTable(error)) {\n return null;\n }\n throw error;\n }\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n const sourceEventIds = parseJsonArray(row.source_event_ids_json);\n const sourceObservationIds = parseJsonArray(row.source_observation_ids_json);\n\n return {\n content: row.content as string,\n metadata: {\n itemKind: 'perspective_observation',\n level: row.level,\n projectHash: row.project_hash,\n observerActorId: row.observer_actor_id,\n observedActorId: row.observed_actor_id,\n sessionId: row.session_id,\n sourceEventCount: sourceEventIds.length,\n sourceObservationCount: sourceObservationIds.length\n }\n };\n }\n}\n\n/**\n * Vector Worker V2 - Supports multiple item kinds\n */\nexport class VectorWorkerV2 {\n private readonly outbox: VectorOutbox;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly contentProvider: ContentProvider;\n private readonly config: WorkerConfigV2;\n private running = false;\n private stopping = false;\n private pollTimeout: NodeJS.Timeout | null = null;\n\n constructor(\n db: Database,\n vectorStore: VectorStore,\n embedder: Embedder,\n config: Partial<WorkerConfigV2> = {},\n contentProvider?: ContentProvider\n ) {\n this.outbox = new VectorOutbox(db, {\n embeddingVersion: config.embeddingVersion ?? DEFAULT_CONFIG_V2.embeddingVersion,\n maxRetries: config.maxRetries ?? DEFAULT_CONFIG_V2.maxRetries\n });\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.config = { ...DEFAULT_CONFIG_V2, ...config };\n this.contentProvider = contentProvider ?? new DefaultContentProvider(db);\n }\n\n /**\n * Start the worker polling loop\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.stopping = false;\n this.poll();\n }\n\n /**\n * Stop the worker\n */\n stop(): void {\n this.running = false;\n this.stopping = true;\n if (this.pollTimeout) {\n clearTimeout(this.pollTimeout);\n this.pollTimeout = null;\n }\n }\n\n /**\n * Process a single batch of outbox jobs\n */\n async processBatch(): Promise<number> {\n const jobs = await this.outbox.claimJobs(this.config.batchSize);\n\n if (jobs.length === 0) {\n return 0;\n }\n\n let successCount = 0;\n\n for (const job of jobs) {\n try {\n await this.processJob(job);\n await this.outbox.markDone(job.jobId);\n successCount++;\n } catch (error) {\n // Only try to mark as failed if not stopping (DB might be closed)\n if (!this.stopping) {\n try {\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.outbox.markFailed(job.jobId, errorMessage);\n } catch {\n // Database might be closed during shutdown, ignore\n }\n }\n }\n }\n\n return successCount;\n }\n\n /**\n * Process a single job\n */\n private async processJob(job: OutboxJob): Promise<void> {\n // Get content\n const contentData = await this.contentProvider.getContent(job.itemKind, job.itemId);\n\n if (!contentData) {\n // Item not found, mark as done (skip)\n return;\n }\n\n // Generate embedding\n const embedding = await this.embedder.embed(contentData.content);\n\n // Upsert to vector store\n const record: VectorRecord = {\n id: `${job.itemKind}_${job.itemId}_${job.embeddingVersion}`,\n eventId: job.itemKind === 'event' ? job.itemId : '',\n sessionId: (contentData.metadata.sessionId as string) ?? '',\n eventType: (contentData.metadata.eventType as string) ?? job.itemKind,\n content: contentData.content,\n vector: embedding.vector,\n timestamp: new Date().toISOString(),\n metadata: {\n ...contentData.metadata,\n embeddingVersion: job.embeddingVersion\n }\n };\n\n // Use idempotent upsert (delete + add)\n await this.vectorStore.upsertBatch([record]);\n }\n\n /**\n * Poll for new jobs\n */\n private async poll(): Promise<void> {\n if (!this.running || this.stopping) return;\n\n try {\n await this.processBatch();\n } catch (error) {\n // Only log if not stopping (error during shutdown is expected)\n if (!this.stopping) {\n console.error('Vector worker V2 error:', error);\n }\n }\n\n // Schedule next poll only if still running\n if (this.running && !this.stopping) {\n this.pollTimeout = setTimeout(() => this.poll(), this.config.pollIntervalMs);\n }\n }\n\n /**\n * Process all pending jobs (blocking)\n */\n async processAll(): Promise<number> {\n let totalProcessed = 0;\n let processed: number;\n\n do {\n processed = await this.processBatch();\n totalProcessed += processed;\n } while (processed > 0);\n\n return totalProcessed;\n }\n\n /**\n * Run reconciliation\n */\n async reconcile(): Promise<{ recovered: number; retried: number }> {\n return this.outbox.reconcile();\n }\n\n /**\n * Get metrics\n */\n async getMetrics() {\n return this.outbox.getMetrics();\n }\n\n /**\n * Check if worker is running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Get the outbox instance for direct access\n */\n getOutbox(): VectorOutbox {\n return this.outbox;\n }\n}\n\n/**\n * Create a Vector Worker V2 instance\n */\nexport function createVectorWorkerV2(\n db: Database,\n vectorStore: VectorStore,\n embedder: Embedder,\n config?: Partial<WorkerConfigV2>\n): VectorWorkerV2 {\n return new VectorWorkerV2(db, vectorStore, embedder, config);\n}\n", "/**\n * Memory Runtime Service\n * Owns MemoryService lifecycle concerns: initialization, background workers,\n * lightweight/read-only modes, and orderly shutdown.\n */\n\nimport type { EventStore } from '../event-store.js';\nimport type { Embedder } from '../embedder.js';\nimport type { GraduationPipeline } from '../graduation.js';\nimport {\n createGraduationWorker as defaultCreateGraduationWorker,\n type GraduationRunResult,\n type GraduationWorker\n} from '../graduation-worker.js';\nimport type { Retriever } from '../retriever.js';\nimport type { VectorStore } from '../vector-store.js';\nimport {\n createVectorWorker as defaultCreateVectorWorker,\n createVectorWorkerV2 as defaultCreateVectorWorkerV2,\n type VectorWorker,\n type VectorWorkerV2\n} from '../vector-worker.js';\nimport type { Database } from '../db-wrapper.js';\n\nexport interface RuntimeSQLiteStore {\n initialize(): Promise<void>;\n close(): Promise<void>;\n getDatabase?(): Database;\n}\n\nexport interface RuntimeEndlessMemoryServices {\n initializeFromSavedMode(): Promise<void>;\n shutdown(): void;\n}\n\nexport interface RuntimeSharedMemoryServices {\n initialize(): Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface MemoryRuntimeServicesFactories {\n createVectorWorker?: typeof defaultCreateVectorWorker;\n createVectorWorkerV2?: typeof defaultCreateVectorWorkerV2;\n createGraduationWorker?: typeof defaultCreateGraduationWorker;\n}\n\nexport interface MemoryRuntimeServicesDeps {\n sqliteStore: RuntimeSQLiteStore;\n eventStore: EventStore;\n vectorStore: VectorStore;\n embedder: Embedder;\n retriever: Retriever;\n graduation: GraduationPipeline;\n endlessMemoryServices: RuntimeEndlessMemoryServices;\n sharedMemoryServices: RuntimeSharedMemoryServices;\n readOnly: boolean;\n lightweightMode: boolean;\n embeddingOnly: boolean;\n factories?: MemoryRuntimeServicesFactories;\n}\n\nexport interface MemoryRuntimeService {\n initialize(): Promise<void>;\n shutdown(): Promise<void>;\n processPendingEmbeddings(): Promise<number>;\n forceGraduation(): Promise<GraduationRunResult>;\n recordMemoryAccess(eventId: string, sessionId: string, confidence?: number): void;\n getVectorWorker(): VectorWorker | null;\n getVectorWorkerV2(): VectorWorkerV2 | null;\n isInitialized(): boolean;\n}\n\nfunction createEmptyGraduationResult(): GraduationRunResult {\n return { evaluated: 0, graduated: 0, byLevel: {} };\n}\n\nexport function createMemoryRuntimeService(deps: MemoryRuntimeServicesDeps): MemoryRuntimeService {\n const createVectorWorker = deps.factories?.createVectorWorker ?? defaultCreateVectorWorker;\n const createVectorWorkerV2 = deps.factories?.createVectorWorkerV2 ?? defaultCreateVectorWorkerV2;\n const createGraduationWorker = deps.factories?.createGraduationWorker ?? defaultCreateGraduationWorker;\n\n let initialized = false;\n let vectorWorker: VectorWorker | null = null;\n let vectorWorkerV2: VectorWorkerV2 | null = null;\n let graduationWorker: GraduationWorker | null = null;\n\n return {\n async initialize(): Promise<void> {\n if (initialized) return;\n\n // Initialize PRIMARY store: SQLite (always)\n await deps.sqliteStore.initialize();\n\n // Lightweight mode: only SQLite, no embedder/vector/workers.\n // Used for hooks that just need to store data quickly.\n if (deps.lightweightMode) {\n initialized = true;\n return;\n }\n\n await deps.vectorStore.initialize();\n await deps.embedder.initialize();\n\n // Skip write-related workers in read-only mode.\n if (!deps.readOnly) {\n vectorWorker = createVectorWorker(\n deps.eventStore,\n deps.vectorStore,\n deps.embedder\n );\n vectorWorker.start();\n\n const sqliteDb = deps.sqliteStore.getDatabase?.();\n if (sqliteDb) {\n vectorWorkerV2 = createVectorWorkerV2(\n sqliteDb,\n deps.vectorStore,\n deps.embedder\n );\n vectorWorkerV2.start();\n }\n\n if (!deps.embeddingOnly) {\n deps.retriever.setGraduationPipeline(deps.graduation);\n graduationWorker = createGraduationWorker(\n deps.eventStore,\n deps.graduation\n );\n graduationWorker.start();\n }\n\n await deps.endlessMemoryServices.initializeFromSavedMode();\n await deps.sharedMemoryServices.initialize();\n }\n\n initialized = true;\n },\n\n async shutdown(): Promise<void> {\n if (graduationWorker) {\n graduationWorker.stop();\n }\n\n deps.endlessMemoryServices.shutdown();\n\n if (vectorWorker) {\n vectorWorker.stop();\n }\n if (vectorWorkerV2) {\n vectorWorkerV2.stop();\n }\n\n await deps.sharedMemoryServices.close();\n await deps.sqliteStore.close();\n },\n\n async processPendingEmbeddings(): Promise<number> {\n let processed = 0;\n if (vectorWorker) {\n processed += await vectorWorker.processAll();\n }\n if (vectorWorkerV2) {\n processed += await vectorWorkerV2.processAll();\n }\n return processed;\n },\n\n async forceGraduation(): Promise<GraduationRunResult> {\n if (!graduationWorker) {\n return createEmptyGraduationResult();\n }\n return graduationWorker.forceRun();\n },\n\n recordMemoryAccess(eventId: string, sessionId: string, confidence: number = 1.0): void {\n deps.graduation.recordAccess(eventId, sessionId, confidence);\n },\n\n getVectorWorker(): VectorWorker | null {\n return vectorWorker;\n },\n\n getVectorWorkerV2(): VectorWorkerV2 | null {\n return vectorWorkerV2;\n },\n\n isInitialized(): boolean {\n return initialized;\n }\n };\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Embedder } from '../vector/index.js';\nimport { createSharedEventStore, type SharedEventStore } from '../../core/shared-event-store.js';\nimport { createSharedPromoter, type PromotionResult, type SharedPromoter } from '../../core/shared-promoter.js';\nimport { createSharedStore, type SharedStore } from '../../core/shared-store.js';\nimport { createSharedVectorStore, type SharedVectorStore } from '../../core/shared-vector-store.js';\nimport type { Entry, SharedStoreConfig, SharedTroubleshootingEntry } from '../../core/types.js';\n\nexport interface SharedMemoryRetriever {\n setSharedStores(sharedStore: SharedStore, sharedVectorStore: SharedVectorStore): void;\n}\n\nexport interface SharedMemoryServicesFactories {\n existsSync?: (targetPath: string) => boolean;\n mkdirSync?: (targetPath: string) => void;\n createSharedEventStore?: (dbPath: string) => SharedEventStore;\n createSharedStore?: (sharedEventStore: SharedEventStore) => SharedStore;\n createSharedVectorStore?: (dbPath: string) => SharedVectorStore;\n createSharedPromoter?: (\n sharedStore: SharedStore,\n sharedVectorStore: SharedVectorStore,\n embedder: Embedder,\n config?: SharedStoreConfig\n ) => SharedPromoter;\n}\n\nexport interface SharedMemoryServicesOptions {\n config: SharedStoreConfig | null;\n defaultSharedStoragePath: string;\n readOnly: boolean;\n expandPath: (targetPath: string) => string;\n embedder: Embedder;\n retriever: SharedMemoryRetriever;\n factories?: SharedMemoryServicesFactories;\n}\n\nexport type SharedStoreStats = {\n total: number;\n averageConfidence: number;\n topTopics: Array<{ topic: string; count: number }>;\n totalUsageCount: number;\n};\n\nexport class SharedMemoryServices {\n private sharedEventStore: SharedEventStore | null = null;\n private sharedStore: SharedStore | null = null;\n private sharedVectorStore: SharedVectorStore | null = null;\n private sharedPromoter: SharedPromoter | null = null;\n private openStorePromise: Promise<SharedStore> | null = null;\n\n constructor(private readonly options: SharedMemoryServicesOptions) {}\n\n get eventStore(): SharedEventStore | null {\n return this.sharedEventStore;\n }\n\n get store(): SharedStore | null {\n return this.sharedStore;\n }\n\n get vectorStore(): SharedVectorStore | null {\n return this.sharedVectorStore;\n }\n\n get promoter(): SharedPromoter | null {\n return this.sharedPromoter;\n }\n\n isEnabled(): boolean {\n return this.sharedStore !== null;\n }\n\n getSharedStoragePath(): string {\n return this.options.config?.sharedStoragePath\n ? this.options.expandPath(this.options.config.sharedStoragePath)\n : this.options.defaultSharedStoragePath;\n }\n\n async initialize(): Promise<void> {\n if (this.options.config?.enabled === false || this.options.readOnly) return;\n\n const sharedPath = this.getSharedStoragePath();\n this.ensureDirectory(sharedPath, { allowCreate: true });\n\n const store = await this.openStore(sharedPath);\n\n this.sharedVectorStore = this.factories.createSharedVectorStore(\n path.join(sharedPath, 'vectors')\n );\n await this.sharedVectorStore.initialize();\n\n this.sharedPromoter = this.factories.createSharedPromoter(\n store,\n this.sharedVectorStore,\n this.options.embedder,\n this.options.config || undefined\n );\n\n this.options.retriever.setSharedStores(store, this.sharedVectorStore);\n }\n\n async ensureStoreForRead(): Promise<SharedStore | null> {\n if (this.options.config?.enabled === false) return null;\n if (this.sharedStore) return this.sharedStore;\n\n const sharedPath = this.getSharedStoragePath();\n const directoryReady = this.ensureDirectory(sharedPath, { allowCreate: !this.options.readOnly });\n if (!directoryReady) return null;\n\n return this.openStore(sharedPath);\n }\n\n async getEntryForDisclosure(entryId: string): Promise<SharedTroubleshootingEntry | null> {\n const store = await this.ensureStoreForRead();\n return store?.get(entryId) ?? null;\n }\n\n async promoteToShared(entry: Entry, projectHash: string | null): Promise<PromotionResult> {\n if (!this.sharedPromoter || !projectHash) {\n return {\n success: false,\n error: 'Shared store not initialized or project hash not set'\n };\n }\n\n return this.sharedPromoter.promoteEntry(entry, projectHash);\n }\n\n async getStats(): Promise<SharedStoreStats | null> {\n if (!this.sharedStore) return null;\n return this.sharedStore.getStats();\n }\n\n async search(\n query: string,\n options?: { topK?: number; minConfidence?: number }\n ): Promise<SharedTroubleshootingEntry[]> {\n if (!this.sharedStore) return [];\n return this.sharedStore.search(query, options);\n }\n\n async close(): Promise<void> {\n if (this.openStorePromise) {\n await this.openStorePromise.catch(() => null);\n }\n\n if (this.sharedEventStore) {\n await this.sharedEventStore.close();\n }\n this.sharedEventStore = null;\n this.sharedStore = null;\n this.sharedVectorStore = null;\n this.sharedPromoter = null;\n this.openStorePromise = null;\n }\n\n private async openStore(sharedPath: string): Promise<SharedStore> {\n if (this.sharedStore) return this.sharedStore;\n\n if (!this.openStorePromise) {\n this.openStorePromise = this.createOpenStorePromise(sharedPath);\n }\n\n try {\n return await this.openStorePromise;\n } finally {\n this.openStorePromise = null;\n }\n }\n\n private async createOpenStorePromise(sharedPath: string): Promise<SharedStore> {\n if (!this.sharedEventStore) {\n const sharedEventStore = this.factories.createSharedEventStore(\n path.join(sharedPath, 'shared.duckdb')\n );\n await sharedEventStore.initialize();\n this.sharedEventStore = sharedEventStore;\n }\n\n if (!this.sharedStore) {\n this.sharedStore = this.factories.createSharedStore(this.sharedEventStore);\n }\n\n return this.sharedStore;\n }\n\n private ensureDirectory(sharedPath: string, options: { allowCreate: boolean }): boolean {\n if (this.factories.existsSync(sharedPath)) return true;\n if (!options.allowCreate) return false;\n this.factories.mkdirSync(sharedPath);\n return true;\n }\n\n private get factories(): Required<SharedMemoryServicesFactories> {\n return {\n existsSync: this.options.factories?.existsSync ?? fs.existsSync,\n mkdirSync: this.options.factories?.mkdirSync ?? ((targetPath: string) => {\n fs.mkdirSync(targetPath, { recursive: true });\n }),\n createSharedEventStore: this.options.factories?.createSharedEventStore ?? createSharedEventStore,\n createSharedStore: this.options.factories?.createSharedStore ?? createSharedStore,\n createSharedVectorStore: this.options.factories?.createSharedVectorStore ?? createSharedVectorStore,\n createSharedPromoter: this.options.factories?.createSharedPromoter ?? createSharedPromoter\n };\n }\n}\n\nexport function createSharedMemoryServices(options: SharedMemoryServicesOptions): SharedMemoryServices {\n return new SharedMemoryServices(options);\n}\n", "/**\n * SharedEventStore - Global database for cross-project knowledge\n * Location: ~/.claude-code/memory/shared/\n */\n\nimport {\n createDatabase,\n dbRun,\n dbClose,\n type Database\n} from './db-wrapper.js';\n\nexport class SharedEventStore {\n private db: Database;\n private initialized = false;\n\n constructor(dbPath: string) {\n this.db = createDatabase(dbPath);\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Shared troubleshooting entries table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS shared_troubleshooting (\n entry_id VARCHAR PRIMARY KEY,\n source_project_hash VARCHAR NOT NULL,\n source_entry_id VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n symptoms JSON NOT NULL,\n root_cause TEXT NOT NULL,\n solution TEXT NOT NULL,\n topics JSON NOT NULL,\n technologies JSON,\n confidence REAL NOT NULL DEFAULT 0.8,\n usage_count INTEGER DEFAULT 0,\n last_used_at TIMESTAMP,\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(source_project_hash, source_entry_id)\n )\n `);\n\n // Future extensibility: best practices table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS shared_best_practices (\n entry_id VARCHAR PRIMARY KEY,\n source_project_hash VARCHAR NOT NULL,\n source_entry_id VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n content_json JSON NOT NULL,\n topics JSON NOT NULL,\n confidence REAL NOT NULL DEFAULT 0.8,\n usage_count INTEGER DEFAULT 0,\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(source_project_hash, source_entry_id)\n )\n `);\n\n // Future extensibility: common errors table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS shared_common_errors (\n entry_id VARCHAR PRIMARY KEY,\n source_project_hash VARCHAR NOT NULL,\n source_entry_id VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n error_pattern TEXT NOT NULL,\n solution TEXT NOT NULL,\n topics JSON NOT NULL,\n technologies JSON,\n confidence REAL NOT NULL DEFAULT 0.8,\n usage_count INTEGER DEFAULT 0,\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(source_project_hash, source_entry_id)\n )\n `);\n\n // Indexes for troubleshooting\n await dbRun(this.db, `\n CREATE INDEX IF NOT EXISTS idx_shared_ts_confidence\n ON shared_troubleshooting(confidence DESC)\n `);\n await dbRun(this.db, `\n CREATE INDEX IF NOT EXISTS idx_shared_ts_usage\n ON shared_troubleshooting(usage_count DESC)\n `);\n await dbRun(this.db, `\n CREATE INDEX IF NOT EXISTS idx_shared_ts_source\n ON shared_troubleshooting(source_project_hash)\n `);\n\n this.initialized = true;\n }\n\n getDatabase(): Database {\n return this.db;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n async close(): Promise<void> {\n await dbClose(this.db);\n this.initialized = false;\n }\n}\n\nexport function createSharedEventStore(dbPath: string): SharedEventStore {\n return new SharedEventStore(dbPath);\n}\n", "/**\n * SharedPromoter - Handles auto-promotion of verified troubleshooting entries\n * Promotes entries from project-local storage to cross-project shared storage\n */\n\nimport { randomUUID } from 'crypto';\nimport { SharedStore } from './shared-store.js';\nimport { SharedVectorStore } from './shared-vector-store.js';\nimport { Embedder } from './embedder.js';\nimport type { Entry, SharedTroubleshootingInput, SharedStoreConfig } from './types.js';\n\nexport interface TroubleshootingContent {\n symptoms?: string[];\n rootCause?: string;\n solution?: string;\n technologies?: string[];\n}\n\nexport interface PromotionResult {\n success: boolean;\n entryId?: string;\n error?: string;\n skipped?: boolean;\n skipReason?: string;\n}\n\nexport class SharedPromoter {\n constructor(\n private sharedStore: SharedStore,\n private sharedVectorStore: SharedVectorStore,\n private embedder: Embedder,\n private config?: SharedStoreConfig\n ) {}\n\n /**\n * Check if an entry is eligible for promotion\n */\n isEligibleForPromotion(entry: Entry): boolean {\n // Must be troubleshooting type\n if (entry.entryType !== 'troubleshooting') {\n return false;\n }\n\n // Must be at least 'verified' stage\n if (entry.stage !== 'verified' && entry.stage !== 'certified') {\n return false;\n }\n\n // Must be active status\n if (entry.status !== 'active') {\n return false;\n }\n\n return true;\n }\n\n /**\n * Promote a verified troubleshooting entry to shared storage\n */\n async promoteEntry(\n entry: Entry,\n projectHash: string\n ): Promise<PromotionResult> {\n // Validate eligibility\n if (!this.isEligibleForPromotion(entry)) {\n return {\n success: false,\n skipped: true,\n skipReason: `Entry not eligible: type=${entry.entryType}, stage=${entry.stage}, status=${entry.status}`\n };\n }\n\n // Check if already promoted\n const exists = await this.sharedStore.exists(projectHash, entry.entryId);\n if (exists) {\n return {\n success: true,\n skipped: true,\n skipReason: 'Entry already exists in shared store'\n };\n }\n\n try {\n const content = entry.contentJson as TroubleshootingContent;\n const confidence = this.calculateConfidence(entry);\n\n // Check minimum confidence threshold\n const minConfidence = this.config?.minConfidenceForPromotion ?? 0.8;\n if (confidence < minConfidence) {\n return {\n success: false,\n skipped: true,\n skipReason: `Confidence ${confidence} below threshold ${minConfidence}`\n };\n }\n\n const input: SharedTroubleshootingInput = {\n sourceProjectHash: projectHash,\n sourceEntryId: entry.entryId,\n title: entry.title,\n symptoms: content.symptoms || [],\n rootCause: content.rootCause || '',\n solution: content.solution || '',\n topics: this.extractTopics(entry),\n technologies: content.technologies || [],\n confidence\n };\n\n // Promote to shared store\n const entryId = await this.sharedStore.promoteEntry(input);\n\n // Create embedding for vector search\n const embeddingContent = this.createEmbeddingContent(input);\n const embedding = await this.embedder.embed(embeddingContent);\n\n await this.sharedVectorStore.upsert({\n id: randomUUID(),\n entryId,\n entryType: 'troubleshooting',\n content: embeddingContent,\n vector: embedding.vector,\n topics: input.topics,\n sourceProjectHash: projectHash\n });\n\n return {\n success: true,\n entryId\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Batch promote multiple entries\n */\n async promoteEntries(\n entries: Entry[],\n projectHash: string\n ): Promise<Map<string, PromotionResult>> {\n const results = new Map<string, PromotionResult>();\n\n for (const entry of entries) {\n const result = await this.promoteEntry(entry, projectHash);\n results.set(entry.entryId, result);\n }\n\n return results;\n }\n\n /**\n * Extract topics from entry\n */\n private extractTopics(entry: Entry): string[] {\n const topics: string[] = [];\n\n // Extract from title (meaningful words)\n const titleWords = entry.title\n .toLowerCase()\n .split(/[\\s\\-_]+/)\n .filter(w => w.length > 3 && !this.isStopWord(w));\n topics.push(...titleWords);\n\n // Extract from content if available\n const content = entry.contentJson as Record<string, unknown>;\n if (content.topics && Array.isArray(content.topics)) {\n topics.push(...content.topics.map(t => String(t).toLowerCase()));\n }\n\n // Extract technologies as topics\n if (content.technologies && Array.isArray(content.technologies)) {\n topics.push(...content.technologies.map(t => String(t).toLowerCase()));\n }\n\n // Dedupe and return\n return [...new Set(topics)];\n }\n\n /**\n * Check if word is a stop word\n */\n private isStopWord(word: string): boolean {\n const stopWords = new Set([\n 'the', 'and', 'for', 'with', 'this', 'that', 'from', 'have', 'been',\n 'were', 'are', 'was', 'had', 'has', 'will', 'would', 'could', 'should',\n 'when', 'where', 'what', 'which', 'while', 'error', 'problem', 'issue'\n ]);\n return stopWords.has(word);\n }\n\n /**\n * Calculate confidence score for entry\n */\n private calculateConfidence(entry: Entry): number {\n let confidence = 0.8; // Base confidence for verified entries\n\n // Boost if certified\n if (entry.stage === 'certified') {\n confidence = 0.95;\n }\n\n // Could add more factors:\n // - Number of evidence items\n // - Age of entry (older verified entries may be more reliable)\n // - Usage count if tracked\n\n return Math.min(confidence, 1.0);\n }\n\n /**\n * Create embedding content from input\n */\n private createEmbeddingContent(input: SharedTroubleshootingInput): string {\n const parts: string[] = [];\n\n parts.push(`Problem: ${input.title}`);\n\n if (input.symptoms.length > 0) {\n parts.push(`Symptoms: ${input.symptoms.join(', ')}`);\n }\n\n if (input.rootCause) {\n parts.push(`Root Cause: ${input.rootCause}`);\n }\n\n if (input.solution) {\n parts.push(`Solution: ${input.solution}`);\n }\n\n if (input.technologies && input.technologies.length > 0) {\n parts.push(`Technologies: ${input.technologies.join(', ')}`);\n }\n\n return parts.join('\\n');\n }\n}\n\nexport function createSharedPromoter(\n sharedStore: SharedStore,\n sharedVectorStore: SharedVectorStore,\n embedder: Embedder,\n config?: SharedStoreConfig\n): SharedPromoter {\n return new SharedPromoter(sharedStore, sharedVectorStore, embedder, config);\n}\n", "/**\n * SharedStore - Cross-project troubleshooting knowledge store\n * Manages promotion from verified entries to shared storage\n */\n\nimport { randomUUID } from 'crypto';\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport type {\n SharedTroubleshootingEntry,\n SharedTroubleshootingInput\n} from './types.js';\nimport { SharedEventStore } from './shared-event-store.js';\n\nexport class SharedStore {\n constructor(private sharedEventStore: SharedEventStore) {}\n\n private get db(): Database {\n return this.sharedEventStore.getDatabase();\n }\n\n /**\n * Promote a verified troubleshooting entry to shared storage\n */\n async promoteEntry(\n input: SharedTroubleshootingInput\n ): Promise<string> {\n const entryId = randomUUID();\n\n await dbRun(\n this.db,\n `INSERT INTO shared_troubleshooting (\n entry_id, source_project_hash, source_entry_id,\n title, symptoms, root_cause, solution, topics,\n technologies, confidence, promoted_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)\n ON CONFLICT (source_project_hash, source_entry_id)\n DO UPDATE SET\n title = excluded.title,\n symptoms = excluded.symptoms,\n root_cause = excluded.root_cause,\n solution = excluded.solution,\n topics = excluded.topics,\n technologies = excluded.technologies,\n confidence = CASE\n WHEN excluded.confidence > shared_troubleshooting.confidence\n THEN excluded.confidence\n ELSE shared_troubleshooting.confidence\n END`,\n [\n entryId,\n input.sourceProjectHash,\n input.sourceEntryId,\n input.title,\n JSON.stringify(input.symptoms),\n input.rootCause,\n input.solution,\n JSON.stringify(input.topics),\n JSON.stringify(input.technologies || []),\n input.confidence\n ]\n );\n\n return entryId;\n }\n\n /**\n * Search troubleshooting entries by text query\n */\n async search(\n query: string,\n options?: { topK?: number; minConfidence?: number }\n ): Promise<SharedTroubleshootingEntry[]> {\n const topK = options?.topK || 5;\n const minConfidence = options?.minConfidence || 0.5;\n const searchPattern = `%${query}%`;\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting\n WHERE (title LIKE ? OR root_cause LIKE ? OR solution LIKE ?)\n AND confidence >= ?\n ORDER BY confidence DESC, usage_count DESC\n LIMIT ?`,\n [searchPattern, searchPattern, searchPattern, minConfidence, topK]\n );\n\n return rows.map(this.rowToEntry);\n }\n\n /**\n * Search by topics\n */\n async searchByTopics(\n topics: string[],\n options?: { topK?: number; excludeProjectHash?: string }\n ): Promise<SharedTroubleshootingEntry[]> {\n const topK = options?.topK || 5;\n\n if (topics.length === 0) {\n return [];\n }\n\n const topicConditions = topics.map(() => `topics LIKE ?`).join(' OR ');\n const topicParams = topics.map(t => `%\"${t}\"%`);\n\n let query = `SELECT * FROM shared_troubleshooting WHERE (${topicConditions})`;\n const params: unknown[] = [...topicParams];\n\n if (options?.excludeProjectHash) {\n query += ` AND source_project_hash != ?`;\n params.push(options.excludeProjectHash);\n }\n\n query += ` ORDER BY confidence DESC, usage_count DESC LIMIT ?`;\n params.push(topK);\n\n const rows = await dbAll<Record<string, unknown>>(this.db, query, params);\n return rows.map(this.rowToEntry);\n }\n\n /**\n * Record usage of a shared entry (for ranking)\n */\n async recordUsage(entryId: string): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE shared_troubleshooting\n SET usage_count = usage_count + 1,\n last_used_at = CURRENT_TIMESTAMP\n WHERE entry_id = ?`,\n [entryId]\n );\n }\n\n /**\n * Get entry by ID\n */\n async get(entryId: string): Promise<SharedTroubleshootingEntry | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting WHERE entry_id = ?`,\n [entryId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntry(rows[0]);\n }\n\n /**\n * Get entry by source (project hash + entry ID)\n */\n async getBySource(\n projectHash: string,\n sourceEntryId: string\n ): Promise<SharedTroubleshootingEntry | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting\n WHERE source_project_hash = ? AND source_entry_id = ?`,\n [projectHash, sourceEntryId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntry(rows[0]);\n }\n\n /**\n * Check if an entry already exists in shared store\n */\n async exists(projectHash: string, sourceEntryId: string): Promise<boolean> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM shared_troubleshooting\n WHERE source_project_hash = ? AND source_entry_id = ?`,\n [projectHash, sourceEntryId]\n );\n return (result[0]?.count || 0) > 0;\n }\n\n /**\n * Get all entries (with limit for safety)\n */\n async getAll(options?: { limit?: number }): Promise<SharedTroubleshootingEntry[]> {\n const limit = options?.limit || 100;\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting\n ORDER BY confidence DESC, usage_count DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToEntry);\n }\n\n /**\n * Get total count\n */\n async count(): Promise<number> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM shared_troubleshooting`\n );\n return result[0]?.count || 0;\n }\n\n /**\n * Get statistics\n */\n async getStats(): Promise<{\n total: number;\n averageConfidence: number;\n topTopics: Array<{ topic: string; count: number }>;\n totalUsageCount: number;\n }> {\n const countResult = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM shared_troubleshooting`\n );\n const total = countResult[0]?.count || 0;\n\n const avgResult = await dbAll<{ avg: number | null }>(\n this.db,\n `SELECT AVG(confidence) as avg FROM shared_troubleshooting`\n );\n const averageConfidence = avgResult[0]?.avg || 0;\n\n const usageResult = await dbAll<{ total: number }>(\n this.db,\n `SELECT SUM(usage_count) as total FROM shared_troubleshooting`\n );\n const totalUsageCount = usageResult[0]?.total || 0;\n\n // Get topic counts\n const entries = await this.getAll({ limit: 1000 });\n const topicCounts: Record<string, number> = {};\n for (const entry of entries) {\n for (const topic of entry.topics) {\n topicCounts[topic] = (topicCounts[topic] || 0) + 1;\n }\n }\n\n const topTopics = Object.entries(topicCounts)\n .map(([topic, count]) => ({ topic, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n return { total, averageConfidence, topTopics, totalUsageCount };\n }\n\n /**\n * Delete an entry\n */\n async delete(entryId: string): Promise<boolean> {\n const before = await this.count();\n await dbRun(\n this.db,\n `DELETE FROM shared_troubleshooting WHERE entry_id = ?`,\n [entryId]\n );\n const after = await this.count();\n return before > after;\n }\n\n private rowToEntry(row: Record<string, unknown>): SharedTroubleshootingEntry {\n return {\n entryId: row.entry_id as string,\n sourceProjectHash: row.source_project_hash as string,\n sourceEntryId: row.source_entry_id as string,\n title: row.title as string,\n symptoms: JSON.parse(row.symptoms as string || '[]'),\n rootCause: row.root_cause as string,\n solution: row.solution as string,\n topics: JSON.parse(row.topics as string || '[]'),\n technologies: JSON.parse(row.technologies as string || '[]'),\n confidence: row.confidence as number,\n usageCount: row.usage_count as number || 0,\n lastUsedAt: row.last_used_at ? toDate(row.last_used_at) : undefined,\n promotedAt: toDate(row.promoted_at),\n createdAt: toDate(row.created_at)\n };\n }\n}\n\nexport function createSharedStore(\n sharedEventStore: SharedEventStore\n): SharedStore {\n return new SharedStore(sharedEventStore);\n}\n", "/**\n * SharedVectorStore - Vector store for cross-project semantic search\n * Location: ~/.claude-code/memory/shared/vectors/\n */\n\nimport * as lancedb from '@lancedb/lancedb';\nimport type { SharedEntryType, SharedSearchResult } from './types.js';\n\nexport interface SharedVectorRecord {\n id: string;\n entryId: string;\n entryType: SharedEntryType;\n content: string;\n vector: number[];\n topics: string[];\n sourceProjectHash?: string;\n}\n\nexport class SharedVectorStore {\n private db: lancedb.Connection | null = null;\n private table: lancedb.Table | null = null;\n private readonly tableName = 'shared_knowledge';\n\n constructor(private dbPath: string) {}\n\n /**\n * Initialize LanceDB connection\n */\n async initialize(): Promise<void> {\n if (this.db) return;\n\n this.db = await lancedb.connect(this.dbPath);\n\n try {\n const tables = await this.db.tableNames();\n if (tables.includes(this.tableName)) {\n this.table = await this.db.openTable(this.tableName);\n }\n } catch {\n this.table = null;\n }\n }\n\n /**\n * Add or update a shared vector record\n */\n async upsert(record: SharedVectorRecord): Promise<void> {\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = {\n id: record.id,\n entryId: record.entryId,\n entryType: record.entryType,\n content: record.content,\n vector: record.vector,\n topics: JSON.stringify(record.topics),\n sourceProjectHash: record.sourceProjectHash || ''\n };\n\n if (!this.table) {\n this.table = await this.db.createTable(this.tableName, [data]);\n } else {\n // Delete existing entry before adding (upsert behavior)\n try {\n await this.table.delete(`entryId = '${record.entryId}'`);\n } catch {\n // Entry might not exist, ignore\n }\n await this.table.add([data]);\n }\n }\n\n /**\n * Add multiple records in batch\n */\n async upsertBatch(records: SharedVectorRecord[]): Promise<void> {\n if (records.length === 0) return;\n\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = records.map(record => ({\n id: record.id,\n entryId: record.entryId,\n entryType: record.entryType,\n content: record.content,\n vector: record.vector,\n topics: JSON.stringify(record.topics),\n sourceProjectHash: record.sourceProjectHash || ''\n }));\n\n if (!this.table) {\n this.table = await this.db.createTable(this.tableName, data);\n } else {\n await this.table.add(data);\n }\n }\n\n /**\n * Search for similar vectors\n */\n async search(\n queryVector: number[],\n options: {\n limit?: number;\n minScore?: number;\n excludeProjectHash?: string;\n entryType?: SharedEntryType;\n } = {}\n ): Promise<SharedSearchResult[]> {\n await this.initialize();\n\n if (!this.table) {\n return [];\n }\n\n const { limit = 5, minScore = 0.7, excludeProjectHash, entryType } = options;\n\n let query = this.table\n .search(queryVector)\n .distanceType('cosine')\n .limit(limit * 2);\n\n // Apply filters\n const filters: string[] = [];\n if (excludeProjectHash) {\n filters.push(`sourceProjectHash != '${excludeProjectHash}'`);\n }\n if (entryType) {\n filters.push(`entryType = '${entryType}'`);\n }\n\n if (filters.length > 0) {\n query = query.where(filters.join(' AND '));\n }\n\n const results = await query.toArray();\n\n return results\n .filter(r => {\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return score >= minScore;\n })\n .slice(0, limit)\n .map(r => {\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return {\n id: r.id as string,\n entryId: r.entryId as string,\n content: r.content as string,\n score,\n entryType: r.entryType as SharedEntryType\n };\n });\n }\n\n /**\n * Delete vector by entry ID\n */\n async delete(entryId: string): Promise<void> {\n if (!this.table) return;\n await this.table.delete(`entryId = '${entryId}'`);\n }\n\n /**\n * Get total count\n */\n async count(): Promise<number> {\n if (!this.table) return 0;\n return this.table.countRows();\n }\n\n /**\n * Check if vector exists for entry\n */\n async exists(entryId: string): Promise<boolean> {\n if (!this.table) return false;\n\n try {\n const results = await this.table\n .search([])\n .where(`entryId = '${entryId}'`)\n .limit(1)\n .toArray();\n return results.length > 0;\n } catch {\n return false;\n }\n }\n}\n\nexport function createSharedVectorStore(dbPath: string): SharedVectorStore {\n return new SharedVectorStore(dbPath);\n}\n", "/**\n * Session registry for mapping Claude session IDs to project-local storage.\n */\n\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { hashProjectPath, normalizeProjectPath } from './project-path.js';\n\nconst REGISTRY_PATH = path.join(os.homedir(), '.claude-code', 'memory', 'session-registry.json');\n\nexport interface SessionRegistryEntry {\n projectPath: string;\n projectHash: string;\n registeredAt: string;\n}\n\nexport interface SessionRegistry {\n version: number;\n sessions: Record<string, SessionRegistryEntry>;\n}\n\nexport function loadSessionRegistry(): SessionRegistry {\n try {\n if (fs.existsSync(REGISTRY_PATH)) {\n const data = fs.readFileSync(REGISTRY_PATH, 'utf-8');\n return JSON.parse(data);\n }\n } catch (error) {\n console.error('Failed to load session registry:', error);\n }\n return { version: 1, sessions: {} };\n}\n\nfunction saveSessionRegistry(registry: SessionRegistry): void {\n const dir = path.dirname(REGISTRY_PATH);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const tempPath = REGISTRY_PATH + '.tmp';\n fs.writeFileSync(tempPath, JSON.stringify(registry, null, 2));\n fs.renameSync(tempPath, REGISTRY_PATH);\n}\n\nexport function registerSession(sessionId: string, projectPath: string): void {\n const registry = loadSessionRegistry();\n\n registry.sessions[sessionId] = {\n projectPath: normalizeProjectPath(projectPath),\n projectHash: hashProjectPath(projectPath),\n registeredAt: new Date().toISOString()\n };\n\n const entries = Object.entries(registry.sessions);\n if (entries.length > 1000) {\n const sorted = entries.sort((a, b) =>\n new Date(b[1].registeredAt).getTime() - new Date(a[1].registeredAt).getTime()\n );\n registry.sessions = Object.fromEntries(sorted.slice(0, 1000));\n }\n\n saveSessionRegistry(registry);\n}\n\nexport function getSessionProject(sessionId: string): SessionRegistryEntry | null {\n const registry = loadSessionRegistry();\n return registry.sessions[sessionId] || null;\n}\n", "import * as os from 'os';\nimport * as path from 'path';\n\nimport type { MemoryOperationsConfig, SharedStoreConfig } from '../core/types.js';\n\nexport interface MemoryServiceConfig {\n storagePath: string;\n embeddingModel?: string;\n readOnly?: boolean;\n /** Enable DuckDB analytics store (default: true for server, false for hooks) */\n analyticsEnabled?: boolean;\n /** Lightweight mode for hooks - skip heavy initialization (default: false) */\n lightweightMode?: boolean;\n /** Start only VectorWorker, skip GraduationWorker and SyncWorker (default: false) */\n embeddingOnly?: boolean;\n /** AgentMemory-inspired operations feature config (default: disabled). */\n operations?: MemoryOperationsConfig;\n}\n\nconst SHARED_STORAGE_PATH = path.join(os.homedir(), '.claude-code', 'memory', 'shared');\n\nexport const DISABLED_SHARED_STORE_CONFIG: SharedStoreConfig = {\n enabled: false,\n autoPromote: false,\n searchShared: false,\n minConfidenceForPromotion: 0.8,\n sharedStoragePath: SHARED_STORAGE_PATH\n};\n\nexport const DEFAULT_ENABLED_SHARED_STORE_CONFIG: SharedStoreConfig = {\n enabled: true,\n autoPromote: true,\n searchShared: true,\n minConfidenceForPromotion: 0.8,\n sharedStoragePath: SHARED_STORAGE_PATH\n};\n\nexport const DEFAULT_SHARED_STORAGE_PATH = SHARED_STORAGE_PATH;\n\nexport const DISABLED_MEMORY_OPERATIONS_CONFIG: MemoryOperationsConfig = {\n enabled: false,\n facets: { enabled: true },\n actions: { enabled: true },\n retention: { enabled: false, policyVersion: 'v1' },\n graphExpansion: { enabled: false, maxHops: 1 },\n lessons: { enabled: false },\n perspectiveMemory: {\n enabled: false,\n deriver: { enabled: false, maxEventsPerBatch: 20, maxObserversPerSession: 5 },\n specialists: {\n enabled: false,\n enabledProjectHashes: [],\n enabledKinds: ['deduction', 'induction', 'contradiction', 'actor_card_maintenance'],\n maxSourceObservations: 20,\n maxDerivedObservations: 5,\n maxCardUpdates: 3\n }\n }\n};\n\nexport const DEFAULT_ENABLED_MEMORY_OPERATIONS_CONFIG: MemoryOperationsConfig = {\n ...DISABLED_MEMORY_OPERATIONS_CONFIG,\n enabled: true\n};\n", "/**\n * Memory Service Registry\n *\n * Owns process-local MemoryService instance caching and project/session service\n * resolution. Keeping this out of MemoryService prevents the compatibility\n * facade from also being the application-level service locator.\n */\n\nimport * as path from 'path';\n\nimport type { SharedStoreConfig } from '../core/types.js';\nimport type { MemoryServiceConfig } from './memory-service-config.js';\n\nexport type MemoryServiceRegistryConfig = MemoryServiceConfig & {\n projectHash?: string;\n projectPath?: string;\n sharedStoreConfig?: SharedStoreConfig;\n};\n\nexport interface MemoryServiceRegistryDeps<TService> {\n createService: (config: MemoryServiceRegistryConfig) => TService;\n hashProjectPath: (projectPath: string) => string;\n getProjectStoragePath: (projectPath: string) => string;\n getSessionProject: (sessionId: string) => { projectHash: string; projectPath: string } | null;\n homedir: () => string;\n disabledSharedStoreConfig: SharedStoreConfig;\n serviceCache?: Map<string, TService>;\n}\n\nexport interface MemoryServiceRegistry<TService> {\n getDefaultMemoryService(): TService;\n getReadOnlyMemoryService(): TService;\n getMemoryServiceForProject(projectPath: string, sharedStoreConfig?: SharedStoreConfig): TService;\n getMemoryServiceForSession(sessionId: string): TService;\n getLightweightMemoryService(sessionId: string): TService;\n getLightweightMemoryServiceForProject(projectPath: string): TService;\n createMemoryService(config: MemoryServiceConfig): TService;\n}\n\nconst GLOBAL_KEY = '__global__';\n\nexport function createMemoryServiceRegistry<TService>(\n deps: MemoryServiceRegistryDeps<TService>\n): MemoryServiceRegistry<TService> {\n const serviceCache = deps.serviceCache ?? new Map<string, TService>();\n\n const getDefaultMemoryService = (): TService => {\n if (!serviceCache.has(GLOBAL_KEY)) {\n serviceCache.set(GLOBAL_KEY, deps.createService({\n storagePath: '~/.claude-code/memory',\n analyticsEnabled: false,\n sharedStoreConfig: deps.disabledSharedStoreConfig\n }));\n }\n return serviceCache.get(GLOBAL_KEY)!;\n };\n\n const getReadOnlyMemoryService = (): TService => deps.createService({\n storagePath: '~/.claude-code/memory',\n readOnly: true,\n analyticsEnabled: false,\n sharedStoreConfig: deps.disabledSharedStoreConfig\n });\n\n const getMemoryServiceForProject = (\n projectPath: string,\n sharedStoreConfig?: SharedStoreConfig\n ): TService => {\n const hash = deps.hashProjectPath(projectPath);\n\n if (!serviceCache.has(hash)) {\n serviceCache.set(hash, deps.createService({\n storagePath: deps.getProjectStoragePath(projectPath),\n projectHash: hash,\n projectPath,\n sharedStoreConfig: sharedStoreConfig ?? deps.disabledSharedStoreConfig,\n analyticsEnabled: false\n }));\n }\n\n // Project services are keyed only by project hash. This intentionally means\n // the first sharedStoreConfig used for a project wins; later calls for the\n // same project reuse the cached instance to preserve historical lock/cache\n // semantics instead of replacing the service graph under existing callers.\n return serviceCache.get(hash)!;\n };\n\n const getMemoryServiceForSession = (sessionId: string): TService => {\n const projectInfo = deps.getSessionProject(sessionId);\n\n if (projectInfo) {\n return getMemoryServiceForProject(projectInfo.projectPath);\n }\n\n return getDefaultMemoryService();\n };\n\n const getOrCreateLightweightProjectService = (\n projectHash: string,\n projectPath: string\n ): TService => {\n const key = `lightweight_${projectHash}`;\n if (!serviceCache.has(key)) {\n serviceCache.set(key, deps.createService({\n storagePath: deps.getProjectStoragePath(projectPath),\n projectHash,\n projectPath,\n lightweightMode: true,\n analyticsEnabled: false,\n sharedStoreConfig: deps.disabledSharedStoreConfig\n }));\n }\n\n return serviceCache.get(key)!;\n };\n\n const getLightweightMemoryService = (sessionId: string): TService => {\n const projectInfo = deps.getSessionProject(sessionId);\n if (projectInfo) {\n return getOrCreateLightweightProjectService(projectInfo.projectHash, projectInfo.projectPath);\n }\n\n const key = 'lightweight_global';\n if (!serviceCache.has(key)) {\n serviceCache.set(key, deps.createService({\n storagePath: path.join(deps.homedir(), '.claude-code', 'memory'),\n lightweightMode: true,\n analyticsEnabled: false,\n sharedStoreConfig: deps.disabledSharedStoreConfig\n }));\n }\n\n return serviceCache.get(key)!;\n };\n\n const getLightweightMemoryServiceForProject = (projectPath: string): TService => {\n const projectHash = deps.hashProjectPath(projectPath);\n return getOrCreateLightweightProjectService(projectHash, projectPath);\n };\n\n return {\n getDefaultMemoryService,\n getReadOnlyMemoryService,\n getMemoryServiceForProject,\n getMemoryServiceForSession,\n getLightweightMemoryService,\n getLightweightMemoryServiceForProject,\n createMemoryService: (config: MemoryServiceConfig): TService => deps.createService(config)\n };\n}\n", "#!/usr/bin/env node\n/**\n * Compatibility entrypoint for the Claude semantic daemon hook runtime.\n *\n * Implementation lives in the Claude adapter layer so core stays platform-agnostic.\n */\nimport { main } from '../adapters/claude/hooks/semantic-daemon.js';\n\nmain().catch(() => {\n process.exit(1);\n});\n"],
|
|
5
|
+
"mappings": "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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAiiBnB;AAID,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",
|
|
6
6
|
"names": ["fs", "os", "path", "os", "os", "path", "randomUUID", "randomUUID", "randomUUID", "randomUUID", "randomUUID", "randomUUID", "fs", "path", "fs", "path", "randomUUID", "nodePath", "crypto", "fs", "path", "fs", "path", "fs", "path", "sanitizeSegment", "buildMirrorPath", "MarkdownMirror", "randomUUID", "DEFAULT_CONFIG", "path", "basename", "MarkdownMirror", "randomUUID", "embeddingRecovered", "embeddingRetried", "vectorRecovered", "vectorRetried", "columnName", "randomUUID", "randomUUID", "randomUUID", "saved", "randomUUID", "z", "z", "NonEmptyStringSchema", "z", "z", "NonEmptyStringSchema", "z", "z", "z", "OptionalTrimmedStringSchema", "z", "z", "OptionalTrimmedStringSchema", "DateLikeSchema", "StringArraySchema", "z", "z", "z", "z", "z", "path", "z", "NonEmptyStringSchema", "z", "z", "NonEmptyStringSchema", "z", "projectHashToStorage", "projectHashToStorage", "projectHashToStorage", "projectHashFromStorage", "parseJsonRecord", "sanitizeMetadata", "createHash", "randomUUID", "projectHashToStorage", "projectHashFromStorage", "parseStringArray", "parseJsonRecord", "createHash", "randomUUID", "DEFAULT_CONFIG", "normalizeOptionalString", "normalizeCandidate", "path", "filtered", "DEFAULT_CONFIG", "DEFAULT_CONFIG", "createVectorWorker", "createVectorWorkerV2", "createGraduationWorker", "fs", "path", "randomUUID", "randomUUID", "randomUUID", "lancedb", "fs", "os", "path", "os", "path", "path", "serviceCache", "getDefaultMemoryService", "getReadOnlyMemoryService", "getMemoryServiceForProject", "getMemoryServiceForSession", "getLightweightMemoryService", "getLightweightMemoryServiceForProject", "createServer", "resolve"]
|
|
7
7
|
}
|