@triedotdev/mcp 1.0.97 → 1.0.101

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/interactive-dashboard.ts","../src/utils/output-manager.ts","../src/utils/file-picker.ts"],"sourcesContent":["/**\n * Scan tool - simplified for decision ledger only\n * Note: Skills/scouts have been removed. Trie now focuses on:\n * - Learning from incidents (trie tell)\n * - Predicting risks (trie gotcha)\n * - Decision ledger (context graph)\n */\n\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 // Skills/scouts have been removed\n // Trie now focuses on decision ledger and learning from incidents\n console.error('ℹ️ Trie scan has been refocused on decision ledger');\n console.error(' Use: trie tell - to report incidents');\n console.error(' Use: trie gotcha - to predict risks');\n console.error(' Use: trie learn - to learn from history');\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\n// Export for backward compatibility\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' | 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 memory operations (saving context, learning patterns)\n */\n reportMemory(action: 'saving' | 'saved' | 'learning', details?: string): void {\n this.emit('memory', { action, details });\n }\n\n /**\n * Report signal extraction from watch mode\n */\n reportSignalExtraction(signals: { decisions: number; facts: number; blockers: number; questions: number }): void {\n this.emit('signal_extracted', signals);\n }\n\n // ============================================\n // Rich Content Events (for TUI panes)\n // ============================================\n\n /**\n * Report a code snippet for display\n */\n reportSnippet(snippet: SnippetContent): void {\n this.emit('snippet', snippet);\n }\n\n /**\n * Report cost estimate from Moneybags\n */\n reportCost(cost: CostContent): void {\n this.emit('cost_report', cost);\n }\n\n /**\n * Report production readiness score\n */\n reportReadiness(readiness: ReadinessContent): void {\n this.emit('readiness_report', readiness);\n }\n\n /**\n * Report semantic analysis results\n */\n reportSemantic(semantic: SemanticContent): void {\n this.emit('semantic_report', semantic);\n }\n\n /**\n * Report attack surface analysis\n */\n reportAttackSurface(attack: AttackSurfaceContent): void {\n this.emit('attack_surface', attack);\n }\n\n /**\n * Report skill banner (ASCII art + quote)\n */\n reportBanner(banner: BannerContent): void {\n this.emit('skill_banner', banner);\n }\n\n /**\n * Report raw log entry\n */\n reportRawLog(level: 'info' | 'warn' | 'error' | 'debug', message: string): void {\n this.emit('raw_log', { level, message, time: new Date().toLocaleTimeString('en-US', { hour12: false }) });\n }\n}\n\n/**\n * Format streaming updates for console output\n * Returns null if interactive mode is enabled (dashboard handles display)\n */\nexport function formatConsoleUpdate(update: StreamUpdate): string | null {\n // In interactive mode, the dashboard handles all display\n if (isInteractiveMode()) {\n return null;\n }\n\n switch (update.type) {\n case 'agent_start':\n // Suppress agent start messages - they're redundant with progress updates\n return null;\n\n case 'agent_complete':\n const label = update.data.issueCount > 0 ? '[WARN]' : '[OK]';\n const severityBreakdown: string[] = [];\n if (update.data.issues && Array.isArray(update.data.issues)) {\n const bySeverity = { critical: 0, serious: 0, moderate: 0, low: 0 };\n for (const issue of update.data.issues) {\n if (issue.severity && Object.prototype.hasOwnProperty.call(bySeverity, issue.severity)) {\n bySeverity[issue.severity as keyof typeof bySeverity]++;\n }\n }\n if (bySeverity.critical > 0) severityBreakdown.push(`${bySeverity.critical} critical`);\n if (bySeverity.serious > 0) severityBreakdown.push(`${bySeverity.serious} serious`);\n if (bySeverity.moderate > 0) severityBreakdown.push(`${bySeverity.moderate} moderate`);\n if (bySeverity.low > 0) severityBreakdown.push(`${bySeverity.low} low`);\n }\n const breakdown = severityBreakdown.length > 0 ? ` (${severityBreakdown.join(', ')})` : '';\n return `${label} ${update.data.agent}: ${update.data.issueCount} issues${breakdown}`;\n\n case 'progress':\n // Only show progress updates every 10% or when significant changes occur\n const { processedFiles, totalFiles, currentFile, activeAgents } = update.data;\n const progress = totalFiles > 0 ? Math.round((processedFiles / totalFiles) * 100) : 0;\n \n // Suppress frequent progress updates - only show at milestones\n if (totalFiles > 10 && progress % 10 !== 0 && processedFiles !== totalFiles) {\n return null;\n }\n \n const active = activeAgents.length > 0 ? ` (${activeAgents.join(', ')})` : '';\n const current = currentFile && totalFiles <= 10 ? ` - ${currentFile.split('/').pop()}` : '';\n return `Progress: ${progress}% (${processedFiles}/${totalFiles})${active}${current}`;\n\n case 'scan_complete':\n const { totalIssues, totalFiles: filesScanned, issuesBySeverity } = update.data;\n const severitySummary: string[] = [];\n if (issuesBySeverity) {\n if (issuesBySeverity.critical > 0) severitySummary.push(`${issuesBySeverity.critical} critical`);\n if (issuesBySeverity.serious > 0) severitySummary.push(`${issuesBySeverity.serious} serious`);\n if (issuesBySeverity.moderate > 0) severitySummary.push(`${issuesBySeverity.moderate} moderate`);\n if (issuesBySeverity.low > 0) severitySummary.push(`${issuesBySeverity.low} low`);\n }\n const summary = severitySummary.length > 0 ? ` [${severitySummary.join(', ')}]` : '';\n return `[COMPLETE] Scan finished: ${totalIssues} issues across ${filesScanned} files${summary}`;\n\n case 'error':\n return `[ERROR] ${update.data.message}`;\n\n default:\n return null;\n }\n}\n\n/**\n * Simple progress bar for terminal\n */\nexport function createProgressBar(current: number, total: number, width: number = 40): string {\n if (total === 0) return '█'.repeat(width);\n\n const progress = current / total;\n const filled = Math.round(width * progress);\n const empty = width - filled;\n\n return '█'.repeat(filled) + '░'.repeat(empty);\n}","import { stdin as input, stdout as output } from 'process';\nimport * as readline from 'readline';\nimport { existsSync } from 'fs';\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport { join, basename } from 'path';\nimport pc from 'picocolors';\nimport type { Issue } from '../types/index.js';\nimport type { \n StreamUpdate, \n ScanProgress, \n BannerContent, \n SnippetContent, \n CostContent, \n ReadinessContent, \n SemanticContent, \n AttackSurfaceContent \n} from '../utils/streaming.js';\nimport { getOutputManager, type NudgeContent } from '../utils/output-manager.js';\nimport { getWorkingDirectory, getTrieDirectory } from '../utils/workspace.js';\nimport { openFilePicker, isFilePickerAvailable } from '../utils/file-picker.js';\nimport { getGuardianState, type Goal, type Hypothesis } from '../guardian/guardian-state.js';\nimport { loadContextState } from '../utils/context-state.js';\nimport { getGuardian, type GuardianInsight } from '../guardian/guardian-agent.js';\nimport { isAIAvailable } from '../ai/client.js';\nimport { searchIssues, getRecentIssues, getMemoryStats, type StoredIssue, type IssueMemoryStats } from '../memory/issue-store.js';\nimport { findCrossProjectPatterns, type GlobalPattern } from '../memory/global-memory.js';\n\n/**\n * Color theme for Trie TUI (cyan-based, not orange like Claude Code)\n */\nconst colors = {\n // UI elements\n border: (s: string) => pc.cyan(s),\n header: (s: string) => pc.bold(pc.cyan(s)),\n brand: (s: string) => pc.bold(pc.cyan(s)),\n dim: (s: string) => pc.dim(s),\n \n // Severity levels\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 // Status\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 // Interactive\n selected: (s: string) => pc.bold(pc.magenta(s)),\n highlight: (s: string) => pc.bold(pc.white(s)),\n \n // Additional\n yellow: (s: string) => pc.yellow(s),\n};\n\n/**\n * Strip ANSI escape codes to get visible string length\n */\n// eslint-disable-next-line no-control-regex\nconst stripAnsi = (s: string): string => s.replace(/\\x1B\\[[0-9;]*[a-zA-Z]/g, '');\n\n/**\n * Calculate visible width of a string, accounting for:\n * - ANSI escape codes (0 width)\n * - Emojis and wide characters (2 width)\n * - Regular characters (1 width)\n */\nconst visibleLength = (s: string): number => {\n const plain = stripAnsi(s);\n let width = 0;\n for (const char of plain) {\n const code = char.codePointAt(0) || 0;\n // Emoji ranges and other wide characters\n if (\n (code >= 0x1F300 && code <= 0x1F9FF) || // Emoji\n (code >= 0x2600 && code <= 0x26FF) || // Misc symbols\n (code >= 0x2700 && code <= 0x27BF) || // Dingbats\n (code >= 0xFE00 && code <= 0xFE0F) || // Variation selectors\n (code >= 0x1F000 && code <= 0x1FFFF) || // Extended emoji\n (code >= 0x3000 && code <= 0x9FFF) || // CJK\n (code >= 0xAC00 && code <= 0xD7AF) // Korean\n ) {\n width += 2;\n } else {\n width += 1;\n }\n }\n return width;\n};\n\n/**\n * Pad a colored string to a target visible width\n */\nconst padEnd = (s: string, targetWidth: number): string => {\n const visible = visibleLength(s);\n const padding = Math.max(0, targetWidth - visible);\n return s + ' '.repeat(padding);\n};\n\n/**\n * Unicode box-drawing characters for cleaner TUI\n */\nconst box = {\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n leftT: '├',\n rightT: '┤',\n topT: '┬',\n bottomT: '┴',\n cross: '┼',\n};\n\n// All available view types (including new rich content views)\ntype DashboardView = \n | 'overview' // Main dashboard with progress\n | 'issues' // Issue list browser\n | 'files' // Files with issues\n | 'details' // Selected issue with code snippet\n | 'costs' // Moneybags cost breakdown\n | 'readiness' // Production readiness checklist\n | 'analysis' // Semantic + attack surface\n | 'rawlog' // Raw log viewer\n | 'guardian' // Guardian notifications history\n | 'goals' // Goals management panel\n | 'hypotheses' // Hypotheses management panel\n | 'memory'; // Memory tree visualization\n\ninterface DashboardState {\n issues: Issue[];\n progress: ScanProgress;\n filter: {\n severity: 'all' | 'critical' | 'serious' | 'moderate' | 'low';\n agent: string | 'all';\n search: string;\n };\n view: DashboardView;\n previousView: DashboardView | null;\n selectedIssue: number;\n selectedAgent: number;\n lastUpdate: number;\n scanComplete: boolean;\n scanEndTime?: number;\n startTime: number;\n scanStartTime: number;\n activityLog: Array<{ time: string; message: string }>;\n activityPage: number;\n agentPage: number;\n quietMode: boolean;\n // Signal extraction stats\n signalExtraction: {\n enabled: boolean;\n decisionsExtracted: number;\n factsExtracted: number;\n blockersExtracted: number;\n questionsExtracted: number;\n };\n alerts: {\n hasCritical: boolean;\n lastCriticalAt?: number;\n };\n watch: {\n watching: boolean;\n directories: number;\n debounceMs?: number;\n lastChange?: string;\n recentChanges: Array<{ file: string; time: string }>;\n };\n agents: Record<string, {\n status: 'queued' | 'running' | 'done';\n start?: number;\n end?: number;\n durationMs?: number;\n issues: number;\n }>;\n \n // === NEW: Rich content state ===\n \n // Code snippets for issues (keyed by issue index)\n codeSnippets: Map<number, SnippetContent>;\n \n // Cost report from Moneybags\n costReport: CostContent | null;\n \n // Production readiness from production-ready skill\n readiness: ReadinessContent | null;\n \n // Semantic analysis results\n semanticAnalysis: SemanticContent | null;\n \n // Attack surface analysis\n attackSurface: AttackSurfaceContent | null;\n \n // Skill banners (most recent first)\n skillBanners: BannerContent[];\n \n // Raw log capture (for rawlog view)\n rawLog: Array<{ time: string; level: string; message: string }>;\n rawLogPage: number;\n \n // Scroll positions for scrollable views\n scrollPositions: Record<DashboardView, number>;\n \n // === Proactive Notifications (Guardian Nudges) ===\n notification: {\n active: boolean;\n message: string;\n severity: 'critical' | 'warning' | 'info';\n file?: string;\n timestamp: number;\n autoHideAt?: number; // Auto-dismiss after this timestamp\n } | null;\n notificationHistory: Array<{\n message: string;\n severity: 'critical' | 'warning' | 'info';\n file?: string;\n timestamp: number;\n dismissed: boolean;\n }>;\n \n // Guardian Agent insights - the agentic, conversational alerts\n guardianInsights: GuardianInsight[];\n guardianInitialized: boolean;\n \n // Guardian Agency status (goals, hypotheses, risk, effectiveness)\n agencyStatus: {\n goals: { active: number; completed: number; topGoal?: string };\n hypotheses: { testing: number; validated: number; topHypothesis?: string };\n riskLevel: 'low' | 'medium' | 'high' | 'critical';\n scanFrequency: number;\n effectiveness: number;\n isQuietHours: boolean;\n } | null;\n \n // Guardian insight navigation\n selectedGuardianInsight: number;\n expandedGuardianInsight: number | null; // null = none expanded, number = index of expanded insight\n \n // Global Guardian Agent configuration\n guardianConfig: {\n // Moneybags settings\n moneybags: {\n userCount: number;\n payingUsers: number;\n revenuePerUser: number;\n developerRate: number;\n industry?: 'solopreneur' | 'startup' | 'fintech' | 'healthcare' | 'enterprise' | 'saas' | 'ecommerce';\n };\n // Agent Smith settings\n agentSmith: {\n aiEnhancement: boolean;\n minSeverity: 'critical' | 'serious' | 'moderate' | 'low';\n enabledCategories: {\n security: boolean;\n codeSmells: boolean;\n asyncBugs: boolean;\n reactPatterns: boolean;\n uxPatterns: boolean;\n backendPatterns: boolean;\n };\n memoryRetentionDays: number;\n };\n // Scan performance settings\n performance: {\n parallel: boolean;\n cache: boolean;\n maxConcurrency: number;\n timeoutMs: number;\n workers: boolean;\n streaming: boolean;\n };\n // Risk assessment thresholds\n riskThresholds: {\n critical: number;\n high: number;\n medium: number;\n };\n // Escalation settings\n escalation: {\n enabled: boolean;\n targets: Array<{\n type: 'slack' | 'email' | 'webhook';\n enabled: boolean;\n config: {\n webhookUrl?: string;\n email?: string;\n channel?: string;\n username?: string;\n };\n forSeverities: string[];\n forCategories: string[];\n }>;\n cooldownMinutes: number;\n maxEscalationsPerHour: number;\n respectQuietHours: boolean;\n criticalBypassQuietHours: boolean;\n };\n };\n \n // Skills browser state\n skillsBrowser: {\n installedSkills: Array<{\n name: string;\n description: string;\n path: string;\n installedFrom: string;\n installedAt: string;\n timesApplied?: number;\n }>;\n globalSkills: Array<{\n name: string;\n description: string;\n path: string;\n installedFrom: string;\n installedAt: string;\n }>;\n suggestedSkills: string[];\n detectedStack: {\n framework?: string;\n language?: string;\n database?: string;\n };\n categories: Array<{ name: string; count: number }>;\n selectedCategory: string | null;\n categorySkills: string[];\n selectedIndex: number;\n activePanel: 'installed' | 'global' | 'suggested' | 'categories';\n installing: boolean;\n inputMode: 'browse' | 'drop-file';\n droppedFilePath: string;\n installStatus: string;\n lastRefresh: number;\n };\n \n // Goals management state\n goalsPanel: {\n goals: Array<{\n id: string;\n description: string;\n type: string;\n target: number;\n currentValue: number;\n status: string;\n autoGenerated: boolean;\n category?: string;\n updatedAt: string;\n }>;\n selectedIndex: number;\n selectedAchievedIndex: number;\n inputMode: 'browse' | 'add';\n inputBuffer: string;\n lastRefresh: number;\n };\n \n // Hypotheses management state\n hypothesesPanel: {\n hypotheses: Array<{\n id: string;\n statement: string;\n confidence: number;\n status: string;\n evidenceCount: number;\n category?: string;\n updatedAt: string;\n }>;\n selectedIndex: number;\n selectedCompletedIndex: number;\n inputMode: 'browse' | 'add';\n inputBuffer: string;\n lastRefresh: number;\n };\n \n // Memory tree visualization state\n memoryTree: {\n loaded: boolean;\n issues: StoredIssue[];\n stats: IssueMemoryStats | null;\n globalPatterns: GlobalPattern[];\n expandedNodes: Set<string>;\n selectedNode: string;\n scrollPosition: number;\n lastRefresh: number;\n };\n}\n\n/**\n * Interactive CLI Dashboard for Trie scans\n *\n * Features:\n * - Real-time progress bars\n * - Interactive issue browser\n * - Filter and search capabilities\n * - Keyboard navigation\n */\n// ASCII animation frames for watch mode\nconst WATCH_FRAMES = ['◐', '◓', '◑', '◒']; // Rotating circle\nconst SCAN_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']; // Braille spinner\n\nexport class InteractiveDashboard {\n private rl: readline.Interface;\n private state: DashboardState;\n private isActive: boolean = false;\n private updateInterval: NodeJS.Timeout | undefined;\n private resizeHandler: (() => void) | undefined;\n private resizeDebounce: NodeJS.Timeout | undefined;\n private guardianConfigPath: string;\n \n // Double-buffering to prevent flicker\n private buffer: string[] = [];\n private lastFrame: string = '';\n \n // Animation frame counter\n private animFrame: number = 0;\n \n // Callback for when Moneybags settings change (triggers recalculation)\n private onMoneybagsChangeCallback: (() => void) | null = null;\n\n constructor() {\n this.rl = readline.createInterface({ input, output });\n const workDir = getWorkingDirectory(undefined, true);\n this.guardianConfigPath = join(getTrieDirectory(workDir), 'guardian.json');\n this.state = {\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: {\n severity: 'all',\n agent: 'all',\n search: ''\n },\n view: 'overview',\n previousView: null,\n selectedIssue: 0,\n selectedAgent: 0,\n lastUpdate: Date.now(),\n scanComplete: false,\n startTime: Date.now(),\n scanStartTime: Date.now(),\n activityLog: [],\n activityPage: 0,\n agentPage: 0,\n quietMode: false,\n signalExtraction: {\n enabled: !!process.env.ANTHROPIC_API_KEY,\n decisionsExtracted: 0,\n factsExtracted: 0,\n blockersExtracted: 0,\n questionsExtracted: 0,\n },\n alerts: { hasCritical: false },\n watch: {\n watching: false,\n directories: 0,\n recentChanges: []\n },\n agents: {},\n \n // Rich content state\n codeSnippets: new Map(),\n costReport: null,\n readiness: null,\n semanticAnalysis: null,\n attackSurface: null,\n skillBanners: [],\n rawLog: [],\n rawLogPage: 0,\n scrollPositions: {\n overview: 0,\n issues: 0,\n agents: 0,\n files: 0,\n details: 0,\n costs: 0,\n readiness: 0,\n analysis: 0,\n rawlog: 0,\n skills: 0,\n guardian: 0,\n goals: 0,\n hypotheses: 0,\n memory: 0\n },\n notification: null,\n notificationHistory: [],\n guardianInsights: [],\n guardianInitialized: false,\n agencyStatus: null,\n selectedGuardianInsight: 0,\n expandedGuardianInsight: null,\n guardianConfig: {\n moneybags: {\n userCount: 250,\n payingUsers: 0, // 0 = not set, will use userCount\n revenuePerUser: 0, // 0 = not set, no revenue context\n developerRate: 150\n },\n agentSmith: {\n aiEnhancement: true,\n minSeverity: 'low',\n enabledCategories: {\n security: true,\n codeSmells: true,\n asyncBugs: true,\n reactPatterns: true,\n uxPatterns: true,\n backendPatterns: true\n },\n memoryRetentionDays: 30\n },\n performance: {\n parallel: true,\n cache: true,\n maxConcurrency: 4,\n timeoutMs: 120000,\n workers: true,\n streaming: true\n },\n riskThresholds: {\n critical: 70,\n high: 40,\n medium: 20,\n },\n escalation: {\n enabled: false,\n targets: [],\n cooldownMinutes: 15,\n maxEscalationsPerHour: 5,\n respectQuietHours: true,\n criticalBypassQuietHours: true,\n },\n },\n \n // Skills browser state\n skillsBrowser: {\n installedSkills: [],\n globalSkills: [],\n suggestedSkills: [],\n detectedStack: {},\n categories: [],\n selectedCategory: null,\n categorySkills: [],\n selectedIndex: 0,\n activePanel: 'installed',\n installing: false,\n installStatus: '',\n lastRefresh: 0,\n inputMode: 'browse',\n droppedFilePath: ''\n },\n \n // Goals panel state\n goalsPanel: {\n goals: [],\n selectedIndex: 0,\n selectedAchievedIndex: 0,\n inputMode: 'browse',\n inputBuffer: '',\n lastRefresh: 0\n },\n \n // Hypotheses panel state\n hypothesesPanel: {\n hypotheses: [],\n selectedIndex: 0,\n selectedCompletedIndex: 0,\n inputMode: 'browse',\n inputBuffer: '',\n lastRefresh: 0\n },\n \n // Memory tree state\n memoryTree: {\n loaded: false,\n issues: [],\n stats: null,\n globalPatterns: [],\n expandedNodes: new Set(['severity', 'files']), // Default expanded\n selectedNode: 'severity',\n scrollPosition: 0,\n lastRefresh: 0\n }\n };\n }\n\n /**\n * Start the interactive dashboard\n */\n async start(): Promise<void> {\n this.isActive = true;\n this.state.startTime = Date.now();\n this.addActivity('Guardian started');\n \n // Load persisted goals and hypotheses on startup\n await this.refreshGoalsData();\n await this.refreshHypothesesData();\n\n // Clear any pending input to prevent character leaking\n if (process.stdin.isTTY) {\n process.stdin.pause();\n process.stdin.resume();\n }\n\n await this.loadGuardianConfig();\n \n // Switch to alternate screen buffer - this is the proper TUI approach\n // The alternate screen is separate from the main terminal scrollback\n // When we exit, the terminal returns to its previous state\n process.stdout.write(\n '\\x1b[?1049h' + // Enter alternate screen buffer\n '\\x1b[?25l' + // Hide cursor\n '\\x1b[2J' + // Clear the alternate screen\n '\\x1b[H' + // Move cursor to home\n '\\x1b[3J' // Clear scrollback (prevents top gap in some terminals)\n );\n \n this.setupKeyboardHandlers();\n this.setupResizeHandler();\n this.startUpdateLoop();\n \n // Register with OutputManager for rich content routing\n this.registerOutputManagerCallbacks();\n \n this.render();\n }\n\n private async loadGuardianConfig(): Promise<void> {\n if (!existsSync(this.guardianConfigPath)) {\n return;\n }\n try {\n const raw = await readFile(this.guardianConfigPath, 'utf-8');\n const parsed = JSON.parse(raw) as Partial<DashboardState['guardianConfig']>;\n this.applyGuardianConfig(parsed);\n } catch {\n // Ignore malformed config and keep defaults\n }\n }\n\n private applyGuardianConfig(config?: Partial<DashboardState['guardianConfig']>): void {\n if (!config) return;\n if (config.moneybags) {\n const moneybags = config.moneybags;\n if (typeof moneybags.userCount === 'number') this.state.guardianConfig.moneybags.userCount = moneybags.userCount;\n if (typeof moneybags.payingUsers === 'number') this.state.guardianConfig.moneybags.payingUsers = moneybags.payingUsers;\n if (typeof moneybags.revenuePerUser === 'number') this.state.guardianConfig.moneybags.revenuePerUser = moneybags.revenuePerUser;\n if (typeof moneybags.developerRate === 'number') this.state.guardianConfig.moneybags.developerRate = moneybags.developerRate;\n // Handle industry: if property exists, update it (null from JSON means cleared/undefined)\n if ('industry' in moneybags) {\n if (moneybags.industry === null) {\n delete this.state.guardianConfig.moneybags.industry;\n } else if (moneybags.industry) {\n this.state.guardianConfig.moneybags.industry = moneybags.industry;\n }\n }\n }\n if (config.agentSmith) {\n const agentSmith = config.agentSmith;\n if (typeof agentSmith.aiEnhancement === 'boolean') this.state.guardianConfig.agentSmith.aiEnhancement = agentSmith.aiEnhancement;\n if (typeof agentSmith.minSeverity === 'string') this.state.guardianConfig.agentSmith.minSeverity = agentSmith.minSeverity as DashboardState['guardianConfig']['agentSmith']['minSeverity'];\n if (typeof agentSmith.enabledCategories === 'object' && agentSmith.enabledCategories) {\n this.state.guardianConfig.agentSmith.enabledCategories = {\n ...this.state.guardianConfig.agentSmith.enabledCategories,\n ...agentSmith.enabledCategories\n };\n }\n if (typeof agentSmith.memoryRetentionDays === 'number') this.state.guardianConfig.agentSmith.memoryRetentionDays = agentSmith.memoryRetentionDays;\n }\n if (config.performance) {\n const perf = config.performance;\n if (typeof perf.parallel === 'boolean') this.state.guardianConfig.performance.parallel = perf.parallel;\n if (typeof perf.cache === 'boolean') this.state.guardianConfig.performance.cache = perf.cache;\n if (typeof perf.maxConcurrency === 'number') this.state.guardianConfig.performance.maxConcurrency = perf.maxConcurrency;\n if (typeof perf.timeoutMs === 'number') this.state.guardianConfig.performance.timeoutMs = perf.timeoutMs;\n if (typeof perf.workers === 'boolean') this.state.guardianConfig.performance.workers = perf.workers;\n if (typeof perf.streaming === 'boolean') this.state.guardianConfig.performance.streaming = perf.streaming;\n }\n if (config.riskThresholds) {\n const thresholds = config.riskThresholds;\n if (typeof thresholds.critical === 'number') this.state.guardianConfig.riskThresholds.critical = thresholds.critical;\n if (typeof thresholds.high === 'number') this.state.guardianConfig.riskThresholds.high = thresholds.high;\n if (typeof thresholds.medium === 'number') this.state.guardianConfig.riskThresholds.medium = thresholds.medium;\n }\n if (config.escalation) {\n const esc = config.escalation;\n if (typeof esc.enabled === 'boolean') this.state.guardianConfig.escalation.enabled = esc.enabled;\n if (Array.isArray(esc.targets)) this.state.guardianConfig.escalation.targets = esc.targets;\n if (typeof esc.cooldownMinutes === 'number') this.state.guardianConfig.escalation.cooldownMinutes = esc.cooldownMinutes;\n if (typeof esc.maxEscalationsPerHour === 'number') this.state.guardianConfig.escalation.maxEscalationsPerHour = esc.maxEscalationsPerHour;\n if (typeof esc.respectQuietHours === 'boolean') this.state.guardianConfig.escalation.respectQuietHours = esc.respectQuietHours;\n if (typeof esc.criticalBypassQuietHours === 'boolean') this.state.guardianConfig.escalation.criticalBypassQuietHours = esc.criticalBypassQuietHours;\n }\n }\n\n private async persistGuardianConfig(): Promise<void> {\n try {\n await mkdir(getTrieDirectory(getWorkingDirectory(undefined, true)), { recursive: true });\n // Create a copy of the config for serialization\n // If industry was deleted (doesn't exist), we need to explicitly set it to null\n const configToSave = JSON.parse(JSON.stringify(this.state.guardianConfig));\n // Ensure industry is explicitly null if it was deleted, so it persists correctly\n if (!('industry' in this.state.guardianConfig.moneybags)) {\n configToSave.moneybags.industry = null;\n }\n await writeFile(this.guardianConfigPath, JSON.stringify(configToSave, null, 2), 'utf-8');\n } catch {\n // Ignore persistence failures in TUI\n }\n }\n \n /**\n * Register callbacks with OutputManager for rich content\n */\n private registerOutputManagerCallbacks(): void {\n const outputManager = getOutputManager();\n outputManager.setMode('tui');\n outputManager.registerTUICallbacks({\n onBanner: (banner: BannerContent) => {\n this.state.skillBanners.unshift(banner);\n if (this.state.skillBanners.length > 5) {\n this.state.skillBanners.pop();\n }\n this.addActivity(`[BANNER] ${banner.skill}${banner.quote ? ': ' + banner.quote.slice(0, 40) + '...' : ''}`);\n this.render();\n },\n onSnippet: (snippet: SnippetContent) => {\n // Store snippet for the current selected issue\n this.state.codeSnippets.set(this.state.selectedIssue, snippet);\n this.render();\n },\n onCost: (cost: CostContent) => {\n this.state.costReport = cost;\n this.addActivity(`[COST] Fix: $${cost.fixNowCost} | Prod: $${cost.productionCost}`);\n this.render();\n },\n onReadiness: (readiness: ReadinessContent) => {\n this.state.readiness = readiness;\n this.addActivity(`[READY] Score: ${readiness.score}/100 - ${readiness.status.toUpperCase()}`);\n this.render();\n },\n onSemantic: (semantic: SemanticContent) => {\n this.state.semanticAnalysis = semantic;\n this.addActivity(`[SEMANTIC] DataFlow: ${semantic.dataFlowIssues} | Race: ${semantic.raceConditions} | Auth: ${semantic.authIssues}`);\n this.render();\n },\n onAttack: (attack: AttackSurfaceContent) => {\n this.state.attackSurface = attack;\n this.addActivity(`[ATTACK] ${attack.totalEndpoints} endpoints (${attack.unprotected} unprotected)`);\n this.render();\n },\n onActivity: (message: string) => {\n this.addActivity(message);\n this.render();\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 this.state.rawLog.unshift({ time, level, message });\n if (this.state.rawLog.length > 500) {\n this.state.rawLog.pop();\n }\n // Only render if we're in rawlog view to avoid spam\n if (this.state.view === 'rawlog') {\n this.render();\n }\n },\n onNudge: (nudge: NudgeContent) => {\n // Show proactive notification overlay\n this.showNotification(\n nudge.message,\n nudge.severity,\n nudge.file,\n nudge.autoHideMs\n );\n }\n });\n }\n\n /**\n * Stop the dashboard\n */\n stop(): void {\n this.isActive = false;\n if (this.updateInterval) {\n clearInterval(this.updateInterval);\n this.updateInterval = undefined;\n }\n if (this.resizeDebounce) {\n clearTimeout(this.resizeDebounce);\n this.resizeDebounce = undefined;\n }\n if (this.resizeHandler && process.stdout.isTTY) {\n process.stdout.off('resize', this.resizeHandler);\n this.resizeHandler = undefined;\n }\n this.rl.close();\n \n // Unregister from OutputManager\n const outputManager = getOutputManager();\n outputManager.clearTUICallbacks();\n outputManager.setMode('console');\n \n // Clear render buffer to prevent partial renders\n this.buffer = [];\n this.lastFrame = '';\n \n // Clear the screen before exiting alternate buffer\n process.stdout.write('\\x1b[2J\\x1b[H');\n \n // Exit alternate screen buffer and show cursor\n // This restores the terminal to its state before we started\n process.stdout.write(\n '\\x1b[?25h' + // Show cursor\n '\\x1b[?1049l' // Exit alternate screen buffer (restores previous screen)\n );\n }\n\n /**\n * Add activity log entry\n */\n private addActivity(message: string): void {\n const time = new Date().toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' });\n this.state.activityLog.unshift({ time, message });\n // Keep only last 50 entries for scrollable history\n if (this.state.activityLog.length > 50) {\n this.state.activityLog.pop();\n }\n }\n\n /**\n * Show a proactive notification/nudge from the Guardian Agent\n * This adds to the notification strip (non-blocking, inline)\n */\n showNotification(message: string, severity: 'critical' | 'warning' | 'info', file?: string, autoHideMs?: number): void {\n const now = Date.now();\n \n // Build history entry (only include file if defined for exactOptionalPropertyTypes)\n const historyEntry: {\n message: string;\n severity: 'critical' | 'warning' | 'info';\n file?: string;\n timestamp: number;\n dismissed: boolean;\n } = {\n message,\n severity,\n timestamp: now,\n dismissed: false\n };\n if (file !== undefined) {\n historyEntry.file = file;\n }\n \n // Store in history (newest first)\n this.state.notificationHistory.unshift(historyEntry);\n \n // Keep history reasonable\n if (this.state.notificationHistory.length > 50) {\n this.state.notificationHistory.pop();\n }\n \n // Build active notification for the strip\n const notification: {\n active: boolean;\n message: string;\n severity: 'critical' | 'warning' | 'info';\n file?: string;\n timestamp: number;\n autoHideAt?: number;\n } = {\n active: true,\n message,\n severity,\n timestamp: now\n };\n if (file !== undefined) {\n notification.file = file;\n }\n if (autoHideMs !== undefined) {\n notification.autoHideAt = now + autoHideMs;\n }\n \n this.state.notification = notification;\n \n // Also add to activity log\n const prefix = severity === 'critical' ? '[!]' : severity === 'warning' ? '[!]' : '[>]';\n this.addActivity(`${prefix} ${message}`);\n \n // Force re-render to show notification immediately\n this.render();\n }\n\n /**\n * Dismiss the current notification\n */\n dismissNotification(): void {\n if (this.state.notification) {\n // Mark as dismissed in history\n const historyItem = this.state.notificationHistory.find(\n h => h.timestamp === this.state.notification?.timestamp\n );\n if (historyItem) {\n historyItem.dismissed = true;\n }\n \n this.state.notification = null;\n this.render();\n }\n }\n\n /**\n * Format timestamp as relative time (e.g., \"2m ago\", \"just now\")\n */\n private 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 \n /**\n * Process issues through the Guardian Agent to generate insights\n */\n private async processGuardianInsights(issues: Issue[]): Promise<void> {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const guardian = getGuardian(workDir);\n \n // Initialize Guardian if needed\n if (!this.state.guardianInitialized) {\n await guardian.initialize();\n this.state.guardianInitialized = true;\n \n // Load persisted insights from previous sessions\n const persistedInsights = guardian.getActiveInsights();\n if (persistedInsights.length > 0) {\n // Add persisted insights that aren't already in our list\n for (const insight of persistedInsights) {\n const isDuplicate = this.state.guardianInsights.some(\n existing => existing.id === insight.id\n );\n if (!isDuplicate) {\n this.state.guardianInsights.push(insight);\n }\n }\n // Sort by priority (highest first) then by timestamp (newest first)\n this.state.guardianInsights.sort((a, b) => {\n if (a.priority !== b.priority) return b.priority - a.priority;\n return b.timestamp - a.timestamp;\n });\n this.addActivity(`Guardian: Loaded ${persistedInsights.length} persisted insight${persistedInsights.length > 1 ? 's' : ''}`);\n }\n }\n \n // Get recent file changes for context\n const filesChanged = this.state.watch.recentChanges.map(c => c.file);\n \n // Let the Guardian analyze and generate insights\n const newInsights = await guardian.processIssues(issues, {\n filesChanged,\n isWatchMode: this.state.watch.watching\n });\n \n // Merge new insights with existing (avoid duplicates by message similarity)\n for (const insight of newInsights) {\n const isDuplicate = this.state.guardianInsights.some(\n existing => existing.message === insight.message && !existing.dismissed\n );\n if (!isDuplicate) {\n this.state.guardianInsights.unshift(insight);\n }\n }\n \n // Keep insights list manageable\n this.state.guardianInsights = this.state.guardianInsights.slice(0, 50);\n \n // Fetch agency status (goals, hypotheses, risk, effectiveness)\n try {\n this.state.agencyStatus = await guardian.getAgencyStatus();\n } catch {\n // Agency status is optional\n }\n \n // Log Guardian activity\n if (newInsights.length > 0) {\n this.addActivity(`Guardian: ${newInsights.length} new insight${newInsights.length > 1 ? 's' : ''}`);\n }\n } catch (error) {\n // Guardian errors shouldn't break the dashboard\n this.addActivity(`Guardian error: ${error instanceof Error ? error.message : 'unknown'}`);\n }\n }\n \n /**\n * Dismiss the currently selected insight in Guardian view\n */\n private dismissSelectedInsight(): void {\n // Get insights as displayed (dismissed filtered out)\n const visibleInsights = this.getVisibleGuardianInsights();\n const selectedIdx = this.state.selectedGuardianInsight;\n const insight = visibleInsights[selectedIdx];\n \n if (!insight) {\n this.addActivity('[ERROR] No insight selected to dismiss');\n return;\n }\n \n if (insight.dismissed) {\n this.addActivity('[WARNING] Insight already dismissed');\n return;\n }\n \n insight.dismissed = true;\n this.persistInsightDismissal(insight.id);\n this.addActivity(`Dismissed: ${insight.message.slice(0, 40)}...`);\n \n // Collapse if expanded\n if (this.state.expandedGuardianInsight === selectedIdx) {\n this.state.expandedGuardianInsight = null;\n }\n \n // Adjust selection index since dismissed insight will be removed from display\n const remainingInsights = this.getVisibleGuardianInsights();\n if (remainingInsights.length === 0) {\n this.state.selectedGuardianInsight = 0;\n this.state.scrollPositions.guardian = 0;\n } else {\n if (this.state.selectedGuardianInsight >= remainingInsights.length) {\n this.state.selectedGuardianInsight = Math.max(0, remainingInsights.length - 1);\n }\n // Reset scroll position if needed\n if (this.state.scrollPositions.guardian >= remainingInsights.length) {\n this.state.scrollPositions.guardian = Math.max(0, remainingInsights.length - 1);\n }\n }\n \n this.render();\n }\n\n /**\n * Ignore (persistently dismiss) the currently selected insight in Guardian view\n * Behaves like dismiss, but with explicit \"Ignored\" activity log entry.\n */\n private ignoreSelectedInsight(): void {\n const visibleInsights = this.getVisibleGuardianInsights();\n const selectedIdx = this.state.selectedGuardianInsight;\n const insight = visibleInsights[selectedIdx];\n \n if (!insight) {\n this.addActivity('[ERROR] No insight selected to ignore');\n return;\n }\n \n if (insight.dismissed) {\n this.addActivity('[WARNING] Insight already dismissed/ignored');\n return;\n }\n \n insight.dismissed = true;\n this.persistInsightDismissal(insight.id);\n this.addActivity(`Ignored: ${insight.message.slice(0, 40)}...`);\n \n // Collapse if expanded\n if (this.state.expandedGuardianInsight === selectedIdx) {\n this.state.expandedGuardianInsight = null;\n }\n \n // Adjust selection/scroll after removal\n const remainingInsights = this.getVisibleGuardianInsights();\n if (remainingInsights.length === 0) {\n this.state.selectedGuardianInsight = 0;\n this.state.scrollPositions.guardian = 0;\n } else {\n if (this.state.selectedGuardianInsight >= remainingInsights.length) {\n this.state.selectedGuardianInsight = Math.max(0, remainingInsights.length - 1);\n }\n if (this.state.scrollPositions.guardian >= remainingInsights.length) {\n this.state.scrollPositions.guardian = Math.max(0, remainingInsights.length - 1);\n }\n }\n \n this.render();\n }\n \n /**\n * Clear all dismissed insights from the list\n */\n private clearDismissedInsights(): void {\n const dismissedCount = this.state.guardianInsights.filter(i => i.dismissed).length;\n \n if (dismissedCount === 0) {\n this.addActivity('No dismissed insights to clear');\n return;\n }\n \n // Remove dismissed insights from the state\n this.state.guardianInsights = this.state.guardianInsights.filter(i => !i.dismissed);\n \n // Also clear old notification history\n this.state.notificationHistory = [];\n \n // Reset selection if needed\n if (this.state.selectedGuardianInsight >= this.state.guardianInsights.length) {\n this.state.selectedGuardianInsight = Math.max(0, this.state.guardianInsights.length - 1);\n }\n this.state.expandedGuardianInsight = null;\n this.state.scrollPositions.guardian = 0;\n \n this.addActivity(`Cleared ${dismissedCount} dismissed insight${dismissedCount !== 1 ? 's' : ''}`);\n this.render();\n }\n \n /**\n * Persist an insight dismissal to the InsightStore\n */\n private async persistInsightDismissal(insightId: string): Promise<void> {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const guardian = getGuardian(workDir);\n await guardian.dismissInsight(insightId);\n } catch {\n // Don't break the UI on persistence errors\n }\n }\n\n /**\n * Process streaming updates\n */\n handleStreamUpdate(update: StreamUpdate): void {\n this.state.lastUpdate = Date.now();\n\n switch (update.type) {\n case 'progress':\n // Log file scanning milestones\n const oldProgress = this.state.progress;\n \n // Detect new scan starting (totalFiles goes from 0 to positive, or processedFiles resets to 0)\n if ((oldProgress.totalFiles === 0 && update.data.totalFiles > 0) ||\n (oldProgress.processedFiles > 0 && update.data.processedFiles === 0)) {\n this.state.scanStartTime = Date.now();\n this.state.scanComplete = false;\n delete this.state.scanEndTime;\n }\n \n this.state.progress = update.data;\n if (update.data.issuesBySeverity?.critical > 0) {\n this.state.alerts = { hasCritical: true, lastCriticalAt: update.timestamp };\n }\n \n // Log when we start scanning a new file (every 10th file to avoid spam)\n if (update.data.currentFile && update.data.processedFiles % 10 === 0 && update.data.processedFiles !== oldProgress.processedFiles) {\n this.addActivity(`Scanned ${update.data.processedFiles}/${update.data.totalFiles} files`);\n }\n break;\n\n case 'agent_start':\n this.addActivity(`[*] Scout started: ${update.data.agent}`);\n this.state.agents[update.data.agent] = {\n ...(this.state.agents[update.data.agent] || { issues: 0, status: 'queued' }),\n status: 'running',\n start: update.timestamp\n };\n break;\n\n case 'agent_complete':\n this.addActivity(`[+] Scout complete: ${update.data.agent} (${update.data.issueCount} issues)`);\n {\n const prev = this.state.agents[update.data.agent];\n const start = prev?.start;\n const issues = update.data.issueCount ?? prev?.issues ?? 0;\n const durationMs = start !== undefined ? update.timestamp - start : undefined;\n this.state.agents[update.data.agent] = {\n ...(prev ?? { issues: 0, status: 'queued' }),\n status: 'done',\n end: update.timestamp,\n ...(start !== undefined ? { start } : {}),\n ...(durationMs !== undefined ? { durationMs } : {}),\n issues\n };\n }\n break;\n\n case 'issue_found':\n this.state.issues.push(update.data);\n // Log critical and serious issues immediately\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 this.addActivity(`${icon} ${update.data.severity.toUpperCase()}: ${update.data.message?.slice(0, 40) || fileName}`);\n if (update.data.severity === 'critical') {\n this.state.alerts = { hasCritical: true, lastCriticalAt: update.timestamp };\n }\n }\n if (update.data.agent) {\n const agentMeta = this.state.agents[update.data.agent];\n if (agentMeta) {\n agentMeta.issues += 1;\n }\n }\n break;\n\n case 'scan_complete':\n this.state.scanComplete = true;\n this.state.scanEndTime = update.timestamp;\n this.state.progress = {\n ...this.state.progress,\n processedFiles: this.state.progress.totalFiles\n };\n // Store all issues from the scan\n if (update.data.issues && Array.isArray(update.data.issues)) {\n this.state.issues = update.data.issues;\n }\n const elapsed = ((Date.now() - this.state.scanStartTime) / 1000).toFixed(1);\n this.addActivity(`=== Scan complete - ${this.state.progress.totalIssues} issues in ${elapsed}s ===`);\n \n // Let the Guardian Agent analyze the issues and generate insights\n this.processGuardianInsights(this.state.issues);\n break;\n \n case 'watch_status':\n this.state.watch = {\n watching: update.data.watching ?? this.state.watch.watching,\n directories: update.data.directories ?? this.state.watch.directories,\n debounceMs: update.data.debounceMs ?? this.state.watch.debounceMs,\n lastChange: update.data.lastChange ?? this.state.watch.lastChange,\n recentChanges: update.data.recentChanges ?? this.state.watch.recentChanges\n };\n // Log watch status changes\n if (update.data.watching !== undefined) {\n this.addActivity(update.data.watching \n ? `[*] Watch mode: ACTIVE (${update.data.directories ?? 0} dirs)` \n : '[*] Watch mode: OFF');\n }\n break;\n\n case 'watch_change':\n const entry = { file: update.data.file, time: new Date(update.timestamp).toLocaleTimeString('en-US', { hour12: false }) };\n this.state.watch.recentChanges.unshift(entry);\n this.state.watch.recentChanges = this.state.watch.recentChanges.slice(0, 5);\n this.state.watch.lastChange = entry.time;\n this.addActivity(`Change detected: ${update.data.file}`);\n break;\n\n case 'signal_extracted':\n // Update signal extraction stats\n if (update.data.decisions) {\n this.state.signalExtraction.decisionsExtracted += update.data.decisions;\n }\n if (update.data.facts) {\n this.state.signalExtraction.factsExtracted += update.data.facts;\n }\n if (update.data.blockers) {\n this.state.signalExtraction.blockersExtracted += update.data.blockers;\n }\n if (update.data.questions) {\n this.state.signalExtraction.questionsExtracted += update.data.questions;\n }\n const total = (update.data.decisions || 0) + (update.data.facts || 0) + \n (update.data.blockers || 0) + (update.data.questions || 0);\n if (total > 0) {\n this.addActivity(`🧠 Extracted ${total} signals (${update.data.decisions}d, ${update.data.facts}f, ${update.data.blockers}b)`);\n }\n break;\n\n case 'memory':\n if (update.data.action === 'saving') {\n this.addActivity(`[~] Saving to memory...`);\n } else if (update.data.action === 'saved') {\n this.addActivity(`[+] Memory updated: ${update.data.details || 'context saved'}`);\n } else if (update.data.action === 'learning') {\n this.addActivity(`[~] Learning: ${update.data.details || 'analyzing patterns'}`);\n }\n break;\n \n // === Rich Content Events ===\n \n case 'snippet':\n // Store snippet keyed by file (not ideal but works for now)\n this.state.codeSnippets.set(this.state.selectedIssue, update.data as SnippetContent);\n break;\n \n case 'cost_report':\n this.state.costReport = update.data as CostContent;\n this.addActivity(`[COST] Fix now: $${update.data.fixNowCost} | Production: $${update.data.productionCost}`);\n break;\n \n case 'readiness_report':\n this.state.readiness = update.data as ReadinessContent;\n this.addActivity(`[READINESS] ${update.data.score}/100 - ${update.data.status}`);\n break;\n \n case 'semantic_report':\n this.state.semanticAnalysis = update.data as SemanticContent;\n {\n const sem = update.data as SemanticContent;\n const total = sem.dataFlowIssues + sem.raceConditions + sem.authIssues;\n if (total > 0) {\n this.addActivity(`[SEMANTIC] ${total} issues (${sem.dataFlowIssues} dataflow, ${sem.raceConditions} race, ${sem.authIssues} auth)`);\n }\n }\n break;\n \n case 'attack_surface':\n this.state.attackSurface = update.data as AttackSurfaceContent;\n {\n const atk = update.data as AttackSurfaceContent;\n this.addActivity(`[ATTACK] ${atk.totalEndpoints} endpoints, ${atk.unprotected} unprotected, risk ${atk.riskScore}/100`);\n }\n break;\n \n case 'skill_banner':\n const banner = update.data as BannerContent;\n this.state.skillBanners.unshift(banner);\n if (this.state.skillBanners.length > 5) {\n this.state.skillBanners.pop();\n }\n this.addActivity(`[SKILL] ${banner.skill}${banner.quote ? ': \"' + banner.quote.slice(0, 30) + '...\"' : ''}`);\n break;\n \n case 'raw_log':\n this.state.rawLog.unshift({\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 });\n if (this.state.rawLog.length > 500) {\n this.state.rawLog.pop();\n }\n break;\n }\n\n if (this.isActive) {\n this.render();\n }\n }\n\n /**\n * Set up keyboard event handlers\n */\n private setupKeyboardHandlers(): void {\n readline.emitKeypressEvents(input);\n if (input.isTTY) {\n input.setRawMode(true);\n }\n\n input.on('keypress', async (_chunk, key) => {\n if (!key || !this.isActive) return;\n\n // Handle goals view input\n if (this.state.view === 'goals') {\n if (this.state.goalsPanel.inputMode === 'add') {\n if (key.name === 'escape') {\n this.state.goalsPanel.inputMode = 'browse';\n this.state.goalsPanel.inputBuffer = '';\n } else if (key.name === 'return' || key.name === 'enter') {\n await this.addGoalFromUI(this.state.goalsPanel.inputBuffer);\n this.state.goalsPanel.inputMode = 'browse';\n this.state.goalsPanel.inputBuffer = '';\n } else if (key.name === 'backspace') {\n this.state.goalsPanel.inputBuffer = this.state.goalsPanel.inputBuffer.slice(0, -1);\n } else if (key.sequence && key.sequence.length === 1 && !key.ctrl && !key.meta) {\n this.state.goalsPanel.inputBuffer += key.sequence;\n }\n this.render();\n return;\n }\n \n // Browse mode keys\n if (key.name === 'a') {\n this.state.goalsPanel.inputMode = 'add';\n this.state.goalsPanel.inputBuffer = '';\n this.render();\n return;\n }\n if (key.name === 'return' || key.name === 'enter') {\n const activeGoals = this.state.goalsPanel.goals.filter(g => g.status === 'active');\n const selected = activeGoals[this.state.goalsPanel.selectedIndex];\n if (selected) {\n await this.completeGoalFromUI(selected.id);\n }\n return;\n }\n if (key.name === 'd') {\n const activeGoals = this.state.goalsPanel.goals.filter(g => g.status === 'active');\n const selected = activeGoals[this.state.goalsPanel.selectedIndex];\n if (selected) {\n await this.deleteGoalFromUI(selected.id);\n }\n return;\n }\n if (key.name === 'x') {\n // Delete achieved/failed goals\n const completedGoals = this.state.goalsPanel.goals.filter(g => g.status === 'achieved' || g.status === 'failed');\n const selected = completedGoals[this.state.goalsPanel.selectedAchievedIndex || 0];\n if (selected) {\n await this.deleteGoalFromUI(selected.id);\n }\n return;\n }\n if (key.name === 'u') {\n // Undo - reactivate last completed goal\n const recentlyCompleted = this.state.goalsPanel.goals\n .filter(g => g.status === 'achieved')\n .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());\n if (recentlyCompleted.length > 0) {\n const goal = recentlyCompleted[0]!;\n await this.reactivateGoalFromUI(goal.id);\n }\n return;\n }\n if (key.name === 'up' || key.name === 'k') {\n this.state.goalsPanel.selectedIndex = Math.max(0, this.state.goalsPanel.selectedIndex - 1);\n this.render();\n return;\n }\n if (key.name === 'down' || key.name === 'j') {\n const activeGoals = this.state.goalsPanel.goals.filter(g => g.status === 'active');\n this.state.goalsPanel.selectedIndex = Math.min(activeGoals.length - 1, this.state.goalsPanel.selectedIndex + 1);\n this.render();\n return;\n }\n }\n\n // Handle hypotheses view input\n if (this.state.view === 'hypotheses') {\n if (this.state.hypothesesPanel.inputMode === 'add') {\n if (key.name === 'escape') {\n this.state.hypothesesPanel.inputMode = 'browse';\n this.state.hypothesesPanel.inputBuffer = '';\n } else if (key.name === 'return' || key.name === 'enter') {\n await this.addHypothesisFromUI(this.state.hypothesesPanel.inputBuffer);\n this.state.hypothesesPanel.inputMode = 'browse';\n this.state.hypothesesPanel.inputBuffer = '';\n } else if (key.name === 'backspace') {\n this.state.hypothesesPanel.inputBuffer = this.state.hypothesesPanel.inputBuffer.slice(0, -1);\n } else if (key.sequence && key.sequence.length === 1 && !key.ctrl && !key.meta) {\n this.state.hypothesesPanel.inputBuffer += key.sequence;\n }\n this.render();\n return;\n }\n \n // Browse mode keys\n if (key.name === 'a') {\n this.state.hypothesesPanel.inputMode = 'add';\n this.state.hypothesesPanel.inputBuffer = '';\n this.render();\n return;\n }\n if (key.name === 'v') {\n const testing = this.state.hypothesesPanel.hypotheses.filter(h => h.status === 'testing');\n const selected = testing[this.state.hypothesesPanel.selectedIndex];\n if (selected) {\n await this.updateHypothesisFromUI(selected.id, 'validate');\n }\n return;\n }\n if (key.name === 'x') {\n const testing = this.state.hypothesesPanel.hypotheses.filter(h => h.status === 'testing');\n const selected = testing[this.state.hypothesesPanel.selectedIndex];\n if (selected) {\n await this.updateHypothesisFromUI(selected.id, 'invalidate');\n }\n return;\n }\n if (key.name === 'd') {\n const testing = this.state.hypothesesPanel.hypotheses.filter(h => h.status === 'testing');\n const selected = testing[this.state.hypothesesPanel.selectedIndex];\n if (selected) {\n await this.updateHypothesisFromUI(selected.id, 'delete');\n }\n return;\n }\n if (key.name === 'r') {\n // Remove validated/invalidated hypotheses\n const completed = this.state.hypothesesPanel.hypotheses.filter(h => h.status === 'validated' || h.status === 'invalidated');\n const selected = completed[this.state.hypothesesPanel.selectedCompletedIndex || 0];\n if (selected) {\n await this.updateHypothesisFromUI(selected.id, 'delete');\n }\n return;\n }\n if (key.name === 'u') {\n // Undo - reactivate last validated/invalidated hypothesis\n const recentlyCompleted = this.state.hypothesesPanel.hypotheses\n .filter(h => h.status === 'validated' || h.status === 'invalidated')\n .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());\n if (recentlyCompleted.length > 0) {\n const hypothesis = recentlyCompleted[0]!;\n await this.reactivateHypothesisFromUI(hypothesis.id);\n }\n return;\n }\n if (key.name === 'up' || key.name === 'k') {\n this.state.hypothesesPanel.selectedIndex = Math.max(0, this.state.hypothesesPanel.selectedIndex - 1);\n this.render();\n return;\n }\n if (key.name === 'down' || key.name === 'j') {\n const testing = this.state.hypothesesPanel.hypotheses.filter(h => h.status === 'testing');\n this.state.hypothesesPanel.selectedIndex = Math.min(testing.length - 1, this.state.hypothesesPanel.selectedIndex + 1);\n this.render();\n return;\n }\n }\n\n switch (key.name) {\n case 'q':\n case 'escape':\n this.stop();\n process.exit(0);\n break;\n\n case 'tab':\n this.switchView();\n break;\n\n case 'up':\n case 'k':\n this.navigateUp();\n break;\n\n case 'down':\n case 'j':\n this.navigateDown();\n break;\n\n case 'enter':\n case 'return':\n this.selectCurrent().catch(() => {\n // Silently handle errors\n });\n break;\n\n case '1':\n this.setFilter('severity', 'critical');\n break;\n\n case '2':\n this.setFilter('severity', 'serious');\n break;\n\n case '3':\n this.setFilter('severity', 'moderate');\n break;\n\n case '4':\n this.setFilter('severity', 'low');\n break;\n\n case '0':\n this.setFilter('severity', 'all');\n break;\n\n case 'x':\n if (this.state.view === 'guardian') {\n // Clear all dismissed insights from the list\n this.clearDismissedInsights();\n } else {\n this.clearFilters();\n }\n break;\n\n case 'f':\n this.promptFilter();\n break;\n\n case 'n':\n this.nextPage();\n break;\n\n case 'p':\n this.prevPage();\n break;\n\n case 's':\n this.promptAgentFilter();\n break;\n\n case 'b':\n this.goBack();\n break;\n\n case 'h':\n this.showHelp();\n break;\n \n case 'i':\n if (this.state.view === 'guardian') {\n // Ignore (persistently dismiss) the selected insight\n this.ignoreSelectedInsight();\n } else {\n // Configure Guardian Agent settings\n this.showGuardianConfig();\n }\n break;\n \n case 'c':\n // Guardian config\n this.showGuardianConfig();\n break;\n \n // === NEW VIEW SHORTCUTS ===\n case 'd':\n // In Guardian view, dismiss the selected insight; otherwise go to details view\n if (this.state.view === 'guardian') {\n this.dismissSelectedInsight();\n } else if (this.state.scanComplete && this.state.issues.length > 0) {\n this.goToView('details');\n }\n break;\n \n case 'm':\n // Money/Costs view\n if (this.state.costReport) {\n this.goToView('costs');\n }\n break;\n \n case 'r':\n // Readiness view\n if (this.state.readiness) {\n this.goToView('readiness');\n }\n break;\n \n case 'a':\n // Analysis view (semantic + attack surface)\n if (this.state.semanticAnalysis || this.state.attackSurface) {\n this.goToView('analysis');\n }\n break;\n \n case 'l':\n // Raw log view\n this.goToView('rawlog');\n break;\n \n case 'g':\n // Guardian notifications view - all alerts and nudges\n this.goToView('guardian');\n break;\n \n case 'o':\n // Goals management view\n this.goToView('goals');\n this.refreshGoalsData();\n break;\n \n case 'y':\n // Hypotheses management view\n this.goToView('hypotheses');\n this.refreshHypothesesData();\n break;\n \n case 't':\n // Memory tree view\n this.goToView('memory');\n this.loadMemoryTreeData();\n break;\n }\n\n if (this.isActive) {\n this.render();\n }\n });\n }\n\n /**\n * Handle terminal resize events\n */\n private setupResizeHandler(): void {\n if (!process.stdout.isTTY) return;\n this.resizeHandler = () => {\n if (!this.isActive) return;\n if (this.resizeDebounce) {\n clearTimeout(this.resizeDebounce);\n }\n this.resizeDebounce = setTimeout(() => {\n if (!this.isActive) return;\n // Reset frame cache and clear screen so the new layout fits cleanly\n this.lastFrame = '';\n process.stdout.write('\\x1b[2J\\x1b[H\\x1b[3J');\n this.render();\n }, 80);\n };\n process.stdout.on('resize', this.resizeHandler);\n }\n\n /**\n * Start the update loop for real-time rendering\n */\n private startUpdateLoop(): void {\n this.updateInterval = setInterval(() => {\n const shouldAnimate = !this.state.scanComplete || this.state.watch.watching;\n if (this.isActive && (Date.now() - this.state.lastUpdate < 5000 || shouldAnimate)) {\n this.render();\n }\n }, 100); // 10 FPS\n }\n\n /**\n * Create a horizontal line (Unicode box-drawing)\n */\n private line(width: number = 78): string {\n return box.horizontal.repeat(width);\n }\n\n /**\n * Create progress bar with color\n */\n private progressBar(current: number, total: number, width: number = 50): 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 const filledBar = colors.border('█'.repeat(filled));\n const emptyBar = colors.dim('░'.repeat(empty));\n return '[' + filledBar + emptyBar + ']';\n }\n\n /**\n * Get severity icon with color\n */\n private severityIcon(severity: Issue['severity']): string {\n switch (severity) {\n case 'critical':\n return colors.critical('[!]');\n case 'serious':\n return colors.serious('[x]');\n case 'moderate':\n return colors.moderate('[~]');\n case 'low':\n return colors.low('[-]');\n default:\n return colors.dim('[-]');\n }\n }\n\n /**\n * Get agent status icon with color\n */\n private agentIcon(status: 'running' | 'done' | 'waiting'): string {\n switch (status) {\n case 'running':\n return colors.running('●');\n case 'done':\n return colors.success('✓');\n case 'waiting':\n return colors.waiting('○');\n default:\n return colors.dim('○');\n }\n }\n\n /**\n * Render a line with proper padding (accounts for ANSI color codes)\n */\n /**\n * Add a line to the render buffer (buffered output to prevent flicker)\n * Automatically appends \\x1b[K to clear to end of line (prevents remnants from wider terminals)\n */\n private bufferLine(line: string): void {\n this.buffer.push(line + '\\x1b[K');\n }\n\n private renderLine(content: string, width: number): void {\n const v = colors.border(box.vertical);\n const innerWidth = width - 2; // Account for borders\n const contentLen = visibleLength(content);\n \n // Truncate content if too long\n let displayContent = content;\n if (contentLen > innerWidth) {\n // Need to truncate - find where to cut\n displayContent = this.truncateToWidth(content, innerWidth - 3) + '...';\n }\n \n const displayLen = visibleLength(displayContent);\n const padding = Math.max(0, innerWidth - displayLen);\n this.bufferLine(v + displayContent + ' '.repeat(padding) + v);\n }\n\n /**\n * Render a section border that properly connects to vertical borders\n */\n private renderSectionBorder(width: number): void {\n const v = colors.border(box.vertical);\n const border = colors.border(box.leftT + this.line(width - 4) + box.rightT);\n this.bufferLine(v + border + v);\n }\n\n /**\n * Return Guardian insights that should be shown (dismissed filtered out),\n * sorted the same way as in the UI.\n */\n private getVisibleGuardianInsights(): GuardianInsight[] {\n return [...this.state.guardianInsights]\n .filter(i => !i.dismissed)\n .sort((a, b) => {\n if (a.priority !== b.priority) return b.priority - a.priority;\n return b.timestamp - a.timestamp;\n });\n }\n\n /**\n * Truncate a string (with ANSI codes) to a visible width\n * Handles wide characters (emojis, CJK) that take 2 columns\n */\n private truncateToWidth(str: string, maxWidth: number): string {\n let visibleLen = 0;\n let result = '';\n let inEscape = false;\n \n for (const char of str) {\n if (char === '\\x1b') {\n inEscape = true;\n result += char;\n } else if (inEscape) {\n result += char;\n if (char === 'm') {\n inEscape = false;\n }\n } else {\n const code = char.codePointAt(0) || 0;\n // Calculate width of this character\n const charWidth = (\n (code >= 0x1F300 && code <= 0x1F9FF) || // Emoji\n (code >= 0x2600 && code <= 0x26FF) || // Misc symbols\n (code >= 0x2700 && code <= 0x27BF) || // Dingbats\n (code >= 0xFE00 && code <= 0xFE0F) || // Variation selectors\n (code >= 0x1F000 && code <= 0x1FFFF) || // Extended emoji\n (code >= 0x3000 && code <= 0x9FFF) || // CJK\n (code >= 0xAC00 && code <= 0xD7AF) // Korean\n ) ? 2 : 1;\n \n if (visibleLen + charWidth > maxWidth) {\n break;\n }\n result += char;\n visibleLen += charWidth;\n }\n }\n \n // Reset any open ANSI codes\n return result + '\\x1b[0m';\n }\n\n /**\n * Get responsive width based on terminal size\n */\n private getWidth(): number {\n const cols = process.stdout.columns || 80;\n // Responsive: use more space on wider terminals, cap at 120 for readability\n return Math.max(60, Math.min(120, cols - 2));\n }\n\n /**\n * Main render function - uses double buffering to prevent flicker\n */\n private render(): void {\n // Clear the buffer\n this.buffer = [];\n \n // Advance animation frame\n this.animFrame = (this.animFrame + 1) % 100;\n\n // Get terminal size - responsive to terminal width\n const width = this.getWidth();\n const height = Math.max(24, process.stdout.rows || 40); // ensure a minimum but respect small terminals\n\n // Build frame into buffer\n // Header\n this.renderHeader(width);\n\n // Content based on current view and scan state\n if (!this.state.scanComplete) {\n this.renderScanningView(width, height);\n } else {\n switch (this.state.view) {\n case 'overview':\n this.renderOverview(width, height);\n break;\n case 'issues':\n this.renderIssuesList(width);\n break;\n case 'files':\n this.renderFilesView(width);\n break;\n // === NEW VIEWS ===\n case 'details':\n this.renderDetailsView(width, height);\n break;\n case 'costs':\n this.renderCostsView(width, height);\n break;\n case 'readiness':\n this.renderReadinessView(width, height);\n break;\n case 'analysis':\n this.renderAnalysisView(width, height);\n break;\n case 'rawlog':\n this.renderRawLogView(width, height);\n break;\n case 'guardian':\n this.renderGuardianView(width, height);\n break;\n case 'goals':\n this.renderGoalsView(width, height);\n break;\n case 'hypotheses':\n this.renderHypothesesView(width, height);\n break;\n case 'memory':\n this.renderMemoryTreeView(width, height);\n break;\n }\n }\n\n // Footer\n this.renderFooter(width);\n\n // Flush buffer to screen in one write (prevents flicker)\n let frame = this.buffer.join('\\n');\n \n // Check if notifications should auto-dismiss based on time\n const now = Date.now();\n for (const notif of this.state.notificationHistory) {\n // Auto-dismiss info/warning after some time if not already dismissed\n if (!notif.dismissed && notif.severity !== 'critical') {\n const age = now - notif.timestamp;\n // Auto-dismiss info after 30s, warnings after 60s\n const autoHideMs = notif.severity === 'info' ? 30000 : 60000;\n if (age > autoHideMs) {\n notif.dismissed = true;\n }\n }\n }\n \n // Only redraw if frame changed (further reduces flicker)\n if (frame !== this.lastFrame) {\n // Better in-place update approach:\n // 1. Hide cursor\n // 2. Move cursor to home (top-left)\n // 3. Write the frame content\n // 4. Clear from cursor to end of screen (in case new frame is shorter)\n // This avoids the flash from clearing the entire screen first\n process.stdout.write(\n '\\x1b[?25l' + // Hide cursor\n '\\x1b[H' + // Move cursor to home position (1,1)\n frame + // Write the frame content\n '\\x1b[J' // Clear from cursor to end of screen\n );\n \n this.lastFrame = frame;\n }\n }\n\n /**\n * Render header with title and status\n */\n private renderHeader(width: number): void {\n const time = colors.dim(new Date().toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' }));\n \n // Animated watch indicator\n const watchSpinner = WATCH_FRAMES[this.animFrame % WATCH_FRAMES.length];\n const watchLabel = this.state.watch.watching \n ? colors.success(`[${watchSpinner} WATCHING]`) \n : colors.dim('[WATCH OFF]');\n \n // Animated scan indicator\n const scanSpinner = SCAN_FRAMES[this.animFrame % SCAN_FRAMES.length];\n let statusText = '';\n if (this.state.scanComplete) {\n statusText = colors.success('ALL SYSTEMS GO') + ' ' + colors.success('[OK]');\n } else {\n statusText = colors.running(`${scanSpinner} SCANNING`) + ' ' + colors.dim('(...)');\n }\n \n let alertText = '';\n if (this.state.alerts.hasCritical) {\n alertText = ' ' + colors.alert('│ ALERT: CRITICAL');\n }\n \n const v = colors.border(box.vertical);\n const topBorder = colors.border(box.topLeft + this.line(width - 2) + box.topRight);\n const midBorder = colors.border(box.leftT + this.line(width - 2) + box.rightT);\n \n // Build content and pad to width (accounting for ANSI codes)\n const brand = this.state.watch.watching \n ? colors.brand('TRIE AGENT') + ' ' + colors.dim('🤖 autonomous')\n : colors.brand('TRIE AGENT');\n const rightContent = statusText + ' ' + watchLabel + alertText + ' ' + time;\n // Line structure: │ + 2 spaces + brand + gap + rightContent + 1 space + │ = 5 fixed chars\n const innerWidth = width - 5;\n const brandLen = visibleLength(brand);\n const rightLen = visibleLength(rightContent);\n const gap = Math.max(2, innerWidth - brandLen - rightLen);\n \n this.bufferLine(topBorder);\n this.bufferLine(v + ' ' + brand + ' '.repeat(gap) + rightContent + ' ' + v);\n this.bufferLine(midBorder);\n }\n\n /**\n * Render scanning in progress view\n */\n private renderScanningView(width: number, height: number): void {\n const { processedFiles, totalFiles, currentFile, activeAgents, completedAgents } = this.state.progress;\n const { issuesBySeverity } = this.state.progress;\n \n // Calculate available rows for variable sections to avoid scrolling\n const baseTotal = 21;\n const variableBudget = Math.max(0, height - baseTotal);\n const agentRows = Math.max(1, Math.min(4, Math.floor(variableBudget / 2)));\n const remaining = Math.max(0, variableBudget - agentRows);\n const activityRows = Math.max(1, Math.min(10, remaining || 1));\n \n // Progress section\n const percent = totalFiles > 0 ? Math.round((processedFiles / totalFiles) * 100) : 0;\n const current = currentFile ? currentFile.split('/').pop() || '' : '';\n const progressBar = this.progressBar(processedFiles, totalFiles, 50);\n \n this.renderLine('', width);\n this.renderLine(' ' + colors.dim('Scanning:') + ' ' + colors.highlight(current.slice(0, 40)), width);\n this.renderLine(' ' + progressBar + ' ' + colors.highlight(`${percent}%`) + ' ' + colors.dim(`(${processedFiles}/${totalFiles} files)`), width);\n this.renderLine('', width);\n \n // Agent status section\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.header('AGENT STATUS'), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n \n if (this.state.watch.watching) {\n this.renderLine(' ' + colors.success('🤖 Autonomous monitoring active'), width);\n this.renderLine(' ' + colors.dim(' └ Extracting signals from file changes'), width);\n \n const { signalExtraction } = this.state;\n const totalExtracted = signalExtraction.decisionsExtracted + signalExtraction.factsExtracted + \n signalExtraction.blockersExtracted + signalExtraction.questionsExtracted;\n \n if (totalExtracted > 0) {\n this.renderLine(' ' + colors.dim(' └ Signals extracted: ') + colors.highlight(totalExtracted.toString()), width);\n }\n } else {\n this.renderLine(' ' + colors.dim('Scanning codebase...'), width);\n }\n \n this.renderLine('', width);\n this.renderLine('', width);\n \n this.renderLine('', width);\n \n // Issues found section\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.header('ISSUES FOUND'), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n \n const criticalLine = `${colors.critical('[!]')} ${colors.critical('Critical')} ${colors.critical(issuesBySeverity.critical.toString().padStart(4))}`;\n const moderateLine = `${colors.moderate('[~]')} ${colors.moderate('Moderate')} ${colors.moderate(issuesBySeverity.moderate.toString().padStart(5))}`;\n const seriousLine = `${colors.serious('[x]')} ${colors.serious('Serious')} ${colors.serious(issuesBySeverity.serious.toString().padStart(4))}`;\n const lowLine = `${colors.low('[-]')} ${colors.low('Low')} ${colors.low(issuesBySeverity.low.toString().padStart(5))}`;\n \n this.renderLine(' ' + padEnd(criticalLine, 28) + moderateLine, width);\n this.renderLine(' ' + padEnd(seriousLine, 28) + lowLine, width);\n this.renderLine('', width);\n \n // Watch status section\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.header('WATCH STATUS'), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n const watchAnim = WATCH_FRAMES[this.animFrame % WATCH_FRAMES.length];\n const watchLine = this.state.watch.watching\n ? colors.success(`${watchAnim} Watching ${this.state.watch.directories} dirs`) + colors.dim(this.state.watch.debounceMs ? ` • debounce ${this.state.watch.debounceMs}ms` : '')\n : colors.dim('Watch idle');\n this.renderLine(' ' + watchLine, width);\n const lastChange = this.state.watch.lastChange \n ? colors.dim('Last change: ') + colors.highlight(this.state.watch.lastChange) \n : colors.dim('Last change: --');\n this.renderLine(' ' + lastChange, width);\n const recentChange = this.state.watch.recentChanges[0]?.file\n ? colors.dim('Recent: ') + this.state.watch.recentChanges[0].file\n : '';\n this.renderLine(' ' + recentChange, width);\n \n // Activity log section\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.header('ACTIVITY LOG'), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n \n const startIdx = this.state.activityPage * activityRows;\n const recentActivity = this.state.activityLog.slice(startIdx, startIdx + activityRows);\n for (const entry of recentActivity) {\n const logLine = colors.dim(entry.time) + ' ' + this.colorizeActivityMessage(this.stripEmojis(entry.message));\n this.renderLine(' ' + logLine, width);\n }\n for (let i = recentActivity.length; i < activityRows; i++) {\n this.renderLine('', width);\n }\n }\n\n /**\n * Strip emojis from a message string\n */\n private stripEmojis(text: string): string {\n // Remove common emoji ranges\n return text.replace(/[\\u{1F300}-\\u{1F9FF}]/gu, '') // Emoji range\n .replace(/[\\u{2600}-\\u{26FF}]/gu, '') // Misc symbols\n .replace(/[\\u{2700}-\\u{27BF}]/gu, '') // Dingbats\n .replace(/[\\u{FE00}-\\u{FE0F}]/gu, '') // Variation selectors\n .replace(/[\\u{1F000}-\\u{1FFFF}]/gu, '') // Extended emoji\n .trim();\n }\n\n /**\n * Colorize activity log messages based on content\n */\n private colorizeActivityMessage(message: string): string {\n if (message.includes('[!]') || message.includes('CRITICAL')) {\n return colors.critical(message);\n }\n if (message.includes('[x]') || message.includes('SERIOUS')) {\n return colors.serious(message);\n }\n if (message.includes('[+]') || message.includes('complete')) {\n return colors.success(message);\n }\n if (message.includes('[*]') || message.includes('started')) {\n return colors.running(message);\n }\n if (message.includes('===')) {\n return colors.header(message);\n }\n // Color skill/banner activations for better visibility\n if (message.includes('[BANNER]') || message.includes('[SKILL]')) {\n return colors.brand(message);\n }\n return message;\n }\n\n /**\n * Get issue count for an agent\n */\n private getAgentIssueCount(agent: string): number {\n return this.state.issues.filter(i => i.agent === agent).length;\n }\n\n /**\n * Render overview with summary statistics\n */\n private renderOverview(width: number, height: number): void {\n const { issuesBySeverity, totalIssues, processedFiles } = this.state.progress;\n const { completedAgents } = this.state.progress;\n const { signalExtraction } = this.state;\n const endTime = this.state.scanComplete && this.state.scanEndTime\n ? this.state.scanEndTime\n : Date.now();\n const elapsed = ((endTime - this.state.scanStartTime) / 1000).toFixed(1);\n const activityRows = Math.max(2, Math.min(8, Math.max(0, height - 26)));\n\n this.renderLine('', width);\n this.renderLine(' ' + colors.highlight(`${processedFiles}`) + colors.dim(` files scanned in ${elapsed}s`), width);\n \n // Signal extraction status\n if (this.state.watch.watching) {\n const totalExtracted = signalExtraction.decisionsExtracted + signalExtraction.factsExtracted + \n signalExtraction.blockersExtracted + signalExtraction.questionsExtracted;\n const statusEmoji = signalExtraction.enabled ? '🧠' : '⚠️';\n const statusText = signalExtraction.enabled ? 'enabled' : 'limited (set ANTHROPIC_API_KEY)';\n this.renderLine(' ' + statusEmoji + ' Signal extraction: ' + colors.dim(statusText), width);\n if (totalExtracted > 0) {\n this.renderLine(' ' + colors.dim(`└ ${signalExtraction.decisionsExtracted} decisions, ${signalExtraction.factsExtracted} facts, ${signalExtraction.blockersExtracted} blockers extracted`), width);\n }\n }\n \n this.renderLine('', width);\n \n // Summary section\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.header('SUMMARY'), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n \n const criticalLabel = issuesBySeverity.critical > 0 ? ' ' + colors.alert('<- FIX NOW') : '';\n this.renderLine(' ' + colors.critical('[!]') + ' ' + colors.critical(issuesBySeverity.critical.toString().padStart(4)) + ' ' + colors.critical('Critical issues') + criticalLabel, width);\n this.renderLine(' ' + colors.serious('[x]') + ' ' + colors.serious(issuesBySeverity.serious.toString().padStart(4)) + ' ' + colors.serious('Serious issues'), width);\n this.renderLine(' ' + colors.moderate('[~]') + ' ' + colors.moderate(issuesBySeverity.moderate.toString().padStart(4)) + ' ' + colors.moderate('Moderate issues'), width);\n this.renderLine(' ' + colors.low('[-]') + ' ' + colors.low(issuesBySeverity.low.toString().padStart(4)) + ' ' + colors.low('Low issues'), width);\n this.renderLine('', width);\n\n // Decision Ledger section (when watching)\n if (this.state.watch.watching && signalExtraction.enabled) {\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.header('DECISION LEDGER'), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n \n void (signalExtraction.decisionsExtracted + signalExtraction.factsExtracted + \n signalExtraction.blockersExtracted + signalExtraction.questionsExtracted);\n \n this.renderLine(' ' + colors.highlight('🧠 Agent Learning') + colors.dim(' - Building institutional knowledge'), width);\n this.renderLine('', width);\n this.renderLine(' ' + colors.dim('Signals Extracted:'), width);\n this.renderLine(' ' + colors.highlight(signalExtraction.decisionsExtracted.toString()) + colors.dim(' decisions'), width);\n this.renderLine(' ' + colors.highlight(signalExtraction.factsExtracted.toString()) + colors.dim(' facts'), width);\n this.renderLine(' ' + colors.highlight(signalExtraction.blockersExtracted.toString()) + colors.dim(' blockers'), width);\n this.renderLine(' ' + colors.highlight(signalExtraction.questionsExtracted.toString()) + colors.dim(' questions'), width);\n this.renderLine('', width);\n this.renderLine(' ' + colors.dim('Use ') + colors.highlight('trie gotcha') + colors.dim(' to query the ledger'), width);\n this.renderLine('', width);\n }\n\n // Top critical issues\n const criticalIssues = this.state.issues\n .filter(i => i.severity === 'critical')\n .slice(0, 3);\n\n if (criticalIssues.length > 0) {\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.critical('TOP CRITICAL ISSUES'), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n\n for (const issue of criticalIssues) {\n const filename = issue.file.split('/').pop() || issue.file;\n const lineNum = issue.line ? `:${issue.line}` : '';\n const location = `${filename}${lineNum}`;\n const description = issue.issue.slice(0, 40) + (issue.issue.length > 40 ? '...' : '');\n this.renderLine(' ' + colors.critical('▸') + ' ' + colors.critical(description), width);\n this.renderLine(' ' + colors.dim(location), width);\n this.renderLine('', width);\n }\n } else if (totalIssues === 0) {\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.success('✓ No issues found - code looks good!'), width);\n this.renderLine('', width);\n }\n \n // Activity log section (paged)\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.header('ACTIVITY LOG'), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n \n const startIdx = this.state.activityPage * activityRows;\n const recentActivity = this.state.activityLog.slice(startIdx, startIdx + activityRows);\n for (const entry of recentActivity) {\n const logLine = colors.dim(entry.time) + ' ' + this.colorizeActivityMessage(this.stripEmojis(entry.message));\n this.renderLine(' ' + logLine, width);\n }\n for (let i = recentActivity.length; i < activityRows; i++) {\n this.renderLine('', width);\n }\n }\n\n /**\n * Render filtered issues list\n */\n private renderIssuesList(width: number): void {\n const filteredIssues = this.getFilteredIssues();\n const { selectedIssue } = this.state;\n\n const pageSize = 10;\n const currentPage = Math.floor(selectedIssue / pageSize) + 1;\n const totalPages = Math.max(1, Math.ceil(filteredIssues.length / pageSize));\n const pageInfo = colors.dim(`Page ${currentPage}/${totalPages}`) + ' ' + colors.highlight(`${filteredIssues.length}`) + colors.dim(' issues');\n \n this.renderLine(' ' + colors.dim('Filter:') + ' ' + this.getFilterDescription() + ' ' + pageInfo, width);\n this.renderSectionBorder(width);\n\n // Issues list (paginated)\n const startIndex = Math.floor(selectedIssue / pageSize) * pageSize;\n const pageIssues = filteredIssues.slice(startIndex, startIndex + pageSize);\n\n // Show message if no issues match filter\n if (filteredIssues.length === 0) {\n this.renderLine('', width);\n this.renderLine(' ' + colors.dim('No issues match the current filter.'), width);\n this.renderLine(' ' + colors.dim('Press [x] to clear filters or [b] to go back.'), width);\n this.renderLine('', width);\n for (let i = 0; i < pageSize - 4; i++) {\n this.renderLine('', width);\n }\n return;\n }\n\n for (let i = 0; i < pageIssues.length; i++) {\n const issue = pageIssues[i]!;\n const globalIndex = startIndex + i;\n const isSelected = globalIndex === selectedIssue;\n const cursor = isSelected ? colors.selected('▸') : ' ';\n const severityIcon = this.severityIcon(issue.severity);\n const filename = issue.file.split('/').pop() || issue.file;\n const location = colors.dim(`${filename}:${issue.line || '?'}`);\n const description = issue.issue.slice(0, 35) + (issue.issue.length > 35 ? '...' : '');\n const descText = isSelected ? colors.selected(description) : description;\n\n this.renderLine(' ' + severityIcon + ' ' + cursor + ' ' + padEnd(descText, 40) + location, width);\n }\n\n // Padding if fewer issues\n for (let i = pageIssues.length; i < pageSize; i++) {\n this.renderLine('', width);\n }\n\n // Selected issue details\n if (filteredIssues[selectedIssue]) {\n const selected = filteredIssues[selectedIssue];\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.header('SELECTED:') + ' ' + colors.highlight(selected.issue.slice(0, width - 20)), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n this.renderLine(' ' + colors.dim('File:') + ' ' + selected.file.slice(0, width - 15), width);\n this.renderLine(' ' + colors.dim('Line:') + ' ' + (selected.line || 'Unknown') + ' ' + colors.dim('Scout:') + ' ' + selected.agent, width);\n this.renderLine('', width);\n \n // Fix suggestion\n const fixLines = this.wrapText(selected.fix, width - 8);\n this.renderLine(' ' + colors.success('Fix:'), width);\n for (const line of fixLines.slice(0, 2)) {\n this.renderLine(' ' + colors.success(line), width);\n }\n }\n }\n\n /**\n * Render agents view\n */\n private renderAgentsView(width: number): void {\n const sorted = this.getSortedAgents();\n\n const pageSize = 6;\n const startIdx = this.state.agentPage * pageSize;\n const slice = sorted.slice(startIdx, startIdx + pageSize);\n\n const totalPages = Math.max(1, Math.ceil(sorted.length / pageSize));\n const pageHint = totalPages > 1 ? ' ' + colors.highlight(`[n/p]`) + colors.dim(' more pages') : '';\n this.renderLine(' ' + colors.header('SCOUT STATUS') + ' ' + colors.dim('(j/k navigate, Enter view issues)'), width);\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.highlight(`${sorted.length}`) + colors.dim(' scouts') + ' ' + colors.dim(`Page ${this.state.agentPage + 1}/${totalPages}`) + pageHint, width);\n\n if (slice.length === 0) {\n this.renderLine(' ' + colors.dim('No scouts yet'), width);\n return;\n }\n\n this.renderLine(' ' + colors.dim('Name Status Issues Duration'), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n \n for (let i = 0; i < slice.length; i++) {\n const agent = slice[i];\n if (!agent) continue;\n const globalIdx = startIdx + i;\n const isSelected = globalIdx === this.state.selectedAgent;\n const cursor = isSelected ? colors.selected('▸') : ' ';\n const statusIcon = agent.status === 'running' \n ? this.agentIcon('running')\n : agent.status === 'done' \n ? this.agentIcon('done') \n : this.agentIcon('waiting');\n const statusText = agent.status === 'running'\n ? colors.running(agent.status.padEnd(9))\n : agent.status === 'done'\n ? colors.success(agent.status.padEnd(9))\n : colors.waiting(agent.status.padEnd(9));\n const issueCount = agent.issues > 0 ? colors.serious(agent.issues.toString().padStart(6)) : colors.dim(agent.issues.toString().padStart(6));\n const duration = colors.dim(agent.duration.padEnd(8));\n const nameText = isSelected ? colors.selected(agent.name.padEnd(18)) : agent.name.padEnd(18);\n \n this.renderLine(' ' + cursor + ' ' + statusIcon + ' ' + nameText + ' ' + statusText + ' ' + issueCount + ' ' + duration, width);\n }\n \n // Padding\n for (let i = slice.length; i < pageSize; i++) {\n this.renderLine('', width);\n }\n\n // Show recent skill activations (discrete banner display)\n if (this.state.skillBanners.length > 0) {\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.header('RECENT ACTIVATIONS'), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n\n const recentBanners = this.state.skillBanners.slice(0, 3); // Show last 3\n for (const banner of recentBanners) {\n const skillName = colors.highlight(banner.skill);\n const quote = banner.quote ? ' ' + colors.dim(`\"${banner.quote.slice(0, 35)}${banner.quote.length > 35 ? '...' : ''}\"`) : '';\n this.renderLine(' ' + colors.brand('◉') + ' ' + skillName + quote, width);\n }\n this.renderLine('', width);\n }\n\n // Show selected agent summary\n const selected = sorted[this.state.selectedAgent];\n if (selected) {\n const agentIssues = this.state.issues.filter(i => i.agent === selected.name);\n const criticals = agentIssues.filter(i => i.severity === 'critical').length;\n const serious = agentIssues.filter(i => i.severity === 'serious').length;\n \n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.header('SELECTED:') + ' ' + colors.highlight(selected.name), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n this.renderLine(' ' + colors.dim('Issues:') + ' ' + colors.highlight(agentIssues.length.toString()) + ' total (' + colors.critical(`[!] ${criticals} critical`) + ', ' + colors.serious(`[x] ${serious} serious`) + ')', width);\n this.renderLine(' ' + colors.dim('Press Enter to view all issues from this scout'), width);\n }\n }\n\n /**\n * Render files view\n */\n private renderFilesView(width: number): void {\n \n // Group issues by file\n const fileIssues = new Map<string, Issue[]>();\n for (const issue of this.state.issues) {\n if (!fileIssues.has(issue.file)) {\n fileIssues.set(issue.file, []);\n }\n fileIssues.get(issue.file)!.push(issue);\n }\n\n // Sort by issue count\n const sortedFiles = Array.from(fileIssues.entries())\n .sort((a, b) => b[1].length - a[1].length)\n .slice(0, 15);\n\n this.renderLine(' ' + colors.header('FILES WITH ISSUES'), width);\n this.renderSectionBorder(width);\n\n for (const [file, issues] of sortedFiles) {\n const filename = file.split('/').pop() || file;\n const criticalCount = issues.filter(i => i.severity === 'critical').length;\n const totalCount = issues.length;\n const criticalText = criticalCount > 0 ? colors.critical(` (${criticalCount} critical)`) : '';\n const countText = criticalCount > 0 ? colors.serious(`${totalCount} issues`) : colors.dim(`${totalCount} issues`);\n this.renderLine(' ' + filename.padEnd(35) + ' ' + countText + criticalText, width);\n }\n\n // Padding if fewer files\n for (let i = sortedFiles.length; i < 10; i++) {\n this.renderLine('', width);\n }\n }\n\n // ============================================\n // NEW VIEWS\n // ============================================\n\n /**\n * Render details view - selected issue with code snippet\n */\n private renderDetailsView(width: number, _height: number): void {\n const filteredIssues = this.getFilteredIssues();\n const issue = filteredIssues[this.state.selectedIssue];\n \n if (!issue) {\n this.renderLine(' ' + colors.dim('No issue selected. Press [b] to go back.'), width);\n return;\n }\n \n // Header\n const severityColor = issue.severity === 'critical' ? colors.critical :\n issue.severity === 'serious' ? colors.serious :\n issue.severity === 'moderate' ? colors.moderate : colors.low;\n \n this.renderLine(' ' + colors.header('ISSUE DETAILS') + ' ' + severityColor(`[${issue.severity.toUpperCase()}]`), width);\n this.renderSectionBorder(width);\n \n // Issue info\n this.renderLine(' ' + colors.dim('File:') + ' ' + issue.file, width);\n this.renderLine(' ' + colors.dim('Line:') + ' ' + (issue.line || '?') + ' ' + colors.dim('Scout:') + ' ' + (issue.agent || 'unknown'), width);\n this.renderLine('', width);\n \n // Issue description\n this.renderLine(' ' + colors.header('Issue'), width);\n const issueLines = this.wrapText(issue.issue, width - 8);\n for (const line of issueLines.slice(0, 4)) {\n this.renderLine(' ' + severityColor(line), width);\n }\n this.renderLine('', width);\n \n // Code snippet section\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.header('CODE SNIPPET'), width);\n \n const snippet = this.state.codeSnippets.get(this.state.selectedIssue);\n if (snippet) {\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n const maxLines = Math.min(snippet.lines.length, 10);\n for (let i = 0; i < maxLines; i++) {\n const lineNum = snippet.startLine + i;\n const isHighlight = lineNum === snippet.highlightLine;\n const prefix = isHighlight ? colors.critical('→') : ' ';\n const lineNumStr = colors.dim(lineNum.toString().padStart(4));\n const lineContent = isHighlight ? colors.yellow(snippet.lines[i] || '') : (snippet.lines[i] || '');\n this.renderLine(' ' + prefix + ' ' + lineNumStr + ' ' + colors.dim('│') + ' ' + lineContent, width);\n }\n if (snippet.lines.length > 10) {\n this.renderLine(' ' + colors.dim(` ... ${snippet.lines.length - 10} more lines`), width);\n }\n } else {\n this.renderLine(' ' + colors.dim('No code snippet available. Snippet is loaded when issue is selected.'), width);\n }\n this.renderLine('', width);\n \n // Fix suggestion\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.success('SUGGESTED FIX'), width);\n const fixLines = this.wrapText(issue.fix, width - 8);\n for (const line of fixLines.slice(0, 4)) {\n this.renderLine(' ' + colors.success(line), width);\n }\n \n // Metadata\n if (issue.cwe || issue.owasp || issue.effort) {\n this.renderLine('', width);\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.header('METADATA'), width);\n if (issue.cwe) this.renderLine(' ' + colors.dim('CWE:') + ' ' + issue.cwe, width);\n if (issue.owasp) this.renderLine(' ' + colors.dim('OWASP:') + ' ' + issue.owasp, width);\n if (issue.effort) this.renderLine(' ' + colors.dim('Effort:') + ' ' + issue.effort, width);\n }\n }\n\n /**\n * Render costs view - Moneybags cost breakdown\n */\n private renderCostsView(width: number, _height: number): void {\n \n this.renderLine(' ' + colors.header('💰 COST ANALYSIS') + ' ' + colors.dim('(Moneybags)'), width);\n this.renderSectionBorder(width);\n \n const cost = this.state.costReport;\n if (!cost) {\n this.renderLine(' ' + colors.dim('No cost data available. Run a full scan to get cost estimates.'), width);\n this.renderLine('', width);\n return;\n }\n \n // Format currency helper\n const fmt = (n: number) => n >= 1000000 ? `$${(n / 1000000).toFixed(2)}M` :\n n >= 1000 ? `$${(n / 1000).toFixed(1)}k` : `$${n}`;\n \n // Check if pre-revenue mode\n const payingUsersCount = this.state.guardianConfig.moneybags.payingUsers;\n const rpuValue = this.state.guardianConfig.moneybags.revenuePerUser;\n const isPreRevenue = payingUsersCount === 0 || rpuValue === 0;\n \n // Summary cards\n this.renderLine('', width);\n this.renderLine(' ' + colors.header('SUMMARY'), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n \n if (isPreRevenue) {\n // PRE-REVENUE MODE: Show developer time focus\n const devRate = this.state.guardianConfig.moneybags.developerRate;\n const hoursToFix = cost.fixNowCost / devRate;\n const hoursStr = hoursToFix < 1 ? `${Math.round(hoursToFix * 60)} minutes` : `${hoursToFix.toFixed(1)} hours`;\n \n this.renderLine(' ' + colors.header('PRE-REVENUE MODE') + ' ' + colors.dim('(cost = developer time only)'), width);\n this.renderLine('', width);\n this.renderLine(' ' + colors.success('Total Dev Time:') + ' ' + colors.success(hoursStr), width);\n this.renderLine(' ' + colors.dim('Dev Cost:') + ' ' + colors.highlight(fmt(cost.fixNowCost)), width);\n this.renderLine('', width);\n this.renderLine(' ' + colors.dim('Set paying users + revenue/user in config (c) to enable full cost analysis'), width);\n this.renderLine('', width);\n } else {\n // REVENUE MODE: Full cost breakdown\n const fixNowLabel = colors.success('Fix Now Cost:');\n const prodLabel = colors.critical('Production Cost:');\n const savingsLabel = colors.running('Potential Savings:');\n \n this.renderLine(' ' + fixNowLabel + ' ' + colors.success(fmt(cost.fixNowCost)), width);\n this.renderLine(' ' + prodLabel + ' ' + colors.critical(fmt(cost.productionCost)), width);\n this.renderLine(' ' + savingsLabel + ' ' + colors.running(fmt(cost.savings)), width);\n this.renderLine('', width);\n \n // ROI\n const roi = cost.fixNowCost > 0 ? Math.round((cost.savings / cost.fixNowCost) * 100) : 0;\n this.renderLine(' ' + colors.dim('ROI:') + ' ' + colors.highlight(`${roi}%`) + ' ' + colors.dim('return on fixing these issues now'), width);\n this.renderLine('', width);\n }\n \n // Current configuration\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.header('CONFIGURATION'), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n this.renderLine(' ' + colors.dim('Users:') + ' ' + colors.highlight(this.state.guardianConfig.moneybags.userCount.toLocaleString()), width);\n const payingUsers = this.state.guardianConfig.moneybags.payingUsers;\n const rpu = this.state.guardianConfig.moneybags.revenuePerUser;\n if (payingUsers > 0 || rpu > 0) {\n if (payingUsers > 0) {\n this.renderLine(' ' + colors.dim('Paying:') + ' ' + colors.highlight(payingUsers.toLocaleString()), width);\n }\n if (rpu > 0) {\n const effectiveUsers = payingUsers > 0 ? payingUsers : this.state.guardianConfig.moneybags.userCount;\n const mrr = effectiveUsers * rpu;\n this.renderLine(' ' + colors.dim('MRR:') + ' ' + colors.success(`$${mrr.toLocaleString()}/mo`), width);\n }\n }\n this.renderLine(' ' + colors.dim('Dev Rate:') + ' ' + colors.highlight(`$${this.state.guardianConfig.moneybags.developerRate}/hr`), width);\n if (this.state.guardianConfig.moneybags.industry) {\n this.renderLine(' ' + colors.dim('Industry:') + ' ' + colors.highlight(this.state.guardianConfig.moneybags.industry), width);\n }\n this.renderLine(' ' + colors.dim('Press') + ' ' + colors.highlight('c') + ' ' + colors.dim('for full config'), width);\n this.renderLine('', width);\n \n // Per-issue breakdown (if available)\n if (cost.perIssue && cost.perIssue.length > 0) {\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.header('PER-ISSUE BREAKDOWN'), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n \n const maxRows = Math.min(cost.perIssue.length, 8);\n for (let i = 0; i < maxRows; i++) {\n const item = cost.perIssue[i];\n if (!item) continue;\n const issueName = item.issue.slice(0, 40) + (item.issue.length > 40 ? '...' : '');\n this.renderLine(' ' + colors.dim('•') + ' ' + issueName.padEnd(45) + ' ' + colors.serious(fmt(item.cost)), width);\n }\n if (cost.perIssue.length > 8) {\n this.renderLine(' ' + colors.dim(`... and ${cost.perIssue.length - 8} more`), width);\n }\n }\n \n // Padding\n this.renderLine('', width);\n }\n\n /**\n * Render readiness view - Production readiness checklist\n */\n private renderReadinessView(width: number, _height: number): void {\n \n this.renderLine(' ' + colors.header('PRODUCTION READINESS'), width);\n this.renderSectionBorder(width);\n \n const readiness = this.state.readiness;\n if (!readiness) {\n this.renderLine(' ' + colors.dim('No readiness data. Run production-ready agent for assessment.'), width);\n return;\n }\n \n // Status indicator\n const statusColor = readiness.status === 'ready' ? colors.success :\n readiness.status === 'caution' ? colors.running : colors.critical;\n const statusIcon = readiness.status === 'ready' ? '✓' :\n readiness.status === 'caution' ? '~' : '✗';\n \n this.renderLine('', width);\n this.renderLine(' ' + colors.header('STATUS'), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n this.renderLine(' ' + statusColor(`[${statusIcon}] ${readiness.status.toUpperCase()}`), width);\n this.renderLine('', width);\n \n // Score bar\n const scoreWidth = 40;\n const scoreFilled = Math.round((readiness.score / 100) * scoreWidth);\n const scoreEmpty = scoreWidth - scoreFilled;\n const scoreBar = statusColor('█'.repeat(scoreFilled)) + colors.dim('░'.repeat(scoreEmpty));\n \n this.renderLine(' ' + colors.dim('Score:') + ' ' + scoreBar + ' ' + statusColor(`${readiness.score}/100`), width);\n this.renderLine('', width);\n \n // Requirements summary\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.header('REQUIREMENTS'), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n this.renderLine(' ' + colors.dim('Met:') + ' ' + colors.highlight(`${readiness.requirementsMet}/${readiness.total}`), width);\n this.renderLine('', width);\n \n // Requirements list (if available)\n if (readiness.requirements && readiness.requirements.length > 0) {\n for (const req of readiness.requirements.slice(0, 10)) {\n const icon = req.met ? colors.success('✓') : colors.critical('✗');\n const text = req.met ? colors.dim(req.name) : req.name;\n this.renderLine(' ' + icon + ' ' + text, width);\n }\n }\n \n this.renderLine('', width);\n }\n\n /**\n * Render analysis view - Semantic + Attack Surface\n */\n private renderAnalysisView(width: number, _height: number): void {\n \n this.renderLine(' ' + colors.header('ANALYSIS REPORT'), width);\n this.renderSectionBorder(width);\n \n // Semantic Analysis section\n const semantic = this.state.semanticAnalysis;\n if (semantic) {\n this.renderLine(' ' + colors.header('SEMANTIC ANALYSIS'), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n \n if (semantic.dataFlowIssues > 0) {\n this.renderLine(' ' + colors.critical('[!]') + ' ' + colors.critical(`${semantic.dataFlowIssues} Data Flow Vulnerabilities`), width);\n this.renderLine(' ' + colors.dim('Untrusted input reaching dangerous sinks'), width);\n }\n if (semantic.raceConditions > 0) {\n this.renderLine(' ' + colors.running('[~]') + ' ' + colors.running(`${semantic.raceConditions} Race Conditions`), width);\n this.renderLine(' ' + colors.dim('TOCTOU, double-spend risks'), width);\n }\n if (semantic.authIssues > 0) {\n this.renderLine(' ' + colors.critical('[!]') + ' ' + colors.critical(`${semantic.authIssues} Authentication Issues`), width);\n this.renderLine(' ' + colors.dim('Missing or bypassable auth'), width);\n }\n \n const total = semantic.dataFlowIssues + semantic.raceConditions + semantic.authIssues;\n if (total === 0) {\n this.renderLine(' ' + colors.success('✓ No semantic issues detected'), width);\n }\n \n this.renderLine('', width);\n }\n \n // Attack Surface section\n const attack = this.state.attackSurface;\n if (attack) {\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.header('ATTACK SURFACE'), width);\n this.renderLine(' ' + colors.dim(this.line(width - 6)), width);\n \n this.renderLine(' ' + colors.dim('Endpoints:') + ' ' + colors.highlight(attack.totalEndpoints.toString()), width);\n \n if (attack.unprotected > 0) {\n this.renderLine(' ' + colors.critical('Unprotected:') + ' ' + colors.critical(attack.unprotected.toString()), width);\n } else {\n this.renderLine(' ' + colors.success('Unprotected:') + ' ' + colors.success('0'), width);\n }\n \n // Risk score bar\n const riskWidth = 30;\n const riskFilled = Math.round((attack.riskScore / 100) * riskWidth);\n const riskEmpty = riskWidth - riskFilled;\n const riskColor = attack.riskScore > 70 ? colors.critical :\n attack.riskScore > 40 ? colors.running : colors.success;\n const riskBar = riskColor('█'.repeat(riskFilled)) + colors.dim('░'.repeat(riskEmpty));\n \n this.renderLine(' ' + colors.dim('Risk Score:') + ' ' + riskBar + ' ' + riskColor(`${attack.riskScore}/100`), width);\n \n this.renderLine('', width);\n \n // Endpoints list (if available)\n if (attack.endpoints && attack.endpoints.length > 0) {\n this.renderLine(' ' + colors.dim('Top Endpoints:'), width);\n for (const ep of attack.endpoints.slice(0, 5)) {\n const authIcon = ep.auth ? colors.success('[AUTH]') : colors.critical('[PUBLIC]');\n const method = colors.dim(ep.method.padEnd(6));\n const path = ep.sensitive ? colors.serious(ep.path) : ep.path;\n this.renderLine(' ' + authIcon + ' ' + method + ' ' + path, width);\n }\n }\n }\n \n if (!semantic && !attack) {\n this.renderLine(' ' + colors.dim('No analysis data available. Run a full scan for semantic analysis.'), width);\n }\n \n this.renderLine('', width);\n }\n\n /**\n * Render raw log view - All console output\n */\n private renderRawLogView(width: number, height: number): void {\n \n const pageSize = Math.max(10, height - 15);\n const totalPages = Math.max(1, Math.ceil(this.state.rawLog.length / pageSize));\n \n this.renderLine(' ' + colors.header('RAW LOG') + ' ' + colors.dim(`Page ${this.state.rawLogPage + 1}/${totalPages}`) + ' ' + colors.highlight(`${this.state.rawLog.length}`) + colors.dim(' entries'), width);\n this.renderSectionBorder(width);\n \n if (this.state.rawLog.length === 0) {\n this.renderLine(' ' + colors.dim('No log entries yet.'), width);\n this.renderLine('', width);\n return;\n }\n \n const startIdx = this.state.rawLogPage * pageSize;\n const logs = this.state.rawLog.slice(startIdx, startIdx + pageSize);\n \n for (const entry of logs) {\n const levelColor = entry.level === 'error' ? colors.critical :\n entry.level === 'warn' ? colors.running :\n entry.level === 'info' ? colors.success : colors.dim;\n const levelStr = levelColor(`[${entry.level.toUpperCase().padEnd(5)}]`);\n const timeStr = colors.dim(entry.time);\n const message = entry.message.slice(0, width - 25);\n \n this.renderLine(' ' + timeStr + ' ' + levelStr + ' ' + message, width);\n }\n \n // Padding\n for (let i = logs.length; i < pageSize; i++) {\n this.renderLine('', width);\n }\n }\n\n /**\n * Render skills browser view\n */\n private renderSkillsView(width: number, _height: number): void {\n const { skillsBrowser } = this.state;\n \n // Built-in scouts list (static)\n const builtInScouts = [\n { name: 'security', desc: 'Security vulnerabilities' },\n { name: 'accessibility', desc: 'A11y compliance' },\n { name: 'performance', desc: 'Performance bottlenecks' },\n { name: 'production-ready', desc: 'Deploy readiness' },\n { name: 'moneybags', desc: 'Cost analysis' },\n { name: 'agent-smith', desc: 'Pattern hunter' },\n { name: 'soc2', desc: 'SOC2 compliance' },\n { name: 'devops', desc: 'CI/CD & infra' },\n { name: 'test', desc: 'Test coverage' },\n { name: 'bug-finding', desc: 'Bug detection' },\n { name: 'typecheck', desc: 'Type safety' },\n ];\n \n // Title with custom skill hint\n this.renderLine(' ' + colors.header('TOOLKIT') + ' ' + colors.dim('Scouts (built-in) + Skills (installable)'), width);\n this.renderSectionBorder(width);\n \n // Calculate column widths (4 panels, but we show 2 rows of 2)\n const innerWidth = width - 4;\n const halfWidth = Math.floor(innerWidth / 2);\n \n // Panel headers with selection indicator - Row 1: Scouts | Installed Skills\n const scoutsHeader = skillsBrowser.activePanel === 'installed' \n ? colors.selected('▸ Scouts') + colors.dim(` (${builtInScouts.length}+)`)\n : colors.dim(' Scouts') + colors.dim(` (${builtInScouts.length}+)`);\n \n const installedHeader = skillsBrowser.activePanel === 'global'\n ? colors.selected('▸ Skills') + colors.dim(` (${skillsBrowser.installedSkills.length + skillsBrowser.globalSkills.length})`)\n : colors.dim(' Skills') + colors.dim(` (${skillsBrowser.installedSkills.length + skillsBrowser.globalSkills.length})`);\n \n // Row 2 headers: Suggested | Categories\n const suggestedHeader = skillsBrowser.activePanel === 'suggested'\n ? colors.selected('▸ Suggested') + colors.dim(` (${skillsBrowser.suggestedSkills.length})`)\n : colors.dim(' Suggested') + colors.dim(` (${skillsBrowser.suggestedSkills.length})`);\n \n const categoriesHeader = skillsBrowser.activePanel === 'categories'\n ? colors.selected('▸ Categories') + colors.dim(` (${skillsBrowser.categories.length})`)\n : colors.dim(' Categories') + colors.dim(` (${skillsBrowser.categories.length})`);\n \n // Render header row 1: Scouts | Skills\n const headerRow1 = ' ' + padEnd(scoutsHeader, halfWidth) + colors.border('│') + installedHeader;\n this.renderLine(headerRow1, width);\n this.renderSectionBorder(width);\n \n // Determine max items per column\n const maxItems = 5;\n \n // Combine installed and global skills for the Skills column\n const allInstalledSkills = [...skillsBrowser.installedSkills, ...skillsBrowser.globalSkills];\n \n // Render content rows for Scouts | Skills\n for (let i = 0; i < maxItems; i++) {\n let scoutsCol = '';\n let skillsCol = '';\n \n // Scouts column (built-in)\n const scout = builtInScouts[i];\n if (scout) {\n const isSelected = skillsBrowser.activePanel === 'installed' && skillsBrowser.selectedIndex === i;\n const name = scout.name.slice(0, halfWidth - 15);\n const desc = colors.dim(scout.desc.slice(0, 12));\n scoutsCol = isSelected \n ? colors.selected('▸ ') + colors.highlight(name) + ' ' + desc\n : ' ' + colors.success('●') + ' ' + name + ' ' + desc;\n }\n \n // Installed skills column\n const skill = allInstalledSkills[i];\n if (skill) {\n const isSelected = skillsBrowser.activePanel === 'global' && skillsBrowser.selectedIndex === i;\n const name = skill.name.slice(0, halfWidth - 4);\n const isCustom = skill.installedFrom?.startsWith('file://');\n const badge = isCustom ? colors.dim(' (custom)') : '';\n skillsCol = isSelected\n ? colors.selected('▸ ') + colors.highlight(name) + badge\n : ' ' + name + badge;\n }\n \n const row = ' ' + padEnd(scoutsCol || '', halfWidth) + colors.border('│') + (skillsCol || '');\n this.renderLine(row, width);\n }\n \n // Separator and header row 2\n this.renderSectionBorder(width);\n const headerRow2 = ' ' + padEnd(suggestedHeader, halfWidth) + colors.border('│') + categoriesHeader;\n this.renderLine(headerRow2, width);\n this.renderSectionBorder(width);\n \n // Render content rows for Suggested | Categories\n for (let i = 0; i < maxItems; i++) {\n let suggestedCol = '';\n let categoriesCol = '';\n \n // Suggested skills column\n const suggestedSkill = skillsBrowser.suggestedSkills[i];\n if (suggestedSkill) {\n const isSelected = skillsBrowser.activePanel === 'suggested' && skillsBrowser.selectedIndex === i;\n const display = suggestedSkill.length > halfWidth - 4 ? suggestedSkill.slice(0, halfWidth - 7) + '...' : suggestedSkill;\n suggestedCol = isSelected\n ? colors.selected('▸ ') + colors.highlight(display)\n : ' ' + display;\n }\n \n // Categories column (or category detail)\n if (skillsBrowser.selectedCategory) {\n const catSkill = skillsBrowser.categorySkills[i];\n if (catSkill) {\n const isSelected = skillsBrowser.activePanel === 'categories' && skillsBrowser.selectedIndex === i;\n const display = catSkill.length > halfWidth - 4 ? catSkill.slice(0, halfWidth - 7) + '...' : catSkill;\n categoriesCol = isSelected\n ? colors.selected('▸ ') + colors.highlight(display)\n : ' ' + display;\n }\n } else {\n const cat = skillsBrowser.categories[i];\n if (cat) {\n const isSelected = skillsBrowser.activePanel === 'categories' && skillsBrowser.selectedIndex === i;\n const display = `${cat.name} (${cat.count})`;\n categoriesCol = isSelected\n ? colors.selected('▸ ') + colors.highlight(display)\n : ' ' + display;\n }\n }\n \n const row = ' ' + padEnd(suggestedCol || '', halfWidth) + colors.border('│') + (categoriesCol || '');\n this.renderLine(row, width);\n }\n \n // Detected stack info\n this.renderSectionBorder(width);\n const stackParts: string[] = [];\n if (skillsBrowser.detectedStack.framework) stackParts.push(skillsBrowser.detectedStack.framework);\n if (skillsBrowser.detectedStack.language) stackParts.push(skillsBrowser.detectedStack.language);\n if (skillsBrowser.detectedStack.database) stackParts.push(skillsBrowser.detectedStack.database);\n \n if (stackParts.length > 0) {\n this.renderLine(' ' + colors.dim('Stack: ') + colors.success(stackParts.join(', ')), width);\n }\n \n // Installation status or custom skill hint\n if (skillsBrowser.installing) {\n this.renderLine(' ' + colors.running('Installing: ') + skillsBrowser.installStatus, width);\n } else if (skillsBrowser.installStatus) {\n this.renderLine(' ' + colors.success(skillsBrowser.installStatus), width);\n } else {\n // Custom skill creation hint\n this.renderLine(' ' + colors.dim('Tip: Drag a text file here and press') + ' ' + colors.highlight('c') + ' ' + colors.dim('to create a global custom skill'), width);\n }\n \n // Category breadcrumb\n if (skillsBrowser.selectedCategory) {\n this.renderLine(' ' + colors.dim('Category: ') + colors.highlight(skillsBrowser.selectedCategory) + colors.dim(' (press b to go back)'), width);\n }\n \n // Controls hint\n this.renderSectionBorder(width);\n const key = (k: string) => colors.border('[') + colors.highlight(k) + colors.border(']');\n this.renderLine(' ' + key('Tab') + colors.dim(' panel ') + \n key('↑↓') + colors.dim(' select ') + \n key('Enter') + colors.dim(' install/browse ') + \n key('c') + colors.dim(' custom ') +\n key('b') + colors.dim(' back'), width);\n }\n\n /**\n * Render guardian view - conversational insights from your Guardian Agent\n */\n private renderGuardianView(width: number, height: number): void {\n \n // Combine Guardian insights with legacy notifications for total count\n const totalInsights = this.state.guardianInsights.length;\n const activeInsights = this.state.guardianInsights.filter(i => !i.dismissed).length;\n const countStr = activeInsights > 0 \n ? colors.critical(` (${activeInsights} active)`)\n : colors.dim(` (${totalInsights} total)`);\n \n this.renderLine(' ' + colors.header('GUARDIAN INSIGHTS') + countStr + ' ' + colors.dim('Your agentic code companion'), width);\n this.renderSectionBorder(width);\n \n // Agency Status Bar (compact, always shown if available)\n const agency = this.state.agencyStatus;\n if (agency) {\n const riskColor = agency.riskLevel === 'critical' ? colors.critical :\n agency.riskLevel === 'high' ? colors.serious :\n agency.riskLevel === 'medium' ? colors.running : colors.success;\n \n const goalsStr = `${colors.dim('Goals:')} ${colors.highlight(String(agency.goals.active))}/${agency.goals.completed + agency.goals.active}`;\n const hypothesesStr = `${colors.dim('Hypo:')} ${colors.highlight(String(agency.hypotheses.testing))} testing`;\n const riskStr = `${colors.dim('Risk:')} ${riskColor(agency.riskLevel.toUpperCase())}`;\n const effectStr = `${colors.dim('Effect:')} ${(agency.effectiveness >= 80 ? colors.success : agency.effectiveness >= 50 ? colors.running : colors.serious)(String(agency.effectiveness) + '%')}`;\n const quietStr = agency.isQuietHours ? colors.dim(' [quiet]') : '';\n \n this.renderLine(` ${goalsStr} ${hypothesesStr} ${riskStr} ${effectStr}${quietStr}`, width);\n this.renderSectionBorder(width);\n }\n \n // Calculate available lines\n const pageSize = Math.max(10, height - 14);\n const scrollPos = this.state.scrollPositions.guardian;\n \n if (totalInsights === 0 && this.state.notificationHistory.length === 0) {\n // Empty state - explain what Guardian does\n this.renderLine('', width);\n this.renderLine(' ' + colors.highlight('The Guardian is watching over your code.'), width);\n this.renderLine('', width);\n this.renderLine(' ' + colors.dim(\"Unlike a log viewer, the Guardian is an agent that:\"), width);\n this.renderLine(' ' + colors.dim(\" • Synthesizes insights from all skills\"), width);\n this.renderLine(' ' + colors.dim(\" • Speaks conversationally about what matters\"), width);\n this.renderLine(' ' + colors.dim(\" • Suggests specific actions to take\"), width);\n this.renderLine(' ' + colors.dim(\" • Celebrates when you fix issues\"), width);\n this.renderLine(' ' + colors.dim(\" • Tracks patterns over time\"), width);\n this.renderLine('', width);\n this.renderLine(' ' + colors.dim(\"When the Guardian has something to say, it'll appear here.\"), width);\n this.renderLine('', width);\n \n // AI enhancement status\n if (isAIAvailable()) {\n this.renderLine(' ' + colors.success('✓') + colors.dim(' AI-enhanced insights enabled'), width);\n } else {\n this.renderLine(' ' + colors.dim('Want smarter insights? Set ') + colors.highlight('ANTHROPIC_API_KEY') + colors.dim(' for AI enhancement'), width);\n }\n \n // Fill remaining space\n for (let i = 0; i < pageSize - 13; i++) {\n this.renderLine('', width);\n }\n } else {\n // Render Guardian insights (newest first, prioritized)\n // Filter out dismissed insights from the display\n const insights = this.getVisibleGuardianInsights();\n // Clamp selection/scroll to available items\n if (insights.length === 0) {\n this.state.selectedGuardianInsight = 0;\n this.state.scrollPositions.guardian = 0;\n } else {\n if (this.state.selectedGuardianInsight >= insights.length) {\n this.state.selectedGuardianInsight = insights.length - 1;\n }\n if (this.state.scrollPositions.guardian >= insights.length) {\n this.state.scrollPositions.guardian = Math.max(0, insights.length - 1);\n }\n }\n \n const startIdx = scrollPos;\n let linesUsed = 0;\n let itemIdx = startIdx;\n \n while (linesUsed < pageSize && itemIdx < insights.length) {\n const insight = insights[itemIdx];\n if (!insight) break;\n \n // Check if this insight is selected or expanded\n const isSelected = itemIdx === this.state.selectedGuardianInsight;\n const isExpanded = itemIdx === this.state.expandedGuardianInsight;\n \n // Format timestamp\n const ago = this.formatTimeAgo(insight.timestamp);\n \n // Type-based styling\n let icon: string;\n let typeColor: (s: string) => string;\n switch (insight.type) {\n case 'warning':\n icon = '[!]';\n typeColor = colors.critical;\n break;\n case 'observation':\n icon = '[>]';\n typeColor = colors.serious;\n break;\n case 'suggestion':\n icon = '[?]';\n typeColor = colors.highlight;\n break;\n case 'celebration':\n icon = '[+]';\n typeColor = colors.success;\n break;\n case 'question':\n icon = '[?]';\n typeColor = colors.moderate;\n break;\n default:\n icon = '[>]';\n typeColor = colors.dim;\n }\n \n // Selection and status indicators\n const selector = isSelected ? colors.highlight('▶ ') : ' ';\n const status = insight.dismissed ? colors.dim('✓') : isExpanded ? colors.highlight('▼') : colors.dim('▷');\n \n // Header line: [type] message (show full message when expanded, truncated otherwise)\n // Strip any emojis from the message\n const cleanMessage = this.stripEmojis(insight.message);\n if (isExpanded && !insight.dismissed && cleanMessage.length > width - 32) {\n // Multi-line message when expanded\n const msgLines = this.wrapText(cleanMessage, width - 12);\n for (let i = 0; i < msgLines.length && i < 3 && linesUsed < pageSize - 1; i++) {\n const msgLine = msgLines[i];\n if (!msgLine) continue;\n const prefix = i === 0 ? `${selector}${status} ${icon} ` : ' ';\n const line = i === 0 && isSelected\n ? pc.inverse(` ${msgLine} `)\n : typeColor(msgLine);\n this.renderLine(prefix + line, width);\n linesUsed++;\n }\n if (msgLines.length > 3) {\n this.renderLine(' ' + colors.dim('...'), width);\n linesUsed++;\n }\n } else {\n // Single line (truncated if needed)\n const msgMaxLen = width - 32;\n const msg = cleanMessage.length > msgMaxLen\n ? cleanMessage.slice(0, msgMaxLen - 3) + '...'\n : cleanMessage;\n\n const headerText = isSelected && !insight.dismissed\n ? pc.inverse(` ${icon} ${msg} `)\n : `${icon} ${typeColor(msg)}`;\n\n this.renderLine(`${selector}${status} ${headerText}`, width);\n linesUsed++;\n }\n \n // Time and category\n const metaLine = colors.dim(` ${ago} • ${insight.category}${isSelected && !isExpanded ? ' • Press Enter to expand' : ''}`);\n this.renderLine(' ' + metaLine, width);\n linesUsed++;\n \n // Show details if EXPANDED (not just selected)\n const showDetails = isExpanded && !insight.dismissed;\n \n // Verbose details section (if expanded)\n if (showDetails && insight.details && linesUsed < pageSize - 4) {\n // Severity breakdown\n if (insight.details.issueBreakdown && Object.keys(insight.details.issueBreakdown).length > 0) {\n const breakdown = insight.details.issueBreakdown;\n const parts: string[] = [];\n if (breakdown['critical']) parts.push(colors.critical(`${breakdown['critical']} critical`));\n if (breakdown['serious']) parts.push(colors.serious(`${breakdown['serious']} serious`));\n if (breakdown['moderate']) parts.push(colors.moderate(`${breakdown['moderate']} moderate`));\n if (parts.length > 0) {\n this.renderLine(' ' + parts.join(colors.dim(' • ')), width);\n linesUsed++;\n }\n }\n \n // Affected files (show more when expanded)\n if (insight.details.affectedFiles && insight.details.affectedFiles.length > 0 && linesUsed < pageSize - 3) {\n this.renderLine(' ' + colors.header('Files:'), width);\n linesUsed++;\n for (const file of insight.details.affectedFiles.slice(0, 8)) {\n if (linesUsed >= pageSize - 4) break;\n this.renderLine(' ' + pc.cyan('• ' + file), width);\n linesUsed++;\n }\n if (insight.details.affectedFiles.length > 8) {\n this.renderLine(' ' + colors.dim(`... +${insight.details.affectedFiles.length - 8} more`), width);\n linesUsed++;\n }\n }\n \n // Examples (specific issues - show more when expanded)\n if (insight.details.examples && insight.details.examples.length > 0 && linesUsed < pageSize - 2) {\n this.renderLine(' ' + colors.header('Examples:'), width);\n linesUsed++;\n for (const example of insight.details.examples.slice(0, 5)) {\n if (linesUsed >= pageSize - 2) break;\n\n // Better wrapping for long examples\n const maxLen = width - 18; // Room for prefix and padding\n if (example.length <= maxLen) {\n this.renderLine(' ' + colors.dim('• ') + example, width);\n linesUsed++;\n } else {\n // Wrap long examples intelligently\n const parts = this.wrapText(example, maxLen);\n for (let j = 0; j < parts.length && j < 2 && linesUsed < pageSize - 1; j++) {\n const prefix = j === 0 ? colors.dim('• ') : colors.dim(' ');\n this.renderLine(' ' + prefix + parts[j], width);\n linesUsed++;\n }\n if (parts.length > 2) {\n this.renderLine(' ' + colors.dim(' ...'), width);\n linesUsed++;\n }\n }\n }\n }\n \n // Comparison/trend\n if (insight.details.comparison && linesUsed < pageSize - 1) {\n const trendIcon = insight.details.trend === 'improving' ? '↓' : \n insight.details.trend === 'worsening' ? '↑' : '→';\n this.renderLine(' ' + colors.dim(`${trendIcon} ${insight.details.comparison}`), width);\n linesUsed++;\n }\n \n // Goal achievement receipt (resolved issues)\n if (insight.type === 'celebration' && insight.message.includes('Goal achieved') && linesUsed < pageSize - 3) {\n // Context is required - show error if missing\n if (!insight.context) {\n this.renderLine(' ' + colors.critical('[ERROR] Missing context in goal achievement insight'), width);\n linesUsed++;\n } else {\n this.renderLine(' ' + colors.dim(insight.context), width);\n linesUsed++;\n }\n \n // Details object is required - show error if missing\n if (!insight.details) {\n this.renderLine(' ' + colors.critical('[ERROR] Missing details object in goal achievement insight'), width);\n linesUsed++;\n } else if (insight.details.resolvedCount === undefined) {\n this.renderLine(' ' + colors.critical('[ERROR] Missing resolvedCount in goal achievement details'), width);\n linesUsed++;\n } else if (insight.details.resolvedCount === 0) {\n this.renderLine(' ' + colors.yellow('[WARNING] resolvedCount is 0 - no issues were found matching this goal'), width);\n linesUsed++;\n } else if (!insight.details.resolvedIssues) {\n this.renderLine(' ' + colors.critical(`[ERROR] Missing resolvedIssues array (expected ${insight.details.resolvedCount} issues)`), width);\n linesUsed++;\n } else if (insight.details.resolvedIssues.length === 0) {\n this.renderLine(' ' + colors.critical(`[ERROR] resolvedIssues array is empty (expected ${insight.details.resolvedCount} issues)`), width);\n linesUsed++;\n } else {\n // Validate count matches array length\n if (insight.details.resolvedCount !== insight.details.resolvedIssues.length) {\n this.renderLine(' ' + colors.critical(`[ERROR] resolvedCount (${insight.details.resolvedCount}) doesn't match array length (${insight.details.resolvedIssues.length})`), width);\n linesUsed++;\n }\n \n // Show resolved issues\n const resolvedCount = insight.details.resolvedCount;\n this.renderLine(' ' + colors.header(`Resolved ${resolvedCount} issue${resolvedCount > 1 ? 's' : ''}:`), width);\n linesUsed++;\n \n const maxIssues = Math.min(insight.details.resolvedIssues.length, 10);\n for (let i = 0; i < maxIssues && linesUsed < pageSize - 2; i++) {\n const issue = insight.details.resolvedIssues[i];\n if (!issue) {\n this.renderLine(' ' + colors.critical(`[ERROR] Missing issue at index ${i}`), width);\n linesUsed++;\n continue;\n }\n \n if (!issue.file) {\n this.renderLine(' ' + colors.critical(`[ERROR] Missing file in issue at index ${i}`), width);\n linesUsed++;\n continue;\n }\n \n if (!issue.issue) {\n this.renderLine(' ' + colors.critical(`[ERROR] Missing issue description at index ${i}`), width);\n linesUsed++;\n continue;\n }\n \n const fileName = basename(issue.file);\n const lineInfo = issue.line ? `:${issue.line}` : '';\n const issueText = issue.issue.length > 50 ? issue.issue.slice(0, 47) + '...' : issue.issue;\n const agentInfo = issue.agent ? colors.dim(` (${issue.agent})`) : '';\n \n this.renderLine(' ' + colors.success('• ') + `${fileName}${lineInfo}: ${issueText}${agentInfo}`, width);\n linesUsed++;\n }\n \n if (insight.details.resolvedIssues.length > maxIssues) {\n this.renderLine(' ' + colors.dim(`... +${insight.details.resolvedIssues.length - maxIssues} more`), width);\n linesUsed++;\n }\n }\n \n // Summary for goal achievements (always show if available)\n if (insight.details.summary && linesUsed < pageSize - 1) {\n this.renderLine(' ' + colors.dim(insight.details.summary), width);\n linesUsed++;\n }\n }\n }\n \n // Suggested action (show if expanded or selected)\n if (insight.suggestedAction && (showDetails || isSelected) && !insight.dismissed && linesUsed < pageSize) {\n const actionLine = colors.dim(' → ') + colors.highlight(insight.suggestedAction);\n this.renderLine(' ' + actionLine, width);\n linesUsed++;\n }\n \n // Command (show if expanded) - indicate that Enter will run it\n if (insight.actionCommand && showDetails && linesUsed < pageSize) {\n const cmdLine = colors.dim(' $ ') + colors.success(insight.actionCommand) + \n (isSelected ? colors.dim(' ') + colors.highlight('[Enter to run]') : '');\n this.renderLine(' ' + cmdLine, width);\n linesUsed++;\n }\n \n // Related issues count (show if expanded)\n if (showDetails && insight.relatedIssues && insight.relatedIssues.length > 0 && linesUsed < pageSize) {\n this.renderLine(' ' + colors.dim(`Related issues: ${insight.relatedIssues.length}`), width);\n linesUsed++;\n }\n \n // Spacing between insights\n if (linesUsed < pageSize - 1) {\n this.renderLine('', width);\n linesUsed++;\n }\n \n itemIdx++;\n }\n \n // Fill remaining space\n while (linesUsed < pageSize) {\n this.renderLine('', width);\n linesUsed++;\n }\n \n // Pagination info\n this.renderSectionBorder(width);\n const itemsPerPage = Math.floor(pageSize / 4); // Approximate items per page\n const currentPage = Math.floor(scrollPos / itemsPerPage) + 1;\n const totalPages = Math.max(1, Math.ceil(insights.length / itemsPerPage));\n const pageInfo = totalPages > 1 \n ? colors.dim(`Page ${currentPage}/${totalPages}`)\n : '';\n this.renderLine(' ' + pageInfo, width);\n }\n \n // Summary stats with AI status\n this.renderSectionBorder(width);\n const warningInsights = this.state.guardianInsights.filter(i => i.type === 'warning').length;\n const suggestionInsights = this.state.guardianInsights.filter(i => i.type === 'suggestion').length;\n const celebrationInsights = this.state.guardianInsights.filter(i => i.type === 'celebration').length;\n \n const statsLine = [\n warningInsights > 0 ? colors.critical(`${warningInsights} warnings`) : null,\n suggestionInsights > 0 ? colors.highlight(`${suggestionInsights} suggestions`) : null,\n celebrationInsights > 0 ? colors.success(`${celebrationInsights} wins`) : null\n ].filter(Boolean).join(' ');\n \n // AI status indicator\n const aiStatus = isAIAvailable() \n ? colors.success('AI ✓')\n : colors.dim('AI off');\n \n const summaryContent = statsLine || colors.dim('Watching...');\n this.renderLine(' ' + summaryContent + ' ' + colors.dim('│') + ' ' + aiStatus, width);\n \n // Controls with AI hint\n this.renderSectionBorder(width);\n const key = (k: string) => colors.border('[') + colors.highlight(k) + colors.border(']');\n const aiHint = isAIAvailable() ? '' : colors.dim(' │ Set ANTHROPIC_API_KEY for smarter insights');\n this.renderLine(' ' + key('n/p') + colors.dim(' pages ') + \n key('b') + colors.dim(' back ') +\n key('x') + colors.dim(' clear') + aiHint, width);\n }\n\n /**\n * Render goals management view\n */\n private renderGoalsView(width: number, _height: number): void {\n const { goalsPanel } = this.state;\n \n // Title\n this.renderLine(' ' + colors.header('GOALS') + ' ' + colors.dim('Track progress, achieve targets') + ' ' + colors.border('[') + colors.highlight('G') + colors.border(']'), width);\n this.renderSectionBorder(width);\n \n // Input mode\n if (goalsPanel.inputMode === 'add') {\n this.renderLine(' ' + colors.highlight('New goal:') + ' ' + goalsPanel.inputBuffer + colors.highlight('▌'), width);\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.dim('Examples: \"Reduce auth bugs by 50%\", \"Eliminate critical issues\"'), width);\n this.renderLine(' ' + colors.dim('Press Enter to add, Escape to cancel'), width);\n return;\n }\n \n // Add button\n const key = (k: string) => colors.border('[') + colors.highlight(k) + colors.border(']');\n this.renderLine(' ' + key('a') + colors.dim(' Add new goal'), width);\n this.renderSectionBorder(width);\n \n // Goals list\n const activeGoals = goalsPanel.goals.filter(g => g.status === 'active');\n const achievedGoals = goalsPanel.goals.filter(g => g.status === 'achieved');\n const otherGoals = goalsPanel.goals.filter(g => g.status !== 'active' && g.status !== 'achieved');\n \n if (goalsPanel.goals.length === 0) {\n this.renderLine('', width);\n this.renderLine(' ' + colors.dim('No goals yet.'), width);\n this.renderLine(' ' + colors.dim('Press [a] to add your first goal, or wait for auto-generated goals.'), width);\n this.renderLine('', width);\n } else {\n // Active goals\n if (activeGoals.length > 0) {\n this.renderLine(' ' + colors.highlight('Active:'), width);\n activeGoals.forEach((goal, idx) => {\n const isSelected = goalsPanel.selectedIndex === idx;\n const progress = this.calculateGoalProgress(goal);\n const bar = this.renderProgressBar(progress, 10);\n const source = goal.autoGenerated ? colors.dim('[auto]') : colors.dim('[manual]');\n const prefix = isSelected ? colors.highlight('▶ ') : ' ';\n this.renderLine(prefix + bar + ' ' + goal.description.slice(0, width - 30) + ' ' + source, width);\n });\n this.renderLine('', width);\n }\n \n // Achieved goals\n if (achievedGoals.length > 0) {\n this.renderLine(' ' + colors.success('Achieved:') + colors.dim(' [x to remove]'), width);\n achievedGoals.slice(0, 5).forEach(goal => {\n this.renderLine(' [+] ' + goal.description.slice(0, width - 10), width);\n });\n if (achievedGoals.length > 5) {\n this.renderLine(' ' + colors.dim(`+${achievedGoals.length - 5} more`), width);\n }\n this.renderLine('', width);\n }\n \n // Other goals\n if (otherGoals.length > 0) {\n this.renderLine(' ' + colors.dim('Other:'), width);\n otherGoals.slice(0, 2).forEach(goal => {\n const icon = goal.status === 'failed' ? '[X]' : goal.status === 'paused' ? '[P]' : '•';\n this.renderLine(' ' + icon + ' ' + goal.description.slice(0, width - 20) + colors.dim(` (${goal.status})`), width);\n });\n }\n }\n \n // Controls\n this.renderSectionBorder(width);\n const selectedGoal = activeGoals[goalsPanel.selectedIndex];\n if (selectedGoal) {\n this.renderLine(' ' + key('j/k') + colors.dim(' navigate ') +\n key('Enter') + colors.dim(' complete ') + \n key('d') + colors.dim(' delete ') +\n key('b') + colors.dim(' back'), width);\n } else {\n this.renderLine(' ' + key('j/k') + colors.dim(' navigate ') +\n key('a') + colors.dim(' add ') +\n key('b') + colors.dim(' back'), width);\n }\n }\n\n /**\n * Render hypotheses management view\n */\n private renderHypothesesView(width: number, _height: number): void {\n const { hypothesesPanel } = this.state;\n \n // Title\n this.renderLine(' ' + colors.header('HYPOTHESES') + ' ' + colors.dim('Test theories about your codebase') + ' ' + colors.border('[') + colors.highlight('y') + colors.border(']'), width);\n this.renderSectionBorder(width);\n \n // Input mode\n if (hypothesesPanel.inputMode === 'add') {\n this.renderLine(' ' + colors.highlight('New hypothesis:') + ' ' + hypothesesPanel.inputBuffer + colors.highlight('▌'), width);\n this.renderSectionBorder(width);\n this.renderLine(' ' + colors.dim('Examples: \"Mondays have more bugs\", \"Code reviews reduce issues\"'), width);\n this.renderLine(' ' + colors.dim('Press Enter to add, Escape to cancel'), width);\n return;\n }\n \n // Add button\n const key = (k: string) => colors.border('[') + colors.highlight(k) + colors.border(']');\n this.renderLine(' ' + key('a') + colors.dim(' Add new hypothesis'), width);\n this.renderSectionBorder(width);\n \n // Hypotheses list\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 if (hypothesesPanel.hypotheses.length === 0) {\n this.renderLine('', width);\n this.renderLine(' ' + colors.dim('No hypotheses yet.'), width);\n this.renderLine(' ' + colors.dim('Press [a] to add your first hypothesis.'), width);\n this.renderLine(' ' + colors.dim('The guardian will collect evidence and update confidence over time.'), width);\n this.renderLine('', width);\n } else {\n // Testing hypotheses\n if (testing.length > 0) {\n this.renderLine(' ' + colors.highlight('Testing:'), width);\n testing.forEach((hypo, idx) => {\n const isSelected = hypothesesPanel.selectedIndex === idx;\n const conf = Math.round(hypo.confidence * 100);\n const confColor = conf >= 70 ? colors.success : conf >= 40 ? colors.running : colors.serious;\n const prefix = isSelected ? colors.highlight('▶ ') : ' ';\n this.renderLine(prefix + '[?] \"' + hypo.statement.slice(0, width - 35) + '\" ' + confColor(`(${conf}%)`), width);\n this.renderLine(' ' + colors.dim(`Evidence: ${hypo.evidenceCount} points`), width);\n });\n this.renderLine('', width);\n }\n \n // Validated hypotheses\n if (validated.length > 0) {\n this.renderLine(' ' + colors.success('Validated:') + colors.dim(' [r to remove]'), width);\n validated.slice(0, 3).forEach(hypo => {\n this.renderLine(' [+] \"' + hypo.statement.slice(0, width - 15) + '\"', width);\n });\n if (validated.length > 3) {\n this.renderLine(' ' + colors.dim(`+${validated.length - 3} more`), width);\n }\n this.renderLine('', width);\n }\n \n // Invalidated hypotheses\n if (invalidated.length > 0) {\n this.renderLine(' ' + colors.serious('Invalidated:') + colors.dim(' [r to remove]'), width);\n invalidated.slice(0, 2).forEach(hypo => {\n this.renderLine(' [X] \"' + hypo.statement.slice(0, width - 15) + '\"', width);\n });\n if (invalidated.length > 2) {\n this.renderLine(' ' + colors.dim(`+${invalidated.length - 2} more`), width);\n }\n }\n }\n \n // Controls\n this.renderSectionBorder(width);\n const selectedHypo = testing[hypothesesPanel.selectedIndex];\n if (selectedHypo) {\n this.renderLine(' ' + key('j/k') + colors.dim(' navigate ') +\n key('v') + colors.dim(' validate ') + \n key('x') + colors.dim(' invalidate ') +\n key('d') + colors.dim(' delete ') +\n key('b') + colors.dim(' back'), width);\n } else {\n this.renderLine(' ' + key('j/k') + colors.dim(' navigate ') +\n key('a') + colors.dim(' add ') +\n key('b') + colors.dim(' back'), width);\n }\n }\n\n /**\n * Calculate goal progress correctly for both increase and reduction goals.\n * For reduction goals (startValue > target): progress = (startValue - currentValue) / (startValue - target)\n * For increase goals (startValue <= target): progress = currentValue / target\n */\n private calculateGoalProgress(goal: { startValue?: number | undefined; currentValue: number; target: number }): number {\n if (goal.target <= 0) return 0;\n \n const startValue = goal.startValue ?? goal.currentValue;\n \n // Reduction goal: startValue > target (e.g., reduce from 20 to 10)\n if (startValue > goal.target) {\n const totalReduction = startValue - goal.target;\n const actualReduction = startValue - goal.currentValue;\n return Math.round((actualReduction / totalReduction) * 100);\n }\n \n // Increase goal: progress toward target\n return Math.round((goal.currentValue / goal.target) * 100);\n }\n\n /**\n * Render a simple progress bar\n */\n private renderProgressBar(percent: number, width: number): string {\n const clamped = Math.max(0, Math.min(100, percent)); // Clamp to 0-100\n const filled = Math.round((clamped / 100) * width);\n const empty = width - filled;\n return colors.border('[') + \n colors.success('█'.repeat(filled)) + \n colors.dim('░'.repeat(empty)) + \n colors.border(']');\n }\n\n /**\n * Render memory tree view - visual hierarchy of issues\n */\n private renderMemoryTreeView(width: number, _height: number): void {\n const { memoryTree } = this.state;\n const stats = memoryTree.stats;\n const issues = memoryTree.issues;\n const patterns = memoryTree.globalPatterns;\n \n // Title\n const totalIssues = stats?.totalIssues || issues.length;\n this.renderLine(' ' + colors.header('MEMORY TREE') + ' ' + colors.dim(`[${totalIssues} issues]`) + ' ' + colors.border('[') + colors.highlight('t') + colors.border(']'), width);\n this.renderSectionBorder(width);\n \n if (!memoryTree.loaded) {\n this.renderLine(' ' + colors.dim('Loading memory data...'), width);\n return;\n }\n \n if (issues.length === 0 && patterns.length === 0) {\n this.renderLine(' ' + colors.dim('No issues in memory yet.'), width);\n this.renderLine(' ' + colors.dim('Run a scan to populate the memory tree.'), width);\n return;\n }\n \n // Tree rendering\n const tree = box;\n const selected = memoryTree.selectedNode;\n const expanded = memoryTree.expandedNodes;\n \n // Group issues by severity\n const bySeverity = { critical: [] as StoredIssue[], serious: [] as StoredIssue[], moderate: [] as StoredIssue[], low: [] as StoredIssue[] };\n for (const issue of issues) {\n const sev = issue.severity;\n if (sev === 'critical') bySeverity.critical.push(issue);\n else if (sev === 'serious') bySeverity.serious.push(issue);\n else if (sev === 'moderate') bySeverity.moderate.push(issue);\n else if (sev === 'low') bySeverity.low.push(issue);\n }\n \n // Group issues by file\n const byFile = new Map<string, StoredIssue[]>();\n for (const issue of issues) {\n if (!byFile.has(issue.file)) {\n byFile.set(issue.file, []);\n }\n byFile.get(issue.file)!.push(issue);\n }\n const sortedFiles = Array.from(byFile.entries())\n .sort((a, b) => b[1].length - a[1].length)\n .slice(0, 10);\n \n // Group issues by agent\n const byAgent = new Map<string, StoredIssue[]>();\n for (const issue of issues) {\n if (!byAgent.has(issue.agent)) {\n byAgent.set(issue.agent, []);\n }\n byAgent.get(issue.agent)!.push(issue);\n }\n const sortedAgents = Array.from(byAgent.entries())\n .sort((a, b) => b[1].length - a[1].length);\n \n // Severity bar helper\n const severityBar = (count: number, max: number, barWidth: number = 16): string => {\n const filled = max > 0 ? Math.round((count / max) * barWidth) : 0;\n return '█'.repeat(filled) + '░'.repeat(barWidth - filled);\n };\n \n const maxCount = Math.max(\n bySeverity.critical.length,\n bySeverity.serious.length,\n bySeverity.moderate.length,\n bySeverity.low.length,\n 1\n );\n \n // === SEVERITY SECTION ===\n const sevExpanded = expanded.has('severity');\n const sevIcon = sevExpanded ? '▼' : '▶';\n const sevSelected = selected === 'severity';\n const sevPrefix = sevSelected ? colors.selected('→') : ' ';\n this.renderLine(` ${sevPrefix} ${sevIcon} ` + (sevSelected ? colors.selected('By Severity') : colors.header('By Severity')), width);\n \n if (sevExpanded) {\n // Critical\n const critSelected = selected === 'severity-critical';\n const critPrefix = critSelected ? colors.selected('→') : ' ';\n const critCount = bySeverity.critical.length;\n const critBar = colors.critical(severityBar(critCount, maxCount));\n this.renderLine(` ${critPrefix} ${tree.vertical} ${critSelected ? colors.selected('critical') : colors.critical('critical')} (${critCount}) ${critBar}`, width);\n \n // Show individual critical issues if expanded\n if (expanded.has('severity-critical') && bySeverity.critical.length > 0) {\n const critIssues = bySeverity.critical.slice(0, 5);\n critIssues.forEach((issue, idx) => {\n const isLast = idx === critIssues.length - 1;\n const connector = isLast ? tree.bottomLeft : tree.leftT;\n const issueId = `severity-critical-${issue.id}`;\n const issueSelected = selected === issueId;\n const prefix = issueSelected ? colors.selected('→') : ' ';\n const filename = issue.file.split('/').pop() || issue.file;\n const line = issue.line ? `:${issue.line}` : '';\n const desc = issue.issue.slice(0, 35) + (issue.issue.length > 35 ? '...' : '');\n this.renderLine(` ${prefix} ${tree.vertical} ${connector}${tree.horizontal} ${issueSelected ? colors.selected(`${filename}${line}`) : colors.dim(`${filename}${line}`)} - ${colors.critical(desc)}`, width);\n });\n if (bySeverity.critical.length > 5) {\n this.renderLine(` ${tree.vertical} ${colors.dim(`... ${bySeverity.critical.length - 5} more`)}`, width);\n }\n }\n \n // Serious\n const serSelected = selected === 'severity-serious';\n const serPrefix = serSelected ? colors.selected('→') : ' ';\n const serCount = bySeverity.serious.length;\n const serBar = colors.serious(severityBar(serCount, maxCount));\n this.renderLine(` ${serPrefix} ${tree.vertical} ${serSelected ? colors.selected('serious') : colors.serious('serious')} (${serCount}) ${serBar}`, width);\n \n // Moderate\n const modSelected = selected === 'severity-moderate';\n const modPrefix = modSelected ? colors.selected('→') : ' ';\n const modCount = bySeverity.moderate.length;\n const modBar = colors.moderate(severityBar(modCount, maxCount));\n this.renderLine(` ${modPrefix} ${tree.vertical} ${modSelected ? colors.selected('moderate') : colors.moderate('moderate')} (${modCount}) ${modBar}`, width);\n \n // Low\n const lowSelected = selected === 'severity-low';\n const lowPrefix = lowSelected ? colors.selected('→') : ' ';\n const lowCount = bySeverity.low.length;\n const lowBar = colors.low(severityBar(lowCount, maxCount));\n this.renderLine(` ${lowPrefix} ${tree.bottomLeft} ${lowSelected ? colors.selected('low') : colors.low('low')} (${lowCount}) ${lowBar}`, width);\n }\n \n // === FILES SECTION ===\n const filesExpanded = expanded.has('files');\n const filesIcon = filesExpanded ? '▼' : '▶';\n const filesSelected = selected === 'files';\n const filesPrefix = filesSelected ? colors.selected('→') : ' ';\n this.renderLine(` ${filesPrefix} ${filesIcon} ` + (filesSelected ? colors.selected('By File (Hot Spots)') : colors.header('By File (Hot Spots)')), width);\n \n if (filesExpanded && sortedFiles.length > 0) {\n const maxFileCount = sortedFiles[0]?.[1].length || 1;\n sortedFiles.forEach(([file, fileIssues], idx) => {\n const isLast = idx === sortedFiles.length - 1;\n const connector = isLast ? tree.bottomLeft : tree.leftT;\n const fileId = `file-${file}`;\n const fileNodeSelected = selected === fileId;\n const prefix = fileNodeSelected ? colors.selected('→') : ' ';\n const filename = file.split('/').pop() || file;\n const count = fileIssues.length;\n const fileBar = severityBar(count, maxFileCount);\n const hasCritical = fileIssues.some(i => i.severity === 'critical');\n const barColor = hasCritical ? colors.critical(fileBar) : colors.moderate(fileBar);\n this.renderLine(` ${prefix} ${connector}${tree.horizontal} ${fileNodeSelected ? colors.selected(filename) : filename} (${count}) ${barColor}`, width);\n });\n }\n \n // === AGENTS SECTION ===\n const agentsExpanded = expanded.has('agents');\n const agentsIcon = agentsExpanded ? '▼' : '▶';\n const agentsSelected = selected === 'agents';\n const agentsPrefix = agentsSelected ? colors.selected('→') : ' ';\n this.renderLine(` ${agentsPrefix} ${agentsIcon} ` + (agentsSelected ? colors.selected('By Agent') : colors.header('By Agent')), width);\n \n if (agentsExpanded && sortedAgents.length > 0) {\n sortedAgents.forEach(([agent, agentIssues], idx) => {\n const isLast = idx === sortedAgents.length - 1;\n const connector = isLast ? tree.bottomLeft : tree.leftT;\n const agentId = `agent-${agent}`;\n const agentSelected = selected === agentId;\n const prefix = agentSelected ? colors.selected('→') : ' ';\n this.renderLine(` ${prefix} ${connector}${tree.horizontal} ${agentSelected ? colors.selected(agent) : agent} (${agentIssues.length})`, width);\n });\n }\n \n // === CROSS-PROJECT PATTERNS SECTION ===\n const patternsExpanded = expanded.has('patterns');\n const patternsIcon = patternsExpanded ? '▼' : '▶';\n const patternsSelected = selected === 'patterns';\n const patternsPrefix = patternsSelected ? colors.selected('→') : ' ';\n const patternCount = patterns.length;\n this.renderLine(` ${patternsPrefix} ${patternsIcon} ` + (patternsSelected ? colors.selected(`Cross-Project Patterns (${patternCount} recurring)`) : colors.header(`Cross-Project Patterns (${patternCount} recurring)`)), width);\n \n if (patternsExpanded && patterns.length > 0) {\n patterns.slice(0, 5).forEach((pattern, idx) => {\n const isLast = idx === Math.min(4, patterns.length - 1);\n const connector = isLast ? tree.bottomLeft : tree.leftT;\n const patternId = `pattern-${pattern.id}`;\n const patternNodeSelected = selected === patternId;\n const prefix = patternNodeSelected ? colors.selected('→') : ' ';\n const desc = pattern.pattern.slice(0, 40) + (pattern.pattern.length > 40 ? '...' : '');\n const projectsText = `seen in ${pattern.projects.length} projects`;\n this.renderLine(` ${prefix} ${connector}${tree.horizontal} ${patternNodeSelected ? colors.selected(`\"${desc}\"`) : colors.dim(`\"${desc}\"`)} - ${colors.dim(projectsText)}`, width);\n });\n if (patterns.length > 5) {\n this.renderLine(` ${colors.dim(`... ${patterns.length - 5} more patterns`)}`, width);\n }\n }\n \n // Summary stats\n this.renderLine('', width);\n this.renderSectionBorder(width);\n const trend = stats?.improvementTrend || 'unknown';\n const trendIcon = trend === 'improving' ? colors.success('↑') : trend === 'declining' ? colors.critical('↓') : colors.dim('→');\n const trendText = trend === 'improving' ? colors.success('Improving') : trend === 'declining' ? colors.critical('Declining') : colors.dim('Stable');\n const resolvedCount = stats?.resolvedCount || 0;\n this.renderLine(` ${colors.dim('Trend:')} ${trendIcon} ${trendText} ${colors.dim('| Resolved:')} ${colors.success(resolvedCount.toString())} ${colors.dim('| Historical:')} ${colors.dim((stats?.historicalIssues || 0).toString())}`, width);\n }\n\n /**\n * Get all visible memory tree nodes for navigation\n */\n private getMemoryTreeNodes(): Array<{ id: string; level: number }> {\n const nodes: Array<{ id: string; level: number }> = [];\n const expanded = this.state.memoryTree.expandedNodes;\n const issues = this.state.memoryTree.issues;\n const patterns = this.state.memoryTree.globalPatterns;\n \n // Severity section\n nodes.push({ id: 'severity', level: 0 });\n if (expanded.has('severity')) {\n nodes.push({ id: 'severity-critical', level: 1 });\n if (expanded.has('severity-critical')) {\n const criticalIssues = issues.filter(i => i.severity === 'critical').slice(0, 5);\n criticalIssues.forEach(issue => {\n nodes.push({ id: `severity-critical-${issue.id}`, level: 2 });\n });\n }\n nodes.push({ id: 'severity-serious', level: 1 });\n nodes.push({ id: 'severity-moderate', level: 1 });\n nodes.push({ id: 'severity-low', level: 1 });\n }\n \n // Files section\n nodes.push({ id: 'files', level: 0 });\n if (expanded.has('files')) {\n const byFile = new Map<string, StoredIssue[]>();\n for (const issue of issues) {\n if (!byFile.has(issue.file)) byFile.set(issue.file, []);\n byFile.get(issue.file)!.push(issue);\n }\n const sortedFiles = Array.from(byFile.keys())\n .sort((a, b) => (byFile.get(b)?.length || 0) - (byFile.get(a)?.length || 0))\n .slice(0, 10);\n sortedFiles.forEach(file => {\n nodes.push({ id: `file-${file}`, level: 1 });\n });\n }\n \n // Agents section\n nodes.push({ id: 'agents', level: 0 });\n if (expanded.has('agents')) {\n const byAgent = new Map<string, StoredIssue[]>();\n for (const issue of issues) {\n if (!byAgent.has(issue.agent)) byAgent.set(issue.agent, []);\n byAgent.get(issue.agent)!.push(issue);\n }\n const sortedAgents = Array.from(byAgent.keys())\n .sort((a, b) => (byAgent.get(b)?.length || 0) - (byAgent.get(a)?.length || 0));\n sortedAgents.forEach(agent => {\n nodes.push({ id: `agent-${agent}`, level: 1 });\n });\n }\n \n // Patterns section\n nodes.push({ id: 'patterns', level: 0 });\n if (expanded.has('patterns')) {\n patterns.slice(0, 5).forEach(pattern => {\n nodes.push({ id: `pattern-${pattern.id}`, level: 1 });\n });\n }\n \n return nodes;\n }\n\n /**\n * Toggle expand/collapse on selected memory tree node\n */\n private toggleMemoryTreeNode(): void {\n const selected = this.state.memoryTree.selectedNode;\n const expanded = this.state.memoryTree.expandedNodes;\n \n // Only toggle on expandable nodes (top-level sections and severity categories)\n const expandableNodes = ['severity', 'files', 'agents', 'patterns', 'severity-critical', 'severity-serious', 'severity-moderate', 'severity-low'];\n \n if (expandableNodes.includes(selected)) {\n if (expanded.has(selected)) {\n expanded.delete(selected);\n } else {\n expanded.add(selected);\n }\n }\n }\n\n /**\n * Refresh skills data from the system\n */\n private async refreshSkillsData(): Promise<void> {\n const now = Date.now();\n // Debounce refreshes\n if (now - this.state.skillsBrowser.lastRefresh < 1000) {\n return;\n }\n this.state.skillsBrowser.lastRefresh = now;\n \n try {\n // Load installed skills with usage stats\n const installed = await listInstalledSkills();\n const contextState = await loadContextState();\n \n this.state.skillsBrowser.installedSkills = installed.map(skill => ({\n name: skill.name,\n description: skill.description,\n path: skill.path || '',\n installedFrom: skill.installedFrom || '',\n installedAt: skill.installedAt || '',\n timesApplied: contextState.skills?.[skill.name]?.timesApplied || 0\n }));\n \n // Load global skills\n const globalSkills = await listGlobalSkills();\n this.state.skillsBrowser.globalSkills = globalSkills.map(skill => ({\n name: skill.name,\n description: skill.description,\n path: skill.path || '',\n installedFrom: skill.installedFrom || '',\n installedAt: skill.installedAt || '',\n }));\n \n // Detect stack and get suggestions\n const workDir = getWorkingDirectory(undefined, true);\n const stack = await detectStack(workDir);\n \n this.state.skillsBrowser.suggestedSkills = stack.suggestedSkills;\n // Only set defined values to avoid exactOptionalPropertyTypes issues\n const detectedStack: { framework?: string; language?: string; database?: string } = {};\n if (stack.framework) detectedStack.framework = stack.framework;\n if (stack.language) detectedStack.language = stack.language;\n if (stack.database) detectedStack.database = stack.database;\n this.state.skillsBrowser.detectedStack = detectedStack;\n \n // Load categories\n this.state.skillsBrowser.categories = getSkillCategories();\n \n this.render();\n } catch (error) {\n this.addActivity(`Skills refresh error: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Refresh goals data from guardian state\n */\n private async refreshGoalsData(): Promise<void> {\n const now = Date.now();\n const isInitialLoad = this.state.goalsPanel.lastRefresh === 0;\n if (now - this.state.goalsPanel.lastRefresh < 500) {\n return;\n }\n this.state.goalsPanel.lastRefresh = now;\n \n try {\n const workDir = getWorkingDirectory(undefined, true);\n const guardianState = getGuardianState(workDir);\n await guardianState.load();\n \n const goals = guardianState.getAllGoals();\n const activeCount = goals.filter(g => g.status === 'active').length;\n const achievedCount = goals.filter(g => g.status === 'achieved').length;\n \n this.state.goalsPanel.goals = goals.map(g => {\n const base = {\n id: g.id,\n description: g.description,\n type: g.type,\n target: g.target,\n currentValue: g.currentValue,\n status: g.status,\n autoGenerated: g.autoGenerated,\n updatedAt: g.updatedAt\n };\n return g.category ? { ...base, category: g.category } : base;\n });\n \n // Log if goals were loaded on initial startup\n if (goals.length > 0 && isInitialLoad) {\n this.addActivity(`Loaded ${activeCount} active goal${activeCount !== 1 ? 's' : ''}, ${achievedCount} achieved`);\n }\n \n this.render();\n } catch (error) {\n this.addActivity(`Goals refresh error: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Refresh hypotheses data from guardian state\n */\n private async refreshHypothesesData(): Promise<void> {\n const now = Date.now();\n const isInitialLoad = this.state.hypothesesPanel.lastRefresh === 0;\n if (now - this.state.hypothesesPanel.lastRefresh < 500) {\n return;\n }\n this.state.hypothesesPanel.lastRefresh = now;\n \n try {\n const workDir = getWorkingDirectory(undefined, true);\n const guardianState = getGuardianState(workDir);\n await guardianState.load();\n \n const hypotheses = guardianState.getAllHypotheses();\n const testingCount = hypotheses.filter(h => h.status === 'testing' || h.status === 'proposed').length;\n const validatedCount = hypotheses.filter(h => h.status === 'validated').length;\n \n this.state.hypothesesPanel.hypotheses = hypotheses.map(h => {\n const base = {\n id: h.id,\n statement: h.statement,\n confidence: h.confidence,\n status: h.status,\n evidenceCount: h.evidence.length,\n updatedAt: h.updatedAt\n };\n return h.category ? { ...base, category: h.category } : base;\n });\n \n // Log if hypotheses were loaded on initial startup\n if (hypotheses.length > 0 && isInitialLoad) {\n this.addActivity(`Loaded ${testingCount} testing hypothesis${testingCount !== 1 ? 'es' : ''}, ${validatedCount} validated`);\n }\n \n this.render();\n } catch (error) {\n this.addActivity(`Hypotheses refresh error: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Load memory tree data from issue store and global patterns\n */\n private async loadMemoryTreeData(): Promise<void> {\n const now = Date.now();\n // Rate limit refreshes\n if (now - this.state.memoryTree.lastRefresh < 500) {\n return;\n }\n this.state.memoryTree.lastRefresh = now;\n \n try {\n const workDir = getWorkingDirectory(undefined, true);\n \n // Load recent issues, stats, and global patterns in parallel\n const [issues, stats, patterns] = await Promise.all([\n getRecentIssues({ workDir, limit: 200, daysBack: 30 }),\n getMemoryStats(workDir),\n findCrossProjectPatterns(2)\n ]);\n \n this.state.memoryTree.issues = issues;\n this.state.memoryTree.stats = stats;\n this.state.memoryTree.globalPatterns = patterns;\n this.state.memoryTree.loaded = true;\n \n if (!this.state.memoryTree.loaded) {\n this.addActivity(`Memory loaded: ${issues.length} issues, ${patterns.length} patterns`);\n }\n \n this.render();\n } catch (error) {\n this.addActivity(`Memory load error: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Add a new goal from the UI\n * \n * Goals are tracked automatically by the Guardian Agent based on scan results.\n * The goal description is semantically matched to issue types during scans.\n */\n private async addGoalFromUI(description: string): Promise<void> {\n if (!description.trim()) return;\n \n try {\n const workDir = getWorkingDirectory(undefined, true);\n const guardianState = getGuardianState(workDir);\n await guardianState.load();\n \n // Parse goal type from description\n const reductionMatch = description.match(/reduce.*?(\\d+)%/i);\n const streakMatch = description.match(/(\\d+)\\s*days?\\s*(streak|in a row)/i);\n \n // Default is reduction goal (reduce issues to zero)\n let goalType: 'streak' | 'reduction' | 'score' | 'custom' = 'reduction';\n let target = 0; // Target is zero issues by default\n let metric = 'semantic'; // Use semantic matching for natural language goals\n \n if (reductionMatch && reductionMatch[1]) {\n goalType = 'reduction';\n const percent = parseInt(reductionMatch[1], 10);\n // Will be calculated as percentage of startValue\n metric = 'reduction_percent';\n target = percent;\n } else if (streakMatch && streakMatch[1]) {\n goalType = 'streak';\n target = parseInt(streakMatch[1], 10);\n metric = 'days_streak';\n }\n \n // Get baseline count from current scan for semantic goals\n let startValue = 0;\n if (metric === 'semantic') {\n startValue = await this.measureSemanticGoalBaseline(description.trim(), workDir);\n }\n \n const deadline = new Date();\n deadline.setDate(deadline.getDate() + 14);\n \n const goal: Goal = {\n id: `goal-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n description: description.trim(),\n type: goalType,\n metric,\n target,\n currentValue: startValue,\n startValue: startValue,\n status: 'active',\n autoGenerated: false,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n deadline: deadline.toISOString()\n };\n \n await guardianState.addGoal(goal);\n const progressText = startValue > 0 ? ` (tracking ${startValue} issues)` : '';\n this.addActivity(`Goal added: ${description.slice(0, 40)}...${progressText}`);\n await this.refreshGoalsData();\n } catch (error) {\n this.addActivity(`Failed to add goal: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * Measure baseline issue count for a semantic goal\n */\n private async measureSemanticGoalBaseline(description: string, workDir: string): Promise<number> {\n try {\n const { searchIssues } = await import('../memory/issue-store.js');\n const issues = await searchIssues('', {\n workDir,\n limit: 1000,\n includeResolved: false,\n });\n \n const desc = description.toLowerCase();\n \n // Dead code / unused code\n if (desc.includes('dead code') || desc.includes('unused') || desc.includes('remove unused')) {\n return issues.filter(r => {\n const msg = r.issue.issue.toLowerCase();\n return msg.includes('unused') || msg.includes('dead code') || \n msg.includes('never used') || msg.includes('unreachable') ||\n msg.includes('no-unused') || msg.includes('defined but never');\n }).length;\n }\n \n // Security\n if (desc.includes('security') || desc.includes('vulnerab')) {\n return issues.filter(r => \n r.issue.agent === 'security' ||\n r.issue.severity === 'critical'\n ).length;\n }\n \n // Type safety\n if (desc.includes('type') || desc.includes('typescript') || desc.includes('any type')) {\n return issues.filter(r => \n r.issue.agent === 'typecheck' ||\n r.issue.issue.toLowerCase().includes('type')\n ).length;\n }\n \n // Tests\n if (desc.includes('test') || desc.includes('coverage')) {\n return issues.filter(r => \n r.issue.agent === 'test' ||\n r.issue.issue.toLowerCase().includes('test')\n ).length;\n }\n \n // Performance\n if (desc.includes('performance') || desc.includes('slow') || desc.includes('optimize')) {\n return issues.filter(r => \n r.issue.agent === 'performance'\n ).length;\n }\n \n // Accessibility\n if (desc.includes('accessibility') || desc.includes('a11y')) {\n return issues.filter(r => \n r.issue.agent === 'accessibility'\n ).length;\n }\n \n // Bugs\n if (desc.includes('bug') || desc.includes('fix') || desc.includes('error')) {\n return issues.filter(r => \n r.issue.agent === 'bug-finding' ||\n r.issue.severity === 'critical' ||\n r.issue.severity === 'serious'\n ).length;\n }\n \n // Default: all issues\n return issues.length;\n } catch {\n return 0;\n }\n }\n\n /**\n * Complete a goal from the UI\n */\n private async completeGoalFromUI(goalId: string): Promise<void> {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const guardianState = getGuardianState(workDir);\n await guardianState.load();\n \n const goals = guardianState.getAllGoals();\n const goal = goals.find(g => g.id === goalId);\n \n if (goal) {\n await guardianState.updateGoal(goalId, {\n status: 'achieved',\n currentValue: goal.target,\n achievedAt: new Date().toISOString()\n });\n this.addActivity(`Goal achieved: ${goal.description.slice(0, 30)}...`);\n await this.refreshGoalsData();\n }\n } catch (error) {\n this.addActivity(`Failed to complete goal: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Delete a goal from the UI\n */\n private async deleteGoalFromUI(goalId: string): Promise<void> {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const guardianState = getGuardianState(workDir);\n await guardianState.load();\n \n await guardianState.updateGoal(goalId, { status: 'rejected' });\n this.addActivity('Goal removed');\n await this.refreshGoalsData();\n } catch (error) {\n this.addActivity(`Failed to delete goal: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Add a new hypothesis from the UI\n */\n private async addHypothesisFromUI(statement: string): Promise<void> {\n if (!statement.trim()) return;\n \n try {\n const workDir = getWorkingDirectory(undefined, true);\n const guardianState = getGuardianState(workDir);\n await guardianState.load();\n \n const hypothesis: Hypothesis = {\n id: `hypo-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n statement: statement.trim(),\n confidence: 0.5,\n status: 'testing',\n evidence: [],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n testCriteria: 'Collect evidence from scans'\n };\n \n await guardianState.addHypothesis(hypothesis);\n this.addActivity(`Hypothesis added: ${statement.slice(0, 40)}...`);\n await this.refreshHypothesesData();\n } catch (error) {\n this.addActivity(`Failed to add hypothesis: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Validate/invalidate a hypothesis from the UI\n */\n private async updateHypothesisFromUI(hypoId: string, action: 'validate' | 'invalidate' | 'delete'): Promise<void> {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const guardianState = getGuardianState(workDir);\n await guardianState.load();\n \n if (action === 'validate') {\n await guardianState.updateHypothesis(hypoId, { status: 'validated', confidence: 0.9 });\n this.addActivity('Hypothesis validated');\n } else if (action === 'invalidate') {\n await guardianState.updateHypothesis(hypoId, { status: 'invalidated', confidence: 0.1 });\n this.addActivity('Hypothesis invalidated');\n } else {\n await guardianState.updateHypothesis(hypoId, { status: 'retired' });\n this.addActivity('Hypothesis removed');\n }\n \n await this.refreshHypothesesData();\n } catch (error) {\n this.addActivity(`Failed to update hypothesis: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Reactivate a goal (undo completion)\n */\n private async reactivateGoalFromUI(goalId: string): Promise<void> {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const guardianState = getGuardianState(workDir);\n await guardianState.load();\n \n const goals = guardianState.getAllGoals();\n const goal = goals.find(g => g.id === goalId);\n \n if (goal) {\n await guardianState.updateGoal(goalId, {\n status: 'active',\n achievedAt: undefined\n });\n this.addActivity(`Goal reactivated: ${goal.description.slice(0, 30)}...`);\n await this.refreshGoalsData();\n }\n } catch (error) {\n this.addActivity(`Failed to reactivate goal: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Reactivate a hypothesis (undo validation/invalidation)\n */\n private async reactivateHypothesisFromUI(hypoId: string): Promise<void> {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const guardianState = getGuardianState(workDir);\n await guardianState.load();\n \n const hypotheses = guardianState.getAllHypotheses();\n const hypothesis = hypotheses.find(h => h.id === hypoId);\n \n if (hypothesis) {\n await guardianState.updateHypothesis(hypoId, {\n status: 'testing',\n confidence: 0.5,\n validatedAt: undefined\n });\n this.addActivity(`Hypothesis reactivated: ${hypothesis.statement.slice(0, 40)}...`);\n await this.refreshHypothesesData();\n }\n } catch (error) {\n this.addActivity(`Failed to reactivate hypothesis: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Handle skills panel navigation\n */\n private skillsPanelNext(): void {\n const panels: Array<'installed' | 'global' | 'suggested' | 'categories'> = ['installed', 'global', 'suggested', 'categories'];\n const currentIdx = panels.indexOf(this.state.skillsBrowser.activePanel);\n const nextPanel = panels[(currentIdx + 1) % panels.length];\n this.state.skillsBrowser.activePanel = nextPanel ?? 'installed';\n this.state.skillsBrowser.selectedIndex = 0;\n }\n\n /**\n * Get max items in current skills panel\n */\n private getSkillsPanelMaxItems(): number {\n const { skillsBrowser } = this.state;\n switch (skillsBrowser.activePanel) {\n case 'installed':\n return skillsBrowser.installedSkills.length;\n case 'global':\n return skillsBrowser.globalSkills.length;\n case 'suggested':\n return skillsBrowser.suggestedSkills.length;\n case 'categories':\n return skillsBrowser.selectedCategory \n ? skillsBrowser.categorySkills.length \n : skillsBrowser.categories.length;\n default:\n return 0;\n }\n }\n\n /**\n * Handle Enter key in skills view\n */\n private async handleSkillsEnter(): Promise<void> {\n const { skillsBrowser } = this.state;\n \n switch (skillsBrowser.activePanel) {\n case 'installed': {\n // Show info about installed skill (could expand to show details)\n const skill = skillsBrowser.installedSkills[skillsBrowser.selectedIndex];\n if (skill) {\n this.addActivity(`Skill info: ${skill.name} from ${skill.installedFrom}`);\n }\n break;\n }\n \n case 'global': {\n // Show info about global skill - offer to remove\n const skill = skillsBrowser.globalSkills[skillsBrowser.selectedIndex];\n if (skill) {\n await this.showGlobalSkillDialog(skill);\n }\n break;\n }\n \n case 'suggested': {\n // Install suggested skill\n const skillSource = skillsBrowser.suggestedSkills[skillsBrowser.selectedIndex];\n if (skillSource) {\n await this.showSkillInstallDialog(skillSource);\n }\n break;\n }\n \n case 'categories': {\n if (skillsBrowser.selectedCategory) {\n // Install skill from category\n const skillSource = skillsBrowser.categorySkills[skillsBrowser.selectedIndex];\n if (skillSource) {\n await this.showSkillInstallDialog(skillSource);\n }\n } else {\n // Drill into category\n const category = skillsBrowser.categories[skillsBrowser.selectedIndex];\n if (category) {\n skillsBrowser.selectedCategory = category.name;\n skillsBrowser.categorySkills = getSkillsByCategory(category.name);\n skillsBrowser.selectedIndex = 0;\n }\n }\n break;\n }\n }\n }\n\n /**\n * Handle back navigation in skills view\n */\n private handleSkillsBack(): void {\n if (this.state.skillsBrowser.selectedCategory) {\n this.state.skillsBrowser.selectedCategory = null;\n this.state.skillsBrowser.categorySkills = [];\n this.state.skillsBrowser.selectedIndex = 0;\n } else {\n this.goBack();\n }\n }\n\n /**\n * Show skill installation dialog\n */\n private async showSkillInstallDialog(skillSource: string): Promise<void> {\n this.isActive = false;\n process.stdout.write('\\x1b[2J\\x1b[H');\n \n const v = colors.border(box.vertical);\n const w = Math.max(60, Math.min(80, (process.stdout.columns || 80) - 4));\n \n const pLine = (content: string) => {\n const len = visibleLength(content);\n console.log(v + ' ' + content + ' '.repeat(Math.max(0, w - 3 - len)) + v);\n };\n \n // Parse skill source\n const parts = skillSource.split(' ');\n const repo = parts[0] ?? skillSource; // Fallback to full source if no space\n const skillName = parts[1] ?? '';\n \n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(colors.header('INSTALL SKILL'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(colors.dim('Repository: ') + colors.highlight(repo));\n if (skillName) {\n pLine(colors.dim('Skill: ') + colors.highlight(skillName));\n }\n pLine('');\n pLine(colors.dim('This will clone the repository and install the skill'));\n pLine(colors.dim('to .trie/skills/ in your project.'));\n pLine('');\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(colors.highlight('Install this skill? ') + colors.dim('(y/n)'));\n pLine('');\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n \n // Wait for user input\n const answer = await new Promise<string>((resolve) => {\n const handler = (_chunk: string, key: { name: string }) => {\n if (key.name === 'y' || key.name === 'n' || key.name === 'escape' || key.name === 'q') {\n input.removeListener('keypress', handler);\n resolve(key.name);\n }\n };\n input.on('keypress', handler);\n });\n \n if (answer !== 'y') {\n this.isActive = true;\n this.render();\n return;\n }\n \n // Show installing state\n process.stdout.write('\\x1b[2J\\x1b[H');\n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(colors.header('INSTALLING SKILL'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(colors.running('Cloning repository...'));\n pLine('');\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n \n this.state.skillsBrowser.installing = true;\n this.state.skillsBrowser.installStatus = 'Cloning repository...';\n \n try {\n const result = await installSkill(repo, skillName || undefined);\n \n if (result.success && result.name) {\n this.state.skillsBrowser.installStatus = `Installed: ${result.name}`;\n this.addActivity(`Installed skill: ${result.name}`);\n \n // Show success\n process.stdout.write('\\x1b[2J\\x1b[H');\n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(colors.success('SKILL INSTALLED'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(colors.success('✓ ') + 'Skill: ' + colors.highlight(result.name || 'unknown'));\n pLine(colors.dim(' Path: ') + (result.path || ''));\n pLine('');\n pLine(colors.dim('The skill will be applied during the next ') + colors.highlight('trie scan'));\n pLine('');\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine(colors.dim('Press any key to continue...'));\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n \n // Refresh skills list\n await this.refreshSkillsData();\n } else {\n this.state.skillsBrowser.installStatus = `Failed: ${result.error}`;\n this.addActivity(`Skill install failed: ${result.error}`);\n \n // Show error\n process.stdout.write('\\x1b[2J\\x1b[H');\n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(colors.critical('INSTALLATION FAILED'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(colors.critical('✗ ') + colors.dim('Error: ') + result.error);\n pLine('');\n pLine(colors.dim('Common issues:'));\n pLine(colors.dim(' • Repository not found'));\n pLine(colors.dim(' • No SKILL.md in repository'));\n pLine(colors.dim(' • Network connectivity'));\n pLine('');\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine(colors.dim('Press any key to continue...'));\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n }\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n this.state.skillsBrowser.installStatus = `Error: ${errMsg}`;\n this.addActivity(`Skill install error: ${errMsg}`);\n }\n \n this.state.skillsBrowser.installing = false;\n \n // Wait for any key to return\n await new Promise<void>((resolve) => {\n const handler = () => {\n input.removeListener('keypress', handler);\n resolve();\n };\n input.once('keypress', handler);\n });\n \n this.isActive = true;\n this.render();\n }\n\n /**\n * Show global skill details dialog with option to remove\n */\n private async showGlobalSkillDialog(skill: { name: string; description: string; path: string; installedFrom: string }): Promise<void> {\n this.isActive = false;\n process.stdout.write('\\x1b[2J\\x1b[H');\n \n const v = colors.border(box.vertical);\n const w = Math.max(60, Math.min(80, (process.stdout.columns || 80) - 4));\n \n const pLine = (content: string) => {\n const len = visibleLength(content);\n console.log(v + ' ' + content + ' '.repeat(Math.max(0, w - 3 - len)) + v);\n };\n \n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(colors.header('GLOBAL SKILL'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(colors.dim('Name: ') + colors.highlight(skill.name));\n pLine(colors.dim('Description: ') + skill.description.slice(0, w - 16));\n pLine(colors.dim('Source: ') + skill.installedFrom.slice(0, w - 16));\n pLine(colors.dim('Path: ') + skill.path.slice(0, w - 16));\n pLine('');\n pLine(colors.dim('Global skills are available across all your projects.'));\n pLine('');\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(colors.highlight('Remove this skill? ') + colors.dim('(y/n)'));\n pLine('');\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n \n // Wait for user input\n const answer = await new Promise<string>((resolve) => {\n const handler = (_chunk: string, key: { name: string }) => {\n if (key.name === 'y' || key.name === 'n' || key.name === 'escape' || key.name === 'q') {\n input.removeListener('keypress', handler);\n resolve(key.name);\n }\n };\n input.on('keypress', handler);\n });\n \n if (answer === 'y') {\n const removed = await removeGlobalSkill(skill.name);\n if (removed) {\n this.state.skillsBrowser.installStatus = `Removed: ${skill.name}`;\n this.addActivity(`Removed global skill: ${skill.name}`);\n await this.refreshSkillsData();\n } else {\n this.state.skillsBrowser.installStatus = `Failed to remove: ${skill.name}`;\n }\n }\n \n this.isActive = true;\n this.render();\n }\n\n /**\n * Show dialog to create a custom skill from a file\n */\n private async showCreateCustomSkillDialog(): Promise<void> {\n this.isActive = false;\n process.stdout.write('\\x1b[2J\\x1b[H');\n \n const v = colors.border(box.vertical);\n const w = Math.max(60, Math.min(80, (process.stdout.columns || 80) - 4));\n \n const pLine = (content: string) => {\n const len = visibleLength(content);\n console.log(v + ' ' + content + ' '.repeat(Math.max(0, w - 3 - len)) + v);\n };\n \n // Check if native file picker is available\n const hasNativePicker = await isFilePickerAvailable();\n \n let filePath = '';\n \n if (hasNativePicker) {\n // Use native file picker\n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(colors.header('CREATE CUSTOM SKILL'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(colors.running('Opening file picker...'));\n pLine('');\n pLine(colors.dim('Select a text file (.md, .txt, etc.)'));\n pLine(colors.dim('The file contents become the skill instructions.'));\n pLine('');\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n \n const result = await openFilePicker({\n title: 'Select a file to create a skill from',\n fileTypes: ['md', 'txt', 'json', '*']\n });\n \n if (result.cancelled) {\n this.isActive = true;\n this.render();\n return;\n }\n \n if (!result.success || !result.path) {\n // Fall back to paste method\n process.stdout.write('\\x1b[2J\\x1b[H');\n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(colors.running('FILE PICKER UNAVAILABLE'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(colors.dim(result.error || 'Could not open file picker.'));\n pLine(colors.dim('Falling back to manual entry...'));\n pLine('');\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n await new Promise(resolve => setTimeout(resolve, 1500));\n // Continue to paste method below\n } else {\n filePath = result.path;\n }\n }\n \n // Fallback: paste/drop method\n if (!filePath) {\n process.stdout.write('\\x1b[2J\\x1b[H');\n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(colors.header('CREATE CUSTOM SKILL'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(colors.dim('Convert any text file into a global skill.'));\n pLine(colors.dim('The file contents become the skill instructions.'));\n pLine('');\n pLine(colors.highlight('How to use:'));\n pLine(colors.dim(' 1. Drag a text file onto this terminal'));\n pLine(colors.dim(' 2. The file path will be pasted'));\n pLine(colors.dim(' 3. Press Enter to create the skill'));\n pLine('');\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(colors.dim('Paste/drop file path: ') + colors.highlight('_'));\n pLine('');\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n \n // Temporarily disable raw mode for line input\n if (input.isTTY) {\n input.setRawMode(false);\n }\n \n const rl = readline.createInterface({ input, output });\n \n filePath = await new Promise<string>((resolve) => {\n rl.question('', (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n \n // Re-enable raw mode\n if (input.isTTY) {\n input.setRawMode(true);\n }\n \n // Clean up file path (remove quotes that might be added by drag-drop)\n filePath = filePath.replace(/^[\"']|[\"']$/g, '').trim();\n }\n \n if (!filePath) {\n this.isActive = true;\n this.render();\n return;\n }\n \n // Expand ~ to home directory\n if (filePath.startsWith('~')) {\n const { homedir } = await import('os');\n filePath = filePath.replace('~', homedir());\n }\n \n // Check if file exists\n if (!existsSync(filePath)) {\n process.stdout.write('\\x1b[2J\\x1b[H');\n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(colors.critical('FILE NOT FOUND'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(colors.dim('Path: ') + filePath);\n pLine('');\n pLine(colors.dim('Make sure the file exists and try again.'));\n pLine('');\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine(colors.dim('Press any key to continue...'));\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n \n await new Promise<void>((resolve) => {\n input.once('keypress', () => resolve());\n });\n \n this.isActive = true;\n this.render();\n return;\n }\n \n // Show creating status\n process.stdout.write('\\x1b[2J\\x1b[H');\n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(colors.running('CREATING SKILL...'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(colors.dim('Reading file and generating skill...'));\n pLine('');\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n \n // Create the skill\n const result = await createSkillFromFile(filePath);\n \n if (result.success && result.name) {\n // Format which tools it was written to\n const toolsWritten = result.writtenTo?.map(t => {\n const names: Record<string, string> = { trie: 'Trie', cursor: 'Cursor', claude: 'Claude Code', opencode: 'OpenCode' };\n return names[t] ?? t;\n }).join(', ') ?? 'Trie';\n \n this.state.skillsBrowser.installStatus = `Created: ${result.name}`;\n this.addActivity(`Created custom skill: ${result.name} (${toolsWritten})`);\n \n process.stdout.write('\\x1b[2J\\x1b[H');\n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(colors.success('SKILL CREATED'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(colors.success('✓ ') + 'Skill: ' + colors.highlight(result.name));\n pLine('');\n pLine(colors.dim('Available in: ') + colors.highlight(toolsWritten));\n pLine('');\n pLine(colors.dim('This skill now works in all supported AI coding tools.'));\n pLine(colors.dim('In Trie: applied during ') + colors.highlight('trie scan'));\n pLine(colors.dim('In Cursor/Claude/OpenCode: available in skill picker'));\n pLine('');\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine(colors.dim('Press any key to continue...'));\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n \n await this.refreshSkillsData();\n } else {\n this.state.skillsBrowser.installStatus = `Failed: ${result.error}`;\n \n process.stdout.write('\\x1b[2J\\x1b[H');\n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(colors.critical('CREATION FAILED'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(colors.critical('✗ ') + colors.dim('Error: ') + (result.error ?? 'Unknown error'));\n pLine('');\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine(colors.dim('Press any key to continue...'));\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n }\n \n await new Promise<void>((resolve) => {\n input.once('keypress', () => resolve());\n });\n \n this.isActive = true;\n this.render();\n }\n\n /**\n * Render footer with controls\n */\n private renderFooter(width: number): void {\n const bottomBorder = colors.border(box.bottomLeft + this.line(width - 2) + box.bottomRight);\n this.bufferLine(bottomBorder);\n \n // Helper to format keyboard hints\n const key = (k: string) => colors.border('[') + colors.highlight(k) + colors.border(']');\n const hint = (k: string, desc: string) => key(k) + colors.dim(` ${desc}`);\n \n // Build available panes hint based on what data is available\n const paneHints: string[] = [];\n \n // Guardian alerts - highlight if there are unread notifications\n const unreadCount = this.state.notificationHistory.filter(n => !n.dismissed).length;\n if (unreadCount > 0) {\n // Show dismiss hint when notifications are pending\n paneHints.push(key('d') + colors.critical(` Dismiss`));\n paneHints.push(key('g') + colors.critical(` Guard(${unreadCount})`));\n } else {\n // Normal hints when no pending notifications\n if (this.state.issues.length > 0) paneHints.push(hint('d', 'Details'));\n paneHints.push(hint('g', 'Guard'));\n }\n \n if (this.state.costReport) {\n paneHints.push(hint('m', 'Cost'));\n paneHints.push(hint('c', 'Config'));\n }\n if (this.state.readiness) paneHints.push(hint('r', 'Ready'));\n if (this.state.semanticAnalysis || this.state.attackSurface) paneHints.push(hint('a', 'Analysis'));\n paneHints.push(hint('t', 'Memory'));\n paneHints.push(hint('v', 'Toolkit'));\n paneHints.push(hint('l', 'Log'));\n const paneStr = paneHints.length > 0 ? ' ' + paneHints.join(' ') : '';\n \n if (!this.state.scanComplete) {\n this.renderLine(' ' + hint('v', 'Toolkit') + ' ' + hint('l', 'Log') + ' ' + hint('q', 'Quit') + ' ' + hint('h', 'Help'), width);\n } else if (this.state.view === 'skills') {\n // Toolkit view - show toolkit-specific hints\n this.renderLine(' ' + hint('Tab', 'Panel') + ' ' + hint('j/k', 'Select') + ' ' + hint('Enter', 'Install') + ' ' + hint('b', 'Back') + ' ' + hint('h', 'Help') + ' ' + hint('q', 'Quit'), width);\n } else if (this.state.view === 'guardian') {\n // Guardian view - show guardian-specific hints\n // Change Enter hint based on whether selected insight is expanded and has a command\n const insights = this.state.guardianInsights;\n const selectedInsight = insights[this.state.selectedGuardianInsight];\n const isExpanded = this.state.expandedGuardianInsight === this.state.selectedGuardianInsight;\n const hasCommand = selectedInsight?.actionCommand;\n \n const enterHint = isExpanded && hasCommand \n ? hint('Enter', 'Run') \n : isExpanded \n ? hint('Enter', 'Collapse')\n : hint('Enter', 'Expand');\n \n const hintLine = ' ' + hint('j/k', 'Nav') + ' ' + enterHint + ' ' + hint('d', 'Dismiss') + ' ' + hint('i', 'Ignore') + ' ' + hint('x', 'Clear dismissed') + ' ' + hint('o', 'Goals') + ' ' + hint('y', 'Hypo') + ' ' + hint('b', 'Back') + ' ' + hint('q', 'Quit');\n this.renderLine(hintLine, width);\n } else if (this.state.view === 'goals') {\n // Goals view - show goals-specific hints\n const inputMode = this.state.goalsPanel.inputMode === 'add';\n const hasAchieved = this.state.goalsPanel.goals.some(g => g.status === 'achieved' || g.status === 'failed');\n if (inputMode) {\n this.renderLine(' ' + hint('Type', 'Goal') + ' ' + hint('Enter', 'Save') + ' ' + hint('Esc', 'Cancel'), width);\n } else if (hasAchieved) {\n this.renderLine(' ' + hint('j/k', 'Nav') + ' ' + hint('a', 'Add') + ' ' + hint('Enter', 'Complete') + ' ' + hint('d', 'Delete') + ' ' + hint('x', 'Remove achieved') + ' ' + hint('u', 'Undo') + ' ' + hint('b', 'Back'), width);\n } else {\n this.renderLine(' ' + hint('j/k', 'Nav') + ' ' + hint('a', 'Add') + ' ' + hint('Enter', 'Complete') + ' ' + hint('d', 'Delete') + ' ' + hint('b', 'Back') + ' ' + hint('h', 'Help') + ' ' + hint('q', 'Quit'), width);\n }\n } else if (this.state.view === 'hypotheses') {\n // Hypotheses view - show hypotheses-specific hints\n const inputMode = this.state.hypothesesPanel.inputMode === 'add';\n const hasCompleted = this.state.hypothesesPanel.hypotheses.some(h => h.status === 'validated' || h.status === 'invalidated');\n if (inputMode) {\n this.renderLine(' ' + hint('Type', 'Hypothesis') + ' ' + hint('Enter', 'Save') + ' ' + hint('Esc', 'Cancel'), width);\n } else if (hasCompleted) {\n this.renderLine(' ' + hint('j/k', 'Nav') + ' ' + hint('a', 'Add') + ' ' + hint('v', 'Validate') + ' ' + hint('x', 'Invalidate') + ' ' + hint('r', 'Remove') + ' ' + hint('u', 'Undo') + ' ' + hint('d', 'Delete'), width);\n } else {\n this.renderLine(' ' + hint('j/k', 'Nav') + ' ' + hint('a', 'Add') + ' ' + hint('v', 'Validate') + ' ' + hint('x', 'Invalidate') + ' ' + hint('d', 'Delete') + ' ' + hint('b', 'Back') + ' ' + hint('q', 'Quit'), width);\n }\n } else if (this.state.view === 'memory') {\n // Memory tree view - show memory-specific hints\n this.renderLine(' ' + hint('j/k', 'Nav') + ' ' + hint('Enter', 'Expand') + ' ' + hint('b', 'Back') + ' ' + hint('h', 'Help') + ' ' + hint('q', 'Quit'), width);\n } else if (this.state.view === 'details' || this.state.view === 'costs' || this.state.view === 'readiness' || this.state.view === 'analysis' || this.state.view === 'rawlog') {\n // Secondary views - show back hint\n this.renderLine(' ' + hint('b', 'Back') + ' ' + hint('n/p', 'Pages') + ' ' + hint('Tab', 'Main') + ' ' + hint('h', 'Help') + ' ' + hint('q', 'Quit'), width);\n } else if (this.state.view === 'agents') {\n this.renderLine(' ' + hint('j/k', 'Select') + ' ' + hint('Enter', 'View') + ' ' + hint('n/p', 'Pages') + ' ' + hint('Tab', 'Views') + paneStr + ' ' + hint('h', 'Help') + ' ' + hint('q', 'Quit'), width);\n } else if (this.state.view === 'issues') {\n this.renderLine(' ' + hint('j/k', 'Nav') + ' ' + hint('Enter', 'Details') + ' ' + hint('1-4', 'Sev') + ' ' + hint('f', 'Find') + ' ' + hint('Tab', 'Views') + paneStr + ' ' + hint('h', 'Help') + ' ' + hint('q', 'Quit'), width);\n } else {\n this.renderLine(' ' + hint('Tab', 'Views') + ' ' + hint('n/p', 'Pages') + paneStr + ' ' + hint('h', 'Help') + ' ' + hint('q', 'Quit'), width);\n }\n }\n\n // Helper methods\n private switchView(): void {\n // In skills view, Tab switches panels instead of views\n if (this.state.view === 'skills') {\n this.skillsPanelNext();\n return;\n }\n \n if (!this.state.scanComplete) return;\n // Main views that cycle with Tab\n const mainViews: DashboardView[] = ['overview', 'issues', 'files', 'memory'];\n const currentIndex = mainViews.indexOf(this.state.view);\n if (currentIndex >= 0) {\n const nextIndex = (currentIndex + 1) % mainViews.length;\n const nextView = mainViews[nextIndex] ?? 'overview';\n this.state.view = nextView;\n // Load memory data when switching to memory view\n if (nextView === 'memory') {\n this.loadMemoryTreeData();\n }\n } else {\n // If in a secondary view, go back to overview\n this.state.view = 'overview';\n }\n }\n \n /**\n * Navigate to a specific view\n */\n private goToView(view: DashboardView): void {\n if (!this.state.scanComplete && view !== 'rawlog') return;\n this.state.previousView = this.state.view;\n this.state.view = view;\n }\n\n private navigateUp(): void {\n if (this.state.view === 'issues') {\n this.state.selectedIssue = Math.max(0, this.state.selectedIssue - 1);\n } else if (this.state.view === 'agents') {\n this.state.selectedAgent = Math.max(0, this.state.selectedAgent - 1);\n // Adjust page if needed\n const pageSize = 6;\n const page = Math.floor(this.state.selectedAgent / pageSize);\n if (page !== this.state.agentPage) {\n this.state.agentPage = page;\n }\n } else if (this.state.view === 'skills') {\n const maxItems = this.getSkillsPanelMaxItems();\n if (maxItems > 0) {\n this.state.skillsBrowser.selectedIndex = Math.max(0, this.state.skillsBrowser.selectedIndex - 1);\n }\n } else if (this.state.view === 'guardian') {\n // Navigate up in Guardian insights\n const visibleInsights = this.getVisibleGuardianInsights();\n if (visibleInsights.length === 0) {\n this.state.selectedGuardianInsight = 0;\n this.state.scrollPositions.guardian = 0;\n return;\n }\n this.state.selectedGuardianInsight = Math.max(0, this.state.selectedGuardianInsight - 1);\n // Adjust scroll to keep selection visible\n if (this.state.selectedGuardianInsight < this.state.scrollPositions.guardian) {\n this.state.scrollPositions.guardian = this.state.selectedGuardianInsight;\n }\n } else if (this.state.view === 'memory') {\n // Navigate up in memory tree\n const nodes = this.getMemoryTreeNodes();\n const currentIdx = nodes.findIndex(n => n.id === this.state.memoryTree.selectedNode);\n if (currentIdx > 0) {\n this.state.memoryTree.selectedNode = nodes[currentIdx - 1]?.id || nodes[0]?.id || 'severity';\n }\n }\n }\n\n private navigateDown(): void {\n if (this.state.view === 'issues') {\n const filteredIssues = this.getFilteredIssues();\n if (filteredIssues.length > 0) {\n this.state.selectedIssue = Math.min(filteredIssues.length - 1, this.state.selectedIssue + 1);\n }\n } else if (this.state.view === 'agents') {\n const agents = this.getSortedAgents();\n this.state.selectedAgent = Math.min(agents.length - 1, this.state.selectedAgent + 1);\n // Adjust page if needed\n const pageSize = 6;\n const page = Math.floor(this.state.selectedAgent / pageSize);\n if (page !== this.state.agentPage) {\n this.state.agentPage = page;\n }\n } else if (this.state.view === 'skills') {\n const maxItems = this.getSkillsPanelMaxItems();\n if (maxItems > 0) {\n this.state.skillsBrowser.selectedIndex = Math.min(maxItems - 1, this.state.skillsBrowser.selectedIndex + 1);\n }\n } else if (this.state.view === 'guardian') {\n // Navigate down in Guardian insights\n const visibleInsights = this.getVisibleGuardianInsights();\n if (visibleInsights.length === 0) {\n this.state.selectedGuardianInsight = 0;\n this.state.scrollPositions.guardian = 0;\n return;\n }\n const maxIdx = Math.max(0, visibleInsights.length - 1);\n this.state.selectedGuardianInsight = Math.min(maxIdx, this.state.selectedGuardianInsight + 1);\n // Adjust scroll to keep selection visible (approximate 4 lines per insight)\n const visibleItems = Math.floor(20 / 4);\n if (this.state.selectedGuardianInsight >= this.state.scrollPositions.guardian + visibleItems) {\n this.state.scrollPositions.guardian = this.state.selectedGuardianInsight - visibleItems + 1;\n }\n } else if (this.state.view === 'memory') {\n // Navigate down in memory tree\n const nodes = this.getMemoryTreeNodes();\n const currentIdx = nodes.findIndex(n => n.id === this.state.memoryTree.selectedNode);\n if (currentIdx < nodes.length - 1) {\n this.state.memoryTree.selectedNode = nodes[currentIdx + 1]?.id || 'severity';\n }\n }\n }\n\n private getSortedAgents(): Array<{ name: string; status: string; issues: number; duration: string }> {\n const agentEntries: Array<{ name: string; status: 'queued' | 'running' | 'done'; issues: number; duration: string }> = [];\n \n for (const [name, data] of Object.entries(this.state.agents)) {\n const duration = data.durationMs ? `${(data.durationMs / 1000).toFixed(1)}s` : '—';\n agentEntries.push({ name, status: data.status, issues: data.issues, duration });\n }\n \n // Add agents from progress that might not be in state.agents yet\n for (const name of this.state.progress.activeAgents) {\n if (!this.state.agents[name]) {\n agentEntries.push({ name, status: 'running', issues: 0, duration: '—' });\n }\n }\n for (const name of this.state.progress.completedAgents) {\n if (!this.state.agents[name]) {\n agentEntries.push({ name, status: 'done', issues: this.getAgentIssueCount(name), duration: '—' });\n }\n }\n \n const order: Record<string, number> = { running: 0, queued: 1, done: 2 };\n return agentEntries.sort((a, b) => (order[a.status] ?? 2) - (order[b.status] ?? 2) || a.name.localeCompare(b.name));\n }\n\n private nextPage(): void {\n if (this.state.view === 'agents') {\n const total = Math.max(1, Math.ceil(Object.keys(this.state.agents).length / 6));\n this.state.agentPage = Math.min(total - 1, this.state.agentPage + 1);\n } else {\n const total = Math.max(1, Math.ceil(this.state.activityLog.length / 6));\n this.state.activityPage = Math.min(total - 1, this.state.activityPage + 1);\n }\n }\n\n private prevPage(): void {\n if (this.state.view === 'agents') {\n this.state.agentPage = Math.max(0, this.state.agentPage - 1);\n } else {\n this.state.activityPage = Math.max(0, this.state.activityPage - 1);\n }\n }\n\n private async selectCurrent(): Promise<void> {\n if (this.state.view === 'issues') {\n const filteredIssues = this.getFilteredIssues();\n const selected = filteredIssues[this.state.selectedIssue];\n if (selected) {\n this.showIssueDetails(selected);\n }\n } else if (this.state.view === 'agents') {\n // Drill into selected agent's issues\n const agents = this.getSortedAgents();\n const selected = agents[this.state.selectedAgent];\n if (selected) {\n this.state.previousView = 'agents';\n this.state.filter.agent = selected.name;\n this.state.selectedIssue = 0;\n \n // Check if we have issues for this agent in current session\n const currentSessionIssues = this.state.issues.filter(i => i.agent === selected.name);\n \n // If no issues in current session but agent shows issues, load from memory\n if (currentSessionIssues.length === 0 && selected.issues > 0) {\n try {\n const workDir = getWorkingDirectory(undefined, true);\n // Search for all issues from this agent (empty query = all issues)\n const memoryResults = await searchIssues('', {\n workDir,\n agent: selected.name,\n limit: 1000, // Load up to 1000 issues\n includeResolved: false\n });\n \n // Convert StoredIssue to Issue format and merge with current issues\n const convertedIssues: Issue[] = memoryResults.map(result => {\n const issue: Issue = {\n id: result.issue.id,\n severity: result.issue.severity as 'critical' | 'serious' | 'moderate' | 'low',\n issue: result.issue.issue,\n fix: result.issue.fix,\n file: result.issue.file,\n agent: result.issue.agent,\n confidence: 0.8, // Default confidence for memory-loaded issues\n autoFixable: false // Default to not auto-fixable for memory-loaded issues\n };\n if (result.issue.line !== undefined) {\n issue.line = result.issue.line;\n }\n if (result.issue.category !== undefined) {\n issue.category = result.issue.category;\n }\n return issue;\n });\n \n // Merge with existing issues (avoid duplicates by ID)\n const existingIds = new Set(this.state.issues.map((i: Issue) => i.id));\n const newIssues = convertedIssues.filter((i: Issue) => !existingIds.has(i.id));\n this.state.issues = [...this.state.issues, ...newIssues];\n } catch (error) {\n // Silently fail - memory might not be available\n }\n }\n \n this.state.view = 'issues';\n }\n } else if (this.state.view === 'skills') {\n // Handle enter in skills view\n this.handleSkillsEnter();\n } else if (this.state.view === 'guardian') {\n // If insight is already expanded, run the command if available\n const insights = this.getVisibleGuardianInsights();\n if (insights.length === 0) {\n return;\n }\n // Clamp selection in case list shrank\n if (this.state.selectedGuardianInsight >= insights.length) {\n this.state.selectedGuardianInsight = insights.length - 1;\n }\n if (this.state.expandedGuardianInsight === this.state.selectedGuardianInsight) {\n const insight = insights[this.state.selectedGuardianInsight];\n \n if (insight?.actionCommand) {\n // Run the suggested command\n await this.runInsightCommand(insight.actionCommand);\n } else {\n // No command available - collapse\n this.state.expandedGuardianInsight = null;\n }\n } else {\n // Expand the selected insight\n this.state.expandedGuardianInsight = this.state.selectedGuardianInsight;\n }\n } else if (this.state.view === 'memory') {\n // Toggle expand/collapse on selected node\n this.toggleMemoryTreeNode();\n }\n }\n \n /**\n * Run a command from a Guardian insight\n * Pauses the TUI, runs the command, then resumes\n */\n private async runInsightCommand(command: string): Promise<void> {\n const { spawn } = await import('child_process');\n \n // Pause the dashboard\n this.isActive = false;\n \n // Restore terminal to normal mode\n process.stdout.write('\\x1b[?25h'); // Show cursor\n process.stdout.write('\\x1b[2J\\x1b[H'); // Clear screen\n \n console.log(colors.header(`\\n Running: ${command}\\n`));\n console.log(colors.dim(' ─'.repeat(40)));\n console.log('');\n \n // Run the command\n const child = spawn(command, [], {\n shell: true,\n stdio: 'inherit',\n cwd: process.cwd(),\n });\n \n await new Promise<void>((resolve) => {\n child.on('close', (code) => {\n console.log('');\n console.log(colors.dim(' ─'.repeat(40)));\n if (code === 0) {\n console.log(colors.success(` ✓ Command completed successfully`));\n } else {\n console.log(colors.serious(` ✗ Command exited with code ${code}`));\n }\n console.log('');\n console.log(colors.dim(' Press any key to return to dashboard...'));\n resolve();\n });\n \n child.on('error', (err) => {\n console.log('');\n console.log(colors.critical(` ✗ Failed to run command: ${err.message}`));\n console.log('');\n console.log(colors.dim(' Press any key to return to dashboard...'));\n resolve();\n });\n });\n \n // Wait for a keypress before resuming\n await new Promise<void>((resolve) => {\n const onKeypress = () => {\n process.stdin.removeListener('keypress', onKeypress);\n resolve();\n };\n process.stdin.once('keypress', onKeypress);\n });\n \n // Resume the dashboard\n this.isActive = true;\n process.stdout.write('\\x1b[?25l'); // Hide cursor again\n this.render();\n }\n\n private goBack(): void {\n // Skills view has special back handling\n if (this.state.view === 'skills') {\n this.handleSkillsBack();\n return;\n }\n \n if (this.state.previousView) {\n // Clear the agent filter if we came from agents view\n if (this.state.previousView === 'agents' && this.state.filter.agent !== 'all') {\n this.state.filter.agent = 'all';\n }\n this.state.view = this.state.previousView;\n this.state.previousView = null;\n }\n }\n\n private setFilter(type: string, value: string): void {\n (this.state.filter as any)[type] = value;\n this.state.selectedIssue = 0; // Reset selection\n }\n\n private clearFilters(): void {\n this.state.filter = {\n severity: 'all',\n agent: 'all',\n search: ''\n };\n this.state.selectedIssue = 0;\n }\n\n private getFilteredIssues(): Issue[] {\n return this.state.issues.filter(issue => {\n if (this.state.filter.severity !== 'all' && issue.severity !== this.state.filter.severity) {\n return false;\n }\n if (this.state.filter.agent !== 'all' && issue.agent !== this.state.filter.agent) {\n return false;\n }\n if (this.state.filter.search && !issue.issue.toLowerCase().includes(this.state.filter.search.toLowerCase())) {\n return false;\n }\n return true;\n });\n }\n\n private getFilterDescription(): string {\n const parts = [];\n if (this.state.filter.severity !== 'all') parts.push(`Severity: ${this.state.filter.severity}`);\n if (this.state.filter.agent !== 'all') parts.push(`Scout: ${this.state.filter.agent}`);\n if (this.state.filter.search) parts.push(`Search: \"${this.state.filter.search}\"`);\n return parts.length > 0 ? parts.join(', ') : 'All issues';\n }\n\n /**\n * Strip markdown formatting for clean terminal display.\n * Removes **bold**, *italic*, `code`, and markdown headers.\n */\n private stripMarkdown(text: string): string {\n return text\n // Remove markdown bold **text** or __text__\n .replace(/\\*\\*(.+?)\\*\\*/g, '$1')\n .replace(/__(.+?)__/g, '$1')\n // Remove markdown italic *text* or _text_ (but not underscores in words)\n .replace(/(?<!\\w)\\*(.+?)\\*(?!\\w)/g, '$1')\n .replace(/(?<!\\w)_(.+?)_(?!\\w)/g, '$1')\n // Remove inline code `text`\n .replace(/`(.+?)`/g, '$1')\n // Remove markdown headers (# ## ### etc.)\n .replace(/^#{1,6}\\s*/gm, '')\n // Normalize multiple spaces\n .replace(/\\s{2,}/g, ' ')\n .trim();\n }\n\n private wrapText(text: string, width: number): string[] {\n // Clean markdown formatting and handle newlines\n const cleaned = this.stripMarkdown(text);\n const paragraphs = cleaned.split(/\\n+/);\n const lines: string[] = [];\n\n for (const paragraph of paragraphs) {\n const words = paragraph.split(' ').filter(w => w.length > 0);\n let currentLine = '';\n let currentWidth = 0;\n\n for (const word of words) {\n const wordWidth = visibleLength(word);\n const spaceWidth = currentLine ? 1 : 0;\n\n if (currentWidth + spaceWidth + wordWidth <= width) {\n currentLine += (currentLine ? ' ' : '') + word;\n currentWidth += spaceWidth + wordWidth;\n } else {\n if (currentLine) lines.push(currentLine);\n // Handle words longer than width\n if (wordWidth > width) {\n // Truncate long words\n lines.push(word.slice(0, width - 3) + '...');\n currentLine = '';\n currentWidth = 0;\n } else {\n currentLine = word;\n currentWidth = wordWidth;\n }\n }\n }\n\n if (currentLine) lines.push(currentLine);\n }\n\n return lines.length > 0 ? lines : [''];\n }\n\n private async promptFilter(): Promise<void> {\n // Pause the update loop while prompting\n if (this.updateInterval) {\n clearInterval(this.updateInterval);\n this.updateInterval = undefined;\n }\n \n if (input.isTTY) {\n input.setRawMode(false);\n }\n \n const v = colors.border(box.vertical);\n // Responsive width\n const w = Math.max(50, Math.min(70, (process.stdout.columns || 80) - 4));\n \n // Helper for padded lines\n const pLine = (content: string) => {\n const len = visibleLength(content);\n console.log(v + content + ' '.repeat(Math.max(0, w - 2 - len)) + v);\n };\n \n // Clear screen and show prompt\n process.stdout.write('\\x1b[2J\\x1b[H\\x1b[?25h'); // Clear, home, show cursor\n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(' ' + colors.header('FILTER ISSUES'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine(' ' + colors.dim('Current filters:'));\n pLine(' ' + colors.dim('Severity:') + ' ' + colors.highlight(this.state.filter.severity));\n pLine(' ' + colors.dim('Scout:') + ' ' + colors.highlight(this.state.filter.agent));\n pLine(' ' + colors.dim('Search:') + ' ' + colors.highlight(this.state.filter.search || '(none)'));\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n console.log('');\n \n this.rl.question(colors.border('▸ ') + 'Enter search term (empty to clear): ', (answer) => {\n this.state.filter.search = answer.trim();\n this.state.selectedIssue = 0;\n \n if (input.isTTY) {\n input.setRawMode(true);\n }\n \n // Restart the update loop\n this.startUpdateLoop();\n this.render();\n });\n }\n\n private async promptAgentFilter(): Promise<void> {\n // Pause the update loop while prompting\n if (this.updateInterval) {\n clearInterval(this.updateInterval);\n this.updateInterval = undefined;\n }\n \n if (input.isTTY) {\n input.setRawMode(false);\n }\n \n // Get list of agents\n const agents = [...new Set([\n ...this.state.progress.completedAgents,\n ...this.state.progress.activeAgents,\n ...Object.keys(this.state.agents)\n ])].sort();\n \n const v = colors.border(box.vertical);\n // Responsive width\n const w = Math.max(50, Math.min(70, (process.stdout.columns || 80) - 4));\n \n // Helper for padded lines\n const pLine = (content: string) => {\n const len = visibleLength(content);\n console.log(v + content + ' '.repeat(Math.max(0, w - 2 - len)) + v);\n };\n \n // Clear screen and show prompt\n process.stdout.write('\\x1b[2J\\x1b[H\\x1b[?25h'); // Clear, home, show cursor\n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(' ' + colors.header('FILTER BY SCOUT'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine(' ' + colors.dim('Current scout filter:') + ' ' + colors.highlight(this.state.filter.agent));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine(' ' + colors.dim('Available scouts:'));\n // Show more scouts on wider terminals\n const maxScouts = w > 60 ? 12 : 8;\n for (const agent of agents.slice(0, maxScouts)) {\n pLine(' ' + colors.success('•') + ' ' + agent);\n }\n if (agents.length > maxScouts) {\n pLine(' ' + colors.dim(`... and ${agents.length - maxScouts} more`));\n }\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n console.log('');\n \n this.rl.question(colors.border('▸ ') + 'Enter scout name (empty for all): ', (answer) => {\n const trimmed = answer.trim();\n if (trimmed === '' || trimmed.toLowerCase() === 'all') {\n this.state.filter.agent = 'all';\n } else {\n // Fuzzy match agent name\n const match = agents.find(a => a.toLowerCase().includes(trimmed.toLowerCase()));\n this.state.filter.agent = match || trimmed;\n }\n this.state.selectedIssue = 0;\n \n if (input.isTTY) {\n input.setRawMode(true);\n }\n \n // Restart the update loop\n this.startUpdateLoop();\n this.render();\n });\n }\n\n private showHelp(): void {\n this.isActive = false;\n process.stdout.write('\\x1b[2J\\x1b[H');\n const v = colors.border(box.vertical);\n // Responsive width - wider for comprehensive help\n const w = Math.max(70, Math.min(90, (process.stdout.columns || 80) - 4));\n \n // Helper for padded lines\n const pLine = (content: string) => {\n const len = visibleLength(content);\n console.log(v + content + ' '.repeat(Math.max(0, w - 2 - len)) + v);\n };\n \n // Helper for key-description line\n const keyLine = (key: string, desc: string) => {\n pLine(' ' + colors.highlight(key.padEnd(12)) + ' ' + colors.dim(desc));\n };\n \n // Helper for section header\n const section = (title: string) => {\n pLine('');\n pLine(' ' + colors.header(title));\n };\n \n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(' ' + colors.brand('TRIE AGENT') + ' ' + colors.dim('-') + ' ' + colors.header('KEYBOARD SHORTCUTS'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n \n // === NAVIGATION ===\n section('Navigation');\n keyLine('Tab', 'Cycle main views (overview → issues → scouts → files)');\n keyLine('↑ / k', 'Navigate up in lists');\n keyLine('↓ / j', 'Navigate down in lists');\n keyLine('n', 'Next page');\n keyLine('p', 'Previous page');\n keyLine('Enter', 'Select item / drill into scout / view issue details');\n keyLine('b', 'Go back to previous view');\n \n // === VIEWS ===\n section('Quick Views');\n keyLine('d', 'Issue Details - view selected issue with code snippet');\n keyLine('m', 'Money/Costs - Moneybags cost analysis view');\n keyLine('r', 'Readiness - Production readiness score');\n keyLine('a', 'Analysis - Semantic analysis + Attack surface');\n keyLine('g', 'Guardian - Alert history from all agents');\n keyLine('v', 'Toolkit - Scouts (built-in) + Skills (installable)');\n keyLine('l', 'Log - Raw log/activity viewer');\n pLine(' ' + colors.dim('In Toolkit view: press [c] to create from file'));\n pLine('');\n pLine(' ' + colors.header('Guardian Agency'));\n keyLine('o', 'Goals panel - Add, complete, delete goals');\n keyLine('y', 'Hypotheses panel - Add, validate, invalidate hypotheses');\n pLine(' ' + colors.dim('In Goals panel:'));\n pLine(' ' + colors.dim(' [a] add [Enter] complete [d] delete [x] remove achieved [u] undo'));\n pLine(' ' + colors.dim('In Hypotheses panel:'));\n pLine(' ' + colors.dim(' [a] add [v] validate [x] invalidate [r] remove [u] undo'));\n \n // === FILTERING ===\n section('Filtering');\n keyLine('1', 'Filter: Critical severity only');\n keyLine('2', 'Filter: Serious severity only');\n keyLine('3', 'Filter: Moderate severity only');\n keyLine('4', 'Filter: Low severity only');\n keyLine('0', 'Filter: Show all severities');\n keyLine('f', 'Filter: Search issues by text');\n keyLine('s', 'Filter: Search by scout name');\n keyLine('x', 'Clear all filters');\n \n // === CONFIGURATION ===\n section('Configuration');\n keyLine('c', 'Open Guardian Agent config menu (escalation, costs, etc.)');\n pLine(' ' + colors.dim('├─ Moneybags: users, dev rate, industry, revenue'));\n pLine(' ' + colors.dim('├─ Agent Smith: AI enhancement, severity, patterns'));\n pLine(' ' + colors.dim('├─ Performance: concurrency, timeout'));\n pLine(' ' + colors.dim('├─ Risk thresholds: critical, high, medium'));\n pLine(' ' + colors.dim('└─ Auto-escalation: Slack/webhook/email setup'));\n \n // === OTHER ===\n section('Other');\n keyLine('h', 'Show this help screen');\n keyLine('q / Esc', 'Quit the dashboard');\n \n // === CLI COMMANDS ===\n section('CLI Commands');\n pLine(' ' + colors.highlight('trie help') + ' ' + colors.dim('Show all available commands'));\n pLine(' ' + colors.highlight('trie scan') + ' ' + colors.dim('Scan once and exit'));\n pLine(' ' + colors.highlight('trie watch') + ' ' + colors.dim('Watch mode (this dashboard)'));\n pLine(' ' + colors.highlight('trie init') + ' ' + colors.dim('Initialize Trie in a project'));\n pLine(' ' + colors.highlight('trie check') + ' ' + colors.dim('Pre-push risk check'));\n \n // === CI/CD SETUP ===\n section('CI/CD Integration');\n pLine(' ' + colors.dim('Add memory caching to your GitHub Actions for cross-run learning:'));\n pLine('');\n pLine(' ' + colors.highlight('- uses: actions/cache@v4'));\n pLine(' ' + colors.dim('with:'));\n pLine(' ' + colors.dim('path: .trie/memory'));\n pLine(' ' + colors.dim('key: trie-memory-${{ github.repository }}'));\n pLine('');\n pLine(' ' + colors.dim('See: ') + colors.highlight('.github/workflows/examples.md'));\n \n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine(' ' + colors.dim('Tip: Run ') + colors.highlight('trie help') + colors.dim(' for all commands'));\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n console.log(' ' + colors.dim('Press any key to return...'));\n\n const resume = () => {\n this.isActive = true;\n this.render();\n };\n input.once('keypress', resume);\n }\n\n /**\n * Show Guardian Agent configuration dialog\n */\n private async showGuardianConfig(): Promise<void> {\n this.isActive = false;\n process.stdout.write('\\x1b[2J\\x1b[H');\n const v = colors.border(box.vertical);\n const w = Math.max(60, Math.min(80, (process.stdout.columns || 80) - 4));\n \n const pLine = (content: string) => {\n const len = visibleLength(content);\n console.log(v + content + ' '.repeat(Math.max(0, w - 2 - len)) + v);\n };\n \n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(' ' + colors.header('GUARDIAN AGENT CONFIGURATION'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(' ' + colors.header('💰 Moneybags'));\n pLine(' ' + colors.dim(` Users: ${this.state.guardianConfig.moneybags.userCount.toLocaleString()}`));\n pLine(' ' + colors.dim(` Dev Rate: $${this.state.guardianConfig.moneybags.developerRate}/hr`));\n if (this.state.guardianConfig.moneybags.industry) {\n pLine(' ' + colors.dim(` Industry: ${this.state.guardianConfig.moneybags.industry}`));\n }\n pLine('');\n pLine(' ' + colors.header('Agent Smith'));\n const smithCfg = this.state.guardianConfig.agentSmith;\n pLine(' ' + colors.dim(` AI Enhancement: ${smithCfg.aiEnhancement ? 'On' : 'Off'}`));\n pLine(' ' + colors.dim(` Min Severity: ${smithCfg.minSeverity}`));\n const enabledCount = Object.values(smithCfg.enabledCategories).filter(v => v).length;\n pLine(' ' + colors.dim(` Categories: ${enabledCount}/6 enabled`));\n pLine('');\n pLine(' ' + colors.header('Performance'));\n pLine(' ' + colors.dim(` Parallel: ${this.state.guardianConfig.performance.parallel ? 'Yes' : 'No'}`));\n pLine(' ' + colors.dim(` Cache: ${this.state.guardianConfig.performance.cache ? 'Yes' : 'No'}`));\n pLine(' ' + colors.dim(` Max Concurrency: ${this.state.guardianConfig.performance.maxConcurrency}`));\n pLine(' ' + colors.dim(` Timeout: ${this.state.guardianConfig.performance.timeoutMs / 1000}s`));\n pLine('');\n pLine(' ' + colors.header('Risk Thresholds'));\n pLine(' ' + colors.dim(` Critical: ${this.state.guardianConfig.riskThresholds.critical}`));\n pLine(' ' + colors.dim(` High: ${this.state.guardianConfig.riskThresholds.high}`));\n pLine(' ' + colors.dim(` Medium: ${this.state.guardianConfig.riskThresholds.medium}`));\n pLine('');\n pLine(' ' + colors.header('Auto-Escalation'));\n const escCfg = this.state.guardianConfig.escalation;\n pLine(' ' + colors.dim(` Enabled: ${escCfg.enabled ? 'Yes' : 'No'}`));\n pLine(' ' + colors.dim(` Targets: ${escCfg.targets.length} configured`));\n if (escCfg.targets.length > 0) {\n const enabledTargets = escCfg.targets.filter(t => t.enabled);\n pLine(' ' + colors.dim(` Active: ${enabledTargets.length} (${enabledTargets.map(t => t.type).join(', ')})`));\n }\n pLine('');\n pLine(' ' + colors.dim('Press a key to configure:'));\n pLine(' ' + colors.highlight(' 1') + ' - Moneybags settings');\n pLine(' ' + colors.highlight(' 2') + ' - Agent Smith settings');\n pLine(' ' + colors.highlight(' 3') + ' - Performance settings');\n pLine(' ' + colors.highlight(' 4') + ' - Risk thresholds');\n pLine(' ' + colors.highlight(' 5') + ' - Auto-escalation settings');\n pLine(' ' + colors.highlight(' Esc') + ' - Cancel');\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n \n return new Promise((resolve) => {\n const handler = (_ch: string, key: readline.Key) => {\n if (key.name === 'escape') {\n input.removeListener('keypress', handler);\n this.isActive = true;\n this.render();\n resolve();\n return;\n }\n \n if (key.name === '1' || _ch === '1') {\n input.removeListener('keypress', handler);\n this.showMoneybagsConfig().then(() => {\n this.isActive = true;\n this.render();\n resolve();\n });\n return;\n }\n \n if (key.name === '2' || _ch === '2') {\n input.removeListener('keypress', handler);\n this.showAgentSmithConfig().then(() => {\n this.isActive = true;\n this.render();\n resolve();\n });\n return;\n }\n \n if (key.name === '3' || _ch === '3') {\n input.removeListener('keypress', handler);\n this.showPerformanceConfig().then(() => {\n this.isActive = true;\n this.render();\n resolve();\n });\n return;\n }\n \n if (key.name === '4' || _ch === '4') {\n input.removeListener('keypress', handler);\n this.showRiskThresholdsConfig().then(() => {\n this.isActive = true;\n this.render();\n resolve();\n });\n return;\n }\n \n if (key.name === '5' || _ch === '5') {\n input.removeListener('keypress', handler);\n this.showEscalationConfig().then(() => {\n this.isActive = true;\n this.render();\n resolve();\n });\n return;\n }\n };\n \n input.on('keypress', handler);\n });\n }\n\n /**\n * Show Moneybags configuration submenu\n */\n private async showMoneybagsConfig(): Promise<void> {\n return new Promise((resolve) => {\n process.stdout.write('\\x1b[2J\\x1b[H');\n const v = colors.border(box.vertical);\n const w = Math.max(60, Math.min(80, (process.stdout.columns || 80) - 4));\n const pLine = (content: string) => {\n const len = visibleLength(content);\n console.log(v + content + ' '.repeat(Math.max(0, w - 2 - len)) + v);\n };\n \n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(' ' + colors.header('💰 MONEYBAGS CONFIGURATION'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(' ' + colors.dim('Current Settings:'));\n pLine(' ' + colors.highlight(` Users: ${this.state.guardianConfig.moneybags.userCount.toLocaleString()}`));\n const payingUsers = this.state.guardianConfig.moneybags.payingUsers;\n const revenuePerUser = this.state.guardianConfig.moneybags.revenuePerUser;\n if (payingUsers > 0) {\n pLine(' ' + colors.highlight(` Paying Users: ${payingUsers.toLocaleString()}`));\n } else {\n pLine(' ' + colors.dim(' Paying Users: (not set)'));\n }\n if (revenuePerUser > 0) {\n pLine(' ' + colors.highlight(` Revenue/User: $${revenuePerUser}/mo`));\n const mrr = (payingUsers > 0 ? payingUsers : this.state.guardianConfig.moneybags.userCount) * revenuePerUser;\n pLine(' ' + colors.success(` Est. MRR: $${mrr.toLocaleString()}/mo`));\n } else {\n pLine(' ' + colors.dim(' Revenue/User: (not set)'));\n }\n pLine(' ' + colors.highlight(` Developer Rate: $${this.state.guardianConfig.moneybags.developerRate}/hr`));\n if (this.state.guardianConfig.moneybags.industry) {\n pLine(' ' + colors.highlight(` Industry: ${this.state.guardianConfig.moneybags.industry}`));\n } else {\n pLine(' ' + colors.dim(' Industry: (not set)'));\n }\n pLine('');\n pLine(' ' + colors.dim('Press a key to configure:'));\n pLine(' ' + colors.highlight(' 1') + ' - Set user count');\n pLine(' ' + colors.highlight(' 2') + ' - Set paying users');\n pLine(' ' + colors.highlight(' 3') + ' - Set revenue per user');\n pLine(' ' + colors.highlight(' 4') + ' - Set developer rate');\n pLine(' ' + colors.highlight(' 5') + ' - Set industry');\n pLine(' ' + colors.highlight(' Esc') + ' - Back');\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n \n const handler = (_ch: string, key: readline.Key) => {\n if (key.name === 'escape') {\n input.removeListener('keypress', handler);\n resolve();\n return;\n }\n \n if (key.name === '1' || _ch === '1') {\n input.removeListener('keypress', handler);\n this.promptUserCount().then(resolve);\n return;\n }\n \n if (key.name === '2' || _ch === '2') {\n input.removeListener('keypress', handler);\n this.promptPayingUsers().then(resolve);\n return;\n }\n \n if (key.name === '3' || _ch === '3') {\n input.removeListener('keypress', handler);\n this.promptRevenuePerUser().then(resolve);\n return;\n }\n \n if (key.name === '4' || _ch === '4') {\n input.removeListener('keypress', handler);\n this.promptDeveloperRate().then(resolve);\n return;\n }\n \n if (key.name === '5' || _ch === '5') {\n input.removeListener('keypress', handler);\n this.promptIndustry().then(resolve);\n return;\n }\n };\n \n input.on('keypress', handler);\n });\n }\n\n /**\n * Show Agent Smith configuration submenu\n */\n private async showAgentSmithConfig(): Promise<void> {\n return new Promise((resolve) => {\n process.stdout.write('\\x1b[2J\\x1b[H');\n const v = colors.border(box.vertical);\n const w = Math.max(60, Math.min(80, (process.stdout.columns || 80) - 4));\n const pLine = (content: string) => {\n const len = visibleLength(content);\n console.log(v + content + ' '.repeat(Math.max(0, w - 2 - len)) + v);\n };\n \n const cfg = this.state.guardianConfig.agentSmith;\n \n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(' ' + colors.header('AGENT SMITH CONFIGURATION'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(' ' + colors.dim('Current Settings:'));\n pLine(' ' + colors.highlight(` AI Enhancement: ${cfg.aiEnhancement ? 'On' : 'Off'}`));\n pLine(' ' + colors.highlight(` Min Severity: ${cfg.minSeverity}`));\n pLine(' ' + colors.highlight(` Memory Retention: ${cfg.memoryRetentionDays} days`));\n pLine('');\n pLine(' ' + colors.dim('Pattern Categories:'));\n pLine(' ' + (cfg.enabledCategories.security ? colors.success('✓') : colors.dim('○')) + ' Security (secrets, injection, XSS)');\n pLine(' ' + (cfg.enabledCategories.codeSmells ? colors.success('✓') : colors.dim('○')) + ' Code Smells (console.log, any, ts-ignore)');\n pLine(' ' + (cfg.enabledCategories.asyncBugs ? colors.success('✓') : colors.dim('○')) + ' Async Bugs (await mistakes, promises)');\n pLine(' ' + (cfg.enabledCategories.reactPatterns ? colors.success('✓') : colors.dim('○')) + ' React Patterns (useEffect, useState)');\n pLine(' ' + (cfg.enabledCategories.uxPatterns ? colors.success('✓') : colors.dim('○')) + ' UX Patterns (loading, error states)');\n pLine(' ' + (cfg.enabledCategories.backendPatterns ? colors.success('✓') : colors.dim('○')) + ' Backend (validation, N+1)');\n pLine('');\n pLine(' ' + colors.dim('Press a key to configure:'));\n pLine(' ' + colors.highlight(' 1') + ' - Toggle AI Enhancement');\n pLine(' ' + colors.highlight(' 2') + ' - Set Min Severity');\n pLine(' ' + colors.highlight(' 3') + ' - Toggle Pattern Categories');\n pLine(' ' + colors.highlight(' 4') + ' - Set Memory Retention');\n pLine(' ' + colors.highlight(' Esc') + ' - Back');\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n \n const handler = (_ch: string, key: readline.Key) => {\n if (key.name === 'escape') {\n input.removeListener('keypress', handler);\n resolve();\n return;\n }\n \n if (key.name === '1' || _ch === '1') {\n input.removeListener('keypress', handler);\n this.state.guardianConfig.agentSmith.aiEnhancement = !this.state.guardianConfig.agentSmith.aiEnhancement;\n const status = this.state.guardianConfig.agentSmith.aiEnhancement ? 'enabled' : 'disabled';\n this.addActivity(`Agent Smith: AI Enhancement ${status}`);\n this.showAgentSmithConfig().then(resolve);\n return;\n }\n \n if (key.name === '2' || _ch === '2') {\n input.removeListener('keypress', handler);\n this.promptSmithMinSeverity().then(resolve);\n return;\n }\n \n if (key.name === '3' || _ch === '3') {\n input.removeListener('keypress', handler);\n this.promptSmithCategories().then(resolve);\n return;\n }\n \n if (key.name === '4' || _ch === '4') {\n input.removeListener('keypress', handler);\n this.promptSmithMemoryRetention().then(resolve);\n return;\n }\n };\n \n input.on('keypress', handler);\n });\n }\n\n /**\n * Prompt for Agent Smith min severity\n */\n private async promptSmithMinSeverity(): Promise<void> {\n return new Promise((resolve) => {\n process.stdout.write('\\x1b[2J\\x1b[H');\n console.log(colors.header('Set Minimum Severity'));\n console.log(colors.dim(`Current: ${this.state.guardianConfig.agentSmith.minSeverity}`));\n console.log('');\n console.log(colors.dim('Only report issues at or above this level:'));\n console.log(' 1 - low (show all)');\n console.log(' 2 - moderate');\n console.log(' 3 - serious');\n console.log(' 4 - critical');\n \n // Disable raw mode to allow readline to work\n if (input.isTTY) {\n input.setRawMode(false);\n }\n \n this.rl.question('> ', (answer) => {\n // Restore raw mode\n if (input.isTTY) {\n input.setRawMode(true);\n }\n \n const severities: Array<'low' | 'moderate' | 'serious' | 'critical'> = ['low', 'moderate', 'serious', 'critical'];\n const idx = parseInt(answer.trim(), 10) - 1;\n if (idx >= 0 && idx < severities.length) {\n this.state.guardianConfig.agentSmith.minSeverity = severities[idx]!;\n this.addActivity(`Agent Smith: Min severity set to ${severities[idx]}`);\n }\n this.showAgentSmithConfig().then(resolve);\n });\n });\n }\n\n /**\n * Prompt for Agent Smith pattern categories\n */\n private async promptSmithCategories(): Promise<void> {\n return new Promise((resolve) => {\n process.stdout.write('\\x1b[2J\\x1b[H');\n const cfg = this.state.guardianConfig.agentSmith.enabledCategories;\n \n console.log(colors.header('Toggle Pattern Categories'));\n console.log(colors.dim('Press number to toggle, Enter when done:'));\n console.log('');\n console.log(' 1 - ' + (cfg.security ? colors.success('[ON]') : colors.dim('[OFF]')) + ' Security');\n console.log(' 2 - ' + (cfg.codeSmells ? colors.success('[ON]') : colors.dim('[OFF]')) + ' Code Smells');\n console.log(' 3 - ' + (cfg.asyncBugs ? colors.success('[ON]') : colors.dim('[OFF]')) + ' Async Bugs');\n console.log(' 4 - ' + (cfg.reactPatterns ? colors.success('[ON]') : colors.dim('[OFF]')) + ' React Patterns');\n console.log(' 5 - ' + (cfg.uxPatterns ? colors.success('[ON]') : colors.dim('[OFF]')) + ' UX Patterns');\n console.log(' 6 - ' + (cfg.backendPatterns ? colors.success('[ON]') : colors.dim('[OFF]')) + ' Backend Patterns');\n console.log('');\n console.log(' a - Enable All');\n console.log(' n - Disable All');\n console.log(' Enter - Done');\n \n const handler = (_ch: string, key: readline.Key) => {\n if (key.name === 'return' || key.name === 'escape') {\n input.removeListener('keypress', handler);\n const enabledCount = Object.values(this.state.guardianConfig.agentSmith.enabledCategories).filter(v => v).length;\n this.addActivity(`Agent Smith: ${enabledCount}/6 categories enabled`);\n void this.persistGuardianConfig();\n this.showAgentSmithConfig().then(resolve);\n return;\n }\n \n const cats = this.state.guardianConfig.agentSmith.enabledCategories;\n if (key.name === '1' || _ch === '1') cats.security = !cats.security;\n if (key.name === '2' || _ch === '2') cats.codeSmells = !cats.codeSmells;\n if (key.name === '3' || _ch === '3') cats.asyncBugs = !cats.asyncBugs;\n if (key.name === '4' || _ch === '4') cats.reactPatterns = !cats.reactPatterns;\n if (key.name === '5' || _ch === '5') cats.uxPatterns = !cats.uxPatterns;\n if (key.name === '6' || _ch === '6') cats.backendPatterns = !cats.backendPatterns;\n if (key.name === 'a' || _ch === 'a') {\n cats.security = cats.codeSmells = cats.asyncBugs = cats.reactPatterns = cats.uxPatterns = cats.backendPatterns = true;\n }\n if (key.name === 'n' || _ch === 'n') {\n cats.security = cats.codeSmells = cats.asyncBugs = cats.reactPatterns = cats.uxPatterns = cats.backendPatterns = false;\n }\n \n // Refresh the display\n input.removeListener('keypress', handler);\n this.promptSmithCategories().then(resolve);\n };\n \n input.on('keypress', handler);\n });\n }\n\n /**\n * Prompt for Agent Smith memory retention days\n */\n private async promptSmithMemoryRetention(): Promise<void> {\n return new Promise((resolve) => {\n process.stdout.write('\\x1b[2J\\x1b[H');\n console.log(colors.header('Set Memory Retention'));\n console.log(colors.dim(`Current: ${this.state.guardianConfig.agentSmith.memoryRetentionDays} days`));\n console.log('');\n console.log(colors.dim('How long should Agent Smith remember dismissed issues?'));\n console.log(colors.dim('Enter number of days (1-365, or press Enter to cancel):'));\n \n // Disable raw mode to allow readline to work\n if (input.isTTY) {\n input.setRawMode(false);\n }\n \n this.rl.question('> ', (answer) => {\n // Restore raw mode\n if (input.isTTY) {\n input.setRawMode(true);\n }\n \n const trimmed = answer.trim();\n if (trimmed) {\n const days = parseInt(trimmed, 10);\n if (!isNaN(days) && days >= 1 && days <= 365) {\n this.state.guardianConfig.agentSmith.memoryRetentionDays = days;\n this.addActivity(`Agent Smith: Memory retention set to ${days} days`);\n }\n }\n this.showAgentSmithConfig().then(resolve);\n });\n });\n }\n\n /**\n * Show Performance configuration submenu\n */\n private async showPerformanceConfig(): Promise<void> {\n return new Promise((resolve) => {\n process.stdout.write('\\x1b[2J\\x1b[H');\n const v = colors.border(box.vertical);\n const w = Math.max(60, Math.min(80, (process.stdout.columns || 80) - 4));\n const pLine = (content: string) => {\n const len = visibleLength(content);\n console.log(v + content + ' '.repeat(Math.max(0, w - 2 - len)) + v);\n };\n \n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(' ' + colors.header('PERFORMANCE CONFIGURATION'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(' ' + colors.dim('Current Settings:'));\n pLine(' ' + colors.highlight(` Parallel: ${this.state.guardianConfig.performance.parallel ? 'Yes' : 'No'}`));\n pLine(' ' + colors.highlight(` Cache: ${this.state.guardianConfig.performance.cache ? 'Yes' : 'No'}`));\n pLine(' ' + colors.highlight(` Max Concurrency: ${this.state.guardianConfig.performance.maxConcurrency}`));\n pLine(' ' + colors.highlight(` Timeout: ${this.state.guardianConfig.performance.timeoutMs / 1000}s`));\n pLine(' ' + colors.highlight(` Workers: ${this.state.guardianConfig.performance.workers ? 'Yes' : 'No'}`));\n pLine(' ' + colors.highlight(` Streaming: ${this.state.guardianConfig.performance.streaming ? 'Yes' : 'No'}`));\n pLine('');\n pLine(' ' + colors.dim('Press a key to toggle/configure:'));\n pLine(' ' + colors.highlight(' 1') + ' - Toggle parallel execution');\n pLine(' ' + colors.highlight(' 2') + ' - Toggle caching');\n pLine(' ' + colors.highlight(' 3') + ' - Set max concurrency');\n pLine(' ' + colors.highlight(' 4') + ' - Set timeout (seconds)');\n pLine(' ' + colors.highlight(' 5') + ' - Toggle worker threads');\n pLine(' ' + colors.highlight(' 6') + ' - Toggle streaming');\n pLine(' ' + colors.highlight(' Esc') + ' - Back');\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n \n const handler = (_ch: string, key: readline.Key) => {\n if (key.name === 'escape') {\n input.removeListener('keypress', handler);\n resolve();\n return;\n }\n \n if (key.name === '1' || _ch === '1') {\n this.state.guardianConfig.performance.parallel = !this.state.guardianConfig.performance.parallel;\n this.addActivity(`Performance: Parallel execution ${this.state.guardianConfig.performance.parallel ? 'enabled' : 'disabled'}`);\n void this.persistGuardianConfig();\n input.removeListener('keypress', handler);\n resolve();\n return;\n }\n \n if (key.name === '2' || _ch === '2') {\n this.state.guardianConfig.performance.cache = !this.state.guardianConfig.performance.cache;\n this.addActivity(`Performance: Caching ${this.state.guardianConfig.performance.cache ? 'enabled' : 'disabled'}`);\n void this.persistGuardianConfig();\n input.removeListener('keypress', handler);\n resolve();\n return;\n }\n \n if (key.name === '3' || _ch === '3') {\n input.removeListener('keypress', handler);\n this.promptMaxConcurrency().then(resolve);\n return;\n }\n \n if (key.name === '4' || _ch === '4') {\n input.removeListener('keypress', handler);\n this.promptTimeout().then(resolve);\n return;\n }\n \n if (key.name === '5' || _ch === '5') {\n this.state.guardianConfig.performance.workers = !this.state.guardianConfig.performance.workers;\n this.addActivity(`Performance: Worker threads ${this.state.guardianConfig.performance.workers ? 'enabled' : 'disabled'}`);\n void this.persistGuardianConfig();\n input.removeListener('keypress', handler);\n resolve();\n return;\n }\n \n if (key.name === '6' || _ch === '6') {\n this.state.guardianConfig.performance.streaming = !this.state.guardianConfig.performance.streaming;\n this.addActivity(`Performance: Streaming ${this.state.guardianConfig.performance.streaming ? 'enabled' : 'disabled'}`);\n void this.persistGuardianConfig();\n input.removeListener('keypress', handler);\n resolve();\n return;\n }\n };\n \n input.on('keypress', handler);\n });\n }\n\n /**\n * Show Risk Thresholds configuration submenu\n */\n private async showRiskThresholdsConfig(): Promise<void> {\n return new Promise((resolve) => {\n process.stdout.write('\\x1b[2J\\x1b[H');\n const v = colors.border(box.vertical);\n const w = Math.max(60, Math.min(80, (process.stdout.columns || 80) - 4));\n const pLine = (content: string) => {\n const len = visibleLength(content);\n console.log(v + content + ' '.repeat(Math.max(0, w - 2 - len)) + v);\n };\n \n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(' ' + colors.header('RISK THRESHOLDS CONFIGURATION'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(' ' + colors.dim('Current Thresholds:'));\n pLine(' ' + colors.highlight(` Critical: ${this.state.guardianConfig.riskThresholds.critical}`));\n pLine(' ' + colors.highlight(` High: ${this.state.guardianConfig.riskThresholds.high}`));\n pLine(' ' + colors.highlight(` Medium: ${this.state.guardianConfig.riskThresholds.medium}`));\n pLine('');\n pLine(' ' + colors.dim('Press a key to configure:'));\n pLine(' ' + colors.highlight(' 1') + ' - Set critical threshold');\n pLine(' ' + colors.highlight(' 2') + ' - Set high threshold');\n pLine(' ' + colors.highlight(' 3') + ' - Set medium threshold');\n pLine(' ' + colors.highlight(' Esc') + ' - Back');\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n \n const handler = (_ch: string, key: readline.Key) => {\n if (key.name === 'escape') {\n input.removeListener('keypress', handler);\n resolve();\n return;\n }\n \n if (key.name === '1' || _ch === '1') {\n input.removeListener('keypress', handler);\n this.promptRiskThreshold('critical').then(resolve);\n return;\n }\n \n if (key.name === '2' || _ch === '2') {\n input.removeListener('keypress', handler);\n this.promptRiskThreshold('high').then(resolve);\n return;\n }\n \n if (key.name === '3' || _ch === '3') {\n input.removeListener('keypress', handler);\n this.promptRiskThreshold('medium').then(resolve);\n return;\n }\n };\n \n input.on('keypress', handler);\n });\n }\n\n /**\n * Prompt for user count\n */\n private async promptUserCount(): Promise<void> {\n return new Promise((resolve) => {\n process.stdout.write('\\x1b[2J\\x1b[H\\x1b[?25h'); // Clear, home, show cursor\n console.log(colors.header('💰 Set User Count'));\n console.log(colors.dim(`Current: ${this.state.guardianConfig.moneybags.userCount.toLocaleString()} users`));\n console.log('');\n console.log(colors.dim('Enter number of users/customers (or press Enter to cancel):'));\n \n // Disable raw mode to allow readline to work\n if (input.isTTY) {\n input.setRawMode(false);\n }\n \n this.rl.question('> ', (answer) => {\n // Restore raw mode\n if (input.isTTY) {\n input.setRawMode(true);\n }\n \n const trimmed = answer.trim();\n let changed = false;\n if (trimmed) {\n const count = parseInt(trimmed.replace(/,/g, ''), 10);\n if (!isNaN(count) && count >= 0) {\n this.state.guardianConfig.moneybags.userCount = count;\n this.addActivity(`Moneybags: User count set to ${count.toLocaleString()}`);\n changed = true;\n }\n }\n if (changed) {\n this.triggerMoneybagsRecalc();\n }\n resolve();\n });\n });\n }\n\n /**\n * Prompt for paying users\n */\n private async promptPayingUsers(): Promise<void> {\n return new Promise((resolve) => {\n process.stdout.write('\\x1b[2J\\x1b[H\\x1b[?25h'); // Clear, home, show cursor\n console.log(colors.header('💰 Set Paying Users'));\n const current = this.state.guardianConfig.moneybags.payingUsers;\n console.log(colors.dim(`Current: ${current > 0 ? current.toLocaleString() : '(not set)'}`));\n console.log('');\n console.log(colors.dim('Enter number of paying customers (0 to clear, Enter to cancel):'));\n \n // Disable raw mode to allow readline to work\n if (input.isTTY) {\n input.setRawMode(false);\n }\n \n this.rl.question('> ', (answer) => {\n // Restore raw mode\n if (input.isTTY) {\n input.setRawMode(true);\n }\n \n const trimmed = answer.trim();\n let changed = false;\n if (trimmed) {\n const count = parseInt(trimmed.replace(/,/g, ''), 10);\n if (!isNaN(count) && count >= 0) {\n this.state.guardianConfig.moneybags.payingUsers = count;\n if (count > 0) {\n this.addActivity(`Moneybags: Paying users set to ${count.toLocaleString()}`);\n } else {\n this.addActivity('Moneybags: Paying users cleared');\n }\n changed = true;\n }\n }\n if (changed) {\n this.triggerMoneybagsRecalc();\n }\n resolve();\n });\n });\n }\n\n /**\n * Prompt for revenue per user\n */\n private async promptRevenuePerUser(): Promise<void> {\n return new Promise((resolve) => {\n process.stdout.write('\\x1b[2J\\x1b[H\\x1b[?25h'); // Clear, home, show cursor\n console.log(colors.header('💰 Set Revenue Per User'));\n const current = this.state.guardianConfig.moneybags.revenuePerUser;\n console.log(colors.dim(`Current: ${current > 0 ? `$${current}/mo` : '(not set)'}`));\n console.log('');\n console.log(colors.dim('Enter average monthly revenue per user in USD (0 to clear, Enter to cancel):'));\n \n // Disable raw mode to allow readline to work\n if (input.isTTY) {\n input.setRawMode(false);\n }\n \n this.rl.question('> ', (answer) => {\n // Restore raw mode\n if (input.isTTY) {\n input.setRawMode(true);\n }\n \n const trimmed = answer.trim();\n let changed = false;\n if (trimmed) {\n const amount = parseFloat(trimmed.replace(/[$,\\s]/g, ''));\n if (!isNaN(amount) && amount >= 0) {\n this.state.guardianConfig.moneybags.revenuePerUser = Math.round(amount * 100) / 100;\n if (amount > 0) {\n this.addActivity(`Moneybags: Revenue per user set to $${amount}/mo`);\n } else {\n this.addActivity('Moneybags: Revenue per user cleared');\n }\n changed = true;\n }\n }\n if (changed) {\n this.triggerMoneybagsRecalc();\n }\n resolve();\n });\n });\n }\n\n /**\n * Prompt for developer rate\n */\n private async promptDeveloperRate(): Promise<void> {\n return new Promise((resolve) => {\n process.stdout.write('\\x1b[2J\\x1b[H\\x1b[?25h'); // Clear, home, show cursor\n console.log(colors.header('💰 Set Developer Rate'));\n console.log(colors.dim(`Current: $${this.state.guardianConfig.moneybags.developerRate}/hr`));\n console.log('');\n console.log(colors.dim('Enter hourly rate in USD (or press Enter to cancel):'));\n \n // Disable raw mode to allow readline to work\n if (input.isTTY) {\n input.setRawMode(false);\n }\n \n this.rl.question('> ', (answer) => {\n // Restore raw mode\n if (input.isTTY) {\n input.setRawMode(true);\n }\n \n const trimmed = answer.trim();\n let changed = false;\n if (trimmed) {\n const rate = parseFloat(trimmed.replace(/[$,\\s]/g, ''));\n if (!isNaN(rate) && rate > 0) {\n this.state.guardianConfig.moneybags.developerRate = Math.round(rate);\n this.addActivity(`Moneybags: Developer rate set to $${this.state.guardianConfig.moneybags.developerRate}/hr`);\n changed = true;\n }\n }\n if (changed) {\n this.triggerMoneybagsRecalc();\n }\n resolve();\n });\n });\n }\n\n /**\n * Show Escalation configuration submenu\n */\n private async showEscalationConfig(): Promise<void> {\n return new Promise((resolve) => {\n process.stdout.write('\\x1b[2J\\x1b[H');\n const v = colors.border(box.vertical);\n const w = Math.max(60, Math.min(80, (process.stdout.columns || 80) - 4));\n const pLine = (content: string) => {\n const len = visibleLength(content);\n console.log(v + content + ' '.repeat(Math.max(0, w - 2 - len)) + v);\n };\n \n const escCfg = this.state.guardianConfig.escalation;\n \n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(' ' + colors.header('AUTO-ESCALATION CONFIGURATION'));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine('');\n pLine(' ' + colors.header('Current Settings:'));\n pLine(' ' + colors.dim(` Status: ${escCfg.enabled ? colors.success('✓ Enabled') : colors.critical('✗ Disabled')}`));\n pLine(' ' + colors.dim(` Targets: ${escCfg.targets.length} configured`));\n if (escCfg.targets.length > 0) {\n const enabledTargets = escCfg.targets.filter(t => t.enabled);\n pLine(' ' + colors.dim(` Active: ${enabledTargets.length}`));\n for (const target of escCfg.targets) {\n const status = target.enabled ? colors.success('●') : colors.critical('○');\n const type = target.type.toUpperCase();\n pLine(' ' + colors.dim(` ${status} ${type}: ${target.config.channel || target.config.email || 'configured'}`));\n }\n } else {\n pLine(' ' + colors.dim(` [!] No targets configured`));\n }\n pLine(' ' + colors.dim(` Cooldown: ${escCfg.cooldownMinutes} minutes`));\n pLine(' ' + colors.dim(` Max/hour: ${escCfg.maxEscalationsPerHour}`));\n pLine(' ' + colors.dim(` Quiet hours: ${escCfg.respectQuietHours ? 'Respect (9pm-8am)' : 'Ignore'}`));\n pLine(' ' + colors.dim(` Critical bypass: ${escCfg.criticalBypassQuietHours ? 'Yes' : 'No'}`));\n pLine('');\n pLine(' ' + colors.header('Setup Instructions:'));\n pLine(' ' + colors.dim(' 1. Create/edit ' + colors.highlight('.trie/config.json') + ' in project root'));\n pLine(' ' + colors.dim(' 2. Add escalation configuration (see README)'));\n pLine(' ' + colors.dim(' 3. Get Slack webhook: ' + colors.highlight('https://api.slack.com/apps')));\n pLine(' ' + colors.dim(' 4. Restart watch mode to apply changes'));\n pLine('');\n pLine(' ' + colors.dim('Example config.json:'));\n pLine(' ' + colors.dim(' {'));\n pLine(' ' + colors.dim(' \"escalation\": {'));\n pLine(' ' + colors.dim(' \"enabled\": true,'));\n pLine(' ' + colors.dim(' \"targets\": [{'));\n pLine(' ' + colors.dim(' \"type\": \"slack\",'));\n pLine(' ' + colors.dim(' \"enabled\": true,'));\n pLine(' ' + colors.dim(' \"config\": {'));\n pLine(' ' + colors.dim(' \"webhookUrl\": \"https://hooks.slack.com/...\",'));\n pLine(' ' + colors.dim(' \"channel\": \"#security-alerts\"'));\n pLine(' ' + colors.dim(' },'));\n pLine(' ' + colors.dim(' \"forSeverities\": [\"critical\"],'));\n pLine(' ' + colors.dim(' \"forCategories\": [\"security\", \"all\"]'));\n pLine(' ' + colors.dim(' }]'));\n pLine(' ' + colors.dim(' }'));\n pLine(' ' + colors.dim(' }'));\n pLine('');\n pLine(' ' + colors.dim('Full docs: README.md → Configuration → Auto-Escalation'));\n pLine('');\n pLine(' ' + colors.highlight(' Esc') + ' - Back');\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n \n const handler = (_ch: string, key: readline.Key) => {\n if (key.name === 'escape') {\n input.removeListener('keypress', handler);\n resolve();\n }\n };\n \n input.on('keypress', handler);\n });\n }\n\n /**\n * Prompt for industry\n */\n private async promptIndustry(): Promise<void> {\n return new Promise((resolve) => {\n process.stdout.write('\\x1b[2J\\x1b[H\\x1b[?25h'); // Clear, home, show cursor\n console.log(colors.header('💰 Set Industry'));\n const current = this.state.guardianConfig.moneybags.industry || '(not set)';\n console.log(colors.dim(`Current: ${current}`));\n console.log('');\n console.log(colors.dim('Select industry (or press Enter to cancel):'));\n console.log(' 1 - solopreneur (1-person team)');\n console.log(' 2 - startup');\n console.log(' 3 - fintech');\n console.log(' 4 - healthcare');\n console.log(' 5 - enterprise');\n console.log(' 6 - saas');\n console.log(' 7 - ecommerce');\n console.log(' 8 - Clear industry');\n \n // Create a fresh readline interface for this prompt to avoid state issues\n const tempRl = readline.createInterface({\n input: input,\n output: process.stdout,\n terminal: false // Disable terminal features to avoid escape sequences\n });\n\n // Disable raw mode completely during input\n if (input.isTTY) {\n input.setRawMode(false);\n }\n\n tempRl.question('> ', (answer) => {\n try {\n tempRl.close();\n\n // Restore raw mode safely\n if (input.isTTY) {\n try {\n input.setRawMode(true);\n } catch (error) {\n console.error('Warning: Failed to restore raw mode:', error);\n }\n }\n\n this.handleIndustryInput(answer, resolve);\n } catch (error) {\n console.error('Error handling industry input:', error);\n // Ensure raw mode is restored even on error\n if (input.isTTY) {\n try {\n input.setRawMode(true);\n } catch {\n // Ignore errors in error handling\n }\n }\n resolve(); // Resolve to prevent hanging\n }\n });\n });\n }\n\n /**\n * Handle industry input after prompt\n */\n private handleIndustryInput(answer: string, resolve: () => void): void {\n try {\n // Sanitize input - remove any control characters or escape sequences\n const sanitized = answer.replace(/[^\\d\\w\\s]/g, '').trim();\n\n const industries: ['solopreneur', 'startup', 'fintech', 'healthcare', 'enterprise', 'saas', 'ecommerce'] =\n ['solopreneur', 'startup', 'fintech', 'healthcare', 'enterprise', 'saas', 'ecommerce'];\n\n let changed = false;\n if (sanitized === '') {\n // User pressed Enter to cancel - no change\n resolve();\n return;\n } else if (sanitized === '8') {\n // Clear industry - delete the property for proper persistence\n delete this.state.guardianConfig.moneybags.industry;\n this.addActivity('Moneybags: Industry cleared');\n changed = true;\n } else if (/^[1-7]$/.test(sanitized)) {\n const idx = parseInt(sanitized, 10) - 1;\n if (idx >= 0 && idx < industries.length) {\n const industry = industries[idx]!;\n this.state.guardianConfig.moneybags.industry = industry;\n this.addActivity(`Moneybags: Industry set to ${industry}`);\n changed = true;\n }\n } else {\n // Invalid input - provide feedback\n console.log('');\n console.log(colors.critical(`Invalid selection: \"${sanitized}\"`));\n console.log(colors.dim('Please enter a number between 1-8, or press Enter to cancel.'));\n // Small delay to show error, then resolve\n setTimeout(() => {\n resolve();\n }, 1500);\n return;\n }\n\n if (changed) {\n // Persist and trigger recalculation\n this.triggerMoneybagsRecalc();\n }\n resolve();\n } catch (error) {\n console.error('Error in handleIndustryInput:', error);\n // Always resolve to prevent hanging\n resolve();\n }\n }\n\n /**\n * Prompt for max concurrency\n */\n private async promptMaxConcurrency(): Promise<void> {\n return new Promise((resolve) => {\n process.stdout.write('\\x1b[2J\\x1b[H\\x1b[?25h'); // Clear, home, show cursor\n console.log(colors.header('Set Max Concurrency'));\n console.log(colors.dim(`Current: ${this.state.guardianConfig.performance.maxConcurrency}`));\n console.log('');\n console.log(colors.dim('Enter max parallel agents (1-20, or press Enter to cancel):'));\n \n // Disable raw mode to allow readline to work\n if (input.isTTY) {\n input.setRawMode(false);\n }\n \n this.rl.question('> ', (answer) => {\n // Restore raw mode\n if (input.isTTY) {\n input.setRawMode(true);\n }\n \n const trimmed = answer.trim();\n if (trimmed) {\n const val = parseInt(trimmed, 10);\n if (!isNaN(val) && val >= 1 && val <= 20) {\n this.state.guardianConfig.performance.maxConcurrency = val;\n this.addActivity(`Performance: Max concurrency set to ${val}`);\n }\n }\n resolve();\n });\n });\n }\n\n /**\n * Prompt for timeout\n */\n private async promptTimeout(): Promise<void> {\n return new Promise((resolve) => {\n process.stdout.write('\\x1b[2J\\x1b[H\\x1b[?25h'); // Clear, home, show cursor\n console.log(colors.header('Set Timeout'));\n console.log(colors.dim(`Current: ${this.state.guardianConfig.performance.timeoutMs / 1000}s`));\n console.log('');\n console.log(colors.dim('Enter timeout in seconds (or press Enter to cancel):'));\n \n // Disable raw mode to allow readline to work\n if (input.isTTY) {\n input.setRawMode(false);\n }\n \n this.rl.question('> ', (answer) => {\n // Restore raw mode\n if (input.isTTY) {\n input.setRawMode(true);\n }\n \n const trimmed = answer.trim();\n if (trimmed) {\n const seconds = parseFloat(trimmed);\n if (!isNaN(seconds) && seconds > 0) {\n this.state.guardianConfig.performance.timeoutMs = Math.round(seconds * 1000);\n this.addActivity(`Performance: Timeout set to ${this.state.guardianConfig.performance.timeoutMs / 1000}s`);\n }\n }\n resolve();\n });\n });\n }\n\n /**\n * Prompt for risk threshold\n */\n private async promptRiskThreshold(level: 'critical' | 'high' | 'medium'): Promise<void> {\n return new Promise((resolve) => {\n process.stdout.write('\\x1b[2J\\x1b[H\\x1b[?25h'); // Clear, home, show cursor\n console.log(colors.header(`Set ${level.toUpperCase()} Risk Threshold`));\n console.log(colors.dim(`Current: ${this.state.guardianConfig.riskThresholds[level]}`));\n console.log('');\n console.log(colors.dim('Enter threshold value (0-100, or press Enter to cancel):'));\n \n // Disable raw mode to allow readline to work\n if (input.isTTY) {\n input.setRawMode(false);\n }\n \n this.rl.question('> ', (answer) => {\n // Restore raw mode\n if (input.isTTY) {\n input.setRawMode(true);\n }\n \n const trimmed = answer.trim();\n if (trimmed) {\n const val = parseInt(trimmed, 10);\n if (!isNaN(val) && val >= 0 && val <= 100) {\n this.state.guardianConfig.riskThresholds[level] = val;\n this.addActivity(`Risk: ${level} threshold set to ${val}`);\n }\n }\n resolve();\n });\n });\n }\n\n /**\n * Get Guardian Agent configuration (for watch mode to use)\n */\n getGuardianConfig(): typeof this.state.guardianConfig {\n return {\n moneybags: { ...this.state.guardianConfig.moneybags },\n agentSmith: { \n ...this.state.guardianConfig.agentSmith,\n enabledCategories: { ...this.state.guardianConfig.agentSmith.enabledCategories }\n },\n performance: { ...this.state.guardianConfig.performance },\n riskThresholds: { ...this.state.guardianConfig.riskThresholds },\n escalation: { \n ...this.state.guardianConfig.escalation,\n targets: [...this.state.guardianConfig.escalation.targets]\n }\n };\n }\n\n /**\n * Get Moneybags configuration (backward compatibility)\n */\n getMoneybagsConfig(): { \n userCount: number; \n payingUsers?: number;\n revenuePerUser?: number;\n developerRate: number; \n industry?: 'solopreneur' | 'startup' | 'fintech' | 'healthcare' | 'enterprise' | 'saas' | 'ecommerce' \n } {\n const config: { \n userCount: number; \n payingUsers?: number;\n revenuePerUser?: number;\n developerRate: number; \n industry?: 'solopreneur' | 'startup' | 'fintech' | 'healthcare' | 'enterprise' | 'saas' | 'ecommerce' \n } = {\n userCount: this.state.guardianConfig.moneybags.userCount,\n developerRate: this.state.guardianConfig.moneybags.developerRate\n };\n if (this.state.guardianConfig.moneybags.payingUsers > 0) {\n config.payingUsers = this.state.guardianConfig.moneybags.payingUsers;\n }\n if (this.state.guardianConfig.moneybags.revenuePerUser > 0) {\n config.revenuePerUser = this.state.guardianConfig.moneybags.revenuePerUser;\n }\n if (this.state.guardianConfig.moneybags.industry) {\n config.industry = this.state.guardianConfig.moneybags.industry;\n }\n return config;\n }\n\n private showIssueDetails(issue: Issue): void {\n this.isActive = false;\n process.stdout.write('\\x1b[2J\\x1b[H');\n const v = colors.border(box.vertical);\n // Responsive width: use most of terminal, min 60, max 100\n const w = Math.max(60, Math.min(100, (process.stdout.columns || 80) - 4));\n const severityColor = issue.severity === 'critical' ? colors.critical \n : issue.severity === 'serious' ? colors.serious \n : issue.severity === 'moderate' ? colors.moderate \n : colors.low;\n \n // Helper for padded lines in this popup\n const pLine = (content: string) => {\n const len = visibleLength(content);\n console.log(v + content + ' '.repeat(Math.max(0, w - 2 - len)) + v);\n };\n \n console.log(colors.border(box.topLeft + this.line(w - 2) + box.topRight));\n pLine(' ' + colors.header('ISSUE DETAILS') + ' ' + severityColor(`[${issue.severity.toUpperCase()}]`));\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n \n // File path - truncate from left if too long, show end\n const maxFileLen = w - 12;\n const filePath = issue.file.length > maxFileLen \n ? '...' + issue.file.slice(-(maxFileLen - 3)) \n : issue.file;\n pLine(' ' + colors.dim('File:') + ' ' + filePath);\n pLine(' ' + colors.dim('Line:') + ' ' + (issue.line || 'Unknown') + ' ' + colors.dim('Scout:') + ' ' + issue.agent);\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine(' ' + colors.header('Issue'));\n // More lines on wider terminals\n const maxIssueLines = w > 80 ? 8 : 5;\n const issueLines = this.wrapText(issue.issue, w - 10);\n for (const line of issueLines.slice(0, maxIssueLines)) {\n pLine(' ' + severityColor(line));\n }\n if (issueLines.length > maxIssueLines) {\n pLine(' ' + colors.dim(`... ${issueLines.length - maxIssueLines} more lines`));\n }\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine(' ' + colors.success('Suggested Fix'));\n const maxFixLines = w > 80 ? 8 : 5;\n const fixLines = this.wrapText(issue.fix, w - 10);\n for (const line of fixLines.slice(0, maxFixLines)) {\n pLine(' ' + colors.success(line));\n }\n if (fixLines.length > maxFixLines) {\n pLine(' ' + colors.dim(`... ${fixLines.length - maxFixLines} more lines`));\n }\n // Additional metadata if available\n if (issue.cwe || issue.owasp || issue.effort) {\n console.log(colors.border(box.leftT + this.line(w - 2) + box.rightT));\n pLine(' ' + colors.header('Metadata'));\n if (issue.cwe) pLine(' ' + colors.dim('CWE:') + ' ' + issue.cwe);\n if (issue.owasp) pLine(' ' + colors.dim('OWASP:') + ' ' + issue.owasp);\n if (issue.effort) pLine(' ' + colors.dim('Effort:') + ' ' + issue.effort);\n }\n console.log(colors.border(box.bottomLeft + this.line(w - 2) + box.bottomRight));\n console.log(' ' + colors.dim('Press any key to return...'));\n\n const resume = () => {\n this.isActive = true;\n this.render();\n };\n input.once('keypress', resume);\n }\n\n /**\n * Register a callback to be called when Moneybags settings change.\n * The daemon uses this to trigger a Moneybags recalculation.\n */\n onMoneybagsChange(callback: () => void): void {\n this.onMoneybagsChangeCallback = callback;\n }\n\n /**\n * Trigger the Moneybags change callback (called after settings are updated)\n */\n private triggerMoneybagsRecalc(): void {\n try {\n // Always persist the config when settings change\n void this.persistGuardianConfig();\n\n // Trigger recalculation callback if registered (e.g., from yolo daemon)\n if (this.onMoneybagsChangeCallback) {\n this.addActivity('Moneybags: Recalculating costs with new settings...');\n try {\n this.onMoneybagsChangeCallback();\n } catch (error) {\n console.error('Error in moneybags change callback:', error);\n this.addActivity('Moneybags: Settings saved (recalculation failed)');\n }\n } else {\n this.addActivity('Moneybags: Settings updated');\n }\n } catch (error) {\n console.error('Error in triggerMoneybagsRecalc:', error);\n this.addActivity('Moneybags: Error updating settings');\n }\n }\n}\n","/**\n * OutputManager - Unified output abstraction for all UI modes\n * \n * Routes content to the appropriate renderer based on current mode:\n * - TUI: Routes to InteractiveDashboard\n * - Console: Routes to console.error with ANSI colors\n * - MCP: Accumulates for markdown response\n * - JSON: Accumulates for JSON response\n * - Silent: Discards output\n * \n * This solves the problem of skills suppressing content in interactive mode\n * by redirecting it to the dashboard instead.\n */\n\nimport type { Issue } from '../types/index.js';\nimport type { StreamingManager } from './streaming.js';\nimport { isInteractiveMode } from './progress.js';\nimport pc from 'picocolors';\n\n// Output content types\nexport type OutputContentType = \n | 'banner' // ASCII art banner from skills\n | 'progress' // Progress update\n | 'issue' // Issue found\n | 'snippet' // Code snippet with context\n | 'cost' // Cost estimate from Moneybags\n | 'readiness' // Production readiness score\n | 'semantic' // Semantic analysis (data flow, race conditions)\n | 'attack' // Attack surface analysis\n | 'activity' // Activity log message\n | 'report' // Full markdown report section\n | 'log' // Raw log message\n | 'nudge'; // Proactive guardian notification\n\n// Nudge content for proactive notifications\nexport interface NudgeContent {\n message: string;\n severity: 'critical' | 'warning' | 'info';\n file?: string;\n autoHideMs?: number; // Auto-dismiss after this many milliseconds\n}\n\nexport interface BannerContent {\n skill: string;\n art: string;\n quote?: string;\n version?: string;\n}\n\nexport interface SnippetContent {\n file: string;\n lines: string[];\n highlightLine?: number;\n startLine: number;\n}\n\nexport interface CostContent {\n fixNowCost: number;\n productionCost: number;\n savings: number;\n perIssue?: Array<{ issue: string; cost: number }>;\n}\n\nexport interface ReadinessContent {\n score: number;\n requirementsMet: number;\n total: number;\n status: 'ready' | 'caution' | 'not-ready';\n requirements?: Array<{ name: string; met: boolean }>;\n}\n\nexport interface SemanticContent {\n dataFlowIssues: number;\n raceConditions: number;\n authIssues: number;\n details?: Array<{ type: string; description: string; file: string; line?: number }>;\n}\n\nexport interface AttackSurfaceContent {\n totalEndpoints: number;\n unprotected: number;\n riskScore: number;\n endpoints?: Array<{ path: string; method: string; auth: boolean; sensitive: boolean }>;\n}\n\nexport interface OutputContent {\n type: OutputContentType;\n content: any;\n timestamp?: number;\n metadata?: {\n severity?: 'critical' | 'serious' | 'moderate' | 'low';\n agent?: string;\n file?: string;\n };\n}\n\nexport type OutputMode = 'tui' | 'console' | 'mcp' | 'json' | 'silent';\n\n/**\n * Central output manager - singleton\n */\nclass OutputManagerImpl {\n private mode: OutputMode = 'console';\n private streamingManager?: StreamingManager;\n private markdownBuffer: string[] = [];\n private jsonBuffer: OutputContent[] = [];\n private rawLogBuffer: Array<{ time: string; level: string; message: string }> = [];\n \n // Callbacks for TUI integration (explicitly allow undefined for exactOptionalPropertyTypes)\n private onBanner: ((content: BannerContent) => void) | undefined = undefined;\n private onSnippet: ((content: SnippetContent) => void) | undefined = undefined;\n private onCost: ((content: CostContent) => void) | undefined = undefined;\n private onReadiness: ((content: ReadinessContent) => void) | undefined = undefined;\n private onSemantic: ((content: SemanticContent) => void) | undefined = undefined;\n private onAttack: ((content: AttackSurfaceContent) => void) | undefined = undefined;\n private onActivity: ((message: string) => void) | undefined = undefined;\n private onLog: ((level: string, message: string) => void) | undefined = undefined;\n private onNudge: ((content: NudgeContent) => void) | undefined = undefined;\n\n /**\n * Set the output mode\n */\n setMode(mode: OutputMode): void {\n this.mode = mode;\n }\n\n /**\n * Get current output mode\n */\n getMode(): OutputMode {\n return this.mode;\n }\n\n /**\n * Set streaming manager for TUI updates\n */\n setStreamingManager(manager: StreamingManager): void {\n this.streamingManager = manager;\n }\n\n /**\n * Register TUI callbacks for rich content\n */\n registerTUICallbacks(callbacks: {\n onBanner?: (content: BannerContent) => void;\n onSnippet?: (content: SnippetContent) => void;\n onCost?: (content: CostContent) => void;\n onReadiness?: (content: ReadinessContent) => void;\n onSemantic?: (content: SemanticContent) => void;\n onAttack?: (content: AttackSurfaceContent) => void;\n onActivity?: (message: string) => void;\n onLog?: (level: string, message: string) => void;\n onNudge?: (content: NudgeContent) => void;\n }): void {\n this.onBanner = callbacks.onBanner;\n this.onSnippet = callbacks.onSnippet;\n this.onCost = callbacks.onCost;\n this.onReadiness = callbacks.onReadiness;\n this.onSemantic = callbacks.onSemantic;\n this.onAttack = callbacks.onAttack;\n this.onActivity = callbacks.onActivity;\n this.onLog = callbacks.onLog;\n this.onNudge = callbacks.onNudge;\n }\n\n /**\n * Clear TUI callbacks (when dashboard stops)\n */\n clearTUICallbacks(): void {\n this.onBanner = undefined;\n this.onSnippet = undefined;\n this.onCost = undefined;\n this.onReadiness = undefined;\n this.onSemantic = undefined;\n this.onAttack = undefined;\n this.onActivity = undefined;\n this.onLog = undefined;\n this.onNudge = undefined;\n }\n\n /**\n * Emit content - routes to appropriate handler based on mode\n */\n emit(content: OutputContent): void {\n content.timestamp = content.timestamp ?? Date.now();\n \n switch (this.mode) {\n case 'tui':\n this.routeToTUI(content);\n break;\n case 'console':\n this.routeToConsole(content);\n break;\n case 'mcp':\n this.routeToMarkdown(content);\n break;\n case 'json':\n this.routeToJson(content);\n break;\n case 'silent':\n // Discard\n break;\n }\n \n // Always capture in raw log buffer\n this.captureRawLog(content);\n }\n\n /**\n * Route content to TUI (dashboard callbacks)\n */\n private routeToTUI(content: OutputContent): void {\n switch (content.type) {\n case 'banner':\n this.onBanner?.(content.content as BannerContent);\n break;\n case 'snippet':\n this.onSnippet?.(content.content as SnippetContent);\n break;\n case 'cost':\n this.onCost?.(content.content as CostContent);\n break;\n case 'readiness':\n this.onReadiness?.(content.content as ReadinessContent);\n break;\n case 'semantic':\n this.onSemantic?.(content.content as SemanticContent);\n break;\n case 'attack':\n this.onAttack?.(content.content as AttackSurfaceContent);\n break;\n case 'activity':\n this.onActivity?.(content.content as string);\n break;\n case 'log':\n const level = content.metadata?.severity ?? 'info';\n this.onLog?.(level, content.content as string);\n break;\n case 'issue':\n // Issues go through streaming manager\n this.streamingManager?.reportIssue(content.content as Issue);\n break;\n case 'progress':\n // Progress goes through streaming manager\n break;\n case 'report':\n // Reports are captured but not directly displayed\n break;\n case 'nudge':\n // Proactive notifications go to dashboard\n this.onNudge?.(content.content as NudgeContent);\n break;\n }\n }\n\n /**\n * Route content to console (ANSI formatted)\n */\n private routeToConsole(content: OutputContent): void {\n switch (content.type) {\n case 'banner':\n const banner = content.content as BannerContent;\n console.error('\\n' + '='.repeat(60));\n console.error(banner.art);\n if (banner.version) {\n console.error(` ${banner.skill} v${banner.version}`);\n }\n console.error('');\n if (banner.quote) {\n console.error(` \"${banner.quote}\"`);\n }\n console.error('='.repeat(60) + '\\n');\n break;\n \n case 'snippet':\n const snippet = content.content as SnippetContent;\n console.error(`\\n${pc.dim('File:')} ${snippet.file}`);\n for (let i = 0; i < snippet.lines.length; i++) {\n const lineNum = snippet.startLine + i;\n const isHighlight = lineNum === snippet.highlightLine;\n const prefix = isHighlight ? pc.red('→') : ' ';\n const lineNumStr = pc.dim(lineNum.toString().padStart(4));\n const line = isHighlight ? pc.yellow(snippet.lines[i]) : snippet.lines[i];\n console.error(`${prefix} ${lineNumStr} | ${line}`);\n }\n console.error('');\n break;\n \n case 'cost':\n const cost = content.content as CostContent;\n console.error('\\n' + pc.cyan('[$] Cost Estimate:'));\n console.error(` Fix now: ${pc.green(this.formatCurrency(cost.fixNowCost))}`);\n console.error(` If production: ${pc.red(this.formatCurrency(cost.productionCost))}`);\n console.error(` Savings: ${pc.yellow(this.formatCurrency(cost.savings))}`);\n console.error('');\n break;\n \n case 'readiness':\n const readiness = content.content as ReadinessContent;\n const statusColor = readiness.status === 'ready' ? pc.green : \n readiness.status === 'caution' ? pc.yellow : pc.red;\n console.error('\\n' + pc.cyan('[%] Production Readiness:'));\n console.error(` Score: ${statusColor(readiness.score + '/100')}`);\n console.error(` Requirements: ${readiness.requirementsMet}/${readiness.total}`);\n console.error(` Status: ${statusColor(readiness.status.toUpperCase())}`);\n console.error('');\n break;\n \n case 'semantic':\n const semantic = content.content as SemanticContent;\n console.error('\\n' + pc.cyan('[?] Semantic Analysis:'));\n if (semantic.dataFlowIssues > 0) {\n console.error(` ${pc.red('[!]')} ${semantic.dataFlowIssues} data flow vulnerabilities`);\n }\n if (semantic.raceConditions > 0) {\n console.error(` ${pc.yellow('[~]')} ${semantic.raceConditions} race conditions`);\n }\n if (semantic.authIssues > 0) {\n console.error(` ${pc.red('[!]')} ${semantic.authIssues} authentication issues`);\n }\n console.error('');\n break;\n \n case 'attack':\n const attack = content.content as AttackSurfaceContent;\n console.error('\\n' + pc.cyan('[>] Attack Surface:'));\n console.error(` Endpoints: ${attack.totalEndpoints}`);\n if (attack.unprotected > 0) {\n console.error(` ${pc.red('Unprotected:')} ${attack.unprotected}`);\n }\n console.error(` Risk Score: ${attack.riskScore}/100`);\n console.error('');\n break;\n \n case 'activity':\n console.error(pc.dim(`[${this.formatTime()}]`) + ` ${content.content}`);\n break;\n \n case 'log':\n // For log content, severity can be any string (info, warn, error, debug)\n const logLevel = String(content.metadata?.severity ?? 'info');\n const levelColor = logLevel === 'error' || logLevel === 'critical' ? pc.red :\n logLevel === 'warn' || logLevel === 'serious' ? pc.yellow :\n logLevel === 'info' || logLevel === 'moderate' ? pc.blue : pc.dim;\n console.error(levelColor(`[${logLevel.toUpperCase()}]`) + ` ${content.content}`);\n break;\n \n case 'issue':\n const issue = content.content as Issue;\n const sevColor = issue.severity === 'critical' ? pc.red :\n issue.severity === 'serious' ? pc.yellow :\n issue.severity === 'moderate' ? pc.blue : pc.dim;\n console.error(`${sevColor(`[${issue.severity.toUpperCase()}]`)} ${issue.issue}`);\n console.error(` ${pc.dim('File:')} ${issue.file}:${issue.line ?? '?'}`);\n break;\n \n case 'report':\n // Reports are printed as-is (already formatted)\n console.error(content.content);\n break;\n \n case 'nudge':\n // Proactive notifications in console mode\n const nudge = content.content as NudgeContent;\n const nudgeColor = nudge.severity === 'critical' ? pc.red :\n nudge.severity === 'warning' ? pc.yellow : pc.cyan;\n const nudgeIcon = nudge.severity === 'critical' ? '[!!!]' :\n nudge.severity === 'warning' ? '[!]' : '[>]';\n console.error('');\n console.error(nudgeColor('━'.repeat(60)));\n console.error(nudgeColor(`${nudgeIcon} TRIE AGENT SAYS:`));\n console.error(nudgeColor('━'.repeat(60)));\n console.error('');\n console.error(` ${pc.bold(nudge.message)}`);\n if (nudge.file) {\n console.error(` ${pc.dim('File:')} ${nudge.file}`);\n }\n console.error('');\n console.error(nudgeColor('━'.repeat(60)));\n console.error('');\n break;\n }\n }\n\n /**\n * Route content to markdown buffer\n */\n private routeToMarkdown(content: OutputContent): void {\n switch (content.type) {\n case 'banner':\n const banner = content.content as BannerContent;\n this.markdownBuffer.push(`## ${banner.skill}\\n`);\n if (banner.quote) {\n this.markdownBuffer.push(`> ${banner.quote}\\n`);\n }\n break;\n \n case 'snippet':\n const snippet = content.content as SnippetContent;\n this.markdownBuffer.push(`\\n**File:** \\`${snippet.file}\\`\\n`);\n this.markdownBuffer.push('```\\n');\n for (let i = 0; i < snippet.lines.length; i++) {\n const lineNum = snippet.startLine + i;\n const prefix = lineNum === snippet.highlightLine ? '→' : ' ';\n this.markdownBuffer.push(`${prefix} ${lineNum.toString().padStart(4)} | ${snippet.lines[i]}\\n`);\n }\n this.markdownBuffer.push('```\\n');\n break;\n \n case 'cost':\n const cost = content.content as CostContent;\n this.markdownBuffer.push(`\\n### Cost Estimate\\n`);\n this.markdownBuffer.push(`- Fix now: ${this.formatCurrency(cost.fixNowCost)}\\n`);\n this.markdownBuffer.push(`- If production: ${this.formatCurrency(cost.productionCost)}\\n`);\n this.markdownBuffer.push(`- Savings: ${this.formatCurrency(cost.savings)}\\n`);\n break;\n \n case 'readiness':\n const readiness = content.content as ReadinessContent;\n this.markdownBuffer.push(`\\n### Production Readiness\\n`);\n this.markdownBuffer.push(`- Score: ${readiness.score}/100\\n`);\n this.markdownBuffer.push(`- Requirements: ${readiness.requirementsMet}/${readiness.total}\\n`);\n this.markdownBuffer.push(`- Status: **${readiness.status.toUpperCase()}**\\n`);\n break;\n \n case 'semantic':\n const semantic = content.content as SemanticContent;\n this.markdownBuffer.push(`\\n### Semantic Analysis\\n`);\n if (semantic.dataFlowIssues > 0) {\n this.markdownBuffer.push(`- [CRITICAL] ${semantic.dataFlowIssues} data flow vulnerabilities\\n`);\n }\n if (semantic.raceConditions > 0) {\n this.markdownBuffer.push(`- [WARN] ${semantic.raceConditions} race conditions\\n`);\n }\n if (semantic.authIssues > 0) {\n this.markdownBuffer.push(`- [CRITICAL] ${semantic.authIssues} authentication issues\\n`);\n }\n break;\n \n case 'attack':\n const attack = content.content as AttackSurfaceContent;\n this.markdownBuffer.push(`\\n### Attack Surface\\n`);\n this.markdownBuffer.push(`- Endpoints: ${attack.totalEndpoints}\\n`);\n this.markdownBuffer.push(`- Unprotected: ${attack.unprotected}\\n`);\n this.markdownBuffer.push(`- Risk Score: ${attack.riskScore}/100\\n`);\n break;\n \n case 'report':\n this.markdownBuffer.push(content.content);\n break;\n \n default:\n // Other types are captured in JSON buffer\n this.jsonBuffer.push(content);\n }\n }\n\n /**\n * Route content to JSON buffer\n */\n private routeToJson(content: OutputContent): void {\n this.jsonBuffer.push(content);\n }\n\n /**\n * Capture content in raw log buffer\n */\n private captureRawLog(content: OutputContent): void {\n const time = this.formatTime(content.timestamp);\n const level = content.metadata?.severity ?? content.type;\n let message = '';\n \n switch (content.type) {\n case 'banner':\n message = `[BANNER] ${(content.content as BannerContent).skill}`;\n break;\n case 'activity':\n case 'log':\n message = content.content as string;\n break;\n case 'issue':\n const issue = content.content as Issue;\n message = `[${issue.severity.toUpperCase()}] ${issue.issue}`;\n break;\n default:\n message = `[${content.type.toUpperCase()}] Content received`;\n }\n \n this.rawLogBuffer.push({ time, level, message });\n \n // Keep buffer size reasonable\n if (this.rawLogBuffer.length > 500) {\n this.rawLogBuffer = this.rawLogBuffer.slice(-500);\n }\n }\n\n /**\n * Get raw log buffer for display\n */\n getRawLog(): Array<{ time: string; level: string; message: string }> {\n return [...this.rawLogBuffer];\n }\n\n /**\n * Get accumulated markdown output\n */\n getMarkdown(): string {\n return this.markdownBuffer.join('\\n');\n }\n\n /**\n * Get accumulated JSON output\n */\n getJson(): OutputContent[] {\n return [...this.jsonBuffer];\n }\n\n /**\n * Clear buffers\n */\n clearBuffers(): void {\n this.markdownBuffer = [];\n this.jsonBuffer = [];\n }\n\n // ============================================\n // Convenience methods for common output types\n // ============================================\n\n /**\n * Display a skill banner\n */\n banner(skill: string, art: string, options?: { quote?: string; version?: string }): void {\n this.emit({\n type: 'banner',\n content: { skill, art, quote: options?.quote, version: options?.version } as BannerContent,\n metadata: { agent: skill }\n });\n }\n\n /**\n * Display a code snippet\n */\n snippet(file: string, lines: string[], startLine: number, highlightLine?: number): void {\n this.emit({\n type: 'snippet',\n content: { file, lines, startLine, highlightLine } as SnippetContent,\n metadata: { file }\n });\n }\n\n /**\n * Display cost estimate\n */\n cost(fixNowCost: number, productionCost: number, savings: number, perIssue?: Array<{ issue: string; cost: number }>): void {\n this.emit({\n type: 'cost',\n content: { fixNowCost, productionCost, savings, perIssue } as CostContent\n });\n }\n\n /**\n * Display production readiness\n */\n readiness(\n score: number, \n requirementsMet: number, \n total: number, \n status: 'ready' | 'caution' | 'not-ready',\n requirements?: Array<{ name: string; met: boolean }>\n ): void {\n const content: ReadinessContent = { score, requirementsMet, total, status };\n if (requirements) {\n content.requirements = requirements;\n }\n this.emit({\n type: 'readiness',\n content\n });\n }\n\n /**\n * Display semantic analysis results\n */\n semantic(dataFlowIssues: number, raceConditions: number, authIssues: number): void {\n this.emit({\n type: 'semantic',\n content: { dataFlowIssues, raceConditions, authIssues } as SemanticContent\n });\n }\n\n /**\n * Display attack surface analysis\n */\n attack(totalEndpoints: number, unprotected: number, riskScore: number): void {\n this.emit({\n type: 'attack',\n content: { totalEndpoints, unprotected, riskScore } as AttackSurfaceContent\n });\n }\n\n /**\n * Log an activity message\n */\n activity(message: string): void {\n this.emit({\n type: 'activity',\n content: message\n });\n }\n\n /**\n * Log a message at specified level\n */\n log(level: 'info' | 'warn' | 'error' | 'debug', message: string): void {\n this.emit({\n type: 'log',\n content: message,\n metadata: { severity: level as any }\n });\n }\n\n /**\n * Log info message\n */\n info(message: string): void {\n this.log('info', message);\n }\n\n /**\n * Log warning message\n */\n warn(message: string): void {\n this.log('warn', message);\n }\n\n /**\n * Log error message\n */\n error(message: string): void {\n this.log('error', message);\n }\n\n /**\n * Log debug message\n */\n debug(message: string): void {\n this.log('debug', message);\n }\n\n /**\n * Report an issue\n */\n issue(issue: Issue): void {\n this.emit({\n type: 'issue',\n content: issue,\n metadata: { severity: issue.severity, agent: issue.agent, file: issue.file }\n });\n }\n\n /**\n * Add a report section\n */\n report(content: string): void {\n this.emit({\n type: 'report',\n content\n });\n }\n\n /**\n * Send a proactive notification/nudge to the user\n * This creates a prominent popup in TUI mode or a boxed message in console mode\n */\n nudge(message: string, severity: 'critical' | 'warning' | 'info' = 'warning', file?: string, autoHideMs?: number): void {\n const metadata: { severity?: 'critical' | 'serious' | 'moderate' | 'low'; agent?: string; file?: string } = {};\n // Map nudge severity to issue severity\n if (severity === 'critical') metadata.severity = 'critical';\n else if (severity === 'warning') metadata.severity = 'moderate';\n else metadata.severity = 'low';\n if (file !== undefined) metadata.file = file;\n this.emit({\n type: 'nudge',\n content: { message, severity, file, autoHideMs } as NudgeContent,\n metadata,\n });\n }\n\n // ============================================\n // Helpers\n // ============================================\n\n private formatCurrency(amount: number): string {\n if (amount >= 1000000) return `$${(amount / 1000000).toFixed(2)}M`;\n if (amount >= 1000) return `$${(amount / 1000).toFixed(1)}k`;\n return `$${amount}`;\n }\n\n private formatTime(timestamp?: number): string {\n const date = timestamp ? new Date(timestamp) : new Date();\n return date.toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' });\n }\n}\n\n// Singleton instance\nlet instance: OutputManagerImpl | null = null;\n\n/**\n * Get the OutputManager instance\n */\nexport function getOutputManager(): OutputManagerImpl {\n if (!instance) {\n instance = new OutputManagerImpl();\n \n // Auto-detect mode based on interactive mode flag\n if (isInteractiveMode()) {\n instance.setMode('tui');\n }\n }\n return instance;\n}\n\n/**\n * Convenience function - shorthand for getOutputManager()\n */\nexport function output(): OutputManagerImpl {\n return getOutputManager();\n}\n\n/**\n * Reset the OutputManager (for testing)\n */\nexport function resetOutputManager(): void {\n instance = null;\n}\n","/**\n * Native File Picker\n * \n * Opens the OS-native file picker dialog for selecting files.\n * Works on macOS, Linux, and Windows.\n */\n\nimport { platform } from 'os';\nimport { getWorkingDirectory } from './workspace.js';\nimport { runShellCommand } from './command-runner.js';\n\nexport interface FilePickerOptions {\n title?: string;\n fileTypes?: string[]; // e.g., ['txt', 'md', 'json']\n multiple?: boolean;\n}\n\nexport interface FilePickerResult {\n success: boolean;\n path?: string;\n paths?: string[];\n error?: string;\n cancelled?: boolean;\n}\n\n/**\n * Open native file picker dialog\n */\nexport async function openFilePicker(options: FilePickerOptions = {}): Promise<FilePickerResult> {\n const os = platform();\n \n try {\n switch (os) {\n case 'darwin':\n return await openMacOSFilePicker(options);\n case 'linux':\n return await openLinuxFilePicker(options);\n case 'win32':\n return await openWindowsFilePicker(options);\n default:\n return {\n success: false,\n error: `Unsupported platform: ${os}. Please paste the file path manually.`\n };\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n}\n\n/**\n * macOS file picker using osascript\n */\nasync function openMacOSFilePicker(options: FilePickerOptions): Promise<FilePickerResult> {\n const title = options.title || 'Select a file';\n const multiple = options.multiple ? 'multiple selections allowed true' : '';\n \n // Build file type filter\n let typeFilter = '';\n if (options.fileTypes && options.fileTypes.length > 0) {\n // Map extensions to UTIs\n const utiMap: Record<string, string> = {\n 'txt': 'public.plain-text',\n 'md': 'net.daringfireball.markdown',\n 'json': 'public.json',\n 'js': 'com.netscape.javascript-source',\n 'ts': 'public.source-code',\n 'py': 'public.python-script',\n '*': 'public.item'\n };\n \n const utis = options.fileTypes.map(ext => utiMap[ext] || 'public.item');\n typeFilter = `of type {${utis.map(u => `\"${u}\"`).join(', ')}}`;\n }\n \n const script = `\n tell application \"System Events\"\n activate\n end tell\n set selectedFile to choose file with prompt \"${title}\" ${typeFilter} ${multiple}\n return POSIX path of selectedFile\n `.trim();\n \n try {\n const { stdout, stderr } = await runShellCommand(\n `osascript -e '${script.replace(/'/g, \"'\\\"'\\\"'\")}'`,\n { actor: 'internal:file-picker', triggeredBy: 'manual', targetPath: getWorkingDirectory(undefined, true) },\n { timeoutMs: 120000, captureOutput: false }\n );\n \n if (stderr && stderr.includes('User canceled')) {\n return { success: false, cancelled: true };\n }\n \n const path = stdout.trim();\n if (path) {\n return { success: true, path };\n }\n \n return { success: false, cancelled: true };\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes('User canceled') || errorMessage.includes('-128')) {\n return { success: false, cancelled: true };\n }\n throw error;\n }\n}\n\n/**\n * Linux file picker using zenity, kdialog, or yad\n */\nasync function openLinuxFilePicker(options: FilePickerOptions): Promise<FilePickerResult> {\n const title = options.title || 'Select a file';\n \n // Build file filter\n let filter = '';\n if (options.fileTypes && options.fileTypes.length > 0) {\n const patterns = options.fileTypes.map(ext => `*.${ext}`).join(' ');\n filter = `--file-filter=\"Text files | ${patterns}\"`;\n }\n \n // Try zenity first (GTK), then kdialog (KDE), then yad\n const commands = [\n `zenity --file-selection --title=\"${title}\" ${filter}`,\n `kdialog --getopenfilename . \"${options.fileTypes?.map(e => `*.${e}`).join(' ') || '*'}\" --title \"${title}\"`,\n `yad --file --title=\"${title}\"`\n ];\n \n for (const cmd of commands) {\n try {\n const { stdout } = await runShellCommand(\n cmd,\n { actor: 'internal:file-picker', triggeredBy: 'manual', targetPath: getWorkingDirectory(undefined, true) },\n { timeoutMs: 120000, captureOutput: false }\n );\n const path = stdout.trim();\n if (path) {\n return { success: true, path };\n }\n } catch {\n // Try next command\n continue;\n }\n }\n \n return {\n success: false,\n error: 'No file picker available. Install zenity, kdialog, or yad.'\n };\n}\n\n/**\n * Windows file picker using PowerShell\n */\nasync function openWindowsFilePicker(options: FilePickerOptions): Promise<FilePickerResult> {\n const title = options.title || 'Select a file';\n \n // Build file filter\n let filter = 'All files (*.*)|*.*';\n if (options.fileTypes && options.fileTypes.length > 0) {\n const patterns = options.fileTypes.map(ext => `*.${ext}`).join(';');\n filter = `Text files (${patterns})|${patterns}|All files (*.*)|*.*`;\n }\n \n const script = `\n Add-Type -AssemblyName System.Windows.Forms\n $dialog = New-Object System.Windows.Forms.OpenFileDialog\n $dialog.Title = \"${title}\"\n $dialog.Filter = \"${filter}\"\n $dialog.InitialDirectory = [Environment]::GetFolderPath('Desktop')\n if ($dialog.ShowDialog() -eq 'OK') {\n Write-Output $dialog.FileName\n }\n `.trim().replace(/\\n/g, '; ');\n \n try {\n const { stdout } = await runShellCommand(\n `powershell -Command \"${script}\"`,\n { actor: 'internal:file-picker', triggeredBy: 'manual', targetPath: getWorkingDirectory(undefined, true) },\n { timeoutMs: 120000, captureOutput: false }\n );\n \n const path = stdout.trim();\n if (path) {\n return { success: true, path };\n }\n \n return { success: false, cancelled: true };\n } catch {\n return { success: false, cancelled: true };\n }\n}\n\n/**\n * Check if native file picker is available\n */\nexport async function isFilePickerAvailable(): Promise<boolean> {\n const os = platform();\n \n switch (os) {\n case 'darwin':\n // osascript is always available on macOS\n return true;\n case 'linux':\n // Check for zenity, kdialog, or yad\n try {\n await runShellCommand(\n 'which zenity || which kdialog || which yad',\n { actor: 'internal:file-picker', triggeredBy: 'manual', targetPath: getWorkingDirectory(undefined, true) },\n { captureOutput: false }\n );\n return true;\n } catch {\n return false;\n }\n case 'win32':\n // PowerShell is always available on modern Windows\n return true;\n default:\n return false;\n }\n}\n"],"mappings":"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","names":["pc","pc","total","searchIssues","result","v"]}