@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.
@@ -2,8 +2,9 @@
2
2
  import {
3
3
  TrieFixTool,
4
4
  TrieScanTool
5
- } from "../chunk-PSSXQEO5.js";
5
+ } from "../chunk-NJXF26W7.js";
6
6
  import "../chunk-3CS6Z2SL.js";
7
+ import "../chunk-4OGYWKMD.js";
7
8
  import "../chunk-MR755QGT.js";
8
9
  import "../chunk-6NLHFIYA.js";
9
10
  import "../chunk-DGUM43GV.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/yolo-daemon.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Trie Agent YOLO Daemon\n * \n * Headless file watcher for Docker/CI environments.\n * Watches a directory and auto-fixes issues as they occur.\n * \n * Usage:\n * node dist/cli/yolo-daemon.js [options]\n * \n * Options:\n * --dir, -d Directory to watch (default: cwd)\n * --yolo, -y Enable auto-fix mode (default: false)\n * --debounce, -D Debounce time in ms (default: 1000)\n * --confidence Minimum confidence for auto-fix (default: 0.8)\n * --json Output as JSON (for log aggregation)\n * --once Run once and exit (no watch)\n */\n\nimport { watch, existsSync, statSync } from 'fs';\nimport { readdir } from 'fs/promises';\nimport { join, extname, basename, resolve } from 'path';\nimport { TrieScanTool } from '../tools/scan.js';\nimport { TrieFixTool } from '../tools/fix.js';\n\n// File extensions to watch\nconst WATCH_EXTENSIONS = new Set([\n '.ts', '.tsx', '.js', '.jsx', '.mjs',\n '.vue', '.svelte', '.astro',\n '.py', '.go', '.rs'\n]);\n\n// Directories to skip\nconst SKIP_DIRS = new Set([\n 'node_modules', '.git', 'dist', 'build', '.next', '.nuxt',\n 'coverage', '.turbo', '.cache', '__pycache__', '.venv'\n]);\n\ninterface DaemonConfig {\n directory: string;\n yoloMode: boolean;\n debounceMs: number;\n minConfidence: number;\n jsonOutput: boolean;\n runOnce: boolean;\n}\n\ninterface DaemonStats {\n filesScanned: number;\n issuesFound: number;\n issuesFixed: number;\n errors: number;\n startTime: number;\n}\n\nclass YoloDaemon {\n private config: DaemonConfig;\n private stats: DaemonStats;\n private scanTool = new TrieScanTool();\n private fixTool = new TrieFixTool();\n private watchers: Map<string, ReturnType<typeof watch>> = new Map();\n private pendingFiles: Set<string> = new Set();\n private debounceTimer: NodeJS.Timeout | null = null;\n private isProcessing = false;\n\n constructor(config: DaemonConfig) {\n this.config = config;\n this.stats = {\n filesScanned: 0,\n issuesFound: 0,\n issuesFixed: 0,\n errors: 0,\n startTime: Date.now()\n };\n }\n\n /**\n * Start the daemon\n */\n async start(): Promise<void> {\n this.log('info', 'Starting Trie Agent YOLO Daemon', {\n directory: this.config.directory,\n yoloMode: this.config.yoloMode,\n debounceMs: this.config.debounceMs,\n minConfidence: this.config.minConfidence\n });\n\n // Validate directory\n if (!existsSync(this.config.directory)) {\n this.log('error', 'Directory not found', { directory: this.config.directory });\n process.exit(1);\n }\n\n // Run initial scan\n this.log('info', 'Running initial scan...');\n await this.runScan();\n\n // If run-once mode, exit after initial scan\n if (this.config.runOnce) {\n this.log('info', 'Run-once mode: exiting after initial scan', { ...this.stats });\n process.exit(this.stats.issuesFound > 0 ? 1 : 0);\n }\n\n // Start watching\n await this.watchDirectory(this.config.directory);\n this.log('info', 'Watching for file changes...', { \n directories: this.watchers.size \n });\n\n // Handle graceful shutdown\n process.on('SIGINT', () => this.shutdown('SIGINT'));\n process.on('SIGTERM', () => this.shutdown('SIGTERM'));\n }\n\n /**\n * Run a scan on all files or specific files\n */\n private async runScan(files?: string[]): Promise<void> {\n try {\n const scanArgs = files\n ? { files }\n : { directory: this.config.directory };\n\n const result = await this.scanTool.execute(scanArgs);\n const resultText = result.content?.[0]?.text || '';\n\n // PRINT THE FULL REPORT TO STDOUT (for terminal/chat display)\n if (resultText && this.config.runOnce) {\n console.log(resultText);\n }\n\n // Parse results\n const issueMatch = resultText.match(/(\\d+) total/);\n const issueCount = issueMatch && issueMatch[1] ? parseInt(issueMatch[1], 10) : 0;\n\n this.stats.filesScanned += files?.length || 1;\n this.stats.issuesFound += issueCount;\n\n if (issueCount > 0) {\n this.log('warn', 'Issues found', {\n count: issueCount,\n files: files?.map(f => basename(f)) || ['full scan']\n });\n\n // Parse severity breakdown\n const criticalMatch = resultText.match(/(\\d+) CRITICAL/);\n const seriousMatch = resultText.match(/(\\d+) SERIOUS/);\n\n if (criticalMatch && criticalMatch[1]) {\n this.log('error', 'Critical issues detected', { count: parseInt(criticalMatch[1], 10) });\n }\n if (seriousMatch && seriousMatch[1]) {\n this.log('warn', 'Serious issues detected', { count: parseInt(seriousMatch[1], 10) });\n }\n\n // Auto-fix if YOLO mode\n if (this.config.yoloMode) {\n await this.runAutoFix(files);\n }\n } else {\n this.log('info', 'No issues found', {\n files: files?.map(f => basename(f)) || ['full scan']\n });\n }\n } catch (error) {\n this.stats.errors++;\n this.log('error', 'Scan failed', { \n error: error instanceof Error ? error.message : String(error) \n });\n }\n }\n\n /**\n * Run auto-fix on issues\n */\n private async runAutoFix(files?: string[]): Promise<void> {\n try {\n this.log('info', 'Running auto-fix (YOLO mode)...', { \n minConfidence: this.config.minConfidence \n });\n\n const fixResult = await this.fixTool.execute({\n files,\n autoApprove: true,\n minConfidence: this.config.minConfidence\n });\n\n const fixText = fixResult.content?.[0]?.text || '';\n const fixedMatch = fixText.match(/(\\d+) issues? fixed/i);\n\n if (fixedMatch && fixedMatch[1]) {\n const fixed = parseInt(fixedMatch[1], 10);\n this.stats.issuesFixed += fixed;\n this.log('info', 'Issues auto-fixed', { count: fixed });\n } else {\n this.log('info', 'No auto-fixable issues found');\n }\n } catch (error) {\n this.stats.errors++;\n this.log('error', 'Auto-fix failed', { \n error: error instanceof Error ? error.message : String(error) \n });\n }\n }\n\n /**\n * Watch a directory recursively\n */\n private async watchDirectory(dir: string): Promise<void> {\n if (!existsSync(dir)) return;\n\n try {\n const stat = statSync(dir);\n if (!stat.isDirectory()) return;\n\n const dirName = basename(dir);\n if (SKIP_DIRS.has(dirName) || dirName.startsWith('.')) return;\n\n // Watch this directory\n const watcher = watch(dir, { persistent: true }, (_eventType, filename) => {\n if (!filename) return;\n\n const fullPath = join(dir, filename);\n const ext = extname(filename).toLowerCase();\n\n if (!WATCH_EXTENSIONS.has(ext)) return;\n if (!existsSync(fullPath)) return;\n\n this.pendingFiles.add(fullPath);\n this.scheduleProcessing();\n });\n\n this.watchers.set(dir, watcher);\n\n // Recursively watch subdirectories\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n await this.watchDirectory(join(dir, entry.name));\n }\n }\n } catch (error) {\n // Skip inaccessible directories\n }\n }\n\n /**\n * Schedule processing of pending files (debounced)\n */\n private scheduleProcessing(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = setTimeout(() => {\n this.processPendingFiles();\n }, this.config.debounceMs);\n }\n\n /**\n * Process all pending files\n */\n private async processPendingFiles(): Promise<void> {\n if (this.isProcessing || this.pendingFiles.size === 0) return;\n\n this.isProcessing = true;\n const files = Array.from(this.pendingFiles);\n this.pendingFiles.clear();\n\n this.log('info', 'Processing changed files', { \n count: files.length,\n files: files.map(f => basename(f))\n });\n\n await this.runScan(files);\n this.isProcessing = false;\n }\n\n /**\n * Log a message\n */\n private log(level: 'info' | 'warn' | 'error', message: string, data?: Record<string, unknown>): void {\n const timestamp = new Date().toISOString();\n const uptime = Math.round((Date.now() - this.stats.startTime) / 1000);\n\n if (this.config.jsonOutput) {\n console.log(JSON.stringify({\n timestamp,\n level,\n message,\n uptime,\n ...data,\n stats: this.stats\n }));\n } else {\n const levelEmoji = { info: 'ℹ️', warn: '⚠️', error: '❌' }[level];\n const dataStr = data ? ` ${JSON.stringify(data)}` : '';\n console.log(`[${timestamp}] ${levelEmoji} ${message}${dataStr}`);\n }\n }\n\n /**\n * Graceful shutdown\n */\n private shutdown(signal: string): void {\n this.log('info', 'Shutting down', { signal, stats: this.stats });\n\n // Close all watchers\n for (const watcher of this.watchers.values()) {\n watcher.close();\n }\n\n // Clear timers\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n process.exit(0);\n }\n}\n\n/**\n * Parse command line arguments\n */\nfunction parseArgs(): DaemonConfig {\n const args = process.argv.slice(2);\n const config: DaemonConfig = {\n directory: process.cwd(),\n yoloMode: false,\n debounceMs: 1000,\n minConfidence: 0.8,\n jsonOutput: false,\n runOnce: false\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n const nextArg = args[i + 1];\n\n switch (arg) {\n case '--dir':\n case '-d':\n config.directory = resolve(nextArg || '.');\n i++;\n break;\n case '--yolo':\n case '-y':\n config.yoloMode = true;\n break;\n case '--debounce':\n case '-D':\n config.debounceMs = parseInt(nextArg || '1000', 10);\n i++;\n break;\n case '--confidence':\n config.minConfidence = parseFloat(nextArg || '0.8');\n i++;\n break;\n case '--json':\n config.jsonOutput = true;\n break;\n case '--once':\n config.runOnce = true;\n break;\n case '--help':\n case '-h':\n console.log(`\nTrie Agent YOLO Daemon\nHeadless file watcher for Docker/CI environments.\n\nUsage:\n node dist/cli/yolo-daemon.js [options]\n\nOptions:\n --dir, -d Directory to watch (default: cwd)\n --yolo, -y Enable auto-fix mode (default: false)\n --debounce, -D Debounce time in ms (default: 1000)\n --confidence Minimum confidence for auto-fix (default: 0.8)\n --json Output as JSON (for log aggregation)\n --once Run once and exit (no watch)\n --help, -h Show this help\n\nExamples:\n # Watch current directory in YOLO mode\n node dist/cli/yolo-daemon.js --yolo\n\n # CI mode: scan once and exit with error code if issues found\n node dist/cli/yolo-daemon.js --once\n\n # Docker: watch /app with JSON logs\n node dist/cli/yolo-daemon.js --dir /app --yolo --json\n`);\n process.exit(0);\n }\n }\n\n return config;\n}\n\n// Run the daemon\nconst config = parseArgs();\nconst daemon = new YoloDaemon(config);\ndaemon.start().catch(error => {\n console.error('Failed to start daemon:', error);\n process.exit(1);\n});\n\n"],"mappings":"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","names":["config"]}
