claude-memory-layer 1.0.0 → 1.0.2
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/.claude/settings.local.json +15 -0
- package/.history/package_20260201114632.json +46 -0
- package/dist/cli/index.js +360 -154
- package/dist/cli/index.js.map +4 -4
- package/dist/core/index.js +337 -161
- package/dist/core/index.js.map +3 -3
- package/dist/hooks/session-end.js +320 -130
- package/dist/hooks/session-end.js.map +4 -4
- package/dist/hooks/session-start.js +331 -138
- package/dist/hooks/session-start.js.map +4 -4
- package/dist/hooks/stop.js +320 -130
- package/dist/hooks/stop.js.map +4 -4
- package/dist/hooks/user-prompt-submit.js +320 -130
- package/dist/hooks/user-prompt-submit.js.map +4 -4
- package/dist/services/memory-service.js +349 -128
- package/dist/services/memory-service.js.map +4 -4
- package/package.json +1 -1
- package/src/cli/index.ts +84 -23
- package/src/core/consolidated-store.ts +33 -18
- package/src/core/continuity-manager.ts +12 -7
- package/src/core/db-wrapper.ts +112 -0
- package/src/core/edge-repo.ts +22 -13
- package/src/core/entity-repo.ts +23 -14
- package/src/core/event-store.ts +98 -72
- package/src/core/task/blocker-resolver.ts +17 -9
- package/src/core/task/task-matcher.ts +8 -6
- package/src/core/task/task-projector.ts +29 -16
- package/src/core/task/task-resolver.ts +17 -9
- package/src/core/vector-outbox.ts +29 -16
- package/src/core/vector-store.ts +23 -12
- package/src/core/vector-worker.ts +7 -4
- package/src/core/working-set-store.ts +31 -18
- package/src/hooks/session-end.ts +3 -2
- package/src/hooks/session-start.ts +12 -8
- package/src/hooks/stop.ts +3 -2
- package/src/hooks/user-prompt-submit.ts +3 -2
- package/src/services/memory-service.ts +158 -6
package/dist/cli/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/cli/index.ts", "../../src/services/memory-service.ts", "../../src/core/event-store.ts", "../../src/core/canonical-key.ts", "../../src/core/vector-store.ts", "../../src/core/embedder.ts", "../../src/core/vector-outbox.ts", "../../src/core/vector-worker.ts", "../../src/core/matcher.ts", "../../src/core/retriever.ts", "../../src/core/graduation.ts", "../../src/core/metadata-extractor.ts", "../../src/core/working-set-store.ts", "../../src/core/consolidated-store.ts", "../../src/core/consolidation-worker.ts", "../../src/core/continuity-manager.ts", "../../src/services/session-history-importer.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\n/**\n * Code Memory CLI\n * Command-line interface for memory operations\n */\n\nimport { Command } from 'commander';\nimport { getDefaultMemoryService } from '../services/memory-service.js';\nimport { createSessionHistoryImporter } from '../services/session-history-importer.js';\n\nconst program = new Command();\n\nprogram\n .name('code-memory')\n .description('Claude Code Memory Plugin CLI')\n .version('1.0.0');\n\n/**\n * Search command\n */\nprogram\n .command('search <query>')\n .description('Search memories using semantic search')\n .option('-k, --top-k <number>', 'Number of results', '5')\n .option('-s, --min-score <number>', 'Minimum similarity score', '0.7')\n .option('--session <id>', 'Filter by session ID')\n .action(async (query: string, options) => {\n const service = getDefaultMemoryService();\n\n try {\n const result = await service.retrieveMemories(query, {\n topK: parseInt(options.topK),\n minScore: parseFloat(options.minScore),\n sessionId: options.session\n });\n\n console.log('\\n\uD83D\uDCDA Search Results\\n');\n console.log(`Confidence: ${result.matchResult.confidence}`);\n console.log(`Total memories found: ${result.memories.length}\\n`);\n\n for (const memory of result.memories) {\n const date = memory.event.timestamp.toISOString().split('T')[0];\n console.log(`---`);\n console.log(`\uD83D\uDCCC ${memory.event.eventType} (${date})`);\n console.log(` Score: ${memory.score.toFixed(3)}`);\n console.log(` Session: ${memory.event.sessionId.slice(0, 8)}...`);\n console.log(` Content: ${memory.event.content.slice(0, 200)}${memory.event.content.length > 200 ? '...' : ''}`);\n console.log('');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Search failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * History command\n */\nprogram\n .command('history')\n .description('View conversation history')\n .option('-l, --limit <number>', 'Number of events', '20')\n .option('--session <id>', 'Filter by session ID')\n .option('--type <type>', 'Filter by event type')\n .action(async (options) => {\n const service = getDefaultMemoryService();\n\n try {\n let events;\n\n if (options.session) {\n events = await service.getSessionHistory(options.session);\n } else {\n events = await service.getRecentEvents(parseInt(options.limit));\n }\n\n if (options.type) {\n events = events.filter(e => e.eventType === options.type);\n }\n\n console.log('\\n\uD83D\uDCDC Memory History\\n');\n console.log(`Total events: ${events.length}\\n`);\n\n for (const event of events.slice(0, parseInt(options.limit))) {\n const date = event.timestamp.toISOString();\n const icon = event.eventType === 'user_prompt' ? '\uD83D\uDC64' :\n event.eventType === 'agent_response' ? '\uD83E\uDD16' : '\uD83D\uDCDD';\n\n console.log(`${icon} [${date}] ${event.eventType}`);\n console.log(` Session: ${event.sessionId.slice(0, 8)}...`);\n console.log(` ${event.content.slice(0, 150)}${event.content.length > 150 ? '...' : ''}`);\n console.log('');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('History failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Stats command\n */\nprogram\n .command('stats')\n .description('View memory statistics')\n .action(async () => {\n const service = getDefaultMemoryService();\n\n try {\n const stats = await service.getStats();\n\n console.log('\\n\uD83D\uDCCA Memory Statistics\\n');\n console.log(`Total Events: ${stats.totalEvents}`);\n console.log(`Vector Count: ${stats.vectorCount}`);\n console.log('\\nMemory Levels:');\n\n for (const level of stats.levelStats) {\n const bar = '\u2588'.repeat(Math.min(20, Math.ceil(level.count / 10)));\n console.log(` ${level.level}: ${bar} ${level.count}`);\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Stats failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Forget command\n */\nprogram\n .command('forget [eventId]')\n .description('Remove memories from storage')\n .option('--session <id>', 'Forget all events from a session')\n .option('--before <date>', 'Forget events before date (YYYY-MM-DD)')\n .option('--confirm', 'Skip confirmation')\n .action(async (eventId: string | undefined, options) => {\n const service = getDefaultMemoryService();\n\n try {\n if (!eventId && !options.session && !options.before) {\n console.error('Please specify an event ID, --session, or --before option');\n process.exit(1);\n }\n\n if (!options.confirm) {\n console.log('\u26A0\uFE0F This will remove memories from storage.');\n console.log('Add --confirm to proceed.');\n process.exit(0);\n }\n\n // Note: Full forget implementation would require additional EventStore methods\n console.log('\uD83D\uDDD1\uFE0F Forget functionality requires additional implementation.');\n console.log('Events are append-only; soft-delete markers would be added.');\n\n await service.shutdown();\n } catch (error) {\n console.error('Forget failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Process command - manually process pending embeddings\n */\nprogram\n .command('process')\n .description('Process pending embeddings')\n .action(async () => {\n const service = getDefaultMemoryService();\n\n try {\n console.log('\u23F3 Processing pending embeddings...');\n const count = await service.processPendingEmbeddings();\n console.log(`\u2705 Processed ${count} embeddings`);\n\n await service.shutdown();\n } catch (error) {\n console.error('Process failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Import command - import existing Claude Code sessions\n */\nprogram\n .command('import')\n .description('Import existing Claude Code conversation history')\n .option('-p, --project <path>', 'Import from specific project path')\n .option('-s, --session <file>', 'Import specific session file (JSONL)')\n .option('-a, --all', 'Import all sessions from all projects')\n .option('-l, --limit <number>', 'Limit messages per session')\n .option('-v, --verbose', 'Show detailed progress')\n .action(async (options) => {\n const service = getDefaultMemoryService();\n const importer = createSessionHistoryImporter(service);\n\n try {\n await service.initialize();\n\n let result;\n\n if (options.session) {\n // Import specific session file\n console.log(`\\n\uD83D\uDCE5 Importing session: ${options.session}\\n`);\n result = await importer.importSessionFile(options.session, {\n projectPath: options.project,\n limit: options.limit ? parseInt(options.limit) : undefined,\n verbose: options.verbose\n });\n } else if (options.project) {\n // Import all sessions from a project\n console.log(`\\n\uD83D\uDCE5 Importing project: ${options.project}\\n`);\n result = await importer.importProject(options.project, {\n limit: options.limit ? parseInt(options.limit) : undefined,\n verbose: options.verbose\n });\n } else if (options.all) {\n // Import all sessions from all projects\n console.log('\\n\uD83D\uDCE5 Importing all sessions from all projects\\n');\n result = await importer.importAll({\n limit: options.limit ? parseInt(options.limit) : undefined,\n verbose: options.verbose\n });\n } else {\n // Default: import current project\n const cwd = process.cwd();\n console.log(`\\n\uD83D\uDCE5 Importing sessions for current project: ${cwd}\\n`);\n result = await importer.importProject(cwd, {\n projectPath: cwd,\n limit: options.limit ? parseInt(options.limit) : undefined,\n verbose: options.verbose\n });\n }\n\n // Process embeddings\n console.log('\\n\u23F3 Processing embeddings...');\n const embedCount = await service.processPendingEmbeddings();\n\n // Show results\n console.log('\\n\u2705 Import Complete\\n');\n console.log(`Sessions processed: ${result.totalSessions}`);\n console.log(`Total messages: ${result.totalMessages}`);\n console.log(`Imported prompts: ${result.importedPrompts}`);\n console.log(`Imported responses: ${result.importedResponses}`);\n console.log(`Skipped duplicates: ${result.skippedDuplicates}`);\n console.log(`Embeddings processed: ${embedCount}`);\n\n if (result.errors.length > 0) {\n console.log(`\\n\u26A0\uFE0F Errors (${result.errors.length}):`);\n for (const error of result.errors.slice(0, 5)) {\n console.log(` - ${error}`);\n }\n if (result.errors.length > 5) {\n console.log(` ... and ${result.errors.length - 5} more`);\n }\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Import failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * List command - list available sessions for import\n */\nprogram\n .command('list')\n .description('List available Claude Code sessions')\n .option('-p, --project <path>', 'Filter by project path')\n .action(async (options) => {\n const service = getDefaultMemoryService();\n const importer = createSessionHistoryImporter(service);\n\n try {\n const sessions = await importer.listAvailableSessions(options.project);\n\n console.log('\\n\uD83D\uDCCB Available Sessions\\n');\n console.log(`Found ${sessions.length} session(s)\\n`);\n\n for (const session of sessions.slice(0, 20)) {\n const date = session.modifiedAt.toISOString().split('T')[0];\n const sizeKB = (session.size / 1024).toFixed(1);\n console.log(`\uD83D\uDCDD ${session.sessionId.slice(0, 16)}...`);\n console.log(` Modified: ${date}`);\n console.log(` Size: ${sizeKB} KB`);\n console.log(` Path: ${session.filePath}`);\n console.log('');\n }\n\n if (sessions.length > 20) {\n console.log(`... and ${sessions.length - 20} more sessions`);\n }\n\n console.log('\\nUse \"code-memory import --session <path>\" to import a specific session');\n } catch (error) {\n console.error('List failed:', error);\n process.exit(1);\n }\n });\n\n// ============================================================\n// Endless Mode Commands\n// ============================================================\n\n/**\n * Endless Mode parent command\n */\nconst endlessCmd = program\n .command('endless')\n .description('Manage Endless Mode (biomimetic continuous memory)');\n\n/**\n * Enable Endless Mode\n */\nendlessCmd\n .command('enable')\n .description('Enable Endless Mode')\n .action(async () => {\n const service = getDefaultMemoryService();\n\n try {\n await service.initialize();\n await service.setMode('endless');\n\n console.log('\\n\u267E\uFE0F Endless Mode Enabled\\n');\n console.log('Your conversations will now be continuously integrated');\n console.log('across session boundaries.\\n');\n console.log('Features:');\n console.log(' - Working Set: Recent context kept active');\n console.log(' - Consolidation: Automatic memory integration');\n console.log(' - Continuity: Seamless context transitions\\n');\n console.log('Use \"code-memory endless status\" to view current state');\n\n await service.shutdown();\n } catch (error) {\n console.error('Enable failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Disable Endless Mode\n */\nendlessCmd\n .command('disable')\n .description('Disable Endless Mode (return to Session Mode)')\n .action(async () => {\n const service = getDefaultMemoryService();\n\n try {\n await service.initialize();\n await service.setMode('session');\n\n console.log('\\n\uD83D\uDCCB Session Mode Enabled\\n');\n console.log('Returned to traditional session-based memory.');\n console.log('Existing Endless Mode data is preserved for future use.');\n\n await service.shutdown();\n } catch (error) {\n console.error('Disable failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Endless Mode Status\n */\nendlessCmd\n .command('status')\n .description('Show Endless Mode status')\n .action(async () => {\n const service = getDefaultMemoryService();\n\n try {\n await service.initialize();\n const status = await service.getEndlessModeStatus();\n\n const modeIcon = status.mode === 'endless' ? '\u267E\uFE0F' : '\uD83D\uDCCB';\n const modeName = status.mode === 'endless' ? 'Endless Mode' : 'Session Mode';\n\n console.log(`\\n${modeIcon} ${modeName}\\n`);\n\n if (status.mode === 'endless') {\n // Continuity score bar\n const continuityBars = '\u2588'.repeat(Math.round(status.continuityScore * 10));\n const continuityEmpty = '\u2591'.repeat(10 - Math.round(status.continuityScore * 10));\n\n console.log('\uD83D\uDCCA Status:');\n console.log(` Working Set: ${status.workingSetSize} events`);\n console.log(` Continuity: [${continuityBars}${continuityEmpty}] ${(status.continuityScore * 100).toFixed(0)}%`);\n console.log(` Consolidated: ${status.consolidatedCount} memories`);\n\n if (status.lastConsolidation) {\n const ago = Math.round((Date.now() - status.lastConsolidation.getTime()) / 60000);\n console.log(` Last Consolidation: ${ago} minutes ago`);\n } else {\n console.log(' Last Consolidation: Never');\n }\n } else {\n console.log('Endless Mode is disabled.');\n console.log('Use \"code-memory endless enable\" to activate.');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Status failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Consolidate command - manually trigger consolidation\n */\nendlessCmd\n .command('consolidate')\n .description('Manually trigger memory consolidation')\n .action(async () => {\n const service = getDefaultMemoryService();\n\n try {\n await service.initialize();\n\n if (!service.isEndlessModeActive()) {\n console.log('\\n\u26A0\uFE0F Endless Mode is not active');\n console.log('Use \"code-memory endless enable\" first');\n process.exit(1);\n }\n\n console.log('\\n\u23F3 Running memory consolidation...');\n const count = await service.forceConsolidation();\n\n if (count > 0) {\n console.log(`\\n\u2705 Consolidated ${count} memory group(s)`);\n } else {\n console.log('\\n\uD83D\uDCCB No memories to consolidate');\n console.log('(Working set may not have enough events yet)');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Consolidation failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Working Set command - view current working set\n */\nendlessCmd\n .command('working-set')\n .alias('ws')\n .description('View current working set')\n .option('-l, --limit <number>', 'Number of events to show', '10')\n .action(async (options) => {\n const service = getDefaultMemoryService();\n\n try {\n await service.initialize();\n\n if (!service.isEndlessModeActive()) {\n console.log('\\n\u26A0\uFE0F Endless Mode is not active');\n console.log('Use \"code-memory endless enable\" first');\n process.exit(1);\n }\n\n const workingSet = await service.getWorkingSet();\n\n if (!workingSet || workingSet.recentEvents.length === 0) {\n console.log('\\n\uD83D\uDCCB Working Set is empty');\n console.log('Events will be added as you interact with Claude');\n process.exit(0);\n }\n\n console.log('\\n\uD83E\uDDE0 Working Set\\n');\n console.log(`Total events: ${workingSet.recentEvents.length}`);\n console.log(`Continuity score: ${(workingSet.continuityScore * 100).toFixed(0)}%`);\n console.log(`Last activity: ${workingSet.lastActivity.toISOString()}\\n`);\n\n const limit = parseInt(options.limit);\n const events = workingSet.recentEvents.slice(0, limit);\n\n for (const event of events) {\n const icon = event.eventType === 'user_prompt' ? '\uD83D\uDC64' :\n event.eventType === 'agent_response' ? '\uD83E\uDD16' :\n event.eventType === 'tool_observation' ? '\uD83D\uDD27' : '\uD83D\uDCDD';\n const time = event.timestamp.toLocaleTimeString();\n const preview = event.content.slice(0, 80) + (event.content.length > 80 ? '...' : '');\n\n console.log(`${icon} [${time}] ${event.eventType}`);\n console.log(` ${preview}`);\n console.log('');\n }\n\n if (workingSet.recentEvents.length > limit) {\n console.log(`... and ${workingSet.recentEvents.length - limit} more events`);\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Working set failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Consolidated memories command\n */\nendlessCmd\n .command('memories')\n .description('View consolidated memories')\n .option('-l, --limit <number>', 'Number of memories to show', '10')\n .option('-q, --query <text>', 'Search consolidated memories')\n .action(async (options) => {\n const service = getDefaultMemoryService();\n\n try {\n await service.initialize();\n\n let memories;\n\n if (options.query) {\n memories = await service.searchConsolidated(options.query, {\n topK: parseInt(options.limit)\n });\n console.log(`\\n\uD83D\uDD0D Searching for: \"${options.query}\"\\n`);\n } else {\n memories = await service.getConsolidatedMemories(parseInt(options.limit));\n console.log('\\n\uD83D\uDCBE Consolidated Memories\\n');\n }\n\n if (memories.length === 0) {\n console.log('No consolidated memories found.');\n if (!service.isEndlessModeActive()) {\n console.log('Enable Endless Mode to start consolidating memories.');\n }\n process.exit(0);\n }\n\n console.log(`Showing ${memories.length} memory(ies)\\n`);\n\n for (const memory of memories) {\n const date = memory.createdAt.toISOString().split('T')[0];\n const confidenceBars = '\u2588'.repeat(Math.round(memory.confidence * 5));\n\n console.log(`\uD83D\uDCDA ${memory.topics.slice(0, 3).join(', ')}`);\n console.log(` Created: ${date}`);\n console.log(` Confidence: [${confidenceBars}] ${(memory.confidence * 100).toFixed(0)}%`);\n console.log(` Sources: ${memory.sourceEvents.length} events`);\n console.log(` Access count: ${memory.accessCount}`);\n console.log(` Summary: ${memory.summary.slice(0, 200)}${memory.summary.length > 200 ? '...' : ''}`);\n console.log('');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Memories failed:', error);\n process.exit(1);\n }\n });\n\nprogram.parse();\n", "/**\n * Memory Service - Main entry point for memory operations\n * Coordinates EventStore, VectorStore, Retriever, and Graduation\n */\n\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport * as crypto from 'crypto';\n\nimport { EventStore } from '../core/event-store.js';\nimport { VectorStore } from '../core/vector-store.js';\nimport { Embedder, getDefaultEmbedder } from '../core/embedder.js';\nimport { VectorWorker, createVectorWorker } from '../core/vector-worker.js';\nimport { Matcher, getDefaultMatcher } from '../core/matcher.js';\nimport { Retriever, createRetriever, RetrievalResult } from '../core/retriever.js';\nimport { GraduationPipeline, createGraduationPipeline } from '../core/graduation.js';\nimport type {\n MemoryEventInput,\n AppendResult,\n MemoryEvent,\n Config,\n ConfigSchema,\n ToolObservationPayload,\n MemoryMode,\n EndlessModeConfig,\n EndlessModeConfigSchema,\n WorkingSet,\n ConsolidatedMemory,\n EndlessModeStatus,\n ContextSnapshot,\n ContinuityScore\n} from '../core/types.js';\nimport { createToolObservationEmbedding } from '../core/metadata-extractor.js';\nimport { WorkingSetStore, createWorkingSetStore } from '../core/working-set-store.js';\nimport { ConsolidatedStore, createConsolidatedStore } from '../core/consolidated-store.js';\nimport { ConsolidationWorker, createConsolidationWorker } from '../core/consolidation-worker.js';\nimport { ContinuityManager, createContinuityManager } from '../core/continuity-manager.js';\n\nexport interface MemoryServiceConfig {\n storagePath: string;\n embeddingModel?: string;\n}\n\nexport class MemoryService {\n private readonly eventStore: EventStore;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly matcher: Matcher;\n private readonly retriever: Retriever;\n private readonly graduation: GraduationPipeline;\n private vectorWorker: VectorWorker | null = null;\n private initialized = false;\n\n // Endless Mode components\n private workingSetStore: WorkingSetStore | null = null;\n private consolidatedStore: ConsolidatedStore | null = null;\n private consolidationWorker: ConsolidationWorker | null = null;\n private continuityManager: ContinuityManager | null = null;\n private endlessMode: MemoryMode = 'session';\n\n constructor(config: MemoryServiceConfig) {\n const storagePath = this.expandPath(config.storagePath);\n\n // Ensure storage directory exists\n if (!fs.existsSync(storagePath)) {\n fs.mkdirSync(storagePath, { recursive: true });\n }\n\n // Initialize components\n this.eventStore = new EventStore(path.join(storagePath, 'events.duckdb'));\n this.vectorStore = new VectorStore(path.join(storagePath, 'vectors'));\n this.embedder = config.embeddingModel\n ? new Embedder(config.embeddingModel)\n : getDefaultEmbedder();\n this.matcher = getDefaultMatcher();\n this.retriever = createRetriever(\n this.eventStore,\n this.vectorStore,\n this.embedder,\n this.matcher\n );\n this.graduation = createGraduationPipeline(this.eventStore);\n }\n\n /**\n * Initialize all components\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n await this.eventStore.initialize();\n await this.vectorStore.initialize();\n await this.embedder.initialize();\n\n // Start vector worker\n this.vectorWorker = createVectorWorker(\n this.eventStore,\n this.vectorStore,\n this.embedder\n );\n this.vectorWorker.start();\n\n // Load endless mode setting\n const savedMode = await this.eventStore.getEndlessConfig('mode') as MemoryMode | null;\n if (savedMode === 'endless') {\n this.endlessMode = 'endless';\n await this.initializeEndlessMode();\n }\n\n this.initialized = true;\n }\n\n /**\n * Start a new session\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 /**\n * End a session\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 /**\n * Store a user prompt\n */\n async storeUserPrompt(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n await this.initialize();\n\n const result = await this.eventStore.append({\n eventType: 'user_prompt',\n sessionId,\n timestamp: new Date(),\n content,\n metadata\n });\n\n // Enqueue for embedding if new\n if (result.success && !result.isDuplicate) {\n await this.eventStore.enqueueForEmbedding(result.eventId, content);\n }\n\n return result;\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 await this.initialize();\n\n const result = await this.eventStore.append({\n eventType: 'agent_response',\n sessionId,\n timestamp: new Date(),\n content,\n metadata\n });\n\n // Enqueue for embedding if new\n if (result.success && !result.isDuplicate) {\n await this.eventStore.enqueueForEmbedding(result.eventId, content);\n }\n\n return result;\n }\n\n /**\n * Store a session summary\n */\n async storeSessionSummary(\n sessionId: string,\n summary: string\n ): Promise<AppendResult> {\n await this.initialize();\n\n const result = await this.eventStore.append({\n eventType: 'session_summary',\n sessionId,\n timestamp: new Date(),\n content: summary\n });\n\n if (result.success && !result.isDuplicate) {\n await this.eventStore.enqueueForEmbedding(result.eventId, summary);\n }\n\n return result;\n }\n\n /**\n * Store a tool observation\n */\n async storeToolObservation(\n sessionId: string,\n payload: ToolObservationPayload\n ): Promise<AppendResult> {\n await this.initialize();\n\n // Create content for storage (JSON stringified payload)\n const content = JSON.stringify(payload);\n\n const result = await this.eventStore.append({\n eventType: 'tool_observation',\n sessionId,\n timestamp: new Date(),\n content,\n metadata: {\n toolName: payload.toolName,\n success: payload.success\n }\n });\n\n // Create embedding content (optimized for search)\n if (result.success && !result.isDuplicate) {\n const embeddingContent = createToolObservationEmbedding(\n payload.toolName,\n payload.metadata || {},\n payload.success\n );\n await this.eventStore.enqueueForEmbedding(result.eventId, embeddingContent);\n }\n\n return result;\n }\n\n /**\n * Retrieve relevant memories for a query\n */\n async retrieveMemories(\n query: string,\n options?: {\n topK?: number;\n minScore?: number;\n sessionId?: string;\n }\n ): Promise<RetrievalResult> {\n await this.initialize();\n\n // Process any pending embeddings first\n if (this.vectorWorker) {\n await this.vectorWorker.processAll();\n }\n\n return this.retriever.retrieve(query, options);\n }\n\n /**\n * Get session history\n */\n async getSessionHistory(sessionId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.eventStore.getSessionEvents(sessionId);\n }\n\n /**\n * Get recent events\n */\n async getRecentEvents(limit: number = 100): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.eventStore.getRecentEvents(limit);\n }\n\n /**\n * Get memory statistics\n */\n async getStats(): Promise<{\n totalEvents: number;\n vectorCount: number;\n levelStats: Array<{ level: string; count: number }>;\n }> {\n await this.initialize();\n\n const recentEvents = await this.eventStore.getRecentEvents(10000);\n const vectorCount = await this.vectorStore.count();\n const levelStats = await this.graduation.getStats();\n\n return {\n totalEvents: recentEvents.length,\n vectorCount,\n levelStats\n };\n }\n\n /**\n * Process pending embeddings\n */\n async processPendingEmbeddings(): Promise<number> {\n if (this.vectorWorker) {\n return this.vectorWorker.processAll();\n }\n return 0;\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 // Endless Mode Methods\n // ============================================================\n\n /**\n * Get the default endless mode config\n */\n private 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, // 1 hour\n triggerEventCount: 100,\n triggerIdleMs: 1800000, // 30 minutes\n useLLMSummarization: false\n },\n continuity: {\n minScoreForSeamless: 0.7,\n topicDecayHours: 48\n }\n };\n }\n\n /**\n * Initialize Endless Mode components\n */\n async initializeEndlessMode(): Promise<void> {\n const config = await this.getEndlessConfig();\n\n this.workingSetStore = createWorkingSetStore(this.eventStore, config);\n this.consolidatedStore = createConsolidatedStore(this.eventStore);\n this.consolidationWorker = createConsolidationWorker(\n this.workingSetStore,\n this.consolidatedStore,\n config\n );\n this.continuityManager = createContinuityManager(this.eventStore, config);\n\n // Start consolidation worker\n this.consolidationWorker.start();\n }\n\n /**\n * Get Endless Mode configuration\n */\n async getEndlessConfig(): Promise<EndlessModeConfig> {\n const savedConfig = await this.eventStore.getEndlessConfig('config') as EndlessModeConfig | null;\n return savedConfig || this.getDefaultEndlessConfig();\n }\n\n /**\n * Set Endless Mode configuration\n */\n async setEndlessConfig(config: Partial<EndlessModeConfig>): Promise<void> {\n const current = await this.getEndlessConfig();\n const merged = { ...current, ...config };\n await this.eventStore.setEndlessConfig('config', merged);\n }\n\n /**\n * Set memory mode (session or endless)\n */\n async setMode(mode: MemoryMode): Promise<void> {\n await this.initialize();\n\n if (mode === this.endlessMode) return;\n\n this.endlessMode = mode;\n await this.eventStore.setEndlessConfig('mode', mode);\n\n if (mode === 'endless') {\n await this.initializeEndlessMode();\n } else {\n // Stop endless mode components\n if (this.consolidationWorker) {\n this.consolidationWorker.stop();\n this.consolidationWorker = null;\n }\n this.workingSetStore = null;\n this.consolidatedStore = null;\n this.continuityManager = null;\n }\n }\n\n /**\n * Get current memory mode\n */\n getMode(): MemoryMode {\n return this.endlessMode;\n }\n\n /**\n * Check if endless mode is active\n */\n isEndlessModeActive(): boolean {\n return this.endlessMode === 'endless';\n }\n\n /**\n * Add event to Working Set (Endless Mode)\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 /**\n * Get the current Working Set\n */\n async getWorkingSet(): Promise<WorkingSet | null> {\n if (!this.workingSetStore) return null;\n return this.workingSetStore.get();\n }\n\n /**\n * Search consolidated memories\n */\n async searchConsolidated(\n query: string,\n options?: { topK?: number }\n ): Promise<ConsolidatedMemory[]> {\n if (!this.consolidatedStore) return [];\n return this.consolidatedStore.search(query, options);\n }\n\n /**\n * Get all consolidated memories\n */\n async getConsolidatedMemories(limit?: number): Promise<ConsolidatedMemory[]> {\n if (!this.consolidatedStore) return [];\n return this.consolidatedStore.getAll({ limit });\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 if (!this.continuityManager) return null;\n\n const snapshot = this.continuityManager.createSnapshot(\n crypto.randomUUID(),\n content,\n metadata\n );\n\n return this.continuityManager.calculateScore(snapshot);\n }\n\n /**\n * Record activity (for consolidation idle trigger)\n */\n recordActivity(): void {\n if (this.consolidationWorker) {\n this.consolidationWorker.recordActivity();\n }\n }\n\n /**\n * Force a consolidation run\n */\n async forceConsolidation(): Promise<number> {\n if (!this.consolidationWorker) return 0;\n return this.consolidationWorker.forceRun();\n }\n\n /**\n * Get Endless Mode status\n */\n async getEndlessModeStatus(): Promise<EndlessModeStatus> {\n await this.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.endlessMode,\n workingSetSize,\n continuityScore,\n consolidatedCount,\n lastConsolidation\n };\n }\n\n /**\n * Format Endless Mode context for Claude\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 // Continuity status\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 // Working set summary\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 // Consolidated memories\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 /**\n * Shutdown service\n */\n async shutdown(): Promise<void> {\n // Stop endless mode components\n if (this.consolidationWorker) {\n this.consolidationWorker.stop();\n }\n\n if (this.vectorWorker) {\n this.vectorWorker.stop();\n }\n await this.eventStore.close();\n }\n\n /**\n * Expand ~ to home directory\n */\n private expandPath(p: string): string {\n if (p.startsWith('~')) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n }\n}\n\n// Default instance\nlet defaultService: MemoryService | null = null;\n\nexport function getDefaultMemoryService(): MemoryService {\n if (!defaultService) {\n defaultService = new MemoryService({\n storagePath: '~/.claude-code/memory'\n });\n }\n return defaultService;\n}\n\nexport function createMemoryService(config: MemoryServiceConfig): MemoryService {\n return new MemoryService(config);\n}\n", "/**\n * AXIOMMIND EventStore implementation\n * Principles: Append-only, Single Source of Truth, Idempotency\n */\n\nimport { Database } from 'duckdb';\nimport { randomUUID } from 'crypto';\nimport {\n MemoryEvent,\n MemoryEventInput,\n Session,\n AppendResult,\n OutboxItem\n} from './types.js';\nimport { makeCanonicalKey, makeDedupeKey } from './canonical-key.js';\n\nexport class EventStore {\n private db: Database;\n private initialized = false;\n\n constructor(private dbPath: string) {\n this.db = new Database(dbPath);\n }\n\n /**\n * Initialize database schema\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // L0 EventStore: Single Source of Truth (immutable, append-only)\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS events (\n id VARCHAR PRIMARY KEY,\n event_type VARCHAR NOT NULL,\n session_id VARCHAR NOT NULL,\n timestamp TIMESTAMP NOT NULL,\n content TEXT NOT NULL,\n canonical_key VARCHAR NOT NULL,\n dedupe_key VARCHAR UNIQUE,\n metadata JSON\n )\n `);\n\n // Dedup table for idempotency\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS event_dedup (\n dedupe_key VARCHAR PRIMARY KEY,\n event_id VARCHAR NOT NULL,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Session metadata\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS sessions (\n id VARCHAR PRIMARY KEY,\n started_at TIMESTAMP NOT NULL,\n ended_at TIMESTAMP,\n project_path VARCHAR,\n summary TEXT,\n tags JSON\n )\n `);\n\n // Insights (derived data, rebuildable)\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS insights (\n id VARCHAR PRIMARY KEY,\n insight_type VARCHAR NOT NULL,\n content TEXT NOT NULL,\n canonical_key VARCHAR NOT NULL,\n confidence FLOAT,\n source_events JSON,\n created_at TIMESTAMP,\n last_updated TIMESTAMP\n )\n `);\n\n // Embedding Outbox (Single-Writer Pattern)\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS embedding_outbox (\n id VARCHAR PRIMARY KEY,\n event_id VARCHAR NOT NULL,\n content TEXT NOT NULL,\n status VARCHAR DEFAULT 'pending',\n retry_count INT DEFAULT 0,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n processed_at TIMESTAMP,\n error_message TEXT\n )\n `);\n\n // Projection offset tracking\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS projection_offsets (\n projection_name VARCHAR PRIMARY KEY,\n last_event_id VARCHAR,\n last_timestamp TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Memory level tracking\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS memory_levels (\n event_id VARCHAR PRIMARY KEY,\n level VARCHAR NOT NULL DEFAULT 'L0',\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // ============================================================\n // Entity-Edge Model Tables\n // ============================================================\n\n // Entries (immutable memory units)\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS entries (\n entry_id VARCHAR PRIMARY KEY,\n created_ts TIMESTAMP NOT NULL,\n entry_type VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n content_json JSON NOT NULL,\n stage VARCHAR NOT NULL DEFAULT 'raw',\n status VARCHAR DEFAULT 'active',\n superseded_by VARCHAR,\n build_id VARCHAR,\n evidence_json JSON,\n canonical_key VARCHAR,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Entities (task/condition/artifact)\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS entities (\n entity_id VARCHAR PRIMARY KEY,\n entity_type VARCHAR NOT NULL,\n canonical_key VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n stage VARCHAR NOT NULL DEFAULT 'raw',\n status VARCHAR NOT NULL DEFAULT 'active',\n current_json JSON NOT NULL,\n title_norm VARCHAR,\n search_text VARCHAR,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Entity aliases for canonical key lookup\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS entity_aliases (\n entity_type VARCHAR NOT NULL,\n canonical_key VARCHAR NOT NULL,\n entity_id VARCHAR NOT NULL,\n is_primary BOOLEAN DEFAULT FALSE,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY(entity_type, canonical_key)\n )\n `);\n\n // Edges (relationships between entries/entities)\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS edges (\n edge_id VARCHAR PRIMARY KEY,\n src_type VARCHAR NOT NULL,\n src_id VARCHAR NOT NULL,\n rel_type VARCHAR NOT NULL,\n dst_type VARCHAR NOT NULL,\n dst_id VARCHAR NOT NULL,\n meta_json JSON,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // ============================================================\n // Vector Outbox V2 Table\n // ============================================================\n\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS vector_outbox (\n job_id VARCHAR PRIMARY KEY,\n item_kind VARCHAR NOT NULL,\n item_id VARCHAR NOT NULL,\n embedding_version VARCHAR NOT NULL,\n status VARCHAR NOT NULL DEFAULT 'pending',\n retry_count INT DEFAULT 0,\n error VARCHAR,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(item_kind, item_id, embedding_version)\n )\n `);\n\n // ============================================================\n // Build Runs & Metrics Tables\n // ============================================================\n\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS build_runs (\n build_id VARCHAR PRIMARY KEY,\n started_at TIMESTAMP NOT NULL,\n finished_at TIMESTAMP,\n extractor_model VARCHAR NOT NULL,\n extractor_prompt_hash VARCHAR NOT NULL,\n embedder_model VARCHAR NOT NULL,\n embedding_version VARCHAR NOT NULL,\n idris_version VARCHAR NOT NULL,\n schema_version VARCHAR NOT NULL,\n status VARCHAR NOT NULL DEFAULT 'running',\n error VARCHAR\n )\n `);\n\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS pipeline_metrics (\n id VARCHAR PRIMARY KEY,\n ts TIMESTAMP NOT NULL,\n stage VARCHAR NOT NULL,\n latency_ms DOUBLE NOT NULL,\n success BOOLEAN NOT NULL,\n error VARCHAR,\n session_id VARCHAR\n )\n `);\n\n // ============================================================\n // Endless Mode Tables\n // ============================================================\n\n // Working Set table (active memory window)\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS working_set (\n id VARCHAR PRIMARY KEY,\n event_id VARCHAR NOT NULL,\n added_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n relevance_score FLOAT DEFAULT 1.0,\n topics JSON,\n expires_at TIMESTAMP\n )\n `);\n\n // Consolidated Memories table (long-term integrated memories)\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS consolidated_memories (\n memory_id VARCHAR PRIMARY KEY,\n summary TEXT NOT NULL,\n topics JSON,\n source_events JSON,\n confidence FLOAT DEFAULT 0.5,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n accessed_at TIMESTAMP,\n access_count INTEGER DEFAULT 0\n )\n `);\n\n // Continuity Log table (tracks context transitions)\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS continuity_log (\n log_id VARCHAR PRIMARY KEY,\n from_context_id VARCHAR,\n to_context_id VARCHAR,\n continuity_score FLOAT,\n transition_type VARCHAR,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Endless Mode Config table\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS endless_config (\n key VARCHAR PRIMARY KEY,\n value JSON,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // ============================================================\n // Create Indexes\n // ============================================================\n\n // Entry indexes\n await this.db.run(`CREATE INDEX IF NOT EXISTS idx_entries_type ON entries(entry_type)`);\n await this.db.run(`CREATE INDEX IF NOT EXISTS idx_entries_stage ON entries(stage)`);\n await this.db.run(`CREATE INDEX IF NOT EXISTS idx_entries_canonical ON entries(canonical_key)`);\n\n // Entity indexes\n await this.db.run(`CREATE INDEX IF NOT EXISTS idx_entities_type_key ON entities(entity_type, canonical_key)`);\n await this.db.run(`CREATE INDEX IF NOT EXISTS idx_entities_status ON entities(status)`);\n\n // Edge indexes\n await this.db.run(`CREATE INDEX IF NOT EXISTS idx_edges_src ON edges(src_id, rel_type)`);\n await this.db.run(`CREATE INDEX IF NOT EXISTS idx_edges_dst ON edges(dst_id, rel_type)`);\n await this.db.run(`CREATE INDEX IF NOT EXISTS idx_edges_rel ON edges(rel_type)`);\n\n // Outbox indexes\n await this.db.run(`CREATE INDEX IF NOT EXISTS idx_outbox_status ON vector_outbox(status)`);\n\n // Endless Mode indexes\n await this.db.run(`CREATE INDEX IF NOT EXISTS idx_working_set_expires ON working_set(expires_at)`);\n await this.db.run(`CREATE INDEX IF NOT EXISTS idx_working_set_relevance ON working_set(relevance_score DESC)`);\n await this.db.run(`CREATE INDEX IF NOT EXISTS idx_consolidated_confidence ON consolidated_memories(confidence DESC)`);\n await this.db.run(`CREATE INDEX IF NOT EXISTS idx_continuity_created ON continuity_log(created_at)`);\n\n this.initialized = true;\n }\n\n /**\n * Append event to store (AXIOMMIND Principle 2: Append-only)\n * Returns existing event ID if duplicate (Principle 3: Idempotency)\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 = await this.db.all<{ event_id: string }[]>(\n `SELECT event_id FROM event_dedup WHERE dedupe_key = ?`,\n [dedupeKey]\n );\n\n if (existing.length > 0) {\n return {\n success: true,\n eventId: existing[0].event_id,\n isDuplicate: true\n };\n }\n\n const id = randomUUID();\n const timestamp = input.timestamp.toISOString();\n\n try {\n await this.db.run(\n `INSERT INTO events (id, event_type, session_id, timestamp, content, canonical_key, dedupe_key, metadata)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n input.eventType,\n input.sessionId,\n timestamp,\n input.content,\n canonicalKey,\n dedupeKey,\n JSON.stringify(input.metadata || {})\n ]\n );\n\n await this.db.run(\n `INSERT INTO event_dedup (dedupe_key, event_id) VALUES (?, ?)`,\n [dedupeKey, id]\n );\n\n // Initialize at L0\n await this.db.run(\n `INSERT INTO memory_levels (event_id, level) VALUES (?, 'L0')`,\n [id]\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 events by session ID\n */\n async getSessionEvents(sessionId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = await this.db.all<Array<Record<string, unknown>>>(\n `SELECT * FROM events WHERE session_id = ? 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): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = await this.db.all<Array<Record<string, unknown>>>(\n `SELECT * FROM events 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): Promise<MemoryEvent | null> {\n await this.initialize();\n\n const rows = await this.db.all<Array<Record<string, unknown>>>(\n `SELECT * FROM events WHERE id = ?`,\n [id]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEvent(rows[0]);\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 = await this.db.all<Array<{ id: string }>>(\n `SELECT id FROM sessions WHERE id = ?`,\n [session.id]\n );\n\n if (existing.length === 0) {\n await this.db.run(\n `INSERT INTO sessions (id, started_at, project_path, tags)\n VALUES (?, ?, ?, ?)`,\n [\n session.id,\n (session.startedAt || new Date()).toISOString(),\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(session.endedAt.toISOString());\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 await this.db.run(\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 rows = await this.db.all<Array<Record<string, unknown>>>(\n `SELECT * FROM sessions WHERE id = ?`,\n [id]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n id: row.id as string,\n startedAt: new Date(row.started_at as string),\n endedAt: row.ended_at ? new Date(row.ended_at as string) : 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 (Single-Writer Pattern)\n */\n async enqueueForEmbedding(eventId: string, content: string): Promise<string> {\n await this.initialize();\n\n const id = randomUUID();\n await this.db.run(\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 // Atomic update to claim items\n const rows = await this.db.all<Array<Record<string, unknown>>>(\n `UPDATE embedding_outbox\n SET status = 'processing'\n WHERE id IN (\n SELECT id FROM embedding_outbox\n WHERE status = 'pending'\n ORDER BY created_at\n LIMIT ?\n )\n RETURNING *`,\n [limit]\n );\n\n return rows.map(row => ({\n id: row.id as string,\n eventId: row.event_id as string,\n content: row.content as string,\n status: row.status as 'pending' | 'processing' | 'done' | 'failed',\n retryCount: row.retry_count as number,\n createdAt: new Date(row.created_at as string),\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 await this.db.run(\n `DELETE FROM embedding_outbox WHERE id IN (${placeholders})`,\n ids\n );\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 await this.db.run(\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 * Update memory level\n */\n async updateMemoryLevel(eventId: string, level: string): Promise<void> {\n await this.initialize();\n\n await this.db.run(\n `UPDATE memory_levels SET level = ?, promoted_at = CURRENT_TIMESTAMP 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 = await this.db.all<Array<{ level: string; count: number }>>(\n `SELECT level, COUNT(*) as count FROM memory_levels GROUP BY level`\n );\n\n return rows;\n }\n\n // ============================================================\n // Endless Mode Helper Methods\n // ============================================================\n\n /**\n * Get database instance for Endless Mode stores\n */\n getDatabase(): Database {\n return this.db;\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 rows = await this.db.all<Array<{ value: string }>>(\n `SELECT value FROM endless_config WHERE key = ?`,\n [key]\n );\n\n if (rows.length === 0) return null;\n return JSON.parse(rows[0].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 await this.db.run(\n `INSERT OR REPLACE INTO endless_config (key, value, updated_at)\n VALUES (?, ?, CURRENT_TIMESTAMP)`,\n [key, JSON.stringify(value)]\n );\n }\n\n /**\n * Get all sessions\n */\n async getAllSessions(): Promise<Session[]> {\n await this.initialize();\n\n const rows = await this.db.all<Array<Record<string, unknown>>>(\n `SELECT * FROM sessions ORDER BY started_at DESC`\n );\n\n return rows.map(row => ({\n id: row.id as string,\n startedAt: new Date(row.started_at as string),\n endedAt: row.ended_at ? new Date(row.ended_at as string) : 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 * Close database connection\n */\n async close(): Promise<void> {\n await this.db.close();\n }\n\n /**\n * Convert database row to MemoryEvent\n */\n private rowToEvent(row: Record<string, unknown>): MemoryEvent {\n return {\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: new Date(row.timestamp as string),\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}\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 * 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\nexport class VectorStore {\n private db: lancedb.Connection | null = null;\n private table: lancedb.Table | null = null;\n private readonly tableName = 'conversations';\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 to open existing table\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 // Table doesn't exist yet, will be created on first insert\n this.table = null;\n }\n }\n\n /**\n * Add or update vector record\n */\n async upsert(record: VectorRecord): 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 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 if (!this.table) {\n // Create table with first record\n this.table = await this.db.createTable(this.tableName, [data]);\n } else {\n await this.table.add([data]);\n }\n }\n\n /**\n * Add multiple vector records in batch\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 data = records.map(record => ({\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 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 sessionId?: string;\n } = {}\n ): Promise<SearchResult[]> {\n await this.initialize();\n\n if (!this.table) {\n return [];\n }\n\n const { limit = 5, minScore = 0.7, sessionId } = options;\n\n let query = this.table.search(queryVector).limit(limit * 2); // Get more for filtering\n\n // Apply session filter if specified\n if (sessionId) {\n query = query.where(`sessionId = '${sessionId}'`);\n }\n\n const results = await query.toArray();\n\n return results\n .filter(r => {\n // Convert distance to score (assuming cosine distance)\n const score = 1 - (r._distance || 0);\n return score >= minScore;\n })\n .slice(0, limit)\n .map(r => ({\n id: r.id as string,\n eventId: r.eventId as string,\n content: r.content as string,\n score: 1 - (r._distance || 0),\n sessionId: r.sessionId as string,\n eventType: r.eventType as string,\n timestamp: r.timestamp as string\n }));\n }\n\n /**\n * Delete vector by event ID\n */\n async delete(eventId: string): Promise<void> {\n if (!this.table) return;\n await this.table.delete(`eventId = '${eventId}'`);\n }\n\n /**\n * Get total count of vectors\n */\n async count(): Promise<number> {\n if (!this.table) return 0;\n const result = await this.table.countRows();\n return result;\n }\n\n /**\n * Check if vector exists for event\n */\n async exists(eventId: string): Promise<boolean> {\n if (!this.table) return false;\n\n const results = await this.table\n .search([])\n .where(`eventId = '${eventId}'`)\n .limit(1)\n .toArray();\n\n return results.length > 0;\n }\n}\n", "/**\n * Local Embedding Generator using @xenova/transformers\n * AXIOMMIND Principle 7: Standard JSON format for vectors\n */\n\nimport { pipeline, Pipeline } from '@xenova/transformers';\n\nexport interface EmbeddingResult {\n vector: number[];\n model: string;\n dimensions: number;\n}\n\nexport class Embedder {\n private pipeline: Pipeline | null = null;\n private readonly modelName: string;\n private initialized = false;\n\n constructor(modelName: string = 'Xenova/all-MiniLM-L6-v2') {\n this.modelName = modelName;\n }\n\n /**\n * Initialize the embedding pipeline\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n this.pipeline = await pipeline('feature-extraction', this.modelName);\n this.initialized = true;\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(text, {\n pooling: 'mean',\n normalize: true\n });\n\n const vector = Array.from(output.data as Float32Array);\n\n return {\n vector,\n model: this.modelName,\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(text, {\n pooling: 'mean',\n normalize: true\n });\n\n const vector = Array.from(output.data as Float32Array);\n\n results.push({\n vector,\n model: this.modelName,\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.modelName;\n }\n}\n\n// Singleton instance for reuse\nlet defaultEmbedder: Embedder | null = null;\n\nexport function getDefaultEmbedder(): Embedder {\n if (!defaultEmbedder) {\n defaultEmbedder = new Embedder();\n }\n return defaultEmbedder;\n}\n", "/**\n * Vector Outbox V2 - Transactional Outbox Pattern\n * AXIOMMIND Principle 6: DuckDB \u2192 outbox \u2192 LanceDB unidirectional flow\n */\n\nimport { Database } from 'duckdb';\nimport { randomUUID } from 'crypto';\nimport type {\n OutboxJob,\n OutboxStatus,\n OutboxItemKind,\n VALID_OUTBOX_TRANSITIONS\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 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 */\n async enqueue(\n itemKind: OutboxItemKind,\n itemId: string,\n embeddingVersion?: string\n ): Promise<string> {\n const version = embeddingVersion ?? this.config.embeddingVersion;\n const jobId = randomUUID();\n const now = new Date().toISOString();\n\n await this.db.run(\n `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`,\n [jobId, itemKind, itemId, version, now, now]\n );\n\n return jobId;\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 this.db.all<Array<Record<string, unknown>>>(\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 this.db.run(\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 this.db.all<Array<{ retry_count: number }>>(\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 this.db.run(\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 this.db.all<Array<Record<string, unknown>>>(\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 this.db.all<Array<Record<string, unknown>>>(\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(): Promise<{ recovered: number; retried: number }> {\n const now = new Date();\n const stuckThreshold = new Date(now.getTime() - this.config.stuckThresholdMs);\n\n // Recover stuck processing jobs\n const recoveredResult = await this.db.run(\n `UPDATE vector_outbox\n SET status = 'pending', updated_at = ?\n WHERE status = 'processing'\n AND updated_at < ?`,\n [now.toISOString(), stuckThreshold.toISOString()]\n );\n\n // Retry failed jobs that haven't exceeded max retries\n const retriedResult = await this.db.run(\n `UPDATE vector_outbox\n SET status = 'pending', updated_at = ?\n WHERE status = 'failed'\n AND retry_count < ?`,\n [now.toISOString(), this.config.maxRetries]\n );\n\n // Get counts (DuckDB doesn't return affected rows easily)\n const recoveredRows = await this.db.all<Array<{ count: number }>>(\n `SELECT COUNT(*) as count FROM vector_outbox\n WHERE status = 'pending' AND updated_at = ?`,\n [now.toISOString()]\n );\n\n return {\n recovered: 0, // Approximate\n retried: 0 // Approximate\n };\n }\n\n /**\n * Cleanup old done jobs\n */\n async cleanup(): Promise<number> {\n const threshold = new Date();\n threshold.setDate(threshold.getDate() - this.config.cleanupDays);\n\n await this.db.run(\n `DELETE FROM vector_outbox\n WHERE status = 'done'\n AND updated_at < ?`,\n [threshold.toISOString()]\n );\n\n return 0; // DuckDB doesn't return affected rows easily\n }\n\n /**\n * Get metrics\n */\n async getMetrics(): Promise<OutboxMetrics> {\n const statusCounts = await this.db.all<Array<{ status: string; count: number }>>(\n `SELECT status, COUNT(*) as count\n FROM vector_outbox\n GROUP BY status`\n );\n\n const oldestPending = await this.db.all<Array<{ created_at: string }>>(\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: new Date(row.created_at as string),\n updatedAt: new Date(row.updated_at as string)\n };\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 { OutboxItem, 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\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 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.poll();\n }\n\n /**\n * Stop the worker\n */\n stop(): void {\n this.running = false;\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\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 throw error;\n }\n }\n\n /**\n * Poll for new items\n */\n private async poll(): Promise<void> {\n if (!this.running) return;\n\n try {\n await this.processBatch();\n } catch (error) {\n console.error('Vector worker error:', error);\n }\n\n // Schedule next poll\n this.pollTimeout = setTimeout(() => this.poll(), this.config.pollIntervalMs);\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 { Database } from 'duckdb';\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 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 this.db.all<Array<Record<string, unknown>>>(\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 this.db.all<Array<Record<string, unknown>>>(\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 this.db.all<Array<Record<string, unknown>>>(\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\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 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.poll();\n }\n\n /**\n * Stop the worker\n */\n stop(): void {\n this.running = false;\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 const errorMessage = error instanceof Error ? error.message : String(error);\n await this.outbox.markFailed(job.jobId, errorMessage);\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) return;\n\n try {\n await this.processBatch();\n } catch (error) {\n console.error('Vector worker V2 error:', error);\n }\n\n // Schedule next poll\n this.pollTimeout = setTimeout(() => this.poll(), this.config.pollIntervalMs);\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 * 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 MemoryEvent,\n MemoryMatch,\n MatchResult,\n MatchConfidence,\n MATCH_THRESHOLDS\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 0, // FTS score - would need to be passed in\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", "/**\n * Memory Retriever - Unified retrieval interface\n * Combines vector search, event store lookups, 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 type { MemoryEvent, MatchResult, Config } from './types.js';\n\nexport interface RetrievalOptions {\n topK: number;\n minScore: number;\n sessionId?: string;\n maxTokens: number;\n includeSessionContext: boolean;\n}\n\nexport interface RetrievalResult {\n memories: MemoryWithContext[];\n matchResult: MatchResult;\n totalTokens: number;\n context: string;\n}\n\nexport interface MemoryWithContext {\n event: MemoryEvent;\n score: number;\n sessionContext?: string;\n}\n\nconst DEFAULT_OPTIONS: RetrievalOptions = {\n topK: 5,\n minScore: 0.7,\n maxTokens: 2000,\n includeSessionContext: true\n};\n\nexport class Retriever {\n private readonly eventStore: EventStore;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly matcher: Matcher;\n\n constructor(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher\n ) {\n this.eventStore = eventStore;\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.matcher = matcher;\n }\n\n /**\n * Retrieve relevant memories for a query\n */\n async retrieve(\n query: string,\n options: Partial<RetrievalOptions> = {}\n ): Promise<RetrievalResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Generate query embedding\n const queryEmbedding = await this.embedder.embed(query);\n\n // Search vector store\n const searchResults = await this.vectorStore.search(queryEmbedding.vector, {\n limit: opts.topK * 2, // Get extra for filtering\n minScore: opts.minScore,\n sessionId: opts.sessionId\n });\n\n // Get match result using AXIOMMIND matcher\n const matchResult = this.matcher.matchSearchResults(\n searchResults,\n (eventId) => this.getEventAgeDays(eventId)\n );\n\n // Enrich results with full event data and session context\n const memories = await this.enrichResults(searchResults.slice(0, opts.topK), opts);\n\n // Build context string\n const context = this.buildContext(memories, opts.maxTokens);\n\n return {\n memories,\n matchResult,\n totalTokens: this.estimateTokens(context),\n context\n };\n }\n\n /**\n * Retrieve memories from a specific session\n */\n async retrieveFromSession(sessionId: string): Promise<MemoryEvent[]> {\n return this.eventStore.getSessionEvents(sessionId);\n }\n\n /**\n * Get recent memories across all sessions\n */\n async retrieveRecent(limit: number = 100): Promise<MemoryEvent[]> {\n return this.eventStore.getRecentEvents(limit);\n }\n\n /**\n * Enrich search results with full event data\n */\n private async enrichResults(\n results: SearchResult[],\n options: RetrievalOptions\n ): 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 let sessionContext: string | undefined;\n if (options.includeSessionContext) {\n sessionContext = await this.getSessionContext(event.sessionId, event.id);\n }\n\n memories.push({\n event,\n score: result.score,\n sessionContext\n });\n }\n\n return memories;\n }\n\n /**\n * Get surrounding context from the same session\n */\n private async getSessionContext(\n sessionId: string,\n eventId: string\n ): Promise<string | undefined> {\n const sessionEvents = await this.eventStore.getSessionEvents(sessionId);\n\n // Find the event index\n const eventIndex = sessionEvents.findIndex(e => e.id === eventId);\n if (eventIndex === -1) return undefined;\n\n // Get 1 event before and after for context\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\n if (contextEvents.length <= 1) return undefined;\n\n return contextEvents\n .filter(e => e.id !== eventId)\n .map(e => `[${e.eventType}]: ${e.content.slice(0, 200)}...`)\n .join('\\n');\n }\n\n /**\n * Build context string from memories (respecting token limit)\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\n if (currentTokens + memoryTokens > maxTokens) {\n break;\n }\n\n parts.push(memoryText);\n currentTokens += memoryTokens;\n }\n\n if (parts.length === 0) {\n return '';\n }\n\n return `## Relevant Memories\\n\\n${parts.join('\\n\\n---\\n\\n')}`;\n }\n\n /**\n * Format a single memory for context\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\n if (sessionContext) {\n text += `\\n\\n_Context:_ ${sessionContext}`;\n }\n\n return text;\n }\n\n /**\n * Estimate token count (rough approximation)\n */\n private estimateTokens(text: string): number {\n // Rough estimate: ~4 characters per token\n return Math.ceil(text.length / 4);\n }\n\n /**\n * Get event age in days (for recency scoring)\n */\n private getEventAgeDays(eventId: string): number {\n // This would ideally cache event timestamps\n // For now, return 0 (assume recent)\n return 0;\n }\n}\n\n/**\n * Create a retriever with default components\n */\nexport function createRetriever(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher\n): Retriever {\n return new Retriever(eventStore, vectorStore, embedder, matcher);\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 InsightType\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 /**\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 if (existing) {\n existing.accessCount++;\n existing.lastAccessed = new Date();\n existing.confidence = Math.max(existing.confidence, confidence);\n // Track cross-session references\n // This would need more sophisticated tracking in production\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, metrics] of this.metrics) {\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 * 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", "/**\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 { Database } from 'duckdb';\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 this.db.run(\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 this.db.all<Array<Record<string, unknown>>>(\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: new Date(row.timestamp as string),\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 this.db.all<Array<Record<string, unknown>>>(\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: new Date(row.added_at as string),\n relevanceScore: row.relevance_score as number,\n topics: row.topics ? JSON.parse(row.topics as string) : undefined,\n expiresAt: new Date(row.expires_at as string)\n }));\n }\n\n /**\n * Update relevance score for an event\n */\n async updateRelevance(eventId: string, score: number): Promise<void> {\n await this.db.run(\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 this.db.run(\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 this.db.all<Array<{ count: number }>>(\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 this.db.run(`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 this.db.all<Array<{ count: number }>>(\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 this.db.run(\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 this.db.run(\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 this.db.all<Array<{ id: string }>>(\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 this.db.run(\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 this.db.all<Array<{ avg_score: number | null }>>(\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 this.db.all<Array<{ topics: string }>>(\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 * 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 { Database } from 'duckdb';\nimport type {\n ConsolidatedMemory,\n ConsolidatedMemoryInput\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 this.db.run(\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 this.db.all<Array<Record<string, unknown>>>(\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 this.db.all<Array<Record<string, unknown>>>(\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 this.db.all<Array<Record<string, unknown>>>(\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 this.db.all<Array<Record<string, unknown>>>(\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 this.db.all<Array<Record<string, unknown>>>(\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 this.db.run(\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 this.db.run(\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 this.db.run(\n `DELETE FROM consolidated_memories WHERE memory_id = ?`,\n [memoryId]\n );\n }\n\n /**\n * Get count of consolidated memories\n */\n async count(): Promise<number> {\n const result = await this.db.all<Array<{ count: number }>>(\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 this.db.all<Array<Record<string, unknown>>>(\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 this.db.all<Array<{ avg: number | null }>>(\n `SELECT AVG(confidence) as avg FROM consolidated_memories`\n );\n const averageConfidence = avgResult[0]?.avg || 0;\n\n const recentResult = await this.db.all<Array<{ count: number }>>(\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 this.db.all<Array<{ count: number }>>(\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 this.db.all<Array<{ created_at: string }>>(\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: new Date(row.created_at as string),\n accessedAt: row.accessed_at ? new Date(row.accessed_at as string) : 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} 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 return await this.consolidate();\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 workingSet = await this.workingSetStore.get();\n\n if (workingSet.recentEvents.length < 3) {\n return 0; // Not enough events to consolidate\n }\n\n // Group events by topic\n const groups = this.groupByTopic(workingSet.recentEvents);\n let consolidatedCount = 0;\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 await this.consolidatedStore.create({\n summary,\n topics: group.topics,\n sourceEvents: eventIds,\n confidence: this.calculateConfidence(group)\n });\n\n consolidatedCount++;\n }\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 return consolidatedCount;\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 { Database } from 'duckdb';\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 this.db.all<Array<Record<string, unknown>>>(\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: new Date(row.created_at as string)\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 this.db.all<Array<{ avg_score: number | null }>>(\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 this.db.all<Array<{ transition_type: string; count: number }>>(\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 this.db.all<Array<{ changes: number }>>(\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 this.db.run(\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 * Session History Importer\n * Imports existing Claude Code conversation history into memory\n *\n * Claude Code stores session history in:\n * ~/.claude/projects/<project-hash>/<session-id>.jsonl\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as readline from 'readline';\nimport { MemoryService } from './memory-service.js';\n\nexport interface ImportOptions {\n projectPath?: string;\n sessionId?: string;\n limit?: number;\n skipExisting?: boolean;\n verbose?: boolean;\n}\n\nexport interface ImportResult {\n totalSessions: number;\n totalMessages: number;\n importedPrompts: number;\n importedResponses: number;\n skippedDuplicates: number;\n errors: string[];\n}\n\nexport interface ClaudeMessage {\n type: string;\n message?: {\n role: string;\n content: string | Array<{ type: string; text?: string }>;\n };\n sessionId?: string;\n timestamp?: string;\n}\n\nexport class SessionHistoryImporter {\n private readonly memoryService: MemoryService;\n private readonly claudeDir: string;\n\n constructor(memoryService: MemoryService) {\n this.memoryService = memoryService;\n this.claudeDir = path.join(os.homedir(), '.claude');\n }\n\n /**\n * Import all sessions from a project\n */\n async importProject(projectPath: string, options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 0,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n // Find project directory\n const projectDir = await this.findProjectDir(projectPath);\n if (!projectDir) {\n result.errors.push(`Project directory not found for: ${projectPath}`);\n return result;\n }\n\n // Find all session files\n const sessionFiles = await this.findSessionFiles(projectDir);\n result.totalSessions = sessionFiles.length;\n\n if (options.verbose) {\n console.log(`Found ${sessionFiles.length} session files in ${projectDir}`);\n }\n\n // Import each session\n for (const sessionFile of sessionFiles) {\n try {\n const sessionResult = await this.importSessionFile(sessionFile, options);\n result.totalMessages += sessionResult.totalMessages;\n result.importedPrompts += sessionResult.importedPrompts;\n result.importedResponses += sessionResult.importedResponses;\n result.skippedDuplicates += sessionResult.skippedDuplicates;\n } catch (error) {\n result.errors.push(`Failed to import ${sessionFile}: ${error}`);\n }\n }\n\n return result;\n }\n\n /**\n * Import a specific session file\n */\n async importSessionFile(filePath: string, options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 1,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n if (!fs.existsSync(filePath)) {\n result.errors.push(`File not found: ${filePath}`);\n return result;\n }\n\n // Extract session ID from filename\n const sessionId = path.basename(filePath, '.jsonl');\n\n // Start session in memory\n await this.memoryService.startSession(sessionId, options.projectPath);\n\n // Read and parse JSONL file\n const fileStream = fs.createReadStream(filePath);\n const rl = readline.createInterface({\n input: fileStream,\n crlfDelay: Infinity\n });\n\n let lineCount = 0;\n const limit = options.limit || Infinity;\n\n for await (const line of rl) {\n if (lineCount >= limit) break;\n\n try {\n const entry = JSON.parse(line) as ClaudeMessage;\n result.totalMessages++;\n\n // Process message entries\n if (entry.type === 'user' || entry.type === 'assistant') {\n const content = this.extractContent(entry);\n if (!content) continue;\n\n if (entry.type === 'user') {\n const appendResult = await this.memoryService.storeUserPrompt(\n sessionId,\n content,\n { importedFrom: filePath, originalTimestamp: entry.timestamp }\n );\n\n if (appendResult.isDuplicate) {\n result.skippedDuplicates++;\n } else {\n result.importedPrompts++;\n }\n } else if (entry.type === 'assistant') {\n // Truncate very long responses\n const truncatedContent = content.length > 5000\n ? content.slice(0, 5000) + '...[truncated]'\n : content;\n\n const appendResult = await this.memoryService.storeAgentResponse(\n sessionId,\n truncatedContent,\n { importedFrom: filePath, originalTimestamp: entry.timestamp }\n );\n\n if (appendResult.isDuplicate) {\n result.skippedDuplicates++;\n } else {\n result.importedResponses++;\n }\n }\n\n lineCount++;\n }\n } catch (parseError) {\n // Skip malformed lines\n result.errors.push(`Parse error on line: ${parseError}`);\n }\n }\n\n // End session\n await this.memoryService.endSession(sessionId);\n\n if (options.verbose) {\n console.log(`Imported ${result.importedPrompts} prompts, ${result.importedResponses} responses from ${filePath}`);\n }\n\n return result;\n }\n\n /**\n * Import all sessions from all projects\n */\n async importAll(options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 0,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n const projectsDir = path.join(this.claudeDir, 'projects');\n if (!fs.existsSync(projectsDir)) {\n result.errors.push(`Projects directory not found: ${projectsDir}`);\n return result;\n }\n\n // Find all project directories\n const projectDirs = fs.readdirSync(projectsDir)\n .map(name => path.join(projectsDir, name))\n .filter(p => fs.statSync(p).isDirectory());\n\n if (options.verbose) {\n console.log(`Found ${projectDirs.length} project directories`);\n }\n\n for (const projectDir of projectDirs) {\n try {\n const sessionFiles = await this.findSessionFiles(projectDir);\n\n for (const sessionFile of sessionFiles) {\n const sessionResult = await this.importSessionFile(sessionFile, options);\n result.totalSessions++;\n result.totalMessages += sessionResult.totalMessages;\n result.importedPrompts += sessionResult.importedPrompts;\n result.importedResponses += sessionResult.importedResponses;\n result.skippedDuplicates += sessionResult.skippedDuplicates;\n result.errors.push(...sessionResult.errors);\n }\n } catch (error) {\n result.errors.push(`Failed to process ${projectDir}: ${error}`);\n }\n }\n\n return result;\n }\n\n /**\n * Find project directory from project path\n */\n private async findProjectDir(projectPath: string): Promise<string | null> {\n const projectsDir = path.join(this.claudeDir, 'projects');\n if (!fs.existsSync(projectsDir)) {\n return null;\n }\n\n // Claude uses a hash of the project path as directory name\n // Try to find matching directory by checking all projects\n const projectDirs = fs.readdirSync(projectsDir)\n .map(name => path.join(projectsDir, name))\n .filter(p => fs.statSync(p).isDirectory());\n\n // Look for directory that matches the project path pattern\n // The directory name format is: -home-user-project-name\n const normalizedPath = projectPath.replace(/\\//g, '-').replace(/^-/, '');\n\n for (const dir of projectDirs) {\n const dirName = path.basename(dir);\n if (dirName.includes(normalizedPath) || normalizedPath.includes(dirName)) {\n return dir;\n }\n }\n\n // If exact match not found, return first match or null\n return projectDirs.length > 0 ? projectDirs[0] : null;\n }\n\n /**\n * Find all JSONL session files in a directory\n */\n private async findSessionFiles(dir: string): Promise<string[]> {\n if (!fs.existsSync(dir)) {\n return [];\n }\n\n return fs.readdirSync(dir)\n .filter(name => name.endsWith('.jsonl'))\n .map(name => path.join(dir, name))\n .filter(p => fs.statSync(p).isFile());\n }\n\n /**\n * Extract text content from Claude message\n */\n private extractContent(entry: ClaudeMessage): string | null {\n if (!entry.message?.content) {\n return null;\n }\n\n const content = entry.message.content;\n\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n // Extract text from content blocks\n const texts = content\n .filter(block => block.type === 'text' && block.text)\n .map(block => block.text as string);\n\n return texts.join('\\n');\n }\n\n return null;\n }\n\n /**\n * List available sessions for import\n */\n async listAvailableSessions(projectPath?: string): Promise<Array<{\n sessionId: string;\n filePath: string;\n size: number;\n modifiedAt: Date;\n }>> {\n const sessions: Array<{\n sessionId: string;\n filePath: string;\n size: number;\n modifiedAt: Date;\n }> = [];\n\n let projectDirs: string[] = [];\n\n if (projectPath) {\n const projectDir = await this.findProjectDir(projectPath);\n if (projectDir) {\n projectDirs = [projectDir];\n }\n } else {\n const projectsDir = path.join(this.claudeDir, 'projects');\n if (fs.existsSync(projectsDir)) {\n projectDirs = fs.readdirSync(projectsDir)\n .map(name => path.join(projectsDir, name))\n .filter(p => fs.statSync(p).isDirectory());\n }\n }\n\n for (const projectDir of projectDirs) {\n const sessionFiles = await this.findSessionFiles(projectDir);\n\n for (const filePath of sessionFiles) {\n const stats = fs.statSync(filePath);\n sessions.push({\n sessionId: path.basename(filePath, '.jsonl'),\n filePath,\n size: stats.size,\n modifiedAt: stats.mtime\n });\n }\n }\n\n // Sort by modified date (newest first)\n sessions.sort((a, b) => b.modifiedAt.getTime() - a.modifiedAt.getTime());\n\n return sessions;\n }\n}\n\n/**\n * Create importer with default memory service\n */\nexport function createSessionHistoryImporter(memoryService: MemoryService): SessionHistoryImporter {\n return new SessionHistoryImporter(memoryService);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["crypto", "DEFAULT_CONFIG", "DEFAULT_CONFIG", "randomUUID", "randomUUID", "randomUUID", "fs", "path", "os"]
|
|
3
|
+
"sources": ["../../src/cli/index.ts", "../../src/services/memory-service.ts", "../../src/core/event-store.ts", "../../src/core/canonical-key.ts", "../../src/core/db-wrapper.ts", "../../src/core/vector-store.ts", "../../src/core/embedder.ts", "../../src/core/vector-outbox.ts", "../../src/core/vector-worker.ts", "../../src/core/matcher.ts", "../../src/core/retriever.ts", "../../src/core/graduation.ts", "../../src/core/metadata-extractor.ts", "../../src/core/working-set-store.ts", "../../src/core/consolidated-store.ts", "../../src/core/consolidation-worker.ts", "../../src/core/continuity-manager.ts", "../../src/services/session-history-importer.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n/**\n * Code Memory CLI\n * Command-line interface for memory operations\n */\n\nimport { Command } from 'commander';\nimport {\n getDefaultMemoryService,\n getMemoryServiceForProject\n} from '../services/memory-service.js';\nimport { createSessionHistoryImporter } from '../services/session-history-importer.js';\n\nconst program = new Command();\n\nprogram\n .name('code-memory')\n .description('Claude Code Memory Plugin CLI')\n .version('1.0.0');\n\n/**\n * Search command\n */\nprogram\n .command('search <query>')\n .description('Search memories using semantic search')\n .option('-k, --top-k <number>', 'Number of results', '5')\n .option('-s, --min-score <number>', 'Minimum similarity score', '0.7')\n .option('--session <id>', 'Filter by session ID')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (query: string, options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n const result = await service.retrieveMemories(query, {\n topK: parseInt(options.topK),\n minScore: parseFloat(options.minScore),\n sessionId: options.session\n });\n\n console.log('\\n\uD83D\uDCDA Search Results\\n');\n console.log(`Confidence: ${result.matchResult.confidence}`);\n console.log(`Total memories found: ${result.memories.length}\\n`);\n\n for (const memory of result.memories) {\n const date = memory.event.timestamp.toISOString().split('T')[0];\n console.log(`---`);\n console.log(`\uD83D\uDCCC ${memory.event.eventType} (${date})`);\n console.log(` Score: ${memory.score.toFixed(3)}`);\n console.log(` Session: ${memory.event.sessionId.slice(0, 8)}...`);\n console.log(` Content: ${memory.event.content.slice(0, 200)}${memory.event.content.length > 200 ? '...' : ''}`);\n console.log('');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Search failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * History command\n */\nprogram\n .command('history')\n .description('View conversation history')\n .option('-l, --limit <number>', 'Number of events', '20')\n .option('--session <id>', 'Filter by session ID')\n .option('--type <type>', 'Filter by event type')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n let events;\n\n if (options.session) {\n events = await service.getSessionHistory(options.session);\n } else {\n events = await service.getRecentEvents(parseInt(options.limit));\n }\n\n if (options.type) {\n events = events.filter(e => e.eventType === options.type);\n }\n\n console.log('\\n\uD83D\uDCDC Memory History\\n');\n console.log(`Total events: ${events.length}\\n`);\n\n for (const event of events.slice(0, parseInt(options.limit))) {\n const date = event.timestamp.toISOString();\n const icon = event.eventType === 'user_prompt' ? '\uD83D\uDC64' :\n event.eventType === 'agent_response' ? '\uD83E\uDD16' : '\uD83D\uDCDD';\n\n console.log(`${icon} [${date}] ${event.eventType}`);\n console.log(` Session: ${event.sessionId.slice(0, 8)}...`);\n console.log(` ${event.content.slice(0, 150)}${event.content.length > 150 ? '...' : ''}`);\n console.log('');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('History failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Stats command\n */\nprogram\n .command('stats')\n .description('View memory statistics')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n const stats = await service.getStats();\n\n console.log('\\n\uD83D\uDCCA Memory Statistics\\n');\n console.log(`Total Events: ${stats.totalEvents}`);\n console.log(`Vector Count: ${stats.vectorCount}`);\n console.log('\\nMemory Levels:');\n\n for (const level of stats.levelStats) {\n const bar = '\u2588'.repeat(Math.min(20, Math.ceil(level.count / 10)));\n console.log(` ${level.level}: ${bar} ${level.count}`);\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Stats failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Forget command\n */\nprogram\n .command('forget [eventId]')\n .description('Remove memories from storage')\n .option('--session <id>', 'Forget all events from a session')\n .option('--before <date>', 'Forget events before date (YYYY-MM-DD)')\n .option('--confirm', 'Skip confirmation')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (eventId: string | undefined, options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n if (!eventId && !options.session && !options.before) {\n console.error('Please specify an event ID, --session, or --before option');\n process.exit(1);\n }\n\n if (!options.confirm) {\n console.log('\u26A0\uFE0F This will remove memories from storage.');\n console.log('Add --confirm to proceed.');\n process.exit(0);\n }\n\n // Note: Full forget implementation would require additional EventStore methods\n console.log('\uD83D\uDDD1\uFE0F Forget functionality requires additional implementation.');\n console.log('Events are append-only; soft-delete markers would be added.');\n\n await service.shutdown();\n } catch (error) {\n console.error('Forget failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Process command - manually process pending embeddings\n */\nprogram\n .command('process')\n .description('Process pending embeddings')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n console.log('\u23F3 Processing pending embeddings...');\n const count = await service.processPendingEmbeddings();\n console.log(`\u2705 Processed ${count} embeddings`);\n\n await service.shutdown();\n } catch (error) {\n console.error('Process failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Import command - import existing Claude Code sessions\n */\nprogram\n .command('import')\n .description('Import existing Claude Code conversation history')\n .option('-p, --project <path>', 'Import from specific project path')\n .option('-s, --session <file>', 'Import specific session file (JSONL)')\n .option('-a, --all', 'Import all sessions from all projects')\n .option('-l, --limit <number>', 'Limit messages per session')\n .option('-v, --verbose', 'Show detailed progress')\n .action(async (options) => {\n // Determine target project path for storage\n const targetProjectPath = options.project || process.cwd();\n\n // Use project-specific memory service\n const service = getMemoryServiceForProject(targetProjectPath);\n const importer = createSessionHistoryImporter(service);\n\n try {\n await service.initialize();\n\n let result;\n\n if (options.session) {\n // Import specific session file\n console.log(`\\n\uD83D\uDCE5 Importing session: ${options.session}`);\n console.log(` Target project: ${targetProjectPath}\\n`);\n result = await importer.importSessionFile(options.session, {\n projectPath: targetProjectPath,\n limit: options.limit ? parseInt(options.limit) : undefined,\n verbose: options.verbose\n });\n } else if (options.project) {\n // Import all sessions from a project\n console.log(`\\n\uD83D\uDCE5 Importing project: ${options.project}\\n`);\n result = await importer.importProject(options.project, {\n limit: options.limit ? parseInt(options.limit) : undefined,\n verbose: options.verbose\n });\n } else if (options.all) {\n // Import all sessions from all projects\n // Note: --all imports to global storage for backward compatibility\n console.log('\\n\uD83D\uDCE5 Importing all sessions from all projects');\n console.log(' \u26A0\uFE0F Using global storage (use -p for project-specific)\\n');\n const globalService = getDefaultMemoryService();\n const globalImporter = createSessionHistoryImporter(globalService);\n await globalService.initialize();\n result = await globalImporter.importAll({\n limit: options.limit ? parseInt(options.limit) : undefined,\n verbose: options.verbose\n });\n\n // Process embeddings\n console.log('\\n\u23F3 Processing embeddings...');\n const embedCount = await globalService.processPendingEmbeddings();\n\n // Show results\n console.log('\\n\u2705 Import Complete\\n');\n console.log(`Sessions processed: ${result.totalSessions}`);\n console.log(`Total messages: ${result.totalMessages}`);\n console.log(`Imported prompts: ${result.importedPrompts}`);\n console.log(`Imported responses: ${result.importedResponses}`);\n console.log(`Skipped duplicates: ${result.skippedDuplicates}`);\n console.log(`Embeddings processed: ${embedCount}`);\n\n if (result.errors.length > 0) {\n console.log(`\\n\u26A0\uFE0F Errors (${result.errors.length}):`);\n for (const error of result.errors.slice(0, 5)) {\n console.log(` - ${error}`);\n }\n if (result.errors.length > 5) {\n console.log(` ... and ${result.errors.length - 5} more`);\n }\n }\n\n await globalService.shutdown();\n return;\n } else {\n // Default: import current project\n const cwd = process.cwd();\n console.log(`\\n\uD83D\uDCE5 Importing sessions for current project: ${cwd}\\n`);\n result = await importer.importProject(cwd, {\n projectPath: cwd,\n limit: options.limit ? parseInt(options.limit) : undefined,\n verbose: options.verbose\n });\n }\n\n // Process embeddings\n console.log('\\n\u23F3 Processing embeddings...');\n const embedCount = await service.processPendingEmbeddings();\n\n // Show results\n console.log('\\n\u2705 Import Complete\\n');\n console.log(`Sessions processed: ${result.totalSessions}`);\n console.log(`Total messages: ${result.totalMessages}`);\n console.log(`Imported prompts: ${result.importedPrompts}`);\n console.log(`Imported responses: ${result.importedResponses}`);\n console.log(`Skipped duplicates: ${result.skippedDuplicates}`);\n console.log(`Embeddings processed: ${embedCount}`);\n\n if (result.errors.length > 0) {\n console.log(`\\n\u26A0\uFE0F Errors (${result.errors.length}):`);\n for (const error of result.errors.slice(0, 5)) {\n console.log(` - ${error}`);\n }\n if (result.errors.length > 5) {\n console.log(` ... and ${result.errors.length - 5} more`);\n }\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Import failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * List command - list available sessions for import\n */\nprogram\n .command('list')\n .description('List available Claude Code sessions')\n .option('-p, --project <path>', 'Filter by project path')\n .action(async (options) => {\n const service = getDefaultMemoryService();\n const importer = createSessionHistoryImporter(service);\n\n try {\n const sessions = await importer.listAvailableSessions(options.project);\n\n console.log('\\n\uD83D\uDCCB Available Sessions\\n');\n console.log(`Found ${sessions.length} session(s)\\n`);\n\n for (const session of sessions.slice(0, 20)) {\n const date = session.modifiedAt.toISOString().split('T')[0];\n const sizeKB = (session.size / 1024).toFixed(1);\n console.log(`\uD83D\uDCDD ${session.sessionId.slice(0, 16)}...`);\n console.log(` Modified: ${date}`);\n console.log(` Size: ${sizeKB} KB`);\n console.log(` Path: ${session.filePath}`);\n console.log('');\n }\n\n if (sessions.length > 20) {\n console.log(`... and ${sessions.length - 20} more sessions`);\n }\n\n console.log('\\nUse \"code-memory import --session <path>\" to import a specific session');\n } catch (error) {\n console.error('List failed:', error);\n process.exit(1);\n }\n });\n\n// ============================================================\n// Endless Mode Commands\n// ============================================================\n\n/**\n * Endless Mode parent command\n */\nconst endlessCmd = program\n .command('endless')\n .description('Manage Endless Mode (biomimetic continuous memory)');\n\n/**\n * Enable Endless Mode\n */\nendlessCmd\n .command('enable')\n .description('Enable Endless Mode')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n await service.setMode('endless');\n\n console.log('\\n\u267E\uFE0F Endless Mode Enabled\\n');\n console.log('Your conversations will now be continuously integrated');\n console.log('across session boundaries.\\n');\n console.log('Features:');\n console.log(' - Working Set: Recent context kept active');\n console.log(' - Consolidation: Automatic memory integration');\n console.log(' - Continuity: Seamless context transitions\\n');\n console.log('Use \"code-memory endless status\" to view current state');\n\n await service.shutdown();\n } catch (error) {\n console.error('Enable failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Disable Endless Mode\n */\nendlessCmd\n .command('disable')\n .description('Disable Endless Mode (return to Session Mode)')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n await service.setMode('session');\n\n console.log('\\n\uD83D\uDCCB Session Mode Enabled\\n');\n console.log('Returned to traditional session-based memory.');\n console.log('Existing Endless Mode data is preserved for future use.');\n\n await service.shutdown();\n } catch (error) {\n console.error('Disable failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Endless Mode Status\n */\nendlessCmd\n .command('status')\n .description('Show Endless Mode status')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n const status = await service.getEndlessModeStatus();\n\n const modeIcon = status.mode === 'endless' ? '\u267E\uFE0F' : '\uD83D\uDCCB';\n const modeName = status.mode === 'endless' ? 'Endless Mode' : 'Session Mode';\n\n console.log(`\\n${modeIcon} ${modeName}\\n`);\n\n if (status.mode === 'endless') {\n // Continuity score bar\n const continuityBars = '\u2588'.repeat(Math.round(status.continuityScore * 10));\n const continuityEmpty = '\u2591'.repeat(10 - Math.round(status.continuityScore * 10));\n\n console.log('\uD83D\uDCCA Status:');\n console.log(` Working Set: ${status.workingSetSize} events`);\n console.log(` Continuity: [${continuityBars}${continuityEmpty}] ${(status.continuityScore * 100).toFixed(0)}%`);\n console.log(` Consolidated: ${status.consolidatedCount} memories`);\n\n if (status.lastConsolidation) {\n const ago = Math.round((Date.now() - status.lastConsolidation.getTime()) / 60000);\n console.log(` Last Consolidation: ${ago} minutes ago`);\n } else {\n console.log(' Last Consolidation: Never');\n }\n } else {\n console.log('Endless Mode is disabled.');\n console.log('Use \"code-memory endless enable\" to activate.');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Status failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Consolidate command - manually trigger consolidation\n */\nendlessCmd\n .command('consolidate')\n .description('Manually trigger memory consolidation')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n\n if (!service.isEndlessModeActive()) {\n console.log('\\n\u26A0\uFE0F Endless Mode is not active');\n console.log('Use \"code-memory endless enable\" first');\n process.exit(1);\n }\n\n console.log('\\n\u23F3 Running memory consolidation...');\n const count = await service.forceConsolidation();\n\n if (count > 0) {\n console.log(`\\n\u2705 Consolidated ${count} memory group(s)`);\n } else {\n console.log('\\n\uD83D\uDCCB No memories to consolidate');\n console.log('(Working set may not have enough events yet)');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Consolidation failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Working Set command - view current working set\n */\nendlessCmd\n .command('working-set')\n .alias('ws')\n .description('View current working set')\n .option('-l, --limit <number>', 'Number of events to show', '10')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n\n if (!service.isEndlessModeActive()) {\n console.log('\\n\u26A0\uFE0F Endless Mode is not active');\n console.log('Use \"code-memory endless enable\" first');\n process.exit(1);\n }\n\n const workingSet = await service.getWorkingSet();\n\n if (!workingSet || workingSet.recentEvents.length === 0) {\n console.log('\\n\uD83D\uDCCB Working Set is empty');\n console.log('Events will be added as you interact with Claude');\n process.exit(0);\n }\n\n console.log('\\n\uD83E\uDDE0 Working Set\\n');\n console.log(`Total events: ${workingSet.recentEvents.length}`);\n console.log(`Continuity score: ${(workingSet.continuityScore * 100).toFixed(0)}%`);\n console.log(`Last activity: ${workingSet.lastActivity.toISOString()}\\n`);\n\n const limit = parseInt(options.limit);\n const events = workingSet.recentEvents.slice(0, limit);\n\n for (const event of events) {\n const icon = event.eventType === 'user_prompt' ? '\uD83D\uDC64' :\n event.eventType === 'agent_response' ? '\uD83E\uDD16' :\n event.eventType === 'tool_observation' ? '\uD83D\uDD27' : '\uD83D\uDCDD';\n const time = event.timestamp.toLocaleTimeString();\n const preview = event.content.slice(0, 80) + (event.content.length > 80 ? '...' : '');\n\n console.log(`${icon} [${time}] ${event.eventType}`);\n console.log(` ${preview}`);\n console.log('');\n }\n\n if (workingSet.recentEvents.length > limit) {\n console.log(`... and ${workingSet.recentEvents.length - limit} more events`);\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Working set failed:', error);\n process.exit(1);\n }\n });\n\n/**\n * Consolidated memories command\n */\nendlessCmd\n .command('memories')\n .description('View consolidated memories')\n .option('-l, --limit <number>', 'Number of memories to show', '10')\n .option('-q, --query <text>', 'Search consolidated memories')\n .option('-p, --project <path>', 'Project path (defaults to cwd)')\n .action(async (options) => {\n const projectPath = options.project || process.cwd();\n const service = getMemoryServiceForProject(projectPath);\n\n try {\n await service.initialize();\n\n let memories;\n\n if (options.query) {\n memories = await service.searchConsolidated(options.query, {\n topK: parseInt(options.limit)\n });\n console.log(`\\n\uD83D\uDD0D Searching for: \"${options.query}\"\\n`);\n } else {\n memories = await service.getConsolidatedMemories(parseInt(options.limit));\n console.log('\\n\uD83D\uDCBE Consolidated Memories\\n');\n }\n\n if (memories.length === 0) {\n console.log('No consolidated memories found.');\n if (!service.isEndlessModeActive()) {\n console.log('Enable Endless Mode to start consolidating memories.');\n }\n process.exit(0);\n }\n\n console.log(`Showing ${memories.length} memory(ies)\\n`);\n\n for (const memory of memories) {\n const date = memory.createdAt.toISOString().split('T')[0];\n const confidenceBars = '\u2588'.repeat(Math.round(memory.confidence * 5));\n\n console.log(`\uD83D\uDCDA ${memory.topics.slice(0, 3).join(', ')}`);\n console.log(` Created: ${date}`);\n console.log(` Confidence: [${confidenceBars}] ${(memory.confidence * 100).toFixed(0)}%`);\n console.log(` Sources: ${memory.sourceEvents.length} events`);\n console.log(` Access count: ${memory.accessCount}`);\n console.log(` Summary: ${memory.summary.slice(0, 200)}${memory.summary.length > 200 ? '...' : ''}`);\n console.log('');\n }\n\n await service.shutdown();\n } catch (error) {\n console.error('Memories failed:', error);\n process.exit(1);\n }\n });\n\nprogram.parse();\n", "/**\n * Memory Service - Main entry point for memory operations\n * Coordinates EventStore, VectorStore, Retriever, and Graduation\n */\n\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport * as crypto from 'crypto';\n\nimport { EventStore } from '../core/event-store.js';\nimport { VectorStore } from '../core/vector-store.js';\nimport { Embedder, getDefaultEmbedder } from '../core/embedder.js';\nimport { VectorWorker, createVectorWorker } from '../core/vector-worker.js';\nimport { Matcher, getDefaultMatcher } from '../core/matcher.js';\nimport { Retriever, createRetriever, RetrievalResult } from '../core/retriever.js';\nimport { GraduationPipeline, createGraduationPipeline } from '../core/graduation.js';\nimport type {\n MemoryEventInput,\n AppendResult,\n MemoryEvent,\n Config,\n ConfigSchema,\n ToolObservationPayload,\n MemoryMode,\n EndlessModeConfig,\n EndlessModeConfigSchema,\n WorkingSet,\n ConsolidatedMemory,\n EndlessModeStatus,\n ContextSnapshot,\n ContinuityScore\n} from '../core/types.js';\nimport { createToolObservationEmbedding } from '../core/metadata-extractor.js';\nimport { WorkingSetStore, createWorkingSetStore } from '../core/working-set-store.js';\nimport { ConsolidatedStore, createConsolidatedStore } from '../core/consolidated-store.js';\nimport { ConsolidationWorker, createConsolidationWorker } from '../core/consolidation-worker.js';\nimport { ContinuityManager, createContinuityManager } from '../core/continuity-manager.js';\n\nexport interface MemoryServiceConfig {\n storagePath: string;\n embeddingModel?: string;\n}\n\n// ============================================================\n// Project Path Utilities\n// ============================================================\n\n/**\n * Normalize and resolve a project path, handling symlinks\n */\nfunction normalizePath(projectPath: string): string {\n const expanded = projectPath.startsWith('~')\n ? path.join(os.homedir(), projectPath.slice(1))\n : projectPath;\n\n try {\n // Resolve symlinks for consistent paths\n return fs.realpathSync(expanded);\n } catch {\n // Path doesn't exist yet, just resolve it\n return path.resolve(expanded);\n }\n}\n\n/**\n * Generate a stable 8-character hash from a project path\n */\nexport function hashProjectPath(projectPath: string): string {\n const normalizedPath = normalizePath(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 specific project\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// Session Registry\n// ============================================================\n\nconst REGISTRY_PATH = path.join(os.homedir(), '.claude-code', 'memory', 'session-registry.json');\n\ninterface SessionRegistryEntry {\n projectPath: string;\n projectHash: string;\n registeredAt: string;\n}\n\ninterface SessionRegistry {\n version: number;\n sessions: Record<string, SessionRegistryEntry>;\n}\n\nfunction 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 // Atomic write using temp file\n const tempPath = REGISTRY_PATH + '.tmp';\n fs.writeFileSync(tempPath, JSON.stringify(registry, null, 2));\n fs.renameSync(tempPath, REGISTRY_PATH);\n}\n\n/**\n * Register a session with its project path\n */\nexport function registerSession(sessionId: string, projectPath: string): void {\n const registry = loadSessionRegistry();\n\n registry.sessions[sessionId] = {\n projectPath: normalizePath(projectPath),\n projectHash: hashProjectPath(projectPath),\n registeredAt: new Date().toISOString()\n };\n\n // Clean up old sessions (keep last 1000)\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\n/**\n * Get the project path for a session\n */\nexport function getSessionProject(sessionId: string): SessionRegistryEntry | null {\n const registry = loadSessionRegistry();\n return registry.sessions[sessionId] || null;\n}\n\nexport class MemoryService {\n private readonly eventStore: EventStore;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly matcher: Matcher;\n private readonly retriever: Retriever;\n private readonly graduation: GraduationPipeline;\n private vectorWorker: VectorWorker | null = null;\n private initialized = false;\n\n // Endless Mode components\n private workingSetStore: WorkingSetStore | null = null;\n private consolidatedStore: ConsolidatedStore | null = null;\n private consolidationWorker: ConsolidationWorker | null = null;\n private continuityManager: ContinuityManager | null = null;\n private endlessMode: MemoryMode = 'session';\n\n constructor(config: MemoryServiceConfig) {\n const storagePath = this.expandPath(config.storagePath);\n\n // Ensure storage directory exists\n if (!fs.existsSync(storagePath)) {\n fs.mkdirSync(storagePath, { recursive: true });\n }\n\n // Initialize components\n this.eventStore = new EventStore(path.join(storagePath, 'events.duckdb'));\n this.vectorStore = new VectorStore(path.join(storagePath, 'vectors'));\n this.embedder = config.embeddingModel\n ? new Embedder(config.embeddingModel)\n : getDefaultEmbedder();\n this.matcher = getDefaultMatcher();\n this.retriever = createRetriever(\n this.eventStore,\n this.vectorStore,\n this.embedder,\n this.matcher\n );\n this.graduation = createGraduationPipeline(this.eventStore);\n }\n\n /**\n * Initialize all components\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n await this.eventStore.initialize();\n await this.vectorStore.initialize();\n await this.embedder.initialize();\n\n // Start vector worker\n this.vectorWorker = createVectorWorker(\n this.eventStore,\n this.vectorStore,\n this.embedder\n );\n this.vectorWorker.start();\n\n // Load endless mode setting\n const savedMode = await this.eventStore.getEndlessConfig('mode') as MemoryMode | null;\n if (savedMode === 'endless') {\n this.endlessMode = 'endless';\n await this.initializeEndlessMode();\n }\n\n this.initialized = true;\n }\n\n /**\n * Start a new session\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 /**\n * End a session\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 /**\n * Store a user prompt\n */\n async storeUserPrompt(\n sessionId: string,\n content: string,\n metadata?: Record<string, unknown>\n ): Promise<AppendResult> {\n await this.initialize();\n\n const result = await this.eventStore.append({\n eventType: 'user_prompt',\n sessionId,\n timestamp: new Date(),\n content,\n metadata\n });\n\n // Enqueue for embedding if new\n if (result.success && !result.isDuplicate) {\n await this.eventStore.enqueueForEmbedding(result.eventId, content);\n }\n\n return result;\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 await this.initialize();\n\n const result = await this.eventStore.append({\n eventType: 'agent_response',\n sessionId,\n timestamp: new Date(),\n content,\n metadata\n });\n\n // Enqueue for embedding if new\n if (result.success && !result.isDuplicate) {\n await this.eventStore.enqueueForEmbedding(result.eventId, content);\n }\n\n return result;\n }\n\n /**\n * Store a session summary\n */\n async storeSessionSummary(\n sessionId: string,\n summary: string\n ): Promise<AppendResult> {\n await this.initialize();\n\n const result = await this.eventStore.append({\n eventType: 'session_summary',\n sessionId,\n timestamp: new Date(),\n content: summary\n });\n\n if (result.success && !result.isDuplicate) {\n await this.eventStore.enqueueForEmbedding(result.eventId, summary);\n }\n\n return result;\n }\n\n /**\n * Store a tool observation\n */\n async storeToolObservation(\n sessionId: string,\n payload: ToolObservationPayload\n ): Promise<AppendResult> {\n await this.initialize();\n\n // Create content for storage (JSON stringified payload)\n const content = JSON.stringify(payload);\n\n const result = await this.eventStore.append({\n eventType: 'tool_observation',\n sessionId,\n timestamp: new Date(),\n content,\n metadata: {\n toolName: payload.toolName,\n success: payload.success\n }\n });\n\n // Create embedding content (optimized for search)\n if (result.success && !result.isDuplicate) {\n const embeddingContent = createToolObservationEmbedding(\n payload.toolName,\n payload.metadata || {},\n payload.success\n );\n await this.eventStore.enqueueForEmbedding(result.eventId, embeddingContent);\n }\n\n return result;\n }\n\n /**\n * Retrieve relevant memories for a query\n */\n async retrieveMemories(\n query: string,\n options?: {\n topK?: number;\n minScore?: number;\n sessionId?: string;\n }\n ): Promise<RetrievalResult> {\n await this.initialize();\n\n // Process any pending embeddings first\n if (this.vectorWorker) {\n await this.vectorWorker.processAll();\n }\n\n return this.retriever.retrieve(query, options);\n }\n\n /**\n * Get session history\n */\n async getSessionHistory(sessionId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.eventStore.getSessionEvents(sessionId);\n }\n\n /**\n * Get recent events\n */\n async getRecentEvents(limit: number = 100): Promise<MemoryEvent[]> {\n await this.initialize();\n return this.eventStore.getRecentEvents(limit);\n }\n\n /**\n * Get memory statistics\n */\n async getStats(): Promise<{\n totalEvents: number;\n vectorCount: number;\n levelStats: Array<{ level: string; count: number }>;\n }> {\n await this.initialize();\n\n const recentEvents = await this.eventStore.getRecentEvents(10000);\n const vectorCount = await this.vectorStore.count();\n const levelStats = await this.graduation.getStats();\n\n return {\n totalEvents: recentEvents.length,\n vectorCount,\n levelStats\n };\n }\n\n /**\n * Process pending embeddings\n */\n async processPendingEmbeddings(): Promise<number> {\n if (this.vectorWorker) {\n return this.vectorWorker.processAll();\n }\n return 0;\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 // Endless Mode Methods\n // ============================================================\n\n /**\n * Get the default endless mode config\n */\n private 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, // 1 hour\n triggerEventCount: 100,\n triggerIdleMs: 1800000, // 30 minutes\n useLLMSummarization: false\n },\n continuity: {\n minScoreForSeamless: 0.7,\n topicDecayHours: 48\n }\n };\n }\n\n /**\n * Initialize Endless Mode components\n */\n async initializeEndlessMode(): Promise<void> {\n const config = await this.getEndlessConfig();\n\n this.workingSetStore = createWorkingSetStore(this.eventStore, config);\n this.consolidatedStore = createConsolidatedStore(this.eventStore);\n this.consolidationWorker = createConsolidationWorker(\n this.workingSetStore,\n this.consolidatedStore,\n config\n );\n this.continuityManager = createContinuityManager(this.eventStore, config);\n\n // Start consolidation worker\n this.consolidationWorker.start();\n }\n\n /**\n * Get Endless Mode configuration\n */\n async getEndlessConfig(): Promise<EndlessModeConfig> {\n const savedConfig = await this.eventStore.getEndlessConfig('config') as EndlessModeConfig | null;\n return savedConfig || this.getDefaultEndlessConfig();\n }\n\n /**\n * Set Endless Mode configuration\n */\n async setEndlessConfig(config: Partial<EndlessModeConfig>): Promise<void> {\n const current = await this.getEndlessConfig();\n const merged = { ...current, ...config };\n await this.eventStore.setEndlessConfig('config', merged);\n }\n\n /**\n * Set memory mode (session or endless)\n */\n async setMode(mode: MemoryMode): Promise<void> {\n await this.initialize();\n\n if (mode === this.endlessMode) return;\n\n this.endlessMode = mode;\n await this.eventStore.setEndlessConfig('mode', mode);\n\n if (mode === 'endless') {\n await this.initializeEndlessMode();\n } else {\n // Stop endless mode components\n if (this.consolidationWorker) {\n this.consolidationWorker.stop();\n this.consolidationWorker = null;\n }\n this.workingSetStore = null;\n this.consolidatedStore = null;\n this.continuityManager = null;\n }\n }\n\n /**\n * Get current memory mode\n */\n getMode(): MemoryMode {\n return this.endlessMode;\n }\n\n /**\n * Check if endless mode is active\n */\n isEndlessModeActive(): boolean {\n return this.endlessMode === 'endless';\n }\n\n /**\n * Add event to Working Set (Endless Mode)\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 /**\n * Get the current Working Set\n */\n async getWorkingSet(): Promise<WorkingSet | null> {\n if (!this.workingSetStore) return null;\n return this.workingSetStore.get();\n }\n\n /**\n * Search consolidated memories\n */\n async searchConsolidated(\n query: string,\n options?: { topK?: number }\n ): Promise<ConsolidatedMemory[]> {\n if (!this.consolidatedStore) return [];\n return this.consolidatedStore.search(query, options);\n }\n\n /**\n * Get all consolidated memories\n */\n async getConsolidatedMemories(limit?: number): Promise<ConsolidatedMemory[]> {\n if (!this.consolidatedStore) return [];\n return this.consolidatedStore.getAll({ limit });\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 if (!this.continuityManager) return null;\n\n const snapshot = this.continuityManager.createSnapshot(\n crypto.randomUUID(),\n content,\n metadata\n );\n\n return this.continuityManager.calculateScore(snapshot);\n }\n\n /**\n * Record activity (for consolidation idle trigger)\n */\n recordActivity(): void {\n if (this.consolidationWorker) {\n this.consolidationWorker.recordActivity();\n }\n }\n\n /**\n * Force a consolidation run\n */\n async forceConsolidation(): Promise<number> {\n if (!this.consolidationWorker) return 0;\n return this.consolidationWorker.forceRun();\n }\n\n /**\n * Get Endless Mode status\n */\n async getEndlessModeStatus(): Promise<EndlessModeStatus> {\n await this.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.endlessMode,\n workingSetSize,\n continuityScore,\n consolidatedCount,\n lastConsolidation\n };\n }\n\n /**\n * Format Endless Mode context for Claude\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 // Continuity status\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 // Working set summary\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 // Consolidated memories\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 /**\n * Shutdown service\n */\n async shutdown(): Promise<void> {\n // Stop endless mode components\n if (this.consolidationWorker) {\n this.consolidationWorker.stop();\n }\n\n if (this.vectorWorker) {\n this.vectorWorker.stop();\n }\n await this.eventStore.close();\n }\n\n /**\n * Expand ~ to home directory\n */\n private expandPath(p: string): string {\n if (p.startsWith('~')) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n }\n}\n\n// ============================================================\n// Service Instance Management\n// ============================================================\n\n// Instance cache: Map from project hash (or '__global__') to MemoryService\nconst serviceCache = new Map<string, MemoryService>();\nconst GLOBAL_KEY = '__global__';\n\n/**\n * Get the global memory service (backward compatibility)\n * Use this for operations not tied to a specific project\n */\nexport function getDefaultMemoryService(): MemoryService {\n if (!serviceCache.has(GLOBAL_KEY)) {\n serviceCache.set(GLOBAL_KEY, new MemoryService({\n storagePath: '~/.claude-code/memory'\n }));\n }\n return serviceCache.get(GLOBAL_KEY)!;\n}\n\n/**\n * Get memory service for a specific project path\n * Creates isolated storage at ~/.claude-code/memory/projects/{hash}/\n */\nexport function getMemoryServiceForProject(projectPath: string): MemoryService {\n const hash = hashProjectPath(projectPath);\n\n if (!serviceCache.has(hash)) {\n const storagePath = getProjectStoragePath(projectPath);\n serviceCache.set(hash, new MemoryService({ storagePath }));\n }\n\n return serviceCache.get(hash)!;\n}\n\n/**\n * Get memory service for a session by looking up its project\n * Falls back to global storage if session not found in registry\n */\nexport function getMemoryServiceForSession(sessionId: string): MemoryService {\n const projectInfo = getSessionProject(sessionId);\n\n if (projectInfo) {\n return getMemoryServiceForProject(projectInfo.projectPath);\n }\n\n // Fallback to global storage for unknown sessions (backward compat)\n return getDefaultMemoryService();\n}\n\nexport function createMemoryService(config: MemoryServiceConfig): MemoryService {\n return new MemoryService(config);\n}\n", "/**\n * AXIOMMIND EventStore implementation\n * Principles: Append-only, Single Source of Truth, Idempotency\n */\n\nimport { randomUUID } from 'crypto';\nimport {\n MemoryEvent,\n MemoryEventInput,\n Session,\n AppendResult,\n OutboxItem\n} from './types.js';\nimport { makeCanonicalKey, makeDedupeKey } from './canonical-key.js';\nimport { createDatabase, dbRun, dbAll, dbClose, toDate, type Database } from './db-wrapper.js';\n\nexport class EventStore {\n private db: Database;\n private initialized = false;\n\n constructor(private dbPath: string) {\n this.db = createDatabase(dbPath);\n }\n\n /**\n * Initialize database schema\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // L0 EventStore: Single Source of Truth (immutable, append-only)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS events (\n id VARCHAR PRIMARY KEY,\n event_type VARCHAR NOT NULL,\n session_id VARCHAR NOT NULL,\n timestamp TIMESTAMP NOT NULL,\n content TEXT NOT NULL,\n canonical_key VARCHAR NOT NULL,\n dedupe_key VARCHAR UNIQUE,\n metadata JSON\n )\n `);\n\n // Dedup table for idempotency\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS event_dedup (\n dedupe_key VARCHAR PRIMARY KEY,\n event_id VARCHAR NOT NULL,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Session metadata\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS sessions (\n id VARCHAR PRIMARY KEY,\n started_at TIMESTAMP NOT NULL,\n ended_at TIMESTAMP,\n project_path VARCHAR,\n summary TEXT,\n tags JSON\n )\n `);\n\n // Insights (derived data, rebuildable)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS insights (\n id VARCHAR PRIMARY KEY,\n insight_type VARCHAR NOT NULL,\n content TEXT NOT NULL,\n canonical_key VARCHAR NOT NULL,\n confidence FLOAT,\n source_events JSON,\n created_at TIMESTAMP,\n last_updated TIMESTAMP\n )\n `);\n\n // Embedding Outbox (Single-Writer Pattern)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS embedding_outbox (\n id VARCHAR PRIMARY KEY,\n event_id VARCHAR NOT NULL,\n content TEXT NOT NULL,\n status VARCHAR DEFAULT 'pending',\n retry_count INT DEFAULT 0,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n processed_at TIMESTAMP,\n error_message TEXT\n )\n `);\n\n // Projection offset tracking\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS projection_offsets (\n projection_name VARCHAR PRIMARY KEY,\n last_event_id VARCHAR,\n last_timestamp TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Memory level tracking\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS memory_levels (\n event_id VARCHAR PRIMARY KEY,\n level VARCHAR NOT NULL DEFAULT 'L0',\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // ============================================================\n // Entity-Edge Model Tables\n // ============================================================\n\n // Entries (immutable memory units)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS entries (\n entry_id VARCHAR PRIMARY KEY,\n created_ts TIMESTAMP NOT NULL,\n entry_type VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n content_json JSON NOT NULL,\n stage VARCHAR NOT NULL DEFAULT 'raw',\n status VARCHAR DEFAULT 'active',\n superseded_by VARCHAR,\n build_id VARCHAR,\n evidence_json JSON,\n canonical_key VARCHAR,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Entities (task/condition/artifact)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS entities (\n entity_id VARCHAR PRIMARY KEY,\n entity_type VARCHAR NOT NULL,\n canonical_key VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n stage VARCHAR NOT NULL DEFAULT 'raw',\n status VARCHAR NOT NULL DEFAULT 'active',\n current_json JSON NOT NULL,\n title_norm VARCHAR,\n search_text VARCHAR,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Entity aliases for canonical key lookup\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS entity_aliases (\n entity_type VARCHAR NOT NULL,\n canonical_key VARCHAR NOT NULL,\n entity_id VARCHAR NOT NULL,\n is_primary BOOLEAN DEFAULT FALSE,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY(entity_type, canonical_key)\n )\n `);\n\n // Edges (relationships between entries/entities)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS edges (\n edge_id VARCHAR PRIMARY KEY,\n src_type VARCHAR NOT NULL,\n src_id VARCHAR NOT NULL,\n rel_type VARCHAR NOT NULL,\n dst_type VARCHAR NOT NULL,\n dst_id VARCHAR NOT NULL,\n meta_json JSON,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // ============================================================\n // Vector Outbox V2 Table\n // ============================================================\n\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS vector_outbox (\n job_id VARCHAR PRIMARY KEY,\n item_kind VARCHAR NOT NULL,\n item_id VARCHAR NOT NULL,\n embedding_version VARCHAR NOT NULL,\n status VARCHAR NOT NULL DEFAULT 'pending',\n retry_count INT DEFAULT 0,\n error VARCHAR,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(item_kind, item_id, embedding_version)\n )\n `);\n\n // ============================================================\n // Build Runs & Metrics Tables\n // ============================================================\n\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS build_runs (\n build_id VARCHAR PRIMARY KEY,\n started_at TIMESTAMP NOT NULL,\n finished_at TIMESTAMP,\n extractor_model VARCHAR NOT NULL,\n extractor_prompt_hash VARCHAR NOT NULL,\n embedder_model VARCHAR NOT NULL,\n embedding_version VARCHAR NOT NULL,\n idris_version VARCHAR NOT NULL,\n schema_version VARCHAR NOT NULL,\n status VARCHAR NOT NULL DEFAULT 'running',\n error VARCHAR\n )\n `);\n\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS pipeline_metrics (\n id VARCHAR PRIMARY KEY,\n ts TIMESTAMP NOT NULL,\n stage VARCHAR NOT NULL,\n latency_ms DOUBLE NOT NULL,\n success BOOLEAN NOT NULL,\n error VARCHAR,\n session_id VARCHAR\n )\n `);\n\n // ============================================================\n // Endless Mode Tables\n // ============================================================\n\n // Working Set table (active memory window)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS working_set (\n id VARCHAR PRIMARY KEY,\n event_id VARCHAR NOT NULL,\n added_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n relevance_score FLOAT DEFAULT 1.0,\n topics JSON,\n expires_at TIMESTAMP\n )\n `);\n\n // Consolidated Memories table (long-term integrated memories)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS consolidated_memories (\n memory_id VARCHAR PRIMARY KEY,\n summary TEXT NOT NULL,\n topics JSON,\n source_events JSON,\n confidence FLOAT DEFAULT 0.5,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n accessed_at TIMESTAMP,\n access_count INTEGER DEFAULT 0\n )\n `);\n\n // Continuity Log table (tracks context transitions)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS continuity_log (\n log_id VARCHAR PRIMARY KEY,\n from_context_id VARCHAR,\n to_context_id VARCHAR,\n continuity_score FLOAT,\n transition_type VARCHAR,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Endless Mode Config table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS endless_config (\n key VARCHAR PRIMARY KEY,\n value JSON,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // ============================================================\n // Create Indexes\n // ============================================================\n\n // Entry indexes\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_entries_type ON entries(entry_type)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_entries_stage ON entries(stage)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_entries_canonical ON entries(canonical_key)`);\n\n // Entity indexes\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_entities_type_key ON entities(entity_type, canonical_key)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_entities_status ON entities(status)`);\n\n // Edge indexes\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_edges_src ON edges(src_id, rel_type)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_edges_dst ON edges(dst_id, rel_type)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_edges_rel ON edges(rel_type)`);\n\n // Outbox indexes\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_outbox_status ON vector_outbox(status)`);\n\n // Endless Mode indexes\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_working_set_expires ON working_set(expires_at)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_working_set_relevance ON working_set(relevance_score DESC)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_consolidated_confidence ON consolidated_memories(confidence DESC)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_continuity_created ON continuity_log(created_at)`);\n\n this.initialized = true;\n }\n\n /**\n * Append event to store (AXIOMMIND Principle 2: Append-only)\n * Returns existing event ID if duplicate (Principle 3: Idempotency)\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 = await dbAll<{ event_id: string }>(\n this.db,\n `SELECT event_id FROM event_dedup WHERE dedupe_key = ?`,\n [dedupeKey]\n );\n\n if (existing.length > 0) {\n return {\n success: true,\n eventId: existing[0].event_id,\n isDuplicate: true\n };\n }\n\n const id = randomUUID();\n const timestamp = input.timestamp.toISOString();\n\n try {\n await dbRun(\n this.db,\n `INSERT INTO events (id, event_type, session_id, timestamp, content, canonical_key, dedupe_key, metadata)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n input.eventType,\n input.sessionId,\n timestamp,\n input.content,\n canonicalKey,\n dedupeKey,\n JSON.stringify(input.metadata || {})\n ]\n );\n\n await dbRun(\n this.db,\n `INSERT INTO event_dedup (dedupe_key, event_id) VALUES (?, ?)`,\n [dedupeKey, id]\n );\n\n // Initialize at L0\n await dbRun(\n this.db,\n `INSERT INTO memory_levels (event_id, level) VALUES (?, 'L0')`,\n [id]\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 events by session ID\n */\n async getSessionEvents(sessionId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE session_id = ? 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): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events 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): Promise<MemoryEvent | null> {\n await this.initialize();\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE id = ?`,\n [id]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEvent(rows[0]);\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 = await dbAll<{ id: string }>(\n this.db,\n `SELECT id FROM sessions WHERE id = ?`,\n [session.id]\n );\n\n if (existing.length === 0) {\n await dbRun(\n this.db,\n `INSERT INTO sessions (id, started_at, project_path, tags)\n VALUES (?, ?, ?, ?)`,\n [\n session.id,\n (session.startedAt || new Date()).toISOString(),\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(session.endedAt.toISOString());\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 await dbRun(\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 rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM sessions WHERE id = ?`,\n [id]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n id: row.id as string,\n startedAt: toDate(row.started_at),\n endedAt: row.ended_at ? toDate(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 (Single-Writer Pattern)\n */\n async enqueueForEmbedding(eventId: string, content: string): Promise<string> {\n await this.initialize();\n\n const id = randomUUID();\n await dbRun(\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 // First, get pending items\n const pending = await dbAll<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\n const ids = pending.map(r => r.id as string);\n const placeholders = ids.map(() => '?').join(',');\n await dbRun(\n this.db,\n `UPDATE embedding_outbox SET status = 'processing' 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: toDate(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 await dbRun(\n this.db,\n `DELETE FROM embedding_outbox WHERE id IN (${placeholders})`,\n ids\n );\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 await dbRun(\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 * Update memory level\n */\n async updateMemoryLevel(eventId: string, level: string): Promise<void> {\n await this.initialize();\n\n await dbRun(\n this.db,\n `UPDATE memory_levels SET level = ?, promoted_at = CURRENT_TIMESTAMP 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 = await dbAll<{ level: string; count: number }>(\n this.db,\n `SELECT level, COUNT(*) as count FROM memory_levels GROUP BY level`\n );\n\n return rows;\n }\n\n // ============================================================\n // Endless Mode Helper Methods\n // ============================================================\n\n /**\n * Get database instance for Endless Mode stores\n */\n getDatabase(): Database {\n return this.db;\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 rows = await dbAll<{ value: string }>(\n this.db,\n `SELECT value FROM endless_config WHERE key = ?`,\n [key]\n );\n\n if (rows.length === 0) return null;\n return JSON.parse(rows[0].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 await dbRun(\n this.db,\n `INSERT OR REPLACE INTO endless_config (key, value, updated_at)\n VALUES (?, ?, CURRENT_TIMESTAMP)`,\n [key, JSON.stringify(value)]\n );\n }\n\n /**\n * Get all sessions\n */\n async getAllSessions(): Promise<Session[]> {\n await this.initialize();\n\n const rows = await dbAll<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: toDate(row.started_at),\n endedAt: row.ended_at ? toDate(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 * Close database connection\n */\n async close(): Promise<void> {\n await dbClose(this.db);\n }\n\n /**\n * Convert database row to MemoryEvent\n */\n private rowToEvent(row: Record<string, unknown>): MemoryEvent {\n return {\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: 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}\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 * DuckDB Promise Wrapper\n * Wraps the callback-based DuckDB API with Promise-based async/await interface\n */\n\nimport duckdb from 'duckdb';\n\nexport type Database = duckdb.Database;\n\n/**\n * Converts BigInt values to Number in an object\n * DuckDB returns BigInt for COUNT(*) and other aggregate functions\n */\nfunction convertBigInts<T>(obj: T): T {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj === 'bigint') return Number(obj) as unknown as T;\n if (obj instanceof Date) return obj; // Preserve Date objects\n if (Array.isArray(obj)) return obj.map(convertBigInts) as unknown as T;\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n result[key] = convertBigInts(value);\n }\n return result as T;\n }\n return obj;\n}\n\n/**\n * Safely converts a value to a Date object\n * Handles both Date objects and string timestamps from DuckDB\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\n/**\n * Creates a new DuckDB database with Promise-based API\n */\nexport function createDatabase(path: string): Database {\n return new duckdb.Database(path);\n}\n\n/**\n * Promisified db.run() - executes a statement that doesn't return rows\n */\nexport function dbRun(db: Database, sql: string, params: unknown[] = []): Promise<void> {\n return new Promise((resolve, reject) => {\n if (params.length === 0) {\n db.run(sql, (err: Error | null) => {\n if (err) reject(err);\n else resolve();\n });\n } else {\n db.run(sql, ...params, (err: Error | null) => {\n if (err) reject(err);\n else resolve();\n });\n }\n });\n}\n\n/**\n * Promisified db.all() - executes a query and returns all rows\n * Automatically converts BigInt values to Number\n */\nexport function dbAll<T = Record<string, unknown>>(\n db: Database,\n sql: string,\n params: unknown[] = []\n): Promise<T[]> {\n return new Promise((resolve, reject) => {\n if (params.length === 0) {\n db.all(sql, (err: Error | null, rows: T[]) => {\n if (err) reject(err);\n else resolve(convertBigInts(rows || []));\n });\n } else {\n db.all(sql, ...params, (err: Error | null, rows: T[]) => {\n if (err) reject(err);\n else resolve(convertBigInts(rows || []));\n });\n }\n });\n}\n\n/**\n * Promisified db.close() - closes the database connection\n */\nexport function dbClose(db: Database): Promise<void> {\n return new Promise((resolve, reject) => {\n db.close((err: Error | null) => {\n if (err) reject(err);\n else resolve();\n });\n });\n}\n\n/**\n * Promisified db.exec() - executes multiple statements\n */\nexport function dbExec(db: Database, sql: string): Promise<void> {\n return new Promise((resolve, reject) => {\n db.exec(sql, (err: Error | null) => {\n if (err) reject(err);\n else resolve();\n });\n });\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\nexport class VectorStore {\n private db: lancedb.Connection | null = null;\n private table: lancedb.Table | null = null;\n private readonly tableName = 'conversations';\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 to open existing table\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 // Table doesn't exist yet, will be created on first insert\n this.table = null;\n }\n }\n\n /**\n * Add or update vector record\n */\n async upsert(record: VectorRecord): 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 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 if (!this.table) {\n // Create table with first record\n this.table = await this.db.createTable(this.tableName, [data]);\n } else {\n await this.table.add([data]);\n }\n }\n\n /**\n * Add multiple vector records in batch\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 data = records.map(record => ({\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 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 sessionId?: string;\n } = {}\n ): Promise<SearchResult[]> {\n await this.initialize();\n\n if (!this.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 = this.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 = '${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\n */\n async delete(eventId: string): Promise<void> {\n if (!this.table) return;\n await this.table.delete(`eventId = '${eventId}'`);\n }\n\n /**\n * Get total count of vectors\n */\n async count(): Promise<number> {\n if (!this.table) return 0;\n const result = await this.table.countRows();\n return result;\n }\n\n /**\n * Check if vector exists for event\n */\n async exists(eventId: string): Promise<boolean> {\n if (!this.table) return false;\n\n const results = await this.table\n .search([])\n .where(`eventId = '${eventId}'`)\n .limit(1)\n .toArray();\n\n return results.length > 0;\n }\n}\n", "/**\n * Local Embedding Generator using @xenova/transformers\n * AXIOMMIND Principle 7: Standard JSON format for vectors\n */\n\nimport { pipeline, Pipeline } from '@xenova/transformers';\n\nexport interface EmbeddingResult {\n vector: number[];\n model: string;\n dimensions: number;\n}\n\nexport class Embedder {\n private pipeline: Pipeline | null = null;\n private readonly modelName: string;\n private initialized = false;\n\n constructor(modelName: string = 'Xenova/all-MiniLM-L6-v2') {\n this.modelName = modelName;\n }\n\n /**\n * Initialize the embedding pipeline\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n this.pipeline = await pipeline('feature-extraction', this.modelName);\n this.initialized = true;\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(text, {\n pooling: 'mean',\n normalize: true\n });\n\n const vector = Array.from(output.data as Float32Array);\n\n return {\n vector,\n model: this.modelName,\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(text, {\n pooling: 'mean',\n normalize: true\n });\n\n const vector = Array.from(output.data as Float32Array);\n\n results.push({\n vector,\n model: this.modelName,\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.modelName;\n }\n}\n\n// Singleton instance for reuse\nlet defaultEmbedder: Embedder | null = null;\n\nexport function getDefaultEmbedder(): Embedder {\n if (!defaultEmbedder) {\n defaultEmbedder = new Embedder();\n }\n return defaultEmbedder;\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 VALID_OUTBOX_TRANSITIONS\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 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 */\n async enqueue(\n itemKind: OutboxItemKind,\n itemId: string,\n embeddingVersion?: string\n ): Promise<string> {\n const version = embeddingVersion ?? this.config.embeddingVersion;\n const jobId = randomUUID();\n const now = new Date().toISOString();\n\n await dbRun(\n this.db,\n `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`,\n [jobId, itemKind, itemId, version, now, now]\n );\n\n return jobId;\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(): Promise<{ recovered: number; retried: number }> {\n const now = new Date();\n const stuckThreshold = new Date(now.getTime() - this.config.stuckThresholdMs);\n\n // Recover stuck processing jobs\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'pending', updated_at = ?\n WHERE status = 'processing'\n AND updated_at < ?`,\n [now.toISOString(), stuckThreshold.toISOString()]\n );\n\n // Retry failed jobs that haven't exceeded max retries\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'pending', updated_at = ?\n WHERE status = 'failed'\n AND retry_count < ?`,\n [now.toISOString(), this.config.maxRetries]\n );\n\n // Get counts (DuckDB doesn't return affected rows easily)\n const recoveredRows = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM vector_outbox\n WHERE status = 'pending' AND updated_at = ?`,\n [now.toISOString()]\n );\n\n return {\n recovered: 0, // Approximate\n retried: 0 // Approximate\n };\n }\n\n /**\n * Cleanup old done jobs\n */\n async cleanup(): Promise<number> {\n const threshold = new Date();\n threshold.setDate(threshold.getDate() - this.config.cleanupDays);\n\n await dbRun(\n this.db,\n `DELETE FROM vector_outbox\n WHERE status = 'done'\n AND updated_at < ?`,\n [threshold.toISOString()]\n );\n\n return 0; // DuckDB doesn't return affected rows easily\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 * 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 { OutboxItem, 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\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 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.poll();\n }\n\n /**\n * Stop the worker\n */\n stop(): void {\n this.running = false;\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\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 throw error;\n }\n }\n\n /**\n * Poll for new items\n */\n private async poll(): Promise<void> {\n if (!this.running) return;\n\n try {\n await this.processBatch();\n } catch (error) {\n console.error('Vector worker error:', error);\n }\n\n // Schedule next poll\n this.pollTimeout = setTimeout(() => this.poll(), this.config.pollIntervalMs);\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 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\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 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.poll();\n }\n\n /**\n * Stop the worker\n */\n stop(): void {\n this.running = false;\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 const errorMessage = error instanceof Error ? error.message : String(error);\n await this.outbox.markFailed(job.jobId, errorMessage);\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) return;\n\n try {\n await this.processBatch();\n } catch (error) {\n console.error('Vector worker V2 error:', error);\n }\n\n // Schedule next poll\n this.pollTimeout = setTimeout(() => this.poll(), this.config.pollIntervalMs);\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 * 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 MemoryEvent,\n MemoryMatch,\n MatchResult,\n MatchConfidence,\n MATCH_THRESHOLDS\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 0, // FTS score - would need to be passed in\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", "/**\n * Memory Retriever - Unified retrieval interface\n * Combines vector search, event store lookups, 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 type { MemoryEvent, MatchResult, Config } from './types.js';\n\nexport interface RetrievalOptions {\n topK: number;\n minScore: number;\n sessionId?: string;\n maxTokens: number;\n includeSessionContext: boolean;\n}\n\nexport interface RetrievalResult {\n memories: MemoryWithContext[];\n matchResult: MatchResult;\n totalTokens: number;\n context: string;\n}\n\nexport interface MemoryWithContext {\n event: MemoryEvent;\n score: number;\n sessionContext?: string;\n}\n\nconst DEFAULT_OPTIONS: RetrievalOptions = {\n topK: 5,\n minScore: 0.7,\n maxTokens: 2000,\n includeSessionContext: true\n};\n\nexport class Retriever {\n private readonly eventStore: EventStore;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly matcher: Matcher;\n\n constructor(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher\n ) {\n this.eventStore = eventStore;\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.matcher = matcher;\n }\n\n /**\n * Retrieve relevant memories for a query\n */\n async retrieve(\n query: string,\n options: Partial<RetrievalOptions> = {}\n ): Promise<RetrievalResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Generate query embedding\n const queryEmbedding = await this.embedder.embed(query);\n\n // Search vector store\n const searchResults = await this.vectorStore.search(queryEmbedding.vector, {\n limit: opts.topK * 2, // Get extra for filtering\n minScore: opts.minScore,\n sessionId: opts.sessionId\n });\n\n // Get match result using AXIOMMIND matcher\n const matchResult = this.matcher.matchSearchResults(\n searchResults,\n (eventId) => this.getEventAgeDays(eventId)\n );\n\n // Enrich results with full event data and session context\n const memories = await this.enrichResults(searchResults.slice(0, opts.topK), opts);\n\n // Build context string\n const context = this.buildContext(memories, opts.maxTokens);\n\n return {\n memories,\n matchResult,\n totalTokens: this.estimateTokens(context),\n context\n };\n }\n\n /**\n * Retrieve memories from a specific session\n */\n async retrieveFromSession(sessionId: string): Promise<MemoryEvent[]> {\n return this.eventStore.getSessionEvents(sessionId);\n }\n\n /**\n * Get recent memories across all sessions\n */\n async retrieveRecent(limit: number = 100): Promise<MemoryEvent[]> {\n return this.eventStore.getRecentEvents(limit);\n }\n\n /**\n * Enrich search results with full event data\n */\n private async enrichResults(\n results: SearchResult[],\n options: RetrievalOptions\n ): 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 let sessionContext: string | undefined;\n if (options.includeSessionContext) {\n sessionContext = await this.getSessionContext(event.sessionId, event.id);\n }\n\n memories.push({\n event,\n score: result.score,\n sessionContext\n });\n }\n\n return memories;\n }\n\n /**\n * Get surrounding context from the same session\n */\n private async getSessionContext(\n sessionId: string,\n eventId: string\n ): Promise<string | undefined> {\n const sessionEvents = await this.eventStore.getSessionEvents(sessionId);\n\n // Find the event index\n const eventIndex = sessionEvents.findIndex(e => e.id === eventId);\n if (eventIndex === -1) return undefined;\n\n // Get 1 event before and after for context\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\n if (contextEvents.length <= 1) return undefined;\n\n return contextEvents\n .filter(e => e.id !== eventId)\n .map(e => `[${e.eventType}]: ${e.content.slice(0, 200)}...`)\n .join('\\n');\n }\n\n /**\n * Build context string from memories (respecting token limit)\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\n if (currentTokens + memoryTokens > maxTokens) {\n break;\n }\n\n parts.push(memoryText);\n currentTokens += memoryTokens;\n }\n\n if (parts.length === 0) {\n return '';\n }\n\n return `## Relevant Memories\\n\\n${parts.join('\\n\\n---\\n\\n')}`;\n }\n\n /**\n * Format a single memory for context\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\n if (sessionContext) {\n text += `\\n\\n_Context:_ ${sessionContext}`;\n }\n\n return text;\n }\n\n /**\n * Estimate token count (rough approximation)\n */\n private estimateTokens(text: string): number {\n // Rough estimate: ~4 characters per token\n return Math.ceil(text.length / 4);\n }\n\n /**\n * Get event age in days (for recency scoring)\n */\n private getEventAgeDays(eventId: string): number {\n // This would ideally cache event timestamps\n // For now, return 0 (assume recent)\n return 0;\n }\n}\n\n/**\n * Create a retriever with default components\n */\nexport function createRetriever(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher\n): Retriever {\n return new Retriever(eventStore, vectorStore, embedder, matcher);\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 InsightType\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 /**\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 if (existing) {\n existing.accessCount++;\n existing.lastAccessed = new Date();\n existing.confidence = Math.max(existing.confidence, confidence);\n // Track cross-session references\n // This would need more sophisticated tracking in production\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, metrics] of this.metrics) {\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 * 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", "/**\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 * 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} 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 * 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} 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 return await this.consolidate();\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 workingSet = await this.workingSetStore.get();\n\n if (workingSet.recentEvents.length < 3) {\n return 0; // Not enough events to consolidate\n }\n\n // Group events by topic\n const groups = this.groupByTopic(workingSet.recentEvents);\n let consolidatedCount = 0;\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 await this.consolidatedStore.create({\n summary,\n topics: group.topics,\n sourceEvents: eventIds,\n confidence: this.calculateConfidence(group)\n });\n\n consolidatedCount++;\n }\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 return consolidatedCount;\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 * Session History Importer\n * Imports existing Claude Code conversation history into memory\n *\n * Claude Code stores session history in:\n * ~/.claude/projects/<project-hash>/<session-id>.jsonl\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as readline from 'readline';\nimport { MemoryService } from './memory-service.js';\n\nexport interface ImportOptions {\n projectPath?: string;\n sessionId?: string;\n limit?: number;\n skipExisting?: boolean;\n verbose?: boolean;\n}\n\nexport interface ImportResult {\n totalSessions: number;\n totalMessages: number;\n importedPrompts: number;\n importedResponses: number;\n skippedDuplicates: number;\n errors: string[];\n}\n\nexport interface ClaudeMessage {\n type: string;\n message?: {\n role: string;\n content: string | Array<{ type: string; text?: string }>;\n };\n sessionId?: string;\n timestamp?: string;\n}\n\nexport class SessionHistoryImporter {\n private readonly memoryService: MemoryService;\n private readonly claudeDir: string;\n\n constructor(memoryService: MemoryService) {\n this.memoryService = memoryService;\n this.claudeDir = path.join(os.homedir(), '.claude');\n }\n\n /**\n * Import all sessions from a project\n */\n async importProject(projectPath: string, options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 0,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n // Find project directory\n const projectDir = await this.findProjectDir(projectPath);\n if (!projectDir) {\n result.errors.push(`Project directory not found for: ${projectPath}`);\n return result;\n }\n\n // Find all session files\n const sessionFiles = await this.findSessionFiles(projectDir);\n result.totalSessions = sessionFiles.length;\n\n if (options.verbose) {\n console.log(`Found ${sessionFiles.length} session files in ${projectDir}`);\n }\n\n // Import each session\n for (const sessionFile of sessionFiles) {\n try {\n const sessionResult = await this.importSessionFile(sessionFile, options);\n result.totalMessages += sessionResult.totalMessages;\n result.importedPrompts += sessionResult.importedPrompts;\n result.importedResponses += sessionResult.importedResponses;\n result.skippedDuplicates += sessionResult.skippedDuplicates;\n } catch (error) {\n result.errors.push(`Failed to import ${sessionFile}: ${error}`);\n }\n }\n\n return result;\n }\n\n /**\n * Import a specific session file\n */\n async importSessionFile(filePath: string, options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 1,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n if (!fs.existsSync(filePath)) {\n result.errors.push(`File not found: ${filePath}`);\n return result;\n }\n\n // Extract session ID from filename\n const sessionId = path.basename(filePath, '.jsonl');\n\n // Start session in memory\n await this.memoryService.startSession(sessionId, options.projectPath);\n\n // Read and parse JSONL file\n const fileStream = fs.createReadStream(filePath);\n const rl = readline.createInterface({\n input: fileStream,\n crlfDelay: Infinity\n });\n\n let lineCount = 0;\n const limit = options.limit || Infinity;\n\n for await (const line of rl) {\n if (lineCount >= limit) break;\n\n try {\n const entry = JSON.parse(line) as ClaudeMessage;\n result.totalMessages++;\n\n // Process message entries\n if (entry.type === 'user' || entry.type === 'assistant') {\n const content = this.extractContent(entry);\n if (!content) continue;\n\n if (entry.type === 'user') {\n const appendResult = await this.memoryService.storeUserPrompt(\n sessionId,\n content,\n { importedFrom: filePath, originalTimestamp: entry.timestamp }\n );\n\n if (appendResult.isDuplicate) {\n result.skippedDuplicates++;\n } else {\n result.importedPrompts++;\n }\n } else if (entry.type === 'assistant') {\n // Truncate very long responses\n const truncatedContent = content.length > 5000\n ? content.slice(0, 5000) + '...[truncated]'\n : content;\n\n const appendResult = await this.memoryService.storeAgentResponse(\n sessionId,\n truncatedContent,\n { importedFrom: filePath, originalTimestamp: entry.timestamp }\n );\n\n if (appendResult.isDuplicate) {\n result.skippedDuplicates++;\n } else {\n result.importedResponses++;\n }\n }\n\n lineCount++;\n }\n } catch (parseError) {\n // Skip malformed lines\n result.errors.push(`Parse error on line: ${parseError}`);\n }\n }\n\n // End session\n await this.memoryService.endSession(sessionId);\n\n if (options.verbose) {\n console.log(`Imported ${result.importedPrompts} prompts, ${result.importedResponses} responses from ${filePath}`);\n }\n\n return result;\n }\n\n /**\n * Import all sessions from all projects\n */\n async importAll(options: ImportOptions = {}): Promise<ImportResult> {\n const result: ImportResult = {\n totalSessions: 0,\n totalMessages: 0,\n importedPrompts: 0,\n importedResponses: 0,\n skippedDuplicates: 0,\n errors: []\n };\n\n const projectsDir = path.join(this.claudeDir, 'projects');\n if (!fs.existsSync(projectsDir)) {\n result.errors.push(`Projects directory not found: ${projectsDir}`);\n return result;\n }\n\n // Find all project directories\n const projectDirs = fs.readdirSync(projectsDir)\n .map(name => path.join(projectsDir, name))\n .filter(p => fs.statSync(p).isDirectory());\n\n if (options.verbose) {\n console.log(`Found ${projectDirs.length} project directories`);\n }\n\n for (const projectDir of projectDirs) {\n try {\n const sessionFiles = await this.findSessionFiles(projectDir);\n\n for (const sessionFile of sessionFiles) {\n const sessionResult = await this.importSessionFile(sessionFile, options);\n result.totalSessions++;\n result.totalMessages += sessionResult.totalMessages;\n result.importedPrompts += sessionResult.importedPrompts;\n result.importedResponses += sessionResult.importedResponses;\n result.skippedDuplicates += sessionResult.skippedDuplicates;\n result.errors.push(...sessionResult.errors);\n }\n } catch (error) {\n result.errors.push(`Failed to process ${projectDir}: ${error}`);\n }\n }\n\n return result;\n }\n\n /**\n * Find project directory from project path\n */\n private async findProjectDir(projectPath: string): Promise<string | null> {\n const projectsDir = path.join(this.claudeDir, 'projects');\n if (!fs.existsSync(projectsDir)) {\n return null;\n }\n\n // Claude uses a hash of the project path as directory name\n // Try to find matching directory by checking all projects\n const projectDirs = fs.readdirSync(projectsDir)\n .map(name => path.join(projectsDir, name))\n .filter(p => fs.statSync(p).isDirectory());\n\n // Look for directory that matches the project path pattern\n // The directory name format is: -home-user-project-name\n const normalizedPath = projectPath.replace(/\\//g, '-').replace(/^-/, '');\n\n for (const dir of projectDirs) {\n const dirName = path.basename(dir);\n if (dirName.includes(normalizedPath) || normalizedPath.includes(dirName)) {\n return dir;\n }\n }\n\n // If exact match not found, return first match or null\n return projectDirs.length > 0 ? projectDirs[0] : null;\n }\n\n /**\n * Find all JSONL session files in a directory\n */\n private async findSessionFiles(dir: string): Promise<string[]> {\n if (!fs.existsSync(dir)) {\n return [];\n }\n\n return fs.readdirSync(dir)\n .filter(name => name.endsWith('.jsonl'))\n .map(name => path.join(dir, name))\n .filter(p => fs.statSync(p).isFile());\n }\n\n /**\n * Extract text content from Claude message\n */\n private extractContent(entry: ClaudeMessage): string | null {\n if (!entry.message?.content) {\n return null;\n }\n\n const content = entry.message.content;\n\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n // Extract text from content blocks\n const texts = content\n .filter(block => block.type === 'text' && block.text)\n .map(block => block.text as string);\n\n return texts.join('\\n');\n }\n\n return null;\n }\n\n /**\n * List available sessions for import\n */\n async listAvailableSessions(projectPath?: string): Promise<Array<{\n sessionId: string;\n filePath: string;\n size: number;\n modifiedAt: Date;\n }>> {\n const sessions: Array<{\n sessionId: string;\n filePath: string;\n size: number;\n modifiedAt: Date;\n }> = [];\n\n let projectDirs: string[] = [];\n\n if (projectPath) {\n const projectDir = await this.findProjectDir(projectPath);\n if (projectDir) {\n projectDirs = [projectDir];\n }\n } else {\n const projectsDir = path.join(this.claudeDir, 'projects');\n if (fs.existsSync(projectsDir)) {\n projectDirs = fs.readdirSync(projectsDir)\n .map(name => path.join(projectsDir, name))\n .filter(p => fs.statSync(p).isDirectory());\n }\n }\n\n for (const projectDir of projectDirs) {\n const sessionFiles = await this.findSessionFiles(projectDir);\n\n for (const filePath of sessionFiles) {\n const stats = fs.statSync(filePath);\n sessions.push({\n sessionId: path.basename(filePath, '.jsonl'),\n filePath,\n size: stats.size,\n modifiedAt: stats.mtime\n });\n }\n }\n\n // Sort by modified date (newest first)\n sessions.sort((a, b) => b.modifiedAt.getTime() - a.modifiedAt.getTime());\n\n return sessions;\n }\n}\n\n/**\n * Create importer with default memory service\n */\nexport function createSessionHistoryImporter(memoryService: MemoryService): SessionHistoryImporter {\n return new SessionHistoryImporter(memoryService);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["crypto", "path", "resolve", "DEFAULT_CONFIG", "DEFAULT_CONFIG", "randomUUID", "randomUUID", "randomUUID", "randomUUID", "randomUUID", "randomUUID", "fs", "path", "os", "embedCount"]
|
|
7
7
|
}
|