@ulrichc1/sparn 1.2.2 โ 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PRIVACY.md +1 -1
- package/README.md +136 -642
- package/SECURITY.md +1 -1
- package/dist/cli/dashboard.cjs +3977 -0
- package/dist/cli/dashboard.cjs.map +1 -0
- package/dist/cli/dashboard.d.cts +17 -0
- package/dist/cli/dashboard.d.ts +17 -0
- package/dist/cli/dashboard.js +3932 -0
- package/dist/cli/dashboard.js.map +1 -0
- package/dist/cli/index.cjs +3853 -484
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +3810 -457
- package/dist/cli/index.js.map +1 -1
- package/dist/daemon/index.cjs +411 -99
- package/dist/daemon/index.cjs.map +1 -1
- package/dist/daemon/index.js +423 -103
- package/dist/daemon/index.js.map +1 -1
- package/dist/hooks/post-tool-result.cjs +115 -266
- package/dist/hooks/post-tool-result.cjs.map +1 -1
- package/dist/hooks/post-tool-result.js +115 -266
- package/dist/hooks/post-tool-result.js.map +1 -1
- package/dist/hooks/pre-prompt.cjs +197 -268
- package/dist/hooks/pre-prompt.cjs.map +1 -1
- package/dist/hooks/pre-prompt.js +182 -268
- package/dist/hooks/pre-prompt.js.map +1 -1
- package/dist/hooks/stop-docs-refresh.cjs +123 -0
- package/dist/hooks/stop-docs-refresh.cjs.map +1 -0
- package/dist/hooks/stop-docs-refresh.d.cts +1 -0
- package/dist/hooks/stop-docs-refresh.d.ts +1 -0
- package/dist/hooks/stop-docs-refresh.js +126 -0
- package/dist/hooks/stop-docs-refresh.js.map +1 -0
- package/dist/index.cjs +1754 -337
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +539 -40
- package/dist/index.d.ts +539 -40
- package/dist/index.js +1737 -329
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.cjs +304 -71
- package/dist/mcp/index.cjs.map +1 -1
- package/dist/mcp/index.js +308 -71
- package/dist/mcp/index.js.map +1 -1
- package/package.json +10 -3
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../node_modules/tsup/assets/esm_shims.js","../../src/cli/ui/colors.ts","../../src/cli/ui/banner.ts","../../src/core/kv-memory.ts","../../src/types/config.ts","../../src/cli/commands/init.ts","../../src/cli/ui/progress.ts","../../src/utils/hash.ts","../../src/core/btsp-embedder.ts","../../src/core/confidence-states.ts","../../src/core/engram-scorer.ts","../../src/utils/tokenizer.ts","../../src/core/sparse-pruner.ts","../../src/adapters/generic.ts","../../src/cli/commands/optimize.ts","../../src/cli/commands/stats.ts","../../src/cli/commands/relay.ts","../../src/core/sleep-compressor.ts","../../src/cli/commands/consolidate.ts","../../src/cli/commands/config.ts","../../src/core/metrics.ts","../../src/daemon/daemon-process.ts","../../src/cli/commands/hooks.ts","../../src/cli/commands/interactive.ts","../../src/cli/index.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * Brand color constants.\n * Per Article VIII: Brand Consistency.\n */\n\nimport chalk from 'chalk';\n\n/**\n * Neural Cyan (#00D4AA) - Success, active operations\n */\nexport const neuralCyan = chalk.hex('#00D4AA');\n\n/**\n * Synapse Violet (#7B61FF) - Highlights, graphs, numbers\n */\nexport const synapseViolet = chalk.hex('#7B61FF');\n\n/**\n * Error Red (#FF6B6B) - Failures, pruned items\n */\nexport const errorRed = chalk.hex('#FF6B6B');\n\n/**\n * Brain Pink (#FF6B9D) - Logo color, brain-related messages, key branding\n */\nexport const brainPink = chalk.hex('#FF6B9D');\n\n/**\n * Dimmed text for secondary information\n */\nexport const dim = chalk.dim;\n\n/**\n * Bold text for emphasis\n */\nexport const bold = chalk.bold;\n","/**\n * ASCII banner for Sparn CLI.\n * Displayed on `sparn init` and `sparn --version`.\n */\n\nimport { brainPink, neuralCyan, synapseViolet } from './colors.js';\n\n/**\n * Sparn ASCII banner.\n */\nexport const BANNER = `\n ____ ____ ___ ____ _ __\n / ___\\\\/ __ \\\\/ _ \\\\ / __ \\\\/ | / /\n \\\\__ \\\\/ /_/ / /_\\\\ \\\\/ /_/ / |/ /\n ___/ / ____/ __ _/ _, _/ /| /\n/____/_/ /_/ |_/_/ |_/_/ |_/\n`;\n\n/**\n * Tagline for banner.\n */\nexport const TAGLINE = '๐ง Neuroscience-inspired context optimization';\n\n/**\n * Get formatted banner with color.\n *\n * @param version - Optional version string\n * @returns Formatted banner\n */\nexport function getBanner(version?: string): string {\n const versionStr = version ? synapseViolet(`v${version}`) : '';\n return `${neuralCyan(BANNER)}\\n${brainPink(TAGLINE)}\\n${versionStr ? `${versionStr}\\n` : ''}`;\n}\n","/**\n * KV Memory Store Module\n * Implements hippocampal key-value storage with dual index/value tables.\n * Maps to: Hippocampal Key-Value โ the hippocampus separates what to store from how to retrieve it.\n */\n\nimport { copyFileSync, existsSync } from 'node:fs';\nimport Database from 'better-sqlite3';\nimport type { MemoryEntry, MemoryQueryFilters } from '../types/memory.js';\n\n/**\n * Optimization statistics record.\n */\nexport interface OptimizationStats {\n id: number;\n timestamp: number;\n tokens_before: number;\n tokens_after: number;\n entries_pruned: number;\n duration_ms: number;\n}\n\n/**\n * KV Memory interface.\n */\nexport interface KVMemory {\n /** Store a memory entry */\n put(entry: MemoryEntry): Promise<void>;\n\n /** Retrieve a memory entry by ID */\n get(id: string): Promise<MemoryEntry | null>;\n\n /** Query entries by filters */\n query(filters: MemoryQueryFilters): Promise<MemoryEntry[]>;\n\n /** Delete a memory entry */\n delete(id: string): Promise<void>;\n\n /** List all entry IDs */\n list(): Promise<string[]>;\n\n /** Compact database (remove expired entries) */\n compact(): Promise<number>;\n\n /** Close database connection */\n close(): Promise<void>;\n\n /** Record optimization statistics */\n recordOptimization(stats: Omit<OptimizationStats, 'id'>): Promise<void>;\n\n /** Get all optimization statistics */\n getOptimizationStats(): Promise<OptimizationStats[]>;\n\n /** Clear all optimization statistics */\n clearOptimizationStats(): Promise<void>;\n}\n\n/**\n * Create a timestamped backup of the database\n * @param dbPath - Path to database file\n * @returns Path to backup file\n */\nfunction createBackup(dbPath: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupPath = `${dbPath}.backup-${timestamp}`;\n\n try {\n copyFileSync(dbPath, backupPath);\n console.log(`โ Database backed up to: ${backupPath}`);\n return backupPath;\n } catch (error) {\n console.error(`Warning: Could not create backup: ${error}`);\n return '';\n }\n}\n\n/**\n * Create KV Memory store with SQLite backend.\n *\n * Initializes database with dual table schema:\n * - entries_index: Fast lookups (id, hash, timestamp, score, ttl, state, accessCount, isBTSP)\n * - entries_value: Content storage (id, content, tags, metadata)\n *\n * @param dbPath - Path to SQLite database file\n * @returns KVMemory instance\n */\nexport async function createKVMemory(dbPath: string): Promise<KVMemory> {\n // Detect database corruption and create backup\n let db: Database.Database;\n try {\n db = new Database(dbPath);\n\n // Quick integrity check\n const integrityCheck = db.pragma('quick_check', { simple: true });\n if (integrityCheck !== 'ok') {\n console.error('โ Database corruption detected!');\n\n // Create backup before attempting recovery\n if (existsSync(dbPath)) {\n const backupPath = createBackup(dbPath);\n if (backupPath) {\n console.log(`Backup created at: ${backupPath}`);\n }\n }\n\n // Try to recover\n console.log('Attempting database recovery...');\n db.close();\n db = new Database(dbPath);\n }\n } catch (error) {\n console.error('โ Database error detected:', error);\n\n // Create backup if database exists\n if (existsSync(dbPath)) {\n createBackup(dbPath);\n console.log('Creating new database...');\n }\n\n db = new Database(dbPath);\n }\n\n // Enable WAL mode for better concurrency\n db.pragma('journal_mode = WAL');\n\n // Create entries_index table\n db.exec(`\n CREATE TABLE IF NOT EXISTS entries_index (\n id TEXT PRIMARY KEY NOT NULL,\n hash TEXT UNIQUE NOT NULL,\n timestamp INTEGER NOT NULL,\n score REAL NOT NULL DEFAULT 0.0 CHECK(score >= 0.0 AND score <= 1.0),\n ttl INTEGER NOT NULL CHECK(ttl >= 0),\n state TEXT NOT NULL CHECK(state IN ('silent', 'ready', 'active')),\n accessCount INTEGER NOT NULL DEFAULT 0 CHECK(accessCount >= 0),\n isBTSP INTEGER NOT NULL DEFAULT 0 CHECK(isBTSP IN (0, 1)),\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\n );\n `);\n\n // Create entries_value table\n db.exec(`\n CREATE TABLE IF NOT EXISTS entries_value (\n id TEXT PRIMARY KEY NOT NULL,\n content TEXT NOT NULL,\n tags TEXT,\n metadata TEXT,\n FOREIGN KEY (id) REFERENCES entries_index(id) ON DELETE CASCADE\n );\n `);\n\n // Create optimization_stats table\n db.exec(`\n CREATE TABLE IF NOT EXISTS optimization_stats (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\n tokens_before INTEGER NOT NULL,\n tokens_after INTEGER NOT NULL,\n entries_pruned INTEGER NOT NULL,\n duration_ms INTEGER NOT NULL\n );\n `);\n\n // Create indexes\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_entries_state ON entries_index(state);\n CREATE INDEX IF NOT EXISTS idx_entries_score ON entries_index(score DESC);\n CREATE INDEX IF NOT EXISTS idx_entries_hash ON entries_index(hash);\n CREATE INDEX IF NOT EXISTS idx_entries_timestamp ON entries_index(timestamp DESC);\n CREATE INDEX IF NOT EXISTS idx_stats_timestamp ON optimization_stats(timestamp DESC);\n `);\n\n // Prepare statements for better performance\n const putIndexStmt = db.prepare(`\n INSERT OR REPLACE INTO entries_index\n (id, hash, timestamp, score, ttl, state, accessCount, isBTSP)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const putValueStmt = db.prepare(`\n INSERT OR REPLACE INTO entries_value\n (id, content, tags, metadata)\n VALUES (?, ?, ?, ?)\n `);\n\n const getStmt = db.prepare(`\n SELECT\n i.id, i.hash, i.timestamp, i.score, i.ttl, i.state, i.accessCount, i.isBTSP,\n v.content, v.tags, v.metadata\n FROM entries_index i\n JOIN entries_value v ON i.id = v.id\n WHERE i.id = ?\n `);\n\n const deleteIndexStmt = db.prepare('DELETE FROM entries_index WHERE id = ?');\n const deleteValueStmt = db.prepare('DELETE FROM entries_value WHERE id = ?');\n\n return {\n async put(entry: MemoryEntry): Promise<void> {\n const transaction = db.transaction(() => {\n putIndexStmt.run(\n entry.id,\n entry.hash,\n entry.timestamp,\n entry.score,\n entry.ttl,\n entry.state,\n entry.accessCount,\n entry.isBTSP ? 1 : 0,\n );\n\n putValueStmt.run(\n entry.id,\n entry.content,\n JSON.stringify(entry.tags),\n JSON.stringify(entry.metadata),\n );\n });\n\n transaction();\n },\n\n async get(id: string): Promise<MemoryEntry | null> {\n const row = getStmt.get(id) as unknown;\n\n if (!row) {\n return null;\n }\n\n const r = row as {\n id: string;\n hash: string;\n timestamp: number;\n score: number;\n ttl: number;\n state: string;\n accessCount: number;\n isBTSP: number;\n content: string;\n tags: string | null;\n metadata: string | null;\n };\n\n return {\n id: r.id,\n content: r.content,\n hash: r.hash,\n timestamp: r.timestamp,\n score: r.score,\n ttl: r.ttl,\n state: r.state as 'silent' | 'ready' | 'active',\n accessCount: r.accessCount,\n tags: r.tags ? JSON.parse(r.tags) : [],\n metadata: r.metadata ? JSON.parse(r.metadata) : {},\n isBTSP: r.isBTSP === 1,\n };\n },\n\n async query(filters: MemoryQueryFilters): Promise<MemoryEntry[]> {\n let sql = `\n SELECT\n i.id, i.hash, i.timestamp, i.score, i.ttl, i.state, i.accessCount, i.isBTSP,\n v.content, v.tags, v.metadata\n FROM entries_index i\n JOIN entries_value v ON i.id = v.id\n WHERE 1=1\n `;\n\n const params: unknown[] = [];\n\n if (filters.state) {\n sql += ' AND i.state = ?';\n params.push(filters.state);\n }\n\n if (filters.minScore !== undefined) {\n sql += ' AND i.score >= ?';\n params.push(filters.minScore);\n }\n\n if (filters.maxScore !== undefined) {\n sql += ' AND i.score <= ?';\n params.push(filters.maxScore);\n }\n\n if (filters.isBTSP !== undefined) {\n sql += ' AND i.isBTSP = ?';\n params.push(filters.isBTSP ? 1 : 0);\n }\n\n sql += ' ORDER BY i.score DESC';\n\n if (filters.limit) {\n sql += ' LIMIT ?';\n params.push(filters.limit);\n }\n\n if (filters.offset) {\n sql += ' OFFSET ?';\n params.push(filters.offset);\n }\n\n const stmt = db.prepare(sql);\n const rows = stmt.all(...params) as unknown[];\n\n return rows.map((row) => {\n const r = row as {\n id: string;\n hash: string;\n timestamp: number;\n score: number;\n ttl: number;\n state: string;\n accessCount: number;\n isBTSP: number;\n content: string;\n tags: string | null;\n metadata: string | null;\n };\n\n return {\n id: r.id,\n content: r.content,\n hash: r.hash,\n timestamp: r.timestamp,\n score: r.score,\n ttl: r.ttl,\n state: r.state as 'silent' | 'ready' | 'active',\n accessCount: r.accessCount,\n tags: r.tags ? JSON.parse(r.tags) : [],\n metadata: r.metadata ? JSON.parse(r.metadata) : {},\n isBTSP: r.isBTSP === 1,\n };\n });\n },\n\n async delete(id: string): Promise<void> {\n const transaction = db.transaction(() => {\n deleteIndexStmt.run(id);\n deleteValueStmt.run(id);\n });\n\n transaction();\n },\n\n async list(): Promise<string[]> {\n const stmt = db.prepare('SELECT id FROM entries_index');\n const rows = stmt.all() as { id: string }[];\n return rows.map((r) => r.id);\n },\n\n async compact(): Promise<number> {\n const before = db.prepare('SELECT COUNT(*) as count FROM entries_index').get() as {\n count: number;\n };\n\n // Remove fully decayed entries (this will be enhanced in sleep-compressor)\n db.exec('DELETE FROM entries_index WHERE ttl <= 0');\n\n db.exec('VACUUM');\n\n const after = db.prepare('SELECT COUNT(*) as count FROM entries_index').get() as {\n count: number;\n };\n\n return before.count - after.count;\n },\n\n async close(): Promise<void> {\n db.close();\n },\n\n async recordOptimization(stats: Omit<OptimizationStats, 'id'>): Promise<void> {\n const stmt = db.prepare(`\n INSERT INTO optimization_stats (timestamp, tokens_before, tokens_after, entries_pruned, duration_ms)\n VALUES (?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n stats.timestamp,\n stats.tokens_before,\n stats.tokens_after,\n stats.entries_pruned,\n stats.duration_ms,\n );\n },\n\n async getOptimizationStats(): Promise<OptimizationStats[]> {\n const stmt = db.prepare(`\n SELECT id, timestamp, tokens_before, tokens_after, entries_pruned, duration_ms\n FROM optimization_stats\n ORDER BY timestamp DESC\n `);\n\n const rows = stmt.all() as OptimizationStats[];\n return rows;\n },\n\n async clearOptimizationStats(): Promise<void> {\n db.exec('DELETE FROM optimization_stats');\n },\n };\n}\n","/**\n * Configuration types for Sparn behavior customization.\n */\n\n/**\n * Agent adapter type.\n */\nexport type AgentType = 'claude-code' | 'generic';\n\n/**\n * Pruning configuration.\n */\nexport interface PruningConfig {\n /** Percentage of top-scored entries to keep (1-100, default: 5) */\n threshold: number;\n\n /** Aggressiveness scale 0-100 (affects TF-IDF weighting, default: 50) */\n aggressiveness: number;\n}\n\n/**\n * Decay configuration.\n */\nexport interface DecayConfig {\n /** Default TTL in hours (default: 24) */\n defaultTTL: number;\n\n /** Decay threshold for pruning (0.0-1.0, default: 0.95) */\n decayThreshold: number;\n}\n\n/**\n * Confidence state threshold configuration.\n */\nexport interface StatesConfig {\n /** Score threshold for active state (default: 0.7) */\n activeThreshold: number;\n\n /** Score threshold for ready state (default: 0.3) */\n readyThreshold: number;\n}\n\n/**\n * UI configuration.\n */\nexport interface UIConfig {\n /** Enable colored output (default: true) */\n colors: boolean;\n\n /** Enable sound effects (default: false) */\n sounds: boolean;\n\n /** Verbose logging (default: false) */\n verbose: boolean;\n}\n\n/**\n * Real-time optimization configuration.\n */\nexport interface RealtimeConfig {\n /** Target token budget for optimized context (default: 50000) */\n tokenBudget: number;\n\n /** Token threshold that triggers auto-optimization (default: 60000) */\n autoOptimizeThreshold: number;\n\n /** File patterns to watch for changes (default: ['**\\/*.jsonl']) */\n watchPatterns: string[];\n\n /** Daemon PID file path (default: '.sparn/daemon.pid') */\n pidFile: string;\n\n /** Daemon log file path (default: '.sparn/daemon.log') */\n logFile: string;\n\n /** Debounce delay in milliseconds for file changes (default: 5000) */\n debounceMs: number;\n\n /** Enable incremental optimization (default: true) */\n incremental: boolean;\n\n /** Sliding window size for context entries (default: 500) */\n windowSize: number;\n\n /** Consolidation interval in hours, or null for disabled (default: null) */\n consolidationInterval: number | null;\n}\n\n/**\n * Complete Sparn configuration.\n */\nexport interface SparnConfig {\n pruning: PruningConfig;\n decay: DecayConfig;\n states: StatesConfig;\n agent: AgentType;\n ui: UIConfig;\n /** Auto-consolidation interval in hours, or null for manual */\n autoConsolidate: number | null;\n /** Real-time optimization settings */\n realtime: RealtimeConfig;\n}\n\n/**\n * Default configuration values.\n */\nexport const DEFAULT_CONFIG: SparnConfig = {\n pruning: {\n threshold: 5,\n aggressiveness: 50,\n },\n decay: {\n defaultTTL: 24,\n decayThreshold: 0.95,\n },\n states: {\n activeThreshold: 0.7,\n readyThreshold: 0.3,\n },\n agent: 'generic',\n ui: {\n colors: true,\n sounds: false,\n verbose: false,\n },\n autoConsolidate: null,\n realtime: {\n tokenBudget: 40000,\n autoOptimizeThreshold: 60000,\n watchPatterns: ['**/*.jsonl'],\n pidFile: '.sparn/daemon.pid',\n logFile: '.sparn/daemon.log',\n debounceMs: 5000,\n incremental: true,\n windowSize: 500,\n consolidationInterval: null,\n },\n};\n","/**\n * Init command implementation.\n * Creates .sparn/ directory with config and database.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { access, mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { dump as dumpYAML } from 'js-yaml';\nimport { createKVMemory } from '../../core/kv-memory.js';\nimport { DEFAULT_CONFIG } from '../../types/config.js';\nimport { getBanner } from '../ui/banner.js';\nimport { brainPink, dim, neuralCyan } from '../ui/colors.js';\n\n// Get package.json version from project root\nfunction getVersion(): string {\n try {\n // Try from current working directory first\n const pkg = JSON.parse(readFileSync(join(process.cwd(), 'package.json'), 'utf-8'));\n return pkg.version;\n } catch {\n // Fallback: calculate from module location (after bundling: dist/cli/index.js)\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const pkg = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));\n return pkg.version;\n }\n}\n\nconst VERSION = getVersion();\n\n/**\n * Options for init command.\n */\nexport interface InitOptions {\n /** Force overwrite if .sparn/ exists */\n force?: boolean;\n /** Current working directory */\n cwd?: string;\n}\n\n/**\n * Result of init operation.\n */\nexport interface InitResult {\n /** Path to created config file */\n configPath: string;\n\n /** Path to created database */\n dbPath: string;\n\n /** Initialization duration (ms) */\n durationMs: number;\n}\n\n/**\n * Execute init command.\n *\n * Creates .sparn/ directory with:\n * - config.yaml (default configuration)\n * - memory.db (SQLite database)\n *\n * @param options - Init options\n * @returns Init result\n */\nexport async function initCommand(options: InitOptions = {}): Promise<InitResult> {\n const startTime = Date.now();\n const cwd = options.cwd || process.cwd();\n const sparnDir = join(cwd, '.sparn');\n const configPath = join(sparnDir, 'config.yaml');\n const dbPath = join(sparnDir, 'memory.db');\n\n // Check if .sparn/ already exists\n const exists = await checkExists(sparnDir);\n\n if (exists && !options.force) {\n throw new Error(\n '.sparn/ directory already exists. Use --force to overwrite or run from a different directory.',\n );\n }\n\n // Create .sparn/ directory\n await mkdir(sparnDir, { recursive: true });\n\n // Create config.yaml with defaults\n const configYAML = dumpYAML(DEFAULT_CONFIG, {\n indent: 2,\n lineWidth: 100,\n });\n\n const configWithComments = `# Sparn Configuration\n# See https://github.com/ulrichc1/sparn for documentation\n\n${configYAML}`;\n\n await writeFile(configPath, configWithComments, 'utf8');\n\n // Initialize database\n const memory = await createKVMemory(dbPath);\n await memory.close();\n\n const durationMs = Date.now() - startTime;\n\n return {\n configPath,\n dbPath,\n durationMs,\n };\n}\n\n/**\n * Display init success message with banner.\n *\n * @param result - Init result\n */\nexport function displayInitSuccess(result: InitResult): void {\n console.log(getBanner(VERSION));\n\n console.log(`\\n${brainPink('โ'.repeat(60))}`);\n console.log(brainPink(' ๐ง Sparn Initialized Successfully!'));\n console.log(brainPink('โ'.repeat(60)));\n\n console.log(`\\n ${neuralCyan('Config:')} ${dim(result.configPath)}`);\n console.log(` ${neuralCyan('Database:')} ${dim(result.dbPath)}`);\n console.log(` ${neuralCyan('Time:')} ${dim(`${result.durationMs}ms`)}`);\n\n console.log(\n `\\n ${brainPink('โ')} Run ${neuralCyan(\"'sparn optimize'\")} to start optimizing context!`,\n );\n console.log(`${brainPink('โ'.repeat(60))}\\n`);\n}\n\n/**\n * Check if path exists.\n */\nasync function checkExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Progress indicators for long-running operations.\n * Uses ora spinners with branded colors.\n */\n\nimport ora, { type Ora } from 'ora';\nimport { brainPink, neuralCyan, synapseViolet } from './colors.js';\n\n/**\n * Create a spinner for optimization operations.\n *\n * @param text - Initial spinner text\n * @returns Ora spinner instance\n */\nexport function createOptimizeSpinner(text: string): Ora {\n return ora({\n text,\n color: 'cyan',\n spinner: 'dots12',\n });\n}\n\n/**\n * Create a spinner for memory consolidation.\n *\n * @param text - Initial spinner text\n * @returns Ora spinner instance\n */\nexport function createConsolidateSpinner(text: string): Ora {\n return ora({\n text,\n color: 'magenta',\n spinner: 'material',\n });\n}\n\n/**\n * Create a spinner for stats generation.\n *\n * @param text - Initial spinner text\n * @returns Ora spinner instance\n */\nexport function createStatsSpinner(text: string): Ora {\n return ora({\n text,\n color: 'yellow',\n spinner: 'bouncingBar',\n });\n}\n\n/**\n * Create a spinner for initialization.\n *\n * @param text - Initial spinner text\n * @returns Ora spinner instance\n */\nexport function createInitSpinner(text: string): Ora {\n return ora({\n text,\n color: 'green',\n spinner: 'star',\n });\n}\n\n/**\n * Show token savings with visual impact.\n * Displays before โ after with percentage and celebratory message.\n *\n * @param tokensBefore - Tokens before optimization\n * @param tokensAfter - Tokens after optimization\n * @param reduction - Reduction percentage (0.0-1.0)\n */\nexport function showTokenSavings(\n tokensBefore: number,\n tokensAfter: number,\n reduction: number,\n): void {\n const saved = tokensBefore - tokensAfter;\n const reductionPercent = (reduction * 100).toFixed(1);\n\n console.log(`\\n${brainPink('โ'.repeat(60))}`);\n console.log(neuralCyan(' ๐ Token Optimization Results'));\n console.log(brainPink('โ'.repeat(60)));\n\n // Before โ After\n console.log(` ${synapseViolet('Before:')} ${tokensBefore.toLocaleString()} tokens`);\n console.log(` ${neuralCyan('After:')} ${tokensAfter.toLocaleString()} tokens`);\n console.log(brainPink(' โ'.repeat(30)));\n\n // Savings\n console.log(` ${brainPink('Saved:')} ${saved.toLocaleString()} tokens (${reductionPercent}%)`);\n\n // Progress bar\n const barLength = 40;\n const savedBars = Math.floor(reduction * barLength);\n const keptBars = barLength - savedBars;\n const progressBar = neuralCyan('โ'.repeat(keptBars)) + brainPink('โ'.repeat(savedBars));\n console.log(` [${progressBar}] ${reductionPercent}% reduced`);\n\n // Celebratory message\n if (reduction >= 0.9) {\n console.log(`\\n ${brainPink('โจ OUTSTANDING!')} Mind-blowing 90%+ reduction!`);\n } else if (reduction >= 0.7) {\n console.log(`\\n ${neuralCyan('๐ EXCELLENT!')} Strong 70%+ token savings!`);\n } else if (reduction >= 0.5) {\n console.log(`\\n ${synapseViolet('๐ GOOD!')} Solid 50%+ optimization!`);\n } else if (reduction > 0) {\n console.log(`\\n ${neuralCyan('โ')} Tokens optimized successfully!`);\n }\n\n console.log(`${brainPink('โ'.repeat(60))}\\n`);\n}\n\n/**\n * Show consolidation summary with visual impact.\n *\n * @param entriesBefore - Entries before consolidation\n * @param entriesAfter - Entries after consolidation\n * @param decayed - Decayed entries removed\n * @param duplicates - Duplicate entries merged\n * @param durationMs - Duration in milliseconds\n */\nexport function showConsolidationSummary(\n entriesBefore: number,\n entriesAfter: number,\n decayed: number,\n duplicates: number,\n durationMs: number,\n): void {\n const removed = entriesBefore - entriesAfter;\n const compressionRatio = entriesBefore > 0 ? ((removed / entriesBefore) * 100).toFixed(1) : '0.0';\n\n console.log(`\\n${brainPink('โ'.repeat(60))}`);\n console.log(neuralCyan(' ๐งน Memory Consolidation Complete'));\n console.log(brainPink('โ'.repeat(60)));\n\n // Before โ After\n console.log(` ${synapseViolet('Before:')} ${entriesBefore.toLocaleString()} entries`);\n console.log(` ${neuralCyan('After:')} ${entriesAfter.toLocaleString()} entries`);\n console.log(brainPink(' โ'.repeat(30)));\n\n // Details\n console.log(` ${brainPink('Decayed:')} ${decayed.toLocaleString()} removed`);\n console.log(` ${brainPink('Duplicates:')} ${duplicates.toLocaleString()} merged`);\n console.log(` ${neuralCyan('Total:')} ${removed.toLocaleString()} entries freed`);\n console.log(` ${synapseViolet('Time:')} ${durationMs}ms`);\n\n // Progress bar\n const barLength = 40;\n const compressionBars = Math.floor((removed / entriesBefore) * barLength);\n const keptBars = barLength - compressionBars;\n const progressBar = neuralCyan('โ'.repeat(keptBars)) + brainPink('โ'.repeat(compressionBars));\n console.log(` [${progressBar}] ${compressionRatio}% compressed`);\n\n // Celebratory message\n if (removed > 0) {\n console.log(`\\n ${brainPink('โจ')} Memory optimized and ready for peak performance!`);\n } else {\n console.log(`\\n ${neuralCyan('โ')} Memory already optimal!`);\n }\n\n console.log(`${brainPink('โ'.repeat(60))}\\n`);\n}\n\n/**\n * Show initialization success with branded message.\n *\n * @param message - Success message\n */\nexport function showInitSuccess(message: string): void {\n console.log(`\\n${brainPink('โ'.repeat(60))}`);\n console.log(brainPink(' ๐ง Sparn Initialized Successfully!'));\n console.log(brainPink('โ'.repeat(60)));\n console.log(` ${neuralCyan(message)}`);\n console.log(`${brainPink('โ'.repeat(60))}\\n`);\n}\n","/**\n * Content hashing utilities.\n * Uses SHA-256 for deduplication.\n */\n\nimport { createHash } from 'node:crypto';\n\n/**\n * Generate SHA-256 hash of content for deduplication.\n *\n * @param content - Content to hash\n * @returns 64-character hex string (SHA-256)\n *\n * @example\n * ```typescript\n * const hash = hashContent('Hello world');\n * console.log(hash.length); // 64\n * ```\n */\nexport function hashContent(content: string): string {\n return createHash('sha256').update(content, 'utf8').digest('hex');\n}\n","/**\n * BTSP Embedder - Implements behavioral timescale synaptic plasticity\n *\n * Neuroscience: One-shot learning from critical events (errors, conflicts).\n * Application: Detect high-importance patterns and mark for permanent retention.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type { MemoryEntry } from '../types/memory.js';\nimport { hashContent } from '../utils/hash.js';\n\nexport interface BTSPEmbedder {\n /**\n * Detect if content contains BTSP patterns (errors, stack traces, conflicts, git diffs)\n * @param content - Content to analyze\n * @returns True if BTSP pattern detected\n */\n detectBTSP(content: string): boolean;\n\n /**\n * Create a new memory entry marked as BTSP (one-shot learned)\n * @param content - Entry content\n * @param tags - Optional tags\n * @param metadata - Optional metadata\n * @returns BTSP-marked memory entry\n */\n createBTSPEntry(\n content: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n ): MemoryEntry;\n}\n\n/**\n * Create a BTSP embedder instance\n * @returns BTSPEmbedder instance\n */\nexport function createBTSPEmbedder(): BTSPEmbedder {\n // Patterns that indicate critical events\n const BTSP_PATTERNS = [\n // Error patterns\n /\\b(error|exception|failure|fatal|critical|panic)\\b/i,\n /\\b(TypeError|ReferenceError|SyntaxError|RangeError|URIError)\\b/,\n /\\bENOENT|EACCES|ECONNREFUSED|ETIMEDOUT\\b/,\n\n // Stack trace patterns\n /^\\s+at\\s+.*\\(.*:\\d+:\\d+\\)/m, // JavaScript stack trace\n /^\\s+at\\s+.*\\.[a-zA-Z]+:\\d+/m, // Python/Ruby stack trace\n\n // Git diff new files\n /^new file mode \\d+$/m,\n /^--- \\/dev\\/null$/m,\n\n // Merge conflict markers\n /^<<<<<<< /m,\n /^=======/m,\n /^>>>>>>> /m,\n ];\n\n function detectBTSP(content: string): boolean {\n return BTSP_PATTERNS.some((pattern) => pattern.test(content));\n }\n\n function createBTSPEntry(\n content: string,\n tags: string[] = [],\n metadata: Record<string, unknown> = {},\n ): MemoryEntry {\n return {\n id: randomUUID(),\n content,\n hash: hashContent(content),\n timestamp: Date.now(),\n score: 1.0, // Maximum initial score\n ttl: 365 * 24 * 3600, // 1 year in seconds (long retention)\n state: 'active', // Always active\n accessCount: 0,\n tags: [...tags, 'btsp'],\n metadata,\n isBTSP: true,\n };\n }\n\n return {\n detectBTSP,\n createBTSPEntry,\n };\n}\n","/**\n * Confidence States - Implements multi-state synapses\n *\n * Neuroscience: Synapses exist in three states: silent, ready (potentiated), active.\n * Application: Classify memory entries by score into silent/ready/active states.\n */\n\nimport type { ConfidenceState, MemoryEntry, StateDistribution } from '../types/memory.js';\n\nexport interface ConfidenceStatesConfig {\n /** Score threshold for active state (e.g., 0.7) */\n activeThreshold: number;\n /** Score threshold for ready state (e.g., 0.3) */\n readyThreshold: number;\n}\n\nexport interface ConfidenceStates {\n /**\n * Calculate state based on entry score and BTSP flag\n * @param entry - Memory entry\n * @returns Confidence state\n */\n calculateState(entry: MemoryEntry): ConfidenceState;\n\n /**\n * Transition entry to correct state based on its score\n * @param entry - Entry to transition\n * @returns Entry with updated state\n */\n transition(entry: MemoryEntry): MemoryEntry;\n\n /**\n * Get distribution of states across all entries\n * @param entries - All memory entries\n * @returns State distribution with counts\n */\n getDistribution(entries: MemoryEntry[]): StateDistribution;\n}\n\n/**\n * Create a confidence states manager\n * @param config - States configuration\n * @returns ConfidenceStates instance\n */\nexport function createConfidenceStates(config: ConfidenceStatesConfig): ConfidenceStates {\n const { activeThreshold, readyThreshold } = config;\n\n function calculateState(entry: MemoryEntry): ConfidenceState {\n // BTSP entries are always active\n if (entry.isBTSP) {\n return 'active';\n }\n\n // State based on score thresholds\n // Active: score > 0.7\n if (entry.score > activeThreshold) {\n return 'active';\n }\n\n // Ready: 0.3 <= score <= 0.7\n if (entry.score >= readyThreshold) {\n return 'ready';\n }\n\n // Silent: score < 0.3\n return 'silent';\n }\n\n function transition(entry: MemoryEntry): MemoryEntry {\n const newState = calculateState(entry);\n\n return {\n ...entry,\n state: newState,\n };\n }\n\n function getDistribution(entries: MemoryEntry[]): StateDistribution {\n const distribution: StateDistribution = {\n silent: 0,\n ready: 0,\n active: 0,\n total: entries.length,\n };\n\n for (const entry of entries) {\n const state = calculateState(entry);\n distribution[state]++;\n }\n\n return distribution;\n }\n\n return {\n calculateState,\n transition,\n getDistribution,\n };\n}\n","/**\n * Engram Scorer - Implements engram theory (memory decay)\n *\n * Neuroscience: Memories fade over time without reinforcement.\n * Application: Apply exponential decay formula to memory scores based on age and access count.\n *\n * Formula: decay = 1 - e^(-age/TTL)\n * Score adjustment: score_new = score_old * (1 - decay) + (accessCount bonus)\n */\n\nimport type { MemoryEntry } from '../types/memory.js';\n\nexport interface EngramScorerConfig {\n /** Default TTL in hours for new entries */\n defaultTTL: number;\n /** Decay threshold (0.0-1.0) above which entries are marked for pruning */\n decayThreshold: number;\n}\n\nexport interface EngramScorer {\n /**\n * Calculate current score for an entry based on decay and access count\n * @param entry - Memory entry to score\n * @param currentTime - Current timestamp in milliseconds (for testing)\n * @returns Updated score (0.0-1.0)\n */\n calculateScore(entry: MemoryEntry, currentTime?: number): number;\n\n /**\n * Refresh TTL to default value\n * @param entry - Entry to refresh\n * @returns Entry with refreshed TTL and timestamp\n */\n refreshTTL(entry: MemoryEntry): MemoryEntry;\n\n /**\n * Calculate decay factor (0.0-1.0) based on age and TTL\n * @param ageInSeconds - Age of entry in seconds\n * @param ttlInSeconds - TTL in seconds\n * @returns Decay factor (0.0 = fresh, 1.0 = fully decayed)\n */\n calculateDecay(ageInSeconds: number, ttlInSeconds: number): number;\n}\n\n/**\n * Create an engram scorer instance\n * @param config - Scorer configuration\n * @returns EngramScorer instance\n */\nexport function createEngramScorer(config: EngramScorerConfig): EngramScorer {\n const { defaultTTL } = config;\n\n function calculateDecay(ageInSeconds: number, ttlInSeconds: number): number {\n if (ttlInSeconds === 0) return 1.0; // Instant decay\n if (ageInSeconds <= 0) return 0.0; // Fresh entry\n\n // Exponential decay: 1 - e^(-age/TTL)\n const ratio = ageInSeconds / ttlInSeconds;\n const decay = 1 - Math.exp(-ratio);\n\n // Clamp to [0.0, 1.0]\n return Math.max(0, Math.min(1, decay));\n }\n\n function calculateScore(entry: MemoryEntry, currentTime: number = Date.now()): number {\n // Calculate age in seconds\n const ageInMilliseconds = currentTime - entry.timestamp;\n const ageInSeconds = Math.max(0, ageInMilliseconds / 1000);\n\n // Calculate decay factor\n const decay = calculateDecay(ageInSeconds, entry.ttl);\n\n // Base score reduced by decay\n let score = entry.score * (1 - decay);\n\n // Access count bonus (diminishing returns via log)\n if (entry.accessCount > 0) {\n const accessBonus = Math.log(entry.accessCount + 1) * 0.1;\n score = Math.min(1.0, score + accessBonus);\n }\n\n // BTSP entries maintain high score\n if (entry.isBTSP) {\n score = Math.max(score, 0.9);\n }\n\n return Math.max(0, Math.min(1, score));\n }\n\n function refreshTTL(entry: MemoryEntry): MemoryEntry {\n return {\n ...entry,\n ttl: defaultTTL * 3600, // Convert hours to seconds\n timestamp: Date.now(),\n };\n }\n\n return {\n calculateScore,\n refreshTTL,\n calculateDecay,\n };\n}\n","/**\n * Token estimation utilities.\n * Uses whitespace heuristic (~90% accuracy vs GPT tokenizer).\n */\n\n/**\n * Estimate token count for text using heuristic.\n *\n * Approximation: 1 token โ 4 chars or 0.75 words\n * Provides ~90% accuracy compared to GPT tokenizer, sufficient for optimization heuristics.\n *\n * @param text - Text to count\n * @returns Estimated token count\n *\n * @example\n * ```typescript\n * const tokens = estimateTokens('Hello world');\n * console.log(tokens); // ~2\n * ```\n */\nexport function estimateTokens(text: string): number {\n if (!text || text.length === 0) {\n return 0;\n }\n\n // Split on whitespace to get words\n const words = text.split(/\\s+/).filter((w) => w.length > 0);\n const wordCount = words.length;\n\n // Character-based estimate\n const charCount = text.length;\n const charEstimate = Math.ceil(charCount / 4);\n\n // Word-based estimate\n const wordEstimate = Math.ceil(wordCount * 0.75);\n\n // Return the maximum of both estimates (more conservative)\n return Math.max(wordEstimate, charEstimate);\n}\n","/**\n * Sparse Pruner - Implements sparse coding principle\n *\n * Neuroscience: Only 2-5% of neurons fire at any given time.\n * Application: Keep only top 5% most relevant context entries by TF-IDF score.\n */\n\nimport type { MemoryEntry } from '../types/memory.js';\nimport type { PruneResult } from '../types/pruner.js';\nimport { estimateTokens } from '../utils/tokenizer.js';\n\nexport interface SparsePrunerConfig {\n /** Percentage threshold for pruning (e.g., 5 = keep top 5%) */\n threshold: number;\n}\n\nexport interface SparsePruner {\n /**\n * Prune entries to keep only top N% by relevance score\n * @param entries - Memory entries to prune\n * @returns Result with kept/removed entries and token counts\n */\n prune(entries: MemoryEntry[]): PruneResult;\n\n /**\n * Calculate TF-IDF relevance score for a single entry\n * @param entry - Entry to score\n * @param allEntries - All entries for IDF calculation\n * @returns Relevance score (0.0-1.0)\n */\n scoreEntry(entry: MemoryEntry, allEntries: MemoryEntry[]): number;\n}\n\n/**\n * Create a sparse pruner instance\n * @param config - Pruner configuration\n * @returns SparsePruner instance\n */\nexport function createSparsePruner(config: SparsePrunerConfig): SparsePruner {\n const { threshold } = config;\n\n function tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .split(/\\s+/)\n .filter((word) => word.length > 0);\n }\n\n function calculateTF(term: string, tokens: string[]): number {\n const count = tokens.filter((t) => t === term).length;\n // Sqrt capping to prevent common words from dominating\n return Math.sqrt(count);\n }\n\n function calculateIDF(term: string, allEntries: MemoryEntry[]): number {\n const totalDocs = allEntries.length;\n const docsWithTerm = allEntries.filter((entry) => {\n const tokens = tokenize(entry.content);\n return tokens.includes(term);\n }).length;\n\n if (docsWithTerm === 0) return 0;\n\n return Math.log(totalDocs / docsWithTerm);\n }\n\n function scoreEntry(entry: MemoryEntry, allEntries: MemoryEntry[]): number {\n const tokens = tokenize(entry.content);\n if (tokens.length === 0) return 0;\n\n const uniqueTerms = [...new Set(tokens)];\n let totalScore = 0;\n\n for (const term of uniqueTerms) {\n const tf = calculateTF(term, tokens);\n const idf = calculateIDF(term, allEntries);\n totalScore += tf * idf;\n }\n\n // Normalize by entry length\n return totalScore / tokens.length;\n }\n\n function prune(entries: MemoryEntry[]): PruneResult {\n if (entries.length === 0) {\n return {\n kept: [],\n removed: [],\n originalTokens: 0,\n prunedTokens: 0,\n };\n }\n\n // Calculate original token count\n const originalTokens = entries.reduce((sum, e) => sum + estimateTokens(e.content), 0);\n\n // Score all entries\n const scored = entries.map((entry) => ({\n entry,\n score: scoreEntry(entry, entries),\n }));\n\n // Sort by score descending\n scored.sort((a, b) => b.score - a.score);\n\n // Keep top N% (minimum 1 entry)\n const keepCount = Math.max(1, Math.ceil(entries.length * (threshold / 100)));\n const kept = scored.slice(0, keepCount).map((s) => s.entry);\n const removed = scored.slice(keepCount).map((s) => s.entry);\n\n // Calculate pruned token count\n const prunedTokens = kept.reduce((sum, e) => sum + estimateTokens(e.content), 0);\n\n return {\n kept,\n removed,\n originalTokens,\n prunedTokens,\n };\n }\n\n return {\n prune,\n scoreEntry,\n };\n}\n","/**\n * Generic Adapter - Agent-agnostic optimization pipeline\n *\n * Orchestrates all 6 neuroscience modules to optimize context memory.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport { createBTSPEmbedder } from '../core/btsp-embedder.js';\nimport { createConfidenceStates } from '../core/confidence-states.js';\nimport { createEngramScorer } from '../core/engram-scorer.js';\nimport type { KVMemory } from '../core/kv-memory.js';\nimport { createSparsePruner } from '../core/sparse-pruner.js';\nimport type { AgentAdapter, OptimizationResult, OptimizeOptions } from '../types/adapter.js';\nimport type { SparnConfig } from '../types/config.js';\nimport type { MemoryEntry } from '../types/memory.js';\nimport { hashContent } from '../utils/hash.js';\nimport { estimateTokens } from '../utils/tokenizer.js';\n\n/**\n * Create a generic adapter instance\n * @param memory - KV memory store\n * @param config - Sparn configuration\n * @returns AgentAdapter instance\n */\nexport function createGenericAdapter(memory: KVMemory, config: SparnConfig): AgentAdapter {\n const pruner = createSparsePruner(config.pruning);\n const scorer = createEngramScorer(config.decay);\n const states = createConfidenceStates(config.states);\n const btsp = createBTSPEmbedder();\n\n async function optimize(\n context: string,\n options: OptimizeOptions = {},\n ): Promise<OptimizationResult> {\n const startTime = Date.now();\n\n // Parse context into entries (line-based for simplicity)\n const lines = context.split('\\n').filter((line) => line.trim().length > 0);\n const entries: MemoryEntry[] = lines.map((content) => ({\n id: randomUUID(),\n content,\n hash: hashContent(content),\n timestamp: Date.now(),\n score: btsp.detectBTSP(content) ? 1.0 : 0.5, // BTSP gets high initial score\n ttl: config.decay.defaultTTL * 3600, // Convert hours to seconds\n state: 'ready' as const,\n accessCount: 0,\n tags: [],\n metadata: {},\n isBTSP: btsp.detectBTSP(content),\n }));\n\n // Calculate original token count\n const tokensBefore = entries.reduce((sum, e) => sum + estimateTokens(e.content), 0);\n\n // Step 1: Update scores with decay\n const scoredEntries = entries.map((entry) => ({\n ...entry,\n score: scorer.calculateScore(entry),\n }));\n\n // Step 2: Transition states based on scores\n const statedEntries = scoredEntries.map((entry) => states.transition(entry));\n\n // Step 3: Apply sparse pruning\n const pruneResult = pruner.prune(statedEntries);\n\n // Step 4: Keep active and ready entries, discard silent\n const optimizedEntries = pruneResult.kept.filter(\n (e) => e.state === 'active' || e.state === 'ready',\n );\n\n // Calculate final token count\n const tokensAfter = optimizedEntries.reduce((sum, e) => sum + estimateTokens(e.content), 0);\n\n // Reconstruct optimized context\n const optimizedContext = optimizedEntries.map((e) => e.content).join('\\n');\n\n // Store entries in memory (if not dry run)\n if (!options.dryRun) {\n for (const entry of optimizedEntries) {\n await memory.put(entry);\n }\n\n // Record optimization statistics\n await memory.recordOptimization({\n timestamp: Date.now(),\n tokens_before: tokensBefore,\n tokens_after: tokensAfter,\n entries_pruned: entries.length - optimizedEntries.length,\n duration_ms: Date.now() - startTime,\n });\n }\n\n // Get state distribution\n const distribution = states.getDistribution(optimizedEntries);\n\n const result: OptimizationResult = {\n optimizedContext,\n tokensBefore,\n tokensAfter,\n reduction: tokensBefore > 0 ? (tokensBefore - tokensAfter) / tokensBefore : 0,\n entriesProcessed: entries.length,\n entriesKept: optimizedEntries.length,\n stateDistribution: distribution,\n durationMs: Date.now() - startTime,\n };\n\n // Add verbose details if requested\n if (options.verbose) {\n result.details = optimizedEntries.map((e) => ({\n id: e.id,\n score: e.score,\n state: e.state,\n isBTSP: e.isBTSP,\n tokens: estimateTokens(e.content),\n }));\n }\n\n return result;\n }\n\n return {\n optimize,\n };\n}\n","/**\n * Optimize Command - Apply neuroscience-inspired optimization to context\n */\n\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { createGenericAdapter } from '../../adapters/generic.js';\nimport type { KVMemory } from '../../core/kv-memory.js';\nimport type { OptimizationResult } from '../../types/adapter.js';\nimport { DEFAULT_CONFIG } from '../../types/config.js';\n\nexport interface OptimizeCommandOptions {\n /** Input context (if not provided, reads from stdin) */\n input?: string;\n /** Input file path */\n inputFile?: string;\n /** Output file path (if not provided, writes to stdout) */\n outputFile?: string;\n /** Memory store instance */\n memory: KVMemory;\n /** Dry run mode (don't save to memory) */\n dryRun?: boolean;\n /** Verbose mode (show per-entry details) */\n verbose?: boolean;\n}\n\nexport interface OptimizeCommandResult extends OptimizationResult {\n output: string;\n outputFile?: string;\n}\n\n/**\n * Execute the optimize command\n * @param options - Command options\n * @returns Optimization result\n */\nexport async function optimizeCommand(\n options: OptimizeCommandOptions,\n): Promise<OptimizeCommandResult> {\n const { memory, dryRun = false, verbose = false } = options;\n\n // Read input from file or direct input\n let input: string;\n if (options.inputFile) {\n input = await readFile(options.inputFile, 'utf-8');\n } else if (options.input) {\n input = options.input;\n } else {\n throw new Error('No input provided. Use --input or --input-file');\n }\n\n // Create adapter and optimize\n const adapter = createGenericAdapter(memory, DEFAULT_CONFIG);\n const result = await adapter.optimize(input, { dryRun, verbose });\n\n // Write output to file or return\n if (options.outputFile) {\n await writeFile(options.outputFile, result.optimizedContext, 'utf-8');\n }\n\n return {\n ...result,\n output: result.optimizedContext,\n outputFile: options.outputFile,\n };\n}\n","/**\n * Stats Command - View optimization statistics\n */\n\nimport type { KVMemory } from '../../core/kv-memory.js';\n\nexport interface StatsCommandOptions {\n /** Memory store instance */\n memory: KVMemory;\n /** Display ASCII bar chart */\n graph?: boolean;\n /** Reset statistics */\n reset?: boolean;\n /** Auto-confirm reset (for testing) */\n confirmReset?: boolean;\n /** Output JSON format */\n json?: boolean;\n}\n\nexport interface StatsCommandResult {\n /** Total number of optimization commands run */\n totalCommands: number;\n /** Total tokens saved across all optimizations */\n totalTokensSaved: number;\n /** Average reduction percentage (0.0-1.0) */\n averageReduction: number;\n /** ASCII bar chart (if graph=true) */\n graph?: string;\n /** JSON output (if json=true) */\n json?: string;\n /** Reset was confirmed (if reset=true) */\n resetConfirmed?: boolean;\n}\n\n/**\n * Execute the stats command\n * @param options - Command options\n * @returns Statistics result\n */\nexport async function statsCommand(options: StatsCommandOptions): Promise<StatsCommandResult> {\n const { memory, graph, reset, confirmReset, json } = options;\n\n // Handle reset\n if (reset) {\n if (confirmReset) {\n await memory.clearOptimizationStats();\n return {\n totalCommands: 0,\n totalTokensSaved: 0,\n averageReduction: 0,\n resetConfirmed: true,\n };\n }\n }\n\n // Get optimization stats from database\n const stats = await memory.getOptimizationStats();\n\n // Calculate aggregations\n const totalCommands = stats.length;\n\n const totalTokensSaved = stats.reduce((sum, s) => sum + (s.tokens_before - s.tokens_after), 0);\n\n const averageReduction =\n totalCommands > 0\n ? stats.reduce((sum, s) => {\n const reduction =\n s.tokens_before > 0 ? (s.tokens_before - s.tokens_after) / s.tokens_before : 0;\n return sum + reduction;\n }, 0) / totalCommands\n : 0;\n\n const result: StatsCommandResult = {\n totalCommands,\n totalTokensSaved,\n averageReduction,\n };\n\n // Generate ASCII bar chart if requested\n if (graph && totalCommands > 0) {\n result.graph = generateBarChart(stats);\n }\n\n // Generate JSON output if requested\n if (json) {\n result.json = JSON.stringify(\n {\n totalCommands,\n totalTokensSaved,\n averageReduction: Math.round(averageReduction * 1000) / 10, // Convert to percentage\n optimizations: stats.map((s) => ({\n timestamp: s.timestamp,\n tokensBefore: s.tokens_before,\n tokensAfter: s.tokens_after,\n entriesPruned: s.entries_pruned,\n durationMs: s.duration_ms,\n reduction: Math.round(((s.tokens_before - s.tokens_after) / s.tokens_before) * 1000) / 10,\n })),\n },\n null,\n 2,\n );\n }\n\n return result;\n}\n\n/**\n * Generate ASCII bar chart for optimization history\n * @param stats - Optimization statistics\n * @returns ASCII bar chart string\n */\nfunction generateBarChart(\n stats: Array<{ tokens_before: number; tokens_after: number; timestamp: number }>,\n): string {\n const maxBars = 20; // Maximum number of bars to display\n const recentStats = stats.slice(0, maxBars);\n\n const lines: string[] = [];\n lines.push('\\nOptimization History (most recent first):\\n');\n\n // Find max reduction for scaling\n const maxReduction = Math.max(...recentStats.map((s) => s.tokens_before - s.tokens_after));\n\n for (let i = 0; i < recentStats.length; i++) {\n const s = recentStats[i];\n if (!s) continue; // Skip undefined entries\n\n const reduction = s.tokens_before - s.tokens_after;\n const reductionPct = s.tokens_before > 0 ? (reduction / s.tokens_before) * 100 : 0;\n\n // Scale bar length (max 40 chars)\n const barLength = Math.round((reduction / maxReduction) * 40);\n const bar = 'โ'.repeat(barLength);\n\n // Format timestamp\n const date = new Date(s.timestamp);\n const timeStr = date.toLocaleTimeString();\n\n lines.push(`${timeStr} โ ${bar} ${reductionPct.toFixed(1)}%`);\n }\n\n return lines.join('\\n');\n}\n","/**\n * Relay Command - Proxy CLI commands through optimization\n */\n\nimport { spawn } from 'node:child_process';\nimport { createGenericAdapter } from '../../adapters/generic.js';\nimport type { KVMemory } from '../../core/kv-memory.js';\nimport { DEFAULT_CONFIG } from '../../types/config.js';\n\nexport interface RelayCommandOptions {\n /** Command to execute */\n command: string;\n /** Command arguments */\n args: string[];\n /** Memory store instance */\n memory: KVMemory;\n /** Silent mode (suppress summary) */\n silent?: boolean;\n}\n\nexport interface RelayCommandResult {\n /** Exit code from proxied command */\n exitCode: number;\n /** Original command output */\n originalOutput: string;\n /** Optimized output */\n optimizedOutput: string;\n /** Original token count */\n tokensBefore: number;\n /** Optimized token count */\n tokensAfter: number;\n /** Token reduction percentage */\n reduction: number;\n /** One-line summary (if not silent) */\n summary?: string;\n}\n\n/**\n * Execute a command and optimize its output\n * @param options - Command options\n * @returns Relay result\n */\nexport async function relayCommand(options: RelayCommandOptions): Promise<RelayCommandResult> {\n const { command, args, memory, silent = false } = options;\n\n // Execute child process and capture output\n const { stdout, stderr, exitCode } = await executeCommand(command, args);\n\n // Combine stdout and stderr\n const originalOutput = stdout + stderr;\n\n // Optimize the output\n const adapter = createGenericAdapter(memory, DEFAULT_CONFIG);\n const optimizationResult = await adapter.optimize(originalOutput, {\n dryRun: true, // Don't save relay outputs to memory\n verbose: false,\n });\n\n const result: RelayCommandResult = {\n exitCode,\n originalOutput,\n optimizedOutput: optimizationResult.optimizedContext,\n tokensBefore: optimizationResult.tokensBefore,\n tokensAfter: optimizationResult.tokensAfter,\n reduction: optimizationResult.reduction,\n };\n\n // Generate summary if not silent\n if (!silent && result.tokensBefore > 0) {\n const reductionPct = (result.reduction * 100).toFixed(1);\n result.summary = `๐ ${result.tokensBefore} โ ${result.tokensAfter} tokens (${reductionPct}% reduction)`;\n }\n\n return result;\n}\n\n/**\n * Execute a command and capture its output\n * @param command - Command to execute\n * @param args - Command arguments\n * @returns Command output and exit code\n */\nfunction executeCommand(\n command: string,\n args: string[],\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n return new Promise((resolve) => {\n const child = spawn(command, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n child.on('close', (code) => {\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 0,\n });\n });\n\n child.on('error', (error) => {\n resolve({\n stdout,\n stderr: error.message,\n exitCode: 1,\n });\n });\n });\n}\n","/**\n * Sleep Compressor - Implements sleep replay principle\n *\n * Neuroscience: During sleep, the brain consolidates memories by replaying important ones\n * and discarding irrelevant information.\n * Application: Periodic consolidation removes decayed entries and merges duplicates.\n */\n\nimport type { ConsolidateResult, DuplicateGroup } from '../types/consolidate.js';\nimport type { MemoryEntry } from '../types/memory.js';\nimport { createEngramScorer } from './engram-scorer.js';\n\nexport interface SleepCompressor {\n /**\n * Consolidate entries: remove decayed, merge duplicates\n * @param entries - All memory entries\n * @returns Consolidation result\n */\n consolidate(entries: MemoryEntry[]): ConsolidateResult;\n\n /**\n * Find duplicate entries (exact hash or near-duplicate by similarity)\n * @param entries - Memory entries\n * @returns Groups of duplicates\n */\n findDuplicates(entries: MemoryEntry[]): DuplicateGroup[];\n\n /**\n * Merge duplicate entries, keeping highest score\n * @param groups - Duplicate groups\n * @returns Merged entries\n */\n mergeDuplicates(groups: DuplicateGroup[]): MemoryEntry[];\n}\n\n/**\n * Create a sleep compressor instance\n * @returns SleepCompressor instance\n */\nexport function createSleepCompressor(): SleepCompressor {\n const scorer = createEngramScorer({ defaultTTL: 24, decayThreshold: 0.95 });\n\n function consolidate(entries: MemoryEntry[]): ConsolidateResult {\n const startTime = Date.now();\n const originalCount = entries.length;\n\n // Step 1: Remove fully decayed entries (decay โฅ 0.95)\n const now = Date.now();\n const nonDecayed = entries.filter((entry) => {\n const ageInSeconds = (now - entry.timestamp) / 1000;\n const decay = scorer.calculateDecay(ageInSeconds, entry.ttl);\n return decay < 0.95; // Keep entries with decay < 0.95\n });\n\n const decayedRemoved = originalCount - nonDecayed.length;\n\n // Step 2: Find and merge duplicates\n const duplicateGroups = findDuplicates(nonDecayed);\n const merged = mergeDuplicates(duplicateGroups);\n\n // Step 3: Keep non-duplicates\n const duplicateIds = new Set(duplicateGroups.flatMap((g) => g.entries.map((e) => e.id)));\n const nonDuplicates = nonDecayed.filter((e) => !duplicateIds.has(e.id));\n\n // Combine merged duplicates with non-duplicates\n const kept = [...merged, ...nonDuplicates];\n const removed = entries.filter((e) => !kept.some((k) => k.id === e.id));\n\n const duplicatesRemoved = duplicateGroups.reduce((sum, g) => sum + (g.entries.length - 1), 0);\n\n return {\n kept,\n removed,\n entriesBefore: originalCount,\n entriesAfter: kept.length,\n decayedRemoved,\n duplicatesRemoved,\n compressionRatio: originalCount > 0 ? kept.length / originalCount : 0,\n durationMs: Date.now() - startTime,\n };\n }\n\n function findDuplicates(entries: MemoryEntry[]): DuplicateGroup[] {\n const groups: DuplicateGroup[] = [];\n const processed = new Set<string>();\n\n // Find exact hash matches\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n if (!entry || processed.has(entry.id)) continue;\n\n const duplicates = entries.filter((e, idx) => idx !== i && e.hash === entry.hash);\n\n if (duplicates.length > 0) {\n const group: DuplicateGroup = {\n entries: [entry, ...duplicates],\n similarity: 1.0, // Exact match\n };\n groups.push(group);\n\n // Mark as processed\n processed.add(entry.id);\n for (const dup of duplicates) {\n processed.add(dup.id);\n }\n }\n }\n\n // Find near-duplicates (cosine similarity โฅ 0.85)\n for (let i = 0; i < entries.length; i++) {\n const entryI = entries[i];\n if (!entryI || processed.has(entryI.id)) continue;\n\n for (let j = i + 1; j < entries.length; j++) {\n const entryJ = entries[j];\n if (!entryJ || processed.has(entryJ.id)) continue;\n\n const similarity = cosineSimilarity(entryI.content, entryJ.content);\n\n if (similarity >= 0.85) {\n const group: DuplicateGroup = {\n entries: [entryI, entryJ],\n similarity,\n };\n groups.push(group);\n\n processed.add(entryI.id);\n processed.add(entryJ.id);\n break; // Move to next i\n }\n }\n }\n\n return groups;\n }\n\n function mergeDuplicates(groups: DuplicateGroup[]): MemoryEntry[] {\n const merged: MemoryEntry[] = [];\n\n for (const group of groups) {\n // Keep entry with highest score\n const sorted = [...group.entries].sort((a, b) => b.score - a.score);\n const best = sorted[0];\n if (!best) continue; // Skip empty groups\n\n // Sum access counts\n const totalAccessCount = group.entries.reduce((sum, e) => sum + e.accessCount, 0);\n\n // Merge tags\n const allTags = new Set(group.entries.flatMap((e) => e.tags));\n\n merged.push({\n ...best,\n accessCount: totalAccessCount,\n tags: Array.from(allTags),\n });\n }\n\n return merged;\n }\n\n /**\n * Calculate cosine similarity between two text strings\n * @param text1 - First text\n * @param text2 - Second text\n * @returns Similarity score (0.0-1.0)\n */\n function cosineSimilarity(text1: string, text2: string): number {\n const words1 = tokenize(text1);\n const words2 = tokenize(text2);\n\n // Build vocabulary\n const vocab = new Set([...words1, ...words2]);\n\n // Build word frequency vectors\n const vec1: Record<string, number> = {};\n const vec2: Record<string, number> = {};\n\n for (const word of vocab) {\n vec1[word] = words1.filter((w) => w === word).length;\n vec2[word] = words2.filter((w) => w === word).length;\n }\n\n // Calculate dot product and magnitudes\n let dotProduct = 0;\n let mag1 = 0;\n let mag2 = 0;\n\n for (const word of vocab) {\n const count1 = vec1[word] ?? 0;\n const count2 = vec2[word] ?? 0;\n dotProduct += count1 * count2;\n mag1 += count1 * count1;\n mag2 += count2 * count2;\n }\n\n mag1 = Math.sqrt(mag1);\n mag2 = Math.sqrt(mag2);\n\n if (mag1 === 0 || mag2 === 0) return 0;\n\n return dotProduct / (mag1 * mag2);\n }\n\n function tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .split(/\\s+/)\n .filter((word) => word.length > 0);\n }\n\n return {\n consolidate,\n findDuplicates,\n mergeDuplicates,\n };\n}\n","/**\n * Consolidate Command - Periodic memory consolidation\n */\n\nimport type { KVMemory } from '../../core/kv-memory.js';\nimport { createSleepCompressor } from '../../core/sleep-compressor.js';\n\nexport interface ConsolidateCommandOptions {\n /** Memory store instance */\n memory: KVMemory;\n}\n\nexport interface ConsolidateCommandResult {\n /** Entries before consolidation */\n entriesBefore: number;\n /** Entries after consolidation */\n entriesAfter: number;\n /** Decayed entries removed */\n decayedRemoved: number;\n /** Duplicate entries merged */\n duplicatesRemoved: number;\n /** Compression ratio (0.0-1.0) */\n compressionRatio: number;\n /** Duration in milliseconds */\n durationMs: number;\n /** VACUUM completed */\n vacuumCompleted: boolean;\n}\n\n/**\n * Execute the consolidate command\n * @param options - Command options\n * @returns Consolidation result\n */\nexport async function consolidateCommand(\n options: ConsolidateCommandOptions,\n): Promise<ConsolidateCommandResult> {\n const { memory } = options;\n\n // Get all entries from memory\n const allIds = await memory.list();\n const allEntries = await Promise.all(\n allIds.map(async (id) => {\n const entry = await memory.get(id);\n return entry;\n }),\n );\n\n // Filter out nulls\n const entries = allEntries.filter((e) => e !== null);\n\n // Run consolidation\n const compressor = createSleepCompressor();\n const result = compressor.consolidate(entries);\n\n // Update memory: remove old entries, keep consolidated ones\n for (const removed of result.removed) {\n await memory.delete(removed.id);\n }\n\n for (const kept of result.kept) {\n await memory.put(kept);\n }\n\n // Run VACUUM to reclaim space\n await memory.compact();\n\n return {\n entriesBefore: result.entriesBefore,\n entriesAfter: result.entriesAfter,\n decayedRemoved: result.decayedRemoved,\n duplicatesRemoved: result.duplicatesRemoved,\n compressionRatio: result.compressionRatio,\n durationMs: result.durationMs,\n vacuumCompleted: true,\n };\n}\n","/**\n * Config Command - View or modify configuration\n */\n\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { load as parseYAML, dump as stringifyYAML } from 'js-yaml';\nimport type { SparnConfig } from '../../types/config.js';\n\nexport interface ConfigCommandOptions {\n /** Path to config.yaml file */\n configPath: string;\n /** Subcommand: get or set */\n subcommand?: 'get' | 'set';\n /** Config key (dotted path) */\n key?: string;\n /** Config value (for set) */\n value?: string;\n /** Output JSON format */\n json?: boolean;\n}\n\nexport interface ConfigCommandResult {\n /** Command succeeded */\n success: boolean;\n /** Result message */\n message?: string;\n /** Error message */\n error?: string;\n /** Retrieved value (for get) */\n value?: unknown;\n /** Editor path (for no subcommand) */\n editorPath?: string;\n /** JSON output */\n json?: string;\n}\n\n/**\n * Valid config keys with their validation rules\n */\nconst CONFIG_SCHEMA: Record<\n string,\n {\n path: string[];\n validate: (value: unknown) => boolean;\n errorMessage: string;\n parse: (value: string) => unknown;\n }\n> = {\n 'pruning.threshold': {\n path: ['pruning', 'threshold'],\n validate: (v) => typeof v === 'number' && v >= 1 && v <= 100,\n errorMessage: 'threshold must be between 1-100',\n parse: (v) => Number.parseInt(v, 10),\n },\n 'pruning.aggressiveness': {\n path: ['pruning', 'aggressiveness'],\n validate: (v) => typeof v === 'number' && v >= 0 && v <= 100,\n errorMessage: 'aggressiveness must be between 0-100',\n parse: (v) => Number.parseInt(v, 10),\n },\n 'decay.defaultTTL': {\n path: ['decay', 'defaultTTL'],\n validate: (v) => typeof v === 'number' && v > 0,\n errorMessage: 'defaultTTL must be a positive number (hours)',\n parse: (v) => Number.parseFloat(v),\n },\n 'decay.decayThreshold': {\n path: ['decay', 'decayThreshold'],\n validate: (v) => typeof v === 'number' && v >= 0.0 && v <= 1.0,\n errorMessage: 'decayThreshold must be between 0.0-1.0',\n parse: (v) => Number.parseFloat(v),\n },\n 'states.activeThreshold': {\n path: ['states', 'activeThreshold'],\n validate: (v) => typeof v === 'number' && v >= 0.0 && v <= 1.0,\n errorMessage: 'activeThreshold must be between 0.0-1.0',\n parse: (v) => Number.parseFloat(v),\n },\n 'states.readyThreshold': {\n path: ['states', 'readyThreshold'],\n validate: (v) => typeof v === 'number' && v >= 0.0 && v <= 1.0,\n errorMessage: 'readyThreshold must be between 0.0-1.0',\n parse: (v) => Number.parseFloat(v),\n },\n agent: {\n path: ['agent'],\n validate: (v) => v === 'claude-code' || v === 'generic',\n errorMessage: 'agent must be \"claude-code\" or \"generic\"',\n parse: (v) => v,\n },\n 'ui.colors': {\n path: ['ui', 'colors'],\n validate: (v) => typeof v === 'boolean',\n errorMessage: 'colors must be true or false',\n parse: (v) => v === 'true',\n },\n 'ui.sounds': {\n path: ['ui', 'sounds'],\n validate: (v) => typeof v === 'boolean',\n errorMessage: 'sounds must be true or false',\n parse: (v) => v === 'true',\n },\n 'ui.verbose': {\n path: ['ui', 'verbose'],\n validate: (v) => typeof v === 'boolean',\n errorMessage: 'verbose must be true or false',\n parse: (v) => v === 'true',\n },\n autoConsolidate: {\n path: ['autoConsolidate'],\n validate: (v) => v === null || (typeof v === 'number' && v > 0),\n errorMessage: 'autoConsolidate must be a positive number (hours) or null',\n parse: (v) => (v === 'null' ? null : Number.parseFloat(v)),\n },\n 'realtime.tokenBudget': {\n path: ['realtime', 'tokenBudget'],\n validate: (v) => typeof v === 'number' && v > 0,\n errorMessage: 'tokenBudget must be a positive number',\n parse: (v) => Number.parseInt(v, 10),\n },\n 'realtime.autoOptimizeThreshold': {\n path: ['realtime', 'autoOptimizeThreshold'],\n validate: (v) => typeof v === 'number' && v > 0,\n errorMessage: 'autoOptimizeThreshold must be a positive number',\n parse: (v) => Number.parseInt(v, 10),\n },\n 'realtime.watchPatterns': {\n path: ['realtime', 'watchPatterns'],\n validate: (v) => Array.isArray(v) && v.every((p) => typeof p === 'string'),\n errorMessage: 'watchPatterns must be an array of strings',\n parse: (v) => v.split(',').map((p) => p.trim()),\n },\n 'realtime.pidFile': {\n path: ['realtime', 'pidFile'],\n validate: (v) => typeof v === 'string' && v.length > 0,\n errorMessage: 'pidFile must be a non-empty string',\n parse: (v) => v,\n },\n 'realtime.logFile': {\n path: ['realtime', 'logFile'],\n validate: (v) => typeof v === 'string' && v.length > 0,\n errorMessage: 'logFile must be a non-empty string',\n parse: (v) => v,\n },\n 'realtime.debounceMs': {\n path: ['realtime', 'debounceMs'],\n validate: (v) => typeof v === 'number' && v >= 0,\n errorMessage: 'debounceMs must be a non-negative number',\n parse: (v) => Number.parseInt(v, 10),\n },\n 'realtime.incremental': {\n path: ['realtime', 'incremental'],\n validate: (v) => typeof v === 'boolean',\n errorMessage: 'incremental must be true or false',\n parse: (v) => v === 'true',\n },\n 'realtime.windowSize': {\n path: ['realtime', 'windowSize'],\n validate: (v) => typeof v === 'number' && v > 0,\n errorMessage: 'windowSize must be a positive number',\n parse: (v) => Number.parseInt(v, 10),\n },\n};\n\n/**\n * Execute the config command\n * @param options - Command options\n * @returns Config result\n */\nexport async function configCommand(options: ConfigCommandOptions): Promise<ConfigCommandResult> {\n const { configPath, subcommand, key, value, json } = options;\n\n try {\n // Read config file\n const configYAML = readFileSync(configPath, 'utf-8');\n const config = parseYAML(configYAML) as SparnConfig;\n\n // No subcommand: open editor or return JSON\n if (!subcommand) {\n if (json) {\n return {\n success: true,\n json: JSON.stringify(config, null, 2),\n };\n }\n return {\n success: true,\n editorPath: configPath,\n message: `Config file: ${configPath}`,\n };\n }\n\n // Get subcommand\n if (subcommand === 'get') {\n if (!key) {\n return {\n success: false,\n error: 'Key required for get command',\n };\n }\n\n const schema = CONFIG_SCHEMA[key];\n if (!schema) {\n return {\n success: false,\n error: `Invalid key: ${key}. Run 'sparn config' to see available keys.`,\n };\n }\n\n const retrievedValue = getNestedValue(\n config as unknown as Record<string, unknown>,\n schema.path,\n );\n\n if (json) {\n return {\n success: true,\n value: retrievedValue,\n json: JSON.stringify({ key, value: retrievedValue }, null, 2),\n };\n }\n\n return {\n success: true,\n value: retrievedValue,\n message: String(retrievedValue),\n };\n }\n\n // Set subcommand\n if (subcommand === 'set') {\n if (!key) {\n return {\n success: false,\n error: 'Key required for set command',\n };\n }\n\n if (value === undefined) {\n return {\n success: false,\n error: 'Value required for set command',\n };\n }\n\n const schema = CONFIG_SCHEMA[key];\n if (!schema) {\n return {\n success: false,\n error: `Invalid key: ${key}. Run 'sparn config' to see available keys.`,\n };\n }\n\n // Parse and validate value\n const parsedValue = schema.parse(value);\n if (!schema.validate(parsedValue)) {\n return {\n success: false,\n error: `Invalid value for ${key}: ${schema.errorMessage}`,\n };\n }\n\n // Update config\n setNestedValue(config as unknown as Record<string, unknown>, schema.path, parsedValue);\n\n // Write back to file\n const updatedYAML = stringifyYAML(config);\n writeFileSync(configPath, updatedYAML, 'utf-8');\n\n return {\n success: true,\n message: `Config updated: ${key} = ${parsedValue}`,\n };\n }\n\n return {\n success: false,\n error: `Unknown subcommand: ${subcommand}`,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Get nested value from object using path array\n * @param obj - Object to query\n * @param path - Path array\n * @returns Nested value\n */\nfunction getNestedValue(obj: Record<string, unknown>, path: string[]): unknown {\n let current: unknown = obj;\n for (const key of path) {\n if (current && typeof current === 'object' && !Array.isArray(current) && key in current) {\n current = (current as Record<string, unknown>)[key];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\n/**\n * Set nested value in object using path array\n * @param obj - Object to mutate\n * @param path - Path array\n * @param value - Value to set\n */\nfunction setNestedValue(obj: Record<string, unknown>, path: string[], value: unknown): void {\n let current: Record<string, unknown> = obj;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (!key) continue;\n\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n const lastKey = path[path.length - 1];\n if (lastKey) {\n current[lastKey] = value;\n }\n}\n","/**\n * Metrics and Telemetry System\n *\n * Tracks performance metrics and optimization statistics:\n * - Optimization duration and throughput\n * - Token savings and reduction rates\n * - Memory usage and cache hit rates\n * - Daemon uptime and session counts\n */\n\nexport interface OptimizationMetric {\n timestamp: number;\n duration: number;\n tokensBefore: number;\n tokensAfter: number;\n entriesProcessed: number;\n entriesKept: number;\n cacheHitRate: number;\n memoryUsage: number;\n}\n\nexport interface DaemonMetric {\n startTime: number;\n sessionsWatched: number;\n totalOptimizations: number;\n totalTokensSaved: number;\n averageLatency: number;\n memoryUsage: number;\n}\n\nexport interface MetricsSnapshot {\n timestamp: number;\n optimization: {\n totalRuns: number;\n totalDuration: number;\n totalTokensSaved: number;\n averageReduction: number;\n p50Latency: number;\n p95Latency: number;\n p99Latency: number;\n };\n cache: {\n hitRate: number;\n totalHits: number;\n totalMisses: number;\n size: number;\n };\n daemon: {\n uptime: number;\n sessionsWatched: number;\n memoryUsage: number;\n };\n}\n\nexport interface MetricsCollector {\n /**\n * Record an optimization metric\n */\n recordOptimization(metric: OptimizationMetric): void;\n\n /**\n * Update daemon metrics\n */\n updateDaemon(metric: Partial<DaemonMetric>): void;\n\n /**\n * Get current metrics snapshot\n */\n getSnapshot(): MetricsSnapshot;\n\n /**\n * Export metrics as JSON\n */\n export(): string;\n\n /**\n * Reset all metrics\n */\n reset(): void;\n}\n\n/**\n * Create a metrics collector instance\n */\nexport function createMetricsCollector(): MetricsCollector {\n const optimizations: OptimizationMetric[] = [];\n let daemonMetrics: DaemonMetric = {\n startTime: Date.now(),\n sessionsWatched: 0,\n totalOptimizations: 0,\n totalTokensSaved: 0,\n averageLatency: 0,\n memoryUsage: 0,\n };\n\n let cacheHits = 0;\n let cacheMisses = 0;\n\n function recordOptimization(metric: OptimizationMetric): void {\n optimizations.push(metric);\n\n // Update daemon totals\n daemonMetrics.totalOptimizations++;\n daemonMetrics.totalTokensSaved += metric.tokensBefore - metric.tokensAfter;\n\n // Update cache stats\n if (metric.cacheHitRate > 0) {\n const hits = Math.round(metric.entriesProcessed * metric.cacheHitRate);\n cacheHits += hits;\n cacheMisses += metric.entriesProcessed - hits;\n }\n\n // Update average latency (moving average)\n daemonMetrics.averageLatency =\n (daemonMetrics.averageLatency * (daemonMetrics.totalOptimizations - 1) + metric.duration) /\n daemonMetrics.totalOptimizations;\n\n // Keep only last 1000 metrics in memory\n if (optimizations.length > 1000) {\n optimizations.shift();\n }\n }\n\n function updateDaemon(metric: Partial<DaemonMetric>): void {\n daemonMetrics = {\n ...daemonMetrics,\n ...metric,\n };\n }\n\n function calculatePercentile(values: number[], percentile: number): number {\n if (values.length === 0) return 0;\n\n const sorted = [...values].sort((a, b) => a - b);\n const index = Math.ceil((percentile / 100) * sorted.length) - 1;\n return sorted[index] || 0;\n }\n\n function getSnapshot(): MetricsSnapshot {\n const totalRuns = optimizations.length;\n const totalDuration = optimizations.reduce((sum, m) => sum + m.duration, 0);\n const totalTokensSaved = optimizations.reduce(\n (sum, m) => sum + (m.tokensBefore - m.tokensAfter),\n 0,\n );\n\n const totalTokensBefore = optimizations.reduce((sum, m) => sum + m.tokensBefore, 0);\n const averageReduction = totalTokensBefore > 0 ? totalTokensSaved / totalTokensBefore : 0;\n\n const durations = optimizations.map((m) => m.duration);\n\n const totalCacheQueries = cacheHits + cacheMisses;\n const hitRate = totalCacheQueries > 0 ? cacheHits / totalCacheQueries : 0;\n\n return {\n timestamp: Date.now(),\n optimization: {\n totalRuns,\n totalDuration,\n totalTokensSaved,\n averageReduction,\n p50Latency: calculatePercentile(durations, 50),\n p95Latency: calculatePercentile(durations, 95),\n p99Latency: calculatePercentile(durations, 99),\n },\n cache: {\n hitRate,\n totalHits: cacheHits,\n totalMisses: cacheMisses,\n size: optimizations.reduce((sum, m) => sum + m.entriesKept, 0),\n },\n daemon: {\n uptime: Date.now() - daemonMetrics.startTime,\n sessionsWatched: daemonMetrics.sessionsWatched,\n memoryUsage: daemonMetrics.memoryUsage,\n },\n };\n }\n\n function exportMetrics(): string {\n return JSON.stringify(getSnapshot(), null, 2);\n }\n\n function reset(): void {\n optimizations.length = 0;\n cacheHits = 0;\n cacheMisses = 0;\n daemonMetrics = {\n startTime: Date.now(),\n sessionsWatched: 0,\n totalOptimizations: 0,\n totalTokensSaved: 0,\n averageLatency: 0,\n memoryUsage: 0,\n };\n }\n\n return {\n recordOptimization,\n updateDaemon,\n getSnapshot,\n export: exportMetrics,\n reset,\n };\n}\n\n// Global metrics instance\nlet globalMetrics: MetricsCollector | null = null;\n\n/**\n * Get or create the global metrics collector\n */\nexport function getMetrics(): MetricsCollector {\n if (!globalMetrics) {\n globalMetrics = createMetricsCollector();\n }\n return globalMetrics;\n}\n","/**\n * Daemon Process Manager - Background process lifecycle management\n *\n * Handles:\n * - Process forking and detachment\n * - PID file management\n * - Signal handling (SIGTERM, SIGINT)\n * - Daemon start/stop/status commands\n */\n\nimport { fork } from 'node:child_process';\nimport { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { getMetrics } from '../core/metrics.js';\nimport type { SparnConfig } from '../types/config.js';\n\nexport interface DaemonCommand {\n /** Start the daemon */\n start(config: SparnConfig): Promise<DaemonStartResult>;\n\n /** Stop the daemon */\n stop(config: SparnConfig): Promise<DaemonStopResult>;\n\n /** Get daemon status */\n status(config: SparnConfig): Promise<DaemonStatusResult>;\n}\n\nexport interface DaemonStartResult {\n success: boolean;\n pid?: number;\n message: string;\n error?: string;\n}\n\nexport interface DaemonStopResult {\n success: boolean;\n message: string;\n error?: string;\n}\n\nexport interface DaemonStatusResult {\n running: boolean;\n pid?: number;\n uptime?: number;\n sessionsWatched?: number;\n tokensSaved?: number;\n message: string;\n}\n\n/**\n * Create daemon command interface\n * @returns DaemonCommand instance\n */\nexport function createDaemonCommand(): DaemonCommand {\n /**\n * Check if daemon is running\n */\n function isDaemonRunning(pidFile: string): { running: boolean; pid?: number } {\n if (!existsSync(pidFile)) {\n return { running: false };\n }\n\n try {\n const pidStr = readFileSync(pidFile, 'utf-8').trim();\n const pid = Number.parseInt(pidStr, 10);\n\n if (Number.isNaN(pid)) {\n return { running: false };\n }\n\n // Check if process exists (cross-platform)\n try {\n process.kill(pid, 0); // Signal 0 checks existence without killing\n return { running: true, pid };\n } catch {\n // Process doesn't exist, clean up stale PID file\n unlinkSync(pidFile);\n return { running: false };\n }\n } catch {\n return { running: false };\n }\n }\n\n /**\n * Write PID file\n */\n function writePidFile(pidFile: string, pid: number): void {\n // Ensure directory exists\n const dir = dirname(pidFile);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(pidFile, String(pid), 'utf-8');\n }\n\n /**\n * Remove PID file\n */\n function removePidFile(pidFile: string): void {\n if (existsSync(pidFile)) {\n unlinkSync(pidFile);\n }\n }\n\n async function start(config: SparnConfig): Promise<DaemonStartResult> {\n const { pidFile, logFile } = config.realtime;\n\n // Check if already running\n const status = isDaemonRunning(pidFile);\n if (status.running) {\n return {\n success: false,\n pid: status.pid,\n message: `Daemon already running (PID ${status.pid})`,\n error: 'Already running',\n };\n }\n\n try {\n // Fork child process (daemon entry point)\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const daemonPath = join(__dirname, 'index.js');\n\n const child = fork(daemonPath, [], {\n detached: true,\n stdio: 'ignore',\n env: {\n ...process.env,\n SPARN_CONFIG: JSON.stringify(config),\n SPARN_PID_FILE: pidFile,\n SPARN_LOG_FILE: logFile,\n },\n });\n\n // Detach from parent\n child.unref();\n\n // Write PID file\n if (child.pid) {\n writePidFile(pidFile, child.pid);\n\n return {\n success: true,\n pid: child.pid,\n message: `Daemon started (PID ${child.pid})`,\n };\n }\n\n return {\n success: false,\n message: 'Failed to start daemon (no PID)',\n error: 'No PID',\n };\n } catch (error) {\n return {\n success: false,\n message: 'Failed to start daemon',\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async function stop(config: SparnConfig): Promise<DaemonStopResult> {\n const { pidFile } = config.realtime;\n\n const status = isDaemonRunning(pidFile);\n\n if (!status.running || !status.pid) {\n return {\n success: true,\n message: 'Daemon not running',\n };\n }\n\n try {\n // Send SIGTERM\n process.kill(status.pid, 'SIGTERM');\n\n // Wait for process to exit (timeout after 5s)\n const maxWait = 5000;\n const interval = 100;\n let waited = 0;\n\n while (waited < maxWait) {\n try {\n process.kill(status.pid, 0);\n // Still running, wait\n await new Promise((resolve) => setTimeout(resolve, interval));\n waited += interval;\n } catch {\n // Process exited\n removePidFile(pidFile);\n return {\n success: true,\n message: `Daemon stopped (PID ${status.pid})`,\n };\n }\n }\n\n // Timeout, force kill\n try {\n process.kill(status.pid, 'SIGKILL');\n removePidFile(pidFile);\n return {\n success: true,\n message: `Daemon force killed (PID ${status.pid})`,\n };\n } catch {\n removePidFile(pidFile);\n return {\n success: true,\n message: `Daemon stopped (PID ${status.pid})`,\n };\n }\n } catch (error) {\n return {\n success: false,\n message: 'Failed to stop daemon',\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async function status(config: SparnConfig): Promise<DaemonStatusResult> {\n const { pidFile } = config.realtime;\n\n const daemonStatus = isDaemonRunning(pidFile);\n\n if (!daemonStatus.running || !daemonStatus.pid) {\n return {\n running: false,\n message: 'Daemon not running',\n };\n }\n\n // Get metrics snapshot\n const metrics = getMetrics().getSnapshot();\n\n return {\n running: true,\n pid: daemonStatus.pid,\n uptime: metrics.daemon.uptime,\n sessionsWatched: metrics.daemon.sessionsWatched,\n tokensSaved: metrics.optimization.totalTokensSaved,\n message: `Daemon running (PID ${daemonStatus.pid})`,\n };\n }\n\n return {\n start,\n stop,\n status,\n };\n}\n","/**\n * Hooks Command - Install/uninstall/status for Claude Code hooks\n *\n * Manages hook integration with Claude Code's settings.json file.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface HooksCommandOptions {\n /** Subcommand: install, uninstall, or status */\n subcommand: 'install' | 'uninstall' | 'status';\n /** Install globally (for all projects) */\n global?: boolean;\n}\n\nexport interface HooksCommandResult {\n success: boolean;\n message: string;\n error?: string;\n installed?: boolean;\n hookPaths?: {\n prePrompt: string;\n postToolResult: string;\n };\n}\n\n/**\n * Execute the hooks command\n * @param options - Command options\n * @returns Hooks result\n */\nexport async function hooksCommand(options: HooksCommandOptions): Promise<HooksCommandResult> {\n const { subcommand, global } = options;\n\n // Determine settings.json path\n const settingsPath = global\n ? join(homedir(), '.claude', 'settings.json')\n : join(process.cwd(), '.claude', 'settings.json');\n\n // Determine hook script paths (installed package location)\n // When bundled, this code runs from dist/cli/index.js\n // So hooks are at dist/hooks (one level up from cli, then into hooks)\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const hooksDir = join(dirname(__dirname), 'hooks');\n const prePromptPath = join(hooksDir, 'pre-prompt.js');\n const postToolResultPath = join(hooksDir, 'post-tool-result.js');\n\n switch (subcommand) {\n case 'install':\n return await installHooks(settingsPath, prePromptPath, postToolResultPath, global);\n case 'uninstall':\n return await uninstallHooks(settingsPath, global);\n case 'status':\n return await hooksStatus(settingsPath, global);\n default:\n return {\n success: false,\n message: `Unknown subcommand: ${subcommand}`,\n error: 'Invalid subcommand',\n };\n }\n}\n\n/**\n * Install hooks into settings.json\n */\nasync function installHooks(\n settingsPath: string,\n prePromptPath: string,\n postToolResultPath: string,\n global?: boolean,\n): Promise<HooksCommandResult> {\n try {\n // Verify hook files exist\n if (!existsSync(prePromptPath)) {\n return {\n success: false,\n message: `Hook script not found: ${prePromptPath}`,\n error: 'Hook scripts not built. Run `npm run build` first.',\n };\n }\n\n if (!existsSync(postToolResultPath)) {\n return {\n success: false,\n message: `Hook script not found: ${postToolResultPath}`,\n error: 'Hook scripts not built. Run `npm run build` first.',\n };\n }\n\n // Read or create settings.json\n let settings: Record<string, unknown> = {};\n\n if (existsSync(settingsPath)) {\n const settingsJson = readFileSync(settingsPath, 'utf-8');\n settings = JSON.parse(settingsJson);\n } else {\n // Create .claude directory if needed\n const claudeDir = dirname(settingsPath);\n if (!existsSync(claudeDir)) {\n mkdirSync(claudeDir, { recursive: true });\n }\n }\n\n // Add hooks to settings (Claude Code 2.1+ uses camelCase)\n settings['hooks'] = {\n ...(typeof settings['hooks'] === 'object' && settings['hooks'] !== null\n ? settings['hooks']\n : {}),\n prePrompt: `node ${prePromptPath}`,\n postToolResult: `node ${postToolResultPath}`,\n };\n\n // Write settings.json\n writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');\n\n return {\n success: true,\n message: global\n ? 'Hooks installed globally (all projects)'\n : 'Hooks installed for current project',\n installed: true,\n hookPaths: {\n prePrompt: prePromptPath,\n postToolResult: postToolResultPath,\n },\n };\n } catch (error) {\n return {\n success: false,\n message: 'Failed to install hooks',\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Uninstall hooks from settings.json\n */\nasync function uninstallHooks(settingsPath: string, global?: boolean): Promise<HooksCommandResult> {\n try {\n if (!existsSync(settingsPath)) {\n return {\n success: true,\n message: 'No hooks installed (settings.json not found)',\n installed: false,\n };\n }\n\n // Read settings.json\n const settingsJson = readFileSync(settingsPath, 'utf-8');\n const settings: Record<string, unknown> = JSON.parse(settingsJson);\n\n // Remove hooks (Claude Code 2.1+ uses camelCase)\n if (settings['hooks'] && typeof settings['hooks'] === 'object' && settings['hooks'] !== null) {\n const hooks = settings['hooks'] as Record<string, unknown>;\n delete hooks['prePrompt'];\n delete hooks['postToolResult'];\n\n // Remove hooks object if empty\n if (Object.keys(hooks).length === 0) {\n delete settings['hooks'];\n }\n }\n\n // Write settings.json\n writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');\n\n return {\n success: true,\n message: global ? 'Hooks uninstalled globally' : 'Hooks uninstalled from current project',\n installed: false,\n };\n } catch (error) {\n return {\n success: false,\n message: 'Failed to uninstall hooks',\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Check hooks installation status\n */\nasync function hooksStatus(settingsPath: string, global?: boolean): Promise<HooksCommandResult> {\n try {\n if (!existsSync(settingsPath)) {\n return {\n success: true,\n message: global\n ? 'No global hooks installed (settings.json not found)'\n : 'No project hooks installed (settings.json not found)',\n installed: false,\n };\n }\n\n // Read settings.json\n const settingsJson = readFileSync(settingsPath, 'utf-8');\n const settings: Record<string, unknown> = JSON.parse(settingsJson);\n\n // Check if hooks are installed (Claude Code 2.1+ uses camelCase)\n const hasHooks =\n settings['hooks'] &&\n typeof settings['hooks'] === 'object' &&\n settings['hooks'] !== null &&\n 'prePrompt' in settings['hooks'] &&\n 'postToolResult' in settings['hooks'];\n\n if (!hasHooks) {\n return {\n success: true,\n message: global ? 'No global hooks installed' : 'No project hooks installed',\n installed: false,\n };\n }\n\n const hooks = settings['hooks'] as Record<string, string>;\n\n return {\n success: true,\n message: global ? 'Global hooks active' : 'Project hooks active',\n installed: true,\n hookPaths: {\n prePrompt: hooks['prePrompt'] || '',\n postToolResult: hooks['postToolResult'] || '',\n },\n };\n } catch (error) {\n return {\n success: false,\n message: 'Failed to check hooks status',\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n","/**\n * Interactive Command - Conversational configuration and exploration\n */\n\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { confirm, input, number, select } from '@inquirer/prompts';\nimport { load as parseYAML, dump as stringifyYAML } from 'js-yaml';\nimport type { KVMemory } from '../../core/kv-memory.js';\nimport { getMetrics } from '../../core/metrics.js';\nimport type { SparnConfig } from '../../types/config.js';\nimport { brainPink, dim, errorRed, neuralCyan, synapseViolet } from '../ui/colors.js';\n\nexport interface InteractiveCommandOptions {\n /** Memory store instance */\n memory: KVMemory;\n /** Path to config file */\n configPath: string;\n}\n\nexport interface InteractiveCommandResult {\n /** Whether user exited normally */\n success: boolean;\n /** Optional message */\n message?: string;\n}\n\n/**\n * Display welcome banner\n */\nfunction showWelcomeBanner(): void {\n console.log(brainPink('\\nโ'.repeat(60)));\n console.log(brainPink(' ๐ง Sparn Interactive Mode'));\n console.log(brainPink('โ'.repeat(60)));\n console.log(dim(' Conversational configuration and exploration\\n'));\n}\n\n/**\n * Display main menu\n */\nasync function showMainMenu(): Promise<string> {\n return select({\n message: 'What would you like to do?',\n choices: [\n {\n name: 'โ๏ธ Configure Settings',\n value: 'configure',\n description: 'Guided configuration wizard',\n },\n {\n name: '๐ Optimize Preview',\n value: 'preview',\n description: 'Preview optimization with confirmation',\n },\n {\n name: '๐ Stats Dashboard',\n value: 'stats',\n description: 'View metrics and performance data',\n },\n {\n name: '๐งน Memory Consolidation',\n value: 'consolidate',\n description: 'Clean up decayed entries and duplicates',\n },\n {\n name: '๐ Quick Actions',\n value: 'quick',\n description: 'Common tasks and shortcuts',\n },\n {\n name: 'โ Exit',\n value: 'exit',\n description: 'Return to shell',\n },\n ],\n });\n}\n\n/**\n * Configuration wizard\n */\nasync function configureWizard(configPath: string): Promise<void> {\n console.log(neuralCyan('\\n๐ Configuration Wizard\\n'));\n\n // Load current config\n const configYAML = readFileSync(configPath, 'utf-8');\n const config = parseYAML(configYAML) as SparnConfig;\n\n const section = await select({\n message: 'Which settings would you like to configure?',\n choices: [\n { name: '๐ช Pruning (Sparse Coding)', value: 'pruning' },\n { name: 'โณ Decay (Engram Theory)', value: 'decay' },\n { name: '๐ฏ States (Multi-State Synapses)', value: 'states' },\n { name: 'โก Real-time Optimization', value: 'realtime' },\n { name: '๐จ UI Preferences', value: 'ui' },\n { name: 'โ Back to Main Menu', value: 'back' },\n ],\n });\n\n if (section === 'back') return;\n\n switch (section) {\n case 'pruning': {\n console.log(synapseViolet('\\n๐ช Pruning Configuration'));\n console.log(dim('Sparse coding: Keep only the most relevant context\\n'));\n\n const threshold = await number({\n message: 'Pruning threshold (percentage of entries to keep):',\n default: config.pruning.threshold,\n min: 1,\n max: 100,\n });\n\n const aggressiveness = await number({\n message: 'Aggressiveness (0-100, affects TF-IDF weighting):',\n default: config.pruning.aggressiveness,\n min: 0,\n max: 100,\n });\n\n config.pruning.threshold = threshold ?? config.pruning.threshold;\n config.pruning.aggressiveness = aggressiveness ?? config.pruning.aggressiveness;\n\n console.log(neuralCyan('\\nโ Pruning settings updated'));\n break;\n }\n\n case 'decay': {\n console.log(synapseViolet('\\nโณ Decay Configuration'));\n console.log(dim('Engram theory: Apply time-based decay to memories\\n'));\n\n const defaultTTL = await number({\n message: 'Default TTL in hours:',\n default: config.decay.defaultTTL,\n min: 1,\n });\n\n const decayThreshold = await number({\n message: 'Decay threshold (0.0-1.0, entries below this are pruned):',\n default: config.decay.decayThreshold,\n min: 0,\n max: 1,\n step: 0.05,\n });\n\n config.decay.defaultTTL = defaultTTL ?? config.decay.defaultTTL;\n config.decay.decayThreshold = decayThreshold ?? config.decay.decayThreshold;\n\n console.log(neuralCyan('\\nโ Decay settings updated'));\n break;\n }\n\n case 'states': {\n console.log(synapseViolet('\\n๐ฏ State Threshold Configuration'));\n console.log(dim('Multi-state synapses: Classify entries as active/ready/silent\\n'));\n\n const activeThreshold = await number({\n message: 'Active state threshold (0.0-1.0):',\n default: config.states.activeThreshold,\n min: 0,\n max: 1,\n step: 0.05,\n });\n\n const readyThreshold = await number({\n message: 'Ready state threshold (0.0-1.0):',\n default: config.states.readyThreshold,\n min: 0,\n max: 1,\n step: 0.05,\n });\n\n config.states.activeThreshold = activeThreshold ?? config.states.activeThreshold;\n config.states.readyThreshold = readyThreshold ?? config.states.readyThreshold;\n\n console.log(neuralCyan('\\nโ State settings updated'));\n break;\n }\n\n case 'realtime': {\n console.log(synapseViolet('\\nโก Real-time Optimization Configuration'));\n console.log(dim('Daemon settings for automatic optimization\\n'));\n\n const tokenBudget = await number({\n message: 'Target token budget:',\n default: config.realtime.tokenBudget,\n min: 1000,\n });\n\n const autoOptimizeThreshold = await number({\n message: 'Auto-optimize threshold (triggers optimization):',\n default: config.realtime.autoOptimizeThreshold,\n min: 1000,\n });\n\n const windowSize = await number({\n message: 'Sliding window size (entries):',\n default: config.realtime.windowSize,\n min: 100,\n });\n\n const incremental = await confirm({\n message: 'Enable incremental optimization (faster delta processing)?',\n default: config.realtime.incremental,\n });\n\n config.realtime.tokenBudget = tokenBudget ?? config.realtime.tokenBudget;\n config.realtime.autoOptimizeThreshold =\n autoOptimizeThreshold ?? config.realtime.autoOptimizeThreshold;\n config.realtime.windowSize = windowSize ?? config.realtime.windowSize;\n config.realtime.incremental = incremental;\n\n console.log(neuralCyan('\\nโ Real-time settings updated'));\n break;\n }\n\n case 'ui': {\n console.log(synapseViolet('\\n๐จ UI Preferences'));\n console.log(dim('Customize terminal output\\n'));\n\n const colors = await confirm({\n message: 'Enable colored output?',\n default: config.ui.colors,\n });\n\n const verbose = await confirm({\n message: 'Enable verbose logging?',\n default: config.ui.verbose,\n });\n\n config.ui.colors = colors;\n config.ui.verbose = verbose;\n\n console.log(neuralCyan('\\nโ UI settings updated'));\n break;\n }\n }\n\n // Save config\n const updatedYAML = stringifyYAML(config);\n writeFileSync(configPath, updatedYAML, 'utf-8');\n console.log(neuralCyan(`\\n๐พ Configuration saved to ${configPath}\\n`));\n}\n\n/**\n * Optimization preview with confirmation\n */\nasync function optimizePreview(memory: KVMemory): Promise<void> {\n console.log(neuralCyan('\\n๐ Optimization Preview\\n'));\n\n const inputFile = await input({\n message: 'Input file path (or press Enter to skip):',\n default: '',\n });\n\n if (!inputFile) {\n console.log(dim('\\nNo file specified. Returning to menu.\\n'));\n return;\n }\n\n try {\n // Read file\n const content = readFileSync(resolve(process.cwd(), inputFile), 'utf-8');\n const tokensBefore = Math.ceil(content.length / 4); // Rough estimate\n\n console.log(synapseViolet('\\n๐ File Preview:'));\n console.log(dim(` Length: ${content.length} characters`));\n console.log(dim(` Estimated tokens: ${tokensBefore.toLocaleString()}\\n`));\n\n const shouldOptimize = await confirm({\n message: 'Proceed with optimization?',\n default: true,\n });\n\n if (!shouldOptimize) {\n console.log(dim('\\nOptimization cancelled.\\n'));\n return;\n }\n\n // Run optimization (simplified version)\n console.log(neuralCyan('\\nโก Optimizing...\\n'));\n\n // Lazy-load optimizer\n const { optimizeCommand } = await import('./optimize.js');\n\n const result = await optimizeCommand({\n inputFile,\n memory,\n dryRun: false,\n verbose: false,\n });\n\n console.log(neuralCyan(`\\nโ Optimization complete in ${result.durationMs}ms!`));\n console.log(synapseViolet(` Tokens: ${result.tokensBefore} โ ${result.tokensAfter}`));\n console.log(\n brainPink(\n ` Saved: ${result.tokensBefore - result.tokensAfter} tokens (${(result.reduction * 100).toFixed(1)}%)\\n`,\n ),\n );\n\n const saveOutput = await confirm({\n message: 'Save optimized output to file?',\n default: false,\n });\n\n if (saveOutput) {\n const outputFile = await input({\n message: 'Output file path:',\n default: inputFile.replace(/(\\.[^.]+)$/, '.optimized$1'),\n });\n\n writeFileSync(resolve(process.cwd(), outputFile), result.output, 'utf-8');\n console.log(neuralCyan(`\\n๐พ Saved to ${outputFile}\\n`));\n }\n } catch (error) {\n console.error(errorRed('\\nโ Error:'), error instanceof Error ? error.message : String(error));\n console.log();\n }\n}\n\n/**\n * Stats dashboard with detailed metrics\n */\nasync function showStatsDashboard(memory: KVMemory): Promise<void> {\n console.log(neuralCyan('\\n๐ Stats Dashboard\\n'));\n\n const view = await select({\n message: 'Select view:',\n choices: [\n { name: '๐ Optimization History', value: 'history' },\n { name: 'โก Real-time Metrics', value: 'realtime' },\n { name: '๐พ Memory Statistics', value: 'memory' },\n { name: 'โ Back to Main Menu', value: 'back' },\n ],\n });\n\n if (view === 'back') return;\n\n switch (view) {\n case 'history': {\n const stats = await memory.getOptimizationStats();\n const totalRuns = stats.length;\n const totalTokensSaved = stats.reduce(\n (sum, s) => sum + (s.tokens_before - s.tokens_after),\n 0,\n );\n const avgReduction =\n totalRuns > 0\n ? stats.reduce((sum, s) => {\n return (\n sum +\n (s.tokens_before > 0 ? (s.tokens_before - s.tokens_after) / s.tokens_before : 0)\n );\n }, 0) / totalRuns\n : 0;\n\n console.log(brainPink('\\nโ'.repeat(60)));\n console.log(neuralCyan(' ๐ Optimization History'));\n console.log(brainPink('โ'.repeat(60)));\n console.log(` ${synapseViolet('Total runs:')} ${totalRuns.toLocaleString()}`);\n console.log(` ${synapseViolet('Tokens saved:')} ${totalTokensSaved.toLocaleString()}`);\n console.log(` ${synapseViolet('Avg reduction:')} ${(avgReduction * 100).toFixed(1)}%`);\n\n if (totalRuns > 0) {\n console.log(`\\n ${dim('Recent optimizations:')}`);\n const recent = stats.slice(0, 5);\n for (const stat of recent) {\n const date = new Date(stat.timestamp).toLocaleString();\n const reduction =\n stat.tokens_before > 0\n ? ((stat.tokens_before - stat.tokens_after) / stat.tokens_before) * 100\n : 0;\n console.log(` ${dim(date)} - ${neuralCyan(`${reduction.toFixed(1)}%`)} reduction`);\n }\n }\n\n console.log(brainPink(`${'โ'.repeat(60)}\\n`));\n break;\n }\n\n case 'realtime': {\n const metrics = getMetrics();\n const snapshot = metrics.getSnapshot();\n\n console.log(brainPink('\\nโ'.repeat(60)));\n console.log(neuralCyan(' โก Real-time Metrics'));\n console.log(brainPink('โ'.repeat(60)));\n console.log(\n ` ${synapseViolet('Total runs:')} ${snapshot.optimization.totalRuns.toLocaleString()}`,\n );\n console.log(\n ` ${synapseViolet('Tokens saved:')} ${snapshot.optimization.totalTokensSaved.toLocaleString()}`,\n );\n console.log(\n ` ${synapseViolet('Avg reduction:')} ${(snapshot.optimization.averageReduction * 100).toFixed(1)}%`,\n );\n console.log(\n ` ${synapseViolet('P50 latency:')} ${snapshot.optimization.p50Latency.toFixed(0)}ms`,\n );\n console.log(\n ` ${synapseViolet('P95 latency:')} ${snapshot.optimization.p95Latency.toFixed(0)}ms`,\n );\n console.log(\n ` ${synapseViolet('P99 latency:')} ${snapshot.optimization.p99Latency.toFixed(0)}ms`,\n );\n console.log(\n `\\n ${synapseViolet('Cache hit rate:')} ${(snapshot.cache.hitRate * 100).toFixed(1)}%`,\n );\n console.log(\n ` ${synapseViolet('Cache hits:')} ${snapshot.cache.totalHits.toLocaleString()}`,\n );\n console.log(\n ` ${synapseViolet('Cache misses:')} ${snapshot.cache.totalMisses.toLocaleString()}`,\n );\n console.log(brainPink(`${'โ'.repeat(60)}\\n`));\n break;\n }\n\n case 'memory': {\n const entries = await memory.query({});\n const totalEntries = entries.length;\n const totalSize = entries.reduce((sum, e) => sum + (e.content?.length || 0), 0);\n\n console.log(brainPink('\\nโ'.repeat(60)));\n console.log(neuralCyan(' ๐พ Memory Statistics'));\n console.log(brainPink('โ'.repeat(60)));\n console.log(` ${synapseViolet('Total entries:')} ${totalEntries.toLocaleString()}`);\n console.log(` ${synapseViolet('Total size:')} ${(totalSize / 1024).toFixed(1)} KB`);\n console.log(\n ` ${synapseViolet('Avg entry size:')} ${totalEntries > 0 ? (totalSize / totalEntries).toFixed(0) : 0} bytes`,\n );\n console.log(brainPink(`${'โ'.repeat(60)}\\n`));\n break;\n }\n }\n}\n\n/**\n * Memory consolidation with confirmation\n */\nasync function consolidateMemory(memory: KVMemory): Promise<void> {\n console.log(neuralCyan('\\n๐งน Memory Consolidation\\n'));\n\n console.log(dim('This will:'));\n console.log(dim(' โข Remove decayed entries'));\n console.log(dim(' โข Merge duplicate entries'));\n console.log(dim(' โข VACUUM database to reclaim space\\n'));\n\n const shouldConsolidate = await confirm({\n message: 'Proceed with consolidation?',\n default: true,\n });\n\n if (!shouldConsolidate) {\n console.log(dim('\\nConsolidation cancelled.\\n'));\n return;\n }\n\n // Lazy-load consolidate command\n const { consolidateCommand } = await import('./consolidate.js');\n\n console.log(neuralCyan('\\nโก Consolidating...\\n'));\n\n const result = await consolidateCommand({ memory });\n\n console.log(neuralCyan(`\\nโ Consolidation complete in ${result.durationMs}ms!`));\n console.log(synapseViolet(` Entries: ${result.entriesBefore} โ ${result.entriesAfter}`));\n console.log(\n brainPink(\n ` Removed: ${result.decayedRemoved} decayed, ${result.duplicatesRemoved} duplicates\\n`,\n ),\n );\n}\n\n/**\n * Quick actions menu\n */\nasync function showQuickActions(memory: KVMemory, configPath: string): Promise<void> {\n const action = await select({\n message: 'Quick Actions:',\n choices: [\n { name: '๐ Reset Statistics', value: 'reset-stats' },\n { name: '๐ Export Config (JSON)', value: 'export-config' },\n { name: '๐งช Run Test Optimization', value: 'test-optimize' },\n { name: 'โ Back to Main Menu', value: 'back' },\n ],\n });\n\n if (action === 'back') return;\n\n switch (action) {\n case 'reset-stats': {\n const confirmReset = await confirm({\n message: 'Are you sure you want to reset all statistics?',\n default: false,\n });\n\n if (confirmReset) {\n await memory.clearOptimizationStats();\n console.log(neuralCyan('\\nโ Statistics cleared\\n'));\n } else {\n console.log(dim('\\nReset cancelled.\\n'));\n }\n break;\n }\n\n case 'export-config': {\n const configYAML = readFileSync(configPath, 'utf-8');\n const config = parseYAML(configYAML);\n const json = JSON.stringify(config, null, 2);\n\n console.log(synapseViolet('\\n๐ Configuration (JSON):\\n'));\n console.log(json);\n console.log();\n\n const shouldSave = await confirm({\n message: 'Save to file?',\n default: false,\n });\n\n if (shouldSave) {\n const outputPath = resolve(configPath.replace(/\\.yaml$/, '.json'));\n writeFileSync(outputPath, json, 'utf-8');\n console.log(neuralCyan(`\\n๐พ Saved to ${outputPath}\\n`));\n }\n break;\n }\n\n case 'test-optimize': {\n console.log(neuralCyan('\\n๐งช Running test optimization...\\n'));\n\n const testContent = `\n# Test Context\n\nThis is a test context for optimization.\nIt includes some sample content to demonstrate the optimization process.\n\n## Features\n- Token counting\n- Sparse coding\n- Decay application\n- State classification\n `.trim();\n\n const { optimizeCommand } = await import('./optimize.js');\n\n const result = await optimizeCommand({\n input: testContent,\n memory,\n dryRun: true,\n verbose: false,\n });\n\n console.log(neuralCyan(`\\nโ Test optimization complete in ${result.durationMs}ms!`));\n console.log(synapseViolet(` Tokens: ${result.tokensBefore} โ ${result.tokensAfter}`));\n console.log(\n brainPink(\n ` Saved: ${result.tokensBefore - result.tokensAfter} tokens (${(result.reduction * 100).toFixed(1)}%)\\n`,\n ),\n );\n break;\n }\n }\n}\n\n/**\n * Execute the interactive command\n */\nexport async function interactiveCommand(\n options: InteractiveCommandOptions,\n): Promise<InteractiveCommandResult> {\n const { memory, configPath } = options;\n\n showWelcomeBanner();\n\n let running = true;\n while (running) {\n try {\n const choice = await showMainMenu();\n\n switch (choice) {\n case 'configure':\n await configureWizard(configPath);\n break;\n\n case 'preview':\n await optimizePreview(memory);\n break;\n\n case 'stats':\n await showStatsDashboard(memory);\n break;\n\n case 'consolidate':\n await consolidateMemory(memory);\n break;\n\n case 'quick':\n await showQuickActions(memory, configPath);\n break;\n\n case 'exit':\n running = false;\n console.log(brainPink('\\n๐ Thanks for using Sparn!\\n'));\n break;\n }\n } catch (error) {\n if ((error as { message?: string }).message === 'User force closed the prompt') {\n running = false;\n console.log(brainPink('\\n๐ Thanks for using Sparn!\\n'));\n } else {\n console.error(\n errorRed('\\nโ Error:'),\n error instanceof Error ? error.message : String(error),\n );\n console.log();\n }\n }\n }\n\n return {\n success: true,\n message: 'Interactive session completed',\n };\n}\n","#!/usr/bin/env node\n\n/**\n * Sparn CLI entry point.\n * Implements all CLI commands using Commander.js.\n */\n\nimport { spawn } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { Command } from 'commander';\nimport { getBanner } from './ui/banner.js';\n\n// Get package.json version from project root\nfunction getVersion(): string {\n try {\n // Try from current working directory first (most common case)\n const pkg = JSON.parse(readFileSync(join(process.cwd(), 'package.json'), 'utf-8'));\n return pkg.version;\n } catch {\n // Fallback: calculate from module location\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const pkg = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));\n return pkg.version;\n }\n}\n\nconst VERSION = getVersion();\n\n// Lazy-loaded imports (loaded only when commands are executed):\n// - createKVMemory (heavy: better-sqlite3)\n// - command implementations (may import heavy modules)\n// - progress spinners (heavy: ora)\n// - colors (chalk is reasonably lightweight, but lazy-load for consistency)\n\n/**\n * Global error handler for uncaught errors\n * Provides graceful degradation and helpful error messages\n */\nasync function handleError(error: Error | unknown, context?: string): Promise<void> {\n // Lazy-load colors\n const { errorRed, synapseViolet } = await import('./ui/colors.js');\n\n const errorMsg = error instanceof Error ? error.message : String(error);\n const stack = error instanceof Error ? error.stack : undefined;\n\n // Display user-friendly error message\n console.error(errorRed('\\nโ Error:'), errorMsg);\n\n if (context) {\n console.error(errorRed('Context:'), context);\n }\n\n // Database errors - provide recovery suggestions\n if (errorMsg.includes('SQLITE') || errorMsg.includes('database')) {\n console.error(synapseViolet('\\n๐ก Database issue detected:'));\n console.error(' Try running: rm -rf .sparn/ && sparn init');\n console.error(' This will reinitialize your Sparn database.\\n');\n }\n\n // Permission errors\n if (errorMsg.includes('EACCES') || errorMsg.includes('permission')) {\n console.error(synapseViolet('\\n๐ก Permission issue detected:'));\n console.error(' Check file permissions in .sparn/ directory');\n console.error(' Try: chmod -R u+rw .sparn/\\n');\n }\n\n // File not found errors\n if (errorMsg.includes('ENOENT') || errorMsg.includes('no such file')) {\n console.error(synapseViolet('\\n๐ก File not found:'));\n console.error(' Make sure you have run: sparn init');\n console.error(' Or check that the specified file exists.\\n');\n }\n\n // Memory errors\n if (errorMsg.includes('out of memory') || errorMsg.includes('heap')) {\n console.error(synapseViolet('\\n๐ก Memory issue detected:'));\n console.error(' Try processing smaller chunks of context');\n console.error(' Or increase Node.js memory: NODE_OPTIONS=--max-old-space-size=4096\\n');\n }\n\n // Show stack trace in verbose mode\n if (process.env['SPARN_DEBUG'] === 'true' && stack) {\n console.error(errorRed('\\nStack trace:'));\n console.error(stack);\n } else {\n console.error(' Run with SPARN_DEBUG=true for stack trace\\n');\n }\n\n process.exit(1);\n}\n\n/**\n * Global unhandled rejection handler\n */\nprocess.on('unhandledRejection', (reason) => {\n void handleError(reason, 'Unhandled promise rejection');\n});\n\n/**\n * Global uncaught exception handler\n */\nprocess.on('uncaughtException', (error) => {\n void handleError(error, 'Uncaught exception');\n});\n\nconst program = new Command();\n\nprogram\n .name('sparn')\n .description('Neuroscience-inspired context optimization for AI coding agents')\n .version(VERSION, '-v, --version', 'Output the current version')\n .helpOption('-h, --help', 'Display help for command');\n\n// Init command\nprogram\n .command('init')\n .description('Initialize Sparn in the current project')\n .option('-f, --force', 'Force overwrite if .sparn/ already exists')\n .addHelpText(\n 'after',\n `\nExamples:\n $ sparn init # Initialize in current directory\n $ sparn init --force # Overwrite existing .sparn/ directory\n\nFiles Created:\n .sparn/config.yaml # Configuration with neuroscience parameters\n .sparn/memory.db # SQLite database for context storage\n\nNext Steps:\n After initialization, use 'sparn optimize' to start optimizing context.\n`,\n )\n .action(async (options) => {\n // Lazy-load dependencies\n const { initCommand, displayInitSuccess } = await import('./commands/init.js');\n const { createInitSpinner } = await import('./ui/progress.js');\n const { neuralCyan, errorRed } = await import('./ui/colors.js');\n\n const spinner = createInitSpinner('๐ง Initializing Sparn...');\n try {\n spinner.start();\n spinner.text = '๐ Creating .sparn/ directory...';\n const result = await initCommand({ force: options.force });\n spinner.succeed(neuralCyan('Sparn initialized successfully!'));\n displayInitSuccess(result);\n } catch (error) {\n spinner.fail(errorRed('Initialization failed'));\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Optimize command\nprogram\n .command('optimize')\n .description('Optimize context memory using neuroscience principles')\n .option('-i, --input <file>', 'Input file path')\n .option('-o, --output <file>', 'Output file path')\n .option('--dry-run', 'Run without saving to memory')\n .option('--verbose', 'Show detailed per-entry scores')\n .addHelpText(\n 'after',\n `\nExamples:\n $ sparn optimize -i context.txt -o optimized.txt # Optimize file\n $ cat context.txt | sparn optimize # Optimize from stdin\n $ sparn optimize -i context.txt --dry-run # Preview without saving\n $ sparn optimize -i context.txt --verbose # Show entry scores\n\nHow It Works:\n 1. Sparse Coding: Keeps only 2-5% most relevant context\n 2. Engram Theory: Applies decay to old memories\n 3. Multi-State Synapses: Classifies as silent/ready/active\n 4. BTSP: Locks critical events (errors, stack traces)\n 5. Sleep Replay: Consolidates and compresses\n\nTypical Results:\n โข 60-90% token reduction\n โข Preserved task-critical information\n โข Enhanced AI agent focus\n`,\n )\n .action(async (options) => {\n // Lazy-load dependencies\n const { createKVMemory } = await import('../core/kv-memory.js');\n const { optimizeCommand } = await import('./commands/optimize.js');\n const { createOptimizeSpinner, showTokenSavings } = await import('./ui/progress.js');\n const { neuralCyan, synapseViolet, errorRed } = await import('./ui/colors.js');\n\n const spinner = createOptimizeSpinner('๐ง Initializing optimization...');\n try {\n spinner.start();\n\n // Read from stdin if no input file specified\n let input: string | undefined;\n if (!options.input && process.stdin.isTTY === false) {\n spinner.text = '๐ Reading context from stdin...';\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n input = Buffer.concat(chunks).toString('utf-8');\n } else if (options.input) {\n spinner.text = `๐ Reading context from ${options.input}...`;\n }\n\n // Load memory\n spinner.text = '๐พ Loading memory database...';\n const dbPath = resolve(process.cwd(), '.sparn/memory.db');\n const memory = await createKVMemory(dbPath);\n\n // Run optimization\n spinner.text = 'โก Applying neuroscience principles...';\n const result = await optimizeCommand({\n input,\n inputFile: options.input,\n outputFile: options.output,\n memory,\n dryRun: options.dryRun || false,\n verbose: options.verbose || false,\n });\n\n spinner.succeed(neuralCyan(`Optimization complete in ${result.durationMs}ms!`));\n\n // Display visual impact\n showTokenSavings(result.tokensBefore, result.tokensAfter, result.reduction);\n\n // Show entry stats\n console.log(synapseViolet(' Entry Distribution:'));\n console.log(` โข Processed: ${result.entriesProcessed}`);\n console.log(` โข Kept: ${result.entriesKept}`);\n console.log(` โข Active: ${result.stateDistribution.active}`);\n console.log(` โข Ready: ${result.stateDistribution.ready}`);\n console.log(` โข Silent: ${result.stateDistribution.silent}\\n`);\n\n // Show verbose details if requested\n if (options.verbose && result.details) {\n console.log(neuralCyan(' ๐ Entry Details:'));\n for (const detail of result.details) {\n console.log(\n ` ${detail.id.substring(0, 8)}: score=${detail.score.toFixed(2)}, state=${detail.state}, tokens=${detail.tokens}`,\n );\n }\n console.log();\n }\n\n // Write to stdout if no output file\n if (!options.output) {\n console.log(result.output);\n }\n\n await memory.close();\n } catch (error) {\n spinner.fail(errorRed('Optimization failed'));\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Stats command\nprogram\n .command('stats')\n .description('View optimization statistics')\n .option('--graph', 'Display ASCII bar chart of optimization history')\n .option('--reset', 'Clear all optimization statistics')\n .option('--json', 'Output statistics in JSON format')\n .addHelpText(\n 'after',\n `\nExamples:\n $ sparn stats # View summary statistics\n $ sparn stats --graph # Show ASCII chart of optimization history\n $ sparn stats --json # Output as JSON for automation\n $ sparn stats --reset # Clear all statistics (with confirmation)\n\nTracked Metrics:\n โข Total optimizations performed\n โข Total tokens saved across all runs\n โข Average reduction percentage\n โข Per-run token before/after counts\n โข Optimization duration\n`,\n )\n .action(async (options) => {\n // Lazy-load dependencies\n const { createKVMemory } = await import('../core/kv-memory.js');\n const { statsCommand } = await import('./commands/stats.js');\n const { createStatsSpinner } = await import('./ui/progress.js');\n const { neuralCyan, synapseViolet, errorRed } = await import('./ui/colors.js');\n\n const spinner = options.graph ? createStatsSpinner('๐ Generating statistics...') : null;\n try {\n if (spinner) spinner.start();\n\n // Load memory\n if (spinner) spinner.text = '๐พ Loading optimization history...';\n const dbPath = resolve(process.cwd(), '.sparn/memory.db');\n const memory = await createKVMemory(dbPath);\n\n // Handle reset with confirmation\n let confirmReset = false;\n if (options.reset) {\n if (spinner) spinner.stop();\n console.log(synapseViolet('Warning: This will clear all optimization statistics.'));\n confirmReset = true; // Auto-confirm for now\n }\n\n // Get stats\n if (spinner) spinner.text = '๐ Calculating statistics...';\n const result = await statsCommand({\n memory,\n graph: options.graph || false,\n reset: options.reset || false,\n confirmReset,\n json: options.json || false,\n });\n\n if (spinner) spinner.succeed(neuralCyan('Statistics ready!'));\n\n // Display output\n if (options.json) {\n console.log(result.json);\n } else if (options.reset && result.resetConfirmed) {\n console.log(neuralCyan('\\nโ Statistics cleared\\n'));\n } else {\n // Display stats summary\n console.log(neuralCyan('\\n๐ Optimization Statistics\\n'));\n console.log(` Total optimizations: ${result.totalCommands}`);\n console.log(` Total tokens saved: ${result.totalTokensSaved.toLocaleString()}`);\n console.log(` Average reduction: ${(result.averageReduction * 100).toFixed(1)}%`);\n\n if (options.graph && result.graph) {\n console.log(result.graph);\n }\n\n console.log();\n }\n\n await memory.close();\n } catch (error) {\n if (spinner) spinner.fail(errorRed('Statistics failed'));\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Relay command\nprogram\n .command('relay <command> [args...]')\n .description('Proxy a CLI command through optimization')\n .option('--silent', 'Suppress token savings summary')\n .addHelpText(\n 'after',\n `\nExamples:\n $ sparn relay git log # Run 'git log' and optimize output\n $ sparn relay npm test # Run 'npm test' and optimize output\n $ sparn relay gh pr view 123 # Optimize GitHub CLI output\n $ sparn relay ls -la --silent # Suppress optimization summary\n\nUse Cases:\n โข Wrap verbose CLI commands (git log, gh pr view)\n โข Optimize test runner output\n โข Compress build logs\n โข Filter CI/CD output for AI agent consumption\n\nThe relay command passes the exit code from the wrapped command.\n`,\n )\n .action(async (command, args, options) => {\n // Lazy-load dependencies\n const { createKVMemory } = await import('../core/kv-memory.js');\n const { relayCommand } = await import('./commands/relay.js');\n const { neuralCyan, errorRed } = await import('./ui/colors.js');\n\n try {\n // Load memory\n const dbPath = resolve(process.cwd(), '.sparn/memory.db');\n const memory = await createKVMemory(dbPath);\n\n // Execute relay\n const result = await relayCommand({\n command,\n args: args || [],\n memory,\n silent: options.silent || false,\n });\n\n // Display optimized output\n console.log(result.optimizedOutput);\n\n // Display summary if not silent\n if (result.summary) {\n console.error(neuralCyan(`\\n${result.summary}\\n`));\n }\n\n await memory.close();\n\n // Exit with same code as proxied command\n process.exit(result.exitCode);\n } catch (error) {\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Consolidate command\nprogram\n .command('consolidate')\n .description('Consolidate memory: remove decayed entries and merge duplicates')\n .addHelpText(\n 'after',\n `\nExamples:\n $ sparn consolidate # Run memory consolidation\n\nWhat It Does:\n 1. Remove Decayed Entries: Deletes entries that have fully decayed\n 2. Merge Duplicates: Combines identical content entries\n 3. VACUUM Database: Reclaims disk space from deletions\n 4. Update Statistics: Tracks consolidation metrics\n\nWhen to Run:\n โข After long-running sessions\n โข Before important optimizations\n โข When database size grows large\n โข As part of nightly maintenance\n\nTypical Results:\n โข 20-40% database size reduction\n โข Faster query performance\n โข Cleaner memory organization\n`,\n )\n .action(async () => {\n // Lazy-load dependencies\n const { createKVMemory } = await import('../core/kv-memory.js');\n const { consolidateCommand } = await import('./commands/consolidate.js');\n const { createConsolidateSpinner, showConsolidationSummary } = await import('./ui/progress.js');\n const { neuralCyan, synapseViolet, errorRed } = await import('./ui/colors.js');\n\n const spinner = createConsolidateSpinner('๐งน Initializing memory consolidation...');\n try {\n spinner.start();\n\n // Load memory\n spinner.text = '๐พ Loading memory database...';\n const dbPath = resolve(process.cwd(), '.sparn/memory.db');\n const memory = await createKVMemory(dbPath);\n\n // Run consolidation\n spinner.text = '๐ Identifying decayed entries...';\n const result = await consolidateCommand({ memory });\n\n spinner.succeed(neuralCyan(`Consolidation complete in ${result.durationMs}ms!`));\n\n // Display visual impact\n showConsolidationSummary(\n result.entriesBefore,\n result.entriesAfter,\n result.decayedRemoved,\n result.duplicatesRemoved,\n result.durationMs,\n );\n\n // Database vacuum status\n if (result.vacuumCompleted) {\n console.log(synapseViolet(' โ Database VACUUM completed\\n'));\n } else {\n console.log(errorRed(' โ Database VACUUM failed\\n'));\n }\n\n await memory.close();\n } catch (error) {\n spinner.fail(errorRed('Consolidation failed'));\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Config command\nprogram\n .command('config [subcommand] [key] [value]')\n .description('View or modify configuration')\n .option('--json', 'Output result as JSON')\n .addHelpText(\n 'after',\n `\nExamples:\n $ sparn config # Open config in $EDITOR\n $ sparn config get pruning.threshold # Get specific value\n $ sparn config set pruning.threshold 3 # Set value\n $ sparn config --json # View full config as JSON\n\nConfiguration Keys:\n pruning.threshold # Sparse coding threshold (2-5%)\n decay.halfLife # Engram decay half-life (hours)\n decay.minScore # Minimum decay score (0.0-1.0)\n states.activeThreshold # Active state threshold\n states.readyThreshold # Ready state threshold\n embedding.model # BTSP embedding model\n embedding.dimensions # Embedding vector size\n\nThe config file is located at .sparn/config.yaml\n`,\n )\n .action(async (subcommand, key, value, options) => {\n // Lazy-load dependencies\n const { configCommand } = await import('./commands/config.js');\n const { neuralCyan, errorRed } = await import('./ui/colors.js');\n\n try {\n const configPath = resolve(process.cwd(), '.sparn/config.yaml');\n\n // Execute config command\n const result = await configCommand({\n configPath,\n subcommand: subcommand as 'get' | 'set' | undefined,\n key,\n value,\n json: options.json || false,\n });\n\n if (!result.success) {\n console.error(errorRed('Error:'), result.error);\n process.exit(1);\n }\n\n // Handle editor mode\n if (result.editorPath && !options.json) {\n const editor = process.env['EDITOR'] || 'vim';\n console.log(neuralCyan(`\\n๐ Opening config in ${editor}...\\n`));\n\n // Spawn editor\n const child = spawn(editor, [result.editorPath], {\n stdio: 'inherit',\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n console.log(neuralCyan('\\nโ Config edited\\n'));\n }\n process.exit(code ?? 0);\n });\n\n return;\n }\n\n // Display result\n if (result.json) {\n console.log(result.json);\n } else if (result.message) {\n console.log(result.message);\n }\n } catch (error) {\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Daemon command\nprogram\n .command('daemon <subcommand>')\n .description('Manage real-time optimization daemon')\n .addHelpText(\n 'after',\n `\nSubcommands:\n start # Start daemon\n stop # Stop daemon\n status # Check daemon status\n\nExamples:\n $ sparn daemon start # Start watching Claude Code sessions\n $ sparn daemon stop # Stop daemon\n $ sparn daemon status # Check if daemon is running\n\nThe daemon watches ~/.claude/projects/**/*.jsonl and automatically\noptimizes contexts when they exceed the configured threshold.\n`,\n )\n .action(async (subcommand) => {\n // Lazy-load dependencies\n const { load: parseYAML } = await import('js-yaml');\n const { createDaemonCommand } = await import('../daemon/daemon-process.js');\n const { neuralCyan, errorRed } = await import('./ui/colors.js');\n\n try {\n // Load config\n const configPath = resolve(process.cwd(), '.sparn/config.yaml');\n const configYAML = readFileSync(configPath, 'utf-8');\n // biome-ignore lint/suspicious/noExplicitAny: parseYAML returns unknown, need to cast\n const config = parseYAML(configYAML) as any;\n\n const daemon = createDaemonCommand();\n\n switch (subcommand) {\n case 'start': {\n const result = await daemon.start(config);\n if (result.success) {\n console.log(neuralCyan(`\\nโ ${result.message}\\n`));\n } else {\n console.error(errorRed(`\\nโ ${result.message}\\n`));\n process.exit(1);\n }\n break;\n }\n\n case 'stop': {\n const result = await daemon.stop(config);\n if (result.success) {\n console.log(neuralCyan(`\\nโ ${result.message}\\n`));\n } else {\n console.error(errorRed(`\\nโ ${result.message}\\n`));\n process.exit(1);\n }\n break;\n }\n\n case 'status': {\n const result = await daemon.status(config);\n if (result.running) {\n console.log(neuralCyan(`\\nโ ${result.message}`));\n if (result.sessionsWatched !== undefined) {\n console.log(` Sessions watched: ${result.sessionsWatched}`);\n }\n if (result.tokensSaved !== undefined) {\n console.log(` Tokens saved: ${result.tokensSaved.toLocaleString()}`);\n }\n console.log();\n } else {\n console.log(errorRed(`\\nโ ${result.message}\\n`));\n }\n break;\n }\n\n default:\n console.error(errorRed(`\\nUnknown subcommand: ${subcommand}\\n`));\n console.error('Valid subcommands: start, stop, status\\n');\n process.exit(1);\n }\n } catch (error) {\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Hooks command\nprogram\n .command('hooks <subcommand>')\n .description('Manage Claude Code hook integration')\n .option('--global', 'Install hooks globally (for all projects)')\n .addHelpText(\n 'after',\n `\nSubcommands:\n install # Install hooks\n uninstall # Uninstall hooks\n status # Check hook status\n\nExamples:\n $ sparn hooks install # Install hooks for current project\n $ sparn hooks install --global # Install hooks globally\n $ sparn hooks uninstall # Uninstall hooks\n $ sparn hooks status # Check if hooks are active\n\nHooks automatically optimize context before each Claude Code prompt\nand compress verbose tool results after execution.\n`,\n )\n .action(async (subcommand, options) => {\n // Lazy-load dependencies\n const { hooksCommand } = await import('./commands/hooks.js');\n const { neuralCyan, errorRed } = await import('./ui/colors.js');\n\n try {\n const result = await hooksCommand({\n subcommand: subcommand as 'install' | 'uninstall' | 'status',\n global: options.global || false,\n });\n\n if (result.success) {\n console.log(neuralCyan(`\\nโ ${result.message}`));\n\n if (result.hookPaths) {\n console.log('\\nHook paths:');\n console.log(` pre-prompt: ${result.hookPaths.prePrompt}`);\n console.log(` post-tool-result: ${result.hookPaths.postToolResult}`);\n }\n\n console.log();\n } else {\n console.error(errorRed(`\\nโ ${result.message}`));\n if (result.error) {\n console.error(` ${result.error}`);\n }\n console.log();\n process.exit(1);\n }\n } catch (error) {\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Interactive command\nprogram\n .command('interactive')\n .alias('i')\n .description('Launch interactive mode for configuration and exploration')\n .addHelpText(\n 'after',\n `\nExamples:\n $ sparn interactive # Launch interactive mode\n $ sparn i # Short alias\n\nFeatures:\n โข ๐ Configuration Wizard - Guided prompts for all settings\n โข ๐ Optimization Preview - Test optimization with file preview\n โข ๐ Stats Dashboard - Beautiful metrics display\n โข ๐งน Memory Consolidation - Interactive cleanup\n โข ๐ Quick Actions - Common tasks and shortcuts\n\nThe interactive mode provides a conversational interface for exploring\nand configuring Sparn without memorizing CLI flags.\n`,\n )\n .action(async () => {\n // Lazy-load dependencies\n const { createKVMemory } = await import('../core/kv-memory.js');\n const { interactiveCommand } = await import('./commands/interactive.js');\n const { errorRed } = await import('./ui/colors.js');\n\n try {\n // Load memory\n const dbPath = resolve(process.cwd(), '.sparn/memory.db');\n const memory = await createKVMemory(dbPath);\n\n // Config path\n const configPath = resolve(process.cwd(), '.sparn/config.yaml');\n\n // Run interactive mode\n await interactiveCommand({\n memory,\n configPath,\n });\n\n await memory.close();\n } catch (error) {\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Show banner on version\nprogram.on('option:version', () => {\n console.log(getBanner(VERSION));\n process.exit(0);\n});\n\n// Parse arguments\nprogram.parse();\n"],"mappings":"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","names":["fileURLToPath","__filename","__dirname","path","randomUUID","writeFile","input","resolve","readFileSync","path","init_config","existsSync","readFileSync","writeFileSync","dirname","join","fileURLToPath","status","__filename","__dirname","resolve","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","fileURLToPath","__filename","__dirname","readFileSync","writeFileSync","parseYAML","stringifyYAML","optimizeCommand","consolidateCommand","spawn","readFileSync","dirname","join","resolve","fileURLToPath","getVersion","__filename","__dirname","VERSION","errorRed","synapseViolet","initCommand","displayInitSuccess","createInitSpinner","neuralCyan","createKVMemory","optimizeCommand","createOptimizeSpinner","showTokenSavings","input","statsCommand","createStatsSpinner","relayCommand","consolidateCommand","createConsolidateSpinner","showConsolidationSummary","configCommand","parseYAML","createDaemonCommand","hooksCommand","interactiveCommand"]}
|
|
1
|
+
{"version":3,"sources":["../../node_modules/tsup/assets/esm_shims.js","../../src/utils/tokenizer.ts","../../src/cli/ui/colors.ts","../../src/cli/ui/banner.ts","../../src/core/kv-memory.ts","../../src/types/config.ts","../../src/cli/commands/init.ts","../../src/cli/ui/progress.ts","../../src/utils/hash.ts","../../src/core/btsp-embedder.ts","../../src/core/confidence-states.ts","../../src/core/engram-scorer.ts","../../src/utils/tfidf.ts","../../src/core/sparse-pruner.ts","../../src/adapters/generic.ts","../../src/cli/commands/optimize.ts","../../src/cli/commands/stats.ts","../../src/cli/commands/relay.ts","../../src/core/sleep-compressor.ts","../../src/cli/commands/consolidate.ts","../../src/cli/commands/config.ts","../../src/daemon/daemon-process.ts","../../src/cli/commands/hooks.ts","../../src/core/metrics.ts","../../src/cli/commands/interactive.ts","../../src/core/dependency-graph.ts","../../src/cli/commands/graph.ts","../../src/core/search-engine.ts","../../src/cli/commands/search.ts","../../src/core/workflow-planner.ts","../../src/cli/commands/plan.ts","../../src/cli/commands/exec.ts","../../src/cli/commands/verify.ts","../../src/core/docs-generator.ts","../../src/cli/commands/docs.ts","../../src/core/debt-tracker.ts","../../src/cli/commands/debt.ts","../../src/cli/dashboard/theme.ts","../../src/cli/dashboard/components/command-input.tsx","../../src/cli/dashboard/components/output-panel.tsx","../../src/cli/dashboard/command-parser.ts","../../src/cli/dashboard/formatters.ts","../../src/cli/dashboard/hooks/use-command-executor.ts","../../src/cli/dashboard/hooks/use-data.ts","../../src/cli/dashboard/panels/debt-tracker.tsx","../../src/cli/dashboard/panels/graph-view.tsx","../../src/cli/dashboard/panels/memory-status.tsx","../../src/cli/dashboard/panels/optimization.tsx","../../src/cli/dashboard/app.tsx","../../src/cli/index.ts","../../src/utils/audio.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * Token estimation utilities.\n * Supports both heuristic (~90% accuracy) and precise (GPT tokenizer, ~95%+ accuracy) modes.\n */\n\nimport { encode } from 'gpt-tokenizer';\n\n/** Module-level flag for precise token counting */\nlet usePrecise = false;\n\n/**\n * Enable or disable precise token counting using GPT tokenizer.\n * When enabled, estimateTokens() uses gpt-tokenizer for ~95%+ accuracy on code.\n * When disabled (default), uses fast whitespace heuristic.\n *\n * @param enabled - Whether to use precise counting\n */\nexport function setPreciseTokenCounting(enabled: boolean): void {\n usePrecise = enabled;\n}\n\n/**\n * Count tokens precisely using GPT tokenizer.\n *\n * @param text - Text to count\n * @returns Exact token count\n */\nexport function countTokensPrecise(text: string): number {\n if (!text || text.length === 0) {\n return 0;\n }\n return encode(text).length;\n}\n\n/**\n * Estimate token count for text.\n *\n * In default (heuristic) mode: ~90% accuracy, very fast.\n * In precise mode: ~95%+ accuracy using GPT tokenizer.\n *\n * @param text - Text to count\n * @returns Estimated token count\n */\nexport function estimateTokens(text: string): number {\n if (!text || text.length === 0) {\n return 0;\n }\n\n if (usePrecise) {\n return encode(text).length;\n }\n\n // Split on whitespace to get words\n const words = text.split(/\\s+/).filter((w) => w.length > 0);\n const wordCount = words.length;\n\n // Character-based estimate\n const charCount = text.length;\n const charEstimate = Math.ceil(charCount / 4);\n\n // Word-based estimate\n const wordEstimate = Math.ceil(wordCount * 0.75);\n\n // Return the maximum of both estimates (more conservative)\n return Math.max(wordEstimate, charEstimate);\n}\n","/**\n * Brand color constants.\n * Per Article VIII: Brand Consistency.\n */\n\nimport chalk from 'chalk';\n\n/**\n * Primary Cyan (#00D4AA) - Success, active operations\n */\nexport const neuralCyan = chalk.hex('#00D4AA');\n\n/**\n * Accent Violet (#7B61FF) - Highlights, graphs, numbers\n */\nexport const synapseViolet = chalk.hex('#7B61FF');\n\n/**\n * Error Red (#FF6B6B) - Failures, pruned items\n */\nexport const errorRed = chalk.hex('#FF6B6B');\n\n/**\n * Brand Pink (#FF6B9D) - Logo color, branded messages, key branding\n */\nexport const brainPink = chalk.hex('#FF6B9D');\n\n/**\n * Dimmed text for secondary information\n */\nexport const dim = chalk.dim;\n\n/**\n * Bold text for emphasis\n */\nexport const bold = chalk.bold;\n","/**\n * ASCII banner for Sparn CLI.\n * Displayed on `sparn init` and `sparn --version`.\n */\n\nimport { brainPink, neuralCyan, synapseViolet } from './colors.js';\n\n/**\n * Sparn ASCII banner.\n */\nexport const BANNER = `\n ____ ____ ___ ____ _ __\n / ___\\\\/ __ \\\\/ _ \\\\ / __ \\\\/ | / /\n \\\\__ \\\\/ /_/ / /_\\\\ \\\\/ /_/ / |/ /\n ___/ / ____/ __ _/ _, _/ /| /\n/____/_/ /_/ |_/_/ |_/_/ |_/\n`;\n\n/**\n * Tagline for banner.\n */\nexport const TAGLINE = '๐ง Context optimization for AI coding agents';\n\n/**\n * Get formatted banner with color.\n *\n * @param version - Optional version string\n * @returns Formatted banner\n */\nexport function getBanner(version?: string): string {\n const versionStr = version ? synapseViolet(`v${version}`) : '';\n return `${neuralCyan(BANNER)}\\n${brainPink(TAGLINE)}\\n${versionStr ? `${versionStr}\\n` : ''}`;\n}\n","/**\n * KV Memory Store Module\n * Key-value storage with dual index/value tables.\n * Separates what to store (content) from how to retrieve it (index with scores and state).\n */\n\nimport { copyFileSync, existsSync } from 'node:fs';\nimport Database from 'better-sqlite3';\nimport type { MemoryEntry, MemoryQueryFilters } from '../types/memory.js';\n\n/**\n * Optimization statistics record.\n */\nexport interface OptimizationStats {\n id: number;\n timestamp: number;\n tokens_before: number;\n tokens_after: number;\n entries_pruned: number;\n duration_ms: number;\n}\n\n/**\n * KV Memory interface.\n */\n/**\n * FTS5 search result with rank score.\n */\nexport interface FTSResult {\n entry: MemoryEntry;\n rank: number;\n}\n\nexport interface KVMemory {\n /** Store a memory entry */\n put(entry: MemoryEntry): Promise<void>;\n\n /** Retrieve a memory entry by ID */\n get(id: string): Promise<MemoryEntry | null>;\n\n /** Query entries by filters */\n query(filters: MemoryQueryFilters): Promise<MemoryEntry[]>;\n\n /** Delete a memory entry */\n delete(id: string): Promise<void>;\n\n /** List all entry IDs */\n list(): Promise<string[]>;\n\n /** Compact database (remove expired entries) */\n compact(): Promise<number>;\n\n /** Close database connection */\n close(): Promise<void>;\n\n /** Record optimization statistics */\n recordOptimization(stats: Omit<OptimizationStats, 'id'>): Promise<void>;\n\n /** Get all optimization statistics */\n getOptimizationStats(): Promise<OptimizationStats[]>;\n\n /** Clear all optimization statistics */\n clearOptimizationStats(): Promise<void>;\n\n /** Full-text search using FTS5 */\n searchFTS(query: string, limit?: number): Promise<FTSResult[]>;\n}\n\n/**\n * Create a timestamped backup of the database\n * @param dbPath - Path to database file\n * @returns Path to backup file\n */\nfunction createBackup(dbPath: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupPath = `${dbPath}.backup-${timestamp}`;\n\n try {\n copyFileSync(dbPath, backupPath);\n console.log(`โ Database backed up to: ${backupPath}`);\n return backupPath;\n } catch (error) {\n console.error(`Warning: Could not create backup: ${error}`);\n return '';\n }\n}\n\n/**\n * Create KV Memory store with SQLite backend.\n *\n * Initializes database with dual table schema:\n * - entries_index: Fast lookups (id, hash, timestamp, score, ttl, state, accessCount, isBTSP)\n * - entries_value: Content storage (id, content, tags, metadata)\n *\n * @param dbPath - Path to SQLite database file\n * @returns KVMemory instance\n */\nexport async function createKVMemory(dbPath: string): Promise<KVMemory> {\n // Detect database corruption and create backup\n let db: Database.Database;\n try {\n db = new Database(dbPath);\n\n // Quick integrity check\n const integrityCheck = db.pragma('quick_check', { simple: true });\n if (integrityCheck !== 'ok') {\n console.error('โ Database corruption detected!');\n\n // Close corrupted db before backup/recovery\n db.close();\n\n // Create backup before attempting recovery\n if (existsSync(dbPath)) {\n const backupPath = createBackup(dbPath);\n if (backupPath) {\n console.log(`Backup created at: ${backupPath}`);\n }\n }\n\n // Try to recover\n console.log('Attempting database recovery...');\n db = new Database(dbPath);\n }\n } catch (error) {\n console.error('โ Database error detected:', error);\n\n // Create backup if database exists\n if (existsSync(dbPath)) {\n createBackup(dbPath);\n console.log('Creating new database...');\n }\n\n db = new Database(dbPath);\n }\n\n // Enable WAL mode for better concurrency\n db.pragma('journal_mode = WAL');\n\n // Enable foreign key enforcement (SQLite disables by default)\n db.pragma('foreign_keys = ON');\n\n // Create entries_index table\n db.exec(`\n CREATE TABLE IF NOT EXISTS entries_index (\n id TEXT PRIMARY KEY NOT NULL,\n hash TEXT UNIQUE NOT NULL,\n timestamp INTEGER NOT NULL,\n score REAL NOT NULL DEFAULT 0.0 CHECK(score >= 0.0 AND score <= 1.0),\n ttl INTEGER NOT NULL CHECK(ttl >= 0),\n state TEXT NOT NULL CHECK(state IN ('silent', 'ready', 'active')),\n accessCount INTEGER NOT NULL DEFAULT 0 CHECK(accessCount >= 0),\n isBTSP INTEGER NOT NULL DEFAULT 0 CHECK(isBTSP IN (0, 1)),\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))\n );\n `);\n\n // Create entries_value table\n db.exec(`\n CREATE TABLE IF NOT EXISTS entries_value (\n id TEXT PRIMARY KEY NOT NULL,\n content TEXT NOT NULL,\n tags TEXT,\n metadata TEXT,\n FOREIGN KEY (id) REFERENCES entries_index(id) ON DELETE CASCADE\n );\n `);\n\n // Create optimization_stats table\n db.exec(`\n CREATE TABLE IF NOT EXISTS optimization_stats (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\n tokens_before INTEGER NOT NULL,\n tokens_after INTEGER NOT NULL,\n entries_pruned INTEGER NOT NULL,\n duration_ms INTEGER NOT NULL\n );\n `);\n\n // Create indexes\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_entries_state ON entries_index(state);\n CREATE INDEX IF NOT EXISTS idx_entries_score ON entries_index(score DESC);\n CREATE INDEX IF NOT EXISTS idx_entries_hash ON entries_index(hash);\n CREATE INDEX IF NOT EXISTS idx_entries_timestamp ON entries_index(timestamp DESC);\n CREATE INDEX IF NOT EXISTS idx_stats_timestamp ON optimization_stats(timestamp DESC);\n `);\n\n // Create FTS5 virtual table for full-text search\n db.exec(`\n CREATE VIRTUAL TABLE IF NOT EXISTS entries_fts USING fts5(id, content, tokenize='porter');\n `);\n\n // Create triggers to keep FTS in sync\n // Note: triggers use INSERT OR REPLACE pattern since FTS5 doesn't support UPSERT\n db.exec(`\n CREATE TRIGGER IF NOT EXISTS entries_fts_insert\n AFTER INSERT ON entries_value\n BEGIN\n INSERT OR REPLACE INTO entries_fts(id, content) VALUES (NEW.id, NEW.content);\n END;\n `);\n\n db.exec(`\n CREATE TRIGGER IF NOT EXISTS entries_fts_delete\n AFTER DELETE ON entries_value\n BEGIN\n DELETE FROM entries_fts WHERE id = OLD.id;\n END;\n `);\n\n db.exec(`\n CREATE TRIGGER IF NOT EXISTS entries_fts_update\n AFTER UPDATE ON entries_value\n BEGIN\n DELETE FROM entries_fts WHERE id = OLD.id;\n INSERT INTO entries_fts(id, content) VALUES (NEW.id, NEW.content);\n END;\n `);\n\n // Backfill existing data into FTS table\n db.exec(`\n INSERT OR IGNORE INTO entries_fts(id, content)\n SELECT id, content FROM entries_value\n WHERE id NOT IN (SELECT id FROM entries_fts);\n `);\n\n // Prepare statements for better performance\n const putIndexStmt = db.prepare(`\n INSERT OR REPLACE INTO entries_index\n (id, hash, timestamp, score, ttl, state, accessCount, isBTSP)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const putValueStmt = db.prepare(`\n INSERT OR REPLACE INTO entries_value\n (id, content, tags, metadata)\n VALUES (?, ?, ?, ?)\n `);\n\n const getStmt = db.prepare(`\n SELECT\n i.id, i.hash, i.timestamp, i.score, i.ttl, i.state, i.accessCount, i.isBTSP,\n v.content, v.tags, v.metadata\n FROM entries_index i\n JOIN entries_value v ON i.id = v.id\n WHERE i.id = ?\n `);\n\n const deleteIndexStmt = db.prepare('DELETE FROM entries_index WHERE id = ?');\n const deleteValueStmt = db.prepare('DELETE FROM entries_value WHERE id = ?');\n\n return {\n async put(entry: MemoryEntry): Promise<void> {\n const transaction = db.transaction(() => {\n putIndexStmt.run(\n entry.id,\n entry.hash,\n entry.timestamp,\n entry.score,\n entry.ttl,\n entry.state,\n entry.accessCount,\n entry.isBTSP ? 1 : 0,\n );\n\n putValueStmt.run(\n entry.id,\n entry.content,\n JSON.stringify(entry.tags),\n JSON.stringify(entry.metadata),\n );\n });\n\n transaction();\n },\n\n async get(id: string): Promise<MemoryEntry | null> {\n const row = getStmt.get(id) as unknown;\n\n if (!row) {\n return null;\n }\n\n const r = row as {\n id: string;\n hash: string;\n timestamp: number;\n score: number;\n ttl: number;\n state: string;\n accessCount: number;\n isBTSP: number;\n content: string;\n tags: string | null;\n metadata: string | null;\n };\n\n return {\n id: r.id,\n content: r.content,\n hash: r.hash,\n timestamp: r.timestamp,\n score: r.score,\n ttl: r.ttl,\n state: r.state as 'silent' | 'ready' | 'active',\n accessCount: r.accessCount,\n tags: r.tags ? JSON.parse(r.tags) : [],\n metadata: r.metadata ? JSON.parse(r.metadata) : {},\n isBTSP: r.isBTSP === 1,\n };\n },\n\n async query(filters: MemoryQueryFilters): Promise<MemoryEntry[]> {\n let sql = `\n SELECT\n i.id, i.hash, i.timestamp, i.score, i.ttl, i.state, i.accessCount, i.isBTSP,\n v.content, v.tags, v.metadata\n FROM entries_index i\n JOIN entries_value v ON i.id = v.id\n WHERE 1=1\n `;\n\n const params: unknown[] = [];\n\n if (filters.state) {\n sql += ' AND i.state = ?';\n params.push(filters.state);\n }\n\n if (filters.minScore !== undefined) {\n sql += ' AND i.score >= ?';\n params.push(filters.minScore);\n }\n\n if (filters.maxScore !== undefined) {\n sql += ' AND i.score <= ?';\n params.push(filters.maxScore);\n }\n\n if (filters.isBTSP !== undefined) {\n sql += ' AND i.isBTSP = ?';\n params.push(filters.isBTSP ? 1 : 0);\n }\n\n if (filters.tags && filters.tags.length > 0) {\n for (const tag of filters.tags) {\n sql += ' AND v.tags LIKE ?';\n params.push(`%\"${tag}\"%`);\n }\n }\n\n sql += ' ORDER BY i.score DESC';\n\n if (filters.limit) {\n sql += ' LIMIT ?';\n params.push(filters.limit);\n\n if (filters.offset) {\n sql += ' OFFSET ?';\n params.push(filters.offset);\n }\n }\n\n const stmt = db.prepare(sql);\n const rows = stmt.all(...params) as unknown[];\n\n return rows.map((row) => {\n const r = row as {\n id: string;\n hash: string;\n timestamp: number;\n score: number;\n ttl: number;\n state: string;\n accessCount: number;\n isBTSP: number;\n content: string;\n tags: string | null;\n metadata: string | null;\n };\n\n return {\n id: r.id,\n content: r.content,\n hash: r.hash,\n timestamp: r.timestamp,\n score: r.score,\n ttl: r.ttl,\n state: r.state as 'silent' | 'ready' | 'active',\n accessCount: r.accessCount,\n tags: r.tags ? JSON.parse(r.tags) : [],\n metadata: r.metadata ? JSON.parse(r.metadata) : {},\n isBTSP: r.isBTSP === 1,\n };\n });\n },\n\n async delete(id: string): Promise<void> {\n const transaction = db.transaction(() => {\n deleteIndexStmt.run(id);\n deleteValueStmt.run(id);\n });\n\n transaction();\n },\n\n async list(): Promise<string[]> {\n const stmt = db.prepare('SELECT id FROM entries_index');\n const rows = stmt.all() as { id: string }[];\n return rows.map((r) => r.id);\n },\n\n async compact(): Promise<number> {\n const before = db.prepare('SELECT COUNT(*) as count FROM entries_index').get() as {\n count: number;\n };\n\n // Remove expired non-BTSP entries: timestamp (ms) + ttl (seconds)*1000 < now\n const now = Date.now();\n db.prepare('DELETE FROM entries_index WHERE isBTSP = 0 AND (timestamp + ttl * 1000) < ?').run(\n now,\n );\n\n // Also remove non-BTSP entries with zero TTL\n db.exec('DELETE FROM entries_index WHERE isBTSP = 0 AND ttl <= 0');\n\n // Decay-based removal: remove non-BTSP entries with decay >= 0.95\n const candidates = db\n .prepare('SELECT id, timestamp, ttl FROM entries_index WHERE isBTSP = 0')\n .all() as Array<{ id: string; timestamp: number; ttl: number }>;\n\n for (const row of candidates) {\n const ageSeconds = Math.max(0, (now - row.timestamp) / 1000);\n const ttlSeconds = row.ttl;\n if (ttlSeconds <= 0) continue;\n const decay = 1 - Math.exp(-ageSeconds / ttlSeconds);\n if (decay >= 0.95) {\n db.prepare('DELETE FROM entries_index WHERE id = ?').run(row.id);\n }\n }\n\n // Clean up orphaned value entries\n db.exec('DELETE FROM entries_value WHERE id NOT IN (SELECT id FROM entries_index)');\n\n db.exec('VACUUM');\n\n const after = db.prepare('SELECT COUNT(*) as count FROM entries_index').get() as {\n count: number;\n };\n\n return before.count - after.count;\n },\n\n async close(): Promise<void> {\n db.close();\n },\n\n async recordOptimization(stats: Omit<OptimizationStats, 'id'>): Promise<void> {\n const stmt = db.prepare(`\n INSERT INTO optimization_stats (timestamp, tokens_before, tokens_after, entries_pruned, duration_ms)\n VALUES (?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n stats.timestamp,\n stats.tokens_before,\n stats.tokens_after,\n stats.entries_pruned,\n stats.duration_ms,\n );\n\n // Retain only last 1000 stats to prevent unbounded growth\n db.prepare(\n 'DELETE FROM optimization_stats WHERE id NOT IN (SELECT id FROM optimization_stats ORDER BY timestamp DESC LIMIT 1000)',\n ).run();\n },\n\n async getOptimizationStats(): Promise<OptimizationStats[]> {\n const stmt = db.prepare(`\n SELECT id, timestamp, tokens_before, tokens_after, entries_pruned, duration_ms\n FROM optimization_stats\n ORDER BY timestamp DESC\n `);\n\n const rows = stmt.all() as OptimizationStats[];\n return rows;\n },\n\n async clearOptimizationStats(): Promise<void> {\n db.exec('DELETE FROM optimization_stats');\n },\n\n async searchFTS(query: string, limit = 10): Promise<FTSResult[]> {\n if (!query || query.trim().length === 0) return [];\n\n // Sanitize query: strip FTS5 special characters to prevent syntax errors\n const sanitized = query.replace(/[{}()[\\]\"':*^~]/g, ' ').trim();\n if (sanitized.length === 0) return [];\n\n const stmt = db.prepare(`\n SELECT\n f.id, f.content, rank,\n i.hash, i.timestamp, i.score, i.ttl, i.state, i.accessCount, i.isBTSP,\n v.tags, v.metadata\n FROM entries_fts f\n JOIN entries_index i ON f.id = i.id\n JOIN entries_value v ON f.id = v.id\n WHERE entries_fts MATCH ?\n ORDER BY rank\n LIMIT ?\n `);\n\n try {\n const rows = stmt.all(sanitized, limit) as Array<{\n id: string;\n content: string;\n rank: number;\n hash: string;\n timestamp: number;\n score: number;\n ttl: number;\n state: string;\n accessCount: number;\n isBTSP: number;\n tags: string | null;\n metadata: string | null;\n }>;\n\n return rows.map((r) => ({\n entry: {\n id: r.id,\n content: r.content,\n hash: r.hash,\n timestamp: r.timestamp,\n score: r.score,\n ttl: r.ttl,\n state: r.state as 'silent' | 'ready' | 'active',\n accessCount: r.accessCount,\n tags: r.tags ? JSON.parse(r.tags) : [],\n metadata: r.metadata ? JSON.parse(r.metadata) : {},\n isBTSP: r.isBTSP === 1,\n },\n rank: r.rank,\n }));\n } catch {\n // FTS query error (bad syntax despite sanitization) โ return empty\n return [];\n }\n },\n };\n}\n","/**\n * Configuration types for Sparn behavior customization.\n */\n\n/**\n * Agent adapter type.\n */\nexport type AgentType = 'claude-code' | 'generic';\n\n/**\n * Pruning configuration.\n */\nexport interface PruningConfig {\n /** Percentage of top-scored entries to keep (1-100, default: 5) */\n threshold: number;\n\n /** Aggressiveness scale 0-100 (affects TF-IDF weighting, default: 50) */\n aggressiveness: number;\n}\n\n/**\n * Decay configuration.\n */\nexport interface DecayConfig {\n /** Default TTL in hours (default: 24) */\n defaultTTL: number;\n\n /** Decay threshold for pruning (0.0-1.0, default: 0.95) */\n decayThreshold: number;\n\n /** Minutes within which entries get a recency boost (default: 30) */\n recencyBoostMinutes?: number;\n\n /** Multiplier for recency boost at age 0 (default: 1.3) */\n recencyBoostMultiplier?: number;\n}\n\n/**\n * Confidence state threshold configuration.\n */\nexport interface StatesConfig {\n /** Score threshold for active state (default: 0.7) */\n activeThreshold: number;\n\n /** Score threshold for ready state (default: 0.3) */\n readyThreshold: number;\n}\n\n/**\n * UI configuration.\n */\nexport interface UIConfig {\n /** Enable colored output (default: true) */\n colors: boolean;\n\n /** Enable sound effects (default: false) */\n sounds: boolean;\n\n /** Verbose logging (default: false) */\n verbose: boolean;\n}\n\n/**\n * Real-time optimization configuration.\n */\nexport interface RealtimeConfig {\n /** Target token budget for optimized context (default: 50000) */\n tokenBudget: number;\n\n /** Token threshold that triggers auto-optimization (default: 60000) */\n autoOptimizeThreshold: number;\n\n /** File patterns to watch for changes (default: ['**\\/*.jsonl']) */\n watchPatterns: string[];\n\n /** Daemon PID file path (default: '.sparn/daemon.pid') */\n pidFile: string;\n\n /** Daemon log file path (default: '.sparn/daemon.log') */\n logFile: string;\n\n /** Debounce delay in milliseconds for file changes (default: 5000) */\n debounceMs: number;\n\n /** Enable incremental optimization (default: true) */\n incremental: boolean;\n\n /** Sliding window size for context entries (default: 500) */\n windowSize: number;\n\n /** Consolidation interval in hours, or null for disabled (default: null) */\n consolidationInterval: number | null;\n\n /** Use precise GPT tokenizer for token counting (default: false) */\n preciseTokenCounting?: boolean;\n}\n\n/**\n * Complete Sparn configuration.\n */\nexport interface SparnConfig {\n pruning: PruningConfig;\n decay: DecayConfig;\n states: StatesConfig;\n agent: AgentType;\n ui: UIConfig;\n /** Auto-consolidation interval in hours, or null for manual */\n autoConsolidate: number | null;\n /** Real-time optimization settings */\n realtime: RealtimeConfig;\n /** Additional BTSP pattern regex strings (default: []) */\n btspPatterns?: string[];\n}\n\n/**\n * Default configuration values.\n */\nexport const DEFAULT_CONFIG: SparnConfig = {\n pruning: {\n threshold: 5,\n aggressiveness: 50,\n },\n decay: {\n defaultTTL: 24,\n decayThreshold: 0.95,\n },\n states: {\n activeThreshold: 0.7,\n readyThreshold: 0.3,\n },\n agent: 'generic',\n ui: {\n colors: true,\n sounds: false,\n verbose: false,\n },\n autoConsolidate: null,\n realtime: {\n tokenBudget: 40000,\n autoOptimizeThreshold: 60000,\n watchPatterns: ['**/*.jsonl'],\n pidFile: '.sparn/daemon.pid',\n logFile: '.sparn/daemon.log',\n debounceMs: 5000,\n incremental: true,\n windowSize: 500,\n consolidationInterval: null,\n },\n};\n","/**\n * Init command implementation.\n * Creates .sparn/ directory with config and database.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { access, mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { dump as dumpYAML } from 'js-yaml';\nimport { createKVMemory } from '../../core/kv-memory.js';\nimport { DEFAULT_CONFIG } from '../../types/config.js';\nimport { getBanner } from '../ui/banner.js';\nimport { brainPink, dim, neuralCyan } from '../ui/colors.js';\n\n// Get sparn's own version from its package.json\nfunction getVersion(): string {\n try {\n // Read from sparn's own package.json (relative to compiled module)\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const pkg = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));\n return pkg.version;\n } catch {\n return '1.4.0';\n }\n}\n\nconst VERSION = getVersion();\n\n/**\n * Options for init command.\n */\nexport interface InitOptions {\n /** Force overwrite if .sparn/ exists */\n force?: boolean;\n /** Current working directory */\n cwd?: string;\n}\n\n/**\n * Result of init operation.\n */\nexport interface InitResult {\n /** Path to created config file */\n configPath: string;\n\n /** Path to created database */\n dbPath: string;\n\n /** Initialization duration (ms) */\n durationMs: number;\n}\n\n/**\n * Execute init command.\n *\n * Creates .sparn/ directory with:\n * - config.yaml (default configuration)\n * - memory.db (SQLite database)\n *\n * @param options - Init options\n * @returns Init result\n */\nexport async function initCommand(options: InitOptions = {}): Promise<InitResult> {\n const startTime = Date.now();\n const cwd = options.cwd || process.cwd();\n const sparnDir = join(cwd, '.sparn');\n const configPath = join(sparnDir, 'config.yaml');\n const dbPath = join(sparnDir, 'memory.db');\n\n // Check if .sparn/ already exists\n const exists = await checkExists(sparnDir);\n\n if (exists && !options.force) {\n throw new Error(\n '.sparn/ directory already exists. Use --force to overwrite or run from a different directory.',\n );\n }\n\n // Create .sparn/ directory\n await mkdir(sparnDir, { recursive: true });\n\n // Create config.yaml with defaults\n const configYAML = dumpYAML(DEFAULT_CONFIG, {\n indent: 2,\n lineWidth: 100,\n });\n\n const configWithComments = `# Sparn Configuration\n# See https://github.com/ulrichc1/sparn for documentation\n\n${configYAML}`;\n\n await writeFile(configPath, configWithComments, 'utf8');\n\n // Initialize database\n const memory = await createKVMemory(dbPath);\n await memory.close();\n\n const durationMs = Date.now() - startTime;\n\n return {\n configPath,\n dbPath,\n durationMs,\n };\n}\n\n/**\n * Display init success message with banner.\n *\n * @param result - Init result\n */\nexport function displayInitSuccess(result: InitResult): void {\n console.log(getBanner(VERSION));\n\n console.log(`\\n${brainPink('โ'.repeat(60))}`);\n console.log(brainPink(' ๐ง Sparn Initialized Successfully!'));\n console.log(brainPink('โ'.repeat(60)));\n\n console.log(`\\n ${neuralCyan('Config:')} ${dim(result.configPath)}`);\n console.log(` ${neuralCyan('Database:')} ${dim(result.dbPath)}`);\n console.log(` ${neuralCyan('Time:')} ${dim(`${result.durationMs}ms`)}`);\n\n console.log(\n `\\n ${brainPink('โ')} Run ${neuralCyan(\"'sparn optimize'\")} to start optimizing context!`,\n );\n console.log(`${brainPink('โ'.repeat(60))}\\n`);\n}\n\n/**\n * Check if path exists.\n */\nasync function checkExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Progress indicators for long-running operations.\n * Uses ora spinners with branded colors.\n */\n\nimport ora, { type Ora } from 'ora';\nimport { brainPink, neuralCyan, synapseViolet } from './colors.js';\n\n/**\n * Create a spinner for optimization operations.\n *\n * @param text - Initial spinner text\n * @returns Ora spinner instance\n */\nexport function createOptimizeSpinner(text: string): Ora {\n return ora({\n text,\n color: 'cyan',\n spinner: 'dots12',\n });\n}\n\n/**\n * Create a spinner for memory consolidation.\n *\n * @param text - Initial spinner text\n * @returns Ora spinner instance\n */\nexport function createConsolidateSpinner(text: string): Ora {\n return ora({\n text,\n color: 'magenta',\n spinner: 'material',\n });\n}\n\n/**\n * Create a spinner for stats generation.\n *\n * @param text - Initial spinner text\n * @returns Ora spinner instance\n */\nexport function createStatsSpinner(text: string): Ora {\n return ora({\n text,\n color: 'yellow',\n spinner: 'bouncingBar',\n });\n}\n\n/**\n * Create a spinner for initialization.\n *\n * @param text - Initial spinner text\n * @returns Ora spinner instance\n */\nexport function createInitSpinner(text: string): Ora {\n return ora({\n text,\n color: 'green',\n spinner: 'star',\n });\n}\n\n/**\n * Show token savings with visual impact.\n * Displays before โ after with percentage and celebratory message.\n *\n * @param tokensBefore - Tokens before optimization\n * @param tokensAfter - Tokens after optimization\n * @param reduction - Reduction percentage (0.0-1.0)\n */\nexport function showTokenSavings(\n tokensBefore: number,\n tokensAfter: number,\n reduction: number,\n): void {\n const saved = tokensBefore - tokensAfter;\n const reductionPercent = (reduction * 100).toFixed(1);\n\n console.log(`\\n${brainPink('โ'.repeat(60))}`);\n console.log(neuralCyan(' ๐ Token Optimization Results'));\n console.log(brainPink('โ'.repeat(60)));\n\n // Before โ After\n console.log(` ${synapseViolet('Before:')} ${tokensBefore.toLocaleString()} tokens`);\n console.log(` ${neuralCyan('After:')} ${tokensAfter.toLocaleString()} tokens`);\n console.log(brainPink(' โ'.repeat(30)));\n\n // Savings\n console.log(` ${brainPink('Saved:')} ${saved.toLocaleString()} tokens (${reductionPercent}%)`);\n\n // Progress bar\n const barLength = 40;\n const savedBars = Math.floor(reduction * barLength);\n const keptBars = barLength - savedBars;\n const progressBar = neuralCyan('โ'.repeat(keptBars)) + brainPink('โ'.repeat(savedBars));\n console.log(` [${progressBar}] ${reductionPercent}% reduced`);\n\n // Celebratory message\n if (reduction >= 0.9) {\n console.log(`\\n ${brainPink('โจ OUTSTANDING!')} Mind-blowing 90%+ reduction!`);\n } else if (reduction >= 0.7) {\n console.log(`\\n ${neuralCyan('๐ EXCELLENT!')} Strong 70%+ token savings!`);\n } else if (reduction >= 0.5) {\n console.log(`\\n ${synapseViolet('๐ GOOD!')} Solid 50%+ optimization!`);\n } else if (reduction > 0) {\n console.log(`\\n ${neuralCyan('โ')} Tokens optimized successfully!`);\n }\n\n console.log(`${brainPink('โ'.repeat(60))}\\n`);\n}\n\n/**\n * Show consolidation summary with visual impact.\n *\n * @param entriesBefore - Entries before consolidation\n * @param entriesAfter - Entries after consolidation\n * @param decayed - Decayed entries removed\n * @param duplicates - Duplicate entries merged\n * @param durationMs - Duration in milliseconds\n */\nexport function showConsolidationSummary(\n entriesBefore: number,\n entriesAfter: number,\n decayed: number,\n duplicates: number,\n durationMs: number,\n): void {\n const removed = entriesBefore - entriesAfter;\n const compressionRatio = entriesBefore > 0 ? ((removed / entriesBefore) * 100).toFixed(1) : '0.0';\n\n console.log(`\\n${brainPink('โ'.repeat(60))}`);\n console.log(neuralCyan(' ๐งน Memory Consolidation Complete'));\n console.log(brainPink('โ'.repeat(60)));\n\n // Before โ After\n console.log(` ${synapseViolet('Before:')} ${entriesBefore.toLocaleString()} entries`);\n console.log(` ${neuralCyan('After:')} ${entriesAfter.toLocaleString()} entries`);\n console.log(brainPink(' โ'.repeat(30)));\n\n // Details\n console.log(` ${brainPink('Decayed:')} ${decayed.toLocaleString()} removed`);\n console.log(` ${brainPink('Duplicates:')} ${duplicates.toLocaleString()} merged`);\n console.log(` ${neuralCyan('Total:')} ${removed.toLocaleString()} entries freed`);\n console.log(` ${synapseViolet('Time:')} ${durationMs}ms`);\n\n // Progress bar\n const barLength = 40;\n const compressionBars = Math.floor((removed / entriesBefore) * barLength);\n const keptBars = barLength - compressionBars;\n const progressBar = neuralCyan('โ'.repeat(keptBars)) + brainPink('โ'.repeat(compressionBars));\n console.log(` [${progressBar}] ${compressionRatio}% compressed`);\n\n // Celebratory message\n if (removed > 0) {\n console.log(`\\n ${brainPink('โจ')} Memory optimized and ready for peak performance!`);\n } else {\n console.log(`\\n ${neuralCyan('โ')} Memory already optimal!`);\n }\n\n console.log(`${brainPink('โ'.repeat(60))}\\n`);\n}\n\n/**\n * Show initialization success with branded message.\n *\n * @param message - Success message\n */\nexport function showInitSuccess(message: string): void {\n console.log(`\\n${brainPink('โ'.repeat(60))}`);\n console.log(brainPink(' ๐ง Sparn Initialized Successfully!'));\n console.log(brainPink('โ'.repeat(60)));\n console.log(` ${neuralCyan(message)}`);\n console.log(`${brainPink('โ'.repeat(60))}\\n`);\n}\n","/**\n * Content hashing utilities.\n * Uses SHA-256 for deduplication.\n */\n\nimport { createHash } from 'node:crypto';\n\n/**\n * Generate SHA-256 hash of content for deduplication.\n *\n * @param content - Content to hash\n * @returns 64-character hex string (SHA-256)\n *\n * @example\n * ```typescript\n * const hash = hashContent('Hello world');\n * console.log(hash.length); // 64\n * ```\n */\nexport function hashContent(content: string): string {\n return createHash('sha256').update(content, 'utf8').digest('hex');\n}\n","/**\n * BTSP Embedder - Implements behavioral timescale synaptic plasticity\n *\n * Application: Detect high-importance patterns and mark for permanent retention.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type { MemoryEntry } from '../types/memory.js';\nimport { hashContent } from '../utils/hash.js';\n\nexport interface BTSPEmbedder {\n /**\n * Detect if content contains BTSP patterns (errors, stack traces, conflicts, git diffs)\n * @param content - Content to analyze\n * @returns True if BTSP pattern detected\n */\n detectBTSP(content: string): boolean;\n\n /**\n * Create a new memory entry marked as BTSP (one-shot learned)\n * @param content - Entry content\n * @param tags - Optional tags\n * @param metadata - Optional metadata\n * @returns BTSP-marked memory entry\n */\n createBTSPEntry(\n content: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n ): MemoryEntry;\n}\n\n/**\n * Create a BTSP embedder instance\n * @returns BTSPEmbedder instance\n */\nexport interface BTSPEmbedderConfig {\n /** Additional regex pattern strings to detect BTSP events */\n customPatterns?: string[];\n}\n\nexport function createBTSPEmbedder(config?: BTSPEmbedderConfig): BTSPEmbedder {\n // Patterns that indicate critical events\n const BTSP_PATTERNS: RegExp[] = [\n // Error patterns\n /\\b(error|exception|failure|fatal|critical|panic)\\b/i,\n /\\b(TypeError|ReferenceError|SyntaxError|RangeError|URIError)\\b/,\n /\\bENOENT|EACCES|ECONNREFUSED|ETIMEDOUT\\b/,\n\n // Stack trace patterns\n /^\\s+at\\s+.*\\(.*:\\d+:\\d+\\)/m, // JavaScript stack trace\n /^\\s+at\\s+.*\\.[a-zA-Z]+:\\d+/m, // Python/Ruby stack trace\n\n // Git diff new files\n /^new file mode \\d+$/m,\n /^--- \\/dev\\/null$/m,\n\n // Merge conflict markers\n /^<<<<<<< /m,\n /^=======/m,\n /^>>>>>>> /m,\n ];\n\n // Merge custom patterns (silently skip invalid regex)\n if (config?.customPatterns) {\n for (const pattern of config.customPatterns) {\n try {\n BTSP_PATTERNS.push(new RegExp(pattern));\n } catch {\n // Invalid regex โ silently ignore\n }\n }\n }\n\n function detectBTSP(content: string): boolean {\n return BTSP_PATTERNS.some((pattern) => pattern.test(content));\n }\n\n function createBTSPEntry(\n content: string,\n tags: string[] = [],\n metadata: Record<string, unknown> = {},\n ): MemoryEntry {\n return {\n id: randomUUID(),\n content,\n hash: hashContent(content),\n timestamp: Date.now(),\n score: 1.0, // Maximum initial score\n ttl: 365 * 24 * 3600, // 1 year in seconds (long retention)\n state: 'active', // Always active\n accessCount: 0,\n tags: [...tags, 'btsp'],\n metadata,\n isBTSP: true,\n };\n }\n\n return {\n detectBTSP,\n createBTSPEntry,\n };\n}\n","/**\n * Confidence States - Entry classification by score\n *\n * Entries exist in three states: silent, ready, active.\n * Classifies memory entries by score into silent/ready/active states.\n */\n\nimport type { ConfidenceState, MemoryEntry, StateDistribution } from '../types/memory.js';\n\nexport interface ConfidenceStatesConfig {\n /** Score threshold for active state (e.g., 0.7) */\n activeThreshold: number;\n /** Score threshold for ready state (e.g., 0.3) */\n readyThreshold: number;\n}\n\nexport interface ConfidenceStates {\n /**\n * Calculate state based on entry score and BTSP flag\n * @param entry - Memory entry\n * @returns Confidence state\n */\n calculateState(entry: MemoryEntry): ConfidenceState;\n\n /**\n * Transition entry to correct state based on its score\n * @param entry - Entry to transition\n * @returns Entry with updated state\n */\n transition(entry: MemoryEntry): MemoryEntry;\n\n /**\n * Get distribution of states across all entries\n * @param entries - All memory entries\n * @returns State distribution with counts\n */\n getDistribution(entries: MemoryEntry[]): StateDistribution;\n}\n\n/**\n * Create a confidence states manager\n * @param config - States configuration\n * @returns ConfidenceStates instance\n */\nexport function createConfidenceStates(config: ConfidenceStatesConfig): ConfidenceStates {\n const { activeThreshold, readyThreshold } = config;\n\n function calculateState(entry: MemoryEntry): ConfidenceState {\n // BTSP entries are always active\n if (entry.isBTSP) {\n return 'active';\n }\n\n // State based on score thresholds\n // Active: score >= 0.7\n if (entry.score >= activeThreshold) {\n return 'active';\n }\n\n // Ready: 0.3 <= score < 0.7\n if (entry.score >= readyThreshold) {\n return 'ready';\n }\n\n // Silent: score < 0.3\n return 'silent';\n }\n\n function transition(entry: MemoryEntry): MemoryEntry {\n const newState = calculateState(entry);\n\n return {\n ...entry,\n state: newState,\n };\n }\n\n function getDistribution(entries: MemoryEntry[]): StateDistribution {\n const distribution: StateDistribution = {\n silent: 0,\n ready: 0,\n active: 0,\n total: entries.length,\n };\n\n for (const entry of entries) {\n const state = calculateState(entry);\n distribution[state]++;\n }\n\n return distribution;\n }\n\n return {\n calculateState,\n transition,\n getDistribution,\n };\n}\n","/**\n * Engram Scorer - Implements time-based memory decay\n *\n * Older entries fade over time unless reinforced by access.\n * Applies exponential decay formula to memory scores based on age and access count.\n *\n * Formula: decay = 1 - e^(-age/TTL)\n * Score adjustment: score_new = score_old * (1 - decay) + (accessCount bonus)\n */\n\nimport type { MemoryEntry } from '../types/memory.js';\n\nexport interface EngramScorerConfig {\n /** Default TTL in hours for new entries */\n defaultTTL: number;\n /** Decay threshold (0.0-1.0) above which entries are marked for pruning */\n decayThreshold: number;\n}\n\nexport interface EngramScorer {\n /**\n * Calculate current score for an entry based on decay and access count\n * @param entry - Memory entry to score\n * @param currentTime - Current timestamp in milliseconds (for testing)\n * @returns Updated score (0.0-1.0)\n */\n calculateScore(entry: MemoryEntry, currentTime?: number): number;\n\n /**\n * Refresh TTL to default value\n * @param entry - Entry to refresh\n * @returns Entry with refreshed TTL and timestamp\n */\n refreshTTL(entry: MemoryEntry): MemoryEntry;\n\n /**\n * Calculate decay factor (0.0-1.0) based on age and TTL\n * @param ageInSeconds - Age of entry in seconds\n * @param ttlInSeconds - TTL in seconds\n * @returns Decay factor (0.0 = fresh, 1.0 = fully decayed)\n */\n calculateDecay(ageInSeconds: number, ttlInSeconds: number): number;\n}\n\n/**\n * Create an engram scorer instance\n * @param config - Scorer configuration\n * @returns EngramScorer instance\n */\nexport function createEngramScorer(\n config: EngramScorerConfig & { recencyBoostMinutes?: number; recencyBoostMultiplier?: number },\n): EngramScorer {\n const { defaultTTL } = config;\n const recencyWindowMs = (config.recencyBoostMinutes ?? 30) * 60 * 1000;\n const recencyMultiplier = config.recencyBoostMultiplier ?? 1.3;\n\n function calculateDecay(ageInSeconds: number, ttlInSeconds: number): number {\n if (ttlInSeconds === 0) return 1.0; // Instant decay\n if (ageInSeconds <= 0) return 0.0; // Fresh entry\n\n // Exponential decay: 1 - e^(-age/TTL)\n const ratio = ageInSeconds / ttlInSeconds;\n const decay = 1 - Math.exp(-ratio);\n\n // Clamp to [0.0, 1.0]\n return Math.max(0, Math.min(1, decay));\n }\n\n function calculateScore(entry: MemoryEntry, currentTime: number = Date.now()): number {\n // Calculate age in seconds\n const ageInMilliseconds = currentTime - entry.timestamp;\n const ageInSeconds = Math.max(0, ageInMilliseconds / 1000);\n\n // Calculate decay factor\n const decay = calculateDecay(ageInSeconds, entry.ttl);\n\n // Base score reduced by decay\n let score = entry.score * (1 - decay);\n\n // Access count bonus (diminishing returns via log)\n if (entry.accessCount > 0) {\n const accessBonus = Math.log(entry.accessCount + 1) * 0.1;\n score = Math.min(1.0, score + accessBonus);\n }\n\n // BTSP entries maintain high score\n if (entry.isBTSP) {\n score = Math.max(score, 0.9);\n }\n\n // Recency boost for non-BTSP entries within the recency window\n if (!entry.isBTSP && recencyWindowMs > 0) {\n const ageMs = currentTime - entry.timestamp;\n if (ageMs >= 0 && ageMs < recencyWindowMs) {\n const boostFactor = 1 + (recencyMultiplier - 1) * (1 - ageMs / recencyWindowMs);\n score = score * boostFactor;\n }\n }\n\n return Math.max(0, Math.min(1, score));\n }\n\n function refreshTTL(entry: MemoryEntry): MemoryEntry {\n return {\n ...entry,\n ttl: defaultTTL * 3600, // Convert hours to seconds\n timestamp: Date.now(),\n };\n }\n\n return {\n calculateScore,\n refreshTTL,\n calculateDecay,\n };\n}\n","/**\n * Shared TF-IDF utilities\n *\n * Centralized text tokenization and TF-IDF scoring used by\n * sparse-pruner, budget-pruner, incremental-optimizer, and sleep-compressor.\n */\n\nimport type { MemoryEntry } from '../types/memory.js';\n\n/**\n * Tokenize text into lowercase words\n */\nexport function tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .split(/\\s+/)\n .filter((word) => word.length > 0);\n}\n\n/**\n * Calculate term frequency with sqrt capping\n */\nexport function calculateTF(term: string, tokens: string[]): number {\n const count = tokens.filter((t) => t === term).length;\n return Math.sqrt(count);\n}\n\n/**\n * Calculate inverse document frequency across entries\n */\nexport function calculateIDF(term: string, allEntries: MemoryEntry[]): number {\n const totalDocs = allEntries.length;\n const docsWithTerm = allEntries.filter((entry) => {\n const tokens = tokenize(entry.content);\n return tokens.includes(term);\n }).length;\n\n if (docsWithTerm === 0) return 0;\n\n return Math.log(totalDocs / docsWithTerm);\n}\n\n/**\n * Calculate TF-IDF score for an entry relative to a corpus\n */\nexport function calculateTFIDF(entry: MemoryEntry, allEntries: MemoryEntry[]): number {\n const tokens = tokenize(entry.content);\n if (tokens.length === 0) return 0;\n\n const uniqueTerms = [...new Set(tokens)];\n let totalScore = 0;\n\n for (const term of uniqueTerms) {\n const tf = calculateTF(term, tokens);\n const idf = calculateIDF(term, allEntries);\n totalScore += tf * idf;\n }\n\n // Normalize by entry length\n return totalScore / tokens.length;\n}\n\n/**\n * Pre-computed TF-IDF index for O(1) document frequency lookups.\n * Eliminates O(n^2) bottleneck when scoring multiple entries.\n */\nexport interface TFIDFIndex {\n /** Map of term -> number of documents containing the term */\n documentFrequency: Map<string, number>;\n /** Total number of documents in the corpus */\n totalDocuments: number;\n}\n\n/**\n * Build a pre-computed TF-IDF index from a set of entries.\n * Iterates all entries once to build document frequency map.\n *\n * @param entries - Corpus of memory entries\n * @returns Pre-computed index for use with scoreTFIDF()\n */\nexport function createTFIDFIndex(entries: MemoryEntry[]): TFIDFIndex {\n const documentFrequency = new Map<string, number>();\n\n for (const entry of entries) {\n const tokens = tokenize(entry.content);\n const uniqueTerms = new Set(tokens);\n\n for (const term of uniqueTerms) {\n documentFrequency.set(term, (documentFrequency.get(term) || 0) + 1);\n }\n }\n\n return {\n documentFrequency,\n totalDocuments: entries.length,\n };\n}\n\n/**\n * Score an entry using a pre-computed TF-IDF index.\n * Uses pre-computed document frequencies instead of re-tokenizing all entries.\n *\n * @param entry - Entry to score\n * @param index - Pre-computed TF-IDF index from createTFIDFIndex()\n * @returns TF-IDF score (higher = more distinctive)\n */\nexport function scoreTFIDF(entry: MemoryEntry, index: TFIDFIndex): number {\n const tokens = tokenize(entry.content);\n if (tokens.length === 0) return 0;\n\n const uniqueTerms = new Set(tokens);\n let totalScore = 0;\n\n for (const term of uniqueTerms) {\n const tf = calculateTF(term, tokens);\n const docsWithTerm = index.documentFrequency.get(term) || 0;\n\n if (docsWithTerm === 0) continue;\n\n const idf = Math.log(index.totalDocuments / docsWithTerm);\n totalScore += tf * idf;\n }\n\n // Normalize by entry length\n return totalScore / tokens.length;\n}\n","/**\n * Sparse Pruner - Relevance filtering\n *\n * Keeps only the top 2-5% most relevant context entries by TF-IDF score.\n * Low-scoring entries are pruned to reduce token usage.\n */\n\nimport type { MemoryEntry } from '../types/memory.js';\nimport type { PruneResult } from '../types/pruner.js';\nimport { createTFIDFIndex, scoreTFIDF } from '../utils/tfidf.js';\nimport { estimateTokens } from '../utils/tokenizer.js';\n\nexport interface SparsePrunerConfig {\n /** Percentage threshold for pruning (e.g., 5 = keep top 5%) */\n threshold: number;\n}\n\nexport interface SparsePruner {\n /**\n * Prune entries to keep only top N% by relevance score\n * @param entries - Memory entries to prune\n * @returns Result with kept/removed entries and token counts\n */\n prune(entries: MemoryEntry[]): PruneResult;\n\n /**\n * Calculate TF-IDF relevance score for a single entry\n * @param entry - Entry to score\n * @param allEntries - All entries for IDF calculation\n * @returns Relevance score (0.0-1.0)\n */\n scoreEntry(entry: MemoryEntry, allEntries: MemoryEntry[]): number;\n}\n\n/**\n * Create a sparse pruner instance\n * @param config - Pruner configuration\n * @returns SparsePruner instance\n */\nexport function createSparsePruner(config: SparsePrunerConfig): SparsePruner {\n const { threshold } = config;\n\n function scoreEntry(entry: MemoryEntry, allEntries: MemoryEntry[]): number {\n return scoreTFIDF(entry, createTFIDFIndex(allEntries));\n }\n\n function prune(entries: MemoryEntry[]): PruneResult {\n if (entries.length === 0) {\n return {\n kept: [],\n removed: [],\n originalTokens: 0,\n prunedTokens: 0,\n };\n }\n\n // Calculate original token count\n const originalTokens = entries.reduce((sum, e) => sum + estimateTokens(e.content), 0);\n\n // Build TF-IDF index once for all entries\n const tfidfIndex = createTFIDFIndex(entries);\n\n // Score all entries using pre-computed index\n const scored = entries.map((entry) => ({\n entry,\n score: scoreTFIDF(entry, tfidfIndex),\n }));\n\n // Sort by score descending\n scored.sort((a, b) => b.score - a.score);\n\n // Keep top N% (minimum 1 entry)\n const keepCount = Math.max(1, Math.ceil(entries.length * (threshold / 100)));\n const kept = scored.slice(0, keepCount).map((s) => s.entry);\n const removed = scored.slice(keepCount).map((s) => s.entry);\n\n // Calculate pruned token count\n const prunedTokens = kept.reduce((sum, e) => sum + estimateTokens(e.content), 0);\n\n return {\n kept,\n removed,\n originalTokens,\n prunedTokens,\n };\n }\n\n return {\n prune,\n scoreEntry,\n };\n}\n","/**\n * Generic Adapter - Agent-agnostic optimization pipeline\n *\n * Orchestrates all optimization modules to process context memory.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport { createBTSPEmbedder } from '../core/btsp-embedder.js';\nimport { createConfidenceStates } from '../core/confidence-states.js';\nimport { createEngramScorer } from '../core/engram-scorer.js';\nimport type { KVMemory } from '../core/kv-memory.js';\nimport { createSparsePruner } from '../core/sparse-pruner.js';\nimport type { AgentAdapter, OptimizationResult, OptimizeOptions } from '../types/adapter.js';\nimport type { SparnConfig } from '../types/config.js';\nimport type { MemoryEntry } from '../types/memory.js';\nimport { hashContent } from '../utils/hash.js';\nimport { estimateTokens } from '../utils/tokenizer.js';\n\n/**\n * Create a generic adapter instance\n * @param memory - KV memory store\n * @param config - Sparn configuration\n * @returns AgentAdapter instance\n */\nexport function createGenericAdapter(memory: KVMemory, config: SparnConfig): AgentAdapter {\n const pruner = createSparsePruner(config.pruning);\n const scorer = createEngramScorer(config.decay);\n const states = createConfidenceStates(config.states);\n const btsp = createBTSPEmbedder({ customPatterns: config.btspPatterns });\n\n async function optimize(\n context: string,\n options: OptimizeOptions = {},\n ): Promise<OptimizationResult> {\n const startTime = Date.now();\n\n // Parse context into entries (line-based for simplicity)\n const lines = context.split('\\n').filter((line) => line.trim().length > 0);\n const now = Date.now();\n const entries: MemoryEntry[] = lines.map((content, index) => {\n const isBTSP = btsp.detectBTSP(content);\n return {\n id: randomUUID(),\n content,\n hash: hashContent(content),\n timestamp: now + index, // Unique timestamps preserve ordering\n score: isBTSP ? 1.0 : 0.5,\n ttl: config.decay.defaultTTL * 3600,\n state: 'ready' as const,\n accessCount: 0,\n tags: [],\n metadata: {},\n isBTSP,\n };\n });\n\n // Calculate original token count\n const tokensBefore = entries.reduce((sum, e) => sum + estimateTokens(e.content), 0);\n\n // Step 1: Update scores with decay\n const scoredEntries = entries.map((entry) => ({\n ...entry,\n score: scorer.calculateScore(entry),\n }));\n\n // Step 2: Transition states based on scores\n const statedEntries = scoredEntries.map((entry) => states.transition(entry));\n\n // Step 3: Apply sparse pruning\n const pruneResult = pruner.prune(statedEntries);\n\n // Step 4: Keep active and ready entries, discard silent\n const optimizedEntries = pruneResult.kept.filter(\n (e) => e.state === 'active' || e.state === 'ready',\n );\n\n // Calculate final token count\n const tokensAfter = optimizedEntries.reduce((sum, e) => sum + estimateTokens(e.content), 0);\n\n // Reconstruct optimized context\n const optimizedContext = optimizedEntries.map((e) => e.content).join('\\n');\n\n // Store entries in memory (if not dry run)\n if (!options.dryRun) {\n for (const entry of optimizedEntries) {\n await memory.put(entry);\n }\n\n // Record optimization statistics\n await memory.recordOptimization({\n timestamp: Date.now(),\n tokens_before: tokensBefore,\n tokens_after: tokensAfter,\n entries_pruned: entries.length - optimizedEntries.length,\n duration_ms: Date.now() - startTime,\n });\n }\n\n // Get state distribution\n const distribution = states.getDistribution(optimizedEntries);\n\n const result: OptimizationResult = {\n optimizedContext,\n tokensBefore,\n tokensAfter,\n reduction: tokensBefore > 0 ? (tokensBefore - tokensAfter) / tokensBefore : 0,\n entriesProcessed: entries.length,\n entriesKept: optimizedEntries.length,\n stateDistribution: distribution,\n durationMs: Date.now() - startTime,\n };\n\n // Add verbose details if requested\n if (options.verbose) {\n result.details = optimizedEntries.map((e) => ({\n id: e.id,\n score: e.score,\n state: e.state,\n isBTSP: e.isBTSP,\n tokens: estimateTokens(e.content),\n }));\n }\n\n return result;\n }\n\n return {\n optimize,\n };\n}\n","/**\n * Optimize Command - Apply multi-stage optimization to context\n */\n\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { createGenericAdapter } from '../../adapters/generic.js';\nimport type { KVMemory } from '../../core/kv-memory.js';\nimport type { OptimizationResult } from '../../types/adapter.js';\nimport { DEFAULT_CONFIG } from '../../types/config.js';\n\nexport interface OptimizeCommandOptions {\n /** Input context (if not provided, reads from stdin) */\n input?: string;\n /** Input file path */\n inputFile?: string;\n /** Output file path (if not provided, writes to stdout) */\n outputFile?: string;\n /** Memory store instance */\n memory: KVMemory;\n /** Dry run mode (don't save to memory) */\n dryRun?: boolean;\n /** Verbose mode (show per-entry details) */\n verbose?: boolean;\n}\n\nexport interface OptimizeCommandResult extends OptimizationResult {\n output: string;\n outputFile?: string;\n}\n\n/**\n * Execute the optimize command\n * @param options - Command options\n * @returns Optimization result\n */\nexport async function optimizeCommand(\n options: OptimizeCommandOptions,\n): Promise<OptimizeCommandResult> {\n const { memory, dryRun = false, verbose = false } = options;\n\n // Read input from file or direct input\n let input: string;\n if (options.inputFile) {\n input = await readFile(options.inputFile, 'utf-8');\n } else if (options.input) {\n input = options.input;\n } else {\n throw new Error('No input provided. Use --input or --input-file');\n }\n\n // Create adapter and optimize\n const adapter = createGenericAdapter(memory, DEFAULT_CONFIG);\n const result = await adapter.optimize(input, { dryRun, verbose });\n\n // Write output to file or return\n if (options.outputFile) {\n await writeFile(options.outputFile, result.optimizedContext, 'utf-8');\n }\n\n return {\n ...result,\n output: result.optimizedContext,\n outputFile: options.outputFile,\n };\n}\n","/**\n * Stats Command - View optimization statistics\n */\n\nimport type { KVMemory } from '../../core/kv-memory.js';\n\nexport interface StatsCommandOptions {\n /** Memory store instance */\n memory: KVMemory;\n /** Display ASCII bar chart */\n graph?: boolean;\n /** Reset statistics */\n reset?: boolean;\n /** Auto-confirm reset (for testing) */\n confirmReset?: boolean;\n /** Output JSON format */\n json?: boolean;\n}\n\nexport interface StatsCommandResult {\n /** Total number of optimization commands run */\n totalCommands: number;\n /** Total tokens saved across all optimizations */\n totalTokensSaved: number;\n /** Average reduction percentage (0.0-1.0) */\n averageReduction: number;\n /** ASCII bar chart (if graph=true) */\n graph?: string;\n /** JSON output (if json=true) */\n json?: string;\n /** Reset was confirmed (if reset=true) */\n resetConfirmed?: boolean;\n}\n\n/**\n * Execute the stats command\n * @param options - Command options\n * @returns Statistics result\n */\nexport async function statsCommand(options: StatsCommandOptions): Promise<StatsCommandResult> {\n const { memory, graph, reset, confirmReset, json } = options;\n\n // Handle reset\n if (reset) {\n if (confirmReset) {\n await memory.clearOptimizationStats();\n return {\n totalCommands: 0,\n totalTokensSaved: 0,\n averageReduction: 0,\n resetConfirmed: true,\n };\n }\n }\n\n // Get optimization stats from database\n const stats = await memory.getOptimizationStats();\n\n // Calculate aggregations\n const totalCommands = stats.length;\n\n const totalTokensSaved = stats.reduce((sum, s) => sum + (s.tokens_before - s.tokens_after), 0);\n\n const averageReduction =\n totalCommands > 0\n ? stats.reduce((sum, s) => {\n const reduction =\n s.tokens_before > 0 ? (s.tokens_before - s.tokens_after) / s.tokens_before : 0;\n return sum + reduction;\n }, 0) / totalCommands\n : 0;\n\n const result: StatsCommandResult = {\n totalCommands,\n totalTokensSaved,\n averageReduction,\n };\n\n // Generate ASCII bar chart if requested\n if (graph && totalCommands > 0) {\n result.graph = generateBarChart(stats);\n }\n\n // Generate JSON output if requested\n if (json) {\n result.json = JSON.stringify(\n {\n totalCommands,\n totalTokensSaved,\n averageReduction: Math.round(averageReduction * 1000) / 10, // Convert to percentage\n optimizations: stats.map((s) => ({\n timestamp: s.timestamp,\n tokensBefore: s.tokens_before,\n tokensAfter: s.tokens_after,\n entriesPruned: s.entries_pruned,\n durationMs: s.duration_ms,\n reduction: Math.round(((s.tokens_before - s.tokens_after) / s.tokens_before) * 1000) / 10,\n })),\n },\n null,\n 2,\n );\n }\n\n return result;\n}\n\n/**\n * Generate ASCII bar chart for optimization history\n * @param stats - Optimization statistics\n * @returns ASCII bar chart string\n */\nfunction generateBarChart(\n stats: Array<{ tokens_before: number; tokens_after: number; timestamp: number }>,\n): string {\n const maxBars = 20; // Maximum number of bars to display\n const recentStats = stats.slice(0, maxBars);\n\n const lines: string[] = [];\n lines.push('\\nOptimization History (most recent first):\\n');\n\n // Find max reduction for scaling\n const maxReduction = Math.max(...recentStats.map((s) => s.tokens_before - s.tokens_after));\n\n for (let i = 0; i < recentStats.length; i++) {\n const s = recentStats[i];\n if (!s) continue; // Skip undefined entries\n\n const reduction = s.tokens_before - s.tokens_after;\n const reductionPct = s.tokens_before > 0 ? (reduction / s.tokens_before) * 100 : 0;\n\n // Scale bar length (max 40 chars)\n const barLength = Math.round((reduction / maxReduction) * 40);\n const bar = 'โ'.repeat(barLength);\n\n // Format timestamp\n const date = new Date(s.timestamp);\n const timeStr = date.toLocaleTimeString();\n\n lines.push(`${timeStr} โ ${bar} ${reductionPct.toFixed(1)}%`);\n }\n\n return lines.join('\\n');\n}\n","/**\n * Relay Command - Proxy CLI commands through optimization\n */\n\nimport { spawn } from 'node:child_process';\nimport { createGenericAdapter } from '../../adapters/generic.js';\nimport type { KVMemory } from '../../core/kv-memory.js';\nimport { DEFAULT_CONFIG } from '../../types/config.js';\n\nexport interface RelayCommandOptions {\n /** Command to execute */\n command: string;\n /** Command arguments */\n args: string[];\n /** Memory store instance */\n memory: KVMemory;\n /** Silent mode (suppress summary) */\n silent?: boolean;\n}\n\nexport interface RelayCommandResult {\n /** Exit code from proxied command */\n exitCode: number;\n /** Original command output */\n originalOutput: string;\n /** Optimized output */\n optimizedOutput: string;\n /** Original token count */\n tokensBefore: number;\n /** Optimized token count */\n tokensAfter: number;\n /** Token reduction percentage */\n reduction: number;\n /** One-line summary (if not silent) */\n summary?: string;\n}\n\n/**\n * Execute a command and optimize its output\n * @param options - Command options\n * @returns Relay result\n */\nexport async function relayCommand(options: RelayCommandOptions): Promise<RelayCommandResult> {\n const { command, args, memory, silent = false } = options;\n\n // Execute child process and capture output\n const { stdout, stderr, exitCode } = await executeCommand(command, args);\n\n // Combine stdout and stderr\n const originalOutput = stdout + stderr;\n\n // Optimize the output\n const adapter = createGenericAdapter(memory, DEFAULT_CONFIG);\n const optimizationResult = await adapter.optimize(originalOutput, {\n dryRun: true, // Don't save relay outputs to memory\n verbose: false,\n });\n\n const result: RelayCommandResult = {\n exitCode,\n originalOutput,\n optimizedOutput: optimizationResult.optimizedContext,\n tokensBefore: optimizationResult.tokensBefore,\n tokensAfter: optimizationResult.tokensAfter,\n reduction: optimizationResult.reduction,\n };\n\n // Generate summary if not silent\n if (!silent && result.tokensBefore > 0) {\n const reductionPct = (result.reduction * 100).toFixed(1);\n result.summary = `๐ ${result.tokensBefore} โ ${result.tokensAfter} tokens (${reductionPct}% reduction)`;\n }\n\n return result;\n}\n\n/**\n * Execute a command and capture its output\n * @param command - Command to execute\n * @param args - Command arguments\n * @returns Command output and exit code\n */\nfunction executeCommand(\n command: string,\n args: string[],\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n return new Promise((resolve) => {\n const child = spawn(command, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n child.on('close', (code) => {\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 0,\n });\n });\n\n child.on('error', (error) => {\n resolve({\n stdout,\n stderr: error.message,\n exitCode: 1,\n });\n });\n });\n}\n","/**\n * Sleep Compressor - Periodic consolidation\n *\n * Removes decayed entries and merges duplicates to keep the memory store lean.\n * Runs on demand or on a scheduled interval via the daemon.\n */\n\nimport type { ConsolidateResult, DuplicateGroup } from '../types/consolidate.js';\nimport type { MemoryEntry } from '../types/memory.js';\nimport { tokenize } from '../utils/tfidf.js';\nimport { createEngramScorer } from './engram-scorer.js';\n\nexport interface SleepCompressor {\n /**\n * Consolidate entries: remove decayed, merge duplicates\n * @param entries - All memory entries\n * @returns Consolidation result\n */\n consolidate(entries: MemoryEntry[]): ConsolidateResult;\n\n /**\n * Find duplicate entries (exact hash or near-duplicate by similarity)\n * @param entries - Memory entries\n * @returns Groups of duplicates\n */\n findDuplicates(entries: MemoryEntry[]): DuplicateGroup[];\n\n /**\n * Merge duplicate entries, keeping highest score\n * @param groups - Duplicate groups\n * @returns Merged entries\n */\n mergeDuplicates(groups: DuplicateGroup[]): MemoryEntry[];\n}\n\n/**\n * Create a sleep compressor instance\n * @returns SleepCompressor instance\n */\nexport function createSleepCompressor(): SleepCompressor {\n const scorer = createEngramScorer({ defaultTTL: 24, decayThreshold: 0.95 });\n\n function consolidate(entries: MemoryEntry[]): ConsolidateResult {\n const startTime = Date.now();\n const originalCount = entries.length;\n\n // Step 1: Remove fully decayed entries (decay โฅ 0.95)\n const now = Date.now();\n const nonDecayed = entries.filter((entry) => {\n const ageInSeconds = (now - entry.timestamp) / 1000;\n const decay = scorer.calculateDecay(ageInSeconds, entry.ttl);\n return decay < 0.95; // Keep entries with decay < 0.95\n });\n\n const decayedRemoved = originalCount - nonDecayed.length;\n\n // Step 2: Find and merge duplicates\n const duplicateGroups = findDuplicates(nonDecayed);\n const merged = mergeDuplicates(duplicateGroups);\n\n // Step 3: Keep non-duplicates\n const duplicateIds = new Set(duplicateGroups.flatMap((g) => g.entries.map((e) => e.id)));\n const nonDuplicates = nonDecayed.filter((e) => !duplicateIds.has(e.id));\n\n // Combine merged duplicates with non-duplicates\n const kept = [...merged, ...nonDuplicates];\n const removed = entries.filter((e) => !kept.some((k) => k.id === e.id));\n\n const duplicatesRemoved = duplicateGroups.reduce((sum, g) => sum + (g.entries.length - 1), 0);\n\n return {\n kept,\n removed,\n entriesBefore: originalCount,\n entriesAfter: kept.length,\n decayedRemoved,\n duplicatesRemoved,\n compressionRatio: originalCount > 0 ? kept.length / originalCount : 0,\n durationMs: Date.now() - startTime,\n };\n }\n\n function findDuplicates(entries: MemoryEntry[]): DuplicateGroup[] {\n const groups: DuplicateGroup[] = [];\n const processed = new Set<string>();\n\n // Find exact hash matches\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n if (!entry || processed.has(entry.id)) continue;\n\n const duplicates = entries.filter((e, idx) => idx !== i && e.hash === entry.hash);\n\n if (duplicates.length > 0) {\n const group: DuplicateGroup = {\n entries: [entry, ...duplicates],\n similarity: 1.0, // Exact match\n };\n groups.push(group);\n\n // Mark as processed\n processed.add(entry.id);\n for (const dup of duplicates) {\n processed.add(dup.id);\n }\n }\n }\n\n // Find near-duplicates (cosine similarity โฅ 0.85)\n for (let i = 0; i < entries.length; i++) {\n const entryI = entries[i];\n if (!entryI || processed.has(entryI.id)) continue;\n\n for (let j = i + 1; j < entries.length; j++) {\n const entryJ = entries[j];\n if (!entryJ || processed.has(entryJ.id)) continue;\n\n const similarity = cosineSimilarity(entryI.content, entryJ.content);\n\n if (similarity >= 0.85) {\n const group: DuplicateGroup = {\n entries: [entryI, entryJ],\n similarity,\n };\n groups.push(group);\n\n processed.add(entryI.id);\n processed.add(entryJ.id);\n break; // Move to next i\n }\n }\n }\n\n return groups;\n }\n\n function mergeDuplicates(groups: DuplicateGroup[]): MemoryEntry[] {\n const merged: MemoryEntry[] = [];\n\n for (const group of groups) {\n // Keep entry with highest score\n const sorted = [...group.entries].sort((a, b) => b.score - a.score);\n const best = sorted[0];\n if (!best) continue; // Skip empty groups\n\n // Sum access counts\n const totalAccessCount = group.entries.reduce((sum, e) => sum + e.accessCount, 0);\n\n // Merge tags\n const allTags = new Set(group.entries.flatMap((e) => e.tags));\n\n merged.push({\n ...best,\n accessCount: totalAccessCount,\n tags: Array.from(allTags),\n });\n }\n\n return merged;\n }\n\n /**\n * Calculate cosine similarity between two text strings\n * @param text1 - First text\n * @param text2 - Second text\n * @returns Similarity score (0.0-1.0)\n */\n function cosineSimilarity(text1: string, text2: string): number {\n const words1 = tokenize(text1);\n const words2 = tokenize(text2);\n\n // Build word frequency vectors in single pass each\n const vec1: Record<string, number> = {};\n const vec2: Record<string, number> = {};\n\n for (const word of words1) {\n vec1[word] = (vec1[word] ?? 0) + 1;\n }\n for (const word of words2) {\n vec2[word] = (vec2[word] ?? 0) + 1;\n }\n\n const vocab = new Set([...words1, ...words2]);\n\n // Calculate dot product and magnitudes\n let dotProduct = 0;\n let mag1 = 0;\n let mag2 = 0;\n\n for (const word of vocab) {\n const count1 = vec1[word] ?? 0;\n const count2 = vec2[word] ?? 0;\n dotProduct += count1 * count2;\n mag1 += count1 * count1;\n mag2 += count2 * count2;\n }\n\n mag1 = Math.sqrt(mag1);\n mag2 = Math.sqrt(mag2);\n\n if (mag1 === 0 || mag2 === 0) return 0;\n\n return dotProduct / (mag1 * mag2);\n }\n\n return {\n consolidate,\n findDuplicates,\n mergeDuplicates,\n };\n}\n","/**\n * Consolidate Command - Periodic memory consolidation\n */\n\nimport type { KVMemory } from '../../core/kv-memory.js';\nimport { createSleepCompressor } from '../../core/sleep-compressor.js';\n\nexport interface ConsolidateCommandOptions {\n /** Memory store instance */\n memory: KVMemory;\n}\n\nexport interface ConsolidateCommandResult {\n /** Entries before consolidation */\n entriesBefore: number;\n /** Entries after consolidation */\n entriesAfter: number;\n /** Decayed entries removed */\n decayedRemoved: number;\n /** Duplicate entries merged */\n duplicatesRemoved: number;\n /** Compression ratio (0.0-1.0) */\n compressionRatio: number;\n /** Duration in milliseconds */\n durationMs: number;\n /** VACUUM completed */\n vacuumCompleted: boolean;\n}\n\n/**\n * Execute the consolidate command\n * @param options - Command options\n * @returns Consolidation result\n */\nexport async function consolidateCommand(\n options: ConsolidateCommandOptions,\n): Promise<ConsolidateCommandResult> {\n const { memory } = options;\n\n // Get all entries from memory\n const allIds = await memory.list();\n const allEntries = await Promise.all(\n allIds.map(async (id) => {\n const entry = await memory.get(id);\n return entry;\n }),\n );\n\n // Filter out nulls\n const entries = allEntries.filter((e) => e !== null);\n\n // Run consolidation\n const compressor = createSleepCompressor();\n const result = compressor.consolidate(entries);\n\n // Update memory: remove old entries, keep consolidated ones\n for (const removed of result.removed) {\n await memory.delete(removed.id);\n }\n\n for (const kept of result.kept) {\n await memory.put(kept);\n }\n\n // Run VACUUM to reclaim space\n await memory.compact();\n\n return {\n entriesBefore: result.entriesBefore,\n entriesAfter: result.entriesAfter,\n decayedRemoved: result.decayedRemoved,\n duplicatesRemoved: result.duplicatesRemoved,\n compressionRatio: result.compressionRatio,\n durationMs: result.durationMs,\n vacuumCompleted: true,\n };\n}\n","/**\n * Config Command - View or modify configuration\n */\n\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { load as parseYAML, dump as stringifyYAML } from 'js-yaml';\nimport type { SparnConfig } from '../../types/config.js';\n\nexport interface ConfigCommandOptions {\n /** Path to config.yaml file */\n configPath: string;\n /** Subcommand: get or set */\n subcommand?: 'get' | 'set';\n /** Config key (dotted path) */\n key?: string;\n /** Config value (for set) */\n value?: string;\n /** Output JSON format */\n json?: boolean;\n}\n\nexport interface ConfigCommandResult {\n /** Command succeeded */\n success: boolean;\n /** Result message */\n message?: string;\n /** Error message */\n error?: string;\n /** Retrieved value (for get) */\n value?: unknown;\n /** Editor path (for no subcommand) */\n editorPath?: string;\n /** JSON output */\n json?: string;\n}\n\n/**\n * Valid config keys with their validation rules\n */\nconst CONFIG_SCHEMA: Record<\n string,\n {\n path: string[];\n validate: (value: unknown) => boolean;\n errorMessage: string;\n parse: (value: string) => unknown;\n }\n> = {\n 'pruning.threshold': {\n path: ['pruning', 'threshold'],\n validate: (v) => typeof v === 'number' && v >= 1 && v <= 100,\n errorMessage: 'threshold must be between 1-100',\n parse: (v) => Number.parseInt(v, 10),\n },\n 'pruning.aggressiveness': {\n path: ['pruning', 'aggressiveness'],\n validate: (v) => typeof v === 'number' && v >= 0 && v <= 100,\n errorMessage: 'aggressiveness must be between 0-100',\n parse: (v) => Number.parseInt(v, 10),\n },\n 'decay.defaultTTL': {\n path: ['decay', 'defaultTTL'],\n validate: (v) => typeof v === 'number' && v > 0,\n errorMessage: 'defaultTTL must be a positive number (hours)',\n parse: (v) => Number.parseFloat(v),\n },\n 'decay.decayThreshold': {\n path: ['decay', 'decayThreshold'],\n validate: (v) => typeof v === 'number' && v >= 0.0 && v <= 1.0,\n errorMessage: 'decayThreshold must be between 0.0-1.0',\n parse: (v) => Number.parseFloat(v),\n },\n 'states.activeThreshold': {\n path: ['states', 'activeThreshold'],\n validate: (v) => typeof v === 'number' && v >= 0.0 && v <= 1.0,\n errorMessage: 'activeThreshold must be between 0.0-1.0',\n parse: (v) => Number.parseFloat(v),\n },\n 'states.readyThreshold': {\n path: ['states', 'readyThreshold'],\n validate: (v) => typeof v === 'number' && v >= 0.0 && v <= 1.0,\n errorMessage: 'readyThreshold must be between 0.0-1.0',\n parse: (v) => Number.parseFloat(v),\n },\n agent: {\n path: ['agent'],\n validate: (v) => v === 'claude-code' || v === 'generic',\n errorMessage: 'agent must be \"claude-code\" or \"generic\"',\n parse: (v) => v,\n },\n 'ui.colors': {\n path: ['ui', 'colors'],\n validate: (v) => typeof v === 'boolean',\n errorMessage: 'colors must be true or false',\n parse: (v) => v === 'true',\n },\n 'ui.sounds': {\n path: ['ui', 'sounds'],\n validate: (v) => typeof v === 'boolean',\n errorMessage: 'sounds must be true or false',\n parse: (v) => v === 'true',\n },\n 'ui.verbose': {\n path: ['ui', 'verbose'],\n validate: (v) => typeof v === 'boolean',\n errorMessage: 'verbose must be true or false',\n parse: (v) => v === 'true',\n },\n autoConsolidate: {\n path: ['autoConsolidate'],\n validate: (v) => v === null || (typeof v === 'number' && v > 0),\n errorMessage: 'autoConsolidate must be a positive number (hours) or null',\n parse: (v) => (v === 'null' ? null : Number.parseFloat(v)),\n },\n 'realtime.tokenBudget': {\n path: ['realtime', 'tokenBudget'],\n validate: (v) => typeof v === 'number' && v > 0,\n errorMessage: 'tokenBudget must be a positive number',\n parse: (v) => Number.parseInt(v, 10),\n },\n 'realtime.autoOptimizeThreshold': {\n path: ['realtime', 'autoOptimizeThreshold'],\n validate: (v) => typeof v === 'number' && v > 0,\n errorMessage: 'autoOptimizeThreshold must be a positive number',\n parse: (v) => Number.parseInt(v, 10),\n },\n 'realtime.watchPatterns': {\n path: ['realtime', 'watchPatterns'],\n validate: (v) => Array.isArray(v) && v.every((p) => typeof p === 'string'),\n errorMessage: 'watchPatterns must be an array of strings',\n parse: (v) => v.split(',').map((p) => p.trim()),\n },\n 'realtime.pidFile': {\n path: ['realtime', 'pidFile'],\n validate: (v) => typeof v === 'string' && v.length > 0,\n errorMessage: 'pidFile must be a non-empty string',\n parse: (v) => v,\n },\n 'realtime.logFile': {\n path: ['realtime', 'logFile'],\n validate: (v) => typeof v === 'string' && v.length > 0,\n errorMessage: 'logFile must be a non-empty string',\n parse: (v) => v,\n },\n 'realtime.debounceMs': {\n path: ['realtime', 'debounceMs'],\n validate: (v) => typeof v === 'number' && v >= 0,\n errorMessage: 'debounceMs must be a non-negative number',\n parse: (v) => Number.parseInt(v, 10),\n },\n 'realtime.incremental': {\n path: ['realtime', 'incremental'],\n validate: (v) => typeof v === 'boolean',\n errorMessage: 'incremental must be true or false',\n parse: (v) => v === 'true',\n },\n 'realtime.windowSize': {\n path: ['realtime', 'windowSize'],\n validate: (v) => typeof v === 'number' && v > 0,\n errorMessage: 'windowSize must be a positive number',\n parse: (v) => Number.parseInt(v, 10),\n },\n};\n\n/**\n * Execute the config command\n * @param options - Command options\n * @returns Config result\n */\nexport async function configCommand(options: ConfigCommandOptions): Promise<ConfigCommandResult> {\n const { configPath, subcommand, key, value, json } = options;\n\n try {\n // Read config file\n const configYAML = readFileSync(configPath, 'utf-8');\n const config = parseYAML(configYAML) as SparnConfig;\n\n // No subcommand: open editor or return JSON\n if (!subcommand) {\n if (json) {\n return {\n success: true,\n json: JSON.stringify(config, null, 2),\n };\n }\n return {\n success: true,\n editorPath: configPath,\n message: `Config file: ${configPath}`,\n };\n }\n\n // Get subcommand\n if (subcommand === 'get') {\n if (!key) {\n return {\n success: false,\n error: 'Key required for get command',\n };\n }\n\n const schema = CONFIG_SCHEMA[key];\n if (!schema) {\n return {\n success: false,\n error: `Invalid key: ${key}. Run 'sparn config' to see available keys.`,\n };\n }\n\n const retrievedValue = getNestedValue(\n config as unknown as Record<string, unknown>,\n schema.path,\n );\n\n if (json) {\n return {\n success: true,\n value: retrievedValue,\n json: JSON.stringify({ key, value: retrievedValue }, null, 2),\n };\n }\n\n return {\n success: true,\n value: retrievedValue,\n message: String(retrievedValue),\n };\n }\n\n // Set subcommand\n if (subcommand === 'set') {\n if (!key) {\n return {\n success: false,\n error: 'Key required for set command',\n };\n }\n\n if (value === undefined) {\n return {\n success: false,\n error: 'Value required for set command',\n };\n }\n\n const schema = CONFIG_SCHEMA[key];\n if (!schema) {\n return {\n success: false,\n error: `Invalid key: ${key}. Run 'sparn config' to see available keys.`,\n };\n }\n\n // Parse and validate value\n const parsedValue = schema.parse(value);\n if (!schema.validate(parsedValue)) {\n return {\n success: false,\n error: `Invalid value for ${key}: ${schema.errorMessage}`,\n };\n }\n\n // Update config\n setNestedValue(config as unknown as Record<string, unknown>, schema.path, parsedValue);\n\n // Write back to file\n const updatedYAML = stringifyYAML(config);\n writeFileSync(configPath, updatedYAML, 'utf-8');\n\n return {\n success: true,\n message: `Config updated: ${key} = ${parsedValue}`,\n };\n }\n\n return {\n success: false,\n error: `Unknown subcommand: ${subcommand}`,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Get nested value from object using path array\n * @param obj - Object to query\n * @param path - Path array\n * @returns Nested value\n */\nfunction getNestedValue(obj: Record<string, unknown>, path: string[]): unknown {\n let current: unknown = obj;\n for (const key of path) {\n if (current && typeof current === 'object' && !Array.isArray(current) && key in current) {\n current = (current as Record<string, unknown>)[key];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\n/**\n * Set nested value in object using path array\n * @param obj - Object to mutate\n * @param path - Path array\n * @param value - Value to set\n */\nfunction setNestedValue(obj: Record<string, unknown>, path: string[], value: unknown): void {\n let current: Record<string, unknown> = obj;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (!key) continue;\n\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n const lastKey = path[path.length - 1];\n if (lastKey) {\n current[lastKey] = value;\n }\n}\n","/**\n * Daemon Process Manager - Background process lifecycle management\n *\n * Handles:\n * - Process forking and detachment\n * - PID file management\n * - Signal handling (SIGTERM, SIGINT)\n * - Daemon start/stop/status commands\n */\n\nimport { spawn } from 'node:child_process';\nimport { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { SparnConfig } from '../types/config.js';\n\nexport interface DaemonCommand {\n /** Start the daemon */\n start(config: SparnConfig): Promise<DaemonStartResult>;\n\n /** Stop the daemon */\n stop(config: SparnConfig): Promise<DaemonStopResult>;\n\n /** Get daemon status */\n status(config: SparnConfig): Promise<DaemonStatusResult>;\n}\n\nexport interface DaemonStartResult {\n success: boolean;\n pid?: number;\n message: string;\n error?: string;\n}\n\nexport interface DaemonStopResult {\n success: boolean;\n message: string;\n error?: string;\n}\n\nexport interface DaemonStatusResult {\n running: boolean;\n pid?: number;\n uptime?: number;\n sessionsWatched?: number;\n tokensSaved?: number;\n message: string;\n}\n\n/**\n * Create daemon command interface\n * @returns DaemonCommand instance\n */\nexport function createDaemonCommand(): DaemonCommand {\n /**\n * Check if daemon is running\n */\n function isDaemonRunning(pidFile: string): { running: boolean; pid?: number } {\n if (!existsSync(pidFile)) {\n return { running: false };\n }\n\n try {\n const pidStr = readFileSync(pidFile, 'utf-8').trim();\n const pid = Number.parseInt(pidStr, 10);\n\n if (Number.isNaN(pid)) {\n return { running: false };\n }\n\n // Check if process exists (cross-platform)\n try {\n process.kill(pid, 0); // Signal 0 checks existence without killing\n return { running: true, pid };\n } catch {\n // Process doesn't exist, clean up stale PID file\n unlinkSync(pidFile);\n return { running: false };\n }\n } catch {\n return { running: false };\n }\n }\n\n /**\n * Write PID file\n */\n function writePidFile(pidFile: string, pid: number): void {\n // Ensure directory exists\n const dir = dirname(pidFile);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(pidFile, String(pid), 'utf-8');\n }\n\n /**\n * Remove PID file\n */\n function removePidFile(pidFile: string): void {\n if (existsSync(pidFile)) {\n unlinkSync(pidFile);\n }\n }\n\n async function start(config: SparnConfig): Promise<DaemonStartResult> {\n const { pidFile, logFile } = config.realtime;\n\n // Check if already running\n const status = isDaemonRunning(pidFile);\n if (status.running) {\n return {\n success: false,\n pid: status.pid,\n message: `Daemon already running (PID ${status.pid})`,\n error: 'Already running',\n };\n }\n\n try {\n // Resolve daemon entry point path\n // daemon-process.ts is bundled into dist/cli/index.js by tsup,\n // so we navigate from dist/cli/ to dist/daemon/index.js\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const daemonPath = join(__dirname, '..', 'daemon', 'index.js');\n const isWindows = process.platform === 'win32';\n\n const childEnv = {\n ...process.env,\n SPARN_CONFIG: JSON.stringify(config),\n SPARN_PID_FILE: pidFile,\n SPARN_LOG_FILE: logFile,\n };\n\n // On Windows with Git Bash/MINGW, Node's detached:true doesn't\n // survive parent exit. Write a launcher script and run it with\n // PowerShell Start-Process which truly detaches.\n if (isWindows) {\n const configFile = join(dirname(pidFile), 'daemon-config.json');\n writeFileSync(configFile, JSON.stringify({ config, pidFile, logFile }), 'utf-8');\n\n // Create a tiny launcher script that sets env vars and runs the daemon\n const launcherFile = join(dirname(pidFile), 'daemon-launcher.mjs');\n const launcherCode = [\n `import { readFileSync } from 'node:fs';`,\n `const cfg = JSON.parse(readFileSync(${JSON.stringify(configFile)}, 'utf-8'));`,\n `process.env.SPARN_CONFIG = JSON.stringify(cfg.config);`,\n `process.env.SPARN_PID_FILE = cfg.pidFile;`,\n `process.env.SPARN_LOG_FILE = cfg.logFile;`,\n `await import(${JSON.stringify(`file:///${daemonPath.replace(/\\\\/g, '/')}`)});`,\n ].join('\\n');\n writeFileSync(launcherFile, launcherCode, 'utf-8');\n\n const ps = spawn(\n 'powershell.exe',\n [\n '-NoProfile',\n '-WindowStyle',\n 'Hidden',\n '-Command',\n `Start-Process -FilePath '${process.execPath}' -ArgumentList '${launcherFile}' -WindowStyle Hidden`,\n ],\n { stdio: 'ignore', windowsHide: true },\n );\n\n ps.unref();\n\n // Wait for daemon to write its own PID file\n await new Promise((resolve) => setTimeout(resolve, 2000));\n\n if (existsSync(pidFile)) {\n const pid = Number.parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);\n if (!Number.isNaN(pid)) {\n return {\n success: true,\n pid,\n message: `Daemon started (PID ${pid})`,\n };\n }\n }\n\n return {\n success: false,\n message: 'Daemon failed to start (no PID file written)',\n error: 'Timeout waiting for daemon PID',\n };\n }\n\n // Unix: standard detached spawn\n const child = spawn(process.execPath, [daemonPath], {\n detached: true,\n stdio: 'ignore',\n env: childEnv,\n });\n\n // Detach from parent\n child.unref();\n\n // Write PID file\n if (child.pid) {\n writePidFile(pidFile, child.pid);\n\n return {\n success: true,\n pid: child.pid,\n message: `Daemon started (PID ${child.pid})`,\n };\n }\n\n return {\n success: false,\n message: 'Failed to start daemon (no PID)',\n error: 'No PID',\n };\n } catch (error) {\n return {\n success: false,\n message: 'Failed to start daemon',\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async function stop(config: SparnConfig): Promise<DaemonStopResult> {\n const { pidFile } = config.realtime;\n\n const status = isDaemonRunning(pidFile);\n\n if (!status.running || !status.pid) {\n return {\n success: true,\n message: 'Daemon not running',\n };\n }\n\n try {\n // On Windows, SIGTERM is not supported by process.kill - it terminates immediately.\n // On Unix, SIGTERM allows graceful shutdown.\n const isWindows = process.platform === 'win32';\n\n if (isWindows) {\n // Windows: process.kill with any signal terminates the process\n process.kill(status.pid);\n } else {\n process.kill(status.pid, 'SIGTERM');\n }\n\n // Wait for process to exit (timeout after 5s)\n const maxWait = 5000;\n const interval = 100;\n let waited = 0;\n\n while (waited < maxWait) {\n try {\n process.kill(status.pid, 0);\n // Still running, wait\n await new Promise((resolve) => setTimeout(resolve, interval));\n waited += interval;\n } catch {\n // Process exited\n removePidFile(pidFile);\n return {\n success: true,\n message: `Daemon stopped (PID ${status.pid})`,\n };\n }\n }\n\n // Timeout, force kill\n try {\n if (!isWindows) {\n process.kill(status.pid, 'SIGKILL');\n }\n removePidFile(pidFile);\n return {\n success: true,\n message: `Daemon force killed (PID ${status.pid})`,\n };\n } catch {\n removePidFile(pidFile);\n return {\n success: true,\n message: `Daemon stopped (PID ${status.pid})`,\n };\n }\n } catch (error) {\n return {\n success: false,\n message: 'Failed to stop daemon',\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async function status(config: SparnConfig): Promise<DaemonStatusResult> {\n const { pidFile } = config.realtime;\n\n const daemonStatus = isDaemonRunning(pidFile);\n\n if (!daemonStatus.running || !daemonStatus.pid) {\n return {\n running: false,\n message: 'Daemon not running',\n };\n }\n\n // Note: getMetrics() returns this process's metrics, not the daemon's.\n // For accurate daemon metrics, we'd need IPC. For now, report basic status.\n return {\n running: true,\n pid: daemonStatus.pid,\n message: `Daemon running (PID ${daemonStatus.pid})`,\n };\n }\n\n return {\n start,\n stop,\n status,\n };\n}\n","/**\n * Hooks Command - Install/uninstall/status for Claude Code hooks\n *\n * Manages hook integration with Claude Code's settings.json file.\n * Uses the correct Claude Code hook format:\n * hooks.EventName = [{ matcher?, hooks: [{ type, command, timeout? }] }]\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface HooksCommandOptions {\n subcommand: 'install' | 'uninstall' | 'status';\n global?: boolean;\n}\n\nexport interface HooksCommandResult {\n success: boolean;\n message: string;\n error?: string;\n installed?: boolean;\n hookPaths?: {\n prePrompt: string;\n postToolResult: string;\n stopDocsRefresh: string;\n };\n}\n\n// Claude Code hook event names\nconst PRE_PROMPT_EVENT = 'UserPromptSubmit';\nconst POST_TOOL_EVENT = 'PostToolUse';\nconst STOP_DOCS_EVENT = 'Stop';\n\n// Matcher for which tools trigger the post-tool hook\nconst POST_TOOL_MATCHER = 'Bash|Read|Grep|Glob';\n\n// Marker to identify sparn-managed hooks\nconst SPARN_MARKER = 'sparn';\n\ninterface HookHandler {\n type: string;\n command: string;\n timeout?: number;\n}\n\ninterface HookMatcherGroup {\n matcher?: string;\n hooks: HookHandler[];\n}\n\ntype HooksConfig = Record<string, HookMatcherGroup[]>;\n\nexport async function hooksCommand(options: HooksCommandOptions): Promise<HooksCommandResult> {\n const { subcommand, global } = options;\n\n const settingsPath = global\n ? join(homedir(), '.claude', 'settings.json')\n : join(process.cwd(), '.claude', 'settings.json');\n\n // Find built hook scripts relative to this file\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const hooksDir = join(dirname(__dirname), 'hooks');\n const prePromptPath = join(hooksDir, 'pre-prompt.js');\n const postToolResultPath = join(hooksDir, 'post-tool-result.js');\n const stopDocsRefreshPath = join(hooksDir, 'stop-docs-refresh.js');\n\n switch (subcommand) {\n case 'install':\n return installHooks(\n settingsPath,\n prePromptPath,\n postToolResultPath,\n stopDocsRefreshPath,\n global,\n );\n case 'uninstall':\n return uninstallHooks(settingsPath, global);\n case 'status':\n return hooksStatus(settingsPath, global);\n default:\n return {\n success: false,\n message: `Unknown subcommand: ${subcommand}`,\n error: 'Invalid subcommand',\n };\n }\n}\n\nfunction installHooks(\n settingsPath: string,\n prePromptPath: string,\n postToolResultPath: string,\n stopDocsRefreshPath: string,\n global?: boolean,\n): HooksCommandResult {\n try {\n if (!existsSync(prePromptPath)) {\n return {\n success: false,\n message: `Hook script not found: ${prePromptPath}`,\n error: 'Hook scripts not built. Run `npm run build` first.',\n };\n }\n\n if (!existsSync(postToolResultPath)) {\n return {\n success: false,\n message: `Hook script not found: ${postToolResultPath}`,\n error: 'Hook scripts not built. Run `npm run build` first.',\n };\n }\n\n if (!existsSync(stopDocsRefreshPath)) {\n return {\n success: false,\n message: `Hook script not found: ${stopDocsRefreshPath}`,\n error: 'Hook scripts not built. Run `npm run build` first.',\n };\n }\n\n let settings: Record<string, unknown> = {};\n\n if (existsSync(settingsPath)) {\n const settingsJson = readFileSync(settingsPath, 'utf-8');\n settings = JSON.parse(settingsJson);\n } else {\n const claudeDir = dirname(settingsPath);\n if (!existsSync(claudeDir)) {\n mkdirSync(claudeDir, { recursive: true });\n }\n }\n\n // Get existing hooks or create empty object\n const hooks: HooksConfig =\n typeof settings['hooks'] === 'object' && settings['hooks'] !== null\n ? (settings['hooks'] as HooksConfig)\n : {};\n\n // Remove any existing sparn hooks first (clean install)\n removeSparnHooks(hooks);\n\n // Add UserPromptSubmit hook (pre-prompt optimization)\n if (!hooks[PRE_PROMPT_EVENT]) {\n hooks[PRE_PROMPT_EVENT] = [];\n }\n hooks[PRE_PROMPT_EVENT].push({\n hooks: [\n {\n type: 'command',\n command: `node \"${prePromptPath.replace(/\\\\/g, '/')}\"`,\n timeout: 10,\n },\n ],\n });\n\n // Add PostToolUse hook (output compression)\n if (!hooks[POST_TOOL_EVENT]) {\n hooks[POST_TOOL_EVENT] = [];\n }\n hooks[POST_TOOL_EVENT].push({\n matcher: POST_TOOL_MATCHER,\n hooks: [\n {\n type: 'command',\n command: `node \"${postToolResultPath.replace(/\\\\/g, '/')}\"`,\n timeout: 10,\n },\n ],\n });\n\n // Add Stop hook (auto-regenerate CLAUDE.md)\n if (!hooks[STOP_DOCS_EVENT]) {\n hooks[STOP_DOCS_EVENT] = [];\n }\n hooks[STOP_DOCS_EVENT].push({\n hooks: [\n {\n type: 'command',\n command: `node \"${stopDocsRefreshPath.replace(/\\\\/g, '/')}\"`,\n timeout: 10,\n },\n ],\n });\n\n settings['hooks'] = hooks;\n\n writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');\n\n return {\n success: true,\n message: global\n ? 'Hooks installed globally (all projects)'\n : 'Hooks installed for current project',\n installed: true,\n hookPaths: {\n prePrompt: prePromptPath,\n postToolResult: postToolResultPath,\n stopDocsRefresh: stopDocsRefreshPath,\n },\n };\n } catch (error) {\n return {\n success: false,\n message: 'Failed to install hooks',\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction uninstallHooks(settingsPath: string, global?: boolean): HooksCommandResult {\n try {\n if (!existsSync(settingsPath)) {\n return {\n success: true,\n message: 'No hooks installed (settings.json not found)',\n installed: false,\n };\n }\n\n const settingsJson = readFileSync(settingsPath, 'utf-8');\n const settings: Record<string, unknown> = JSON.parse(settingsJson);\n\n if (settings['hooks'] && typeof settings['hooks'] === 'object' && settings['hooks'] !== null) {\n const hooks = settings['hooks'] as HooksConfig;\n removeSparnHooks(hooks);\n\n // Remove empty event arrays\n for (const event of Object.keys(hooks)) {\n if (Array.isArray(hooks[event]) && hooks[event].length === 0) {\n delete hooks[event];\n }\n }\n\n // Remove hooks key if empty\n if (Object.keys(hooks).length === 0) {\n delete settings['hooks'];\n }\n }\n\n writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');\n\n return {\n success: true,\n message: global ? 'Hooks uninstalled globally' : 'Hooks uninstalled from current project',\n installed: false,\n };\n } catch (error) {\n return {\n success: false,\n message: 'Failed to uninstall hooks',\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction hooksStatus(settingsPath: string, global?: boolean): HooksCommandResult {\n try {\n if (!existsSync(settingsPath)) {\n return {\n success: true,\n message: global\n ? 'No global hooks installed (settings.json not found)'\n : 'No project hooks installed (settings.json not found)',\n installed: false,\n };\n }\n\n const settingsJson = readFileSync(settingsPath, 'utf-8');\n const settings: Record<string, unknown> = JSON.parse(settingsJson);\n\n const hooks =\n settings['hooks'] && typeof settings['hooks'] === 'object' && settings['hooks'] !== null\n ? (settings['hooks'] as HooksConfig)\n : {};\n\n const prePromptHook = findSparnHook(hooks, PRE_PROMPT_EVENT);\n const postToolHook = findSparnHook(hooks, POST_TOOL_EVENT);\n const stopDocsHook = findSparnHook(hooks, STOP_DOCS_EVENT);\n\n if (!prePromptHook && !postToolHook && !stopDocsHook) {\n return {\n success: true,\n message: global ? 'No global sparn hooks installed' : 'No project sparn hooks installed',\n installed: false,\n };\n }\n\n return {\n success: true,\n message: global ? 'Global sparn hooks active' : 'Project sparn hooks active',\n installed: true,\n hookPaths: {\n prePrompt: prePromptHook || '(not installed)',\n postToolResult: postToolHook || '(not installed)',\n stopDocsRefresh: stopDocsHook || '(not installed)',\n },\n };\n } catch (error) {\n return {\n success: false,\n message: 'Failed to check hooks status',\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Remove all sparn-managed hooks from the config\n */\nfunction removeSparnHooks(hooks: HooksConfig): void {\n for (const event of Object.keys(hooks)) {\n if (!Array.isArray(hooks[event])) continue;\n hooks[event] = hooks[event].filter((group) => {\n if (!Array.isArray(group.hooks)) return true;\n // Remove groups where any hook command contains \"sparn\"\n return !group.hooks.some(\n (h) => typeof h.command === 'string' && h.command.includes(SPARN_MARKER),\n );\n });\n }\n}\n\n/**\n * Find a sparn hook command for a given event\n */\nfunction findSparnHook(hooks: HooksConfig, event: string): string | null {\n const groups = hooks[event];\n if (!Array.isArray(groups)) return null;\n\n for (const group of groups) {\n if (!Array.isArray(group.hooks)) continue;\n for (const h of group.hooks) {\n if (typeof h.command === 'string' && h.command.includes(SPARN_MARKER)) {\n return h.command;\n }\n }\n }\n\n return null;\n}\n","/**\n * Metrics and Telemetry System\n *\n * Tracks performance metrics and optimization statistics:\n * - Optimization duration and throughput\n * - Token savings and reduction rates\n * - Memory usage and cache hit rates\n * - Daemon uptime and session counts\n */\n\nexport interface OptimizationMetric {\n timestamp: number;\n duration: number;\n tokensBefore: number;\n tokensAfter: number;\n entriesProcessed: number;\n entriesKept: number;\n cacheHitRate: number;\n memoryUsage: number;\n}\n\nexport interface DaemonMetric {\n startTime: number;\n sessionsWatched: number;\n totalOptimizations: number;\n totalTokensSaved: number;\n averageLatency: number;\n memoryUsage: number;\n}\n\nexport interface MetricsSnapshot {\n timestamp: number;\n optimization: {\n totalRuns: number;\n totalDuration: number;\n totalTokensSaved: number;\n averageReduction: number;\n p50Latency: number;\n p95Latency: number;\n p99Latency: number;\n };\n cache: {\n hitRate: number;\n totalHits: number;\n totalMisses: number;\n size: number;\n };\n daemon: {\n uptime: number;\n sessionsWatched: number;\n memoryUsage: number;\n };\n}\n\nexport interface MetricsCollector {\n /**\n * Record an optimization metric\n */\n recordOptimization(metric: OptimizationMetric): void;\n\n /**\n * Update daemon metrics\n */\n updateDaemon(metric: Partial<DaemonMetric>): void;\n\n /**\n * Get current metrics snapshot\n */\n getSnapshot(): MetricsSnapshot;\n\n /**\n * Export metrics as JSON\n */\n export(): string;\n\n /**\n * Reset all metrics\n */\n reset(): void;\n}\n\n/**\n * Create a metrics collector instance\n */\nexport function createMetricsCollector(): MetricsCollector {\n const optimizations: OptimizationMetric[] = [];\n let daemonMetrics: DaemonMetric = {\n startTime: Date.now(),\n sessionsWatched: 0,\n totalOptimizations: 0,\n totalTokensSaved: 0,\n averageLatency: 0,\n memoryUsage: 0,\n };\n\n let cacheHits = 0;\n let cacheMisses = 0;\n\n function recordOptimization(metric: OptimizationMetric): void {\n optimizations.push(metric);\n\n // Update daemon totals\n daemonMetrics.totalOptimizations++;\n daemonMetrics.totalTokensSaved += metric.tokensBefore - metric.tokensAfter;\n\n // Update cache stats\n if (metric.cacheHitRate > 0) {\n const hits = Math.round(metric.entriesProcessed * metric.cacheHitRate);\n cacheHits += hits;\n cacheMisses += metric.entriesProcessed - hits;\n }\n\n // Update average latency (moving average)\n daemonMetrics.averageLatency =\n (daemonMetrics.averageLatency * (daemonMetrics.totalOptimizations - 1) + metric.duration) /\n daemonMetrics.totalOptimizations;\n\n // Keep only last 1000 metrics in memory\n if (optimizations.length > 1000) {\n optimizations.shift();\n }\n }\n\n function updateDaemon(metric: Partial<DaemonMetric>): void {\n daemonMetrics = {\n ...daemonMetrics,\n ...metric,\n };\n }\n\n function calculatePercentile(sortedValues: number[], percentile: number): number {\n if (sortedValues.length === 0) return 0;\n const index = Math.ceil((percentile / 100) * sortedValues.length) - 1;\n return sortedValues[index] || 0;\n }\n\n function getSnapshot(): MetricsSnapshot {\n const totalRuns = optimizations.length;\n const totalDuration = optimizations.reduce((sum, m) => sum + m.duration, 0);\n const totalTokensSaved = optimizations.reduce(\n (sum, m) => sum + (m.tokensBefore - m.tokensAfter),\n 0,\n );\n\n const totalTokensBefore = optimizations.reduce((sum, m) => sum + m.tokensBefore, 0);\n const averageReduction = totalTokensBefore > 0 ? totalTokensSaved / totalTokensBefore : 0;\n\n // Sort durations once, reuse for all percentile calculations\n const sortedDurations = optimizations.map((m) => m.duration).sort((a, b) => a - b);\n\n const totalCacheQueries = cacheHits + cacheMisses;\n const hitRate = totalCacheQueries > 0 ? cacheHits / totalCacheQueries : 0;\n\n return {\n timestamp: Date.now(),\n optimization: {\n totalRuns,\n totalDuration,\n totalTokensSaved,\n averageReduction,\n p50Latency: calculatePercentile(sortedDurations, 50),\n p95Latency: calculatePercentile(sortedDurations, 95),\n p99Latency: calculatePercentile(sortedDurations, 99),\n },\n cache: {\n hitRate,\n totalHits: cacheHits,\n totalMisses: cacheMisses,\n size: optimizations.reduce((sum, m) => sum + m.entriesKept, 0),\n },\n daemon: {\n uptime: Date.now() - daemonMetrics.startTime,\n sessionsWatched: daemonMetrics.sessionsWatched,\n memoryUsage: daemonMetrics.memoryUsage,\n },\n };\n }\n\n function exportMetrics(): string {\n return JSON.stringify(getSnapshot(), null, 2);\n }\n\n function reset(): void {\n optimizations.length = 0;\n cacheHits = 0;\n cacheMisses = 0;\n daemonMetrics = {\n startTime: Date.now(),\n sessionsWatched: 0,\n totalOptimizations: 0,\n totalTokensSaved: 0,\n averageLatency: 0,\n memoryUsage: 0,\n };\n }\n\n return {\n recordOptimization,\n updateDaemon,\n getSnapshot,\n export: exportMetrics,\n reset,\n };\n}\n\n// Global metrics instance\nlet globalMetrics: MetricsCollector | null = null;\n\n/**\n * Get or create the global metrics collector\n */\nexport function getMetrics(): MetricsCollector {\n if (!globalMetrics) {\n globalMetrics = createMetricsCollector();\n }\n return globalMetrics;\n}\n","/**\n * Interactive Command - Conversational configuration and exploration\n */\n\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { confirm, input, number, select } from '@inquirer/prompts';\nimport { load as parseYAML, dump as stringifyYAML } from 'js-yaml';\nimport type { KVMemory } from '../../core/kv-memory.js';\nimport { getMetrics } from '../../core/metrics.js';\nimport type { SparnConfig } from '../../types/config.js';\nimport { brainPink, dim, errorRed, neuralCyan, synapseViolet } from '../ui/colors.js';\n\nexport interface InteractiveCommandOptions {\n /** Memory store instance */\n memory: KVMemory;\n /** Path to config file */\n configPath: string;\n}\n\nexport interface InteractiveCommandResult {\n /** Whether user exited normally */\n success: boolean;\n /** Optional message */\n message?: string;\n}\n\n/**\n * Display welcome banner\n */\nfunction showWelcomeBanner(): void {\n console.log(brainPink('\\nโ'.repeat(60)));\n console.log(brainPink(' ๐ง Sparn Interactive Mode'));\n console.log(brainPink('โ'.repeat(60)));\n console.log(dim(' Conversational configuration and exploration\\n'));\n}\n\n/**\n * Display main menu\n */\nasync function showMainMenu(): Promise<string> {\n return select({\n message: 'What would you like to do?',\n choices: [\n {\n name: 'โ๏ธ Configure Settings',\n value: 'configure',\n description: 'Guided configuration wizard',\n },\n {\n name: '๐ Optimize Preview',\n value: 'preview',\n description: 'Preview optimization with confirmation',\n },\n {\n name: '๐ Stats Dashboard',\n value: 'stats',\n description: 'View metrics and performance data',\n },\n {\n name: '๐งน Memory Consolidation',\n value: 'consolidate',\n description: 'Clean up decayed entries and duplicates',\n },\n {\n name: '๐ Quick Actions',\n value: 'quick',\n description: 'Common tasks and shortcuts',\n },\n {\n name: 'โ Exit',\n value: 'exit',\n description: 'Return to shell',\n },\n ],\n });\n}\n\n/**\n * Configuration wizard\n */\nasync function configureWizard(configPath: string): Promise<void> {\n console.log(neuralCyan('\\n๐ Configuration Wizard\\n'));\n\n // Load current config\n const configYAML = readFileSync(configPath, 'utf-8');\n const config = parseYAML(configYAML) as SparnConfig;\n\n const section = await select({\n message: 'Which settings would you like to configure?',\n choices: [\n { name: '๐ช Pruning (Relevance Filtering)', value: 'pruning' },\n { name: 'โณ Decay (Time-Based)', value: 'decay' },\n { name: '๐ฏ States (Entry Classification)', value: 'states' },\n { name: 'โก Real-time Optimization', value: 'realtime' },\n { name: '๐จ UI Preferences', value: 'ui' },\n { name: 'โ Back to Main Menu', value: 'back' },\n ],\n });\n\n if (section === 'back') return;\n\n switch (section) {\n case 'pruning': {\n console.log(synapseViolet('\\n๐ช Pruning Configuration'));\n console.log(dim('Keep only the most relevant context\\n'));\n\n const threshold = await number({\n message: 'Pruning threshold (percentage of entries to keep):',\n default: config.pruning.threshold,\n min: 1,\n max: 100,\n });\n\n const aggressiveness = await number({\n message: 'Aggressiveness (0-100, affects TF-IDF weighting):',\n default: config.pruning.aggressiveness,\n min: 0,\n max: 100,\n });\n\n config.pruning.threshold = threshold ?? config.pruning.threshold;\n config.pruning.aggressiveness = aggressiveness ?? config.pruning.aggressiveness;\n\n console.log(neuralCyan('\\nโ Pruning settings updated'));\n break;\n }\n\n case 'decay': {\n console.log(synapseViolet('\\nโณ Decay Configuration'));\n console.log(dim('Apply time-based decay to older entries\\n'));\n\n const defaultTTL = await number({\n message: 'Default TTL in hours:',\n default: config.decay.defaultTTL,\n min: 1,\n });\n\n const decayThreshold = await number({\n message: 'Decay threshold (0.0-1.0, entries below this are pruned):',\n default: config.decay.decayThreshold,\n min: 0,\n max: 1,\n step: 0.05,\n });\n\n config.decay.defaultTTL = defaultTTL ?? config.decay.defaultTTL;\n config.decay.decayThreshold = decayThreshold ?? config.decay.decayThreshold;\n\n console.log(neuralCyan('\\nโ Decay settings updated'));\n break;\n }\n\n case 'states': {\n console.log(synapseViolet('\\n๐ฏ State Threshold Configuration'));\n console.log(dim('Classify entries as active/ready/silent based on score\\n'));\n\n const activeThreshold = await number({\n message: 'Active state threshold (0.0-1.0):',\n default: config.states.activeThreshold,\n min: 0,\n max: 1,\n step: 0.05,\n });\n\n const readyThreshold = await number({\n message: 'Ready state threshold (0.0-1.0):',\n default: config.states.readyThreshold,\n min: 0,\n max: 1,\n step: 0.05,\n });\n\n config.states.activeThreshold = activeThreshold ?? config.states.activeThreshold;\n config.states.readyThreshold = readyThreshold ?? config.states.readyThreshold;\n\n console.log(neuralCyan('\\nโ State settings updated'));\n break;\n }\n\n case 'realtime': {\n console.log(synapseViolet('\\nโก Real-time Optimization Configuration'));\n console.log(dim('Daemon settings for automatic optimization\\n'));\n\n const tokenBudget = await number({\n message: 'Target token budget:',\n default: config.realtime.tokenBudget,\n min: 1000,\n });\n\n const autoOptimizeThreshold = await number({\n message: 'Auto-optimize threshold (triggers optimization):',\n default: config.realtime.autoOptimizeThreshold,\n min: 1000,\n });\n\n const windowSize = await number({\n message: 'Sliding window size (entries):',\n default: config.realtime.windowSize,\n min: 100,\n });\n\n const incremental = await confirm({\n message: 'Enable incremental optimization (faster delta processing)?',\n default: config.realtime.incremental,\n });\n\n config.realtime.tokenBudget = tokenBudget ?? config.realtime.tokenBudget;\n config.realtime.autoOptimizeThreshold =\n autoOptimizeThreshold ?? config.realtime.autoOptimizeThreshold;\n config.realtime.windowSize = windowSize ?? config.realtime.windowSize;\n config.realtime.incremental = incremental;\n\n console.log(neuralCyan('\\nโ Real-time settings updated'));\n break;\n }\n\n case 'ui': {\n console.log(synapseViolet('\\n๐จ UI Preferences'));\n console.log(dim('Customize terminal output\\n'));\n\n const colors = await confirm({\n message: 'Enable colored output?',\n default: config.ui.colors,\n });\n\n const verbose = await confirm({\n message: 'Enable verbose logging?',\n default: config.ui.verbose,\n });\n\n config.ui.colors = colors;\n config.ui.verbose = verbose;\n\n console.log(neuralCyan('\\nโ UI settings updated'));\n break;\n }\n }\n\n // Save config\n const updatedYAML = stringifyYAML(config);\n writeFileSync(configPath, updatedYAML, 'utf-8');\n console.log(neuralCyan(`\\n๐พ Configuration saved to ${configPath}\\n`));\n}\n\n/**\n * Optimization preview with confirmation\n */\nasync function optimizePreview(memory: KVMemory): Promise<void> {\n console.log(neuralCyan('\\n๐ Optimization Preview\\n'));\n\n const inputFile = await input({\n message: 'Input file path (or press Enter to skip):',\n default: '',\n });\n\n if (!inputFile) {\n console.log(dim('\\nNo file specified. Returning to menu.\\n'));\n return;\n }\n\n try {\n // Read file\n const content = readFileSync(resolve(process.cwd(), inputFile), 'utf-8');\n const tokensBefore = Math.ceil(content.length / 4); // Rough estimate\n\n console.log(synapseViolet('\\n๐ File Preview:'));\n console.log(dim(` Length: ${content.length} characters`));\n console.log(dim(` Estimated tokens: ${tokensBefore.toLocaleString()}\\n`));\n\n const shouldOptimize = await confirm({\n message: 'Proceed with optimization?',\n default: true,\n });\n\n if (!shouldOptimize) {\n console.log(dim('\\nOptimization cancelled.\\n'));\n return;\n }\n\n // Run optimization (simplified version)\n console.log(neuralCyan('\\nโก Optimizing...\\n'));\n\n // Lazy-load optimizer\n const { optimizeCommand } = await import('./optimize.js');\n\n const result = await optimizeCommand({\n inputFile,\n memory,\n dryRun: false,\n verbose: false,\n });\n\n console.log(neuralCyan(`\\nโ Optimization complete in ${result.durationMs}ms!`));\n console.log(synapseViolet(` Tokens: ${result.tokensBefore} โ ${result.tokensAfter}`));\n console.log(\n brainPink(\n ` Saved: ${result.tokensBefore - result.tokensAfter} tokens (${(result.reduction * 100).toFixed(1)}%)\\n`,\n ),\n );\n\n const saveOutput = await confirm({\n message: 'Save optimized output to file?',\n default: false,\n });\n\n if (saveOutput) {\n const outputFile = await input({\n message: 'Output file path:',\n default: inputFile.replace(/(\\.[^.]+)$/, '.optimized$1'),\n });\n\n writeFileSync(resolve(process.cwd(), outputFile), result.output, 'utf-8');\n console.log(neuralCyan(`\\n๐พ Saved to ${outputFile}\\n`));\n }\n } catch (error) {\n console.error(errorRed('\\nโ Error:'), error instanceof Error ? error.message : String(error));\n console.log();\n }\n}\n\n/**\n * Stats dashboard with detailed metrics\n */\nasync function showStatsDashboard(memory: KVMemory): Promise<void> {\n console.log(neuralCyan('\\n๐ Stats Dashboard\\n'));\n\n const view = await select({\n message: 'Select view:',\n choices: [\n { name: '๐ Optimization History', value: 'history' },\n { name: 'โก Real-time Metrics', value: 'realtime' },\n { name: '๐พ Memory Statistics', value: 'memory' },\n { name: 'โ Back to Main Menu', value: 'back' },\n ],\n });\n\n if (view === 'back') return;\n\n switch (view) {\n case 'history': {\n const stats = await memory.getOptimizationStats();\n const totalRuns = stats.length;\n const totalTokensSaved = stats.reduce(\n (sum, s) => sum + (s.tokens_before - s.tokens_after),\n 0,\n );\n const avgReduction =\n totalRuns > 0\n ? stats.reduce((sum, s) => {\n return (\n sum +\n (s.tokens_before > 0 ? (s.tokens_before - s.tokens_after) / s.tokens_before : 0)\n );\n }, 0) / totalRuns\n : 0;\n\n console.log(brainPink('\\nโ'.repeat(60)));\n console.log(neuralCyan(' ๐ Optimization History'));\n console.log(brainPink('โ'.repeat(60)));\n console.log(` ${synapseViolet('Total runs:')} ${totalRuns.toLocaleString()}`);\n console.log(` ${synapseViolet('Tokens saved:')} ${totalTokensSaved.toLocaleString()}`);\n console.log(` ${synapseViolet('Avg reduction:')} ${(avgReduction * 100).toFixed(1)}%`);\n\n if (totalRuns > 0) {\n console.log(`\\n ${dim('Recent optimizations:')}`);\n const recent = stats.slice(0, 5);\n for (const stat of recent) {\n const date = new Date(stat.timestamp).toLocaleString();\n const reduction =\n stat.tokens_before > 0\n ? ((stat.tokens_before - stat.tokens_after) / stat.tokens_before) * 100\n : 0;\n console.log(` ${dim(date)} - ${neuralCyan(`${reduction.toFixed(1)}%`)} reduction`);\n }\n }\n\n console.log(brainPink(`${'โ'.repeat(60)}\\n`));\n break;\n }\n\n case 'realtime': {\n const metrics = getMetrics();\n const snapshot = metrics.getSnapshot();\n\n console.log(brainPink('\\nโ'.repeat(60)));\n console.log(neuralCyan(' โก Real-time Metrics'));\n console.log(brainPink('โ'.repeat(60)));\n console.log(\n ` ${synapseViolet('Total runs:')} ${snapshot.optimization.totalRuns.toLocaleString()}`,\n );\n console.log(\n ` ${synapseViolet('Tokens saved:')} ${snapshot.optimization.totalTokensSaved.toLocaleString()}`,\n );\n console.log(\n ` ${synapseViolet('Avg reduction:')} ${(snapshot.optimization.averageReduction * 100).toFixed(1)}%`,\n );\n console.log(\n ` ${synapseViolet('P50 latency:')} ${snapshot.optimization.p50Latency.toFixed(0)}ms`,\n );\n console.log(\n ` ${synapseViolet('P95 latency:')} ${snapshot.optimization.p95Latency.toFixed(0)}ms`,\n );\n console.log(\n ` ${synapseViolet('P99 latency:')} ${snapshot.optimization.p99Latency.toFixed(0)}ms`,\n );\n console.log(\n `\\n ${synapseViolet('Cache hit rate:')} ${(snapshot.cache.hitRate * 100).toFixed(1)}%`,\n );\n console.log(\n ` ${synapseViolet('Cache hits:')} ${snapshot.cache.totalHits.toLocaleString()}`,\n );\n console.log(\n ` ${synapseViolet('Cache misses:')} ${snapshot.cache.totalMisses.toLocaleString()}`,\n );\n console.log(brainPink(`${'โ'.repeat(60)}\\n`));\n break;\n }\n\n case 'memory': {\n const entries = await memory.query({});\n const totalEntries = entries.length;\n const totalSize = entries.reduce((sum, e) => sum + (e.content?.length || 0), 0);\n\n console.log(brainPink('\\nโ'.repeat(60)));\n console.log(neuralCyan(' ๐พ Memory Statistics'));\n console.log(brainPink('โ'.repeat(60)));\n console.log(` ${synapseViolet('Total entries:')} ${totalEntries.toLocaleString()}`);\n console.log(` ${synapseViolet('Total size:')} ${(totalSize / 1024).toFixed(1)} KB`);\n console.log(\n ` ${synapseViolet('Avg entry size:')} ${totalEntries > 0 ? (totalSize / totalEntries).toFixed(0) : 0} bytes`,\n );\n console.log(brainPink(`${'โ'.repeat(60)}\\n`));\n break;\n }\n }\n}\n\n/**\n * Memory consolidation with confirmation\n */\nasync function consolidateMemory(memory: KVMemory): Promise<void> {\n console.log(neuralCyan('\\n๐งน Memory Consolidation\\n'));\n\n console.log(dim('This will:'));\n console.log(dim(' โข Remove decayed entries'));\n console.log(dim(' โข Merge duplicate entries'));\n console.log(dim(' โข VACUUM database to reclaim space\\n'));\n\n const shouldConsolidate = await confirm({\n message: 'Proceed with consolidation?',\n default: true,\n });\n\n if (!shouldConsolidate) {\n console.log(dim('\\nConsolidation cancelled.\\n'));\n return;\n }\n\n // Lazy-load consolidate command\n const { consolidateCommand } = await import('./consolidate.js');\n\n console.log(neuralCyan('\\nโก Consolidating...\\n'));\n\n const result = await consolidateCommand({ memory });\n\n console.log(neuralCyan(`\\nโ Consolidation complete in ${result.durationMs}ms!`));\n console.log(synapseViolet(` Entries: ${result.entriesBefore} โ ${result.entriesAfter}`));\n console.log(\n brainPink(\n ` Removed: ${result.decayedRemoved} decayed, ${result.duplicatesRemoved} duplicates\\n`,\n ),\n );\n}\n\n/**\n * Quick actions menu\n */\nasync function showQuickActions(memory: KVMemory, configPath: string): Promise<void> {\n const action = await select({\n message: 'Quick Actions:',\n choices: [\n { name: '๐ Reset Statistics', value: 'reset-stats' },\n { name: '๐ Export Config (JSON)', value: 'export-config' },\n { name: '๐งช Run Test Optimization', value: 'test-optimize' },\n { name: 'โ Back to Main Menu', value: 'back' },\n ],\n });\n\n if (action === 'back') return;\n\n switch (action) {\n case 'reset-stats': {\n const confirmReset = await confirm({\n message: 'Are you sure you want to reset all statistics?',\n default: false,\n });\n\n if (confirmReset) {\n await memory.clearOptimizationStats();\n console.log(neuralCyan('\\nโ Statistics cleared\\n'));\n } else {\n console.log(dim('\\nReset cancelled.\\n'));\n }\n break;\n }\n\n case 'export-config': {\n const configYAML = readFileSync(configPath, 'utf-8');\n const config = parseYAML(configYAML);\n const json = JSON.stringify(config, null, 2);\n\n console.log(synapseViolet('\\n๐ Configuration (JSON):\\n'));\n console.log(json);\n console.log();\n\n const shouldSave = await confirm({\n message: 'Save to file?',\n default: false,\n });\n\n if (shouldSave) {\n const outputPath = resolve(configPath.replace(/\\.yaml$/, '.json'));\n writeFileSync(outputPath, json, 'utf-8');\n console.log(neuralCyan(`\\n๐พ Saved to ${outputPath}\\n`));\n }\n break;\n }\n\n case 'test-optimize': {\n console.log(neuralCyan('\\n๐งช Running test optimization...\\n'));\n\n const testContent = `\n# Test Context\n\nThis is a test context for optimization.\nIt includes some sample content to demonstrate the optimization process.\n\n## Features\n- Token counting\n- Relevance filtering\n- Decay application\n- State classification\n `.trim();\n\n const { optimizeCommand } = await import('./optimize.js');\n\n const result = await optimizeCommand({\n input: testContent,\n memory,\n dryRun: true,\n verbose: false,\n });\n\n console.log(neuralCyan(`\\nโ Test optimization complete in ${result.durationMs}ms!`));\n console.log(synapseViolet(` Tokens: ${result.tokensBefore} โ ${result.tokensAfter}`));\n console.log(\n brainPink(\n ` Saved: ${result.tokensBefore - result.tokensAfter} tokens (${(result.reduction * 100).toFixed(1)}%)\\n`,\n ),\n );\n break;\n }\n }\n}\n\n/**\n * Execute the interactive command\n */\nexport async function interactiveCommand(\n options: InteractiveCommandOptions,\n): Promise<InteractiveCommandResult> {\n const { memory, configPath } = options;\n\n showWelcomeBanner();\n\n let running = true;\n while (running) {\n try {\n const choice = await showMainMenu();\n\n switch (choice) {\n case 'configure':\n await configureWizard(configPath);\n break;\n\n case 'preview':\n await optimizePreview(memory);\n break;\n\n case 'stats':\n await showStatsDashboard(memory);\n break;\n\n case 'consolidate':\n await consolidateMemory(memory);\n break;\n\n case 'quick':\n await showQuickActions(memory, configPath);\n break;\n\n case 'exit':\n running = false;\n console.log(brainPink('\\n๐ Thanks for using Sparn!\\n'));\n break;\n }\n } catch (error) {\n if ((error as { message?: string }).message === 'User force closed the prompt') {\n running = false;\n console.log(brainPink('\\n๐ Thanks for using Sparn!\\n'));\n } else {\n console.error(\n errorRed('\\nโ Error:'),\n error instanceof Error ? error.message : String(error),\n );\n console.log();\n }\n }\n }\n\n return {\n success: true,\n message: 'Interactive session completed',\n };\n}\n","/**\n * Dependency Graph Analyzer\n *\n * Analyzes TypeScript/JavaScript import/export relationships to build\n * a dependency graph. Uses regex-based parsing (no AST dependency needed)\n * for lightweight, fast analysis.\n *\n * Integrates with engram scoring to identify hot paths and prioritize\n * files for context loading.\n */\n\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { extname, join, relative, resolve } from 'node:path';\nimport { estimateTokens } from '../utils/tokenizer.js';\n\nexport interface DependencyNode {\n filePath: string;\n exports: string[];\n imports: DependencyEdge[];\n callers: string[];\n engram_score: number;\n lastModified: number;\n tokenEstimate: number;\n}\n\nexport interface DependencyEdge {\n source: string;\n target: string;\n symbols: string[];\n}\n\nexport interface GraphAnalysis {\n entryPoints: string[];\n hotPaths: string[];\n orphans: string[];\n totalTokens: number;\n optimizedTokens: number;\n}\n\nexport interface DependencyGraphConfig {\n /** Project root directory */\n projectRoot: string;\n /** Maximum depth for traversal (default: Infinity) */\n maxDepth?: number;\n /** File extensions to analyze (default: ['.ts', '.tsx', '.js', '.jsx']) */\n extensions?: string[];\n /** Directories to ignore (default: ['node_modules', 'dist', '.git', '.sparn']) */\n ignoreDirs?: string[];\n}\n\nexport interface DependencyGraph {\n /** Build the full dependency graph */\n build(): Promise<Map<string, DependencyNode>>;\n\n /** Get graph analysis with entry points, hot paths, orphans */\n analyze(): Promise<GraphAnalysis>;\n\n /** Get subgraph focused on a specific module/pattern */\n focus(pattern: string): Promise<Map<string, DependencyNode>>;\n\n /** Get files needed starting from an entry point, up to maxDepth */\n getFilesFromEntry(entryPoint: string, maxDepth?: number): Promise<string[]>;\n\n /** Get the full node map (after build) */\n getNodes(): Map<string, DependencyNode>;\n}\n\n// Import/export parsing patterns\nconst IMPORT_PATTERNS = [\n // import { Foo, Bar } from './module'\n /import\\s+\\{([^}]+)\\}\\s+from\\s+['\"]([^'\"]+)['\"]/g,\n // import Foo from './module'\n /import\\s+(\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/g,\n // import * as Foo from './module'\n /import\\s+\\*\\s+as\\s+(\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/g,\n // import './module' (side-effect)\n /import\\s+['\"]([^'\"]+)['\"]/g,\n // require('./module')\n /require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n];\n\nconst EXPORT_PATTERNS = [\n // export { Foo, Bar }\n /export\\s+\\{([^}]+)\\}/g,\n // export function/class/const/let/var/type/interface\n /export\\s+(?:default\\s+)?(?:function|class|const|let|var|type|interface|enum)\\s+(\\w+)/g,\n // export default\n /export\\s+default\\s+/g,\n];\n\n/**\n * Parse imports from file content\n */\nfunction parseImports(content: string, filePath: string): DependencyEdge[] {\n const edges: DependencyEdge[] = [];\n const seen = new Set<string>();\n\n for (const pattern of IMPORT_PATTERNS) {\n const regex = new RegExp(pattern.source, pattern.flags);\n const matches = [...content.matchAll(regex)];\n\n for (const match of matches) {\n if (pattern.source.includes('from')) {\n // Named/default imports with from clause\n const symbolsRaw = match[1] || '';\n const target = match[2] || '';\n\n if (!target || (target.startsWith('.') === false && !target.startsWith('/'))) {\n continue; // Skip external packages\n }\n\n const symbols = symbolsRaw\n .split(',')\n .map(\n (s) =>\n s\n .trim()\n .split(/\\s+as\\s+/)[0]\n ?.trim() || '',\n )\n .filter(Boolean);\n\n const key = `${filePath}->${target}`;\n if (!seen.has(key)) {\n seen.add(key);\n edges.push({ source: filePath, target, symbols });\n }\n } else if (pattern.source.includes('require')) {\n const target = match[1] || '';\n if (!target || (!target.startsWith('.') && !target.startsWith('/'))) {\n continue;\n }\n const key = `${filePath}->${target}`;\n if (!seen.has(key)) {\n seen.add(key);\n edges.push({ source: filePath, target, symbols: [] });\n }\n } else {\n const target = match[1] || '';\n if (!target || (!target.startsWith('.') && !target.startsWith('/'))) {\n continue;\n }\n const key = `${filePath}->${target}`;\n if (!seen.has(key)) {\n seen.add(key);\n edges.push({ source: filePath, target, symbols: [] });\n }\n }\n }\n }\n\n return edges;\n}\n\n/**\n * Parse exports from file content\n */\nfunction parseExports(content: string): string[] {\n const exportsList: string[] = [];\n\n for (const pattern of EXPORT_PATTERNS) {\n const regex = new RegExp(pattern.source, pattern.flags);\n const matches = [...content.matchAll(regex)];\n\n for (const match of matches) {\n if (match[1]) {\n const symbols = match[1]\n .split(',')\n .map(\n (s) =>\n s\n .trim()\n .split(/\\s+as\\s+/)[0]\n ?.trim() || '',\n )\n .filter(Boolean);\n exportsList.push(...symbols);\n } else {\n exportsList.push('default');\n }\n }\n }\n\n return [...new Set(exportsList)];\n}\n\n/**\n * Resolve a relative import path to an absolute file path\n */\nfunction resolveImportPath(\n importPath: string,\n fromFile: string,\n projectRoot: string,\n extensions: string[],\n): string | null {\n // Remove .js/.ts extension from import if present\n const cleanImport = importPath.replace(/\\.(js|ts|tsx|jsx)$/, '');\n\n const baseDir = join(projectRoot, fromFile, '..');\n const candidates = [\n ...extensions.map((ext) => resolve(baseDir, `${cleanImport}${ext}`)),\n ...extensions.map((ext) => resolve(baseDir, cleanImport, `index${ext}`)),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return relative(projectRoot, candidate).replace(/\\\\/g, '/');\n }\n }\n\n return null;\n}\n\n/**\n * Recursively collect all source files\n */\nfunction collectFiles(\n dir: string,\n projectRoot: string,\n extensions: string[],\n ignoreDirs: string[],\n): string[] {\n const files: string[] = [];\n\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (!ignoreDirs.includes(entry.name)) {\n files.push(...collectFiles(fullPath, projectRoot, extensions, ignoreDirs));\n }\n } else if (entry.isFile() && extensions.includes(extname(entry.name))) {\n files.push(relative(projectRoot, fullPath).replace(/\\\\/g, '/'));\n }\n }\n } catch {\n // Skip inaccessible directories\n }\n\n return files;\n}\n\n/**\n * Create a dependency graph analyzer\n */\nexport function createDependencyGraph(config: DependencyGraphConfig): DependencyGraph {\n const {\n projectRoot,\n maxDepth = 50,\n extensions = ['.ts', '.tsx', '.js', '.jsx'],\n ignoreDirs = ['node_modules', 'dist', '.git', '.sparn', 'coverage'],\n } = config;\n\n const nodes = new Map<string, DependencyNode>();\n let built = false;\n\n async function build(): Promise<Map<string, DependencyNode>> {\n nodes.clear();\n\n // Collect all source files\n const files = collectFiles(projectRoot, projectRoot, extensions, ignoreDirs);\n\n // Parse each file\n for (const filePath of files) {\n const fullPath = join(projectRoot, filePath);\n\n try {\n const content = readFileSync(fullPath, 'utf-8');\n const stat = statSync(fullPath);\n\n const exports = parseExports(content);\n const imports = parseImports(content, filePath);\n\n // Resolve import targets to actual file paths\n const resolvedImports: DependencyEdge[] = [];\n for (const imp of imports) {\n const resolved = resolveImportPath(imp.target, filePath, projectRoot, extensions);\n if (resolved) {\n resolvedImports.push({ ...imp, target: resolved });\n }\n }\n\n nodes.set(filePath, {\n filePath,\n exports,\n imports: resolvedImports,\n callers: [], // Populated in second pass\n engram_score: 0,\n lastModified: stat.mtimeMs,\n tokenEstimate: estimateTokens(content),\n });\n } catch {\n // Skip files that can't be read\n }\n }\n\n // Second pass: populate callers\n for (const [filePath, node] of nodes) {\n for (const imp of node.imports) {\n const targetNode = nodes.get(imp.target);\n if (targetNode && !targetNode.callers.includes(filePath)) {\n targetNode.callers.push(filePath);\n }\n }\n }\n\n built = true;\n return nodes;\n }\n\n async function analyze(): Promise<GraphAnalysis> {\n if (!built) await build();\n\n const entryPoints: string[] = [];\n const orphans: string[] = [];\n const callerCounts = new Map<string, number>();\n\n for (const [filePath, node] of nodes) {\n // Entry points: files with no callers (typically index.ts, CLI entry, etc.)\n if (node.callers.length === 0 && node.imports.length > 0) {\n entryPoints.push(filePath);\n }\n\n // Orphans: files with no callers AND no imports (truly isolated)\n if (node.callers.length === 0 && node.imports.length === 0) {\n orphans.push(filePath);\n }\n\n // Count how many files import each module\n callerCounts.set(filePath, node.callers.length);\n }\n\n // Hot paths: files imported by the most other files\n const sortedByCallers = [...callerCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .filter(([, count]) => count > 0);\n\n const hotPaths = sortedByCallers.slice(0, 10).map(([path]) => path);\n\n // Token calculations\n const totalTokens = [...nodes.values()].reduce((sum, n) => sum + n.tokenEstimate, 0);\n const hotPathTokens = hotPaths.reduce(\n (sum, path) => sum + (nodes.get(path)?.tokenEstimate || 0),\n 0,\n );\n\n return {\n entryPoints,\n hotPaths,\n orphans,\n totalTokens,\n optimizedTokens: hotPathTokens,\n };\n }\n\n async function focus(pattern: string): Promise<Map<string, DependencyNode>> {\n if (!built) await build();\n\n const matching = new Map<string, DependencyNode>();\n const lowerPattern = pattern.toLowerCase();\n\n for (const [filePath, node] of nodes) {\n if (filePath.toLowerCase().includes(lowerPattern)) {\n matching.set(filePath, node);\n\n // Also include direct dependencies and callers\n for (const imp of node.imports) {\n const depNode = nodes.get(imp.target);\n if (depNode) {\n matching.set(imp.target, depNode);\n }\n }\n\n for (const caller of node.callers) {\n const callerNode = nodes.get(caller);\n if (callerNode) {\n matching.set(caller, callerNode);\n }\n }\n }\n }\n\n return matching;\n }\n\n async function getFilesFromEntry(\n entryPoint: string,\n depth: number = maxDepth,\n ): Promise<string[]> {\n if (!built) await build();\n\n const visited = new Set<string>();\n const queue: Array<{ path: string; depth: number }> = [{ path: entryPoint, depth: 0 }];\n\n while (queue.length > 0) {\n const item = queue.shift();\n if (!item) break;\n\n if (visited.has(item.path) || item.depth > depth) continue;\n visited.add(item.path);\n\n const node = nodes.get(item.path);\n if (node) {\n for (const imp of node.imports) {\n if (!visited.has(imp.target)) {\n queue.push({ path: imp.target, depth: item.depth + 1 });\n }\n }\n }\n }\n\n return [...visited];\n }\n\n function getNodes(): Map<string, DependencyNode> {\n return nodes;\n }\n\n return {\n build,\n analyze,\n focus,\n getFilesFromEntry,\n getNodes,\n };\n}\n","/**\n * Graph Command - Analyze dependency graph\n */\n\nimport { resolve } from 'node:path';\nimport type { GraphAnalysis } from '../../core/dependency-graph.js';\nimport { createDependencyGraph } from '../../core/dependency-graph.js';\n\nexport interface GraphCommandOptions {\n entry?: string;\n depth?: number;\n focus?: string;\n json?: boolean;\n}\n\nexport interface GraphCommandResult {\n analysis: GraphAnalysis;\n json?: string;\n nodeCount: number;\n}\n\nexport async function graphCommand(options: GraphCommandOptions): Promise<GraphCommandResult> {\n const projectRoot = resolve(process.cwd());\n\n const graph = createDependencyGraph({\n projectRoot,\n maxDepth: options.depth,\n });\n\n await graph.build();\n\n let nodes = graph.getNodes();\n\n if (options.focus) {\n nodes = await graph.focus(options.focus);\n }\n\n if (options.entry) {\n const allNodes = graph.getNodes();\n if (!allNodes.has(options.entry)) {\n throw new Error(\n `Entry point not found in graph: ${options.entry}. Available: ${[...allNodes.keys()].slice(0, 5).join(', ')}${allNodes.size > 5 ? '...' : ''}`,\n );\n }\n const files = await graph.getFilesFromEntry(options.entry, options.depth);\n const entryNodes = new Map<string, typeof nodes extends Map<string, infer V> ? V : never>();\n for (const f of files) {\n const node = nodes.get(f);\n if (node) entryNodes.set(f, node);\n }\n nodes = entryNodes;\n }\n\n const analysis = await graph.analyze();\n\n const result: GraphCommandResult = {\n analysis,\n nodeCount: nodes.size,\n };\n\n if (options.json) {\n result.json = JSON.stringify(\n {\n analysis,\n nodeCount: nodes.size,\n nodes: Object.fromEntries(\n [...nodes.entries()].map(([k, v]) => [\n k,\n {\n exports: v.exports,\n imports: v.imports.map((i) => i.target),\n callers: v.callers,\n tokens: v.tokenEstimate,\n },\n ]),\n ),\n },\n null,\n 2,\n );\n }\n\n return result;\n}\n","/**\n * Search Engine - Hybrid FTS5 + ripgrep search\n *\n * Deterministic search without embeddings:\n * 1. FTS5 for full-text search with stemming (porter tokenizer)\n * 2. ripgrep fallback for exact pattern/regex matching\n * 3. Fusion scoring with dedup across both sources\n */\n\nimport { execFileSync, execSync } from 'node:child_process';\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { extname, join, relative } from 'node:path';\nimport Database from 'better-sqlite3';\n\nexport interface SearchResult {\n filePath: string;\n lineNumber: number;\n content: string;\n score: number;\n context: string[];\n engram_score: number;\n}\n\nexport interface SearchOpts {\n maxResults?: number;\n fileGlob?: string;\n useRipgrep?: boolean;\n includeContext?: boolean;\n}\n\nexport interface IndexStats {\n filesIndexed: number;\n totalLines: number;\n duration: number;\n}\n\nexport interface SearchEngine {\n /** Initialize the search database */\n init(projectRoot: string): Promise<void>;\n\n /** Index files into FTS5 */\n index(paths?: string[]): Promise<IndexStats>;\n\n /** Search using hybrid FTS5 + ripgrep */\n search(query: string, opts?: SearchOpts): Promise<SearchResult[]>;\n\n /** Re-index all files */\n refresh(): Promise<IndexStats>;\n\n /** Close the database */\n close(): Promise<void>;\n}\n\n/**\n * Check if ripgrep is available\n */\nfunction hasRipgrep(): boolean {\n try {\n execSync('rg --version', { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Run ripgrep search\n */\nfunction ripgrepSearch(query: string, projectRoot: string, opts: SearchOpts = {}): SearchResult[] {\n try {\n const args = ['--line-number', '--no-heading', '--color=never'];\n\n if (opts.fileGlob) {\n args.push('--glob', opts.fileGlob);\n }\n\n // Ignore common dirs\n args.push(\n '--glob',\n '!node_modules',\n '--glob',\n '!dist',\n '--glob',\n '!.git',\n '--glob',\n '!.sparn',\n '--glob',\n '!coverage',\n );\n\n const maxResults = opts.maxResults || 20;\n args.push('--max-count', String(maxResults));\n\n // Include context lines\n if (opts.includeContext) {\n args.push('-C', '2');\n }\n\n // Use execFileSync to avoid shell injection - args passed as array\n args.push('--', query, projectRoot);\n const output = execFileSync('rg', args, { encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024 });\n\n const results: SearchResult[] = [];\n const lines = output.split('\\n').filter(Boolean);\n\n for (const line of lines) {\n // Parse rg output: file:line:content\n const match = line.match(/^(.+?):(\\d+):(.*)/);\n if (match) {\n const filePath = relative(projectRoot, match[1] || '').replace(/\\\\/g, '/');\n const lineNumber = Number.parseInt(match[2] || '0', 10);\n const content = (match[3] || '').trim();\n\n results.push({\n filePath,\n lineNumber,\n content,\n score: 0.8, // Exact match gets high base score\n context: [],\n engram_score: 0,\n });\n }\n }\n\n return results.slice(0, maxResults);\n } catch {\n return [];\n }\n}\n\n/**\n * Collect indexable files from a directory\n */\nfunction collectIndexableFiles(\n dir: string,\n projectRoot: string,\n ignoreDirs = ['node_modules', 'dist', '.git', '.sparn', 'coverage'],\n exts = ['.ts', '.tsx', '.js', '.jsx', '.json', '.md', '.yaml', '.yml'],\n): string[] {\n const files: string[] = [];\n\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (!ignoreDirs.includes(entry.name)) {\n files.push(...collectIndexableFiles(fullPath, projectRoot, ignoreDirs, exts));\n }\n } else if (entry.isFile() && exts.includes(extname(entry.name))) {\n // Skip large files (>100KB)\n try {\n const stat = statSync(fullPath);\n if (stat.size < 100 * 1024) {\n files.push(relative(projectRoot, fullPath).replace(/\\\\/g, '/'));\n }\n } catch {\n // Skip\n }\n }\n }\n } catch {\n // Skip inaccessible directories\n }\n\n return files;\n}\n\n/**\n * Create a search engine instance\n */\nexport function createSearchEngine(dbPath: string): SearchEngine {\n let db: Database.Database | null = null;\n let projectRoot = '';\n const rgAvailable = hasRipgrep();\n\n async function init(root: string): Promise<void> {\n // Close existing connection if re-initializing\n if (db) {\n try {\n db.close();\n } catch {\n /* ignore */\n }\n }\n projectRoot = root;\n db = new Database(dbPath);\n db.pragma('journal_mode = WAL');\n\n // Create FTS5 virtual table\n db.exec(`\n CREATE VIRTUAL TABLE IF NOT EXISTS search_index USING fts5(\n filepath, line_number, content, tokenize='porter'\n );\n `);\n\n // Create metadata table for tracking index state\n db.exec(`\n CREATE TABLE IF NOT EXISTS search_meta (\n filepath TEXT PRIMARY KEY,\n mtime INTEGER NOT NULL,\n indexed_at INTEGER NOT NULL\n );\n `);\n }\n\n async function index(paths?: string[]): Promise<IndexStats> {\n if (!db) throw new Error('Search engine not initialized. Call init() first.');\n\n const startTime = Date.now();\n\n const filesToIndex = paths || collectIndexableFiles(projectRoot, projectRoot);\n\n let filesIndexed = 0;\n let totalLines = 0;\n\n const insertStmt = db.prepare(\n 'INSERT INTO search_index(filepath, line_number, content) VALUES (?, ?, ?)',\n );\n const metaStmt = db.prepare(\n 'INSERT OR REPLACE INTO search_meta(filepath, mtime, indexed_at) VALUES (?, ?, ?)',\n );\n const checkMeta = db.prepare('SELECT mtime FROM search_meta WHERE filepath = ?');\n const deleteFile = db.prepare('DELETE FROM search_index WHERE filepath = ?');\n\n const transaction = db.transaction(() => {\n for (const filePath of filesToIndex) {\n const fullPath = join(projectRoot, filePath);\n\n if (!existsSync(fullPath)) continue;\n\n try {\n const stat = statSync(fullPath);\n const existing = checkMeta.get(filePath) as { mtime: number } | undefined;\n\n // Skip if file hasn't changed\n if (existing && existing.mtime >= stat.mtimeMs) {\n continue;\n }\n\n // Remove old index entries for this file\n deleteFile.run(filePath);\n\n const content = readFileSync(fullPath, 'utf-8');\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line && line.trim().length > 0) {\n insertStmt.run(filePath, i + 1, line);\n totalLines++;\n }\n }\n\n metaStmt.run(filePath, stat.mtimeMs, Date.now());\n filesIndexed++;\n } catch {\n // Skip problematic files\n }\n }\n });\n\n transaction();\n\n return {\n filesIndexed,\n totalLines,\n duration: Date.now() - startTime,\n };\n }\n\n async function search(query: string, opts: SearchOpts = {}): Promise<SearchResult[]> {\n if (!db) throw new Error('Search engine not initialized. Call init() first.');\n\n const maxResults = opts.maxResults || 10;\n const results: SearchResult[] = [];\n const seen = new Set<string>(); // Dedup key: filepath:lineNumber\n\n // 1. FTS5 search\n try {\n // Escape FTS5 special characters and scope to content column\n const ftsQuery = query\n .replace(/['\"*(){}[\\]^~\\\\:]/g, ' ')\n .trim()\n .split(/\\s+/)\n .filter((w) => w.length > 0)\n .map((w) => `content:${w}`)\n .join(' ');\n\n if (ftsQuery.length > 0) {\n let sql = `\n SELECT filepath, line_number, content, rank\n FROM search_index\n WHERE search_index MATCH ?\n `;\n const params: unknown[] = [ftsQuery];\n\n if (opts.fileGlob) {\n // Convert glob to LIKE pattern\n const likePattern = opts.fileGlob.replace(/\\*/g, '%').replace(/\\?/g, '_');\n sql += ' AND filepath LIKE ?';\n params.push(likePattern);\n }\n\n sql += ' ORDER BY rank LIMIT ?';\n params.push(maxResults * 2); // Fetch extra for dedup\n\n const rows = db.prepare(sql).all(...params) as Array<{\n filepath: string;\n line_number: number;\n content: string;\n rank: number;\n }>;\n\n for (const row of rows) {\n const key = `${row.filepath}:${row.line_number}`;\n if (!seen.has(key)) {\n seen.add(key);\n\n // FTS5 rank is negative (lower = better match)\n const score = Math.min(1, Math.max(0, 1 + row.rank / 10));\n\n const context: string[] = [];\n if (opts.includeContext) {\n // Get surrounding lines using CAST for numeric comparison\n const contextRows = db\n .prepare(\n `SELECT content FROM search_index WHERE filepath = ? AND CAST(line_number AS INTEGER) BETWEEN ? AND ? ORDER BY CAST(line_number AS INTEGER)`,\n )\n .all(row.filepath, row.line_number - 2, row.line_number + 2) as Array<{\n content: string;\n }>;\n context.push(...contextRows.map((r) => r.content));\n }\n\n results.push({\n filePath: row.filepath,\n lineNumber: row.line_number,\n content: row.content,\n score,\n context,\n engram_score: 0,\n });\n }\n }\n }\n } catch {\n // FTS5 query failed, fall through to ripgrep\n }\n\n // 2. ripgrep search (if available and requested or as supplement)\n if (rgAvailable && opts.useRipgrep !== false) {\n const rgResults = ripgrepSearch(query, projectRoot, opts);\n\n for (const result of rgResults) {\n const key = `${result.filePath}:${result.lineNumber}`;\n if (!seen.has(key)) {\n seen.add(key);\n results.push(result);\n }\n }\n }\n\n // Sort by score descending and limit\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, maxResults);\n }\n\n async function refresh(): Promise<IndexStats> {\n if (!db) throw new Error('Search engine not initialized. Call init() first.');\n\n // Clear all index data\n db.exec('DELETE FROM search_index');\n db.exec('DELETE FROM search_meta');\n\n return index();\n }\n\n async function close(): Promise<void> {\n if (db) {\n db.close();\n db = null;\n }\n }\n\n return {\n init,\n index,\n search,\n refresh,\n close,\n };\n}\n","/**\n * Search Command - Hybrid FTS5 + ripgrep search\n */\n\nimport { resolve } from 'node:path';\nimport type { IndexStats, SearchResult } from '../../core/search-engine.js';\nimport { createSearchEngine } from '../../core/search-engine.js';\n\nexport interface SearchCommandOptions {\n query?: string;\n subcommand?: 'init' | 'refresh';\n glob?: string;\n maxResults?: number;\n json?: boolean;\n}\n\nexport interface SearchCommandResult {\n results?: SearchResult[];\n indexStats?: IndexStats;\n json?: string;\n message?: string;\n}\n\nexport async function searchCommand(options: SearchCommandOptions): Promise<SearchCommandResult> {\n const projectRoot = resolve(process.cwd());\n const dbPath = resolve(projectRoot, '.sparn', 'search.db');\n const engine = createSearchEngine(dbPath);\n\n try {\n await engine.init(projectRoot);\n\n if (options.subcommand === 'init' || options.subcommand === 'refresh') {\n const stats =\n options.subcommand === 'refresh' ? await engine.refresh() : await engine.index();\n\n const result: SearchCommandResult = {\n indexStats: stats,\n message: `Indexed ${stats.filesIndexed} files (${stats.totalLines} lines) in ${stats.duration}ms`,\n };\n\n if (options.json) {\n result.json = JSON.stringify(stats, null, 2);\n }\n\n return result;\n }\n\n if (!options.query) {\n return { message: 'No search query provided. Usage: sparn search \"query\"' };\n }\n\n const results = await engine.search(options.query, {\n maxResults: options.maxResults || 10,\n fileGlob: options.glob,\n includeContext: true,\n });\n\n const cmdResult: SearchCommandResult = { results };\n\n if (options.json) {\n cmdResult.json = JSON.stringify(results, null, 2);\n }\n\n return cmdResult;\n } finally {\n await engine.close();\n }\n}\n","/**\n * Workflow Planner - Plan/Exec/Verify separation\n *\n * Separates AI agent workflows into discrete phases:\n * - Planning: Identify files needed, search queries, and steps\n * - Execution: Apply constraints (max reads, token budget)\n * - Verification: Check step completion and run tests\n *\n * Reduces token waste by preventing re-planning loops.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface SparnPlan {\n id: string;\n created_at: number;\n task_description: string;\n steps: PlanStep[];\n token_budget: {\n planning: number;\n estimated_execution: number;\n max_file_reads: number;\n };\n files_needed: string[];\n search_queries: string[];\n status: 'draft' | 'ready' | 'executing' | 'completed' | 'failed';\n}\n\nexport interface PlanStep {\n order: number;\n action: 'read' | 'write' | 'search' | 'test' | 'verify';\n target: string;\n description: string;\n dependencies: number[];\n estimated_tokens: number;\n status: 'pending' | 'in_progress' | 'completed' | 'skipped' | 'failed';\n result?: string;\n}\n\nexport interface PlanExecConstraints {\n maxFileReads: number;\n tokenBudget: number;\n allowReplan: boolean;\n}\n\nexport interface PlanVerifyResult {\n planId: string;\n stepsCompleted: number;\n stepsFailed: number;\n stepsSkipped: number;\n totalSteps: number;\n tokensBudgeted: number;\n tokensUsed: number;\n success: boolean;\n details: Array<{\n step: number;\n action: string;\n target: string;\n status: string;\n }>;\n}\n\nexport interface WorkflowPlanner {\n /** Create a new plan */\n createPlan(\n taskDescription: string,\n filesNeeded: string[],\n searchQueries: string[],\n steps: Omit<PlanStep, 'status' | 'result'>[],\n tokenBudget?: { planning: number; estimated_execution: number; max_file_reads: number },\n ): Promise<SparnPlan>;\n\n /** Load an existing plan */\n loadPlan(planId: string): Promise<SparnPlan | null>;\n\n /** List all plans */\n listPlans(): Promise<Array<{ id: string; task: string; status: string; created: number }>>;\n\n /** Update a plan step status */\n updateStep(\n planId: string,\n stepOrder: number,\n status: PlanStep['status'],\n result?: string,\n ): Promise<void>;\n\n /** Start execution of a plan */\n startExec(planId: string): Promise<PlanExecConstraints>;\n\n /** Verify plan completion */\n verify(planId: string): Promise<PlanVerifyResult>;\n\n /** Get the plans directory */\n getPlansDir(): string;\n}\n\n/**\n * Create a workflow planner\n */\nexport function createWorkflowPlanner(projectRoot: string): WorkflowPlanner {\n const plansDir = join(projectRoot, '.sparn', 'plans');\n\n // Ensure plans directory exists\n if (!existsSync(plansDir)) {\n mkdirSync(plansDir, { recursive: true });\n }\n\n function sanitizeId(id: string): string {\n // Strip path separators and traversal sequences to prevent path injection\n return id.replace(/[/\\\\:.]/g, '').replace(/\\.\\./g, '');\n }\n\n function planPath(planId: string): string {\n const safeId = sanitizeId(planId);\n if (!safeId) throw new Error('Invalid plan ID');\n return join(plansDir, `plan-${safeId}.json`);\n }\n\n async function createPlan(\n taskDescription: string,\n filesNeeded: string[],\n searchQueries: string[],\n steps: Omit<PlanStep, 'status' | 'result'>[],\n tokenBudget = { planning: 0, estimated_execution: 0, max_file_reads: 5 },\n ): Promise<SparnPlan> {\n const id = randomUUID().split('-')[0] || 'plan';\n\n const plan: SparnPlan = {\n id,\n created_at: Date.now(),\n task_description: taskDescription,\n steps: steps.map((s) => ({ ...s, status: 'pending' as const })),\n token_budget: tokenBudget,\n files_needed: filesNeeded,\n search_queries: searchQueries,\n status: 'draft',\n };\n\n writeFileSync(planPath(id), JSON.stringify(plan, null, 2), 'utf-8');\n return plan;\n }\n\n async function loadPlan(planId: string): Promise<SparnPlan | null> {\n const path = planPath(planId);\n if (!existsSync(path)) return null;\n\n try {\n return JSON.parse(readFileSync(path, 'utf-8')) as SparnPlan;\n } catch {\n return null;\n }\n }\n\n async function listPlans(): Promise<\n Array<{ id: string; task: string; status: string; created: number }>\n > {\n if (!existsSync(plansDir)) return [];\n\n const files = readdirSync(plansDir).filter((f) => f.startsWith('plan-') && f.endsWith('.json'));\n\n const plans: Array<{ id: string; task: string; status: string; created: number }> = [];\n\n for (const file of files) {\n try {\n const plan = JSON.parse(readFileSync(join(plansDir, file), 'utf-8')) as SparnPlan;\n plans.push({\n id: plan.id,\n task: plan.task_description,\n status: plan.status,\n created: plan.created_at,\n });\n } catch {\n // Skip corrupt plan files\n }\n }\n\n return plans.sort((a, b) => b.created - a.created);\n }\n\n async function updateStep(\n planId: string,\n stepOrder: number,\n status: PlanStep['status'],\n result?: string,\n ): Promise<void> {\n const plan = await loadPlan(planId);\n if (!plan) throw new Error(`Plan ${planId} not found`);\n\n const step = plan.steps.find((s) => s.order === stepOrder);\n if (!step) throw new Error(`Step ${stepOrder} not found in plan ${planId}`);\n\n step.status = status;\n if (result !== undefined) {\n step.result = result;\n }\n\n writeFileSync(planPath(planId), JSON.stringify(plan, null, 2), 'utf-8');\n }\n\n async function startExec(planId: string): Promise<PlanExecConstraints> {\n const plan = await loadPlan(planId);\n if (!plan) throw new Error(`Plan ${planId} not found`);\n\n plan.status = 'executing';\n writeFileSync(planPath(planId), JSON.stringify(plan, null, 2), 'utf-8');\n\n return {\n maxFileReads: plan.token_budget.max_file_reads,\n tokenBudget: plan.token_budget.estimated_execution,\n allowReplan: false,\n };\n }\n\n async function verify(planId: string): Promise<PlanVerifyResult> {\n const plan = await loadPlan(planId);\n if (!plan) throw new Error(`Plan ${planId} not found`);\n\n let stepsCompleted = 0;\n let stepsFailed = 0;\n let stepsSkipped = 0;\n let tokensUsed = 0;\n\n const details: PlanVerifyResult['details'] = [];\n\n for (const step of plan.steps) {\n switch (step.status) {\n case 'completed':\n stepsCompleted++;\n tokensUsed += step.estimated_tokens;\n break;\n case 'failed':\n stepsFailed++;\n break;\n case 'skipped':\n stepsSkipped++;\n break;\n default:\n // pending or in_progress = not done yet\n break;\n }\n\n details.push({\n step: step.order,\n action: step.action,\n target: step.target,\n status: step.status,\n });\n }\n\n const totalSteps = plan.steps.length;\n const success = stepsFailed === 0 && stepsCompleted === totalSteps;\n\n // Update plan status - only mark completed/failed if no steps are still pending/in_progress\n const hasInProgress = plan.steps.some(\n (s) => s.status === 'pending' || s.status === 'in_progress',\n );\n if (!hasInProgress) {\n plan.status = success ? 'completed' : 'failed';\n writeFileSync(planPath(planId), JSON.stringify(plan, null, 2), 'utf-8');\n }\n\n return {\n planId,\n stepsCompleted,\n stepsFailed,\n stepsSkipped,\n totalSteps,\n tokensBudgeted: plan.token_budget.estimated_execution,\n tokensUsed,\n success,\n details,\n };\n }\n\n function getPlansDir(): string {\n return plansDir;\n }\n\n return {\n createPlan,\n loadPlan,\n listPlans,\n updateStep,\n startExec,\n verify,\n getPlansDir,\n };\n}\n","/**\n * Plan Command - Create execution plans\n */\n\nimport { resolve } from 'node:path';\nimport type { PlanStep, SparnPlan } from '../../core/workflow-planner.js';\nimport { createWorkflowPlanner } from '../../core/workflow-planner.js';\n\nexport interface PlanCommandOptions {\n task: string;\n files?: string[];\n searches?: string[];\n maxReads?: number;\n json?: boolean;\n}\n\nexport interface PlanCommandResult {\n plan: SparnPlan;\n json?: string;\n message: string;\n}\n\nexport async function planCommand(options: PlanCommandOptions): Promise<PlanCommandResult> {\n const projectRoot = resolve(process.cwd());\n const planner = createWorkflowPlanner(projectRoot);\n\n // Generate steps from task description\n const steps: Omit<PlanStep, 'status' | 'result'>[] = [];\n let order = 1;\n\n // Add search steps\n if (options.searches) {\n for (const query of options.searches) {\n steps.push({\n order: order++,\n action: 'search',\n target: query,\n description: `Search for: ${query}`,\n dependencies: [],\n estimated_tokens: 500,\n });\n }\n }\n\n // Add file read steps\n if (options.files) {\n for (const file of options.files) {\n steps.push({\n order: order++,\n action: 'read',\n target: file,\n description: `Read file: ${file}`,\n dependencies: [],\n estimated_tokens: 1000,\n });\n }\n }\n\n // Add verify step\n steps.push({\n order: order++,\n action: 'verify',\n target: 'tests',\n description: 'Run tests to verify changes',\n dependencies: steps.map((s) => s.order),\n estimated_tokens: 200,\n });\n\n const plan = await planner.createPlan(\n options.task,\n options.files || [],\n options.searches || [],\n steps,\n {\n planning: 0,\n estimated_execution: steps.reduce((sum, s) => sum + s.estimated_tokens, 0),\n max_file_reads: options.maxReads || 5,\n },\n );\n\n const result: PlanCommandResult = {\n plan,\n message: `Plan ${plan.id} created with ${plan.steps.length} steps`,\n };\n\n if (options.json) {\n result.json = JSON.stringify(plan, null, 2);\n }\n\n return result;\n}\n\nexport interface PlanListResult {\n plans: Array<{ id: string; task: string; status: string; created: number }>;\n json?: string;\n}\n\nexport async function planListCommand(options: { json?: boolean }): Promise<PlanListResult> {\n const projectRoot = resolve(process.cwd());\n const planner = createWorkflowPlanner(projectRoot);\n\n const plans = await planner.listPlans();\n\n const result: PlanListResult = { plans };\n\n if (options.json) {\n result.json = JSON.stringify(plans, null, 2);\n }\n\n return result;\n}\n","/**\n * Exec Command - Execute a plan with constraints\n */\n\nimport { resolve } from 'node:path';\nimport type { PlanExecConstraints, SparnPlan } from '../../core/workflow-planner.js';\nimport { createWorkflowPlanner } from '../../core/workflow-planner.js';\n\nexport interface ExecCommandOptions {\n planId: string;\n json?: boolean;\n}\n\nexport interface ExecCommandResult {\n plan: SparnPlan;\n constraints: PlanExecConstraints;\n json?: string;\n message: string;\n}\n\nexport async function execCommand(options: ExecCommandOptions): Promise<ExecCommandResult> {\n const projectRoot = resolve(process.cwd());\n const planner = createWorkflowPlanner(projectRoot);\n\n const plan = await planner.loadPlan(options.planId);\n if (!plan) {\n throw new Error(`Plan ${options.planId} not found`);\n }\n\n const constraints = await planner.startExec(options.planId);\n\n // Reload plan to get updated status\n const updatedPlan = (await planner.loadPlan(options.planId)) || plan;\n\n const result: ExecCommandResult = {\n plan: updatedPlan,\n constraints,\n message: `Executing plan ${options.planId}: max ${constraints.maxFileReads} reads, ${constraints.tokenBudget} token budget`,\n };\n\n if (options.json) {\n result.json = JSON.stringify({ plan: updatedPlan, constraints }, null, 2);\n }\n\n return result;\n}\n","/**\n * Verify Command - Verify plan completion\n */\n\nimport { resolve } from 'node:path';\nimport type { PlanVerifyResult } from '../../core/workflow-planner.js';\nimport { createWorkflowPlanner } from '../../core/workflow-planner.js';\n\nexport interface VerifyCommandOptions {\n planId: string;\n json?: boolean;\n}\n\nexport interface VerifyCommandResult {\n verification: PlanVerifyResult;\n json?: string;\n message: string;\n}\n\nexport async function verifyCommand(options: VerifyCommandOptions): Promise<VerifyCommandResult> {\n const projectRoot = resolve(process.cwd());\n const planner = createWorkflowPlanner(projectRoot);\n\n const plan = await planner.loadPlan(options.planId);\n if (!plan) {\n throw new Error(`Plan ${options.planId} not found`);\n }\n\n const verification = await planner.verify(options.planId);\n\n const status = verification.success ? 'PASSED' : 'FAILED';\n const message = `Plan ${options.planId} verification: ${status} (${verification.stepsCompleted}/${verification.totalSteps} steps completed)`;\n\n const result: VerifyCommandResult = {\n verification,\n message,\n };\n\n if (options.json) {\n result.json = JSON.stringify(verification, null, 2);\n }\n\n return result;\n}\n","/**\n * Docs Generator - Auto-generate CLAUDE.md\n *\n * Scans repo structure, uses dependency graph data, and generates\n * a compact CLAUDE.md optimized for AI agent context loading.\n */\n\nimport { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { extname, join, relative } from 'node:path';\nimport type { DependencyGraph, GraphAnalysis } from './dependency-graph.js';\n\nexport interface DocsGeneratorConfig {\n projectRoot: string;\n /** Include dependency graph summary */\n includeGraph?: boolean;\n /** Include debt tracker info */\n includeDebt?: boolean;\n /** Custom sections to append */\n customSections?: string[];\n}\n\nexport interface DocsGenerator {\n /** Generate CLAUDE.md content */\n generate(graph?: DependencyGraph): Promise<string>;\n}\n\n/**\n * Detect entry points by looking for common patterns\n */\nfunction detectEntryPoints(projectRoot: string): Array<{ path: string; description: string }> {\n const entries: Array<{ path: string; description: string }> = [];\n const candidates = [\n { path: 'src/index.ts', desc: 'Library API' },\n { path: 'src/cli/index.ts', desc: 'CLI entry point' },\n { path: 'src/daemon/index.ts', desc: 'Daemon process' },\n { path: 'src/mcp/index.ts', desc: 'MCP server' },\n { path: 'src/main.ts', desc: 'Main entry' },\n { path: 'src/app.ts', desc: 'App entry' },\n { path: 'src/server.ts', desc: 'Server entry' },\n { path: 'index.ts', desc: 'Root entry' },\n { path: 'index.js', desc: 'Root entry' },\n ];\n\n for (const c of candidates) {\n if (existsSync(join(projectRoot, c.path))) {\n entries.push({ path: c.path, description: c.desc });\n }\n }\n\n return entries;\n}\n\n/**\n * Scan directory structure for module summary\n */\nfunction scanModules(\n dir: string,\n projectRoot: string,\n ignoreDirs = ['node_modules', 'dist', '.git', '.sparn', 'coverage'],\n): Array<{ path: string; lines: number }> {\n const modules: Array<{ path: string; lines: number }> = [];\n\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory() && !ignoreDirs.includes(entry.name)) {\n modules.push(...scanModules(fullPath, projectRoot, ignoreDirs));\n } else if (entry.isFile() && ['.ts', '.tsx', '.js', '.jsx'].includes(extname(entry.name))) {\n try {\n const content = readFileSync(fullPath, 'utf-8');\n modules.push({\n path: relative(projectRoot, fullPath).replace(/\\\\/g, '/'),\n lines: content.split('\\n').length,\n });\n } catch {\n // Skip\n }\n }\n }\n } catch {\n // Skip\n }\n\n return modules;\n}\n\n/**\n * Read package.json for project info\n */\nfunction readPackageJson(\n projectRoot: string,\n): { name: string; version: string; scripts: Record<string, string> } | null {\n const pkgPath = join(projectRoot, 'package.json');\n if (!existsSync(pkgPath)) return null;\n\n try {\n return JSON.parse(readFileSync(pkgPath, 'utf-8'));\n } catch {\n return null;\n }\n}\n\n/**\n * Detect tech stack from dependencies\n */\nfunction detectStack(projectRoot: string): string[] {\n const stack: string[] = [];\n const pkg = readPackageJson(projectRoot);\n if (!pkg) return stack;\n\n const allDeps = {\n ...(pkg as unknown as { dependencies?: Record<string, string> }).dependencies,\n ...(pkg as unknown as { devDependencies?: Record<string, string> }).devDependencies,\n };\n\n if (allDeps['typescript']) stack.push('TypeScript');\n if (allDeps['vitest']) stack.push('Vitest');\n if (allDeps['@biomejs/biome']) stack.push('Biome');\n if (allDeps['eslint']) stack.push('ESLint');\n if (allDeps['prettier']) stack.push('Prettier');\n if (allDeps['react']) stack.push('React');\n if (allDeps['next']) stack.push('Next.js');\n if (allDeps['express']) stack.push('Express');\n if (allDeps['commander']) stack.push('Commander.js CLI');\n if (allDeps['better-sqlite3']) stack.push('SQLite (better-sqlite3)');\n if (allDeps['zod']) stack.push('Zod validation');\n\n return stack;\n}\n\n/**\n * Create a docs generator\n */\nexport function createDocsGenerator(config: DocsGeneratorConfig): DocsGenerator {\n const { projectRoot, includeGraph = true } = config;\n\n async function generate(graph?: DependencyGraph): Promise<string> {\n const lines: string[] = [];\n const pkg = readPackageJson(projectRoot);\n const projectName = pkg?.name || 'Project';\n const now = new Date().toISOString();\n\n // Header\n lines.push(`# ${projectName} โ Developer Guide`);\n lines.push(`<!-- Auto-generated by Sparn v1.3.0 โ ${now} -->`);\n lines.push('');\n\n // Tech stack\n const stack = detectStack(projectRoot);\n if (stack.length > 0) {\n lines.push(`**Stack**: ${stack.join(', ')}`);\n lines.push('');\n }\n\n // Commands\n if (pkg?.scripts) {\n lines.push('## Commands');\n lines.push('');\n const important = ['build', 'dev', 'test', 'lint', 'typecheck', 'start'];\n for (const cmd of important) {\n if (pkg.scripts[cmd]) {\n lines.push(`- \\`npm run ${cmd}\\` โ \\`${pkg.scripts[cmd]}\\``);\n }\n }\n lines.push('');\n }\n\n // Entry points\n const entryPoints = detectEntryPoints(projectRoot);\n if (entryPoints.length > 0) {\n lines.push('## Entry Points');\n lines.push('');\n for (const ep of entryPoints) {\n lines.push(`- \\`${ep.path}\\` โ ${ep.description}`);\n }\n lines.push('');\n }\n\n // Module summary\n const srcDir = join(projectRoot, 'src');\n if (existsSync(srcDir)) {\n const modules = scanModules(srcDir, projectRoot);\n\n // Group by directory\n const dirGroups = new Map<string, Array<{ file: string; lines: number }>>();\n for (const mod of modules) {\n const parts = mod.path.split('/');\n const dir = parts.length > 2 ? parts.slice(0, 2).join('/') : parts[0] || '';\n if (!dirGroups.has(dir)) {\n dirGroups.set(dir, []);\n }\n dirGroups.get(dir)?.push({\n file: parts[parts.length - 1] || mod.path,\n lines: mod.lines,\n });\n }\n\n lines.push('## Structure');\n lines.push('');\n for (const [dir, files] of dirGroups) {\n lines.push(`### ${dir}/ (${files.length} files)`);\n // Show up to 8 files per dir\n const shown = files.slice(0, 8);\n for (const f of shown) {\n lines.push(`- \\`${f.file}\\` (${f.lines}L)`);\n }\n if (files.length > 8) {\n lines.push(`- ... and ${files.length - 8} more`);\n }\n lines.push('');\n }\n }\n\n // Dependency graph analysis\n if (includeGraph && graph) {\n try {\n const analysis: GraphAnalysis = await graph.analyze();\n\n lines.push('## Hot Dependencies (most imported)');\n lines.push('');\n for (const path of analysis.hotPaths.slice(0, 5)) {\n const node = graph.getNodes().get(path);\n const callerCount = node?.callers.length || 0;\n lines.push(`- \\`${path}\\` (imported by ${callerCount} modules)`);\n }\n lines.push('');\n\n if (analysis.orphans.length > 0) {\n lines.push(\n `**Orphaned files** (${analysis.orphans.length}): ${analysis.orphans.slice(0, 3).join(', ')}${analysis.orphans.length > 3 ? '...' : ''}`,\n );\n lines.push('');\n }\n\n lines.push(\n `**Total tokens**: ${analysis.totalTokens.toLocaleString()} | **Hot path tokens**: ${analysis.optimizedTokens.toLocaleString()}`,\n );\n lines.push('');\n } catch {\n // Skip graph section on error\n }\n }\n\n // Sparn config\n const sparnConfigPath = join(projectRoot, '.sparn', 'config.yaml');\n if (existsSync(sparnConfigPath)) {\n lines.push('## Sparn Optimization');\n lines.push('');\n lines.push('Sparn is active in this project. Key features:');\n lines.push('- Context optimization (60-70% token reduction)');\n lines.push('- Use `sparn search` before reading files');\n lines.push('- Use `sparn graph` to understand dependencies');\n lines.push('- Use `sparn plan` for planning, `sparn exec` for execution');\n lines.push('');\n }\n\n // Custom sections\n if (config.customSections) {\n for (const section of config.customSections) {\n lines.push(section);\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n }\n\n return { generate };\n}\n","/**\n * Docs Command - Auto-generate CLAUDE.md\n */\n\nimport { writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { DependencyGraph } from '../../core/dependency-graph.js';\nimport { createDependencyGraph } from '../../core/dependency-graph.js';\nimport { createDocsGenerator } from '../../core/docs-generator.js';\n\nexport interface DocsCommandOptions {\n output?: string;\n includeGraph?: boolean;\n json?: boolean;\n}\n\nexport interface DocsCommandResult {\n content: string;\n outputPath?: string;\n message: string;\n}\n\nexport async function docsCommand(options: DocsCommandOptions): Promise<DocsCommandResult> {\n const projectRoot = resolve(process.cwd());\n\n const generator = createDocsGenerator({\n projectRoot,\n includeGraph: options.includeGraph !== false,\n });\n\n let graph: DependencyGraph | undefined;\n if (options.includeGraph !== false) {\n graph = createDependencyGraph({ projectRoot });\n await graph.build();\n }\n\n const content = await generator.generate(graph);\n\n if (options.json) {\n return {\n content,\n message: `CLAUDE.md generated (${content.split('\\n').length} lines)`,\n };\n }\n\n const outputPath = options.output || resolve(projectRoot, 'CLAUDE.md');\n\n // Write output\n writeFileSync(outputPath, content, 'utf-8');\n\n return {\n content,\n outputPath,\n message: `CLAUDE.md generated at ${outputPath} (${content.split('\\n').length} lines)`,\n };\n}\n","/**\n * Debt Tracker - Technical debt management\n *\n * Tracks technical debt with mandatory repayment dates,\n * severity levels, and token cost estimates.\n * Stored in SQLite alongside the main memory.db.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport Database from 'better-sqlite3';\n\nexport type DebtSeverity = 'P0' | 'P1' | 'P2';\nexport type DebtStatus = 'open' | 'in_progress' | 'resolved';\n\nexport interface TechDebt {\n id: string;\n description: string;\n created_at: number;\n repayment_date: number;\n severity: DebtSeverity;\n token_cost: number;\n files_affected: string[];\n status: DebtStatus;\n resolution_tokens?: number;\n resolved_at?: number;\n}\n\nexport interface DebtStats {\n total: number;\n open: number;\n in_progress: number;\n resolved: number;\n overdue: number;\n totalTokenCost: number;\n resolvedTokenCost: number;\n repaymentRate: number;\n}\n\nexport interface DebtTracker {\n /** Add a new tech debt item */\n add(debt: Omit<TechDebt, 'id' | 'created_at' | 'status'>): Promise<TechDebt>;\n\n /** List all debts, optionally filtered */\n list(filter?: {\n status?: DebtStatus;\n severity?: DebtSeverity;\n overdue?: boolean;\n }): Promise<TechDebt[]>;\n\n /** Get a specific debt by ID */\n get(id: string): Promise<TechDebt | null>;\n\n /** Update debt status */\n resolve(id: string, resolutionTokens?: number): Promise<void>;\n\n /** Update debt status to in_progress */\n start(id: string): Promise<void>;\n\n /** Delete a debt item */\n remove(id: string): Promise<void>;\n\n /** Get debt statistics */\n stats(): Promise<DebtStats>;\n\n /** Get P0 debts for CLAUDE.md inclusion */\n getCritical(): Promise<TechDebt[]>;\n\n /** Close database */\n close(): Promise<void>;\n}\n\n/**\n * Create a debt tracker instance\n */\nexport function createDebtTracker(dbPath: string): DebtTracker {\n const db = new Database(dbPath);\n db.pragma('journal_mode = WAL');\n\n // Create debt table\n db.exec(`\n CREATE TABLE IF NOT EXISTS tech_debt (\n id TEXT PRIMARY KEY NOT NULL,\n description TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n repayment_date INTEGER NOT NULL,\n severity TEXT NOT NULL CHECK(severity IN ('P0', 'P1', 'P2')),\n token_cost INTEGER NOT NULL DEFAULT 0,\n files_affected TEXT NOT NULL DEFAULT '[]',\n status TEXT NOT NULL DEFAULT 'open' CHECK(status IN ('open', 'in_progress', 'resolved')),\n resolution_tokens INTEGER,\n resolved_at INTEGER\n );\n `);\n\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_debt_status ON tech_debt(status);\n CREATE INDEX IF NOT EXISTS idx_debt_severity ON tech_debt(severity);\n CREATE INDEX IF NOT EXISTS idx_debt_repayment ON tech_debt(repayment_date);\n `);\n\n const insertStmt = db.prepare(`\n INSERT INTO tech_debt (id, description, created_at, repayment_date, severity, token_cost, files_affected, status)\n VALUES (?, ?, ?, ?, ?, ?, ?, 'open')\n `);\n\n const getStmt = db.prepare('SELECT * FROM tech_debt WHERE id = ?');\n\n function rowToDebt(row: Record<string, unknown>): TechDebt {\n return {\n id: row['id'] as string,\n description: row['description'] as string,\n created_at: row['created_at'] as number,\n repayment_date: row['repayment_date'] as number,\n severity: row['severity'] as DebtSeverity,\n token_cost: row['token_cost'] as number,\n files_affected: JSON.parse((row['files_affected'] as string) || '[]'),\n status: row['status'] as DebtStatus,\n resolution_tokens: row['resolution_tokens'] as number | undefined,\n resolved_at: row['resolved_at'] as number | undefined,\n };\n }\n\n async function add(debt: Omit<TechDebt, 'id' | 'created_at' | 'status'>): Promise<TechDebt> {\n const id = randomUUID().split('-')[0] || 'debt';\n const created_at = Date.now();\n\n insertStmt.run(\n id,\n debt.description,\n created_at,\n debt.repayment_date,\n debt.severity,\n debt.token_cost,\n JSON.stringify(debt.files_affected),\n );\n\n return {\n id,\n created_at,\n status: 'open',\n description: debt.description,\n repayment_date: debt.repayment_date,\n severity: debt.severity,\n token_cost: debt.token_cost,\n files_affected: debt.files_affected,\n };\n }\n\n async function list(\n filter: { status?: DebtStatus; severity?: DebtSeverity; overdue?: boolean } = {},\n ): Promise<TechDebt[]> {\n let sql = 'SELECT * FROM tech_debt WHERE 1=1';\n const params: unknown[] = [];\n\n if (filter.status) {\n sql += ' AND status = ?';\n params.push(filter.status);\n }\n\n if (filter.severity) {\n sql += ' AND severity = ?';\n params.push(filter.severity);\n }\n\n if (filter.overdue) {\n sql += ' AND repayment_date < ? AND status != ?';\n params.push(Date.now());\n params.push('resolved');\n }\n\n sql += ' ORDER BY severity ASC, repayment_date ASC';\n\n const rows = db.prepare(sql).all(...params) as Array<Record<string, unknown>>;\n return rows.map(rowToDebt);\n }\n\n async function get(id: string): Promise<TechDebt | null> {\n const row = getStmt.get(id) as Record<string, unknown> | undefined;\n if (!row) return null;\n return rowToDebt(row);\n }\n\n async function resolve(id: string, resolutionTokens?: number): Promise<void> {\n const result = db\n .prepare(\n 'UPDATE tech_debt SET status = ?, resolution_tokens = ?, resolved_at = ? WHERE id = ?',\n )\n .run('resolved', resolutionTokens ?? null, Date.now(), id);\n if (result.changes === 0) {\n throw new Error(`Debt not found: ${id}`);\n }\n }\n\n async function start(id: string): Promise<void> {\n const result = db\n .prepare('UPDATE tech_debt SET status = ? WHERE id = ?')\n .run('in_progress', id);\n if (result.changes === 0) {\n throw new Error(`Debt not found: ${id}`);\n }\n }\n\n async function remove(id: string): Promise<void> {\n db.prepare('DELETE FROM tech_debt WHERE id = ?').run(id);\n }\n\n async function stats(): Promise<DebtStats> {\n const all = db.prepare('SELECT * FROM tech_debt').all() as Array<Record<string, unknown>>;\n const debts = all.map(rowToDebt);\n\n const now = Date.now();\n const open = debts.filter((d) => d.status === 'open');\n const inProgress = debts.filter((d) => d.status === 'in_progress');\n const resolved = debts.filter((d) => d.status === 'resolved');\n const overdue = debts.filter((d) => d.status !== 'resolved' && d.repayment_date < now);\n\n const totalTokenCost = debts.reduce((sum, d) => sum + d.token_cost, 0);\n const resolvedTokenCost = resolved.reduce(\n (sum, d) => sum + (d.resolution_tokens || d.token_cost),\n 0,\n );\n\n // Repayment rate: resolved on time / total resolved\n const resolvedOnTime = resolved.filter(\n (d) => d.resolved_at && d.resolved_at <= d.repayment_date,\n ).length;\n const repaymentRate = resolved.length > 0 ? resolvedOnTime / resolved.length : 0;\n\n return {\n total: debts.length,\n open: open.length,\n in_progress: inProgress.length,\n resolved: resolved.length,\n overdue: overdue.length,\n totalTokenCost,\n resolvedTokenCost,\n repaymentRate,\n };\n }\n\n async function getCritical(): Promise<TechDebt[]> {\n const rows = db\n .prepare(\n \"SELECT * FROM tech_debt WHERE severity = 'P0' AND status != 'resolved' ORDER BY repayment_date ASC\",\n )\n .all() as Array<Record<string, unknown>>;\n return rows.map(rowToDebt);\n }\n\n async function close(): Promise<void> {\n db.close();\n }\n\n return {\n add,\n list,\n get,\n resolve,\n start,\n remove,\n stats,\n getCritical,\n close,\n };\n}\n","/**\n * Debt Command - Technical debt tracking\n */\n\nimport { resolve } from 'node:path';\nimport type { DebtSeverity, DebtStats, TechDebt } from '../../core/debt-tracker.js';\nimport { createDebtTracker } from '../../core/debt-tracker.js';\n\nexport interface DebtCommandOptions {\n subcommand: 'add' | 'list' | 'resolve' | 'stats' | 'start';\n description?: string;\n severity?: string;\n due?: string;\n files?: string[];\n tokenCost?: number;\n id?: string;\n overdue?: boolean;\n json?: boolean;\n}\n\nexport interface DebtCommandResult {\n debt?: TechDebt;\n debts?: TechDebt[];\n stats?: DebtStats;\n json?: string;\n message: string;\n}\n\nexport async function debtCommand(options: DebtCommandOptions): Promise<DebtCommandResult> {\n const projectRoot = resolve(process.cwd());\n const dbPath = resolve(projectRoot, '.sparn', 'memory.db');\n const tracker = createDebtTracker(dbPath);\n\n try {\n switch (options.subcommand) {\n case 'add': {\n if (!options.description) {\n throw new Error('Description is required');\n }\n\n const severity = (options.severity || 'P1') as DebtSeverity;\n if (!['P0', 'P1', 'P2'].includes(severity)) {\n throw new Error('Severity must be P0, P1, or P2');\n }\n\n let repaymentDate: number;\n if (options.due) {\n repaymentDate = new Date(options.due).getTime();\n if (Number.isNaN(repaymentDate)) {\n throw new Error(`Invalid date: ${options.due}`);\n }\n } else {\n // Default: 2 weeks from now\n repaymentDate = Date.now() + 14 * 24 * 60 * 60 * 1000;\n }\n\n const debt = await tracker.add({\n description: options.description,\n repayment_date: repaymentDate,\n severity,\n token_cost: options.tokenCost || 0,\n files_affected: options.files || [],\n });\n\n const result: DebtCommandResult = {\n debt,\n message: `Debt ${debt.id} added (${severity}): ${options.description}`,\n };\n\n if (options.json) {\n result.json = JSON.stringify(debt, null, 2);\n }\n\n return result;\n }\n\n case 'list': {\n const debts = await tracker.list({\n overdue: options.overdue,\n });\n\n const result: DebtCommandResult = {\n debts,\n message: `${debts.length} debt item(s)`,\n };\n\n if (options.json) {\n result.json = JSON.stringify(debts, null, 2);\n }\n\n return result;\n }\n\n case 'resolve': {\n if (!options.id) {\n throw new Error('Debt ID is required');\n }\n\n await tracker.resolve(options.id, options.tokenCost);\n\n return {\n message: `Debt ${options.id} resolved`,\n };\n }\n\n case 'start': {\n if (!options.id) {\n throw new Error('Debt ID is required');\n }\n\n await tracker.start(options.id);\n\n return {\n message: `Debt ${options.id} started`,\n };\n }\n\n case 'stats': {\n const stats = await tracker.stats();\n\n const result: DebtCommandResult = {\n stats,\n message: `${stats.total} total, ${stats.open} open, ${stats.overdue} overdue, ${(stats.repaymentRate * 100).toFixed(0)}% on-time rate`,\n };\n\n if (options.json) {\n result.json = JSON.stringify(stats, null, 2);\n }\n\n return result;\n }\n\n default:\n throw new Error(`Unknown subcommand: ${options.subcommand}`);\n }\n } finally {\n await tracker.close();\n }\n}\n","/**\n * Dashboard theme โ brand colors as hex strings for Ink's `color` prop.\n */\n\nexport const theme = {\n neuralCyan: '#00D4AA',\n synapseViolet: '#7B61FF',\n errorRed: '#FF6B6B',\n brainPink: '#FF6B9D',\n dimGray: '#555555',\n white: '#FFFFFF',\n} as const;\n","/**\n * Command Input โ Text input bar for the dashboard command mode.\n *\n * Wraps ink-text-input with a prompt, running indicator, and mode hints.\n */\n\nimport { Box, Text } from 'ink';\nimport TextInput from 'ink-text-input';\nimport type React from 'react';\nimport { useState } from 'react';\nimport { theme } from '../theme.js';\n\ninterface Props {\n onSubmit: (value: string) => void;\n isRunning: boolean;\n runningCommand?: string;\n active: boolean;\n}\n\nexport function CommandInput({\n onSubmit,\n isRunning,\n runningCommand,\n active,\n}: Props): React.ReactElement {\n const [value, setValue] = useState('');\n\n const handleSubmit = (input: string) => {\n if (input.trim().length === 0) return;\n onSubmit(input.trim());\n setValue('');\n };\n\n if (isRunning) {\n return (\n <Box paddingX={1}>\n <Text color={theme.synapseViolet}>Running {runningCommand || 'command'}...</Text>\n </Box>\n );\n }\n\n if (!active) {\n return (\n <Box paddingX={1}>\n <Text color={theme.dimGray}>Press : to enter command mode</Text>\n </Box>\n );\n }\n\n return (\n <Box paddingX={1}>\n <Text color={theme.neuralCyan}>{'\\u276F'} </Text>\n <TextInput\n value={value}\n onChange={setValue}\n onSubmit={handleSubmit}\n focus={active}\n showCursor\n />\n <Text color={theme.dimGray}> [Esc: monitor mode]</Text>\n </Box>\n );\n}\n","/**\n * Output Panel โ Shows command execution results.\n *\n * Bordered box below the 4 monitoring panels. Scrollable when focused.\n * Empty state shows usage hint.\n */\n\nimport { Box, Text } from 'ink';\nimport type React from 'react';\nimport type { OutputLine } from '../formatters.js';\nimport { theme } from '../theme.js';\n\ninterface Props {\n lines: OutputLine[];\n scrollOffset: number;\n focused: boolean;\n maxVisibleLines?: number;\n}\n\nexport function OutputPanel({\n lines,\n scrollOffset,\n focused,\n maxVisibleLines = 8,\n}: Props): React.ReactElement {\n const borderColor = focused ? theme.neuralCyan : theme.dimGray;\n\n if (lines.length === 0) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={borderColor}\n paddingX={1}\n width=\"100%\"\n >\n <Text bold color={theme.dimGray}>\n Output\n </Text>\n <Text color={theme.dimGray}>Type : then a command. Try help for available commands.</Text>\n </Box>\n );\n }\n\n const visible = lines.slice(scrollOffset, scrollOffset + maxVisibleLines);\n const hasMore = lines.length > maxVisibleLines;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={borderColor}\n paddingX={1}\n width=\"100%\"\n >\n <Text bold color={theme.dimGray}>\n Output\n </Text>\n <Box flexDirection=\"column\">\n {visible.map((line, i) => (\n <Text key={`${scrollOffset + i}`} color={line.color}>\n {line.text}\n </Text>\n ))}\n </Box>\n {hasMore && (\n <Text color={theme.dimGray}>\n [{scrollOffset + 1}-{Math.min(scrollOffset + maxVisibleLines, lines.length)}/\n {lines.length}]{focused ? ' \\u2191\\u2193 scroll' : ''}\n </Text>\n )}\n </Box>\n );\n}\n","/**\n * Dashboard command parser โ pure function, no React.\n *\n * Parses raw input string into structured command with name, positionals, and flags.\n * Handles quoted strings, --flag value, --boolean, -f value.\n * No Commander (it calls process.exit on errors which would kill the TUI).\n */\n\nexport interface ParsedCommand {\n name: string;\n positionals: string[];\n flags: Record<string, string | true>;\n}\n\n/** Tokenize input respecting quoted strings. */\nfunction tokenize(input: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let inQuote: string | null = null;\n\n for (const ch of input) {\n if (inQuote) {\n if (ch === inQuote) {\n inQuote = null;\n } else {\n current += ch;\n }\n } else if (ch === '\"' || ch === \"'\") {\n inQuote = ch;\n } else if (ch === ' ' || ch === '\\t') {\n if (current.length > 0) {\n tokens.push(current);\n current = '';\n }\n } else {\n current += ch;\n }\n }\n\n if (current.length > 0) {\n tokens.push(current);\n }\n\n return tokens;\n}\n\nexport function parseCommand(input: string): ParsedCommand | null {\n const trimmed = input.trim();\n if (trimmed.length === 0) return null;\n\n const tokens = tokenize(trimmed);\n const first = tokens[0];\n if (!first) return null;\n\n const name = first.toLowerCase();\n const positionals: string[] = [];\n const flags: Record<string, string | true> = {};\n\n let i = 1;\n while (i < tokens.length) {\n const token = tokens[i];\n if (!token) {\n i++;\n continue;\n }\n\n if (token.startsWith('--')) {\n const key = token.slice(2);\n const next = tokens[i + 1];\n if (next !== undefined && !next.startsWith('-')) {\n flags[key] = next;\n i += 2;\n } else {\n flags[key] = true;\n i++;\n }\n } else if (token.startsWith('-') && token.length === 2) {\n const key = token.slice(1);\n const next = tokens[i + 1];\n if (next !== undefined && !next.startsWith('-')) {\n flags[key] = next;\n i += 2;\n } else {\n flags[key] = true;\n i++;\n }\n } else {\n positionals.push(token);\n i++;\n }\n }\n\n return { name, positionals, flags };\n}\n","/**\n * Dashboard command output formatters โ pure functions.\n *\n * Convert typed command results into OutputLine[] for display in the output panel.\n * One formatter per command, mirroring the display logic in src/cli/index.ts actions.\n */\n\nimport { theme } from './theme.js';\n\nexport interface OutputLine {\n text: string;\n color?: string;\n}\n\n// โโ Optimize โโ\n\ninterface OptimizeResult {\n tokensBefore: number;\n tokensAfter: number;\n reduction: number;\n entriesProcessed: number;\n entriesKept: number;\n durationMs: number;\n outputFile?: string;\n}\n\nexport function formatOptimize(result: OptimizeResult): OutputLine[] {\n const pct = (result.reduction * 100).toFixed(1);\n return [\n { text: `\\u2713 Optimization complete in ${result.durationMs}ms`, color: theme.neuralCyan },\n {\n text: ` Tokens: ${result.tokensBefore} \\u2192 ${result.tokensAfter} (${pct}% reduction)`,\n },\n {\n text: ` Entries: processed=${result.entriesProcessed} kept=${result.entriesKept}`,\n },\n ...(result.outputFile\n ? [{ text: ` Output: ${result.outputFile}`, color: theme.dimGray }]\n : []),\n ];\n}\n\n// โโ Stats โโ\n\ninterface StatsResult {\n totalCommands: number;\n totalTokensSaved: number;\n averageReduction: number;\n graph?: string;\n resetConfirmed?: boolean;\n}\n\nexport function formatStats(result: StatsResult): OutputLine[] {\n if (result.resetConfirmed) {\n return [{ text: '\\u2713 Statistics reset', color: theme.neuralCyan }];\n }\n const avgPct = (result.averageReduction * 100).toFixed(1);\n const lines: OutputLine[] = [\n { text: 'Optimization Statistics', color: theme.neuralCyan },\n { text: ` Total commands: ${result.totalCommands}` },\n { text: ` Tokens saved: ${result.totalTokensSaved}` },\n { text: ` Avg reduction: ${avgPct}%` },\n ];\n if (result.graph) {\n for (const line of result.graph.split('\\n')) {\n lines.push({ text: line, color: theme.dimGray });\n }\n }\n return lines;\n}\n\n// โโ Consolidate โโ\n\ninterface ConsolidateResult {\n entriesBefore: number;\n entriesAfter: number;\n decayedRemoved: number;\n duplicatesRemoved: number;\n compressionRatio: number;\n durationMs: number;\n}\n\nexport function formatConsolidate(result: ConsolidateResult): OutputLine[] {\n const pct = (result.compressionRatio * 100).toFixed(1);\n return [\n { text: `\\u2713 Consolidation complete in ${result.durationMs}ms`, color: theme.neuralCyan },\n { text: ` Entries: ${result.entriesBefore} \\u2192 ${result.entriesAfter}` },\n { text: ` Decayed removed: ${result.decayedRemoved}` },\n { text: ` Duplicates removed: ${result.duplicatesRemoved}` },\n { text: ` Compression: ${pct}%` },\n ];\n}\n\n// โโ Search โโ\n\ninterface SearchResultItem {\n filePath: string;\n lineNumber: number;\n content: string;\n score: number;\n}\n\ninterface SearchCmdResult {\n results?: SearchResultItem[];\n indexStats?: { filesIndexed: number; totalLines: number; duration: number };\n message?: string;\n}\n\nexport function formatSearch(result: SearchCmdResult): OutputLine[] {\n if (result.indexStats) {\n const s = result.indexStats;\n return [\n {\n text: `\\u2713 Indexed ${s.filesIndexed} files (${s.totalLines} lines) in ${s.duration}ms`,\n color: theme.neuralCyan,\n },\n ];\n }\n\n if (!result.results || result.results.length === 0) {\n return [{ text: result.message || 'No results found', color: theme.dimGray }];\n }\n\n const lines: OutputLine[] = [\n { text: `${result.results.length} result(s):`, color: theme.neuralCyan },\n ];\n for (const r of result.results) {\n lines.push({\n text: ` ${r.filePath}:${r.lineNumber} (score: ${r.score.toFixed(2)})`,\n color: theme.synapseViolet,\n });\n lines.push({ text: ` ${r.content.trim()}` });\n }\n return lines;\n}\n\n// โโ Graph โโ\n\ninterface GraphResult {\n analysis: {\n entryPoints: string[];\n hotPaths: string[];\n orphans: string[];\n totalTokens: number;\n optimizedTokens: number;\n };\n nodeCount: number;\n}\n\nexport function formatGraph(result: GraphResult): OutputLine[] {\n const a = result.analysis;\n const lines: OutputLine[] = [\n { text: `Graph: ${result.nodeCount} nodes`, color: theme.neuralCyan },\n { text: ` Tokens: ${a.totalTokens} (optimized: ${a.optimizedTokens})` },\n ];\n if (a.hotPaths.length > 0) {\n lines.push({\n text: ` Hot paths: ${a.hotPaths.slice(0, 5).join(', ')}`,\n color: theme.brainPink,\n });\n }\n if (a.orphans.length > 0) {\n lines.push({ text: ` Orphans: ${a.orphans.length}`, color: theme.dimGray });\n }\n return lines;\n}\n\n// โโ Plan โโ\n\ninterface PlanResult {\n plan: { id: string; steps: unknown[] };\n message: string;\n}\n\nexport function formatPlan(result: PlanResult): OutputLine[] {\n return [{ text: `\\u2713 ${result.message}`, color: theme.neuralCyan }];\n}\n\n// โโ Plan List โโ\n\ninterface PlanListResult {\n plans: Array<{ id: string; task: string; status: string }>;\n}\n\nexport function formatPlanList(result: PlanListResult): OutputLine[] {\n if (result.plans.length === 0) {\n return [{ text: 'No plans found', color: theme.dimGray }];\n }\n const lines: OutputLine[] = [\n { text: `${result.plans.length} plan(s):`, color: theme.neuralCyan },\n ];\n for (const p of result.plans) {\n const statusColor = p.status === 'completed' ? theme.neuralCyan : theme.synapseViolet;\n lines.push({ text: ` ${p.id} [${p.status}] ${p.task}`, color: statusColor });\n }\n return lines;\n}\n\n// โโ Exec โโ\n\ninterface ExecResult {\n constraints: { maxFileReads: number; tokenBudget: number };\n message: string;\n}\n\nexport function formatExec(result: ExecResult): OutputLine[] {\n return [\n { text: `\\u2713 ${result.message}`, color: theme.neuralCyan },\n {\n text: ` Max reads: ${result.constraints.maxFileReads}, Budget: ${result.constraints.tokenBudget} tokens`,\n },\n ];\n}\n\n// โโ Verify โโ\n\ninterface VerifyResult {\n verification: {\n success: boolean;\n stepsCompleted: number;\n totalSteps: number;\n };\n message: string;\n}\n\nexport function formatVerify(result: VerifyResult): OutputLine[] {\n const v = result.verification;\n const icon = v.success ? '\\u2713' : '\\u2717';\n const color = v.success ? theme.neuralCyan : theme.errorRed;\n return [\n { text: `${icon} ${result.message}`, color },\n { text: ` Steps: ${v.stepsCompleted}/${v.totalSteps} completed` },\n ];\n}\n\n// โโ Docs โโ\n\ninterface DocsResult {\n outputPath?: string;\n message: string;\n}\n\nexport function formatDocs(result: DocsResult): OutputLine[] {\n return [{ text: `\\u2713 ${result.message}`, color: theme.neuralCyan }];\n}\n\n// โโ Debt โโ\n\ninterface DebtResult {\n debt?: { id: string; severity: string; description: string };\n debts?: Array<{ id: string; severity: string; description: string; status: string }>;\n stats?: { total: number; open: number; overdue: number; repaymentRate: number };\n message: string;\n}\n\nexport function formatDebt(result: DebtResult): OutputLine[] {\n if (result.stats) {\n const s = result.stats;\n return [\n { text: 'Debt Stats', color: theme.neuralCyan },\n { text: ` Total: ${s.total}, Open: ${s.open}, Overdue: ${s.overdue}` },\n { text: ` Repayment rate: ${(s.repaymentRate * 100).toFixed(0)}%` },\n ];\n }\n\n if (result.debts) {\n if (result.debts.length === 0) {\n return [{ text: 'No debt items', color: theme.dimGray }];\n }\n const lines: OutputLine[] = [\n { text: `${result.debts.length} debt item(s):`, color: theme.neuralCyan },\n ];\n for (const d of result.debts) {\n const sevColor =\n d.severity === 'P0'\n ? theme.errorRed\n : d.severity === 'P1'\n ? theme.synapseViolet\n : theme.dimGray;\n const desc =\n d.description.length > 40 ? `${d.description.substring(0, 37)}...` : d.description;\n lines.push({\n text: ` [${d.severity}] ${d.id.slice(0, 8)} ${desc} (${d.status})`,\n color: sevColor,\n });\n }\n return lines;\n }\n\n // Single debt or simple message\n return [{ text: `\\u2713 ${result.message}`, color: theme.neuralCyan }];\n}\n\n// โโ Error โโ\n\nexport function formatError(err: Error): OutputLine[] {\n return [{ text: `Error: ${err.message}`, color: theme.errorRed }];\n}\n\n// โโ Help โโ\n\nexport function formatHelp(): OutputLine[] {\n return [\n { text: 'Available commands:', color: theme.neuralCyan },\n { text: ' optimize --input <text> [--input-file <path>] [--output-file <path>] [--dry-run]' },\n { text: ' stats [--graph] [--reset --confirm-reset]' },\n { text: ' consolidate' },\n { text: ' search <query> [--glob <pattern>] [--max-results <n>]' },\n { text: ' search init | search refresh' },\n { text: ' graph [--entry <file>] [--depth <n>] [--focus <file>]' },\n { text: ' plan <task> [--files <f1,f2>] [--searches <q1,q2>]' },\n { text: ' plan list' },\n { text: ' exec <planId>' },\n { text: ' verify <planId>' },\n { text: ' docs [--output <path>] [--no-graph]' },\n { text: ' debt add <desc> [--severity P0|P1|P2] [--due <date>] [--token-cost <n>]' },\n { text: ' debt list [--overdue]' },\n { text: ' debt resolve <id> [--token-cost <n>]' },\n { text: ' debt start <id>' },\n { text: ' debt stats' },\n { text: ' clear Clear output' },\n { text: ' help Show this help' },\n { text: '' },\n { text: 'Keybinds:', color: theme.neuralCyan },\n { text: ' : Enter command mode' },\n { text: ' Escape Exit command mode' },\n { text: ' Tab Cycle panel focus' },\n { text: ' q Quit (in monitor mode)' },\n ];\n}\n","/**\n * Command executor hook โ wires parser + command modules + formatters.\n *\n * Parses raw input, lazy-imports command modules, calls them, formats results\n * into OutputLine[] for the output panel.\n */\n\nimport { useCallback, useState } from 'react';\nimport type { KVMemory } from '../../../core/kv-memory.js';\nimport { parseCommand } from '../command-parser.js';\nimport type { OutputLine } from '../formatters.js';\nimport {\n formatConsolidate,\n formatDebt,\n formatDocs,\n formatError,\n formatExec,\n formatGraph,\n formatHelp,\n formatOptimize,\n formatPlan,\n formatPlanList,\n formatSearch,\n formatStats,\n formatVerify,\n} from '../formatters.js';\n\nconst MAX_OUTPUT_LINES = 200;\n\ninterface UseCommandExecutorOptions {\n getMemory: () => KVMemory | null;\n forceRefresh: () => void;\n dbPath: string;\n projectRoot: string;\n}\n\ninterface UseCommandExecutorResult {\n execute: (rawInput: string) => void;\n outputLines: OutputLine[];\n isRunning: boolean;\n runningCommand: string | undefined;\n clearOutput: () => void;\n}\n\nexport function useCommandExecutor({\n getMemory,\n forceRefresh,\n dbPath,\n projectRoot,\n}: UseCommandExecutorOptions): UseCommandExecutorResult {\n const [outputLines, setOutputLines] = useState<OutputLine[]>([]);\n const [isRunning, setIsRunning] = useState(false);\n const [runningCommand, setRunningCommand] = useState<string | undefined>();\n\n const appendLines = useCallback((lines: OutputLine[]) => {\n setOutputLines((prev) => {\n const next = [...prev, ...lines];\n return next.length > MAX_OUTPUT_LINES ? next.slice(-MAX_OUTPUT_LINES) : next;\n });\n }, []);\n\n const clearOutput = useCallback(() => {\n setOutputLines([]);\n }, []);\n\n const execute = useCallback(\n (rawInput: string) => {\n const parsed = parseCommand(rawInput);\n if (!parsed) return;\n\n // Built-in commands\n if (parsed.name === 'clear') {\n clearOutput();\n return;\n }\n\n if (parsed.name === 'help') {\n appendLines(formatHelp());\n return;\n }\n\n setIsRunning(true);\n setRunningCommand(parsed.name);\n\n void (async () => {\n try {\n const lines = await executeCommand(parsed.name, parsed.positionals, parsed.flags, {\n getMemory,\n dbPath,\n projectRoot,\n });\n appendLines(lines);\n forceRefresh();\n } catch (err) {\n appendLines(formatError(err instanceof Error ? err : new Error(String(err))));\n } finally {\n setIsRunning(false);\n setRunningCommand(undefined);\n }\n })();\n },\n [getMemory, forceRefresh, dbPath, projectRoot, appendLines, clearOutput],\n );\n\n return { execute, outputLines, isRunning, runningCommand, clearOutput };\n}\n\nasync function executeCommand(\n name: string,\n positionals: string[],\n flags: Record<string, string | true>,\n ctx: { getMemory: () => KVMemory | null; dbPath: string; projectRoot: string },\n): Promise<OutputLine[]> {\n switch (name) {\n case 'optimize': {\n const memory = ctx.getMemory();\n if (!memory) throw new Error('Memory not initialized');\n const { optimizeCommand } = await import('../../commands/optimize.js');\n const result = await optimizeCommand({\n memory,\n input: typeof flags['input'] === 'string' ? flags['input'] : undefined,\n inputFile: typeof flags['input-file'] === 'string' ? flags['input-file'] : undefined,\n outputFile: typeof flags['output-file'] === 'string' ? flags['output-file'] : undefined,\n dryRun: flags['dry-run'] === true,\n verbose: flags['verbose'] === true || flags['v'] === true,\n });\n return formatOptimize(result);\n }\n\n case 'stats': {\n const memory = ctx.getMemory();\n if (!memory) throw new Error('Memory not initialized');\n const { statsCommand } = await import('../../commands/stats.js');\n const result = await statsCommand({\n memory,\n graph: flags['graph'] === true || flags['g'] === true,\n reset: flags['reset'] === true,\n confirmReset: flags['confirm-reset'] === true,\n });\n return formatStats(result);\n }\n\n case 'consolidate': {\n const memory = ctx.getMemory();\n if (!memory) throw new Error('Memory not initialized');\n const { consolidateCommand } = await import('../../commands/consolidate.js');\n const result = await consolidateCommand({ memory });\n return formatConsolidate(result);\n }\n\n case 'search': {\n const { searchCommand } = await import('../../commands/search.js');\n // Handle subcommands: \"search init\", \"search refresh\"\n const subcommand =\n positionals[0] === 'init' || positionals[0] === 'refresh' ? positionals[0] : undefined;\n const query = subcommand ? undefined : positionals.join(' ') || undefined;\n const result = await searchCommand({\n query,\n subcommand,\n glob: typeof flags['glob'] === 'string' ? flags['glob'] : undefined,\n maxResults:\n typeof flags['max-results'] === 'string'\n ? Number.parseInt(flags['max-results'], 10)\n : undefined,\n });\n return formatSearch(result);\n }\n\n case 'graph': {\n const { graphCommand } = await import('../../commands/graph.js');\n const result = await graphCommand({\n entry: typeof flags['entry'] === 'string' ? flags['entry'] : undefined,\n depth: typeof flags['depth'] === 'string' ? Number.parseInt(flags['depth'], 10) : undefined,\n focus: typeof flags['focus'] === 'string' ? flags['focus'] : undefined,\n });\n return formatGraph(result);\n }\n\n case 'plan': {\n // \"plan list\" subcommand\n if (positionals[0] === 'list') {\n const { planListCommand } = await import('../../commands/plan.js');\n const result = await planListCommand({});\n return formatPlanList(result);\n }\n const { planCommand } = await import('../../commands/plan.js');\n const task = positionals.join(' ');\n if (!task) throw new Error('Task description required: plan <task>');\n const files = typeof flags['files'] === 'string' ? flags['files'].split(',') : undefined;\n const searches =\n typeof flags['searches'] === 'string' ? flags['searches'].split(',') : undefined;\n const result = await planCommand({ task, files, searches });\n return formatPlan(result);\n }\n\n case 'exec': {\n const planId = positionals[0];\n if (!planId) throw new Error('Plan ID required: exec <planId>');\n const { execCommand } = await import('../../commands/exec.js');\n const result = await execCommand({ planId });\n return formatExec(result);\n }\n\n case 'verify': {\n const planId = positionals[0];\n if (!planId) throw new Error('Plan ID required: verify <planId>');\n const { verifyCommand } = await import('../../commands/verify.js');\n const result = await verifyCommand({ planId });\n return formatVerify(result);\n }\n\n case 'docs': {\n const { docsCommand } = await import('../../commands/docs.js');\n const result = await docsCommand({\n output: typeof flags['output'] === 'string' ? flags['output'] : undefined,\n includeGraph: flags['no-graph'] !== true,\n });\n return formatDocs(result);\n }\n\n case 'debt': {\n const subcommand = positionals[0] as\n | 'add'\n | 'list'\n | 'resolve'\n | 'stats'\n | 'start'\n | undefined;\n if (!subcommand || !['add', 'list', 'resolve', 'stats', 'start'].includes(subcommand)) {\n throw new Error('Subcommand required: debt add|list|resolve|start|stats');\n }\n const { debtCommand } = await import('../../commands/debt.js');\n const result = await debtCommand({\n subcommand,\n description: subcommand === 'add' ? positionals.slice(1).join(' ') || undefined : undefined,\n severity: typeof flags['severity'] === 'string' ? flags['severity'] : undefined,\n due: typeof flags['due'] === 'string' ? flags['due'] : undefined,\n tokenCost:\n typeof flags['token-cost'] === 'string'\n ? Number.parseInt(flags['token-cost'], 10)\n : undefined,\n id: subcommand === 'resolve' || subcommand === 'start' ? positionals[1] : undefined,\n overdue: flags['overdue'] === true,\n });\n return formatDebt(result);\n }\n\n default:\n throw new Error(`Unknown command: ${name}. Type help for available commands.`);\n }\n}\n","/**\n * Custom React hook for dashboard data fetching.\n *\n * Opens KVMemory + DebtTracker once via useRef, closes on unmount.\n * Fast data refreshes on interval, slow data (graph) runs once.\n */\n\nimport { statSync } from 'node:fs';\nimport type React from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { DebtStats, TechDebt } from '../../../core/debt-tracker.js';\nimport { createDebtTracker } from '../../../core/debt-tracker.js';\nimport type { DependencyNode, GraphAnalysis } from '../../../core/dependency-graph.js';\nimport { createDependencyGraph } from '../../../core/dependency-graph.js';\nimport type { KVMemory, OptimizationStats } from '../../../core/kv-memory.js';\nimport { createKVMemory } from '../../../core/kv-memory.js';\nimport type { DaemonStatusResult } from '../../../daemon/daemon-process.js';\n\nexport interface DashboardData {\n // Optimization\n optimizationStats: OptimizationStats[];\n totalEntries: number;\n stateDistribution: { active: number; ready: number; silent: number };\n\n // Debt\n debts: TechDebt[];\n debtStats: DebtStats | null;\n\n // Graph (loaded once)\n graphAnalysis: GraphAnalysis | null;\n graphNodes: Map<string, DependencyNode>;\n\n // Daemon\n daemon: DaemonStatusResult | null;\n\n // DB info\n dbSizeBytes: number;\n\n // Meta\n loading: boolean;\n error: string | null;\n lastRefresh: Date;\n\n // Shared accessors for command executor\n getMemory: () => KVMemory | null;\n forceRefresh: () => void;\n}\n\nconst NOOP = () => {};\n\nconst EMPTY_STATE: DashboardData = {\n optimizationStats: [],\n totalEntries: 0,\n stateDistribution: { active: 0, ready: 0, silent: 0 },\n debts: [],\n debtStats: null,\n graphAnalysis: null,\n graphNodes: new Map(),\n daemon: null,\n dbSizeBytes: 0,\n loading: true,\n error: null,\n lastRefresh: new Date(),\n getMemory: () => null,\n forceRefresh: NOOP,\n};\n\nexport function useDashboardData(\n dbPath: string,\n projectRoot: string,\n refreshInterval = 2000,\n): DashboardData {\n const [data, setData] = useState<DashboardData>(EMPTY_STATE);\n const memoryRef = useRef<KVMemory | null>(null);\n const mountedRef = useRef(true);\n const dbPathRef = useRef(dbPath);\n dbPathRef.current = dbPath;\n\n const getMemory = useCallback((): KVMemory | null => memoryRef.current, []);\n\n const doRefreshFast = useCallback(async () => {\n const memory = memoryRef.current;\n if (!memory) return;\n await refreshFast(memory, dbPathRef.current, projectRoot, mountedRef, setData);\n }, [projectRoot]);\n\n const forceRefresh = useCallback(() => {\n void doRefreshFast();\n }, [doRefreshFast]);\n\n // One-time init + periodic fast refresh\n useEffect(() => {\n let timer: ReturnType<typeof setInterval> | null = null;\n\n async function init() {\n try {\n const memory = await createKVMemory(dbPath);\n if (!mountedRef.current) {\n await memory.close();\n return;\n }\n memoryRef.current = memory;\n\n // Initial fast data load\n await refreshFast(memory, dbPath, projectRoot, mountedRef, setData);\n\n // Load graph once (slow)\n await refreshGraph(projectRoot, mountedRef, setData);\n\n // Start periodic refresh\n timer = setInterval(() => {\n if (memoryRef.current) {\n void refreshFast(memoryRef.current, dbPath, projectRoot, mountedRef, setData);\n }\n }, refreshInterval);\n } catch (err) {\n if (mountedRef.current) {\n setData((prev) => ({\n ...prev,\n loading: false,\n error: err instanceof Error ? err.message : String(err),\n }));\n }\n }\n }\n\n void init();\n\n return () => {\n mountedRef.current = false;\n if (timer) clearInterval(timer);\n if (memoryRef.current) {\n void memoryRef.current.close();\n memoryRef.current = null;\n }\n };\n }, [dbPath, projectRoot, refreshInterval]);\n\n return { ...data, getMemory, forceRefresh };\n}\n\nasync function refreshFast(\n memory: KVMemory,\n path: string,\n projectRoot: string,\n mountedRef: React.MutableRefObject<boolean>,\n setData: React.Dispatch<React.SetStateAction<DashboardData>>,\n) {\n try {\n const [stats, ids, activeEntries, readyEntries, silentEntries] = await Promise.all([\n memory.getOptimizationStats(),\n memory.list(),\n memory.query({ state: 'active' }),\n memory.query({ state: 'ready' }),\n memory.query({ state: 'silent' }),\n ]);\n\n // Debt tracker (open/close quickly since it's a separate db concern)\n let debts: TechDebt[] = [];\n let debtStats: DebtStats | null = null;\n try {\n const tracker = createDebtTracker(path);\n debts = await tracker.list();\n debtStats = await tracker.stats();\n await tracker.close();\n } catch {\n // Debt table may not exist yet\n }\n\n // Daemon status\n let daemon: DaemonStatusResult | null = null;\n try {\n const { createDaemonCommand } = await import('../../../daemon/daemon-process.js');\n const { readFileSync } = await import('node:fs');\n const { resolve } = await import('node:path');\n const { load: parseYAML } = await import('js-yaml');\n const configPath = resolve(projectRoot, '.sparn/config.yaml');\n const configContent = readFileSync(configPath, 'utf-8');\n // biome-ignore lint/suspicious/noExplicitAny: YAML returns unknown\n const config = parseYAML(configContent) as any;\n daemon = await createDaemonCommand().status(config);\n } catch {\n // Config/daemon not available\n }\n\n // DB file size\n let dbSizeBytes = 0;\n try {\n dbSizeBytes = statSync(path).size;\n } catch {\n // File may not exist\n }\n\n if (mountedRef.current) {\n setData((prev) => ({\n ...prev,\n optimizationStats: stats,\n totalEntries: ids.length,\n stateDistribution: {\n active: activeEntries.length,\n ready: readyEntries.length,\n silent: silentEntries.length,\n },\n debts,\n debtStats,\n daemon,\n dbSizeBytes,\n loading: false,\n error: null,\n lastRefresh: new Date(),\n }));\n }\n } catch (err) {\n if (mountedRef.current) {\n setData((prev) => ({\n ...prev,\n loading: false,\n error: err instanceof Error ? err.message : String(err),\n }));\n }\n }\n}\n\nasync function refreshGraph(\n projectRoot: string,\n mountedRef: React.MutableRefObject<boolean>,\n setData: React.Dispatch<React.SetStateAction<DashboardData>>,\n) {\n try {\n const graph = createDependencyGraph({ projectRoot });\n const analysis = await graph.analyze();\n const nodes = graph.getNodes();\n if (mountedRef.current) {\n setData((prev) => ({\n ...prev,\n graphAnalysis: analysis,\n graphNodes: nodes,\n }));\n }\n } catch {\n // Graph analysis may fail if project structure is unusual\n }\n}\n","/**\n * Tech Debt Panel โ Bottom-right\n *\n * Scrollable list of debt items with severity coloring.\n * Footer shows open/in-progress/resolved/overdue counts.\n */\n\nimport { Box, Text } from 'ink';\nimport type React from 'react';\nimport type { DebtStats, TechDebt } from '../../../core/debt-tracker.js';\nimport { theme } from '../theme.js';\n\ninterface Props {\n debts: TechDebt[];\n debtStats: DebtStats | null;\n focused: boolean;\n scrollOffset: number;\n}\n\nfunction severityColor(severity: string): string {\n switch (severity) {\n case 'P0':\n return theme.errorRed;\n case 'P1':\n return theme.synapseViolet;\n default:\n return theme.dimGray;\n }\n}\n\nfunction formatDate(ts: number): string {\n const d = new Date(ts);\n return `${d.getMonth() + 1}/${d.getDate()}`;\n}\n\nexport function DebtTrackerPanel({\n debts,\n debtStats,\n focused,\n scrollOffset,\n}: Props): React.ReactElement {\n const borderColor = focused ? theme.neuralCyan : theme.dimGray;\n const now = Date.now();\n\n // Filter to unresolved debts for the list\n const openDebts = debts.filter((d) => d.status !== 'resolved');\n const visibleDebts = openDebts.slice(scrollOffset, scrollOffset + 8);\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={borderColor}\n paddingX={1}\n width=\"50%\"\n flexGrow={1}\n >\n <Text bold color={theme.errorRed}>\n Tech Debt\n </Text>\n <Box flexDirection=\"column\">\n {visibleDebts.length === 0 && <Text color={theme.dimGray}>No open debts</Text>}\n {visibleDebts.map((d) => {\n const isOverdue = d.repayment_date < now && d.status !== 'resolved';\n const color = severityColor(d.severity);\n const desc =\n d.description.length > 30 ? `${d.description.substring(0, 27)}...` : d.description;\n return (\n <Text key={d.id}>\n <Text color={color}>[{d.severity}]</Text> {desc}{' '}\n <Text color={theme.dimGray}>(due: {formatDate(d.repayment_date)})</Text>\n {isOverdue && <Text color={theme.errorRed}> OVERDUE</Text>}\n </Text>\n );\n })}\n {openDebts.length > 8 && (\n <Text color={theme.dimGray}>\n [{scrollOffset + 1}-{Math.min(scrollOffset + 8, openDebts.length)}/{openDebts.length}]\n {focused ? ' \\u2191\\u2193 scroll' : ''}\n </Text>\n )}\n </Box>\n {debtStats && (\n <Box marginTop={1}>\n <Text color={theme.dimGray}>\n Open:{debtStats.open} InProg:{debtStats.in_progress} Resolved:{debtStats.resolved}{' '}\n Overdue:{debtStats.overdue}\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n","/**\n * Dependency Graph Panel โ Top-right\n *\n * ASCII tree of top 8 hot paths using box-drawing chars.\n * Scrollable when focused.\n */\n\nimport { Box, Text } from 'ink';\nimport type React from 'react';\nimport type { DependencyNode, GraphAnalysis } from '../../../core/dependency-graph.js';\nimport { theme } from '../theme.js';\n\ninterface Props {\n analysis: GraphAnalysis | null;\n nodes: Map<string, DependencyNode>;\n focused: boolean;\n scrollOffset: number;\n}\n\nfunction formatTokens(n: number): string {\n if (n >= 1_000) return `${(n / 1_000).toFixed(0)}K`;\n return String(n);\n}\n\nfunction basename(filePath: string): string {\n const parts = filePath.replace(/\\\\/g, '/').split('/');\n return parts[parts.length - 1] || filePath;\n}\n\ninterface TreeLine {\n text: string;\n color: string;\n}\n\nfunction buildTreeLines(nodes: Map<string, DependencyNode>): TreeLine[] {\n const lines: TreeLine[] = [];\n\n // Sort by callers count (descending) to show hottest paths first\n const sorted = [...nodes.values()]\n .filter((n) => n.callers.length > 0)\n .sort((a, b) => b.callers.length - a.callers.length)\n .slice(0, 8);\n\n for (const node of sorted) {\n const name = basename(node.filePath);\n const tok = formatTokens(node.tokenEstimate);\n lines.push({\n text: `${name} (${node.callers.length} callers, ${tok}tok)`,\n color: theme.neuralCyan,\n });\n\n const callerNames = node.callers.slice(0, 3).map(basename);\n const remaining = node.callers.length - callerNames.length;\n\n for (let i = 0; i < callerNames.length; i++) {\n const isLast = i === callerNames.length - 1 && remaining === 0;\n const prefix = isLast ? ' \\u2514\\u2500\\u2500 ' : ' \\u251C\\u2500\\u2500 ';\n lines.push({\n text: `${prefix}${callerNames[i]}`,\n color: theme.dimGray,\n });\n }\n\n if (remaining > 0) {\n lines.push({\n text: ` \\u2514\\u2500\\u2500 ... ${remaining} more`,\n color: theme.dimGray,\n });\n }\n }\n\n return lines;\n}\n\nexport function GraphViewPanel({\n analysis,\n nodes,\n focused,\n scrollOffset,\n}: Props): React.ReactElement {\n const borderColor = focused ? theme.neuralCyan : theme.dimGray;\n\n if (!analysis) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={borderColor}\n paddingX={1}\n width=\"50%\"\n flexGrow={1}\n >\n <Text bold color={theme.synapseViolet}>\n Dependency Graph\n </Text>\n <Text color={theme.dimGray}>Loading graph...</Text>\n </Box>\n );\n }\n\n const lines = buildTreeLines(nodes);\n const visibleLines = lines.slice(scrollOffset, scrollOffset + 12);\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={borderColor}\n paddingX={1}\n width=\"50%\"\n flexGrow={1}\n >\n <Text bold color={theme.synapseViolet}>\n Dependency Graph\n </Text>\n <Text color={theme.dimGray}>\n {analysis.entryPoints.length} entries | {analysis.orphans.length} orphans |{' '}\n {formatTokens(analysis.totalTokens)}tok\n </Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {visibleLines.map((line) => (\n <Text key={line.text} color={line.color}>\n {line.text}\n </Text>\n ))}\n {lines.length > 12 && (\n <Text color={theme.dimGray}>\n [{scrollOffset + 1}-{Math.min(scrollOffset + 12, lines.length)}/{lines.length}]\n {focused ? ' \\u2191\\u2193 scroll' : ''}\n </Text>\n )}\n </Box>\n </Box>\n );\n}\n","/**\n * Memory / Daemon Status Panel โ Bottom-left\n *\n * Shows DB entry count, file size, state distribution,\n * and daemon running/stopped status.\n */\n\nimport { Box, Text } from 'ink';\nimport type React from 'react';\nimport type { DaemonStatusResult } from '../../../daemon/daemon-process.js';\nimport { theme } from '../theme.js';\n\ninterface Props {\n totalEntries: number;\n dbSizeBytes: number;\n stateDistribution: { active: number; ready: number; silent: number };\n daemon: DaemonStatusResult | null;\n focused: boolean;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes >= 1_048_576) return `${(bytes / 1_048_576).toFixed(1)} MB`;\n if (bytes >= 1_024) return `${(bytes / 1_024).toFixed(1)} KB`;\n return `${bytes} B`;\n}\n\nfunction formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return String(n);\n}\n\nexport function MemoryStatusPanel({\n totalEntries,\n dbSizeBytes,\n stateDistribution,\n daemon,\n focused,\n}: Props): React.ReactElement {\n const borderColor = focused ? theme.neuralCyan : theme.dimGray;\n\n const daemonRunning = daemon?.running ?? false;\n const daemonPid = daemon?.pid;\n const sessions = daemon?.sessionsWatched;\n const tokensSaved = daemon?.tokensSaved;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={borderColor}\n paddingX={1}\n width=\"50%\"\n flexGrow={1}\n >\n <Text bold color={theme.brainPink}>\n Memory / Daemon\n </Text>\n <Text>\n Entries: <Text color={theme.white}>{totalEntries}</Text> | Size:{' '}\n <Text color={theme.white}>{formatSize(dbSizeBytes)}</Text>\n </Text>\n <Text>\n Active: <Text color={theme.neuralCyan}>{stateDistribution.active}</Text> Ready:{' '}\n <Text color={theme.synapseViolet}>{stateDistribution.ready}</Text> Silent:{' '}\n <Text color={theme.dimGray}>{stateDistribution.silent}</Text>\n </Text>\n <Box marginTop={1}>\n {daemonRunning ? (\n <Text>\n Daemon: <Text color={theme.neuralCyan}>{'\\u25CF'} Running</Text>\n {daemonPid != null ? ` (PID ${daemonPid})` : ''}\n </Text>\n ) : (\n <Text>\n Daemon: <Text color={theme.errorRed}>{'\\u25CF'} Stopped</Text>\n </Text>\n )}\n </Box>\n {daemonRunning && (\n <Text>\n Sessions: <Text color={theme.white}>{sessions ?? 0}</Text> | Saved:{' '}\n <Text color={theme.white}>{formatTokens(tokensSaved ?? 0)}</Text>\n </Text>\n )}\n </Box>\n );\n}\n","/**\n * Optimization Stats Panel โ Top-left\n *\n * Shows total optimizations, tokens saved, average reduction,\n * and last 5 runs as compact rows.\n */\n\nimport { Box, Text } from 'ink';\nimport type React from 'react';\nimport type { OptimizationStats } from '../../../core/kv-memory.js';\nimport { theme } from '../theme.js';\n\ninterface Props {\n stats: OptimizationStats[];\n focused: boolean;\n}\n\nfunction formatTime(ts: number): string {\n const d = new Date(ts);\n return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`;\n}\n\nfunction formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return String(n);\n}\n\nfunction makeBar(pct: number, width: number): string {\n const filled = Math.round((pct / 100) * width);\n return '\\u2588'.repeat(filled) + '\\u2591'.repeat(width - filled);\n}\n\nexport function OptimizationPanel({ stats, focused }: Props): React.ReactElement {\n const totalOpts = stats.length;\n const totalSaved = stats.reduce((s, r) => s + (r.tokens_before - r.tokens_after), 0);\n\n let avgReduction = 0;\n if (totalOpts > 0) {\n const totalBefore = stats.reduce((s, r) => s + r.tokens_before, 0);\n avgReduction =\n totalBefore > 0 ? ((totalBefore - (totalBefore - totalSaved)) / totalBefore) * 100 : 0;\n }\n\n const recent = stats.slice(-5).reverse();\n const borderColor = focused ? theme.neuralCyan : theme.dimGray;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={borderColor}\n paddingX={1}\n width=\"50%\"\n flexGrow={1}\n >\n <Text bold color={theme.neuralCyan}>\n Optimization Stats\n </Text>\n <Text>\n Total: <Text color={theme.white}>{totalOpts}</Text> optimizations\n </Text>\n <Text>\n Saved: <Text color={theme.white}>{formatTokens(totalSaved)}</Text> tokens\n </Text>\n <Text>\n Avg: <Text color={theme.white}>{avgReduction.toFixed(1)}%</Text>{' '}\n <Text color={theme.neuralCyan}>{makeBar(avgReduction, 10)}</Text>\n </Text>\n {recent.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={theme.dimGray}>Recent:</Text>\n {recent.map((r) => {\n const pct =\n r.tokens_before > 0\n ? (((r.tokens_before - r.tokens_after) / r.tokens_before) * 100).toFixed(0)\n : '0';\n return (\n <Text key={r.id}>\n {' '}\n {formatTime(r.timestamp)} | {formatTokens(r.tokens_before)}\n {'\\u2192'}\n {formatTokens(r.tokens_after)} | {pct}%\n </Text>\n );\n })}\n </Box>\n )}\n </Box>\n );\n}\n","/**\n * Sparn Dashboard โ Persistent TUI with integrated command execution.\n *\n * 4 auto-refreshing monitoring panels + command input/output area.\n * Vim-inspired `:` toggle between monitor mode and command mode.\n *\n * Keys (monitor mode): q=quit, Tab=cycle focus, arrows=scroll, :=command mode\n * Keys (command mode): Escape=monitor mode, Enter=execute, arrows=scroll output\n */\n\nimport { Box, render, Text, useApp, useInput } from 'ink';\nimport type React from 'react';\nimport { useEffect, useState } from 'react';\nimport { CommandInput } from './components/command-input.js';\nimport { OutputPanel } from './components/output-panel.js';\nimport { useCommandExecutor } from './hooks/use-command-executor.js';\nimport { useDashboardData } from './hooks/use-data.js';\nimport { DebtTrackerPanel } from './panels/debt-tracker.js';\nimport { GraphViewPanel } from './panels/graph-view.js';\nimport { MemoryStatusPanel } from './panels/memory-status.js';\nimport { OptimizationPanel } from './panels/optimization.js';\nimport { theme } from './theme.js';\n\ntype PanelId = 'optimization' | 'graph' | 'memory' | 'debt' | 'output';\nconst PANELS: PanelId[] = ['optimization', 'graph', 'memory', 'debt', 'output'];\n\ntype Mode = 'monitor' | 'command';\n\ninterface DashboardProps {\n dbPath: string;\n projectRoot: string;\n refreshInterval: number;\n}\n\nfunction Dashboard({ dbPath, projectRoot, refreshInterval }: DashboardProps): React.ReactElement {\n const { exit } = useApp();\n const data = useDashboardData(dbPath, projectRoot, refreshInterval);\n\n const [mode, setMode] = useState<Mode>('monitor');\n const [focusIndex, setFocusIndex] = useState(0);\n const [graphScroll, setGraphScroll] = useState(0);\n const [debtScroll, setDebtScroll] = useState(0);\n const [outputScroll, setOutputScroll] = useState(0);\n\n const focusedPanel = PANELS[focusIndex] ?? 'optimization';\n\n const executor = useCommandExecutor({\n getMemory: data.getMemory,\n forceRefresh: data.forceRefresh,\n dbPath,\n projectRoot,\n });\n\n useInput(\n (input, key) => {\n if (mode === 'command') {\n // In command mode, only handle Escape to go back\n if (key.escape) {\n setMode('monitor');\n }\n return;\n }\n\n // Monitor mode keybinds\n if (input === 'q') {\n exit();\n return;\n }\n\n if (input === ':') {\n setMode('command');\n return;\n }\n\n if (key.tab) {\n setFocusIndex((prev) => (prev + 1) % PANELS.length);\n return;\n }\n\n // Arrow keys for scrolling the focused panel\n if (key.upArrow) {\n if (focusedPanel === 'graph') setGraphScroll((prev) => Math.max(0, prev - 1));\n if (focusedPanel === 'debt') setDebtScroll((prev) => Math.max(0, prev - 1));\n if (focusedPanel === 'output') setOutputScroll((prev) => Math.max(0, prev - 1));\n }\n if (key.downArrow) {\n if (focusedPanel === 'graph') setGraphScroll((prev) => prev + 1);\n if (focusedPanel === 'debt') setDebtScroll((prev) => prev + 1);\n if (focusedPanel === 'output') setOutputScroll((prev) => prev + 1);\n }\n },\n { isActive: mode === 'monitor' || mode === 'command' },\n );\n\n // Auto-scroll output to follow latest lines\n const outputMaxVisible = 8;\n useEffect(() => {\n setOutputScroll(Math.max(0, executor.outputLines.length - outputMaxVisible));\n }, [executor.outputLines.length]);\n\n if (data.loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color={theme.neuralCyan}>Sparn Dashboard</Text>\n <Text color={theme.dimGray}>Loading data...</Text>\n </Box>\n );\n }\n\n if (data.error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color={theme.neuralCyan}>Sparn Dashboard</Text>\n <Text color={theme.errorRed}>Error: {data.error}</Text>\n <Text color={theme.dimGray}>Press q to quit</Text>\n </Box>\n );\n }\n\n const timeStr = data.lastRefresh.toLocaleTimeString();\n const modeHint =\n mode === 'command' ? 'Esc:monitor Enter:run' : 'q:quit Tab:focus \\u2191\\u2193:scroll ::cmd';\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box justifyContent=\"space-between\" paddingX={1}>\n <Text bold color={theme.neuralCyan}>\n Sparn Dashboard\n </Text>\n <Text color={theme.dimGray}>\n {modeHint} | {timeStr}\n </Text>\n </Box>\n\n {/* Top row */}\n <Box>\n <OptimizationPanel\n stats={data.optimizationStats}\n focused={focusedPanel === 'optimization'}\n />\n <GraphViewPanel\n analysis={data.graphAnalysis}\n nodes={data.graphNodes}\n focused={focusedPanel === 'graph'}\n scrollOffset={graphScroll}\n />\n </Box>\n\n {/* Bottom row */}\n <Box>\n <MemoryStatusPanel\n totalEntries={data.totalEntries}\n dbSizeBytes={data.dbSizeBytes}\n stateDistribution={data.stateDistribution}\n daemon={data.daemon}\n focused={focusedPanel === 'memory'}\n />\n <DebtTrackerPanel\n debts={data.debts}\n debtStats={data.debtStats}\n focused={focusedPanel === 'debt'}\n scrollOffset={debtScroll}\n />\n </Box>\n\n {/* Output panel */}\n <OutputPanel\n lines={executor.outputLines}\n scrollOffset={outputScroll}\n focused={focusedPanel === 'output'}\n />\n\n {/* Command input */}\n <CommandInput\n onSubmit={executor.execute}\n isRunning={executor.isRunning}\n runningCommand={executor.runningCommand}\n active={mode === 'command'}\n />\n </Box>\n );\n}\n\nexport interface RenderDashboardOptions {\n dbPath: string;\n projectRoot: string;\n refreshInterval?: number;\n}\n\nexport function renderDashboard(options: RenderDashboardOptions): void {\n render(\n <Dashboard\n dbPath={options.dbPath}\n projectRoot={options.projectRoot}\n refreshInterval={options.refreshInterval ?? 2000}\n />,\n );\n}\n","#!/usr/bin/env node\n\n/**\n * Sparn CLI entry point.\n * Implements all CLI commands using Commander.js.\n */\n\nimport { spawn } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { Command } from 'commander';\nimport { load as loadYAML } from 'js-yaml';\nimport { playCommand, playComplete, playEnd, playStartup } from '../utils/audio.js';\nimport { setPreciseTokenCounting } from '../utils/tokenizer.js';\nimport { getBanner } from './ui/banner.js';\n\n// Get sparn's own version from its package.json\nfunction getVersion(): string {\n try {\n // Read from sparn's own package.json (relative to compiled module)\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const pkg = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));\n return pkg.version;\n } catch {\n return '1.4.0';\n }\n}\n\nconst VERSION = getVersion();\n\n// Load precise token counting setting from config if available\ntry {\n const configPath = resolve(process.cwd(), '.sparn/config.yaml');\n const configContent = readFileSync(configPath, 'utf-8');\n // biome-ignore lint/suspicious/noExplicitAny: parseYAML returns unknown\n const config = loadYAML(configContent) as any;\n if (config?.realtime?.preciseTokenCounting) {\n setPreciseTokenCounting(true);\n }\n} catch {\n // Config not found or not initialized โ use default heuristic\n}\n\n// Lazy-loaded imports (loaded only when commands are executed):\n// - createKVMemory (heavy: better-sqlite3)\n// - command implementations (may import heavy modules)\n// - progress spinners (heavy: ora)\n// - colors (chalk is reasonably lightweight, but lazy-load for consistency)\n\n/**\n * Global error handler for uncaught errors\n * Provides graceful degradation and helpful error messages\n */\nasync function handleError(error: Error | unknown, context?: string): Promise<void> {\n // Lazy-load colors\n const { errorRed, synapseViolet } = await import('./ui/colors.js');\n\n const errorMsg = error instanceof Error ? error.message : String(error);\n const stack = error instanceof Error ? error.stack : undefined;\n\n // Display user-friendly error message\n console.error(errorRed('\\nโ Error:'), errorMsg);\n\n if (context) {\n console.error(errorRed('Context:'), context);\n }\n\n // Database errors - provide recovery suggestions\n if (errorMsg.includes('SQLITE') || errorMsg.includes('database')) {\n console.error(synapseViolet('\\n๐ก Database issue detected:'));\n console.error(' Try running: rm -rf .sparn/ && sparn init');\n console.error(' This will reinitialize your Sparn database.\\n');\n }\n\n // Permission errors\n if (errorMsg.includes('EACCES') || errorMsg.includes('permission')) {\n console.error(synapseViolet('\\n๐ก Permission issue detected:'));\n console.error(' Check file permissions in .sparn/ directory');\n console.error(' Try: chmod -R u+rw .sparn/\\n');\n }\n\n // File not found errors\n if (errorMsg.includes('ENOENT') || errorMsg.includes('no such file')) {\n console.error(synapseViolet('\\n๐ก File not found:'));\n console.error(' Make sure you have run: sparn init');\n console.error(' Or check that the specified file exists.\\n');\n }\n\n // Memory errors\n if (errorMsg.includes('out of memory') || errorMsg.includes('heap')) {\n console.error(synapseViolet('\\n๐ก Memory issue detected:'));\n console.error(' Try processing smaller chunks of context');\n console.error(' Or increase Node.js memory: NODE_OPTIONS=--max-old-space-size=4096\\n');\n }\n\n // Show stack trace in verbose mode\n if (process.env['SPARN_DEBUG'] === 'true' && stack) {\n console.error(errorRed('\\nStack trace:'));\n console.error(stack);\n } else {\n console.error(' Run with SPARN_DEBUG=true for stack trace\\n');\n }\n\n process.exit(1);\n}\n\n/**\n * Global unhandled rejection handler\n */\nprocess.on('unhandledRejection', (reason) => {\n void handleError(reason, 'Unhandled promise rejection');\n});\n\n/**\n * Global uncaught exception handler\n */\nprocess.on('uncaughtException', (error) => {\n void handleError(error, 'Uncaught exception');\n});\n\nconst program = new Command();\n\nprogram\n .name('sparn')\n .description('Context optimization for AI coding agents')\n .version(VERSION, '-v, --version', 'Output the current version')\n .helpOption('-h, --help', 'Display help for command')\n .enablePositionalOptions();\n\nplayStartup();\n\nprogram.hook('preAction', () => {\n playCommand();\n});\n\nprogram.hook('postAction', () => {\n playComplete();\n});\n\nprocess.on('exit', () => {\n playEnd();\n});\n\nprocess.once('SIGINT', () => {\n // Force exit to avoid inquirer re-prompting โ 'exit' event will play end sound\n process.exit(0);\n});\n\n// Init command\nprogram\n .command('init')\n .description('Initialize Sparn in the current project')\n .option('-f, --force', 'Force overwrite if .sparn/ already exists')\n .addHelpText(\n 'after',\n `\nExamples:\n $ sparn init # Initialize in current directory\n $ sparn init --force # Overwrite existing .sparn/ directory\n\nFiles Created:\n .sparn/config.yaml # Configuration with optimization parameters\n .sparn/memory.db # SQLite database for context storage\n\nNext Steps:\n After initialization, use 'sparn optimize' to start optimizing context.\n`,\n )\n .action(async (options) => {\n // Lazy-load dependencies\n const { initCommand, displayInitSuccess } = await import('./commands/init.js');\n const { createInitSpinner } = await import('./ui/progress.js');\n const { neuralCyan, errorRed } = await import('./ui/colors.js');\n\n const spinner = createInitSpinner('๐ง Initializing Sparn...');\n try {\n spinner.start();\n spinner.text = '๐ Creating .sparn/ directory...';\n const result = await initCommand({ force: options.force });\n spinner.succeed(neuralCyan('Sparn initialized successfully!'));\n displayInitSuccess(result);\n } catch (error) {\n spinner.fail(errorRed('Initialization failed'));\n console.error('Error:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Optimize command\nprogram\n .command('optimize')\n .description('Optimize context memory')\n .option('-i, --input <file>', 'Input file path')\n .option('-o, --output <file>', 'Output file path')\n .option('--dry-run', 'Run without saving to memory')\n .option('--verbose', 'Show detailed per-entry scores')\n .addHelpText(\n 'after',\n `\nExamples:\n $ sparn optimize -i context.txt -o optimized.txt # Optimize file\n $ cat context.txt | sparn optimize # Optimize from stdin\n $ sparn optimize -i context.txt --dry-run # Preview without saving\n $ sparn optimize -i context.txt --verbose # Show entry scores\n\nHow It Works:\n 1. Relevance Filtering: Keeps only 2-5% most relevant context\n 2. Time-Based Decay: Fades old entries unless reinforced\n 3. Entry Classification: Classifies as silent/ready/active\n 4. Critical Event Detection: Locks errors and stack traces\n 5. Periodic Consolidation: Merges duplicates and cleans up\n\nTypical Results:\n โข 60-90% token reduction\n โข Preserved task-critical information\n โข Enhanced AI agent focus\n`,\n )\n .action(async (options) => {\n // Lazy-load dependencies\n const { createKVMemory } = await import('../core/kv-memory.js');\n const { optimizeCommand } = await import('./commands/optimize.js');\n const { createOptimizeSpinner, showTokenSavings } = await import('./ui/progress.js');\n const { neuralCyan, synapseViolet, errorRed } = await import('./ui/colors.js');\n\n const spinner = createOptimizeSpinner('๐ง Initializing optimization...');\n try {\n spinner.start();\n\n // Read from stdin if no input file specified\n let input: string | undefined;\n if (!options.input && !process.stdin.isTTY) {\n spinner.text = '๐ Reading context from stdin...';\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n input = Buffer.concat(chunks).toString('utf-8');\n } else if (options.input) {\n spinner.text = `๐ Reading context from ${options.input}...`;\n }\n\n // Load memory\n spinner.text = '๐พ Loading memory database...';\n const dbPath = resolve(process.cwd(), '.sparn/memory.db');\n const memory = await createKVMemory(dbPath);\n\n try {\n // Run optimization\n spinner.text = 'โก Optimizing context...';\n const result = await optimizeCommand({\n input,\n inputFile: options.input,\n outputFile: options.output,\n memory,\n dryRun: options.dryRun || false,\n verbose: options.verbose || false,\n });\n\n spinner.succeed(neuralCyan(`Optimization complete in ${result.durationMs}ms!`));\n\n // Display visual impact\n showTokenSavings(result.tokensBefore, result.tokensAfter, result.reduction);\n\n // Show entry stats\n console.log(synapseViolet(' Entry Distribution:'));\n console.log(` โข Processed: ${result.entriesProcessed}`);\n console.log(` โข Kept: ${result.entriesKept}`);\n console.log(` โข Active: ${result.stateDistribution.active}`);\n console.log(` โข Ready: ${result.stateDistribution.ready}`);\n console.log(` โข Silent: ${result.stateDistribution.silent}\\n`);\n\n // Show verbose details if requested\n if (options.verbose && result.details) {\n console.log(neuralCyan(' ๐ Entry Details:'));\n for (const detail of result.details) {\n console.log(\n ` ${detail.id.substring(0, 8)}: score=${detail.score.toFixed(2)}, state=${detail.state}, tokens=${detail.tokens}`,\n );\n }\n console.log();\n }\n\n // Write to stdout if no output file\n if (!options.output) {\n console.log(result.output);\n }\n } finally {\n await memory.close();\n }\n } catch (error) {\n spinner.fail(errorRed('Optimization failed'));\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Stats command\nprogram\n .command('stats')\n .description('View optimization statistics')\n .option('--graph', 'Display ASCII bar chart of optimization history')\n .option('--reset', 'Clear all optimization statistics')\n .option('--json', 'Output statistics in JSON format')\n .addHelpText(\n 'after',\n `\nExamples:\n $ sparn stats # View summary statistics\n $ sparn stats --graph # Show ASCII chart of optimization history\n $ sparn stats --json # Output as JSON for automation\n $ sparn stats --reset # Clear all statistics (with confirmation)\n\nTracked Metrics:\n โข Total optimizations performed\n โข Total tokens saved across all runs\n โข Average reduction percentage\n โข Per-run token before/after counts\n โข Optimization duration\n`,\n )\n .action(async (options) => {\n // Lazy-load dependencies\n const { createKVMemory } = await import('../core/kv-memory.js');\n const { statsCommand } = await import('./commands/stats.js');\n const { createStatsSpinner } = await import('./ui/progress.js');\n const { neuralCyan, synapseViolet, errorRed } = await import('./ui/colors.js');\n\n const spinner = options.graph ? createStatsSpinner('๐ Generating statistics...') : null;\n try {\n if (spinner) spinner.start();\n\n // Load memory\n if (spinner) spinner.text = '๐พ Loading optimization history...';\n const dbPath = resolve(process.cwd(), '.sparn/memory.db');\n const memory = await createKVMemory(dbPath);\n\n // Handle reset with confirmation\n let confirmReset = false;\n if (options.reset) {\n if (spinner) spinner.stop();\n console.log(synapseViolet('Warning: This will clear all optimization statistics.'));\n confirmReset = true; // Auto-confirm for now\n }\n\n try {\n // Get stats\n if (spinner) spinner.text = '๐ Calculating statistics...';\n const result = await statsCommand({\n memory,\n graph: options.graph || false,\n reset: options.reset || false,\n confirmReset,\n json: options.json || false,\n });\n\n if (spinner) spinner.succeed(neuralCyan('Statistics ready!'));\n\n // Display output\n if (options.json) {\n console.log(result.json);\n } else if (options.reset && result.resetConfirmed) {\n console.log(neuralCyan('\\nโ Statistics cleared\\n'));\n } else {\n // Display stats summary\n console.log(neuralCyan('\\n๐ Optimization Statistics\\n'));\n console.log(` Total optimizations: ${result.totalCommands}`);\n console.log(` Total tokens saved: ${result.totalTokensSaved.toLocaleString()}`);\n console.log(` Average reduction: ${(result.averageReduction * 100).toFixed(1)}%`);\n\n if (options.graph && result.graph) {\n console.log(result.graph);\n }\n\n console.log();\n }\n } finally {\n await memory.close();\n }\n } catch (error) {\n if (spinner) spinner.fail(errorRed('Statistics failed'));\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Relay command\nprogram\n .command('relay <command> [args...]')\n .description('Proxy a CLI command through optimization')\n .passThroughOptions()\n .option('--silent', 'Suppress token savings summary')\n .addHelpText(\n 'after',\n `\nExamples:\n $ sparn relay git log # Run 'git log' and optimize output\n $ sparn relay npm test # Run 'npm test' and optimize output\n $ sparn relay gh pr view 123 # Optimize GitHub CLI output\n $ sparn relay ls -la --silent # Suppress optimization summary\n\nUse Cases:\n โข Wrap verbose CLI commands (git log, gh pr view)\n โข Optimize test runner output\n โข Compress build logs\n โข Filter CI/CD output for AI agent consumption\n\nThe relay command passes the exit code from the wrapped command.\n`,\n )\n .action(async (command, args, options) => {\n // Lazy-load dependencies\n const { createKVMemory } = await import('../core/kv-memory.js');\n const { relayCommand } = await import('./commands/relay.js');\n const { neuralCyan, errorRed } = await import('./ui/colors.js');\n\n try {\n // Load memory\n const dbPath = resolve(process.cwd(), '.sparn/memory.db');\n const memory = await createKVMemory(dbPath);\n\n let exitCode = 1;\n try {\n // Execute relay\n const result = await relayCommand({\n command,\n args: args || [],\n memory,\n silent: options.silent || false,\n });\n\n // Display optimized output\n console.log(result.optimizedOutput);\n\n // Display summary if not silent\n if (result.summary) {\n console.error(neuralCyan(`\\n${result.summary}\\n`));\n }\n\n exitCode = result.exitCode;\n } finally {\n await memory.close();\n }\n\n // Exit with same code as proxied command\n process.exit(exitCode);\n } catch (error) {\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Consolidate command\nprogram\n .command('consolidate')\n .description('Consolidate memory: remove decayed entries and merge duplicates')\n .addHelpText(\n 'after',\n `\nExamples:\n $ sparn consolidate # Run memory consolidation\n\nWhat It Does:\n 1. Remove Decayed Entries: Deletes entries that have fully decayed\n 2. Merge Duplicates: Combines identical content entries\n 3. VACUUM Database: Reclaims disk space from deletions\n 4. Update Statistics: Tracks consolidation metrics\n\nWhen to Run:\n โข After long-running sessions\n โข Before important optimizations\n โข When database size grows large\n โข As part of nightly maintenance\n\nTypical Results:\n โข 20-40% database size reduction\n โข Faster query performance\n โข Cleaner memory organization\n`,\n )\n .action(async () => {\n // Lazy-load dependencies\n const { createKVMemory } = await import('../core/kv-memory.js');\n const { consolidateCommand } = await import('./commands/consolidate.js');\n const { createConsolidateSpinner, showConsolidationSummary } = await import('./ui/progress.js');\n const { neuralCyan, synapseViolet, errorRed } = await import('./ui/colors.js');\n\n const spinner = createConsolidateSpinner('๐งน Initializing memory consolidation...');\n try {\n spinner.start();\n\n // Load memory\n spinner.text = '๐พ Loading memory database...';\n const dbPath = resolve(process.cwd(), '.sparn/memory.db');\n const memory = await createKVMemory(dbPath);\n\n try {\n // Run consolidation\n spinner.text = '๐ Identifying decayed entries...';\n const result = await consolidateCommand({ memory });\n\n spinner.succeed(neuralCyan(`Consolidation complete in ${result.durationMs}ms!`));\n\n // Display visual impact\n showConsolidationSummary(\n result.entriesBefore,\n result.entriesAfter,\n result.decayedRemoved,\n result.duplicatesRemoved,\n result.durationMs,\n );\n\n // Database vacuum status\n if (result.vacuumCompleted) {\n console.log(synapseViolet(' โ Database VACUUM completed\\n'));\n } else {\n console.log(errorRed(' โ Database VACUUM failed\\n'));\n }\n } finally {\n await memory.close();\n }\n } catch (error) {\n spinner.fail(errorRed('Consolidation failed'));\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Config command\nprogram\n .command('config [subcommand] [key] [value]')\n .description('View or modify configuration')\n .option('--json', 'Output result as JSON')\n .addHelpText(\n 'after',\n `\nExamples:\n $ sparn config # Open config in $EDITOR\n $ sparn config get pruning.threshold # Get specific value\n $ sparn config set pruning.threshold 3 # Set value\n $ sparn config --json # View full config as JSON\n\nConfiguration Keys:\n pruning.threshold # Relevance threshold (2-5%)\n decay.halfLife # Decay half-life (hours)\n decay.minScore # Minimum decay score (0.0-1.0)\n states.activeThreshold # Active state threshold\n states.readyThreshold # Ready state threshold\n embedding.model # BTSP embedding model\n embedding.dimensions # Embedding vector size\n\nThe config file is located at .sparn/config.yaml\n`,\n )\n .action(async (subcommand, key, value, options) => {\n // Lazy-load dependencies\n const { configCommand } = await import('./commands/config.js');\n const { neuralCyan, errorRed } = await import('./ui/colors.js');\n\n try {\n const configPath = resolve(process.cwd(), '.sparn/config.yaml');\n\n // Execute config command\n const result = await configCommand({\n configPath,\n subcommand: subcommand as 'get' | 'set' | undefined,\n key,\n value,\n json: options.json || false,\n });\n\n if (!result.success) {\n console.error(errorRed('Error:'), result.error);\n process.exit(1);\n }\n\n // Handle editor mode\n if (result.editorPath && !options.json) {\n const editorEnv = process.env['EDITOR'] || 'vim';\n // Support multi-word EDITOR values (e.g. \"code --wait\")\n const editorParts = editorEnv.split(/\\s+/);\n const editorCmd = editorParts[0] || 'vim';\n const editorArgs = [...editorParts.slice(1), result.editorPath];\n console.log(neuralCyan(`\\n๐ Opening config in ${editorCmd}...\\n`));\n\n // Spawn editor\n const child = spawn(editorCmd, editorArgs, {\n stdio: 'inherit',\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n console.log(neuralCyan('\\nโ Config edited\\n'));\n }\n process.exit(code ?? 0);\n });\n\n return;\n }\n\n // Display result\n if (result.json) {\n console.log(result.json);\n } else if (result.message) {\n console.log(result.message);\n }\n } catch (error) {\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Daemon command\nprogram\n .command('daemon <subcommand>')\n .description('Manage real-time optimization daemon')\n .addHelpText(\n 'after',\n `\nSubcommands:\n start # Start daemon\n stop # Stop daemon\n status # Check daemon status\n\nExamples:\n $ sparn daemon start # Start watching Claude Code sessions\n $ sparn daemon stop # Stop daemon\n $ sparn daemon status # Check if daemon is running\n\nThe daemon watches ~/.claude/projects/**/*.jsonl and automatically\noptimizes contexts when they exceed the configured threshold.\n`,\n )\n .action(async (subcommand) => {\n // Lazy-load dependencies\n const { load: parseYAML } = await import('js-yaml');\n const { createDaemonCommand } = await import('../daemon/daemon-process.js');\n const { neuralCyan, errorRed } = await import('./ui/colors.js');\n\n try {\n // Load config\n const configPath = resolve(process.cwd(), '.sparn/config.yaml');\n const configYAML = readFileSync(configPath, 'utf-8');\n // biome-ignore lint/suspicious/noExplicitAny: parseYAML returns unknown, need to cast\n const config = parseYAML(configYAML) as any;\n\n const daemon = createDaemonCommand();\n\n switch (subcommand) {\n case 'start': {\n const result = await daemon.start(config);\n if (result.success) {\n console.log(neuralCyan(`\\nโ ${result.message}\\n`));\n } else {\n console.error(errorRed(`\\nโ ${result.message}\\n`));\n process.exit(1);\n }\n break;\n }\n\n case 'stop': {\n const result = await daemon.stop(config);\n if (result.success) {\n console.log(neuralCyan(`\\nโ ${result.message}\\n`));\n } else {\n console.error(errorRed(`\\nโ ${result.message}\\n`));\n process.exit(1);\n }\n break;\n }\n\n case 'status': {\n const result = await daemon.status(config);\n if (result.running) {\n console.log(neuralCyan(`\\nโ ${result.message}`));\n if (result.sessionsWatched !== undefined) {\n console.log(` Sessions watched: ${result.sessionsWatched}`);\n }\n if (result.tokensSaved !== undefined) {\n console.log(` Tokens saved: ${result.tokensSaved.toLocaleString()}`);\n }\n console.log();\n } else {\n console.log(errorRed(`\\nโ ${result.message}\\n`));\n }\n break;\n }\n\n default:\n console.error(errorRed(`\\nUnknown subcommand: ${subcommand}\\n`));\n console.error('Valid subcommands: start, stop, status\\n');\n process.exit(1);\n }\n } catch (error) {\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Hooks command\nprogram\n .command('hooks <subcommand>')\n .description('Manage Claude Code hook integration')\n .option('--global', 'Install hooks globally (for all projects)')\n .addHelpText(\n 'after',\n `\nSubcommands:\n install # Install hooks\n uninstall # Uninstall hooks\n status # Check hook status\n\nExamples:\n $ sparn hooks install # Install hooks for current project\n $ sparn hooks install --global # Install hooks globally\n $ sparn hooks uninstall # Uninstall hooks\n $ sparn hooks status # Check if hooks are active\n\nHooks automatically optimize context before each Claude Code prompt\nand compress verbose tool results after execution.\n`,\n )\n .action(async (subcommand, options) => {\n // Lazy-load dependencies\n const { hooksCommand } = await import('./commands/hooks.js');\n const { neuralCyan, errorRed } = await import('./ui/colors.js');\n\n try {\n const result = await hooksCommand({\n subcommand: subcommand as 'install' | 'uninstall' | 'status',\n global: options.global || false,\n });\n\n if (result.success) {\n console.log(neuralCyan(`\\nโ ${result.message}`));\n\n if (result.hookPaths) {\n console.log('\\nHook paths:');\n console.log(` pre-prompt: ${result.hookPaths.prePrompt}`);\n console.log(` post-tool-result: ${result.hookPaths.postToolResult}`);\n console.log(` stop-docs-refresh: ${result.hookPaths.stopDocsRefresh}`);\n }\n\n console.log();\n } else {\n console.error(errorRed(`\\nโ ${result.message}`));\n if (result.error) {\n console.error(` ${result.error}`);\n }\n console.log();\n process.exit(1);\n }\n } catch (error) {\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Interactive command\nprogram\n .command('interactive')\n .alias('i')\n .description('Launch interactive mode for configuration and exploration')\n .addHelpText(\n 'after',\n `\nExamples:\n $ sparn interactive # Launch interactive mode\n $ sparn i # Short alias\n\nFeatures:\n โข ๐ Configuration Wizard - Guided prompts for all settings\n โข ๐ Optimization Preview - Test optimization with file preview\n โข ๐ Stats Dashboard - Beautiful metrics display\n โข ๐งน Memory Consolidation - Interactive cleanup\n โข ๐ Quick Actions - Common tasks and shortcuts\n\nThe interactive mode provides a conversational interface for exploring\nand configuring Sparn without memorizing CLI flags.\n`,\n )\n .action(async () => {\n // Lazy-load dependencies\n const { createKVMemory } = await import('../core/kv-memory.js');\n const { interactiveCommand } = await import('./commands/interactive.js');\n const { errorRed } = await import('./ui/colors.js');\n\n try {\n // Load memory\n const dbPath = resolve(process.cwd(), '.sparn/memory.db');\n const memory = await createKVMemory(dbPath);\n\n try {\n // Config path\n const configPath = resolve(process.cwd(), '.sparn/config.yaml');\n\n // Run interactive mode\n await interactiveCommand({\n memory,\n configPath,\n });\n } finally {\n await memory.close();\n }\n } catch (error) {\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Graph command\nprogram\n .command('graph')\n .description('Analyze dependency graph of the project')\n .option('--entry <file>', 'Start from a specific entry point')\n .option('--depth <n>', 'Limit traversal depth', (v: string) => Number.parseInt(v, 10))\n .option('--focus <pattern>', 'Focus on modules matching pattern')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { graphCommand } = await import('./commands/graph.js');\n const { neuralCyan, synapseViolet, errorRed } = await import('./ui/colors.js');\n\n try {\n const result = await graphCommand({\n entry: options.entry,\n depth: options.depth,\n focus: options.focus,\n json: options.json,\n });\n\n if (options.json) {\n console.log(result.json);\n } else {\n console.log(neuralCyan('\\n๐ Dependency Graph Analysis\\n'));\n console.log(` Files analyzed: ${result.nodeCount}`);\n console.log(` Entry points: ${result.analysis.entryPoints.length}`);\n console.log(` Orphaned files: ${result.analysis.orphans.length}`);\n console.log(` Total tokens: ${result.analysis.totalTokens.toLocaleString()}`);\n\n if (result.analysis.hotPaths.length > 0) {\n console.log(synapseViolet('\\n Hot paths (most imported):'));\n for (const path of result.analysis.hotPaths.slice(0, 5)) {\n console.log(` ${path}`);\n }\n }\n\n if (result.analysis.entryPoints.length > 0) {\n console.log(synapseViolet('\\n Entry points:'));\n for (const path of result.analysis.entryPoints.slice(0, 5)) {\n console.log(` ${path}`);\n }\n }\n\n console.log();\n }\n } catch (error) {\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Search command\nprogram\n .command('search [query]')\n .description('Search codebase using FTS5 + ripgrep')\n .option('--glob <pattern>', 'Filter by file glob pattern')\n .option('--max <n>', 'Max results (default: 10)', (v: string) => Number.parseInt(v, 10))\n .option('--json', 'Output as JSON')\n .action(async (query, options) => {\n const { searchCommand } = await import('./commands/search.js');\n const { neuralCyan, synapseViolet, errorRed } = await import('./ui/colors.js');\n\n try {\n // Detect subcommands\n let subcommand: 'init' | 'refresh' | undefined;\n if (query === 'init') subcommand = 'init';\n if (query === 'refresh') subcommand = 'refresh';\n\n const result = await searchCommand({\n query: subcommand ? undefined : query,\n subcommand,\n glob: options.glob,\n maxResults: options.max,\n json: options.json,\n });\n\n if (options.json && result.json) {\n console.log(result.json);\n } else if (result.message) {\n console.log(neuralCyan(`\\nโ ${result.message}\\n`));\n }\n\n if (result.results && !options.json) {\n console.log(neuralCyan(`\\n๐ ${result.results.length} results\\n`));\n for (const r of result.results) {\n console.log(synapseViolet(` ${r.filePath}:${r.lineNumber}`));\n console.log(` ${r.content.trim()}`);\n console.log();\n }\n }\n } catch (error) {\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Plan command\nprogram\n .command('plan <task>')\n .description('Create an execution plan for a task')\n .option('--files <files...>', 'Files needed for the task')\n .option('--searches <queries...>', 'Search queries to run')\n .option('--max-reads <n>', 'Max file reads (default: 5)', (v: string) => Number.parseInt(v, 10))\n .option('--json', 'Output as JSON')\n .action(async (task, options) => {\n const { planCommand } = await import('./commands/plan.js');\n const { neuralCyan, synapseViolet, errorRed } = await import('./ui/colors.js');\n\n try {\n if (task === 'list') {\n const { planListCommand } = await import('./commands/plan.js');\n const result = await planListCommand({ json: options.json });\n\n if (options.json) {\n console.log(result.json);\n } else {\n console.log(neuralCyan('\\n๐ Plans\\n'));\n for (const p of result.plans) {\n console.log(` ${p.id} [${p.status}] ${p.task}`);\n }\n if (result.plans.length === 0) console.log(' No plans found');\n console.log();\n }\n return;\n }\n\n const result = await planCommand({\n task,\n files: options.files,\n searches: options.searches,\n maxReads: options.maxReads,\n json: options.json,\n });\n\n if (options.json) {\n console.log(result.json);\n } else {\n console.log(neuralCyan(`\\nโ ${result.message}`));\n console.log(synapseViolet('\\n Steps:'));\n for (const step of result.plan.steps) {\n console.log(` ${step.order}. [${step.action}] ${step.target} โ ${step.description}`);\n }\n console.log();\n }\n } catch (error) {\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Exec command\nprogram\n .command('exec <planId>')\n .description('Execute a plan with constraints')\n .option('--json', 'Output as JSON')\n .action(async (planId, options) => {\n const { execCommand } = await import('./commands/exec.js');\n const { neuralCyan, errorRed } = await import('./ui/colors.js');\n\n try {\n const result = await execCommand({ planId, json: options.json });\n\n if (options.json) {\n console.log(result.json);\n } else {\n console.log(neuralCyan(`\\nโ ${result.message}\\n`));\n }\n } catch (error) {\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Verify command\nprogram\n .command('verify <planId>')\n .description('Verify plan completion')\n .option('--json', 'Output as JSON')\n .action(async (planId, options) => {\n const { verifyCommand } = await import('./commands/verify.js');\n const { neuralCyan, synapseViolet, errorRed } = await import('./ui/colors.js');\n\n try {\n const result = await verifyCommand({ planId, json: options.json });\n\n if (options.json) {\n console.log(result.json);\n } else {\n console.log(neuralCyan(`\\n${result.message}`));\n console.log(synapseViolet('\\n Steps:'));\n for (const d of result.verification.details) {\n const icon = d.status === 'completed' ? 'โ' : d.status === 'failed' ? 'โ' : 'โ';\n console.log(` ${icon} ${d.step}. [${d.action}] ${d.target} โ ${d.status}`);\n }\n console.log();\n }\n } catch (error) {\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Docs command\nprogram\n .command('docs')\n .description('Auto-generate CLAUDE.md for the project')\n .option('-o, --output <file>', 'Output file path (default: CLAUDE.md)')\n .option('--no-graph', 'Skip dependency graph analysis')\n .option('--json', 'Output content as JSON')\n .action(async (options) => {\n const { docsCommand } = await import('./commands/docs.js');\n const { neuralCyan, errorRed } = await import('./ui/colors.js');\n\n try {\n const result = await docsCommand({\n output: options.output,\n includeGraph: options.graph !== false,\n json: options.json,\n });\n\n if (options.json) {\n console.log(JSON.stringify({ content: result.content }, null, 2));\n } else {\n console.log(neuralCyan(`\\nโ ${result.message}\\n`));\n }\n } catch (error) {\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Debt command\nprogram\n .command('debt <subcommand> [description]')\n .description('Track technical debt')\n .option('--severity <level>', 'Severity: P0, P1, P2 (default: P1)')\n .option('--due <date>', 'Repayment date (YYYY-MM-DD)')\n .option('--files <files...>', 'Affected files')\n .option('--tokens <n>', 'Token cost estimate', (v: string) => Number.parseInt(v, 10))\n .option('--id <id>', 'Debt ID (for resolve/start)')\n .option('--overdue', 'Show only overdue debts')\n .option('--json', 'Output as JSON')\n .action(async (subcommand, description, options) => {\n const { debtCommand } = await import('./commands/debt.js');\n const { neuralCyan, synapseViolet, errorRed } = await import('./ui/colors.js');\n\n try {\n const result = await debtCommand({\n subcommand: subcommand as 'add' | 'list' | 'resolve' | 'stats' | 'start',\n description,\n severity: options.severity,\n due: options.due,\n files: options.files,\n tokenCost: options.tokens,\n id: options.id || description,\n overdue: options.overdue,\n json: options.json,\n });\n\n if (options.json && result.json) {\n console.log(result.json);\n } else {\n console.log(neuralCyan(`\\nโ ${result.message}`));\n\n if (result.debts) {\n for (const d of result.debts) {\n const due = new Date(d.repayment_date).toLocaleDateString();\n const overdue =\n d.repayment_date < Date.now() && d.status !== 'resolved' ? ' [OVERDUE]' : '';\n console.log(\n synapseViolet(\n ` ${d.id} [${d.severity}] ${d.status}${overdue} โ ${d.description} (due: ${due})`,\n ),\n );\n }\n }\n\n if (result.stats) {\n console.log(\n ` Open: ${result.stats.open} | In Progress: ${result.stats.in_progress} | Resolved: ${result.stats.resolved}`,\n );\n console.log(\n ` Overdue: ${result.stats.overdue} | Repayment rate: ${(result.stats.repaymentRate * 100).toFixed(0)}%`,\n );\n }\n\n console.log();\n }\n } catch (error) {\n console.error(errorRed('Error:'), error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Dashboard command\nprogram\n .command('dashboard')\n .alias('dash')\n .description('Launch interactive TUI dashboard')\n .option('--refresh <ms>', 'Refresh interval in milliseconds', (v: string) =>\n Number.parseInt(v, 10),\n )\n .action(async (options) => {\n const { renderDashboard } = await import('./dashboard/app.js');\n const dbPath = resolve(process.cwd(), '.sparn/memory.db');\n const projectRoot = process.cwd();\n renderDashboard({\n dbPath,\n projectRoot,\n refreshInterval: options.refresh ?? 2000,\n });\n });\n\n// Status command (quick overview)\nprogram\n .command('status')\n .description('Quick project status overview')\n .action(async () => {\n const { neuralCyan, synapseViolet } = await import('./ui/colors.js');\n\n console.log(neuralCyan(`\\n๐ง Sparn v${VERSION} Status\\n`));\n\n // Check .sparn init\n const { existsSync: exists } = await import('node:fs');\n const sparnDir = resolve(process.cwd(), '.sparn');\n const initialized = exists(sparnDir);\n console.log(` Initialized: ${initialized ? 'โ' : 'โ (run sparn init)'}`);\n\n if (initialized) {\n // Check database\n const dbPath = resolve(sparnDir, 'memory.db');\n console.log(` Database: ${exists(dbPath) ? 'โ' : 'โ'}`);\n\n // Check search index\n const searchDb = resolve(sparnDir, 'search.db');\n console.log(` Search index: ${exists(searchDb) ? 'โ' : 'โ (run sparn search init)'}`);\n\n // Check plans\n const plansDir = resolve(sparnDir, 'plans');\n if (exists(plansDir)) {\n const { readdirSync: readDir } = await import('node:fs');\n const plans = readDir(plansDir).filter((f: string) => f.endsWith('.json'));\n console.log(` Plans: ${plans.length}`);\n }\n\n // Check daemon\n const pidFile = resolve(sparnDir, 'daemon.pid');\n console.log(` Daemon: ${exists(pidFile) ? 'โ running' : 'โ stopped'}`);\n }\n\n console.log(\n synapseViolet('\\n Commands: graph | search | plan | exec | verify | docs | debt\\n'),\n );\n });\n\n// Show banner on version\nprogram.on('option:version', () => {\n console.log(getBanner(VERSION));\n process.exit(0);\n});\n\n// Parse arguments\nprogram.parse();\n","import { execFileSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst AUDIO_DIR = join(dirname(fileURLToPath(import.meta.url)), '../../audio');\nconst DISABLED = process.env['SPARN_AUDIO'] === 'false';\n\nexport function playSound(filename: string): void {\n if (DISABLED) return;\n const filepath = resolve(AUDIO_DIR, filename);\n if (!existsSync(filepath)) return;\n try {\n if (process.platform === 'win32') {\n const escaped = filepath.replace(/'/g, \"''\");\n execFileSync(\n 'powershell.exe',\n [\n '-NoProfile',\n '-NonInteractive',\n '-Command',\n `(New-Object Media.SoundPlayer '${escaped}').PlaySync()`,\n ],\n { windowsHide: true, timeout: 5000, stdio: 'ignore' },\n );\n } else if (process.platform === 'darwin') {\n execFileSync('afplay', [filepath], { timeout: 5000, stdio: 'ignore' });\n } else {\n // Linux: try common audio players in order\n try {\n execFileSync('aplay', ['-q', filepath], { timeout: 5000, stdio: 'ignore' });\n } catch {\n try {\n execFileSync('paplay', [filepath], { timeout: 5000, stdio: 'ignore' });\n } catch {\n execFileSync('play', ['-q', filepath], { timeout: 5000, stdio: 'ignore' });\n }\n }\n }\n } catch {\n /* silent โ player not found or sound failed */\n }\n}\n\nexport function playStartup(): void {\n playSound('startup.wav');\n}\nexport function playCommand(): void {\n playSound('command.wav');\n}\nexport function playComplete(): void {\n playSound('complete.wav');\n}\nexport function playEnd(): void {\n playSound('end.wav');\n}\n"],"mappings":"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","names":["existsSync","dirname","join","fileURLToPath","__filename","__dirname","path","randomUUID","writeFile","input","resolve","readFileSync","path","init_config","spawn","existsSync","readFileSync","writeFileSync","dirname","join","fileURLToPath","status","__filename","__dirname","resolve","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","fileURLToPath","__filename","__dirname","readFileSync","writeFileSync","resolve","parseYAML","stringifyYAML","optimizeCommand","consolidateCommand","existsSync","readFileSync","join","resolve","path","resolve","execFileSync","existsSync","readdirSync","readFileSync","statSync","extname","join","relative","Database","resolve","randomUUID","existsSync","mkdirSync","readdirSync","readFileSync","writeFileSync","join","path","resolve","resolve","resolve","existsSync","readdirSync","readFileSync","extname","join","relative","path","writeFileSync","resolve","randomUUID","Database","resolve","resolve","input","Box","Text","jsx","jsxs","tokenize","input","useState","executeCommand","optimizeCommand","statsCommand","consolidateCommand","searchCommand","graphCommand","planListCommand","result","planCommand","execCommand","verifyCommand","docsCommand","debtCommand","statSync","useCallback","useState","path","createDaemonCommand","readFileSync","resolve","parseYAML","Box","Text","jsx","jsxs","init_debt_tracker","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","formatTokens","Box","Text","jsx","jsxs","formatTokens","Box","Text","useEffect","useState","jsx","jsxs","input","init_debt_tracker","spawn","readFileSync","dirname","join","resolve","fileURLToPath","fileURLToPath","getVersion","__filename","fileURLToPath","__dirname","dirname","readFileSync","join","VERSION","resolve","errorRed","synapseViolet","initCommand","displayInitSuccess","createInitSpinner","neuralCyan","createKVMemory","optimizeCommand","createOptimizeSpinner","showTokenSavings","input","statsCommand","createStatsSpinner","relayCommand","consolidateCommand","createConsolidateSpinner","showConsolidationSummary","configCommand","spawn","parseYAML","createDaemonCommand","hooksCommand","interactiveCommand","graphCommand","path","searchCommand","planCommand","planListCommand","result","execCommand","verifyCommand","docsCommand","debtCommand","renderDashboard"]}
|