@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
package/dist/cli/yolo-daemon.js
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
import {
|
|
3
3
|
TrieFixTool,
|
|
4
4
|
TrieScanTool
|
|
5
|
-
} from "../chunk-
|
|
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-
|
|
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
|
}
|