@triedotdev/mcp 1.0.39 → 1.0.41

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools/scan.ts","../src/orchestrator/context-analyzer.ts","../src/orchestrator/risk-assessor.ts","../src/utils/context-state.ts","../src/orchestrator/triager.ts","../src/utils/parallel-executor.ts","../src/utils/cache-manager.ts","../src/orchestrator/executor.ts","../src/analysis/cross-file.ts","../src/analysis/semantic-analyzer.ts","../src/analysis/smart-prioritizer.ts","../src/analysis/attack-surface.ts","../src/trie/symbol-index.ts","../src/trie/incremental-scanner.ts","../src/utils/streaming.ts","../src/utils/issue-analyzer.ts","../src/cli/interactive-dashboard.ts","../src/config/loader.ts","../src/config/validation.ts","../src/integrations/slack.ts","../src/integrations/team-collaboration.ts"],"sourcesContent":["import { readFile, readdir, writeFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { basename, isAbsolute, resolve, join, extname } from 'path';\nimport { ContextAnalyzer } from '../orchestrator/context-analyzer.js';\nimport { RiskAssessor } from '../orchestrator/risk-assessor.js';\nimport { Triager } from '../orchestrator/triager.js';\nimport { Executor } from '../orchestrator/executor.js';\nimport { getAgentRegistry } from '../agents/registry.js';\nimport { buildDependencyGraph, formatDependencyGraph } from '../analysis/cross-file.js';\nimport { SemanticAnalyzer, formatSemanticIssues } from '../analysis/semantic-analyzer.js';\nimport { prioritizeIssues, formatPrioritizedResults, type PrioritizationResult } from '../analysis/smart-prioritizer.js';\nimport { AttackSurfaceAnalyzer, formatAttackSurface } from '../analysis/attack-surface.js';\nimport { \n IncrementalScanner, \n formatIncrementalScanResult,\n getVulnerabilityStats,\n getSymbolIndex \n} from '../trie/index.js';\nimport { ProgressReporter } from '../utils/progress.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\nimport { StreamingManager, formatConsoleUpdate } from '../utils/streaming.js';\nimport { IssueAnalyzer, type PriorityReport } from '../utils/issue-analyzer.js';\nimport { InteractiveDashboard } from '../cli/interactive-dashboard.js';\nimport { loadConfig } from '../config/loader.js';\nimport { SlackIntegration } from '../integrations/slack.js';\nimport { TeamCollaborationManager, type TeamMember, type IssueAssignment } from '../integrations/team-collaboration.js';\nimport { updateContextAfterScan } from '../utils/context-state.js';\nimport type { ScanResult, Issue, CodeContext, RiskLevel } from '../types/index.js';\n\n// File extensions to scan\nconst SCANNABLE_EXTENSIONS = new Set([\n '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',\n '.vue', '.svelte', '.astro',\n '.py', '.go', '.rs',\n '.json', '.yaml', '.yml',\n '.css', '.scss', '.less'\n]);\n\n// Directories to skip\nconst SKIP_DIRS = new Set([\n 'node_modules', '.git', 'dist', 'build', '.next', '.nuxt',\n 'coverage', '.nyc_output', '__pycache__', '.pytest_cache',\n 'vendor', '.venv', 'venv', 'target', '.turbo', '.cache'\n]);\n\nexport class TrieScanTool {\n private contextAnalyzer = new ContextAnalyzer();\n private riskAssessor = new RiskAssessor();\n private triager = new Triager();\n private executor = new Executor();\n private agentRegistry = getAgentRegistry();\n private incrementalScanner: IncrementalScanner | null = null;\n private progress: ProgressReporter = new ProgressReporter();\n private customAgentsLoaded = false;\n\n /**\n * Ensure custom agents are loaded before using the registry\n */\n private async ensureCustomAgentsLoaded(): Promise<void> {\n if (!this.customAgentsLoaded) {\n await this.agentRegistry.loadCustomAgents();\n this.customAgentsLoaded = true;\n }\n }\n\n async execute(args: any) {\n const startTime = Date.now();\n\n try {\n let { files, context: userContext, forceAgents, directory } = args;\n const excludeAgentsInput = Array.isArray(args?.excludeAgents) ? args.excludeAgents : [];\n const excludeAgents = new Set<string>(\n excludeAgentsInput\n .filter((x: unknown): x is string => typeof x === 'string' && x.trim().length > 0)\n .map((s: string) => s.trim())\n );\n \n const config = await loadConfig();\n\n // Get the working directory - uses smart detection if not explicitly provided\n const workDir = getWorkingDirectory(directory);\n const scanDir = workDir;\n\n const outputConfig = (config as Record<string, unknown>).output as Record<string, unknown> | undefined ?? {};\n const agentConfig = (config as Record<string, unknown>).agents as Record<string, unknown> | undefined ?? {};\n\n const streamingEnabled = args?.streaming ?? outputConfig?.streaming ?? true;\n const interactiveRequested = args?.interactive ?? outputConfig?.interactive ?? false;\n const interactiveEnabled = Boolean(interactiveRequested && process.stdout.isTTY);\n const cacheEnabled = args?.cache ?? agentConfig?.cache ?? true;\n const parallelEnabled = args?.parallel ?? agentConfig?.parallel ?? true;\n const maxConcurrency = args?.maxConcurrency ?? agentConfig?.maxConcurrency;\n const timeoutMs = args?.timeoutMs ?? agentConfig?.timeout ?? 120000;\n const useWorkerThreads = args?.workers ?? true;\n\n const streamingManager = streamingEnabled ? new StreamingManager() : undefined;\n const dashboard = interactiveEnabled ? new InteractiveDashboard() : undefined;\n\n if (dashboard && streamingManager) {\n streamingManager.subscribe(update => dashboard.handleStreamUpdate(update));\n await dashboard.start();\n } else if (streamingManager) {\n streamingManager.subscribe(update => {\n const line = formatConsoleUpdate(update);\n if (line) {\n console.error(line);\n }\n });\n }\n\n // Start progress reporting\n if (!interactiveEnabled) {\n this.progress.startPhase('init', '🔺 TRIE AGENT - AI-Powered Code Analysis');\n }\n\n // If no files specified, scan the entire codebase\n if (!files || !Array.isArray(files) || files.length === 0) {\n this.progress.startPhase('discovery', `Discovering files in ${basename(workDir)}...`);\n files = await this.discoverFiles(workDir);\n this.progress.completePhase(`Found ${files.length} files`);\n }\n\n // Resolve file paths\n const resolvedFiles = files.map((f: string) => {\n if (isAbsolute(f)) {\n return f;\n }\n return resolve(workDir, f);\n });\n\n // Validate files exist\n const validFiles = resolvedFiles.filter((f: string) => {\n if (!existsSync(f)) {\n this.progress.warn('File not found', f);\n return false;\n }\n return true;\n });\n\n if (validFiles.length === 0) {\n throw new Error('No valid files found to scan. Specify files or run from project root.');\n }\n\n streamingManager?.startScan(validFiles.length);\n\n // Initialize trie-based incremental scanner\n if (!this.incrementalScanner) {\n this.incrementalScanner = new IncrementalScanner(workDir);\n await this.incrementalScanner.loadCache();\n }\n\n // Phase 1: Quick pattern scan\n this.progress.startPhase('reading', `Scanning ${validFiles.length} files...`);\n const vulnStats = getVulnerabilityStats();\n this.progress.update(`${vulnStats.total} vulnerability signatures loaded`);\n \n const trieResult = await this.incrementalScanner.scanFiles(\n validFiles,\n false,\n (filePath) => {\n if (streamingManager) {\n streamingManager.updateCurrentFile(filePath);\n streamingManager.completeFile();\n }\n }\n );\n if (trieResult.totalVulnerabilities > 0) {\n this.progress.finding('serious', `${trieResult.totalVulnerabilities} potential issues detected`);\n }\n this.progress.completePhase(`${trieResult.filesScanned} files scanned (${trieResult.cacheHitRate.toFixed(0)}% cached)`);\n\n // Save cache for next run\n await this.incrementalScanner.saveCache();\n\n // Phase 2: Context Analysis\n this.progress.startPhase('analyzing', 'Analyzing code context...');\n \n // Show summary of files (don't list all if too many)\n if (validFiles.length <= 5) {\n for (const file of validFiles) {\n this.progress.file('Reading', file);\n }\n } else {\n const byExt = this.groupFilesByExtension(validFiles);\n for (const [ext, count] of Object.entries(byExt)) {\n this.progress.update(`${count} ${ext} files`);\n }\n }\n\n const context = await this.contextAnalyzer.analyze(validFiles, userContext);\n this.logContextAnalysis(context);\n\n // Phase 3: Risk Assessment\n this.progress.startPhase('analyzing', 'Assessing risk level...');\n const riskLevel = this.riskAssessor.assessRisk(context);\n this.logRiskAssessment(context, riskLevel);\n\n // Phase 4: Agent Selection\n this.progress.startPhase('ai-review', 'Selecting AI agents...');\n \n // Ensure custom agents are loaded before agent selection\n await this.ensureCustomAgentsLoaded();\n \n let selectedAgents = forceAgents\n ? this.agentRegistry.getAgentsByNames(forceAgents)\n : await this.triager.selectAgents(context, riskLevel);\n\n if (excludeAgents.size > 0) {\n const before = selectedAgents.length;\n selectedAgents = selectedAgents.filter(a => !excludeAgents.has(a.name));\n const removed = before - selectedAgents.length;\n if (removed > 0) {\n console.error(` 🚫 Excluding ${removed} agent(s): ${Array.from(excludeAgents).join(', ')}`);\n }\n }\n\n const allAgentNames = this.agentRegistry.getAgentNames();\n this.logTriaging(selectedAgents.map(a => a.name), allAgentNames, context, riskLevel);\n this.progress.update(`${selectedAgents.length} agents selected for ${riskLevel} risk code`);\n\n // Configure moneybags agent with user count if specified\n const userCount = args?.userCount;\n if (userCount) {\n const moneybags = selectedAgents.find(a => a.name === 'moneybags');\n if (moneybags && 'configure' in moneybags && typeof moneybags.configure === 'function') {\n moneybags.configure({ userCount });\n console.error(` 💰 Cost estimates scaled for ${userCount.toLocaleString()} users`);\n }\n }\n\n // Phase 5: AI-Powered Agent Analysis\n this.progress.startPhase('ai-review', 'Running AI analysis...');\n this.progress.ai('Starting agent analysis', `${selectedAgents.length} agents`);\n \n const agentResults = await this.executor.executeAgents(\n selectedAgents,\n validFiles,\n { workingDir: workDir },\n streamingManager ? {\n streaming: streamingManager,\n parallel: parallelEnabled,\n cacheEnabled,\n maxConcurrency,\n useWorkerThreads,\n timeoutMs\n } : {\n parallel: parallelEnabled,\n cacheEnabled,\n maxConcurrency,\n useWorkerThreads,\n timeoutMs\n }\n );\n\n // Phase 6: Prioritization\n const allIssues = agentResults.flatMap(result => result.issues);\n const issueAnalyzer = new IssueAnalyzer();\n const priorityReport = issueAnalyzer.analyzeIssues(allIssues);\n \n this.progress.startPhase('prioritizing', 'Prioritizing findings...');\n const prioritized = prioritizeIssues(allIssues);\n \n if (prioritized.critical.length > 0) {\n this.progress.finding('critical', `${prioritized.critical.length} critical issues`);\n }\n if (prioritized.important.length > 0) {\n this.progress.finding('serious', `${prioritized.important.length} important issues`);\n }\n this.progress.update(`Filtered ${prioritized.noise} noise items`);\n \n const totalIssues = allIssues.length;\n const critical = allIssues.filter(i => i.severity === 'critical').length;\n const serious = allIssues.filter(i => i.severity === 'serious').length;\n const moderate = allIssues.filter(i => i.severity === 'moderate').length;\n const low = allIssues.filter(i => i.severity === 'low').length;\n\n // Calculate score based on PRIORITIZED issues, not raw count\n const prioritizedCritical = prioritized.critical.length;\n const prioritizedImportant = prioritized.important.length;\n const score = Math.max(0, 100 - (prioritizedCritical * 25 + prioritizedImportant * 10));\n\n const result: ScanResult = {\n triaging: {\n agentsActivated: selectedAgents.map(a => a.name),\n agentsSkipped: await this.triager.getSkippedAgents(context, riskLevel),\n reason: this.triager.getTriagingReason(context, riskLevel),\n riskLevel,\n confidence: await this.triager.getTriagingConfidence(context, riskLevel)\n },\n results: {\n totalIssues,\n critical,\n serious,\n moderate,\n low,\n score,\n issues: allIssues,\n agentResults\n },\n executionTime: Date.now() - startTime,\n context\n };\n\n // Get code snippets for issues\n await this.enrichIssuesWithSnippets(allIssues);\n\n // Phase 7: Cross-file analysis (if scanning multiple files)\n if (validFiles.length > 3) {\n this.progress.update('Cross-file dependency analysis...');\n try {\n const depGraph = await buildDependencyGraph(scanDir, 100);\n if (depGraph.issues.length > 0) {\n formatDependencyGraph(depGraph);\n this.progress.finding('moderate', `${depGraph.issues.length} cross-file issues`);\n }\n } catch {\n // Skip silently\n }\n }\n\n // Phase 8: Semantic Analysis\n let semanticOutput = '';\n if (validFiles.length > 0) {\n this.progress.ai('Semantic analysis', 'Data flow, auth chains, business logic');\n try {\n const semanticAnalyzer = new SemanticAnalyzer();\n const semanticIssues = await semanticAnalyzer.analyze(validFiles, scanDir);\n const summary = semanticAnalyzer.getSummary();\n\n if (semanticIssues.length > 0) {\n semanticOutput = formatSemanticIssues(semanticIssues);\n this.progress.update(`Analyzed ${summary.functionsAnalyzed} functions, ${summary.routesFound} routes`);\n \n const semanticCritical = semanticIssues.filter(i => i.severity === 'critical').length;\n const semanticSerious = semanticIssues.filter(i => i.severity === 'serious').length;\n if (semanticCritical > 0) {\n this.progress.finding('critical', `${semanticCritical} data flow/auth issues`);\n }\n if (semanticSerious > 0) {\n this.progress.finding('serious', `${semanticSerious} business logic issues`);\n }\n }\n } catch {\n // Skip silently\n }\n }\n\n // Phase 9: Attack Surface Analysis\n let attackSurfaceOutput = '';\n if (validFiles.length > 0) {\n this.progress.ai('Attack surface mapping', 'Endpoints, auth coverage');\n try {\n const attackSurfaceAnalyzer = new AttackSurfaceAnalyzer();\n const surface = await attackSurfaceAnalyzer.analyze(validFiles, scanDir);\n \n if (surface.endpoints.length > 0) {\n attackSurfaceOutput = formatAttackSurface(surface);\n this.progress.update(`${surface.summary.totalEndpoints} endpoints found`);\n if (surface.summary.unprotectedSensitiveEndpoints > 0) {\n this.progress.finding('serious', `${surface.summary.unprotectedSensitiveEndpoints} unprotected sensitive endpoints`);\n }\n }\n } catch (e) {\n // Skip silently\n }\n }\n\n // Include trie scan results\n if (trieResult.totalVulnerabilities > 0) {\n formatIncrementalScanResult(trieResult);\n }\n\n // Symbol index stats (silent)\n const symbolIndex = getSymbolIndex();\n symbolIndex.getStats();\n\n // Generate smart prioritization output\n formatPrioritizedResults(prioritized);\n\n // Team collaboration: load members and assign issues\n const teamMembers = await this.loadTeamMembers(workDir);\n const teamManager = new TeamCollaborationManager();\n for (const member of teamMembers) {\n teamManager.addTeamMember(member);\n }\n const assignments = teamMembers.length > 0\n ? teamManager.assignIssues(allIssues, priorityReport)\n : [];\n\n // Notifications (Slack)\n const integrationsConfig = (config as Record<string, unknown>).integrations as Record<string, unknown> | undefined;\n const slackConfig = integrationsConfig?.slack as Record<string, unknown> | undefined;\n if (slackConfig?.enabled && slackConfig.webhook) {\n const slack = new SlackIntegration({\n webhookUrl: slackConfig.webhook as string,\n channel: slackConfig.channel as string | undefined\n });\n const repositoryName = process.env.GITHUB_REPOSITORY || basename(workDir);\n const branch = process.env.GITHUB_REF_NAME || 'main';\n\n try {\n await slack.sendScanNotification(allIssues, priorityReport, repositoryName, branch);\n const criticalIssues = allIssues.filter(i => i.severity === 'critical');\n if (criticalIssues.length > 0) {\n await slack.sendCriticalAlert(criticalIssues, repositoryName);\n }\n } catch {\n // Ignore notification failures\n }\n }\n\n // Complete!\n const actionableIssues = prioritized.critical.length + prioritized.important.length;\n this.progress.complete(`${actionableIssues} actionable issues found`);\n\n // Create a CONCISE summary for chat display (not the full 40k line report)\n const chatSummary = await this.formatChatSummary(\n result,\n prioritized,\n semanticOutput,\n attackSurfaceOutput,\n priorityReport,\n assignments\n );\n\n if (args?.format === 'json' && args?.output) {\n const report = {\n ...result,\n prioritization: prioritized,\n grouping: priorityReport\n };\n await writeFile(args.output, JSON.stringify(report, null, 2));\n }\n\n // Update context state for AI assistants\n try {\n const contextSignals: Record<string, boolean> = {\n touchesAuth: context.touchesAuth ?? false,\n touchesPayments: context.touchesPayments ?? false,\n touchesUserData: context.touchesUserData ?? false,\n touchesAPI: context.touchesAPI ?? false,\n touchesDatabase: context.touchesDatabase ?? false,\n touchesCrypto: context.touchesCrypto ?? false,\n };\n await updateContextAfterScan(\n agentResults,\n validFiles.length,\n contextSignals,\n Date.now() - startTime\n );\n } catch {\n // Non-critical - don't fail scan if context update fails\n }\n\n return {\n content: [\n {\n type: 'text',\n text: chatSummary\n }\n ]\n };\n\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: `❌ Scan failed: ${error instanceof Error ? error.message : String(error)}`\n }\n ]\n };\n }\n }\n\n private logContextAnalysis(context: CodeContext): void {\n console.error('\\n 📋 Detected Context Signals:');\n \n const signals = [];\n if (context.touchesAuth) signals.push('🔐 Authentication/Authorization');\n if (context.touchesPayments) signals.push('💳 Payment Processing');\n if (context.touchesDatabase) signals.push('🗄️ Database Operations');\n if (context.touchesAPI) signals.push('🌐 API Endpoints');\n if (context.touchesUI) signals.push('🎨 User Interface');\n if (context.touchesUserData) signals.push('👤 User/Personal Data');\n if (context.touchesHealthData) signals.push('🏥 Protected Health Info (PHI)');\n if (context.touchesSecurityConfig) signals.push('🔒 Security Configuration');\n \n if (signals.length === 0) {\n signals.push('📝 General Code Changes');\n }\n\n for (const signal of signals) {\n console.error(` ${signal}`);\n }\n \n console.error(`\\n 📊 Lines analyzed: ${context.linesChanged}`);\n console.error(` 📁 File patterns: ${context.filePatterns.join(', ') || 'none detected'}`);\n console.error('');\n }\n\n private logRiskAssessment(context: CodeContext, riskLevel: RiskLevel): void {\n const riskEmoji = {\n low: '🟢',\n medium: '🟡', \n high: '🟠',\n critical: '🔴'\n };\n\n console.error(`\\n ${riskEmoji[riskLevel]} Risk Level: ${riskLevel.toUpperCase()}`);\n \n const factors = [];\n if (context.touchesPayments) factors.push('Payment processing = automatic HIGH risk');\n if (context.touchesAuth) factors.push('Auth code requires extra scrutiny');\n if (context.touchesHealthData) factors.push('HIPAA data = CRITICAL compliance risk');\n if (context.touchesUserData) factors.push('PII handling requires privacy review');\n if (context.touchesSecurityConfig) factors.push('Security config changes need review');\n if (context.isNewFeature) factors.push('New features need architecture review');\n\n if (factors.length > 0) {\n console.error(' Risk factors:');\n for (const factor of factors) {\n console.error(` • ${factor}`);\n }\n }\n console.error('');\n }\n\n private logTriaging(\n selectedNames: string[], \n allAgentNames: string[],\n context: CodeContext,\n riskLevel: RiskLevel\n ): void {\n console.error(`\\n 🎯 Agents Selected: ${selectedNames.length} of ${allAgentNames.length} available`);\n console.error('');\n \n for (const name of allAgentNames) {\n const isSelected = selectedNames.includes(name);\n const icon = isSelected ? '✅' : '⬜';\n const reason = isSelected ? this.getAgentReason(name, context, riskLevel) : 'not needed for this context';\n console.error(` ${icon} ${name}: ${reason}`);\n }\n console.error('');\n }\n\n private getAgentReason(agentName: string, context: CodeContext, _riskLevel: RiskLevel): string {\n const reasons: Record<string, string> = {\n 'security': context.touchesAuth ? 'auth code detected' : \n context.touchesPayments ? 'payment code detected' :\n context.touchesAPI ? 'API endpoints detected' :\n context.touchesDatabase ? 'database operations detected' :\n 'security patterns detected',\n 'privacy': context.touchesUserData ? 'PII handling detected' :\n context.touchesHealthData ? 'PHI/HIPAA data detected' :\n context.touchesAuth ? 'user credentials detected' :\n 'data privacy patterns detected',\n 'typecheck': 'always runs - type safety is fundamental',\n 'comprehension': 'always runs - explains changes to stakeholders',\n 'legal': context.touchesHealthData ? 'HIPAA compliance required' :\n context.touchesPayments ? 'payment regulations apply' :\n context.touchesUserData ? 'data protection laws apply' :\n 'legal patterns detected',\n 'accessibility': context.touchesUI ? 'UI components detected' : 'UI patterns detected',\n 'test': context.isNewFeature ? 'new feature needs tests' :\n context.touchesAuth ? 'auth code needs tests' :\n 'test coverage needed',\n 'software-architect': context.isNewFeature ? 'architecture review for new feature' :\n context.touchesDatabase ? 'database schema review' :\n 'architecture patterns detected',\n 'devops': context.touchesSecurityConfig ? 'security config detected' :\n context.touchesDatabase ? 'infrastructure changes' :\n 'deployment patterns detected',\n 'bug-finding': context.touchesPayments ? 'payments require zero bugs' :\n context.isNewFeature ? 'new feature bug check' :\n 'bug patterns detected',\n 'user-testing': context.touchesUI ? 'UX review for UI changes' : 'user flow detected'\n };\n \n return reasons[agentName] || 'context-based activation';\n }\n\n private async enrichIssuesWithSnippets(issues: Issue[]): Promise<(Issue & { snippet?: string })[]> {\n const enriched: (Issue & { snippet?: string })[] = [];\n\n for (const issue of issues) {\n try {\n if (issue.line && existsSync(issue.file)) {\n const content = await readFile(issue.file, 'utf-8');\n const lines = content.split('\\n');\n const startLine = Math.max(0, issue.line - 3);\n const endLine = Math.min(lines.length, issue.line + 2);\n \n const snippetLines = lines.slice(startLine, endLine).map((line, idx) => {\n const lineNum = startLine + idx + 1;\n const marker = lineNum === issue.line ? '→' : ' ';\n return `${marker} ${lineNum.toString().padStart(4)} | ${line}`;\n });\n \n enriched.push({\n ...issue,\n snippet: snippetLines.join('\\n')\n });\n } else {\n enriched.push(issue);\n }\n } catch {\n enriched.push(issue);\n }\n }\n\n return enriched;\n }\n\n /**\n * Format a CONCISE summary for chat/terminal display\n * This is what users see - actionable, not overwhelming\n */\n private async formatChatSummary(\n result: ScanResult,\n prioritized: PrioritizationResult,\n semanticOutput: string,\n attackSurfaceOutput: string,\n priorityReport: PriorityReport,\n assignments: IssueAssignment[]\n ): Promise<string> {\n const { triaging, results: _results, executionTime } = result;\n \n let output = `\\n`;\n output += `# 🔺 Trie Agent Scan Complete\\n\\n`;\n \n // Quick stats\n output += `**Scanned:** ${triaging.agentsActivated.length} agents | **Time:** ${(executionTime / 1000).toFixed(1)}s | **Risk:** ${triaging.riskLevel.toUpperCase()}\\n\\n`;\n \n // Smart prioritization summary - just the actionable count\n const totalActionable = prioritized.critical.length + prioritized.important.length;\n if (totalActionable === 0) {\n output += `## ✅ No Issues Found\\n\\n`;\n output += `Your code passed all checks.\\n\\n`;\n } else {\n output += `## 🎯 ${totalActionable} Issues Found\\n\\n`;\n }\n \n // Critical actions - SHOW FULL DETAILS WITH CODE SNIPPETS\n if (prioritized.critical.length > 0) {\n output += `### 🔴 Critical (${prioritized.critical.length})\\n\\n`;\n for (const issue of prioritized.critical.slice(0, 8)) {\n output += `---\\n\\n`;\n output += `**${issue.issue}**\\n\\n`;\n output += `📍 \\`${issue.file}:${issue.line || '?'}\\`\\n\\n`;\n \n // Show code snippet if available\n const snippet = await this.getCodeSnippet(issue.file, issue.line);\n if (snippet) {\n output += `\\`\\`\\`\\n${snippet}\\n\\`\\`\\`\\n\\n`;\n }\n \n output += `**Fix:** ${issue.fix}\\n\\n`;\n \n // Generate a prompt the user can copy to fix this\n output += `<details>\\n<summary>💬 Prompt to fix this</summary>\\n\\n`;\n output += `\\`\\`\\`\\nFix the ${issue.issue.toLowerCase()} in ${basename(issue.file)}${issue.line ? ` at line ${issue.line}` : ''}.\\n\\n${issue.fix}\\n\\`\\`\\`\\n\\n`;\n output += `</details>\\n\\n`;\n }\n if (prioritized.critical.length > 8) {\n output += `*...and ${prioritized.critical.length - 8} more critical issues*\\n\\n`;\n }\n }\n \n // Important items - SHOW FILE PATHS WITH CODE SNIPPETS\n if (prioritized.important.length > 0) {\n output += `### 🟠 Important (${prioritized.important.length})\\n\\n`;\n for (const issue of prioritized.important.slice(0, 10)) {\n output += `---\\n\\n`;\n output += `**${issue.issue}**\\n\\n`;\n output += `📍 \\`${issue.file}:${issue.line || '?'}\\`\\n\\n`;\n \n // Show code snippet if available\n const snippet = await this.getCodeSnippet(issue.file, issue.line);\n if (snippet) {\n output += `\\`\\`\\`\\n${snippet}\\n\\`\\`\\`\\n\\n`;\n }\n \n output += `**Fix:** ${issue.fix}\\n\\n`;\n \n // Generate a prompt the user can copy to fix this\n output += `<details>\\n<summary>💬 Prompt to fix this</summary>\\n\\n`;\n output += `\\`\\`\\`\\nFix the ${issue.issue.toLowerCase()} in ${basename(issue.file)}${issue.line ? ` at line ${issue.line}` : ''}.\\n\\n${issue.fix}\\n\\`\\`\\`\\n\\n`;\n output += `</details>\\n\\n`;\n }\n if (prioritized.important.length > 10) {\n output += `*...and ${prioritized.important.length - 10} more important issues*\\n\\n`;\n }\n }\n \n // Semantic analysis highlights (the SMART stuff)\n if (semanticOutput && semanticOutput.includes('Data Flow') || semanticOutput.includes('Race Condition')) {\n output += `### 🧠 Semantic Analysis\\n\\n`;\n \n // Extract key findings\n const dataFlowMatch = semanticOutput.match(/Data Flow Vulnerabilities \\((\\d+)\\)/);\n const raceMatch = semanticOutput.match(/Race Conditions \\((\\d+)\\)/);\n const authMatch = semanticOutput.match(/Authentication Issues \\((\\d+)\\)/);\n \n if (dataFlowMatch) output += `- 🔴 **${dataFlowMatch[1]} data flow vulnerabilities** (untrusted input reaching dangerous sinks)\\n`;\n if (authMatch) output += `- 🔴 **${authMatch[1]} authentication issues** (missing or bypassable auth)\\n`;\n if (raceMatch) output += `- 🟡 **${raceMatch[1]} race conditions** (TOCTOU, double-spend risks)\\n`;\n \n output += `\\n`;\n }\n \n // Attack surface summary\n if (attackSurfaceOutput && attackSurfaceOutput.includes('Attack Surface')) {\n const riskMatch = attackSurfaceOutput.match(/Risk Score\\*\\* \\| \\*\\*(\\d+)\\/100/);\n const endpointsMatch = attackSurfaceOutput.match(/Total Endpoints \\| (\\d+)/);\n const publicMatch = attackSurfaceOutput.match(/Public \\(No Auth\\) \\| (\\d+)/);\n \n if (riskMatch || endpointsMatch) {\n output += `### 🎯 Attack Surface\\n\\n`;\n if (endpointsMatch) output += `- **${endpointsMatch[1]} endpoints** found`;\n if (publicMatch?.[1] && parseInt(publicMatch[1], 10) > 0) output += ` (⚠️ ${publicMatch[1]} public without auth)`;\n output += `\\n`;\n if (riskMatch) output += `- **Risk Score:** ${riskMatch[1]}/100\\n`;\n output += `\\n`;\n }\n }\n\n // Smart grouping & prioritization\n if (priorityReport.totalGroups > 0) {\n output += `### 🧩 Smart Grouping\\n\\n`;\n output += `- **${priorityReport.totalGroups} issue groups** across ${priorityReport.totalIssues} issues\\n`;\n output += `- **Risk Score:** ${priorityReport.riskScore}/100\\n`;\n\n const topGroups = [...priorityReport.urgent, ...priorityReport.high].slice(0, 5);\n if (topGroups.length > 0) {\n output += `\\n**Top groups to fix first:**\\n`;\n for (const group of topGroups) {\n const bulk = group.bulkFixAvailable ? ' (bulk-fix available)' : '';\n output += `- ${group.description} — ${group.count} issues${bulk}\\n`;\n }\n output += `\\n`;\n }\n\n if (priorityReport.recommendations.length > 0) {\n output += `**Recommendations:**\\n`;\n for (const recommendation of priorityReport.recommendations) {\n output += `- ${recommendation}\\n`;\n }\n output += `\\n`;\n }\n }\n\n if (assignments.length > 0) {\n output += `### 🤝 Team Assignments\\n\\n`;\n const urgent = assignments.filter(a => a.priority === 'urgent').length;\n const high = assignments.filter(a => a.priority === 'high').length;\n output += `- **${assignments.length} assignments** created (${urgent} urgent, ${high} high)\\n\\n`;\n }\n \n // Next steps\n output += `## 📋 Next Steps\\n\\n`;\n if (prioritized.critical.length > 0) {\n output += `1. **Fix critical issues:** \\`trie_fix\\` to apply high-confidence issues\\n`;\n }\n output += `2. **Deep dive:** Run \\`trie_security\\`, \\`trie_privacy\\`, or \\`trie_bugs\\` for specific analysis\\n`;\n output += `3. **Watch mode:** \\`trie_watch\\` to catch issues as you code\\n\\n`;\n \n // Footer\n output += `---\\n`;\n output += `*💡 Unlike other tools that dump 10,000 issues, Trie Agent shows you what matters.*\\n`;\n \n return output;\n }\n\n /**\n * Get a code snippet around a specific line\n */\n private async getCodeSnippet(filePath: string, line: number | undefined): Promise<string | null> {\n if (!line || !existsSync(filePath)) return null;\n \n try {\n const content = await readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n const start = Math.max(0, line - 3);\n const end = Math.min(lines.length, line + 2);\n \n return lines.slice(start, end).map((l, idx) => {\n const lineNum = start + idx + 1;\n const marker = lineNum === line ? '→' : ' ';\n return `${marker} ${lineNum.toString().padStart(4)} | ${l}`;\n }).join('\\n');\n } catch {\n return null;\n }\n }\n\n /**\n * Recursively discover all scannable files in a directory\n */\n private async discoverFiles(dir: string, maxFiles: number = 500): Promise<string[]> {\n const files: string[] = [];\n \n async function walk(currentDir: string) {\n if (files.length >= maxFiles) return;\n \n try {\n const entries = await readdir(currentDir, { withFileTypes: true });\n \n for (const entry of entries) {\n if (files.length >= maxFiles) break;\n \n const fullPath = join(currentDir, entry.name);\n \n if (entry.isDirectory()) {\n if (!SKIP_DIRS.has(entry.name) && !entry.name.startsWith('.')) {\n await walk(fullPath);\n }\n } else if (entry.isFile()) {\n // Skip hidden files unless they are env files (where secrets live)\n if (entry.name.startsWith('.') && !entry.name.startsWith('.env')) {\n continue;\n }\n\n // Explicitly ignore LLM/config prompt files that are noisy and not source code\n if (entry.name === '.claude.json') {\n continue;\n }\n\n const ext = extname(entry.name).toLowerCase();\n if (SCANNABLE_EXTENSIONS.has(ext)) {\n files.push(fullPath);\n }\n }\n }\n } catch (error) {\n // Skip directories we can't read\n }\n }\n \n await walk(dir);\n return files;\n }\n\n private async loadTeamMembers(workDir: string): Promise<TeamMember[]> {\n const teamConfigPath = join(workDir, '.trie', 'team.json');\n if (!existsSync(teamConfigPath)) {\n return [];\n }\n\n try {\n const content = await readFile(teamConfigPath, 'utf-8');\n const data = JSON.parse(content) as { members?: TeamMember[] };\n return Array.isArray(data.members) ? data.members : [];\n } catch {\n return [];\n }\n }\n\n private groupFilesByExtension(files: string[]): Record<string, number> {\n const byExt: Record<string, number> = {};\n for (const file of files) {\n const ext = extname(file) || 'other';\n byExt[ext] = (byExt[ext] || 0) + 1;\n }\n return byExt;\n }\n}\n","import { readFile } from 'fs/promises';\nimport { parse } from '@babel/parser';\nimport traverse from '@babel/traverse';\nimport { existsSync } from 'fs';\nimport { extname, basename } from 'path';\nimport type { CodeContext } from '../types/index.js';\n\nexport class ContextAnalyzer {\n async analyze(files: string[], userContext?: Partial<CodeContext>): Promise<CodeContext> {\n const context: CodeContext = {\n changeType: userContext?.changeType ?? 'general',\n isNewFeature: userContext?.isNewFeature ?? false,\n touchesUserData: userContext?.touchesUserData ?? false,\n touchesAuth: false,\n touchesPayments: false,\n touchesDatabase: false,\n touchesAPI: false,\n touchesUI: false,\n touchesHealthData: false,\n touchesSecurityConfig: false,\n linesChanged: 0,\n filePatterns: [],\n \n // NEW: Enhanced signals\n touchesCrypto: false,\n touchesFileSystem: false,\n touchesThirdPartyAPI: false,\n touchesLogging: false,\n touchesErrorHandling: false,\n hasTests: false,\n complexity: 'low',\n \n patterns: {\n hasAsyncCode: false,\n hasFormHandling: false,\n hasFileUploads: false,\n hasEmailHandling: false,\n hasRateLimiting: false,\n hasWebSockets: false,\n hasCaching: false,\n hasQueue: false,\n }\n };\n\n let totalLines = 0;\n let totalComplexity = 0;\n\n for (const file of files) {\n try {\n if (!existsSync(file)) {\n console.error(`File not found: ${file}`);\n continue;\n }\n\n // Skip signature/pattern definition files - they contain keywords but aren't real code\n if (this.isSignatureFile(file)) {\n continue;\n }\n\n const content = await readFile(file, 'utf-8');\n const lines = content.split('\\n').length;\n totalLines += lines;\n\n // Analyze file patterns\n if (!file) continue; // Skip if file is undefined\n const fileName = basename(file).toLowerCase();\n const filePath = file.toLowerCase();\n\n context.filePatterns.push(fileName);\n\n // Detect language\n if (!context.language) {\n context.language = this.detectLanguage(fileName);\n }\n\n // Check for test files\n if (/\\.(test|spec)\\.(ts|js|tsx|jsx)$/.test(fileName)) {\n context.hasTests = true;\n }\n\n // Detect context based on file patterns\n if (this.isAuthFile(fileName, filePath)) {\n context.touchesAuth = true;\n }\n\n if (this.isPaymentFile(fileName, filePath)) {\n context.touchesPayments = true;\n }\n\n if (this.isDatabaseFile(fileName, filePath)) {\n context.touchesDatabase = true;\n }\n\n if (this.isAPIFile(fileName, filePath)) {\n context.touchesAPI = true;\n }\n\n if (this.isUIFile(fileName, filePath)) {\n context.touchesUI = true;\n }\n\n if (this.isHealthFile(fileName, filePath)) {\n context.touchesHealthData = true;\n }\n\n if (this.isSecurityConfigFile(fileName, filePath)) {\n context.touchesSecurityConfig = true;\n }\n\n // Analyze code content\n const fileComplexity = await this.analyzeCodeContent(content, file, context);\n totalComplexity += fileComplexity;\n\n } catch (error) {\n console.error(`Error analyzing file ${file}:`, error);\n }\n }\n\n context.linesChanged = totalLines;\n\n // Calculate complexity\n const avgComplexity = files.length > 0 ? totalComplexity / files.length : 0;\n context.complexity = avgComplexity > 15 ? 'high' : avgComplexity > 8 ? 'medium' : 'low';\n\n // Override with user context if provided\n if (userContext) {\n Object.assign(context, userContext);\n }\n\n // Auto-detect change type if not specified\n if (!userContext?.changeType) {\n context.changeType = this.detectChangeType(context);\n }\n\n return context;\n }\n\n private detectLanguage(fileName: string): NonNullable<CodeContext['language']> {\n if (fileName.endsWith('.ts') || fileName.endsWith('.tsx')) return 'typescript';\n if (fileName.endsWith('.js') || fileName.endsWith('.jsx')) return 'javascript';\n if (fileName.endsWith('.py')) return 'python';\n if (fileName.endsWith('.go')) return 'go';\n if (fileName.endsWith('.rs')) return 'rust';\n return 'unknown';\n }\n\n private isAuthFile(fileName: string, filePath: string): boolean {\n const authPatterns = [\n 'auth', 'login', 'signup', 'register', 'session', 'jwt', 'token',\n 'password', 'oauth', 'signin', 'signout', 'middleware/auth',\n 'credential', 'sso', 'saml', 'oidc', '2fa', 'mfa', 'otp'\n ];\n return authPatterns.some(pattern =>\n fileName.includes(pattern) || filePath.includes(pattern)\n );\n }\n\n private isPaymentFile(fileName: string, filePath: string): boolean {\n const paymentPatterns = [\n 'payment', 'stripe', 'billing', 'checkout', 'subscription',\n 'invoice', 'charge', 'refund', 'paypal', 'merchant', 'cart',\n 'order', 'transaction', 'wallet', 'payout', 'pricing'\n ];\n return paymentPatterns.some(pattern =>\n fileName.includes(pattern) || filePath.includes(pattern)\n );\n }\n\n private isDatabaseFile(fileName: string, filePath: string): boolean {\n const dbPatterns = [\n 'model', 'schema', 'migration', 'seed', 'db', 'database',\n 'prisma', 'sequelize', 'mongoose', 'typeorm', 'knex',\n 'repository', 'entity', 'query'\n ];\n return dbPatterns.some(pattern =>\n fileName.includes(pattern) || filePath.includes(pattern)\n ) || fileName.endsWith('.sql');\n }\n\n private isAPIFile(fileName: string, filePath: string): boolean {\n const apiPatterns = [\n 'api/', 'route', 'handler', 'controller', 'endpoint',\n 'middleware', 'server', 'express', 'fastify', 'graphql',\n 'resolver', 'trpc'\n ];\n return apiPatterns.some(pattern =>\n fileName.includes(pattern) || filePath.includes(pattern)\n );\n }\n\n private isUIFile(fileName: string, filePath: string): boolean {\n const uiExtensions = ['.jsx', '.tsx', '.vue', '.svelte'];\n const uiPatterns = [\n 'component', 'page', 'layout', 'ui/', 'frontend/',\n 'client/', 'styles', 'css', 'view', 'template'\n ];\n\n return uiExtensions.some(ext => fileName.endsWith(ext)) ||\n uiPatterns.some(pattern => filePath.includes(pattern)) ||\n fileName.endsWith('.css') || fileName.endsWith('.scss');\n }\n\n private isHealthFile(fileName: string, filePath: string): boolean {\n // Avoid triggering on generic service health checks (healthz/health-check)\n const normalizedPath = `${filePath}`.toLowerCase();\n if (/healthz|health-check|healthcheck/.test(normalizedPath)) {\n return false;\n }\n\n const healthPatterns = [\n 'patient', 'medical', 'hipaa', 'phi',\n 'diagnosis', 'treatment', 'clinical', 'hospital',\n 'prescription', 'insurance', 'ehr', 'fhir'\n ];\n return healthPatterns.some(pattern =>\n fileName.includes(pattern) || normalizedPath.includes(pattern)\n );\n }\n\n private isSecurityConfigFile(fileName: string, filePath: string): boolean {\n const securityPatterns = [\n '.env', 'config', 'secret', 'key', 'cert', 'ssl',\n 'security', 'cors', 'helmet', 'csp', 'permission'\n ];\n return securityPatterns.some(pattern =>\n fileName.includes(pattern) || filePath.includes(pattern)\n );\n }\n\n /**\n * Check if file is a signature/pattern definition file (scanner's own rules)\n * These contain keywords like \"password\", \"auth\", \"payment\" as detection patterns,\n * not as actual code - skip them to avoid false context signals.\n */\n private isSignatureFile(filePath: string): boolean {\n const signaturePatterns = [\n /vulnerability-signatures\\.[jt]s$/,\n /vibe-code-signatures\\.[jt]s$/,\n /attack-surface\\.[jt]s$/,\n /semantic-analyzer\\.[jt]s$/,\n /smart-prioritizer\\.[jt]s$/,\n /context-analyzer\\.[jt]s$/,\n /triager\\.[jt]s$/,\n /risk-assessor\\.[jt]s$/,\n /base-agent\\.[jt]s$/,\n /\\/agents\\/.*\\.[jt]s$/, // All agent files contain detection patterns\n ];\n return signaturePatterns.some(pattern => pattern.test(filePath));\n }\n\n private async analyzeCodeContent(content: string, filePath: string, context: CodeContext): Promise<number> {\n const ext = extname(filePath);\n let complexity = 0;\n\n // Only parse JavaScript/TypeScript files\n if (!['.js', '.jsx', '.ts', '.tsx'].includes(ext)) {\n this.analyzeTextContent(content, context);\n return this.calculateTextComplexity(content);\n }\n\n try {\n const ast = parse(content, {\n sourceType: 'module',\n plugins: [\n 'jsx',\n 'typescript',\n 'decorators-legacy',\n 'classProperties',\n 'asyncGenerators',\n 'functionBind',\n 'exportDefaultFrom',\n 'objectRestSpread',\n 'dynamicImport'\n ]\n });\n\n traverse(ast, {\n // Detect imports that indicate specific domains\n ImportDeclaration: (path) => {\n const source = path.node.source?.value;\n if (source) {\n this.analyzeImport(source, context);\n }\n },\n\n // Detect function calls\n CallExpression: (path) => {\n const callee = path.node.callee;\n let functionName = '';\n\n if (callee.type === 'Identifier') {\n functionName = callee.name ?? '';\n } else if (callee.type === 'MemberExpression' &&\n callee.property.type === 'Identifier') {\n functionName = callee.property.name ?? '';\n }\n\n this.analyzeFunctionCall(functionName, context);\n },\n\n // Count complexity\n IfStatement: () => { complexity++; },\n ConditionalExpression: () => { complexity++; },\n SwitchCase: () => { complexity++; },\n ForStatement: () => { complexity++; },\n ForInStatement: () => { complexity++; },\n ForOfStatement: () => { complexity++; },\n WhileStatement: () => { complexity++; },\n DoWhileStatement: () => { complexity++; },\n CatchClause: () => { \n complexity++; \n context.touchesErrorHandling = true;\n },\n \n // Detect async patterns\n AwaitExpression: () => {\n context.patterns.hasAsyncCode = true;\n },\n\n // Detect string literals\n StringLiteral: (path) => {\n const value = path.node.value?.toLowerCase() ?? '';\n this.analyzeStringLiteral(value, context);\n }\n });\n\n } catch (error) {\n // Fall back to text analysis if parsing fails\n this.analyzeTextContent(content, context);\n complexity = this.calculateTextComplexity(content);\n }\n\n return complexity;\n }\n\n private analyzeImport(source: string, context: CodeContext): void {\n if (!source) return; // Skip if source is empty or undefined\n const s = source.toLowerCase();\n\n // Framework detection\n if (s.includes('react') || s.includes('next')) {\n context.framework = s.includes('next') ? 'nextjs' : 'react';\n } else if (s.includes('vue')) {\n context.framework = 'vue';\n } else if (s.includes('angular')) {\n context.framework = 'angular';\n } else if (s.includes('svelte')) {\n context.framework = 'svelte';\n } else if (s.includes('express')) {\n context.framework = 'express';\n } else if (s.includes('fastify')) {\n context.framework = 'fastify';\n }\n\n // Auth libraries\n if (['bcrypt', 'passport', 'jsonwebtoken', 'express-session', 'auth0', \n 'next-auth', 'lucia', 'clerk'].some(lib => s.includes(lib))) {\n context.touchesAuth = true;\n }\n\n // Payment libraries\n if (['stripe', 'paypal', 'braintree', 'square', 'paddle'].some(lib => s.includes(lib))) {\n context.touchesPayments = true;\n }\n\n // Database libraries\n if (['prisma', 'sequelize', 'mongoose', 'typeorm', 'pg', 'mysql', \n 'drizzle', 'knex', 'redis'].some(lib => s.includes(lib))) {\n context.touchesDatabase = true;\n }\n\n // UI libraries\n if (['react', 'vue', 'angular', 'svelte', 'styled-components', \n 'tailwind', 'chakra', 'mui', 'antd'].some(lib => s.includes(lib))) {\n context.touchesUI = true;\n }\n\n // Crypto libraries\n if (['crypto', 'bcrypt', 'argon2', 'sodium', 'forge'].some(lib => s.includes(lib))) {\n context.touchesCrypto = true;\n }\n\n // File system\n if (['fs', 'path', 'multer', 'formidable', 'busboy', 'sharp'].some(lib => s.includes(lib))) {\n context.touchesFileSystem = true;\n }\n\n // Third-party APIs\n if (['axios', 'node-fetch', 'got', 'superagent', 'openai', 'anthropic', \n 'twilio', 'sendgrid', 'aws-sdk', 'googleapis'].some(lib => s.includes(lib))) {\n context.touchesThirdPartyAPI = true;\n }\n\n // Logging\n if (['winston', 'pino', 'bunyan', 'log4js', 'morgan'].some(lib => s.includes(lib))) {\n context.touchesLogging = true;\n }\n\n // WebSockets\n if (['socket.io', 'ws', 'websocket', 'pusher'].some(lib => s.includes(lib))) {\n context.patterns.hasWebSockets = true;\n }\n\n // Caching\n if (['redis', 'memcached', 'lru-cache', 'node-cache'].some(lib => s.includes(lib))) {\n context.patterns.hasCaching = true;\n }\n\n // Queues\n if (['bullmq', 'bull', 'agenda', 'bee-queue', 'rabbitmq', 'amqp'].some(lib => s.includes(lib))) {\n context.patterns.hasQueue = true;\n }\n\n // Rate limiting\n if (['express-rate-limit', 'rate-limiter-flexible', 'bottleneck'].some(lib => s.includes(lib))) {\n context.patterns.hasRateLimiting = true;\n }\n\n // Email\n if (['nodemailer', 'sendgrid', 'mailgun', 'postmark', 'ses'].some(lib => s.includes(lib))) {\n context.patterns.hasEmailHandling = true;\n }\n }\n\n private analyzeFunctionCall(name: string, context: CodeContext): void {\n if (!name) return; // Skip if name is empty or undefined\n const n = name.toLowerCase();\n\n // Auth functions\n if (['hash', 'compare', 'sign', 'verify', 'authenticate', 'login', 'logout'].includes(n)) {\n context.touchesAuth = true;\n }\n\n // Payment functions\n if (['charge', 'refund', 'subscription', 'invoice', 'payment'].some(f => n.includes(f))) {\n context.touchesPayments = true;\n }\n\n // Database functions\n if (['find', 'create', 'update', 'delete', 'save', 'query', 'execute', 'insert'].includes(n)) {\n context.touchesDatabase = true;\n }\n\n // File operations\n if (['readfile', 'writefile', 'mkdir', 'unlink', 'upload'].some(f => n.includes(f))) {\n context.touchesFileSystem = true;\n if (n.includes('upload')) {\n context.patterns.hasFileUploads = true;\n }\n }\n\n // Logging\n if (['log', 'info', 'warn', 'error', 'debug'].includes(n)) {\n context.touchesLogging = true;\n }\n }\n\n private analyzeStringLiteral(value: string, context: CodeContext): void {\n // PII patterns\n if (['email', 'phone', 'address', 'ssn', 'social', 'credit', 'passport', \n 'dob', 'birth', 'salary', 'income'].some(p => value.includes(p))) {\n context.touchesUserData = true;\n }\n\n // Health patterns\n if (['patient', 'medical', 'diagnosis', 'treatment', 'medication', \n 'symptom', 'prescription', 'insurance'].some(p => value.includes(p))) {\n context.touchesHealthData = true;\n }\n\n // Form patterns\n if (['submit', 'form', 'input', 'validation', 'required'].some(p => value.includes(p))) {\n context.patterns.hasFormHandling = true;\n }\n }\n\n private analyzeTextContent(content: string, context: CodeContext): void {\n const lowerContent = content.toLowerCase();\n\n const authKeywords = ['password', 'auth', 'login', 'jwt', 'session', 'token', 'credential'];\n const paymentKeywords = ['stripe', 'payment', 'billing', 'checkout', 'subscription', 'invoice'];\n const dbKeywords = ['select', 'insert', 'update', 'delete', 'database', 'query', 'prisma'];\n const uiKeywords = ['component', 'render', 'jsx', 'css', 'style', 'button', 'form'];\n const piiKeywords = ['email', 'phone', 'address', 'ssn', 'social'];\n const healthKeywords = ['patient', 'medical', 'diagnosis', 'treatment', 'hipaa'];\n const cryptoKeywords = ['encrypt', 'decrypt', 'hash', 'crypto', 'cipher', 'key'];\n const asyncKeywords = ['async', 'await', 'promise', 'then', 'catch'];\n\n if (authKeywords.some(k => lowerContent.includes(k))) context.touchesAuth = true;\n if (paymentKeywords.some(k => lowerContent.includes(k))) context.touchesPayments = true;\n if (dbKeywords.some(k => lowerContent.includes(k))) context.touchesDatabase = true;\n if (uiKeywords.some(k => lowerContent.includes(k))) context.touchesUI = true;\n if (piiKeywords.some(k => lowerContent.includes(k))) context.touchesUserData = true;\n if (healthKeywords.some(k => lowerContent.includes(k))) context.touchesHealthData = true;\n if (cryptoKeywords.some(k => lowerContent.includes(k))) context.touchesCrypto = true;\n if (asyncKeywords.some(k => lowerContent.includes(k))) context.patterns.hasAsyncCode = true;\n\n // File patterns\n if (/upload|multer|formdata|file/i.test(lowerContent)) {\n context.patterns.hasFileUploads = true;\n context.touchesFileSystem = true;\n }\n\n // Email patterns\n if (/nodemailer|sendgrid|email.*send|send.*email/i.test(lowerContent)) {\n context.patterns.hasEmailHandling = true;\n }\n\n // WebSocket patterns\n if (/websocket|socket\\.io|ws\\./i.test(lowerContent)) {\n context.patterns.hasWebSockets = true;\n }\n\n // Error handling patterns\n if (/try\\s*{|catch\\s*\\(|\\.catch\\(|throw\\s+new/i.test(content)) {\n context.touchesErrorHandling = true;\n }\n\n // Logging patterns \n if (/console\\.(log|info|warn|error)|logger\\./i.test(content)) {\n context.touchesLogging = true;\n }\n }\n\n private calculateTextComplexity(content: string): number {\n let complexity = 0;\n \n // Count control flow statements\n complexity += (content.match(/\\bif\\b/g) || []).length;\n complexity += (content.match(/\\belse\\b/g) || []).length;\n complexity += (content.match(/\\bfor\\b/g) || []).length;\n complexity += (content.match(/\\bwhile\\b/g) || []).length;\n complexity += (content.match(/\\bswitch\\b/g) || []).length;\n complexity += (content.match(/\\bcatch\\b/g) || []).length;\n complexity += (content.match(/\\?\\s*.*\\s*:/g) || []).length; // ternary\n\n return complexity;\n }\n\n private detectChangeType(context: CodeContext): CodeContext['changeType'] {\n // Priority order for change type detection\n if (context.touchesPayments) return 'payment';\n if (context.touchesAuth) return 'auth';\n if (context.touchesDatabase) return 'database';\n if (context.touchesAPI) return 'api';\n if (context.touchesUI) return 'ui';\n return 'general';\n }\n}\n","import type { CodeContext, RiskLevel } from '../types/index.js';\n\nexport class RiskAssessor {\n assessRisk(context: CodeContext): RiskLevel {\n let score = 0;\n\n // Base scoring from PRD\n if (context.touchesAuth) score += 35;\n if (context.touchesPayments) score += 50;\n if (context.touchesDatabase) score += 25;\n if (context.touchesUserData) score += 20;\n if (context.touchesHealthData) score += 60; // HIPAA critical\n if (context.linesChanged > 500) score += 20;\n if (context.touchesSecurityConfig) score += 35;\n\n // Additional risk factors\n if (context.touchesAPI) score += 20;\n if (context.isNewFeature) score += 15;\n if (context.touchesUI && context.touchesUserData) score += 10; // Forms with PII\n\n // Risk multipliers for dangerous combinations\n if (context.touchesAuth && context.touchesDatabase) score += 5; // Auth + DB is risky\n if (context.touchesPayments && context.touchesUserData) score += 15; // Payment + PII\n if (context.touchesHealthData && context.touchesDatabase) score += 20; // PHI storage\n\n // Classify risk level\n if (score >= 95) return 'critical';\n if (score >= 60) return 'high';\n if (score >= 25) return 'medium';\n return 'low';\n }\n\n getRiskExplanation(context: CodeContext, riskLevel: RiskLevel): string {\n const reasons = [];\n\n if (context.touchesAuth) {\n reasons.push('handles authentication/authorization');\n }\n if (context.touchesPayments) {\n reasons.push('processes payments');\n }\n if (context.touchesDatabase) {\n reasons.push('modifies database');\n }\n if (context.touchesUserData) {\n reasons.push('handles user data');\n }\n if (context.touchesHealthData) {\n reasons.push('handles protected health information');\n }\n if (context.touchesSecurityConfig) {\n reasons.push('modifies security configuration');\n }\n if (context.linesChanged > 500) {\n reasons.push('large code change');\n }\n if (context.isNewFeature) {\n reasons.push('introduces new functionality');\n }\n\n const explanation = reasons.length > 0\n ? `Risk level ${riskLevel} because code ${reasons.join(', ')}`\n : `Risk level ${riskLevel} - general code change`;\n\n return explanation;\n }\n\n shouldRunAllAgents(riskLevel: RiskLevel): boolean {\n return riskLevel === 'critical';\n }\n}","/**\n * Context State Manager\n * \n * Manages the .trie/AGENTS.md file that provides context to AI coding assistants.\n * Updates automatically when agents run to keep context current.\n */\n\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { getWorkingDirectory } from './workspace.js';\nimport type { AgentResult } from '../types/index.js';\n\nexport interface ScanSummary {\n timestamp: string;\n agents: string[];\n filesScanned: number;\n issues: {\n critical: number;\n serious: number;\n moderate: number;\n low: number;\n total: number;\n };\n duration: number;\n hotFiles: Array<{ file: string; issueCount: number }>;\n}\n\nexport interface ContextState {\n lastScan: ScanSummary | null;\n healthScore: number;\n activePriorities: string[];\n contextSignals: Record<string, boolean>;\n agentStatus: Record<string, {\n lastRun: string | null;\n issuesFound: number;\n }>;\n scanHistory: ScanSummary[];\n customAgents: string[];\n}\n\nconst AGENTS_MD_PATH = '.trie/AGENTS.md';\nconst STATE_JSON_PATH = '.trie/state.json';\n\n/**\n * Load current context state\n */\nexport async function loadContextState(): Promise<ContextState> {\n const workDir = getWorkingDirectory(undefined, true);\n const statePath = join(workDir, STATE_JSON_PATH);\n \n try {\n if (existsSync(statePath)) {\n const content = await readFile(statePath, 'utf-8');\n return JSON.parse(content);\n }\n } catch {\n // Return default state\n }\n \n return getDefaultState();\n}\n\n/**\n * Save context state\n */\nexport async function saveContextState(state: ContextState): Promise<void> {\n const workDir = getWorkingDirectory(undefined, true);\n const trieDir = join(workDir, '.trie');\n const statePath = join(workDir, STATE_JSON_PATH);\n \n // Ensure directory exists\n await mkdir(trieDir, { recursive: true });\n \n await writeFile(statePath, JSON.stringify(state, null, 2));\n}\n\n/**\n * Update context state after a scan\n */\nexport async function updateContextAfterScan(\n results: AgentResult[],\n filesScanned: number,\n contextSignals: Record<string, boolean>,\n duration: number\n): Promise<void> {\n const state = await loadContextState();\n const now = new Date().toISOString();\n \n // Calculate issue counts\n const allIssues = results.flatMap(r => r.issues);\n const issueCounts = {\n critical: allIssues.filter(i => i.severity === 'critical').length,\n serious: allIssues.filter(i => i.severity === 'serious').length,\n moderate: allIssues.filter(i => i.severity === 'moderate').length,\n low: allIssues.filter(i => i.severity === 'low').length,\n total: allIssues.length,\n };\n \n // Find hot files\n const fileIssueMap = new Map<string, number>();\n for (const issue of allIssues) {\n const count = fileIssueMap.get(issue.file) || 0;\n fileIssueMap.set(issue.file, count + 1);\n }\n const hotFiles = Array.from(fileIssueMap.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([file, issueCount]) => ({ file, issueCount }));\n \n // Create scan summary\n const scanSummary: ScanSummary = {\n timestamp: now,\n agents: results.map(r => r.agent),\n filesScanned,\n issues: issueCounts,\n duration,\n hotFiles,\n };\n \n // Update agent status\n for (const result of results) {\n state.agentStatus[result.agent] = {\n lastRun: now,\n issuesFound: result.issues.length,\n };\n }\n \n // Calculate health score (0-100)\n // Penalize critical issues heavily, serious issues moderately\n const criticalPenalty = issueCounts.critical * 25;\n const seriousPenalty = issueCounts.serious * 10;\n const moderatePenalty = issueCounts.moderate * 3;\n const lowPenalty = issueCounts.low * 1;\n const totalPenalty = Math.min(100, criticalPenalty + seriousPenalty + moderatePenalty + lowPenalty);\n state.healthScore = Math.max(0, 100 - totalPenalty);\n \n // Update priorities based on issues\n state.activePriorities = generatePriorities(issueCounts, contextSignals);\n \n // Update context signals\n state.contextSignals = { ...state.contextSignals, ...contextSignals };\n \n // Update scan history (keep last 20)\n state.scanHistory = [scanSummary, ...state.scanHistory.slice(0, 19)];\n state.lastScan = scanSummary;\n \n // Save state\n await saveContextState(state);\n \n // Update AGENTS.md\n await updateAgentsMd(state);\n}\n\n/**\n * Update the AGENTS.md file with current state\n */\nasync function updateAgentsMd(state: ContextState): Promise<void> {\n const workDir = getWorkingDirectory(undefined, true);\n const mdPath = join(workDir, AGENTS_MD_PATH);\n \n let content: string;\n try {\n content = await readFile(mdPath, 'utf-8');\n } catch {\n // Use template if file doesn't exist\n content = getAgentsMdTemplate();\n }\n \n // Update sections\n content = updateSection(content, 'Project State', generateProjectStateTable(state));\n content = updateSection(content, 'Active Priorities', generatePrioritiesList(state));\n content = updateSection(content, 'Agent Status', generateAgentStatusTable(state));\n content = updateSection(content, 'Recent Scan History', generateScanHistoryTable(state));\n content = updateSection(content, 'Context Signals Detected', generateContextSignals(state));\n content = updateSection(content, 'Risk Assessment', generateRiskAssessment(state));\n content = updateSection(content, 'Hot Files', generateHotFilesSection(state));\n \n // Update last updated timestamp\n content = content.replace(\n /Last updated:.*$/m,\n `Last updated: ${new Date().toISOString()}`\n );\n \n await writeFile(mdPath, content);\n}\n\n/**\n * Update a specific section in the markdown\n */\nfunction updateSection(content: string, sectionName: string, newContent: string): string {\n // Look for the section header and replace content until the next section\n const sectionRegex = new RegExp(\n `(### ${sectionName}[\\\\s\\\\S]*?)(?=###|---|\\n## |$)`,\n 'g'\n );\n \n const replacement = `### ${sectionName}\\n${newContent}\\n\\n`;\n \n if (content.match(sectionRegex)) {\n return content.replace(sectionRegex, replacement);\n }\n \n // Section doesn't exist, don't add it\n return content;\n}\n\n/**\n * Generate the project state table\n */\nfunction generateProjectStateTable(state: ContextState): string {\n const lastScan = state.lastScan;\n const lastScanDate = lastScan ? new Date(lastScan.timestamp).toLocaleString() : 'Never';\n const criticalCount = lastScan?.issues.critical ?? 0;\n const totalTasks = lastScan?.issues.total ?? 0;\n \n return `| Metric | Value | Updated |\n|--------|-------|---------|\n| Last Scan | ${lastScanDate} | ${lastScan ? 'Auto' : '-'} |\n| Critical Issues | ${criticalCount} | ${lastScan ? 'Auto' : '-'} |\n| Open Tasks | ${totalTasks} | ${lastScan ? 'Auto' : '-'} |\n| Health Score | ${state.healthScore}% | ${lastScan ? 'Auto' : '-'} |`;\n}\n\n/**\n * Generate priorities list\n */\nfunction generatePrioritiesList(state: ContextState): string {\n if (state.activePriorities.length === 0) {\n return '_No active priorities. Run a scan to identify issues._';\n }\n \n return state.activePriorities\n .map((p, i) => `${i + 1}. ${p}`)\n .join('\\n');\n}\n\n/**\n * Generate priorities based on scan results\n */\nfunction generatePriorities(\n issues: { critical: number; serious: number; moderate: number; low: number },\n contextSignals: Record<string, boolean>\n): string[] {\n const priorities: string[] = [];\n \n if (issues.critical > 0) {\n priorities.push(`🚨 Fix ${issues.critical} critical security issue${issues.critical > 1 ? 's' : ''} immediately`);\n }\n \n if (issues.serious > 0) {\n priorities.push(`⚠️ Address ${issues.serious} serious issue${issues.serious > 1 ? 's' : ''} before deployment`);\n }\n \n if (contextSignals.touchesAuth && issues.critical === 0) {\n priorities.push('✅ Auth code reviewed - continue monitoring');\n }\n \n if (contextSignals.touchesPayments) {\n priorities.push('💳 Payment code detected - ensure PCI compliance');\n }\n \n if (contextSignals.touchesUserData) {\n priorities.push('🔐 User data handling detected - verify privacy compliance');\n }\n \n if (issues.moderate > 5) {\n priorities.push(`📋 Schedule time to address ${issues.moderate} moderate issues`);\n }\n \n if (priorities.length === 0) {\n priorities.push('✨ No critical issues - focus on feature development');\n }\n \n return priorities.slice(0, 5);\n}\n\n/**\n * Generate agent status table\n */\nfunction generateAgentStatusTable(state: ContextState): string {\n const builtInAgents = [\n 'security', 'privacy', 'legal', 'accessibility', 'bugs',\n 'design', 'architecture', 'performance', 'devops', 'soc2',\n 'e2e', 'typecheck', 'visual-qa', 'data-flow'\n ];\n \n let table = `| Agent | Status | Last Run | Issues Found |\n|-------|--------|----------|--------------|`;\n \n for (const agent of builtInAgents) {\n const status = state.agentStatus[agent];\n const lastRun = status?.lastRun \n ? new Date(status.lastRun).toLocaleDateString()\n : 'Never';\n const issues = status?.issuesFound ?? '-';\n const statusEmoji = status ? '✅' : '⏸️';\n \n table += `\\n| ${agent} | ${statusEmoji} Ready | ${lastRun} | ${issues} |`;\n }\n \n return table;\n}\n\n/**\n * Generate scan history table\n */\nfunction generateScanHistoryTable(state: ContextState): string {\n if (state.scanHistory.length === 0) {\n return `| Date | Agents | Files | Issues | Duration |\n|------|--------|-------|--------|----------|\n| - | - | - | - | - |`;\n }\n \n let table = `| Date | Agents | Files | Issues | Duration |\n|------|--------|-------|--------|----------|`;\n \n for (const scan of state.scanHistory.slice(0, 10)) {\n const date = new Date(scan.timestamp).toLocaleDateString();\n const agents = scan.agents.slice(0, 3).join(', ') + (scan.agents.length > 3 ? '...' : '');\n const duration = `${(scan.duration / 1000).toFixed(1)}s`;\n \n table += `\\n| ${date} | ${agents} | ${scan.filesScanned} | ${scan.issues.total} | ${duration} |`;\n }\n \n return table;\n}\n\n/**\n * Generate context signals section\n */\nfunction generateContextSignals(state: ContextState): string {\n const signals = [\n 'touchesAuth',\n 'touchesPayments', \n 'touchesUserData',\n 'touchesAPI',\n 'touchesDatabase',\n 'touchesCrypto'\n ];\n \n return signals\n .map(s => {\n const value = state.contextSignals[s];\n const emoji = value === true ? '✅' : value === false ? '❌' : '❓';\n return `- \\`${s}\\`: ${emoji} ${value === undefined ? 'Unknown' : value ? 'Yes' : 'No'}`;\n })\n .join('\\n');\n}\n\n/**\n * Generate risk assessment section\n */\nfunction generateRiskAssessment(state: ContextState): string {\n const score = state.healthScore;\n let riskLevel: string;\n let confidence: number;\n \n if (state.lastScan === null) {\n return `- Overall Risk: Unknown\n- Confidence: 0%`;\n }\n \n if (score >= 90) {\n riskLevel = '🟢 Low';\n confidence = 95;\n } else if (score >= 70) {\n riskLevel = '🟡 Medium';\n confidence = 85;\n } else if (score >= 50) {\n riskLevel = '🟠 High';\n confidence = 80;\n } else {\n riskLevel = '🔴 Critical';\n confidence = 90;\n }\n \n return `- Overall Risk: ${riskLevel}\n- Health Score: ${score}%\n- Confidence: ${confidence}%`;\n}\n\n/**\n * Generate hot files section\n */\nfunction generateHotFilesSection(state: ContextState): string {\n if (!state.lastScan || state.lastScan.hotFiles.length === 0) {\n return '_Run a scan to identify hot files._';\n }\n \n return state.lastScan.hotFiles\n .map(f => `- \\`${f.file}\\` - ${f.issueCount} issue${f.issueCount > 1 ? 's' : ''}`)\n .join('\\n');\n}\n\n/**\n * Get default state\n */\nfunction getDefaultState(): ContextState {\n return {\n lastScan: null,\n healthScore: 0,\n activePriorities: [\n 'Initial setup required - run first scan with `trie scan`',\n 'Configure agents in `.trie/config.json`',\n 'Set up CI/CD integration'\n ],\n contextSignals: {},\n agentStatus: {},\n scanHistory: [],\n customAgents: []\n };\n}\n\n/**\n * Get the AGENTS.md template\n */\nfunction getAgentsMdTemplate(): string {\n return `# Trie Agent Context\n\n> **Auto-generated file** - Updated automatically when agents run.\n> Last updated: Never (initial state)\n\nThis file provides prioritized context for all AI coding assistants working with this codebase.\nAgents should read this file first and update it after completing scans.\n\n---\n\n## Quick Context (Read First)\n\n### Project State\n| Metric | Value | Updated |\n|--------|-------|---------|\n| Last Scan | Never | - |\n| Critical Issues | 0 | - |\n| Open Tasks | 0 | - |\n| Health Score | Unknown | - |\n\n### Active Priorities\n1. Initial setup required - run first scan with \\`trie scan\\`\n2. Configure agents in \\`.trie/config.json\\`\n3. Set up CI/CD integration\n\n### Hot Files\n_Run a scan to identify hot files._\n\n---\n\n## Agent Status\n\n### Agent Status\n| Agent | Status | Last Run | Issues Found |\n|-------|--------|----------|--------------|\n| security | Ready | Never | - |\n| privacy | Ready | Never | - |\n| bugs | Ready | Never | - |\n\n### Recent Scan History\n| Date | Agents | Files | Issues | Duration |\n|------|--------|-------|--------|----------|\n| - | - | - | - | - |\n\n---\n\n## Context Analysis\n\n### Context Signals Detected\n- \\`touchesAuth\\`: Unknown\n- \\`touchesPayments\\`: Unknown\n- \\`touchesUserData\\`: Unknown\n- \\`touchesAPI\\`: Unknown\n- \\`touchesDatabase\\`: Unknown\n- \\`touchesCrypto\\`: Unknown\n\n### Risk Assessment\n- Overall Risk: Unknown\n- Confidence: 0%\n\n---\n\n*This file is maintained by Trie agents. Manual edits will be preserved in non-auto sections.*\n`;\n}\n\n/**\n * Add custom agent to context state\n */\nexport async function addCustomAgentToContext(agentName: string): Promise<void> {\n const state = await loadContextState();\n \n if (!state.customAgents.includes(agentName)) {\n state.customAgents.push(agentName);\n await saveContextState(state);\n }\n}\n\n/**\n * Get context state for AI assistants (formatted summary)\n */\nexport async function getContextForAI(): Promise<string> {\n const state = await loadContextState();\n \n const lines = [\n '## Trie Context Summary',\n '',\n `**Health Score:** ${state.healthScore}%`,\n `**Last Scan:** ${state.lastScan ? new Date(state.lastScan.timestamp).toLocaleString() : 'Never'}`,\n '',\n '**Active Priorities:**',\n ...state.activePriorities.map(p => `- ${p}`),\n '',\n ];\n \n if (state.lastScan) {\n lines.push(\n '**Recent Issues:**',\n `- Critical: ${state.lastScan.issues.critical}`,\n `- Serious: ${state.lastScan.issues.serious}`,\n `- Moderate: ${state.lastScan.issues.moderate}`,\n `- Low: ${state.lastScan.issues.low}`,\n ''\n );\n \n if (state.lastScan.hotFiles.length > 0) {\n lines.push(\n '**Hot Files (most issues):**',\n ...state.lastScan.hotFiles.slice(0, 5).map(f => `- ${f.file}: ${f.issueCount} issues`),\n ''\n );\n }\n }\n \n return lines.join('\\n');\n}\n","import type { CodeContext, RiskLevel, Agent, TriagingConfig } from '../types/index.js';\nimport { getAgentRegistry } from '../agents/registry.js';\nimport { CustomAgent } from '../agents/custom-agent.js';\nimport { loadContextState, type ContextState } from '../utils/context-state.js';\n\ninterface AgentScore {\n agent: Agent;\n confidence: number;\n reasons: string[];\n tier: number;\n isCustom: boolean;\n}\n\nexport class Triager {\n private agentRegistry = getAgentRegistry();\n private config: TriagingConfig;\n private customAgentsLoaded = false;\n private contextState: ContextState | null = null;\n\n constructor(config?: Partial<TriagingConfig>) {\n this.config = {\n minConfidence: 0.15,\n maxAgents: 11,\n timeoutMs: 60000,\n enableCostAware: false,\n enableDependencies: true,\n ...config\n };\n }\n\n /**\n * Load previous context state for smart triaging\n */\n private async loadPreviousContext(): Promise<void> {\n if (this.contextState === null) {\n try {\n this.contextState = await loadContextState();\n } catch {\n this.contextState = null;\n }\n }\n }\n\n /**\n * Ensure custom agents are loaded before triaging\n */\n private async ensureCustomAgentsLoaded(): Promise<void> {\n if (!this.customAgentsLoaded) {\n await this.agentRegistry.loadCustomAgents();\n this.customAgentsLoaded = true;\n }\n }\n\n async selectAgents(context: CodeContext, riskLevel: RiskLevel): Promise<Agent[]> {\n // Load custom agents if not already loaded\n await this.ensureCustomAgentsLoaded();\n \n // Load previous context state for smart triaging\n await this.loadPreviousContext();\n \n // Escalate risk based on previous health score\n let effectiveRiskLevel = riskLevel;\n if (this.contextState?.healthScore !== undefined && this.contextState.healthScore < 50) {\n // Low health score = escalate to high risk\n if (riskLevel === 'low' || riskLevel === 'medium') {\n effectiveRiskLevel = 'high';\n console.error(` 📊 Health score ${this.contextState.healthScore}% - escalating to ${effectiveRiskLevel.toUpperCase()} risk`);\n }\n }\n \n // HIGH or CRITICAL RISK = ALL AGENTS\n if (effectiveRiskLevel === 'critical' || effectiveRiskLevel === 'high') {\n console.error(` ⚠️ ${effectiveRiskLevel.toUpperCase()} risk - activating all agents for comprehensive review`);\n return this.getAllAgents();\n }\n\n // Score all agents based on context (with history boost)\n const scores = this.scoreAgents(context, effectiveRiskLevel);\n \n // Boost agents that found issues in previous scans\n this.boostAgentsWithHistory(scores);\n \n // Log scoring for transparency\n this.logAgentScoring(scores);\n\n // Filter by confidence threshold\n const qualified = scores.filter(s => s.confidence >= this.config.minConfidence);\n\n // Sort by tier (priority) then confidence\n qualified.sort((a, b) => {\n if (a.tier !== b.tier) return a.tier - b.tier;\n return b.confidence - a.confidence;\n });\n\n // Resolve dependencies if enabled\n if (this.config.enableDependencies) {\n return this.resolveDependencies(qualified.map(s => s.agent));\n }\n\n return qualified.map(s => s.agent);\n }\n\n /**\n * Boost confidence for agents that found issues in previous scans\n */\n private boostAgentsWithHistory(scores: AgentScore[]): void {\n if (!this.contextState?.agentStatus) return;\n \n for (const score of scores) {\n const previousRun = this.contextState.agentStatus[score.agent.name];\n if (previousRun?.issuesFound && previousRun.issuesFound > 0) {\n // Boost confidence for agents that found issues before\n const boost = Math.min(0.3, previousRun.issuesFound * 0.05);\n score.confidence = Math.min(1.0, score.confidence + boost);\n score.reasons.push(`found ${previousRun.issuesFound} issues in last scan`);\n }\n }\n }\n\n private scoreAgents(context: CodeContext, riskLevel: RiskLevel): AgentScore[] {\n const allAgents = this.getAllAgents();\n const scores: AgentScore[] = [];\n\n for (const agent of allAgents) {\n const score = this.scoreAgent(agent, context, riskLevel);\n scores.push(score);\n }\n\n return scores;\n }\n\n private scoreAgent(agent: Agent, context: CodeContext, riskLevel: RiskLevel): AgentScore {\n // Check if this is a custom agent\n if (agent instanceof CustomAgent) {\n return this.scoreCustomAgent(agent, context, riskLevel);\n }\n \n // Built-in agent scoring\n return this.scoreBuiltinAgent(agent, context, riskLevel);\n }\n\n /**\n * Score custom agents using their activation rules\n */\n private scoreCustomAgent(agent: CustomAgent, context: CodeContext, riskLevel: RiskLevel): AgentScore {\n const reasons: string[] = [];\n \n // Use the agent's built-in activation confidence\n let confidence = agent.getActivationConfidence(context);\n \n if (confidence > 0) {\n reasons.push(`custom agent: ${agent.getMetadata().category}`);\n \n // Add metadata info\n const meta = agent.getMetadata();\n if (meta.patternCount > 0) {\n reasons.push(`${meta.patternCount} detection patterns`);\n }\n }\n \n // Risk escalation for custom agents too\n if (riskLevel === 'high' && confidence > 0) {\n confidence = Math.min(1.0, confidence * 1.2);\n }\n \n return {\n agent,\n confidence,\n reasons,\n tier: agent.priority.tier,\n isCustom: true,\n };\n }\n\n /**\n * Score built-in agents\n */\n private scoreBuiltinAgent(agent: Agent, context: CodeContext, riskLevel: RiskLevel): AgentScore {\n const reasons: string[] = [];\n let confidence = 0;\n let tier = 3; // default to lowest tier\n\n // TIER 1: ALWAYS RUN AGENTS\n if (agent.name === 'typecheck') {\n tier = 1;\n confidence = 1.0;\n reasons.push('fundamental type safety');\n }\n\n if (agent.name === 'comprehension') {\n tier = 1;\n confidence = 1.0;\n reasons.push('stakeholder communication');\n }\n\n // TIER 2: CONTEXT-DEPENDENT AGENTS\n if (agent.name === 'security') {\n tier = 2;\n if (context.touchesAuth) { confidence += 0.4; reasons.push('auth code'); }\n if (context.touchesPayments) { confidence += 0.4; reasons.push('payment code'); }\n if (context.touchesAPI) { confidence += 0.3; reasons.push('API endpoints'); }\n if (context.touchesDatabase) { confidence += 0.25; reasons.push('database access'); }\n if (context.touchesCrypto) { confidence += 0.35; reasons.push('cryptographic operations'); }\n if (context.touchesUserData) { confidence += 0.3; reasons.push('user data'); }\n if (context.touchesSecurityConfig) { confidence += 0.4; reasons.push('security config'); }\n if (context.touchesThirdPartyAPI) { confidence += 0.2; reasons.push('third-party integration'); }\n if (context.patterns?.hasFileUploads) { confidence += 0.3; reasons.push('file uploads'); }\n \n // Risk escalation\n if (riskLevel === 'high') confidence *= 1.2;\n }\n\n if (agent.name === 'privacy') {\n tier = 2;\n if (context.touchesUserData) { confidence += 0.5; reasons.push('PII handling'); }\n if (context.touchesAuth) { confidence += 0.3; reasons.push('credentials'); }\n if (context.touchesLogging) { confidence += 0.25; reasons.push('logging (may expose data)'); }\n if (context.patterns?.hasEmailHandling) { confidence += 0.3; reasons.push('email handling'); }\n if (context.patterns?.hasFormHandling) { confidence += 0.2; reasons.push('form data'); }\n }\n\n if (agent.name === 'legal') {\n tier = 2;\n if (context.touchesUserData) { confidence += 0.4; reasons.push('GDPR/CCPA'); }\n if (context.touchesPayments) { confidence += 0.35; reasons.push('PCI-DSS'); }\n if (context.patterns?.hasEmailHandling) { confidence += 0.25; reasons.push('CAN-SPAM'); }\n }\n\n if (agent.name === 'accessibility') {\n tier = 2;\n if (context.touchesUI) { confidence += 0.6; reasons.push('UI components'); }\n if (context.framework === 'react' || context.framework === 'vue') { \n confidence += 0.2; \n reasons.push(`${context.framework} framework`); \n }\n if (context.patterns?.hasFormHandling) { confidence += 0.2; reasons.push('form UX'); }\n }\n\n if (agent.name === 'test') {\n tier = 2;\n if (context.isNewFeature) { confidence += 0.4; reasons.push('new feature'); }\n if (context.touchesAuth) { confidence += 0.35; reasons.push('auth needs tests'); }\n if (context.touchesPayments) { confidence += 0.4; reasons.push('payments need tests'); }\n if (context.touchesAPI) { confidence += 0.3; reasons.push('API testing'); }\n if (!context.hasTests) { confidence += 0.2; reasons.push('no existing tests'); }\n if (context.complexity === 'high') { confidence += 0.25; reasons.push('complex code'); }\n }\n\n if (agent.name === 'software-architect') {\n tier = 2;\n if (context.isNewFeature) { confidence += 0.35; reasons.push('architecture review'); }\n if (context.touchesDatabase) { confidence += 0.35; reasons.push('data modeling'); }\n if (context.linesChanged > 200) { confidence += 0.3; reasons.push('large change'); }\n if (context.touchesAPI) { confidence += 0.25; reasons.push('API design'); }\n if (context.patterns?.hasWebSockets) { confidence += 0.3; reasons.push('real-time architecture'); }\n if (context.patterns?.hasQueue) { confidence += 0.3; reasons.push('async architecture'); }\n }\n\n if (agent.name === 'devops') {\n tier = 2;\n if (context.touchesSecurityConfig) { confidence += 0.4; reasons.push('security config'); }\n if (context.touchesFileSystem) { confidence += 0.3; reasons.push('file operations'); }\n if (context.touchesLogging) { confidence += 0.25; reasons.push('logging'); }\n if (context.touchesErrorHandling) { confidence += 0.2; reasons.push('error handling'); }\n if (context.patterns?.hasCaching) { confidence += 0.25; reasons.push('caching'); }\n if (context.patterns?.hasRateLimiting) { confidence += 0.3; reasons.push('rate limiting'); }\n }\n\n if (agent.name === 'bug-finding') {\n tier = 2;\n if (context.touchesPayments) { confidence += 0.5; reasons.push('payments = zero bugs'); }\n if (context.isNewFeature) { confidence += 0.3; reasons.push('new code'); }\n if (context.patterns?.hasAsyncCode) { confidence += 0.35; reasons.push('async patterns'); }\n if (context.complexity === 'high') { confidence += 0.3; reasons.push('complex logic'); }\n if (context.touchesDatabase) { confidence += 0.25; reasons.push('data mutations'); }\n }\n\n if (agent.name === 'user-testing') {\n tier = 3; // lower priority - only when clearly needed\n if (context.touchesUI) { confidence += 0.5; reasons.push('UI changes'); }\n if (context.isNewFeature && context.touchesUI) { confidence += 0.3; reasons.push('new UI feature'); }\n if (context.patterns?.hasFormHandling) { confidence += 0.25; reasons.push('form UX'); }\n }\n \n if (agent.name === 'trie_clean') {\n tier = 2;\n if (context.touchesUI) { confidence += 0.4; reasons.push('UI code'); }\n if (context.isNewFeature) { confidence += 0.3; reasons.push('new feature'); }\n if (context.framework === 'react') { confidence += 0.2; reasons.push('React code'); }\n }\n\n if (agent.name === 'soc2') {\n tier = 2;\n if (context.touchesAuth) { confidence += 0.4; reasons.push('authentication'); }\n if (context.touchesSecurityConfig) { confidence += 0.4; reasons.push('security config'); }\n if (context.touchesLogging) { confidence += 0.3; reasons.push('logging'); }\n if (context.touchesAPI) { confidence += 0.25; reasons.push('API endpoints'); }\n if (context.touchesDatabase) { confidence += 0.2; reasons.push('data access'); }\n }\n\n if (agent.name === 'moneybags') {\n tier = 3; // Runs after primary agents\n if (context.touchesPayments) { confidence += 0.6; reasons.push('payment code = high cost risk'); }\n if (context.touchesAuth) { confidence += 0.4; reasons.push('auth bugs are expensive'); }\n if (context.touchesHealthData) { confidence += 0.5; reasons.push('HIPAA violations'); }\n if (context.touchesUserData) { confidence += 0.3; reasons.push('PII exposure costs'); }\n if (context.touchesDatabase) { confidence += 0.25; reasons.push('data loss risk'); }\n if (context.isNewFeature) { confidence += 0.2; reasons.push('new code risk'); }\n \n // Only activate if there's significant risk\n if (riskLevel === 'high' || riskLevel === 'critical') {\n confidence *= 1.3;\n reasons.push('high-stakes context');\n }\n }\n\n if (agent.name === 'production-ready') {\n tier = 3; // Final gate before shipping\n if (context.touchesAPI) { confidence += 0.4; reasons.push('API deployment'); }\n if (context.touchesDatabase) { confidence += 0.35; reasons.push('database operations'); }\n if (context.touchesAuth) { confidence += 0.35; reasons.push('auth system'); }\n if (context.touchesPayments) { confidence += 0.5; reasons.push('payment processing'); }\n if (context.linesChanged > 200) { confidence += 0.3; reasons.push('significant changes'); }\n \n // Always run on high/critical risk\n if (riskLevel === 'high' || riskLevel === 'critical') {\n confidence += 0.4;\n reasons.push('production gate check');\n }\n }\n\n // Cap confidence at 1.0\n confidence = Math.min(1.0, confidence);\n\n return { agent, confidence, reasons, tier, isCustom: false };\n }\n\n private logAgentScoring(scores: AgentScore[]): void {\n console.error('\\n 📊 Agent Confidence Scores:');\n \n const sorted = [...scores].sort((a, b) => b.confidence - a.confidence);\n \n for (const score of sorted) {\n const bar = this.getConfidenceBar(score.confidence);\n const status = score.confidence >= this.config.minConfidence ? '✓' : '✗';\n const tierLabel = score.tier === 1 ? '[T1]' : score.tier === 2 ? '[T2]' : '[T3]';\n const customLabel = score.isCustom ? ' 📚' : '';\n \n console.error(` ${status} ${score.agent.name.padEnd(18)} ${tierLabel} ${bar} ${(score.confidence * 100).toFixed(0)}%${customLabel}`);\n \n if (score.reasons.length > 0 && score.confidence > 0) {\n console.error(` └─ ${score.reasons.join(', ')}`);\n }\n }\n console.error('');\n }\n\n private getConfidenceBar(confidence: number): string {\n const filled = Math.round(confidence * 10);\n const empty = 10 - filled;\n return '█'.repeat(filled) + '░'.repeat(empty);\n }\n\n private resolveDependencies(agents: Agent[]): Agent[] {\n const agentNames = new Set(agents.map(a => a.name));\n const resolved: Agent[] = [];\n const added = new Set<string>();\n\n // Define dependencies\n const dependencies: Record<string, string[]> = {\n 'legal': ['privacy'], // legal should see privacy issues first\n 'test': ['bug-finding'], // find bugs before writing tests\n 'user-testing': ['accessibility'], // accessibility before UX\n };\n\n // Add dependencies first\n for (const agent of agents) {\n const deps = dependencies[agent.name] || [];\n for (const depName of deps) {\n if (!added.has(depName)) {\n const depAgent = this.agentRegistry.getAgent(depName);\n if (depAgent && agentNames.has(depName)) {\n resolved.push(depAgent);\n added.add(depName);\n }\n }\n }\n \n if (!added.has(agent.name)) {\n resolved.push(agent);\n added.add(agent.name);\n }\n }\n\n return resolved;\n }\n\n getTriagingReason(context: CodeContext, riskLevel: RiskLevel): string {\n if (riskLevel === 'critical') {\n return 'Critical risk detected - activating all agents for comprehensive review';\n }\n\n const reasons: string[] = [];\n\n if (context.touchesAuth) reasons.push('authentication');\n if (context.touchesPayments) reasons.push('payments');\n if (context.touchesDatabase) reasons.push('database');\n if (context.touchesUserData) reasons.push('user data');\n if (context.touchesUI) reasons.push('UI');\n if (context.touchesAPI) reasons.push('API');\n if (context.isNewFeature) reasons.push('new feature');\n if (context.touchesCrypto) reasons.push('cryptography');\n if (context.touchesThirdPartyAPI) reasons.push('3rd party API');\n\n if (reasons.length === 0) {\n return `${riskLevel} risk - general code changes`;\n }\n\n return `${riskLevel} risk: ${reasons.join(', ')}`;\n }\n\n async getSkippedAgents(context: CodeContext, riskLevel: RiskLevel): Promise<string[]> {\n await this.ensureCustomAgentsLoaded();\n \n if (riskLevel === 'critical') return [];\n\n const scores = this.scoreAgents(context, riskLevel);\n return scores\n .filter(s => s.confidence < this.config.minConfidence)\n .map(s => s.agent.name);\n }\n\n async getTriagingConfidence(context: CodeContext, riskLevel: RiskLevel): Promise<number> {\n await this.ensureCustomAgentsLoaded();\n \n // How confident are we in our triaging decision?\n const scores = this.scoreAgents(context, riskLevel);\n const qualified = scores.filter(s => s.confidence >= this.config.minConfidence);\n \n if (qualified.length === 0) return 0.5; // uncertain\n \n // Average confidence of selected agents\n const avgConfidence = qualified.reduce((sum, s) => sum + s.confidence, 0) / qualified.length;\n \n // Boost if we have strong context signals\n const contextStrength = this.getContextStrength(context);\n \n return Math.min(1.0, avgConfidence * 0.7 + contextStrength * 0.3);\n }\n\n private getContextStrength(context: CodeContext): number {\n let signals = 0;\n\n // Count how many context signals we detected\n const checks = [\n context.touchesAuth,\n context.touchesPayments,\n context.touchesDatabase,\n context.touchesAPI,\n context.touchesUI,\n context.touchesUserData,\n context.touchesHealthData,\n context.touchesSecurityConfig,\n context.touchesCrypto,\n context.touchesFileSystem,\n context.isNewFeature,\n ];\n\n for (const check of checks) {\n if (check) signals++;\n }\n\n // More signals = more confidence in triaging\n return signals > 0 ? Math.min(1.0, signals / 3) : 0.3;\n }\n\n private getAllAgents(): Agent[] {\n return this.agentRegistry.getAllAgents();\n }\n \n /**\n * Get custom agents count\n */\n getCustomAgentCount(): number {\n return this.agentRegistry.getCustomAgents().length;\n }\n \n /**\n * Reload custom agents\n */\n async reloadCustomAgents(): Promise<void> {\n await this.agentRegistry.reloadCustomAgents();\n }\n}\n","import { Worker } from 'worker_threads';\nimport { cpus } from 'os';\nimport type { Agent, AgentResult, ScanContext } from '../types/index.js';\nimport { StreamingManager } from './streaming.js';\nimport { CacheManager } from './cache-manager.js';\n\ninterface ParallelTask {\n agent: Agent;\n files: string[];\n context: ScanContext;\n priority: number;\n timeoutMs: number;\n}\n\ninterface ParallelResult {\n agent: string;\n result: AgentResult;\n fromCache: boolean;\n executionTime: number;\n}\n\n/**\n * Parallel execution engine for Trie agents\n *\n * Features:\n * - True parallel execution using worker threads\n * - Intelligent scheduling based on agent priority\n * - Result caching and cache-aware scheduling\n * - Real-time progress streaming\n * - Dynamic resource management\n */\nexport class ParallelExecutor {\n private maxWorkers: number;\n private cache: CacheManager | null;\n private streaming?: StreamingManager;\n private activeWorkers: Set<Worker> = new Set();\n private cacheEnabled: boolean = true;\n private useWorkerThreads: boolean = false;\n\n constructor(\n cacheManager: CacheManager | null,\n maxWorkers: number = Math.max(2, Math.min(cpus().length - 1, 8)),\n options?: { cacheEnabled?: boolean; useWorkerThreads?: boolean }\n ) {\n this.maxWorkers = maxWorkers;\n this.cache = cacheManager;\n this.cacheEnabled = options?.cacheEnabled ?? true;\n this.useWorkerThreads = options?.useWorkerThreads ?? false;\n }\n\n /**\n * Set streaming manager for real-time updates\n */\n setStreaming(streaming: StreamingManager): void {\n this.streaming = streaming;\n }\n\n /**\n * Execute agents in parallel with intelligent scheduling\n */\n async executeAgents(\n agents: Agent[],\n files: string[],\n context: ScanContext\n ): Promise<Map<string, AgentResult>> {\n if (agents.length === 0) {\n return new Map();\n }\n\n // Initialize streaming\n if (this.streaming && this.streaming.getProgress().totalFiles === 0) {\n this.streaming.startScan(files.length);\n }\n\n // Check cache for existing results\n const cacheResults = new Map<string, AgentResult>();\n const uncachedTasks: ParallelTask[] = [];\n\n for (const agent of agents) {\n const cached = await this.checkAgentCache(agent, files);\n if (cached) {\n cacheResults.set(agent.name, cached);\n this.streaming?.completeAgent(agent.name, cached.issues);\n } else {\n uncachedTasks.push({\n agent,\n files,\n context,\n priority: agent.priority?.tier || 2,\n timeoutMs: context?.config?.timeoutMs || 120000\n });\n }\n }\n\n // Sort tasks by priority (tier 1 = highest priority)\n uncachedTasks.sort((a, b) => a.priority - b.priority);\n\n // Execute uncached tasks in parallel\n const parallelResults = await this.executeTasksParallel(uncachedTasks);\n\n // Cache new results\n await this.cacheResults(parallelResults);\n\n // Combine cached and new results\n const allResults = new Map<string, AgentResult>();\n\n // Add cached results\n for (const [agent, result] of cacheResults) {\n allResults.set(agent, result);\n }\n\n // Add new results\n for (const result of parallelResults) {\n allResults.set(result.agent, result.result);\n }\n\n // Complete streaming\n const allIssues = Array.from(allResults.values()).flatMap(r => r.issues);\n this.streaming?.completeScan(allIssues);\n\n return allResults;\n }\n\n /**\n * Check if agent has cached results for given files\n */\n private async checkAgentCache(agent: Agent, files: string[]): Promise<AgentResult | null> {\n if (!this.cacheEnabled || !this.cache) {\n return null;\n }\n\n const cachedIssues = await this.cache.getCachedBatch(files, agent.name);\n\n // Only use cache if we have results for ALL files\n if (cachedIssues.size === files.length) {\n const allIssues = Array.from(cachedIssues.values()).flat();\n return {\n agent: agent.name,\n issues: allIssues,\n executionTime: 0, // Cached\n success: true,\n metadata: {\n filesAnalyzed: files.length,\n linesAnalyzed: 0\n }\n };\n }\n\n return null;\n }\n\n /**\n * Execute tasks in parallel batches\n */\n private async executeTasksParallel(tasks: ParallelTask[]): Promise<ParallelResult[]> {\n if (tasks.length === 0) {\n return [];\n }\n\n const results: ParallelResult[] = [];\n const batches = this.createBatches(tasks, this.maxWorkers);\n\n for (const batch of batches) {\n const batchResults = await Promise.all(\n batch.map(task => this.executeTask(task))\n );\n results.push(...batchResults);\n }\n\n return results;\n }\n\n /**\n * Create batches for parallel execution\n */\n private createBatches(tasks: ParallelTask[], batchSize: number): ParallelTask[][] {\n const batches: ParallelTask[][] = [];\n\n for (let i = 0; i < tasks.length; i += batchSize) {\n batches.push(tasks.slice(i, i + batchSize));\n }\n\n return batches;\n }\n\n /**\n * Execute a single task\n */\n private async executeTask(task: ParallelTask): Promise<ParallelResult> {\n const startTime = Date.now();\n\n this.streaming?.startAgent(task.agent.name);\n\n try {\n const result = this.useWorkerThreads\n ? await this.executeTaskInWorker(task)\n : await task.agent.scan(task.files, task.context);\n const executionTime = Date.now() - startTime;\n\n this.streaming?.completeAgent(task.agent.name, result.issues);\n\n return {\n agent: task.agent.name,\n result,\n fromCache: false,\n executionTime\n };\n } catch (error) {\n const executionTime = Date.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n this.streaming?.reportError(new Error(errorMessage), `Agent: ${task.agent.name}`);\n\n return {\n agent: task.agent.name,\n result: {\n agent: task.agent.name,\n issues: [],\n executionTime,\n success: false,\n error: errorMessage\n },\n fromCache: false,\n executionTime\n };\n }\n }\n\n private async executeTaskInWorker(task: ParallelTask): Promise<AgentResult> {\n // Use dirname to get the dist folder, then resolve to workers subfolder\n // This works whether the code is bundled into chunks or in utils/ folder\n const distDir = new URL('.', import.meta.url);\n const workerUrl = new URL('workers/agent-worker.js', distDir);\n\n return new Promise((resolve, reject) => {\n const worker = new Worker(workerUrl, {\n workerData: {\n agentName: task.agent.name,\n files: task.files,\n context: task.context\n }\n } as ConstructorParameters<typeof Worker>[1]);\n\n this.activeWorkers.add(worker);\n\n const timeout = setTimeout(() => {\n worker.terminate().catch(() => undefined);\n reject(new Error(`Agent ${task.agent.name} timed out after ${task.timeoutMs}ms`));\n }, task.timeoutMs);\n\n worker.on('message', (message) => {\n if (message?.type === 'result') {\n clearTimeout(timeout);\n resolve(message.result as AgentResult);\n } else if (message?.type === 'error') {\n clearTimeout(timeout);\n reject(new Error(message.error));\n }\n });\n\n worker.on('error', (error) => {\n clearTimeout(timeout);\n reject(error);\n });\n\n worker.on('exit', (code) => {\n this.activeWorkers.delete(worker);\n if (code !== 0) {\n clearTimeout(timeout);\n reject(new Error(`Worker stopped with exit code ${code}`));\n }\n });\n });\n }\n\n /**\n * Cache results for future use\n */\n private async cacheResults(results: ParallelResult[]): Promise<void> {\n if (!this.cacheEnabled || !this.cache) {\n return;\n }\n\n const cachePromises = results\n .filter(r => r.result.success && !r.fromCache)\n .map(r => {\n const issuesByFile = this.groupIssuesByFile(r.result.issues);\n const perFilePromises = Object.entries(issuesByFile).map(([file, issues]) =>\n this.cache!.setCached(file, r.agent, issues, r.executionTime)\n );\n return Promise.all(perFilePromises);\n });\n\n await Promise.allSettled(cachePromises);\n }\n\n /**\n * Get optimal batch size based on system resources and agent types\n */\n private getOptimalBatchSize(agents: Agent[]): number {\n // CPU-bound agents (like pattern matching) can run more in parallel\n const cpuBoundAgents = agents.filter(a =>\n ['security', 'privacy', 'bugs', 'clean'].includes(a.name)\n ).length;\n\n // I/O-bound agents (like AI-enhanced agents) should be limited\n const ioBoundAgents = agents.length - cpuBoundAgents;\n\n // Adjust batch size based on agent types\n if (ioBoundAgents > cpuBoundAgents) {\n return Math.max(2, Math.min(this.maxWorkers / 2, 4));\n } else {\n return this.maxWorkers;\n }\n }\n\n /**\n * Cleanup resources\n */\n async cleanup(): Promise<void> {\n // Terminate any active workers\n const terminationPromises = Array.from(this.activeWorkers).map(worker =>\n worker.terminate()\n );\n\n await Promise.allSettled(terminationPromises);\n this.activeWorkers.clear();\n }\n\n private groupIssuesByFile(issues: AgentResult['issues']): Record<string, AgentResult['issues']> {\n const grouped: Record<string, AgentResult['issues']> = {};\n\n for (const issue of issues) {\n if (!grouped[issue.file]) {\n grouped[issue.file] = [];\n }\n grouped[issue.file]!.push(issue);\n }\n\n return grouped;\n }\n}\n\n/**\n * Smart agent prioritization based on dependencies and execution characteristics\n */\nexport function prioritizeAgents(agents: Agent[]): Agent[] {\n const prioritized = [...agents];\n\n // Sort by priority tier, then by estimated execution time\n prioritized.sort((a, b) => {\n const aTier = a.priority?.tier || 2;\n const bTier = b.priority?.tier || 2;\n\n if (aTier !== bTier) {\n return aTier - bTier; // Lower tier = higher priority\n }\n\n // Within same tier, prioritize faster agents\n const aTime = a.priority?.estimatedTimeMs || 1000;\n const bTime = b.priority?.estimatedTimeMs || 1000;\n\n return aTime - bTime;\n });\n\n return prioritized;\n}\n\n/**\n * Calculate optimal concurrency based on system resources and agent characteristics\n */\nexport function calculateOptimalConcurrency(): number {\n const numCPUs = cpus().length;\n const availableMemoryGB = process.memoryUsage().rss / 1024 / 1024 / 1024;\n\n // Conservative concurrency for stability\n let optimal = Math.max(2, Math.min(numCPUs - 1, 8));\n\n // Reduce concurrency if low memory\n if (availableMemoryGB < 2) {\n optimal = Math.max(2, Math.floor(optimal / 2));\n }\n\n // Increase slightly for systems with lots of CPU cores\n if (numCPUs > 8) {\n optimal = Math.min(optimal + 2, 12);\n }\n\n return optimal;\n}","import { readFile, writeFile, mkdir, stat } from 'fs/promises';\nimport { join } from 'path';\nimport { createHash } from 'crypto';\nimport type { Issue } from '../types/index.js';\n\ninterface CacheEntry {\n version: string;\n timestamp: number;\n fileHash: string;\n fileSize: number;\n agent: string;\n issues: Issue[];\n executionTime: number;\n}\n\ninterface CacheIndex {\n version: string;\n created: number;\n entries: Record<string, CacheEntry>;\n}\n\nexport class CacheManager {\n private cacheDir: string;\n private indexPath: string;\n private readonly VERSION = '1.0.0';\n private readonly MAX_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours\n private readonly MAX_ENTRIES = 1000;\n\n constructor(baseDir: string) {\n this.cacheDir = join(baseDir, '.trie', 'cache');\n this.indexPath = join(this.cacheDir, 'index.json');\n }\n\n /**\n * Generate cache key for a file and agent combination\n */\n private generateCacheKey(filePath: string, agent: string, fileHash: string): string {\n const key = `${filePath}:${agent}:${fileHash}`;\n return createHash('sha256').update(key).digest('hex').slice(0, 16);\n }\n\n /**\n * Get file hash for cache validation\n */\n private async getFileHash(filePath: string): Promise<{ hash: string; size: number; mtime: number }> {\n try {\n const content = await readFile(filePath, 'utf-8');\n const stats = await stat(filePath);\n const hash = createHash('sha256').update(content).digest('hex').slice(0, 16);\n return {\n hash,\n size: stats.size,\n mtime: stats.mtime.getTime()\n };\n } catch {\n return { hash: '', size: 0, mtime: 0 };\n }\n }\n\n /**\n * Load cache index\n */\n private async loadIndex(): Promise<CacheIndex> {\n try {\n const content = await readFile(this.indexPath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {\n version: this.VERSION,\n created: Date.now(),\n entries: {}\n };\n }\n }\n\n /**\n * Save cache index\n */\n private async saveIndex(index: CacheIndex): Promise<void> {\n try {\n await mkdir(this.cacheDir, { recursive: true });\n await writeFile(this.indexPath, JSON.stringify(index, null, 2));\n } catch (error) {\n console.warn('Failed to save cache index:', error);\n }\n }\n\n /**\n * Clean up expired entries\n */\n private cleanupExpired(index: CacheIndex): CacheIndex {\n const now = Date.now();\n const validEntries: Record<string, CacheEntry> = {};\n\n for (const [key, entry] of Object.entries(index.entries)) {\n if (now - entry.timestamp < this.MAX_AGE_MS) {\n validEntries[key] = entry;\n }\n }\n\n // If still too many, keep the most recent ones\n const entries = Object.entries(validEntries);\n if (entries.length > this.MAX_ENTRIES) {\n entries.sort((a, b) => b[1].timestamp - a[1].timestamp);\n const limited = entries.slice(0, this.MAX_ENTRIES);\n return {\n ...index,\n entries: Object.fromEntries(limited)\n };\n }\n\n return {\n ...index,\n entries: validEntries\n };\n }\n\n /**\n * Get cached result for a file and agent\n */\n async getCached(filePath: string, agent: string): Promise<Issue[] | null> {\n try {\n const { hash, size, mtime } = await this.getFileHash(filePath);\n if (!hash) return null;\n\n const index = await this.loadIndex();\n const cacheKey = this.generateCacheKey(filePath, agent, hash);\n const entry = index.entries[cacheKey];\n\n if (!entry) return null;\n\n // Validate entry is still fresh\n const isValid = entry.fileHash === hash &&\n entry.version === this.VERSION &&\n (Date.now() - entry.timestamp) < this.MAX_AGE_MS;\n\n if (!isValid) {\n delete index.entries[cacheKey];\n await this.saveIndex(index);\n return null;\n }\n\n return entry.issues;\n } catch {\n return null;\n }\n }\n\n /**\n * Cache result for a file and agent\n */\n async setCached(\n filePath: string,\n agent: string,\n issues: Issue[],\n executionTime: number\n ): Promise<void> {\n try {\n const { hash, size } = await this.getFileHash(filePath);\n if (!hash) return;\n\n const index = await this.loadIndex();\n const cacheKey = this.generateCacheKey(filePath, agent, hash);\n\n index.entries[cacheKey] = {\n version: this.VERSION,\n timestamp: Date.now(),\n fileHash: hash,\n fileSize: size,\n agent,\n issues,\n executionTime\n };\n\n // Clean up old entries\n const cleanedIndex = this.cleanupExpired(index);\n await this.saveIndex(cleanedIndex);\n } catch (error) {\n console.warn('Failed to cache result:', error);\n }\n }\n\n /**\n * Check if multiple files have cached results\n */\n async getCachedBatch(files: string[], agent: string): Promise<Map<string, Issue[]>> {\n const results = new Map<string, Issue[]>();\n\n await Promise.all(\n files.map(async (file) => {\n const cached = await this.getCached(file, agent);\n if (cached) {\n results.set(file, cached);\n }\n })\n );\n\n return results;\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<{\n totalEntries: number;\n totalSizeKB: number;\n oldestEntry: number | null;\n newestEntry: number | null;\n agents: string[];\n hitRate?: number;\n }> {\n try {\n const index = await this.loadIndex();\n const entries = Object.values(index.entries);\n\n const totalSizeKB = entries.reduce((acc, entry) => acc + entry.fileSize, 0) / 1024;\n const timestamps = entries.map(e => e.timestamp);\n const agents = [...new Set(entries.map(e => e.agent))];\n\n return {\n totalEntries: entries.length,\n totalSizeKB: Math.round(totalSizeKB),\n oldestEntry: timestamps.length > 0 ? Math.min(...timestamps) : null,\n newestEntry: timestamps.length > 0 ? Math.max(...timestamps) : null,\n agents\n };\n } catch {\n return {\n totalEntries: 0,\n totalSizeKB: 0,\n oldestEntry: null,\n newestEntry: null,\n agents: []\n };\n }\n }\n\n /**\n * Clear all cache\n */\n async clear(): Promise<void> {\n try {\n const emptyIndex: CacheIndex = {\n version: this.VERSION,\n created: Date.now(),\n entries: {}\n };\n await this.saveIndex(emptyIndex);\n } catch (error) {\n console.warn('Failed to clear cache:', error);\n }\n }\n}","import type { Agent, AgentResult, ScanContext } from '../types/index.js';\nimport { ParallelExecutor, calculateOptimalConcurrency } from '../utils/parallel-executor.js';\nimport { CacheManager } from '../utils/cache-manager.js';\nimport type { StreamingManager } from '../utils/streaming.js';\n\nexport class Executor {\n async executeAgents(\n agents: Agent[],\n files: string[],\n context: ScanContext,\n options?: {\n streaming?: StreamingManager;\n parallel?: boolean;\n cacheEnabled?: boolean;\n maxConcurrency?: number;\n useWorkerThreads?: boolean;\n timeoutMs?: number;\n }\n ): Promise<AgentResult[]> {\n const parallel = options?.parallel ?? true;\n const cacheEnabled = options?.cacheEnabled ?? true;\n const maxConcurrency = options?.maxConcurrency ?? calculateOptimalConcurrency();\n const useWorkerThreads = options?.useWorkerThreads ?? false;\n\n console.error(`⚡ Executing ${agents.length} agents ${parallel ? 'in parallel' : 'sequentially'}...`);\n\n if (parallel) {\n const cacheManager = cacheEnabled ? new CacheManager(context.workingDir) : null;\n const executor = new ParallelExecutor(cacheManager, maxConcurrency, {\n cacheEnabled,\n useWorkerThreads\n });\n\n if (options?.streaming) {\n executor.setStreaming(options.streaming);\n }\n\n const results = await executor.executeAgents(agents, files, {\n ...context,\n config: { timeoutMs: options?.timeoutMs ?? 120000 }\n });\n\n return agents.map(agent => results.get(agent.name)!).filter(Boolean);\n }\n\n // Execute agents in parallel with timeout\n const promises = agents.map(agent =>\n this.executeAgentWithTimeout(agent, files, context, options?.timeoutMs ?? 30000)\n );\n\n try {\n const results = await Promise.allSettled(promises);\n return results.map((result, index) => {\n if (result.status === 'fulfilled') {\n console.error(`✅ ${agents[index]!.name} completed in ${result.value.executionTime}ms`);\n return result.value;\n } else {\n console.error(`❌ ${agents[index]!.name} failed:`, result.reason);\n return {\n agent: agents[index]!.name,\n issues: [],\n executionTime: 0,\n success: false,\n error: result.reason instanceof Error ? result.reason.message : String(result.reason)\n };\n }\n });\n } catch (error) {\n console.error('Executor error:', error);\n return agents.map(agent => ({\n agent: agent.name,\n issues: [],\n executionTime: 0,\n success: false,\n error: 'Execution failed'\n }));\n }\n }\n\n private async executeAgentWithTimeout(\n agent: Agent,\n files: string[],\n context: ScanContext,\n timeoutMs: number = 30000 // 30 second timeout\n ): Promise<AgentResult> {\n return new Promise(async (resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(`Agent ${agent.name} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n try {\n const result = await agent.scan(files, context);\n clearTimeout(timeout);\n resolve(result);\n } catch (error) {\n clearTimeout(timeout);\n reject(error);\n }\n });\n }\n}","import { readFile, readdir } from 'fs/promises';\nimport { join, extname, relative, dirname, basename } from 'path';\n\n/**\n * Cross-File Analysis\n * \n * Analyzes relationships between files to detect:\n * - Unused exports\n * - Circular dependencies\n * - Missing imports\n * - Orphaned files\n * - Dead code\n */\n\nexport interface FileNode {\n path: string;\n relativePath: string;\n imports: ImportInfo[];\n exports: ExportInfo[];\n dependencies: string[];\n dependents: string[];\n}\n\nexport interface ImportInfo {\n source: string;\n specifiers: string[];\n isDefault: boolean;\n isNamespace: boolean;\n line: number;\n}\n\nexport interface ExportInfo {\n name: string;\n isDefault: boolean;\n line: number;\n}\n\nexport interface DependencyGraph {\n files: Map<string, FileNode>;\n issues: CrossFileIssue[];\n}\n\nexport interface CrossFileIssue {\n type: 'circular-dep' | 'unused-export' | 'missing-import' | 'orphaned-file' | 'dead-code';\n severity: 'critical' | 'serious' | 'moderate' | 'low';\n files: string[];\n description: string;\n suggestion: string;\n}\n\n/**\n * Build a dependency graph from a directory\n */\nexport async function buildDependencyGraph(rootDir: string, maxFiles: number = 200): Promise<DependencyGraph> {\n const files = new Map<string, FileNode>();\n const issues: CrossFileIssue[] = [];\n\n // Discover all files\n const filePaths = await discoverFiles(rootDir, maxFiles);\n \n // Parse each file\n for (const filePath of filePaths) {\n const node = await parseFile(filePath, rootDir);\n if (node) {\n files.set(node.relativePath, node);\n }\n }\n\n // Resolve dependencies\n for (const [path, node] of files) {\n for (const imp of node.imports) {\n const resolvedPath = resolveImport(imp.source, path, files);\n if (resolvedPath) {\n node.dependencies.push(resolvedPath);\n \n // Add this file as a dependent of the resolved file\n const depNode = files.get(resolvedPath);\n if (depNode) {\n depNode.dependents.push(path);\n }\n }\n }\n }\n\n // Detect issues\n issues.push(...detectCircularDependencies(files));\n issues.push(...detectUnusedExports(files));\n issues.push(...detectOrphanedFiles(files));\n\n return { files, issues };\n}\n\n/**\n * Parse a single file for imports and exports\n */\nasync function parseFile(filePath: string, rootDir: string): Promise<FileNode | null> {\n try {\n const content = await readFile(filePath, 'utf-8');\n const relativePath = relative(rootDir, filePath);\n const lines = content.split('\\n');\n\n const imports: ImportInfo[] = [];\n const exports: ExportInfo[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] || '';\n const lineNum = i + 1;\n\n // Parse imports\n // import { x, y } from 'module'\n const namedImportMatch = line.match(/import\\s+\\{([^}]+)\\}\\s+from\\s+['\"]([^'\"]+)['\"]/);\n if (namedImportMatch) {\n const specifiers = namedImportMatch[1]!.split(',').map(s => s.trim().split(/\\s+as\\s+/)[0]!.trim());\n imports.push({\n source: namedImportMatch[2]!,\n specifiers,\n isDefault: false,\n isNamespace: false,\n line: lineNum,\n });\n continue;\n }\n\n // import x from 'module'\n const defaultImportMatch = line.match(/import\\s+(\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/);\n if (defaultImportMatch) {\n imports.push({\n source: defaultImportMatch[2]!,\n specifiers: [defaultImportMatch[1]!],\n isDefault: true,\n isNamespace: false,\n line: lineNum,\n });\n continue;\n }\n\n // import * as x from 'module'\n const namespaceImportMatch = line.match(/import\\s+\\*\\s+as\\s+(\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/);\n if (namespaceImportMatch) {\n imports.push({\n source: namespaceImportMatch[2]!,\n specifiers: [namespaceImportMatch[1]!],\n isDefault: false,\n isNamespace: true,\n line: lineNum,\n });\n continue;\n }\n\n // Parse exports\n // export function/class/const/let/var name\n const namedExportMatch = line.match(/export\\s+(?:async\\s+)?(?:function|class|const|let|var|interface|type)\\s+(\\w+)/);\n if (namedExportMatch) {\n exports.push({\n name: namedExportMatch[1]!,\n isDefault: false,\n line: lineNum,\n });\n continue;\n }\n\n // export default\n const defaultExportMatch = line.match(/export\\s+default\\s+(?:function|class)?\\s*(\\w+)?/);\n if (defaultExportMatch) {\n exports.push({\n name: defaultExportMatch[1] || 'default',\n isDefault: true,\n line: lineNum,\n });\n continue;\n }\n\n // export { x, y }\n const reexportMatch = line.match(/export\\s+\\{([^}]+)\\}/);\n if (reexportMatch && !line.includes('from')) {\n const specifiers = reexportMatch[1]!.split(',').map(s => s.trim().split(/\\s+as\\s+/)[0]!.trim());\n for (const spec of specifiers) {\n exports.push({\n name: spec,\n isDefault: false,\n line: lineNum,\n });\n }\n }\n }\n\n return {\n path: filePath,\n relativePath,\n imports,\n exports,\n dependencies: [],\n dependents: [],\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Resolve an import path to a file in the graph\n */\nfunction resolveImport(source: string, fromPath: string, files: Map<string, FileNode>): string | null {\n // Skip external packages\n if (!source.startsWith('.') && !source.startsWith('/')) {\n return null;\n }\n\n const fromDir = dirname(fromPath);\n let resolvedPath = join(fromDir, source);\n\n // Try different extensions\n const extensions = ['', '.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx', '/index.js'];\n \n for (const ext of extensions) {\n const tryPath = resolvedPath + ext;\n if (files.has(tryPath)) {\n return tryPath;\n }\n }\n\n return null;\n}\n\n/**\n * Detect circular dependencies using DFS\n */\nfunction detectCircularDependencies(files: Map<string, FileNode>): CrossFileIssue[] {\n const issues: CrossFileIssue[] = [];\n const visited = new Set<string>();\n const inStack = new Set<string>();\n\n function dfs(path: string, stack: string[]): void {\n if (inStack.has(path)) {\n // Found a cycle\n const cycleStart = stack.indexOf(path);\n const cycle = [...stack.slice(cycleStart), path];\n \n // Only report if we haven't reported this cycle before\n const cycleKey = cycle.sort().join('->');\n if (!issues.some(i => i.files.sort().join('->') === cycleKey)) {\n issues.push({\n type: 'circular-dep',\n severity: 'serious',\n files: cycle,\n description: `Circular dependency: ${cycle.map(f => basename(f)).join(' → ')}`,\n suggestion: 'Break the cycle by extracting shared code to a separate module',\n });\n }\n return;\n }\n\n if (visited.has(path)) return;\n \n visited.add(path);\n inStack.add(path);\n\n const node = files.get(path);\n if (node) {\n for (const dep of node.dependencies) {\n dfs(dep, [...stack, path]);\n }\n }\n\n inStack.delete(path);\n }\n\n for (const path of files.keys()) {\n dfs(path, []);\n }\n\n return issues;\n}\n\n/**\n * Detect unused exports\n */\nfunction detectUnusedExports(files: Map<string, FileNode>): CrossFileIssue[] {\n const issues: CrossFileIssue[] = [];\n const allImportedSpecifiers = new Map<string, Set<string>>();\n\n // Collect all imported specifiers per file\n for (const node of files.values()) {\n for (const imp of node.imports) {\n const resolvedPath = resolveImport(imp.source, node.relativePath, files);\n if (resolvedPath) {\n if (!allImportedSpecifiers.has(resolvedPath)) {\n allImportedSpecifiers.set(resolvedPath, new Set());\n }\n for (const spec of imp.specifiers) {\n allImportedSpecifiers.get(resolvedPath)!.add(spec);\n }\n if (imp.isDefault) {\n allImportedSpecifiers.get(resolvedPath)!.add('default');\n }\n if (imp.isNamespace) {\n allImportedSpecifiers.get(resolvedPath)!.add('*');\n }\n }\n }\n }\n\n // Find unused exports\n for (const [path, node] of files) {\n const importedSpecs = allImportedSpecifiers.get(path) || new Set();\n \n // Skip if namespace import (imports everything)\n if (importedSpecs.has('*')) continue;\n \n // Skip entry points (files with no dependents)\n if (node.dependents.length === 0 && node.exports.length > 0) continue;\n\n for (const exp of node.exports) {\n const name = exp.isDefault ? 'default' : exp.name;\n if (!importedSpecs.has(name) && !importedSpecs.has(exp.name)) {\n issues.push({\n type: 'unused-export',\n severity: 'low',\n files: [path],\n description: `Unused export '${exp.name}' in ${basename(path)}`,\n suggestion: `Remove the export or ensure it's imported somewhere`,\n });\n }\n }\n }\n\n return issues;\n}\n\n/**\n * Detect orphaned files (no imports or exports)\n */\nfunction detectOrphanedFiles(files: Map<string, FileNode>): CrossFileIssue[] {\n const issues: CrossFileIssue[] = [];\n\n for (const [path, node] of files) {\n // File has no exports and is not imported anywhere\n if (node.exports.length === 0 && node.dependents.length === 0) {\n // Skip if it's likely an entry point\n if (basename(path).match(/^(index|main|app|server)\\./i)) continue;\n // Skip test files\n if (path.includes('.test.') || path.includes('.spec.') || path.includes('__tests__')) continue;\n\n issues.push({\n type: 'orphaned-file',\n severity: 'low',\n files: [path],\n description: `Potentially orphaned file: ${basename(path)}`,\n suggestion: 'Verify this file is needed or remove it',\n });\n }\n }\n\n return issues;\n}\n\n/**\n * Discover files recursively\n */\nasync function discoverFiles(dir: string, maxFiles: number): Promise<string[]> {\n const files: string[] = [];\n const skipDirs = new Set(['node_modules', '.git', 'dist', 'build', '.next', 'coverage']);\n const extensions = new Set(['.ts', '.tsx', '.js', '.jsx']);\n\n async function walk(currentDir: string) {\n if (files.length >= maxFiles) return;\n\n try {\n const entries = await readdir(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (files.length >= maxFiles) break;\n\n const fullPath = join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n if (!skipDirs.has(entry.name) && !entry.name.startsWith('.')) {\n await walk(fullPath);\n }\n } else if (entry.isFile()) {\n const ext = extname(entry.name).toLowerCase();\n if (extensions.has(ext)) {\n files.push(fullPath);\n }\n }\n }\n } catch {\n // Skip inaccessible directories\n }\n }\n\n await walk(dir);\n return files;\n}\n\n/**\n * Format dependency graph for output\n */\nexport function formatDependencyGraph(graph: DependencyGraph): string {\n let output = `\\n${'━'.repeat(60)}\\n`;\n output += `🔗 CROSS-FILE ANALYSIS\\n`;\n output += `${'━'.repeat(60)}\\n\\n`;\n\n output += `## 📊 Overview\\n\\n`;\n output += `- **Files analyzed:** ${graph.files.size}\\n`;\n output += `- **Issues found:** ${graph.issues.length}\\n\\n`;\n\n // Group issues by type\n const byType = new Map<string, CrossFileIssue[]>();\n for (const issue of graph.issues) {\n if (!byType.has(issue.type)) byType.set(issue.type, []);\n byType.get(issue.type)!.push(issue);\n }\n\n if (graph.issues.length === 0) {\n output += `## ✅ No cross-file issues found!\\n\\n`;\n return output;\n }\n\n output += `## 🚨 Issues\\n\\n`;\n\n // Circular dependencies\n const circular = byType.get('circular-dep') || [];\n if (circular.length > 0) {\n output += `### 🔄 Circular Dependencies (${circular.length})\\n\\n`;\n for (const issue of circular) {\n output += `- ${issue.description}\\n`;\n output += ` *${issue.suggestion}*\\n`;\n }\n output += '\\n';\n }\n\n // Unused exports\n const unused = byType.get('unused-export') || [];\n if (unused.length > 0) {\n output += `### 📤 Unused Exports (${unused.length})\\n\\n`;\n for (const issue of unused.slice(0, 10)) {\n output += `- ${issue.description}\\n`;\n }\n if (unused.length > 10) {\n output += `- *...and ${unused.length - 10} more*\\n`;\n }\n output += '\\n';\n }\n\n // Orphaned files\n const orphaned = byType.get('orphaned-file') || [];\n if (orphaned.length > 0) {\n output += `### 📁 Potentially Orphaned Files (${orphaned.length})\\n\\n`;\n for (const issue of orphaned) {\n output += `- ${issue.description}\\n`;\n }\n output += '\\n';\n }\n\n // Dependency tree visualization\n output += `## 🌳 Dependency Overview\\n\\n`;\n output += `*Top files by dependency count:*\\n\\n`;\n \n const sorted = [...graph.files.values()]\n .sort((a, b) => b.dependents.length - a.dependents.length)\n .slice(0, 10);\n\n output += `| File | Imports | Imported By |\\n`;\n output += `|------|---------|-------------|\\n`;\n for (const node of sorted) {\n output += `| ${basename(node.relativePath)} | ${node.dependencies.length} | ${node.dependents.length} |\\n`;\n }\n\n return output;\n}\n\n","/**\n * Semantic Code Analyzer\n * \n * Parses code to understand its structure for AI analysis.\n * Focuses on:\n * 1. Function extraction - what functions exist, their parameters\n * 2. Route detection - API endpoints and their methods\n * 3. Data flow indicators - sources (user input) and sinks (dangerous ops)\n * 4. Framework detection - Express, Next.js, etc.\n * \n * This provides CONTEXT for AI analysis, not pattern-based detection.\n */\n\nimport { readFile } from 'fs/promises';\nimport { basename, relative } from 'path';\n\n/**\n * Parsed function information for AI context\n */\nexport interface ParsedFunction {\n name: string;\n file: string;\n startLine: number;\n endLine: number;\n params: string[];\n isAsync: boolean;\n isExported: boolean;\n body: string;\n hasUserInput: boolean;\n hasDatabaseOps: boolean;\n hasFileOps: boolean;\n hasAuth: boolean;\n}\n\n/**\n * Detected route/endpoint for AI context\n */\nexport interface DetectedRoute {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'ALL';\n path: string;\n file: string;\n line: number;\n hasAuth: boolean;\n accessesBody: boolean;\n}\n\n/**\n * Code context summary for AI prompts\n */\nexport interface CodeContextSummary {\n framework: string;\n functions: ParsedFunction[];\n routes: DetectedRoute[];\n dataFlowIndicators: DataFlowIndicator[];\n}\n\nexport interface DataFlowIndicator {\n type: 'source' | 'sink';\n category: string;\n file: string;\n line: number;\n code: string;\n}\n\n/**\n * Legacy issue type for backwards compatibility\n */\nexport interface DataFlowIssue {\n type: 'taint-flow' | 'missing-validation' | 'auth-bypass' | 'race-condition' | 'business-logic';\n severity: 'critical' | 'serious' | 'moderate' | 'low';\n source: { file: string; line: number; code: string; symbol?: string };\n sink?: { file: string; line: number; code: string };\n description: string;\n exploit?: string;\n fix: string;\n confidence: number;\n}\n\n/**\n * Semantic Analyzer - Parses code structure for AI context\n */\nexport class SemanticAnalyzer {\n private functions: ParsedFunction[] = [];\n private routes: DetectedRoute[] = [];\n private dataFlowIndicators: DataFlowIndicator[] = [];\n private framework: string = 'unknown';\n \n /**\n * Analyze files and extract code structure for AI\n */\n async analyze(files: string[], rootDir: string): Promise<DataFlowIssue[]> {\n // Parse all files to understand structure\n for (const file of files) {\n try {\n const content = await readFile(file, 'utf-8');\n const relPath = relative(rootDir, file);\n \n this.detectFramework(content);\n this.parseFunctions(content, relPath);\n this.parseRoutes(content, relPath);\n this.extractDataFlowIndicators(content, relPath);\n } catch (e) {\n // Skip unreadable files\n }\n }\n \n // Generate AI-focused analysis summary (not pattern-based issues)\n // For backwards compatibility, we return minimal issues and let AI do the work\n return this.generateAIAnalysisHints();\n }\n\n /**\n * Detect the framework being used\n */\n private detectFramework(content: string): void {\n if (this.framework !== 'unknown') return;\n \n if (/from\\s+['\"]express['\"]|require\\s*\\(\\s*['\"]express['\"]\\s*\\)/.test(content)) {\n this.framework = 'Express';\n } else if (/from\\s+['\"]next|getServerSideProps|getStaticProps|NextRequest/.test(content)) {\n this.framework = 'Next.js';\n } else if (/from\\s+['\"]fastify['\"]/.test(content)) {\n this.framework = 'Fastify';\n } else if (/from\\s+['\"]koa['\"]/.test(content)) {\n this.framework = 'Koa';\n } else if (/from\\s+['\"]hono['\"]/.test(content)) {\n this.framework = 'Hono';\n }\n }\n\n /**\n * Parse functions from code\n */\n private parseFunctions(content: string, file: string): void {\n const lines = content.split('\\n');\n \n const funcPatterns = [\n /(?:export\\s+)?(?:async\\s+)?function\\s+(\\w+)\\s*\\(([^)]*)\\)/,\n /(?:export\\s+)?const\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\(([^)]*)\\)\\s*=>/,\n ];\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] || '';\n \n for (const pattern of funcPatterns) {\n const match = line.match(pattern);\n if (match) {\n const funcName = match[1]!;\n const params = match[2]?.split(',').map(p => p.trim().split(':')[0]?.trim() || '') || [];\n \n // Find function body\n const bodyLines: string[] = [];\n let braceCount = 0;\n let started = false;\n \n for (let j = i; j < Math.min(i + 100, lines.length); j++) {\n const bodyLine = lines[j] || '';\n bodyLines.push(bodyLine);\n \n for (const char of bodyLine) {\n if (char === '{') { braceCount++; started = true; }\n else if (char === '}') { braceCount--; }\n }\n \n if (started && braceCount === 0) break;\n }\n \n const body = bodyLines.join('\\n');\n \n this.functions.push({\n name: funcName,\n file,\n startLine: i + 1,\n endLine: i + bodyLines.length,\n params,\n isAsync: /async/.test(line),\n isExported: /export/.test(line),\n body,\n hasUserInput: /req\\.body|req\\.params|req\\.query|formData|searchParams/i.test(body),\n hasDatabaseOps: /prisma|sequelize|knex|mongodb|\\.query|\\.execute/i.test(body),\n hasFileOps: /readFile|writeFile|fs\\./i.test(body),\n hasAuth: /auth|session|jwt|token|password/i.test(body),\n });\n }\n }\n }\n }\n\n /**\n * Parse route handlers\n */\n private parseRoutes(content: string, file: string): void {\n const lines = content.split('\\n');\n \n const routePatterns = [\n /(?:app|router)\\.(get|post|put|delete|patch|all)\\s*\\(\\s*['\"]([^'\"]+)['\"]/i,\n /export\\s+(?:async\\s+)?function\\s+(GET|POST|PUT|DELETE|PATCH)/i,\n ];\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] || '';\n \n for (const pattern of routePatterns) {\n const match = line.match(pattern);\n if (match) {\n const method = match[1]!.toUpperCase() as DetectedRoute['method'];\n const path = match[2] || `/${basename(file).replace(/\\.[^.]+$/, '')}`;\n \n // Look ahead for auth and body access\n const contextLines = lines.slice(i, Math.min(i + 30, lines.length)).join('\\n');\n const hasAuth = /auth|protect|authenticate|session|jwt|bearer/i.test(line + contextLines);\n const accessesBody = /req\\.body|request\\.json\\(\\)|formData/i.test(contextLines);\n \n this.routes.push({\n method,\n path,\n file,\n line: i + 1,\n hasAuth,\n accessesBody,\n });\n }\n }\n }\n }\n\n /**\n * Extract data flow indicators (sources and sinks)\n */\n private extractDataFlowIndicators(content: string, file: string): void {\n const lines = content.split('\\n');\n \n // Sources - where untrusted data enters\n const sources = [\n { pattern: /req\\.body|req\\.params|req\\.query/, category: 'user-input' },\n { pattern: /searchParams|formData/, category: 'url-params' },\n { pattern: /request\\.json\\(\\)|request\\.text\\(\\)/, category: 'request-body' },\n { pattern: /document\\.location|window\\.location/, category: 'browser-url' },\n { pattern: /localStorage|sessionStorage/, category: 'client-storage' },\n ];\n \n // Sinks - where data goes that could be dangerous\n const sinks = [\n { pattern: /\\.query\\s*\\(|\\.execute\\s*\\(|\\.raw\\s*\\(/, category: 'database' },\n { pattern: /exec\\s*\\(|spawn\\s*\\(|execSync/, category: 'command' },\n { pattern: /innerHTML|outerHTML|dangerouslySetInnerHTML/, category: 'html' },\n { pattern: /eval\\s*\\(|new Function\\s*\\(/, category: 'code-eval' },\n { pattern: /writeFile|createWriteStream/, category: 'file-write' },\n { pattern: /redirect\\(|router\\.push\\(/, category: 'redirect' },\n ];\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] || '';\n \n for (const { pattern, category } of sources) {\n if (pattern.test(line)) {\n this.dataFlowIndicators.push({\n type: 'source',\n category,\n file,\n line: i + 1,\n code: line.trim().substring(0, 100),\n });\n }\n }\n \n for (const { pattern, category } of sinks) {\n if (pattern.test(line)) {\n this.dataFlowIndicators.push({\n type: 'sink',\n category,\n file,\n line: i + 1,\n code: line.trim().substring(0, 100),\n });\n }\n }\n }\n }\n\n /**\n * Generate hints for AI analysis based on parsed structure\n * Returns minimal issues - the real analysis is done by AI\n */\n private generateAIAnalysisHints(): DataFlowIssue[] {\n const hints: DataFlowIssue[] = [];\n \n // Check for routes without auth that access body (likely need review)\n for (const route of this.routes) {\n if (!route.hasAuth && route.accessesBody && ['POST', 'PUT', 'DELETE', 'PATCH'].includes(route.method)) {\n hints.push({\n type: 'auth-bypass',\n severity: 'serious',\n source: {\n file: route.file,\n line: route.line,\n code: `${route.method} ${route.path}`,\n symbol: route.path,\n },\n description: `${route.method} ${route.path} appears to lack authentication - needs AI review`,\n fix: 'Add authentication middleware or verify this endpoint should be public',\n confidence: 0.70,\n });\n }\n }\n \n // Check for functions with user input and database ops (potential injection)\n for (const func of this.functions) {\n if (func.hasUserInput && func.hasDatabaseOps) {\n hints.push({\n type: 'taint-flow',\n severity: 'moderate',\n source: {\n file: func.file,\n line: func.startLine,\n code: `function ${func.name}`,\n symbol: func.name,\n },\n description: `${func.name} has user input flowing to database - needs AI review`,\n fix: 'Verify parameterized queries are used',\n confidence: 0.60,\n });\n }\n }\n \n return hints;\n }\n\n /**\n * Get context summary for AI prompts\n */\n getContextSummary(): CodeContextSummary {\n return {\n framework: this.framework,\n functions: this.functions,\n routes: this.routes,\n dataFlowIndicators: this.dataFlowIndicators,\n };\n }\n\n /**\n * Get analysis summary\n */\n getSummary(): {\n functionsAnalyzed: number;\n routesFound: number;\n authPatternsFound: number;\n framework: string;\n } {\n const authFunctions = this.functions.filter(f => f.hasAuth).length;\n return {\n functionsAnalyzed: this.functions.length,\n routesFound: this.routes.length,\n authPatternsFound: authFunctions,\n framework: this.framework,\n };\n }\n\n /**\n * Generate AI prompt context from parsed code\n */\n generateAIPromptContext(): string {\n let context = `## Code Structure Analysis\\n\\n`;\n context += `**Framework:** ${this.framework}\\n`;\n context += `**Functions:** ${this.functions.length}\\n`;\n context += `**Routes:** ${this.routes.length}\\n\\n`;\n \n if (this.routes.length > 0) {\n context += `### API Endpoints\\n\\n`;\n for (const route of this.routes.slice(0, 10)) {\n const authBadge = route.hasAuth ? '🔒' : '⚠️ No Auth';\n context += `- \\`${route.method} ${route.path}\\` ${authBadge} (${route.file}:${route.line})\\n`;\n }\n if (this.routes.length > 10) {\n context += `- *...and ${this.routes.length - 10} more routes*\\n`;\n }\n context += `\\n`;\n }\n \n if (this.dataFlowIndicators.length > 0) {\n const sources = this.dataFlowIndicators.filter(d => d.type === 'source');\n const sinks = this.dataFlowIndicators.filter(d => d.type === 'sink');\n \n if (sources.length > 0) {\n context += `### Data Sources (User Input)\\n\\n`;\n for (const source of sources.slice(0, 5)) {\n context += `- ${source.category} at ${source.file}:${source.line}\\n`;\n }\n context += `\\n`;\n }\n \n if (sinks.length > 0) {\n context += `### Sensitive Operations\\n\\n`;\n for (const sink of sinks.slice(0, 5)) {\n context += `- ${sink.category} at ${sink.file}:${sink.line}\\n`;\n }\n context += `\\n`;\n }\n }\n \n return context;\n }\n}\n\n/**\n * Format semantic analysis issues for output\n */\nexport function formatSemanticIssues(issues: DataFlowIssue[]): string {\n if (issues.length === 0) {\n return '\\n## ✅ No semantic issues found\\n\\n';\n }\n \n let output = '\\n' + '━'.repeat(60) + '\\n';\n output += '🧠 SEMANTIC ANALYSIS\\n';\n output += '━'.repeat(60) + '\\n\\n';\n output += '*The following areas were flagged for AI review:*\\n\\n';\n \n // Group by type\n const byType = new Map<DataFlowIssue['type'], DataFlowIssue[]>();\n for (const issue of issues) {\n if (!byType.has(issue.type)) byType.set(issue.type, []);\n byType.get(issue.type)!.push(issue);\n }\n \n const typeLabels: Record<DataFlowIssue['type'], string> = {\n 'taint-flow': 'Data Flow Vulnerabilities',\n 'missing-validation': 'Missing Input Validation',\n 'auth-bypass': 'Authentication Issues',\n 'race-condition': 'Race Conditions',\n 'business-logic': 'Business Logic Flaws',\n };\n \n for (const [type, typeIssues] of byType) {\n output += `### ${typeLabels[type]} (${typeIssues.length})\\n\\n`;\n \n for (const issue of typeIssues.slice(0, 5)) {\n const icon = { critical: '🔴', serious: '🟠', moderate: '🟡', low: '🔵' }[issue.severity];\n output += `${icon} **${issue.description}**\\n`;\n output += ` 📍 \\`${basename(issue.source.file)}:${issue.source.line}\\`\\n`;\n output += ` 🔧 ${issue.fix}\\n\\n`;\n }\n \n if (typeIssues.length > 5) {\n output += ` *...and ${typeIssues.length - 5} more*\\n\\n`;\n }\n }\n \n return output;\n}\n","/**\n * Smart Issue Prioritizer\n * \n * Bugbot and linters dump ALL findings on you - overwhelming and noisy.\n * We're smarter. We:\n * \n * 1. DEDUPLICATE - Same issue in many files? Group it.\n * 2. PRIORITIZE BY EXPLOITABILITY - Not all \"critical\" issues are equal\n * 3. FILTER NOISE - Test files, generated code, vendor files\n * 4. FOCUS ON FIXES - What can actually be fixed vs. false positives\n * 5. CONTEXT MATTERS - Admin route without auth > marketing page without auth\n * \n * Result: 10 actionable items, not 10,000 noise items.\n */\n\nimport type { Issue } from '../types/index.js';\nimport { basename } from 'path';\n\nexport interface PrioritizedIssue extends Issue {\n priority: number; // 1-100, higher = more important\n reason: string; // Why this priority\n groupKey?: string; // For deduplication\n instanceCount?: number; // How many times this pattern appears\n}\n\nexport interface PrioritizationResult {\n critical: PrioritizedIssue[]; // MUST fix - actual exploitable vulnerabilities\n important: PrioritizedIssue[]; // SHOULD fix - real issues with lower risk\n advisory: PrioritizedIssue[]; // COULD fix - good practices\n noise: number; // Count of filtered items\n summary: string;\n}\n\ninterface DeduplicationGroup {\n key: string;\n issues: Issue[];\n representative: Issue;\n}\n\n/**\n * Smart prioritization of issues\n */\nexport function prioritizeIssues(issues: Issue[]): PrioritizationResult {\n // Step 1: Filter out noise\n const { filtered, noiseCount } = filterNoise(issues);\n \n // Step 2: Deduplicate similar issues\n const deduplicated = deduplicateIssues(filtered);\n \n // Step 3: Score each issue\n const scored = deduplicated.map(scoreIssue);\n \n // Step 4: Sort by priority\n const sorted = scored.sort((a, b) => b.priority - a.priority);\n \n // Step 5: Categorize\n const critical = sorted.filter(i => i.priority >= 80);\n const important = sorted.filter(i => i.priority >= 50 && i.priority < 80);\n const advisory = sorted.filter(i => i.priority < 50);\n \n // Step 6: Generate summary\n const summary = generateSummary(critical, important, advisory, noiseCount);\n \n return {\n critical: critical.slice(0, 10), // Top 10 critical\n important: important.slice(0, 20), // Top 20 important\n advisory: advisory.slice(0, 30), // Top 30 advisory\n noise: noiseCount,\n summary,\n };\n}\n\n/**\n * Filter out noise - things that aren't real issues\n */\nfunction filterNoise(issues: Issue[]): { filtered: Issue[]; noiseCount: number } {\n const filtered: Issue[] = [];\n let noiseCount = 0;\n \n for (const issue of issues) {\n // Skip if clearly noise\n if (isNoise(issue)) {\n noiseCount++;\n continue;\n }\n filtered.push(issue);\n }\n \n return { filtered, noiseCount };\n}\n\n/**\n * Determine if an issue is noise\n */\nfunction isNoise(issue: Issue): boolean {\n const file = issue.file.toLowerCase();\n const issueText = `${issue.issue} ${issue.fix}`.toLowerCase();\n \n // ============================================\n // ALWAYS NOISE: Files we should never report on\n // ============================================\n \n // Signature/pattern files - never flag the scanner's own definitions\n if (file.includes('signature') || \n file.includes('patterns') ||\n file.includes('vulnerability-signatures')) {\n return true;\n }\n \n // Generated/vendor files\n if (file.includes('node_modules') ||\n file.includes('vendor') ||\n file.includes('.min.') ||\n file.includes('bundle') ||\n file.includes('dist/') ||\n file.includes('build/') ||\n file.includes('.generated.')) {\n return true;\n }\n \n // Lock files\n if (file.includes('package-lock') || \n file.includes('yarn.lock') || \n file.includes('pnpm-lock') ||\n file.includes('shrinkwrap')) {\n return true;\n }\n \n // Type definition files\n if (file.endsWith('.d.ts')) {\n return true;\n }\n \n // ============================================\n // TEST FILES: Aggressive filtering\n // ============================================\n const isTestFile = file.includes('.test.') || \n file.includes('.spec.') || \n file.includes('__tests__') ||\n file.includes('/test/') ||\n file.includes('/tests/') ||\n file.includes('fixture') ||\n file.includes('mock');\n \n if (isTestFile) {\n // Only keep test file issues if they're REAL exposed secrets\n // (not test fixtures designed to test the scanner)\n if (issueText.includes('hardcoded') || issueText.includes('secret')) {\n // Skip if it looks like test data\n if (issueText.includes('test') || \n issueText.includes('mock') ||\n issueText.includes('fake') ||\n issueText.includes('dummy') ||\n issueText.includes('example') ||\n issueText.includes('sample') ||\n issueText.includes('fixture')) {\n return true;\n }\n // Skip generic password patterns in tests\n if (/password.*123|super.*secret|sk-[a-z0-9]{10,30}$/i.test(issueText)) {\n return true;\n }\n }\n // All other test file issues are noise\n return true;\n }\n \n // ============================================\n // CONTEXT-BASED NOISE\n // ============================================\n \n // Config files for low-priority issues\n if ((file.includes('.config.') || file.includes('rc.') || file.includes('config/')) && \n (issue.severity === 'low' || issue.severity === 'moderate')) {\n return true;\n }\n \n // Example/demo files\n if (file.includes('example') || \n file.includes('demo') || \n file.includes('sample') ||\n file.includes('tutorial')) {\n return true;\n }\n \n // Very low confidence\n if (issue.confidence < 0.6) {\n return true;\n }\n \n // ============================================\n // ISSUE-BASED NOISE: False positive patterns\n // ============================================\n \n // TypeScript errors that aren't real (module resolution, lib issues)\n if (issueText.includes('cannot find module') ||\n issueText.includes('cannot find name') ||\n issueText.includes('modulresolution') ||\n issueText.includes('target library')) {\n // These are usually config issues, not code issues\n return true;\n }\n \n // Console.log warnings in non-production contexts\n if (issueText.includes('console.log') && \n (file.includes('cli') || file.includes('script') || file.includes('debug'))) {\n return true;\n }\n \n // Math.random in non-security contexts\n if (issueText.includes('math.random') && \n !file.includes('auth') && \n !file.includes('token') && \n !file.includes('session') &&\n !file.includes('crypto')) {\n return true;\n }\n \n return false;\n}\n\n/**\n * Deduplicate similar issues - group same pattern across files\n */\nfunction deduplicateIssues(issues: Issue[]): Issue[] {\n const groups = new Map<string, DeduplicationGroup>();\n \n for (const issue of issues) {\n // Create a grouping key based on issue type, not location\n const key = createGroupKey(issue);\n \n if (!groups.has(key)) {\n groups.set(key, {\n key,\n issues: [],\n representative: issue,\n });\n }\n \n const group = groups.get(key)!;\n group.issues.push(issue);\n \n // Keep the most severe instance as representative\n if (severityRank(issue.severity) > severityRank(group.representative.severity)) {\n group.representative = issue;\n }\n }\n \n // Return representatives with instance counts\n const deduplicated: Issue[] = [];\n for (const group of groups.values()) {\n const rep = { ...group.representative };\n \n // Add count to the issue text if there are multiple\n if (group.issues.length > 1) {\n rep.issue = `${rep.issue} (${group.issues.length} instances)`;\n }\n \n deduplicated.push(rep);\n }\n \n return deduplicated;\n}\n\n/**\n * Create a grouping key for deduplication\n */\nfunction createGroupKey(issue: Issue): string {\n // Group by: agent + issue type + fix suggestion\n // This groups same recommendations across files\n const issueType = issue.issue.replace(/['\"`][^'\"`]*['\"`]/g, '').trim();\n const fixType = issue.fix.replace(/['\"`][^'\"`]*['\"`]/g, '').substring(0, 50);\n return `${issue.agent}:${issueType}:${fixType}`;\n}\n\n/**\n * Score an issue for priority\n */\nfunction scoreIssue(issue: Issue): PrioritizedIssue {\n let priority = 0;\n const reasons: string[] = [];\n \n // Base score from severity\n const severityScores = { critical: 70, serious: 50, moderate: 30, low: 10 };\n priority += severityScores[issue.severity];\n reasons.push(`${issue.severity} severity`);\n \n // Boost for exploitability indicators\n const exploitablePatterns = [\n { pattern: /injection|exec|eval|command/i, boost: 20, reason: 'directly exploitable' },\n { pattern: /auth.*bypass|missing.*auth|no.*auth/i, boost: 15, reason: 'auth bypass' },\n { pattern: /secret|credential|password|api.?key/i, boost: 15, reason: 'credential exposure' },\n { pattern: /xss|script.*inject/i, boost: 12, reason: 'XSS vulnerability' },\n { pattern: /remote|rce|arbitrary/i, boost: 20, reason: 'remote code execution' },\n ];\n \n for (const { pattern, boost, reason } of exploitablePatterns) {\n if (pattern.test(issue.issue) || pattern.test(issue.fix)) {\n priority += boost;\n reasons.push(reason);\n break; // Only apply biggest boost\n }\n }\n \n // Boost for sensitive file contexts\n const file = issue.file.toLowerCase();\n if (file.includes('auth') || file.includes('login') || file.includes('session')) {\n priority += 10;\n reasons.push('auth-related file');\n }\n if (file.includes('payment') || file.includes('billing') || file.includes('stripe')) {\n priority += 10;\n reasons.push('payment-related file');\n }\n if (file.includes('admin') || file.includes('dashboard')) {\n priority += 8;\n reasons.push('admin area');\n }\n if (file.includes('api/') || file.includes('routes/')) {\n priority += 5;\n reasons.push('API endpoint');\n }\n \n // Reduce for less important contexts\n if (file.includes('test') || file.includes('spec') || file.includes('mock')) {\n priority -= 15;\n reasons.push('test file (lower priority)');\n }\n if (file.includes('example') || file.includes('demo') || file.includes('sample')) {\n priority -= 10;\n reasons.push('example code');\n }\n \n // Boost for auto-fixable issues\n if (issue.autoFixable) {\n priority += 5;\n reasons.push('auto-fixable');\n }\n \n // Boost for high confidence\n if (issue.confidence >= 0.9) {\n priority += 5;\n reasons.push('high confidence');\n } else if (issue.confidence < 0.7) {\n priority -= 10;\n reasons.push('low confidence');\n }\n \n // Cap at 100\n priority = Math.min(100, Math.max(0, priority));\n \n return {\n ...issue,\n priority,\n reason: reasons.slice(0, 3).join(', '),\n groupKey: createGroupKey(issue),\n };\n}\n\n/**\n * Get numeric rank for severity\n */\nfunction severityRank(severity: Issue['severity']): number {\n const ranks = { critical: 4, serious: 3, moderate: 2, low: 1 };\n return ranks[severity];\n}\n\n/**\n * Generate a human-readable summary\n */\nfunction generateSummary(\n critical: PrioritizedIssue[],\n important: PrioritizedIssue[],\n advisory: PrioritizedIssue[],\n noiseCount: number\n): string {\n let summary = '\\n## 🎯 SMART PRIORITIZATION\\n\\n';\n \n summary += '*Trie Agent filtered noise and prioritized by real-world exploitability*\\n\\n';\n \n // Top actions\n if (critical.length > 0) {\n summary += `### 🔴 ${critical.length} Critical Actions Required\\n\\n`;\n for (const issue of critical.slice(0, 5)) {\n summary += `1. **${issue.issue}** - ${issue.reason}\\n`;\n summary += ` 📍 \\`${basename(issue.file)}:${issue.line || '?'}\\`\\n`;\n summary += ` 🔧 ${issue.fix}\\n\\n`;\n }\n if (critical.length > 5) {\n summary += ` *...and ${critical.length - 5} more critical issues*\\n\\n`;\n }\n }\n \n if (important.length > 0) {\n summary += `### 🟠 ${important.length} Important Improvements\\n\\n`;\n for (const issue of important.slice(0, 3)) {\n summary += `- **${issue.issue}** (${issue.reason})\\n`;\n }\n if (important.length > 3) {\n summary += `- *...and ${important.length - 3} more*\\n`;\n }\n summary += '\\n';\n }\n \n // Noise filtered\n if (noiseCount > 0) {\n summary += `### 🔇 ${noiseCount} items filtered as noise\\n\\n`;\n summary += `*Test files, generated code, low-confidence findings*\\n\\n`;\n }\n \n // Comparison callout\n summary += `---\\n`;\n summary += `*💡 Other tools would show you ${critical.length + important.length + advisory.length + noiseCount} issues.*\\n`;\n summary += `*Trie Agent shows you the ${critical.length + Math.min(important.length, 10)} that actually matter.*\\n`;\n \n return summary;\n}\n\n/**\n * Format prioritized results for output\n */\nexport function formatPrioritizedResults(result: PrioritizationResult): string {\n return result.summary;\n}\n","/**\n * Attack Surface Analyzer\n * \n * This is what REAL security teams want - not a list of 10,000 lint errors,\n * but a clear picture of:\n * \n * 1. What endpoints are exposed?\n * 2. What data do they accept?\n * 3. What's the blast radius if compromised?\n * 4. What's protecting each entry point?\n * \n * This is intelligence, not just scanning.\n */\n\nimport { readFile } from 'fs/promises';\nimport { basename, relative } from 'path';\n\nexport interface AttackSurface {\n endpoints: Endpoint[];\n dataFlows: DataFlow[];\n authBoundaries: AuthBoundary[];\n sensitiveAssets: SensitiveAsset[];\n summary: AttackSurfaceSummary;\n}\n\nexport interface Endpoint {\n method: string;\n path: string;\n file: string;\n line: number;\n accepts: string[]; // What data types it accepts\n returns: string[]; // What it returns\n authRequired: boolean;\n authType?: string; // 'jwt', 'session', 'api-key', etc\n rateLimit: boolean;\n inputValidation: boolean;\n riskScore: number; // 1-10\n riskFactors: string[];\n}\n\nexport interface DataFlow {\n source: string; // Where data comes from\n destination: string; // Where data goes\n dataType: string; // 'user-input', 'pii', 'credentials', etc\n encrypted: boolean;\n logged: boolean;\n file: string;\n risk: 'high' | 'medium' | 'low';\n}\n\nexport interface AuthBoundary {\n name: string;\n type: 'middleware' | 'check' | 'decorator';\n file: string;\n line: number;\n protects: string[]; // What endpoints/resources it protects\n bypassRisk: string[]; // Potential bypass scenarios\n}\n\nexport interface SensitiveAsset {\n type: 'database' | 'api-key' | 'pii' | 'payment' | 'session';\n location: string;\n accessPoints: string[]; // What can access this\n protection: string[]; // What protections exist\n}\n\nexport interface AttackSurfaceSummary {\n totalEndpoints: number;\n publicEndpoints: number;\n authProtectedEndpoints: number;\n unprotectedSensitiveEndpoints: number;\n dataFlowsWithPII: number;\n riskScore: number; // Overall 1-100\n topRisks: string[];\n}\n\n/**\n * Analyze the attack surface of a codebase\n */\nexport class AttackSurfaceAnalyzer {\n private endpoints: Endpoint[] = [];\n private dataFlows: DataFlow[] = [];\n private authBoundaries: AuthBoundary[] = [];\n private sensitiveAssets: SensitiveAsset[] = [];\n \n async analyze(files: string[], rootDir: string): Promise<AttackSurface> {\n // Parse all files\n for (const file of files) {\n try {\n const content = await readFile(file, 'utf-8');\n const relPath = relative(rootDir, file);\n \n this.findEndpoints(content, relPath);\n this.findDataFlows(content, relPath);\n this.findAuthBoundaries(content, relPath);\n this.findSensitiveAssets(content, relPath);\n } catch (e) {\n // Skip unreadable files\n }\n }\n \n // Calculate risk scores\n this.calculateRiskScores();\n \n // Generate summary\n const summary = this.generateSummary();\n \n return {\n endpoints: this.endpoints,\n dataFlows: this.dataFlows,\n authBoundaries: this.authBoundaries,\n sensitiveAssets: this.sensitiveAssets,\n summary,\n };\n }\n\n private findEndpoints(content: string, file: string): void {\n const lines = content.split('\\n');\n \n // Express/Fastify routes\n const routePatterns = [\n /(?:app|router)\\.(get|post|put|delete|patch|all)\\s*\\(\\s*['\"]([^'\"]+)['\"]/gi,\n /export\\s+(?:async\\s+)?function\\s+(GET|POST|PUT|DELETE|PATCH)\\s*\\(/gi,\n ];\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] || '';\n \n for (const pattern of routePatterns) {\n pattern.lastIndex = 0;\n const match = pattern.exec(line);\n if (match) {\n const method = match[1]!.toUpperCase();\n const path = match[2] || `/${basename(file).replace(/\\.[^.]+$/, '')}`;\n \n // Analyze the route context\n const contextLines = lines.slice(i, Math.min(i + 50, lines.length)).join('\\n');\n const authType = this.detectAuthType(line, contextLines);\n \n const endpoint: Endpoint = {\n method,\n path,\n file,\n line: i + 1,\n accepts: this.detectAcceptedData(contextLines),\n returns: this.detectReturnedData(contextLines),\n authRequired: this.detectAuth(line, contextLines),\n ...(authType && { authType }),\n rateLimit: /rateLimit|throttle/i.test(contextLines),\n inputValidation: /validate|schema|zod|yup|joi/i.test(contextLines),\n riskScore: 0, // Calculated later\n riskFactors: [],\n };\n \n this.endpoints.push(endpoint);\n }\n }\n }\n }\n\n private detectAcceptedData(context: string): string[] {\n const accepts: string[] = [];\n \n if (/req\\.body|request\\.json|formData/i.test(context)) {\n accepts.push('json-body');\n }\n if (/req\\.query|searchParams/i.test(context)) {\n accepts.push('query-params');\n }\n if (/req\\.params|params\\./i.test(context)) {\n accepts.push('url-params');\n }\n if (/req\\.file|multipart|upload/i.test(context)) {\n accepts.push('file-upload');\n }\n if (/req\\.headers|authorization/i.test(context)) {\n accepts.push('headers');\n }\n if (/req\\.cookies/i.test(context)) {\n accepts.push('cookies');\n }\n \n return accepts;\n }\n\n private detectReturnedData(context: string): string[] {\n const returns: string[] = [];\n \n if (/user|profile|account/i.test(context) && /res\\.json|return.*json/i.test(context)) {\n returns.push('user-data');\n }\n if (/password|secret|key|token/i.test(context)) {\n returns.push('credentials');\n }\n if (/redirect/i.test(context)) {\n returns.push('redirect');\n }\n if (/render|html/i.test(context)) {\n returns.push('html');\n }\n \n return returns;\n }\n\n private detectAuth(routeLine: string, context: string): boolean {\n return /auth|protect|session|jwt|bearer|verify/i.test(routeLine) ||\n /req\\.user|session\\.|isAuthenticated/i.test(context);\n }\n\n private detectAuthType(routeLine: string, context: string): string | undefined {\n if (/jwt|bearer/i.test(routeLine + context)) return 'jwt';\n if (/session/i.test(routeLine + context)) return 'session';\n if (/apiKey|api[_-]?key/i.test(routeLine + context)) return 'api-key';\n if (/oauth/i.test(routeLine + context)) return 'oauth';\n return undefined;\n }\n\n private findDataFlows(content: string, file: string): void {\n const lines = content.split('\\n');\n \n // Track data from sources to sinks\n const sources = [\n { pattern: /req\\.body/g, type: 'user-input' },\n { pattern: /req\\.query/g, type: 'user-input' },\n { pattern: /email|phone|address|name/gi, type: 'pii' },\n { pattern: /password|secret|token/gi, type: 'credentials' },\n { pattern: /credit|card|payment/gi, type: 'payment' },\n ];\n \n const sinks = [\n { pattern: /\\.query\\(|prisma\\.|mongoose\\./g, dest: 'database' },\n { pattern: /console\\.log|logger\\./g, dest: 'logs' },\n { pattern: /res\\.json|res\\.send/g, dest: 'response' },\n { pattern: /fetch\\(|axios\\./g, dest: 'external-api' },\n ];\n \n for (const source of sources) {\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] || '';\n if (source.pattern.test(line)) {\n source.pattern.lastIndex = 0;\n \n // Look for where this data goes in nearby lines\n const context = lines.slice(i, Math.min(i + 20, lines.length)).join('\\n');\n \n for (const sink of sinks) {\n if (sink.pattern.test(context)) {\n sink.pattern.lastIndex = 0;\n \n this.dataFlows.push({\n source: source.type,\n destination: sink.dest,\n dataType: source.type,\n encrypted: /encrypt|hash|bcrypt/i.test(context),\n logged: /console|logger/i.test(context),\n file,\n risk: this.assessDataFlowRisk(source.type, sink.dest),\n });\n }\n }\n }\n }\n }\n }\n\n private assessDataFlowRisk(sourceType: string, destType: string): 'high' | 'medium' | 'low' {\n // Credentials to logs = critical\n if (sourceType === 'credentials' && destType === 'logs') return 'high';\n // PII to external = high\n if (sourceType === 'pii' && destType === 'external-api') return 'high';\n // Payment data anywhere sensitive = high\n if (sourceType === 'payment') return 'high';\n // User input to database = medium (could be injection)\n if (sourceType === 'user-input' && destType === 'database') return 'medium';\n return 'low';\n }\n\n private findAuthBoundaries(content: string, file: string): void {\n const lines = content.split('\\n');\n \n const authPatterns = [\n { pattern: /export\\s+(?:const|function)\\s+(\\w*auth\\w*)/i, type: 'middleware' as const },\n { pattern: /(?:const|function)\\s+(\\w*protect\\w*|\\w*verify\\w*)/i, type: 'middleware' as const },\n { pattern: /@(?:Auth|Authorized|Protected)\\s*\\(/i, type: 'decorator' as const },\n ];\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] || '';\n \n for (const { pattern, type } of authPatterns) {\n const match = line.match(pattern);\n if (match) {\n const context = lines.slice(i, Math.min(i + 30, lines.length)).join('\\n');\n \n this.authBoundaries.push({\n name: match[1] || 'auth',\n type,\n file,\n line: i + 1,\n protects: this.findProtectedRoutes(match[1] || 'auth'),\n bypassRisk: this.assessBypassRisks(context),\n });\n }\n }\n }\n }\n\n private findProtectedRoutes(_authName: string): string[] {\n return this.endpoints\n .filter(e => e.authType || e.authRequired)\n .map(e => `${e.method} ${e.path}`);\n }\n\n private assessBypassRisks(context: string): string[] {\n const risks: string[] = [];\n \n if (/req\\.query|req\\.params/.test(context) && !/validate|sanitize/.test(context)) {\n risks.push('Input not validated before auth check');\n }\n if (/skip|bypass|disable/.test(context)) {\n risks.push('Bypass logic detected');\n }\n if (!/throw|return.*401|unauthorized/i.test(context)) {\n risks.push('No clear rejection path');\n }\n \n return risks;\n }\n\n private findSensitiveAssets(content: string, file: string): void {\n // Find database connections\n if (/DATABASE_URL|mongodb|postgres|mysql/i.test(content)) {\n this.sensitiveAssets.push({\n type: 'database',\n location: file,\n accessPoints: this.findAccessPoints('database', file),\n protection: this.findProtections(content, 'database'),\n });\n }\n \n // Find API keys\n if (/API_KEY|OPENAI|STRIPE|SENDGRID/i.test(content)) {\n this.sensitiveAssets.push({\n type: 'api-key',\n location: file,\n accessPoints: ['environment-variable'],\n protection: this.findProtections(content, 'api-key'),\n });\n }\n \n // Find PII storage\n if (/email|phone|ssn|address/i.test(content) && /schema|model|table/i.test(content)) {\n this.sensitiveAssets.push({\n type: 'pii',\n location: file,\n accessPoints: this.findAccessPoints('pii', file),\n protection: this.findProtections(content, 'pii'),\n });\n }\n }\n\n private findAccessPoints(_assetType: string, file: string): string[] {\n return this.endpoints\n .filter(e => e.file === file || e.returns.some(r => r.includes('user') || r.includes('data')))\n .map(e => `${e.method} ${e.path}`);\n }\n\n private findProtections(content: string, _assetType: string): string[] {\n const protections: string[] = [];\n \n if (/encrypt/i.test(content)) protections.push('encryption');\n if (/hash|bcrypt/i.test(content)) protections.push('hashing');\n if (/auth|protect/i.test(content)) protections.push('auth-required');\n if (/rateLimit|throttle/i.test(content)) protections.push('rate-limiting');\n if (/validate|sanitize/i.test(content)) protections.push('input-validation');\n \n return protections;\n }\n\n private calculateRiskScores(): void {\n for (const endpoint of this.endpoints) {\n let risk = 0;\n const factors: string[] = [];\n \n // Method risks\n if (['POST', 'PUT', 'DELETE', 'PATCH'].includes(endpoint.method)) {\n risk += 2;\n factors.push('mutating method');\n }\n \n // Auth risks\n if (!endpoint.authRequired) {\n risk += 3;\n factors.push('no auth required');\n }\n \n // Input risks\n if (endpoint.accepts.includes('file-upload')) {\n risk += 2;\n factors.push('accepts file upload');\n }\n if (endpoint.accepts.includes('json-body') && !endpoint.inputValidation) {\n risk += 2;\n factors.push('no input validation');\n }\n \n // Path risks\n if (/admin|user|account|payment|billing/i.test(endpoint.path)) {\n risk += 2;\n factors.push('sensitive path');\n }\n \n // Rate limiting\n if (!endpoint.rateLimit && endpoint.accepts.length > 0) {\n risk += 1;\n factors.push('no rate limiting');\n }\n \n endpoint.riskScore = Math.min(10, risk);\n endpoint.riskFactors = factors;\n }\n }\n\n private generateSummary(): AttackSurfaceSummary {\n const publicEndpoints = this.endpoints.filter(e => !e.authRequired);\n const sensitiveUnprotected = this.endpoints.filter(e => \n !e.authRequired && (\n /admin|user|payment|billing|account/i.test(e.path) ||\n e.accepts.includes('json-body')\n )\n );\n const piiFlows = this.dataFlows.filter(f => f.dataType === 'pii' || f.dataType === 'credentials');\n \n // Calculate overall risk\n let overallRisk = 0;\n overallRisk += publicEndpoints.length * 2;\n overallRisk += sensitiveUnprotected.length * 10;\n overallRisk += piiFlows.filter(f => f.risk === 'high').length * 15;\n overallRisk = Math.min(100, overallRisk);\n \n const topRisks: string[] = [];\n if (sensitiveUnprotected.length > 0) {\n topRisks.push(`${sensitiveUnprotected.length} sensitive endpoints without auth`);\n }\n if (piiFlows.filter(f => !f.encrypted).length > 0) {\n topRisks.push('PII data flows without encryption');\n }\n if (this.endpoints.filter(e => !e.inputValidation && e.accepts.length > 0).length > 3) {\n topRisks.push('Multiple endpoints without input validation');\n }\n \n return {\n totalEndpoints: this.endpoints.length,\n publicEndpoints: publicEndpoints.length,\n authProtectedEndpoints: this.endpoints.length - publicEndpoints.length,\n unprotectedSensitiveEndpoints: sensitiveUnprotected.length,\n dataFlowsWithPII: piiFlows.length,\n riskScore: overallRisk,\n topRisks,\n };\n }\n}\n\n/**\n * Format attack surface analysis for output\n */\nexport function formatAttackSurface(surface: AttackSurface): string {\n if (surface.endpoints.length === 0) {\n return '';\n }\n \n let output = '\\n' + '━'.repeat(60) + '\\n';\n output += '🎯 ATTACK SURFACE ANALYSIS\\n';\n output += '━'.repeat(60) + '\\n\\n';\n \n output += `## Summary\\n\\n`;\n output += `| Metric | Value |\\n`;\n output += `|--------|-------|\\n`;\n output += `| Total Endpoints | ${surface.summary.totalEndpoints} |\\n`;\n output += `| Public (No Auth) | ${surface.summary.publicEndpoints} |\\n`;\n output += `| Auth Protected | ${surface.summary.authProtectedEndpoints} |\\n`;\n output += `| ⚠️ Unprotected Sensitive | ${surface.summary.unprotectedSensitiveEndpoints} |\\n`;\n output += `| PII Data Flows | ${surface.summary.dataFlowsWithPII} |\\n`;\n output += `| **Risk Score** | **${surface.summary.riskScore}/100** |\\n\\n`;\n \n if (surface.summary.topRisks.length > 0) {\n output += `## 🚨 Top Risks\\n\\n`;\n for (const risk of surface.summary.topRisks) {\n output += `- ${risk}\\n`;\n }\n output += '\\n';\n }\n \n // High risk endpoints\n const highRiskEndpoints = surface.endpoints\n .filter(e => e.riskScore >= 6)\n .sort((a, b) => b.riskScore - a.riskScore);\n \n if (highRiskEndpoints.length > 0) {\n output += `## 🔴 High-Risk Endpoints\\n\\n`;\n for (const ep of highRiskEndpoints.slice(0, 5)) {\n output += `### ${ep.method} ${ep.path}\\n`;\n output += `- 📍 \\`${ep.file}:${ep.line}\\`\\n`;\n output += `- Risk Score: ${ep.riskScore}/10\\n`;\n output += `- Auth: ${ep.authRequired ? `✅ ${ep.authType || 'required'}` : '❌ None'}\\n`;\n output += `- Accepts: ${ep.accepts.join(', ') || 'nothing'}\\n`;\n output += `- Risk Factors: ${ep.riskFactors.join(', ')}\\n\\n`;\n }\n }\n \n // Data flow risks\n const riskyFlows = surface.dataFlows.filter(f => f.risk === 'high');\n if (riskyFlows.length > 0) {\n output += `## 🔄 Risky Data Flows\\n\\n`;\n for (const flow of riskyFlows.slice(0, 5)) {\n output += `- **${flow.source}** → **${flow.destination}**\\n`;\n output += ` - Type: ${flow.dataType}\\n`;\n output += ` - Encrypted: ${flow.encrypted ? '✅' : '❌'}\\n`;\n output += ` - File: \\`${flow.file}\\`\\n\\n`;\n }\n }\n \n return output;\n}\n","/**\n * Code Symbol Index\n * \n * Uses a trie to index all code symbols (functions, classes, variables, exports)\n * for O(m) lookup where m = symbol name length.\n * \n * Benefits:\n * - Instant symbol lookup across entire codebase\n * - Fast autocomplete suggestions\n * - Cross-reference detection (unused exports, missing imports)\n * - Incremental updates when files change\n */\n\nimport { Trie } from './trie.js';\n\nexport interface SymbolInfo {\n name: string;\n type: 'function' | 'class' | 'variable' | 'interface' | 'type' | 'enum' | 'const' | 'method' | 'property' | 'export' | 'import';\n file: string;\n line: number;\n column: number;\n exported: boolean;\n async: boolean;\n signature?: string;\n jsDoc?: string;\n references: SymbolReference[];\n}\n\nexport interface SymbolReference {\n file: string;\n line: number;\n column: number;\n type: 'definition' | 'usage' | 'import' | 'export';\n}\n\nexport interface SymbolIndexStats {\n totalSymbols: number;\n byType: Record<string, number>;\n filesIndexed: number;\n exportedSymbols: number;\n unusedExports: string[];\n}\n\n/**\n * Code Symbol Index using Trie for fast lookups\n */\nexport class SymbolIndex {\n private symbolTrie: Trie<SymbolInfo[]>;\n private fileSymbols: Map<string, SymbolInfo[]>;\n private exportedSymbols: Set<string>;\n private importedSymbols: Map<string, Set<string>>; // file -> imported symbol names\n \n constructor() {\n this.symbolTrie = new Trie<SymbolInfo[]>();\n this.fileSymbols = new Map();\n this.exportedSymbols = new Set();\n this.importedSymbols = new Map();\n }\n\n /**\n * Index a file's symbols\n * O(n) where n = file content length\n */\n indexFile(filePath: string, content: string): void {\n // Remove old symbols from this file\n this.removeFile(filePath);\n \n const symbols: SymbolInfo[] = [];\n const lines = content.split('\\n');\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] || '';\n const lineNum = i + 1;\n \n // Extract various symbol types\n const extracted = [\n ...this.extractFunctions(line, lineNum, filePath),\n ...this.extractClasses(line, lineNum, filePath),\n ...this.extractVariables(line, lineNum, filePath),\n ...this.extractInterfaces(line, lineNum, filePath),\n ...this.extractTypes(line, lineNum, filePath),\n ...this.extractImports(line, lineNum, filePath),\n ];\n \n symbols.push(...extracted);\n }\n \n // Store symbols\n this.fileSymbols.set(filePath, symbols);\n \n // Add to trie\n for (const symbol of symbols) {\n const existing = this.symbolTrie.search(symbol.name);\n if (existing.found && existing.value) {\n existing.value.push(symbol);\n } else {\n this.symbolTrie.insert(symbol.name, [symbol]);\n }\n \n // Track exports\n if (symbol.exported) {\n this.exportedSymbols.add(`${filePath}:${symbol.name}`);\n }\n }\n }\n\n /**\n * Remove a file from the index\n * O(s) where s = number of symbols in file\n */\n removeFile(filePath: string): void {\n const symbols = this.fileSymbols.get(filePath) || [];\n \n for (const symbol of symbols) {\n const existing = this.symbolTrie.search(symbol.name);\n if (existing.found && existing.value) {\n const filtered = existing.value.filter(s => s.file !== filePath);\n if (filtered.length > 0) {\n this.symbolTrie.insert(symbol.name, filtered);\n }\n }\n \n this.exportedSymbols.delete(`${filePath}:${symbol.name}`);\n }\n \n this.fileSymbols.delete(filePath);\n this.importedSymbols.delete(filePath);\n }\n\n /**\n * Look up a symbol by name\n * O(m) where m = symbol name length\n */\n lookup(name: string): SymbolInfo[] {\n const result = this.symbolTrie.search(name);\n return result.found && result.value ? result.value : [];\n }\n\n /**\n * Find symbols with a given prefix (autocomplete)\n * O(p + n) where p = prefix length, n = number of matches\n */\n findWithPrefix(prefix: string): SymbolInfo[] {\n const patterns = this.symbolTrie.getWithPrefix(prefix);\n const symbols: SymbolInfo[] = [];\n \n for (const { value } of patterns) {\n if (value) {\n symbols.push(...value);\n }\n }\n \n return symbols;\n }\n\n /**\n * Get all symbols in a file\n * O(1)\n */\n getFileSymbols(filePath: string): SymbolInfo[] {\n return this.fileSymbols.get(filePath) || [];\n }\n\n /**\n * Find all references to a symbol\n * O(n) where n = total symbols (could be optimized with reverse index)\n */\n findReferences(name: string): SymbolReference[] {\n const symbols = this.lookup(name);\n const references: SymbolReference[] = [];\n \n for (const symbol of symbols) {\n references.push({\n file: symbol.file,\n line: symbol.line,\n column: symbol.column,\n type: symbol.exported ? 'export' : 'definition',\n });\n references.push(...symbol.references);\n }\n \n return references;\n }\n\n /**\n * Find unused exports\n * O(e) where e = number of exports\n */\n findUnusedExports(): Array<{ name: string; file: string; line: number }> {\n const unused: Array<{ name: string; file: string; line: number }> = [];\n \n // Collect all imported symbols\n const allImported = new Set<string>();\n for (const imports of this.importedSymbols.values()) {\n for (const imp of imports) {\n allImported.add(imp);\n }\n }\n \n // Check each export\n for (const [file, symbols] of this.fileSymbols) {\n for (const symbol of symbols) {\n if (symbol.exported && !allImported.has(symbol.name)) {\n // Skip index files and main entry points\n if (file.includes('index.') || file.includes('main.')) continue;\n \n unused.push({\n name: symbol.name,\n file,\n line: symbol.line,\n });\n }\n }\n }\n \n return unused;\n }\n\n /**\n * Get index statistics\n */\n getStats(): SymbolIndexStats {\n const byType: Record<string, number> = {};\n let totalSymbols = 0;\n \n for (const symbols of this.fileSymbols.values()) {\n for (const symbol of symbols) {\n totalSymbols++;\n byType[symbol.type] = (byType[symbol.type] || 0) + 1;\n }\n }\n \n const unusedExports = this.findUnusedExports();\n \n return {\n totalSymbols,\n byType,\n filesIndexed: this.fileSymbols.size,\n exportedSymbols: this.exportedSymbols.size,\n unusedExports: unusedExports.map(u => `${u.file}:${u.name}`),\n };\n }\n\n // ============================================\n // Symbol extraction methods\n // ============================================\n\n private extractFunctions(line: string, lineNum: number, file: string): SymbolInfo[] {\n const symbols: SymbolInfo[] = [];\n \n // export async function name()\n // function name()\n // async function name()\n const funcMatch = line.match(/^(\\s*)(export\\s+)?(async\\s+)?function\\s+(\\w+)\\s*\\(([^)]*)\\)/);\n if (funcMatch) {\n symbols.push({\n name: funcMatch[4]!,\n type: 'function',\n file,\n line: lineNum,\n column: (funcMatch[1]?.length || 0) + 1,\n exported: !!funcMatch[2],\n async: !!funcMatch[3],\n signature: `function ${funcMatch[4]}(${funcMatch[5]})`,\n references: [],\n });\n }\n \n // export const name = () => {}\n // const name = async () => {}\n const arrowMatch = line.match(/^(\\s*)(export\\s+)?(const|let|var)\\s+(\\w+)\\s*=\\s*(async\\s*)?\\(/);\n if (arrowMatch) {\n symbols.push({\n name: arrowMatch[4]!,\n type: 'function',\n file,\n line: lineNum,\n column: (arrowMatch[1]?.length || 0) + 1,\n exported: !!arrowMatch[2],\n async: !!arrowMatch[5],\n signature: `const ${arrowMatch[4]} = ${arrowMatch[5] || ''}(...)`,\n references: [],\n });\n }\n \n return symbols;\n }\n\n private extractClasses(line: string, lineNum: number, file: string): SymbolInfo[] {\n const symbols: SymbolInfo[] = [];\n \n // export class Name\n // class Name\n const classMatch = line.match(/^(\\s*)(export\\s+)?(abstract\\s+)?class\\s+(\\w+)/);\n if (classMatch) {\n symbols.push({\n name: classMatch[4]!,\n type: 'class',\n file,\n line: lineNum,\n column: (classMatch[1]?.length || 0) + 1,\n exported: !!classMatch[2],\n async: false,\n signature: `class ${classMatch[4]}`,\n references: [],\n });\n }\n \n return symbols;\n }\n\n private extractVariables(line: string, lineNum: number, file: string): SymbolInfo[] {\n const symbols: SymbolInfo[] = [];\n \n // Skip if it's a function (already handled)\n if (/=\\s*(async\\s*)?\\(/.test(line)) return symbols;\n \n // export const NAME = \n // const name = \n const varMatch = line.match(/^(\\s*)(export\\s+)?(const|let|var)\\s+(\\w+)\\s*=/);\n if (varMatch) {\n const name = varMatch[4]!;\n // Determine if it's a constant (UPPER_CASE) or variable\n const isConst = /^[A-Z][A-Z0-9_]*$/.test(name);\n \n symbols.push({\n name,\n type: isConst ? 'const' : 'variable',\n file,\n line: lineNum,\n column: (varMatch[1]?.length || 0) + 1,\n exported: !!varMatch[2],\n async: false,\n references: [],\n });\n }\n \n return symbols;\n }\n\n private extractInterfaces(line: string, lineNum: number, file: string): SymbolInfo[] {\n const symbols: SymbolInfo[] = [];\n \n // export interface Name\n // interface Name\n const interfaceMatch = line.match(/^(\\s*)(export\\s+)?interface\\s+(\\w+)/);\n if (interfaceMatch) {\n symbols.push({\n name: interfaceMatch[3]!,\n type: 'interface',\n file,\n line: lineNum,\n column: (interfaceMatch[1]?.length || 0) + 1,\n exported: !!interfaceMatch[2],\n async: false,\n references: [],\n });\n }\n \n return symbols;\n }\n\n private extractTypes(line: string, lineNum: number, file: string): SymbolInfo[] {\n const symbols: SymbolInfo[] = [];\n \n // export type Name = \n // type Name = \n const typeMatch = line.match(/^(\\s*)(export\\s+)?type\\s+(\\w+)\\s*=/);\n if (typeMatch) {\n symbols.push({\n name: typeMatch[3]!,\n type: 'type',\n file,\n line: lineNum,\n column: (typeMatch[1]?.length || 0) + 1,\n exported: !!typeMatch[2],\n async: false,\n references: [],\n });\n }\n \n // export enum Name\n const enumMatch = line.match(/^(\\s*)(export\\s+)?enum\\s+(\\w+)/);\n if (enumMatch) {\n symbols.push({\n name: enumMatch[3]!,\n type: 'enum',\n file,\n line: lineNum,\n column: (enumMatch[1]?.length || 0) + 1,\n exported: !!enumMatch[2],\n async: false,\n references: [],\n });\n }\n \n return symbols;\n }\n\n private extractImports(line: string, lineNum: number, file: string): SymbolInfo[] {\n const symbols: SymbolInfo[] = [];\n \n // import { a, b } from 'module'\n const namedImportMatch = line.match(/import\\s+\\{([^}]+)\\}\\s+from\\s+['\"]([^'\"]+)['\"]/);\n if (namedImportMatch) {\n const specifiers = namedImportMatch[1]!.split(',').map(s => {\n const parts = s.trim().split(/\\s+as\\s+/);\n return parts[parts.length - 1]!.trim();\n });\n \n // Track imports for this file\n if (!this.importedSymbols.has(file)) {\n this.importedSymbols.set(file, new Set());\n }\n for (const spec of specifiers) {\n this.importedSymbols.get(file)!.add(spec);\n \n symbols.push({\n name: spec,\n type: 'import',\n file,\n line: lineNum,\n column: 1,\n exported: false,\n async: false,\n signature: `import { ${spec} } from '${namedImportMatch[2]}'`,\n references: [],\n });\n }\n }\n \n // import Name from 'module'\n const defaultImportMatch = line.match(/import\\s+(\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/);\n if (defaultImportMatch && !line.includes('{')) {\n const name = defaultImportMatch[1]!;\n \n if (!this.importedSymbols.has(file)) {\n this.importedSymbols.set(file, new Set());\n }\n this.importedSymbols.get(file)!.add(name);\n \n symbols.push({\n name,\n type: 'import',\n file,\n line: lineNum,\n column: 1,\n exported: false,\n async: false,\n signature: `import ${name} from '${defaultImportMatch[2]}'`,\n references: [],\n });\n }\n \n return symbols;\n }\n\n /**\n * Serialize the index for caching\n */\n toJSON(): object {\n const files: Record<string, SymbolInfo[]> = {};\n for (const [file, symbols] of this.fileSymbols) {\n files[file] = symbols;\n }\n return { files };\n }\n\n /**\n * Load from serialized JSON\n */\n static fromJSON(data: { files: Record<string, SymbolInfo[]> }): SymbolIndex {\n const index = new SymbolIndex();\n \n for (const [file, symbols] of Object.entries(data.files)) {\n index.fileSymbols.set(file, symbols);\n \n for (const symbol of symbols) {\n const existing = index.symbolTrie.search(symbol.name);\n if (existing.found && existing.value) {\n existing.value.push(symbol);\n } else {\n index.symbolTrie.insert(symbol.name, [symbol]);\n }\n \n if (symbol.exported) {\n index.exportedSymbols.add(`${file}:${symbol.name}`);\n }\n \n if (symbol.type === 'import') {\n if (!index.importedSymbols.has(file)) {\n index.importedSymbols.set(file, new Set());\n }\n index.importedSymbols.get(file)!.add(symbol.name);\n }\n }\n }\n \n return index;\n }\n}\n\n// Global symbol index instance\nlet globalSymbolIndex: SymbolIndex | null = null;\n\nexport function getSymbolIndex(): SymbolIndex {\n if (!globalSymbolIndex) {\n globalSymbolIndex = new SymbolIndex();\n }\n return globalSymbolIndex;\n}\n\nexport function resetSymbolIndex(): void {\n globalSymbolIndex = new SymbolIndex();\n}\n\n","/**\n * Incremental Scanner\n * \n * Uses trie-based indexing for smart, incremental code scanning.\n * Only re-scans changed parts of the codebase.\n * \n * Benefits:\n * - O(c) scanning where c = changed lines, not entire file\n * - Maintains persistent index for instant lookups\n * - Caches vulnerability scans per file\n * - Tracks file hashes for change detection\n */\n\nimport { createHash } from 'crypto';\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { getSymbolIndex, SymbolIndex } from './symbol-index.js';\nimport { scanForVulnerabilities, VulnerabilityMatch, getVulnerabilityTrie } from './vulnerability-signatures.js';\n\nexport interface FileState {\n path: string;\n hash: string;\n lastScanned: number;\n lineCount: number;\n vulnerabilities: VulnerabilityMatch[];\n symbolCount: number;\n}\n\nexport interface ScanCache {\n version: string;\n created: number;\n lastUpdated: number;\n files: Record<string, FileState>;\n}\n\nexport interface IncrementalScanResult {\n filesScanned: number;\n filesSkipped: number;\n filesChanged: number;\n totalVulnerabilities: number;\n newVulnerabilities: VulnerabilityMatch[];\n resolvedVulnerabilities: VulnerabilityMatch[];\n scanTimeMs: number;\n cacheHitRate: number;\n}\n\nconst CACHE_VERSION = '1.0.0';\nconst CACHE_FILE = '.trie-cache.json';\n\n/**\n * Incremental Scanner with trie-based caching\n */\nexport class IncrementalScanner {\n private cache: ScanCache;\n private symbolIndex: SymbolIndex;\n private cacheDir: string;\n private dirty: boolean = false;\n\n constructor(projectRoot: string) {\n this.cacheDir = join(projectRoot, '.trie');\n this.symbolIndex = getSymbolIndex();\n this.cache = {\n version: CACHE_VERSION,\n created: Date.now(),\n lastUpdated: Date.now(),\n files: {},\n };\n }\n\n /**\n * Load cache from disk\n */\n async loadCache(): Promise<boolean> {\n const cachePath = join(this.cacheDir, CACHE_FILE);\n \n if (!existsSync(cachePath)) {\n return false;\n }\n\n try {\n const data = await readFile(cachePath, 'utf-8');\n const parsed = JSON.parse(data);\n \n // Version check\n if (parsed.version !== CACHE_VERSION) {\n console.error(' ⚠️ Cache version mismatch, rebuilding...');\n return false;\n }\n \n this.cache = parsed;\n console.error(` ✅ Loaded cache with ${Object.keys(this.cache.files).length} files`);\n return true;\n } catch (error) {\n console.error(' ⚠️ Failed to load cache, rebuilding...');\n return false;\n }\n }\n\n /**\n * Save cache to disk\n */\n async saveCache(): Promise<void> {\n if (!this.dirty) return;\n\n try {\n await mkdir(this.cacheDir, { recursive: true });\n const cachePath = join(this.cacheDir, CACHE_FILE);\n \n this.cache.lastUpdated = Date.now();\n await writeFile(cachePath, JSON.stringify(this.cache, null, 2));\n \n this.dirty = false;\n } catch (error) {\n console.error(' ⚠️ Failed to save cache');\n }\n }\n\n /**\n * Compute file hash for change detection\n * O(n) where n = file size\n */\n private computeHash(content: string): string {\n return createHash('sha256').update(content).digest('hex').slice(0, 16);\n }\n\n /**\n * Check if a file has changed since last scan\n * O(1) for cache lookup + O(n) for hash if needed\n */\n async hasFileChanged(filePath: string, content?: string): Promise<boolean> {\n const cached = this.cache.files[filePath];\n if (!cached) return true;\n\n if (!content) {\n try {\n content = await readFile(filePath, 'utf-8');\n } catch {\n return true;\n }\n }\n\n const currentHash = this.computeHash(content);\n return currentHash !== cached.hash;\n }\n\n /**\n * Scan a single file incrementally\n * Returns cached results if file unchanged\n */\n async scanFile(filePath: string, forceRescan: boolean = false): Promise<{\n vulnerabilities: VulnerabilityMatch[];\n fromCache: boolean;\n symbolCount: number;\n }> {\n let content: string;\n \n try {\n content = await readFile(filePath, 'utf-8');\n } catch {\n return { vulnerabilities: [], fromCache: false, symbolCount: 0 };\n }\n\n const hash = this.computeHash(content);\n const cached = this.cache.files[filePath];\n\n // Check if we can use cached results\n if (!forceRescan && cached && cached.hash === hash) {\n return {\n vulnerabilities: cached.vulnerabilities,\n fromCache: true,\n symbolCount: cached.symbolCount,\n };\n }\n\n // Need to scan - file is new or changed\n const vulnerabilities = scanForVulnerabilities(content, filePath);\n \n // Index symbols\n this.symbolIndex.indexFile(filePath, content);\n const symbols = this.symbolIndex.getFileSymbols(filePath);\n\n // Update cache\n this.cache.files[filePath] = {\n path: filePath,\n hash,\n lastScanned: Date.now(),\n lineCount: content.split('\\n').length,\n vulnerabilities,\n symbolCount: symbols.length,\n };\n this.dirty = true;\n\n return {\n vulnerabilities,\n fromCache: false,\n symbolCount: symbols.length,\n };\n }\n\n /**\n * Scan multiple files with incremental caching\n */\n async scanFiles(\n filePaths: string[],\n forceRescan: boolean = false,\n onFileProgress?: (filePath: string, fromCache: boolean) => void\n ): Promise<IncrementalScanResult> {\n const startTime = Date.now();\n \n // Initialize vulnerability trie\n getVulnerabilityTrie();\n\n let filesScanned = 0;\n let filesSkipped = 0;\n let filesChanged = 0;\n const allVulnerabilities: VulnerabilityMatch[] = [];\n const newVulnerabilities: VulnerabilityMatch[] = [];\n const previousVulnerabilities = new Map<string, VulnerabilityMatch[]>();\n\n // Track previous state for comparison\n for (const [path, state] of Object.entries(this.cache.files)) {\n previousVulnerabilities.set(path, state.vulnerabilities);\n }\n\n // Scan each file\n for (const filePath of filePaths) {\n const result = await this.scanFile(filePath, forceRescan);\n onFileProgress?.(filePath, result.fromCache);\n \n allVulnerabilities.push(...result.vulnerabilities);\n\n if (result.fromCache) {\n filesSkipped++;\n } else {\n filesScanned++;\n \n // Check for new vulnerabilities\n const previous = previousVulnerabilities.get(filePath) || [];\n const previousPatterns = new Set(previous.map(v => `${v.line}:${v.pattern}`));\n \n for (const vuln of result.vulnerabilities) {\n if (!previousPatterns.has(`${vuln.line}:${vuln.pattern}`)) {\n newVulnerabilities.push(vuln);\n filesChanged++;\n }\n }\n }\n }\n\n // Find resolved vulnerabilities\n const currentPaths = new Set(filePaths);\n const resolvedVulnerabilities: VulnerabilityMatch[] = [];\n \n for (const [path, vulns] of previousVulnerabilities) {\n if (currentPaths.has(path)) {\n const current = this.cache.files[path]?.vulnerabilities || [];\n const currentPatterns = new Set(current.map(v => `${v.line}:${v.pattern}`));\n \n for (const vuln of vulns) {\n if (!currentPatterns.has(`${vuln.line}:${vuln.pattern}`)) {\n resolvedVulnerabilities.push(vuln);\n }\n }\n }\n }\n\n const scanTimeMs = Date.now() - startTime;\n const totalFiles = filesScanned + filesSkipped;\n const cacheHitRate = totalFiles > 0 ? (filesSkipped / totalFiles) * 100 : 0;\n\n return {\n filesScanned,\n filesSkipped,\n filesChanged,\n totalVulnerabilities: allVulnerabilities.length,\n newVulnerabilities,\n resolvedVulnerabilities,\n scanTimeMs,\n cacheHitRate,\n };\n }\n\n /**\n * Remove a file from the cache\n */\n removeFile(filePath: string): void {\n delete this.cache.files[filePath];\n this.symbolIndex.removeFile(filePath);\n this.dirty = true;\n }\n\n /**\n * Clear the entire cache\n */\n clearCache(): void {\n this.cache = {\n version: CACHE_VERSION,\n created: Date.now(),\n lastUpdated: Date.now(),\n files: {},\n };\n this.dirty = true;\n }\n\n /**\n * Get cache statistics\n */\n getStats(): {\n filesInCache: number;\n totalVulnerabilities: number;\n totalSymbols: number;\n oldestScan: number;\n cacheSize: number;\n } {\n let totalVulnerabilities = 0;\n let totalSymbols = 0;\n let oldestScan = Date.now();\n\n for (const file of Object.values(this.cache.files)) {\n totalVulnerabilities += file.vulnerabilities.length;\n totalSymbols += file.symbolCount;\n if (file.lastScanned < oldestScan) {\n oldestScan = file.lastScanned;\n }\n }\n\n return {\n filesInCache: Object.keys(this.cache.files).length,\n totalVulnerabilities,\n totalSymbols,\n oldestScan,\n cacheSize: JSON.stringify(this.cache).length,\n };\n }\n\n /**\n * Get all cached vulnerabilities\n */\n getAllVulnerabilities(): VulnerabilityMatch[] {\n const all: VulnerabilityMatch[] = [];\n for (const file of Object.values(this.cache.files)) {\n all.push(...file.vulnerabilities);\n }\n return all;\n }\n\n /**\n * Get vulnerabilities by severity\n */\n getVulnerabilitiesBySeverity(): Record<string, VulnerabilityMatch[]> {\n const bySeverity: Record<string, VulnerabilityMatch[]> = {\n critical: [],\n serious: [],\n moderate: [],\n low: [],\n };\n\n for (const file of Object.values(this.cache.files)) {\n for (const vuln of file.vulnerabilities) {\n bySeverity[vuln.severity]?.push(vuln);\n }\n }\n\n return bySeverity;\n }\n}\n\n/**\n * Format incremental scan results for output\n */\nexport function formatIncrementalScanResult(result: IncrementalScanResult): string {\n let output = `\\n${'━'.repeat(60)}\\n`;\n output += `⚡ INCREMENTAL SCAN RESULTS (Trie-Powered)\\n`;\n output += `${'━'.repeat(60)}\\n\\n`;\n\n output += `## 📊 Scan Statistics\\n\\n`;\n output += `| Metric | Value |\\n`;\n output += `|--------|-------|\\n`;\n output += `| Files Scanned | ${result.filesScanned} |\\n`;\n output += `| Files Skipped (cached) | ${result.filesSkipped} |\\n`;\n output += `| Cache Hit Rate | ${result.cacheHitRate.toFixed(1)}% |\\n`;\n output += `| Total Vulnerabilities | ${result.totalVulnerabilities} |\\n`;\n output += `| Scan Time | ${result.scanTimeMs}ms |\\n`;\n output += `\\n`;\n\n if (result.newVulnerabilities.length > 0) {\n output += `## 🆕 New Vulnerabilities (${result.newVulnerabilities.length})\\n\\n`;\n for (const vuln of result.newVulnerabilities) {\n const icon = { critical: '🔴', serious: '🟠', moderate: '🟡', low: '🔵' }[vuln.severity];\n output += `${icon} **Line ${vuln.line}:** ${vuln.description}\\n`;\n output += ` - Pattern: \\`${vuln.pattern}\\`\\n`;\n output += ` - Fix: ${vuln.fix}\\n`;\n if (vuln.cwe) output += ` - CWE: ${vuln.cwe}\\n`;\n output += `\\n`;\n }\n }\n\n if (result.resolvedVulnerabilities.length > 0) {\n output += `## ✅ Resolved Vulnerabilities (${result.resolvedVulnerabilities.length})\\n\\n`;\n for (const vuln of result.resolvedVulnerabilities) {\n output += `- ~~${vuln.pattern}~~ at line ${vuln.line}\\n`;\n }\n output += `\\n`;\n }\n\n if (result.newVulnerabilities.length === 0 && result.resolvedVulnerabilities.length === 0) {\n output += `## ✅ No Changes\\n\\n`;\n output += `No new vulnerabilities introduced. No vulnerabilities resolved.\\n`;\n }\n\n return output;\n}\n\n","import type { Issue } from '../types/index.js';\n\nexport interface StreamUpdate {\n type: 'progress' | 'agent_start' | 'agent_complete' | 'issue_found' | 'scan_complete' | 'error';\n timestamp: number;\n data: any;\n}\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 console.warn('Stream listener error:', error);\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 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/**\n * Format streaming updates for console output\n */\nexport function formatConsoleUpdate(update: StreamUpdate): string | null {\n switch (update.type) {\n case 'agent_start':\n return `🔍 Starting ${update.data.agent}...`;\n\n case 'agent_complete':\n const emoji = update.data.issueCount > 0 ? '⚠️' : '✅';\n return `${emoji} ${update.data.agent} found ${update.data.issueCount} issues`;\n\n case 'progress':\n const { processedFiles, totalFiles, currentFile, activeAgents } = update.data;\n const progress = totalFiles > 0 ? Math.round((processedFiles / totalFiles) * 100) : 0;\n const active = activeAgents.length > 0 ? ` (${activeAgents.join(', ')})` : '';\n const current = currentFile ? ` • ${currentFile.split('/').pop()}` : '';\n return `📊 Progress: ${progress}% (${processedFiles}/${totalFiles})${active}${current}`;\n\n case 'scan_complete':\n return `🎉 Scan complete! Found ${update.data.totalIssues} issues across ${update.data.totalFiles} files`;\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 type { Issue } from '../types/index.js';\n\nexport interface IssueGroup {\n id: string;\n pattern: string;\n description: string;\n count: number;\n severity: Issue['severity'];\n issues: Issue[];\n riskScore: number;\n fixComplexity: 'trivial' | 'easy' | 'medium' | 'hard';\n category: 'security' | 'performance' | 'maintainability' | 'correctness' | 'style';\n suggestedAction: string;\n bulkFixAvailable: boolean;\n}\n\nexport interface PriorityReport {\n urgent: IssueGroup[];\n high: IssueGroup[];\n medium: IssueGroup[];\n low: IssueGroup[];\n totalIssues: number;\n totalGroups: number;\n riskScore: number;\n recommendations: string[];\n}\n\n/**\n * Smart issue analysis and grouping\n *\n * Groups related issues together and provides intelligent prioritization\n * based on risk, impact, and fix complexity\n */\nexport class IssueAnalyzer {\n /**\n * Analyze and group issues intelligently\n */\n analyzeIssues(issues: Issue[]): PriorityReport {\n // Group issues by pattern\n const groups = this.groupIssuesByPattern(issues);\n\n // Calculate risk scores\n const groupsWithRisk = groups.map(group => ({\n ...group,\n riskScore: this.calculateRiskScore(group),\n category: this.categorizeGroup(group),\n fixComplexity: this.assessFixComplexity(group),\n bulkFixAvailable: this.canBulkFix(group)\n }));\n\n // Prioritize groups\n const prioritized = this.prioritizeGroups(groupsWithRisk);\n\n // Generate recommendations\n const recommendations = this.generateRecommendations(prioritized, issues);\n\n return {\n urgent: prioritized.filter(g => g.riskScore >= 80),\n high: prioritized.filter(g => g.riskScore >= 60 && g.riskScore < 80),\n medium: prioritized.filter(g => g.riskScore >= 40 && g.riskScore < 60),\n low: prioritized.filter(g => g.riskScore < 40),\n totalIssues: issues.length,\n totalGroups: groups.length,\n riskScore: this.calculateOverallRisk(prioritized),\n recommendations\n };\n }\n\n /**\n * Group issues by similar patterns\n */\n private groupIssuesByPattern(issues: Issue[]): IssueGroup[] {\n const groups = new Map<string, Issue[]>();\n\n // Group by exact issue pattern first\n for (const issue of issues) {\n const pattern = this.extractPattern(issue);\n if (!groups.has(pattern)) {\n groups.set(pattern, []);\n }\n groups.get(pattern)!.push(issue);\n }\n\n // Merge similar patterns\n const mergedGroups = this.mergeSimilarPatterns(groups);\n\n // Convert to IssueGroup objects\n return Array.from(mergedGroups.entries()).map(([pattern, groupIssues]) => {\n const severity = this.getGroupSeverity(groupIssues);\n return {\n id: this.generateGroupId(pattern),\n pattern,\n description: this.generateGroupDescription(pattern, groupIssues),\n count: groupIssues.length,\n severity,\n issues: groupIssues,\n riskScore: 0, // Will be calculated later\n fixComplexity: 'medium',\n category: 'correctness',\n suggestedAction: '',\n bulkFixAvailable: false\n };\n });\n }\n\n /**\n * Extract normalized pattern from issue\n */\n private extractPattern(issue: Issue): string {\n // Remove file-specific parts and normalize\n let pattern = issue.issue\n .replace(/in file [^\\s]+/gi, 'in file')\n .replace(/at line \\d+/gi, 'at line X')\n .replace(/\\b\\d+\\b/g, 'N')\n .replace(/['\"][^'\"]*['\"]/g, '\"STRING\"')\n .replace(/\\s+/g, ' ')\n .trim();\n\n // Add agent and severity context\n pattern = `[${issue.agent}] [${issue.severity}] ${pattern}`;\n\n return pattern;\n }\n\n /**\n * Merge patterns that are very similar\n */\n private mergeSimilarPatterns(groups: Map<string, Issue[]>): Map<string, Issue[]> {\n const merged = new Map<string, Issue[]>();\n const processed = new Set<string>();\n\n for (const [pattern, issues] of groups) {\n if (processed.has(pattern)) continue;\n\n // Find similar patterns\n const similar = [pattern];\n const combinedIssues = [...issues];\n\n for (const [otherPattern, otherIssues] of groups) {\n if (pattern === otherPattern || processed.has(otherPattern)) continue;\n\n const similarity = this.calculatePatternSimilarity(pattern, otherPattern);\n if (similarity > 0.85) { // 85% similarity threshold\n similar.push(otherPattern);\n combinedIssues.push(...otherIssues);\n processed.add(otherPattern);\n }\n }\n\n processed.add(pattern);\n merged.set(pattern, combinedIssues);\n }\n\n return merged;\n }\n\n /**\n * Calculate similarity between two patterns\n */\n private calculatePatternSimilarity(pattern1: string, pattern2: string): number {\n const words1 = new Set(pattern1.toLowerCase().split(/\\W+/));\n const words2 = new Set(pattern2.toLowerCase().split(/\\W+/));\n\n const intersection = new Set([...words1].filter(w => words2.has(w)));\n const union = new Set([...words1, ...words2]);\n\n return intersection.size / union.size;\n }\n\n /**\n * Get the most severe level in a group\n */\n private getGroupSeverity(issues: Issue[]): Issue['severity'] {\n const severityOrder: Issue['severity'][] = ['critical', 'serious', 'moderate', 'low'];\n\n for (const severity of severityOrder) {\n if (issues.some(i => i.severity === severity)) {\n return severity;\n }\n }\n\n return 'low';\n }\n\n /**\n * Calculate risk score for a group (0-100)\n */\n private calculateRiskScore(group: IssueGroup): number {\n let score = 0;\n\n // Severity weight (40% of score)\n const severityWeights = { critical: 40, serious: 30, moderate: 20, low: 10 };\n score += severityWeights[group.severity];\n\n // Count weight (30% of score)\n const countScore = Math.min(30, group.count * 2); // Max 30 points, 2 per issue\n score += countScore;\n\n // Pattern-specific bonuses (30% of score)\n const pattern = group.pattern.toLowerCase();\n\n // Security issues get bonus\n if (pattern.includes('security') || pattern.includes('injection') || pattern.includes('xss') ||\n pattern.includes('csrf') || pattern.includes('secret') || pattern.includes('hardcoded')) {\n score += 25;\n }\n\n // Performance issues in hot paths\n if (pattern.includes('loop') || pattern.includes('n+1') || pattern.includes('memory') ||\n pattern.includes('performance')) {\n score += 20;\n }\n\n // Critical infrastructure\n if (pattern.includes('auth') || pattern.includes('database') || pattern.includes('payment')) {\n score += 15;\n }\n\n // Widespread issues (cross-file)\n if (group.count > 10) {\n score += 10;\n }\n\n // AI-generated code issues\n if (pattern.includes('console.log') || pattern.includes('any') || pattern.includes('ts-ignore')) {\n score += 5;\n }\n\n return Math.min(100, score);\n }\n\n /**\n * Categorize issue group\n */\n private categorizeGroup(group: IssueGroup): IssueGroup['category'] {\n const pattern = group.pattern.toLowerCase();\n\n if (pattern.includes('security') || pattern.includes('injection') || pattern.includes('xss') ||\n pattern.includes('secret') || pattern.includes('hardcoded') || pattern.includes('auth')) {\n return 'security';\n }\n\n if (pattern.includes('performance') || pattern.includes('memory') || pattern.includes('n+1') ||\n pattern.includes('slow') || pattern.includes('optimization')) {\n return 'performance';\n }\n\n if (pattern.includes('maintainability') || pattern.includes('complexity') || pattern.includes('duplication') ||\n pattern.includes('refactor') || pattern.includes('tech debt')) {\n return 'maintainability';\n }\n\n if (pattern.includes('bug') || pattern.includes('error') || pattern.includes('null') ||\n pattern.includes('undefined') || pattern.includes('race condition')) {\n return 'correctness';\n }\n\n return 'style';\n }\n\n /**\n * Assess fix complexity\n */\n private assessFixComplexity(group: IssueGroup): IssueGroup['fixComplexity'] {\n const pattern = group.pattern.toLowerCase();\n\n // Trivial fixes\n if (pattern.includes('console.log') || pattern.includes('unused import') ||\n pattern.includes('whitespace') || pattern.includes('formatting')) {\n return 'trivial';\n }\n\n // Easy fixes\n if (pattern.includes('type annotation') || pattern.includes('validation') ||\n pattern.includes('error handling') || group.severity === 'low') {\n return 'easy';\n }\n\n // Hard fixes\n if (pattern.includes('architecture') || pattern.includes('race condition') ||\n pattern.includes('security') && group.severity === 'critical') {\n return 'hard';\n }\n\n return 'medium';\n }\n\n /**\n * Check if group can be bulk-fixed\n */\n private canBulkFix(group: IssueGroup): boolean {\n const pattern = group.pattern.toLowerCase();\n\n // Patterns that can be bulk-fixed\n const bulkFixablePatterns = [\n 'console.log',\n 'unused import',\n 'missing semicolon',\n 'type annotation',\n 'whitespace',\n 'formatting',\n 'eslint-disable',\n 'ts-ignore'\n ];\n\n return bulkFixablePatterns.some(p => pattern.includes(p)) && group.count > 2;\n }\n\n /**\n * Prioritize groups by risk and impact\n */\n private prioritizeGroups(groups: IssueGroup[]): IssueGroup[] {\n return groups.sort((a, b) => {\n // Primary sort: risk score\n if (a.riskScore !== b.riskScore) {\n return b.riskScore - a.riskScore;\n }\n\n // Secondary sort: severity\n const severityOrder = { critical: 0, serious: 1, moderate: 2, low: 3 };\n const aSev = severityOrder[a.severity];\n const bSev = severityOrder[b.severity];\n if (aSev !== bSev) {\n return aSev - bSev;\n }\n\n // Tertiary sort: count (more issues = higher priority)\n return b.count - a.count;\n });\n }\n\n /**\n * Generate actionable recommendations\n */\n private generateRecommendations(groups: IssueGroup[], allIssues: Issue[]): string[] {\n const recommendations: string[] = [];\n\n // Critical security issues\n const criticalSecurity = groups.filter(g =>\n g.category === 'security' && g.severity === 'critical'\n );\n if (criticalSecurity.length > 0) {\n recommendations.push(\n `🚨 Immediate action required: Fix ${criticalSecurity.length} critical security issue group(s)`\n );\n }\n\n // Bulk-fixable issues\n const bulkFixable = groups.filter(g => g.bulkFixAvailable);\n if (bulkFixable.length > 0) {\n const totalBulkIssues = bulkFixable.reduce((sum, g) => sum + g.count, 0);\n recommendations.push(\n `⚡ Quick win: Bulk-fix ${totalBulkIssues} issues across ${bulkFixable.length} patterns`\n );\n }\n\n // Performance issues\n const performance = groups.filter(g => g.category === 'performance');\n if (performance.length > 0) {\n recommendations.push(\n `🚀 Performance: Address ${performance.length} performance issue pattern(s)`\n );\n }\n\n // Widespread issues\n const widespread = groups.filter(g => g.count > 10);\n if (widespread.length > 0) {\n recommendations.push(\n `📊 Systemic: ${widespread.length} patterns appear across many files - consider automated fixes`\n );\n }\n\n // AI code cleanup\n const aiIssues = allIssues.filter(i =>\n i.issue.toLowerCase().includes('console.log') ||\n i.issue.toLowerCase().includes('any') ||\n i.issue.toLowerCase().includes('ts-ignore')\n );\n if (aiIssues.length > 20) {\n recommendations.push(\n `🤖 AI cleanup: ${aiIssues.length} AI-generated code issues detected - run cleanup tools`\n );\n }\n\n // Code quality\n const qualityScore = this.calculateCodeQualityScore(groups);\n if (qualityScore < 60) {\n recommendations.push(\n `📈 Code quality: Score is ${qualityScore}/100 - focus on critical and serious issues first`\n );\n }\n\n return recommendations.slice(0, 5); // Max 5 recommendations\n }\n\n /**\n * Calculate overall risk score\n */\n private calculateOverallRisk(groups: IssueGroup[]): number {\n if (groups.length === 0) return 0;\n\n // Weight by group size and severity\n let totalWeightedRisk = 0;\n let totalWeight = 0;\n\n for (const group of groups) {\n const weight = group.count;\n totalWeightedRisk += group.riskScore * weight;\n totalWeight += weight;\n }\n\n return totalWeight > 0 ? Math.round(totalWeightedRisk / totalWeight) : 0;\n }\n\n /**\n * Calculate code quality score (0-100)\n */\n private calculateCodeQualityScore(groups: IssueGroup[]): number {\n let score = 100;\n\n for (const group of groups) {\n const penalty = this.calculateGroupPenalty(group);\n score -= penalty;\n }\n\n return Math.max(0, Math.round(score));\n }\n\n /**\n * Calculate quality penalty for a group\n */\n private calculateGroupPenalty(group: IssueGroup): number {\n const severityPenalties = { critical: 10, serious: 5, moderate: 2, low: 1 };\n const basePenalty = severityPenalties[group.severity];\n\n // Increase penalty for widespread issues\n const countMultiplier = Math.min(3, Math.log10(group.count + 1));\n\n return basePenalty * countMultiplier;\n }\n\n /**\n * Generate group ID\n */\n private generateGroupId(pattern: string): string {\n const hash = pattern.split('').reduce((acc, char) => {\n return ((acc << 5) - acc + char.charCodeAt(0)) & 0xffffffff;\n }, 0);\n return Math.abs(hash).toString(36);\n }\n\n /**\n * Generate human-readable group description\n */\n private generateGroupDescription(pattern: string, issues: Issue[]): string {\n // Extract key information from pattern\n const agentMatch = pattern.match(/\\[([^\\]]+)\\]/);\n const agent = agentMatch ? agentMatch[1] : 'unknown';\n\n // Get the most common issue text\n const issueTexts = issues.map(i => i.issue.slice(0, 100));\n const commonText = this.findMostCommonSubstring(issueTexts);\n\n return commonText || `${agent} issues (${issues.length} instances)`;\n }\n\n /**\n * Find most common substring across issue texts\n */\n private findMostCommonSubstring(texts: string[]): string {\n if (texts.length === 0) return '';\n if (texts.length === 1) return texts[0];\n\n // Find longest common prefix\n let common = texts[0];\n for (let i = 1; i < texts.length; i++) {\n let j = 0;\n while (j < common.length && j < texts[i].length &&\n common[j].toLowerCase() === texts[i][j].toLowerCase()) {\n j++;\n }\n common = common.slice(0, j);\n }\n\n // Clean up the common part\n return common.trim().replace(/\\s+/g, ' ') || texts[0].slice(0, 50);\n }\n}","import { stdin as input, stdout as output } from 'process';\nimport * as readline from 'readline';\nimport type { Issue } from '../types/index.js';\nimport type { StreamUpdate, ScanProgress } from '../utils/streaming.js';\nimport { createProgressBar } from '../utils/streaming.js';\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: 'overview' | 'issues' | 'agents' | 'files';\n selectedIssue: number;\n lastUpdate: number;\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 * - Quick-fix previews\n * - Keyboard navigation\n */\nexport class InteractiveDashboard {\n private rl: readline.Interface;\n private state: DashboardState;\n private isActive: boolean = false;\n private updateInterval?: NodeJS.Timeout;\n\n constructor() {\n this.rl = readline.createInterface({ input, output });\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 selectedIssue: 0,\n lastUpdate: Date.now()\n };\n }\n\n /**\n * Start the interactive dashboard\n */\n async start(): Promise<void> {\n this.isActive = true;\n this.setupKeyboardHandlers();\n this.startUpdateLoop();\n this.render();\n }\n\n /**\n * Stop the dashboard\n */\n stop(): void {\n this.isActive = false;\n if (this.updateInterval) {\n clearInterval(this.updateInterval);\n }\n this.rl.close();\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 this.state.progress = update.data;\n break;\n\n case 'issue_found':\n this.state.issues.push(update.data);\n break;\n\n case 'scan_complete':\n this.state.progress = {\n ...this.state.progress,\n processedFiles: this.state.progress.totalFiles\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', (_chunk, key) => {\n if (!key || !this.isActive) return;\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 this.navigateUp();\n break;\n\n case 'down':\n this.navigateDown();\n break;\n\n case 'enter':\n case 'return':\n this.selectCurrent();\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 'c':\n this.clearFilters();\n break;\n\n case 'f':\n this.promptFilter();\n break;\n\n case 'h':\n case '?':\n this.showHelp();\n break;\n }\n\n this.render();\n });\n }\n\n /**\n * Start the update loop for real-time rendering\n */\n private startUpdateLoop(): void {\n this.updateInterval = setInterval(() => {\n if (this.isActive && Date.now() - this.state.lastUpdate < 5000) {\n this.render();\n }\n }, 100); // 10 FPS\n }\n\n /**\n * Main render function\n */\n private render(): void {\n // Clear screen\n process.stdout.write('\\x1b[2J\\x1b[H');\n\n // Header\n this.renderHeader();\n\n // Content based on current view\n switch (this.state.view) {\n case 'overview':\n this.renderOverview();\n break;\n case 'issues':\n this.renderIssuesList();\n break;\n case 'agents':\n this.renderAgentsView();\n break;\n case 'files':\n this.renderFilesView();\n break;\n }\n\n // Footer\n this.renderFooter();\n }\n\n /**\n * Render header with progress and title\n */\n private renderHeader(): void {\n const title = '🔍 Trie Interactive Dashboard';\n const timestamp = new Date().toLocaleTimeString();\n\n console.log('╭─' + '─'.repeat(78) + '─╮');\n console.log(`│ ${title.padEnd(40)} ${timestamp.padStart(38)} │`);\n console.log('├─' + '─'.repeat(78) + '─┤');\n\n // Progress bar\n const { processedFiles, totalFiles, activeAgents } = this.state.progress;\n const progressPercent = totalFiles > 0 ? Math.round((processedFiles / totalFiles) * 100) : 0;\n const progressBar = createProgressBar(processedFiles, totalFiles, 30);\n const activeText = activeAgents.length > 0 ? `Active: ${activeAgents.join(', ')}` : 'Scanning...';\n\n console.log(`│ Progress: ${progressBar} ${progressPercent}%`.padEnd(79) + ' │');\n console.log(`│ ${activeText}`.padEnd(79) + ' │');\n console.log('├─' + '─'.repeat(78) + '─┤');\n }\n\n /**\n * Render overview with summary statistics\n */\n private renderOverview(): void {\n const { issuesBySeverity, totalIssues } = this.state.progress;\n const { completedAgents } = this.state.progress;\n\n console.log('│ SCAN SUMMARY'.padEnd(79) + ' │');\n console.log('├─' + '─'.repeat(78) + '─┤');\n\n // Issue summary\n console.log(`│ 🔴 Critical: ${issuesBySeverity.critical.toString().padStart(8)} 🟠 Serious: ${issuesBySeverity.serious.toString().padStart(8)}`.padEnd(79) + ' │');\n console.log(`│ 🟡 Moderate: ${issuesBySeverity.moderate.toString().padStart(8)} 🔵 Low: ${issuesBySeverity.low.toString().padStart(12)}`.padEnd(79) + ' │');\n console.log(`│ Total Issues: ${totalIssues.toString().padStart(8)}`.padEnd(79) + ' │');\n console.log('├─' + '─'.repeat(78) + '─┤');\n\n // Agent status\n console.log('│ AGENT STATUS'.padEnd(79) + ' │');\n console.log('├─' + '─'.repeat(78) + '─┤');\n\n for (const agent of completedAgents.slice(0, 8)) {\n const agentIssues = this.state.issues.filter(i => i.agent === agent);\n const statusIcon = agentIssues.length > 0 ? '⚠️' : '✅';\n console.log(`│ ${statusIcon} ${agent.padEnd(20)} ${agentIssues.length.toString().padStart(4)} issues`.padEnd(79) + ' │');\n }\n\n // Recent critical issues\n const criticalIssues = this.state.issues\n .filter(i => i.severity === 'critical')\n .slice(0, 5);\n\n if (criticalIssues.length > 0) {\n console.log('├─' + '─'.repeat(78) + '─┤');\n console.log('│ 🚨 CRITICAL ISSUES'.padEnd(79) + ' │');\n console.log('├─' + '─'.repeat(78) + '─┤');\n\n for (const issue of criticalIssues) {\n const filename = issue.file.split('/').pop() || issue.file;\n const line = issue.line ? `:${issue.line}` : '';\n const location = `${filename}${line}`;\n const description = issue.issue.slice(0, 45) + (issue.issue.length > 45 ? '...' : '');\n console.log(`│ ${location.padEnd(25)} ${description}`.slice(0, 79).padEnd(79) + ' │');\n }\n }\n }\n\n /**\n * Render filtered issues list\n */\n private renderIssuesList(): void {\n const filteredIssues = this.getFilteredIssues();\n const { selectedIssue } = this.state;\n\n console.log('│ ISSUES LIST'.padEnd(79) + ' │');\n console.log('├─' + '─'.repeat(78) + '─┤');\n\n // Filter status\n const filterText = this.getFilterDescription();\n console.log(`│ Filter: ${filterText}`.padEnd(79) + ' │');\n console.log('├─' + '─'.repeat(78) + '─┤');\n\n // Issues list (paginated)\n const pageSize = 15;\n const startIndex = Math.floor(selectedIssue / pageSize) * pageSize;\n const pageIssues = filteredIssues.slice(startIndex, startIndex + pageSize);\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 ? '▶ ' : ' ';\n const severityIcon = this.getSeverityIcon(issue.severity);\n const filename = issue.file.split('/').pop() || issue.file;\n const location = `${filename}:${issue.line || '?'}`;\n const description = issue.issue.slice(0, 40) + (issue.issue.length > 40 ? '...' : '');\n\n const line = `${cursor}${severityIcon} ${location.padEnd(20)} ${description}`;\n console.log(`│ ${line}`.slice(0, 79).padEnd(79) + ' │');\n }\n\n // Selected issue details\n if (filteredIssues[selectedIssue]) {\n const selected = filteredIssues[selectedIssue];\n console.log('├─' + '─'.repeat(78) + '─┤');\n console.log('│ ISSUE DETAILS'.padEnd(79) + ' │');\n console.log('├─' + '─'.repeat(78) + '─┤');\n console.log(`│ File: ${selected.file}`.slice(0, 79).padEnd(79) + ' │');\n console.log(`│ Line: ${selected.line || 'Unknown'}`.padEnd(79) + ' │');\n console.log(`│ Agent: ${selected.agent}`.padEnd(79) + ' │');\n\n // Wrap issue description\n const issueLines = this.wrapText(selected.issue, 75);\n console.log(`│ Issue:`.padEnd(79) + ' │');\n for (const line of issueLines.slice(0, 3)) {\n console.log(`│ ${line}`.padEnd(79) + ' │');\n }\n\n // Wrap fix description\n const fixLines = this.wrapText(selected.fix, 75);\n console.log(`│ Fix:`.padEnd(79) + ' │');\n for (const line of fixLines.slice(0, 3)) {\n console.log(`│ ${line}`.padEnd(79) + ' │');\n }\n }\n }\n\n /**\n * Render agents view\n */\n private renderAgentsView(): void {\n const { completedAgents, activeAgents } = this.state.progress;\n\n console.log('│ AGENTS STATUS'.padEnd(79) + ' │');\n console.log('├─' + '─'.repeat(78) + '─┤');\n\n // Active agents\n if (activeAgents.length > 0) {\n console.log('│ 🔄 ACTIVE AGENTS'.padEnd(79) + ' │');\n for (const agent of activeAgents) {\n console.log(`│ • ${agent}`.padEnd(79) + ' │');\n }\n console.log('├─' + '─'.repeat(78) + '─┤');\n }\n\n // Completed agents\n console.log('│ ✅ COMPLETED AGENTS'.padEnd(79) + ' │');\n for (const agent of completedAgents) {\n const agentIssues = this.state.issues.filter(i => i.agent === agent);\n const criticalCount = agentIssues.filter(i => i.severity === 'critical').length;\n const statusText = criticalCount > 0 ? `${criticalCount} critical` : `${agentIssues.length} issues`;\n console.log(`│ • ${agent.padEnd(25)} ${statusText}`.padEnd(79) + ' │');\n }\n }\n\n /**\n * Render files view\n */\n private renderFilesView(): void {\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, 20);\n\n console.log('│ FILES WITH ISSUES'.padEnd(79) + ' │');\n console.log('├─' + '─'.repeat(78) + '─┤');\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 ? ` (${criticalCount} critical)` : '';\n console.log(`│ ${filename.padEnd(35)} ${totalCount} issues${criticalText}`.slice(0, 79).padEnd(79) + ' │');\n }\n }\n\n /**\n * Render footer with controls\n */\n private renderFooter(): void {\n console.log('├─' + '─'.repeat(78) + '─┤');\n console.log('│ CONTROLS:'.padEnd(79) + ' │');\n console.log('│ Tab: Switch view ↑↓: Navigate Enter: Select 1-4: Filter severity │');\n console.log('│ f: Search filter c: Clear filters h: Help q: Quit'.padEnd(79) + ' │');\n console.log('╰─' + '─'.repeat(78) + '─╯');\n }\n\n // Helper methods\n private switchView(): void {\n const views: DashboardState['view'][] = ['overview', 'issues', 'agents', 'files'];\n const currentIndex = views.indexOf(this.state.view);\n const nextIndex = (currentIndex + 1) % views.length;\n this.state.view = views[nextIndex] ?? 'overview';\n }\n\n private navigateUp(): void {\n if (this.state.view === 'issues') {\n this.state.selectedIssue = Math.max(0, this.state.selectedIssue - 1);\n }\n }\n\n private navigateDown(): void {\n if (this.state.view === 'issues') {\n const filteredIssues = this.getFilteredIssues();\n this.state.selectedIssue = Math.min(filteredIssues.length - 1, this.state.selectedIssue + 1);\n }\n }\n\n private selectCurrent(): 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 }\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(`Agent: ${this.state.filter.agent}`);\n if (this.state.filter.search) parts.push(`Search: \"${this.state.filter.search}\"`);\n return parts.length > 0 ? parts.join(', ') : 'None';\n }\n\n private getSeverityIcon(severity: Issue['severity']): string {\n return { critical: '🔴', serious: '🟠', moderate: '🟡', low: '🔵' }[severity];\n }\n\n private wrapText(text: string, width: number): string[] {\n const words = text.split(' ');\n const lines: string[] = [];\n let currentLine = '';\n\n for (const word of words) {\n if (currentLine.length + word.length + 1 <= width) {\n currentLine += (currentLine ? ' ' : '') + word;\n } else {\n if (currentLine) lines.push(currentLine);\n currentLine = word;\n }\n }\n\n if (currentLine) lines.push(currentLine);\n return lines;\n }\n\n private async promptFilter(): Promise<void> {\n if (input.isTTY) {\n input.setRawMode(false);\n }\n\n this.rl.question('Search filter (leave empty to clear): ', (answer) => {\n this.state.filter.search = answer.trim();\n this.state.selectedIssue = 0;\n if (input.isTTY) {\n input.setRawMode(true);\n }\n this.render();\n });\n }\n\n private showHelp(): void {\n this.isActive = false;\n process.stdout.write('\\x1b[2J\\x1b[H');\n console.log('╭─ Trie Interactive Dashboard Help ──────────────────────────────╮');\n console.log('│ Navigation │');\n console.log('│ Tab Switch view (overview/issues/agents/files) │');\n console.log('│ ↑ / ↓ Navigate issues list │');\n console.log('│ Enter View issue details │');\n console.log('│ Filters │');\n console.log('│ 1-4 Filter by severity (critical→low) │');\n console.log('│ 0 Clear severity filter │');\n console.log('│ f Search filter │');\n console.log('│ c Clear all filters │');\n console.log('│ Other │');\n console.log('│ h or ? Show this help │');\n console.log('│ q Quit │');\n console.log('╰───────────────────────────────────────────────────────────────╯');\n console.log('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 private showIssueDetails(issue: Issue): void {\n this.isActive = false;\n process.stdout.write('\\x1b[2J\\x1b[H');\n console.log('╭─ Issue Details ────────────────────────────────────────────────╮');\n console.log(`│ File: ${issue.file}`.slice(0, 63).padEnd(63) + '│');\n console.log(`│ Line: ${issue.line || 'Unknown'} Agent: ${issue.agent}`.slice(0, 63).padEnd(63) + '│');\n console.log('├───────────────────────────────────────────────────────────────┤');\n console.log('│ Issue │');\n const issueLines = this.wrapText(issue.issue, 61);\n for (const line of issueLines.slice(0, 6)) {\n console.log(`│ ${line}`.padEnd(63) + '│');\n }\n console.log('├───────────────────────────────────────────────────────────────┤');\n console.log('│ Fix │');\n const fixLines = this.wrapText(issue.fix, 61);\n for (const line of fixLines.slice(0, 6)) {\n console.log(`│ ${line}`.padEnd(63) + '│');\n }\n console.log('╰───────────────────────────────────────────────────────────────╯');\n console.log('Press any key to return...');\n\n const resume = () => {\n this.isActive = true;\n this.render();\n };\n input.once('keypress', resume);\n }\n}","import { readFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { ConfigValidator, DEFAULT_CONFIG, type TrieConfig } from './validation.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\n\nexport async function loadConfig(): Promise<TrieConfig> {\n const validator = new ConfigValidator();\n const configPath = join(getWorkingDirectory(undefined, true), '.trie', 'config.json');\n\n try {\n // Look for config in .trie/config.json\n if (!existsSync(configPath)) {\n return DEFAULT_CONFIG;\n }\n\n const configFile = await readFile(configPath, 'utf-8');\n const userConfig = JSON.parse(configFile) as Record<string, unknown>;\n\n // Deep merge with defaults\n const merged = mergeConfig(DEFAULT_CONFIG, userConfig);\n\n // Validate merged config\n const result = validator.validateConfig(merged);\n if (!result.success) {\n console.error('Configuration validation failed:');\n for (const error of result.errors) {\n console.error(` - ${error}`);\n }\n return DEFAULT_CONFIG;\n }\n\n // Environment validation warnings\n const envValidation = validator.validateEnvironment();\n for (const warning of envValidation.warnings) {\n console.warn(warning);\n }\n for (const error of envValidation.errors) {\n console.error(error);\n }\n\n return result.data;\n } catch (error) {\n // If no config found, return defaults\n console.error('Failed to load config, using defaults:', error);\n return DEFAULT_CONFIG;\n }\n}\n\nfunction mergeConfig<T extends Record<string, unknown>>(defaults: T, user: Record<string, unknown>): T {\n if (typeof user !== 'object' || user === null || Array.isArray(user)) {\n return { ...defaults };\n }\n\n const result = { ...defaults } as T;\n\n for (const [key, value] of Object.entries(user)) {\n const defaultValue = defaults[key as keyof T];\n if (typeof value === 'object' && value !== null && !Array.isArray(value) && typeof defaultValue === 'object' && defaultValue !== null) {\n result[key as keyof T] = mergeConfig(defaultValue as Record<string, unknown>, value as Record<string, unknown>) as T[keyof T];\n } else {\n result[key as keyof T] = value as T[keyof T];\n }\n }\n\n return result;\n}","import { z } from 'zod';\nimport { existsSync, readFileSync } from 'fs';\nimport { resolve, join } from 'path';\nimport { getWorkingDirectory } from '../utils/workspace.js';\n\n// API key validation patterns\nconst API_KEY_PATTERNS = {\n anthropic: /^sk-ant-api\\d{2}-[\\w-]{95}$/,\n openai: /^sk-[\\w]{48}$/,\n github: /^ghp_[\\w]{36}$/,\n vercel: /^[\\w]{24}$/,\n} as const;\n\n// Configuration schemas\nconst ApiKeysSchema = z.object({\n anthropic: z.string().regex(API_KEY_PATTERNS.anthropic, 'Invalid Anthropic API key format').optional(),\n openai: z.string().regex(API_KEY_PATTERNS.openai, 'Invalid OpenAI API key format').optional(),\n github: z.string().regex(API_KEY_PATTERNS.github, 'Invalid GitHub token format').optional(),\n vercel: z.string().regex(API_KEY_PATTERNS.vercel, 'Invalid Vercel token format').optional(),\n});\n\nconst AgentConfigSchema = z.object({\n enabled: z.array(z.string()).optional().default([]),\n disabled: z.array(z.string()).optional().default([]),\n parallel: z.boolean().optional().default(true),\n maxConcurrency: z.number().int().min(1).max(20).optional().default(4),\n timeout: z.number().int().min(1000).max(300000).optional().default(120000), // 2 minutes\n cache: z.boolean().optional().default(true),\n});\n\nconst ComplianceSchema = z.object({\n standards: z.array(z.enum(['SOC2', 'GDPR', 'HIPAA', 'CCPA', 'PCI-DSS'])).optional().default(['SOC2']),\n enforceCompliance: z.boolean().optional().default(false),\n reportFormat: z.enum(['json', 'sarif', 'csv', 'html']).optional().default('json'),\n});\n\nconst OutputSchema = z.object({\n format: z.enum(['console', 'json', 'sarif', 'junit']).optional().default('console'),\n level: z.enum(['critical', 'serious', 'moderate', 'low', 'all']).optional().default('all'),\n interactive: z.boolean().optional().default(false),\n streaming: z.boolean().optional().default(true),\n colors: z.boolean().optional().default(true),\n});\n\nconst PathsSchema = z.object({\n include: z.array(z.string()).optional().default([]),\n exclude: z.array(z.string()).optional().default(['node_modules', 'dist', 'build', '.git']),\n configDir: z.string().optional().default('.trie'),\n outputDir: z.string().optional().default('trie-reports'),\n});\n\nconst IntegrationsSchema = z.object({\n github: z.object({\n enabled: z.boolean().optional().default(false),\n token: z.string().optional(),\n webhook: z.string().url().optional(),\n }).optional(),\n slack: z.object({\n enabled: z.boolean().optional().default(false),\n webhook: z.string().url().optional(),\n channel: z.string().optional(),\n }).optional(),\n jira: z.object({\n enabled: z.boolean().optional().default(false),\n url: z.string().url().optional(),\n token: z.string().optional(),\n project: z.string().optional(),\n }).optional(),\n});\n\nexport const TrieConfigSchema = z.object({\n version: z.string().optional().default('1.0.0'),\n apiKeys: ApiKeysSchema.optional(),\n agents: AgentConfigSchema.optional(),\n compliance: ComplianceSchema.optional(),\n output: OutputSchema.optional(),\n paths: PathsSchema.optional(),\n integrations: IntegrationsSchema.optional(),\n});\n\nexport type TrieConfig = z.infer<typeof TrieConfigSchema>;\nexport type ApiKeys = z.infer<typeof ApiKeysSchema>;\nexport type AgentConfig = z.infer<typeof AgentConfigSchema>;\n\n/**\n * Configuration validator with detailed error reporting\n */\nexport class ConfigValidator {\n /**\n * Validate configuration object\n */\n validateConfig(config: unknown): { success: true; data: TrieConfig } | { success: false; errors: string[] } {\n try {\n const validated = TrieConfigSchema.parse(config);\n\n // Additional business logic validation\n const businessErrors = this.validateBusinessLogic(validated);\n if (businessErrors.length > 0) {\n return { success: false, errors: businessErrors };\n }\n\n return { success: true, data: validated };\n } catch (error) {\n if (error instanceof z.ZodError) {\n const errors = error.errors.map(err =>\n `${err.path.join('.')}: ${err.message}`\n );\n return { success: false, errors };\n }\n\n return {\n success: false,\n errors: [`Configuration validation failed: ${error instanceof Error ? error.message : 'Unknown error'}`]\n };\n }\n }\n\n /**\n * Validate environment variables for API keys\n */\n validateEnvironment(): { valid: boolean; warnings: string[]; errors: string[] } {\n const warnings: string[] = [];\n const errors: string[] = [];\n\n // Check for potentially exposed secrets\n const exposedPatterns = [\n 'NEXT_PUBLIC_ANTHROPIC',\n 'REACT_APP_ANTHROPIC',\n 'VITE_ANTHROPIC',\n 'PUBLIC_ANTHROPIC'\n ];\n\n for (const pattern of exposedPatterns) {\n const envVars = Object.keys(process.env).filter(key => key.includes(pattern));\n for (const envVar of envVars) {\n errors.push(`🚨 Security risk: API key in client-side environment variable: ${envVar}`);\n }\n }\n\n // Check API key format if present (check env var first, then config)\n let anthropicKey = process.env.ANTHROPIC_API_KEY;\n \n // Also check config file if available (for validation purposes)\n // Note: This is a read-only check for validation, actual usage goes through isAIAvailable()\n if (!anthropicKey) {\n try {\n const configPath = join(getWorkingDirectory(undefined, true), '.trie', 'config.json');\n if (existsSync(configPath)) {\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n anthropicKey = config.apiKeys?.anthropic;\n }\n } catch {\n // Config file check failed, continue with env var only\n }\n }\n \n if (anthropicKey && !API_KEY_PATTERNS.anthropic.test(anthropicKey)) {\n errors.push('ANTHROPIC_API_KEY does not match expected format');\n }\n\n // Warnings for missing optional keys\n if (!anthropicKey) {\n warnings.push('ANTHROPIC_API_KEY not set - AI features will be disabled. Set in environment, .trie/config.json, or .env file');\n }\n\n if (!process.env.GITHUB_TOKEN && process.env.CI) {\n warnings.push('GITHUB_TOKEN not set - GitHub integration disabled');\n }\n\n return {\n valid: errors.length === 0,\n warnings,\n errors\n };\n }\n\n /**\n * Validate file paths in configuration\n */\n validatePaths(paths: z.infer<typeof PathsSchema>): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (paths?.include) {\n for (const path of paths.include) {\n const resolvedPath = resolve(path);\n if (!existsSync(resolvedPath)) {\n errors.push(`Include path does not exist: ${path}`);\n }\n }\n }\n\n if (paths?.configDir) {\n const configPath = resolve(paths.configDir);\n if (!existsSync(configPath)) {\n try {\n // Try to create the directory\n require('fs').mkdirSync(configPath, { recursive: true });\n } catch {\n errors.push(`Cannot create config directory: ${paths.configDir}`);\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n }\n\n /**\n * Validate integration configurations\n */\n validateIntegrations(integrations: z.infer<typeof IntegrationsSchema>): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // GitHub integration\n if (integrations?.github?.enabled) {\n if (!integrations.github.token) {\n errors.push('GitHub integration enabled but no token provided');\n }\n }\n\n // Slack integration\n if (integrations?.slack?.enabled) {\n if (!integrations.slack.webhook) {\n errors.push('Slack integration enabled but no webhook URL provided');\n }\n }\n\n // JIRA integration\n if (integrations?.jira?.enabled) {\n if (!integrations.jira.url || !integrations.jira.token || !integrations.jira.project) {\n errors.push('JIRA integration enabled but missing required fields (url, token, project)');\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n }\n\n /**\n * Business logic validation\n */\n private validateBusinessLogic(config: TrieConfig): string[] {\n const errors: string[] = [];\n\n // Agent configuration validation\n if (config.agents?.enabled && config.agents?.disabled) {\n const overlap = config.agents.enabled.filter(agent =>\n config.agents?.disabled?.includes(agent)\n );\n if (overlap.length > 0) {\n errors.push(`Agents cannot be both enabled and disabled: ${overlap.join(', ')}`);\n }\n }\n\n // Concurrency validation\n if (config.agents?.maxConcurrency && config.agents.maxConcurrency > 10) {\n errors.push('maxConcurrency should not exceed 10 for optimal performance');\n }\n\n // Compliance standards validation\n if (config.compliance?.standards) {\n const invalidStandards = config.compliance.standards.filter(standard =>\n !['SOC2', 'GDPR', 'HIPAA', 'CCPA', 'PCI-DSS'].includes(standard)\n );\n if (invalidStandards.length > 0) {\n errors.push(`Invalid compliance standards: ${invalidStandards.join(', ')}`);\n }\n }\n\n // Path validation\n if (config.paths) {\n const pathValidation = this.validatePaths(config.paths);\n errors.push(...pathValidation.errors);\n }\n\n // Integration validation\n if (config.integrations) {\n const integrationValidation = this.validateIntegrations(config.integrations);\n errors.push(...integrationValidation.errors);\n }\n\n return errors;\n }\n\n /**\n * Generate configuration template\n */\n generateTemplate(): TrieConfig {\n return {\n version: '1.0.0',\n agents: {\n enabled: ['security', 'bugs', 'types'],\n disabled: [],\n parallel: true,\n maxConcurrency: 4,\n timeout: 120000,\n cache: true\n },\n compliance: {\n standards: ['SOC2'],\n enforceCompliance: false,\n reportFormat: 'json'\n },\n output: {\n format: 'console',\n level: 'all',\n interactive: false,\n streaming: true,\n colors: true\n },\n paths: {\n include: [],\n exclude: ['node_modules', 'dist', 'build', '.git'],\n configDir: '.trie',\n outputDir: 'trie-reports'\n }\n };\n }\n\n /**\n * Validate and provide suggestions for improvement\n */\n analyze(config: TrieConfig): {\n score: number;\n suggestions: string[];\n securityIssues: string[];\n optimizations: string[];\n } {\n const suggestions: string[] = [];\n const securityIssues: string[] = [];\n const optimizations: string[] = [];\n let score = 100;\n\n // Check for AI enhancement (check config, env var, and .env files)\n let hasApiKey = Boolean(config.apiKeys?.anthropic || process.env.ANTHROPIC_API_KEY);\n if (!hasApiKey) {\n // Check .env files as well\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const envFiles = ['.env', '.env.local', '.env.production'];\n for (const envFile of envFiles) {\n const envPath = join(workDir, envFile);\n if (existsSync(envPath)) {\n const envContent = readFileSync(envPath, 'utf-8');\n if (envContent.includes('ANTHROPIC_API_KEY=')) {\n hasApiKey = true;\n break;\n }\n }\n }\n } catch {\n // .env check failed, continue\n }\n }\n \n if (!hasApiKey) {\n suggestions.push('Add ANTHROPIC_API_KEY to enable AI-powered analysis for better issue detection. Set in environment, .trie/config.json, or .env file');\n score -= 10;\n }\n\n // Check parallel execution\n if (config.agents?.parallel === false) {\n optimizations.push('Enable parallel agent execution for 3-5x faster scans');\n score -= 15;\n }\n\n // Check caching\n if (config.agents?.cache === false) {\n optimizations.push('Enable result caching to speed up repeated scans');\n score -= 10;\n }\n\n // Check compliance standards\n if (!config.compliance?.standards || config.compliance.standards.length === 0) {\n suggestions.push('Configure compliance standards (SOC2, GDPR, etc.) for regulatory requirements');\n score -= 5;\n }\n\n // Check integrations for team collaboration\n const hasIntegrations = config.integrations && (\n config.integrations.github?.enabled ||\n config.integrations.slack?.enabled ||\n config.integrations.jira?.enabled\n );\n if (!hasIntegrations) {\n suggestions.push('Consider enabling GitHub/Slack/JIRA integrations for better team collaboration');\n score -= 5;\n }\n\n // Security checks\n if (config.apiKeys) {\n securityIssues.push('API keys in config file - consider using environment variables instead');\n score -= 20;\n }\n\n return {\n score: Math.max(0, score),\n suggestions,\n securityIssues,\n optimizations\n };\n }\n}\n\n/**\n * Default configuration with security best practices\n */\nexport const DEFAULT_CONFIG: TrieConfig = {\n version: '1.0.0',\n agents: {\n enabled: [],\n disabled: [],\n parallel: true,\n maxConcurrency: 4,\n timeout: 120000,\n cache: true,\n },\n compliance: {\n standards: ['SOC2'],\n enforceCompliance: false,\n reportFormat: 'json',\n },\n output: {\n format: 'console',\n level: 'all',\n interactive: false,\n streaming: true,\n colors: true,\n },\n paths: {\n include: [],\n exclude: ['node_modules', 'dist', 'build', '.git', '.next', '.nuxt', 'coverage'],\n configDir: '.trie',\n outputDir: 'trie-reports',\n },\n};\n\n/**\n * Validate startup configuration\n */\nexport function validateStartupConfig(): {\n valid: boolean;\n config: TrieConfig;\n warnings: string[];\n errors: string[];\n} {\n const validator = new ConfigValidator();\n\n // Validate environment\n const envValidation = validator.validateEnvironment();\n\n // Use default config as base\n const configResult = validator.validateConfig(DEFAULT_CONFIG);\n\n if (!configResult.success) {\n return {\n valid: false,\n config: DEFAULT_CONFIG,\n warnings: envValidation.warnings,\n errors: [...envValidation.errors, ...configResult.errors]\n };\n }\n\n return {\n valid: envValidation.valid,\n config: configResult.data,\n warnings: envValidation.warnings,\n errors: envValidation.errors\n };\n}","import type { Issue } from '../types/index.js';\nimport type { IssueGroup, PriorityReport } from '../utils/issue-analyzer.js';\nimport type { TeamNotification } from './team-collaboration.js';\n\ninterface SlackConfig {\n webhookUrl: string;\n channel?: string | undefined;\n username?: string | undefined;\n iconEmoji?: string | undefined;\n}\n\ninterface SlackMessage {\n text?: string;\n blocks?: SlackBlock[];\n attachments?: SlackAttachment[];\n channel?: string;\n username?: string;\n icon_emoji?: string;\n}\n\ninterface SlackBlock {\n type: string;\n text?: {\n type: string;\n text: string;\n };\n fields?: Array<{\n type: string;\n text: string;\n }>;\n accessory?: any;\n}\n\ninterface SlackAttachment {\n color: string;\n title?: string | undefined;\n text?: string | undefined;\n fields?: Array<{\n title: string;\n value: string;\n short?: boolean;\n }> | undefined;\n footer?: string | undefined;\n ts?: number | undefined;\n}\n\n/**\n * Slack integration for Trie team notifications\n */\nexport class SlackIntegration {\n constructor(private config: SlackConfig) {}\n\n /**\n * Send scan completion notification\n */\n async sendScanNotification(\n issues: Issue[],\n priorityReport: PriorityReport,\n repositoryName: string,\n branch: string = 'main'\n ): Promise<void> {\n const { urgent, high, medium, low } = priorityReport;\n const totalIssues = urgent.length + high.length + medium.length + low.length;\n\n const color = urgent.length > 0 ? 'danger' : high.length > 0 ? 'warning' : 'good';\n const emoji = urgent.length > 0 ? '🚨' : high.length > 0 ? '⚠️' : '✅';\n\n const message: SlackMessage = {\n blocks: [\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `${emoji} *Trie Security Scan Complete*\\n*Repository:* ${repositoryName} (${branch})`\n }\n },\n {\n type: 'section',\n fields: [\n {\n type: 'mrkdwn',\n text: `*🚨 Urgent:* ${urgent.length}`\n },\n {\n type: 'mrkdwn',\n text: `*⚠️ High:* ${high.length}`\n },\n {\n type: 'mrkdwn',\n text: `*🔸 Medium:* ${medium.length}`\n },\n {\n type: 'mrkdwn',\n text: `*🔹 Low:* ${low.length}`\n }\n ]\n }\n ],\n attachments: []\n };\n\n // Add urgent issues details\n if (urgent.length > 0) {\n const urgentDetails = urgent.slice(0, 5).map(group =>\n `• ${group.description} (${group.count} instances)`\n ).join('\\n');\n\n message.attachments!.push({\n color: 'danger',\n title: '🚨 Urgent Issues - Immediate Action Required',\n text: urgentDetails,\n footer: urgent.length > 5 ? `... and ${urgent.length - 5} more urgent issues` : undefined\n });\n }\n\n // Add high priority issues\n if (high.length > 0) {\n const highDetails = high.slice(0, 3).map(group =>\n `• ${group.description} (${group.count} instances)`\n ).join('\\n');\n\n message.attachments!.push({\n color: 'warning',\n title: '⚠️ High Priority Issues',\n text: highDetails,\n footer: high.length > 3 ? `... and ${high.length - 3} more high priority issues` : undefined\n });\n }\n\n // Add recommendations\n if (priorityReport.recommendations.length > 0) {\n message.attachments!.push({\n color: 'good',\n title: '💡 Recommendations',\n text: priorityReport.recommendations.slice(0, 3).join('\\n')\n });\n }\n\n await this.sendMessage(message);\n }\n\n /**\n * Send critical issue alert\n */\n async sendCriticalAlert(issues: Issue[], repositoryName: string): Promise<void> {\n const message: SlackMessage = {\n text: `🚨 CRITICAL SECURITY ALERT: ${repositoryName}`,\n blocks: [\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `🚨 *CRITICAL SECURITY ALERT*\\n*Repository:* ${repositoryName}\\n*Critical Issues:* ${issues.length}`\n }\n }\n ],\n attachments: issues.slice(0, 5).map(issue => ({\n color: 'danger',\n title: `${issue.file}:${issue.line || '?'}`,\n text: issue.issue.slice(0, 200),\n fields: [\n {\n title: 'Fix',\n value: issue.fix.slice(0, 100),\n short: false\n }\n ],\n footer: `Agent: ${issue.agent}`,\n ts: Math.floor(Date.now() / 1000)\n }))\n };\n\n if (issues.length > 5) {\n message.attachments!.push({\n color: 'danger',\n text: `... and ${issues.length - 5} more critical issues. View full report for details.`\n });\n }\n\n await this.sendMessage(message);\n }\n\n /**\n * Send team notification\n */\n async sendTeamNotification(notification: TeamNotification): Promise<void> {\n const emoji = this.getNotificationEmoji(notification.type);\n\n const message: SlackMessage = {\n blocks: [\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `${emoji} *${notification.title}*\\n${notification.message}`\n }\n }\n ]\n };\n\n // Add specific data based on notification type\n if (notification.type === 'assignment' && notification.data) {\n const { assignment, issue } = notification.data;\n message.attachments = [{\n color: this.getAssignmentColor(assignment.priority),\n fields: [\n {\n title: 'Priority',\n value: assignment.priority.toUpperCase(),\n short: true\n },\n {\n title: 'Due Date',\n value: assignment.dueDate ? new Date(assignment.dueDate).toLocaleDateString() : 'Not set',\n short: true\n },\n {\n title: 'File',\n value: issue.file,\n short: false\n }\n ]\n }];\n }\n\n await this.sendMessage(message);\n }\n\n /**\n * Send daily/weekly team summary\n */\n async sendTeamSummary(\n period: 'daily' | 'weekly',\n stats: {\n newIssues: number;\n resolvedIssues: number;\n overdueIssues: number;\n topCategories: Array<{ category: string; count: number }>;\n topContributors: Array<{ name: string; resolved: number }>;\n }\n ): Promise<void> {\n const emoji = period === 'daily' ? '📅' : '📊';\n const title = `${emoji} ${period.charAt(0).toUpperCase() + period.slice(1)} Security Summary`;\n\n const message: SlackMessage = {\n blocks: [\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `*${title}*`\n }\n },\n {\n type: 'section',\n fields: [\n {\n type: 'mrkdwn',\n text: `*🔍 New Issues:* ${stats.newIssues}`\n },\n {\n type: 'mrkdwn',\n text: `*✅ Resolved:* ${stats.resolvedIssues}`\n },\n {\n type: 'mrkdwn',\n text: `*⏰ Overdue:* ${stats.overdueIssues}`\n },\n {\n type: 'mrkdwn',\n text: `*📈 Net Change:* ${stats.resolvedIssues - stats.newIssues > 0 ? '+' : ''}${stats.resolvedIssues - stats.newIssues}`\n }\n ]\n }\n ],\n attachments: []\n };\n\n // Top issue categories\n if (stats.topCategories.length > 0) {\n const categoriesText = stats.topCategories\n .slice(0, 5)\n .map(cat => `• ${cat.category}: ${cat.count}`)\n .join('\\n');\n\n message.attachments!.push({\n color: 'good',\n title: '📊 Top Issue Categories',\n text: categoriesText\n });\n }\n\n // Top contributors\n if (stats.topContributors.length > 0) {\n const contributorsText = stats.topContributors\n .slice(0, 5)\n .map(contrib => `• ${contrib.name}: ${contrib.resolved} resolved`)\n .join('\\n');\n\n message.attachments!.push({\n color: 'good',\n title: '🏆 Top Contributors',\n text: contributorsText\n });\n }\n\n await this.sendMessage(message);\n }\n\n /**\n * Send bulk fix notification\n */\n async sendBulkFixNotification(\n fixedGroups: IssueGroup[],\n totalFixed: number,\n repositoryName: string\n ): Promise<void> {\n const message: SlackMessage = {\n blocks: [\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `⚡ *Bulk Fix Applied*\\n*Repository:* ${repositoryName}\\n*Issues Fixed:* ${totalFixed}`\n }\n }\n ],\n attachments: [{\n color: 'good',\n title: '🔧 Fixed Issue Groups',\n text: fixedGroups.map(group =>\n `• ${group.description} (${group.count} instances)`\n ).join('\\n')\n }]\n };\n\n await this.sendMessage(message);\n }\n\n /**\n * Send escalation notification\n */\n async sendEscalationNotification(\n overdueAssignments: Array<{\n issueId: string;\n assignee: string;\n daysOverdue: number;\n priority: string;\n }>\n ): Promise<void> {\n const message: SlackMessage = {\n text: '🚨 OVERDUE ISSUE ESCALATION',\n blocks: [\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `🚨 *Overdue Issue Escalation*\\n${overdueAssignments.length} issues are overdue and require attention.`\n }\n }\n ],\n attachments: overdueAssignments.map(assignment => ({\n color: 'warning',\n title: `Issue ${assignment.issueId}`,\n fields: [\n {\n title: 'Assignee',\n value: assignment.assignee,\n short: true\n },\n {\n title: 'Days Overdue',\n value: assignment.daysOverdue.toString(),\n short: true\n },\n {\n title: 'Priority',\n value: assignment.priority.toUpperCase(),\n short: true\n }\n ]\n }))\n };\n\n await this.sendMessage(message);\n }\n\n /**\n * Send message to Slack\n */\n private async sendMessage(message: SlackMessage): Promise<void> {\n const payload = {\n ...message,\n channel: this.config.channel || message.channel,\n username: this.config.username || 'Trie Security Bot',\n icon_emoji: this.config.iconEmoji || ':shield:'\n };\n\n try {\n const response = await fetch(this.config.webhookUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n });\n\n if (!response.ok) {\n throw new Error(`Slack API error: ${response.status} ${response.statusText}`);\n }\n } catch (error) {\n console.error('Failed to send Slack notification:', error);\n throw error;\n }\n }\n\n /**\n * Get emoji for notification type\n */\n private getNotificationEmoji(type: string): string {\n const emojis = {\n assignment: '📋',\n escalation: '🚨',\n completion: '✅',\n reminder: '⏰'\n };\n return emojis[type] || '📢';\n }\n\n /**\n * Get color for assignment priority\n */\n private getAssignmentColor(priority: string): string {\n const colors = {\n urgent: 'danger',\n high: 'warning',\n medium: 'good',\n low: '#36a64f'\n };\n return colors[priority] || 'good';\n }\n\n /**\n * Test Slack connection\n */\n async testConnection(): Promise<boolean> {\n try {\n await this.sendMessage({\n text: '🧪 Trie Slack Integration Test',\n blocks: [{\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: '*Trie Slack Integration Test*\\nIf you see this message, the integration is working correctly! 🎉'\n }\n }]\n });\n return true;\n } catch (error) {\n console.error('Slack connection test failed:', error);\n return false;\n }\n }\n}","import type { Issue, AgentResult } from '../types/index.js';\nimport type { PriorityReport } from '../utils/issue-analyzer.js';\n\nexport interface TeamMember {\n id: string;\n name: string;\n email: string;\n role: 'developer' | 'lead' | 'security' | 'architect' | 'manager';\n expertise: string[];\n timezone: string;\n}\n\nexport interface IssueAssignment {\n issueId: string;\n assigneeId: string;\n assignedAt: number;\n dueDate?: number;\n priority: 'urgent' | 'high' | 'medium' | 'low';\n status: 'assigned' | 'in_progress' | 'under_review' | 'resolved' | 'dismissed';\n notes?: string;\n}\n\nexport interface TeamNotification {\n id: string;\n type: 'assignment' | 'escalation' | 'completion' | 'reminder';\n recipientId: string;\n title: string;\n message: string;\n data: any;\n createdAt: number;\n sentAt?: number;\n readAt?: number;\n}\n\n/**\n * Team Collaboration Manager\n *\n * Features:\n * - Intelligent issue assignment based on expertise\n * - Team notifications (Slack, email, GitHub)\n * - Progress tracking and reporting\n * - Escalation policies\n * - Team dashboard and metrics\n */\nexport class TeamCollaborationManager {\n private teamMembers: Map<string, TeamMember> = new Map();\n private assignments: Map<string, IssueAssignment> = new Map();\n private notifications: TeamNotification[] = [];\n\n /**\n * Register team member\n */\n addTeamMember(member: TeamMember): void {\n this.teamMembers.set(member.id, member);\n }\n\n /**\n * Intelligently assign issues to team members based on expertise\n */\n assignIssues(issues: Issue[], priorityReport: PriorityReport): IssueAssignment[] {\n const assignments: IssueAssignment[] = [];\n\n // Group issues by category for better assignment\n const issuesByCategory = new Map<string, Issue[]>();\n for (const issue of issues) {\n const category = this.categorizeIssue(issue);\n if (!issuesByCategory.has(category)) {\n issuesByCategory.set(category, []);\n }\n issuesByCategory.get(category)!.push(issue);\n }\n\n // Assign issues by category\n for (const [category, categoryIssues] of issuesByCategory) {\n const expertMembers = this.findExpertMembers(category);\n const sortedIssues = this.prioritizeIssues(categoryIssues, priorityReport);\n\n // Round-robin assignment among experts\n let memberIndex = 0;\n for (const issue of sortedIssues) {\n if (expertMembers.length === 0) continue;\n\n const assignee = expertMembers[memberIndex % expertMembers.length];\n const assignment = this.createAssignment(issue, assignee);\n\n assignments.push(assignment);\n this.assignments.set(issue.id, assignment);\n\n // Create notification\n this.createAssignmentNotification(assignment, issue);\n\n memberIndex++;\n }\n }\n\n return assignments;\n }\n\n /**\n * Create assignment for issue\n */\n private createAssignment(issue: Issue, assignee: TeamMember): IssueAssignment {\n const priority = this.determinePriority(issue);\n const dueDate = this.calculateDueDate(issue, priority);\n\n return {\n issueId: issue.id,\n assigneeId: assignee.id,\n assignedAt: Date.now(),\n dueDate,\n priority,\n status: 'assigned'\n };\n }\n\n /**\n * Determine assignment priority based on issue severity and type\n */\n private determinePriority(issue: Issue): IssueAssignment['priority'] {\n if (issue.severity === 'critical') {\n return 'urgent';\n }\n if (issue.severity === 'serious') {\n return 'high';\n }\n if (issue.severity === 'moderate') {\n return 'medium';\n }\n return 'low';\n }\n\n /**\n * Calculate due date based on priority\n */\n private calculateDueDate(issue: Issue, priority: IssueAssignment['priority']): number {\n const now = Date.now();\n const durations = {\n urgent: 4 * 60 * 60 * 1000, // 4 hours\n high: 24 * 60 * 60 * 1000, // 1 day\n medium: 7 * 24 * 60 * 60 * 1000, // 1 week\n low: 14 * 24 * 60 * 60 * 1000 // 2 weeks\n };\n\n return now + durations[priority];\n }\n\n /**\n * Find team members with expertise in a category\n */\n private findExpertMembers(category: string): TeamMember[] {\n const experts = Array.from(this.teamMembers.values()).filter(member =>\n member.expertise.includes(category) || this.hasRelatedExpertise(member, category)\n );\n\n // If no experts found, assign to leads and architects\n if (experts.length === 0) {\n return Array.from(this.teamMembers.values()).filter(member =>\n member.role === 'lead' || member.role === 'architect'\n );\n }\n\n // Sort by role priority\n return experts.sort((a, b) => {\n const roleOrder = { security: 0, architect: 1, lead: 2, developer: 3, manager: 4 };\n return (roleOrder[a.role] || 5) - (roleOrder[b.role] || 5);\n });\n }\n\n /**\n * Check if member has related expertise\n */\n private hasRelatedExpertise(member: TeamMember, category: string): boolean {\n const related: Record<string, string[]> = {\n 'security': ['auth', 'crypto', 'compliance'],\n 'performance': ['optimization', 'backend', 'database'],\n 'frontend': ['ui', 'react', 'vue', 'css'],\n 'backend': ['api', 'database', 'server'],\n 'devops': ['ci', 'docker', 'aws', 'deployment']\n };\n\n const relatedSkills = related[category] || [];\n return relatedSkills.some(skill =>\n member.expertise.some(exp => exp.toLowerCase().includes(skill))\n );\n }\n\n /**\n * Categorize issue for assignment\n */\n private categorizeIssue(issue: Issue): string {\n const issueText = issue.issue.toLowerCase();\n\n if (issueText.includes('security') || issueText.includes('injection') ||\n issueText.includes('auth') || issue.agent === 'security') {\n return 'security';\n }\n if (issueText.includes('performance') || issueText.includes('slow') ||\n issue.agent === 'performance') {\n return 'performance';\n }\n if (issueText.includes('ui') || issueText.includes('component') ||\n issueText.includes('react') || issueText.includes('vue')) {\n return 'frontend';\n }\n if (issueText.includes('api') || issueText.includes('database') ||\n issueText.includes('server')) {\n return 'backend';\n }\n if (issueText.includes('deploy') || issueText.includes('docker') ||\n issueText.includes('ci') || issue.agent === 'devops') {\n return 'devops';\n }\n\n return 'general';\n }\n\n /**\n * Prioritize issues within a category\n */\n private prioritizeIssues(issues: Issue[], priorityReport: PriorityReport): Issue[] {\n return issues.sort((a, b) => {\n // Primary: severity\n const severityOrder = { critical: 0, serious: 1, moderate: 2, low: 3 };\n const aSev = severityOrder[a.severity];\n const bSev = severityOrder[b.severity];\n if (aSev !== bSev) {\n return aSev - bSev;\n }\n\n // Secondary: confidence\n return (b.confidence || 0) - (a.confidence || 0);\n });\n }\n\n /**\n * Create assignment notification\n */\n private createAssignmentNotification(assignment: IssueAssignment, issue: Issue): void {\n const assignee = this.teamMembers.get(assignment.assigneeId);\n if (!assignee) return;\n\n const priorityEmoji = {\n urgent: '🚨',\n high: '⚠️',\n medium: '🔸',\n low: '🔹'\n };\n\n const notification: TeamNotification = {\n id: `notif-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n type: 'assignment',\n recipientId: assignment.assigneeId,\n title: `${priorityEmoji[assignment.priority]} New Issue Assigned`,\n message: `You've been assigned a ${assignment.priority} priority ${issue.severity} issue: ${issue.issue.slice(0, 100)}...`,\n data: {\n assignment,\n issue,\n dueDate: assignment.dueDate\n },\n createdAt: Date.now()\n };\n\n this.notifications.push(notification);\n }\n\n /**\n * Update assignment status\n */\n updateAssignment(issueId: string, updates: Partial<IssueAssignment>): void {\n const assignment = this.assignments.get(issueId);\n if (!assignment) return;\n\n Object.assign(assignment, updates);\n this.assignments.set(issueId, assignment);\n\n // Create status update notification\n if (updates.status) {\n this.createStatusNotification(assignment, updates.status);\n }\n }\n\n /**\n * Create status update notification\n */\n private createStatusNotification(assignment: IssueAssignment, newStatus: string): void {\n const assignee = this.teamMembers.get(assignment.assigneeId);\n if (!assignee) return;\n\n const statusEmoji = {\n 'in_progress': '⏳',\n 'under_review': '👀',\n 'resolved': '✅',\n 'dismissed': '❌'\n };\n\n const notification: TeamNotification = {\n id: `notif-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n type: 'completion',\n recipientId: 'all', // Notify team leads\n title: `${statusEmoji[newStatus]} Issue Status Update`,\n message: `${assignee.name} marked issue ${assignment.issueId} as ${newStatus}`,\n data: {\n assignment,\n previousStatus: assignment.status,\n newStatus\n },\n createdAt: Date.now()\n };\n\n this.notifications.push(notification);\n }\n\n /**\n * Check for overdue assignments and escalate\n */\n checkOverdueAssignments(): void {\n const now = Date.now();\n const overdueAssignments = Array.from(this.assignments.values()).filter(assignment =>\n assignment.dueDate &&\n assignment.dueDate < now &&\n assignment.status !== 'resolved' &&\n assignment.status !== 'dismissed'\n );\n\n for (const assignment of overdueAssignments) {\n this.escalateOverdueAssignment(assignment);\n }\n }\n\n /**\n * Escalate overdue assignment\n */\n private escalateOverdueAssignment(assignment: IssueAssignment): void {\n // Find team leads for escalation\n const leads = Array.from(this.teamMembers.values()).filter(member =>\n member.role === 'lead' || member.role === 'manager'\n );\n\n for (const lead of leads) {\n const notification: TeamNotification = {\n id: `escalation-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n type: 'escalation',\n recipientId: lead.id,\n title: '🚨 Overdue Assignment Escalation',\n message: `Issue ${assignment.issueId} assigned to ${assignment.assigneeId} is overdue`,\n data: {\n assignment,\n overdueBy: Date.now() - (assignment.dueDate || 0)\n },\n createdAt: Date.now()\n };\n\n this.notifications.push(notification);\n }\n }\n\n /**\n * Generate team dashboard data\n */\n generateTeamDashboard(): {\n teamMetrics: {\n totalMembers: number;\n activeAssignments: number;\n overdueAssignments: number;\n completedThisWeek: number;\n };\n memberStats: Array<{\n member: TeamMember;\n activeAssignments: number;\n completedThisWeek: number;\n averageResolutionTime: number;\n }>;\n categoryBreakdown: Record<string, number>;\n } {\n const now = Date.now();\n const oneWeekAgo = now - 7 * 24 * 60 * 60 * 1000;\n\n const activeAssignments = Array.from(this.assignments.values()).filter(a =>\n a.status !== 'resolved' && a.status !== 'dismissed'\n );\n\n const completedThisWeek = Array.from(this.assignments.values()).filter(a =>\n a.status === 'resolved' && a.assignedAt > oneWeekAgo\n );\n\n const overdueAssignments = activeAssignments.filter(a =>\n a.dueDate && a.dueDate < now\n );\n\n // Member statistics\n const memberStats = Array.from(this.teamMembers.values()).map(member => {\n const memberAssignments = Array.from(this.assignments.values()).filter(a =>\n a.assigneeId === member.id\n );\n\n const memberActive = memberAssignments.filter(a =>\n a.status !== 'resolved' && a.status !== 'dismissed'\n );\n\n const memberCompleted = memberAssignments.filter(a =>\n a.status === 'resolved' && a.assignedAt > oneWeekAgo\n );\n\n // Calculate average resolution time\n const resolvedAssignments = memberAssignments.filter(a => a.status === 'resolved');\n const totalResolutionTime = resolvedAssignments.reduce((sum, a) => {\n // Assuming we have a resolvedAt timestamp (would need to add this)\n return sum + (now - a.assignedAt); // Simplified calculation\n }, 0);\n const averageResolutionTime = resolvedAssignments.length > 0 ?\n totalResolutionTime / resolvedAssignments.length : 0;\n\n return {\n member,\n activeAssignments: memberActive.length,\n completedThisWeek: memberCompleted.length,\n averageResolutionTime\n };\n });\n\n // Category breakdown\n const categoryBreakdown: Record<string, number> = {};\n for (const assignment of activeAssignments) {\n // Would need to store category in assignment or look up from issue\n const category = 'general'; // Simplified\n categoryBreakdown[category] = (categoryBreakdown[category] || 0) + 1;\n }\n\n return {\n teamMetrics: {\n totalMembers: this.teamMembers.size,\n activeAssignments: activeAssignments.length,\n overdueAssignments: overdueAssignments.length,\n completedThisWeek: completedThisWeek.length\n },\n memberStats,\n categoryBreakdown\n };\n }\n\n /**\n * Get pending notifications for a team member\n */\n getPendingNotifications(memberId: string): TeamNotification[] {\n return this.notifications.filter(notification =>\n (notification.recipientId === memberId || notification.recipientId === 'all') &&\n !notification.readAt\n );\n }\n\n /**\n * Mark notification as read\n */\n markNotificationRead(notificationId: string): void {\n const notification = this.notifications.find(n => n.id === notificationId);\n if (notification) {\n notification.readAt = Date.now();\n }\n }\n\n /**\n * Get assignment details\n */\n getAssignment(issueId: string): IssueAssignment | undefined {\n return this.assignments.get(issueId);\n }\n\n /**\n * Get all assignments for a team member\n */\n getMemberAssignments(memberId: string): IssueAssignment[] {\n return Array.from(this.assignments.values()).filter(a => a.assigneeId === memberId);\n }\n\n /**\n * Generate team performance report\n */\n generatePerformanceReport(timeRange: { start: number; end: number }): {\n totalIssuesResolved: number;\n averageResolutionTime: number;\n issuesByCategory: Record<string, number>;\n topPerformers: Array<{\n member: TeamMember;\n issuesResolved: number;\n averageTime: number;\n }>;\n trends: {\n weeklyResolution: number[];\n categoryTrends: Record<string, number[]>;\n };\n } {\n // Implementation would analyze assignment history\n // This is a simplified structure\n return {\n totalIssuesResolved: 0,\n averageResolutionTime: 0,\n issuesByCategory: {},\n topPerformers: [],\n trends: {\n weeklyResolution: [],\n categoryTrends: {}\n }\n };\n }\n}"],"mappings":"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","names":["readFile","readdir","writeFile","existsSync","basename","resolve","join","extname","readFile","existsSync","existsSync","readFile","resolve","readFile","writeFile","mkdir","join","resolve","readFile","join","extname","basename","output","readFile","basename","relative","output","basename","readFile","basename","relative","output","createHash","readFile","writeFile","mkdir","existsSync","join","join","existsSync","readFile","mkdir","writeFile","createHash","output","readFile","existsSync","join","existsSync","join","join","existsSync","join","existsSync","readFile","basename","resolve","existsSync","result","writeFile","readFile","output","readdir","join","extname"]}