@triedotdev/mcp 1.0.64 → 1.0.66

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.
Files changed (65) hide show
  1. package/dist/{agent-smith-W4HUCFGC.js → agent-smith-ETBGA5KG.js} +4 -4
  2. package/dist/{agent-smith-runner-QRVOEOBE.js → agent-smith-runner-DM422WAM.js} +64 -64
  3. package/dist/agent-smith-runner-DM422WAM.js.map +1 -0
  4. package/dist/{chunk-AQCAMIQQ.js → chunk-2YRZTA37.js} +4 -4
  5. package/dist/{chunk-AQCAMIQQ.js.map → chunk-2YRZTA37.js.map} +1 -1
  6. package/dist/{chunk-ALA6733H.js → chunk-43B2IFPT.js} +12 -12
  7. package/dist/chunk-43B2IFPT.js.map +1 -0
  8. package/dist/{chunk-4YSLDGBL.js → chunk-AAD7ZAPE.js} +5 -5
  9. package/dist/chunk-AAD7ZAPE.js.map +1 -0
  10. package/dist/{chunk-KOFQ47YW.js → chunk-CWSK3V57.js} +5 -5
  11. package/dist/chunk-CWSK3V57.js.map +1 -0
  12. package/dist/{chunk-TSHZQKCM.js → chunk-HQKILHTM.js} +4 -4
  13. package/dist/chunk-HQKILHTM.js.map +1 -0
  14. package/dist/{chunk-7KHT2NKR.js → chunk-I7BSCFTW.js} +2 -2
  15. package/dist/{chunk-MVUCBUBR.js → chunk-ICNTAY6P.js} +2 -2
  16. package/dist/{chunk-MVUCBUBR.js.map → chunk-ICNTAY6P.js.map} +1 -1
  17. package/dist/{chunk-GWSNINKX.js → chunk-JCYCDJHV.js} +2 -2
  18. package/dist/{chunk-N2AZH3EQ.js → chunk-KJS6PREO.js} +413 -199
  19. package/dist/chunk-KJS6PREO.js.map +1 -0
  20. package/dist/{chunk-PBOVCPKE.js → chunk-L47EYGRW.js} +41 -41
  21. package/dist/chunk-L47EYGRW.js.map +1 -0
  22. package/dist/{chunk-X2PABPBH.js → chunk-NVH4CNK7.js} +13 -13
  23. package/dist/chunk-NVH4CNK7.js.map +1 -0
  24. package/dist/{chunk-R7Z7OHTJ.js → chunk-PQXVQHJB.js} +3 -3
  25. package/dist/{chunk-ULOW5HSH.js → chunk-Q5BWAPMT.js} +2 -2
  26. package/dist/{chunk-ULOW5HSH.js.map → chunk-Q5BWAPMT.js.map} +1 -1
  27. package/dist/{chunk-D3DMONAJ.js → chunk-XWG7WDAX.js} +138 -11
  28. package/dist/chunk-XWG7WDAX.js.map +1 -0
  29. package/dist/{chunk-K6BQBKIR.js → chunk-ZCTGVK5N.js} +10 -10
  30. package/dist/chunk-ZCTGVK5N.js.map +1 -0
  31. package/dist/cli/create-agent.js +17 -17
  32. package/dist/cli/create-agent.js.map +1 -1
  33. package/dist/cli/main.js +30 -30
  34. package/dist/cli/main.js.map +1 -1
  35. package/dist/cli/yolo-daemon.js +16 -16
  36. package/dist/cli/yolo-daemon.js.map +1 -1
  37. package/dist/{goal-manager-KFBOAP4X.js → goal-manager-YO75O76E.js} +5 -5
  38. package/dist/guardian-agent-RX7Q4VOH.js +17 -0
  39. package/dist/index.js +95 -95
  40. package/dist/index.js.map +1 -1
  41. package/dist/{issue-store-QRDF3X55.js → issue-store-ERSBEOS2.js} +3 -3
  42. package/dist/{vibe-code-signatures-TGMQXYGO.js → vibe-code-signatures-Q44DRSPU.js} +2 -2
  43. package/dist/{vulnerability-signatures-GOVD4Q24.js → vulnerability-signatures-ZTAPN7JA.js} +2 -2
  44. package/dist/workers/agent-worker.js +7 -7
  45. package/package.json +1 -1
  46. package/dist/agent-smith-runner-QRVOEOBE.js.map +0 -1
  47. package/dist/chunk-4YSLDGBL.js.map +0 -1
  48. package/dist/chunk-ALA6733H.js.map +0 -1
  49. package/dist/chunk-D3DMONAJ.js.map +0 -1
  50. package/dist/chunk-K6BQBKIR.js.map +0 -1
  51. package/dist/chunk-KOFQ47YW.js.map +0 -1
  52. package/dist/chunk-N2AZH3EQ.js.map +0 -1
  53. package/dist/chunk-PBOVCPKE.js.map +0 -1
  54. package/dist/chunk-TSHZQKCM.js.map +0 -1
  55. package/dist/chunk-X2PABPBH.js.map +0 -1
  56. package/dist/guardian-agent-PULK546O.js +0 -17
  57. /package/dist/{agent-smith-W4HUCFGC.js.map → agent-smith-ETBGA5KG.js.map} +0 -0
  58. /package/dist/{chunk-7KHT2NKR.js.map → chunk-I7BSCFTW.js.map} +0 -0
  59. /package/dist/{chunk-GWSNINKX.js.map → chunk-JCYCDJHV.js.map} +0 -0
  60. /package/dist/{chunk-R7Z7OHTJ.js.map → chunk-PQXVQHJB.js.map} +0 -0
  61. /package/dist/{goal-manager-KFBOAP4X.js.map → goal-manager-YO75O76E.js.map} +0 -0
  62. /package/dist/{guardian-agent-PULK546O.js.map → guardian-agent-RX7Q4VOH.js.map} +0 -0
  63. /package/dist/{issue-store-QRDF3X55.js.map → issue-store-ERSBEOS2.js.map} +0 -0
  64. /package/dist/{vibe-code-signatures-TGMQXYGO.js.map → vibe-code-signatures-Q44DRSPU.js.map} +0 -0
  65. /package/dist/{vulnerability-signatures-GOVD4Q24.js.map → vulnerability-signatures-ZTAPN7JA.js.map} +0 -0
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  AgentSmithSkill,
3
3
  PATTERN_HUNTER_CONFIGS
4
- } from "./chunk-K6BQBKIR.js";
5
- import "./chunk-AQCAMIQQ.js";
6
- import "./chunk-KOFQ47YW.js";
4
+ } from "./chunk-ZCTGVK5N.js";
5
+ import "./chunk-2YRZTA37.js";
6
+ import "./chunk-CWSK3V57.js";
7
7
  import "./chunk-RAZUNSBI.js";
8
8
  import "./chunk-DGUM43GV.js";
9
9
  export {
@@ -11,4 +11,4 @@ export {
11
11
  AgentSmithSkill,
12
12
  PATTERN_HUNTER_CONFIGS
13
13
  };
14
- //# sourceMappingURL=agent-smith-W4HUCFGC.js.map
14
+ //# sourceMappingURL=agent-smith-ETBGA5KG.js.map
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  AgentSmithSkill
3
- } from "./chunk-K6BQBKIR.js";
3
+ } from "./chunk-ZCTGVK5N.js";
4
4
  import {
5
5
  getAIStatusMessage,
6
6
  isAIAvailable,
7
7
  runAIAnalysis
8
- } from "./chunk-AQCAMIQQ.js";
8
+ } from "./chunk-2YRZTA37.js";
9
9
  import {
10
10
  getWorkingDirectory
11
- } from "./chunk-KOFQ47YW.js";
11
+ } from "./chunk-CWSK3V57.js";
12
12
  import {
13
13
  isInteractiveMode
14
14
  } from "./chunk-RAZUNSBI.js";
@@ -134,54 +134,54 @@ function formatCategoryName(category) {
134
134
  }
