@triedotdev/mcp 1.0.145 → 1.0.146
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.
|
@@ -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/parse-goal-violation.ts","../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/cloud-fix.ts","../src/integrations/cursor-cloud-agent.ts","../src/tools/fix-triage.ts","../src/tools/fix.ts","../src/tools/query-tools.ts","../src/tools/checkpoint.ts","../src/tools/pipeline.ts","../src/tools/github-branches.ts","../src/cli/dashboard/chat-tools.ts","../src/cli/dashboard/views/ChatArchiveView.tsx"],"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';\n\nlet hasLoggedRefocus = false;\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 // Only log in non-interactive mode (avoids appearing below dashboard footer)\n if (!isInteractiveMode() && !hasLoggedRefocus) {\n hasLoggedRefocus = true;\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 }\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: { governance: 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, useStdout } 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 { getTrieAgent } from '../../agent/trie-agent.js';\nimport { getProjectState } from '../../agent/project-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';\nimport { ChatArchiveView } from './views/ChatArchiveView.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('../../agent/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 { stdout } = useStdout();\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 = getTrieAgent(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 = getProjectState(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, startValue: g.startValue, status: g.status, autoGenerated: g.autoGenerated, updatedAt: g.updatedAt, ...(g.achievedAt != null ? { achievedAt: g.achievedAt } : {}), ...(g.achievedBy != null ? { achievedBy: g.achievedBy } : {}), ...(g.category != null ? { category: g.category } : {}) };\n return base;\n }),\n });\n } catch { /* ignore */ }\n }, []);\n\n const refreshHypotheses = useCallback(async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getProjectState(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, ...(h.autoGenerated != null ? { autoGenerated: h.autoGenerated } : {}), ...(h.validatedBy != null ? { validatedBy: h.validatedBy } : {}), ...(h.category != null ? { category: h.category } : {}) };\n return base;\n }),\n });\n } catch { /* ignore */ }\n }, []);\n\n const loadPersistedNudges = useCallback(async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const { getStorage } = await import('../../storage/tiered-storage.js');\n const storage = getStorage(workDir);\n await storage.initialize();\n const nudges = await storage.queryNudges({ resolved: false, limit: 50 });\n if (nudges.length === 0) return;\n const insights: import('../../agent/trie-agent.js').Insight[] = nudges.map(n => ({\n id: n.id,\n type: (n.severity === 'critical' || n.severity === 'warning' ? 'warning' : 'observation') as 'warning' | 'observation',\n message: n.message,\n suggestedAction: n.suggestedAction ?? (n.file ? `Review ${n.file}` : undefined),\n relatedIssues: Array.isArray(n.relatedIssues) ? n.relatedIssues.map(String) : [],\n priority: n.priority ?? (n.severity === 'critical' ? 9 : 6),\n timestamp: typeof n.timestamp === 'string' ? new Date(n.timestamp).getTime() : n.timestamp,\n dismissed: n.dismissed ?? false,\n category: (n.category as 'quality' | 'security' | 'general') || 'quality',\n }));\n dispatchRef.current({ type: 'ADD_INSIGHTS', insights });\n } catch { /* ignore */ }\n }, []);\n\n useEffect(() => {\n void loadConfig();\n void refreshGoals();\n void refreshHypotheses();\n // Load persisted nudges/insights on startup (otherwise they only appear after first scan)\n void processInsights([]);\n void loadPersistedNudges();\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 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 // Detect if this is a goal violation for higher priority\n const isGoalViolation = nudge.message.includes('Goal \"') || nudge.message.includes('violated');\n\n const insight: import('../../agent/trie-agent.js').Insight = {\n id: `nudge-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,\n type: 'warning',\n category: isGoalViolation ? 'quality' : 'general',\n message: nudge.message,\n priority: isGoalViolation ? 8 : (nudge.severity === 'critical' ? 9 : 6), // Goal violations get priority 8\n timestamp: Date.now(),\n suggestedAction: nudge.file ? `Review ${nudge.file}` : undefined,\n relatedIssues: [],\n dismissed: false,\n };\n\n dispatchRef.current({ type: 'ADD_INSIGHTS', insights: [insight] });\n\n // For goal violations, also force a longer-lasting notification\n if (isGoalViolation) {\n // Extend auto-hide time for goal violations to 15 seconds\n const extendedAction = { ...action };\n if (!extendedAction.autoHideMs || extendedAction.autoHideMs < 15000) {\n (extendedAction as any).autoHideMs = 15000;\n }\n dispatchRef.current(extendedAction);\n }\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, loadPersistedNudges]);\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 applyGoalFix(fix, dispatchRef.current).catch((error) => {\n dispatchRef.current({ type: 'DISMISS_FIX', id: fix.id });\n getOutputManager().nudge(`Fix failed for ${fix.file}: ${error instanceof Error ? error.message : 'unknown error'}`, 'warning');\n });\n }\n }, [state.pendingFixes]);\n\n useInput((input, key) => {\n // Config dialog handles its own input (including Escape to close) - don't let App process it\n if (showConfig) return;\n\n // When confirming a ledger block deletion, let MemoryTreeView handle all input (y/Enter/n/Esc)\n if (state.memoryTree.pendingLedgerDelete) return;\n\n // Quit: q, Q, or Escape - always available (except when typing in add mode or chat)\n const inAddMode = (state.view === 'goals' && state.goalsPanel.inputMode === 'add') ||\n (state.view === 'hypotheses' && state.hypothesesPanel.inputMode === 'add');\n const inChat = state.view === 'chat';\n const scanningGoal = !!state.goalsPanel.scanningGoalId;\n const scanningHypothesis = !!state.hypothesesPanel.scanningHypothesisId;\n\n // Don't allow Escape to quit when in chat (chat view handles it), add mode, or scanning\n if (!inAddMode && !inChat && !scanningGoal && !scanningHypothesis && (input === 'q' || input === 'Q' || key.escape)) {\n exit();\n return;\n }\n \n // Allow 'q' and 'Q' to quit even in chat (but not Escape - chat uses that)\n if (inChat && !key.escape && (input === 'q' || input === 'Q')) {\n exit();\n return;\n }\n if (inAddMode) 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 at the global level (q/esc handled above)\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 return;\n }\n return;\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' || state.view === 'chat-archive' || state.view === 'memory' || state.view === 'agent') {\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 (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 case 'chat-archive': viewComponent = <ChatArchiveView />; break;\n default: viewComponent = <OverviewView />;\n }\n\n const terminalHeight = stdout?.rows || process.stdout.rows || 40;\n\n return (\n <Box flexDirection=\"column\" minHeight={terminalHeight}>\n <Header />\n {!showConfig && !showHelp && <Notification />}\n <Box flexGrow={1} flexDirection=\"column\">\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, storageGovernance, storageGotchas, ledgerBlocks } = state.memoryTree;\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 const governance = storageGovernance.length > 0 ? storageGovernance : decisionNodes.map(n => ({\n id: n.id,\n decision: (n.data as { decision: string }).decision,\n context: (n.data as { context: string }).context,\n when: (n.data as { timestamp: string }).timestamp,\n hash: undefined,\n }));\n\n nodes.push({ id: 'decisions', level: 0 });\n if (expandedNodes.has('decisions')) {\n governance.slice(0, 10).forEach(g => nodes.push({ id: `decision-${g.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: 'gotchas', level: 0 });\n if (expandedNodes.has('gotchas')) {\n storageGotchas.slice(0, 10).forEach(g => nodes.push({ id: `gotcha-${g.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 if (ledgerBlocks.length > 0) {\n nodes.push({ id: 'ledger-chain', level: 0 });\n if (expandedNodes.has('ledger-chain')) {\n ledgerBlocks.forEach((_, i) => nodes.push({ id: `ledger-block-${i}`, 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 || 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} subdirectories in your project)`\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 s = addActivity(s, `Change: ${update.data.file}`);\n break;\n }\n case 'signal_extracted': {\n const se = { ...s.signalExtraction };\n if (update.data.governance) se.governanceExtracted += update.data.governance;\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.governance || 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.governance}g, ${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 const next = { ...state, previousView: state.view, view: action.view };\n if (action.view !== 'memory' && state.memoryTree.pendingLedgerDelete) {\n next.memoryTree = { ...state.memoryTree, pendingLedgerDelete: null };\n }\n return next;\n }\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.debug('[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\n console.debug('[State] ADD_INSIGHTS nudge count logic:', {\n newOnesCount: newOnes.length,\n newWarnings: newOnes.filter(i => i.type === 'warning').length,\n newAlertsFiltered: newAlerts,\n currentUnreadCount: state.unreadNudgesCount,\n willIncrement: newAlerts > 0,\n newInsightTypes: newOnes.map(i => ({ type: i.type, dismissed: i.dismissed }))\n });\n\n if (newAlerts > 0) {\n s.unreadNudgesCount = state.unreadNudgesCount + newAlerts;\n console.debug('[State] Incremented unread nudges:', {\n from: state.unreadNudgesCount,\n to: s.unreadNudgesCount,\n increment: newAlerts\n });\n }\n \n if (newOnes.length > 0) {\n for (const insight of newOnes) {\n s = addActivity(s, `Trie: ${insight.message}`);\n }\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}`);\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_GOAL_SCANNING':\n return { ...state, goalsPanel: { ...state.goalsPanel, scanningGoalId: action.goalId, scanningProgress: action.progress } };\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_HYPOTHESIS_SCANNING':\n return { ...state, hypothesesPanel: { ...state.hypothesesPanel, scanningHypothesisId: action.hypothesisId, scanningProgress: action.progress } };\n\n case 'SET_MEMORY_TREE': {\n const blocks = action.ledgerBlocks ?? state.memoryTree.ledgerBlocks;\n const gotchas = action.storageGotchas ?? state.memoryTree.storageGotchas;\n const expanded = new Set(state.memoryTree.expandedNodes);\n if (blocks.length > 0) expanded.add('ledger-chain');\n if (gotchas.length > 0) expanded.add('gotchas');\n return {\n ...state,\n memoryTree: {\n ...state.memoryTree,\n loaded: true,\n snapshot: action.snapshot,\n globalPatterns: action.patterns,\n storageGovernance: action.storageGovernance ?? state.memoryTree.storageGovernance,\n storageGotchas: gotchas,\n ledgerBlocks: blocks,\n expandedNodes: expanded,\n },\n };\n }\n\n case 'INVALIDATE_MEMORY_TREE':\n return { ...state, memoryTree: { ...state.memoryTree, loaded: false } };\n\n case 'SELECT_MEMORY_NODE':\n return { ...state, memoryTree: { ...state.memoryTree, selectedNode: action.nodeId } };\n\n case 'SET_MEMORY_EXPANDED_ITEM':\n return { ...state, memoryTree: { ...state.memoryTree, expandedItemId: action.itemId } };\n\n case 'SET_PENDING_LEDGER_DELETE':\n return { ...state, memoryTree: { ...state.memoryTree, pendingLedgerDelete: action.date } };\n\n case 'TOGGLE_MEMORY_NODE': {\n const expandable = ['decisions', 'incidents', 'patterns', 'cross-project', 'hotspots', 'ledger-chain'];\n if (expandable.includes(action.nodeId)) {\n const expanded = new Set(state.memoryTree.expandedNodes);\n if (expanded.has(action.nodeId)) {\n // When ledger-chain is already expanded, Enter opens first block instead of collapsing\n if (action.nodeId === 'ledger-chain' && state.memoryTree.ledgerBlocks.length > 0) {\n return {\n ...state,\n memoryTree: {\n ...state.memoryTree,\n expandedItemId: 'ledger-block-0',\n selectedNode: 'ledger-block-0',\n },\n };\n }\n expanded.delete(action.nodeId);\n } else {\n expanded.add(action.nodeId);\n // When expanding ledger-chain, auto-select first block so Enter immediately opens details\n if (action.nodeId === 'ledger-chain' && state.memoryTree.ledgerBlocks.length > 0) {\n return {\n ...state,\n memoryTree: {\n ...state.memoryTree,\n expandedNodes: expanded,\n selectedNode: 'ledger-block-0',\n },\n };\n }\n }\n return { ...state, memoryTree: { ...state.memoryTree, expandedNodes: expanded } };\n }\n // Leaf node: toggle expanded detail view\n const current = state.memoryTree.expandedItemId;\n const next = current === action.nodeId ? null : action.nodeId;\n return { ...state, memoryTree: { ...state.memoryTree, expandedItemId: next } };\n }\n\n case 'SET_AGENT_BRAIN':\n return {\n ...state,\n agentBrain: {\n ...state.agentBrain,\n loaded: true,\n governance: action.governance,\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 if (action.pendingFix) msg.pendingFix = action.pendingFix;\n if (action.pendingFixes && action.pendingFixes.length > 0) msg.pendingFixes = action.pendingFixes;\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 {\n ...state,\n chatState: {\n ...state.chatState,\n loading: action.loading,\n ...(action.loading === false ? { progress: null } : {}),\n },\n };\n case 'SET_CHAT_PROGRESS':\n return { ...state, chatState: { ...state.chatState, progress: action.message } };\n\n case 'QUEUE_CHAT_MESSAGE':\n return { ...state, chatState: { ...state.chatState, messageQueue: [...state.chatState.messageQueue, action.message] } };\n\n case 'DEQUEUE_CHAT_MESSAGE': {\n const [, ...rest] = state.chatState.messageQueue;\n return { ...state, chatState: { ...state.chatState, messageQueue: rest } };\n }\n\n case 'SET_CHAT_SESSION':\n return { ...state, chatState: { ...state.chatState, currentSessionId: action.sessionId, currentSessionTitle: action.title } };\n\n case 'LOAD_CHAT_MESSAGES':\n return { ...state, chatState: { ...state.chatState, messages: action.messages } };\n\n case 'CLEAR_CHAT':\n return { ...state, chatState: { messages: [], inputBuffer: '', loading: false, progress: null, messageQueue: [], currentSessionId: null, currentSessionTitle: null } };\n\n case 'SET_CHAT_ARCHIVE_SESSIONS':\n return { ...state, chatArchivePanel: { ...state.chatArchivePanel, sessions: action.sessions } };\n\n case 'SELECT_CHAT_SESSION': {\n const sessions = state.chatArchivePanel.sessions;\n const newIndex = Math.max(0, Math.min(action.index, sessions.length - 1));\n return { ...state, chatArchivePanel: { ...state.chatArchivePanel, selectedIndex: newIndex } };\n }\n\n case 'SET_CHAT_ARCHIVE_INPUT_MODE':\n return { ...state, chatArchivePanel: { ...state.chatArchivePanel, inputMode: action.mode, inputBuffer: action.mode === 'rename' ? state.chatArchivePanel.sessions[state.chatArchivePanel.selectedIndex]?.title || '' : '' } };\n\n case 'SET_CHAT_ARCHIVE_INPUT_BUFFER':\n return { ...state, chatArchivePanel: { ...state.chatArchivePanel, inputBuffer: action.buffer } };\n\n case 'SET_CHAT_ARCHIVE_LOADING':\n return { ...state, chatArchivePanel: { ...state.chatArchivePanel, loading: action.loading } };\n\n case 'TOGGLE_ARCHIVED_CHATS':\n return { ...state, chatArchivePanel: { ...state.chatArchivePanel, showArchived: !state.chatArchivePanel.showArchived } };\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 governanceExtracted: 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, 'chat-archive': 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, scanningGoalId: null, scanningProgress: '' },\n hypothesesPanel: { hypotheses: [], selectedIndex: 0, selectedCompletedIndex: 0, inputMode: 'browse', inputBuffer: '', lastRefresh: 0, scanningHypothesisId: null, scanningProgress: '' },\n memoryTree: { loaded: false, snapshot: null, globalPatterns: [], storageGovernance: [], storageGotchas: [], ledgerBlocks: [], expandedNodes: new Set(['decisions']), expandedItemId: null, selectedNode: 'decisions', scrollPosition: 0, lastRefresh: 0, pendingLedgerDelete: null },\n agentBrain: { loaded: false, governance: [], patterns: [], ledgerHash: null, selectedIndex: 0, expandedIndex: null },\n chatState: { messages: [], inputBuffer: '', loading: false, progress: null, messageQueue: [], currentSessionId: null, currentSessionTitle: null },\n chatArchivePanel: { sessions: [], selectedIndex: 0, showArchived: false, loading: false, inputMode: 'browse', inputBuffer: '' },\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.governanceExtracted + 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, getVisibleInsights } from '../state.js';\nimport { parseGoalViolation } from '../parse-goal-violation.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 'chat-archive': 'History',\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 'chat-archive': 'Hst',\n};\n\nconst TAB_VIEWS: DashboardView[] = ['overview', 'memory', 'goals', 'hypotheses', 'agent', 'chat'];\n\nconst CONTEXT_HINTS: Partial<Record<DashboardView, string>> = {\n goals: '/ help',\n hypotheses: '/ help',\n agent: '/ help',\n memory: '/ help',\n chat: '/ help',\n 'chat-archive': '/ help',\n rawlog: '/ help',\n};\n\nconst CONTEXT_HINTS_SHORT: Partial<Record<DashboardView, string>> = {\n goals: '/',\n hypotheses: '/',\n agent: '/',\n memory: '/',\n chat: '/',\n 'chat-archive': '/',\n rawlog: '/',\n};\n\nexport function Footer(): React.ReactElement {\n const { state } = useDashboard();\n const { view, goalsPanel, hypothesesPanel, unreadNudgesCount, memoryTree } = state;\n const incidentSelected = view === 'memory' && (\n memoryTree.selectedNode?.startsWith('incident-') ||\n memoryTree.expandedItemId?.startsWith('incident-')\n );\n const ledgerBlockSelected = view === 'memory' && memoryTree.selectedNode?.startsWith('ledger-block-');\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 if (view === 'chat' || view === 'chat-archive') {\n // In chat views, all keys go to input - don't show help/quit shortcuts\n hints = '';\n } else if (view === 'agent') {\n const visible = getVisibleInsights(state);\n const alerts = visible.filter(i => i.type === 'warning');\n const insight = alerts[state.selectedInsight];\n const isFixable = insight && parseGoalViolation(insight.message);\n hints = isFixable ? (narrow ? '/ f' : '/ help · f fix') : (narrow ? CONTEXT_HINTS_SHORT : CONTEXT_HINTS).agent ?? (narrow ? '/' : '/ help');\n } else if (incidentSelected) {\n hints = narrow ? 'd r' : 'd delete · r resolve';\n } else if (ledgerBlockSelected) {\n hints = narrow ? 'enter' : 'Enter details · Esc close';\n } else if (view === 'goals' && goalsPanel.goals.filter(g => g.status === 'achieved').length > 0 && goalsPanel.goals.filter(g => g.status === 'active').length === 0) {\n hints = narrow ? 'U' : 'U reactivate all achieved';\n } else {\n const hintMap = narrow ? CONTEXT_HINTS_SHORT : CONTEXT_HINTS;\n hints = hintMap[view] || (narrow ? '/' : '/ 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 color=\"green\">{labels[v]}</Text>\n )}\n {!isLast && <Text color=\"green\"> · </Text>}\n </React.Fragment>\n );\n })}\n </Box>\n {hints && <Text dimColor>{hints}</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 color=\"green\">{labels[v]}</Text>\n )}\n {!isLast && <Text color=\"green\"> · </Text>}\n </React.Fragment>\n );\n })}\n </Box>\n {hints && <Text dimColor>{hints}</Text>}\n </Box>\n );\n}\n","/**\n * Parse goal violation from nudge message format:\n * Goal \"X\" violated in FILE: VIOLATION [X% confidence]\n */\nexport function parseGoalViolation(message: string): { file: string; goal: string; violation: string } | null {\n const match = message.match(/Goal \"([^\"]+)\" violated in ([^:]+): (.+)/);\n if (!match) return null;\n const [, goal, file, violation] = match;\n if (!goal || !file || !violation) return null;\n // Strip trailing [X% confidence] from violation if present\n const cleanViolation = violation.replace(/\\s*\\[\\d+%\\s*confidence\\]\\s*$/i, '').trim();\n return { file: file.trim(), goal: goal.trim(), violation: cleanViolation };\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { useDashboard } from '../state.js';\n\nexport function Notification(): React.ReactElement | null {\n const { state } = useDashboard();\n const { notification } = state;\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 return (\n <Box paddingX={1}>\n <Text color={color} bold>● </Text>\n <Text wrap=\"wrap\">{notification.message}</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 { loadAutonomyConfig, saveAutonomyConfig } from '../../../utils/autonomy-config.js';\nimport { loadConfig, saveConfig } from '../../../config/loader.js';\nimport { existsSync } from 'fs';\nimport { rm } from 'fs/promises';\nimport { join } from 'path';\n\ntype ConfigSection = 'main' | 'agentSmith' | 'performance' | 'riskThresholds' | 'apiKeys' | 'memory' | 'aiWatcher' | 'codebaseIndex';\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 const [indexStats, setIndexStats] = useState<{ fileCount: number; lastUpdated: string } | null>(null);\n const [indexing, setIndexing] = useState(false);\n const [cursorKeyDisplay, setCursorKeyDisplay] = useState('Not set');\n const [linearKeyDisplay, setLinearKeyDisplay] = useState('Not set');\n const [githubKeyDisplay, setGithubKeyDisplay] = useState('Not set');\n\n const config = state.agentConfig;\n\n React.useEffect(() => {\n const loadApiKeys = async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const cfg = await loadAutonomyConfig(workDir);\n const cursorKey = cfg.cursorApiKey || process.env.CURSOR_API_KEY || null;\n setCursorKeyDisplay(maskKey(cursorKey));\n } catch {\n setCursorKeyDisplay('Not set');\n }\n\n try {\n const trieConfig = await loadConfig();\n const linearKey = trieConfig.apiKeys?.linear ?? process.env.LINEAR_API_KEY ?? null;\n setLinearKeyDisplay(maskKey(linearKey));\n const githubKey = trieConfig.apiKeys?.github ?? process.env.GITHUB_TOKEN ?? null;\n setGithubKeyDisplay(maskKey(githubKey));\n } catch {\n setLinearKeyDisplay('Not set');\n setGithubKeyDisplay('Not set');\n }\n };\n void loadApiKeys();\n }, []);\n\n // Load codebase index stats\n React.useEffect(() => {\n if (section === 'codebaseIndex') {\n const loadStats = async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const { CodebaseIndex } = await import('../../../context/codebase-index.js');\n const index = new CodebaseIndex(workDir);\n const stats = index.getStats();\n \n // Format lastUpdated for display\n let lastUpdatedDisplay = 'Never';\n if (stats.lastUpdated) {\n try {\n const date = new Date(stats.lastUpdated);\n lastUpdatedDisplay = date.toLocaleString('en-US', { \n month: 'short', \n day: 'numeric', \n hour: 'numeric', \n minute: '2-digit' \n });\n } catch {\n lastUpdatedDisplay = 'Unknown';\n }\n }\n \n setIndexStats({\n fileCount: stats.totalFiles,\n lastUpdated: lastUpdatedDisplay,\n });\n } catch {\n setIndexStats({ fileCount: 0, lastUpdated: 'Never' });\n }\n };\n void loadStats();\n }\n }, [section]);\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: 'Codebase Index', key: 'codebaseIndex', value: 'Stats & Re-index', 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 { label: 'Linear', key: 'linear', value: linearKeyDisplay, section: 'apiKeys' },\n { label: 'GitHub', key: 'github', value: githubKeyDisplay, section: 'apiKeys' },\n { label: 'Cursor', key: 'cursor', value: cursorKeyDisplay, 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 codebaseIndexItems: ConfigItem[] = [\n { label: 'Re-index Codebase', key: 'reindex', value: 'Rebuild full index', section: 'codebaseIndex' },\n { label: 'Clear Index', key: 'clearIndex', value: 'Delete index cache', section: 'codebaseIndex' },\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 : section === 'codebaseIndex' ? codebaseIndexItems\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 } else if (item.key === 'linear' && editBuffer.length > 5) {\n void (async () => {\n const cfg = await loadConfig();\n await saveConfig({ ...cfg, apiKeys: { ...cfg.apiKeys, linear: editBuffer } });\n })();\n setLinearKeyDisplay(maskKey(editBuffer));\n dispatch({ type: 'ADD_ACTIVITY', message: 'Linear API key saved' });\n } else if (item.key === 'github' && editBuffer.length > 5) {\n void (async () => {\n const cfg = await loadConfig();\n await saveConfig({ ...cfg, apiKeys: { ...cfg.apiKeys, github: editBuffer } });\n })();\n setGithubKeyDisplay(maskKey(editBuffer));\n dispatch({ type: 'ADD_ACTIVITY', message: 'GitHub token saved' });\n } else if (item.key === 'cursor' && editBuffer.length > 10) {\n const workDir = getWorkingDirectory(undefined, true);\n void saveAutonomyConfig(workDir, { cloudAgentEnabled: true, cursorApiKey: editBuffer });\n setCursorKeyDisplay(maskKey(editBuffer));\n dispatch({ type: 'ADD_ACTIVITY', message: 'Cursor 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 if (section === 'codebaseIndex') {\n const item = items[selectedIndex];\n if (item && item.key === 'reindex') {\n setIndexing(true);\n reindexCodebase().then(() => {\n dispatch({ type: 'ADD_ACTIVITY', message: 'Codebase re-indexed successfully' });\n setIndexing(false);\n // Reload stats\n const loadStats = async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const { CodebaseIndex } = await import('../../../context/codebase-index.js');\n const index = new CodebaseIndex(workDir);\n const stats = index.getStats();\n setIndexStats({\n fileCount: stats.totalFiles,\n lastUpdated: stats.lastUpdated || 'Never',\n });\n } catch {\n setIndexStats(null);\n }\n };\n void loadStats();\n }).catch(() => {\n dispatch({ type: 'ADD_ACTIVITY', message: 'Failed to re-index codebase' });\n setIndexing(false);\n });\n } else if (item && item.key === 'clearIndex') {\n clearCodebaseIndex().then(() => {\n dispatch({ type: 'ADD_ACTIVITY', message: 'Index cleared' });\n setIndexStats({ fileCount: 0, lastUpdated: 'Never' });\n }).catch(() => {\n dispatch({ type: 'ADD_ACTIVITY', message: 'Failed to clear index' });\n });\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 : section === 'codebaseIndex' ? 'Codebase Index'\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 async function clearCodebaseIndex(): Promise<void> {\n const workDir = getWorkingDirectory(undefined, true);\n const trieDir = getTrieDirectory(workDir);\n const indexFile = join(trieDir, 'codebase-index.json');\n if (existsSync(indexFile)) {\n await rm(indexFile, { force: true });\n }\n }\n\n async function reindexCodebase(): Promise<void> {\n const workDir = getWorkingDirectory(undefined, true);\n const { CodebaseIndex } = await import('../../../context/codebase-index.js');\n const { glob } = await import('glob');\n \n const index = new CodebaseIndex(workDir);\n \n // Auto-index the codebase\n const indexPattern = `${workDir}/**/*.{ts,tsx,js,jsx,mjs,vue,svelte,astro,py,go,rs,java,c,cpp,h,hpp,cs,rb,php,css,scss,html}`;\n const indexFiles = await glob(indexPattern, {\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**', '**/.trie/**', '**/coverage/**'],\n nodir: true,\n });\n \n let indexed = 0;\n const total = Math.min(indexFiles.length, 500);\n \n for (let i = 0; i < total; i++) {\n const filePath = indexFiles[i];\n if (!filePath) continue;\n \n let relativePath = filePath;\n if (filePath.toLowerCase().startsWith(workDir.toLowerCase() + '/')) {\n relativePath = filePath.slice(workDir.length + 1);\n } else if (filePath.startsWith('/')) {\n continue;\n }\n const result = await index.indexFile(relativePath);\n if (result) indexed++;\n }\n \n await index.save();\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 === 'codebaseIndex' && (\n <Box flexDirection=\"column\" marginTop={1}>\n {indexStats ? (\n <>\n <Text> <Text bold>Files indexed:</Text> {indexStats.fileCount}</Text>\n <Text> <Text bold>Last updated:</Text> {indexStats.lastUpdated}</Text>\n <Box marginTop={1}><Text dimColor> Actions:</Text></Box>\n </>\n ) : (\n <Text dimColor> Loading index stats...</Text>\n )}\n {codebaseIndexItems.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> {item.value}</Text>\n </Text>\n );\n })}\n {indexing \n ? <Box marginTop={1}><Text dimColor> Re-indexing codebase...</Text></Box>\n : <Box marginTop={1}><Text dimColor> enter to execute · esc back</Text></Box>\n }\n </Box>\n )}\n\n {!showConfirmClear && section === 'apiKeys' && !editing && (\n <Box flexDirection=\"column\" marginTop={1}>\n {apiKeysItems.map((item, idx) => {\n const isSelected = selectedIndex === idx;\n const isActive = item.value !== 'Not set';\n return (\n <Text key={item.key}>\n {isSelected ? <Text bold color=\"green\">{'> '}</Text> : ' '}\n <Text bold={isSelected}>{item.label}:</Text>\n {' '}{item.value}\n {' '}{isActive ? <Text color=\"green\">● Active</Text> : <Text dimColor>○ Not set</Text>}\n </Text>\n );\n })}\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 <Text dimColor> Editing: {apiKeysItems[selectedIndex]?.label ?? 'Key'}</Text>\n <Box borderStyle=\"single\" borderColor=\"green\" paddingX={1}>\n <Text>{editBuffer || <Text dimColor>key-...</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' && section !== 'codebaseIndex' && (\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, useStdout } 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: 'Fix goal violation (or expand if not a violation)' },\n { key: 'f', description: 'Force spawn Claude Code fix' },\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: 'u', description: 'Reactivate most recent achieved' },\n { key: 'U', description: 'Reactivate all achieved goals' },\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 section or decision detail' },\n { key: 'esc', description: 'Close decision detail' },\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 (queue while AI responds)' },\n { key: 'enter', description: 'Send message' },\n { key: 'esc', description: 'Clear input' },\n { key: '/history', description: 'Open chat history' },\n { key: 'tab', description: 'Navigate between views' },\n { key: 'q', description: 'Quit (press twice if input active)' },\n ],\n 'chat-archive': [\n { key: 'j / ↓', description: 'Move down' },\n { key: 'k / ↑', description: 'Move up' },\n { key: 'enter', description: 'Load selected chat' },\n { key: 'n', description: 'Start new chat' },\n { key: 'd', description: 'Delete selected chat' },\n { key: 'a', description: 'Archive selected chat' },\n { key: 'r', description: 'Rename selected chat' },\n { key: 'e', description: 'Export selected chat' },\n { key: 't', description: 'Toggle archived chats' },\n { key: 'tab', description: 'Navigate between views' },\n { key: 's', description: 'Open Settings' },\n { key: 'q / esc', description: 'Quit' },\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 }: HelpDialogProps): React.ReactElement {\n const shortcuts = VIEW_HELP[view] || VIEW_HELP.overview;\n const viewName = view.charAt(0).toUpperCase() + view.slice(1);\n const { stdout } = useStdout();\n const cols = stdout?.columns || 80;\n const narrow = cols < 70;\n const dialogWidth = narrow ? '95%' : '80%';\n const keyWidth = narrow ? 10 : 12;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n paddingX={narrow ? 1 : 2}\n paddingY={1}\n width={dialogWidth}\n alignSelf=\"center\"\n marginTop={narrow ? 1 : 2}\n >\n <Text bold color=\"cyan\">\n {narrow ? `${viewName} Keys` : `${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={narrow ? 1 : 2}>\n <Box width={keyWidth}>\n <Text color=\"yellow\">{key}</Text>\n </Box>\n <Text>{description}</Text>\n </Box>\n ))}\n </Box>\n <Box marginTop={1}>\n <Text dimColor>{narrow ? '/ or ? to close' : '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.governanceExtracted > 0 || signalExtraction.factsExtracted > 0 || signalExtraction.blockersExtracted > 0) && (\n <Text dimColor> {signalExtraction.governanceExtracted}g · {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 const msgMax = Math.max(20, contentWidth - 12);\n return (\n <Text key={i} wrap=\"truncate\">\n {' '}<Text dimColor>{entry.time}</Text> {truncate(entry.message, msgMax)}\n </Text>\n );\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 { parseGoalViolation } from '../parse-goal-violation.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 narrow = cols < 60;\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 { governance, patterns, loaded } = agentBrain;\n const decisions = governance;\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.queryGovernance({ 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', governance: 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 const dismissInsight = useCallback(async () => {\n const visible = getVisibleInsights(state);\n const insight = visible[selectedInsight];\n if (!insight) return;\n\n // Persist dismissal to InsightStore\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const { getInsightStore } = await import('../../../agent/insight-store.js');\n const store = getInsightStore(workDir);\n await store.dismissInsight(insight.id);\n \n // Also mark as resolved in nudges table if it's a nudge\n // Nudges are alerts/warnings that come from goal violations or code issues\n const { getStorage } = await import('../../../storage/tiered-storage.js');\n const storage = getStorage(workDir);\n await storage.dismissNudge(insight.id).catch(() => {\n // Ignore error if not found in nudges table\n });\n } catch (error) {\n console.error('Failed to persist insight dismissal:', error);\n }\n\n // Update local state\n dispatch({ type: 'DISMISS_INSIGHT', index: selectedInsight });\n }, [selectedInsight, state, dispatch]);\n\n const spawnFixForInsight = useCallback(async () => {\n const visible = getVisibleInsights(state);\n const insight = visible[selectedInsight];\n if (!insight) return;\n\n const parsed = parseGoalViolation(insight.message);\n if (!parsed) {\n dispatch({ type: 'ADD_ACTIVITY', message: 'Selected nudge is not a goal violation (cannot fix)' });\n return;\n }\n\n const workDir = getWorkingDirectory(undefined, true);\n try {\n const { spawnClaudeCodeFix } = await import('../../../utils/terminal-spawn.js');\n await spawnClaudeCodeFix({\n file: parsed.file,\n goal: parsed.goal,\n violation: parsed.violation,\n ...(insight.suggestedAction ? { suggestedFix: insight.suggestedAction } : {}),\n cwd: workDir,\n });\n dispatch({ type: 'ADD_ACTIVITY', message: `Spawned Claude Code to fix ${parsed.file}` });\n } catch (error) {\n const msg = error instanceof Error ? error.message : 'Unknown error';\n dispatch({ type: 'ADD_ACTIVITY', message: `Fix spawn failed: ${msg}` });\n }\n }, [selectedInsight, state, dispatch]);\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) {\n // Smart Enter: spawn fix for goal violations, otherwise just expand\n const visible = getVisibleInsights(state);\n const insight = visible[selectedInsight];\n if (insight) {\n const parsed = parseGoalViolation(insight.message);\n if (parsed) {\n // It's a goal violation - spawn Claude Code to fix it\n void spawnFixForInsight();\n } else {\n // Not a goal violation - just expand/collapse\n dispatch({ type: 'TOGGLE_INSIGHT', index: selectedInsight });\n }\n }\n }\n else if (input === 'd') void dismissInsight();\n else if (input === 'f') void spawnFixForInsight();\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 {narrow ? (\n <Text dimColor> {alertCount}</Text>\n ) : (\n <Text dimColor> {alertCount} alerts · {decCount} decisions · {patCount} patterns</Text>\n )}\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 {narrow ? null : <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 const decWidth = Math.max(20, cols - 18);\n return (\n <Text key={dec.id} wrap=\"truncate\">\n {' '}{active ? <Text color=\"green\">●</Text> : <Text dimColor>○</Text>}{' '}\n {dec.decision.slice(0, decWidth)}{dec.decision.length > decWidth ? '...' : ''}\n {narrow ? null : <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 const patWidth = Math.max(20, cols - 18);\n return (\n <Text key={idx} wrap=\"truncate\">\n {' '}{pat.isAntiPattern ? <Text color=\"red\">●</Text> : <Text dimColor>○</Text>}{' '}\n {pat.description.slice(0, patWidth)}{pat.description.length > patWidth ? '...' : ''}\n {narrow ? null : <>{' '}{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, useRef } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport { useDashboard } from '../state.js';\nimport { progressBar } from '../theme.js';\nimport { getWorkingDirectory } from '../../../utils/workspace.js';\nimport { getProjectState, type Goal } from '../../../agent/project-state.js';\nimport { measureInitialGoalValue } from '../../../agent/goal-validator.js';\n\nfunction calculateGoalProgress(goal: { startValue?: number; currentValue: number; target: number }): number {\n // If target is 0 (reduction goal) and current value is also 0, goal is achieved = 100%\n if (goal.target === 0 && goal.currentValue === 0) return 100;\n \n // If target is 0 but current value is not, calculate based on reduction from start\n if (goal.target === 0) {\n const startValue = goal.startValue ?? goal.currentValue;\n if (startValue === 0) return 0; // Can't reduce from 0\n return Math.round((1 - goal.currentValue / startValue) * 100);\n }\n \n const startValue = goal.startValue ?? goal.currentValue;\n if (startValue > goal.target) {\n // Reduction goal: progressing from startValue down to target\n const totalReduction = startValue - goal.target;\n if (totalReduction === 0) return 100; // Already at target\n const actualReduction = startValue - goal.currentValue;\n return Math.round((actualReduction / totalReduction) * 100);\n }\n \n // Growth goal: progressing from startValue up to target\n return Math.round((goal.currentValue / goal.target) * 100);\n}\n\n/** Binary goals (target=0, startValue=0) are pass/fail—no gradual progress. Show status instead of bar. */\nfunction isBinaryGoal(goal: { startValue?: number; target: number }): boolean {\n const start = goal.startValue ?? 0;\n return goal.target === 0 && start === 0;\n}\n\nexport function GoalsView(): React.ReactElement {\n const { state, dispatch } = useDashboard();\n const { goalsPanel } = state;\n const scanAbortRef = useRef<AbortController | null>(null);\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 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' && g.status !== 'rejected');\n\n const refreshGoals = useCallback(async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getProjectState(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, startValue: g.startValue, status: g.status, autoGenerated: g.autoGenerated, updatedAt: g.updatedAt, ...(g.achievedAt != null ? { achievedAt: g.achievedAt } : {}), ...(g.achievedBy != null ? { achievedBy: g.achievedBy } : {}), ...(g.category != null ? { category: g.category } : {}) };\n return base;\n }),\n });\n } catch (err) {\n // Silent error handling\n }\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 = getProjectState(workDir);\n await agentState.load();\n \n // Measure initial value based on existing issues\n const initialValue = await measureInitialGoalValue(description.trim(), workDir);\n \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: initialValue,\n startValue: initialValue,\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}` });\n await refreshGoals();\n } catch (err) {\n // Silent error handling\n }\n }, [dispatch, refreshGoals]);\n\n const completeGoal = useCallback(async (goalId: string) => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getProjectState(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\n // Adjust selection index to prevent pointing to wrong goal after completion\n const currentIndex = goalsPanel.selectedIndex;\n const newActiveCount = activeGoals.length - 1; // Will be one less after completion\n const newIndex = Math.min(currentIndex, Math.max(0, newActiveCount - 1));\n dispatch({ type: 'SELECT_GOAL', index: newIndex });\n\n dispatch({ type: 'ADD_ACTIVITY', message: `Goal achieved: ${goal.description}` });\n await refreshGoals();\n }\n } catch (err) {\n // Silent error handling\n }\n }, [dispatch, refreshGoals, goalsPanel.selectedIndex, activeGoals.length]);\n\n const deleteGoal = useCallback(async (goalId: string) => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getProjectState(workDir);\n await agentState.load();\n await agentState.updateGoal(goalId, { status: 'rejected' });\n\n // Adjust selection index to prevent pointing to wrong goal after deletion\n const currentIndex = goalsPanel.selectedIndex;\n const newActiveCount = activeGoals.length - 1; // Will be one less after deletion\n const newIndex = Math.min(currentIndex, Math.max(0, newActiveCount - 1));\n dispatch({ type: 'SELECT_GOAL', index: newIndex });\n\n dispatch({ type: 'ADD_ACTIVITY', message: 'Goal removed' });\n await refreshGoals();\n } catch (err) {\n // Silent error handling\n }\n }, [dispatch, refreshGoals, goalsPanel.selectedIndex, activeGoals.length]);\n\n const reactivateGoal = useCallback(async (goalId: string) => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getProjectState(workDir);\n await agentState.load();\n await agentState.updateGoal(goalId, { status: 'active', achievedAt: undefined, achievedBy: undefined });\n dispatch({ type: 'ADD_ACTIVITY', message: 'Goal reactivated' });\n await refreshGoals();\n } catch (err) {\n // Silent error handling\n }\n }, [dispatch, refreshGoals]);\n\n const reactivateAllAchievedGoals = useCallback(async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getProjectState(workDir);\n await agentState.load();\n const achieved = goalsPanel.goals.filter(g => g.status === 'achieved');\n if (achieved.length === 0) {\n dispatch({ type: 'SHOW_NOTIFICATION', message: 'No achieved goals to reactivate', severity: 'info', autoHideMs: 3000 });\n return;\n }\n for (const goal of achieved) {\n await agentState.updateGoal(goal.id, { status: 'active', achievedAt: undefined });\n }\n dispatch({ type: 'SHOW_NOTIFICATION', message: `Reactivated ${achieved.length} goal${achieved.length > 1 ? 's' : ''}`, severity: 'info', autoHideMs: 3000 });\n dispatch({ type: 'ADD_ACTIVITY', message: `Reactivated ${achieved.length} goal${achieved.length > 1 ? 's' : ''}` });\n await refreshGoals();\n } catch (err) {\n // Silent error handling\n dispatch({ type: 'SHOW_NOTIFICATION', message: 'Failed to reactivate goals', severity: 'warning', autoHideMs: 5000 });\n }\n }, [dispatch, refreshGoals, goalsPanel.goals]);\n\n const clearAchievedGoals = useCallback(async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getProjectState(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.updateGoal(goal.id, { status: 'rejected' });\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 goalSummary = goalsPanel.goals.find(g => g.id === goalId);\n if (!goalSummary) return;\n\n // Abort any previous scan\n scanAbortRef.current?.abort();\n scanAbortRef.current = new AbortController();\n const signal = scanAbortRef.current.signal;\n\n // Set scanning state with initial progress\n dispatch({ type: 'SET_GOAL_SCANNING', goalId, progress: 'Starting scan...' });\n dispatch({ type: 'ADD_ACTIVITY', message: `Scanning goal: ${goalSummary.description}...` });\n\n // Import the goal validator and get the full goal from project state\n dispatch({ type: 'SET_GOAL_SCANNING', goalId, progress: 'Loading goal configuration...' });\n const { checkFilesForGoalViolations } = await import('../../../agent/goal-validator.js');\n const agentState = getProjectState(workDir);\n await agentState.load();\n const fullGoal = agentState.getAllGoals().find(g => g.id === goalId);\n if (!fullGoal) {\n dispatch({ type: 'SET_GOAL_SCANNING', goalId: null, progress: '' });\n dispatch({ type: 'SHOW_NOTIFICATION', message: `Goal not found: ${goalId}`, severity: 'warning', autoHideMs: 5000 });\n return;\n }\n\n // Update progress\n dispatch({ type: 'SET_GOAL_SCANNING', goalId, progress: 'Analyzing codebase...' });\n\n // Check files against this goal with progress callback and abort signal\n const violations = await checkFilesForGoalViolations([fullGoal], workDir, undefined, (progressMsg) => {\n dispatch({ type: 'SET_GOAL_SCANNING', goalId, progress: progressMsg });\n }, signal);\n\n // Clear scanning state\n scanAbortRef.current = null;\n dispatch({ type: 'SET_GOAL_SCANNING', goalId: null, progress: '' });\n\n if (violations.length === 0) {\n dispatch({ type: 'SHOW_NOTIFICATION', message: `✓ No violations found for: ${goalSummary.description}`, severity: 'info', autoHideMs: 5000 });\n dispatch({ type: 'ADD_ACTIVITY', message: `✓ Scan complete - 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: `⚠ Scan complete - ${violations.length} violation(s) found` });\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 timestamp: Date.now(),\n category: 'quality',\n type: 'warning',\n dismissed: false,\n priority: violation.severity === 'critical' ? 9 : 6,\n relatedIssues: [],\n }] });\n }\n }\n } catch (error) {\n scanAbortRef.current = null;\n dispatch({ type: 'SET_GOAL_SCANNING', goalId: null, progress: '' });\n const isAborted = error instanceof DOMException && error.name === 'AbortError';\n if (isAborted) {\n dispatch({ type: 'SHOW_NOTIFICATION', message: 'Scan cancelled', severity: 'info', autoHideMs: 3000 });\n dispatch({ type: 'ADD_ACTIVITY', message: 'Scan cancelled' });\n } else {\n const errorMsg = error instanceof Error ? error.message : 'unknown error';\n dispatch({ type: 'SHOW_NOTIFICATION', message: `Scan failed: ${errorMsg}`, severity: 'warning', autoHideMs: 5000 });\n dispatch({ type: 'ADD_ACTIVITY', message: `✗ Scan failed: ${errorMsg}` });\n }\n }\n }, [dispatch, goalsPanel.goals]);\n\n useInput((_input, key) => {\n // When scanning, Escape cancels\n if (goalsPanel.scanningGoalId && key.escape) {\n scanAbortRef.current?.abort();\n return;\n }\n\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 } else if (_input === 'U') {\n void reactivateAllAchievedGoals();\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.length === 0 && goalsPanel.goals.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1} paddingX={1} borderStyle=\"round\" borderColor=\"yellow\">\n <Text color=\"yellow\" bold>⚠ No Active Goals</Text>\n <Text dimColor>Goals exist but none are active. Violations won't be detected.</Text>\n <Text dimColor>Press U to reactivate all achieved goals, or a to add a new goal.</Text>\n </Box>\n )}\n\n {activeGoals.map((goal, idx) => {\n const isSelected = goalsPanel.selectedIndex === idx;\n const isScanning = goalsPanel.scanningGoalId === goal.id;\n const binary = isBinaryGoal(goal);\n const progress = calculateGoalProgress(goal);\n const barWidth = narrow ? 6 : Math.min(12, Math.floor(contentWidth / 8));\n const bar = progressBar(progress, 100, barWidth);\n const sourceLabel = goal.autoGenerated ? 'AI' : 'you';\n\n if (isScanning) {\n // Show scanning goal with border, progress, and cancel hint\n return (\n <Box key={goal.id} borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Box flexDirection=\"column\">\n <Text wrap=\"wrap\" overflow=\"visible\">\n <Text bold color=\"cyan\">⟳ </Text>\n <Text color=\"cyan\" bold>{goal.description}</Text>\n </Text>\n <Text color=\"cyan\" dimColor>\n {goalsPanel.scanningProgress || 'Scanning...'}\n </Text>\n <Text color=\"cyan\" dimColor> Esc to cancel</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box key={goal.id} flexDirection=\"column\">\n <Text wrap=\"wrap\" overflow=\"visible\">\n {isSelected ? <Text bold color=\"green\">{'> '}</Text> : ' '}\n {goal.autoGenerated ? <Text color=\"cyan\">◇</Text> : <Text color=\"green\">○</Text>}{' '}\n {goal.description}\n <Text dimColor> [{sourceLabel}]</Text>\n </Text>\n {binary ? (\n <Text dimColor>\n {' '}\n {goal.currentValue === 0 ? (\n <Text color=\"green\">✓ Compliant</Text>\n ) : (\n <Text color=\"yellow\">⚠ {goal.currentValue} violation{goal.currentValue !== 1 ? 's' : ''}</Text>\n )}\n </Text>\n ) : (\n <Text dimColor> {bar} {progress}%</Text>\n )}\n </Box>\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 const byLabel = g.achievedBy === 'agent' ? 'AI' : 'you';\n return (\n <Text key={g.id} wrap=\"wrap\" overflow=\"visible\">\n {' '}{g.achievedBy === 'agent' ? <Text color=\"cyan\">●</Text> : <Text color=\"green\">●</Text>}{' '}\n {g.description}\n <Text dimColor> [{byLabel}]</Text>\n </Text>\n );\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 return (\n <Text key={g.id} wrap=\"wrap\" overflow=\"visible\"> <Text dimColor>○</Text> {g.description} <Text dimColor>{g.status}</Text></Text>\n );\n })}\n </Box>\n )}\n </Box>\n )}\n </>\n )}\n </Box>\n );\n}\n","import React, { useCallback, useRef } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport { useDashboard } from '../state.js';\nimport { getWorkingDirectory } from '../../../utils/workspace.js';\nimport { getProjectState, type Hypothesis } from '../../../agent/project-state.js';\n\nexport function HypothesesView(): React.ReactElement {\n const { state, dispatch } = useDashboard();\n const { hypothesesPanel } = state;\n const scanAbortRef = useRef<AbortController | null>(null);\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 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 = getProjectState(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, ...(h.autoGenerated != null ? { autoGenerated: h.autoGenerated } : {}), ...(h.validatedBy != null ? { validatedBy: h.validatedBy } : {}), ...(h.category != null ? { category: h.category } : {}) };\n return base;\n }),\n });\n } catch (err) {\n // Error handling for refreshHypotheses - silently fail\n }\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 = getProjectState(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,\n status: 'testing',\n evidence: [],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n testCriteria: 'Collect evidence from scans',\n autoGenerated: false,\n };\n await agentState.addHypothesis(hypothesis);\n dispatch({ type: 'ADD_ACTIVITY', message: `Hypothesis added: ${statement}` });\n await refreshHypotheses();\n } catch (err) {\n // Error handling for addHypothesis - silently fail\n }\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 = getProjectState(workDir);\n await agentState.load();\n if (action === 'validate') await agentState.updateHypothesis(hypoId, { status: 'validated', confidence: 0.9, validatedBy: 'user' });\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 (err) {\n // Error handling for updateHypothesis - silently fail\n }\n }, [dispatch, refreshHypotheses]);\n\n const reactivateHypothesis = useCallback(async (hypoId: string) => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const agentState = getProjectState(workDir);\n await agentState.load();\n await agentState.updateHypothesis(hypoId, { status: 'testing', confidence: 0, validatedAt: undefined, validatedBy: undefined });\n dispatch({ type: 'ADD_ACTIVITY', message: 'Hypothesis reactivated' });\n await refreshHypotheses();\n } catch (err) {\n // Error handling for reactivateHypothesis - silently fail\n }\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 scanAbortRef.current?.abort();\n scanAbortRef.current = new AbortController();\n const signal = scanAbortRef.current.signal;\n\n dispatch({ type: 'SET_HYPOTHESIS_SCANNING', hypothesisId: hypoId, progress: 'Gathering evidence...' });\n dispatch({ type: 'ADD_ACTIVITY', message: `Testing hypothesis: ${hypo.statement}` });\n dispatch({ type: 'SHOW_NOTIFICATION', message: `Gathering evidence for hypothesis...`, severity: 'info', autoHideMs: 3000 });\n\n const { gatherEvidenceForHypothesis } = await import('../../../agent/hypothesis.js');\n const evidence = await gatherEvidenceForHypothesis(hypoId, workDir, signal);\n\n scanAbortRef.current = null;\n dispatch({ type: 'SET_HYPOTHESIS_SCANNING', hypothesisId: null, progress: '' });\n\n if (evidence.length === 0) {\n dispatch({ type: 'SHOW_NOTIFICATION', message: `No evidence found for: ${hypo.statement}`, 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 await refreshHypotheses();\n }\n } catch (error) {\n scanAbortRef.current = null;\n dispatch({ type: 'SET_HYPOTHESIS_SCANNING', hypothesisId: null, progress: '' });\n const isAborted = error instanceof DOMException && error.name === 'AbortError';\n if (isAborted) {\n dispatch({ type: 'SHOW_NOTIFICATION', message: 'Test cancelled', severity: 'info', autoHideMs: 3000 });\n dispatch({ type: 'ADD_ACTIVITY', message: 'Test cancelled' });\n } else {\n dispatch({ type: 'ADD_ACTIVITY', message: `Check failed: ${error instanceof Error ? error.message : 'unknown'}` });\n }\n }\n }, [dispatch, hypothesesPanel.hypotheses, refreshHypotheses]);\n\n useInput((_input, key) => {\n if (hypothesesPanel.scanningHypothesisId && key.escape) {\n scanAbortRef.current?.abort();\n return;\n }\n\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 === 'c') {\n // 'c' for clear - remove oldest completed hypothesis\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.length === 0 && hypothesesPanel.hypotheses.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1} paddingX={1} borderStyle=\"round\" borderColor=\"yellow\">\n <Text color=\"yellow\" bold>⚠ No Active Hypotheses</Text>\n <Text dimColor>Hypotheses exist but none are being tested. Evidence won't be gathered.</Text>\n <Text dimColor>Press a to add a new hypothesis, or run: trie hypothesis add \"your hypothesis\"</Text>\n </Box>\n )}\n\n {testing.map((hypo, idx) => {\n const isSelected = hypothesesPanel.selectedIndex === idx;\n const isScanning = hypothesesPanel.scanningHypothesisId === hypo.id;\n const hasEvidence = hypo.evidenceCount > 0;\n const confLabel = hasEvidence ? `${Math.round(hypo.confidence * 100)}%` : 'untested';\n const sourceLabel = hypo.autoGenerated ? 'AI' : 'you';\n\n if (isScanning) {\n return (\n <Box key={hypo.id} borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Box flexDirection=\"column\">\n <Text wrap=\"wrap\">\n <Text bold color=\"cyan\">⟳ </Text>\n <Text color=\"cyan\" bold>{hypo.statement}</Text>\n </Text>\n <Text color=\"cyan\" dimColor>\n {hypothesesPanel.scanningProgress || 'Testing...'}\n </Text>\n <Text color=\"cyan\" dimColor> Esc to cancel</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Text key={hypo.id} wrap=\"wrap\">\n {isSelected ? <Text bold color=\"green\">{'> '}</Text> : ' '}\n {hypo.autoGenerated ? <Text color=\"cyan\">◇</Text> : <Text color=\"green\">○</Text>}{' '}\n {hypo.statement}\n <Text dimColor> [{sourceLabel}] {confLabel}{narrow ? '' : ` · ${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 const sourceLabel = h.autoGenerated ? 'AI' : 'you';\n const validatedByLabel = h.validatedBy === 'agent' ? 'AI' : 'you';\n const suffix = sourceLabel !== validatedByLabel ? ` [${sourceLabel}→${validatedByLabel}]` : ` [${sourceLabel}]`;\n return (\n <Text key={h.id} wrap=\"wrap\">\n {' '}{h.autoGenerated ? <Text color=\"cyan\">●</Text> : <Text color=\"green\">●</Text>}{' '}\n {h.statement}\n <Text dimColor>{suffix}</Text>\n </Text>\n );\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 const sourceLabel = h.autoGenerated ? 'AI' : 'you';\n return (\n <Text key={h.id} wrap=\"wrap\">\n {' '}{h.autoGenerated ? <Text color=\"cyan\">●</Text> : <Text color=\"red\">●</Text>}{' '}\n <Text dimColor>{h.statement}</Text>\n <Text dimColor> [{sourceLabel}]</Text>\n </Text>\n );\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, useStdout } from 'ink';\nimport { useDashboard } from '../state.js';\nimport { getWorkingDirectory } from '../../../utils/workspace.js';\nimport { ContextGraph } from '../../../context/graph.js';\nimport { TieredStorage } from '../../../storage/tiered-storage.js';\nimport { findCrossProjectPatterns } from '../../../memory/global-memory.js';\nimport { getLedgerBlocks, deleteBlocks, type LedgerBlock } from '../../../memory/ledger.js';\nimport type { FileNodeData, PatternNodeData, IncidentNodeData, DecisionNodeData, Node } from '../../../context/types.js';\nimport type { Governance, Gotcha } from '../../../types/signal.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, storageGovernance, storageGotchas, ledgerBlocks, expandedNodes, expandedItemId, selectedNode, loaded, pendingLedgerDelete } = memoryTree;\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\n const loadData = useCallback(async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const graph = new ContextGraph(workDir);\n const storage = new TieredStorage(workDir);\n const [snap, patterns, governance, gotchas, blocks] = await Promise.all([\n graph.getSnapshot(),\n findCrossProjectPatterns(2),\n storage.queryGovernance({ limit: 20 }).catch(() => []),\n storage.queryGotchas({ limit: 20, resolved: false }).catch(() => []),\n getLedgerBlocks(workDir).catch(() => []),\n ]);\n dispatch({ type: 'SET_MEMORY_TREE', snapshot: snap, patterns, storageGovernance: governance, storageGotchas: gotchas, ledgerBlocks: blocks });\n } catch (err) {\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 const handleIncidentAction = useCallback(async (action: 'delete' | 'resolve') => {\n const incidentId = (selectedNode?.startsWith('incident-') ? selectedNode : expandedItemId?.startsWith('incident-') ? expandedItemId : null)?.replace(/^incident-/, '');\n if (!incidentId) return;\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const graph = new ContextGraph(workDir);\n if (action === 'delete') {\n await graph.deleteNode('incident', incidentId);\n dispatch({ type: 'ADD_ACTIVITY', message: 'Incident deleted' });\n } else {\n await graph.updateNode('incident', incidentId, { resolved: true, resolution: 'self-resolved' });\n dispatch({ type: 'ADD_ACTIVITY', message: 'Incident resolved' });\n }\n dispatch({ type: 'SET_MEMORY_EXPANDED_ITEM', itemId: null });\n void loadData();\n } catch (err) {\n dispatch({ type: 'ADD_ACTIVITY', message: 'Failed to update incident' });\n }\n }, [selectedNode, expandedItemId, loadData, dispatch]);\n\n const handleLedgerBlockDelete = useCallback(async () => {\n const dateToDelete = pendingLedgerDelete;\n if (!dateToDelete) return;\n\n try {\n dispatch({ type: 'ADD_ACTIVITY', message: `Attempting to delete ledger block ${dateToDelete}...` });\n const workDir = getWorkingDirectory(undefined, true);\n const result = await deleteBlocks([dateToDelete], workDir, true);\n\n if (result.success) {\n dispatch({ type: 'ADD_ACTIVITY', message: `Ledger block ${dateToDelete} deleted permanently` });\n dispatch({ type: 'SET_MEMORY_EXPANDED_ITEM', itemId: null });\n dispatch({ type: 'SET_PENDING_LEDGER_DELETE', date: null });\n void loadData();\n } else {\n dispatch({ type: 'ADD_ACTIVITY', message: `Failed to delete block: ${result.error}` });\n dispatch({ type: 'SHOW_NOTIFICATION', message: result.error ?? 'Delete failed', severity: 'warning' });\n dispatch({ type: 'SET_PENDING_LEDGER_DELETE', date: null });\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'unknown error';\n dispatch({ type: 'ADD_ACTIVITY', message: `Failed to delete ledger block: ${msg}` });\n dispatch({ type: 'SHOW_NOTIFICATION', message: `Delete failed: ${msg}`, severity: 'warning' });\n dispatch({ type: 'SET_PENDING_LEDGER_DELETE', date: null });\n }\n }, [pendingLedgerDelete, loadData, dispatch]);\n\n useInput((_input, key) => {\n const incidentSelected = selectedNode?.startsWith('incident-') || expandedItemId?.startsWith('incident-');\n const ledgerBlockSelected = selectedNode?.startsWith('ledger-block-') || expandedItemId?.startsWith('ledger-block-');\n\n // Handle pending deletion confirmation - this must take priority over everything\n if (pendingLedgerDelete) {\n if (_input === 'y' || _input === 'Y' || key.return) {\n void handleLedgerBlockDelete();\n return;\n }\n if (_input === 'n' || _input === 'N' || key.escape) {\n dispatch({ type: 'SET_PENDING_LEDGER_DELETE', date: null });\n return;\n }\n // Consume ALL input during pending deletion to prevent global handlers from running\n return;\n }\n\n // Handle deletion actions\n if (incidentSelected && (_input === 'd' || _input === 'D')) {\n void handleIncidentAction('delete');\n return;\n }\n\n if (ledgerBlockSelected && (_input === 'd' || _input === 'D')) {\n const blockNodeId = selectedNode?.startsWith('ledger-block-') ? selectedNode : expandedItemId?.startsWith('ledger-block-') ? expandedItemId : null;\n const blockIndex = blockNodeId ? parseInt(blockNodeId.replace('ledger-block-', ''), 10) : -1;\n const block = blockIndex >= 0 ? ledgerBlocks[blockIndex] : null;\n if (block) {\n dispatch({ type: 'SET_PENDING_LEDGER_DELETE', date: block.date });\n }\n return;\n }\n\n if (incidentSelected && (_input === 'r' || _input === 'c')) {\n void handleIncidentAction('resolve');\n return;\n }\n if ((_input === 'R') || (!incidentSelected && !ledgerBlockSelected && _input === 'r')) {\n dispatch({ type: 'INVALIDATE_MEMORY_TREE' });\n return;\n }\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 else if (key.escape && expandedItemId) dispatch({ type: 'SET_MEMORY_EXPANDED_ITEM', itemId: null });\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 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 governance: Array<Governance & { outcome?: string }> = storageGovernance.length > 0\n ? storageGovernance\n : decisionNodes.map(n => ({\n id: n.id,\n decision: n.data.decision,\n context: n.data.context,\n when: n.data.timestamp,\n files: [],\n tags: [],\n status: 'active' as const,\n ...(n.data.reasoning != null ? { reasoning: n.data.reasoning } : {}),\n ...(n.data.outcome != null ? { outcome: n.data.outcome } : {}),\n }));\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 = governance.length + incidentNodes.length + patternNodes.length + globalPatterns.length + hotspots.length + ledgerBlocks.length;\n\n const expandedGovernance = expandedItemId?.startsWith('decision-')\n ? governance.find(g => `decision-${g.id}` === expandedItemId)\n : null;\n\n const expandedIncident = expandedItemId?.startsWith('incident-')\n ? incidentNodes.find(n => `incident-${n.id}` === expandedItemId)\n : null;\n\n const expandedGotcha = expandedItemId?.startsWith('gotcha-')\n ? storageGotchas.find(g => `gotcha-${g.id}` === expandedItemId) ?? null\n : null;\n\n const expandedLedgerBlock = expandedItemId?.startsWith('ledger-block-')\n ? (() => {\n const blockIndex = parseInt(expandedItemId.replace('ledger-block-', ''), 10);\n return ledgerBlocks[blockIndex] || null;\n })()\n : null;\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 dimColor> · r to refresh</Text></Text>\n\n {expandedGovernance && (\n <Box flexDirection=\"column\" marginTop={1} borderStyle=\"single\" borderColor=\"cyan\" paddingX={1} paddingY={1}>\n <Text bold color=\"cyan\">Governance detail (Enter or Esc to close)</Text>\n <Box marginTop={1}><Text><Text bold>Decision:</Text> {expandedGovernance.decision}</Text></Box>\n <Box marginTop={1}><Text><Text bold>Context:</Text> {expandedGovernance.context}</Text></Box>\n {expandedGovernance.reasoning && <Box marginTop={1}><Text><Text bold>Reasoning:</Text> {expandedGovernance.reasoning}</Text></Box>}\n {expandedGovernance.hash && <Box marginTop={1}><Text><Text bold>Hash:</Text> <Text dimColor>{expandedGovernance.hash}</Text></Text></Box>}\n {expandedGovernance.files?.length ? <Box marginTop={1}><Text><Text bold>Files:</Text> {expandedGovernance.files.join(', ')}</Text></Box> : null}\n {expandedGovernance.tags?.length ? <Box marginTop={1}><Text><Text bold>Tags:</Text> {expandedGovernance.tags.join(', ')}</Text></Box> : null}\n <Box marginTop={1}><Text dimColor>{expandedGovernance.when}</Text></Box>\n </Box>\n )}\n\n {expandedGotcha && (\n <Box flexDirection=\"column\" marginTop={1} borderStyle=\"single\" borderColor=\"yellow\" paddingX={1} paddingY={1}>\n <Text bold color=\"yellow\">Gotcha · Esc close</Text>\n <Box marginTop={1}><Text><Text bold>Message:</Text> {expandedGotcha.message}</Text></Box>\n <Box marginTop={1}><Text><Text bold>Risk:</Text> {expandedGotcha.riskLevel === 'critical' ? <Text color=\"red\">{expandedGotcha.riskLevel}</Text> : expandedGotcha.riskLevel === 'high' ? <Text color=\"yellow\">{expandedGotcha.riskLevel}</Text> : <Text>{expandedGotcha.riskLevel}</Text>} · {Math.round(expandedGotcha.confidence * 100)}% confidence</Text></Box>\n <Box marginTop={1}><Text><Text bold>Recommendation:</Text> {expandedGotcha.recommendation}</Text></Box>\n {expandedGotcha.file && <Box marginTop={1}><Text><Text bold>File:</Text> {expandedGotcha.file}</Text></Box>}\n {expandedGotcha.tags?.length ? <Box marginTop={1}><Text><Text bold>Tags:</Text> {expandedGotcha.tags.join(', ')}</Text></Box> : null}\n <Box marginTop={1}><Text dimColor>{expandedGotcha.timestamp}</Text></Box>\n </Box>\n )}\n\n {expandedIncident && (\n <Box flexDirection=\"column\" marginTop={1} borderStyle=\"single\" borderColor=\"yellow\" paddingX={1} paddingY={1}>\n <Text bold color=\"yellow\">Incident · d delete · r resolve · Esc close</Text>\n <Box marginTop={1}><Text><Text bold>Description:</Text> {expandedIncident.data.description}</Text></Box>\n <Box marginTop={1}><Text><Text bold>Severity:</Text> {expandedIncident.data.severity}</Text></Box>\n <Box marginTop={1}><Text dimColor>{expandedIncident.data.timestamp} · {expandedIncident.data.resolved ? 'resolved' : 'open'}</Text></Box>\n </Box>\n )}\n\n {expandedLedgerBlock && (\n <Box flexDirection=\"column\" marginTop={1} borderStyle=\"single\" borderColor=\"magenta\" paddingX={1} paddingY={1}>\n <Text bold color=\"magenta\">Ledger Block Details · d delete · Esc close</Text>\n {(() => {\n const aiAgents = new Set(['goal-violation', 'claude', 'agent', 'ai']);\n const hasAIAgents = expandedLedgerBlock.entries.some(e => aiAgents.has(e.agent));\n const hasLegacyAgents = expandedLedgerBlock.entries.some(e => !aiAgents.has(e.agent));\n const sourceLabel = hasAIAgents && !hasLegacyAgents\n ? 'AI (Claude)'\n : hasLegacyAgents && !hasAIAgents\n ? 'Legacy (deterministic agents)'\n : 'Mixed (legacy + AI)';\n const sourceColor = hasAIAgents && !hasLegacyAgents ? 'green' : hasLegacyAgents && !hasAIAgents ? 'yellow' : 'cyan';\n return (\n <Box marginTop={1}>\n <Text><Text bold>Source:</Text> <Text color={sourceColor}>{sourceLabel}</Text>\n {hasLegacyAgents ? <Text dimColor> New blocks use AI via watch + trie_scan_for_goal_violations</Text> : null}</Text>\n </Box>\n );\n })()}\n <Box marginTop={1}><Text><Text bold>Date:</Text> {expandedLedgerBlock.date} ({expandedLedgerBlock.entries.length} issues)</Text></Box>\n <Box marginTop={1}><Text><Text bold>Block Hash:</Text> <Text dimColor>{expandedLedgerBlock.blockHash}</Text></Text></Box>\n <Box marginTop={1}><Text><Text bold>Merkle Root:</Text> <Text dimColor>{expandedLedgerBlock.merkleRoot}</Text></Text></Box>\n {(() => {\n const severityCounts = expandedLedgerBlock.entries.reduce((acc, entry) => {\n acc[entry.severity] = (acc[entry.severity] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n const agentCounts = expandedLedgerBlock.entries.reduce((acc, entry) => {\n acc[entry.agent] = (acc[entry.agent] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n const aiAgents = new Set(['goal-violation', 'claude', 'agent', 'ai']);\n const aiEntries = Object.entries(agentCounts).filter(([a]) => aiAgents.has(a));\n const legacyEntries = Object.entries(agentCounts).filter(([a]) => !aiAgents.has(a));\n const agentsDisplay = [...aiEntries, ...legacyEntries]\n .map(([agent, count]) => `${agent} (${count})`)\n .join(', ');\n const fileCounts = expandedLedgerBlock.entries.reduce((acc, entry) => {\n acc[entry.file] = (acc[entry.file] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n\n return (\n <>\n <Box marginTop={1}><Text><Text bold>Severity:</Text> {Object.entries(severityCounts).map(([sev, count]) => `${count} ${sev}`).join(', ')}</Text></Box>\n <Box marginTop={1}><Text><Text bold>Agents:</Text> {agentsDisplay}</Text></Box>\n <Box marginTop={1}><Text><Text bold>Top Files:</Text> {Object.entries(fileCounts).sort((a, b) => b[1] - a[1]).slice(0, 3).map(([file, count]) => `${file.split('/').pop()} (${count})`).join(', ')}</Text></Box>\n </>\n );\n })()}\n <Box marginTop={1}><Text dimColor>Created: {expandedLedgerBlock.createdAt}</Text></Box>\n </Box>\n )}\n\n {pendingLedgerDelete && (\n <Box flexDirection=\"column\" marginTop={1} borderStyle=\"single\" borderColor=\"red\" paddingX={1} paddingY={1}>\n <Text bold color=\"red\">⚠️ DANGER: PERMANENT DELETION</Text>\n <Box marginTop={1}>\n <Text>You are about to permanently delete ledger block:</Text>\n </Box>\n <Box marginTop={1}>\n <Text bold color=\"cyan\">{pendingLedgerDelete}</Text>\n </Box>\n <Box marginTop={1}>\n <Text color=\"red\">This operation cannot be undone and will permanently</Text>\n </Box>\n <Box marginTop={0}>\n <Text color=\"red\">remove all issues and data from this block.</Text>\n </Box>\n <Box marginTop={1}>\n <Text><Text bold color=\"green\">y</Text> or <Text bold color=\"green\">Enter</Text> to confirm · <Text bold>n</Text> or <Text bold>Esc</Text> to cancel</Text>\n </Box>\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={1}>\n {renderHeader('decisions', 'Product Governance', governance.length, '-- use trie tell or chat')}\n {expandedNodes.has('decisions') && governance.slice(0, 10).map(g => {\n const nodeId = `decision-${g.id}`;\n const decWidth = Math.max(30, contentWidth - 25);\n const dec = g.decision.length > decWidth ? g.decision.slice(0, decWidth - 3) + '...' : g.decision;\n const outcomeColor = (g as { outcome?: string }).outcome === 'good' ? 'green' : (g as { outcome?: string }).outcome === 'bad' ? 'red' : undefined;\n return (\n <Text key={g.id} wrap=\"truncate\">\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 {!narrow && g.hash ? <Text dimColor> [{g.hash.slice(0, 8)}]</Text> : null}\n {narrow ? null : <Text dimColor> {timeAgo(g.when)}</Text>}\n {outcomeColor && !narrow ? <Text color={outcomeColor}> {(g as { outcome?: string }).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 descWidth = Math.max(30, contentWidth - 20);\n const desc = n.data.description.length > descWidth ? n.data.description.slice(0, descWidth - 3) + '...' : n.data.description;\n return (\n <Text key={n.id} wrap=\"truncate\">\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 {narrow ? null : <Text dimColor> {timeAgo(n.data.timestamp)}</Text>}\n {narrow ? null : <>{' '}{n.data.resolved ? <Text color=\"green\">resolved</Text> : <Text color=\"yellow\">open</Text>}</>}\n </Text>\n );\n })}\n\n {renderHeader('gotchas', 'Gotchas', storageGotchas.length, '-- potential risks from AI (run trie gotcha or watch)')}\n {expandedNodes.has('gotchas') && storageGotchas.slice(0, 10).map((g: Gotcha) => {\n const nodeId = `gotcha-${g.id}`;\n const riskColor = g.riskLevel === 'critical' ? 'red' : g.riskLevel === 'high' ? 'yellow' : undefined;\n const msgWidth = Math.max(30, contentWidth - 25);\n const msg = g.message.length > msgWidth ? g.message.slice(0, msgWidth - 3) + '...' : g.message;\n return (\n <Text key={g.id} wrap=\"truncate\">\n {sel(nodeId) ? <Text bold color=\"green\">{'> '}</Text> : ' '}\n {' '}{riskColor ? <Text color={riskColor}>●</Text> : <Text dimColor>○</Text>}{' '}\n {sel(nodeId) ? <Text bold color=\"green\">{msg}</Text> : <Text>{msg}</Text>}\n {narrow ? null : <Text dimColor> {g.riskLevel}</Text>}\n {narrow ? null : <Text dimColor> {timeAgo(g.timestamp)}</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 descWidth = Math.max(30, contentWidth - 15);\n const desc = n.data.description.length > descWidth ? n.data.description.slice(0, descWidth - 3) + '...' : n.data.description;\n return (\n <Text key={n.id} wrap=\"truncate\">\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 {narrow ? null : <>{' '}{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 descWidth = Math.max(25, contentWidth - 35);\n const desc = pattern.pattern.length > descWidth ? pattern.pattern.slice(0, descWidth - 3) + '...' : pattern.pattern;\n return (\n <Text key={pattern.id} wrap=\"truncate\">\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 {narrow ? null : <Text dimColor> {pattern.projects.length}p · {pattern.occurrences}x</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 const pathWidth = Math.max(20, contentWidth - 30);\n const displayPath = path.length > pathWidth ? path.slice(-pathWidth) : path;\n return (\n <Text key={n.id} wrap=\"truncate\">\n {sel(nodeId) ? <Text bold color=\"green\">{'> '}</Text> : ' '}\n {' '}<Text color={isCritical ? 'red' : 'yellow'}>●</Text>{' '}\n {sel(nodeId) ? <Text bold color=\"green\">{displayPath}</Text> : <Text>{displayPath}</Text>}\n {narrow ? null : <>{' '}<Text color={isCritical ? 'red' : 'yellow'}>{n.data.riskLevel}</Text></>}\n {narrow ? null : <Text dimColor> {n.data.changeCount} changes</Text>}\n </Text>\n );\n })}\n </>\n )}\n\n {ledgerBlocks.length > 0 && (\n <>\n {renderHeader('ledger-chain', 'Ledger Chain (hashes)', ledgerBlocks.length)}\n {expandedNodes.has('ledger-chain') && ledgerBlocks.map((block: LedgerBlock, i: number) => {\n const nodeId = `ledger-block-${i}`;\n const aiAgents = new Set(['goal-violation', 'claude', 'agent', 'ai']);\n const hasAIAgents = block.entries.some(e => aiAgents.has(e.agent));\n const hasLegacyAgents = block.entries.some(e => !aiAgents.has(e.agent));\n const blockSource = hasAIAgents && !hasLegacyAgents ? 'AI' : hasLegacyAgents && !hasAIAgents ? 'legacy' : 'mixed';\n const severityCounts = block.entries.reduce((acc, entry) => {\n acc[entry.severity] = (acc[entry.severity] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n const topSeverity = Object.keys(severityCounts).sort((a, b) => {\n const order = { critical: 0, high: 1, medium: 2, low: 3, info: 4 };\n return (order[a as keyof typeof order] ?? 5) - (order[b as keyof typeof order] ?? 5);\n })[0];\n const agentCounts = block.entries.reduce((acc, entry) => {\n acc[entry.agent] = (acc[entry.agent] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n const topAgent = Object.keys(agentCounts).sort((a, b) => (agentCounts[b] ?? 0) - (agentCounts[a] ?? 0))[0];\n const blkShort = block.blockHash?.slice(0, 6) || '—';\n const mkShort = block.merkleRoot?.slice(0, 6) || '—';\n\n return (\n <Text key={nodeId} wrap=\"truncate\">\n {sel(nodeId) ? <Text bold color=\"green\">{'> '}</Text> : ' '}\n {' '}{blockSource === 'AI' ? <Text color=\"green\">●</Text> : blockSource === 'legacy' ? <Text color=\"yellow\">●</Text> : <Text dimColor>●</Text>}{' '}\n {sel(nodeId) ? <Text bold color=\"green\">Block {i + 1}</Text> : <Text>Block {i + 1}</Text>}\n {narrow ? null : <Text dimColor> {block.date}</Text>}\n {narrow ? null : <>{' '}<Text dimColor>[{blockSource}]</Text></>}\n {narrow ? null : <>{' '}<Text dimColor>blk:{blkShort}… mk:{mkShort}…</Text></>}\n {narrow ? null : <>{' '}<Text dimColor>{block.entries.length} entries</Text></>}\n {narrow ? null : topSeverity != null ? <>{' '}<Text dimColor>({(severityCounts[topSeverity] ?? 0)} {topSeverity})</Text></> : null}\n {narrow ? null : topAgent != null ? <>{' '}<Text dimColor>by {topAgent}</Text></> : null}\n {sel(nodeId) ? <Text dimColor> [Enter: details, d: delete]</Text> : null}\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} wrap=\"wrap\">\n {' '}<Text dimColor>{entry.time}</Text> {dot} {entry.message}\n </Text>\n );\n })}\n </Box>\n );\n}\n","import React, { useCallback, useRef, useEffect, useState } from 'react';\nimport { Box, Text, useInput, useStdout } 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 { getProjectState } from '../../../agent/project-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 let recentNudges: Array<{ message: string; file?: string; priority?: number }> = [];\n if (dashboardState?.agentInsights?.length) {\n recentNudges = dashboardState.agentInsights\n .filter((i: any) => i.type === 'warning' && !i.dismissed)\n .slice(0, 5)\n .map((i: any) => {\n const file = i.suggestedAction?.replace(/^Review /, '');\n return { message: i.message, ...(file ? { file } : {}), ...(i.priority != null ? { priority: i.priority } : {}) };\n });\n }\n if (recentNudges.length === 0) {\n try {\n const storage = new TieredStorage(workDir);\n await storage.initialize();\n const fromStorage = await storage.queryNudges({ resolved: false, limit: 5 });\n recentNudges = fromStorage.map(n => ({ message: n.message, ...(n.file ? { file: n.file } : {}), ...(n.priority != null ? { priority: n.priority } : {}) }));\n } catch { /* ignore */ }\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: ${n.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 // Add active goals, hypotheses, and recent violations\n try {\n const projectState = getProjectState(workDir);\n await projectState.load();\n const activeGoals = projectState.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 const unchecked = recentNudges.length === 0;\n return `- \"${g.description}\" [${g.category || 'general'}]${caughtCount > 0 ? ` - ${caughtCount} violation(s)${lastCaught}` : ''}${unchecked ? ' (UNCHECKED - use trie_scan_for_goal_violations to verify)' : ''}`;\n }).join('\\n'));\n }\n const hypotheses = projectState.getAllHypotheses().filter(h => h.status === 'testing' || h.status === 'validated');\n if (hypotheses.length > 0) {\n parts.push('Hypotheses (testing/validated):\\n' + hypotheses.map(h => {\n const hasEvidence = (h.evidence?.length ?? 0) > 0;\n const confLabel = hasEvidence && h.confidence != null ? `${Math.round(h.confidence * 100)}%` : 'untested';\n const evidenceCount = h.evidence?.length ?? 0;\n const untested = evidenceCount === 0;\n return `- ID: ${h.id} | \"${h.statement}\" [${h.status}] ${confLabel} · ${evidenceCount} evidence${untested ? ' (UNTESTED - use trie_test_hypothesis to gather evidence)' : ''}`;\n }).join('\\n'));\n }\n } catch (error) {\n console.error('Failed to load project state:', error);\n }\n\n try {\n const storage = new TieredStorage(workDir);\n try {\n const governance = await storage.queryGovernance({ limit: 10 });\n if (governance.length > 0) {\n parts.push('Recent governance:\\n' + governance.map(d =>\n `- ${d.decision} (${d.when}${d.hash ? `, hash: ${d.hash.slice(0, 8)}` : ''})`\n ).join('\\n'));\n }\n } catch (error) {\n console.error('Failed to query governance:', error);\n }\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 (error) {\n console.error('Failed to query blockers:', error);\n }\n } catch (error) {\n console.error('Storage unavailable:', error);\n }\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 (error) {\n console.error('Context graph unavailable:', error);\n }\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 let content = m.content;\n // Include pending fix context so AI can use for ad-hoc cloud dispatch\n const fixes = m.pendingFixes ?? (m.pendingFix ? [m.pendingFix] : []);\n if (fixes.length > 0) {\n const fixCtx = fixes.map(f => `file: ${f.file}, goal: ${f.goal}, violation: ${f.violation}${f.suggestedFix ? `, suggestedFix: ${f.suggestedFix}` : ''}`).join('; ');\n content = content ? `${content}\\n\\n[Proposed fix context: ${fixCtx}]` : `[Proposed fix context: ${fixCtx}]`;\n }\n return { role: m.role, content };\n });\n}\n\nconst SYSTEM_PROMPT = `You are Trie, a code 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 ALL stored context: goals, hypotheses, nudges, decisions, blockers via trie_query_context\n- Create and manage goals and hypotheses\n- Propose fixes for goal violations (requires user confirmation before spawning Claude Code)\n- Run AI-powered scans to detect goal violations across the entire codebase\n- Save work checkpoints\n\n**IMPORTANT - Finding Code Issues:**\n- You have a trie_scan_for_goal_violations tool - use this to scan the codebase for goal violations\n- This is the BEST way to find emojis, TODOs, or other patterns that violate goals\n- It uses AI analysis and is much more reliable than regex pattern matching\n- You also have trie_search_files but it requires ripgrep (often not installed)\n\n**When user asks \"what are my goals\", \"show hypotheses\", \"any nudges\", \"latest decisions\", etc.:**\n- The project context block already includes goals, hypotheses, nudges, decisions, blockers\n- If the user wants more detail or the context seems stale: Call trie_query_context with the relevant query (e.g. query: \"goals\", type: \"goals\")\n- trie_query_context returns goals, hypotheses, nudges, decisions, and blockers — use it for any \"what do I have\" questions\n\n**PROACTIVE - When you see goals marked UNCHECKED (no recent nudges):**\n- These haven't been scanned recently. Proactively offer: \"I see your goals haven't been checked recently. Would you like me to run trie_scan_for_goal_violations to verify they're being met?\"\n- If the user agrees, call trie_scan_for_goal_violations. It uses AI to check the codebase against all active goals.\n\n**PROACTIVE - When you see hypotheses with 0 evidence (marked UNTESTED):**\n- These have no evidence yet. Proactively offer: \"I see you have N hypotheses with no evidence yet. Would you like me to run a scan and gather evidence for them? I can use trie_scan_for_goal_violations (to populate issues) and trie_test_hypothesis (to validate each one).\"\n- If the user agrees, call trie_scan_for_goal_violations first (populates issues for hypothesis analysis), then trie_test_hypothesis for each untested hypothesis.\n- CRITICAL: trie_test_hypothesis requires a hypothesisId parameter. The hypothesis IDs are shown in the project context (look for \"ID: hyp-...\"). Always use these exact IDs, never numeric IDs like 1, 2, 3.\n\n**When user asks about code content (emojis, TODOs, etc.):**\n1. First check the \"Recent goal violations (nudges)\" section in project context\n2. If found, report what you see\n3. If not found or user wants a full scan: Call trie_scan_for_goal_violations\n4. The scan will find all violations and update the Goals view automatically\n\n**When user asks to test hypotheses:**\n1. Look at the project context to find hypothesis IDs (format: \"ID: hyp-...\" at the start of each hypothesis line)\n2. For each hypothesis you want to test, call trie_test_hypothesis with the EXACT hypothesis ID from the context\n3. NEVER use numeric IDs like 1, 2, 3 - always use the full ID like \"hyp-1771957097120-bogco0\"\n4. If hypothesis IDs aren't in the context, first call trie_query_context with type=\"hypotheses\" to fetch them\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 for ALL files\n3. If multiple violations: Call trie_propose_fixes_batch ONCE with all fixes\n4. If single violation: Call trie_propose_fix once\n5. AFTER the tool call completes, the system will ask for user confirmation - do NOT add your own confirmation message\n6. When the user says \"yes\", \"yes to all\", or \"no\", the system handles spawning Claude Code automatically\n\n**When user asks to dispatch or fix with Cursor Cloud agent:**\n- Default: Call trie_cloud_fix action:dispatch — triage runs and routes issues as usual.\n- If user EXPLICITLY says they want cloud (e.g. \"fix it with cloud agent\", \"I want cloud\", \"use cursor cloud\"): add forceCloud:true so triage does not override their choice. Do NOT suggest local fix instead — honor their request.\n- If there are no scan issues but the conversation has a recent trie_propose_fix: use ad-hoc dispatch with file, issue, fix from that context.\n- If the tool returns \"Cloud Agent dispatch requires a Cursor API key\", tell the user to configure it.\n- For status: trie_cloud_fix action:status\n\nExamples:\n- User: \"do we have emojis?\" → Check nudges first. If none or unclear: Call trie_scan_for_goal_violations to scan the codebase.\n- User: \"run a full scan for emojis\" → Call trie_scan_for_goal_violations directly.\n- User: \"fix the emoji violations\" → Find ALL emoji violations in nudges, call trie_propose_fixes_batch ONCE with all fixes, then STOP\n- User responds \"yes to all\" after proposal → Just say \"Spawning Claude Code to fix all files...\" The system handles it.\n- User: \"search for TODO comments\" → If there's a goal about TODOs, use trie_scan_for_goal_violations. Otherwise explain no such goal exists.\n- User: \"fix it with cloud agent\" (explicit) → Call trie_cloud_fix action:dispatch forceCloud:true — honor their choice, don't suggest local.\n- User: \"dispatch to cloud\" (generic) → Call trie_cloud_fix action:dispatch — triage as usual.\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, progress, messageQueue, currentSessionId, currentSessionTitle } = chatState;\n const loadingRef = useRef(false);\n const { stdout } = useStdout();\n\n // Blinking cursor state\n const [cursorVisible, setCursorVisible] = useState(true);\n // Scroll position (0 = bottom/newest, higher = scrolled up)\n const [scrollOffset, setScrollOffset] = useState(0);\n\n // Calculate visible messages based on terminal height\n // Leave space for header (2 lines) and input box (3 lines) and margins (2 lines)\n const terminalHeight = stdout?.rows || 24;\n const terminalWidth = stdout?.columns || 80;\n const contentWidth = Math.max(40, terminalWidth - 4); // Leave margin for padding\n const availableLines = Math.max(8, terminalHeight - 7);\n const VISIBLE_MESSAGES = Math.min(availableLines, 20); // Cap at reasonable number\n \n // Blink cursor every 500ms when not loading\n useEffect(() => {\n if (loading) {\n setCursorVisible(true);\n return;\n }\n const interval = setInterval(() => {\n setCursorVisible(v => !v);\n }, 500);\n return () => clearInterval(interval);\n }, [loading]);\n \n // Reset scroll to bottom when new messages arrive\n useEffect(() => {\n setScrollOffset(0);\n }, [messages.length]);\n\n // Auto-save chat messages after they change\n useEffect(() => {\n if (messages.length === 0) return;\n\n const saveChat = async () => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const { getChatStore } = await import('../chat-store.js');\n const store = getChatStore(workDir);\n \n // Save the session (updates if sessionId exists, creates new if not)\n const sessionId = await store.saveSession(\n messages,\n currentSessionId || undefined,\n currentSessionTitle || undefined\n );\n\n // Update the current session ID if this is a new session\n if (!currentSessionId) {\n dispatch({ type: 'SET_CHAT_SESSION', sessionId, title: null });\n }\n } catch (error) {\n console.error('Failed to auto-save chat:', error);\n }\n };\n\n // Debounce the save to avoid saving on every keystroke\n const timeout = setTimeout(() => void saveChat(), 2000);\n return () => clearTimeout(timeout);\n }, [messages, currentSessionId, currentSessionTitle, dispatch]);\n\n const sendMessage = useCallback(async (question: string) => {\n // Check loading state before setting ref to prevent race conditions\n if (loadingRef.current) return;\n \n // Set loading ref IMMEDIATELY before any async dispatches\n loadingRef.current = true;\n \n // Now dispatch state updates\n dispatch({ type: 'SET_CHAT_LOADING', loading: true });\n dispatch({ type: 'ADD_CHAT_MESSAGE', role: 'user', content: question });\n dispatch({ type: 'SET_CHAT_INPUT', buffer: '' });\n dispatch({ type: 'SET_CHAT_PROGRESS', message: 'Thinking...' });\n\n try {\n const workDir = getWorkingDirectory(undefined, true);\n \n // Check if user is responding to pending fix(es)\n const response = question.trim().toLowerCase();\n const isYesToAll = response === 'yes to all' || response === 'y to all' || response === 'yes all';\n const isYes = response === 'yes' || response === 'y';\n const isNo = response === 'no' || response === 'n';\n \n // Collect all pending fixes from recent assistant messages\n const collectPendingFixes = (): Array<{ file: string; goal: string; violation: string; suggestedFix?: string; directory: string }> => {\n const fixes: Array<{ file: string; goal: string; violation: string; suggestedFix?: string; directory: string }> = [];\n const recentAssistantMessages = messages.filter(m => m.role === 'assistant').slice(-5);\n for (const msg of recentAssistantMessages) {\n if (msg.pendingFixes?.length) {\n for (const pf of msg.pendingFixes) {\n if (pf.directory) fixes.push({ file: pf.file, goal: pf.goal, violation: pf.violation, directory: pf.directory, ...(pf.suggestedFix ? { suggestedFix: pf.suggestedFix } : {}) });\n }\n } else if (msg.pendingFix) {\n const pf = msg.pendingFix;\n if (pf.directory) {\n fixes.push({ file: pf.file, goal: pf.goal, violation: pf.violation, directory: pf.directory, ...(pf.suggestedFix ? { suggestedFix: pf.suggestedFix } : {}) });\n }\n }\n }\n return fixes;\n };\n \n const allPendingFixes = collectPendingFixes();\n const lastAssistantMessage = messages.filter(m => m.role === 'assistant').pop();\n const lastFixesRaw = lastAssistantMessage?.pendingFixes?.length ? lastAssistantMessage.pendingFixes : (lastAssistantMessage?.pendingFix ? [lastAssistantMessage.pendingFix] : []);\n const lastFixes = lastFixesRaw.filter((pf): pf is typeof pf & { directory: string } => !!pf.directory).map(pf => ({ file: pf.file, goal: pf.goal, violation: pf.violation, directory: pf.directory, ...(pf.suggestedFix ? { suggestedFix: pf.suggestedFix } : {}) }));\n \n if (allPendingFixes.length > 0 && (isYes || isYesToAll || isNo)) {\n if (isNo) {\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 \n // Determine which fixes to apply\n const fixesToApply = isYesToAll ? allPendingFixes : lastFixes;\n \n if (fixesToApply.length > 0) {\n const { spawnClaudeCodeFix } = await import('../../../utils/terminal-spawn.js');\n const results: string[] = [];\n const errors: string[] = [];\n \n for (const fix of fixesToApply) {\n try {\n await spawnClaudeCodeFix({\n file: fix.file,\n goal: fix.goal,\n violation: fix.violation,\n ...(fix.suggestedFix ? { suggestedFix: fix.suggestedFix } : {}),\n cwd: fix.directory ?? workDir,\n });\n results.push(`\"${fix.file}\"`);\n } catch (error) {\n errors.push(`${fix.file}: ${error instanceof Error ? error.message : 'unknown error'}`);\n }\n }\n \n let message = '';\n if (results.length > 0) {\n if (results.length === 1 && fixesToApply[0]) {\n const fix = fixesToApply[0];\n message = `Spawned Claude Code in a new terminal to fix ${results[0]}.\\n\\nClaude Code will:\\n1. Review the file\\n2. Understand the goal: \"${fix.goal}\"\\n3. Fix the violation: \"${fix.violation}\"\\n4. Preserve all functionality\\n\\nCheck the new terminal window to see the fix in progress.`;\n } else {\n message = `Spawned Claude Code to fix ${results.length} files:\\n${results.map(r => `- ${r}`).join('\\n')}\\n\\nCheck the new terminal windows to see the fixes in progress.`;\n }\n }\n if (errors.length > 0) {\n message += `\\n\\nFailed to spawn fixes for:\\n${errors.map(e => `- ${e}`).join('\\n')}`;\n }\n \n dispatch({\n type: 'ADD_CHAT_MESSAGE',\n role: 'assistant',\n content: message,\n });\n dispatch({ type: 'SET_CHAT_LOADING', loading: false });\n loadingRef.current = false;\n return;\n }\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 // Wrap executeTool so ledger-writing tools trigger a ledger view refresh\n const LEDGER_WRITING_TOOLS = new Set(['trie_scan_for_goal_violations', 'trie_tell', 'trie_add_goal']);\n const executeToolWithRefresh = async (name: string, input: Record<string, unknown>, onProgress?: (msg: string) => void) => {\n const result = await executeTool(name, input, onProgress);\n if (LEDGER_WRITING_TOOLS.has(name)) {\n dispatch({ type: 'INVALIDATE_MEMORY_TREE' });\n }\n return result;\n };\n\n // No timeout - let chat operations take as long as they need\n const result = await runAIWithTools({\n systemPrompt: fullSystem,\n messages: history,\n tools: CHAT_TOOLS,\n executeTool: executeToolWithRefresh,\n maxTokens: 4096,\n maxToolRounds: 8,\n onProgress: (msg) => dispatch({ type: 'SET_CHAT_PROGRESS', message: msg }),\n });\n\n if (result.success) {\n const action: Parameters<typeof dispatch>[0] & {\n type: 'ADD_CHAT_MESSAGE';\n pendingFix?: { file: string; goal: string; violation: string; suggestedFix?: string; directory: string };\n pendingFixes?: Array<{ file: string; goal: string; violation: string; suggestedFix?: string; directory: string }>;\n } = {\n type: 'ADD_CHAT_MESSAGE',\n role: 'assistant',\n content: result.content,\n };\n\n // Check if response or tool results contain pending fix(es)\n const pendingFixRegex = /\\[PENDING_FIX:(.+?)\\]/g;\n const pendingFixes: Array<{ file: string; goal: string; violation: string; suggestedFix?: string; directory: string }> = [];\n \n // Parse from main content\n let match;\n while ((match = pendingFixRegex.exec(result.content)) !== null) {\n try {\n const jsonStr = match[1];\n if (jsonStr) {\n const fixData = JSON.parse(jsonStr);\n pendingFixes.push(fixData);\n }\n } catch {\n // Invalid JSON, skip this one\n }\n }\n \n // Also parse from tool results (where trie_propose_fixes_batch outputs them)\n if (result.toolResults && result.toolResults.length > 0) {\n for (const toolResult of result.toolResults) {\n const toolRegex = /\\[PENDING_FIX:(.+?)\\]/g;\n let toolMatch;\n while ((toolMatch = toolRegex.exec(toolResult)) !== null) {\n try {\n const jsonStr = toolMatch[1];\n if (jsonStr) {\n const fixData = JSON.parse(jsonStr);\n // Avoid duplicates by checking file path\n if (!pendingFixes.some(f => f.file === fixData.file)) {\n pendingFixes.push(fixData);\n }\n }\n } catch {\n // Invalid JSON, skip\n }\n }\n }\n }\n \n if (pendingFixes.length > 0) {\n // Remove all JSON markers from the content\n action.content = result.content.replace(/\\[PENDING_FIX:.+?\\]/g, '').trim();\n \n const firstFix = pendingFixes[0];\n if (pendingFixes.length === 1 && firstFix) {\n // Single fix - use pendingFix for backward compatibility\n action.pendingFix = firstFix;\n } else {\n // Multiple fixes - use pendingFixes array\n action.pendingFixes = pendingFixes;\n }\n }\n \n if (result.toolCalls && result.toolCalls.length > 0) {\n action.toolCalls = result.toolCalls.map((tc, i) => ({ id: `tc-${Date.now()}-${i}`, name: tc.name, input: tc.input }));\n const toolNames = new Set(result.toolCalls.map(tc => tc.name));\n if (toolNames.has('trie_add_goal') || toolNames.has('trie_add_hypothesis') || toolNames.has('trie_test_hypothesis')) {\n try {\n const agentState = getProjectState(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, startValue: g.startValue, status: g.status, autoGenerated: g.autoGenerated, updatedAt: g.updatedAt, ...(g.category != null ? { category: g.category } : {}) };\n return base;\n }),\n });\n }\n if (toolNames.has('trie_add_hypothesis') || toolNames.has('trie_test_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, ...(h.category != null ? { category: h.category } : {}) };\n return base;\n }),\n });\n }\n } catch (error) {\n console.error('Failed to update state after tool calls:', error);\n }\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 dispatch({ type: 'SET_CHAT_PROGRESS', message: null });\n loadingRef.current = false;\n }\n }, [dispatch, state]);\n\n // Process queued messages when loading finishes (like Claude Code)\n useEffect(() => {\n if (!loading && messageQueue.length > 0 && !loadingRef.current) {\n const msg = messageQueue[0];\n if (msg) {\n dispatch({ type: 'DEQUEUE_CHAT_MESSAGE' });\n void sendMessage(msg);\n }\n }\n }, [loading, messageQueue.length, dispatch, sendMessage]);\n\n useInput((input, key) => {\n // Allow canceling during loading (Esc)\n if (loading && key.escape) {\n loadingRef.current = false;\n dispatch({ type: 'SET_CHAT_LOADING', loading: false });\n dispatch({ type: 'SET_CHAT_PROGRESS', message: null });\n dispatch({ type: 'ADD_CHAT_MESSAGE', role: 'assistant', content: 'Request cancelled.' });\n return;\n }\n \n // Scroll up/down through messages (allowed even when loading)\n if (key.upArrow) {\n const maxScroll = Math.max(0, messages.length - VISIBLE_MESSAGES);\n setScrollOffset(prev => Math.min(prev + 1, maxScroll));\n return;\n } else if (key.downArrow) {\n setScrollOffset(prev => Math.max(prev - 1, 0));\n return;\n }\n\n // Slash commands (work even when loading)\n if (key.return && inputBuffer.trim() === '/history') {\n dispatch({ type: 'SET_CHAT_INPUT', buffer: '' });\n dispatch({ type: 'SET_VIEW', view: 'chat-archive' });\n return;\n }\n \n if (key.return && inputBuffer.trim().length > 0) {\n if (loading) {\n dispatch({ type: 'QUEUE_CHAT_MESSAGE', message: inputBuffer.trim() });\n dispatch({ type: 'SET_CHAT_INPUT', buffer: '' });\n } else {\n void sendMessage(inputBuffer.trim());\n }\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 // Calculate visible messages with scroll\n const visibleMessages = (() => {\n if (messages.length <= VISIBLE_MESSAGES) return messages;\n const endIdx = messages.length - scrollOffset;\n const startIdx = Math.max(0, endIdx - VISIBLE_MESSAGES);\n return messages.slice(startIdx, endIdx);\n })();\n \n const canScrollUp = scrollOffset < messages.length - VISIBLE_MESSAGES;\n const canScrollDown = scrollOffset > 0;\n const cursor = cursorVisible ? '|' : ' ';\n\n return (\n <Box flexDirection=\"column\" paddingX={1} height=\"100%\" minHeight={0}>\n <Box flexShrink={0}>\n <Text>\n <Text bold>Chat</Text>\n {currentSessionTitle && <Text dimColor> {currentSessionTitle}</Text>}\n <Text dimColor> (/history)</Text>\n {messageQueue.length > 0 && (\n <Text dimColor> [{messageQueue.length} queued]</Text>\n )}\n {messages.length > VISIBLE_MESSAGES && (\n <Text dimColor> [{canScrollUp ? '↑' : ' '}{canScrollDown ? '↓' : ' '}]</Text>\n )}\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" flexGrow={1} flexShrink={1} height=\"100%\" minHeight={0} marginTop={1} marginBottom={1} width={terminalWidth}>\n {messages.length === 0 && !loading && (\n <Text dimColor> Ask about your codebase, decisions, patterns, or risks.</Text>\n )}\n\n {canScrollUp && <Text dimColor> ↑ more messages above</Text>}\n\n {visibleMessages.map((msg, idx) => (\n <Box key={idx} flexDirection=\"column\" marginTop={idx === 0 ? 0 : 1} width={contentWidth}>\n {msg.role === 'user' ? (\n <Text wrap=\"wrap\"> <Text bold color=\"green\">You:</Text> {wrapLine(msg.content, contentWidth - 8)}</Text>\n ) : (\n <Box flexDirection=\"column\">\n {msg.toolCalls && msg.toolCalls.length > 0 && msg.toolCalls.map((tc, ti) => (\n <Text key={ti} wrap=\"wrap\" dimColor> <Text color=\"yellow\">[{tc.name}]</Text> {wrapLine(formatToolInput(tc.input), contentWidth - 12)}</Text>\n ))}\n {wrapContent(msg.content, contentWidth - 8).map((line, li) => (\n <Text key={li} wrap=\"wrap\">{li === 0 ? ' Trie: ' : ' '}{line}</Text>\n ))}\n </Box>\n )}\n </Box>\n ))}\n\n {canScrollDown && <Text dimColor> ↓ more messages below</Text>}\n\n {loading && <Text dimColor> {progress || 'Thinking...'}<Text dimColor> (Esc to cancel)</Text></Text>}\n </Box>\n\n <Box borderStyle=\"single\" borderColor=\"green\" paddingX={1} flexShrink={0} flexGrow={0}>\n <Text>\n {inputBuffer ? (\n <>{inputBuffer}<Text bold color=\"green\">{cursor}</Text></>\n ) : (\n <><Text bold color=\"green\">{cursor}</Text><Text dimColor>Ask a question...</Text></>\n )}\n </Text>\n </Box>\n </Box>\n );\n}\n\n/** Word-wrap a single line to fit terminal width */\nfunction wrapLine(text: string, width: number): string {\n if (width <= 0 || text.length <= width) return text;\n const lines: string[] = [];\n const words = text.split(/\\s+/);\n let current = '';\n for (const w of words) {\n const wouldBe = current ? current + ' ' + w : w;\n if (wouldBe.length <= width) {\n current = wouldBe;\n } else {\n if (current) lines.push(current);\n current = w.length > width ? w.match(new RegExp(`.{1,${width}}`, 'g'))?.join('\\n') ?? w : w;\n }\n }\n if (current) lines.push(current);\n return lines.join('\\n');\n}\n\n/** Wrap multi-line content, preserving paragraph breaks */\nfunction wrapContent(content: string, width: number): string[] {\n const result: string[] = [];\n for (const para of content.split('\\n')) {\n const wrapped = wrapLine(para.trim(), width);\n result.push(...wrapped.split('\\n'));\n }\n return result;\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)) {\n // Handle arrays properly - if items are objects, show count instead of stringifying\n if (v.length > 0 && typeof v[0] === 'object' && v[0] !== null) {\n parts.push(`${k}: [${v.length} item${v.length !== 1 ? 's' : ''}]`);\n } else {\n parts.push(`${k}: [${v.join(', ')}]`);\n }\n } else if (typeof v === 'object' && v !== null) {\n // Handle non-array objects\n parts.push(`${k}: {object}`);\n } else {\n parts.push(`${k}: ${String(v)}`);\n }\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 gov of extractedSignal.governance) {\n gov.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.governance.length > 0 ? `${extractedSignal.governance.length} governance` : 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 Governance, \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 \"governance\": [{\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 gotchas: [],\n governance: extracted.governance.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 governance: Partial<Governance>[];\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 const parsed = JSON.parse(jsonMatch[0]);\n return {\n governance: parsed.governance,\n facts: parsed.facts,\n blockers: parsed.blockers,\n questions: parsed.questions,\n };\n }\n } catch (e) {\n // JSON parse failed\n }\n\n // Return empty structure\n return {\n governance: [],\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 governance: Governance[] = [];\n const facts: Fact[] = [];\n const blockers: Blocker[] = [];\n const questions: Question[] = [];\n\n if (hasDecision) {\n governance.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 governance,\n facts,\n blockers,\n questions,\n gotchas: [],\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 relatedGovernance: string[]; // IDs of related governance records\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 relatedGovernance: [], // 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 gov of signal.governance) {\n gov.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 gov of signal.governance) {\n gov.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 governance/facts\n const allText = [\n ...signal.governance.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 gov of signal.governance) {\n for (const file of gov.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';\nimport { getOutputManager } from '../utils/output-manager.js';\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 const outputManager = getOutputManager();\n outputManager.debug('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 outputManager.debug(`Extracted ${extractedSignal.governance.length} governance, ${extractedSignal.facts.length} facts, ${extractedSignal.blockers.length} blockers, ${extractedSignal.questions.length} questions`);\n\n // Step 2: Enrich with metadata (tags, files, relationships)\n outputManager.debug('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 outputManager.debug(`Expanded tags: ${enrichedMeta.expandedTags.slice(0, 5).join(', ')}${enrichedMeta.expandedTags.length > 5 ? '...' : ''}`);\n }\n if (enrichedMeta.dependencies.length > 0) {\n outputManager.debug(`Dependencies: ${enrichedMeta.dependencies.join(', ')}`);\n }\n if (enrichedMeta.codebaseArea.length > 0) {\n outputManager.debug(`Codebase areas: ${enrichedMeta.codebaseArea.join(', ')}`);\n }\n if (enrichedMeta.domain.length > 0) {\n outputManager.debug(`Domains: ${enrichedMeta.domain.join(', ')}`);\n }\n\n // Step 3: Store in warm storage\n outputManager.debug('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 outputManager.debug('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 gotchas: signal.gotchas ?? [],\n governance: signal.governance.map(d => {\n const gov = {\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 gov.who = d.who || context.who;\n }\n return gov;\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 '../agent/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 * Cloud Fix Tool — `trie_cloud_fix`\n *\n * Dispatches issues to Cursor cloud agents for verified, test-passing fixes.\n * Modes: configure, dispatch, status, artifacts, cancel.\n *\n * Job state persists in `.trie/cloud-jobs.json`.\n */\n\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { execSync } from 'child_process';\n\nimport type { Issue } from '../types/index.js';\nimport { getWorkingDirectory, getTrieDirectory } from '../utils/workspace.js';\nimport { loadAutonomyConfig, saveAutonomyConfig } from '../utils/autonomy-config.js';\nimport { CursorCloudAgentClient } from '../integrations/cursor-cloud-agent.js';\nimport { triageIssues, formatTriageTable } from './fix-triage.js';\nimport { getPendingFixes } from './fix.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface CloudJobRecord {\n issueId: string;\n jobId: string;\n status: 'dispatched' | 'running' | 'verified' | 'failed';\n score: number;\n strategy: 'cloud-agent';\n dispatchedAt: string;\n artifactUrls: string[];\n prUrl: string | null;\n}\n\ninterface CloudJobsStore {\n jobs: Record<string, CloudJobRecord>;\n}\n\n// ============================================================================\n// Tool\n// ============================================================================\n\nexport class TrieCloudFixTool {\n async execute(args: any) {\n const { action = 'status' } = args || {};\n\n switch (action) {\n case 'configure':\n return this.configure(args);\n case 'dispatch':\n return this.dispatch(args);\n case 'status':\n return this.status();\n case 'artifacts':\n return this.artifacts(args);\n case 'cancel':\n return this.cancel(args);\n default:\n return this.text(`Unknown action \"${action}\". Use: configure | dispatch | status | artifacts | cancel`);\n }\n }\n\n // --------------------------------------------------------------------------\n // configure\n // --------------------------------------------------------------------------\n\n private async configure(args: any) {\n const apiKey: string | undefined = args?.apiKey || process.env.CURSOR_API_KEY;\n if (!apiKey) {\n return this.text(\n 'Missing API key.\\n\\n' +\n 'Usage: trie_cloud_fix action:configure apiKey:\"key-...\"\\n' +\n 'Or set: export CURSOR_API_KEY=\"key-...\"',\n );\n }\n\n const workDir = getWorkingDirectory(undefined, true);\n await saveAutonomyConfig(workDir, { cloudAgentEnabled: true, cursorApiKey: apiKey });\n\n return this.text('Cursor API key saved. Cloud agent dispatch enabled.');\n }\n\n // --------------------------------------------------------------------------\n // dispatch\n // --------------------------------------------------------------------------\n\n private async dispatch(args: any) {\n console.log('Cloud dispatch starting...');\n const workDir = getWorkingDirectory(undefined, true);\n\n const apiKey = await this.resolveApiKey(workDir);\n if (!apiKey) return this.setupGuard();\n\n const config = await loadAutonomyConfig(workDir);\n const forceCloud = args?.forceCloud === true;\n\n console.log('About to resolve issues...');\n let allIssues = await this.resolveIssues(args?.issueIds);\n\n // Ad-hoc issue: when user provides file+issue+fix directly (e.g. from trie_propose_fix)\n if (allIssues.length === 0 && args?.file && args?.issue && args?.fix) {\n const adHocId = `ad-hoc-${Date.now()}`;\n allIssues = [{\n id: adHocId,\n severity: (args.severity as Issue['severity']) ?? 'critical',\n effort: (args.effort as Issue['effort']) ?? 'hard',\n issue: args.issue,\n fix: args.fix,\n file: args.file,\n line: args.line ?? 1,\n confidence: 0.9,\n autoFixable: false,\n agent: 'user',\n category: args.category,\n }];\n console.log(`Created ad-hoc issue ${adHocId} for cloud dispatch`);\n }\n\n if (allIssues.length === 0) {\n return this.text('No issues to dispatch. Run trie_scan to detect new issues, or check memory with trie_memory action:recent. For ad-hoc fixes, pass file, issue, and fix.');\n }\n\n const { results, summary } = triageIssues(allIssues, undefined, undefined, config);\n\n const lines: string[] = [];\n\n // When forceCloud: bypass triage, treat all as cloud-agent\n const toDispatch = forceCloud ? allIssues : summary.cloudAgent;\n\n if (forceCloud) {\n lines.push('FIX ROUTING PLAN (forceCloud: bypassing triage)');\n lines.push('\\u2500'.repeat(68));\n for (const issue of allIssues) {\n lines.push(` ${shortPath(issue.file)}:${issue.line ?? '?'} → cloud-agent (user requested)`);\n }\n lines.push('');\n } else {\n // Print routing table for transparency\n lines.push(formatTriageTable(results, allIssues));\n lines.push('');\n\n // Skip non-cloud issues with a reason\n for (const issue of allIssues) {\n const r = results.get(issue.id);\n if (r && r.strategy !== 'cloud-agent') {\n lines.push(`Skipped ${issue.id}: routed to ${r.strategy} (score ${r.score >= 0 ? '+' : ''}${r.score} — ${r.reasons.join(', ')})`);\n }\n }\n\n if (summary.cloudAgent.length === 0) {\n lines.push('\\nNo issues qualify for cloud dispatch. Use trie_fix for local fixes.');\n lines.push('To force cloud dispatch: trie_cloud_fix action:dispatch forceCloud:true');\n return this.text(lines.join('\\n'));\n }\n }\n\n // Dispatch\n const client = new CursorCloudAgentClient(apiKey);\n const repoUrl = this.getRepoUrl(workDir);\n const branch = this.getBranch(workDir);\n const store = await this.loadJobs(workDir);\n\n lines.push('\\nDISPATCHED');\n\n for (const issue of toDispatch) {\n const triageResult = forceCloud\n ? { strategy: 'cloud-agent' as const, score: 6, confidence: 1, reasons: ['forceCloud: user requested cloud dispatch'], fallback: 'local-ai' as const }\n : results.get(issue.id)!;\n try {\n const job = await client.dispatch(issue, triageResult, repoUrl, branch);\n\n store.jobs[issue.id] = {\n issueId: issue.id,\n jobId: job.jobId,\n status: 'dispatched',\n score: triageResult.score,\n strategy: 'cloud-agent',\n dispatchedAt: job.dispatchedAt,\n artifactUrls: [],\n prUrl: null,\n };\n\n lines.push(` ${issue.id} ${shortPath(issue.file)}:${issue.line ?? '?'} job:${job.jobId} (score +${triageResult.score})`);\n } catch (err: any) {\n lines.push(` ${issue.id} FAILED: ${err.message}`);\n }\n }\n\n await this.saveJobs(workDir, store);\n\n lines.push('');\n lines.push('Cloud agents are running in isolated VMs. Check back with:');\n lines.push('trie_cloud_fix action:status');\n\n return this.text(lines.join('\\n'));\n }\n\n // --------------------------------------------------------------------------\n // status\n // --------------------------------------------------------------------------\n\n private async status() {\n const workDir = getWorkingDirectory(undefined, true);\n const apiKey = await this.resolveApiKey(workDir);\n if (!apiKey) return this.setupGuard();\n\n const store = await this.loadJobs(workDir);\n const entries = Object.values(store.jobs);\n\n if (entries.length === 0) {\n return this.text('No cloud jobs. Dispatch with: trie_cloud_fix action:dispatch');\n }\n\n const client = new CursorCloudAgentClient(apiKey);\n const LINE = '\\u2500'.repeat(68);\n const lines: string[] = ['JOB STATUS', LINE];\n lines.push(padEnd('Issue', 32) + padEnd('Status', 12) + padEnd('PR', 28) + 'Age');\n\n for (const job of entries) {\n if (job.status === 'dispatched' || job.status === 'running') {\n try {\n const poll = await client.poll(job.jobId);\n if (poll.status === 'completed' && poll.prUrl) {\n job.status = 'verified';\n job.prUrl = poll.prUrl;\n } else if (poll.status === 'running') {\n job.status = 'running';\n } else if (poll.status === 'failed') {\n job.status = 'failed';\n }\n if (poll.artifactUrls.length) {\n job.artifactUrls = poll.artifactUrls;\n }\n } catch {\n // poll failure is non-fatal; show last known status\n }\n }\n\n const age = formatAge(job.dispatchedAt);\n const pr = job.prUrl ?? '\\u2014';\n lines.push(padEnd(job.issueId, 32) + padEnd(job.status, 12) + padEnd(pr, 28) + age);\n }\n\n lines.push(LINE);\n await this.saveJobs(workDir, store);\n\n return this.text(lines.join('\\n'));\n }\n\n // --------------------------------------------------------------------------\n // artifacts\n // --------------------------------------------------------------------------\n\n private async artifacts(args: any) {\n const workDir = getWorkingDirectory(undefined, true);\n const apiKey = await this.resolveApiKey(workDir);\n if (!apiKey) return this.setupGuard();\n\n const store = await this.loadJobs(workDir);\n const jobId: string | undefined = args?.jobId;\n\n const targets = jobId\n ? Object.values(store.jobs).filter(j => j.jobId === jobId)\n : Object.values(store.jobs).filter(j => j.status === 'verified');\n\n if (targets.length === 0) {\n return this.text(jobId ? `No job found with id ${jobId}` : 'No completed jobs with artifacts.');\n }\n\n const client = new CursorCloudAgentClient(apiKey);\n const lines: string[] = [];\n\n for (const job of targets) {\n try {\n const artifacts = await client.getArtifacts(job.jobId);\n job.artifactUrls = artifacts;\n } catch {\n // use cached artifacts\n }\n\n lines.push(`Issue: ${job.issueId}`);\n lines.push(`PR: ${job.prUrl ?? 'N/A'}`);\n for (const url of job.artifactUrls) {\n const ext = url.split('.').pop();\n const label = ext === 'mp4' || ext === 'webm' ? 'Video' : 'Screenshot';\n lines.push(`${label}: ${url}`);\n }\n if (job.status === 'verified') {\n lines.push('Agent verified: all tests pass with this fix applied.');\n }\n lines.push('');\n }\n\n await this.saveJobs(workDir, store);\n return this.text(lines.join('\\n'));\n }\n\n // --------------------------------------------------------------------------\n // cancel\n // --------------------------------------------------------------------------\n\n private async cancel(args: any) {\n const workDir = getWorkingDirectory(undefined, true);\n const apiKey = await this.resolveApiKey(workDir);\n if (!apiKey) return this.setupGuard();\n\n const jobId: string | undefined = args?.jobId;\n if (!jobId) {\n return this.text('Provide jobId to cancel. Example: trie_cloud_fix action:cancel jobId:\"cursor-task-xyz\"');\n }\n\n const store = await this.loadJobs(workDir);\n const entry = Object.values(store.jobs).find(j => j.jobId === jobId);\n if (!entry) {\n return this.text(`Job ${jobId} not found in cloud-jobs.json.`);\n }\n\n const client = new CursorCloudAgentClient(apiKey);\n try {\n await client.cancelJob(jobId);\n } catch (err: any) {\n return this.text(`Cancel failed: ${err.message}`);\n }\n\n delete store.jobs[entry.issueId];\n await this.saveJobs(workDir, store);\n\n return this.text(`Job ${jobId} cancelled and removed.`);\n }\n\n // --------------------------------------------------------------------------\n // Helpers\n // --------------------------------------------------------------------------\n\n private async resolveApiKey(workDir: string): Promise<string | null> {\n if (process.env.CURSOR_API_KEY) return process.env.CURSOR_API_KEY;\n // Load from .env if not in process.env (same pattern as ANTHROPIC_API_KEY)\n const fromEnv = this.loadCursorKeyFromEnv(workDir);\n if (fromEnv) return fromEnv;\n const config = await loadAutonomyConfig(workDir);\n return config.cursorApiKey ?? null;\n }\n\n private loadCursorKeyFromEnv(workDir: string): string | null {\n for (const envFile of ['.env', '.env.local', '.env.production']) {\n const envPath = join(workDir, envFile);\n if (!existsSync(envPath)) continue;\n try {\n const content = readFileSync(envPath, 'utf-8');\n const match = content.match(/^\\s*CURSOR_API_KEY\\s*=\\s*(.+)$/m);\n if (match?.[1]) {\n const key = match[1].trim().replace(/^[\"']|[\"']$/g, '');\n if (key.length > 10) return key;\n }\n } catch {\n /* ignore */\n }\n }\n return null;\n }\n\n private setupGuard() {\n return this.text(\n 'Cloud Agent dispatch requires a Cursor API key.\\n\\n' +\n 'Get your key at: cursor.com/settings \\u2192 API Keys\\n\\n' +\n 'Then either:\\n' +\n ' • trie_cloud_fix action:configure apiKey:\"key-...\"\\n' +\n ' • Or add to Config → API Keys → Cursor (press s in watch mode)\\n' +\n ' • Or set: export CURSOR_API_KEY=\"key-...\"\\n' +\n ' • Or add CURSOR_API_KEY=... to your .env file',\n );\n }\n\n private async resolveIssues(issueIds?: string[]): Promise<Issue[]> {\n // First try to get pending fixes\n let pending = getPendingFixes();\n\n // If no pending fixes, try to load from memory directly\n if (pending.length === 0) {\n try {\n console.log('Loading issues from memory...');\n const { getRecentIssues } = await import('../memory/issue-store.js');\n const recentIssues = await getRecentIssues({ limit: 50, includeResolved: false });\n console.log(`Found ${recentIssues.length} recent issues in memory`);\n\n // Convert StoredIssue to Issue format for cloud dispatch\n const memoryIssues: Issue[] = recentIssues.map(storedIssue => ({\n id: storedIssue.id,\n severity: (storedIssue.severity || 'moderate') as any,\n issue: storedIssue.issue,\n fix: storedIssue.fix,\n file: storedIssue.file,\n line: storedIssue.line,\n confidence: 0.8, // Default confidence for memory issues\n autoFixable: true, // Memory issues are generally auto-fixable\n agent: storedIssue.agent,\n category: storedIssue.category,\n }));\n\n console.log(`Converted ${memoryIssues.length} memory issues for cloud dispatch`);\n\n if (issueIds && issueIds.length > 0) {\n return memoryIssues.filter(i => issueIds.includes(i.id));\n }\n return memoryIssues;\n } catch (error) {\n console.warn('Failed to load issues from memory:', error);\n console.warn('Error details:', error);\n }\n }\n\n const issues: Issue[] = pending.map(p => ({\n id: p.id,\n severity: p.severity ?? 'moderate',\n effort: p.effort,\n issue: p.issue,\n fix: p.suggestedFix,\n file: p.file,\n line: p.line,\n confidence: p.confidence,\n autoFixable: p.autoFixable ?? false,\n agent: 'trie_scan',\n cwe: p.cwe,\n owasp: p.owasp,\n category: p.category,\n }));\n\n if (issueIds && issueIds.length > 0) {\n return issues.filter(i => issueIds.includes(i.id));\n }\n return issues;\n }\n\n private getRepoUrl(workDir: string): string {\n try {\n return execSync('git remote get-url origin', { cwd: workDir, encoding: 'utf-8' }).trim();\n } catch {\n return 'unknown';\n }\n }\n\n private getBranch(workDir: string): string {\n try {\n return execSync('git rev-parse --abbrev-ref HEAD', { cwd: workDir, encoding: 'utf-8' }).trim();\n } catch {\n return 'main';\n }\n }\n\n private async loadJobs(workDir: string): Promise<CloudJobsStore> {\n const path = join(getTrieDirectory(workDir), 'cloud-jobs.json');\n try {\n if (existsSync(path)) {\n const raw = await readFile(path, 'utf-8');\n return JSON.parse(raw) as CloudJobsStore;\n }\n } catch {\n // corrupt file — start fresh\n }\n return { jobs: {} };\n }\n\n private async saveJobs(workDir: string, store: CloudJobsStore): Promise<void> {\n const trieDir = getTrieDirectory(workDir);\n if (!existsSync(trieDir)) await mkdir(trieDir, { recursive: true });\n const path = join(trieDir, 'cloud-jobs.json');\n await writeFile(path, JSON.stringify(store, null, 2));\n }\n\n private text(msg: string) {\n return { content: [{ type: 'text' as const, text: msg }] };\n }\n}\n\n// ============================================================================\n// Formatting helpers\n// ============================================================================\n\nfunction formatAge(isoDate: string): string {\n const ms = Date.now() - new Date(isoDate).getTime();\n const mins = Math.floor(ms / 60_000);\n if (mins < 60) return `${mins}m`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ${mins % 60}m`;\n return `${Math.floor(hrs / 24)}d`;\n}\n\nfunction shortPath(file: string): string {\n const parts = file.split('/');\n return parts.length > 2 ? parts.slice(-2).join('/') : file;\n}\n\nfunction padEnd(str: string, len: number): string {\n if (str.length >= len) return str.slice(0, len);\n return str + ' '.repeat(len - str.length);\n}\n","/**\n * Cursor Cloud Agent REST Client\n *\n * Thin wrapper around the Cursor Cloud Agent API.\n * Uses native `fetch` — no new npm dependencies.\n */\n\nimport type { Issue } from '../types/index.js';\nimport type { TriageResult } from '../tools/fix-triage.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CloudAgentJob {\n jobId: string;\n status: 'dispatched' | 'running' | 'verified' | 'failed';\n prUrl?: string;\n artifactUrls: string[];\n dispatchedAt: string;\n verifiedAt?: string;\n}\n\nexport interface CloudAgentStatus {\n status: 'pending' | 'running' | 'completed' | 'failed';\n prUrl?: string | undefined;\n artifactUrls: string[];\n}\n\n// ============================================================================\n// Client\n// ============================================================================\n\n// Cursor Background Agent API: https://docs.cursor.com/background-agent/api\nconst BASE_URL = 'https://api.cursor.com/v0';\n\nexport class CursorCloudAgentClient {\n private apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n /**\n * Dispatch an issue to a cloud agent for fixing.\n * Uses Cursor Background Agent API: POST /agents\n */\n async dispatch(\n issue: Issue,\n triageResult: TriageResult,\n repoUrl: string,\n branch: string,\n ): Promise<CloudAgentJob> {\n const promptText = this.buildPrompt(issue, triageResult);\n\n const body = {\n prompt: { text: promptText },\n source: {\n repository: repoUrl,\n ref: branch,\n },\n };\n\n const res = await this.request('POST', '/agents', body);\n\n return {\n jobId: res.id ?? res.taskId ?? res.jobId,\n status: 'dispatched',\n artifactUrls: [],\n dispatchedAt: res.createdAt ?? new Date().toISOString(),\n };\n }\n\n /**\n * Poll job status.\n * Uses Cursor Background Agent API: GET /agents/:id\n */\n async poll(jobId: string): Promise<CloudAgentStatus> {\n const res = await this.request('GET', `/agents/${jobId}`);\n\n const status = mapStatus(res.status);\n const prUrl = extractPrUrl(res);\n const artifactUrls = this.extractArtifacts(res);\n\n return { status, prUrl, artifactUrls };\n }\n\n /**\n * Get artifact URLs for a completed job.\n */\n async getArtifacts(jobId: string): Promise<string[]> {\n const res = await this.request('GET', `/agents/${jobId}`);\n return this.extractArtifacts(res);\n }\n\n /**\n * Cancel a running job.\n * Uses Cursor Background Agent API: DELETE /agents/:id\n */\n async cancelJob(jobId: string): Promise<void> {\n await this.request('DELETE', `/agents/${jobId}`);\n }\n\n // --------------------------------------------------------------------------\n // Internal\n // --------------------------------------------------------------------------\n\n private buildPrompt(issue: Issue, triageResult: TriageResult): string {\n const parts: string[] = [\n 'You are fixing a verified issue in the codebase.',\n '',\n `Issue: ${issue.issue}`,\n `File: ${issue.file}${issue.line ? `:${issue.line}` : ''}`,\n `Severity: ${issue.severity} | Effort: ${issue.effort ?? 'medium'}`,\n `Agent that found it: ${issue.agent}`,\n `Suggested fix: ${issue.fix}`,\n ];\n\n if (issue.cwe) parts.push(`CWE: ${issue.cwe}`);\n if (issue.owasp) parts.push(`OWASP: ${issue.owasp}`);\n\n parts.push(`Triage confidence: ${triageResult.confidence.toFixed(2)}`);\n parts.push(`Why cloud agent: ${triageResult.reasons.join(', ')}`);\n parts.push('');\n parts.push('Steps:');\n parts.push(`1. Apply the minimal fix described above to ${issue.file}`);\n parts.push('2. Run the existing test suite (detect test runner from package.json scripts)');\n parts.push('3. Screenshot the passing test output — this is the verification artifact');\n parts.push('4. If tests fail, iterate on the fix until they pass (max 3 attempts)');\n parts.push('5. Open a PR with only this single change — do not bundle other fixes');\n parts.push('6. Include the screenshot in the PR description as evidence');\n\n return parts.join('\\n');\n }\n\n private async request(method: string, path: string, body?: unknown): Promise<any> {\n const url = `${BASE_URL}${path}`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n };\n\n const init: RequestInit = { method, headers };\n if (body) init.body = JSON.stringify(body);\n\n const res = await fetch(url, init);\n\n if (res.status === 401) {\n throw new Error(\n 'Cursor API key is invalid or expired.\\n' +\n 'Update it: trie_cloud_fix action:configure apiKey:\"key-...\"',\n );\n }\n if (res.status === 404) {\n const isLaunch = path === '/agents' && method === 'POST';\n throw new Error(\n isLaunch\n ? 'Cursor Background Agent API endpoint not found. Ensure your Cursor API key has Background Agent access (cursor.com/dashboard → Integrations).'\n : `Job not found: ${path}`,\n );\n }\n if (res.status >= 500) {\n throw new Error(\n `Cursor API returned ${res.status}. The service may be temporarily unavailable — retry in a few minutes.`,\n );\n }\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`Cursor API error ${res.status}: ${text}`);\n }\n\n return res.json();\n }\n\n private extractArtifacts(res: any): string[] {\n const urls: string[] = [];\n\n if (Array.isArray(res.messages)) {\n for (const msg of res.messages) {\n if (typeof msg.content === 'string') {\n const matches = msg.content.match(/https:\\/\\/[^\\s)]+\\.(png|jpg|mp4|webm)/g);\n if (matches) urls.push(...matches);\n }\n }\n }\n\n if (Array.isArray(res.artifacts)) {\n for (const a of res.artifacts) {\n if (a.url) urls.push(a.url);\n }\n }\n\n return [...new Set(urls)];\n }\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction mapStatus(raw: string | undefined): CloudAgentStatus['status'] {\n switch (raw?.toUpperCase()) {\n case 'PENDING':\n case 'QUEUED':\n case 'CREATING':\n return 'pending';\n case 'RUNNING':\n case 'IN_PROGRESS':\n return 'running';\n case 'COMPLETED':\n case 'SUCCEEDED':\n case 'VERIFIED':\n return 'completed';\n default:\n return 'failed';\n }\n}\n\nfunction extractPrUrl(res: any): string | undefined {\n if (typeof res.prUrl === 'string') return res.prUrl;\n if (typeof res.pr_url === 'string') return res.pr_url;\n if (typeof res.pullRequestUrl === 'string') return res.pullRequestUrl;\n\n if (Array.isArray(res.messages)) {\n for (const msg of res.messages) {\n if (typeof msg.content === 'string') {\n const match = msg.content.match(/https:\\/\\/github\\.com\\/[^\\s)]+\\/pull\\/\\d+/);\n if (match) return match[0];\n }\n }\n }\n\n return undefined;\n}\n","/**\n * Fix Triage Engine\n *\n * Scores each issue across four signal groups (issue shape, code context,\n * occurrence history, user configuration) and recommends one of three\n * fix strategies: inline-auto, local-ai, or cloud-agent.\n *\n * Used by both `trie_fix` and `trie_cloud_fix`.\n */\n\nimport type { Issue, CodeContext } from '../types/index.js';\nimport type { AutonomyConfig, IssueOccurrence } from '../types/autonomy.js';\n\nexport interface PipelineContext {\n hasLinkedPR: boolean;\n prState?: 'open' | 'closed' | 'merged' | 'draft';\n hasLinkedTicket: boolean;\n ticketStatus?: string;\n ticketPriority?: string;\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type FixStrategy = 'inline-auto' | 'local-ai' | 'cloud-agent';\n\nexport interface TriageResult {\n strategy: FixStrategy;\n score: number;\n confidence: number;\n reasons: string[];\n fallback: 'local-ai';\n}\n\nexport interface TriageSummary {\n inlineAuto: Issue[];\n localAi: Issue[];\n cloudAgent: Issue[];\n cloudAgentScore: number;\n}\n\n// ============================================================================\n// Signal scoring constants\n// ============================================================================\n\nconst EFFORT_SCORES: Record<string, number> = {\n trivial: -6,\n easy: -3,\n medium: 0,\n hard: 4,\n};\n\nconst SEVERITY_SCORES: Record<string, number> = {\n critical: 4,\n serious: 2,\n moderate: -1,\n low: -3,\n};\n\n// ============================================================================\n// Core triage function\n// ============================================================================\n\nexport function triageIssue(\n issue: Issue,\n context?: CodeContext,\n occurrence?: IssueOccurrence,\n config?: AutonomyConfig,\n pipeline?: PipelineContext,\n): TriageResult {\n const reasons: string[] = [];\n\n // --- Hard overrides (checked before scoring) ---\n if (config?.level === 'passive') {\n return {\n strategy: 'local-ai',\n score: 0,\n confidence: 1,\n reasons: ['Autonomy level is passive — cloud dispatch disabled'],\n fallback: 'local-ai',\n };\n }\n\n if (config?.cloudAgentEnabled === false) {\n return {\n strategy: 'local-ai',\n score: 0,\n confidence: 1,\n reasons: ['Cloud agent not enabled (run trie_cloud_fix action:configure)'],\n fallback: 'local-ai',\n };\n }\n\n let score = 0;\n\n // --- Signal Group 1: Issue Shape ---\n const effort = issue.effort ?? 'medium';\n const effortScore = EFFORT_SCORES[effort] ?? 0;\n if (effortScore !== 0) {\n score += effortScore;\n reasons.push(`effort:${effort}`);\n }\n\n const severityScore = SEVERITY_SCORES[issue.severity] ?? 0;\n if (severityScore !== 0) {\n score += severityScore;\n reasons.push(`severity:${issue.severity}`);\n }\n\n if (issue.autoFixable) {\n score -= 2;\n reasons.push('autoFixable');\n }\n\n if (issue.confidence < 0.7) {\n score -= 2;\n reasons.push(`low confidence (${(issue.confidence * 100).toFixed(0)}%)`);\n }\n\n if (issue.cwe) {\n score += 3;\n reasons.push(`cwe:${issue.cwe}`);\n }\n\n if (issue.owasp) {\n score += 2;\n reasons.push(`owasp:${issue.owasp}`);\n }\n\n if (issue.category === 'security') {\n score += 2;\n reasons.push('category:security');\n }\n\n // --- Signal Group 2: Context ---\n if (context) {\n if (context.hasTests) {\n score += 1;\n reasons.push('has tests');\n } else {\n score -= 2;\n reasons.push('no tests');\n }\n\n if (context.complexity === 'high') {\n score += 1;\n reasons.push('high complexity');\n }\n\n if (context.touchesAuth || context.touchesCrypto || context.touchesPayments) {\n score += 2;\n reasons.push('touches auth/crypto/payments');\n }\n\n if (context.touchesDatabase) {\n score += 1;\n reasons.push('touches database');\n }\n }\n\n // --- Signal Group 3: Occurrence History ---\n if (occurrence) {\n if (occurrence.count >= 5) {\n score += 3;\n reasons.push(`${occurrence.count}× seen`);\n } else if (occurrence.count >= 3) {\n score += 1;\n reasons.push(`${occurrence.count}× seen`);\n }\n\n if (occurrence.escalationLevel === 'block') {\n score += 4;\n reasons.push('escalation:block');\n } else if (occurrence.escalationLevel === 'escalate') {\n score += 2;\n reasons.push('escalation:escalate');\n }\n }\n\n // --- Signal Group 4: User Configuration ---\n if (config?.level === 'aggressive') {\n score -= 1;\n reasons.push('aggressive mode (−1 threshold)');\n }\n\n // --- Signal Group 5: Pipeline Context ---\n if (pipeline) {\n if (pipeline.hasLinkedPR && pipeline.prState === 'open') {\n score -= 2;\n reasons.push('has open PR');\n }\n\n if (pipeline.hasLinkedTicket && pipeline.ticketStatus?.toLowerCase().includes('started')) {\n score -= 1;\n reasons.push('ticket in active sprint');\n }\n\n if (pipeline.hasLinkedTicket && pipeline.ticketPriority === 'urgent') {\n score += 1;\n reasons.push('ticket:urgent');\n }\n\n if (!pipeline.hasLinkedTicket && !pipeline.hasLinkedPR && issue.severity === 'critical') {\n score += 2;\n reasons.push('critical, no ticket/PR (falling through cracks)');\n }\n }\n\n // --- Score → Strategy ---\n let strategy: FixStrategy;\n if (score < 0 && issue.autoFixable) {\n strategy = 'inline-auto';\n } else if (score < 4) {\n strategy = 'local-ai';\n } else {\n strategy = 'cloud-agent';\n }\n\n const confidence = Math.min(1, Math.abs(score) / 8);\n\n return { strategy, score, confidence, reasons, fallback: 'local-ai' };\n}\n\n// ============================================================================\n// Batch triage\n// ============================================================================\n\nexport function triageIssues(\n issues: Issue[],\n context?: CodeContext,\n occurrences?: Map<string, IssueOccurrence>,\n config?: AutonomyConfig,\n pipelineContexts?: Map<string, PipelineContext>,\n): { results: Map<string, TriageResult>; summary: TriageSummary } {\n const results = new Map<string, TriageResult>();\n const summary: TriageSummary = {\n inlineAuto: [],\n localAi: [],\n cloudAgent: [],\n cloudAgentScore: 0,\n };\n\n for (const issue of issues) {\n const occurrence = occurrences?.get(issue.id);\n const pipeline = pipelineContexts?.get(issue.id);\n const result = triageIssue(issue, context, occurrence, config, pipeline);\n results.set(issue.id, result);\n\n switch (result.strategy) {\n case 'inline-auto':\n summary.inlineAuto.push(issue);\n break;\n case 'local-ai':\n summary.localAi.push(issue);\n break;\n case 'cloud-agent':\n summary.cloudAgent.push(issue);\n summary.cloudAgentScore += result.score;\n break;\n }\n }\n\n return { results, summary };\n}\n\n// ============================================================================\n// Formatted output\n// ============================================================================\n\nexport function formatTriageTable(\n results: Map<string, TriageResult>,\n issues: Issue[],\n): string {\n const LINE = '\\u2500'.repeat(68);\n const lines: string[] = [];\n\n lines.push('FIX ROUTING PLAN');\n lines.push(LINE);\n lines.push(\n padEnd('Issue', 32) +\n padEnd('Strategy', 14) +\n padEnd('Score', 7) +\n 'Reason',\n );\n\n for (const issue of issues) {\n const r = results.get(issue.id);\n if (!r) continue;\n const loc = `${shortPath(issue.file)}:${issue.line ?? '?'}`;\n const scoreStr = r.score >= 0 ? `+${r.score}` : String(r.score);\n lines.push(\n padEnd(loc, 32) +\n padEnd(r.strategy, 14) +\n padEnd(scoreStr, 7) +\n r.reasons.join(', '),\n );\n }\n\n lines.push(LINE);\n\n const counts: string[] = [];\n const cloud = issues.filter(i => results.get(i.id)?.strategy === 'cloud-agent');\n const local = issues.filter(i => results.get(i.id)?.strategy === 'local-ai');\n const auto = issues.filter(i => results.get(i.id)?.strategy === 'inline-auto');\n\n if (cloud.length) counts.push(`${cloud.length} for cloud agent`);\n if (local.length) counts.push(`${local.length} for local AI`);\n if (auto.length) counts.push(`${auto.length} auto-fixable`);\n lines.push(counts.join(', '));\n\n if (cloud.length > 0) {\n const ids = cloud.map(i => `\"${i.id}\"`).join(',');\n lines.push('');\n lines.push(`To dispatch cloud issues: trie_cloud_fix action:dispatch issueIds:[${ids}]`);\n }\n if (local.length > 0) {\n const ids = local.map(i => `\"${i.id}\"`).join(',');\n lines.push(`To fix local issues: trie_fix issueIds:[${ids}]`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Build the cloud recommendation footer appended after trie_fix completes,\n * when skipped/pending issues score >= 4.\n */\nexport function formatCloudRecommendation(\n results: Map<string, TriageResult>,\n issues: Issue[],\n): string | null {\n const cloud = issues.filter(i => {\n const r = results.get(i.id);\n return r && r.score >= 4;\n });\n\n if (cloud.length === 0) return null;\n\n const LINE = '\\u2500'.repeat(65);\n const lines: string[] = [];\n\n lines.push(LINE);\n lines.push(\n `${cloud.length} issue${cloud.length > 1 ? 's' : ''} qualify for cloud agent verification (test-verified fix + PR):`,\n );\n\n for (const issue of cloud) {\n const r = results.get(issue.id)!;\n const loc = `${shortPath(issue.file)}:${issue.line ?? '?'}`;\n const scoreStr = r.score >= 0 ? `+${r.score}` : String(r.score);\n lines.push(` \\u2022 ${padEnd(loc, 30)} \\u2014 score ${scoreStr} (${r.reasons.join(', ')})`);\n }\n\n const ids = cloud.map(i => `\"${i.id}\"`).join(',');\n lines.push('');\n lines.push(`Run: trie_cloud_fix action:dispatch issueIds:[${ids}]`);\n lines.push(LINE);\n\n return lines.join('\\n');\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction shortPath(file: string): string {\n const parts = file.split('/');\n return parts.length > 2 ? parts.slice(-2).join('/') : file;\n}\n\nfunction padEnd(str: string, len: number): string {\n if (str.length >= len) return str.slice(0, len);\n return str + ' '.repeat(len - str.length);\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';\nimport { triageIssues, formatTriageTable, formatCloudRecommendation } from './fix-triage.js';\nimport { loadAutonomyConfig } from '../utils/autonomy-config.js';\nimport type { Issue } from '../types/index.js';\n\n/**\n * Fix Tool - AI-powered code fixing\n * \n * This tool coordinates with Claude to apply fixes. It can:\n * 1. Apply specific fixes from scan results\n * 2. Auto-fix high-confidence issues\n * 3. Generate fix suggestions for review\n */\n\nexport interface PendingFix {\n id: string;\n file: string;\n line: number;\n issue: string;\n suggestedFix: string;\n confidence: number;\n status: 'pending' | 'applied' | 'rejected';\n /** Optional triage metadata (from scan agents) */\n severity?: Issue['severity'];\n effort?: Issue['effort'];\n autoFixable?: boolean;\n cwe?: string;\n owasp?: string;\n category?: string;\n}\n\n// In-memory store for pending fixes (from scans)\nconst pendingFixes = new Map<string, PendingFix>();\n\nexport class TrieFixTool {\n async execute(args: any) {\n const { issueIds, file, line, issue, fix, autoApprove = false, dryRun = false, action } = args || {};\n\n // Mode 0: Route — show triage decisions without applying fixes\n if (action === 'route') {\n return this.routeIssues(issueIds);\n }\n\n // Mode 1: Fix specific issue by ID\n if (issueIds && issueIds.length > 0) {\n return this.fixByIds(issueIds, autoApprove, dryRun);\n }\n\n // Mode 2: Fix specific location with provided fix\n if (file && fix) {\n return this.applyFix(file, line || 1, issue || 'User-specified fix', fix, dryRun);\n }\n\n // Mode 3: Interactive fix mode - show pending fixes\n if (pendingFixes.size > 0) {\n return this.showPendingFixes();\n }\n\n // Mode 4: Generate fix for a file/issue\n if (file && issue) {\n return this.generateFixPrompt(file, line || 1, issue);\n }\n\n // No fixes available\n return {\n content: [{\n type: 'text',\n text: this.getHelpText()\n }]\n };\n }\n\n private async routeIssues(issueIds?: string[]) {\n // Load issues from memory if no issues are currently pending\n await loadPendingFixesFromMemory();\n\n const pending = getPendingFixes();\n if (pending.length === 0) {\n return {\n content: [{ type: 'text', text: 'No pending issues. Run trie_scan to detect new issues, or check memory with trie_memory action:recent.' }],\n };\n }\n\n const issues: Issue[] = pending.map(p => ({\n id: p.id,\n severity: p.severity ?? 'moderate',\n effort: p.effort,\n issue: p.issue,\n fix: p.suggestedFix,\n file: p.file,\n line: p.line,\n confidence: p.confidence,\n autoFixable: p.autoFixable ?? false,\n agent: 'trie_scan',\n cwe: p.cwe,\n owasp: p.owasp,\n category: p.category,\n }));\n\n const filtered = issueIds && issueIds.length > 0\n ? issues.filter(i => issueIds.includes(i.id))\n : issues;\n\n const workDir = getWorkingDirectory(undefined, true);\n const config = await loadAutonomyConfig(workDir);\n const { results } = triageIssues(filtered, undefined, undefined, config);\n const table = formatTriageTable(results, filtered);\n\n return { content: [{ type: 'text', text: `\\n${table}\\n` }] };\n }\n\n private async fixByIds(issueIds: string[], autoApprove: boolean, dryRun: boolean) {\n const results: string[] = [];\n let fixed = 0;\n let failed = 0;\n\n for (const id of issueIds) {\n const pendingFix = pendingFixes.get(id);\n if (!pendingFix) {\n results.push(`❌ Issue ${id}: Not found in pending fixes`);\n failed++;\n continue;\n }\n\n if (pendingFix.confidence < 0.8 && !autoApprove) {\n results.push(`[!] Issue ${id}: Confidence too low (${(pendingFix.confidence * 100).toFixed(0)}%) - use autoApprove:true to override`);\n continue;\n }\n\n if (dryRun) {\n results.push(`🔍 Issue ${id}: Would fix \"${pendingFix.issue}\" in ${pendingFix.file}:${pendingFix.line}`);\n continue;\n }\n\n try {\n // Here we would apply the fix - for now, generate the prompt\n results.push(`✅ Issue ${id}: Fix prepared for ${pendingFix.file}:${pendingFix.line}`);\n results.push(` Issue: ${pendingFix.issue}`);\n results.push(` Fix: ${pendingFix.suggestedFix}`);\n pendingFix.status = 'applied';\n fixed++;\n } catch (error) {\n results.push(`❌ Issue ${id}: Failed to apply - ${error}`);\n failed++;\n }\n }\n\n let output = `\\n${'━'.repeat(60)}\\n`;\n output += `🔧 FIX RESULTS\\n`;\n output += `${'━'.repeat(60)}\\n\\n`;\n output += results.join('\\n');\n output += `\\n\\n**Summary:** ${fixed} fixed, ${failed} failed, ${issueIds.length - fixed - failed} skipped\\n`;\n\n // Append cloud recommendation for remaining high-score issues\n output += await this.appendCloudRecommendation(issueIds);\n\n return { content: [{ type: 'text', text: output }] };\n }\n\n private async applyFix(file: string, line: number, issue: string, fix: string, dryRun: boolean) {\n const workDir = getWorkingDirectory(undefined, true);\n const filePath = isAbsolute(file) ? file : resolve(workDir, file);\n \n if (!existsSync(filePath)) {\n return {\n content: [{\n type: 'text',\n text: `❌ File not found: ${filePath}`\n }]\n };\n }\n\n const content = await readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n const language = this.detectLanguage(filePath);\n \n // Build context around the line\n const contextStart = Math.max(0, line - 10);\n const contextEnd = Math.min(lines.length, line + 10);\n const contextLines = lines.slice(contextStart, contextEnd);\n\n const prompt = getPrompt('fix', 'apply', {\n issue,\n fix,\n language,\n code: contextLines.join('\\n'),\n filePath: relative(workDir, filePath),\n line: String(line),\n });\n\n const systemPrompt = getSystemPrompt('fix');\n\n let output = `\\n${'━'.repeat(60)}\\n`;\n output += `🔧 FIX APPLICATION REQUEST\\n`;\n output += `${'━'.repeat(60)}\\n\\n`;\n\n output += `## 📍 Target\\n\\n`;\n output += `- **File:** \\`${relative(workDir, filePath)}\\`\\n`;\n output += `- **Line:** ${line}\\n`;\n output += `- **Issue:** ${issue}\\n`;\n output += `- **Requested Fix:** ${fix}\\n\\n`;\n\n output += `## 📄 Current Code Context\\n\\n`;\n output += `\\`\\`\\`${language}\\n`;\n for (let i = 0; i < contextLines.length; i++) {\n const lineNum = contextStart + i + 1;\n const marker = lineNum === line ? '→ ' : ' ';\n output += `${marker}${lineNum.toString().padStart(4)} | ${contextLines[i]}\\n`;\n }\n output += `\\`\\`\\`\\n\\n`;\n\n if (dryRun) {\n output += `## 🔍 Dry Run Mode\\n\\n`;\n output += `No changes will be made. Review the fix below:\\n\\n`;\n }\n\n output += `${'─'.repeat(60)}\\n`;\n output += `## 🧠 Fix Request for AI\\n\\n`;\n output += `**Role:** ${systemPrompt.split('\\n')[0]}\\n\\n`;\n output += prompt;\n output += `\\n${'─'.repeat(60)}\\n`;\n\n output += `\\n### After generating the fix, apply it with:\\n\\n`;\n output += `\\`\\`\\`\\n`;\n output += `Use the edit_file tool to apply the generated code changes\\n`;\n output += `\\`\\`\\`\\n`;\n\n return { content: [{ type: 'text', text: output }] };\n }\n\n private async generateFixPrompt(file: string, line: number, issue: string) {\n const workDir = getWorkingDirectory(undefined, true);\n const filePath = isAbsolute(file) ? file : resolve(workDir, file);\n \n if (!existsSync(filePath)) {\n return {\n content: [{\n type: 'text',\n text: `❌ File not found: ${filePath}`\n }]\n };\n }\n\n const content = await readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n const language = this.detectLanguage(filePath);\n\n // Get broader context for understanding\n const contextStart = Math.max(0, line - 20);\n const contextEnd = Math.min(lines.length, line + 20);\n const contextLines = lines.slice(contextStart, contextEnd);\n\n let output = `\\n${'━'.repeat(60)}\\n`;\n output += `🔧 FIX GENERATION REQUEST\\n`;\n output += `${'━'.repeat(60)}\\n\\n`;\n\n output += `## 📍 Issue Details\\n\\n`;\n output += `- **File:** \\`${relative(workDir, filePath)}\\`\\n`;\n output += `- **Line:** ${line}\\n`;\n output += `- **Issue:** ${issue}\\n\\n`;\n\n output += `## 📄 Code Context\\n\\n`;\n output += `\\`\\`\\`${language}\\n`;\n for (let i = 0; i < contextLines.length; i++) {\n const lineNum = contextStart + i + 1;\n const marker = lineNum === line ? '→ ' : ' ';\n output += `${marker}${lineNum.toString().padStart(4)} | ${contextLines[i]}\\n`;\n }\n output += `\\`\\`\\`\\n\\n`;\n\n output += `## 🧠 Analysis Request\\n\\n`;\n output += `Please analyze this issue and provide:\\n\\n`;\n output += `1. **Root cause** - Why does this issue occur?\\n`;\n output += `2. **Impact** - What could go wrong if unfixed?\\n`;\n output += `3. **Fix** - The exact code change needed\\n`;\n output += `4. **Verification** - How to test the fix works\\n\\n`;\n\n output += `After analysis, you can apply the fix using the edit_file tool.\\n`;\n\n return { content: [{ type: 'text', text: output }] };\n }\n\n private showPendingFixes() {\n let output = `\\n${'━'.repeat(60)}\\n`;\n output += `🔧 PENDING FIXES\\n`;\n output += `${'━'.repeat(60)}\\n\\n`;\n\n if (pendingFixes.size === 0) {\n output += `No pending fixes. Run \\`trie_scan\\` first to detect issues.\\n`;\n return { content: [{ type: 'text', text: output }] };\n }\n\n const fixes = Array.from(pendingFixes.values());\n const byStatus = {\n pending: fixes.filter(f => f.status === 'pending'),\n applied: fixes.filter(f => f.status === 'applied'),\n rejected: fixes.filter(f => f.status === 'rejected'),\n };\n\n if (byStatus.pending.length > 0) {\n output += `## ⏳ Pending (${byStatus.pending.length})\\n\\n`;\n output += `| ID | File | Line | Issue | Confidence |\\n`;\n output += `|----|------|------|-------|------------|\\n`;\n for (const fix of byStatus.pending) {\n const conf = `${(fix.confidence * 100).toFixed(0)}%`;\n const shortFile = fix.file.split('/').slice(-2).join('/');\n output += `| ${fix.id} | ${shortFile} | ${fix.line} | ${fix.issue.slice(0, 40)}... | ${conf} |\\n`;\n }\n output += '\\n';\n }\n\n output += `### Commands\\n\\n`;\n output += `- Fix all high-confidence: \\`trie_fix autoApprove:true\\`\\n`;\n output += `- Fix specific: \\`trie_fix issueIds:[\"id1\", \"id2\"]\\`\\n`;\n output += `- Preview: \\`trie_fix dryRun:true\\`\\n`;\n\n return { content: [{ type: 'text', text: output }] };\n }\n\n private getHelpText(): string {\n return `\n${'━'.repeat(60)}\n🔧 TRIE FIX - AI-POWERED CODE FIXING\n${'━'.repeat(60)}\n\n## Usage\n\n### Fix issues from a scan:\n\\`\\`\\`\ntrie_fix issueIds:[\"issue-1\", \"issue-2\"]\n\\`\\`\\`\n\n### Auto-fix all high-confidence issues:\n\\`\\`\\`\ntrie_fix autoApprove:true\n\\`\\`\\`\n\n### Fix specific file and line:\n\\`\\`\\`\ntrie_fix file:\"src/app.ts\" line:42 issue:\"SQL injection\" fix:\"Use parameterized query\"\n\\`\\`\\`\n\n### Preview fixes without applying:\n\\`\\`\\`\ntrie_fix dryRun:true\n\\`\\`\\`\n\n### View pending fixes:\n\\`\\`\\`\ntrie_fix\n\\`\\`\\`\n\n## Workflow\n\n1. Run \\`trie_scan\\` to detect issues\n2. Review the issues found\n3. Run \\`trie_fix\\` to apply fixes\n\nThe AI will analyze each issue, generate the fix, and you can review before applying.\n`;\n }\n\n private async appendCloudRecommendation(handledIds: string[]): Promise<string> {\n try {\n const pending = getPendingFixes();\n const remaining = pending.filter(p => !handledIds.includes(p.id) || pendingFixes.get(p.id)?.status === 'pending');\n if (remaining.length === 0) return '';\n\n const issues: Issue[] = remaining.map(p => ({\n id: p.id,\n severity: 'moderate' as const,\n issue: p.issue,\n fix: p.suggestedFix,\n file: p.file,\n line: p.line,\n confidence: p.confidence,\n autoFixable: false,\n agent: 'trie_scan',\n }));\n\n const workDir = getWorkingDirectory(undefined, true);\n const config = await loadAutonomyConfig(workDir);\n const { results } = triageIssues(issues, undefined, undefined, config);\n const footer = formatCloudRecommendation(results, issues);\n return footer ? `\\n${footer}\\n` : '';\n } catch {\n return '';\n }\n }\n\n private detectLanguage(filePath: string): string {\n const ext = extname(filePath).toLowerCase();\n const langMap: Record<string, string> = {\n '.ts': 'typescript',\n '.tsx': 'tsx',\n '.js': 'javascript',\n '.jsx': 'jsx',\n '.py': 'python',\n '.go': 'go',\n '.rs': 'rust',\n };\n return langMap[ext] || 'plaintext';\n }\n}\n\n// Export for use by other tools\nexport function addPendingFix(fix: PendingFix) {\n pendingFixes.set(fix.id, fix);\n}\n\nexport function clearPendingFixes() {\n pendingFixes.clear();\n}\n\nexport function getPendingFixes(): PendingFix[] {\n return Array.from(pendingFixes.values());\n}\n\nexport async function loadPendingFixesFromMemory(): Promise<void> {\n try {\n // Import here to avoid circular dependency\n const { getRecentIssues } = await import('../memory/issue-store.js');\n\n // Clear existing fixes\n pendingFixes.clear();\n\n // Get recent unresolved issues from memory\n const recentIssues = await getRecentIssues({ limit: 50, includeResolved: false });\n\n // Convert StoredIssue to PendingFix format\n for (const storedIssue of recentIssues) {\n const fix: PendingFix = {\n id: storedIssue.id,\n file: storedIssue.file,\n line: storedIssue.line || 0,\n issue: storedIssue.issue,\n suggestedFix: storedIssue.fix,\n confidence: 0.8, // Default confidence for memory issues\n status: 'pending',\n severity: storedIssue.severity as any,\n autoFixable: true, // Memory issues are generally auto-fixable\n category: storedIssue.category,\n };\n\n pendingFixes.set(fix.id, fix);\n }\n } catch (error) {\n console.warn('Failed to load pending fixes from memory:', error);\n }\n}\n\n","/**\n * MCP Query Tools\n * \n * Tools for agents to query governance 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 { getProjectState } from '../agent/project-state.js';\nimport type { ContextQuery } from '../types/signal.js';\n\nexport interface GetGovernanceInput {\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\n/**\n * @deprecated Use GetGovernanceInput instead\n */\nexport type GetDecisionsInput = GetGovernanceInput;\n\nexport class TrieGetGovernanceTool {\n async execute(input: GetGovernanceInput): 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 governance = await storage.queryGovernance(query);\n\n return {\n content: [{\n type: 'text',\n text: this.formatGovernance(governance)\n }]\n };\n }\n\n formatGovernance(governance: any[]): string {\n if (governance.length === 0) {\n return 'No governance records found matching query.';\n }\n\n let output = `Found ${governance.length} governance record(s):\\n\\n`;\n \n for (const gov of governance) {\n const when = new Date(gov.when).toLocaleDateString();\n output += `📋 ${gov.decision}\\n`;\n output += ` Context: ${gov.context}\\n`;\n if (gov.reasoning) {\n output += ` Reasoning: ${gov.reasoning}\\n`;\n }\n if (gov.tradeoffs && gov.tradeoffs.length > 0) {\n output += ` Tradeoffs considered: ${gov.tradeoffs.join(', ')}\\n`;\n }\n output += ` When: ${when}\\n`;\n if (gov.files.length > 0) {\n output += ` Files: ${gov.files.join(', ')}\\n`;\n }\n output += ` Tags: ${gov.tags.join(', ')}\\n`;\n output += `\\n`;\n }\n\n return output;\n }\n \n /**\n * @deprecated Use formatGovernance instead\n */\n formatDecisions(decisions: any[]): string {\n return this.formatGovernance(decisions);\n }\n}\n\n/**\n * @deprecated Use TrieGetGovernanceTool instead\n */\nexport class TrieGetDecisionsTool extends TrieGetGovernanceTool {}\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 GetRelatedGovernanceInput {\n governanceId?: string;\n file?: string;\n topic?: string;\n limit?: number;\n directory?: string;\n}\n\n/**\n * @deprecated Use GetRelatedGovernanceInput instead\n */\nexport type GetRelatedDecisionsInput = GetRelatedGovernanceInput;\n\nexport class TrieGetRelatedGovernanceTool {\n async execute(input: GetRelatedGovernanceInput): Promise<any> {\n const workDir = input.directory || getWorkingDirectory(undefined, true);\n const storage = getStorage(workDir);\n await storage.initialize();\n\n // If governanceId provided, find its related governance records\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 governance = await storage.queryGovernance(query);\n\n return {\n content: [{\n type: 'text',\n text: new TrieGetGovernanceTool().formatGovernance(governance)\n }]\n };\n }\n}\n\n/**\n * @deprecated Use TrieGetRelatedGovernanceTool instead\n */\nexport class TrieGetRelatedDecisionsTool extends TrieGetRelatedGovernanceTool {}\n\nexport interface QueryContextInput {\n query: string;\n type?: 'governance' | 'blockers' | 'goals' | 'hypotheses' | 'nudges' | 'facts' | 'questions' | 'all' | 'decisions'; // 'decisions' for backwards compat\n limit?: number;\n directory?: string;\n}\n\nfunction formatGoals(goals: Array<{ description: string; status: string; category?: string; currentValue?: number; target?: number; metadata?: { caughtCount?: number } }>, hasRecentNudges?: boolean): string {\n if (goals.length === 0) return 'No goals found.';\n const unchecked = hasRecentNudges === false;\n let out = `Found ${goals.length} goal(s):\\n\\n`;\n for (const g of goals) {\n const caught = g.metadata?.caughtCount ?? 0;\n out += `🎯 ${g.description}\\n`;\n out += ` Status: ${g.status}${g.category ? ` · Category: ${g.category}` : ''}`;\n if (g.target != null && g.currentValue != null) {\n out += ` · Progress: ${g.currentValue}/${g.target}`;\n }\n if (caught > 0) out += ` · ${caught} violation(s) caught`;\n if (unchecked) out += ` (UNCHECKED - use trie_scan_for_goal_violations to verify)`;\n out += '\\n\\n';\n }\n return out;\n}\n\nfunction formatHypotheses(hypotheses: Array<{ id: string; statement: string; status: string; confidence?: number; category?: string; evidence?: unknown[] }>): string {\n if (hypotheses.length === 0) return 'No hypotheses found.';\n let out = `Found ${hypotheses.length} hypothesis/hypotheses:\\n\\n`;\n for (const h of hypotheses) {\n const hasEvidence = (h.evidence?.length ?? 0) > 0;\n const confLabel = hasEvidence && h.confidence != null ? `${Math.round((h.confidence ?? 0) * 100)}%` : 'untested';\n const evidenceCount = h.evidence?.length ?? 0;\n const untested = evidenceCount === 0;\n out += `🔬 ${h.statement}\\n`;\n out += ` ID: ${h.id} · Status: ${h.status}${h.category ? ` · Category: ${h.category}` : ''} · ${confLabel} · ${evidenceCount} evidence`;\n if (untested) out += ` (use trie_test_hypothesis with hypothesisId: \"${h.id}\" to gather evidence)`;\n out += '\\n\\n';\n }\n return out;\n}\n\nfunction formatNudges(nudges: Array<{ message: string; severity: string; file?: string; suggestedAction?: string }>): string {\n if (nudges.length === 0) return 'No nudges (goal violations) found.';\n let out = `Found ${nudges.length} nudge(s) / goal violation(s):\\n\\n`;\n for (const n of nudges) {\n out += `⚠️ [${n.severity}] ${n.message}\\n`;\n if (n.file) out += ` File: ${n.file}\\n`;\n if (n.suggestedAction) out += ` Suggested: ${n.suggestedAction}\\n`;\n out += '\\n';\n }\n return out;\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 const keywords = input.query.toLowerCase().split(/\\s+/);\n const limit = input.limit ?? 10;\n let output = `Query: \"${input.query}\"\\n\\n`;\n\n const includeGoals = !input.type || input.type === 'goals' || input.type === 'all';\n const includeHypotheses = !input.type || input.type === 'hypotheses' || input.type === 'all';\n const includeNudges = !input.type || input.type === 'nudges' || input.type === 'all';\n const includeGovernance = !input.type || input.type === 'governance' || input.type === 'decisions' || input.type === 'all';\n const includeBlockers = !input.type || input.type === 'blockers' || input.type === 'all';\n\n if (includeGoals) {\n try {\n const projectState = getProjectState(workDir);\n await projectState.load();\n const allGoals = projectState.getAllGoals();\n const matches = keywords.length === 0 || keywords.some(kw => kw === 'goal' || kw === 'goals' || kw === 'all')\n ? allGoals\n : allGoals.filter(g =>\n keywords.some(kw =>\n g.description.toLowerCase().includes(kw) ||\n (g.category || '').toLowerCase().includes(kw) ||\n g.status.toLowerCase().includes(kw)\n )\n );\n const toShow = matches.slice(0, limit);\n if (toShow.length > 0) {\n const nudges = await storage.queryNudges({ resolved: false, limit: 1 }).catch(() => []);\n const hasRecentNudges = nudges.length > 0;\n output += `🎯 GOALS (${toShow.length}):\\n`;\n output += formatGoals(toShow.map(g => ({\n description: g.description,\n status: g.status,\n ...(g.category != null ? { category: g.category } : {}),\n ...(g.currentValue != null ? { currentValue: g.currentValue } : {}),\n ...(g.target != null ? { target: g.target } : {}),\n ...(g.metadata ? { metadata: g.metadata } : {}),\n })), hasRecentNudges);\n output += '\\n';\n }\n } catch (e) {\n output += `(Goals unavailable: ${e instanceof Error ? e.message : 'unknown'})\\n\\n`;\n }\n }\n\n if (includeHypotheses) {\n try {\n const projectState = getProjectState(workDir);\n await projectState.load();\n const allHypotheses = projectState.getAllHypotheses();\n const matches = keywords.length === 0 || keywords.some(kw => kw === 'hypothesis' || kw === 'hypotheses' || kw === 'all')\n ? allHypotheses\n : allHypotheses.filter(h =>\n keywords.some(kw =>\n h.statement.toLowerCase().includes(kw) ||\n (h.category || '').toLowerCase().includes(kw) ||\n h.status.toLowerCase().includes(kw)\n )\n );\n const toShow = matches.slice(0, limit);\n if (toShow.length > 0) {\n output += `🔬 HYPOTHESES (${toShow.length}):\\n`;\n output += formatHypotheses(toShow.map(h => ({\n id: h.id,\n statement: h.statement,\n status: h.status,\n ...(h.confidence != null ? { confidence: h.confidence } : {}),\n ...(h.category != null ? { category: h.category } : {}),\n ...(h.evidence ? { evidence: h.evidence } : {}),\n })));\n output += '\\n';\n }\n } catch (e) {\n output += `(Hypotheses unavailable: ${e instanceof Error ? e.message : 'unknown'})\\n\\n`;\n }\n }\n\n if (includeNudges) {\n try {\n const nudges = await storage.queryNudges({ resolved: false, limit });\n const matches = nudges.length === 0 ? [] : keywords.length === 0 || keywords.some(kw => kw === 'nudge' || kw === 'nudges' || kw === 'violation' || kw === 'violations' || kw === 'all')\n ? nudges\n : nudges.filter(n =>\n keywords.some(kw =>\n (n.message || '').toLowerCase().includes(kw) ||\n (n.file || '').toLowerCase().includes(kw)\n )\n );\n const toShow = matches.slice(0, limit);\n if (toShow.length > 0) {\n output += `⚠️ NUDGES / GOAL VIOLATIONS (${toShow.length}):\\n`;\n output += formatNudges(toShow);\n output += '\\n';\n }\n } catch (e) {\n output += `(Nudges unavailable: ${e instanceof Error ? e.message : 'unknown'})\\n\\n`;\n }\n }\n\n if (includeGovernance) {\n const governance = await storage.queryGovernance({ limit });\n const matches = governance.filter(g =>\n keywords.some(kw =>\n g.decision.toLowerCase().includes(kw) ||\n g.context.toLowerCase().includes(kw) ||\n g.tags.some(t => t.toLowerCase().includes(kw))\n )\n );\n if (matches.length > 0) {\n output += `📋 GOVERNANCE (${matches.length}):\\n`;\n output += new TrieGetGovernanceTool().formatGovernance(matches);\n output += '\\n';\n }\n }\n\n if (includeBlockers) {\n const blockers = await storage.queryBlockers({ limit });\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 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 { ContextGraph } from '../context/graph.js';\nimport { loadConfig } from '../config/loader.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\nimport type {\n LinearTicketNodeData,\n PullRequestNodeData,\n GitHubIssueNodeData,\n IssueNodeData,\n Node,\n} from '../context/nodes.js';\n\nexport interface PipelineInput {\n action?: 'status' | 'coverage' | 'create_tickets';\n focus?: string;\n issueIds?: string[];\n directory?: string;\n}\n\nexport class TriePipelineTool {\n async execute(input: PipelineInput): Promise<any> {\n try {\n const workDir = input.directory || getWorkingDirectory(undefined, true);\n const graph = new ContextGraph(workDir);\n const action = input.action ?? 'status';\n\n switch (action) {\n case 'status':\n return this.statusView(graph, input.focus);\n case 'coverage':\n return this.coverageView(graph);\n case 'create_tickets':\n return this.createTickets(graph, workDir, input.issueIds ?? []);\n default:\n return { isError: true, content: [{ type: 'text', text: `Unknown action: ${action}` }] };\n }\n } catch (error: any) {\n return {\n isError: true,\n content: [{ type: 'text', text: `Pipeline failed: ${error.message}` }],\n };\n }\n }\n\n private async statusView(graph: ContextGraph, focus?: string): Promise<any> {\n const nodes = await graph.listNodes();\n\n const tickets = nodes.filter(n => n.type === 'linear-ticket') as Array<Node & { data: LinearTicketNodeData }>;\n const prs = nodes.filter(n => n.type === 'pull-request') as Array<Node & { data: PullRequestNodeData }>;\n const ghIssues = nodes.filter(n => n.type === 'github-issue') as Array<Node & { data: GitHubIssueNodeData }>;\n const trieIssues = nodes.filter(n => n.type === 'issue') as Array<Node & { data: IssueNodeData }>;\n\n const LINE = '\\u2500'.repeat(68);\n const lines: string[] = [];\n\n lines.push('PIPELINE STATUS');\n lines.push(LINE);\n\n // Filter by focus if provided\n if (focus) {\n return this.focusedView(graph, nodes, focus, tickets, prs, ghIssues, trieIssues);\n }\n\n // Active Linear tickets\n const activeTickets = tickets.filter(t =>\n ['started', 'In Progress', 'in progress'].some(s =>\n t.data.status.toLowerCase().includes(s.toLowerCase())\n )\n );\n\n if (activeTickets.length > 0) {\n lines.push(`ACTIVE LINEAR TICKETS (${activeTickets.length} in progress)`);\n for (const t of activeTickets) {\n const linkedPR = prs.find(pr =>\n pr.data.linkedTicketIds.includes(t.data.ticketId)\n );\n const prInfo = linkedPR\n ? `PR #${linkedPR.data.prNumber} (CI: ${linkedPR.data.ciStatus})`\n : 'No PR yet';\n lines.push(\n ` ${padEnd(t.data.ticketId, 10)}${padEnd(truncate(t.data.title, 35), 37)}${padEnd(t.data.priority, 9)}${prInfo}`\n );\n }\n lines.push('');\n } else if (tickets.length > 0) {\n lines.push(`LINEAR TICKETS (${tickets.length} synced, none actively in progress)`);\n lines.push('');\n } else {\n lines.push('LINEAR TICKETS: not synced yet — run trie_linear_sync');\n lines.push('');\n }\n\n // Open PRs\n if (prs.length > 0) {\n lines.push(`OPEN PULL REQUESTS (${prs.length})`);\n for (const pr of prs) {\n const stateTag = pr.data.isDraft ? 'draft' : pr.data.state;\n const ticketRef = pr.data.linkedTicketIds.length > 0\n ? ` (${pr.data.linkedTicketIds.join(', ')})`\n : '';\n lines.push(\n ` #${padEnd(String(pr.data.prNumber), 5)}` +\n `${padEnd(truncate(pr.data.title, 30) + ticketRef, 42)}` +\n `${padEnd(stateTag, 10)}` +\n `CI: ${padEnd(pr.data.ciStatus, 10)}` +\n `Review: ${pr.data.reviewStatus}`\n );\n }\n lines.push('');\n } else {\n lines.push('PULL REQUESTS: not synced yet — run trie_github_sync');\n lines.push('');\n }\n\n // GitHub issues\n if (ghIssues.length > 0) {\n lines.push(`OPEN GITHUB ISSUES (${ghIssues.length})`);\n for (const issue of ghIssues.slice(0, 10)) {\n const labels = issue.data.labels.length > 0 ? `[${issue.data.labels.join(', ')}]` : '';\n const linked = issue.data.linkedTicketIds.length > 0\n ? `linked: ${issue.data.linkedTicketIds.join(', ')}`\n : 'no ticket';\n lines.push(\n ` #${padEnd(String(issue.data.issueNumber), 5)}` +\n `${padEnd(truncate(issue.data.title, 35), 37)}` +\n `${padEnd(labels, 18)}${linked}`\n );\n }\n if (ghIssues.length > 10) {\n lines.push(` ... and ${ghIssues.length - 10} more`);\n }\n lines.push('');\n }\n\n // Coverage gaps\n const openTrieIssues = trieIssues.filter(i => i.data.status === 'open');\n const uncoveredIssues = await this.findUncoveredIssues(graph, openTrieIssues, prs, tickets);\n\n if (uncoveredIssues.length > 0) {\n lines.push(`COVERAGE GAPS (${uncoveredIssues.length} Trie issue${uncoveredIssues.length !== 1 ? 's' : ''} with no ticket or PR)`);\n for (const issue of uncoveredIssues.slice(0, 10)) {\n const loc = `${shortPath(issue.data.file)}:${issue.data.line ?? '?'}`;\n lines.push(` ${padEnd(loc, 32)}${padEnd(issue.data.severity, 10)}${truncate(issue.data.issueText, 40)}`);\n }\n if (uncoveredIssues.length > 10) {\n lines.push(` ... and ${uncoveredIssues.length - 10} more`);\n }\n lines.push('');\n const ids = uncoveredIssues.slice(0, 5).map(i => `\"${i.id}\"`).join(',');\n lines.push(` Create tickets: trie_pipeline action:create_tickets issueIds:[${ids}]`);\n }\n\n lines.push(LINE);\n return { content: [{ type: 'text', text: lines.join('\\n') }] };\n }\n\n private async focusedView(\n _graph: ContextGraph,\n _allNodes: Node[],\n focus: string,\n tickets: Array<Node & { data: LinearTicketNodeData }>,\n prs: Array<Node & { data: PullRequestNodeData }>,\n ghIssues: Array<Node & { data: GitHubIssueNodeData }>,\n trieIssues: Array<Node & { data: IssueNodeData }>,\n ): Promise<any> {\n const LINE = '\\u2500'.repeat(68);\n const lines: string[] = [];\n lines.push(`PIPELINE FOCUS: ${focus}`);\n lines.push(LINE);\n\n // Check if focus is a ticket ID\n const matchedTicket = tickets.find(t => t.data.ticketId === focus);\n if (matchedTicket) {\n lines.push(`LINEAR TICKET: ${matchedTicket.data.ticketId}`);\n lines.push(` Title: ${matchedTicket.data.title}`);\n lines.push(` Status: ${matchedTicket.data.status}`);\n lines.push(` Priority: ${matchedTicket.data.priority}`);\n if (matchedTicket.data.assignee) lines.push(` Assignee: ${matchedTicket.data.assignee}`);\n if (matchedTicket.data.url) lines.push(` URL: ${matchedTicket.data.url}`);\n lines.push('');\n\n const linkedPRs = prs.filter(pr =>\n pr.data.linkedTicketIds.includes(matchedTicket.data.ticketId)\n );\n if (linkedPRs.length > 0) {\n lines.push(` LINKED PRs (${linkedPRs.length}):`);\n for (const pr of linkedPRs) {\n lines.push(` #${pr.data.prNumber} ${pr.data.title} CI: ${pr.data.ciStatus} Review: ${pr.data.reviewStatus}`);\n }\n } else {\n lines.push(' No PR linked to this ticket.');\n }\n lines.push(LINE);\n return { content: [{ type: 'text', text: lines.join('\\n') }] };\n }\n\n // Check if focus is a PR number\n const prNum = parseInt(focus.replace('#', ''), 10);\n if (!isNaN(prNum)) {\n const matchedPR = prs.find(pr => pr.data.prNumber === prNum);\n if (matchedPR) {\n lines.push(`PR #${matchedPR.data.prNumber}: ${matchedPR.data.title}`);\n lines.push(` State: ${matchedPR.data.state}${matchedPR.data.isDraft ? ' (draft)' : ''}`);\n lines.push(` Author: ${matchedPR.data.author}`);\n lines.push(` Branch: ${matchedPR.data.branch} → ${matchedPR.data.baseBranch}`);\n lines.push(` CI: ${matchedPR.data.ciStatus}`);\n lines.push(` Review: ${matchedPR.data.reviewStatus}`);\n lines.push(` URL: ${matchedPR.data.url}`);\n if (matchedPR.data.linkedTicketIds.length > 0) {\n lines.push(` Tickets: ${matchedPR.data.linkedTicketIds.join(', ')}`);\n }\n if (matchedPR.data.filesChanged.length > 0) {\n lines.push(` Files (${matchedPR.data.filesChanged.length}):`);\n for (const f of matchedPR.data.filesChanged.slice(0, 15)) {\n lines.push(` ${f}`);\n }\n if (matchedPR.data.filesChanged.length > 15) {\n lines.push(` ... and ${matchedPR.data.filesChanged.length - 15} more`);\n }\n }\n lines.push(LINE);\n return { content: [{ type: 'text', text: lines.join('\\n') }] };\n }\n }\n\n // Focus is a file path — show related context\n const relatedPRs = prs.filter(pr =>\n pr.data.filesChanged.some(f => f.includes(focus) || focus.includes(f))\n );\n const relatedIssues = trieIssues.filter(i => i.data.file.includes(focus));\n const relatedGhIssues = ghIssues.filter(i =>\n (i.data.body ?? '').includes(focus)\n );\n\n if (relatedPRs.length > 0) {\n lines.push(`PRs touching this file (${relatedPRs.length}):`);\n for (const pr of relatedPRs) {\n lines.push(` #${pr.data.prNumber} ${pr.data.title} — ${pr.data.state}`);\n }\n lines.push('');\n }\n if (relatedIssues.length > 0) {\n lines.push(`Trie issues in this file (${relatedIssues.length}):`);\n for (const issue of relatedIssues.slice(0, 5)) {\n lines.push(` ${issue.data.severity}: ${truncate(issue.data.issueText, 50)} (line ${issue.data.line ?? '?'})`);\n }\n lines.push('');\n }\n if (relatedGhIssues.length > 0) {\n lines.push(`GitHub issues mentioning this file (${relatedGhIssues.length}):`);\n for (const issue of relatedGhIssues.slice(0, 5)) {\n lines.push(` #${issue.data.issueNumber} ${issue.data.title}`);\n }\n }\n\n if (relatedPRs.length === 0 && relatedIssues.length === 0 && relatedGhIssues.length === 0) {\n lines.push('No pipeline context found for this focus.');\n }\n\n lines.push(LINE);\n return { content: [{ type: 'text', text: lines.join('\\n') }] };\n }\n\n private async coverageView(graph: ContextGraph): Promise<any> {\n const nodes = await graph.listNodes();\n const tickets = nodes.filter(n => n.type === 'linear-ticket') as Array<Node & { data: LinearTicketNodeData }>;\n const prs = nodes.filter(n => n.type === 'pull-request') as Array<Node & { data: PullRequestNodeData }>;\n const trieIssues = nodes.filter(n => n.type === 'issue' && (n.data as IssueNodeData).status === 'open') as Array<Node & { data: IssueNodeData }>;\n\n const uncovered = await this.findUncoveredIssues(graph, trieIssues, prs, tickets);\n\n const LINE = '\\u2500'.repeat(68);\n const lines: string[] = [];\n lines.push('COVERAGE GAPS');\n lines.push(LINE);\n lines.push(`${uncovered.length} Trie issue${uncovered.length !== 1 ? 's' : ''} not tracked in any Linear ticket or GitHub PR`);\n lines.push('');\n\n if (uncovered.length === 0) {\n lines.push('All issues are covered. Nice.');\n } else {\n const critical = uncovered.filter(i => i.data.severity === 'critical');\n const serious = uncovered.filter(i => i.data.severity === 'serious');\n const rest = uncovered.filter(i => !['critical', 'serious'].includes(i.data.severity));\n\n for (const group of [\n { label: 'CRITICAL', items: critical },\n { label: 'SERIOUS', items: serious },\n { label: 'OTHER', items: rest },\n ]) {\n if (group.items.length === 0) continue;\n lines.push(`${group.label} (${group.items.length}):`);\n for (const issue of group.items.slice(0, 10)) {\n const loc = `${shortPath(issue.data.file)}:${issue.data.line ?? '?'}`;\n lines.push(` ${padEnd(loc, 32)}${truncate(issue.data.issueText, 45)}`);\n }\n if (group.items.length > 10) {\n lines.push(` ... and ${group.items.length - 10} more`);\n }\n lines.push('');\n }\n\n if (critical.length > 0 || serious.length > 0) {\n const ids = [...critical, ...serious].slice(0, 5).map(i => `\"${i.id}\"`).join(',');\n lines.push(`Create tickets: trie_pipeline action:create_tickets issueIds:[${ids}]`);\n }\n }\n\n lines.push(LINE);\n return { content: [{ type: 'text', text: lines.join('\\n') }] };\n }\n\n private async createTickets(graph: ContextGraph, _workDir: string, issueIds: string[]): Promise<any> {\n if (issueIds.length === 0) {\n return {\n isError: true,\n content: [{ type: 'text', text: 'No issue IDs provided. Use trie_pipeline action:coverage to find uncovered issues.' }],\n };\n }\n\n const config = await loadConfig();\n const linearKey = config.apiKeys?.linear ?? process.env.LINEAR_API_KEY;\n if (!linearKey) {\n return {\n isError: true,\n content: [{ type: 'text', text: 'Linear API key not configured. Set it via Config → API Keys → Linear or LINEAR_API_KEY env var.' }],\n };\n }\n\n const nodes = await graph.listNodes();\n const created: string[] = [];\n const failed: string[] = [];\n\n for (const issueId of issueIds) {\n const issueNode = nodes.find(n => n.id === issueId && n.type === 'issue') as (Node & { data: IssueNodeData }) | undefined;\n if (!issueNode) {\n failed.push(`${issueId}: not found`);\n continue;\n }\n\n try {\n const title = `[Trie ${issueNode.data.severity}] ${truncate(issueNode.data.issueText, 80)}`;\n const description = [\n `**File:** \\`${issueNode.data.file}\\`${issueNode.data.line ? `:${issueNode.data.line}` : ''}`,\n `**Severity:** ${issueNode.data.severity}`,\n `**Found by:** ${issueNode.data.foundBy}`,\n `**Issue:** ${issueNode.data.issueText}`,\n issueNode.data.fix ? `**Suggested fix:** ${issueNode.data.fix}` : '',\n ].filter(Boolean).join('\\n');\n\n const priority = issueNode.data.severity === 'critical' ? 1\n : issueNode.data.severity === 'serious' ? 2\n : issueNode.data.severity === 'moderate' ? 3\n : 4;\n\n const mutation = `\n mutation CreateIssue($input: IssueCreateInput!) {\n issueCreate(input: $input) {\n success\n issue { id identifier url }\n }\n }\n `;\n\n const response = await fetch('https://api.linear.app/graphql', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': linearKey,\n },\n body: JSON.stringify({\n query: mutation,\n variables: {\n input: { title, description, priority },\n },\n }),\n });\n\n if (!response.ok) {\n failed.push(`${issueId}: Linear API error ${response.status}`);\n continue;\n }\n\n const data = (await response.json()) as any;\n if (data.data?.issueCreate?.success) {\n const ticket = data.data.issueCreate.issue;\n created.push(`${ticket.identifier} → ${issueId}`);\n\n // Link in context graph\n await graph.addEdge(issueNode.id, `linear:${ticket.identifier}`, 'relatedTo');\n } else {\n failed.push(`${issueId}: Linear create failed`);\n }\n } catch (error: any) {\n failed.push(`${issueId}: ${error.message}`);\n }\n }\n\n const LINE = '\\u2500'.repeat(45);\n const lines = ['TICKET CREATION', LINE];\n if (created.length > 0) {\n lines.push(`Created ${created.length} ticket(s):`);\n for (const c of created) lines.push(` ${c}`);\n }\n if (failed.length > 0) {\n lines.push(`Failed ${failed.length}:`);\n for (const f of failed) lines.push(` ${f}`);\n }\n lines.push(LINE);\n\n return { content: [{ type: 'text', text: lines.join('\\n') }] };\n }\n\n private async findUncoveredIssues(\n graph: ContextGraph,\n trieIssues: Array<Node & { data: IssueNodeData }>,\n prs: Array<Node & { data: PullRequestNodeData }>,\n tickets: Array<Node & { data: LinearTicketNodeData }>,\n ): Promise<Array<Node & { data: IssueNodeData }>> {\n const coveredFiles = new Set<string>();\n\n for (const pr of prs) {\n for (const f of pr.data.filesChanged) {\n coveredFiles.add(f);\n }\n }\n\n for (const ticket of tickets) {\n for (const f of ticket.data.linkedFiles) {\n coveredFiles.add(f);\n }\n }\n\n // Also check edges — an issue node linked to a PR or ticket is covered\n const coveredIssueIds = new Set<string>();\n for (const issue of trieIssues) {\n const edges = await graph.getEdges(issue.id, 'both');\n for (const edge of edges) {\n const otherNodeId = edge.from_id === issue.id ? edge.to_id : edge.from_id;\n if (otherNodeId.startsWith('pr:') || otherNodeId.startsWith('linear:')) {\n coveredIssueIds.add(issue.id);\n break;\n }\n }\n }\n\n return trieIssues.filter(issue => {\n if (coveredIssueIds.has(issue.id)) return false;\n\n // Check if the file is covered by a PR or ticket\n const normalizedFile = issue.data.file.replace(/^\\.\\//, '');\n for (const covered of coveredFiles) {\n if (normalizedFile.endsWith(covered) || covered.endsWith(normalizedFile)) {\n return false;\n }\n }\n\n return true;\n });\n }\n\n /**\n * Generate a brief summary for system prompt injection.\n * Only called when data is fresh (< 1 hour).\n */\n async getPipelineSummary(graph: ContextGraph): Promise<string | null> {\n const nodes = await graph.listNodes();\n\n const tickets = nodes.filter(n => n.type === 'linear-ticket') as Array<Node & { data: LinearTicketNodeData }>;\n const prs = nodes.filter(n => n.type === 'pull-request') as Array<Node & { data: PullRequestNodeData }>;\n const ghIssues = nodes.filter(n => n.type === 'github-issue') as Array<Node & { data: GitHubIssueNodeData }>;\n const trieIssues = nodes.filter(n => n.type === 'issue' && (n.data as IssueNodeData).status === 'open') as Array<Node & { data: IssueNodeData }>;\n\n if (tickets.length === 0 && prs.length === 0) return null;\n\n const activeTickets = tickets.filter(t =>\n ['started', 'In Progress', 'in progress'].some(s =>\n t.data.status.toLowerCase().includes(s.toLowerCase())\n )\n );\n const ciFailingPRs = prs.filter(pr => pr.data.ciStatus === 'failing');\n const approvedPRs = prs.filter(pr => pr.data.reviewStatus === 'approved');\n const uncovered = await this.findUncoveredIssues(graph, trieIssues, prs, tickets);\n const criticalUncovered = uncovered.filter(i => i.data.severity === 'critical' || i.data.severity === 'serious');\n\n const parts: string[] = [];\n parts.push(`PIPELINE CONTEXT (as of ${new Date().toISOString().slice(0, 16)}):`);\n\n if (activeTickets.length > 0) {\n const ticketIds = activeTickets.slice(0, 5).map(t => t.data.ticketId).join(', ');\n parts.push(`- Linear: ${activeTickets.length} ticket${activeTickets.length !== 1 ? 's' : ''} in progress (${ticketIds})`);\n }\n\n if (prs.length > 0) {\n const details: string[] = [];\n if (ciFailingPRs.length > 0) details.push(`${ciFailingPRs.length} CI failing`);\n if (approvedPRs.length > 0) details.push(`${approvedPRs.length} approved`);\n parts.push(`- GitHub: ${prs.length} open PR${prs.length !== 1 ? 's' : ''}${details.length > 0 ? ` (${details.join(', ')})` : ''}, ${ghIssues.length} open issue${ghIssues.length !== 1 ? 's' : ''}`);\n }\n\n if (criticalUncovered.length > 0) {\n parts.push(`- Coverage: ${criticalUncovered.length} critical/serious Trie issue${criticalUncovered.length !== 1 ? 's' : ''} have no ticket or PR`);\n }\n\n parts.push('');\n parts.push('Ask \"pipeline status\" for full view, or mention a ticket/PR number for details.');\n\n return parts.join('\\n');\n }\n}\n\nfunction shortPath(file: string): string {\n const parts = file.split('/');\n return parts.length > 2 ? parts.slice(-2).join('/') : file;\n}\n\nfunction padEnd(str: string, len: number): string {\n if (str.length >= len) return str.slice(0, len);\n return str + ' '.repeat(len - str.length);\n}\n\nfunction truncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n return str.slice(0, maxLen - 1) + '\\u2026';\n}\n","/**\n * GitHub Branches Tool\n *\n * Fetches branch list from GitHub API with latest commit info per branch.\n * Answers questions like \"which branch has the latest updates\".\n */\n\nimport { execSync } from 'node:child_process';\nimport { loadConfig } from '../config/loader.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\n\ninterface GitHubBranch {\n name: string;\n protected: boolean;\n commit: { sha: string; url: string };\n}\n\ninterface GitHubCommit {\n sha: string;\n commit: {\n author: { date: string; name: string };\n message: string;\n };\n}\n\nexport interface GitHubBranchesInput {\n directory?: string;\n limit?: number;\n}\n\nexport class GitHubBranchesTool {\n async execute(input: GitHubBranchesInput): Promise<{ content: Array<{ type: string; text: string }> }> {\n const workDir = input.directory || getWorkingDirectory(undefined, true);\n const limit = Math.min(Math.max(1, input.limit ?? 15), 30);\n\n const config = await loadConfig();\n const token = config.apiKeys?.github ?? process.env.GITHUB_TOKEN ?? null;\n\n if (!token) {\n return {\n content: [{\n type: 'text',\n text: 'GitHub token not configured.\\n\\n' +\n 'Set one of:\\n' +\n ' • Environment variable: GITHUB_TOKEN=ghp_...\\n' +\n ' • Config dialog (C key) → API Keys → GitHub\\n' +\n ' • .trie/config.json: { \"apiKeys\": { \"github\": \"ghp_...\" } }\\n\\n' +\n 'Token needs `repo` scope for private repos, `public_repo` for public.',\n }],\n };\n }\n\n const repoInfo = this.getRepoInfo(workDir);\n if (!repoInfo) {\n return {\n content: [{\n type: 'text',\n text: 'Could not detect GitHub repository.\\n\\n' +\n 'Make sure this directory is a git repo with a GitHub remote:\\n' +\n ' git remote get-url origin',\n }],\n };\n }\n\n try {\n const branches = await this.fetchBranches(repoInfo.owner, repoInfo.name, token);\n const withDates = await this.enrichWithLatestCommit(\n repoInfo.owner,\n repoInfo.name,\n branches,\n token,\n limit,\n );\n\n const lines = [\n `# GitHub Branches — ${repoInfo.owner}/${repoInfo.name}`,\n '',\n '**Branches by latest commit (most recent first):**',\n '',\n ...withDates.map((b) => {\n const dateStr = b.lastCommitDate\n ? new Date(b.lastCommitDate).toLocaleString('en-US', {\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n })\n : '—';\n const msg = b.lastCommitMessage ? b.lastCommitMessage.split('\\n')[0]?.slice(0, 50) : '';\n return `- **${b.name}** — ${dateStr}${msg ? ` — ${msg}${msg.length >= 50 ? '…' : ''}` : ''}`;\n }),\n '',\n '---',\n '',\n 'Use `git fetch origin` to refresh local refs before comparing.',\n ];\n\n return {\n content: [{ type: 'text', text: lines.join('\\n') }],\n };\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{\n type: 'text',\n text: `GitHub API error: ${msg}\\n\\n` +\n 'Check token validity and repo access. Token needs `repo` or `public_repo` scope.',\n }],\n };\n }\n }\n\n private getRepoInfo(projectPath: string): { owner: string; name: string } | null {\n try {\n const url = execSync('git remote get-url origin', {\n cwd: projectPath,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n const sshMatch = url.match(/github\\.com[:/]([^/]+)\\/([^/.]+)/);\n if (sshMatch) return { owner: sshMatch[1]!, name: sshMatch[2]!.replace(/\\.git$/, '') };\n\n const httpsMatch = url.match(/github\\.com\\/([^/]+)\\/([^/.]+)/);\n if (httpsMatch) return { owner: httpsMatch[1]!, name: httpsMatch[2]!.replace(/\\.git$/, '') };\n\n return null;\n } catch {\n return null;\n }\n }\n\n private async fetchBranches(\n owner: string,\n repo: string,\n token: string\n ): Promise<GitHubBranch[]> {\n const url = `https://api.github.com/repos/${owner}/${repo}/branches?per_page=100`;\n const branches = await this.fetchJson<GitHubBranch[]>(url, token);\n return branches;\n }\n\n private async enrichWithLatestCommit(\n owner: string,\n repo: string,\n branches: GitHubBranch[],\n token: string,\n limit: number\n ): Promise<Array<{\n name: string;\n lastCommitDate: string | null;\n lastCommitMessage: string | null;\n }>> {\n const results: Array<{\n name: string;\n lastCommitDate: string | null;\n lastCommitMessage: string | null;\n }> = [];\n\n for (let i = 0; i < Math.min(branches.length, limit); i++) {\n const branch = branches[i]!;\n try {\n const url = `https://api.github.com/repos/${owner}/${repo}/commits?sha=${encodeURIComponent(branch.name)}&per_page=1`;\n const commits = await this.fetchJson<GitHubCommit[]>(url, token);\n const commit = commits[0];\n results.push({\n name: branch.name,\n lastCommitDate: commit?.commit?.author?.date ?? null,\n lastCommitMessage: commit?.commit?.message ?? null,\n });\n } catch {\n results.push({ name: branch.name, lastCommitDate: null, lastCommitMessage: null });\n }\n }\n\n results.sort((a, b) => {\n if (!a.lastCommitDate) return 1;\n if (!b.lastCommitDate) return -1;\n return new Date(b.lastCommitDate).getTime() - new Date(a.lastCommitDate).getTime();\n });\n\n return results;\n }\n\n private async fetchJson<T>(url: string, token: string): Promise<T> {\n const response = await fetch(url, {\n headers: {\n Accept: 'application/vnd.github.v3+json',\n Authorization: `Bearer ${token}`,\n 'User-Agent': 'trie-agents',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n });\n\n if (response.status === 401) {\n throw new Error('GitHub token is invalid or expired.');\n }\n if (response.status === 403) {\n const resetHeader = response.headers.get('X-RateLimit-Reset');\n const resetTime = resetHeader\n ? new Date(parseInt(resetHeader, 10) * 1000).toLocaleTimeString()\n : 'unknown';\n throw new Error(`GitHub API rate limit exceeded. Resets at ${resetTime}.`);\n }\n if (response.status === 404) {\n throw new Error('Repository not found or token lacks access.');\n }\n if (!response.ok) {\n throw new Error(`GitHub API error ${response.status}: ${response.statusText}`);\n }\n\n return (await response.json()) as T;\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 { TrieCloudFixTool } from '../../tools/cloud-fix.js';\nimport { TrieGetGovernanceTool, TrieGetBlockersTool, TrieQueryContextTool, TrieGetDecisionsTool } from '../../tools/query-tools.js';\nimport { handleCheckpointTool } from '../../tools/checkpoint.js';\nimport { TriePipelineTool } from '../../tools/pipeline.js';\nimport { GitHubBranchesTool } from '../../tools/github-branches.js';\nimport { getProjectState, type Goal, type Hypothesis } from '../../agent/project-state.js';\nimport { measureInitialGoalValue } from '../../agent/goal-validator.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';\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_governance',\n description: 'Query the governance ledger — architectural decisions, standards, and team agreements recorded by Trie.',\n input_schema: {\n type: 'object' as const,\n properties: {\n relatedTo: { type: 'string', description: 'Filter governance records related to a topic or file' },\n limit: { type: 'number', description: 'Max results (default 10)' },\n },\n },\n },\n {\n name: 'trie_get_decisions',\n description: '[DEPRECATED - use trie_get_governance] Query the governance ledger — architectural decisions, standards, and team agreements.',\n input_schema: {\n type: 'object' as const,\n properties: {\n relatedTo: { type: 'string', description: 'Filter governance records 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 ALL Trie context: goals, hypotheses, nudges (goal violations), governance, blockers, facts, and questions. Use for \"what are my goals\", \"show hypotheses\", \"any nudges\", \"recent governance\", etc.',\n input_schema: {\n type: 'object' as const,\n properties: {\n query: { type: 'string', description: 'Natural language search query (e.g. \"goals\", \"hypotheses\", \"nudges\", \"governance\")' },\n type: { type: 'string', enum: ['goals', 'hypotheses', 'nudges', 'governance', '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_github_branches',\n description: 'Fetch GitHub branches with latest commit info. Use when the user asks which branch has the latest updates, what branches exist, or when branches were last updated. Requires GitHub API key.',\n input_schema: {\n type: 'object' as const,\n properties: {\n limit: { type: 'number', description: 'Max branches to return (default 15, max 30)' },\n },\n },\n },\n {\n name: 'trie_get_pipeline',\n description: 'Get current pipeline status: open PRs, active Linear tickets, open GitHub issues, and Trie scan issues not yet tracked in any ticket or PR. Use when the user asks about the status of work, what PRs are open, or what tickets are in progress.',\n input_schema: {\n type: 'object' as const,\n properties: {\n focus: { type: 'string', description: 'Optional file path or ticket ID to narrow the view' },\n include: {\n type: 'array',\n items: { type: 'string', enum: ['prs', 'tickets', 'issues', 'coverage'] },\n description: 'What to include (default: all)',\n },\n },\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_propose_fixes_batch',\n description: 'Propose fixes for multiple goal violations at once. More efficient than calling trie_propose_fix multiple times. Use when the user wants to fix multiple violations.',\n input_schema: {\n type: 'object' as const,\n properties: {\n fixes: {\n type: 'array',\n description: 'Array of fix proposals',\n items: {\n type: 'object',\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 required: ['fixes'],\n },\n },\n {\n name: 'trie_search_files',\n description: 'Search source code files for text patterns using ripgrep. Note: Requires ripgrep to be installed. For emoji detection, use trie_scan_for_goal_violations instead.',\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 name: 'trie_scan_for_goal_violations',\n description: 'Run an AI-powered scan to check for goal violations across the codebase. This is the most reliable way to detect issues like emojis, as it uses AI analysis rather than pattern matching.',\n input_schema: {\n type: 'object' as const,\n properties: {\n goalId: {\n type: 'string',\n description: 'Optional: Specific goal ID to check. If omitted, checks all active goals.'\n },\n },\n },\n },\n {\n name: 'trie_test_hypothesis',\n description: 'Gather evidence for a hypothesis using AI analysis of the codebase. Use when hypotheses have 0 evidence (untested) — proactively offer to run this to validate/invalidate them. Runs Anthropic RAG-style analysis across Trie context.',\n input_schema: {\n type: 'object' as const,\n properties: {\n hypothesisId: {\n type: 'string',\n description: 'ID of the hypothesis to test (from trie_query_context or project context)',\n },\n },\n required: ['hypothesisId'],\n },\n },\n {\n name: 'trie_cloud_fix',\n description: 'Dispatch to Cursor Cloud agents. Default: triage routes issues. When user explicitly says they want cloud (e.g. \"fix with cloud agent\") — pass forceCloud:true to honor their choice, do not reject. For ad-hoc (no scan issues): pass file, issue, fix from prior trie_propose_fix. Actions: configure, dispatch, status, artifacts, cancel.',\n input_schema: {\n type: 'object' as const,\n properties: {\n action: {\n type: 'string',\n enum: ['configure', 'dispatch', 'status', 'artifacts', 'cancel'],\n description: 'Action: configure (save apiKey), dispatch (send issues), status (check jobs), artifacts (get results), cancel (abort job)',\n },\n apiKey: {\n type: 'string',\n description: 'Cursor API key (only for action:configure). Get at cursor.com/settings → API Keys.',\n },\n issueIds: {\n type: 'array',\n items: { type: 'string' },\n description: 'Issue IDs to dispatch (for action:dispatch). Omit to dispatch all cloud-eligible issues.',\n },\n forceCloud: {\n type: 'boolean',\n description: 'When true, bypass triage and dispatch ALL issues to cloud. Use when user explicitly requests cloud fix.',\n },\n file: {\n type: 'string',\n description: 'For ad-hoc dispatch: file path (use with issue and fix when no scan issues)',\n },\n issue: { type: 'string', description: 'For ad-hoc dispatch: issue description' },\n fix: { type: 'string', description: 'For ad-hoc dispatch: suggested fix' },\n line: { type: 'number', description: 'For ad-hoc dispatch: line number' },\n jobId: {\n type: 'string',\n description: 'Job ID for action:artifacts or action:cancel',\n },\n },\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 * onProgress is optional - tools can call it to report progress during long operations.\n */\nexport async function executeTool(\n name: string,\n input: Record<string, unknown>,\n onProgress?: (message: string) => void\n): Promise<string> {\n const directory = getWorkingDirectory(undefined, true);\n const withDir = { ...input, directory };\n\n try {\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(withDir as any);\n return textFromResult(result);\n }\n case 'trie_get_governance': {\n const tool = new TrieGetGovernanceTool();\n const result = await tool.execute(withDir as any);\n return textFromResult(result);\n }\n case 'trie_get_decisions': {\n // Backward compatibility - use governance tool\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_github_branches': {\n const branchesTool = new GitHubBranchesTool();\n const branchesArgs: Record<string, unknown> = { directory };\n if (typeof input.limit === 'number') branchesArgs.limit = input.limit;\n const result = await branchesTool.execute(branchesArgs as any);\n return textFromResult(result);\n }\n case 'trie_get_pipeline': {\n const pipelineTool = new TriePipelineTool();\n const pipelineArgs: Record<string, unknown> = { action: 'status', directory };\n if (input.focus) pipelineArgs.focus = String(input.focus);\n const result = await pipelineTool.execute(pipelineArgs 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 = getProjectState(directory);\n await agentState.load();\n \n // Measure initial value based on existing issues\n const initialValue = await measureInitialGoalValue(desc, directory);\n \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: initialValue,\n startValue: initialValue,\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}]${initialValue > 0 ? ` (starting at ${initialValue} issues)` : ''}`;\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 = getProjectState(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,\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 autoGenerated: false,\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 governance: [decisionObj],\n facts: [],\n blockers: [],\n questions: [],\n gotchas: [],\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_propose_fixes_batch': {\n const fixes = input.fixes as Array<{\n file: string;\n goal: string;\n violation: string;\n suggestedFix?: string;\n }>;\n\n if (!Array.isArray(fixes) || fixes.length === 0) {\n return 'At least one fix is required.';\n }\n\n // Validate all fixes\n for (const fix of fixes) {\n if (!fix.file?.trim()) return 'All fixes must have a file path.';\n if (!fix.goal?.trim()) return 'All fixes must have a goal.';\n if (!fix.violation?.trim()) return 'All fixes must have a violation description.';\n }\n\n // Create fix proposals with directory\n const fixProposals = fixes.map(f => ({\n file: f.file.trim(),\n goal: f.goal.trim(),\n violation: f.violation.trim(),\n suggestedFix: f.suggestedFix?.trim(),\n directory,\n }));\n\n // Build a concise summary message\n let message = `Found ${fixes.length} violation(s) to fix:\\n\\n`;\n for (const fix of fixProposals) {\n message += `• ${fix.file}\\n`;\n }\n message += `\\nType \"yes to all\" to fix all files, or \"no\" to cancel.`;\n\n // Encode all fixes as pending\n for (const fixProposal of fixProposals) {\n message += `\\n[PENDING_FIX:${JSON.stringify(fixProposal)}]`;\n }\n\n return message;\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 use trie_scan_for_goal_violations for AI-powered analysis 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 case 'trie_scan_for_goal_violations': {\n const goalId = input.goalId ? String(input.goalId).trim() : undefined;\n \n try {\n onProgress?.('Loading goals...');\n const { getActiveGoals } = await import('../../agent/goal-validator.js');\n const agentState = getProjectState(directory);\n await agentState.load();\n \n // Get goals to check\n const allGoals = await getActiveGoals(directory);\n const goalsToCheck = goalId \n ? allGoals.filter(g => g.id === goalId)\n : allGoals;\n \n if (goalsToCheck.length === 0) {\n return goalId \n ? `No active goal found with ID: ${goalId}`\n : 'No active goals to check. Add goals in the Goals view first.';\n }\n \n onProgress?.('Scanning codebase for violations...');\n // Use fast analyzer for significantly better performance\n const { analyzeFilesRapidly } = await import('../../agent/fast-analyzer.js');\n const analysisOptions: any = {\n maxFiles: 50,\n enableSmartBatching: true\n };\n if (onProgress) {\n analysisOptions.onProgress = onProgress;\n }\n const analysisResult = await analyzeFilesRapidly(goalsToCheck, directory, analysisOptions);\n const violations = analysisResult.violations;\n \n if (violations.length === 0) {\n const cacheInfo = analysisResult.cacheHitRatio > 0\n ? ` (${Math.round(analysisResult.cacheHitRatio * 100)}% cache hit, ${analysisResult.timeMs}ms)`\n : ` (${analysisResult.timeMs}ms)`;\n return `✓ Scan complete! No violations found for ${goalsToCheck.length} goal(s).${cacheInfo}`;\n }\n \n // Store violations in ledger (AI source) so they appear in Ledger view\n const { storeIssues } = await import('../../memory/issue-store.js');\n const { basename } = await import('path');\n const issuesToStore = violations.map((v, i) => ({\n id: `goal-violation-${Date.now()}-${i}`,\n file: v.file,\n agent: 'goal-violation',\n severity: (v.severity === 'critical' ? 'critical' : v.severity === 'warning' ? 'serious' : 'moderate') as 'critical' | 'serious' | 'moderate' | 'low',\n issue: v.message,\n fix: 'Review and fix',\n category: 'goal-violation',\n confidence: 80,\n autoFixable: false,\n }));\n await storeIssues(issuesToStore, basename(directory), directory);\n \n // Format results - violations are already grouped by file\n let violationsReport = `Found ${violations.length} violation(s):\\n\\n`;\n\n for (const v of violations) {\n violationsReport += `⚠️ ${v.file}\\n`;\n violationsReport += ` ${v.message}\\n\\n`;\n }\n\n const cacheInfo = analysisResult.cacheHitRatio > 0\n ? ` Cache hit: ${Math.round(analysisResult.cacheHitRatio * 100)}% • Time: ${analysisResult.timeMs}ms`\n : ` Analysis time: ${analysisResult.timeMs}ms`;\n violationsReport += `Violations recorded to ledger (AI source).${cacheInfo}`;\n return violationsReport;\n } catch (error: any) {\n return `Scan failed: ${error.message}`;\n }\n }\n case 'trie_cloud_fix': {\n const cloudFixTool = new TrieCloudFixTool();\n const cloudFixArgs: Record<string, unknown> = {\n action: input.action || 'status',\n };\n if (input.apiKey) cloudFixArgs.apiKey = String(input.apiKey);\n if (Array.isArray(input.issueIds)) cloudFixArgs.issueIds = input.issueIds;\n if (input.jobId) cloudFixArgs.jobId = String(input.jobId);\n if (input.forceCloud === true) cloudFixArgs.forceCloud = true;\n if (input.file) cloudFixArgs.file = String(input.file);\n if (input.issue) cloudFixArgs.issue = String(input.issue);\n if (input.fix) cloudFixArgs.fix = String(input.fix);\n if (typeof input.line === 'number') cloudFixArgs.line = input.line;\n if (input.severity) cloudFixArgs.severity = String(input.severity);\n if (input.effort) cloudFixArgs.effort = String(input.effort);\n const result = await cloudFixTool.execute(cloudFixArgs as any);\n return textFromResult(result);\n }\n case 'trie_test_hypothesis': {\n const hypothesisId = String(input.hypothesisId || '').trim();\n \n // If no hypothesis ID provided, list available hypotheses\n if (!hypothesisId) {\n try {\n const agentState = getProjectState(directory);\n await agentState.load();\n const hypotheses = agentState.getActiveHypotheses();\n \n if (hypotheses.length === 0) {\n return 'No active hypotheses found. Use trie_add_hypothesis to create one first.';\n }\n \n let result = `Found ${hypotheses.length} active hypothesis/hypotheses. Please specify which one to test:\\n\\n`;\n for (const h of hypotheses) {\n const evidenceCount = h.evidence?.length ?? 0;\n const confPercent = Math.round((h.confidence ?? 0) * 100);\n result += `• ID: ${h.id}\\n Statement: ${h.statement}\\n Evidence: ${evidenceCount} points | Confidence: ${confPercent}%\\n\\n`;\n }\n result += `Call trie_test_hypothesis again with the hypothesisId you want to test.`;\n return result;\n } catch (error: any) {\n return `Failed to list hypotheses: ${error.message}`;\n }\n }\n \n try {\n onProgress?.('Gathering evidence for hypothesis...');\n const { gatherEvidenceForHypothesis } = await import('../../agent/hypothesis.js');\n const evidence = await gatherEvidenceForHypothesis(hypothesisId, directory);\n \n if (evidence.length === 0) {\n return `No evidence found for this hypothesis yet. The codebase may not have enough data to validate it — try running trie_scan_for_goal_violations first to populate issues, or add more context.`;\n }\n const supporting = evidence.filter(e => e.supports).length;\n const against = evidence.length - supporting;\n let result = `Found ${evidence.length} evidence point(s): ${supporting} supporting, ${against} against.\\n\\n`;\n for (const e of evidence.slice(0, 5)) {\n result += `${e.supports ? '✓' : '✗'} ${e.description}\\n`;\n }\n if (evidence.length > 5) result += `\\n... and ${evidence.length - 5} more.`;\n result += `\\n\\nHypothesis confidence has been updated. Check the Hypotheses view for the new confidence score.`;\n return result;\n } catch (error: any) {\n return `Hypothesis test failed: ${error.message}`;\n }\n }\n default:\n return `Unknown tool: ${name}`;\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : 'Unknown error';\n return `Tool execution failed: ${errorMsg}`;\n }\n}\n\n/**\n * Generate pipeline context for system prompt injection.\n * Returns null if no integration data is available or data is stale (> 1 hour).\n */\nexport async function getPipelineSystemPrompt(): Promise<string | null> {\n try {\n const directory = getWorkingDirectory(undefined, true);\n const graph = new ContextGraph(directory);\n const nodes = await graph.listNodes();\n\n const hasIntegrationData = nodes.some(\n n => n.type === 'linear-ticket' || n.type === 'pull-request'\n );\n if (!hasIntegrationData) return null;\n\n // Check freshness — only inject if we have recent data (< 1 hour)\n const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000).toISOString();\n const recentNodes = nodes.filter(\n n => (n.type === 'linear-ticket' || n.type === 'pull-request') &&\n n.updated_at > oneHourAgo\n );\n if (recentNodes.length === 0) return null;\n\n const pipelineTool = new TriePipelineTool();\n return pipelineTool.getPipelineSummary(graph);\n } catch {\n return null;\n }\n}\n","import React, { useEffect, useCallback } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport { useDashboard } from '../state.js';\nimport { getWorkingDirectory } from '../../../utils/workspace.js';\nimport { getChatStore } from '../chat-store.js';\n\nfunction formatTimeAgo(timestamp: number): string {\n const seconds = Math.floor((Date.now() - timestamp) / 1000);\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 if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days}d ago`;\n const months = Math.floor(days / 30);\n if (months < 12) return `${months}mo ago`;\n return `${Math.floor(months / 12)}y ago`;\n}\n\nexport function ChatArchiveView(): React.ReactElement {\n const { state, dispatch } = useDashboard();\n const { chatArchivePanel } = state;\n const { sessions, selectedIndex, showArchived, loading, inputMode, inputBuffer } = chatArchivePanel;\n\n const loadSessions = useCallback(async () => {\n dispatch({ type: 'SET_CHAT_ARCHIVE_LOADING', loading: true });\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const store = getChatStore(workDir);\n const sessionsList = await store.listSessions(showArchived);\n dispatch({ type: 'SET_CHAT_ARCHIVE_SESSIONS', sessions: sessionsList });\n } catch (error) {\n dispatch({ type: 'ADD_ACTIVITY', message: `Failed to load chat sessions: ${error instanceof Error ? error.message : 'unknown'}` });\n }\n dispatch({ type: 'SET_CHAT_ARCHIVE_LOADING', loading: false });\n }, [showArchived, dispatch]);\n\n useEffect(() => {\n void loadSessions();\n }, [loadSessions]);\n\n const loadChatSession = useCallback(async (sessionId: string) => {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const store = getChatStore(workDir);\n const session = await store.loadSession(sessionId);\n \n if (session) {\n dispatch({ type: 'LOAD_CHAT_MESSAGES', messages: session.messages as import('../types.js').ChatMessage[] });\n dispatch({ type: 'SET_CHAT_SESSION', sessionId: session.id, title: session.title });\n dispatch({ type: 'SET_VIEW', view: 'chat' });\n dispatch({ type: 'ADD_ACTIVITY', message: `Loaded chat: ${session.title}` });\n } else {\n dispatch({ type: 'SHOW_NOTIFICATION', message: 'Chat session not found', severity: 'warning', autoHideMs: 3000 });\n }\n } catch (error) {\n dispatch({ type: 'SHOW_NOTIFICATION', message: `Failed to load chat: ${error instanceof Error ? error.message : 'unknown'}`, severity: 'warning', autoHideMs: 3000 });\n }\n }, [dispatch]);\n\n const deleteSession = useCallback(async () => {\n if (sessions.length === 0) return;\n const session = sessions[selectedIndex];\n if (!session) return;\n\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const store = getChatStore(workDir);\n await store.deleteSession(session.id);\n dispatch({ type: 'ADD_ACTIVITY', message: `Deleted chat: ${session.title}` });\n dispatch({ type: 'SHOW_NOTIFICATION', message: 'Chat deleted', severity: 'info', autoHideMs: 2000 });\n await loadSessions();\n } catch (error) {\n dispatch({ type: 'SHOW_NOTIFICATION', message: `Failed to delete: ${error instanceof Error ? error.message : 'unknown'}`, severity: 'warning', autoHideMs: 3000 });\n }\n }, [sessions, selectedIndex, dispatch, loadSessions]);\n\n const archiveSession = useCallback(async () => {\n if (sessions.length === 0) return;\n const session = sessions[selectedIndex];\n if (!session) return;\n\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const store = getChatStore(workDir);\n await store.archiveSession(session.id);\n dispatch({ type: 'ADD_ACTIVITY', message: `Archived chat: ${session.title}` });\n dispatch({ type: 'SHOW_NOTIFICATION', message: 'Chat archived', severity: 'info', autoHideMs: 2000 });\n await loadSessions();\n } catch (error) {\n dispatch({ type: 'SHOW_NOTIFICATION', message: `Failed to archive: ${error instanceof Error ? error.message : 'unknown'}`, severity: 'warning', autoHideMs: 3000 });\n }\n }, [sessions, selectedIndex, dispatch, loadSessions]);\n\n const renameSession = useCallback(async (newTitle: string) => {\n if (sessions.length === 0 || !newTitle.trim()) return;\n const session = sessions[selectedIndex];\n if (!session) return;\n\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const store = getChatStore(workDir);\n await store.renameSession(session.id, newTitle.trim());\n dispatch({ type: 'ADD_ACTIVITY', message: `Renamed chat to: ${newTitle}` });\n dispatch({ type: 'SHOW_NOTIFICATION', message: 'Chat renamed', severity: 'info', autoHideMs: 2000 });\n dispatch({ type: 'SET_CHAT_ARCHIVE_INPUT_MODE', mode: 'browse' });\n await loadSessions();\n } catch (error) {\n dispatch({ type: 'SHOW_NOTIFICATION', message: `Failed to rename: ${error instanceof Error ? error.message : 'unknown'}`, severity: 'warning', autoHideMs: 3000 });\n }\n }, [sessions, selectedIndex, dispatch, loadSessions]);\n\n const exportSession = useCallback(async () => {\n if (sessions.length === 0) return;\n const session = sessions[selectedIndex];\n if (!session) return;\n\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const store = getChatStore(workDir);\n const exported = await store.exportSession(session.id);\n \n if (exported) {\n // Copy to clipboard or save to file\n // For now, just show a notification\n dispatch({ type: 'SHOW_NOTIFICATION', message: 'Chat exported (check logs for JSON)', severity: 'info', autoHideMs: 3000 });\n console.log('=== EXPORTED CHAT ===');\n console.log(exported);\n console.log('=== END EXPORT ===');\n }\n } catch (error) {\n dispatch({ type: 'SHOW_NOTIFICATION', message: `Failed to export: ${error instanceof Error ? error.message : 'unknown'}`, severity: 'warning', autoHideMs: 3000 });\n }\n }, [sessions, selectedIndex, dispatch]);\n\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 useInput((input, key) => {\n // Don't capture q/Q - let App handle quit\n if (input === 'q' || input === 'Q') return;\n\n if (inputMode === 'rename') {\n if (key.return) {\n void renameSession(inputBuffer);\n } else if (key.escape) {\n dispatch({ type: 'SET_CHAT_ARCHIVE_INPUT_MODE', mode: 'browse' });\n } else if (key.backspace || key.delete) {\n dispatch({ type: 'SET_CHAT_ARCHIVE_INPUT_BUFFER', buffer: inputBuffer.slice(0, -1) });\n } else if (input && !key.ctrl && !key.meta) {\n dispatch({ type: 'SET_CHAT_ARCHIVE_INPUT_BUFFER', buffer: inputBuffer + input });\n }\n return;\n }\n\n // Browse mode\n if (key.upArrow || input === 'k') {\n const newIndex = Math.max(0, selectedIndex - 1);\n dispatch({ type: 'SELECT_CHAT_SESSION', index: newIndex });\n } else if (key.downArrow || input === 'j') {\n const newIndex = Math.min(sessions.length - 1, selectedIndex + 1);\n dispatch({ type: 'SELECT_CHAT_SESSION', index: newIndex });\n } else if (key.return) {\n if (sessions[selectedIndex]) {\n void loadChatSession(sessions[selectedIndex]!.id);\n }\n } else if (input === 'd') {\n void deleteSession();\n } else if (input === 'a') {\n void archiveSession();\n } else if (input === 'r') {\n dispatch({ type: 'SET_CHAT_ARCHIVE_INPUT_MODE', mode: 'rename' });\n } else if (input === 'e') {\n void exportSession();\n } else if (input === 't') {\n dispatch({ type: 'TOGGLE_ARCHIVED_CHATS' });\n } else if (input === 'n') {\n // New chat\n dispatch({ type: 'CLEAR_CHAT' });\n dispatch({ type: 'SET_VIEW', view: 'chat' });\n }\n });\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold>Chat Archive</Text>\n <Text dimColor> Loading...</Text>\n </Box>\n );\n }\n\n if (sessions.length === 0) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold>Chat Archive</Text>\n <Text dimColor> {showArchived ? 'No archived chats' : 'No chat history yet'}</Text>\n <Text dimColor> Press n to start a new chat</Text>\n </Box>\n );\n }\n\n if (inputMode === 'rename') {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold>Rename Chat</Text>\n <Box marginTop={1}>\n <Text>Title: </Text>\n <Text>{inputBuffer}</Text>\n <Text>│</Text>\n </Box>\n <Box marginTop={1}>\n <Text dimColor>enter save · esc cancel</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text>\n <Text bold>Chat Archive</Text>\n <Text dimColor> {sessions.length} chat{sessions.length !== 1 ? 's' : ''}</Text>\n {showArchived && <Text color=\"yellow\"> (showing archived)</Text>}\n </Text>\n\n <Box flexDirection=\"column\" marginTop={1}>\n {sessions.map((session, idx) => {\n const isSelected = idx === selectedIndex;\n const ago = formatTimeAgo(session.updatedAt);\n const titleWidth = Math.max(30, contentWidth - 20);\n const titleDisplay = session.title.length > titleWidth ? session.title.slice(0, titleWidth) + '...' : session.title;\n\n return (\n <Box key={session.id} flexDirection=\"column\">\n <Text wrap=\"truncate\">\n {isSelected ? <Text bold color=\"green\">{'> '}</Text> : ' '}\n {isSelected ? <Text bold>{titleDisplay}</Text> : <Text>{titleDisplay}</Text>}\n {narrow ? null : <Text dimColor> {session.messageCount} msgs · {ago}</Text>}\n </Text>\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n}\n"],"mappings":"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","names":["React","useState","useEffect","useCallback","useRef","Box","useInput","useStdout","existsSync","readFile","writeFile","mkdir","join","jsx","React","Box","Text","useStdout","jsx","jsxs","useStdout","Box","React","Text","Box","Text","jsx","jsxs","Box","Text","React","Box","Text","jsx","jsxs","React","Box","Text","Box","Text","useStdout","jsx","jsxs","Box","Text","useInput","useStdout","Fragment","jsx","jsxs","pendingFixes","useStdout","useInput","Box","Text","Box","Text","useInput","useStdout","Fragment","jsx","jsxs","useStdout","getStorage","useInput","Box","Text","useCallback","Box","Text","useInput","useStdout","Fragment","jsx","jsxs","startValue","useStdout","useCallback","useInput","Box","Text","useCallback","useRef","Box","Text","useInput","useStdout","Fragment","jsx","jsxs","useRef","useStdout","useCallback","useInput","Box","Text","useEffect","useCallback","Box","Text","useInput","useStdout","Fragment","jsx","jsxs","timeAgo","useStdout","useCallback","governance","useEffect","useInput","Box","Text","path","Box","Text","useInput","jsx","jsxs","useInput","Box","Text","useCallback","useRef","useEffect","useState","Box","Text","useInput","useStdout","existsSync","existsSync","readFile","existsSync","join","path","readFile","existsSync","extname","relative","resolve","isAbsolute","isAbsolute","resolve","existsSync","readFile","relative","extname","shortPath","padEnd","join","existsSync","path","readFile","padEnd","truncate","shortPath","execSync","execSync","cacheInfo","Fragment","jsx","jsxs","useRef","useStdout","useState","useEffect","getChatStore","useCallback","result","pendingFixes","useInput","Box","Text","useEffect","useCallback","Box","Text","useInput","useStdout","jsx","jsxs","formatTimeAgo","useCallback","useEffect","useStdout","useInput","Box","Text","jsx","jsxs","isAIAvailable","join","readFile","writeFile","useStdout","useState","useRef","loadConfig","useCallback","existsSync","mkdir","saveAutonomyConfig","loadAutonomyConfig","getStorage","useEffect","useInput","Box","React"]}
|