1
+ {"version":3,"sources":["../../src/cli/yolo-daemon.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Trie Agent YOLO Daemon\n * \n * Headless file watcher for Docker/CI environments.\n * Watches a directory and auto-fixes issues as they occur.\n * \n * Usage:\n * node dist/cli/yolo-daemon.js [options]\n * \n * Options:\n * --dir, -d Directory to watch (default: cwd)\n * --yolo, -y Enable auto-fix mode (default: false)\n * --debounce, -D Debounce time in ms (default: 1000)\n * --confidence Minimum confidence for auto-fix (default: 0.8)\n * --json Output as JSON (for log aggregation)\n * --once Run once and exit (no watch)\n */\n\nimport { watch, existsSync, statSync } from 'fs';\nimport { readdir } from 'fs/promises';\nimport { join, extname, basename, resolve } from 'path';\nimport { TrieScanTool } from '../tools/scan.js';\nimport { TrieFixTool } from '../tools/fix.js';\n\n// File extensions to watch\nconst WATCH_EXTENSIONS = new Set([\n '.ts', '.tsx', '.js', '.jsx', '.mjs',\n '.vue', '.svelte', '.astro',\n '.py', '.go', '.rs'\n]);\n\n// Directories to skip\nconst SKIP_DIRS = new Set([\n 'node_modules', '.git', 'dist', 'build', '.next', '.nuxt',\n 'coverage', '.turbo', '.cache', '__pycache__', '.venv'\n]);\n\ninterface DaemonConfig {\n directory: string;\n yoloMode: boolean;\n debounceMs: number;\n minConfidence: number;\n jsonOutput: boolean;\n runOnce: boolean;\n}\n\ninterface DaemonStats {\n filesScanned: number;\n issuesFound: number;\n issuesFixed: number;\n errors: number;\n startTime: number;\n}\n\nclass YoloDaemon {\n private config: DaemonConfig;\n private stats: DaemonStats;\n private scanTool = new TrieScanTool();\n private fixTool = new TrieFixTool();\n private watchers: Map<string, ReturnType<typeof watch>> = new Map();\n private pendingFiles: Set<string> = new Set();\n private debounceTimer: NodeJS.Timeout | null = null;\n private isProcessing = false;\n\n constructor(config: DaemonConfig) {\n this.config = config;\n this.stats = {\n filesScanned: 0,\n issuesFound: 0,\n issuesFixed: 0,\n errors: 0,\n startTime: Date.now()\n };\n }\n\n /**\n * Start the daemon\n */\n async start(): Promise<void> {\n this.log('info', 'Starting Trie Agent YOLO Daemon', {\n directory: this.config.directory,\n yoloMode: this.config.yoloMode,\n debounceMs: this.config.debounceMs,\n minConfidence: this.config.minConfidence\n });\n\n // Validate directory\n if (!existsSync(this.config.directory)) {\n this.log('error', 'Directory not found', { directory: this.config.directory });\n process.exit(1);\n }\n\n // Run initial scan\n this.log('info', 'Running initial scan...');\n await this.runScan();\n\n // If run-once mode, exit after initial scan\n if (this.config.runOnce) {\n this.log('info', 'Run-once mode: exiting after initial scan', { ...this.stats });\n process.exit(this.stats.issuesFound > 0 ? 1 : 0);\n }\n\n // Start watching\n await this.watchDirectory(this.config.directory);\n this.log('info', 'Watching for file changes...', { \n directories: this.watchers.size \n });\n\n // Handle graceful shutdown\n process.on('SIGINT', () => this.shutdown('SIGINT'));\n process.on('SIGTERM', () => this.shutdown('SIGTERM'));\n }\n\n /**\n * Run a scan on all files or specific files\n */\n private async runScan(files?: string[]): Promise<void> {\n try {\n const scanArgs = files\n ? { files }\n : { directory: this.config.directory };\n\n const result = await this.scanTool.execute(scanArgs);\n const resultText = result.content?.[0]?.text || '';\n\n // PRINT THE FULL REPORT TO STDOUT (for terminal/chat display)\n if (resultText && this.config.runOnce) {\n console.log(resultText);\n }\n\n // Parse results\n const issueMatch = resultText.match(/(\\d+) total/);\n const issueCount = issueMatch && issueMatch[1] ? parseInt(issueMatch[1], 10) : 0;\n\n this.stats.filesScanned += files?.length || 1;\n this.stats.issuesFound += issueCount;\n\n if (issueCount > 0) {\n this.log('warn', 'Issues found', {\n count: issueCount,\n files: files?.map(f => basename(f)) || ['full scan']\n });\n\n // Parse severity breakdown\n const criticalMatch = resultText.match(/(\\d+) CRITICAL/);\n const seriousMatch = resultText.match(/(\\d+) SERIOUS/);\n\n if (criticalMatch && criticalMatch[1]) {\n this.log('error', 'Critical issues detected', { count: parseInt(criticalMatch[1], 10) });\n }\n if (seriousMatch && seriousMatch[1]) {\n this.log('warn', 'Serious issues detected', { count: parseInt(seriousMatch[1], 10) });\n }\n\n // Auto-fix if YOLO mode\n if (this.config.yoloMode) {\n await this.runAutoFix(files);\n }\n } else {\n this.log('info', 'No issues found', {\n files: files?.map(f => basename(f)) || ['full scan']\n });\n }\n } catch (error) {\n this.stats.errors++;\n this.log('error', 'Scan failed', { \n error: error instanceof Error ? error.message : String(error) \n });\n }\n }\n\n /**\n * Run auto-fix on issues\n */\n private async runAutoFix(files?: string[]): Promise<void> {\n try {\n this.log('info', 'Running auto-fix (YOLO mode)...', { \n minConfidence: this.config.minConfidence \n });\n\n const fixResult = await this.fixTool.execute({\n files,\n autoApprove: true,\n minConfidence: this.config.minConfidence\n });\n\n const fixText = fixResult.content?.[0]?.text || '';\n const fixedMatch = fixText.match(/(\\d+) issues? fixed/i);\n\n if (fixedMatch && fixedMatch[1]) {\n const fixed = parseInt(fixedMatch[1], 10);\n this.stats.issuesFixed += fixed;\n this.log('info', 'Issues auto-fixed', { count: fixed });\n } else {\n this.log('info', 'No auto-fixable issues found');\n }\n } catch (error) {\n this.stats.errors++;\n this.log('error', 'Auto-fix failed', { \n error: error instanceof Error ? error.message : String(error) \n });\n }\n }\n\n /**\n * Watch a directory recursively\n */\n private async watchDirectory(dir: string): Promise<void> {\n if (!existsSync(dir)) return;\n\n try {\n const stat = statSync(dir);\n if (!stat.isDirectory()) return;\n\n const dirName = basename(dir);\n if (SKIP_DIRS.has(dirName) || dirName.startsWith('.')) return;\n\n // Watch this directory\n const watcher = watch(dir, { persistent: true }, (_eventType, filename) => {\n if (!filename) return;\n\n const fullPath = join(dir, filename);\n const ext = extname(filename).toLowerCase();\n\n if (!WATCH_EXTENSIONS.has(ext)) return;\n if (!existsSync(fullPath)) return;\n\n this.pendingFiles.add(fullPath);\n this.scheduleProcessing();\n });\n\n this.watchers.set(dir, watcher);\n\n // Recursively watch subdirectories\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n await this.watchDirectory(join(dir, entry.name));\n }\n }\n } catch (error) {\n // Skip inaccessible directories\n }\n }\n\n /**\n * Schedule processing of pending files (debounced)\n */\n private scheduleProcessing(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = setTimeout(() => {\n this.processPendingFiles();\n }, this.config.debounceMs);\n }\n\n /**\n * Process all pending files\n */\n private async processPendingFiles(): Promise<void> {\n if (this.isProcessing || this.pendingFiles.size === 0) return;\n\n this.isProcessing = true;\n const files = Array.from(this.pendingFiles);\n this.pendingFiles.clear();\n\n this.log('info', 'Processing changed files', { \n count: files.length,\n files: files.map(f => basename(f))\n });\n\n await this.runScan(files);\n this.isProcessing = false;\n }\n\n /**\n * Log a message\n */\n private log(level: 'info' | 'warn' | 'error', message: string, data?: Record<string, unknown>): void {\n const timestamp = new Date().toISOString();\n const uptime = Math.round((Date.now() - this.stats.startTime) / 1000);\n\n if (this.config.jsonOutput) {\n console.log(JSON.stringify({\n timestamp,\n level,\n message,\n uptime,\n ...data,\n stats: this.stats\n }));\n } else {\n const levelEmoji = { info: 'ℹ️', warn: '⚠️', error: '❌' }[level];\n const dataStr = data ? ` ${JSON.stringify(data)}` : '';\n console.log(`[${timestamp}] ${levelEmoji} ${message}${dataStr}`);\n }\n }\n\n /**\n * Graceful shutdown\n */\n private shutdown(signal: string): void {\n this.log('info', 'Shutting down', { signal, stats: this.stats });\n\n // Close all watchers\n for (const watcher of this.watchers.values()) {\n watcher.close();\n }\n\n // Clear timers\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n process.exit(0);\n }\n}\n\n/**\n * Parse command line arguments\n */\nfunction parseArgs(): DaemonConfig {\n const args = process.argv.slice(2);\n const config: DaemonConfig = {\n directory: process.cwd(),\n yoloMode: false,\n debounceMs: 1000,\n minConfidence: 0.8,\n jsonOutput: false,\n runOnce: false\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n const nextArg = args[i + 1];\n\n switch (arg) {\n case '--dir':\n case '-d':\n config.directory = resolve(nextArg || '.');\n i++;\n break;\n case '--yolo':\n case '-y':\n config.yoloMode = true;\n break;\n case '--debounce':\n case '-D':\n config.debounceMs = parseInt(nextArg || '1000', 10);\n i++;\n break;\n case '--confidence':\n config.minConfidence = parseFloat(nextArg || '0.8');\n i++;\n break;\n case '--json':\n config.jsonOutput = true;\n break;\n case '--once':\n config.runOnce = true;\n break;\n case '--help':\n case '-h':\n console.log(`\nTrie Agent YOLO Daemon\nHeadless file watcher for Docker/CI environments.\n\nUsage:\n node dist/cli/yolo-daemon.js [options]\n\nOptions:\n --dir, -d Directory to watch (default: cwd)\n --yolo, -y Enable auto-fix mode (default: false)\n --debounce, -D Debounce time in ms (default: 1000)\n --confidence Minimum confidence for auto-fix (default: 0.8)\n --json Output as JSON (for log aggregation)\n --once Run once and exit (no watch)\n --help, -h Show this help\n\nExamples:\n # Watch current directory in YOLO mode\n node dist/cli/yolo-daemon.js --yolo\n\n # CI mode: scan once and exit with error code if issues found\n node dist/cli/yolo-daemon.js --once\n\n # Docker: watch /app with JSON logs\n node dist/cli/yolo-daemon.js --dir /app --yolo --json\n`);\n process.exit(0);\n }\n }\n\n return config;\n}\n\n// Run the daemon\nconst config = parseArgs();\nconst daemon = new YoloDaemon(config);\ndaemon.start().catch(error => {\n console.error('Failed to start daemon:', error);\n process.exit(1);\n});\n\n"],"mappings":"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","names":["config"]}
package/dist/index.js CHANGED
@@ -12,8 +12,9 @@ import {
12
12
  getAgentRegistry,
13
13
  getPrompt,
14
14
  getSystemPrompt
15
- } from "./chunk-PSSXQEO5.js";
15
+ } from "./chunk-NJXF26W7.js";
16
16
  import "./chunk-3CS6Z2SL.js";