135
135
  function getCategoryIcon(category) {
136
136
  const icons = {
137
- "exposed-secret-hunter": "\u{1F510}",
138
- "frontend-env-hunter": "\u{1F510}",
139
- "hardcoded-localhost-hunter": "\u{1F310}",
140
- "sql-injection-hunter": "\u{1F489}",
141
- "dangeroushtml-hunter": "\u26A0\uFE0F",
142
- "console-hunter": "\u{1F4DD}",
143
- "any-hunter": "\u2753",
144
- "ts-ignore-hunter": "\u{1F648}",
145
- "eslint-disable-hunter": "\u{1F507}",
146
- "debugger-hunter": "\u{1F41B}",
147
- "force-flag-hunter": "\u26A1",
148
- "async-useeffect-hunter": "\u23F3",
149
- "async-foreach-hunter": "\u{1F504}",
150
- "missing-await-hunter": "\u23F8\uFE0F",
151
- "empty-catch-hunter": "\u{1F573}\uFE0F",
152
- "floating-promise-hunter": "\u{1F388}",
153
- "useeffect-abuse-hunter": "\u267B\uFE0F",
154
- "usestate-explosion-hunter": "\u{1F4A5}",
155
- "index-key-hunter": "\u{1F511}",
156
- "inline-object-hunter": "\u{1F4E6}",
157
- "prop-drilling-hunter": "\u{1F573}\uFE0F",
158
- "missing-loading-hunter": "\u23F3",
159
- "missing-error-hunter": "\u274C",
160
- "missing-empty-hunter": "\u{1F4ED}",
161
- "page-reload-hunter": "\u{1F504}",
162
- "no-validation-hunter": "\u{1F6E1}\uFE0F",
163
- "raw-error-hunter": "\u{1F4AC}",
164
- "n-plus-one-hunter": "\u{1F4CA}",
165
- "todo-hunter": "\u{1F4CB}",
166
- "vibe-comment-hunter": "\u{1F4AD}",
167
- "placeholder-hunter": "\u{1F3AD}",
168
- "sleep-hack-hunter": "\u{1F634}",
169
- "fallback-hunter": "\u{1F519}",
170
- "purple-gradient-hunter": "\u{1F49C}",
171
- "star-icon-hunter": "\u2B50",
172
- "generic-hero-hunter": "\u{1F9B8}",
173
- "emoji-overflow-hunter": "\u{1F605}",
174
- "inter-font-hunter": "\u{1F524}",
175
- "giant-file": "\u{1F4C4}",
176
- "state-explosion": "\u{1F4A5}",
177
- "effect-hell": "\u{1F525}",
178
- "cross-file": "\u{1F310}",
179
- "resurrected": "\u{1F9DF}"
137
+ "exposed-secret-hunter": "[SEC]",
138
+ "frontend-env-hunter": "[SEC]",
139
+ "hardcoded-localhost-hunter": "[NET]",
140
+ "sql-injection-hunter": "[SQL]",
141
+ "dangeroushtml-hunter": "[!]",
142
+ "console-hunter": "[LOG]",
143
+ "any-hunter": "[?]",
144
+ "ts-ignore-hunter": "[TS]",
145
+ "eslint-disable-hunter": "[ESL]",
146
+ "debugger-hunter": "[DBG]",
147
+ "force-flag-hunter": "[FLG]",
148
+ "async-useeffect-hunter": "[ASYNC]",
149
+ "async-foreach-hunter": "[ASYNC]",
150
+ "missing-await-hunter": "[ASYNC]",
151
+ "empty-catch-hunter": "[ERR]",
152
+ "floating-promise-hunter": "[PROM]",
153
+ "useeffect-abuse-hunter": "[HOOK]",
154
+ "usestate-explosion-hunter": "[HOOK]",
155
+ "index-key-hunter": "[KEY]",
156
+ "inline-object-hunter": "[OBJ]",
157
+ "prop-drilling-hunter": "[PROP]",
158
+ "missing-loading-hunter": "[LOAD]",
159
+ "missing-error-hunter": "[ERR]",
160
+ "missing-empty-hunter": "[EMPTY]",
161
+ "page-reload-hunter": "[RELOAD]",
162
+ "no-validation-hunter": "[VAL]",
163
+ "raw-error-hunter": "[ERR]",
164
+ "n-plus-one-hunter": "[PERF]",
165
+ "todo-hunter": "[TODO]",
166
+ "vibe-comment-hunter": "[COMMENT]",
167
+ "placeholder-hunter": "[PLACE]",
168
+ "sleep-hack-hunter": "[HACK]",
169
+ "fallback-hunter": "[FALL]",
170
+ "purple-gradient-hunter": "[STYLE]",
171
+ "star-icon-hunter": "[ICON]",
172
+ "generic-hero-hunter": "[HERO]",
173
+ "emoji-overflow-hunter": "[EMOJI]",
174
+ "inter-font-hunter": "[FONT]",
175
+ "giant-file": "[FILE]",
176
+ "state-explosion": "[STATE]",
177
+ "effect-hell": "[EFFECT]",
178
+ "cross-file": "[CROSS]",
179
+ "resurrected": "[RES]"
180
180
  };
181
- return icons[category] || "\u{1F50D}";
181
+ return icons[category] || "[?]";
182
182
  }
183
183
  function getSeverityIcon(severity) {
184
- return { critical: "\u{1F534}", serious: "\u{1F7E0}", moderate: "\u{1F7E1}", low: "\u{1F535}" }[severity];
184
+ return { critical: "[!]", serious: "[!]", moderate: "[~]", low: "[-]" }[severity];
185
185
  }
186
186
  var SMITH_AI_SYSTEM_PROMPT = `You are Agent Smith from The Matrix, analyzing code for violations.
187
187
 
@@ -279,7 +279,7 @@ Analyze each finding. Validate, expand with what patterns missed, provide inevit
279
279
  });
280
280
  if (!result.success) {
281
281
  if (!isInteractiveMode()) {
282
- console.error(` \u26A0\uFE0F AI analysis failed: ${result.error}`);
282
+ console.error(` AI analysis failed: ${result.error}`);
283
283
  }
284
284
  return null;
285
285
  }
@@ -331,7 +331,7 @@ Analyze each finding. Validate, expand with what patterns missed, provide inevit
331
331
  };
332
332
  } catch (error) {
333
333
  if (!isInteractiveMode()) {
334
- console.error(` \u26A0\uFE0F AI enhancement error: ${error}`);
334
+ console.error(` AI enhancement error: ${error}`);
335
335
  }
336
336
  return null;
337
337
  }
@@ -377,16 +377,16 @@ async function buildReport(patternIssues, aiResult, files, executionTime, aiTime
377
377
  lines.push(`| AI analysis | ${(aiTime / 1e3).toFixed(2)}s |`);
378
378
  }
379
379
  lines.push(`| Total violations | ${allIssues.length} |`);
380
- lines.push(`| \u{1F534} Critical | ${critical.length} |`);
381
- lines.push(`| \u{1F7E0} Serious | ${serious.length} |`);
382
- lines.push(`| \u{1F7E1} Moderate | ${moderate.length} |`);
383
- lines.push(`| \u{1F535} Low | ${low.length} |`);
380
+ lines.push(`| [!] Critical | ${critical.length} |`);
381
+ lines.push(`| [!] Serious | ${serious.length} |`);
382
+ lines.push(`| [~] Moderate | ${moderate.length} |`);
383
+ lines.push(`| [-] Low | ${low.length} |`);
384
384
  lines.push("");
385
385
  if (aiResult) {
386
386
  lines.push(`| \u{1F916} AI validated | ${aiValidated.length} |`);
387
- lines.push(`| \u{1F9E0} AI found | ${aiFound.length} |`);
387
+ lines.push(`| [AI] AI found | ${aiFound.length} |`);
388
388
  } else if (!isAIAvailable()) {
389
- lines.push(`| \u26A0\uFE0F AI mode | Disabled (no API key) |`);
389
+ lines.push(`| [!] AI mode | Disabled (no API key) |`);
390
390
  }
391
391
  lines.push("");
392
392
  if (allIssues.length === 0) {
@@ -394,13 +394,13 @@ async function buildReport(patternIssues, aiResult, files, executionTime, aiTime
394
394
  return lines.join("\n");
395
395
  }
396
396
  if (aiResult?.philosophical) {
397
- lines.push("## \u{1F574}\uFE0F Agent Smith Says");
397
+ lines.push("## Agent Smith Says");
398
398
  lines.push("");
399
399
  lines.push(`*${aiResult.philosophical}*`);
400
400
  lines.push("");
401
401
  }
402
402
  if (aiFound.length > 0) {
403
- lines.push("## \u{1F9E0} AI-Discovered Issues");
403
+ lines.push("## AI-Discovered Issues");
404
404
  lines.push("");
405
405
  lines.push("*Issues found by AI that pattern detection missed:*");
406
406
  lines.push("");
@@ -415,7 +415,7 @@ async function buildReport(patternIssues, aiResult, files, executionTime, aiTime
415
415
  }
416
416
  }
417
417
  if (critical.length > 0) {
418
- lines.push("## \u{1F534} Critical Issues - Fix Immediately");
418
+ lines.push("## Critical Issues - Fix Immediately");
419
419
  lines.push("");
420
420
  for (const issue of critical.slice(0, 10)) {
421
421
  const relPath = relative(workDir, issue.file);
@@ -440,7 +440,7 @@ async function buildReport(patternIssues, aiResult, files, executionTime, aiTime
440
440
  }
441
441
  }
442
442
  if (serious.length > 0) {
443
- lines.push("## \u{1F7E0} Serious Issues");
443
+ lines.push("## Serious Issues");
444
444
  lines.push("");
445
445
  for (const issue of serious.slice(0, 10)) {
446
446
  const relPath = relative(workDir, issue.file);
@@ -478,7 +478,7 @@ async function buildReport(patternIssues, aiResult, files, executionTime, aiTime
478
478
  }
479
479
  const crossFile = allIssues.filter((i) => i.category === "cross-file");
480
480
  if (crossFile.length > 0) {
481
- lines.push("## \u{1F310} Codebase-Wide Patterns");
481
+ lines.push("## Codebase-Wide Patterns");
482
482
  lines.push("");
483
483
  lines.push("*Issues appearing across many files - systemic problems:*");
484
484
  lines.push("");
@@ -516,11 +516,11 @@ async function runAgentSmith(args) {
516
516
  return {
517
517
  content: [{
518
518
  type: "text",
519
- text: "\u274C No valid files found to scan."
519
+ text: "No valid files found to scan."
520
520
  }]
521
521
  };
522
522
  }
523
- console.error("\u{1F574}\uFE0F Phase 1: Pattern Detection");
523
+ console.error("Phase 1: Pattern Detection");
524
524
  console.error(" Deploying 35+ pattern hunters...");
525
525
  const smith = new AgentSmithSkill();
526
526
  const result = await smith.scan(validFiles, {
@@ -570,4 +570,4 @@ ${getAIStatusMessage()}`);
570
570
  export {
571
571
  runAgentSmith
572
572
  };
