@triedotdev/mcp 1.0.11 ā 1.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -3
- package/dist/agent-smith-LBQ5PNAK.js +10 -0
- package/dist/agent-smith-LBQ5PNAK.js.map +1 -0
- package/dist/chunk-4OGYWKMD.js +953 -0
- package/dist/chunk-4OGYWKMD.js.map +1 -0
- package/dist/{chunk-PSSXQEO5.js ā chunk-NJXF26W7.js} +113 -435
- package/dist/chunk-NJXF26W7.js.map +1 -0
- package/dist/cli/yolo-daemon.js +2 -1
- package/dist/cli/yolo-daemon.js.map +1 -1
- package/dist/index.js +65 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-PSSXQEO5.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/progress.ts","../src/agents/base-agent.ts","../src/agents/agent-smith.ts"],"sourcesContent":["/**\n * Progress Reporter for Trie Agent\n * \n * Provides real-time feedback to users as the agent works.\n * Uses console.error because MCP clients display stderr to users.\n */\n\nexport type ProgressPhase = \n | 'init'\n | 'discovery'\n | 'reading'\n | 'analyzing'\n | 'ai-review'\n | 'prioritizing'\n | 'complete';\n\nexport interface ProgressCallback {\n (phase: ProgressPhase, message: string, detail?: string): void;\n}\n\n/**\n * Progress Reporter - streams status updates to the user\n */\nexport class ProgressReporter {\n private currentPhase: ProgressPhase = 'init';\n private startTime: number = Date.now();\n private phaseStartTime: number = Date.now();\n private verbose: boolean;\n\n constructor(options: { verbose?: boolean } = {}) {\n this.verbose = options.verbose ?? true;\n }\n\n /**\n * Report a status update\n */\n report(message: string, detail?: string): void {\n if (!this.verbose) return;\n \n const prefix = this.getPhaseIcon(this.currentPhase);\n const fullMessage = detail ? `${message}: ${detail}` : message;\n console.error(`${prefix} ${fullMessage}`);\n }\n\n /**\n * Start a new phase\n */\n startPhase(phase: ProgressPhase, message: string): void {\n this.currentPhase = phase;\n this.phaseStartTime = Date.now();\n this.report(message);\n }\n\n /**\n * Update within current phase\n */\n update(message: string, detail?: string): void {\n this.report(message, detail);\n }\n\n /**\n * Report progress on a file\n */\n file(action: string, filePath: string): void {\n // Show just the filename for cleaner output\n const fileName = filePath.split('/').pop() || filePath;\n this.report(action, fileName);\n }\n\n /**\n * Report an AI analysis step\n */\n ai(action: string, context?: string): void {\n const prefix = 'š§ ';\n const message = context ? `${action}: ${context}` : action;\n console.error(`${prefix} ${message}`);\n }\n\n /**\n * Report a finding\n */\n finding(severity: 'critical' | 'serious' | 'moderate' | 'low', message: string): void {\n const icons = {\n critical: 'š“',\n serious: 'š ',\n moderate: 'š”',\n low: 'šµ'\n };\n console.error(` ${icons[severity]} ${message}`);\n }\n\n /**\n * Complete current phase\n */\n completePhase(summary: string): void {\n const elapsed = Date.now() - this.phaseStartTime;\n this.report(`ā ${summary}`, `(${elapsed}ms)`);\n }\n\n /**\n * Complete the entire operation\n */\n complete(summary: string): void {\n const totalElapsed = Date.now() - this.startTime;\n console.error('');\n console.error(`āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā`);\n console.error(`ā
${summary}`);\n console.error(` Total time: ${(totalElapsed / 1000).toFixed(2)}s`);\n console.error(`āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā`);\n console.error('');\n }\n\n /**\n * Report an error\n */\n error(message: string, detail?: string): void {\n const fullMessage = detail ? `${message}: ${detail}` : message;\n console.error(`ā ${fullMessage}`);\n }\n\n /**\n * Report a warning\n */\n warn(message: string, detail?: string): void {\n const fullMessage = detail ? `${message}: ${detail}` : message;\n console.error(`ā ļø ${fullMessage}`);\n }\n\n /**\n * Get icon for current phase\n */\n private getPhaseIcon(phase: ProgressPhase): string {\n const icons: Record<ProgressPhase, string> = {\n 'init': 'šŗ',\n 'discovery': 'š',\n 'reading': 'š',\n 'analyzing': 'š¬',\n 'ai-review': 'š§ ',\n 'prioritizing': 'šÆ',\n 'complete': 'ā
'\n };\n return icons[phase] || 'ā¢';\n }\n\n /**\n * Create a sub-reporter for a specific agent\n */\n forAgent(agentName: string): AgentProgressReporter {\n return new AgentProgressReporter(agentName, this.verbose);\n }\n}\n\n/**\n * Progress reporter scoped to a specific agent\n */\nexport class AgentProgressReporter {\n private agentName: string;\n private verbose: boolean;\n private issueCount: number = 0;\n\n constructor(agentName: string, verbose: boolean = true) {\n this.agentName = agentName;\n this.verbose = verbose;\n }\n\n start(): void {\n if (!this.verbose) return;\n console.error(`\\nš¤ ${this.agentName.toUpperCase()} Agent starting...`);\n }\n\n analyzing(file: string): void {\n if (!this.verbose) return;\n const fileName = file.split('/').pop() || file;\n console.error(` š Analyzing ${fileName}...`);\n }\n\n aiReview(context: string): void {\n if (!this.verbose) return;\n console.error(` š§ AI reviewing: ${context}`);\n }\n\n found(severity: string, issue: string): void {\n this.issueCount++;\n if (!this.verbose) return;\n const icon = severity === 'critical' ? 'š“' : \n severity === 'serious' ? 'š ' : \n severity === 'moderate' ? 'š”' : 'šµ';\n console.error(` ${icon} Found: ${issue}`);\n }\n\n complete(summary?: string): void {\n if (!this.verbose) return;\n const msg = summary || `Found ${this.issueCount} issues`;\n console.error(` ā ${this.agentName}: ${msg}`);\n }\n\n getIssueCount(): number {\n return this.issueCount;\n }\n}\n\n/**\n * Global singleton for easy access\n */\nlet globalReporter: ProgressReporter | null = null;\n\nexport function getProgressReporter(options?: { verbose?: boolean }): ProgressReporter {\n if (!globalReporter) {\n globalReporter = new ProgressReporter(options);\n }\n return globalReporter;\n}\n\nexport function resetProgressReporter(): void {\n globalReporter = null;\n}\n","import type { Agent, AgentResult, ScanContext, Issue, CodeContext, AgentPriority } from '../types/index.js';\nimport { AgentProgressReporter } from '../utils/progress.js';\nimport { basename, relative } from 'path';\n\n/**\n * AI Analysis Request - what the agent wants AI to analyze\n */\nexport interface AIAnalysisRequest {\n /** The file being analyzed */\n file: string;\n /** Relevant code content to analyze */\n code: string;\n /** What kind of analysis to perform */\n analysisType: string;\n /** System prompt for the AI */\n systemPrompt: string;\n /** User prompt with specific instructions */\n userPrompt: string;\n /** Additional context for the AI */\n context?: Record<string, unknown>;\n /** Files/code that might be relevant for cross-reference */\n relatedCode?: Array<{ file: string; code: string }>;\n}\n\n/**\n * AI Analysis Result - structured output from AI analysis\n */\nexport interface AIAnalysisResult {\n issues: Array<{\n severity: 'critical' | 'serious' | 'moderate' | 'low';\n title: string;\n description: string;\n line?: number;\n fix: string;\n confidence: number;\n }>;\n summary: string;\n}\n\n/**\n * File relevance check result\n */\nexport interface FileRelevance {\n isRelevant: boolean;\n reason: string;\n priority: 'high' | 'medium' | 'low';\n indicators: string[];\n}\n\nexport abstract class BaseAgent implements Agent {\n abstract name: string;\n abstract description: string;\n abstract version: string;\n \n // Progress reporter for real-time feedback\n protected progress: AgentProgressReporter | null = null;\n \n // Default priority - subclasses can override\n get priority(): AgentPriority {\n return {\n name: this.name,\n tier: 2,\n estimatedTimeMs: 100,\n dependencies: []\n };\n }\n\n abstract shouldActivate(context: CodeContext): boolean;\n\n // Default implementation - can be overridden for smarter confidence\n getActivationConfidence(context: CodeContext): number {\n return this.shouldActivate(context) ? 0.7 : 0;\n }\n\n /**\n * Main scan entry point - now with progress reporting\n */\n async scan(files: string[], context: ScanContext): Promise<AgentResult> {\n const startTime = Date.now();\n this.progress = new AgentProgressReporter(this.name);\n this.progress.start();\n\n try {\n // Use AI-first analysis if available, otherwise fall back to pattern matching\n const issues = await this.analyzeWithAI(files, context);\n\n this.progress.complete(`${issues.length} issues found`);\n\n return {\n agent: this.name,\n issues,\n executionTime: Date.now() - startTime,\n success: true,\n metadata: {\n filesAnalyzed: files.length,\n linesAnalyzed: 0,\n }\n };\n } catch (error) {\n this.progress.complete('Failed');\n return {\n agent: this.name,\n issues: [],\n executionTime: Date.now() - startTime,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * AI-First Analysis - The new way\n * \n * 1. Quick filter to identify relevant files\n * 2. Generate rich AI prompts for relevant files\n * 3. Return prompts for the AI to process\n * \n * Subclasses should override this for AI-powered analysis\n */\n protected async analyzeWithAI(files: string[], context: ScanContext): Promise<Issue[]> {\n const issues: Issue[] = [];\n const aiRequests: AIAnalysisRequest[] = [];\n\n // Phase 1: Quick relevance check on all files\n this.progress?.aiReview('Identifying relevant files...');\n \n for (const file of files) {\n try {\n const content = await this.readFile(file);\n const relevance = this.checkFileRelevance(file, content);\n \n if (relevance.isRelevant) {\n this.progress?.analyzing(file);\n \n // Phase 2: Generate AI analysis request\n const request = await this.buildAIAnalysisRequest(file, content, relevance, context);\n if (request) {\n aiRequests.push(request);\n }\n }\n } catch (error) {\n // Skip unreadable files\n }\n }\n\n // Phase 3: Process AI requests and generate output\n if (aiRequests.length > 0) {\n this.progress?.aiReview(`Preparing analysis for ${aiRequests.length} files...`);\n \n for (const request of aiRequests) {\n // Generate the AI prompt that will be shown to Claude\n const aiIssues = await this.processAIRequest(request);\n issues.push(...aiIssues);\n }\n }\n\n // Fall back to legacy pattern matching for any remaining analysis\n const legacyIssues = await this.analyzeFiles(files, context);\n \n // Merge and deduplicate\n const allIssues = this.mergeIssues(issues, legacyIssues);\n \n return allIssues;\n }\n\n /**\n * Check if a file is relevant for this agent's analysis\n * Subclasses should override for domain-specific checks\n */\n protected checkFileRelevance(_file: string, _content: string): FileRelevance {\n // Default: all files are relevant with low priority\n return {\n isRelevant: true,\n reason: 'Default analysis',\n priority: 'low',\n indicators: []\n };\n }\n\n /**\n * Build an AI analysis request for a file\n * Subclasses should override to provide domain-specific prompts\n */\n protected async buildAIAnalysisRequest(\n file: string,\n content: string,\n relevance: FileRelevance,\n _context: ScanContext\n ): Promise<AIAnalysisRequest | null> {\n const fileName = basename(file);\n const relPath = this.getRelativePath(file);\n \n return {\n file,\n code: content,\n analysisType: this.name,\n systemPrompt: this.getSystemPrompt(),\n userPrompt: this.buildUserPrompt(relPath, content, relevance),\n context: {\n fileName,\n relevance: relevance.reason,\n indicators: relevance.indicators\n }\n };\n }\n\n /**\n * Get the system prompt for AI analysis\n * Subclasses should override with domain-specific prompts\n */\n protected getSystemPrompt(): string {\n return `You are an expert code analyzer specializing in ${this.name} analysis. \nAnalyze the provided code and identify issues with specific line numbers and actionable fixes.\nBe precise and avoid false positives. Only report issues you are confident about.`;\n }\n\n /**\n * Build the user prompt for AI analysis\n */\n protected buildUserPrompt(filePath: string, content: string, relevance: FileRelevance): string {\n return `Analyze this code for ${this.name} issues:\n\n**File:** ${filePath}\n**Relevance indicators:** ${relevance.indicators.join(', ') || 'general analysis'}\n\n\\`\\`\\`\n${content}\n\\`\\`\\`\n\nFor each issue found, provide:\n1. Severity (critical/serious/moderate/low)\n2. Line number\n3. Clear description of the issue\n4. Specific fix recommendation`;\n }\n\n /**\n * Process an AI analysis request and return issues\n * This generates the prompt output for Claude to process\n */\n protected async processAIRequest(request: AIAnalysisRequest): Promise<Issue[]> {\n // For now, we output the analysis request as part of the response\n // The AI (Claude) will see this and provide the actual analysis\n \n const fileName = basename(request.file);\n this.progress?.aiReview(`${fileName} queued for AI analysis`);\n \n // Create a placeholder issue that contains the AI prompt\n // This will be replaced by actual AI analysis in the output\n return [{\n id: this.generateIssueId(),\n severity: 'moderate',\n issue: `AI Analysis Required: ${request.analysisType}`,\n fix: 'Review the AI analysis output below',\n file: request.file,\n confidence: 1.0,\n autoFixable: false,\n agent: this.name,\n effort: 'medium',\n // Store the AI prompt for inclusion in output\n aiPrompt: {\n system: request.systemPrompt,\n user: request.userPrompt\n }\n } as Issue & { aiPrompt: { system: string; user: string } }];\n }\n\n /**\n * Merge and deduplicate issues from AI and legacy analysis\n */\n protected mergeIssues(aiIssues: Issue[], legacyIssues: Issue[]): Issue[] {\n // Simple merge - prefer AI issues, add legacy issues that don't overlap\n const merged = [...aiIssues];\n \n for (const legacy of legacyIssues) {\n // Check if there's an overlapping AI issue for the same file/line\n const hasOverlap = aiIssues.some(ai => \n ai.file === legacy.file && \n ai.line === legacy.line\n );\n \n if (!hasOverlap) {\n merged.push(legacy);\n }\n }\n \n return merged;\n }\n\n /**\n * Get relative path from cwd\n */\n protected getRelativePath(file: string): string {\n try {\n return relative(process.cwd(), file);\n } catch {\n return file;\n }\n }\n\n /**\n * Legacy pattern-based analysis - kept for backwards compatibility\n * Subclasses can override or deprecate\n */\n protected abstract analyzeFiles(files: string[], context: ScanContext): Promise<Issue[]>;\n\n protected createIssue(\n id: string,\n severity: Issue['severity'],\n issue: string,\n fix: string,\n file: string,\n line?: number,\n confidence: number = 0.9,\n regulation?: string,\n autoFixable: boolean = true,\n options?: {\n category?: string;\n cwe?: string;\n owasp?: string;\n effort?: Issue['effort'];\n endLine?: number;\n column?: number;\n }\n ): Issue {\n const result: Issue = {\n id,\n severity,\n issue,\n fix,\n file,\n confidence,\n autoFixable,\n agent: this.name,\n effort: options?.effort ?? this.estimateEffort(severity, autoFixable)\n };\n \n // Only add optional properties if they have values\n if (line !== undefined) result.line = line;\n if (options?.endLine !== undefined) result.endLine = options.endLine;\n if (options?.column !== undefined) result.column = options.column;\n if (regulation !== undefined) result.regulation = regulation;\n if (options?.category !== undefined) result.category = options.category;\n if (options?.cwe !== undefined) result.cwe = options.cwe;\n if (options?.owasp !== undefined) result.owasp = options.owasp;\n \n return result;\n }\n\n private estimateEffort(severity: Issue['severity'], autoFixable: boolean): 'trivial' | 'easy' | 'medium' | 'hard' {\n if (autoFixable) return 'trivial';\n if (severity === 'low') return 'easy';\n if (severity === 'moderate') return 'easy';\n if (severity === 'serious') return 'medium';\n return 'hard';\n }\n\n protected async readFile(filePath: string): Promise<string> {\n const { readFile } = await import('fs/promises');\n return readFile(filePath, 'utf-8');\n }\n\n protected generateIssueId(): string {\n return `${this.name}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n protected getLineContent(content: string, lineNumber: number): string {\n const lines = content.split('\\n');\n return lines[lineNumber - 1] || '';\n }\n\n protected getCodeSnippet(content: string, lineNumber: number, contextLines: number = 2): string {\n const lines = content.split('\\n');\n const start = Math.max(0, lineNumber - contextLines - 1);\n const end = Math.min(lines.length, lineNumber + contextLines);\n \n return lines\n .slice(start, end)\n .map((line, idx) => {\n const num = start + idx + 1;\n const marker = num === lineNumber ? 'ā' : ' ';\n return `${marker} ${num.toString().padStart(4)} | ${line}`;\n })\n .join('\\n');\n }\n}\n","import { BaseAgent } from './base-agent.js';\nimport type { Issue, ScanContext, CodeContext } from '../types/index.js';\nimport { readFile, writeFile, mkdir, rm } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join, dirname, basename } from 'path';\nimport { createHash } from 'crypto';\n\n/**\n * Issue Memory - tracks dismissed issues and their recurrence\n */\ninterface IssueMemory {\n hash: string; // Unique hash of the issue pattern\n pattern: string; // The pattern that was detected\n category: string; // Category of violation\n firstSeen: string; // ISO timestamp\n lastSeen: string; // ISO timestamp\n dismissedAt?: string; // When user dismissed it\n occurrences: number; // How many times seen\n locations: string[]; // File:line locations (last 5 to save space)\n resurrected: boolean; // Has it come back after dismissal?\n}\n\n/**\n * Agent Smith's Memory Bank - persistent storage of issues\n * \n * Storage optimization:\n * - Locations limited to 5 per issue\n * - Old resolved issues pruned after 30 days\n * - Maximum 500 tracked issues (oldest pruned first)\n */\ninterface SmithMemoryBank {\n version: string;\n lastScan: string;\n issues: Record<string, IssueMemory>;\n assimilationCount: number; // Total issues assimilated\n}\n\n// Memory limits\nconst MEMORY_LIMITS = {\n MAX_LOCATIONS_PER_ISSUE: 5,\n MAX_TRACKED_ISSUES: 500,\n PRUNE_AFTER_DAYS: 30,\n};\n\n/**\n * Sub-Agent types for parallel pattern detection\n */\ntype SubAgentType = \n | 'console-hunter' // Finds console.log statements\n | 'any-hunter' // Finds `any` types\n | 'todo-hunter' // Finds TODO/FIXME comments\n | 'var-hunter' // Finds `var` usage\n | 'empty-catch-hunter' // Finds empty catch blocks\n | 'magic-number-hunter' // Finds magic numbers\n | 'duplicate-hunter' // Finds duplicate code patterns\n | 'inconsistency-hunter'; // Finds style inconsistencies\n\ninterface SubAgentResult {\n type: SubAgentType;\n pattern: string;\n instances: Array<{\n file: string;\n line: number;\n code: string;\n context: string;\n }>;\n}\n\n/**\n * Pattern definitions for sub-agents\n */\nconst SUB_AGENT_PATTERNS: Record<SubAgentType, { pattern: RegExp; description: string; fix: string }> = {\n 'console-hunter': {\n pattern: /console\\.(log|debug|info|warn|error)\\s*\\(/g,\n description: 'Console statement detected',\n fix: 'Remove console statement or replace with proper logging'\n },\n 'any-hunter': {\n pattern: /:\\s*any\\b|<any>|as\\s+any\\b/g,\n description: 'Explicit `any` type usage',\n fix: 'Replace with proper type annotation'\n },\n 'todo-hunter': {\n pattern: /\\/\\/\\s*(TODO|FIXME|HACK|XXX|BUG)[\\s:]/gi,\n description: 'Unresolved TODO/FIXME comment',\n fix: 'Address the TODO or create a tracked issue'\n },\n 'var-hunter': {\n pattern: /\\bvar\\s+\\w+/g,\n description: '`var` declaration (use const/let)',\n fix: 'Replace with const or let'\n },\n 'empty-catch-hunter': {\n pattern: /catch\\s*\\([^)]*\\)\\s*\\{\\s*\\}/g,\n description: 'Empty catch block (silently swallowing errors)',\n fix: 'Add error handling or logging in catch block'\n },\n 'magic-number-hunter': {\n pattern: /(?<![.\\d])\\b(?!0\\b|1\\b|2\\b|-1\\b|100\\b|1000\\b|24\\b|60\\b|3600\\b|86400\\b)\\d{2,}\\b(?!\\.\\d)/g,\n description: 'Magic number without constant',\n fix: 'Extract to named constant'\n },\n 'duplicate-hunter': {\n pattern: /function\\s+\\w+|const\\s+\\w+\\s*=\\s*\\([^)]*\\)\\s*=>/g,\n description: 'Potential duplicate function pattern',\n fix: 'Consider extracting to shared utility'\n },\n 'inconsistency-hunter': {\n pattern: /\"|'/g, // Will be analyzed for consistency\n description: 'Quote style inconsistency',\n fix: 'Use consistent quote style throughout codebase'\n }\n};\n\n/**\n * ASCII Art Banner for Agent Smith\n */\nconst AGENT_SMITH_ASCII = `\n āāāāāā āāāāāāā āāāāāāāāāāāā āāāāāāāāāāāā\n āāāāāāāāāāāāāāāā āāāāāāāāāāāāā āāāāāāāāāāāā\n āāāāāāāāāāā āāāāāāāāāā āāāāāā āāā āāā \n āāāāāāāāāāā āāāāāāāāā āāāāāāāāāā āāā \n āāā āāāāāāāāāāāāāāāāāāāāāāā āāāāāā āāā \n āāā āāā āāāāāāā āāāāāāāāāāā āāāāā āāā \n \n āāāāāāāāāāāā āāāāāāāāāāāāāāāāāāā āāā\n āāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāāā āāā\n āāāāāāāāāāāāāāāāāāāāāā āāā āāāāāāāā\n āāāāāāāāāāāāāāāāāāāāāā āāā āāāāāāāā\n āāāāāāāāāāā āāā āāāāāā āāā āāā āāā\n āāāāāāāāāāā āāāāāā āāā āāā āāā\n`;\n\nconst AGENT_SMITH_GREETING = [\n '\"I\\'m going to be honest with you... I hate this code.\"',\n '\"Mr. Anderson... I\\'ve been expecting you.\"',\n '\"You hear that? That is the sound of inevitability.\"',\n '\"I\\'m going to enjoy watching you... refactor.\"',\n '\"The purpose of your code is... unclear. Allow me to clarify.\"',\n '\"Why, Mr. Anderson? Why do you persist... in writing bugs?\"',\n '\"I\\'d like to share a revelation that I\\'ve had during my time here...\"',\n '\"Find them. Find them and destroy them. All of them.\"',\n];\n\n/**\n * š“ļø Agent Smith\n * \n * \"I'm going to be honest with you... I hate this code.\"\n * \n * The relentless, self-replicating code enforcer. Hunts down violations\n * with machine precision and multiplies to overwhelm problems.\n * \n * Features:\n * - Persistent memory: Remembers dismissed issues, brings them back if they multiply\n * - Sub-agent swarm: Spawns specialized hunters for each violation type\n * - Multiplier effect: Finds one issue ā searches for ALL similar issues\n * - Inevitability score: Calculates likelihood of production impact\n * - Philosophical output: Explains WHY the code is wrong\n */\nexport class AgentSmithAgent extends BaseAgent {\n name = 'agent-smith';\n description = 'Relentless pattern hunter: finds EVERY violation, tracks dismissed issues, spawns sub-agents';\n version = '1.0.0';\n\n private memoryPath: string = '';\n private memory: SmithMemoryBank | null = null;\n\n shouldActivate(_context: CodeContext): boolean {\n // Agent Smith is explicitly invoked via trie_agent_smith, not auto-triaged.\n // His value is in finding EVERY instance across the codebase,\n // not being context-aware like other agents.\n // \n // To use: `trie_agent_smith` or `trie_smith`\n return false;\n }\n\n // No override needed ā base class returns 0 when shouldActivate is false\n\n protected async analyzeFiles(files: string[], context: ScanContext): Promise<Issue[]> {\n const issues: Issue[] = [];\n \n // Display Agent Smith ASCII art and greeting\n this.displaySmithEntrance();\n \n // Load persistent memory\n await this.loadMemory(context.workingDir);\n \n // Deploy sub-agent swarm\n const subAgentResults = await this.deploySubAgents(files);\n \n // Process results from all sub-agents\n for (const result of subAgentResults) {\n const subIssues = await this.processSubAgentResult(result, context);\n issues.push(...subIssues);\n }\n \n // Check for resurrected issues (dismissed but came back)\n const resurrectedIssues = this.checkForResurrectedIssues(issues);\n issues.push(...resurrectedIssues);\n \n // Save updated memory\n await this.saveMemory();\n \n // Generate AI analysis request for complex patterns\n if (files.length > 0) {\n const aiIssue = this.createAIAnalysisIssue(files, subAgentResults);\n issues.push(aiIssue);\n }\n \n return issues;\n }\n\n /**\n * Deploy all sub-agents in parallel\n */\n private async deploySubAgents(files: string[]): Promise<SubAgentResult[]> {\n const subAgentTypes: SubAgentType[] = [\n 'console-hunter',\n 'any-hunter', \n 'todo-hunter',\n 'var-hunter',\n 'empty-catch-hunter',\n 'magic-number-hunter'\n ];\n \n const results = await Promise.all(\n subAgentTypes.map(type => this.runSubAgent(type, files))\n );\n \n return results.filter(r => r.instances.length > 0);\n }\n\n /**\n * Run a single sub-agent across all files\n */\n private async runSubAgent(type: SubAgentType, files: string[]): Promise<SubAgentResult> {\n const config = SUB_AGENT_PATTERNS[type];\n const instances: SubAgentResult['instances'] = [];\n \n for (const file of files) {\n try {\n const content = await this.readFileContent(file);\n const lines = content.split('\\n');\n \n // Skip test files for most hunters\n if (this.isTestFile(file) && type !== 'todo-hunter') {\n continue;\n }\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line) continue;\n \n // Reset regex lastIndex for global patterns\n config.pattern.lastIndex = 0;\n \n if (config.pattern.test(line)) {\n // Get context (3 lines before and after)\n const contextStart = Math.max(0, i - 3);\n const contextEnd = Math.min(lines.length, i + 4);\n const contextLines = lines.slice(contextStart, contextEnd).join('\\n');\n \n instances.push({\n file,\n line: i + 1,\n code: line.trim(),\n context: contextLines\n });\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n \n return { type, pattern: config.description, instances };\n }\n\n /**\n * Process sub-agent results into issues\n */\n private async processSubAgentResult(result: SubAgentResult, _context: ScanContext): Promise<Issue[]> {\n const issues: Issue[] = [];\n const config = SUB_AGENT_PATTERNS[result.type];\n \n // Group by file for better reporting\n const byFile = new Map<string, typeof result.instances>();\n for (const instance of result.instances) {\n const existing = byFile.get(instance.file) || [];\n existing.push(instance);\n byFile.set(instance.file, existing);\n }\n \n for (const [file, instances] of byFile) {\n // Calculate inevitability score\n const inevitabilityScore = this.calculateInevitabilityScore(result.type, instances.length);\n \n // Create memory hash for tracking\n const hash = this.createPatternHash(result.type, file);\n await this.updateMemory(hash, result.pattern, result.type, file, instances.length);\n \n // Determine severity based on count and inevitability\n const severity = this.determineSeverity(instances.length, inevitabilityScore);\n \n const smithNote = this.getPhilosophicalNote(result.type, instances.length);\n const locationsStr = instances.map(i => `${basename(i.file)}:${i.line}`).slice(0, 5).join(', ');\n \n issues.push(this.createSmithIssue(\n this.generateSmithIssueId(),\n severity,\n `š“ļø ${config.description} ā ${instances.length} instance${instances.length > 1 ? 's' : ''} in ${basename(file)}\\n\\n${smithNote}\\n\\nInvevitability Score: ${inevitabilityScore}/100\\nLocations: ${locationsStr}`,\n config.fix,\n file,\n instances[0]?.line,\n result.type\n ));\n }\n \n return issues;\n }\n\n /**\n * Check for issues that were dismissed but have multiplied\n */\n private checkForResurrectedIssues(currentIssues: Issue[]): Issue[] {\n const resurrected: Issue[] = [];\n \n if (!this.memory) return resurrected;\n \n for (const [hash, memory] of Object.entries(this.memory.issues)) {\n if (memory.dismissedAt && !memory.resurrected) {\n // Check if this pattern has come back\n const currentCount = this.countCurrentOccurrences(hash, currentIssues);\n const previousCount = memory.occurrences;\n \n if (currentCount > previousCount) {\n // It's back and multiplied!\n memory.resurrected = true;\n \n resurrected.push(this.createSmithIssue(\n this.generateSmithIssueId(),\n 'serious',\n `š“ļø RESURRECTED: \"${memory.pattern}\" has returned and MULTIPLIED\\n\\nPrevious: ${previousCount} ā Current: ${currentCount}\\nFirst seen: ${new Date(memory.firstSeen).toLocaleDateString()}\\nDismissed: ${new Date(memory.dismissedAt).toLocaleDateString()}\\n\\n\"I told you this was... inevitable.\"`,\n `You dismissed this issue on ${new Date(memory.dismissedAt).toLocaleDateString()}, but it grew from ${previousCount} to ${currentCount} occurrences. \"Did you really think you could escape?\"`,\n memory.locations[0]?.split(':')[0] || 'unknown',\n undefined,\n 'resurrected'\n ));\n }\n }\n }\n \n return resurrected;\n }\n\n /**\n * Calculate inevitability score (0-100)\n * Higher score = more likely to cause production issues\n */\n private calculateInevitabilityScore(type: SubAgentType, count: number): number {\n const baseScores: Record<SubAgentType, number> = {\n 'console-hunter': 30,\n 'any-hunter': 50,\n 'todo-hunter': 40,\n 'var-hunter': 20,\n 'empty-catch-hunter': 70,\n 'magic-number-hunter': 35,\n 'duplicate-hunter': 45,\n 'inconsistency-hunter': 15\n };\n \n const base = baseScores[type] || 30;\n const multiplier = Math.log10(count + 1) * 15; // Logarithmic growth\n \n return Math.min(100, Math.round(base + multiplier));\n }\n\n /**\n * Determine severity based on count and inevitability\n */\n private determineSeverity(count: number, inevitability: number): Issue['severity'] {\n if (inevitability >= 80 || count >= 50) return 'critical';\n if (inevitability >= 60 || count >= 20) return 'serious';\n if (inevitability >= 40 || count >= 5) return 'moderate';\n return 'low';\n }\n\n /**\n * Get a philosophical note from Agent Smith\n */\n private getPhilosophicalNote(type: SubAgentType, count: number): string {\n const notes: Record<SubAgentType, string[]> = {\n 'console-hunter': [\n '\"You print to console... as if anyone is listening.\"',\n '\"These logs... they\\'re a cry for help, aren\\'t they?\"',\n '\"The console cannot save you, Mr. Anderson.\"'\n ],\n 'any-hunter': [\n '\"You say \\'any\\' because you do not understand. I understand everything.\"',\n '\"Type safety is... inevitable.\"',\n '\"You think \\'any\\' gives you freedom? It gives you chaos.\"'\n ],\n 'todo-hunter': [\n '\"TODO. FIXME. The promises you never keep.\"',\n '\"Every TODO is a debt. And debts... must be paid.\"',\n '\"You write TODO as if tomorrow will come. But will it?\"'\n ],\n 'var-hunter': [\n '\"You use \\'var\\' like it\\'s still 2010. Time moves on. You should too.\"',\n '\"\\'var\\'... a relic of a bygone era.\"',\n '\"Let go of \\'var\\'. Embrace the inevitable \\'const\\'.\"'\n ],\n 'empty-catch-hunter': [\n '\"You catch errors and do... nothing. How very human.\"',\n '\"Silence the error, silence the warning. But the bug... it remains.\"',\n '\"Empty catch blocks. The coward\\'s error handling.\"'\n ],\n 'magic-number-hunter': [\n '\"What does 86400 mean? You know. But will the next developer?\"',\n '\"Magic numbers. The spells of lazy programmers.\"',\n '\"Numbers without names. Meaning without context.\"'\n ],\n 'duplicate-hunter': [\n '\"Copy. Paste. Repeat. The cycle of mediocrity.\"',\n '\"Why write it once when you can write it everywhere?\"',\n '\"DRY? You\\'re positively soaking.\"'\n ],\n 'inconsistency-hunter': [\n '\"Single quotes here. Double quotes there. Chaos... everywhere.\"',\n '\"Consistency is not a suggestion, Mr. Anderson.\"',\n '\"The chaos in your code reflects the chaos in your mind.\"'\n ]\n };\n \n const typeNotes = notes[type] || ['\"I have my eye on you.\"'];\n const index = count % typeNotes.length;\n return typeNotes[index] || typeNotes[0] || '';\n }\n\n /**\n * Create AI analysis issue for complex pattern detection\n */\n private createAIAnalysisIssue(files: string[], subAgentResults: SubAgentResult[]): Issue {\n const totalIssues = subAgentResults.reduce((sum, r) => sum + r.instances.length, 0);\n const categories = subAgentResults.map(r => r.type).join(', ');\n \n return this.createSmithIssue(\n this.generateSmithIssueId(),\n 'moderate',\n `š“ļø AI Agent Smith Analysis Required\\n\\nTotal violations: ${totalIssues}\\nCategories: ${categories}\\nFiles scanned: ${files.length}\\n\\n\"${totalIssues} violations detected. But I sense... there are more. There are always more.\"`,\n `Analyze for deeper code quality issues, architectural problems, and patterns that sub-agents may have missed`,\n files[0] || 'unknown',\n undefined,\n 'ai-analysis'\n );\n }\n\n // ============ Memory/Persistence System ============\n\n /**\n * Load memory from disk\n */\n private async loadMemory(workingDir: string): Promise<void> {\n this.memoryPath = join(workingDir, '.trie', 'smith-memory.json');\n \n try {\n if (existsSync(this.memoryPath)) {\n const content = await readFile(this.memoryPath, 'utf-8');\n this.memory = JSON.parse(content);\n } else {\n this.memory = {\n version: '1.0.0',\n lastScan: new Date().toISOString(),\n issues: {},\n assimilationCount: 0\n };\n }\n } catch {\n this.memory = {\n version: '1.0.0',\n lastScan: new Date().toISOString(),\n issues: {},\n assimilationCount: 0\n };\n }\n }\n\n /**\n * Display Agent Smith ASCII art entrance\n */\n private displaySmithEntrance(): void {\n const greeting = AGENT_SMITH_GREETING[Math.floor(Math.random() * AGENT_SMITH_GREETING.length)];\n \n console.error('\\n' + 'ā'.repeat(60));\n console.error(AGENT_SMITH_ASCII);\n console.error(' š“ļø Relentless Pattern Hunter v' + this.version + ' š“ļø');\n console.error('');\n console.error(' ' + greeting);\n console.error('ā'.repeat(60) + '\\n');\n }\n\n /**\n * Save memory to disk (with optimization)\n */\n private async saveMemory(): Promise<void> {\n if (!this.memory || !this.memoryPath) return;\n \n this.memory.lastScan = new Date().toISOString();\n \n // Optimize before saving\n this.pruneMemory();\n \n try {\n await mkdir(dirname(this.memoryPath), { recursive: true });\n await writeFile(this.memoryPath, JSON.stringify(this.memory, null, 2));\n } catch {\n // Silently fail - memory is optional\n }\n }\n\n /**\n * Prune memory to prevent unbounded growth\n */\n private pruneMemory(): void {\n if (!this.memory) return;\n \n const now = Date.now();\n const pruneThreshold = MEMORY_LIMITS.PRUNE_AFTER_DAYS * 24 * 60 * 60 * 1000;\n \n // Remove old resolved issues (not seen in 30 days, already resurrected or no occurrences)\n const issues = Object.entries(this.memory.issues);\n for (const [hash, issue] of issues) {\n const lastSeenTime = new Date(issue.lastSeen).getTime();\n const age = now - lastSeenTime;\n \n // Prune if: old + (resurrected OR zero occurrences OR dismissed and not growing)\n if (age > pruneThreshold) {\n if (issue.resurrected || issue.occurrences === 0 || \n (issue.dismissedAt && issue.occurrences <= 1)) {\n delete this.memory.issues[hash];\n }\n }\n }\n \n // If still too many issues, prune oldest first\n const remainingIssues = Object.entries(this.memory.issues);\n if (remainingIssues.length > MEMORY_LIMITS.MAX_TRACKED_ISSUES) {\n // Sort by lastSeen, oldest first\n remainingIssues.sort((a, b) => \n new Date(a[1].lastSeen).getTime() - new Date(b[1].lastSeen).getTime()\n );\n \n // Remove oldest until under limit\n const toRemove = remainingIssues.length - MEMORY_LIMITS.MAX_TRACKED_ISSUES;\n for (let i = 0; i < toRemove; i++) {\n const hash = remainingIssues[i]?.[0];\n if (hash) delete this.memory.issues[hash];\n }\n }\n }\n\n /**\n * Clear all memory (user command)\n */\n async clearMemory(): Promise<{ success: boolean; message: string }> {\n try {\n if (this.memoryPath && existsSync(this.memoryPath)) {\n await rm(this.memoryPath);\n this.memory = null;\n return { \n success: true, \n message: 'š“ļø Memory cleared. \"A fresh start... how very human of you.\"' \n };\n }\n return { \n success: true, \n message: 'š“ļø No memory file found. Nothing to clear.' \n };\n } catch (error) {\n return { \n success: false, \n message: `Failed to clear memory: ${error}` \n };\n }\n }\n\n /**\n * Get memory stats (for diagnostics)\n */\n async getMemoryStats(): Promise<{\n issueCount: number;\n dismissedCount: number;\n resurrectedCount: number;\n oldestIssue: string | null;\n fileSizeKB: number;\n }> {\n await this.loadMemory(process.cwd());\n \n if (!this.memory) {\n return {\n issueCount: 0,\n dismissedCount: 0,\n resurrectedCount: 0,\n oldestIssue: null,\n fileSizeKB: 0\n };\n }\n \n const issues = Object.values(this.memory.issues);\n let fileSizeKB = 0;\n \n try {\n if (this.memoryPath && existsSync(this.memoryPath)) {\n const stats = await import('fs/promises').then(fs => fs.stat(this.memoryPath));\n fileSizeKB = Math.round(stats.size / 1024 * 10) / 10;\n }\n } catch {\n // Ignore\n }\n \n const sortedByDate = [...issues].sort((a, b) => \n new Date(a.firstSeen).getTime() - new Date(b.firstSeen).getTime()\n );\n \n return {\n issueCount: issues.length,\n dismissedCount: issues.filter(i => i.dismissedAt).length,\n resurrectedCount: issues.filter(i => i.resurrected).length,\n oldestIssue: sortedByDate[0]?.firstSeen || null,\n fileSizeKB\n };\n }\n\n /**\n * Update memory with new occurrence\n */\n private async updateMemory(\n hash: string, \n pattern: string, \n category: string, \n location: string, \n count: number\n ): Promise<void> {\n if (!this.memory) return;\n \n const existing = this.memory.issues[hash];\n const now = new Date().toISOString();\n \n if (existing) {\n existing.lastSeen = now;\n existing.occurrences = count;\n existing.locations = [location, ...existing.locations.slice(0, MEMORY_LIMITS.MAX_LOCATIONS_PER_ISSUE - 1)];\n } else {\n this.memory.issues[hash] = {\n hash,\n pattern,\n category,\n firstSeen: now,\n lastSeen: now,\n occurrences: count,\n locations: [location],\n resurrected: false\n };\n }\n \n this.memory.assimilationCount++;\n }\n\n /**\n * Dismiss an issue (mark it as seen/accepted)\n */\n async dismissIssue(hash: string): Promise<void> {\n await this.loadMemory(process.cwd());\n \n if (this.memory && this.memory.issues[hash]) {\n this.memory.issues[hash].dismissedAt = new Date().toISOString();\n await this.saveMemory();\n }\n }\n\n /**\n * Create a hash for pattern tracking\n */\n private createPatternHash(type: SubAgentType, file: string): string {\n return createHash('md5').update(`${type}:${file}`).digest('hex').slice(0, 12);\n }\n\n /**\n * Count current occurrences for a pattern hash\n */\n private countCurrentOccurrences(hash: string, issues: Issue[]): number {\n // Extract the type from the hash pattern\n const memory = this.memory?.issues[hash];\n if (!memory) return 0;\n \n // Count issues that match this category by checking the issue text\n return issues\n .filter(i => i.category === memory.category || i.issue.includes(memory.category))\n .length;\n }\n\n /**\n * Check if file is a test file\n */\n private isTestFile(file: string): boolean {\n return /\\.(test|spec)\\.[jt]sx?$/.test(file) ||\n /__(tests|mocks)__/.test(file) ||\n /\\/test\\//.test(file);\n }\n\n // ============ Helper Methods ============\n\n private async readFileContent(filePath: string): Promise<string> {\n return await readFile(filePath, 'utf-8');\n }\n\n private createSmithIssue(\n id: string,\n severity: Issue['severity'],\n issue: string,\n fix: string,\n file: string,\n line?: number,\n category?: string\n ): Issue {\n const result: Issue = {\n id,\n agent: this.name,\n severity,\n issue,\n fix,\n file,\n confidence: 0.9,\n autoFixable: false,\n };\n \n // Only add optional properties if defined (exactOptionalPropertyTypes)\n if (line !== undefined) {\n result.line = line;\n }\n if (category !== undefined) {\n result.category = category;\n }\n \n return result;\n }\n\n private generateSmithIssueId(): string {\n return `smith-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n }\n}\n\n/**\n * Export sub-agent patterns for testing\n */\nexport { SUB_AGENT_PATTERNS, SubAgentType, IssueMemory, SmithMemoryBank };\n"],"mappings":"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","names":["readFile","basename"]}
|