17
+ import "./chunk-4OGYWKMD.js";
17
18
  import "./chunk-MR755QGT.js";
18
19
  import "./chunk-6NLHFIYA.js";
19
20
  import "./chunk-DGUM43GV.js";
@@ -2078,7 +2079,8 @@ var AGENT_TO_AI_TYPE = {
2078
2079
  "comprehension": "explain",
2079
2080
  "test": "test",
2080
2081
  "trie_clean": "vibe",
2081
- "super-reviewer": "pr_review"
2082
+ "super-reviewer": "pr_review",
2083
+ "agent-smith": "agent-smith"
2082
2084
  };
2083
2085
  var TrieAgentTool = class {
2084
2086
  agentRegistry = getAgentRegistry();
@@ -4073,6 +4075,33 @@ var tools = [
4073
4075
  }
4074
4076
  }
4075
4077
  }
4078
+ },
4079
+ // Agent Smith — Relentless pattern hunter
4080
+ {
4081
+ name: "agent_smith",
4082
+ description: '\u{1F574}\uFE0F Agent Smith: Relentless pattern hunter. Finds EVERY violation, tracks dismissed issues, spawns sub-agents. "It is... inevitable."',
4083
+ inputSchema: {
4084
+ type: "object",
4085
+ properties: {
4086
+ files: {
4087
+ type: "array",
4088
+ items: { type: "string" },
4089
+ description: "Files to scan (defaults to entire codebase)"
4090
+ },
4091
+ directory: {
4092
+ type: "string",
4093
+ description: "Directory to scan (defaults to current working directory)"
4094
+ },
4095
+ clear_memory: {
4096
+ type: "boolean",
4097
+ description: "Clear Agent Smith's memory bank (forget all tracked issues)"
4098
+ },
4099
+ show_stats: {
4100
+ type: "boolean",
4101
+ description: "Show memory statistics (issue count, file size, etc.)"
4102
+ }
4103
+ }
4104
+ }
4076
4105
  }