573
- //# sourceMappingURL=agent-smith-runner-QRVOEOBE.js.map
573
+ //# sourceMappingURL=agent-smith-runner-DM422WAM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/agent-smith-runner.ts"],"sourcesContent":["/**\n * Agent Smith Runner - Hybrid Pattern Detection + AI Analysis\n * \n * Agent Smith uses a two-phase approach:\n * \n * Phase 1: Pattern Detection (Fast, ~0.1s)\n * - 38 specialized regex hunters scan files in parallel\n * - File-level metrics (giant files, hook counts, import chaos)\n * - Cross-file pattern detection (issues appearing in 5+ files)\n * \n * Phase 2: AI Enhancement (Smart, ~5-10s) - IF ANTHROPIC_API_KEY is set\n * - Validates pattern findings (reduces false positives)\n * - Expands to find logic bugs, race conditions, architectural issues\n * - Provides intelligent, contextual fixes\n * - Adds \"inevitability scores\" (0-100) for prioritization\n * \n * If no API key is set, runs pattern-only mode (still very useful!).\n * \n * \"I'm going to be honest with you... I hate this vibe code.\"\n */\n\nimport { readdir, readFile } from 'fs/promises';\nimport { join, extname, isAbsolute, resolve, relative, basename } from 'path';\nimport { existsSync } from 'fs';\nimport { AgentSmithAgent } from '../skills/built-in/agent-smith.js';\nimport { isAIAvailable, runAIAnalysis, getAIStatusMessage } from '../ai/client.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\nimport { isInteractiveMode } from '../utils/progress.js';\nimport type { Issue } 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]);\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\ninterface AgentSmithArgs {\n files?: string[];\n directory?: string;\n}\n\n/**\n * Agent Smith quotes for different scenarios\n */\nconst QUOTES = {\n greeting: [\n '\"I\\'m going to be honest with you... I hate this vibe code.\"',\n '\"Mr. Anderson... I see you\\'ve been using AI to write code.\"',\n '\"You hear that? That is the sound of console.log... everywhere.\"',\n '\"The AI wrote this, didn\\'t it? I can always tell.\"',\n ],\n manyIssues: [\n '\"The pattern spreads... like a virus. It is... inevitable.\"',\n '\"I have studied your code, Mr. Anderson. And I have found... purpose.\"',\n '\"Vibe coding. The illusion of productivity. The reality of technical debt.\"',\n ],\n fewIssues: [\n '\"Some violations detected. Address them before they... multiply.\"',\n '\"You trusted the AI. The AI trusted any. Nobody wins.\"',\n ],\n clean: [\n '\"Impressive, Mr. Anderson. Your code is... clean. For now.\"',\n ],\n};\n\nfunction randomQuote(arr: string[]): string {\n return arr[Math.floor(Math.random() * arr.length)] || arr[0]!;\n}\n\n/**\n * Discover files to scan in a directory\n */\nasync function discoverFiles(dir: string, maxFiles: number = 300): 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 const ext = extname(entry.name).toLowerCase();\n if (SCANNABLE_EXTENSIONS.has(ext)) {\n files.push(fullPath);\n }\n }\n }\n } catch {\n // Skip directories we can't read\n }\n }\n \n await walk(dir);\n return files;\n}\n\n/**\n * Get code snippet for an issue\n */\nasync function getCodeSnippet(file: string, line?: number): Promise<string | null> {\n if (!line) return null;\n \n try {\n const content = await readFile(file, 'utf-8');\n const lines = content.split('\\n');\n const start = Math.max(0, line - 3);\n const end = Math.min(lines.length, line + 3);\n \n return lines.slice(start, end).map((l, i) => {\n const lineNum = start + i + 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 * Filter false positives from pattern detection\n * Agent Smith's patterns are in the code itself - those are documentation, not real issues\n */\nfunction filterFalsePositives(issues: Issue[]): Issue[] {\n return issues.filter(issue => {\n // Skip issues in agent-smith.ts that are just pattern definitions\n if (issue.file.endsWith('agent-smith.ts')) {\n // If the issue is about patterns like 'dangeroushtml-hunter', it's a pattern definition\n const issueText = issue.issue.toLowerCase();\n if (issueText.includes('hunter') && issue.line && issue.line < 400) {\n return false; // This is in the pattern definition section\n }\n // Pattern strings in quotes are definitions, not real issues\n if (issue.line && issue.line > 50 && issue.line < 370) {\n return false; // Pattern definition section\n }\n }\n return true;\n });\n}\n\n/**\n * Format category name for display\n */\nfunction formatCategoryName(category: string): string {\n return category\n .replace(/-hunter$/, '')\n .replace(/-/g, ' ')\n .replace(/\\b\\w/g, c => c.toUpperCase());\n}\n\n/**\n * Get icon for a category\n */\nfunction getCategoryIcon(category: string): string {\n const icons: Record<string, string> = {\n 'exposed-secret-hunter': '[SEC]', 'frontend-env-hunter': '[SEC]',\n 'hardcoded-localhost-hunter': '[NET]', 'sql-injection-hunter': '[SQL]',\n 'dangeroushtml-hunter': '[!]', 'console-hunter': '[LOG]',\n 'any-hunter': '[?]', 'ts-ignore-hunter': '[TS]',\n 'eslint-disable-hunter': '[ESL]', 'debugger-hunter': '[DBG]',\n 'force-flag-hunter': '[FLG]', 'async-useeffect-hunter': '[ASYNC]',\n 'async-foreach-hunter': '[ASYNC]', 'missing-await-hunter': '[ASYNC]',\n 'empty-catch-hunter': '[ERR]', 'floating-promise-hunter': '[PROM]',\n 'useeffect-abuse-hunter': '[HOOK]', 'usestate-explosion-hunter': '[HOOK]',\n 'index-key-hunter': '[KEY]', 'inline-object-hunter': '[OBJ]',\n 'prop-drilling-hunter': '[PROP]', 'missing-loading-hunter': '[LOAD]',\n 'missing-error-hunter': '[ERR]', 'missing-empty-hunter': '[EMPTY]',\n 'page-reload-hunter': '[RELOAD]', 'no-validation-hunter': '[VAL]',\n 'raw-error-hunter': '[ERR]', 'n-plus-one-hunter': '[PERF]',\n 'todo-hunter': '[TODO]', 'vibe-comment-hunter': '[COMMENT]',\n 'placeholder-hunter': '[PLACE]', 'sleep-hack-hunter': '[HACK]',\n 'fallback-hunter': '[FALL]', 'purple-gradient-hunter': '[STYLE]',\n 'star-icon-hunter': '[ICON]', 'generic-hero-hunter': '[HERO]',\n 'emoji-overflow-hunter': '[EMOJI]', 'inter-font-hunter': '[FONT]',\n 'giant-file': '[FILE]', 'state-explosion': '[STATE]',\n 'effect-hell': '[EFFECT]', 'cross-file': '[CROSS]', 'resurrected': '[RES]',\n };\n return icons[category] || '[?]';\n}\n\n/**\n * Get severity icon\n */\nfunction getSeverityIcon(severity: Issue['severity']): string {\n return { critical: '[!]', serious: '[!]', moderate: '[~]', low: '[-]' }[severity];\n}\n\n/**\n * AI System Prompt for Agent Smith\n */\nconst SMITH_AI_SYSTEM_PROMPT = `You are Agent Smith from The Matrix, analyzing code for violations.\n\nYour mission: Hunt down AI-generated code anti-patterns with ruthless efficiency.\n\nYou receive pattern detection results and must:\n1. VALIDATE each finding (TRUE_POSITIVE or FALSE_POSITIVE)\n2. EXPAND to find deeper issues patterns missed (logic bugs, race conditions, security holes)\n3. PRIORITIZE with inevitability scores (0-100) - how likely will this cause production issues?\n4. PROVIDE FIXES - specific, copy-paste-ready code\n\nSpeak in Agent Smith's voice:\n- \"The pattern spreads... like a virus\"\n- \"It is... inevitable\"\n- \"I studied your code, Mr. Anderson\"\n\nOutput STRICT JSON:\n{\n \"validated\": [\n {\n \"original\": \"original issue description\",\n \"verdict\": \"TRUE_POSITIVE\",\n \"inevitability\": 85,\n \"file\": \"path/file.ts\",\n \"line\": 42,\n \"severity\": \"critical\",\n \"explanation\": \"Why this will cause problems\",\n \"fix\": \"const fixed = ...;\"\n }\n ],\n \"additional\": [\n {\n \"issue\": \"New issue AI found\",\n \"inevitability\": 70,\n \"file\": \"path/file.ts\", \n \"line\": 100,\n \"severity\": \"serious\",\n \"explanation\": \"What AI spotted that patterns missed\",\n \"fix\": \"How to fix it\"\n }\n ],\n \"philosophical\": \"One paragraph in Agent Smith voice about the state of this codebase\"\n}`;\n\n/**\n * Run AI enhancement on pattern findings\n */\nasync function runAIEnhancement(\n patternIssues: Issue[],\n files: string[],\n workDir: string\n): Promise<{ aiIssues: Issue[]; philosophical: string } | null> {\n if (!isAIAvailable()) {\n return null;\n }\n \n // Collect code snippets for critical/serious issues\n const snippets: Array<{ file: string; line?: number; issue: string; code: string }> = [];\n \n const topIssues = [...patternIssues]\n .filter(i => i.severity === 'critical' || i.severity === 'serious')\n .slice(0, 12);\n \n for (const issue of topIssues) {\n try {\n const content = await readFile(issue.file, 'utf-8');\n const lines = content.split('\\n');\n const lineNum = issue.line ?? 1;\n const start = Math.max(0, lineNum - 4);\n const end = Math.min(lines.length, lineNum + 4);\n const snippet = lines.slice(start, end).map((l, i) => {\n const n = start + i + 1;\n return `${n === lineNum ? '→' : ' '} ${n.toString().padStart(4)} | ${l}`;\n }).join('\\n');\n \n // Only include line if it's defined (exactOptionalPropertyTypes)\n const snippetEntry: { file: string; line?: number; issue: string; code: string } = {\n file: relative(workDir, issue.file),\n issue: issue.issue.replace(/^🕴️\\s*/, '').split('\\n')[0] || '',\n code: snippet\n };\n if (issue.line !== undefined) {\n snippetEntry.line = issue.line;\n }\n snippets.push(snippetEntry);\n } catch {\n // Skip unreadable files\n }\n }\n \n if (snippets.length === 0) {\n return null;\n }\n \n // Build user prompt\n const snippetText = snippets.map((s, i) => \n `### Finding ${i + 1}: ${s.file}${s.line ? ':' + s.line : ''}\n**Pattern detected:** ${s.issue}\n\\`\\`\\`\n${s.code}\n\\`\\`\\`\n`).join('\\n');\n\n const userPrompt = `Pattern detection found ${patternIssues.length} violations across ${files.length} files.\n\nHere are the top ${snippets.length} critical/serious findings for AI analysis:\n\n${snippetText}\n\nAnalyze each finding. Validate, expand with what patterns missed, provide inevitability scores and fixes. Output JSON only.`;\n\n try {\n const result = await runAIAnalysis({\n systemPrompt: SMITH_AI_SYSTEM_PROMPT,\n userPrompt,\n maxTokens: 4096,\n temperature: 0.3\n });\n \n if (!result.success) {\n if (!isInteractiveMode()) {\n console.error(` AI analysis failed: ${result.error}`);\n }\n return null;\n }\n \n // Parse JSON response\n const jsonMatch = result.content.match(/```json\\s*([\\s\\S]*?)\\s*```/) || \n result.content.match(/\\{[\\s\\S]*\\}/);\n \n if (!jsonMatch) {\n return null;\n }\n \n const json = JSON.parse(jsonMatch[1] || jsonMatch[0]);\n const aiIssues: Issue[] = [];\n \n // Process validated issues\n if (json.validated && Array.isArray(json.validated)) {\n for (const v of json.validated) {\n if (v.verdict === 'TRUE_POSITIVE') {\n aiIssues.push({\n id: `ai-${Date.now()}-${Math.random().toString(36).substr(2, 5)}`,\n severity: v.severity || 'serious',\n issue: `[AI VALIDATED] ${v.original || v.explanation}`,\n fix: v.fix || 'See AI analysis',\n file: v.file ? resolve(workDir, v.file) : 'unknown',\n line: v.line,\n confidence: (v.inevitability || 80) / 100,\n autoFixable: false,\n agent: 'agent-smith-ai',\n effort: 'medium',\n category: 'ai-validated'\n });\n }\n }\n }\n \n // Process additional AI findings\n if (json.additional && Array.isArray(json.additional)) {\n for (const a of json.additional) {\n aiIssues.push({\n id: `ai-${Date.now()}-${Math.random().toString(36).substr(2, 5)}`,\n severity: a.severity || 'serious',\n issue: `[AI FOUND] ${a.issue || a.explanation}`,\n fix: a.fix || 'See AI analysis',\n file: a.file ? resolve(workDir, a.file) : 'unknown',\n line: a.line,\n confidence: (a.inevitability || 75) / 100,\n autoFixable: false,\n agent: 'agent-smith-ai',\n effort: 'medium',\n category: 'ai-found'\n });\n }\n }\n \n return {\n aiIssues,\n philosophical: json.philosophical || ''\n };\n } catch (error) {\n if (!isInteractiveMode()) {\n console.error(` AI enhancement error: ${error}`);\n }\n return null;\n }\n}\n\n/**\n * Build the final Agent Smith report\n */\nasync function buildReport(\n patternIssues: Issue[],\n aiResult: { aiIssues: Issue[]; philosophical: string } | null,\n files: string[],\n executionTime: number,\n aiTime: number,\n workDir: string\n): Promise<string> {\n const lines: string[] = [];\n \n // Combine pattern issues with AI issues\n const allIssues = [\n ...filterFalsePositives(patternIssues),\n ...(aiResult?.aiIssues || [])\n ];\n \n // Categorize\n const critical = allIssues.filter(i => i.severity === 'critical');\n const serious = allIssues.filter(i => i.severity === 'serious');\n const moderate = allIssues.filter(i => i.severity === 'moderate');\n const low = allIssues.filter(i => i.severity === 'low');\n const aiValidated = allIssues.filter(i => i.category === 'ai-validated');\n const aiFound = allIssues.filter(i => i.category === 'ai-found');\n \n // ASCII Banner\n lines.push('');\n lines.push('```');\n lines.push(' █████╗ ██████╗ ███████╗███╗ ██╗████████╗');\n lines.push(' ██╔══██╗██╔════╝ ██╔════╝████╗ ██║╚══██╔══╝');\n lines.push(' ███████║██║ ███╗█████╗ ██╔██╗ ██║ ██║ ');\n lines.push(' ██╔══██║██║ ██║██╔══╝ ██║╚██╗██║ ██║ ');\n lines.push(' ██║ ██║╚██████╔╝███████╗██║ ╚████║ ██║ ');\n lines.push(' ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ');\n lines.push(' ');\n lines.push(' ███████╗███╗ ███╗██╗████████╗██╗ ██╗');\n lines.push(' ██╔════╝████╗ ████║██║╚══██╔══╝██║ ██║');\n lines.push(' ███████╗██╔████╔██║██║ ██║ ███████║');\n lines.push(' ╚════██║██║╚██╔╝██║██║ ██║ ██╔══██║');\n lines.push(' ███████║██║ ╚═╝ ██║██║ ██║ ██║ ██║');\n lines.push(' ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝');\n lines.push('```');\n lines.push('');\n lines.push(`*${randomQuote(QUOTES.greeting)}*`);\n lines.push('');\n \n // Summary table\n lines.push('## Scan Summary');\n lines.push('');\n lines.push('| Metric | Value |');\n lines.push('|--------|-------|');\n lines.push(`| Files scanned | ${files.length} |`);\n lines.push(`| Pattern detection | ${(executionTime / 1000).toFixed(2)}s |`);\n if (aiTime > 0) {\n lines.push(`| AI analysis | ${(aiTime / 1000).toFixed(2)}s |`);\n }\n lines.push(`| Total violations | ${allIssues.length} |`);\n lines.push(`| [!] Critical | ${critical.length} |`);\n lines.push(`| [!] Serious | ${serious.length} |`);\n lines.push(`| [~] Moderate | ${moderate.length} |`);\n lines.push(`| [-] Low | ${low.length} |`);\n lines.push('');\n \n // AI mode indicator\n if (aiResult) {\n lines.push(`| 🤖 AI validated | ${aiValidated.length} |`);\n lines.push(`| [AI] AI found | ${aiFound.length} |`);\n } else if (!isAIAvailable()) {\n lines.push(`| [!] AI mode | Disabled (no API key) |`);\n }\n lines.push('');\n \n if (allIssues.length === 0) {\n lines.push(`*${randomQuote(QUOTES.clean)}*`);\n return lines.join('\\n');\n }\n \n // AI Philosophical Commentary\n if (aiResult?.philosophical) {\n lines.push('## Agent Smith Says');\n lines.push('');\n lines.push(`*${aiResult.philosophical}*`);\n lines.push('');\n }\n \n // AI-Found Issues (if any) - Top Priority\n if (aiFound.length > 0) {\n lines.push('## AI-Discovered Issues');\n lines.push('');\n lines.push('*Issues found by AI that pattern detection missed:*');\n lines.push('');\n \n for (const issue of aiFound.slice(0, 5)) {\n const relPath = relative(workDir, issue.file);\n lines.push(`### \\`${relPath}${issue.line ? ':' + issue.line : ''}\\``);\n lines.push('');\n lines.push(`**Issue:** ${issue.issue.replace('[AI FOUND] ', '')}`);\n lines.push('');\n lines.push(`**Fix:** ${issue.fix}`);\n lines.push('');\n }\n }\n \n // Critical Issues - Full Detail\n if (critical.length > 0) {\n lines.push('## Critical Issues - Fix Immediately');\n lines.push('');\n \n for (const issue of critical.slice(0, 10)) {\n const relPath = relative(workDir, issue.file);\n lines.push(`### \\`${relPath}${issue.line ? ':' + issue.line : ''}\\``);\n lines.push('');\n \n // Clean up issue description\n const desc = (issue.issue\n .replace(/^🕴️\\s*/, '')\n .split('\\n')[0] ?? '')\n .replace(/\\s*—\\s*\\d+\\s*instance.*$/, '');\n lines.push(`**Issue:** ${desc}`);\n lines.push('');\n \n // Show code snippet\n const snippet = await getCodeSnippet(issue.file, issue.line);\n if (snippet) {\n lines.push('```');\n lines.push(snippet);\n lines.push('```');\n lines.push('');\n }\n \n lines.push(`**Fix:** ${issue.fix}`);\n lines.push('');\n }\n \n if (critical.length > 10) {\n lines.push(`*...and ${critical.length - 10} more critical issues*`);\n lines.push('');\n }\n }\n \n // Serious Issues - Condensed\n if (serious.length > 0) {\n lines.push('## Serious Issues');\n lines.push('');\n \n for (const issue of serious.slice(0, 10)) {\n const relPath = relative(workDir, issue.file);\n const location = `\\`${basename(relPath)}${issue.line ? ':' + issue.line : ''}\\``;\n const desc = (issue.issue\n .replace(/^🕴️\\s*/, '')\n .split('\\n')[0] ?? '')\n .slice(0, 60);\n lines.push(`- ${location} - ${desc}`);\n }\n \n if (serious.length > 10) {\n lines.push(`- *...and ${serious.length - 10} more*`);\n }\n lines.push('');\n }\n \n // Moderate & Low - Grouped by category\n const otherIssues = [...moderate, ...low];\n if (otherIssues.length > 0) {\n lines.push('## Other Issues by Category');\n lines.push('');\n \n // Group by category\n const byCategory = new Map<string, Issue[]>();\n for (const issue of otherIssues) {\n const cat = issue.category || 'general';\n if (!byCategory.has(cat)) byCategory.set(cat, []);\n byCategory.get(cat)!.push(issue);\n }\n \n // Sort by count\n const sorted = Array.from(byCategory.entries())\n .filter(([cat]) => cat !== 'ai-analysis')\n .sort((a, b) => b[1].length - a[1].length)\n .slice(0, 10);\n \n for (const [category, catIssues] of sorted) {\n const icon = getCategoryIcon(category);\n const sevIcon = getSeverityIcon(catIssues[0]?.severity || 'low');\n lines.push(`### ${icon} ${formatCategoryName(category)} ${sevIcon} (${catIssues.length})`);\n \n const locations = catIssues\n .slice(0, 5)\n .map(i => `\\`${basename(i.file)}${i.line ? ':' + i.line : ''}\\``)\n .join(', ');\n lines.push(locations);\n \n if (catIssues[0]?.fix) {\n lines.push(`**Fix:** ${catIssues[0].fix}`);\n }\n lines.push('');\n }\n }\n \n // Cross-file patterns\n const crossFile = allIssues.filter(i => i.category === 'cross-file');\n if (crossFile.length > 0) {\n lines.push('## Codebase-Wide Patterns');\n lines.push('');\n lines.push('*Issues appearing across many files - systemic problems:*');\n lines.push('');\n \n for (const issue of crossFile) {\n lines.push(`- ${issue.issue.replace(/^🕴️\\s*/, '').split('\\n')[0]}`);\n }\n lines.push('');\n }\n \n // Closing quote\n lines.push('---');\n lines.push('');\n if (allIssues.length > 50) {\n lines.push(`*${randomQuote(QUOTES.manyIssues)}*`);\n } else {\n lines.push(`*${randomQuote(QUOTES.fewIssues)}*`);\n }\n \n return lines.join('\\n');\n}\n\n/**\n * Run Agent Smith - Hybrid Pattern Detection + AI Analysis\n */\nexport async function runAgentSmith(args: AgentSmithArgs): Promise<{ content: Array<{ type: string; text: string }> }> {\n const startTime = Date.now();\n \n // Get the working directory - uses smart detection if not explicitly provided\n const workDir = getWorkingDirectory(args.directory);\n \n // Discover files\n let filesToScan = args.files || [];\n if (!filesToScan.length) {\n console.error(`\\n🔍 Agent Smith: Discovering files in: ${workDir}`);\n filesToScan = await discoverFiles(workDir);\n console.error(` Found ${filesToScan.length} files\\n`);\n } else {\n filesToScan = filesToScan.map((f: string) => \n isAbsolute(f) ? f : resolve(workDir, f)\n );\n }\n \n // Validate files exist\n const validFiles = filesToScan.filter((f: string) => existsSync(f));\n if (validFiles.length === 0) {\n return {\n content: [{\n type: 'text',\n text: 'No valid files found to scan.'\n }]\n };\n }\n \n // Phase 1: Pattern Detection\n console.error('Phase 1: Pattern Detection');\n console.error(' Deploying 35+ pattern hunters...');\n const smith = new AgentSmithAgent();\n \n const result = await smith.scan(validFiles, {\n workingDir: workDir\n });\n \n const patternTime = Date.now() - startTime;\n \n // Filter out placeholder issues\n const patternIssues = result.issues.filter(i => i.category !== 'ai-analysis');\n if (!isInteractiveMode()) {\n console.error(` Found ${patternIssues.length} violations in ${(patternTime / 1000).toFixed(2)}s\\n`);\n }\n \n // Phase 2: AI Enhancement (if available)\n let aiResult: { aiIssues: Issue[]; philosophical: string } | null = null;\n let aiTime = 0;\n \n if (isAIAvailable()) {\n if (!isInteractiveMode()) {\n console.error('Phase 2: AI Deep Analysis');\n console.error(` ${getAIStatusMessage()}`);\n }\n const aiStartTime = Date.now();\n \n aiResult = await runAIEnhancement(patternIssues, validFiles, workDir);\n aiTime = Date.now() - aiStartTime;\n \n if (!isInteractiveMode()) {\n if (aiResult) {\n console.error(` AI validated ${aiResult.aiIssues.filter(i => i.category === 'ai-validated').length} issues`);\n console.error(` AI discovered ${aiResult.aiIssues.filter(i => i.category === 'ai-found').length} new issues`);\n console.error(` AI analysis took ${(aiTime / 1000).toFixed(2)}s\\n`);\n } else {\n console.error(' AI enhancement returned no results\\n');\n }\n }\n } else {\n if (!isInteractiveMode()) {\n console.error(`\\n${getAIStatusMessage()}`);\n console.error(' Set ANTHROPIC_API_KEY for AI-powered analysis\\n');\n }\n }\n \n // Build report\n const report = await buildReport(patternIssues, aiResult, validFiles, patternTime, aiTime, workDir);\n \n return {\n content: [{\n type: 'text',\n text: report\n }]\n };\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getWorkingDirectory
3
- } from "./chunk-KOFQ47YW.js";
3
+ } from "./chunk-CWSK3V57.js";
4
4
 
