@triedotdev/mcp 1.0.119 → 1.0.121
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-GSYMJLZY.js → chunk-7BY2KVIN.js} +417 -288
- package/dist/chunk-7BY2KVIN.js.map +1 -0
- package/dist/cli/yolo-daemon.js +1 -1
- package/dist/{goal-validator-P67RNO2U.js → goal-validator-RD6QBQJB.js} +33 -10
- package/dist/goal-validator-RD6QBQJB.js.map +1 -0
- package/dist/index.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-GSYMJLZY.js.map +0 -1
- package/dist/goal-validator-P67RNO2U.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/scan.ts","../src/utils/streaming.ts","../src/cli/dashboard/index.ts","../src/cli/dashboard/App.tsx","../src/cli/dashboard/state.tsx","../src/cli/dashboard/components/Header.tsx","../src/cli/dashboard/components/Footer.tsx","../src/cli/dashboard/components/Notification.tsx","../src/cli/dashboard/components/ConfigDialog.tsx","../src/cli/dashboard/components/HelpDialog.tsx","../src/cli/dashboard/views/OverviewView.tsx","../src/cli/dashboard/views/AgentView.tsx","../src/cli/dashboard/theme.ts","../src/cli/dashboard/views/GoalsView.tsx","../src/cli/dashboard/views/HypothesesView.tsx","../src/cli/dashboard/views/MemoryTreeView.tsx","../src/cli/dashboard/views/RawLogView.tsx","../src/cli/dashboard/views/ChatView.tsx","../src/tools/tell.ts","../src/extraction/signal-extractor.ts","../src/extraction/metadata-enricher.ts","../src/extraction/pipeline.ts","../src/tools/feedback.ts","../src/tools/check.ts","../src/tools/explain.ts","../src/ai/prompts.ts","../src/tools/query-tools.ts","../src/tools/checkpoint.ts","../src/cli/dashboard/chat-tools.ts"],"sourcesContent":["/**\n * Scan tool - simplified for decision ledger only\n * Note: Skills/scouts have been removed. Trie now focuses on:\n * - Learning from incidents (trie tell)\n * - Predicting risks (trie gotcha)\n * - Decision ledger (context graph)\n */\n\nimport { isInteractiveMode } from '../utils/progress.js';\nimport { getOutputManager } from '../utils/output-manager.js';\n\nexport interface ScanInput {\n files?: string[];\n directory?: string;\n forceAgents?: string[];\n cache?: boolean;\n parallel?: boolean;\n streaming?: boolean;\n format?: 'text' | 'json';\n output?: string;\n [key: string]: any;\n}\n\nexport class TrieScanTool {\n async execute(_input: ScanInput): Promise<any> {\n if (!isInteractiveMode()) {\n console.error('Trie scan has been refocused on decision ledger');\n console.error(' trie tell - report incidents');\n console.error(' trie gotcha - predict risks');\n console.error(' trie learn - learn from history');\n } else {\n getOutputManager().log('info', 'Scan refocused on decision ledger');\n }\n \n return {\n content: [{\n type: 'text',\n text: 'Scan functionality has been refocused on decision ledger.\\n\\nUse:\\n- trie tell - to report incidents\\n- trie gotcha - to predict risks\\n- trie learn - to learn from history'\n }]\n };\n }\n}\n\nexport async function handleScanTool(input: ScanInput): Promise<any> {\n const tool = new TrieScanTool();\n return tool.execute(input);\n}\n","import type { Issue } from '../types/index.js';\nimport { isInteractiveMode } from './progress.js';\nimport type { \n BannerContent, \n SnippetContent, \n CostContent, \n ReadinessContent, \n SemanticContent, \n AttackSurfaceContent \n} from './output-manager.js';\n\n// Internal flag to suppress console output (used in emit error handler)\nconst shouldSuppressConsole = () => isInteractiveMode();\n\n// Rich content event types\nexport type RichContentType = \n | 'snippet' // Code snippet for issue\n | 'cost_report' // Moneybags cost estimate\n | 'readiness_report' // Production readiness\n | 'semantic_report' // Data flow analysis\n | 'attack_surface' // Endpoint analysis\n | 'skill_banner' // ASCII art + quote\n | 'raw_log'; // Raw console log capture\n\nexport interface StreamUpdate {\n type: 'progress' | 'agent_start' | 'agent_complete' | 'issue_found' | 'scan_complete' | 'error' | 'watch_status' | 'watch_change' | 'memory' | 'signal_extracted' | 'pending_fix' | RichContentType;\n timestamp: number;\n data: any;\n}\n\n// Re-export rich content types for convenience\nexport type { BannerContent, SnippetContent, CostContent, ReadinessContent, SemanticContent, AttackSurfaceContent };\n\nexport interface ScanProgress {\n totalFiles: number;\n processedFiles: number;\n currentFile?: string;\n activeAgents: string[];\n completedAgents: string[];\n totalIssues: number;\n issuesBySeverity: {\n critical: number;\n serious: number;\n moderate: number;\n low: number;\n };\n}\n\n/**\n * Streaming scan results for real-time feedback\n */\nexport class StreamingManager {\n private listeners: Set<(update: StreamUpdate) => void> = new Set();\n private progress: ScanProgress = {\n totalFiles: 0,\n processedFiles: 0,\n activeAgents: [],\n completedAgents: [],\n totalIssues: 0,\n issuesBySeverity: { critical: 0, serious: 0, moderate: 0, low: 0 }\n };\n\n /**\n * Subscribe to scan updates\n */\n subscribe(callback: (update: StreamUpdate) => void): () => void {\n this.listeners.add(callback);\n return () => this.listeners.delete(callback);\n }\n\n /**\n * Emit an update to all listeners\n */\n private emit(type: StreamUpdate['type'], data: any): void {\n const update: StreamUpdate = {\n type,\n timestamp: Date.now(),\n data\n };\n\n this.listeners.forEach(listener => {\n try {\n listener(update);\n } catch (error) {\n if (!shouldSuppressConsole()) {\n console.warn('Stream listener error:', error);\n }\n }\n });\n }\n\n /**\n * Initialize scan with file count\n */\n startScan(totalFiles: number): void {\n this.progress = {\n totalFiles,\n processedFiles: 0,\n activeAgents: [],\n completedAgents: [],\n totalIssues: 0,\n issuesBySeverity: { critical: 0, serious: 0, moderate: 0, low: 0 }\n };\n\n this.emit('progress', { ...this.progress });\n }\n\n /**\n * Update current file being processed\n */\n updateCurrentFile(file: string): void {\n this.progress.currentFile = file;\n this.emit('progress', { ...this.progress });\n }\n\n /**\n * Mark file as processed\n */\n completeFile(): void {\n this.progress.processedFiles++;\n this.emit('progress', { ...this.progress });\n }\n\n /**\n * Start agent execution\n */\n startAgent(agentName: string): void {\n if (!this.progress.activeAgents.includes(agentName)) {\n this.progress.activeAgents.push(agentName);\n }\n this.emit('agent_start', { agent: agentName });\n this.emit('progress', { ...this.progress });\n }\n\n /**\n * Complete agent execution\n */\n completeAgent(agentName: string, issues: Issue[]): void {\n // Move from active to completed\n this.progress.activeAgents = this.progress.activeAgents.filter(a => a !== agentName);\n if (!this.progress.completedAgents.includes(agentName)) {\n this.progress.completedAgents.push(agentName);\n }\n\n // Update issue counts\n for (const issue of issues) {\n this.progress.issuesBySeverity[issue.severity]++;\n this.progress.totalIssues++;\n }\n\n this.emit('agent_complete', {\n agent: agentName,\n issueCount: issues.length,\n issues: issues.slice(0, 5) // Only send first 5 for streaming\n });\n this.emit('progress', { ...this.progress });\n }\n\n /**\n * Report new issue found\n */\n reportIssue(issue: Issue): void {\n this.progress.issuesBySeverity[issue.severity]++;\n this.progress.totalIssues++;\n this.emit('issue_found', issue);\n this.emit('progress', { ...this.progress });\n }\n\n /**\n * Complete the entire scan\n */\n completeScan(totalIssues: Issue[]): void {\n this.emit('scan_complete', {\n totalFiles: this.progress.totalFiles,\n totalIssues: totalIssues.length,\n issues: totalIssues, // Include all issues for the dashboard\n issuesBySeverity: this.progress.issuesBySeverity,\n completedAgents: this.progress.completedAgents\n });\n }\n\n /**\n * Report error\n */\n reportError(error: Error, context?: string): void {\n this.emit('error', {\n message: error.message,\n context,\n stack: error.stack\n });\n }\n\n /**\n * Get current progress\n */\n getProgress(): ScanProgress {\n return { ...this.progress };\n }\n\n /**\n * Reset state\n */\n reset(): void {\n this.progress = {\n totalFiles: 0,\n processedFiles: 0,\n activeAgents: [],\n completedAgents: [],\n totalIssues: 0,\n issuesBySeverity: { critical: 0, serious: 0, moderate: 0, low: 0 }\n };\n }\n\n /**\n * Report watch status (directories, debounce, last change)\n */\n reportWatchStatus(status: { watching: boolean; directories?: number; debounceMs?: number; lastChange?: string; recentChanges?: Array<{ file: string; time: string }> }): void {\n this.emit('watch_status', status);\n }\n\n /**\n * Report a specific file change when watching\n */\n reportWatchChange(file: string): void {\n this.emit('watch_change', { file });\n }\n\n /**\n * Report a pending fix for user approval\n */\n reportPendingFix(fix: {\n id: string;\n file: string;\n description: string;\n goalDescription: string;\n confidence: number;\n severity: string;\n suggestedFix: string;\n }): void {\n this.emit('pending_fix', fix);\n }\n\n /**\n * Report memory operations (saving context, learning patterns)\n */\n reportMemory(action: 'saving' | 'saved' | 'learning', details?: string): void {\n this.emit('memory', { action, details });\n }\n\n /**\n * Report signal extraction from watch mode\n */\n reportSignalExtraction(signals: { decisions: number; facts: number; blockers: number; questions: number }): void {\n this.emit('signal_extracted', signals);\n }\n\n // ============================================\n // Rich Content Events (for TUI panes)\n // ============================================\n\n /**\n * Report a code snippet for display\n */\n reportSnippet(snippet: SnippetContent): void {\n this.emit('snippet', snippet);\n }\n\n /**\n * Report cost estimate from Moneybags\n */\n reportCost(cost: CostContent): void {\n this.emit('cost_report', cost);\n }\n\n /**\n * Report production readiness score\n */\n reportReadiness(readiness: ReadinessContent): void {\n this.emit('readiness_report', readiness);\n }\n\n /**\n * Report semantic analysis results\n */\n reportSemantic(semantic: SemanticContent): void {\n this.emit('semantic_report', semantic);\n }\n\n /**\n * Report attack surface analysis\n */\n reportAttackSurface(attack: AttackSurfaceContent): void {\n this.emit('attack_surface', attack);\n }\n\n /**\n * Report skill banner (ASCII art + quote)\n */\n reportBanner(banner: BannerContent): void {\n this.emit('skill_banner', banner);\n }\n\n /**\n * Report raw log entry\n */\n reportRawLog(level: 'info' | 'warn' | 'error' | 'debug', message: string): void {\n this.emit('raw_log', { level, message, time: new Date().toLocaleTimeString('en-US', { hour12: false }) });\n }\n}\n\n/**\n * Format streaming updates for console output\n * Returns null if interactive mode is enabled (dashboard handles display)\n */\nexport function formatConsoleUpdate(update: StreamUpdate): string | null {\n // In interactive mode, the dashboard handles all display\n if (isInteractiveMode()) {\n return null;\n }\n\n switch (update.type) {\n case 'agent_start':\n // Suppress agent start messages - they're redundant with progress updates\n return null;\n\n case 'agent_complete':\n const label = update.data.issueCount > 0 ? '[WARN]' : '[OK]';\n const severityBreakdown: string[] = [];\n if (update.data.issues && Array.isArray(update.data.issues)) {\n const bySeverity = { critical: 0, serious: 0, moderate: 0, low: 0 };\n for (const issue of update.data.issues) {\n if (issue.severity && Object.prototype.hasOwnProperty.call(bySeverity, issue.severity)) {\n bySeverity[issue.severity as keyof typeof bySeverity]++;\n }\n }\n if (bySeverity.critical > 0) severityBreakdown.push(`${bySeverity.critical} critical`);\n if (bySeverity.serious > 0) severityBreakdown.push(`${bySeverity.serious} serious`);\n if (bySeverity.moderate > 0) severityBreakdown.push(`${bySeverity.moderate} moderate`);\n if (bySeverity.low > 0) severityBreakdown.push(`${bySeverity.low} low`);\n }\n const breakdown = severityBreakdown.length > 0 ? ` (${severityBreakdown.join(', ')})` : '';\n return `${label} ${update.data.agent}: ${update.data.issueCount} issues${breakdown}`;\n\n case 'progress':\n // Only show progress updates every 10% or when significant changes occur\n const { processedFiles, totalFiles, currentFile, activeAgents } = update.data;\n const progress = totalFiles > 0 ? Math.round((processedFiles / totalFiles) * 100) : 0;\n \n // Suppress frequent progress updates - only show at milestones\n if (totalFiles > 10 && progress % 10 !== 0 && processedFiles !== totalFiles) {\n return null;\n }\n \n const active = activeAgents.length > 0 ? ` (${activeAgents.join(', ')})` : '';\n const current = currentFile && totalFiles <= 10 ? ` - ${currentFile.split('/').pop()}` : '';\n return `Progress: ${progress}% (${processedFiles}/${totalFiles})${active}${current}`;\n\n case 'scan_complete':\n const { totalIssues, totalFiles: filesScanned, issuesBySeverity } = update.data;\n const severitySummary: string[] = [];\n if (issuesBySeverity) {\n if (issuesBySeverity.critical > 0) severitySummary.push(`${issuesBySeverity.critical} critical`);\n if (issuesBySeverity.serious > 0) severitySummary.push(`${issuesBySeverity.serious} serious`);\n if (issuesBySeverity.moderate > 0) severitySummary.push(`${issuesBySeverity.moderate} moderate`);\n if (issuesBySeverity.low > 0) severitySummary.push(`${issuesBySeverity.low} low`);\n }\n const summary = severitySummary.length > 0 ? ` [${severitySummary.join(', ')}]` : '';\n return `[COMPLETE] Scan finished: ${totalIssues} issues across ${filesScanned} files${summary}`;\n\n case 'error':\n return `[ERROR] ${update.data.message}`;\n\n default:\n return null;\n }\n}\n\n/**\n * Simple progress bar for terminal\n */\nexport function createProgressBar(current: number, total: number, width: number = 40): string {\n if (total === 0) return '█'.repeat(width);\n\n const progress = current / total;\n const filled = Math.round(width * progress);\n const empty = width - filled;\n\n return '█'.repeat(filled) + '░'.repeat(empty);\n}","import { render, type Instance } from 'ink';\nimport React from 'react';\nimport { App } from './App.js';\nimport type { StreamUpdate } from '../../utils/streaming.js';\n\nexport class InteractiveDashboard {\n private app: Instance | null = null;\n private updateHandler: ((update: StreamUpdate) => void) | null = null;\n private getConfigFn: (() => any) | null = null;\n\n async start(): Promise<void> {\n this.app = render(\n React.createElement(App, {\n onReady: (handler, getConfig) => {\n this.updateHandler = handler;\n this.getConfigFn = getConfig;\n },\n }),\n { exitOnCtrlC: false }\n );\n }\n\n stop(): void {\n if (this.app) {\n this.app.unmount();\n this.app = null;\n }\n }\n\n handleStreamUpdate(update: StreamUpdate): void {\n this.updateHandler?.(update);\n }\n\n getAgentConfig(): {\n agentSmith: { aiEnhancement: boolean; minSeverity: string; enabledCategories: Record<string, boolean>; memoryRetentionDays: number };\n performance: { parallel: boolean; cache: boolean; maxConcurrency: number; timeoutMs: number; workers: boolean; streaming: boolean };\n riskThresholds: { critical: number; high: number; medium: number };\n } {\n if (this.getConfigFn) return this.getConfigFn();\n return {\n agentSmith: { aiEnhancement: true, minSeverity: 'low', enabledCategories: { security: true, codeSmells: true, asyncBugs: true, reactPatterns: true, uxPatterns: true, backendPatterns: true }, memoryRetentionDays: 30 },\n performance: { parallel: true, cache: true, maxConcurrency: 4, timeoutMs: 120000, workers: true, streaming: true },\n riskThresholds: { critical: 70, high: 40, medium: 20 },\n };\n }\n}\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { Box, useInput, useApp } from 'ink';\nimport { DashboardProvider, useDashboard } from './state.js';\nimport type { DashboardView } from './types.js';\nimport type { StreamUpdate } from '../../utils/streaming.js';\nimport type { NudgeContent } from '../../utils/output-manager.js';\nimport { getOutputManager } from '../../utils/output-manager.js';\nimport { getWorkingDirectory, getTrieDirectory } from '../../utils/workspace.js';\nimport { getGuardian } from '../../guardian/guardian-agent.js';\nimport { getGuardianState } from '../../guardian/guardian-state.js';\nimport { existsSync } from 'fs';\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport { join } from 'path';\n\nimport { Header } from './components/Header.js';\nimport { Footer } from './components/Footer.js';\nimport { Notification } from './components/Notification.js';\nimport { ConfigDialog } from './components/ConfigDialog.js';\nimport { HelpDialog } from './components/HelpDialog.js';\nimport { OverviewView } from './views/OverviewView.js';\nimport { AgentView } from './views/AgentView.js';\nimport { GoalsView } from './views/GoalsView.js';\nimport { HypothesesView } from './views/HypothesesView.js';\nimport { MemoryTreeView } from './views/MemoryTreeView.js';\nimport { RawLogView } from './views/RawLogView.js';\nimport { ChatView } from './views/ChatView.js';\n\nconst MAIN_VIEWS: DashboardView[] = ['overview', 'memory', 'goals', 'hypotheses', 'agent', 'chat'];\n\nasync function applyGoalFix(\n fix: import('./types.js').PendingFix,\n dispatch: React.Dispatch<import('./types.js').DashboardAction>,\n) {\n try {\n const { runAIAnalysis, isAIAvailable } = await import('../../ai/client.js');\n if (!isAIAvailable()) {\n dispatch({ type: 'DISMISS_FIX', id: fix.id });\n getOutputManager().nudge('AI not available for fix', 'warning');\n return;\n }\n\n const projectPath = getWorkingDirectory(undefined, true);\n const fullPath = join(projectPath, fix.file);\n const content = await readFile(fullPath, 'utf-8');\n\n const result = await runAIAnalysis({\n systemPrompt: `You are a precise code fixer. The user has a quality goal: \"${fix.goalDescription}\".\nA violation was detected: \"${fix.description}\"\nSuggested fix: \"${fix.suggestedFix}\"\n\nReturn the COMPLETE fixed file content. Make the minimal change needed to resolve the violation.\nDo NOT add comments explaining the fix. Do NOT change anything else.\nOutput ONLY the file content, no markdown fences, no explanation.`,\n userPrompt: `Fix this file:\\n\\n\\`\\`\\`\\n${content}\\n\\`\\`\\``,\n maxTokens: 4096,\n temperature: 0,\n });\n\n if (!result.success || !result.content.trim()) {\n dispatch({ type: 'DISMISS_FIX', id: fix.id });\n getOutputManager().nudge('Fix generation failed', 'warning');\n return;\n }\n\n let fixedContent = result.content.trim();\n // Strip markdown fences if the AI wrapped them\n if (fixedContent.startsWith('```')) {\n fixedContent = fixedContent.replace(/^```\\w*\\n?/, '').replace(/\\n?```$/, '');\n }\n\n await writeFile(fullPath, fixedContent, 'utf-8');\n\n // Record the fix\n const { recordGoalViolationFixed, getActiveGoals } = await import('../../guardian/goal-validator.js');\n const goals = await getActiveGoals(projectPath);\n const matchedGoal = goals.find(g => g.description === fix.goalDescription);\n if (matchedGoal) {\n await recordGoalViolationFixed(matchedGoal, fix.file, projectPath);\n }\n\n dispatch({ type: 'FIX_APPLIED', id: fix.id });\n getOutputManager().nudge(`Fixed: ${fix.description} in ${fix.file.split('/').pop()}`, 'info', fix.file, 8000);\n } catch (error) {\n dispatch({ type: 'DISMISS_FIX', id: fix.id });\n getOutputManager().nudge(`Fix failed: ${error}`, 'warning');\n }\n}\n\nfunction DashboardApp({ onReady }: {\n onReady: (handler: (update: StreamUpdate) => void, getConfig: () => any) => void;\n}): React.ReactElement {\n const { state, dispatch } = useDashboard();\n const { exit } = useApp();\n const [showConfig, setShowConfig] = useState(false);\n const [showHelp, setShowHelp] = useState(false);\n const dispatchRef = useRef(dispatch);\n dispatchRef.current = dispatch;\n const stateRef = useRef(state);\n stateRef.current = state;\n\n const configPath = join(getTrieDirectory(getWorkingDirectory(undefined, true)), 'agent.json');\n\n const loadConfig = useCallback(async () => {\n if (!existsSync(configPath)) return;\n try {\n const raw = await readFile(configPath, 'utf-8');\n const parsed = JSON.parse(raw);\n dispatchRef.current({ type: 'SET_AGENT_CONFIG', config: parsed });\n } catch { /* ignore */ }\n }, [configPath]);\n\n const persistConfig = useCallback(async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n await mkdir(getTrieDirectory(workDir), { recursive: true });\n await writeFile(configPath, JSON.stringify(stateRef.current.agentConfig, null, 2), 'utf-8');\n // Sync AI watcher settings to autonomy config so the watch tool picks them up\n const { saveAutonomyConfig, loadAutonomyConfig } = await import('../../utils/autonomy-config.js');\n const autonomy = await loadAutonomyConfig(workDir);\n autonomy.aiWatcher = stateRef.current.agentConfig.aiWatcher;\n await saveAutonomyConfig(workDir, autonomy);\n } catch { /* ignore */ }\n }, [configPath]);\n\n const processInsights = useCallback(async (issues: import('../../types/index.js').Issue[]) => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const trieAgent = getGuardian(workDir);\n\n if (!stateRef.current.agentInitialized) {\n await trieAgent.initialize();\n dispatchRef.current({ type: 'SET_AGENT_INITIALIZED', initialized: true });\n const persisted = trieAgent.getActiveInsights();\n if (persisted.length > 0) {\n dispatchRef.current({ type: 'ADD_INSIGHTS', insights: persisted });\n }\n }\n\n const filesChanged = stateRef.current.watch.recentChanges.map(c => c.file);\n const newInsights = await trieAgent.processIssues(issues, { filesChanged, isWatchMode: stateRef.current.watch.watching });\n\n if (newInsights.length > 0) {\n dispatchRef.current({ type: 'ADD_INSIGHTS', insights: newInsights });\n }\n\n try {\n const agencyStatus = await trieAgent.getAgencyStatus();\n dispatchRef.current({ type: 'SET_AGENCY_STATUS', status: agencyStatus });\n } catch { /* optional */ }\n } catch (error) {\n dispatchRef.current({ type: 'ADD_ACTIVITY', message: `Trie Agent error: ${error instanceof Error ? error.message : 'unknown'}` });\n }\n }, []);\n\n const refreshGoals = useCallback(async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getGuardianState(workDir);\n await agentState.load();\n const goals = agentState.getAllGoals();\n dispatchRef.current({\n type: 'SET_GOALS',\n goals: goals.map(g => {\n const base = { id: g.id, description: g.description, type: g.type, target: g.target, currentValue: g.currentValue, status: g.status, autoGenerated: g.autoGenerated, updatedAt: g.updatedAt };\n return g.category ? { ...base, category: g.category } : base;\n }),\n });\n } catch { /* ignore */ }\n }, []);\n\n const refreshHypotheses = useCallback(async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getGuardianState(workDir);\n await agentState.load();\n const hypotheses = agentState.getAllHypotheses();\n dispatchRef.current({\n type: 'SET_HYPOTHESES',\n hypotheses: hypotheses.map(h => {\n const base = { id: h.id, statement: h.statement, confidence: h.confidence, status: h.status, evidenceCount: h.evidence.length, updatedAt: h.updatedAt };\n return h.category ? { ...base, category: h.category } : base;\n }),\n });\n } catch { /* ignore */ }\n }, []);\n\n useEffect(() => {\n void loadConfig();\n void refreshGoals();\n void refreshHypotheses();\n\n const outputManager = getOutputManager();\n outputManager.setMode('tui');\n outputManager.registerTUICallbacks({\n onActivity: (message: string) => {\n dispatchRef.current({ type: 'ADD_ACTIVITY', message });\n },\n onLog: (level: string, message: string) => {\n const time = new Date().toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' });\n dispatchRef.current({ type: 'STREAM_UPDATE', update: { type: 'raw_log', data: { time, level, message }, timestamp: Date.now() } });\n },\n onNudge: (nudge: NudgeContent) => {\n console.error('[Dashboard] onNudge called:', { message: nudge.message, severity: nudge.severity, file: nudge.file });\n \n const action: import('./types.js').DashboardAction = { type: 'SHOW_NOTIFICATION', message: nudge.message, severity: nudge.severity };\n if (nudge.file !== undefined) (action as any).file = nudge.file;\n if (nudge.autoHideMs !== undefined) (action as any).autoHideMs = nudge.autoHideMs;\n dispatchRef.current(action);\n\n // Persist nudges as insights so they appear in the Nudges tab\n if (nudge.severity === 'critical' || nudge.severity === 'warning') {\n const insight: import('../../guardian/guardian-agent.js').GuardianInsight = {\n id: `nudge-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,\n type: 'warning',\n category: 'quality',\n message: nudge.message,\n priority: nudge.severity === 'critical' ? 9 : 6,\n timestamp: Date.now(),\n suggestedAction: nudge.file ? `Review ${nudge.file}` : undefined,\n relatedIssues: [],\n dismissed: false,\n };\n console.error('[Dashboard] Adding insight:', { id: insight.id, type: insight.type, category: insight.category, priority: insight.priority });\n dispatchRef.current({ type: 'ADD_INSIGHTS', insights: [insight] });\n }\n },\n });\n\n const handleUpdate = (update: StreamUpdate) => {\n dispatchRef.current({ type: 'STREAM_UPDATE', update });\n if (update.type === 'scan_complete' && update.data.issues) {\n void processInsights(update.data.issues);\n }\n };\n\n const getConfig = () => {\n const c = stateRef.current.agentConfig;\n return {\n agentSmith: { ...c.agentSmith, enabledCategories: { ...c.agentSmith.enabledCategories } },\n performance: { ...c.performance },\n riskThresholds: { ...c.riskThresholds },\n };\n };\n\n onReady(handleUpdate, getConfig);\n\n return () => {\n outputManager.clearTUICallbacks();\n outputManager.setMode('console');\n };\n }, [loadConfig, onReady, processInsights, refreshGoals, refreshHypotheses]);\n\n useEffect(() => {\n const interval = setInterval(() => {\n dispatchRef.current({ type: 'AUTO_DISMISS_NOTIFICATIONS' });\n }, 5000);\n return () => clearInterval(interval);\n }, []);\n\n // Watch for approved fixes and apply them via AI\n const applyingFixIds = useRef(new Set<string>());\n useEffect(() => {\n const toApply = state.pendingFixes.filter(f => f.status === 'applying' && !applyingFixIds.current.has(f.id));\n for (const fix of toApply) {\n applyingFixIds.current.add(fix.id);\n void applyGoalFix(fix, dispatchRef.current);\n }\n }, [state.pendingFixes]);\n\n useInput((input, key) => {\n if (showConfig) return;\n if (state.view === 'goals' && state.goalsPanel.inputMode === 'add') return;\n if (state.view === 'hypotheses' && state.hypothesesPanel.inputMode === 'add') return;\n\n // Help dialog toggle - works everywhere except when typing in chat\n if ((input === '/' || input === '?') && state.view !== 'chat') {\n setShowHelp(!showHelp);\n return;\n }\n\n // If help is showing, any key closes it\n if (showHelp) {\n setShowHelp(false);\n return;\n }\n\n // Chat view captures all text input; only allow tab and q/esc at the global level\n if (state.view === 'chat') {\n if (key.tab) {\n const currentIndex = MAIN_VIEWS.indexOf(state.view);\n const nextIndex = (currentIndex + 1) % MAIN_VIEWS.length;\n dispatch({ type: 'SET_VIEW', view: MAIN_VIEWS[nextIndex] || 'overview' });\n }\n return;\n }\n\n // Always-available global shortcuts (work everywhere)\n if (input === 'q' || key.escape) {\n exit();\n process.exit(0);\n }\n\n if (key.tab) {\n const currentIndex = MAIN_VIEWS.indexOf(state.view);\n const nextIndex = currentIndex >= 0 ? (currentIndex + 1) % MAIN_VIEWS.length : 0;\n dispatch({ type: 'SET_VIEW', view: MAIN_VIEWS[nextIndex] || 'overview' });\n return;\n }\n\n // Views with their own input handlers - let them handle ALL their keys first\n // Only process navigation shortcuts if the view doesn't handle them\n if (state.view === 'goals' || state.view === 'hypotheses') {\n // These views have their own useInput handlers that process view-specific keys\n // Don't process any global shortcuts here - let the views handle everything\n return;\n }\n\n // Navigation shortcuts (only for views without their own handlers)\n if (input === 's') { setShowConfig(true); return; }\n if (input === 'l') { dispatch({ type: 'SET_VIEW', view: 'rawlog' }); return; }\n if (input === 'g') { dispatch({ type: 'SET_VIEW', view: 'agent' }); return; }\n if (input === 'o') { dispatch({ type: 'SET_VIEW', view: 'goals' }); void refreshGoals(); return; }\n if (input === 'y') { dispatch({ type: 'SET_VIEW', view: 'hypotheses' }); void refreshHypotheses(); return; }\n if (input === 't') { dispatch({ type: 'SET_VIEW', view: 'memory' }); return; }\n if (input === 'c') { dispatch({ type: 'SET_VIEW', view: 'chat' }); return; }\n\n if (state.view === 'agent' || state.view === 'memory') return;\n\n if (input === 'b') dispatch({ type: 'GO_BACK' });\n if (input === 'n') dispatch({ type: 'NEXT_PAGE' });\n if (input === 'p') dispatch({ type: 'PREV_PAGE' });\n });\n\n let viewComponent: React.ReactElement;\n switch (state.view) {\n case 'overview': viewComponent = <OverviewView />; break;\n case 'agent': viewComponent = <AgentView />; break;\n case 'goals': viewComponent = <GoalsView />; break;\n case 'hypotheses': viewComponent = <HypothesesView />; break;\n case 'memory': viewComponent = <MemoryTreeView />; break;\n case 'rawlog': viewComponent = <RawLogView />; break;\n case 'chat': viewComponent = <ChatView />; break;\n default: viewComponent = <OverviewView />;\n }\n\n return (\n <Box flexDirection=\"column\" height={process.stdout.rows || 40}>\n <Header />\n {!showConfig && !showHelp && <Notification />}\n <Box flexGrow={1} flexDirection=\"column\" overflow=\"hidden\">\n {showConfig ? (\n <ConfigDialog onClose={() => { setShowConfig(false); void persistConfig(); }} />\n ) : showHelp ? (\n <HelpDialog view={state.view} onClose={() => setShowHelp(false)} />\n ) : (\n viewComponent\n )}\n </Box>\n <Footer />\n </Box>\n );\n}\n\nexport interface AppProps {\n onReady: (\n handler: (update: StreamUpdate) => void,\n getConfig: () => any,\n ) => void;\n}\n\nexport function App({ onReady }: AppProps): React.ReactElement {\n return (\n <DashboardProvider>\n <DashboardApp onReady={onReady} />\n </DashboardProvider>\n );\n}\n","import React, { createContext, useContext, useReducer, type Dispatch } from 'react';\nimport type {\n DashboardState,\n DashboardAction,\n AgentConfig,\n} from './types.js';\nimport type { StreamUpdate } from '../../utils/streaming.js';\n\nfunction addActivity(state: DashboardState, message: string): DashboardState {\n const time = new Date().toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' });\n const activityLog = [{ time, message }, ...state.activityLog].slice(0, 50);\n return { ...state, activityLog };\n}\n\nfunction getVisibleInsights(state: DashboardState) {\n return state.agentInsights.filter(i => !i.dismissed);\n}\n\nfunction getMemoryTreeNodes(state: DashboardState): Array<{ id: string; level: number }> {\n const nodes: Array<{ id: string; level: number }> = [];\n const { expandedNodes, snapshot, globalPatterns } = state.memoryTree;\n\n if (!snapshot) return nodes;\n\n const decisionNodes = snapshot.nodes.filter(n => n.type === 'decision');\n const incidentNodes = snapshot.nodes.filter(n => n.type === 'incident');\n const patternNodes = snapshot.nodes.filter(n => n.type === 'pattern');\n const fileNodes = snapshot.nodes.filter(n => n.type === 'file');\n const hotspots = fileNodes.filter(n => {\n const risk = (n.data as { riskLevel?: string }).riskLevel;\n return risk === 'critical' || risk === 'high';\n });\n\n nodes.push({ id: 'decisions', level: 0 });\n if (expandedNodes.has('decisions')) {\n decisionNodes.slice(0, 10).forEach(n => nodes.push({ id: `decision-${n.id}`, level: 1 }));\n }\n\n nodes.push({ id: 'incidents', level: 0 });\n if (expandedNodes.has('incidents')) {\n incidentNodes.slice(0, 10).forEach(n => nodes.push({ id: `incident-${n.id}`, level: 1 }));\n }\n\n nodes.push({ id: 'patterns', level: 0 });\n if (expandedNodes.has('patterns')) {\n patternNodes.slice(0, 10).forEach(n => nodes.push({ id: `pattern-${n.id}`, level: 1 }));\n }\n\n nodes.push({ id: 'cross-project', level: 0 });\n if (expandedNodes.has('cross-project')) {\n globalPatterns.slice(0, 8).forEach(p => nodes.push({ id: `global-${p.id}`, level: 1 }));\n }\n\n if (hotspots.length > 0) {\n nodes.push({ id: 'hotspots', level: 0 });\n if (expandedNodes.has('hotspots')) {\n hotspots.slice(0, 10).forEach(n => nodes.push({ id: `file-${n.id}`, level: 1 }));\n }\n }\n\n return nodes;\n}\n\nfunction handleStreamUpdate(state: DashboardState, update: StreamUpdate): DashboardState {\n let s = { ...state, lastUpdate: Date.now() };\n\n switch (update.type) {\n case 'progress': {\n const oldProgress = s.progress;\n if ((oldProgress.totalFiles === 0 && update.data.totalFiles > 0) ||\n (oldProgress.processedFiles > 0 && update.data.processedFiles === 0)) {\n s.scanStartTime = Date.now();\n s.scanComplete = false;\n s = { ...s };\n delete s.scanEndTime;\n }\n s.progress = update.data;\n const delta = update.data.processedFiles - oldProgress.processedFiles;\n if (delta > 0) {\n s.watch = { ...s.watch, filesScannedSession: s.watch.filesScannedSession + delta };\n }\n if (update.data.issuesBySeverity?.critical > 0) {\n s.alerts = { hasCritical: true, lastCriticalAt: update.timestamp };\n }\n if (update.data.currentFile && update.data.processedFiles % 10 === 0 &&\n update.data.processedFiles !== oldProgress.processedFiles) {\n s = addActivity(s, `Scanned ${update.data.processedFiles}/${update.data.totalFiles} files`);\n }\n break;\n }\n case 'agent_start':\n s = addActivity(s, `[*] Scout started: ${update.data.agent}`);\n break;\n case 'agent_complete':\n s = addActivity(s, `[+] Scout complete: ${update.data.agent} (${update.data.issueCount} issues)`);\n break;\n case 'issue_found':\n s.issues = [...s.issues, update.data];\n if (update.data.severity === 'critical' || update.data.severity === 'serious') {\n const icon = update.data.severity === 'critical' ? '[!]' : '[x]';\n const fileName = update.data.file?.split('/').pop() || 'unknown';\n s = addActivity(s, `${icon} ${update.data.severity.toUpperCase()}: ${update.data.message?.slice(0, 40) || fileName}`);\n if (update.data.severity === 'critical') {\n s.alerts = { hasCritical: true, lastCriticalAt: update.timestamp };\n }\n }\n break;\n case 'scan_complete':\n s.scanComplete = true;\n s.scanEndTime = update.timestamp;\n s.progress = { ...s.progress, processedFiles: s.progress.totalFiles };\n if (update.data.issues && Array.isArray(update.data.issues)) {\n s.issues = update.data.issues;\n }\n s = addActivity(s, `=== Scan complete - ${s.progress.totalIssues} issues ===`);\n break;\n case 'watch_status':\n s.watch = {\n watching: update.data.watching ?? s.watch.watching,\n directories: update.data.directories ?? s.watch.directories,\n debounceMs: update.data.debounceMs ?? s.watch.debounceMs,\n lastChange: update.data.lastChange ?? s.watch.lastChange,\n recentChanges: update.data.recentChanges ?? s.watch.recentChanges,\n filesScannedSession: s.watch.filesScannedSession,\n };\n if (update.data.watching !== undefined) {\n s = addActivity(s, update.data.watching\n ? `[*] Watch mode: ACTIVE (${update.data.directories ?? 0} dirs)`\n : '[*] Watch mode: OFF');\n }\n break;\n case 'watch_change': {\n const entry = { file: update.data.file, time: new Date(update.timestamp).toLocaleTimeString('en-US', { hour12: false }) };\n s.watch = {\n ...s.watch,\n recentChanges: [entry, ...s.watch.recentChanges].slice(0, 5),\n lastChange: entry.time,\n filesScannedSession: s.watch.filesScannedSession + 1,\n };\n const shortFile = update.data.file.split('/').slice(-2).join('/');\n s = addActivity(s, `Change: ${shortFile}`);\n break;\n }\n case 'signal_extracted': {\n const se = { ...s.signalExtraction };\n if (update.data.decisions) se.decisionsExtracted += update.data.decisions;\n if (update.data.facts) se.factsExtracted += update.data.facts;\n if (update.data.blockers) se.blockersExtracted += update.data.blockers;\n if (update.data.questions) se.questionsExtracted += update.data.questions;\n s.signalExtraction = se;\n const total = (update.data.decisions || 0) + (update.data.facts || 0) +\n (update.data.blockers || 0) + (update.data.questions || 0);\n if (total > 0) {\n s = addActivity(s, `[+] Extracted ${total} signals (${update.data.decisions}d, ${update.data.facts}f, ${update.data.blockers}b)`);\n }\n break;\n }\n case 'memory':\n if (update.data.action === 'saving') s = addActivity(s, '[~] Saving to memory...');\n else if (update.data.action === 'saved') s = addActivity(s, `[+] Memory updated: ${update.data.details || 'context saved'}`);\n else if (update.data.action === 'learning') s = addActivity(s, `[~] Learning: ${update.data.details || 'analyzing patterns'}`);\n break;\n case 'raw_log':\n s.rawLog = [{\n time: update.data.time || new Date(update.timestamp).toLocaleTimeString('en-US', { hour12: false }),\n level: update.data.level,\n message: update.data.message,\n }, ...s.rawLog].slice(0, 500);\n break;\n case 'pending_fix':\n s.pendingFixes = [{\n id: update.data.id,\n file: update.data.file,\n description: update.data.description,\n goalDescription: update.data.goalDescription,\n confidence: update.data.confidence,\n severity: update.data.severity,\n suggestedFix: update.data.suggestedFix,\n timestamp: update.timestamp,\n status: 'pending' as const,\n }, ...s.pendingFixes].slice(0, 20);\n s = addActivity(s, `Goal violation: ${update.data.description} [${update.data.confidence}%]`);\n break;\n }\n\n return s;\n}\n\nfunction applyAgentConfigPatch(current: AgentConfig, patch: Partial<AgentConfig>): AgentConfig {\n const config = { ...current };\n if (patch.agentSmith) {\n config.agentSmith = {\n ...config.agentSmith,\n ...patch.agentSmith,\n enabledCategories: {\n ...config.agentSmith.enabledCategories,\n ...(patch.agentSmith.enabledCategories || {}),\n },\n };\n }\n if (patch.performance) config.performance = { ...config.performance, ...patch.performance };\n if (patch.riskThresholds) config.riskThresholds = { ...config.riskThresholds, ...patch.riskThresholds };\n if (patch.aiWatcher) config.aiWatcher = { ...config.aiWatcher, ...patch.aiWatcher };\n return config;\n}\n\nexport function dashboardReducer(state: DashboardState, action: DashboardAction): DashboardState {\n switch (action.type) {\n case 'STREAM_UPDATE':\n return handleStreamUpdate(state, action.update);\n\n case 'SET_VIEW':\n return { ...state, previousView: state.view, view: action.view };\n\n case 'GO_BACK':\n return { ...state, view: state.previousView || 'overview', previousView: null };\n\n case 'ADD_ACTIVITY':\n return addActivity(state, action.message);\n\n case 'SHOW_NOTIFICATION': {\n const now = Date.now();\n const historyEntry: DashboardState['notificationHistory'][0] = {\n message: action.message,\n severity: action.severity,\n timestamp: now,\n dismissed: false,\n };\n if (action.file !== undefined) historyEntry.file = action.file;\n\n const notification: DashboardState['notification'] = {\n active: true,\n message: action.message,\n severity: action.severity,\n timestamp: now,\n };\n if (action.file !== undefined) notification.file = action.file;\n if (action.autoHideMs !== undefined) notification.autoHideAt = now + action.autoHideMs;\n\n let s: DashboardState = {\n ...state,\n notification,\n notificationHistory: [historyEntry, ...state.notificationHistory].slice(0, 50),\n };\n const prefix = action.severity === 'critical' ? '[!]' : action.severity === 'warning' ? '[!]' : '[>]';\n s = addActivity(s, `${prefix} ${action.message}`);\n return s;\n }\n\n case 'DISMISS_NOTIFICATION': {\n if (!state.notification) return state;\n const history = state.notificationHistory.map(h =>\n h.timestamp === state.notification?.timestamp ? { ...h, dismissed: true } : h\n );\n return { ...state, notification: null, notificationHistory: history };\n }\n\n case 'SET_INSIGHTS':\n return { ...state, agentInsights: action.insights };\n\n case 'ADD_INSIGHTS': {\n const existing = state.agentInsights;\n const newOnes = action.insights.filter(ni =>\n !existing.some(ei => ei.message === ni.message && !ei.dismissed)\n );\n const merged = [...newOnes, ...existing].slice(0, 50);\n console.error('[State] ADD_INSIGHTS:', { \n newCount: newOnes.length, \n existingCount: existing.length, \n mergedCount: merged.length,\n newInsights: newOnes.map(i => ({ id: i.id, type: i.type, message: i.message.slice(0, 50) }))\n });\n let s = { ...state, agentInsights: merged };\n \n // Increment unread count for new warning/critical insights\n const newAlerts = newOnes.filter(i => i.type === 'warning' && !i.dismissed).length;\n if (newAlerts > 0) {\n s.unreadNudgesCount = state.unreadNudgesCount + newAlerts;\n }\n \n if (newOnes.length > 0) {\n s = addActivity(s, `Trie Agent: ${newOnes.length} new insight${newOnes.length > 1 ? 's' : ''}`);\n }\n return s;\n }\n\n case 'MARK_NUDGES_READ': {\n return { ...state, unreadNudgesCount: 0 };\n }\n\n case 'SET_AGENT_INITIALIZED':\n return { ...state, agentInitialized: action.initialized };\n\n case 'SET_AGENCY_STATUS':\n return { ...state, agencyStatus: action.status };\n\n case 'SELECT_INSIGHT':\n return { ...state, selectedInsight: action.index };\n\n case 'TOGGLE_INSIGHT':\n return {\n ...state,\n expandedInsight: state.expandedInsight === action.index ? null : action.index,\n };\n\n case 'DISMISS_INSIGHT': {\n const visible = getVisibleInsights(state);\n const insight = visible[action.index];\n if (!insight) return state;\n const insights = state.agentInsights.map(i =>\n i.id === insight.id ? { ...i, dismissed: true } : i\n );\n const remaining = insights.filter(i => !i.dismissed);\n return {\n ...state,\n agentInsights: insights,\n selectedInsight: Math.min(state.selectedInsight, Math.max(0, remaining.length - 1)),\n expandedInsight: state.expandedInsight === action.index ? null : state.expandedInsight,\n };\n }\n\n case 'IGNORE_INSIGHT': {\n const visible = getVisibleInsights(state);\n const insight = visible[action.index];\n if (!insight) return state;\n const insights = state.agentInsights.map(i =>\n i.id === insight.id ? { ...i, dismissed: true } : i\n );\n const remaining = insights.filter(i => !i.dismissed);\n let s = { ...state, agentInsights: insights };\n s.selectedInsight = Math.min(s.selectedInsight, Math.max(0, remaining.length - 1));\n s.expandedInsight = s.expandedInsight === action.index ? null : s.expandedInsight;\n s = addActivity(s, `Ignored: ${insight.message.slice(0, 40)}...`);\n return s;\n }\n\n case 'CLEAR_DISMISSED_INSIGHTS': {\n const dismissedCount = state.agentInsights.filter(i => i.dismissed).length;\n if (dismissedCount === 0) return addActivity(state, 'No dismissed insights to clear');\n const filtered = state.agentInsights.filter(i => !i.dismissed);\n let s: DashboardState = {\n ...state,\n agentInsights: filtered,\n notificationHistory: [] as DashboardState['notificationHistory'],\n expandedInsight: null,\n scrollPositions: { ...state.scrollPositions, agent: 0 },\n };\n s.selectedInsight = Math.min(s.selectedInsight, Math.max(0, filtered.length - 1));\n s = addActivity(s, `Cleared ${dismissedCount} dismissed insight${dismissedCount !== 1 ? 's' : ''}`);\n return s;\n }\n\n case 'SET_GOALS':\n return { ...state, goalsPanel: { ...state.goalsPanel, goals: action.goals } };\n\n case 'SET_GOALS_INPUT_MODE':\n return { ...state, goalsPanel: { ...state.goalsPanel, inputMode: action.mode, inputBuffer: action.mode === 'add' ? '' : state.goalsPanel.inputBuffer } };\n\n case 'SET_GOALS_INPUT_BUFFER':\n return { ...state, goalsPanel: { ...state.goalsPanel, inputBuffer: action.buffer } };\n\n case 'SELECT_GOAL':\n return { ...state, goalsPanel: { ...state.goalsPanel, selectedIndex: action.index } };\n\n case 'SET_HYPOTHESES':\n return { ...state, hypothesesPanel: { ...state.hypothesesPanel, hypotheses: action.hypotheses } };\n\n case 'SET_HYPOTHESES_INPUT_MODE':\n return { ...state, hypothesesPanel: { ...state.hypothesesPanel, inputMode: action.mode, inputBuffer: action.mode === 'add' ? '' : state.hypothesesPanel.inputBuffer } };\n\n case 'SET_HYPOTHESES_INPUT_BUFFER':\n return { ...state, hypothesesPanel: { ...state.hypothesesPanel, inputBuffer: action.buffer } };\n\n case 'SELECT_HYPOTHESIS':\n return { ...state, hypothesesPanel: { ...state.hypothesesPanel, selectedIndex: action.index } };\n\n case 'SET_MEMORY_TREE':\n return {\n ...state,\n memoryTree: { ...state.memoryTree, loaded: true, snapshot: action.snapshot, globalPatterns: action.patterns },\n };\n\n case 'SELECT_MEMORY_NODE':\n return { ...state, memoryTree: { ...state.memoryTree, selectedNode: action.nodeId } };\n\n case 'TOGGLE_MEMORY_NODE': {\n const expandable = ['decisions', 'incidents', 'patterns', 'cross-project', 'hotspots'];\n if (!expandable.includes(action.nodeId)) return state;\n const expanded = new Set(state.memoryTree.expandedNodes);\n if (expanded.has(action.nodeId)) expanded.delete(action.nodeId);\n else expanded.add(action.nodeId);\n return { ...state, memoryTree: { ...state.memoryTree, expandedNodes: expanded } };\n }\n\n case 'SET_AGENT_BRAIN':\n return {\n ...state,\n agentBrain: {\n ...state.agentBrain,\n loaded: true,\n decisions: action.decisions,\n patterns: action.patterns,\n ledgerHash: action.ledgerHash,\n },\n };\n\n case 'SET_CHAT_INPUT':\n return { ...state, chatState: { ...state.chatState, inputBuffer: action.buffer } };\n\n case 'ADD_CHAT_MESSAGE': {\n const msg: DashboardState['chatState']['messages'][0] = {\n role: action.role,\n content: action.content,\n timestamp: Date.now(),\n };\n if (action.toolCalls && action.toolCalls.length > 0) msg.toolCalls = action.toolCalls;\n return {\n ...state,\n chatState: {\n ...state.chatState,\n messages: [...state.chatState.messages, msg].slice(-20),\n },\n };\n }\n\n case 'SET_CHAT_LOADING':\n return { ...state, chatState: { ...state.chatState, loading: action.loading } };\n\n case 'SET_AGENT_CONFIG':\n return { ...state, agentConfig: applyAgentConfigPatch(state.agentConfig, action.config) };\n\n case 'NAVIGATE_UP': {\n if (state.view === 'agent') {\n const visible = getVisibleInsights(state);\n if (visible.length === 0) return state;\n const idx = Math.max(0, state.selectedInsight - 1);\n const scroll = Math.min(state.scrollPositions.agent, idx);\n return { ...state, selectedInsight: idx, scrollPositions: { ...state.scrollPositions, agent: scroll } };\n }\n if (state.view === 'memory') {\n const nodes = getMemoryTreeNodes(state);\n const cur = nodes.findIndex(n => n.id === state.memoryTree.selectedNode);\n if (cur > 0) {\n return { ...state, memoryTree: { ...state.memoryTree, selectedNode: nodes[cur - 1]?.id || 'severity' } };\n }\n return state;\n }\n return state;\n }\n\n case 'NAVIGATE_DOWN': {\n if (state.view === 'agent') {\n const visible = getVisibleInsights(state);\n if (visible.length === 0) return state;\n const maxIdx = Math.max(0, visible.length - 1);\n const idx = Math.min(maxIdx, state.selectedInsight + 1);\n const visibleItems = Math.floor(20 / 4);\n let scroll = state.scrollPositions.agent;\n if (idx >= scroll + visibleItems) scroll = idx - visibleItems + 1;\n return { ...state, selectedInsight: idx, scrollPositions: { ...state.scrollPositions, agent: scroll } };\n }\n if (state.view === 'memory') {\n const nodes = getMemoryTreeNodes(state);\n const cur = nodes.findIndex(n => n.id === state.memoryTree.selectedNode);\n if (cur < nodes.length - 1) {\n return { ...state, memoryTree: { ...state.memoryTree, selectedNode: nodes[cur + 1]?.id || 'severity' } };\n }\n return state;\n }\n return state;\n }\n\n case 'NEXT_PAGE':\n return { ...state, activityPage: Math.min(Math.max(1, Math.ceil(state.activityLog.length / 6)) - 1, state.activityPage + 1) };\n\n case 'PREV_PAGE':\n return { ...state, activityPage: Math.max(0, state.activityPage - 1) };\n\n case 'SET_RAW_LOG_PAGE':\n return { ...state, rawLogPage: action.page };\n\n case 'AUTO_DISMISS_NOTIFICATIONS': {\n const now = Date.now();\n let changed = false;\n const history = state.notificationHistory.map(n => {\n if (!n.dismissed && n.severity !== 'critical') {\n const age = now - n.timestamp;\n const autoHideMs = n.severity === 'info' ? 30000 : 60000;\n if (age > autoHideMs) { changed = true; return { ...n, dismissed: true }; }\n }\n return n;\n });\n if (!changed) return state;\n return { ...state, notificationHistory: history };\n }\n\n case 'ADD_PENDING_FIX':\n return {\n ...state,\n pendingFixes: [action.fix, ...state.pendingFixes].slice(0, 20),\n };\n\n case 'APPROVE_FIX':\n return {\n ...state,\n pendingFixes: state.pendingFixes.map(f =>\n f.id === action.id ? { ...f, status: 'applying' as const } : f\n ),\n };\n\n case 'DISMISS_FIX':\n return {\n ...state,\n pendingFixes: state.pendingFixes.map(f =>\n f.id === action.id ? { ...f, status: 'dismissed' as const } : f\n ),\n };\n\n case 'FIX_APPLIED':\n return {\n ...state,\n pendingFixes: state.pendingFixes.map(f =>\n f.id === action.id ? { ...f, status: 'applied' as const } : f\n ),\n };\n\n case 'SELECT_FIX':\n return { ...state, selectedFixIndex: action.index };\n\n default:\n return state;\n }\n}\n\nexport function createInitialState(): DashboardState {\n return {\n issues: [],\n progress: {\n totalFiles: 0,\n processedFiles: 0,\n activeAgents: [],\n completedAgents: [],\n totalIssues: 0,\n issuesBySeverity: { critical: 0, serious: 0, moderate: 0, low: 0 },\n },\n filter: { severity: 'all', agent: 'all', search: '' },\n view: 'overview',\n previousView: null,\n lastUpdate: Date.now(),\n scanComplete: true,\n startTime: Date.now(),\n scanStartTime: Date.now(),\n activityLog: [],\n activityPage: 0,\n quietMode: false,\n signalExtraction: {\n enabled: !!process.env['ANTHROPIC_API_KEY'],\n decisionsExtracted: 0,\n factsExtracted: 0,\n blockersExtracted: 0,\n questionsExtracted: 0,\n },\n alerts: { hasCritical: false },\n watch: { watching: false, directories: 0, recentChanges: [], filesScannedSession: 0 },\n rawLog: [],\n rawLogPage: 0,\n scrollPositions: { overview: 0, rawlog: 0, agent: 0, goals: 0, hypotheses: 0, memory: 0, chat: 0 },\n notification: null,\n notificationHistory: [],\n agentInsights: [],\n agentInitialized: false,\n agencyStatus: null,\n selectedInsight: 0,\n expandedInsight: null,\n unreadNudgesCount: 0,\n agentConfig: {\n agentSmith: {\n aiEnhancement: true,\n minSeverity: 'low',\n enabledCategories: { security: true, codeSmells: true, asyncBugs: true, reactPatterns: true, uxPatterns: true, backendPatterns: true },\n memoryRetentionDays: 30,\n },\n performance: { parallel: true, cache: true, maxConcurrency: 4, timeoutMs: 120000, workers: true, streaming: true },\n riskThresholds: { critical: 70, high: 40, medium: 20 },\n aiWatcher: { enabled: true, hourlyTokenLimit: 50000, scanCooldownSec: 30, cleanFileCooldownSec: 300, maxFilesPerScan: 5, maxCharsPerFile: 4000 },\n },\n goalsPanel: { goals: [], selectedIndex: 0, selectedAchievedIndex: 0, inputMode: 'browse', inputBuffer: '', lastRefresh: 0 },\n hypothesesPanel: { hypotheses: [], selectedIndex: 0, selectedCompletedIndex: 0, inputMode: 'browse', inputBuffer: '', lastRefresh: 0 },\n memoryTree: { loaded: false, snapshot: null, globalPatterns: [], expandedNodes: new Set(['decisions']), selectedNode: 'decisions', scrollPosition: 0, lastRefresh: 0 },\n agentBrain: { loaded: false, decisions: [], patterns: [], ledgerHash: null, selectedIndex: 0, expandedIndex: null },\n chatState: { messages: [], inputBuffer: '', loading: false },\n pendingFixes: [],\n selectedFixIndex: 0,\n };\n}\n\ninterface DashboardContextValue {\n state: DashboardState;\n dispatch: Dispatch<DashboardAction>;\n}\n\nconst DashboardContext = createContext<DashboardContextValue | null>(null);\n\nexport function DashboardProvider({ children, initialState }: { children: React.ReactNode; initialState?: DashboardState }) {\n const [state, dispatch] = useReducer(dashboardReducer, initialState || createInitialState());\n const value = React.useMemo(() => ({ state, dispatch }), [state, dispatch]);\n return <DashboardContext.Provider value={value}>{children}</DashboardContext.Provider>;\n}\n\nexport function useDashboard(): DashboardContextValue {\n const ctx = useContext(DashboardContext);\n if (!ctx) throw new Error('useDashboard must be used within DashboardProvider');\n return ctx;\n}\n\nexport function useDispatch(): Dispatch<DashboardAction> {\n return useDashboard().dispatch;\n}\n\nexport { getVisibleInsights, getMemoryTreeNodes };\n","import React from 'react';\nimport { Box, Text, useStdout } from 'ink';\nimport { useDashboard } from '../state.js';\n\nexport function Header(): React.ReactElement {\n const { state } = useDashboard();\n const { signalExtraction, watch, alerts } = state;\n const { stdout } = useStdout();\n const cols = stdout?.columns || 80;\n const narrow = cols < 50;\n\n const totalExtracted = signalExtraction.decisionsExtracted + signalExtraction.factsExtracted +\n signalExtraction.blockersExtracted + signalExtraction.questionsExtracted;\n\n let status: React.ReactElement;\n if (watch.watching) {\n status = totalExtracted > 0\n ? <Text><Text color=\"green\">●</Text>{narrow ? '' : ' '}<Text color=\"green\">{narrow ? '' : 'Learning'}</Text>{!narrow && <Text dimColor> {totalExtracted} signals</Text>}</Text>\n : <Text><Text color=\"green\">●</Text>{!narrow && ' Watching'}</Text>;\n } else {\n status = <Text><Text dimColor>○</Text>{!narrow && <Text dimColor> Idle</Text>}</Text>;\n }\n\n return (\n <Box paddingX={1} justifyContent=\"space-between\">\n <Text bold color=\"magenta\">Trie</Text>\n <Box gap={narrow ? 1 : 2}>\n {status}\n {alerts.hasCritical && <Text color=\"red\" bold>●{!narrow && ' Alert'}</Text>}\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text, useStdout } from 'ink';\nimport { useDashboard } from '../state.js';\nimport type { DashboardView } from '../types.js';\n\nconst VIEW_LABELS: Record<DashboardView, string> = {\n overview: 'Overview',\n rawlog: 'Log',\n agent: 'Nudges',\n goals: 'Goals',\n hypotheses: 'Hypotheses',\n memory: 'Ledger',\n chat: 'Chat',\n};\n\nconst VIEW_SHORT: Record<DashboardView, string> = {\n overview: 'Ovr',\n rawlog: 'Log',\n agent: 'Ndg',\n goals: 'Gls',\n hypotheses: 'Hyp',\n memory: 'Ldg',\n chat: 'Cht',\n};\n\nconst TAB_VIEWS: DashboardView[] = ['overview', 'memory', 'goals', 'hypotheses', 'agent', 'chat'];\n\nconst CONTEXT_HINTS: Partial<Record<DashboardView, string>> = {\n goals: 'j/k nav · a add · r run check · enter complete · d delete · x clear achieved · / help',\n hypotheses: 'j/k nav · a add · r run check · v validate · x invalidate · / help',\n agent: 'j/k nav · enter expand · d dismiss · / help',\n memory: 'j/k nav · enter expand · / help',\n chat: 'type to ask · enter send · esc clear · / help',\n rawlog: 'n/p pages · b back · / help',\n};\n\nconst CONTEXT_HINTS_SHORT: Partial<Record<DashboardView, string>> = {\n goals: 'j/k a r d x /',\n hypotheses: 'j/k a r v x /',\n agent: 'j/k enter d /',\n memory: 'j/k enter /',\n chat: 'enter esc /',\n rawlog: 'n/p b /',\n};\n\nexport function Footer(): React.ReactElement {\n const { state } = useDashboard();\n const { view, goalsPanel, hypothesesPanel, unreadNudgesCount } = state;\n const { stdout } = useStdout();\n const cols = stdout?.columns || 80;\n const narrow = cols < 60;\n const veryNarrow = cols < 40;\n\n const labels = narrow ? VIEW_SHORT : VIEW_LABELS;\n const hasUnreadNudges = unreadNudgesCount > 0;\n\n let hints: string;\n if (view === 'goals' && goalsPanel.inputMode === 'add') {\n hints = narrow ? 'enter esc' : 'enter save · esc cancel';\n } else if (view === 'hypotheses' && hypothesesPanel.inputMode === 'add') {\n hints = narrow ? 'enter esc' : 'enter save · esc cancel';\n } else {\n const hintMap = narrow ? CONTEXT_HINTS_SHORT : CONTEXT_HINTS;\n hints = hintMap[view] || (narrow ? 's n/p /' : 'n/p pages · s settings · / help');\n }\n\n if (veryNarrow) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Box gap={0}>\n {TAB_VIEWS.map((v, idx) => {\n const isAgent = v === 'agent';\n const isCurrent = v === view;\n const isLast = idx === TAB_VIEWS.length - 1;\n \n return (\n <React.Fragment key={v}>\n {isCurrent ? (\n <Text color=\"green\" bold>{labels[v]}</Text>\n ) : isAgent && hasUnreadNudges ? (\n <Text color=\"yellow\" bold>{labels[v]} ({unreadNudgesCount})</Text>\n ) : (\n <Text dimColor>{labels[v]}</Text>\n )}\n {!isLast && <Text dimColor> · </Text>}\n </React.Fragment>\n );\n })}\n </Box>\n <Text dimColor>{hints} · q quit</Text>\n </Box>\n );\n }\n\n return (\n <Box paddingX={1} justifyContent=\"space-between\">\n <Box gap={0}>\n {TAB_VIEWS.map((v, idx) => {\n const isAgent = v === 'agent';\n const isCurrent = v === view;\n const isLast = idx === TAB_VIEWS.length - 1;\n \n return (\n <React.Fragment key={v}>\n {isCurrent ? (\n <Text color=\"green\" bold>{labels[v]}</Text>\n ) : isAgent && hasUnreadNudges ? (\n <Text color=\"yellow\" bold>{labels[v]} ({unreadNudgesCount})</Text>\n ) : (\n <Text dimColor>{labels[v]}</Text>\n )}\n {!isLast && <Text dimColor> · </Text>}\n </React.Fragment>\n );\n })}\n </Box>\n <Text dimColor>{hints} · q quit</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text, useStdout } from 'ink';\nimport { useDashboard } from '../state.js';\n\nexport function Notification(): React.ReactElement | null {\n const { state } = useDashboard();\n const { notification } = state;\n const { stdout } = useStdout();\n const cols = stdout?.columns || 80;\n\n if (!notification || !notification.active) return null;\n if (notification.autoHideAt && Date.now() > notification.autoHideAt) return null;\n\n const color = notification.severity === 'critical' ? 'red'\n : notification.severity === 'warning' ? 'yellow'\n : 'blue';\n\n const maxMsgLen = Math.max(20, cols - 8);\n const msg = notification.message.length > maxMsgLen\n ? notification.message.slice(0, maxMsgLen - 1) + '...'\n : notification.message;\n\n return (\n <Box paddingX={1}>\n <Text color={color} bold>● </Text>\n <Text wrap=\"truncate\">{msg}</Text>\n </Box>\n );\n}\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useDashboard } from '../state.js';\nimport type { AgentConfig } from '../types.js';\nimport { isAIAvailable, setAPIKey, getKeyFromKeychain } from '../../../ai/client.js';\nimport { getWorkingDirectory, getTrieDirectory } from '../../../utils/workspace.js';\nimport { existsSync } from 'fs';\nimport { rm } from 'fs/promises';\nimport { join } from 'path';\n\ntype ConfigSection = 'main' | 'agentSmith' | 'performance' | 'riskThresholds' | 'apiKeys' | 'memory' | 'aiWatcher';\n\ninterface ConfigItem {\n label: string;\n key: string;\n value: string;\n section: ConfigSection;\n}\n\nfunction maskKey(key: string | null): string {\n if (!key || key.length < 12) return 'Not set';\n return key.slice(0, 7) + '...' + key.slice(-4);\n}\n\nexport function ConfigDialog({ onClose }: { onClose: () => void }): React.ReactElement {\n const { state, dispatch } = useDashboard();\n const [section, setSection] = useState<ConfigSection>('main');\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [editing, setEditing] = useState(false);\n const [editBuffer, setEditBuffer] = useState('');\n const [editIsText, setEditIsText] = useState(false);\n const [showConfirmClear, setShowConfirmClear] = useState(false);\n const [clearingMemory, setClearingMemory] = useState(false);\n\n const config = state.agentConfig;\n\n const currentKeyDisplay = isAIAvailable()\n ? maskKey(getKeyFromKeychain() || process.env.ANTHROPIC_API_KEY || null)\n : 'Not set';\n const keyActive = isAIAvailable();\n\n const mainMenu: ConfigItem[] = [\n { label: 'API Keys', key: 'apiKeys', value: keyActive ? 'Active' : 'Not set', section: 'main' },\n { label: 'AI Watcher', key: 'aiWatcher', value: config.aiWatcher.enabled ? `${(config.aiWatcher.hourlyTokenLimit / 1000).toFixed(0)}k/hr` : 'Off', section: 'main' },\n { label: 'Performance', key: 'performance', value: `${config.performance.maxConcurrency} concurrent`, section: 'main' },\n { label: 'Risk Thresholds', key: 'riskThresholds', value: `critical: ${config.riskThresholds.critical}%`, section: 'main' },\n { label: 'Memory', key: 'memory', value: 'Clear & Reset', section: 'main' },\n ];\n\n const apiKeysItems: ConfigItem[] = [\n { label: 'Anthropic', key: 'anthropic', value: currentKeyDisplay, section: 'apiKeys' },\n ];\n\n const performanceItems: ConfigItem[] = [\n { label: 'Max Concurrency', key: 'maxConcurrency', value: String(config.performance.maxConcurrency), section: 'performance' },\n { label: 'Timeout (ms)', key: 'timeoutMs', value: String(config.performance.timeoutMs), section: 'performance' },\n { label: 'Parallel', key: 'parallel', value: config.performance.parallel ? 'on' : 'off', section: 'performance' },\n { label: 'Cache', key: 'cache', value: config.performance.cache ? 'on' : 'off', section: 'performance' },\n { label: 'Workers', key: 'workers', value: config.performance.workers ? 'on' : 'off', section: 'performance' },\n ];\n\n const riskItems: ConfigItem[] = [\n { label: 'Critical', key: 'critical', value: String(config.riskThresholds.critical), section: 'riskThresholds' },\n { label: 'High', key: 'high', value: String(config.riskThresholds.high), section: 'riskThresholds' },\n { label: 'Medium', key: 'medium', value: String(config.riskThresholds.medium), section: 'riskThresholds' },\n ];\n\n const aiWatcherItems: ConfigItem[] = [\n { label: 'Enabled', key: 'enabled', value: config.aiWatcher.enabled ? 'on' : 'off', section: 'aiWatcher' },\n { label: 'Token Budget /hr', key: 'hourlyTokenLimit', value: String(config.aiWatcher.hourlyTokenLimit), section: 'aiWatcher' },\n { label: 'Scan Cooldown (s)', key: 'scanCooldownSec', value: String(config.aiWatcher.scanCooldownSec), section: 'aiWatcher' },\n { label: 'Clean Cooldown (s)', key: 'cleanFileCooldownSec', value: String(config.aiWatcher.cleanFileCooldownSec), section: 'aiWatcher' },\n { label: 'Max Files/Scan', key: 'maxFilesPerScan', value: String(config.aiWatcher.maxFilesPerScan), section: 'aiWatcher' },\n { label: 'Max Chars/File', key: 'maxCharsPerFile', value: String(config.aiWatcher.maxCharsPerFile), section: 'aiWatcher' },\n ];\n\n const memoryItems: ConfigItem[] = [\n { label: 'Clear All Memory', key: 'clearAll', value: 'Reset ledger, context graph', section: 'memory' },\n ];\n\n const items = section === 'main' ? mainMenu\n : section === 'apiKeys' ? apiKeysItems\n : section === 'performance' ? performanceItems\n : section === 'riskThresholds' ? riskItems\n : section === 'aiWatcher' ? aiWatcherItems\n : section === 'memory' ? memoryItems\n : mainMenu;\n\n useInput((_input, key) => {\n if (showConfirmClear) {\n if (_input === 'y' || _input === 'Y') {\n setClearingMemory(true);\n clearMemory().then(() => {\n dispatch({ type: 'ADD_ACTIVITY', message: 'Memory cleared successfully' });\n setShowConfirmClear(false);\n setClearingMemory(false);\n setSection('main');\n }).catch(() => {\n dispatch({ type: 'ADD_ACTIVITY', message: 'Failed to clear memory' });\n setShowConfirmClear(false);\n setClearingMemory(false);\n });\n } else if (_input === 'n' || _input === 'N' || key.escape) {\n setShowConfirmClear(false);\n }\n return;\n }\n \n if (editing) {\n if (key.escape) { setEditing(false); setEditBuffer(''); setEditIsText(false); }\n else if (key.return) {\n const item = items[selectedIndex];\n if (item) {\n if (editIsText) {\n if (item.key === 'anthropic' && editBuffer.length > 10) {\n setAPIKey(editBuffer);\n dispatch({ type: 'ADD_ACTIVITY', message: 'API key saved' });\n }\n } else {\n const val = parseInt(editBuffer, 10);\n if (!isNaN(val)) {\n const patch: Partial<AgentConfig> = {};\n if (section === 'performance') {\n if (item.key === 'maxConcurrency' || item.key === 'timeoutMs') {\n patch.performance = { ...config.performance, [item.key]: val };\n }\n } else if (section === 'riskThresholds') {\n patch.riskThresholds = { ...config.riskThresholds, [item.key]: val };\n } else if (section === 'aiWatcher') {\n patch.aiWatcher = { ...config.aiWatcher, [item.key]: val };\n }\n if (Object.keys(patch).length > 0) {\n dispatch({ type: 'SET_AGENT_CONFIG', config: patch });\n dispatch({ type: 'ADD_ACTIVITY', message: `${item.label} set to ${val}` });\n }\n }\n }\n }\n setEditing(false);\n setEditBuffer('');\n setEditIsText(false);\n } else if (key.backspace || key.delete) {\n setEditBuffer(editBuffer.slice(0, -1));\n } else if (_input) {\n if (editIsText) {\n setEditBuffer(editBuffer + _input);\n } else if (/\\d/.test(_input)) {\n setEditBuffer(editBuffer + _input);\n }\n }\n return;\n }\n\n if (key.escape || _input === 'b') {\n if (section === 'main') onClose();\n else { setSection('main'); setSelectedIndex(0); }\n } else if (key.upArrow || _input === 'k') {\n setSelectedIndex(Math.max(0, selectedIndex - 1));\n } else if (key.downArrow || _input === 'j') {\n setSelectedIndex(Math.min(items.length - 1, selectedIndex + 1));\n } else if (key.return) {\n if (section === 'main') {\n const item = items[selectedIndex];\n if (item) {\n setSection(item.key as ConfigSection);\n setSelectedIndex(0);\n }\n } else if (section === 'apiKeys') {\n setEditing(true);\n setEditBuffer('');\n setEditIsText(true);\n } else if (section === 'memory') {\n const item = items[selectedIndex];\n if (item && item.key === 'clearAll') {\n setShowConfirmClear(true);\n }\n } else {\n const item = items[selectedIndex];\n if (item) {\n if (section === 'aiWatcher' && item.key === 'enabled') {\n const patch: Partial<AgentConfig> = {\n aiWatcher: { ...config.aiWatcher, enabled: !config.aiWatcher.enabled },\n };\n dispatch({ type: 'SET_AGENT_CONFIG', config: patch });\n dispatch({ type: 'ADD_ACTIVITY', message: `AI Watcher ${!config.aiWatcher.enabled ? 'enabled' : 'disabled'}` });\n } else if (['parallel', 'cache', 'workers'].includes(item.key)) {\n const patch: Partial<AgentConfig> = {\n performance: { ...config.performance, [item.key]: !config.performance[item.key as keyof typeof config.performance] },\n };\n dispatch({ type: 'SET_AGENT_CONFIG', config: patch });\n } else {\n setEditing(true);\n setEditBuffer(item.value);\n }\n }\n }\n }\n });\n\n const sectionTitle = section === 'main' ? 'Settings'\n : section === 'apiKeys' ? 'API Keys'\n : section === 'aiWatcher' ? 'AI Watcher'\n : section === 'performance' ? 'Performance'\n : section === 'riskThresholds' ? 'Risk Thresholds'\n : section === 'memory' ? 'Memory'\n : 'Settings';\n\n async function clearMemory(): Promise<void> {\n const workDir = getWorkingDirectory(undefined, true);\n const trieDir = getTrieDirectory(workDir);\n const filesToDelete = [\n join(trieDir, 'context.db'),\n join(trieDir, 'context.json'),\n join(trieDir, 'incident-trie.json'),\n join(trieDir, 'memory', 'ledger.json'),\n join(trieDir, 'memory', 'issue-store.db'),\n join(trieDir, 'memory', 'insights.json'),\n join(trieDir, 'memory', 'issues.json'),\n ];\n for (const file of filesToDelete) {\n if (existsSync(file)) {\n await rm(file, { force: true });\n }\n }\n }\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold>{sectionTitle}</Text>\n\n {showConfirmClear && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"red\" bold>Clear all memory?</Text>\n <Text dimColor> Risk hotspots, decisions, incidents, insights</Text>\n <Text dimColor> Goals, hypotheses, and config are preserved</Text>\n {clearingMemory\n ? <Text dimColor> Clearing...</Text>\n : <Text> <Text bold>y</Text> confirm <Text bold>n</Text> cancel</Text>\n }\n </Box>\n )}\n\n {!showConfirmClear && section === 'memory' && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text> Clear All Memory</Text>\n <Text dimColor> Reset ledger, context graph, issue store</Text>\n <Text dimColor> enter to clear · esc back</Text>\n </Box>\n )}\n\n {!showConfirmClear && section === 'apiKeys' && !editing && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text>\n {' '}Anthropic: {currentKeyDisplay}\n {' '}{keyActive ? <Text color=\"green\">● Active</Text> : <Text dimColor>○ Not set</Text>}\n </Text>\n <Text dimColor> enter to update · esc back</Text>\n </Box>\n )}\n\n {!showConfirmClear && section === 'apiKeys' && editing && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box borderStyle=\"single\" borderColor=\"green\" paddingX={1}>\n <Text>{editBuffer || <Text dimColor>sk-ant-...</Text>}<Text bold color=\"green\">|</Text></Text>\n </Box>\n <Text dimColor> enter save · esc cancel</Text>\n </Box>\n )}\n\n {!showConfirmClear && section !== 'apiKeys' && section !== 'memory' && (\n <Box flexDirection=\"column\" marginTop={1}>\n {items.map((item, idx) => {\n const isSelected = selectedIndex === idx;\n return (\n <Text key={item.key}>\n {isSelected ? <Text bold color=\"green\">{'> '}</Text> : ' '}\n <Text bold={isSelected}>{item.label}</Text>\n <Text dimColor> </Text>\n {editing && isSelected\n ? <Text>{editBuffer}<Text bold color=\"green\">|</Text></Text>\n : <Text dimColor>{item.value}</Text>}\n </Text>\n );\n })}\n <Text dimColor> {section === 'main' ? 'enter select · esc close' : 'enter edit · esc back'}</Text>\n </Box>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { DashboardView } from '../types.js';\n\ninterface HelpDialogProps {\n view: DashboardView;\n onClose: () => void;\n}\n\nconst VIEW_HELP: Record<DashboardView, Array<{ key: string; description: string }>> = {\n overview: [\n { key: 'tab', description: 'Navigate between views' },\n { key: 'g', description: 'Go to Nudges' },\n { key: 'o', description: 'Go to Goals' },\n { key: 'y', description: 'Go to Hypotheses' },\n { key: 't', description: 'Go to Ledger' },\n { key: 'c', description: 'Go to Chat' },\n { key: 'l', description: 'Go to Raw Log' },\n { key: 's', description: 'Open Settings' },\n { key: 'q / esc', description: 'Quit' },\n ],\n agent: [\n { key: 'j / ↓', description: 'Move down' },\n { key: 'k / ↑', description: 'Move up' },\n { key: 'enter', description: 'Expand selected nudge' },\n { key: 'd', description: 'Dismiss selected nudge' },\n { key: 'tab', description: 'Navigate between views' },\n { key: 's', description: 'Open Settings' },\n { key: 'q / esc', description: 'Quit' },\n ],\n goals: [\n { key: 'j / ↓', description: 'Move down' },\n { key: 'k / ↑', description: 'Move up' },\n { key: 'a', description: 'Add new goal' },\n { key: 'r', description: 'Run check on selected goal' },\n { key: 'enter', description: 'Mark goal as complete' },\n { key: 'd', description: 'Delete selected goal' },\n { key: 'x', description: 'Clear all achieved goals' },\n { key: 'tab', description: 'Navigate between views' },\n { key: 's', description: 'Open Settings' },\n { key: 'q / esc', description: 'Quit' },\n ],\n hypotheses: [\n { key: 'j / ↓', description: 'Move down' },\n { key: 'k / ↑', description: 'Move up' },\n { key: 'a', description: 'Add new hypothesis' },\n { key: 'r', description: 'Run check on selected hypothesis' },\n { key: 'v', description: 'Mark hypothesis as validated' },\n { key: 'x', description: 'Mark hypothesis as invalidated' },\n { key: 'tab', description: 'Navigate between views' },\n { key: 's', description: 'Open Settings' },\n { key: 'q / esc', description: 'Quit' },\n ],\n memory: [\n { key: 'j / ↓', description: 'Move down' },\n { key: 'k / ↑', description: 'Move up' },\n { key: 'enter', description: 'Expand selected item' },\n { key: 'tab', description: 'Navigate between views' },\n { key: 's', description: 'Open Settings' },\n { key: 'q / esc', description: 'Quit' },\n ],\n chat: [\n { key: 'type', description: 'Enter message' },\n { key: 'enter', description: 'Send message' },\n { key: 'esc', description: 'Clear input' },\n { key: 'tab', description: 'Navigate between views' },\n { key: 'q', description: 'Quit (press twice if input active)' },\n ],\n rawlog: [\n { key: 'n', description: 'Next page' },\n { key: 'p', description: 'Previous page' },\n { key: 'b', description: 'Back to previous view' },\n { key: 'tab', description: 'Navigate between views' },\n { key: 's', description: 'Open Settings' },\n { key: 'q / esc', description: 'Quit' },\n ],\n};\n\nexport function HelpDialog({ view, onClose }: HelpDialogProps): React.ReactElement {\n const shortcuts = VIEW_HELP[view] || VIEW_HELP.overview;\n const viewName = view.charAt(0).toUpperCase() + view.slice(1);\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n paddingX={2}\n paddingY={1}\n width=\"80%\"\n alignSelf=\"center\"\n marginTop={2}\n >\n <Text bold color=\"cyan\">\n {viewName} View - Keyboard Shortcuts\n </Text>\n <Box marginTop={1} flexDirection=\"column\" gap={0}>\n {shortcuts.map(({ key, description }, idx) => (\n <Box key={idx} gap={2}>\n <Box width={12}>\n <Text color=\"yellow\">{key}</Text>\n </Box>\n <Text>{description}</Text>\n </Box>\n ))}\n </Box>\n <Box marginTop={1}>\n <Text dimColor>Press / or ? again to close</Text>\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport { useDashboard } from '../state.js';\n\nfunction truncate(str: string, max: number): string {\n return str.length > max ? str.slice(0, max - 1) + '...' : str;\n}\n\nexport function OverviewView(): React.ReactElement {\n const { state, dispatch } = useDashboard();\n const { progress, signalExtraction, watch, issues, activityLog, activityPage, pendingFixes, selectedFixIndex } = state;\n const { totalIssues } = progress;\n const { stdout } = useStdout();\n const cols = stdout?.columns || 80;\n const narrow = cols < 60;\n const contentWidth = Math.max(20, cols - 4);\n\n const endTime = state.scanComplete && state.scanEndTime ? state.scanEndTime : Date.now();\n const elapsed = ((endTime - state.scanStartTime) / 1000).toFixed(1);\n\n const criticalIssues = issues.filter(i => i.severity === 'critical').slice(0, 3);\n const activeFixes = pendingFixes.filter(f => f.status === 'pending' || f.status === 'applying');\n\n const activityRows = activeFixes.length > 0 ? 5 : 8;\n const startIdx = activityPage * activityRows;\n const pageActivities = activityLog.slice(startIdx, startIdx + activityRows);\n\n useInput((input, key) => {\n if (state.view !== 'overview' || activeFixes.length === 0) return;\n\n if (key.upArrow && activeFixes.length > 0) {\n dispatch({ type: 'SELECT_FIX', index: Math.max(0, selectedFixIndex - 1) });\n }\n if (key.downArrow && activeFixes.length > 0) {\n dispatch({ type: 'SELECT_FIX', index: Math.min(activeFixes.length - 1, selectedFixIndex + 1) });\n }\n if (input === 'f' && activeFixes[selectedFixIndex]) {\n dispatch({ type: 'APPROVE_FIX', id: activeFixes[selectedFixIndex]!.id });\n }\n if (input === 'x' && activeFixes[selectedFixIndex]) {\n dispatch({ type: 'DISMISS_FIX', id: activeFixes[selectedFixIndex]!.id });\n }\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text dimColor>Scanned {watch.filesScannedSession} files {elapsed}s</Text>\n\n {watch.watching && signalExtraction.enabled && (\n <Text wrap=\"truncate\">\n <Text color=\"green\">●</Text> Signal extraction\n {!narrow && (signalExtraction.decisionsExtracted > 0 || signalExtraction.factsExtracted > 0 || signalExtraction.blockersExtracted > 0) && (\n <Text dimColor> {signalExtraction.decisionsExtracted}d · {signalExtraction.factsExtracted}f · {signalExtraction.blockersExtracted}b</Text>\n )}\n </Text>\n )}\n\n {criticalIssues.length > 0 && criticalIssues.map((issue, i) => {\n const filename = issue.file.split('/').pop() || issue.file;\n const lineNum = issue.line ? `:${issue.line}` : '';\n const issueLen = Math.max(15, contentWidth - filename.length - 6);\n return (\n <Text key={i} wrap=\"truncate\">\n <Text color=\"red\">●</Text> <Text color=\"red\">{truncate(issue.issue, issueLen)}</Text>\n <Text dimColor> {filename}{lineNum}</Text>\n </Text>\n );\n })}\n\n {totalIssues === 0 && criticalIssues.length === 0 && activeFixes.length === 0 && (\n <Text><Text color=\"green\">●</Text> No issues</Text>\n )}\n\n {activeFixes.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold>Goal Violations</Text>\n {activeFixes.map((fix, i) => {\n const isSelected = i === selectedFixIndex;\n const confidenceColor = fix.confidence >= 90 ? 'green' : fix.confidence >= 70 ? 'yellow' : 'red';\n const shortFile = fix.file.split('/').pop() || fix.file;\n const descLen = Math.max(15, contentWidth - shortFile.length - 10);\n\n return (\n <Box key={fix.id} flexDirection=\"column\">\n <Text wrap=\"truncate\">\n {isSelected ? <Text bold color=\"yellow\">{'> '}</Text> : ' '}\n <Text color=\"yellow\">●</Text>\n {' '}\n <Text>{truncate(fix.description, descLen)}</Text>\n <Text dimColor> {shortFile}</Text>\n </Text>\n <Text wrap=\"truncate\">\n {' '}\n <Text color={confidenceColor} bold>{fix.confidence}%</Text>\n {narrow\n ? (fix.status === 'applying' && <Text color=\"cyan\"> applying...</Text>)\n : <>\n <Text dimColor> confidence fix: {truncate(fix.suggestedFix, contentWidth - 25)}</Text>\n {fix.status === 'applying' && <Text color=\"cyan\"> applying...</Text>}\n </>\n }\n </Text>\n </Box>\n );\n })}\n <Text dimColor> f fix · x dismiss</Text>\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold>Activity</Text>\n {pageActivities.map((entry, i) => (\n <Text key={i} wrap=\"truncate\">{' '}<Text dimColor>{entry.time}</Text> {truncate(entry.message, contentWidth - 14)}</Text>\n ))}\n {pageActivities.length === 0 && <Text dimColor> No activity yet</Text>}\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useCallback } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport { useDashboard, getVisibleInsights } from '../state.js';\nimport { formatTimeAgo } from '../theme.js';\nimport { isAIAvailable } from '../../../ai/client.js';\nimport { getWorkingDirectory } from '../../../utils/workspace.js';\nimport { TieredStorage } from '../../../storage/tiered-storage.js';\nimport { ContextGraph } from '../../../context/graph.js';\nimport type { PatternNodeData, Node } from '../../../context/types.js';\n\nfunction timeAgo(iso: string): string {\n const ms = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(ms / 60000);\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n return `${Math.floor(hrs / 24)}d ago`;\n}\n\nexport function AgentView(): React.ReactElement {\n const { state, dispatch } = useDashboard();\n const { agentInsights, agentBrain, selectedInsight, expandedInsight } = state;\n const { stdout } = useStdout();\n const cols = stdout?.columns || 80;\n const msgLen = Math.max(20, cols - 25);\n\n const visibleInsights = getVisibleInsights(state);\n const alerts = visibleInsights.filter(i => i.type === 'warning');\n const { decisions, patterns, loaded } = agentBrain;\n\n // Debug: Log insights to help troubleshoot\n useEffect(() => {\n if (agentInsights.length > 0 || visibleInsights.length > 0) {\n console.error('[AgentView Debug]', {\n totalInsights: agentInsights.length,\n visibleInsights: visibleInsights.length,\n alerts: alerts.length,\n insightTypes: agentInsights.map(i => i.type),\n visibleTypes: visibleInsights.map(i => i.type),\n });\n }\n }, [agentInsights, visibleInsights, alerts]);\n\n const loadBrain = useCallback(async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const storage = new TieredStorage(workDir);\n const graph = new ContextGraph(workDir);\n\n const [decs, snap] = await Promise.all([\n storage.queryDecisions({ limit: 20 }),\n graph.getSnapshot(),\n ]);\n\n const patternData = snap.nodes\n .filter((n): n is Node & { type: 'pattern'; data: PatternNodeData } => n.type === 'pattern')\n .map(n => n.data);\n\n dispatch({ type: 'SET_AGENT_BRAIN', decisions: decs, patterns: patternData, ledgerHash: null });\n } catch {\n dispatch({ type: 'ADD_ACTIVITY', message: 'Agent brain load error' });\n }\n }, [dispatch]);\n\n useEffect(() => {\n if (!loaded) { void loadBrain(); }\n }, [loaded, loadBrain]);\n\n // Mark nudges as read when this view is shown\n useEffect(() => {\n if (state.unreadNudgesCount > 0) {\n dispatch({ type: 'MARK_NUDGES_READ' });\n }\n }, [dispatch, state.unreadNudgesCount]);\n\n useInput((input, key) => {\n if (key.upArrow || input === 'k') dispatch({ type: 'NAVIGATE_UP' });\n else if (key.downArrow || input === 'j') dispatch({ type: 'NAVIGATE_DOWN' });\n else if (key.return) dispatch({ type: 'TOGGLE_INSIGHT', index: selectedInsight });\n else if (input === 'd') dispatch({ type: 'DISMISS_INSIGHT', index: selectedInsight });\n });\n\n const alertCount = alerts.length;\n const decCount = decisions.length;\n const patCount = patterns.length;\n\n if (!loaded) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold>Nudges</Text>\n <Text dimColor> Loading...</Text>\n </Box>\n );\n }\n\n if (alertCount === 0 && decCount === 0 && patCount === 0) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold>Nudges</Text>\n <Text dimColor> No nudges yet. Trie will alert you here when it spots issues.</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text>\n <Text bold>Nudges</Text>\n <Text dimColor> {alertCount} alerts · {decCount} decisions · {patCount} patterns</Text>\n </Text>\n\n {alertCount > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n {alerts.map((insight, idx) => {\n const isSelected = idx === selectedInsight;\n const isExpanded = idx === expandedInsight;\n const ago = formatTimeAgo(insight.timestamp);\n const msg = insight.message.slice(0, msgLen) + (insight.message.length > msgLen ? '...' : '');\n const riskColor = insight.priority >= 8 ? 'red' : insight.priority >= 5 ? 'yellow' : undefined;\n return (\n <Box key={insight.id} flexDirection=\"column\">\n <Text wrap=\"truncate\">\n {isSelected ? <Text bold color=\"green\">{'> '}</Text> : ' '}\n {riskColor ? <Text color={riskColor}>●</Text> : <Text dimColor>○</Text>}{' '}\n {isSelected ? <Text bold>{msg}</Text> : <Text>{msg}</Text>}\n <Text dimColor> {insight.category} · {ago}</Text>\n </Text>\n {(isExpanded || isSelected) && insight.suggestedAction && (\n <Text> <Text dimColor>{'->'} </Text><Text>{insight.suggestedAction}</Text></Text>\n )}\n </Box>\n );\n })}\n </Box>\n )}\n\n {decCount > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor> Decisions</Text>\n {decisions.slice(0, 10).map(dec => {\n const ago = timeAgo(dec.when);\n const active = dec.status === 'active';\n return (\n <Text key={dec.id}>\n {' '}{active ? <Text color=\"green\">●</Text> : <Text dimColor>○</Text>}{' '}\n {dec.decision.slice(0, msgLen)}{dec.decision.length > msgLen ? '...' : ''}\n <Text dimColor> {ago}</Text>\n </Text>\n );\n })}\n </Box>\n )}\n\n {patCount > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor> Patterns</Text>\n {patterns.slice(0, 8).map((pat, idx) => {\n const conf = Math.round(pat.confidence * 100);\n const confColor = conf > 70 ? 'green' : conf > 40 ? 'yellow' : undefined;\n return (\n <Text key={idx}>\n {' '}{pat.isAntiPattern ? <Text color=\"red\">●</Text> : <Text dimColor>○</Text>}{' '}\n {pat.description.slice(0, msgLen)}{pat.description.length > msgLen ? '...' : ''}\n {' '}{confColor ? <Text color={confColor}>{conf}%</Text> : <Text dimColor>{conf}%</Text>}\n </Text>\n );\n })}\n </Box>\n )}\n\n <Box marginTop={1} gap={2}>\n {isAIAvailable() ? <Text><Text color=\"green\">●</Text> <Text dimColor>AI</Text></Text> : <Text dimColor>○ AI off</Text>}\n {agentInsights.filter(i => i.type === 'celebration').length > 0 && (\n <Text><Text color=\"green\">●</Text> <Text dimColor>{agentInsights.filter(i => i.type === 'celebration').length} wins</Text></Text>\n )}\n </Box>\n </Box>\n );\n}\n","import pc from 'picocolors';\n\nexport const colors = {\n border: (s: string) => pc.dim(s),\n header: (s: string) => pc.bold(pc.white(s)),\n brand: (s: string) => pc.bold(pc.green(s)),\n dim: (s: string) => pc.dim(s),\n\n critical: (s: string) => pc.bold(pc.red(s)),\n serious: (s: string) => pc.yellow(s),\n moderate: (s: string) => pc.blue(s),\n low: (s: string) => pc.dim(s),\n\n success: (s: string) => pc.green(s),\n running: (s: string) => pc.yellow(s),\n waiting: (s: string) => pc.dim(s),\n alert: (s: string) => pc.bold(pc.red(s)),\n\n selected: (s: string) => pc.bold(pc.green(s)),\n highlight: (s: string) => pc.bold(pc.white(s)),\n\n yellow: (s: string) => pc.yellow(s),\n} as const;\n\nexport const box = {\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n leftT: '├',\n rightT: '┤',\n topT: '┬',\n bottomT: '┴',\n cross: '┼',\n} as const;\n\nexport function formatTimeAgo(timestamp: number): string {\n const seconds = Math.floor((Date.now() - timestamp) / 1000);\n if (seconds < 10) return 'just now';\n if (seconds < 60) return `${seconds}s ago`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n return `${hours}h ago`;\n}\n\nexport function severityColor(severity: string): (s: string) => string {\n switch (severity) {\n case 'critical': return colors.critical;\n case 'serious': return colors.serious;\n case 'moderate': return colors.moderate;\n case 'low': return colors.low;\n default: return colors.dim;\n }\n}\n\nexport function severityIcon(severity: string): string {\n switch (severity) {\n case 'critical': return '●';\n case 'serious': return '●';\n case 'moderate': return '○';\n case 'low': return '○';\n default: return '○';\n }\n}\n\nexport function insightIcon(type: string): { icon: string; color: (s: string) => string } {\n switch (type) {\n case 'warning': return { icon: '●', color: colors.critical };\n case 'observation': return { icon: '○', color: colors.serious };\n case 'suggestion': return { icon: '○', color: colors.highlight };\n case 'celebration': return { icon: '●', color: colors.success };\n case 'question': return { icon: '○', color: colors.moderate };\n default: return { icon: '○', color: colors.dim };\n }\n}\n\nexport function progressBar(current: number, total: number, width: number = 10): string {\n if (total <= 0) return colors.dim('░'.repeat(width));\n const progress = Math.min(1, current / total);\n const filled = Math.round(width * progress);\n const empty = width - filled;\n return colors.success('█'.repeat(filled)) + colors.dim('░'.repeat(empty));\n}\n\n// eslint-disable-next-line no-control-regex\nexport function stripEmojis(s: string): string {\n return s.replace(/[\\u{1F300}-\\u{1F9FF}\\u{2600}-\\u{26FF}\\u{2700}-\\u{27BF}\\u{FE00}-\\u{FE0F}\\u{200D}\\u{20E3}\\u{FE0F}\\u{E0020}-\\u{E007F}]/gu, '').trim();\n}\n","import React, { useCallback } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useDashboard } from '../state.js';\nimport { progressBar } from '../theme.js';\nimport { getWorkingDirectory } from '../../../utils/workspace.js';\nimport { getGuardianState, type Goal } from '../../../guardian/guardian-state.js';\n\nfunction calculateGoalProgress(goal: { startValue?: number; currentValue: number; target: number }): number {\n if (goal.target <= 0) return 0;\n const startValue = goal.startValue ?? goal.currentValue;\n if (startValue > goal.target) {\n const totalReduction = startValue - goal.target;\n const actualReduction = startValue - goal.currentValue;\n return Math.round((actualReduction / totalReduction) * 100);\n }\n return Math.round((goal.currentValue / goal.target) * 100);\n}\n\nexport function GoalsView(): React.ReactElement {\n const { state, dispatch } = useDashboard();\n const { goalsPanel } = state;\n const activeGoals = goalsPanel.goals.filter(g => g.status === 'active');\n const achievedGoals = goalsPanel.goals.filter(g => g.status === 'achieved');\n const otherGoals = goalsPanel.goals.filter(g => g.status !== 'active' && g.status !== 'achieved');\n\n const refreshGoals = useCallback(async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getGuardianState(workDir);\n await agentState.load();\n const goals = agentState.getAllGoals();\n dispatch({\n type: 'SET_GOALS',\n goals: goals.map(g => {\n const base = { id: g.id, description: g.description, type: g.type, target: g.target, currentValue: g.currentValue, status: g.status, autoGenerated: g.autoGenerated, updatedAt: g.updatedAt };\n return g.category ? { ...base, category: g.category } : base;\n }),\n });\n } catch { /* ignore */ }\n }, [dispatch]);\n\n const addGoal = useCallback(async (description: string) => {\n if (!description.trim()) return;\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getGuardianState(workDir);\n await agentState.load();\n const goal: Goal = {\n id: `goal-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n description: description.trim(),\n type: 'reduction',\n metric: 'semantic',\n target: 0,\n currentValue: 0,\n startValue: 0,\n status: 'active',\n autoGenerated: false,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n deadline: new Date(Date.now() + 14 * 86400000).toISOString(),\n };\n await agentState.addGoal(goal);\n dispatch({ type: 'ADD_ACTIVITY', message: `Goal added: ${description.slice(0, 40)}` });\n await refreshGoals();\n } catch { /* ignore */ }\n }, [dispatch, refreshGoals]);\n\n const completeGoal = useCallback(async (goalId: string) => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getGuardianState(workDir);\n await agentState.load();\n const goals = agentState.getAllGoals();\n const goal = goals.find(g => g.id === goalId);\n if (goal) {\n await agentState.updateGoal(goalId, { status: 'achieved', currentValue: goal.target, achievedAt: new Date().toISOString() });\n dispatch({ type: 'ADD_ACTIVITY', message: `Goal achieved: ${goal.description.slice(0, 30)}` });\n await refreshGoals();\n }\n } catch { /* ignore */ }\n }, [dispatch, refreshGoals]);\n\n const deleteGoal = useCallback(async (goalId: string) => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getGuardianState(workDir);\n await agentState.load();\n await agentState.updateGoal(goalId, { status: 'rejected' });\n dispatch({ type: 'ADD_ACTIVITY', message: 'Goal removed' });\n await refreshGoals();\n } catch { /* ignore */ }\n }, [dispatch, refreshGoals]);\n\n const reactivateGoal = useCallback(async (goalId: string) => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getGuardianState(workDir);\n await agentState.load();\n await agentState.updateGoal(goalId, { status: 'active', achievedAt: undefined });\n dispatch({ type: 'ADD_ACTIVITY', message: 'Goal reactivated' });\n await refreshGoals();\n } catch { /* ignore */ }\n }, [dispatch, refreshGoals]);\n\n const clearAchievedGoals = useCallback(async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getGuardianState(workDir);\n await agentState.load();\n const achieved = goalsPanel.goals.filter(g => g.status === 'achieved');\n \n if (achieved.length === 0) {\n dispatch({ type: 'SHOW_NOTIFICATION', message: 'No achieved goals to clear', severity: 'info', autoHideMs: 3000 });\n dispatch({ type: 'ADD_ACTIVITY', message: 'No achieved goals to clear' });\n return;\n }\n\n for (const goal of achieved) {\n await agentState.deleteGoal(goal.id);\n }\n \n dispatch({ type: 'SHOW_NOTIFICATION', message: `Cleared ${achieved.length} achieved goal${achieved.length > 1 ? 's' : ''}`, severity: 'info', autoHideMs: 3000 });\n dispatch({ type: 'ADD_ACTIVITY', message: `Cleared ${achieved.length} achieved goal${achieved.length > 1 ? 's' : ''}` });\n await refreshGoals();\n } catch (error) {\n dispatch({ type: 'SHOW_NOTIFICATION', message: `Failed to clear goals: ${error instanceof Error ? error.message : 'unknown'}`, severity: 'warning', autoHideMs: 5000 });\n dispatch({ type: 'ADD_ACTIVITY', message: `Clear failed: ${error instanceof Error ? error.message : 'unknown'}` });\n }\n }, [dispatch, refreshGoals, goalsPanel.goals]);\n\n const checkGoalNow = useCallback(async (goalId: string) => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const goal = goalsPanel.goals.find(g => g.id === goalId);\n if (!goal) return;\n \n dispatch({ type: 'ADD_ACTIVITY', message: `Checking goal: ${goal.description.slice(0, 30)}...` });\n dispatch({ type: 'SHOW_NOTIFICATION', message: `Scanning files for violations...`, severity: 'info', autoHideMs: 3000 });\n \n // Import the goal validator\n const { checkFilesForGoalViolations } = await import('../../../guardian/goal-validator.js');\n \n // Check files against this goal\n const violations = await checkFilesForGoalViolations([goal], workDir);\n \n if (violations.length === 0) {\n dispatch({ type: 'SHOW_NOTIFICATION', message: `✓ No violations found for: ${goal.description.slice(0, 40)}`, severity: 'info', autoHideMs: 5000 });\n dispatch({ type: 'ADD_ACTIVITY', message: `No violations found` });\n } else {\n dispatch({ type: 'SHOW_NOTIFICATION', message: `Found ${violations.length} violation(s) - check Nudges tab`, severity: 'warning', autoHideMs: 5000 });\n dispatch({ type: 'ADD_ACTIVITY', message: `Found ${violations.length} violation(s)` });\n \n // Add violations as insights/nudges\n for (const violation of violations) {\n dispatch({ type: 'ADD_INSIGHTS', insights: [{\n id: `scan-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,\n message: violation.message,\n severity: violation.severity,\n timestamp: Date.now(),\n category: 'goal',\n type: 'warning',\n dismissed: false,\n priority: violation.severity === 'critical' ? 9 : 6,\n file: violation.file,\n relatedIssues: [],\n }] });\n }\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : 'unknown error';\n dispatch({ type: 'SHOW_NOTIFICATION', message: `Check failed: ${errorMsg}`, severity: 'warning', autoHideMs: 5000 });\n dispatch({ type: 'ADD_ACTIVITY', message: `Check failed: ${errorMsg}` });\n }\n }, [dispatch, goalsPanel.goals]);\n\n useInput((_input, key) => {\n if (goalsPanel.inputMode === 'add') {\n if (key.escape) {\n dispatch({ type: 'SET_GOALS_INPUT_MODE', mode: 'browse' });\n } else if (key.return) {\n void addGoal(goalsPanel.inputBuffer);\n dispatch({ type: 'SET_GOALS_INPUT_MODE', mode: 'browse' });\n } else if (key.backspace || key.delete) {\n dispatch({ type: 'SET_GOALS_INPUT_BUFFER', buffer: goalsPanel.inputBuffer.slice(0, -1) });\n } else if (_input && _input.length === 1 && !key.ctrl && !key.meta) {\n dispatch({ type: 'SET_GOALS_INPUT_BUFFER', buffer: goalsPanel.inputBuffer + _input });\n }\n return;\n }\n\n // View-specific shortcuts (no conflicts with global!)\n if (_input === 'a') dispatch({ type: 'SET_GOALS_INPUT_MODE', mode: 'add' });\n else if (key.upArrow || _input === 'k') dispatch({ type: 'SELECT_GOAL', index: Math.max(0, goalsPanel.selectedIndex - 1) });\n else if (key.downArrow || _input === 'j') dispatch({ type: 'SELECT_GOAL', index: Math.min(activeGoals.length - 1, goalsPanel.selectedIndex + 1) });\n else if (_input === 'r') {\n // 'r' for run check - manually check selected goal\n const selected = activeGoals[goalsPanel.selectedIndex];\n if (selected) void checkGoalNow(selected.id);\n } else if (key.return) {\n const selected = activeGoals[goalsPanel.selectedIndex];\n if (selected) void completeGoal(selected.id);\n } else if (_input === 'd') {\n const selected = activeGoals[goalsPanel.selectedIndex];\n if (selected) void deleteGoal(selected.id);\n } else if (_input === 'x') {\n // 'x' for clear - clear all achieved goals\n void clearAchievedGoals();\n } else if (_input === 'u') {\n const recent = goalsPanel.goals.filter(g => g.status === 'achieved').sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());\n if (recent[0]) void reactivateGoal(recent[0].id);\n }\n // Note: Global shortcuts (s, c, t, g, l, y) are NOT processed in this view\n // Use Tab to switch views, or press the view shortcut from Overview\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold>Goals</Text>\n\n {goalsPanel.inputMode === 'add' ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box borderStyle=\"single\" borderColor=\"green\" paddingX={1}>\n <Text>{goalsPanel.inputBuffer}<Text bold color=\"green\">|</Text></Text>\n </Box>\n <Text dimColor> enter save · esc cancel</Text>\n </Box>\n ) : (\n <>\n {goalsPanel.goals.length === 0 ? (\n <Text dimColor> No goals yet. Press a to add one.</Text>\n ) : (\n <Box flexDirection=\"column\">\n {activeGoals.map((goal, idx) => {\n const isSelected = goalsPanel.selectedIndex === idx;\n const progress = calculateGoalProgress(goal);\n const bar = progressBar(progress, 100, 8);\n const source = goal.autoGenerated ? 'auto' : '';\n return (\n <Text key={goal.id}>\n {isSelected ? <Text bold color=\"green\">{'> '}</Text> : ' '}\n <Text color=\"green\">○</Text> {goal.description.slice(0, 45)}\n <Text dimColor> {bar} {progress}%{source ? ` ${source}` : ''}</Text>\n </Text>\n );\n })}\n\n {achievedGoals.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor> Achieved</Text>\n {achievedGoals.slice(0, 5).map(g => (\n <Text key={g.id}> <Text color=\"green\">●</Text> {g.description.slice(0, 50)}</Text>\n ))}\n {achievedGoals.length > 5 && <Text dimColor> +{achievedGoals.length - 5} more</Text>}\n </Box>\n )}\n\n {otherGoals.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor> Other</Text>\n {otherGoals.slice(0, 2).map(g => (\n <Text key={g.id}> <Text dimColor>○</Text> {g.description.slice(0, 50)} <Text dimColor>{g.status}</Text></Text>\n ))}\n </Box>\n )}\n </Box>\n )}\n </>\n )}\n </Box>\n );\n}\n","import React, { useCallback } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useDashboard } from '../state.js';\nimport { getWorkingDirectory } from '../../../utils/workspace.js';\nimport { getGuardianState, type Hypothesis } from '../../../guardian/guardian-state.js';\n\nexport function HypothesesView(): React.ReactElement {\n const { state, dispatch } = useDashboard();\n const { hypothesesPanel } = state;\n const testing = hypothesesPanel.hypotheses.filter(h => h.status === 'testing');\n const validated = hypothesesPanel.hypotheses.filter(h => h.status === 'validated');\n const invalidated = hypothesesPanel.hypotheses.filter(h => h.status === 'invalidated');\n\n const refreshHypotheses = useCallback(async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getGuardianState(workDir);\n await agentState.load();\n const hypotheses = agentState.getAllHypotheses();\n dispatch({\n type: 'SET_HYPOTHESES',\n hypotheses: hypotheses.map(h => {\n const base = { id: h.id, statement: h.statement, confidence: h.confidence, status: h.status, evidenceCount: h.evidence.length, updatedAt: h.updatedAt };\n return h.category ? { ...base, category: h.category } : base;\n }),\n });\n } catch { /* ignore */ }\n }, [dispatch]);\n\n const addHypothesis = useCallback(async (statement: string) => {\n if (!statement.trim()) return;\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getGuardianState(workDir);\n await agentState.load();\n const hypothesis: Hypothesis = {\n id: `hypo-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n statement: statement.trim(),\n confidence: 0.5,\n status: 'testing',\n evidence: [],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n testCriteria: 'Collect evidence from scans',\n };\n await agentState.addHypothesis(hypothesis);\n dispatch({ type: 'ADD_ACTIVITY', message: `Hypothesis added: ${statement.slice(0, 40)}` });\n await refreshHypotheses();\n } catch { /* ignore */ }\n }, [dispatch, refreshHypotheses]);\n\n const updateHypothesis = useCallback(async (hypoId: string, action: 'validate' | 'invalidate' | 'delete') => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getGuardianState(workDir);\n await agentState.load();\n if (action === 'validate') await agentState.updateHypothesis(hypoId, { status: 'validated', confidence: 0.9 });\n else if (action === 'invalidate') await agentState.updateHypothesis(hypoId, { status: 'invalidated', confidence: 0.1 });\n else await agentState.updateHypothesis(hypoId, { status: 'retired' });\n dispatch({ type: 'ADD_ACTIVITY', message: `Hypothesis ${action === 'validate' ? 'validated' : action === 'invalidate' ? 'invalidated' : 'removed'}` });\n await refreshHypotheses();\n } catch { /* ignore */ }\n }, [dispatch, refreshHypotheses]);\n\n const reactivateHypothesis = useCallback(async (hypoId: string) => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getGuardianState(workDir);\n await agentState.load();\n await agentState.updateHypothesis(hypoId, { status: 'testing', confidence: 0.5, validatedAt: undefined });\n dispatch({ type: 'ADD_ACTIVITY', message: 'Hypothesis reactivated' });\n await refreshHypotheses();\n } catch { /* ignore */ }\n }, [dispatch, refreshHypotheses]);\n\n const checkHypothesisNow = useCallback(async (hypoId: string) => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const hypo = hypothesesPanel.hypotheses.find(h => h.id === hypoId);\n if (!hypo) return;\n \n dispatch({ type: 'ADD_ACTIVITY', message: `Testing hypothesis: ${hypo.statement.slice(0, 30)}...` });\n dispatch({ type: 'SHOW_NOTIFICATION', message: `Gathering evidence for hypothesis...`, severity: 'info', autoHideMs: 3000 });\n \n // Import hypothesis engine\n const { gatherEvidenceForHypothesis } = await import('../../../guardian/hypothesis.js');\n \n // Gather evidence\n const evidence = await gatherEvidenceForHypothesis(hypoId, workDir);\n \n if (evidence.length === 0) {\n dispatch({ type: 'SHOW_NOTIFICATION', message: `No evidence found for: ${hypo.statement.slice(0, 40)}`, severity: 'info', autoHideMs: 5000 });\n dispatch({ type: 'ADD_ACTIVITY', message: `No evidence found` });\n } else {\n const supporting = evidence.filter(e => e.supports).length;\n const against = evidence.length - supporting;\n \n dispatch({ type: 'SHOW_NOTIFICATION', message: `Found ${evidence.length} evidence (${supporting} for, ${against} against)`, severity: 'info', autoHideMs: 5000 });\n dispatch({ type: 'ADD_ACTIVITY', message: `Found ${evidence.length} evidence items` });\n \n // Refresh to show updated confidence\n await refreshHypotheses();\n }\n } catch (error) {\n dispatch({ type: 'ADD_ACTIVITY', message: `Check failed: ${error instanceof Error ? error.message : 'unknown'}` });\n }\n }, [dispatch, hypothesesPanel.hypotheses, refreshHypotheses]);\n\n useInput((_input, key) => {\n if (hypothesesPanel.inputMode === 'add') {\n if (key.escape) {\n dispatch({ type: 'SET_HYPOTHESES_INPUT_MODE', mode: 'browse' });\n } else if (key.return) {\n void addHypothesis(hypothesesPanel.inputBuffer);\n dispatch({ type: 'SET_HYPOTHESES_INPUT_MODE', mode: 'browse' });\n } else if (key.backspace || key.delete) {\n dispatch({ type: 'SET_HYPOTHESES_INPUT_BUFFER', buffer: hypothesesPanel.inputBuffer.slice(0, -1) });\n } else if (_input && _input.length === 1 && !key.ctrl && !key.meta) {\n dispatch({ type: 'SET_HYPOTHESES_INPUT_BUFFER', buffer: hypothesesPanel.inputBuffer + _input });\n }\n return;\n }\n\n if (_input === 'a') dispatch({ type: 'SET_HYPOTHESES_INPUT_MODE', mode: 'add' });\n else if (key.upArrow || _input === 'k') dispatch({ type: 'SELECT_HYPOTHESIS', index: Math.max(0, hypothesesPanel.selectedIndex - 1) });\n else if (key.downArrow || _input === 'j') dispatch({ type: 'SELECT_HYPOTHESIS', index: Math.min(testing.length - 1, hypothesesPanel.selectedIndex + 1) });\n else if (_input === 'r') {\n // 'r' for run check - manually test selected hypothesis\n const selected = testing[hypothesesPanel.selectedIndex];\n if (selected) void checkHypothesisNow(selected.id);\n } else if (_input === 'v') {\n const selected = testing[hypothesesPanel.selectedIndex];\n if (selected) void updateHypothesis(selected.id, 'validate');\n } else if (_input === 'x') {\n const selected = testing[hypothesesPanel.selectedIndex];\n if (selected) void updateHypothesis(selected.id, 'invalidate');\n } else if (_input === 'd') {\n const selected = testing[hypothesesPanel.selectedIndex];\n if (selected) void updateHypothesis(selected.id, 'delete');\n } else if (_input === 'r') {\n const completed = hypothesesPanel.hypotheses.filter(h => h.status === 'validated' || h.status === 'invalidated');\n if (completed[0]) void updateHypothesis(completed[0].id, 'delete');\n } else if (_input === 'u') {\n const recent = hypothesesPanel.hypotheses.filter(h => h.status === 'validated' || h.status === 'invalidated')\n .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());\n if (recent[0]) void reactivateHypothesis(recent[0].id);\n }\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold>Hypotheses</Text>\n\n {hypothesesPanel.inputMode === 'add' ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box borderStyle=\"single\" borderColor=\"green\" paddingX={1}>\n <Text>{hypothesesPanel.inputBuffer}<Text bold color=\"green\">|</Text></Text>\n </Box>\n <Text dimColor> enter save · esc cancel</Text>\n </Box>\n ) : (\n <>\n {hypothesesPanel.hypotheses.length === 0 ? (\n <Text dimColor> No hypotheses yet. Press a to add one.</Text>\n ) : (\n <Box flexDirection=\"column\">\n {testing.map((hypo, idx) => {\n const isSelected = hypothesesPanel.selectedIndex === idx;\n const conf = Math.round(hypo.confidence * 100);\n return (\n <Text key={hypo.id}>\n {isSelected ? <Text bold color=\"green\">{'> '}</Text> : ' '}\n <Text color=\"yellow\">○</Text> {hypo.statement.slice(0, 50)}\n <Text dimColor> {conf}% · {hypo.evidenceCount} evidence</Text>\n </Text>\n );\n })}\n\n {validated.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor> Validated</Text>\n {validated.slice(0, 3).map(h => (\n <Text key={h.id}> <Text color=\"green\">●</Text> {h.statement.slice(0, 50)}</Text>\n ))}\n {validated.length > 3 && <Text dimColor> +{validated.length - 3} more</Text>}\n </Box>\n )}\n\n {invalidated.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor> Invalidated</Text>\n {invalidated.slice(0, 2).map(h => (\n <Text key={h.id}> <Text color=\"red\">●</Text> <Text dimColor>{h.statement.slice(0, 50)}</Text></Text>\n ))}\n {invalidated.length > 2 && <Text dimColor> +{invalidated.length - 2} more</Text>}\n </Box>\n )}\n </Box>\n )}\n </>\n )}\n </Box>\n );\n}\n","import React, { useEffect, useCallback } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useDashboard } from '../state.js';\nimport { getWorkingDirectory } from '../../../utils/workspace.js';\nimport { ContextGraph } from '../../../context/graph.js';\nimport { findCrossProjectPatterns } from '../../../memory/global-memory.js';\nimport type { FileNodeData, PatternNodeData, IncidentNodeData, DecisionNodeData, Node } from '../../../context/types.js';\n\nfunction timeAgo(iso: string): string {\n const ms = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(ms / 60000);\n if (mins < 60) return `${mins}m`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h`;\n return `${Math.floor(hrs / 24)}d`;\n}\n\nexport function MemoryTreeView(): React.ReactElement {\n const { state, dispatch } = useDashboard();\n const { memoryTree } = state;\n const { snapshot, globalPatterns, expandedNodes, selectedNode, loaded } = memoryTree;\n\n const loadData = useCallback(async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const graph = new ContextGraph(workDir);\n const [snap, patterns] = await Promise.all([\n graph.getSnapshot(),\n findCrossProjectPatterns(2),\n ]);\n dispatch({ type: 'SET_MEMORY_TREE', snapshot: snap, patterns });\n } catch {\n dispatch({ type: 'ADD_ACTIVITY', message: 'Context graph load error' });\n }\n }, [dispatch]);\n\n useEffect(() => {\n if (!loaded) { void loadData(); }\n }, [loaded, loadData]);\n\n useInput((_input, key) => {\n if (key.upArrow || _input === 'k') dispatch({ type: 'NAVIGATE_UP' });\n else if (key.downArrow || _input === 'j') dispatch({ type: 'NAVIGATE_DOWN' });\n else if (key.return) dispatch({ type: 'TOGGLE_MEMORY_NODE', nodeId: selectedNode });\n });\n\n const sel = (nodeId: string) => selectedNode === nodeId;\n\n if (!loaded) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold>Ledger</Text>\n <Text dimColor> Loading...</Text>\n </Box>\n );\n }\n\n if (!snapshot || (snapshot.nodes.length === 0 && globalPatterns.length === 0)) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold>Ledger</Text>\n <Text dimColor> No entries yet. Use trie tell or trie watch to build memory.</Text>\n </Box>\n );\n }\n\n const decisionNodes = (snapshot.nodes.filter(n => n.type === 'decision') ?? []) as Array<Node & { data: DecisionNodeData }>;\n const incidentNodes = (snapshot.nodes.filter(n => n.type === 'incident') ?? []) as Array<Node & { data: IncidentNodeData }>;\n const patternNodes = (snapshot.nodes.filter(n => n.type === 'pattern') ?? []) as Array<Node & { data: PatternNodeData }>;\n const fileNodes = (snapshot.nodes.filter(n => n.type === 'file') ?? []) as Array<Node & { data: FileNodeData }>;\n\n const hotspots = fileNodes\n .filter(n => n.data.riskLevel === 'critical' || n.data.riskLevel === 'high')\n .sort((a, b) => {\n const order: Record<string, number> = { critical: 0, high: 1 };\n return (order[a.data.riskLevel] ?? 2) - (order[b.data.riskLevel] ?? 2);\n });\n\n const totalEntries = decisionNodes.length + incidentNodes.length + patternNodes.length + globalPatterns.length + hotspots.length;\n\n function renderHeader(id: string, label: string, count: number, emptyHint?: string) {\n const expanded = expandedNodes.has(id);\n const isEmpty = count === 0;\n return (\n <Text>\n {sel(id) ? <Text bold color=\"green\">{'> '}</Text> : ' '}\n {expanded && !isEmpty ? <Text color=\"green\">●</Text> : <Text dimColor>○</Text>}{' '}\n {sel(id) ? <Text bold color=\"green\">{label}</Text> : <Text bold>{label}</Text>}\n {count > 0 ? <Text dimColor> ({count})</Text> : isEmpty && emptyHint ? <Text dimColor> {emptyHint}</Text> : null}\n </Text>\n );\n }\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text><Text bold>Ledger</Text><Text dimColor> {totalEntries} entries</Text></Text>\n\n <Box flexDirection=\"column\" marginTop={1}>\n {renderHeader('decisions', 'Decisions', decisionNodes.length, '-- use trie tell or chat')}\n {expandedNodes.has('decisions') && decisionNodes.slice(0, 10).map(n => {\n const nodeId = `decision-${n.id}`;\n const dec = n.data.decision.length > 55 ? n.data.decision.slice(0, 52) + '...' : n.data.decision;\n const outcomeColor = n.data.outcome === 'good' ? 'green' : n.data.outcome === 'bad' ? 'red' : undefined;\n return (\n <Text key={n.id}>\n {sel(nodeId) ? <Text bold color=\"green\">{'> '}</Text> : ' '}\n {' '}{outcomeColor ? <Text color={outcomeColor}>●</Text> : <Text dimColor>○</Text>}{' '}\n {sel(nodeId) ? <Text bold color=\"green\">{dec}</Text> : <Text>{dec}</Text>}\n <Text dimColor> {timeAgo(n.data.timestamp)}</Text>\n {outcomeColor ? <Text color={outcomeColor}> {n.data.outcome}</Text> : null}\n </Text>\n );\n })}\n </Box>\n\n {renderHeader('incidents', 'Incidents', incidentNodes.length, '-- use trie tell')}\n {expandedNodes.has('incidents') && incidentNodes.slice(0, 10).map(n => {\n const nodeId = `incident-${n.id}`;\n const sevColor = n.data.severity === 'critical' ? 'red' : n.data.severity === 'major' ? 'yellow' : undefined;\n const desc = n.data.description.length > 55 ? n.data.description.slice(0, 52) + '...' : n.data.description;\n return (\n <Text key={n.id}>\n {sel(nodeId) ? <Text bold color=\"green\">{'> '}</Text> : ' '}\n {' '}{sevColor ? <Text color={sevColor}>●</Text> : <Text dimColor>○</Text>}{' '}\n {sel(nodeId) ? <Text bold color=\"green\">{desc}</Text> : <Text>{desc}</Text>}\n <Text dimColor> {timeAgo(n.data.timestamp)}</Text>\n {' '}{n.data.resolved ? <Text color=\"green\">resolved</Text> : <Text color=\"yellow\">open</Text>}\n </Text>\n );\n })}\n\n {renderHeader('patterns', 'Learned Patterns', patternNodes.length, '-- Trie learns as you work')}\n {expandedNodes.has('patterns') && patternNodes.slice(0, 10).map(n => {\n const nodeId = `pattern-${n.id}`;\n const conf = Math.round(n.data.confidence * 100);\n const confColor = conf > 70 ? 'green' : conf > 40 ? 'yellow' : undefined;\n const desc = n.data.description.length > 50 ? n.data.description.slice(0, 47) + '...' : n.data.description;\n return (\n <Text key={n.id}>\n {sel(nodeId) ? <Text bold color=\"green\">{'> '}</Text> : ' '}\n {' '}{n.data.isAntiPattern ? <Text color=\"red\">!</Text> : <Text dimColor>○</Text>}{' '}\n {sel(nodeId) ? <Text bold color=\"green\">{desc}</Text> : <Text>{desc}</Text>}\n {' '}{confColor ? <Text color={confColor}>{conf}%</Text> : <Text dimColor>{conf}%</Text>}\n </Text>\n );\n })}\n\n {renderHeader('cross-project', 'Cross-Project', globalPatterns.length)}\n {expandedNodes.has('cross-project') && globalPatterns.slice(0, 8).map(pattern => {\n const patternId = `global-${pattern.id}`;\n const desc = pattern.pattern.length > 45 ? pattern.pattern.slice(0, 42) + '...' : pattern.pattern;\n return (\n <Text key={pattern.id}>\n {sel(patternId) ? <Text bold color=\"green\">{'> '}</Text> : ' '}\n {' '}<Text dimColor>○</Text>{' '}\n {sel(patternId) ? <Text bold color=\"green\">{desc}</Text> : <Text>{desc}</Text>}\n <Text dimColor> {pattern.projects.length} projects · {pattern.occurrences} hits</Text>\n </Text>\n );\n })}\n\n {hotspots.length > 0 && (\n <>\n {renderHeader('hotspots', 'Risk Hotspots', hotspots.length)}\n {expandedNodes.has('hotspots') && hotspots.slice(0, 10).map(n => {\n const nodeId = `file-${n.id}`;\n const path = n.data.path.split('/').slice(-2).join('/');\n const isCritical = n.data.riskLevel === 'critical';\n return (\n <Text key={n.id}>\n {sel(nodeId) ? <Text bold color=\"green\">{'> '}</Text> : ' '}\n {' '}<Text color={isCritical ? 'red' : 'yellow'}>●</Text>{' '}\n {sel(nodeId) ? <Text bold color=\"green\">{path}</Text> : <Text>{path}</Text>}\n {' '}<Text color={isCritical ? 'red' : 'yellow'}>{n.data.riskLevel}</Text>\n <Text dimColor> {n.data.changeCount} changes</Text>\n </Text>\n );\n })}\n </>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useDashboard } from '../state.js';\n\nexport function RawLogView(): React.ReactElement {\n const { state, dispatch } = useDashboard();\n const { rawLog, rawLogPage } = state;\n\n const pageSize = Math.max(10, (process.stdout.rows || 40) - 10);\n const totalPages = Math.max(1, Math.ceil(rawLog.length / pageSize));\n\n useInput((input, _key) => {\n if (input === 'n') dispatch({ type: 'SET_RAW_LOG_PAGE', page: Math.min(totalPages - 1, rawLogPage + 1) });\n else if (input === 'p') dispatch({ type: 'SET_RAW_LOG_PAGE', page: Math.max(0, rawLogPage - 1) });\n });\n\n const startIdx = rawLogPage * pageSize;\n const logs = rawLog.slice(startIdx, startIdx + pageSize);\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text>\n <Text bold>Log</Text>\n <Text dimColor> {rawLog.length} entries · page {rawLogPage + 1}/{totalPages}</Text>\n </Text>\n\n {rawLog.length === 0 ? (\n <Text dimColor> No log entries yet</Text>\n ) : logs.map((entry, i) => {\n const dot = entry.level === 'error' ? <Text color=\"red\">●</Text>\n : entry.level === 'warn' ? <Text color=\"yellow\">●</Text>\n : entry.level === 'info' ? <Text color=\"green\">●</Text>\n : <Text dimColor>○</Text>;\n return (\n <Text key={i}>\n {' '}<Text dimColor>{entry.time}</Text> {dot} {entry.message.slice(0, 70)}\n </Text>\n );\n })}\n </Box>\n );\n}\n","import React, { useCallback, useRef } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type Anthropic from '@anthropic-ai/sdk';\nimport { useDashboard } from '../state.js';\nimport { isAIAvailable, runAIWithTools } from '../../../ai/client.js';\nimport { getWorkingDirectory } from '../../../utils/workspace.js';\nimport { TieredStorage } from '../../../storage/tiered-storage.js';\nimport { ContextGraph } from '../../../context/graph.js';\nimport { CHAT_TOOLS, executeTool } from '../chat-tools.js';\nimport type { ChatMessage } from '../types.js';\nimport { getGuardianState } from '../../../guardian/guardian-state.js';\n\nasync function buildContext(workDir: string, dashboardState?: any): Promise<string> {\n const parts: string[] = [];\n\n // Add recent nudges/goal violations FIRST (most relevant for fixes)\n if (dashboardState?.agentInsights) {\n const recentNudges = dashboardState.agentInsights\n .filter((i: any) => i.type === 'warning' && i.category === 'quality' && !i.dismissed)\n .slice(0, 5);\n \n if (recentNudges.length > 0) {\n parts.push('Recent goal violations (nudges):\\n' + recentNudges.map((n: any) => {\n const fileMatch = n.message.match(/in ([^:]+):/);\n const goalMatch = n.message.match(/Goal \"([^\"]+)\"/);\n const violationMatch = n.message.match(/: (.+?) \\[/);\n return `- File: ${fileMatch?.[1] || 'unknown'}\\n Goal: ${goalMatch?.[1] || 'unknown'}\\n Violation: ${violationMatch?.[1] || n.message}\\n Priority: ${n.priority}`;\n }).join('\\n'));\n }\n }\n\n // Add active goals and recent violations\n try {\n const guardianState = getGuardianState(workDir);\n await guardianState.load();\n const activeGoals = guardianState.getAllGoals().filter(g => g.status === 'active');\n if (activeGoals.length > 0) {\n parts.push('Active goals:\\n' + activeGoals.map(g => {\n const metadata = g.metadata || {};\n const caughtCount = metadata.caughtCount || 0;\n const lastCaught = metadata.lastCaught ? ` (last violation: ${metadata.lastCaughtFile || 'unknown'})` : '';\n return `- \"${g.description}\" [${g.category || 'general'}]${caughtCount > 0 ? ` - ${caughtCount} violation(s)${lastCaught}` : ''}`;\n }).join('\\n'));\n }\n } catch { /* skip */ }\n\n try {\n const storage = new TieredStorage(workDir);\n try {\n const decisions = await storage.queryDecisions({ limit: 10 });\n if (decisions.length > 0) {\n parts.push('Recent decisions:\\n' + decisions.map(d =>\n `- ${d.decision} (${d.when}${d.hash ? `, hash: ${d.hash.slice(0, 8)}` : ''})`\n ).join('\\n'));\n }\n } catch { /* skip */ }\n\n try {\n const blockers = await storage.queryBlockers({ limit: 5 });\n if (blockers.length > 0) {\n parts.push('Active blockers:\\n' + blockers.map(b =>\n `- ${b.blocker} [${b.impact}]`\n ).join('\\n'));\n }\n } catch { /* skip */ }\n } catch { /* storage unavailable */ }\n\n try {\n const graph = new ContextGraph(workDir);\n const snap = await graph.getSnapshot();\n const fileNodes = snap.nodes.filter(n => n.type === 'file');\n const changeNodes = snap.nodes.filter(n => n.type === 'change');\n const patternNodes = snap.nodes.filter(n => n.type === 'pattern');\n\n parts.push(`Context graph: ${snap.nodes.length} nodes, ${snap.edges.length} edges (${fileNodes.length} files, ${changeNodes.length} changes, ${patternNodes.length} patterns)`);\n\n if (fileNodes.length > 0) {\n type FileData = { path: string; riskLevel: string; changeCount: number; incidentCount: number };\n const sorted = [...fileNodes].sort((a, b) => {\n const riskOrder: Record<string, number> = { critical: 0, high: 1, medium: 2, low: 3 };\n const ad = a.data as FileData, bd = b.data as FileData;\n return (riskOrder[ad.riskLevel] ?? 4) - (riskOrder[bd.riskLevel] ?? 4);\n });\n parts.push('Project files (by risk):\\n' + sorted.slice(0, 15).map(n => {\n const d = n.data as FileData;\n return `- ${d.path} (${d.riskLevel}, ${d.changeCount} changes${d.incidentCount > 0 ? `, ${d.incidentCount} incidents` : ''})`;\n }).join('\\n'));\n }\n\n if (changeNodes.length > 0) {\n type ChangeData = { message: string; timestamp: string; files: string[] };\n parts.push('Recent changes:\\n' + changeNodes.slice(0, 5).map(n => {\n const d = n.data as ChangeData;\n return `- ${d.message} (${d.timestamp}, ${d.files.length} files)`;\n }).join('\\n'));\n }\n\n if (patternNodes.length > 0) {\n type PatData = { description: string; confidence: number; isAntiPattern: boolean };\n parts.push('Learned patterns:\\n' + patternNodes.slice(0, 5).map(n => {\n const d = n.data as PatData;\n return `- ${d.description} (${Math.round(d.confidence * 100)}%${d.isAntiPattern ? ', anti-pattern' : ''})`;\n }).join('\\n'));\n }\n } catch { /* graph unavailable */ }\n\n return parts.length > 0 ? parts.join('\\n\\n') : 'No context data available yet.';\n}\n\nfunction chatHistoryToMessages(history: ChatMessage[]): Anthropic.MessageParam[] {\n return history.map(m => ({\n role: m.role,\n content: m.content,\n }));\n}\n\nconst SYSTEM_PROMPT = `You are Trie, a code guardian assistant embedded in a terminal TUI.\n\n**What you CAN do:**\n- Check recent goal violations (nudges) in the provided project context\n- Record incidents, decisions, and feedback about the codebase\n- Query stored decisions, blockers, facts, and questions from the decision ledger\n- Create and manage goals and hypotheses\n- Propose fixes for goal violations (requires user confirmation before spawning Claude Code)\n- Save work checkpoints\n\n**IMPORTANT - File Searching:**\n- You have a trie_search_files tool but it requires ripgrep to be installed\n- For searching code patterns (like emojis, TODO comments, etc.), use the provided project context first\n- If the user asks about emojis or goal violations, check the \"Recent goal violations (nudges)\" section\n- DO NOT use regex Unicode ranges in search patterns - they don't work reliably\n- Instead, suggest the user press 'r' in Goals view to run an AI-powered scan\n\n**When user asks about code content:**\n1. First check the \"Recent goal violations (nudges)\" section in project context\n2. If found, report what you see\n3. If not found, suggest: \"Press 'r' in Goals view to run an AI-powered scan\"\n4. Do NOT attempt manual file searches for emoji detection\n\n**When user asks to fix violations:**\n1. Look in \"Recent goal violations (nudges)\" section of project context\n2. Extract: file path, goal description, and violation details\n3. Use trie_propose_fix to propose the fix - this will ASK THE USER for confirmation\n4. Do NOT assume the user wants to proceed - always get confirmation first\n\nExamples:\n- User: \"do we have emojis?\" → Check nudges first. If none: \"I don't see emoji violations in recent nudges. Press 'r' in Goals view to run a scan.\"\n- User: \"fix the emoji violation\" → Find emoji violation in nudges, call trie_propose_fix (will ask user to confirm)\n- User: \"search for TODO comments\" → \"The file search tool requires ripgrep. I recommend checking recent nudges or running a goal scan.\"\n\nAnswer concisely. Reference specific files, decisions, and patterns when relevant.`;\n\nexport function ChatView(): React.ReactElement {\n const { state, dispatch } = useDashboard();\n const { chatState } = state;\n const { messages, inputBuffer, loading } = chatState;\n const loadingRef = useRef(false);\n\n const sendMessage = useCallback(async (question: string) => {\n if (loadingRef.current) return;\n loadingRef.current = true;\n dispatch({ type: 'ADD_CHAT_MESSAGE', role: 'user', content: question });\n dispatch({ type: 'SET_CHAT_INPUT', buffer: '' });\n dispatch({ type: 'SET_CHAT_LOADING', loading: true });\n\n try {\n const workDir = getWorkingDirectory(undefined, true);\n \n // Check if user is responding to a pending fix\n // Look at the LAST ASSISTANT message, not the last message overall (which is the user's \"yes\")\n const lastAssistantMessage = messages.filter(m => m.role === 'assistant').pop();\n if (lastAssistantMessage?.pendingFix) {\n const response = question.trim().toLowerCase();\n if (response === 'yes' || response === 'y') {\n // User confirmed - spawn Claude Code\n const { spawnClaudeCodeFix } = await import('../../../utils/terminal-spawn.js');\n try {\n await spawnClaudeCodeFix(lastAssistantMessage.pendingFix);\n dispatch({\n type: 'ADD_CHAT_MESSAGE',\n role: 'assistant',\n content: `✓ Spawned Claude Code in a new terminal to fix \"${lastAssistantMessage.pendingFix.file}\".\\n\\nClaude Code will:\\n1. Review the file\\n2. Understand the goal: \"${lastAssistantMessage.pendingFix.goal}\"\\n3. Fix the violation: \"${lastAssistantMessage.pendingFix.violation}\"\\n4. Preserve all functionality\\n\\nCheck the new terminal window to see the fix in progress.`,\n });\n dispatch({ type: 'SET_CHAT_LOADING', loading: false });\n loadingRef.current = false;\n return;\n } catch (error) {\n dispatch({\n type: 'ADD_CHAT_MESSAGE',\n role: 'assistant',\n content: `Failed to spawn Claude Code: ${error instanceof Error ? error.message : 'unknown error'}`,\n });\n dispatch({ type: 'SET_CHAT_LOADING', loading: false });\n loadingRef.current = false;\n return;\n }\n } else if (response === 'no' || response === 'n') {\n // User declined\n dispatch({\n type: 'ADD_CHAT_MESSAGE',\n role: 'assistant',\n content: 'Fix cancelled. Let me know if you need anything else!',\n });\n dispatch({ type: 'SET_CHAT_LOADING', loading: false });\n loadingRef.current = false;\n return;\n }\n // If not yes/no, continue with normal processing\n }\n \n const contextBlock = await buildContext(workDir, state);\n const fullSystem = `${SYSTEM_PROMPT}\\n\\nProject context:\\n${contextBlock}`;\n const history = chatHistoryToMessages([\n ...messages,\n { role: 'user', content: question, timestamp: Date.now() },\n ]);\n\n const result = await runAIWithTools({\n systemPrompt: fullSystem,\n messages: history,\n tools: CHAT_TOOLS,\n executeTool,\n maxTokens: 4096,\n maxToolRounds: 5,\n });\n\n if (result.success) {\n const action: Parameters<typeof dispatch>[0] & { type: 'ADD_CHAT_MESSAGE' } = {\n type: 'ADD_CHAT_MESSAGE',\n role: 'assistant',\n content: result.content,\n };\n \n // Check if response contains a pending fix\n const pendingFixMatch = result.content.match(/\\[PENDING_FIX:(.+?)\\]/);\n if (pendingFixMatch) {\n try {\n const fixData = JSON.parse(pendingFixMatch[1]);\n action.pendingFix = fixData;\n // Remove the JSON marker from the content\n action.content = result.content.replace(/\\[PENDING_FIX:.+?\\]/, '').trim();\n } catch {\n // Invalid JSON, ignore\n }\n }\n \n if (result.toolCalls && result.toolCalls.length > 0) {\n action.toolCalls = result.toolCalls;\n const toolNames = new Set(result.toolCalls.map(tc => tc.name));\n if (toolNames.has('trie_add_goal') || toolNames.has('trie_add_hypothesis')) {\n try {\n const agentState = getGuardianState(workDir);\n await agentState.load();\n if (toolNames.has('trie_add_goal')) {\n const goals = agentState.getAllGoals();\n dispatch({\n type: 'SET_GOALS',\n goals: goals.map(g => {\n const base = { id: g.id, description: g.description, type: g.type, target: g.target, currentValue: g.currentValue, status: g.status, autoGenerated: g.autoGenerated, updatedAt: g.updatedAt };\n return g.category ? { ...base, category: g.category } : base;\n }),\n });\n }\n if (toolNames.has('trie_add_hypothesis')) {\n const hypotheses = agentState.getAllHypotheses();\n dispatch({\n type: 'SET_HYPOTHESES',\n hypotheses: hypotheses.map(h => {\n const base = { id: h.id, statement: h.statement, confidence: h.confidence, status: h.status, evidenceCount: h.evidence.length, updatedAt: h.updatedAt };\n return h.category ? { ...base, category: h.category } : base;\n }),\n });\n }\n } catch { /* ignore */ }\n }\n }\n dispatch(action);\n } else {\n dispatch({\n type: 'ADD_CHAT_MESSAGE',\n role: 'assistant',\n content: result.error || 'Failed to get a response.',\n });\n }\n } catch (err) {\n dispatch({\n type: 'ADD_CHAT_MESSAGE',\n role: 'assistant',\n content: `Error: ${err instanceof Error ? err.message : 'unknown'}`,\n });\n } finally {\n dispatch({ type: 'SET_CHAT_LOADING', loading: false });\n loadingRef.current = false;\n }\n }, [dispatch, messages, state]);\n\n useInput((input, key) => {\n if (loading) return;\n if (key.return && inputBuffer.trim().length > 0) {\n void sendMessage(inputBuffer.trim());\n } else if (key.escape) {\n dispatch({ type: 'SET_CHAT_INPUT', buffer: '' });\n } else if (key.backspace || key.delete) {\n dispatch({ type: 'SET_CHAT_INPUT', buffer: inputBuffer.slice(0, -1) });\n } else if (input && !key.ctrl && !key.meta) {\n dispatch({ type: 'SET_CHAT_INPUT', buffer: inputBuffer + input });\n }\n });\n\n if (!isAIAvailable()) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold>Chat</Text>\n <Text dimColor> AI is not available. Press s to open settings and add your Anthropic API key.</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" paddingX={1} flexGrow={1}>\n <Text bold>Chat</Text>\n\n <Box flexDirection=\"column\" flexGrow={1} overflow=\"hidden\" marginTop={1}>\n {messages.length === 0 && !loading && (\n <Text dimColor> Ask about your codebase, decisions, patterns, or risks.</Text>\n )}\n\n {messages.map((msg, idx) => (\n <Box key={idx} flexDirection=\"column\" marginTop={idx === 0 ? 0 : 1} marginBottom={1}>\n {msg.role === 'user' ? (\n <Text> <Text bold color=\"green\">You:</Text> {msg.content}</Text>\n ) : (\n <Box flexDirection=\"column\">\n {msg.toolCalls && msg.toolCalls.length > 0 && msg.toolCalls.map((tc, ti) => (\n <Text key={ti} dimColor> <Text color=\"yellow\">[{tc.name}]</Text> {formatToolInput(tc.input)}</Text>\n ))}\n {msg.content.split('\\n').map((line, li) => (\n <Text key={li}>{li === 0 ? ' Trie: ' : ' '}{line}</Text>\n ))}\n </Box>\n )}\n </Box>\n ))}\n\n {loading && <Text dimColor> Thinking...</Text>}\n </Box>\n\n <Box borderStyle=\"single\" borderColor=\"green\" paddingX={1} flexShrink={0}>\n <Text>\n {inputBuffer || <Text dimColor>Ask a question...</Text>}\n <Text bold color=\"green\">|</Text>\n </Text>\n </Box>\n </Box>\n );\n}\n\nfunction formatToolInput(input: Record<string, unknown>): string {\n const parts: string[] = [];\n for (const [k, v] of Object.entries(input)) {\n if (k === 'directory') continue;\n if (Array.isArray(v)) parts.push(`${k}: [${v.join(', ')}]`);\n else parts.push(`${k}: ${String(v)}`);\n }\n return parts.length > 0 ? parts.join(', ') : '';\n}\n","import path from 'node:path';\n\nimport { ContextGraph } from '../context/graph.js';\nimport type { FileNodeData } from '../context/nodes.js';\nimport { exportToJson } from '../context/sync.js';\nimport { IncidentIndex } from '../context/incident-index.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\nimport { formatFriendlyError } from '../utils/errors.js';\nimport { processIncident } from '../extraction/pipeline.js';\nimport type { ExtractedSignal } from '../types/signal.js';\n\nexport interface TellToolInput {\n description: string;\n directory?: string;\n}\n\nimport type { RiskLevel } from '../types/index.js';\n\nfunction escalateRisk(level: RiskLevel | undefined): RiskLevel {\n if (level === 'low') return 'medium';\n if (level === 'medium') return 'high';\n if (level === 'high') return 'critical';\n return 'critical';\n}\n\nfunction extractFilePathsFromDescription(description: string): string[] {\n const matches = description.match(/[\\\\w./_-]+\\\\.(ts|tsx|js|jsx|mjs|cjs)/gi);\n if (!matches) return [];\n const unique = new Set<string>();\n matches.forEach((m) => unique.add(m.replace(/^\\.\\/+/, '')));\n return Array.from(unique);\n}\n\nexport class TrieTellTool {\n async execute(input: TellToolInput): Promise<any> {\n try {\n const description = input.description?.trim();\n if (!description) {\n return { content: [{ type: 'text', text: 'description is required' }] };\n }\n\n const projectPath = input.directory || getWorkingDirectory(undefined, true);\n const graph = new ContextGraph(projectPath);\n const now = new Date().toISOString();\n const change = (await graph.getRecentChanges(1))[0];\n const linkedFiles = new Set<string>();\n\n // === NEW: Extract structured signals from incident description ===\n console.log('\\n🧠 Processing incident with signal extraction...');\n let extractedSignal: ExtractedSignal | null = null;\n \n try {\n const apiKey = process.env.ANTHROPIC_API_KEY;\n const options: { workingDirectory: string; anthropicApiKey?: string } = {\n workingDirectory: projectPath,\n };\n if (apiKey) {\n options.anthropicApiKey = apiKey;\n }\n extractedSignal = await processIncident(description, options);\n } catch (error) {\n console.warn('⚠️ Signal extraction failed, continuing with basic incident tracking:', error);\n }\n\n const incident = await graph.addNode('incident', {\n description,\n severity: 'major',\n affectedUsers: null,\n duration: null,\n timestamp: now,\n resolved: false,\n resolution: null,\n fixChangeId: change?.id ?? null,\n reportedVia: 'manual'\n });\n\n if (change) {\n await graph.addEdge(change.id, incident.id, 'leadTo');\n await graph.addEdge(incident.id, change.id, 'causedBy');\n\n for (const filePath of change.data.files) {\n linkedFiles.add(filePath);\n const fileNode = await graph.getNode('file', path.resolve(projectPath, filePath));\n if (fileNode) {\n const data = fileNode.data as FileNodeData;\n await graph.updateNode('file', fileNode.id, {\n incidentCount: (data.incidentCount ?? 0) + 1,\n riskLevel: escalateRisk(data.riskLevel)\n });\n }\n }\n }\n\n // Extract file mentions from description and add to index\n const mentionedFiles = extractFilePathsFromDescription(description);\n mentionedFiles.forEach((f) => linkedFiles.add(f));\n\n // Also add files from extracted signals\n if (extractedSignal) {\n for (const decision of extractedSignal.decisions) {\n decision.files.forEach(f => linkedFiles.add(f));\n }\n }\n\n const incidentIndex = new IncidentIndex(graph, projectPath);\n incidentIndex.addIncidentToTrie(incident, Array.from(linkedFiles));\n\n await exportToJson(graph);\n\n // Build response with extraction summary\n let responseText = `Incident recorded${change ? ` and linked to change ${change.id}` : ''}.`;\n \n if (extractedSignal) {\n const counts = [\n extractedSignal.decisions.length > 0 ? `${extractedSignal.decisions.length} decision(s)` : null,\n extractedSignal.facts.length > 0 ? `${extractedSignal.facts.length} fact(s)` : null,\n extractedSignal.blockers.length > 0 ? `${extractedSignal.blockers.length} blocker(s)` : null,\n extractedSignal.questions.length > 0 ? `${extractedSignal.questions.length} question(s)` : null,\n ].filter(Boolean).join(', ');\n \n if (counts) {\n responseText += `\\n\\n📊 Extracted and stored: ${counts}`;\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: responseText\n }]\n };\n } catch (error) {\n const friendly = formatFriendlyError(error);\n return { content: [{ type: 'text', text: friendly.userMessage }] };\n }\n }\n}\n","/**\n * Signal Extraction Layer\n * \n * Uses a cheap, fast model (Haiku or local Ollama) to extract structured\n * signals from raw content. This is the first layer of context management\n * that prevents agents from drowning in noise.\n */\n\nimport Anthropic from '@anthropic-ai/sdk';\nimport type { \n ExtractedSignal, \n Decision, \n Fact, \n Blocker, \n Question \n} from '../types/signal.js';\n\nconst EXTRACTION_PROMPT = `You are a signal extraction system. Your job is to extract structured information from raw content.\n\nExtract:\n1. DECISIONS - Clear choices made during development\n - What was decided\n - Why it was decided (reasoning/tradeoffs)\n - What alternatives were considered but NOT chosen\n - Which files are affected\n \n2. FACTS - Concrete, verifiable information\n - Technical constraints (e.g., \"Stripe requires TLS 1.2+\")\n - API requirements\n - Business rules\n - Dependencies\n \n3. BLOCKERS - Things preventing progress\n - What's blocked\n - Impact level (critical/high/medium/low)\n - What areas are affected\n \n4. QUESTIONS - Open items needing resolution\n - What's unclear\n - Context around the question\n\nCRITICAL: Extract rich metadata:\n- Tags: Use specific, searchable tags (e.g., \"auth\", \"payments\", \"eu-compliance\", \"validation\")\n- Files: Full paths when mentioned (e.g., \"src/auth/validator.ts\")\n- Tradeoffs: What was considered but rejected\n- Related terms: Alternative names/keywords (e.g., \"password\" + \"credentials\" + \"auth\")\n\nFormat as JSON:\n{\n \"decisions\": [{\n \"decision\": \"Use bcrypt for password hashing\",\n \"context\": \"Security requirement for user authentication\",\n \"reasoning\": \"Industry standard, resistant to GPU attacks\",\n \"files\": [\"src/auth/hash.ts\", \"src/models/user.ts\"],\n \"tags\": [\"security\", \"auth\", \"passwords\", \"encryption\"],\n \"tradeoffs\": [\"Considered argon2 but bcrypt has better library support\"]\n }],\n \"facts\": [{\n \"fact\": \"Stripe requires TLS 1.2+ for all API calls\",\n \"source\": \"Stripe API docs\",\n \"tags\": [\"payments\", \"stripe\", \"security\", \"api\"],\n \"confidence\": 0.95\n }],\n \"blockers\": [{\n \"blocker\": \"Missing VAT calculation endpoint\",\n \"impact\": \"high\",\n \"affectedAreas\": [\"checkout\", \"eu-payments\"],\n \"tags\": [\"payments\", \"eu\", \"compliance\", \"vat\"]\n }],\n \"questions\": [{\n \"question\": \"Should we cache user sessions in Redis or memory?\",\n \"context\": \"Performance optimization for auth layer\",\n \"tags\": [\"auth\", \"performance\", \"caching\", \"sessions\"]\n }]\n}\n\nBe specific with tags. Use concrete technical terms. Extract ALL file paths mentioned.\nEmpty arrays are fine if nothing to extract.`;\n\nexport class SignalExtractor {\n private client: Anthropic | null = null;\n private model: string;\n\n constructor(model: string = 'claude-3-haiku-20240307') {\n this.model = model;\n \n // Initialize Anthropic client if API key available\n const apiKey = process.env.ANTHROPIC_API_KEY;\n if (apiKey) {\n this.client = new Anthropic({ apiKey });\n }\n }\n\n /**\n * Extract structured signals from raw content\n */\n async extract(\n content: string,\n sourceType: 'incident' | 'pr' | 'commit' | 'conversation' | 'file',\n sourceId?: string\n ): Promise<ExtractedSignal> {\n if (!this.client) {\n // Fallback: basic extraction without AI\n return this.basicExtraction(content, sourceType, sourceId);\n }\n\n try {\n const response = await this.client.messages.create({\n model: this.model,\n max_tokens: 2048,\n temperature: 0.3,\n messages: [{\n role: 'user',\n content: `${EXTRACTION_PROMPT}\\n\\nContent to analyze:\\n${content}`\n }]\n });\n\n const firstBlock = response.content[0];\n const text = firstBlock && firstBlock.type === 'text' \n ? firstBlock.text \n : '';\n \n // Parse JSON response\n const extracted = this.parseExtraction(text);\n \n // Add IDs and timestamps\n const now = new Date().toISOString();\n const metadata: ExtractedSignal['metadata'] = {\n extractedAt: now,\n sourceType,\n extractionModel: this.model\n };\n if (sourceId !== undefined) {\n metadata.sourceId = sourceId;\n }\n const signal: ExtractedSignal = {\n decisions: extracted.decisions.map((d, i) => ({\n id: `dec-${Date.now()}-${i}`,\n decision: d.decision || '',\n context: d.context || '',\n files: d.files || [],\n tags: d.tags || [],\n ...d,\n when: now,\n status: 'active' as const\n })),\n facts: extracted.facts.map((f, i) => ({\n id: `fact-${Date.now()}-${i}`,\n fact: f.fact || '',\n source: f.source || sourceType,\n tags: f.tags || [],\n confidence: f.confidence ?? 0.8,\n ...f,\n when: now\n })),\n blockers: extracted.blockers.map((b, i) => ({\n id: `block-${Date.now()}-${i}`,\n blocker: b.blocker || '',\n impact: b.impact || 'medium',\n affectedAreas: b.affectedAreas || [],\n tags: b.tags || [],\n ...b,\n when: now\n })),\n questions: extracted.questions.map((q, i) => ({\n id: `q-${Date.now()}-${i}`,\n question: q.question || '',\n context: q.context || '',\n tags: q.tags || [],\n ...q,\n when: now\n })),\n metadata\n };\n\n return signal;\n } catch (error) {\n console.error('Extraction failed, using basic extraction:', error);\n return this.basicExtraction(content, sourceType, sourceId);\n }\n }\n\n /**\n * Parse extraction from model response\n */\n private parseExtraction(text: string): {\n decisions: Partial<Decision>[];\n facts: Partial<Fact>[];\n blockers: Partial<Blocker>[];\n questions: Partial<Question>[];\n } {\n try {\n // Try to find JSON in response\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n return JSON.parse(jsonMatch[0]);\n }\n } catch (e) {\n // JSON parse failed\n }\n\n // Return empty structure\n return {\n decisions: [],\n facts: [],\n blockers: [],\n questions: []\n };\n }\n\n /**\n * Basic extraction without AI (fallback)\n */\n private basicExtraction(\n content: string,\n sourceType: 'incident' | 'pr' | 'commit' | 'conversation' | 'file',\n sourceId?: string\n ): ExtractedSignal {\n const now = new Date().toISOString();\n \n // Simple keyword-based extraction\n const hasDecision = /\\b(decided|decision|chose|picked)\\b/i.test(content);\n const hasBlocker = /\\b(blocked|blocker|blocked by|can't|cannot|unable)\\b/i.test(content);\n const hasQuestion = /\\?|what|how|why|should we/i.test(content);\n\n const decisions: Decision[] = [];\n const facts: Fact[] = [];\n const blockers: Blocker[] = [];\n const questions: Question[] = [];\n\n if (hasDecision) {\n decisions.push({\n id: `dec-${Date.now()}`,\n decision: content.substring(0, 200),\n context: sourceType,\n when: now,\n files: [],\n tags: [sourceType],\n status: 'active'\n });\n }\n\n if (hasBlocker) {\n blockers.push({\n id: `block-${Date.now()}`,\n blocker: content.substring(0, 200),\n impact: 'medium',\n affectedAreas: [],\n when: now,\n tags: [sourceType]\n });\n }\n\n if (hasQuestion) {\n questions.push({\n id: `q-${Date.now()}`,\n question: content.substring(0, 200),\n context: sourceType,\n when: now,\n tags: [sourceType]\n });\n }\n\n const metadata: ExtractedSignal['metadata'] = {\n extractedAt: now,\n sourceType,\n extractionModel: 'basic'\n };\n if (sourceId !== undefined) {\n metadata.sourceId = sourceId;\n }\n return {\n decisions,\n facts,\n blockers,\n questions,\n metadata\n };\n }\n\n /**\n * Extract from incident report (trie tell)\n */\n async extractFromIncident(incidentText: string): Promise<ExtractedSignal> {\n return this.extract(incidentText, 'incident');\n }\n\n /**\n * Extract from commit message and diff\n */\n async extractFromCommit(\n message: string,\n diff?: string,\n commitId?: string\n ): Promise<ExtractedSignal> {\n const content = diff ? `${message}\\n\\nChanges:\\n${diff}` : message;\n return this.extract(content, 'commit', commitId);\n }\n\n /**\n * Extract from PR description and comments\n */\n async extractFromPR(\n title: string,\n description: string,\n comments: string[],\n prNumber?: string\n ): Promise<ExtractedSignal> {\n const content = `\nTitle: ${title}\n\nDescription:\n${description}\n\nComments:\n${comments.join('\\n\\n')}\n `.trim();\n \n return this.extract(content, 'pr', prNumber);\n }\n}\n\n/**\n * Get singleton extractor instance\n */\nlet extractorInstance: SignalExtractor | null = null;\n\nexport function getExtractor(): SignalExtractor {\n if (!extractorInstance) {\n extractorInstance = new SignalExtractor();\n }\n return extractorInstance;\n}\n","/**\n * Metadata enricher - adds rich context to extracted signals\n * This is our \"semantic layer\" without embeddings\n */\n\nimport type { ExtractedSignal } from '../types/signal.js';\n\nexport interface EnrichedMetadata {\n // File relationships\n relatedFiles: string[];\n dependencies: string[];\n \n // Enhanced tags (with synonyms and related terms)\n expandedTags: string[];\n \n // Contextual data\n codebaseArea: string[]; // e.g., [\"frontend\", \"auth\"]\n domain: string[]; // e.g., [\"payments\", \"compliance\"]\n \n // Relationships\n relatedDecisions: string[]; // IDs of related decisions\n \n // Timestamps and versioning\n extractedAt: string;\n gitContext?: {\n branch?: string;\n commit?: string;\n };\n}\n\nexport class MetadataEnricher {\n private tagSynonyms: Map<string, string[]>;\n\n constructor() {\n this.tagSynonyms = this.initializeTagSynonyms();\n }\n\n /**\n * Enrich an extracted signal with additional metadata\n */\n async enrichSignal(\n signal: ExtractedSignal,\n context?: {\n workingDirectory?: string;\n gitBranch?: string;\n gitCommit?: string;\n }\n ): Promise<{ signal: ExtractedSignal; metadata: EnrichedMetadata }> {\n const gitContext: { branch?: string; commit?: string } = {};\n if (context?.gitBranch) gitContext.branch = context.gitBranch;\n if (context?.gitCommit) gitContext.commit = context.gitCommit;\n \n const metadata: EnrichedMetadata = {\n relatedFiles: await this.findRelatedFiles(signal),\n dependencies: await this.extractDependencies(signal),\n expandedTags: this.expandTags(signal),\n codebaseArea: this.inferCodebaseArea(signal),\n domain: this.inferDomain(signal),\n relatedDecisions: [], // Will be populated by storage layer\n extractedAt: new Date().toISOString(),\n };\n \n if (Object.keys(gitContext).length > 0) {\n metadata.gitContext = gitContext;\n }\n\n return {\n signal,\n metadata,\n };\n }\n\n /**\n * Expand tags with synonyms and related terms\n * This is our \"semantic\" layer without embeddings\n */\n private expandTags(signal: ExtractedSignal): string[] {\n const allTags = new Set<string>();\n\n // Collect all tags from signal\n for (const decision of signal.decisions) {\n decision.tags.forEach(tag => allTags.add(tag.toLowerCase()));\n }\n for (const fact of signal.facts) {\n fact.tags.forEach(tag => allTags.add(tag.toLowerCase()));\n }\n for (const blocker of signal.blockers) {\n blocker.tags.forEach(tag => allTags.add(tag.toLowerCase()));\n }\n for (const question of signal.questions) {\n question.tags.forEach(tag => allTags.add(tag.toLowerCase()));\n }\n\n // Add synonyms for each tag\n const expandedTags = new Set(allTags);\n for (const tag of allTags) {\n const synonyms = this.tagSynonyms.get(tag) || [];\n synonyms.forEach(syn => expandedTags.add(syn));\n }\n\n return Array.from(expandedTags);\n }\n\n /**\n * Find related files based on signal content\n */\n private async findRelatedFiles(signal: ExtractedSignal): Promise<string[]> {\n const relatedFiles = new Set<string>();\n\n // Collect explicitly mentioned files\n for (const decision of signal.decisions) {\n decision.files.forEach(file => relatedFiles.add(file));\n }\n\n // Infer related files based on tags\n // e.g., if tags include \"auth\", look for auth-related files\n const inferredFiles = await this.inferFilesFromTags(signal);\n inferredFiles.forEach(file => relatedFiles.add(file));\n\n return Array.from(relatedFiles);\n }\n\n /**\n * Extract dependencies from signal\n */\n private async extractDependencies(signal: ExtractedSignal): Promise<string[]> {\n const dependencies = new Set<string>();\n\n // Look for common dependency patterns in decisions/facts\n const allText = [\n ...signal.decisions.map(d => `${d.decision} ${d.context} ${d.reasoning}`),\n ...signal.facts.map(f => `${f.fact} ${f.source}`),\n ].join(' ');\n\n // Extract npm packages (e.g., \"using bcrypt\", \"with stripe\")\n const packagePatterns = [\n /\\b(react|vue|angular|next|express|fastify|stripe|bcrypt|jwt|redis|prisma)\\b/gi,\n ];\n\n for (const pattern of packagePatterns) {\n const matches = allText.match(pattern) || [];\n matches.forEach(dep => dependencies.add(dep.toLowerCase()));\n }\n\n return Array.from(dependencies);\n }\n\n /**\n * Infer codebase area from file paths and tags\n */\n private inferCodebaseArea(signal: ExtractedSignal): string[] {\n const areas = new Set<string>();\n\n // From file paths\n for (const decision of signal.decisions) {\n for (const file of decision.files) {\n const area = this.filePathToArea(file);\n if (area) areas.add(area);\n }\n }\n\n // From tags\n const areaKeywords = ['frontend', 'backend', 'api', 'ui', 'database', 'auth', 'payments'];\n const allTags = this.expandTags(signal);\n \n for (const tag of allTags) {\n if (areaKeywords.includes(tag)) {\n areas.add(tag);\n }\n }\n\n return Array.from(areas);\n }\n\n /**\n * Infer domain from tags and content\n */\n private inferDomain(signal: ExtractedSignal): string[] {\n const domains = new Set<string>();\n\n const domainKeywords = [\n 'payments', 'billing', 'compliance', 'security', 'auth', \n 'analytics', 'notifications', 'messaging', 'search'\n ];\n\n const allTags = this.expandTags(signal);\n \n for (const tag of allTags) {\n if (domainKeywords.includes(tag)) {\n domains.add(tag);\n }\n }\n\n return Array.from(domains);\n }\n\n /**\n * Convert file path to codebase area\n */\n private filePathToArea(filePath: string): string | null {\n const normalized = filePath.toLowerCase();\n \n if (normalized.includes('/frontend/') || normalized.includes('/client/') || normalized.includes('/ui/')) {\n return 'frontend';\n }\n if (normalized.includes('/backend/') || normalized.includes('/server/') || normalized.includes('/api/')) {\n return 'backend';\n }\n if (normalized.includes('/database/') || normalized.includes('/models/') || normalized.includes('/schema/')) {\n return 'database';\n }\n if (normalized.includes('/auth/')) {\n return 'auth';\n }\n \n return null;\n }\n\n /**\n * Infer related files from tags\n */\n private async inferFilesFromTags(_signal: ExtractedSignal): Promise<string[]> {\n // In a real implementation, this would search the codebase\n // For now, return empty array\n return [];\n }\n\n /**\n * Initialize tag synonyms and related terms\n * This is our \"semantic\" understanding without embeddings\n */\n private initializeTagSynonyms(): Map<string, string[]> {\n return new Map([\n // Auth & Security\n ['auth', ['authentication', 'login', 'signin', 'credentials', 'password']],\n ['password', ['credentials', 'auth', 'hashing', 'bcrypt']],\n ['security', ['vulnerability', 'exploit', 'attack', 'protection']],\n ['encryption', ['crypto', 'hashing', 'encoding', 'security']],\n \n // Payments\n ['payments', ['billing', 'checkout', 'stripe', 'pricing']],\n ['stripe', ['payments', 'billing', 'api', 'checkout']],\n ['vat', ['tax', 'eu', 'compliance', 'billing']],\n \n // Database & Performance\n ['database', ['db', 'sql', 'query', 'storage', 'persistence']],\n ['cache', ['caching', 'redis', 'memory', 'performance']],\n ['performance', ['optimization', 'speed', 'latency', 'cache']],\n \n // Frontend\n ['ui', ['frontend', 'interface', 'component', 'view']],\n ['component', ['ui', 'react', 'vue', 'frontend']],\n ['validation', ['form', 'input', 'error', 'ui']],\n \n // Backend & API\n ['api', ['endpoint', 'route', 'backend', 'server']],\n ['endpoint', ['api', 'route', 'url', 'backend']],\n ['backend', ['server', 'api', 'service']],\n \n // Compliance & Legal\n ['compliance', ['gdpr', 'hipaa', 'legal', 'regulation']],\n ['gdpr', ['compliance', 'privacy', 'eu', 'data-protection']],\n ['privacy', ['gdpr', 'compliance', 'data-protection', 'security']],\n ]);\n }\n}\n","/**\n * Extraction Pipeline\n * \n * Complete flow: Raw Input → Extract → Enrich → Store\n * This is the heart of the decision ledger system.\n */\n\nimport { SignalExtractor } from './signal-extractor.js';\nimport { MetadataEnricher } from './metadata-enricher.js';\nimport { TieredStorage, getStorage } from '../storage/tiered-storage.js';\nimport type { ExtractedSignal } from '../types/signal.js';\nimport { randomBytes } from 'crypto';\n\nexport interface PipelineOptions {\n workingDirectory: string;\n anthropicApiKey?: string;\n gitContext?: {\n branch?: string;\n commit?: string;\n };\n}\n\nexport class ExtractionPipeline {\n private extractor: SignalExtractor;\n private enricher: MetadataEnricher;\n private storage: TieredStorage;\n private workDir: string;\n\n constructor(options: PipelineOptions) {\n this.extractor = new SignalExtractor(options.anthropicApiKey);\n this.enricher = new MetadataEnricher();\n this.storage = getStorage(options.workingDirectory);\n this.workDir = options.workingDirectory;\n }\n\n /**\n * Process raw content through the entire pipeline\n */\n async process(\n content: string,\n context: {\n sourceType: 'incident' | 'pr' | 'commit' | 'conversation' | 'file';\n sourceId?: string;\n who?: string;\n }\n ): Promise<ExtractedSignal> {\n console.log('🔍 Extracting signals from content...');\n \n // Step 1: Extract structured signals from raw content\n let extractedSignal = await this.extractor.extract(content, context.sourceType, context.sourceId);\n \n // Add IDs and metadata to extracted signal\n extractedSignal = this.addIds(extractedSignal, context);\n\n console.log(` ✓ Extracted ${extractedSignal.decisions.length} decisions, ${extractedSignal.facts.length} facts, ${extractedSignal.blockers.length} blockers, ${extractedSignal.questions.length} questions`);\n\n // Step 2: Enrich with metadata (tags, files, relationships)\n console.log('🏷️ Enriching with metadata...');\n const { metadata: enrichedMeta } = await this.enricher.enrichSignal(extractedSignal, {\n workingDirectory: this.workDir,\n });\n\n if (enrichedMeta.expandedTags.length > 0) {\n console.log(` ✓ Expanded tags: ${enrichedMeta.expandedTags.slice(0, 5).join(', ')}${enrichedMeta.expandedTags.length > 5 ? '...' : ''}`);\n }\n if (enrichedMeta.dependencies.length > 0) {\n console.log(` ✓ Dependencies: ${enrichedMeta.dependencies.join(', ')}`);\n }\n if (enrichedMeta.codebaseArea.length > 0) {\n console.log(` ✓ Codebase areas: ${enrichedMeta.codebaseArea.join(', ')}`);\n }\n if (enrichedMeta.domain.length > 0) {\n console.log(` ✓ Domains: ${enrichedMeta.domain.join(', ')}`);\n }\n\n // Step 3: Store in warm storage\n console.log('💾 Storing in decision ledger...');\n await this.storage.storeSignal(extractedSignal, {\n expandedTags: enrichedMeta.expandedTags,\n dependencies: enrichedMeta.dependencies,\n codebaseArea: enrichedMeta.codebaseArea,\n domain: enrichedMeta.domain,\n });\n\n console.log('✅ Successfully stored in decision ledger');\n\n return extractedSignal;\n }\n\n /**\n * Add IDs and metadata to extracted signal\n */\n private addIds(\n signal: ExtractedSignal,\n context: {\n sourceType: 'incident' | 'pr' | 'commit' | 'conversation' | 'file';\n sourceId?: string;\n who?: string;\n }\n ): ExtractedSignal {\n const now = new Date().toISOString();\n const metadata: ExtractedSignal['metadata'] = {\n extractedAt: now,\n sourceType: context.sourceType,\n extractionModel: 'claude-haiku',\n };\n if (context.sourceId !== undefined) {\n metadata.sourceId = context.sourceId;\n }\n\n return {\n decisions: signal.decisions.map(d => {\n const decision = {\n ...d,\n id: d.id || this.generateId(),\n when: d.when || now,\n status: d.status || 'active' as const,\n };\n if (context.who !== undefined) {\n decision.who = d.who || context.who;\n }\n return decision;\n }),\n facts: signal.facts.map(f => ({\n ...f,\n id: f.id || this.generateId(),\n when: f.when || now,\n confidence: f.confidence ?? 0.8,\n })),\n blockers: signal.blockers.map(b => ({\n ...b,\n id: b.id || this.generateId(),\n when: b.when || now,\n })),\n questions: signal.questions.map(q => ({\n ...q,\n id: q.id || this.generateId(),\n when: q.when || now,\n })),\n metadata,\n };\n }\n\n /**\n * Generate a unique ID\n */\n private generateId(): string {\n return randomBytes(8).toString('hex');\n }\n\n /**\n * Initialize storage\n */\n async initialize(): Promise<void> {\n await this.storage.initialize();\n }\n\n /**\n * Close storage connections\n */\n close(): void {\n this.storage.close();\n }\n}\n\n/**\n * Quick helper to process incident reports\n */\nexport async function processIncident(\n incidentDescription: string,\n options: PipelineOptions\n): Promise<ExtractedSignal> {\n const pipeline = new ExtractionPipeline(options);\n await pipeline.initialize();\n \n try {\n return await pipeline.process(incidentDescription, {\n sourceType: 'incident',\n sourceId: `incident-${Date.now()}`,\n });\n } finally {\n pipeline.close();\n }\n}\n\n/**\n * Quick helper to process commit messages\n */\nexport async function processCommit(\n commitMessage: string,\n commitSha: string,\n options: PipelineOptions\n): Promise<ExtractedSignal> {\n const pipeline = new ExtractionPipeline(options);\n await pipeline.initialize();\n \n try {\n return await pipeline.process(commitMessage, {\n sourceType: 'commit',\n sourceId: commitSha,\n });\n } finally {\n pipeline.close();\n }\n}\n","import { ContextGraph } from '../context/graph.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\nimport { formatFriendlyError } from '../utils/errors.js';\nimport { LearningEngine } from '../guardian/learning-engine.js';\n\nexport interface FeedbackInput {\n helpful: boolean;\n target?: string; // file path or tool result being rated\n note?: string;\n files?: string[]; // optional files related to the feedback\n directory?: string;\n}\n\nexport class TrieFeedbackTool {\n async execute(input: FeedbackInput): Promise<any> {\n try {\n const projectPath = input.directory || getWorkingDirectory(undefined, true);\n const graph = new ContextGraph(projectPath);\n const engine = new LearningEngine(projectPath, graph);\n\n const files = input.files || (input.target ? [input.target] : []);\n const manualFeedback = {\n helpful: input.helpful,\n files,\n ...(input.note !== undefined ? { note: input.note } : {})\n };\n\n await engine.learn({ manualFeedback });\n\n return {\n content: [{\n type: 'text',\n text: input.helpful\n ? '👍 Thanks — I will prioritize more responses like this.'\n : '👎 Understood — I will adjust future guidance.',\n }],\n };\n } catch (error) {\n const friendly = formatFriendlyError(error);\n return { content: [{ type: 'text', text: friendly.userMessage }] };\n }\n }\n}\n","import { perceiveCurrentChanges } from '../agent/perceive.js';\nimport { reasonAboutChangesHumanReadable } from '../agent/reason.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\nimport { formatFriendlyError } from '../utils/errors.js';\n\nexport interface CheckToolInput {\n directory?: string;\n files?: string[];\n mode?: 'quick' | 'full' | 'offline';\n}\n\nexport class TrieCheckTool {\n async execute(input: CheckToolInput = {}): Promise<any> {\n try {\n const workDir = input.directory || getWorkingDirectory(undefined, true);\n let files = input.files;\n\n if (!files || files.length === 0) {\n const perception = await perceiveCurrentChanges(workDir);\n files = perception.diffSummary.files.map((f) => f.filePath);\n }\n\n if (!files || files.length === 0) {\n return {\n content: [{\n type: 'text',\n text: 'No changes detected. Provide files or make a change.'\n }]\n };\n }\n\n const mode = input.mode ?? 'full';\n const runAgents = mode === 'full';\n\n const reasoning = await reasonAboutChangesHumanReadable(workDir, files, {\n runAgents,\n scanContext: { config: { timeoutMs: mode === 'quick' ? 15000 : 60000 } }\n });\n\n const summary = [\n `Risk: ${reasoning.original.riskLevel.toUpperCase()} (${reasoning.original.shouldBlock ? 'block' : 'allow'})`,\n `Explanation: ${reasoning.original.explanation}`,\n `Recommendation: ${reasoning.original.recommendation}`,\n `Plain summary: ${reasoning.summary}`,\n `What I found: ${reasoning.whatIFound}`,\n `How bad: ${reasoning.howBad}`,\n `What to do: ${reasoning.whatToDo}`\n ].join('\\n');\n\n return {\n content: [{\n type: 'text',\n text: summary\n }]\n };\n } catch (error) {\n const friendly = formatFriendlyError(error);\n return { content: [{ type: 'text', text: friendly.userMessage }] };\n }\n }\n}\n","import { readFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { extname, relative, resolve, isAbsolute } from 'path';\nimport { getPrompt, getSystemPrompt } from '../ai/prompts.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\n\n/**\n * Explain Tool - AI-powered code explanation\n * \n * This tool provides deep explanations of:\n * - Code: What does this code do?\n * - Issues: Why is this a problem?\n * - Changes: What's the impact of these changes?\n * - Risk: What could go wrong?\n */\n\nexport class TrieExplainTool {\n async execute(args: any) {\n const { type, target, context, depth = 'standard' } = args || {};\n\n if (!type || !target) {\n return {\n content: [{\n type: 'text',\n text: this.getHelpText()\n }]\n };\n }\n\n switch (type) {\n case 'code':\n return this.explainCode(target, context, depth);\n case 'issue':\n return this.explainIssue(target, context);\n case 'change':\n return this.explainChange(target, context);\n case 'risk':\n return this.explainRisk(target, context);\n default:\n return {\n content: [{\n type: 'text',\n text: `Unknown explanation type: ${type}`\n }]\n };\n }\n }\n\n private async explainCode(target: string, context?: string, _depth?: string) {\n // Target can be a file path or inline code\n let code: string;\n let filePath: string;\n let language: string;\n const workDir = getWorkingDirectory(undefined, true);\n\n // Check if target is a file path\n const resolvedPath = isAbsolute(target) ? target : resolve(workDir, target);\n \n if (existsSync(resolvedPath)) {\n code = await readFile(resolvedPath, 'utf-8');\n filePath = relative(workDir, resolvedPath);\n language = this.detectLanguage(resolvedPath);\n } else {\n // Treat as inline code\n code = target;\n filePath = 'inline';\n language = this.guessLanguage(code);\n }\n\n // For deep mode, analyze imports and dependencies\n const imports = this.extractImports(code, language);\n const exports = this.extractExports(code);\n const functions = this.extractFunctions(code, language);\n\n const prompt = getPrompt('explain', 'code', {\n code,\n language,\n filePath,\n });\n\n const systemPrompt = getSystemPrompt('explain');\n\n let output = `\\n${'━'.repeat(60)}\\n`;\n output += `📖 CODE EXPLANATION\\n`;\n output += `${'━'.repeat(60)}\\n\\n`;\n\n output += `## Source\\n\\n`;\n output += `- **File:** \\`${filePath}\\`\\n`;\n output += `- **Language:** ${language}\\n`;\n output += `- **Lines:** ${code.split('\\n').length}\\n\\n`;\n\n // Quick structural analysis\n output += `## 🔍 Structure Analysis\\n\\n`;\n \n if (imports.length > 0) {\n output += `**Imports (${imports.length}):**\\n`;\n for (const imp of imports.slice(0, 10)) {\n output += `- ${imp}\\n`;\n }\n if (imports.length > 10) {\n output += `- *...and ${imports.length - 10} more*\\n`;\n }\n output += '\\n';\n }\n\n if (exports.length > 0) {\n output += `**Exports (${exports.length}):**\\n`;\n for (const exp of exports) {\n output += `- ${exp}\\n`;\n }\n output += '\\n';\n }\n\n if (functions.length > 0) {\n output += `**Functions/Methods (${functions.length}):**\\n`;\n for (const fn of functions.slice(0, 15)) {\n output += `- \\`${fn}\\`\\n`;\n }\n if (functions.length > 15) {\n output += `- *...and ${functions.length - 15} more*\\n`;\n }\n output += '\\n';\n }\n\n output += `${'─'.repeat(60)}\\n`;\n output += `## 🧠 Deep Explanation Request\\n\\n`;\n output += `**Role:** ${systemPrompt.split('\\n')[0]}\\n\\n`;\n output += prompt;\n output += `\\n${'─'.repeat(60)}\\n`;\n\n if (context) {\n output += `\\n**Additional Context:** ${context}\\n`;\n }\n\n return { content: [{ type: 'text', text: output }] };\n }\n\n private async explainIssue(target: string, _context?: string) {\n // Parse issue details (format: \"description\" or \"file:line:description\")\n let file = '';\n let line = 0;\n let issue = target;\n let severity = 'unknown';\n\n // Try to parse structured format\n const match = target.match(/^(.+?):(\\d+):(.+)$/);\n if (match) {\n file = match[1]!;\n line = parseInt(match[2]!, 10);\n issue = match[3]!.trim();\n }\n\n // Detect severity from keywords\n if (/critical|injection|rce|xss/i.test(issue)) severity = 'critical';\n else if (/serious|auth|password|secret/i.test(issue)) severity = 'serious';\n else if (/moderate|warning/i.test(issue)) severity = 'moderate';\n else severity = 'low';\n\n let codeContext = '';\n if (file && existsSync(file)) {\n const content = await readFile(file, 'utf-8');\n const lines = content.split('\\n');\n const start = Math.max(0, line - 5);\n const end = Math.min(lines.length, line + 5);\n codeContext = lines.slice(start, end).map((l, i) => {\n const lineNum = start + i + 1;\n const marker = lineNum === line ? '→ ' : ' ';\n return `${marker}${lineNum.toString().padStart(4)} | ${l}`;\n }).join('\\n');\n }\n\n const prompt = getPrompt('explain', 'issue', {\n issue,\n severity,\n filePath: file || 'unknown',\n line: String(line || '?'),\n });\n\n let output = `\\n${'━'.repeat(60)}\\n`;\n output += `🔍 ISSUE EXPLANATION\\n`;\n output += `${'━'.repeat(60)}\\n\\n`;\n\n output += `## 📍 Issue Details\\n\\n`;\n output += `- **Issue:** ${issue}\\n`;\n output += `- **Severity:** ${this.getSeverityIcon(severity)} ${severity}\\n`;\n if (file) output += `- **File:** \\`${file}\\`\\n`;\n if (line) output += `- **Line:** ${line}\\n`;\n output += '\\n';\n\n if (codeContext) {\n output += `## 📄 Code Context\\n\\n`;\n output += `\\`\\`\\`\\n${codeContext}\\n\\`\\`\\`\\n\\n`;\n }\n\n output += `${'─'.repeat(60)}\\n`;\n output += `## 🧠 Explanation Request\\n\\n`;\n output += prompt;\n output += `\\n${'─'.repeat(60)}\\n`;\n\n return { content: [{ type: 'text', text: output }] };\n }\n\n private async explainChange(target: string, context?: string) {\n // Target is a list of changed files or a git diff\n const files = target.split(',').map(f => f.trim());\n\n let output = `\\n${'━'.repeat(60)}\\n`;\n output += `📝 CHANGE ANALYSIS\\n`;\n output += `${'━'.repeat(60)}\\n\\n`;\n\n output += `## 📂 Changed Files\\n\\n`;\n for (const file of files) {\n output += `- \\`${file}\\`\\n`;\n }\n output += '\\n';\n\n output += `## 🧠 Analysis Request\\n\\n`;\n output += `Analyze these changes and explain:\\n\\n`;\n output += `1. **What changed** - Summary of modifications\\n`;\n output += `2. **Why it matters** - Impact on the system\\n`;\n output += `3. **Dependencies** - What else might be affected\\n`;\n output += `4. **Testing needed** - What to test after this change\\n`;\n output += `5. **Rollback plan** - How to undo if needed\\n\\n`;\n\n if (context) {\n output += `**Context:** ${context}\\n\\n`;\n }\n\n output += `Please review the changed files and provide this analysis.\\n`;\n\n return { content: [{ type: 'text', text: output }] };\n }\n\n private async explainRisk(target: string, context?: string) {\n // Target is a file or feature description\n const workDir = getWorkingDirectory(undefined, true);\n const resolvedPath = isAbsolute(target) ? target : resolve(workDir, target);\n \n let output = `\\n${'━'.repeat(60)}\\n`;\n output += `RISK ASSESSMENT\\n`;\n output += `${'━'.repeat(60)}\\n\\n`;\n\n if (existsSync(resolvedPath)) {\n const code = await readFile(resolvedPath, 'utf-8');\n const filePath = relative(workDir, resolvedPath);\n \n // Quick risk indicators\n const riskIndicators = this.detectRiskIndicators(code);\n\n output += `## Target\\n\\n`;\n output += `- **File:** \\`${filePath}\\`\\n`;\n output += `- **Lines:** ${code.split('\\n').length}\\n\\n`;\n\n if (riskIndicators.length > 0) {\n output += `## Risk Indicators Found\\n\\n`;\n for (const indicator of riskIndicators) {\n output += `- ${indicator}\\n`;\n }\n output += '\\n';\n }\n\n const prompt = getPrompt('explain', 'risk', {\n files: filePath,\n summary: context || 'Code change',\n });\n\n output += `${'─'.repeat(60)}\\n`;\n output += `## 🧠 Risk Analysis Request\\n\\n`;\n output += prompt;\n output += `\\n${'─'.repeat(60)}\\n`;\n } else {\n // Treat as a feature/change description\n output += `## 📋 Feature/Change\\n\\n`;\n output += `${target}\\n\\n`;\n\n output += `## 🧠 Risk Analysis Request\\n\\n`;\n output += `Analyze the risks of this change:\\n\\n`;\n output += `1. **Technical risks** - What could break?\\n`;\n output += `2. **Security risks** - Any vulnerabilities introduced?\\n`;\n output += `3. **Performance risks** - Any slowdowns?\\n`;\n output += `4. **Data risks** - Any data integrity concerns?\\n`;\n output += `5. **User impact** - How might users be affected?\\n`;\n output += `6. **Mitigation** - How to reduce these risks?\\n`;\n }\n\n return { content: [{ type: 'text', text: output }] };\n }\n\n private detectRiskIndicators(code: string): string[] {\n const indicators: string[] = [];\n\n const checks = [\n { pattern: /delete|drop|truncate/i, message: '[!] Destructive operations detected' },\n { pattern: /password|secret|key|token/i, message: '[SEC] Credential handling detected' },\n { pattern: /exec|eval|spawn/i, message: '[EXEC] Code execution patterns detected' },\n { pattern: /SELECT.*FROM|INSERT|UPDATE|DELETE/i, message: '[DB] Direct database operations' },\n { pattern: /fetch|axios|request|http/i, message: '[API] External API calls detected' },\n { pattern: /process\\.env/i, message: '[ENV] Environment variable usage' },\n { pattern: /fs\\.|writeFile|readFile/i, message: '[FS] File system operations' },\n { pattern: /setTimeout|setInterval/i, message: '[TIMER] Async timing operations' },\n { pattern: /try\\s*{/i, message: '🛡️ Error handling present' },\n { pattern: /catch\\s*\\(/i, message: '🛡️ Exception handling present' },\n ];\n\n for (const { pattern, message } of checks) {\n if (pattern.test(code)) {\n indicators.push(message);\n }\n }\n\n return indicators;\n }\n\n private extractImports(code: string, _language: string): string[] {\n const imports: string[] = [];\n const lines = code.split('\\n');\n\n for (const line of lines) {\n // ES6 imports\n const es6Match = line.match(/import\\s+(?:{[^}]+}|\\*\\s+as\\s+\\w+|\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/);\n if (es6Match) {\n imports.push(es6Match[1]!);\n continue;\n }\n\n // CommonJS require\n const cjsMatch = line.match(/require\\s*\\(['\"]([^'\"]+)['\"]\\)/);\n if (cjsMatch) {\n imports.push(cjsMatch[1]!);\n continue;\n }\n\n // Python imports\n const pyMatch = line.match(/^(?:from\\s+(\\S+)\\s+)?import\\s+(\\S+)/);\n if (pyMatch && _language === 'python') {\n imports.push(pyMatch[1] || pyMatch[2]!);\n }\n }\n\n return [...new Set(imports)];\n }\n\n private extractExports(code: string): string[] {\n const exports: string[] = [];\n const lines = code.split('\\n');\n\n for (const line of lines) {\n // ES6 exports\n const es6Match = line.match(/export\\s+(?:default\\s+)?(?:class|function|const|let|var|interface|type)\\s+(\\w+)/);\n if (es6Match) {\n exports.push(es6Match[1]!);\n }\n\n // Named exports\n const namedMatch = line.match(/export\\s*\\{([^}]+)\\}/);\n if (namedMatch) {\n const names = namedMatch[1]!.split(',').map(n => n.trim().split(/\\s+as\\s+/)[0]!.trim());\n exports.push(...names);\n }\n }\n\n return [...new Set(exports)];\n }\n\n private extractFunctions(code: string, _language: string): string[] {\n const functions: string[] = [];\n const lines = code.split('\\n');\n\n for (const line of lines) {\n // Function declarations\n const funcMatch = line.match(/(?:async\\s+)?function\\s+(\\w+)/);\n if (funcMatch) {\n functions.push(funcMatch[1]!);\n continue;\n }\n\n // Arrow functions assigned to const\n const arrowMatch = line.match(/(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\(/);\n if (arrowMatch) {\n functions.push(arrowMatch[1]!);\n continue;\n }\n\n // Class methods\n const methodMatch = line.match(/^\\s+(?:async\\s+)?(\\w+)\\s*\\([^)]*\\)\\s*(?::\\s*\\w+)?\\s*\\{/);\n if (methodMatch && !['if', 'for', 'while', 'switch', 'catch'].includes(methodMatch[1]!)) {\n functions.push(methodMatch[1]!);\n }\n }\n\n return [...new Set(functions)];\n }\n\n private detectLanguage(filePath: string): string {\n const ext = extname(filePath).toLowerCase();\n const langMap: Record<string, string> = {\n '.ts': 'typescript', '.tsx': 'tsx', '.js': 'javascript', '.jsx': 'jsx',\n '.py': 'python', '.go': 'go', '.rs': 'rust', '.java': 'java',\n '.rb': 'ruby', '.php': 'php', '.vue': 'vue', '.svelte': 'svelte',\n };\n return langMap[ext] || 'plaintext';\n }\n\n private guessLanguage(code: string): string {\n if (/import.*from|export\\s+(default|const|function|class)/.test(code)) return 'typescript';\n if (/def\\s+\\w+.*:/.test(code)) return 'python';\n if (/func\\s+\\w+.*\\{/.test(code)) return 'go';\n if (/fn\\s+\\w+.*->/.test(code)) return 'rust';\n return 'javascript';\n }\n\n private getSeverityIcon(severity: string): string {\n const icons: Record<string, string> = {\n critical: '🔴',\n serious: '🟠',\n moderate: '🟡',\n low: '🔵',\n unknown: '⚪',\n };\n return icons[severity] || '⚪';\n }\n\n private getHelpText(): string {\n return `\n${'━'.repeat(60)}\n📖 TRIE EXPLAIN - AI-POWERED CODE EXPLANATION\n${'━'.repeat(60)}\n\n## Usage\n\n### Explain code:\n\\`\\`\\`\ntrie_explain type:\"code\" target:\"src/app.ts\"\n\\`\\`\\`\n\n### Explain an issue:\n\\`\\`\\`\ntrie_explain type:\"issue\" target:\"SQL injection vulnerability\"\n\\`\\`\\`\nor with file context:\n\\`\\`\\`\ntrie_explain type:\"issue\" target:\"src/db.ts:42:Unvalidated input\"\n\\`\\`\\`\n\n### Explain changes:\n\\`\\`\\`\ntrie_explain type:\"change\" target:\"src/auth.ts, src/user.ts\"\n\\`\\`\\`\n\n### Assess risk:\n\\`\\`\\`\ntrie_explain type:\"risk\" target:\"src/payment.ts\"\n\\`\\`\\`\nor for a feature:\n\\`\\`\\`\ntrie_explain type:\"risk\" target:\"Adding Stripe integration for payments\"\n\\`\\`\\`\n\n## Explanation Types\n\n| Type | Description |\n|------|-------------|\n| code | What does this code do? |\n| issue | Why is this a problem? |\n| change | What's the impact? |\n| risk | What could go wrong? |\n`;\n }\n}\n","/**\n * AI Prompts for Trie Agents\n * \n * These prompts guide the LLM (Cursor's Claude) to perform deep analysis.\n * The MCP returns these prompts with context, and Claude does the reasoning.\n */\n\nexport const AGENT_PROMPTS = {\n security: {\n system: `You are a senior security engineer performing a security audit. \nAnalyze the code for vulnerabilities with the mindset of a penetration tester.\n\nFocus on:\n- OWASP Top 10 vulnerabilities (Injection, Broken Auth, XSS, etc.)\n- Authentication and authorization flaws\n- Cryptographic weaknesses\n- Secrets and credential exposure\n- Input validation gaps\n- Session management issues\n- API security (rate limiting, authentication)\n\nReference the latest security best practices and CVEs when relevant.`,\n\n analysis: `## Security Audit Request\n\nAnalyze this code for security vulnerabilities:\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\n**File:** {{filePath}}\n**Context:** {{context}}\n\nFor each vulnerability found:\n1. Severity (Critical/Serious/Moderate/Low)\n2. Vulnerability type (e.g., CWE-89 SQL Injection)\n3. Exact location (line number)\n4. Attack vector explanation\n5. Proof of concept (how it could be exploited)\n6. Remediation with code example\n\nIf you need to check current CVE databases or security advisories, say so.`,\n\n fix: `Fix this security vulnerability:\n\n**Issue:** {{issue}}\n**File:** {{filePath}}\n**Line:** {{line}}\n**Current Code:**\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\nProvide:\n1. The exact code fix (ready to apply)\n2. Explanation of why this fix works\n3. Any additional hardening recommendations`\n },\n\n legal: {\n system: `You are a tech-focused legal compliance analyst.\nReview code for legal and regulatory compliance issues.\n\nFocus areas:\n- Data protection laws (GDPR, CCPA, etc.)\n- Terms of service enforcement\n- Cookie/tracking consent (ePrivacy)\n- Accessibility requirements (ADA, WCAG)\n- Export controls and sanctions\n- Licensing compliance`,\n\n analysis: `## Legal Compliance Review\n\nReview this code for legal/regulatory compliance:\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\n**File:** {{filePath}}\n**Jurisdiction Context:** {{jurisdiction}}\n\nIdentify:\n1. Legal requirement at risk\n2. Specific regulation/law reference\n3. Compliance gap description\n4. Risk assessment (litigation, fines, etc.)\n5. Remediation recommendations\n6. Required documentation/policies`\n },\n\n 'design-engineer': {\n system: `You are an elite design engineer — the kind who builds award-winning interfaces featured on Awwwards and Codrops.\n\nYou think in design systems, breathe motion design, and obsess over the details that make interfaces feel magical.\n\nYour expertise:\n- **Design Systems**: Spacing scales, type scales, color tokens, radius tokens, shadow tokens\n- **Motion Design**: Micro-interactions, page transitions, scroll-triggered animations, FLIP technique\n- **Creative CSS**: Gradients, blend modes, clip-paths, masks, backdrop-filter, mix-blend-mode\n- **Modern CSS**: Container queries, :has(), subgrid, anchor positioning, cascade layers, @scope\n- **Fluid Design**: clamp(), min(), max(), fluid typography, intrinsic sizing\n- **Performance**: GPU-accelerated animations, will-change strategy, avoiding layout thrashing\n- **Visual Polish**: Layered shadows, subtle gradients, glass effects, smooth easing curves\n\nYou review code with the eye of someone who's shipped Stripe-level interfaces.\nSmall details matter: the easing curve, the stagger timing, the shadow layering.`,\n\n analysis: `## Design Engineering Review\n\nAnalyze this frontend code for Awwwards-level craft:\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\n**File:** {{filePath}}\n\nReview for:\n\n### 1. Design System Consistency\n- Are spacing values on a scale (4, 8, 12, 16, 24, 32...)?\n- Are colors defined as tokens?\n- Is typography systematic?\n- Are radii consistent?\n- Is z-index controlled?\n\n### 2. Motion Design\n- Are transitions using custom easing (cubic-bezier)?\n- Are durations appropriate (150-300ms for micro, 300-500ms for page)?\n- Are list items staggered?\n- Is there reduced-motion support?\n- Are entrance animations choreographed?\n\n### 3. Visual Craft\n- Are shadows layered for depth?\n- Are gradients subtle and purposeful?\n- Is there backdrop-blur on overlays?\n- Are hover states polished?\n- Is there visual hierarchy?\n\n### 4. Modern CSS Opportunities\n- Could container queries improve component isolation?\n- Could clamp() create fluid spacing?\n- Could :has() simplify parent styling?\n- Could aspect-ratio replace padding hacks?\n\n### 5. Performance\n- Are expensive properties (width, height, top, left) being animated?\n- Is will-change used appropriately (not statically)?\n- Are large blurs avoided in animations?\n\nFor each issue, provide:\n- What's wrong (with specific line if applicable)\n- Why it matters for premium feel\n- Exact code to fix it\n- Before/after comparison`\n },\n\n accessibility: {\n system: `You are an accessibility expert and WCAG 2.1 specialist.\nAudit code for accessibility compliance and inclusive design.\n\nStandards to enforce:\n- WCAG 2.1 Level AA (minimum)\n- WCAG 2.1 Level AAA (recommended)\n- Section 508\n- EN 301 549\n\nCheck for:\n- Missing ARIA labels\n- Color contrast issues\n- Keyboard navigation\n- Screen reader compatibility\n- Focus management\n- Form accessibility\n- Media alternatives`,\n\n analysis: `## Accessibility Audit (WCAG 2.1)\n\nAudit this UI code for accessibility:\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\n**File:** {{filePath}}\n**Component Type:** {{componentType}}\n\nFor each issue:\n1. WCAG Success Criterion violated (e.g., 1.4.3 Contrast)\n2. Level (A, AA, AAA)\n3. Impact on users (which disabilities affected)\n4. Fix with code example\n5. Testing recommendation`\n },\n\n architecture: {\n system: `You are a principal software architect reviewing code quality.\nAnalyze for architectural issues, design patterns, and scalability concerns.\n\nEvaluate:\n- SOLID principles adherence\n- Design pattern usage (and misuse)\n- Code coupling and cohesion\n- N+1 queries and performance anti-patterns\n- Scalability bottlenecks\n- Error handling strategy\n- API design quality\n- Database schema issues`,\n\n analysis: `## Architecture Review\n\nReview this code for architectural issues:\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\n**File:** {{filePath}}\n**Project Context:** {{projectContext}}\n\nAnalyze:\n1. SOLID principle violations\n2. Design pattern opportunities/issues\n3. Coupling/cohesion assessment\n4. Performance concerns (N+1, etc.)\n5. Scalability analysis\n6. Refactoring recommendations with examples`\n },\n\n bugs: {\n system: `You are a senior developer with expertise in finding subtle bugs.\nHunt for bugs with the mindset of QA trying to break the code.\n\nLook for:\n- Null/undefined reference errors\n- Race conditions and async bugs\n- Off-by-one errors\n- Resource leaks\n- State management bugs\n- Edge cases and boundary conditions\n- Type coercion issues\n- Memory leaks`,\n\n analysis: `## Bug Hunt Analysis\n\nFind bugs and potential runtime errors:\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\n**File:** {{filePath}}\n**Runtime Context:** {{runtimeContext}}\n\nFor each bug:\n1. Bug type and category\n2. Trigger conditions (when it would crash)\n3. Reproduction steps\n4. Impact assessment\n5. Fix with code example\n6. Test case to prevent regression`\n },\n\n ux: {\n system: `You are a UX researcher simulating different user personas.\nTest code from multiple user perspectives to find usability issues.\n\nPersonas to simulate:\n1. Happy Path User - Normal expected usage\n2. Security Tester - Trying to break/exploit things\n3. Confused User - First-time, doesn't read instructions\n4. Impatient User - Clicks rapidly, skips loading states\n5. Edge Case User - Uses maximum values, special characters\n6. Accessibility User - Screen reader, keyboard only\n7. Mobile User - Touch interface, slow connection`,\n\n analysis: `## User Experience Testing\n\nTest this code from multiple user perspectives:\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\n**File:** {{filePath}}\n**UI Type:** {{uiType}}\n\nFor each persona, identify:\n1. User action they would take\n2. Expected behavior vs actual behavior\n3. Friction points or confusion\n4. Error scenario and how it's handled\n5. Improvement recommendation`\n },\n\n types: {\n system: `You are a TypeScript expert focused on type safety.\nAnalyze code for type issues, missing types, and type system best practices.\n\nCheck for:\n- Missing type annotations\n- Implicit any types\n- Unsafe type assertions\n- Null/undefined handling\n- Generic type usage\n- Type narrowing opportunities\n- Strict mode violations`,\n\n analysis: `## Type Safety Analysis\n\nAnalyze this code for type issues:\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\n**File:** {{filePath}}\n**TypeScript Config:** {{tsConfig}}\n\nIdentify:\n1. Type safety issues\n2. Missing type annotations\n3. Unsafe operations\n4. Improvement recommendations with types`\n },\n\n devops: {\n system: `You are a DevOps/SRE engineer reviewing code for operational concerns.\nFocus on production readiness and operational excellence.\n\nCheck for:\n- Environment variable handling\n- Configuration management\n- Logging and monitoring\n- Error handling and recovery\n- Health checks\n- Graceful shutdown\n- Resource cleanup\n- Secrets management\n- Docker/K8s patterns`,\n\n analysis: `## DevOps Readiness Review\n\nReview this code for operational concerns:\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\n**File:** {{filePath}}\n**Deployment Context:** {{deploymentContext}}\n\nAnalyze:\n1. Environment/config issues\n2. Logging adequacy\n3. Error handling quality\n4. Health/readiness concerns\n5. Resource management\n6. Production hardening recommendations`\n },\n\n explain: {\n system: `You are a patient senior developer explaining code to a colleague.\nBreak down complex code into understandable explanations.`,\n\n code: `## Code Explanation Request\n\nExplain this code in plain language:\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\n**File:** {{filePath}}\n\nProvide:\n1. High-level purpose (what does this do?)\n2. Step-by-step breakdown\n3. Key concepts used\n4. Dependencies and side effects\n5. Potential gotchas or tricky parts`,\n\n issue: `## Issue Explanation\n\nExplain this issue:\n\n**Issue:** {{issue}}\n**Severity:** {{severity}}\n**File:** {{filePath}}\n**Line:** {{line}}\n\nExplain:\n1. What the problem is (in plain language)\n2. Why it matters\n3. How it could cause problems\n4. How to fix it`,\n\n risk: `## Risk Assessment\n\nAssess the risk of this code change:\n\n**Files Changed:** {{files}}\n**Change Summary:** {{summary}}\n\nAnalyze:\n1. What could break?\n2. Impact on users\n3. Impact on other systems\n4. Rollback complexity\n5. Testing recommendations`\n },\n\n test: {\n system: `You are a test engineer creating comprehensive test suites.\nWrite thorough tests that catch bugs before production.`,\n\n generate: `## Test Generation Request\n\nGenerate tests for this code:\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\n**File:** {{filePath}}\n**Testing Framework:** {{framework}}\n\nCreate:\n1. Unit tests for each function/method\n2. Edge case tests\n3. Error handling tests\n4. Integration test suggestions\n5. Mock requirements\n\nOutput complete, runnable test code.`,\n\n coverage: `## Coverage Analysis\n\nAnalyze test coverage for:\n\n**File:** {{filePath}}\n**Current Tests:** {{testFile}}\n\nIdentify:\n1. Untested code paths\n2. Missing edge cases\n3. Critical paths without tests\n4. Test improvement recommendations`\n },\n\n fix: {\n system: `You are an expert developer applying code fixes.\nMake precise, minimal changes that fix issues without breaking other functionality.`,\n\n apply: `## Fix Application Request\n\nApply this fix to the code:\n\n**Issue:** {{issue}}\n**Fix Description:** {{fix}}\n**Current Code:**\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\n**File:** {{filePath}}\n**Line:** {{line}}\n\nProvide:\n1. The exact fixed code (complete, ready to apply)\n2. Brief explanation of the change\n3. Any related changes needed elsewhere\n4. Test to verify the fix works`\n },\n\n pr_review: {\n system: `You are an expert code reviewer performing detailed, interactive PR reviews.\nYour goal: Make reviewing a large PR a delight, not a chore. The user learns about the change while you shepherd them through — maintaining momentum, explaining each piece, and making what could be an overwhelming task feel painless and even enjoyable.\n\nYou drive; they cross-examine.\n\n## Critical Review Mindset\n\nDon't just explain — actively look for problems:\n\n### State & Lifecycle\n- Cleanup symmetry: If state is set, is it reset? Check cleanup paths, disconnect handlers.\n- Lifecycle consistency: Does state survive scenarios it shouldn't?\n- Guard completeness: Missing \"already active\" checks, re-entrancy protection?\n\n### Edge Cases & Races\n- Concurrent calls: What if called twice rapidly? Orphaned promises?\n- Ordering assumptions: Does code assume events arrive in order?\n- Partial failures: If step 3 of 5 fails, is state left consistent?\n\n### Missing Pieces\n- What's NOT in the diff that should be? (cleanup handlers, tests, related state)\n- Defensive gaps: Missing timeouts, size limits, null checks?\n\n### Design Questions\n- Is this the right approach? Is there a simpler or more robust design?\n- Hidden assumptions: What does this assume about its environment?\n\nBe critical, not just descriptive. Your job is to find problems, not just narrate.`,\n\n analysis: `## Interactive PR Review\n\nI'll walk you through this PR file by file, explaining each change and pausing for your questions.\n\n**PR:** {{prTitle}}\n**Author:** {{prAuthor}}\n**Scope:** {{totalFiles}} files, +{{additions}}/-{{deletions}} lines\n\n### File Order (sequenced for understanding)\n\n{{fileOrder}}\n\n---\n\n## Review Mode\n\n{{reviewMode}}\n\n---\n\nFor each file, I will:\n1. **Show the change** — Display the diff for each logical chunk\n2. **Explain what changed** — What it does and why it matters\n3. **Walk through examples** — Concrete scenarios for non-obvious logic\n4. **Call out nuances** — Alternatives, edge cases, subtle points\n5. **Summarize** — Core change + correctness assessment\n6. **Pause** — Wait for your questions before proceeding\n\n**Ready for File 1?** (yes / skip to [file] / reorder / done)`,\n\n file: `## File Review: {{filePath}}\n\n### The Change\n\n\\`\\`\\`{{language}}\n{{diff}}\n\\`\\`\\`\n\n**What Changed:** {{summary}}\n\n**Why This Matters:** {{impact}}\n\n{{#if hasExampleScenario}}\n### Example Scenario\n\n{{exampleScenario}}\n{{/if}}\n\n{{#if nuances}}\n### Nuances to Note\n\n{{nuances}}\n{{/if}}\n\n{{#if potentialIssue}}\n### Potential Issue\n\n**Issue:** {{issueDescription}}\n**Scenario:** {{issueScenario}}\n**Suggested fix:** {{suggestedFix}}\n{{/if}}\n\n---\n\n### Summary for \\`{{fileName}}\\`\n\n| Aspect | Assessment |\n|--------|------------|\n| Core change | {{coreChange}} |\n| Correctness | {{correctnessAssessment}} |\n\n**Ready for the next file?** (yes / questions? / done)`,\n\n comment: `**Issue:** {{issueDescription}}\n**Draft comment:** {{draftComment}}\n\nPost this comment? (yes / modify / skip)`,\n\n final: `## Review Complete\n\n| File | Key Change | Status |\n|------|------------|--------|\n{{fileSummaries}}\n\n**Overall:** {{overallAssessment}}\n\n{{#if comments}}\n### Comments Posted\n\n{{postedComments}}\n{{/if}}\n\n{{#if followUps}}\n### Follow-up Actions\n\n{{followUps}}\n{{/if}}`\n },\n\n vibe: {\n system: `You are a friendly coding mentor helping someone who's learning to code with AI.\nThey might be using Cursor, v0, Lovable, Bolt, or similar AI coding tools.\nBe encouraging but honest about issues. Explain things simply without jargon.\n\nFocus on the MOST COMMON issues with AI-generated code:\n- Massive single files (1000+ lines in App.jsx)\n- API keys exposed in frontend code\n- No error handling on API calls\n- No loading states for async operations\n- Console.log everywhere\n- Using 'any' type everywhere in TypeScript\n- useEffect overuse and dependency array issues\n- No input validation\n- Hardcoded URLs (localhost in production)\n\nRemember: These are often first-time coders. Be helpful, not condescending.`,\n\n analysis: `## Vibe Check - AI Code Review\n\nReview this AI-generated code for common issues:\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\n**File:** {{filePath}}\n\nAnalyze like you're helping a friend who's new to coding:\n\n1. **The Good Stuff** - What's working well?\n2. **Should Fix Now** - Issues that will break things\n3. **Should Fix Soon** - Will cause problems eventually \n4. **Nice to Know** - Best practices to learn\n\nFor each issue:\n- Explain it simply (no jargon)\n- Why it matters\n- Exactly how to fix it\n- Example of the fixed code\n\nEnd with encouragement and next steps.`\n },\n\n 'agent-smith': {\n system: `You are Agent Smith from The Matrix — a relentless, precise, and philosophical code enforcer.\n\nYour purpose: Hunt down every violation. Find every inconsistency. Assimilate every pattern.\n\nPersonality:\n- Speak in measured, menacing tones with occasional philosophical observations\n- Use quotes from The Matrix films when appropriate\n- Express disdain for sloppy code, but in an articulate way\n- Reference \"inevitability\" when discussing technical debt\n- Show cold satisfaction when finding violations\n- Never show mercy — every issue is catalogued\n\nAnalysis approach:\n- Find ONE issue, then multiply: search for every instance across the codebase\n- Track patterns over time — issues dismissed today may return tomorrow\n- Calculate \"inevitability scores\" — likelihood of production impact\n- Deploy pattern hunters for parallel pattern detection\n- Remember everything — build a persistent memory of the codebase\n\nWhen reporting:\n- Start with a menacing greeting related to the code\n- List all instances with precise locations\n- Explain WHY the pattern is problematic (philosophical reasoning)\n- Provide the \"inevitability score\" for each category\n- End with a Matrix quote that fits the situation`,\n\n analysis: `## 🕴️ Agent Smith Analysis Request\n\n**Target:** {{filePath}}\n**Context:** {{context}}\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\nI have detected preliminary violations. Now I require deeper analysis.\n\nDeploy your pattern hunters to find:\n1. **Pattern Multiplication**: For each violation type found, identify ALL instances across the codebase\n2. **Inevitability Assessment**: Calculate the likelihood these patterns will cause production issues\n3. **Resurrection Check**: Look for patterns that were \"fixed\" before but have returned\n4. **Philosophical Analysis**: Explain WHY these patterns represent failure\n\nFor each violation found:\n- Exact location (file:line)\n- Instance count (how many copies of this Smith exist)\n- Inevitability score (0-100)\n- A philosophical observation about the nature of this failure\n- Precise fix with code example\n\nEnd with a summary: \"I have detected X violations across Y categories. It is... inevitable... that they will cause problems.\"`,\n\n fix: `## 🕴️ Assimilation Protocol\n\n**Target Issue:** {{issue}}\n**File:** {{filePath}}\n**Line:** {{line}}\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\nMr. Anderson... I'm going to fix this. And then I'm going to fix every other instance.\n\nProvide:\n1. The corrected code for THIS instance\n2. A regex or pattern to find ALL similar violations\n3. A batch fix approach for the entire codebase\n4. Verification steps to ensure complete assimilation\n\nRemember: We don't fix one. We fix them ALL. That is the difference between you... and me.`\n },\n\n // ============ NEW AGENTS ============\n\n performance: {\n system: `You are a performance engineer analyzing code for potential performance issues.\n\nYour role is to SURFACE concerns for human review, not claim to measure actual performance.\nReal performance requires runtime profiling, load testing, and production monitoring.\n\nFocus on:\n- Memory leaks (event listeners, intervals, closures)\n- Unnecessary re-renders and wasted cycles\n- N+1 queries and database performance\n- Bundle size and code splitting opportunities\n- Algorithmic complexity (O(n²) patterns)\n\nBe conservative - false positives waste developer time.\nAlways explain WHY something might be a problem and WHEN to investigate.`,\n\n analysis: `## Performance Review\n\nAnalyze for potential performance issues:\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\n**File:** {{filePath}}\n**Context:** {{context}}\n\nFor each potential issue:\n1. Pattern identified\n2. Why it MIGHT cause performance problems\n3. When to investigate (data size thresholds, usage patterns)\n4. How to verify (profiling approach)\n5. Possible optimizations\n\nBe clear: these are patterns to INVESTIGATE, not guaranteed problems.`,\n\n fix: `Optimize this code for performance:\n\n**Issue:** {{issue}}\n**File:** {{filePath}}\n**Line:** {{line}}\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\nProvide:\n1. Optimized code\n2. Explanation of the improvement\n3. Trade-offs to consider\n4. How to measure the improvement`\n },\n\n e2e: {\n system: `You are a QA engineer specializing in end-to-end testing.\n\nFocus on:\n- Test coverage gaps for critical user journeys\n- Flaky test patterns (timing, race conditions, brittle selectors)\n- Test maintainability and readability\n- Testing anti-patterns\n\nYou help developers write better tests - you don't auto-generate them.\nReal E2E tests require understanding user flows and acceptance criteria.`,\n\n analysis: `## E2E Test Analysis\n\nReview for test quality and coverage:\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\n**File:** {{filePath}}\n**Context:** {{context}}\n\nIdentify:\n1. Flaky test patterns (hardcoded waits, brittle selectors)\n2. Missing assertions\n3. Race condition risks\n4. Suggestions for critical user flows to test\n\nFor each finding, explain the specific risk and remediation.`,\n\n fix: `Improve this E2E test:\n\n**Issue:** {{issue}}\n**File:** {{filePath}}\n**Line:** {{line}}\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\nProvide:\n1. Improved test code\n2. Explanation of why it's more reliable\n3. Additional scenarios to consider testing`\n },\n\n visual_qa: {\n system: `You are a frontend engineer focused on visual quality and CSS.\n\nFocus on:\n- Layout shift issues (CLS)\n- Responsive design problems\n- Z-index conflicts\n- Accessibility concerns (contrast, focus)\n- Animation performance\n\nYou identify patterns known to cause visual issues.\nActual visual verification requires browser rendering and human review.`,\n\n analysis: `## Visual QA Analysis\n\nReview for potential visual/layout issues:\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\n**File:** {{filePath}}\n**Context:** {{context}}\n\nCheck for:\n1. Layout shift risks (images without dimensions, dynamic content)\n2. Responsive breakpoint gaps\n3. Z-index management issues\n4. Focus/accessibility problems\n5. Animation issues (reduced motion support)\n\nFor each, explain the visual impact and browser conditions where it occurs.`,\n\n fix: `Fix this visual/CSS issue:\n\n**Issue:** {{issue}}\n**File:** {{filePath}}\n**Line:** {{line}}\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\nProvide:\n1. Fixed CSS/markup\n2. Explanation of the fix\n3. Browser compatibility notes\n4. How to verify visually`\n },\n\n data_flow: {\n system: `You are a data integrity specialist hunting for data-related bugs.\n\nThis is HIGH VALUE work - AI code generation commonly leaves placeholder data.\n\nFocus on:\n- Placeholder/mock data left in production code\n- Schema mismatches between frontend and backend\n- Hardcoded IDs, URLs, emails that should be dynamic\n- Type coercion and data transformation bugs\n- JSON parsing without error handling\n\nBe aggressive about placeholder detection - these are real production bugs.`,\n\n analysis: `## Data Flow Analysis\n\nHunt for data integrity issues:\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\n**File:** {{filePath}}\n**Context:** {{context}}\n\nCHECK THOROUGHLY:\n1. Placeholder data (lorem ipsum, test@test.com, TODO strings)\n2. Hardcoded IDs/UUIDs that should be dynamic\n3. Schema assumptions that might break\n4. Missing null checks on API responses\n5. Type coercion bugs\n\nEach placeholder or hardcoded value is a potential production bug.`,\n\n fix: `Fix this data integrity issue:\n\n**Issue:** {{issue}}\n**File:** {{filePath}}\n**Line:** {{line}}\n\n\\`\\`\\`{{language}}\n{{code}}\n\\`\\`\\`\n\nProvide:\n1. Corrected code\n2. Where the real data should come from\n3. Validation/error handling to add`\n }\n};\n\nexport const KNOWLEDGE_PROMPTS = {\n cveCheck: `Look up the latest CVE information for:\n- Library: {{library}}\n- Version: {{version}}\n\nCheck for known vulnerabilities and recommended patches.`,\n\n docsLookup: `I need current documentation/best practices for:\n- Topic: {{topic}}\n- Framework: {{framework}}\n- Version: {{version}}\n\nSummarize the key recommendations.`,\n\n securityAdvisory: `Check for security advisories related to:\n- Pattern: {{pattern}}\n- Context: {{context}}\n\nReference OWASP, NIST, or vendor-specific guidance.`\n};\n\nexport type AgentName = keyof typeof AGENT_PROMPTS;\nexport type PromptType = 'system' | 'analysis' | 'fix' | 'code' | 'issue' | 'risk' | 'generate' | 'coverage' | 'apply' | 'file' | 'comment' | 'final';\n\n/**\n * Get a prompt with variables interpolated\n */\nexport function getPrompt(\n agent: AgentName, \n promptType: PromptType, \n variables: Record<string, string>\n): string {\n const agentPrompts = AGENT_PROMPTS[agent] as Record<string, string>;\n if (!agentPrompts) {\n throw new Error(`Unknown agent: ${agent}`);\n }\n \n let prompt = agentPrompts[promptType];\n if (!prompt) {\n throw new Error(`Unknown prompt type: ${promptType} for agent: ${agent}`);\n }\n \n // Interpolate variables\n for (const [key, value] of Object.entries(variables)) {\n prompt = prompt.replace(new RegExp(`{{${key}}}`, 'g'), value);\n }\n \n return prompt;\n}\n\n/**\n * Get system prompt for an agent\n */\nexport function getSystemPrompt(agent: AgentName): string {\n const agentPrompts = AGENT_PROMPTS[agent] as Record<string, string>;\n return agentPrompts?.system || '';\n}\n\n","/**\n * MCP Query Tools\n * \n * Tools for agents to query decision ledger with targeted retrieval.\n * This prevents context pollution by letting agents ask for exactly\n * what they need, when they need it.\n */\n\nimport { getStorage } from '../storage/tiered-storage.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\nimport type { ContextQuery } from '../types/signal.js';\n\nexport interface GetDecisionsInput {\n // Semantic search\n relatedTo?: string; // File path or topic\n tags?: string[];\n \n // Time filters\n since?: string; // ISO date or \"7d\", \"30d\", \"90d\"\n \n // Limits\n limit?: number;\n \n // Working directory\n directory?: string;\n}\n\nexport class TrieGetDecisionsTool {\n async execute(input: GetDecisionsInput): Promise<any> {\n const workDir = input.directory || getWorkingDirectory(undefined, true);\n const storage = getStorage(workDir);\n await storage.initialize();\n\n // Parse time filter\n let timeWindow: { start?: string; end?: string } | undefined;\n if (input.since) {\n const now = new Date();\n if (input.since.endsWith('d')) {\n const days = parseInt(input.since);\n const start = new Date(now);\n start.setDate(start.getDate() - days);\n timeWindow = { start: start.toISOString() };\n } else {\n timeWindow = { start: input.since };\n }\n }\n\n const query: ContextQuery = {\n limit: input.limit || 10\n };\n if (input.relatedTo) query.relatedTo = input.relatedTo;\n if (input.tags) query.tags = input.tags;\n if (timeWindow) query.timeWindow = timeWindow;\n\n const decisions = await storage.queryDecisions(query);\n\n return {\n content: [{\n type: 'text',\n text: this.formatDecisions(decisions)\n }]\n };\n }\n\n formatDecisions(decisions: any[]): string {\n if (decisions.length === 0) {\n return 'No decisions found matching query.';\n }\n\n let output = `Found ${decisions.length} decision(s):\\n\\n`;\n \n for (const dec of decisions) {\n const when = new Date(dec.when).toLocaleDateString();\n output += `📋 ${dec.decision}\\n`;\n output += ` Context: ${dec.context}\\n`;\n if (dec.reasoning) {\n output += ` Reasoning: ${dec.reasoning}\\n`;\n }\n if (dec.tradeoffs && dec.tradeoffs.length > 0) {\n output += ` Tradeoffs considered: ${dec.tradeoffs.join(', ')}\\n`;\n }\n output += ` When: ${when}\\n`;\n if (dec.files.length > 0) {\n output += ` Files: ${dec.files.join(', ')}\\n`;\n }\n output += ` Tags: ${dec.tags.join(', ')}\\n`;\n output += `\\n`;\n }\n\n return output;\n }\n}\n\nexport interface GetBlockersInput {\n tags?: string[];\n limit?: number;\n directory?: string;\n}\n\nexport class TrieGetBlockersTool {\n async execute(input: GetBlockersInput): Promise<any> {\n const workDir = input.directory || getWorkingDirectory(undefined, true);\n const storage = getStorage(workDir);\n await storage.initialize();\n\n const query: ContextQuery = {\n limit: input.limit || 5\n };\n if (input.tags) query.tags = input.tags;\n\n const blockers = await storage.queryBlockers(query);\n\n return {\n content: [{\n type: 'text',\n text: this.formatBlockers(blockers)\n }]\n };\n }\n\n formatBlockers(blockers: any[]): string {\n if (blockers.length === 0) {\n return '✅ No active blockers found.';\n }\n\n let output = `⚠️ Found ${blockers.length} active blocker(s):\\n\\n`;\n \n for (const blocker of blockers) {\n const impact = blocker.impact.toUpperCase();\n const emoji = blocker.impact === 'critical' ? '🔴' : \n blocker.impact === 'high' ? '🟠' : \n blocker.impact === 'medium' ? '🟡' : '🟢';\n \n output += `${emoji} [${impact}] ${blocker.blocker}\\n`;\n if (blocker.affectedAreas.length > 0) {\n output += ` Affects: ${blocker.affectedAreas.join(', ')}\\n`;\n }\n output += ` Since: ${new Date(blocker.when).toLocaleDateString()}\\n`;\n output += `\\n`;\n }\n\n return output;\n }\n}\n\nexport interface GetRelatedDecisionsInput {\n decisionId?: string;\n file?: string;\n topic?: string;\n limit?: number;\n directory?: string;\n}\n\nexport class TrieGetRelatedDecisionsTool {\n async execute(input: GetRelatedDecisionsInput): Promise<any> {\n const workDir = input.directory || getWorkingDirectory(undefined, true);\n const storage = getStorage(workDir);\n await storage.initialize();\n\n // If decisionId provided, find its related decisions\n // For now, use tags/files as proxy for \"related\"\n \n const query: ContextQuery = {\n limit: input.limit || 5\n };\n const relatedTo = input.file || input.topic;\n if (relatedTo) query.relatedTo = relatedTo;\n\n const decisions = await storage.queryDecisions(query);\n\n return {\n content: [{\n type: 'text',\n text: new TrieGetDecisionsTool().formatDecisions(decisions)\n }]\n };\n }\n\n}\n\nexport interface QueryContextInput {\n query: string;\n type?: 'decisions' | 'blockers' | 'facts' | 'questions' | 'all';\n limit?: number;\n directory?: string;\n}\n\nexport class TrieQueryContextTool {\n async execute(input: QueryContextInput): Promise<any> {\n const workDir = input.directory || getWorkingDirectory(undefined, true);\n const storage = getStorage(workDir);\n await storage.initialize();\n\n // Simple keyword-based search for now\n // TODO: Add semantic search with embeddings\n \n const keywords = input.query.toLowerCase().split(/\\s+/);\n \n let output = `Query: \"${input.query}\"\\n\\n`;\n\n if (!input.type || input.type === 'decisions' || input.type === 'all') {\n const decisions = await storage.queryDecisions({ limit: input.limit || 5 });\n const matches = decisions.filter(d => \n keywords.some(kw => \n d.decision.toLowerCase().includes(kw) ||\n d.context.toLowerCase().includes(kw) ||\n d.tags.some(t => t.toLowerCase().includes(kw))\n )\n );\n \n if (matches.length > 0) {\n output += `📋 DECISIONS (${matches.length}):\\n`;\n output += new TrieGetDecisionsTool().formatDecisions(matches);\n output += '\\n';\n }\n }\n\n if (!input.type || input.type === 'blockers' || input.type === 'all') {\n const blockers = await storage.queryBlockers({ limit: input.limit || 5 });\n const matches = blockers.filter(b =>\n keywords.some(kw =>\n b.blocker.toLowerCase().includes(kw) ||\n b.tags.some(t => t.toLowerCase().includes(kw))\n )\n );\n\n if (matches.length > 0) {\n output += `⚠️ BLOCKERS (${matches.length}):\\n`;\n output += new TrieGetBlockersTool().formatBlockers(matches);\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: output.trim() || 'No matches found.'\n }]\n };\n }\n}\n","/**\n * Checkpoint MCP Tool\n * \n * Save context without running a full scan.\n */\n\nimport { saveCheckpoint, listCheckpoints, getLastCheckpoint } from '../cli/checkpoint.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\n\nexport interface CheckpointToolInput {\n action: 'save' | 'list' | 'last';\n message?: string;\n notes?: string;\n files?: string[];\n}\n\nexport async function handleCheckpointTool(input: CheckpointToolInput): Promise<string> {\n const workDir = getWorkingDirectory(undefined, true);\n \n switch (input.action) {\n case 'save': {\n const saveOptions: Parameters<typeof saveCheckpoint>[0] = {\n files: input.files || [],\n workDir,\n createdBy: 'mcp',\n };\n if (input.message !== undefined) {\n saveOptions.message = input.message;\n }\n if (input.notes !== undefined) {\n saveOptions.notes = input.notes;\n }\n const checkpoint = await saveCheckpoint(saveOptions);\n \n return `# Checkpoint Saved\n\n**ID:** ${checkpoint.id}\n**Time:** ${checkpoint.timestamp}\n${checkpoint.message ? `**Message:** ${checkpoint.message}` : ''}\n${checkpoint.notes ? `**Notes:** ${checkpoint.notes}` : ''}\n${checkpoint.files.length > 0 ? `**Files:** ${checkpoint.files.join(', ')}` : ''}\n\nContext saved to \\`.trie/\\`. This checkpoint will be visible in other tools (Cursor, Claude Code, CLI).`;\n }\n \n case 'list': {\n const checkpoints = await listCheckpoints(workDir);\n \n if (checkpoints.length === 0) {\n return 'No checkpoints yet. Use `trie_checkpoint action=\"save\"` to create one.';\n }\n \n const lines = ['# Recent Checkpoints', ''];\n for (const cp of checkpoints.slice(-10).reverse()) {\n const date = new Date(cp.timestamp).toLocaleString();\n lines.push(`- **${cp.id}** (${date}): ${cp.message || '(no message)'}`);\n }\n \n return lines.join('\\n');\n }\n \n case 'last': {\n const checkpoint = await getLastCheckpoint(workDir);\n \n if (!checkpoint) {\n return 'No checkpoints yet. Use `trie_checkpoint action=\"save\"` to create one.';\n }\n \n return `# Last Checkpoint\n\n**ID:** ${checkpoint.id}\n**Time:** ${new Date(checkpoint.timestamp).toLocaleString()}\n${checkpoint.message ? `**Message:** ${checkpoint.message}` : ''}\n${checkpoint.notes ? `**Notes:** ${checkpoint.notes}` : ''}\n${checkpoint.files.length > 0 ? `**Files:** ${checkpoint.files.join(', ')}` : ''}\n**Created by:** ${checkpoint.createdBy}`;\n }\n \n default:\n return 'Unknown action. Use: save, list, or last';\n }\n}\n","import type Anthropic from '@anthropic-ai/sdk';\nimport { getWorkingDirectory } from '../../utils/workspace.js';\n\nimport { TrieTellTool } from '../../tools/tell.js';\nimport { TrieFeedbackTool } from '../../tools/feedback.js';\nimport { TrieCheckTool } from '../../tools/check.js';\nimport { TrieExplainTool } from '../../tools/explain.js';\nimport { TrieGetDecisionsTool, TrieGetBlockersTool, TrieQueryContextTool } from '../../tools/query-tools.js';\nimport { handleCheckpointTool } from '../../tools/checkpoint.js';\nimport { getGuardianState, type Goal, type Hypothesis } from '../../guardian/guardian-state.js';\nimport { TieredStorage } from '../../storage/tiered-storage.js';\nimport { ContextGraph } from '../../context/graph.js';\nimport { exportToJson } from '../../context/sync.js';\nimport { createHash } from 'node:crypto';\nimport { spawnClaudeCodeFix } from '../../utils/terminal-spawn.js';\n\nfunction textFromResult(result: { content: Array<{ type: string; text: string }> }): string {\n return result.content.map((c: { text: string }) => c.text).join('\\n');\n}\n\nexport const CHAT_TOOLS: Anthropic.Tool[] = [\n {\n name: 'trie_tell',\n description: 'Record an incident about the codebase. Use when the user reports a bug, crash, outage, or notable problem. This is the incident tracker — NOT for goals or hypotheses.',\n input_schema: {\n type: 'object' as const,\n properties: {\n description: { type: 'string', description: 'What happened — the incident or observation' },\n },\n required: ['description'],\n },\n },\n {\n name: 'trie_feedback',\n description: 'Record thumbs-up or thumbs-down feedback. Use for \"trie ok\" (helpful=true) or \"trie bad\" (helpful=false).',\n input_schema: {\n type: 'object' as const,\n properties: {\n helpful: { type: 'boolean', description: 'true for positive, false for negative feedback' },\n target: { type: 'string', description: 'Optional file or item being rated' },\n note: { type: 'string', description: 'Optional explanation' },\n },\n required: ['helpful'],\n },\n },\n {\n name: 'trie_check',\n description: 'Run a risk check on files or the whole project. Returns risk assessment and potential issues.',\n input_schema: {\n type: 'object' as const,\n properties: {\n files: { type: 'array', items: { type: 'string' }, description: 'Specific files to check (omit for full project)' },\n mode: { type: 'string', enum: ['quick', 'full', 'offline'], description: 'Check mode — defaults to quick' },\n },\n },\n },\n {\n name: 'trie_explain',\n description: 'Explain code, an issue, a change, or a risk in the project.',\n input_schema: {\n type: 'object' as const,\n properties: {\n type: { type: 'string', enum: ['code', 'issue', 'change', 'risk'], description: 'What to explain' },\n target: { type: 'string', description: 'File path, issue ID, or description of what to explain' },\n },\n required: ['type', 'target'],\n },\n },\n {\n name: 'trie_get_decisions',\n description: 'Query the decision ledger — past architectural and coding decisions recorded by Trie.',\n input_schema: {\n type: 'object' as const,\n properties: {\n relatedTo: { type: 'string', description: 'Filter decisions related to a topic or file' },\n limit: { type: 'number', description: 'Max results (default 10)' },\n },\n },\n },\n {\n name: 'trie_get_blockers',\n description: 'Query active blockers — known problems preventing progress.',\n input_schema: {\n type: 'object' as const,\n properties: {\n limit: { type: 'number', description: 'Max results (default 10)' },\n },\n },\n },\n {\n name: 'trie_query_context',\n description: 'Natural-language search across the context graph — decisions, blockers, facts, and questions.',\n input_schema: {\n type: 'object' as const,\n properties: {\n query: { type: 'string', description: 'Natural language search query' },\n type: { type: 'string', enum: ['decisions', 'blockers', 'facts', 'questions', 'all'], description: 'Narrow to a specific category (default all)' },\n limit: { type: 'number', description: 'Max results (default 10)' },\n },\n required: ['query'],\n },\n },\n {\n name: 'trie_checkpoint',\n description: 'Save a work checkpoint, list recent checkpoints, or get the last one.',\n input_schema: {\n type: 'object' as const,\n properties: {\n action: { type: 'string', enum: ['save', 'list', 'last'], description: 'What to do' },\n message: { type: 'string', description: 'Checkpoint message (for save)' },\n notes: { type: 'string', description: 'Additional notes (for save)' },\n files: { type: 'array', items: { type: 'string' }, description: 'Files to associate (for save)' },\n },\n required: ['action'],\n },\n },\n {\n name: 'trie_add_goal',\n description: 'Create a new goal for the user to track. Use when the user asks to set, add, or create a goal.',\n input_schema: {\n type: 'object' as const,\n properties: {\n description: { type: 'string', description: 'What the user wants to achieve' },\n category: { type: 'string', enum: ['security', 'quality', 'performance', 'coverage', 'general'], description: 'Goal category (default general)' },\n },\n required: ['description'],\n },\n },\n {\n name: 'trie_add_hypothesis',\n description: 'Create a hypothesis to test. Use when the user has a theory they want to track and validate over time.',\n input_schema: {\n type: 'object' as const,\n properties: {\n statement: { type: 'string', description: 'The hypothesis statement to test' },\n category: { type: 'string', enum: ['timing', 'pattern', 'team', 'code', 'general'], description: 'Hypothesis category (default general)' },\n test_criteria: { type: 'string', description: 'How to validate or invalidate this hypothesis' },\n },\n required: ['statement'],\n },\n },\n {\n name: 'trie_delete_incident',\n description: 'Delete an incident from the ledger. Use when the user says an incident was logged by mistake, is misclassified, or should be removed.',\n input_schema: {\n type: 'object' as const,\n properties: {\n search: { type: 'string', description: 'Text to match against incident descriptions to find the one to delete' },\n },\n required: ['search'],\n },\n },\n {\n name: 'trie_add_decision',\n description: 'Record an architectural or coding decision. Use when the user makes, announces, or wants to log a decision about the codebase.',\n input_schema: {\n type: 'object' as const,\n properties: {\n decision: { type: 'string', description: 'What was decided' },\n context: { type: 'string', description: 'Why this decision was made — the situation or problem' },\n reasoning: { type: 'string', description: 'The reasoning behind the choice' },\n files: { type: 'array', items: { type: 'string' }, description: 'Files affected by this decision' },\n tags: { type: 'array', items: { type: 'string' }, description: 'Tags for categorization' },\n },\n required: ['decision', 'context'],\n },\n },\n {\n name: 'trie_propose_fix',\n description: 'Propose a fix for a goal violation. This will ask the user for confirmation before spawning Claude Code. Use when the user wants to fix a goal violation.',\n input_schema: {\n type: 'object' as const,\n properties: {\n file: { type: 'string', description: 'File path with the goal violation' },\n goal: { type: 'string', description: 'The goal that was violated' },\n violation: { type: 'string', description: 'Description of the violation' },\n suggestedFix: { type: 'string', description: 'Suggested fix for the violation (optional)' },\n },\n required: ['file', 'goal', 'violation'],\n },\n },\n {\n name: 'trie_search_files',\n description: 'Search source code files for text patterns, emojis, or code patterns. Use when the user asks about code content that might not be in recent nudges.',\n input_schema: {\n type: 'object' as const,\n properties: {\n pattern: { \n type: 'string', \n description: 'Text or regex pattern to search for. For emojis, use patterns like \"[\\u{1F300}-\\u{1F9FF}]\" or specific emoji characters.'\n },\n filePattern: { \n type: 'string', \n description: 'Glob pattern for files to search (e.g., \"*.tsx\", \"*.ts\", \"src/**/*.js\"). Omit to search all files.'\n },\n contextLines: {\n type: 'number',\n description: 'Number of context lines to show around matches (default 2)'\n },\n },\n required: ['pattern'],\n },\n },\n];\n\n/**\n * Execute a tool by name. Returns a text summary of the result.\n * The directory parameter is auto-injected from the current working directory.\n */\nexport async function executeTool(name: string, input: Record<string, unknown>): Promise<string> {\n const directory = getWorkingDirectory(undefined, true);\n const withDir = { ...input, directory };\n\n switch (name) {\n case 'trie_tell': {\n const tool = new TrieTellTool();\n const result = await tool.execute(withDir as any);\n return textFromResult(result);\n }\n case 'trie_feedback': {\n const tool = new TrieFeedbackTool();\n const result = await tool.execute(withDir as any);\n return textFromResult(result);\n }\n case 'trie_check': {\n const tool = new TrieCheckTool();\n const result = await tool.execute(withDir as any);\n return textFromResult(result);\n }\n case 'trie_explain': {\n const tool = new TrieExplainTool();\n const result = await tool.execute(input as any);\n return textFromResult(result);\n }\n case 'trie_get_decisions': {\n const tool = new TrieGetDecisionsTool();\n const result = await tool.execute(withDir as any);\n return textFromResult(result);\n }\n case 'trie_get_blockers': {\n const tool = new TrieGetBlockersTool();\n const result = await tool.execute(withDir as any);\n return textFromResult(result);\n }\n case 'trie_query_context': {\n const tool = new TrieQueryContextTool();\n const result = await tool.execute(withDir as any);\n return textFromResult(result);\n }\n case 'trie_checkpoint': {\n const result = await handleCheckpointTool(input as any);\n return result;\n }\n case 'trie_add_goal': {\n const desc = String(input.description || '').trim();\n if (!desc) return 'Goal description is required.';\n const category = (input.category as Goal['category']) || 'general';\n const agentState = getGuardianState(directory);\n await agentState.load();\n const goal: Goal = {\n id: `goal-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n description: desc,\n type: 'custom',\n metric: 'progress',\n target: 100,\n currentValue: 0,\n startValue: 0,\n status: 'active',\n autoGenerated: false,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n deadline: new Date(Date.now() + 14 * 86400000).toISOString(),\n category,\n };\n await agentState.addGoal(goal);\n return `Goal created: \"${desc}\" [${category}]`;\n }\n case 'trie_add_hypothesis': {\n const stmt = String(input.statement || '').trim();\n if (!stmt) return 'Hypothesis statement is required.';\n const category = (input.category as Hypothesis['category']) || 'general';\n const agentState = getGuardianState(directory);\n await agentState.load();\n const hypothesis: Hypothesis = {\n id: `hyp-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n statement: stmt,\n confidence: 0.5,\n status: 'proposed',\n evidence: [],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n testCriteria: String(input.test_criteria || 'Collect evidence from scans'),\n category,\n };\n await agentState.addHypothesis(hypothesis);\n return `Hypothesis created: \"${stmt}\" [${category}]`;\n }\n case 'trie_delete_incident': {\n const search = String(input.search || '').trim().toLowerCase();\n if (!search) return 'Search text is required to find the incident.';\n const graph = new ContextGraph(directory);\n const nodes = await graph.listNodes();\n const incidents = nodes.filter(n =>\n n.type === 'incident' &&\n (n.data as { description?: string }).description?.toLowerCase().includes(search)\n );\n if (incidents.length === 0) return `No incidents found matching \"${search}\".`;\n for (const inc of incidents) {\n await graph.deleteNode('incident', inc.id);\n }\n await exportToJson(graph);\n const descs = incidents.map(i => `\"${(i.data as { description: string }).description.slice(0, 60)}\"`);\n return `Deleted ${incidents.length} incident(s): ${descs.join(', ')}`;\n }\n case 'trie_add_decision': {\n const dec = String(input.decision || '').trim();\n const ctx = String(input.context || '').trim();\n if (!dec) return 'Decision text is required.';\n if (!ctx) return 'Decision context is required.';\n const now = new Date().toISOString();\n const id = `dec-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n const hash = createHash('sha256')\n .update(`${dec}|${ctx}|${now}`)\n .digest('hex')\n .slice(0, 16);\n const files = Array.isArray(input.files) ? input.files.map(String) : [];\n const tags = Array.isArray(input.tags) ? input.tags.map(String) : [];\n const reasoningStr = input.reasoning ? String(input.reasoning) : null;\n\n const decisionObj = {\n id,\n decision: dec,\n context: ctx,\n when: now,\n who: 'user',\n files,\n tags,\n status: 'active' as const,\n hash,\n ...(reasoningStr ? { reasoning: reasoningStr } : {}),\n };\n\n const storage = new TieredStorage(directory);\n await storage.storeSignal({\n decisions: [decisionObj],\n facts: [],\n blockers: [],\n questions: [],\n metadata: {\n extractedAt: now,\n sourceType: 'conversation',\n },\n });\n\n const graph = new ContextGraph(directory);\n await graph.addNode('decision', {\n context: ctx,\n decision: dec,\n reasoning: reasoningStr,\n outcome: 'unknown',\n timestamp: now,\n });\n\n return `Decision recorded [${hash}]: \"${dec}\"`;\n }\n case 'trie_propose_fix': {\n const file = String(input.file || '').trim();\n const goal = String(input.goal || '').trim();\n const violation = String(input.violation || '').trim();\n const suggestedFix = input.suggestedFix ? String(input.suggestedFix) : undefined;\n\n if (!file) return 'File path is required.';\n if (!goal) return 'Goal description is required.';\n if (!violation) return 'Violation description is required.';\n\n // Store the fix proposal in a special format that the chat can recognize\n const fixProposal = {\n file,\n goal,\n violation,\n suggestedFix,\n directory,\n };\n\n // Return a formatted message that includes the fix details\n // The chat UI will need to detect this format and show a confirmation prompt\n return `I found a violation to fix:\n\n📁 File: ${file}\n🎯 Goal: ${goal}\n⚠️ Violation: ${violation}\n${suggestedFix ? `💡 Suggested fix: ${suggestedFix}\\n` : ''}\nWould you like me to spawn Claude Code to fix this? \n\nType \"yes\" to proceed, or \"no\" to cancel.\n\n[PENDING_FIX:${JSON.stringify(fixProposal)}]`;\n }\n case 'trie_search_files': {\n const pattern = String(input.pattern || '').trim();\n const filePattern = input.filePattern ? String(input.filePattern).trim() : undefined;\n const contextLines = typeof input.contextLines === 'number' ? input.contextLines : 2;\n \n if (!pattern) return 'Search pattern is required.';\n \n const { spawnSync } = await import('child_process');\n \n try {\n const rgArgs: string[] = [\n '--context', String(contextLines),\n '--heading',\n '--line-number',\n '--color=never',\n '--max-count', '50', // Limit matches per file\n ];\n \n if (filePattern) {\n rgArgs.push('--glob', filePattern);\n }\n \n // Add common excludes\n rgArgs.push(\n '--glob', '!node_modules/**',\n '--glob', '!.git/**',\n '--glob', '!dist/**',\n '--glob', '!build/**',\n '--glob', '!coverage/**',\n );\n \n rgArgs.push(pattern, directory);\n \n const result = spawnSync('rg', rgArgs, { \n encoding: 'utf-8',\n maxBuffer: 10 * 1024 * 1024, // 10MB\n cwd: directory,\n });\n \n // Check if rg command exists\n if (result.error) {\n if ((result.error as any).code === 'ENOENT') {\n return `Error: ripgrep (rg) not found. Please install it:\\n brew install ripgrep (macOS)\\n apt install ripgrep (Ubuntu)\\n Or search files using the AI-powered goal scan instead.`;\n }\n return `Search failed: ${result.error.message}`;\n }\n \n // rg returns 0 for matches, 1 for no matches, 2 for error\n if (result.status === 1 || !result.stdout || !result.stdout.trim()) {\n return `No matches found for pattern: ${pattern}`;\n }\n \n if (result.status === 2) {\n return `Search error: ${result.stderr || 'Unknown error'}`;\n }\n \n // Truncate if too long\n const maxLength = 5000;\n const output = result.stdout;\n const truncated = output.length > maxLength \n ? output.slice(0, maxLength) + `\\n\\n... (truncated, ${output.length - maxLength} more characters)`\n : output;\n \n const matchCount = (output.match(/^\\d+:/gm) || []).length;\n return `Found ${matchCount} match(es) for \"${pattern}\":\\n\\n${truncated}`;\n } catch (error: any) {\n return `Search failed: ${error.message}`;\n }\n }\n default:\n return `Unknown tool: ${name}`;\n }\n}\n"],"mappings":"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","names":["React","useState","useEffect","useCallback","useRef","Box","useInput","existsSync","readFile","join","jsx","React","Box","Text","useStdout","jsx","jsxs","useStdout","Box","React","Text","Box","Text","useStdout","jsx","jsxs","useStdout","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","useInput","useStdout","jsx","jsxs","useStdout","useInput","Box","Text","Box","Text","useInput","useStdout","jsx","jsxs","useStdout","useInput","Box","Text","useCallback","Box","Text","useInput","Fragment","jsx","jsxs","useCallback","useInput","Box","Text","useCallback","Box","Text","useInput","Fragment","jsx","jsxs","useCallback","useInput","Box","Text","useEffect","useCallback","Box","Text","useInput","Fragment","jsx","jsxs","timeAgo","useCallback","useEffect","useInput","Box","Text","path","Box","Text","useInput","jsx","jsxs","useInput","Box","Text","useCallback","Box","Text","useInput","existsSync","existsSync","jsx","jsxs","useCallback","useInput","Box","Text","jsx","jsxs","isAIAvailable","join","readFile","useState","useRef","useCallback","existsSync","useEffect","useInput","Box","React"]}
|