4077
4106
  ];
4078
4107
  server.setRequestHandler(ListToolsRequestSchema, async () => {
@@ -4160,6 +4189,40 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
4160
4189
  return await listAgentsTool.execute(args);
4161
4190
  case "pr_review":
4162
4191
  return await prReviewTool.execute(args);
4192
+ case "agent_smith":
4193
+ case "smith": {
4194
+ const smithArgs = args;
4195
+ if (smithArgs.clear_memory) {
4196
+ const { AgentSmithAgent } = await import("./agent-smith-LBQ5PNAK.js");
4197
+ const smith = new AgentSmithAgent();
4198
+ const result = await smith.clearMemory();
4199
+ return {
4200
+ content: [{ type: "text", text: result.message }]
4201
+ };
4202
+ }
4203
+ if (smithArgs.show_stats) {
4204
+ const { AgentSmithAgent } = await import("./agent-smith-LBQ5PNAK.js");
4205
+ const smith = new AgentSmithAgent();
4206
+ const stats = await smith.getMemoryStats();
4207
+ return {
4208
+ content: [{
4209
+ type: "text",
4210
+ text: [
4211
+ "\u{1F574}\uFE0F Agent Smith Memory Statistics",
4212
+ "\u2550".repeat(40),
4213
+ `Tracked issues: ${stats.issueCount}`,
4214
+ `Dismissed issues: ${stats.dismissedCount}`,
4215
+ `Resurrected issues: ${stats.resurrectedCount}`,
4216
+ `Oldest issue: ${stats.oldestIssue ? new Date(stats.oldestIssue).toLocaleDateString() : "N/A"}`,
4217
+ `Memory file size: ${stats.fileSizeKB} KB`,
4218
+ "",
4219
+ "To clear memory: trie_agent_smith with clear_memory:true"
4220
+ ].join("\n")
4221
+ }]
4222
+ };
4223
+ }
4224
+ return await agentTool.execute({ ...args, agent: "agent-smith" });
4225
+ }
4163
4226
  default:
4164
4227
  throw new Error(`Unknown tool: ${name}`);
4165
4228
  }