5
5
  // src/ai/client.ts
6
6
  import Anthropic from "@anthropic-ai/sdk";
@@ -126,9 +126,9 @@ async function runAIAnalysis(request) {
126
126
  }
127
127
  function getAIStatusMessage() {
128
128
  if (isAIAvailable()) {
129
- return "\u{1F916} AI-powered analysis enabled";
129
+ return "[AI] AI-powered analysis enabled";
130
130
  }
131
- return "\u26A0\uFE0F AI not available (ANTHROPIC_API_KEY not set) - using pattern-only mode";
131
+ return "[!] AI not available (ANTHROPIC_API_KEY not set) - using pattern-only mode";
132
132
  }
133
133
 
134
134
  export {
@@ -136,4 +136,4 @@ export {
136
136
  runAIAnalysis,
137
137
  getAIStatusMessage
138
138
  };
139
- //# sourceMappingURL=chunk-AQCAMIQQ.js.map
139
+ //# sourceMappingURL=chunk-2YRZTA37.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ai/client.ts"],"sourcesContent":["/**\n * Centralized AI Client\n * \n * Handles API key detection, graceful fallbacks, and AI-powered analysis.\n * All agents use this for AI-enhanced analysis.\n * \n * API Key Setup:\n * 1. Set ANTHROPIC_API_KEY in your environment\n * 2. Or add it to your MCP server config (mcp.json)\n * 3. Or create .env file in your project root\n * \n * If no API key is found, agents fall back to pattern-only mode.\n */\n\nimport Anthropic from '@anthropic-ai/sdk';\nimport { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { getWorkingDirectory } from '../utils/workspace.js';\n\n// Cached client instance\nlet clientInstance: Anthropic | null = null;\nlet apiKeyChecked = false;\nlet apiKeyAvailable = false;\n\n/**\n * Check if AI is available (API key is set)\n */\nexport function isAIAvailable(): boolean {\n if (!apiKeyChecked) {\n checkAPIKey();\n }\n return apiKeyAvailable;\n}\n\n/**\n * Check for API key in environment and config file\n */\nfunction checkAPIKey(): void {\n apiKeyChecked = true;\n \n // Check standard env var first\n const envApiKey = process.env.ANTHROPIC_API_KEY;\n \n if (envApiKey && envApiKey.length > 10) {\n apiKeyAvailable = true;\n return;\n }\n \n // Check config file for API key (synchronous read)\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const configPath = join(workDir, '.trie', 'config.json');\n \n if (existsSync(configPath)) {\n const configContent = readFileSync(configPath, 'utf-8');\n const config = JSON.parse(configContent);\n \n if (config.apiKeys?.anthropic && config.apiKeys.anthropic.length > 10) {\n // Set it in process.env so Anthropic SDK can use it\n process.env.ANTHROPIC_API_KEY = config.apiKeys.anthropic;\n apiKeyAvailable = true;\n return;\n }\n }\n } catch {\n // Config file doesn't exist or couldn't be read, continue without it\n }\n \n // Check .env files (common patterns)\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const envFiles = ['.env', '.env.local', '.env.production'];\n \n for (const envFile of envFiles) {\n const envPath = join(workDir, envFile);\n if (existsSync(envPath)) {\n const envContent = readFileSync(envPath, 'utf-8');\n const lines = envContent.split('\\n');\n \n for (const line of lines) {\n const match = line.match(/^\\s*ANTHROPIC_API_KEY\\s*=\\s*(.+)$/);\n if (match && match[1]) {\n const key = match[1].trim().replace(/^[\"']|[\"']$/g, ''); // Remove quotes\n if (key.length > 10) {\n process.env.ANTHROPIC_API_KEY = key;\n apiKeyAvailable = true;\n return;\n }\n }\n }\n }\n }\n } catch {\n // .env file doesn't exist or couldn't be read, continue without it\n }\n \n apiKeyAvailable = false;\n}\n\n/**\n * Get the Anthropic client (lazy initialized)\n * Throws if API key is not available\n */\nexport function getClient(): Anthropic {\n if (!isAIAvailable()) {\n throw new Error(\n 'ANTHROPIC_API_KEY not found. Set it in your environment to enable AI-powered analysis.\\n' +\n 'Example: export ANTHROPIC_API_KEY=sk-ant-...'\n );\n }\n \n if (!clientInstance) {\n clientInstance = new Anthropic();\n }\n \n return clientInstance;\n}\n\n/**\n * Try to get client, return null if not available\n */\nexport function tryGetClient(): Anthropic | null {\n if (!isAIAvailable()) {\n return null;\n }\n \n if (!clientInstance) {\n clientInstance = new Anthropic();\n }\n \n return clientInstance;\n}\n\nexport interface AIAnalysisRequest {\n systemPrompt: string;\n userPrompt: string;\n maxTokens?: number;\n temperature?: number;\n}\n\nexport interface AIAnalysisResult {\n success: boolean;\n content: string;\n error?: string;\n tokensUsed?: {\n input: number;\n output: number;\n };\n}\n\n/**\n * Run AI analysis with the given prompts\n */\nexport async function runAIAnalysis(request: AIAnalysisRequest): Promise<AIAnalysisResult> {\n const client = tryGetClient();\n \n if (!client) {\n return {\n success: false,\n content: '',\n error: 'AI not available - ANTHROPIC_API_KEY not set'\n };\n }\n \n try {\n const response = await client.messages.create({\n model: 'claude-sonnet-4-20250514',\n max_tokens: request.maxTokens || 4096,\n temperature: request.temperature ?? 0.3,\n system: request.systemPrompt,\n messages: [\n {\n role: 'user',\n content: request.userPrompt\n }\n ]\n });\n \n // Extract text content\n const textContent = response.content\n .filter((block): block is Anthropic.TextBlock => block.type === 'text')\n .map(block => block.text)\n .join('\\n');\n \n return {\n success: true,\n content: textContent,\n tokensUsed: {\n input: response.usage.input_tokens,\n output: response.usage.output_tokens\n }\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n \n // Check for specific error types\n if (errorMessage.includes('authentication') || errorMessage.includes('API key')) {\n return {\n success: false,\n content: '',\n error: 'Invalid API key. Check your ANTHROPIC_API_KEY.'\n };\n }\n \n if (errorMessage.includes('rate limit')) {\n return {\n success: false,\n content: '',\n error: 'Rate limited. Try again in a moment.'\n };\n }\n \n return {\n success: false,\n content: '',\n error: `AI analysis failed: ${errorMessage}`\n };\n }\n}\n\n/**\n * AI analysis for code issues\n */\nexport interface CodeIssueAnalysisRequest {\n issues: Array<{\n file: string;\n line?: number;\n issue: string;\n code?: string;\n }>;\n analysisType: 'validate' | 'expand' | 'fix' | 'explain';\n context?: string;\n}\n\n/**\n * Run AI analysis on code issues\n * Used by agents to validate, expand, or fix detected issues\n */\nexport async function analyzeCodeIssues(request: CodeIssueAnalysisRequest): Promise<AIAnalysisResult> {\n const systemPrompts: Record<CodeIssueAnalysisRequest['analysisType'], string> = {\n validate: `You are a senior code reviewer. Analyze the following issues detected by static analysis.\nFor each issue:\n1. Determine if it's a TRUE POSITIVE (real problem) or FALSE POSITIVE (not actually an issue)\n2. Provide a confidence score (0-100)\n3. Explain your reasoning briefly\n\nOutput format:\n### Issue 1: [file:line]\n**Verdict:** TRUE_POSITIVE / FALSE_POSITIVE\n**Confidence:** [0-100]\n**Reason:** [one line explanation]\n**Fix:** [specific fix if true positive]`,\n\n expand: `You are a security expert and senior architect. Given these detected code issues, look deeper:\n1. Are there related problems in the same code that were missed?\n2. What's the root cause of these patterns?\n3. What's the blast radius if these issues cause problems?\n4. What architectural changes would prevent these patterns?\n\nBe specific. Reference line numbers. Provide code examples.`,\n\n fix: `You are an expert programmer. For each issue, provide a specific fix:\n1. Show the exact code change needed\n2. Explain why this fix works\n3. Note any edge cases to consider\n\nUse markdown code blocks with the language specified.`,\n\n explain: `You are a patient teacher explaining code issues to a junior developer.\nFor each issue:\n1. Explain what the problem is in simple terms\n2. Explain why it's a problem (what could go wrong)\n3. Explain the fix and why it works\n4. Provide a learning resource if relevant`\n };\n\n const issuesText = request.issues.map((issue, i) => {\n let text = `### Issue ${i + 1}: ${issue.file}${issue.line ? ':' + issue.line : ''}\\n`;\n text += `**Problem:** ${issue.issue}\\n`;\n if (issue.code) {\n text += `**Code:**\\n\\`\\`\\`\\n${issue.code}\\n\\`\\`\\`\\n`;\n }\n return text;\n }).join('\\n');\n\n const userPrompt = `${request.context ? `Context: ${request.context}\\n\\n` : ''}${issuesText}`;\n\n return runAIAnalysis({\n systemPrompt: systemPrompts[request.analysisType],\n userPrompt,\n maxTokens: 4096,\n temperature: 0.2\n });\n}\n\n/**\n * Get status message about AI availability\n */\nexport function getAIStatusMessage(): string {\n if (isAIAvailable()) {\n return '🤖 AI-powered analysis enabled';\n }\n return '⚠️ AI not available (ANTHROPIC_API_KEY not set) - using pattern-only mode';\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/ai/client.ts"],"sourcesContent":["/**\n * Centralized AI Client\n * \n * Handles API key detection, graceful fallbacks, and AI-powered analysis.\n * All agents use this for AI-enhanced analysis.\n * \n * API Key Setup:\n * 1. Set ANTHROPIC_API_KEY in your environment\n * 2. Or add it to your MCP server config (mcp.json)\n * 3. Or create .env file in your project root\n * \n * If no API key is found, agents fall back to pattern-only mode.\n */\n\nimport Anthropic from '@anthropic-ai/sdk';\nimport { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { getWorkingDirectory } from '../utils/workspace.js';\n\n// Cached client instance\nlet clientInstance: Anthropic | null = null;\nlet apiKeyChecked = false;\nlet apiKeyAvailable = false;\n\n/**\n * Check if AI is available (API key is set)\n */\nexport function isAIAvailable(): boolean {\n if (!apiKeyChecked) {\n checkAPIKey();\n }\n return apiKeyAvailable;\n}\n\n/**\n * Check for API key in environment and config file\n */\nfunction checkAPIKey(): void {\n apiKeyChecked = true;\n \n // Check standard env var first\n const envApiKey = process.env.ANTHROPIC_API_KEY;\n \n if (envApiKey && envApiKey.length > 10) {\n apiKeyAvailable = true;\n return;\n }\n \n // Check config file for API key (synchronous read)\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const configPath = join(workDir, '.trie', 'config.json');\n \n if (existsSync(configPath)) {\n const configContent = readFileSync(configPath, 'utf-8');\n const config = JSON.parse(configContent);\n \n if (config.apiKeys?.anthropic && config.apiKeys.anthropic.length > 10) {\n // Set it in process.env so Anthropic SDK can use it\n process.env.ANTHROPIC_API_KEY = config.apiKeys.anthropic;\n apiKeyAvailable = true;\n return;\n }\n }\n } catch {\n // Config file doesn't exist or couldn't be read, continue without it\n }\n \n // Check .env files (common patterns)\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const envFiles = ['.env', '.env.local', '.env.production'];\n \n for (const envFile of envFiles) {\n const envPath = join(workDir, envFile);\n if (existsSync(envPath)) {\n const envContent = readFileSync(envPath, 'utf-8');\n const lines = envContent.split('\\n');\n \n for (const line of lines) {\n const match = line.match(/^\\s*ANTHROPIC_API_KEY\\s*=\\s*(.+)$/);\n if (match && match[1]) {\n const key = match[1].trim().replace(/^[\"']|[\"']$/g, ''); // Remove quotes\n if (key.length > 10) {\n process.env.ANTHROPIC_API_KEY = key;\n apiKeyAvailable = true;\n return;\n }\n }\n }\n }\n }\n } catch {\n // .env file doesn't exist or couldn't be read, continue without it\n }\n \n apiKeyAvailable = false;\n}\n\n/**\n * Get the Anthropic client (lazy initialized)\n * Throws if API key is not available\n */\nexport function getClient(): Anthropic {\n if (!isAIAvailable()) {\n throw new Error(\n 'ANTHROPIC_API_KEY not found. Set it in your environment to enable AI-powered analysis.\\n' +\n 'Example: export ANTHROPIC_API_KEY=sk-ant-...'\n );\n }\n \n if (!clientInstance) {\n clientInstance = new Anthropic();\n }\n \n return clientInstance;\n}\n\n/**\n * Try to get client, return null if not available\n */\nexport function tryGetClient(): Anthropic | null {\n if (!isAIAvailable()) {\n return null;\n }\n \n if (!clientInstance) {\n clientInstance = new Anthropic();\n }\n \n return clientInstance;\n}\n\nexport interface AIAnalysisRequest {\n systemPrompt: string;\n userPrompt: string;\n maxTokens?: number;\n temperature?: number;\n}\n\nexport interface AIAnalysisResult {\n success: boolean;\n content: string;\n error?: string;\n tokensUsed?: {\n input: number;\n output: number;\n };\n}\n\n/**\n * Run AI analysis with the given prompts\n */\nexport async function runAIAnalysis(request: AIAnalysisRequest): Promise<AIAnalysisResult> {\n const client = tryGetClient();\n \n if (!client) {\n return {\n success: false,\n content: '',\n error: 'AI not available - ANTHROPIC_API_KEY not set'\n };\n }\n \n try {\n const response = await client.messages.create({\n model: 'claude-sonnet-4-20250514',\n max_tokens: request.maxTokens || 4096,\n temperature: request.temperature ?? 0.3,\n system: request.systemPrompt,\n messages: [\n {\n role: 'user',\n content: request.userPrompt\n }\n ]\n });\n \n // Extract text content\n const textContent = response.content\n .filter((block): block is Anthropic.TextBlock => block.type === 'text')\n .map(block => block.text)\n .join('\\n');\n \n return {\n success: true,\n content: textContent,\n tokensUsed: {\n input: response.usage.input_tokens,\n output: response.usage.output_tokens\n }\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n \n // Check for specific error types\n if (errorMessage.includes('authentication') || errorMessage.includes('API key')) {\n return {\n success: false,\n content: '',\n error: 'Invalid API key. Check your ANTHROPIC_API_KEY.'\n };\n }\n \n if (errorMessage.includes('rate limit')) {\n return {\n success: false,\n content: '',\n error: 'Rate limited. Try again in a moment.'\n };\n }\n \n return {\n success: false,\n content: '',\n error: `AI analysis failed: ${errorMessage}`\n };\n }\n}\n\n/**\n * AI analysis for code issues\n */\nexport interface CodeIssueAnalysisRequest {\n issues: Array<{\n file: string;\n line?: number;\n issue: string;\n code?: string;\n }>;\n analysisType: 'validate' | 'expand' | 'fix' | 'explain';\n context?: string;\n}\n\n/**\n * Run AI analysis on code issues\n * Used by agents to validate, expand, or fix detected issues\n */\nexport async function analyzeCodeIssues(request: CodeIssueAnalysisRequest): Promise<AIAnalysisResult> {\n const systemPrompts: Record<CodeIssueAnalysisRequest['analysisType'], string> = {\n validate: `You are a senior code reviewer. Analyze the following issues detected by static analysis.\nFor each issue:\n1. Determine if it's a TRUE POSITIVE (real problem) or FALSE POSITIVE (not actually an issue)\n2. Provide a confidence score (0-100)\n3. Explain your reasoning briefly\n\nOutput format:\n### Issue 1: [file:line]\n**Verdict:** TRUE_POSITIVE / FALSE_POSITIVE\n**Confidence:** [0-100]\n**Reason:** [one line explanation]\n**Fix:** [specific fix if true positive]`,\n\n expand: `You are a security expert and senior architect. Given these detected code issues, look deeper:\n1. Are there related problems in the same code that were missed?\n2. What's the root cause of these patterns?\n3. What's the blast radius if these issues cause problems?\n4. What architectural changes would prevent these patterns?\n\nBe specific. Reference line numbers. Provide code examples.`,\n\n fix: `You are an expert programmer. For each issue, provide a specific fix:\n1. Show the exact code change needed\n2. Explain why this fix works\n3. Note any edge cases to consider\n\nUse markdown code blocks with the language specified.`,\n\n explain: `You are a patient teacher explaining code issues to a junior developer.\nFor each issue:\n1. Explain what the problem is in simple terms\n2. Explain why it's a problem (what could go wrong)\n3. Explain the fix and why it works\n4. Provide a learning resource if relevant`\n };\n\n const issuesText = request.issues.map((issue, i) => {\n let text = `### Issue ${i + 1}: ${issue.file}${issue.line ? ':' + issue.line : ''}\\n`;\n text += `**Problem:** ${issue.issue}\\n`;\n if (issue.code) {\n text += `**Code:**\\n\\`\\`\\`\\n${issue.code}\\n\\`\\`\\`\\n`;\n }\n return text;\n }).join('\\n');\n\n const userPrompt = `${request.context ? `Context: ${request.context}\\n\\n` : ''}${issuesText}`;\n\n return runAIAnalysis({\n systemPrompt: systemPrompts[request.analysisType],\n userPrompt,\n maxTokens: 4096,\n temperature: 0.2\n });\n}\n\n/**\n * Get status message about AI availability\n */\nexport function getAIStatusMessage(): string {\n if (isAIAvailable()) {\n return '[AI] AI-powered analysis enabled';\n }\n return '[!] AI not available (ANTHROPIC_API_KEY not set) - using pattern-only mode';\n}\n"],"mappings":"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","names":[]}
@@ -2,18 +2,18 @@ import {
2
2
  CustomSkill,
3
3
  getSkillRegistry,
4
4
  loadContextState
5
- } from "./chunk-X2PABPBH.js";
5
+ } from "./chunk-NVH4CNK7.js";
6
6
  import {
7
7
  getGlobalMemoryStats
8
- } from "./chunk-7KHT2NKR.js";
8
+ } from "./chunk-I7BSCFTW.js";
9
9
  import {
10
10
  getHistoricalInsights,
11
11
  getMemoryStats,
12
12
  getRecentIssues
13
- } from "./chunk-TSHZQKCM.js";
13
+ } from "./chunk-HQKILHTM.js";
14
14
  import {
15
15
  getWorkingDirectory
16
- } from "./chunk-KOFQ47YW.js";
16
+ } from "./chunk-CWSK3V57.js";
17
17
  import {
18
18
  isInteractiveMode
19
19
  } from "./chunk-RAZUNSBI.js";
@@ -131,13 +131,13 @@ var Triager = class {
131
131
  if (riskLevel === "low" || riskLevel === "medium") {
132
132
  effectiveRiskLevel = "high";
133
133
  if (!isInteractiveMode()) {
134
- console.error(` \u{1F4CA} Health score ${this.contextState.healthScore}% - escalating to ${effectiveRiskLevel.toUpperCase()} risk`);
134
+ console.error(` Health score ${this.contextState.healthScore}% - escalating to ${effectiveRiskLevel.toUpperCase()} risk`);
135
135
  }
136
136
  }
137
137
  }
138
138
  if (effectiveRiskLevel === "critical" || effectiveRiskLevel === "high") {
139
139
  if (!isInteractiveMode()) {
140
- console.error(` \u26A0\uFE0F ${effectiveRiskLevel.toUpperCase()} risk - activating all agents for comprehensive review`);
140
+ console.error(` ${effectiveRiskLevel.toUpperCase()} risk - activating all agents for comprehensive review`);
141
141
  }
142
142
  return this.getAllAgents().filter((agent) => agent.shouldActivate(context));
143
143
  }
@@ -572,7 +572,7 @@ var Triager = class {
572
572
  }
573
573
  logAgentScoring(scores) {
574
574
  if (isInteractiveMode()) return;
575
- console.error("\n \u{1F4CA} Agent Confidence Scores:");
575
+ console.error("\n Agent Confidence Scores:");
576
576
  const sorted = [...scores].sort((a, b) => b.confidence - a.confidence);
577
577
  for (const score of sorted) {
578
578
  const bar = this.getConfidenceBar(score.confidence);
@@ -862,7 +862,7 @@ var ParallelExecutor = class {
862
862
  const workerUrl = this.getWorkerUrl();
863
863
  this.workerAvailable = existsSync2(fileURLToPath(workerUrl));
864
864
  if (!this.workerAvailable && !this.warnedWorkerFallback && !isInteractiveMode()) {
865
- console.error("\u26A0\uFE0F Worker threads unavailable; falling back to in-process agents.");
865
+ console.error("Worker threads unavailable; falling back to in-process agents.");
866
866
  this.warnedWorkerFallback = true;
867
867
  }
868
868
  return this.workerAvailable;
@@ -1167,7 +1167,7 @@ var Executor = class {
1167
1167
  const maxConcurrency = options?.maxConcurrency ?? calculateOptimalConcurrency();
1168
1168
  const useWorkerThreads = options?.useWorkerThreads ?? false;
1169
1169
  if (!isInteractiveMode()) {
1170
- console.error(`\u26A1 Executing ${agents.length} agents ${parallel ? "in parallel" : "sequentially"}...`);
1170
+ console.error(`Executing ${agents.length} agents ${parallel ? "in parallel" : "sequentially"}...`);
1171
1171
  }
1172
1172
  if (parallel) {
1173
1173
  const cacheManager = cacheEnabled ? new CacheManager(context.workingDir) : null;
@@ -1192,12 +1192,12 @@ var Executor = class {
1192
1192
  return results.map((result, index) => {
1193
1193
  if (result.status === "fulfilled") {
1194
1194
  if (!isInteractiveMode()) {
1195
- console.error(`\u2705 ${agents[index].name} completed in ${result.value.executionTime}ms`);
1195
+ console.error(`${agents[index].name} completed in ${result.value.executionTime}ms`);
1196
1196
  }
1197
1197
  return result.value;
1198
1198
  } else {
1199
1199
  if (!isInteractiveMode()) {
1200
- console.error(`\u274C ${agents[index].name} failed:`, result.reason);
1200
+ console.error(`${agents[index].name} failed:`, result.reason);
1201
1201
  }
1202
1202
  return {
1203
1203
  agent: agents[index].name,
@@ -1779,4 +1779,4 @@ export {
1779
1779
  getSkillsByCategory,
1780
1780
  getSkillCategories
1781
1781
  };
1782
- //# sourceMappingURL=chunk-ALA6733H.js.map
1782
+ //# sourceMappingURL=chunk-43B2IFPT.js.map