@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.
- package/dist/{agent-smith-W4HUCFGC.js → agent-smith-ETBGA5KG.js} +4 -4
- package/dist/{agent-smith-runner-QRVOEOBE.js → agent-smith-runner-DM422WAM.js} +64 -64
- package/dist/agent-smith-runner-DM422WAM.js.map +1 -0
- package/dist/{chunk-AQCAMIQQ.js → chunk-2YRZTA37.js} +4 -4
- package/dist/{chunk-AQCAMIQQ.js.map → chunk-2YRZTA37.js.map} +1 -1
- package/dist/{chunk-ALA6733H.js → chunk-43B2IFPT.js} +12 -12
- package/dist/chunk-43B2IFPT.js.map +1 -0
- package/dist/{chunk-4YSLDGBL.js → chunk-AAD7ZAPE.js} +5 -5
- package/dist/chunk-AAD7ZAPE.js.map +1 -0
- package/dist/{chunk-KOFQ47YW.js → chunk-CWSK3V57.js} +5 -5
- package/dist/chunk-CWSK3V57.js.map +1 -0
- package/dist/{chunk-TSHZQKCM.js → chunk-HQKILHTM.js} +4 -4
- package/dist/chunk-HQKILHTM.js.map +1 -0
- package/dist/{chunk-7KHT2NKR.js → chunk-I7BSCFTW.js} +2 -2
- package/dist/{chunk-MVUCBUBR.js → chunk-ICNTAY6P.js} +2 -2
- package/dist/{chunk-MVUCBUBR.js.map → chunk-ICNTAY6P.js.map} +1 -1
- package/dist/{chunk-GWSNINKX.js → chunk-JCYCDJHV.js} +2 -2
- package/dist/{chunk-N2AZH3EQ.js → chunk-KJS6PREO.js} +413 -199
- package/dist/chunk-KJS6PREO.js.map +1 -0
- package/dist/{chunk-PBOVCPKE.js → chunk-L47EYGRW.js} +41 -41
- package/dist/chunk-L47EYGRW.js.map +1 -0
- package/dist/{chunk-X2PABPBH.js → chunk-NVH4CNK7.js} +13 -13
- package/dist/chunk-NVH4CNK7.js.map +1 -0
- package/dist/{chunk-R7Z7OHTJ.js → chunk-PQXVQHJB.js} +3 -3
- package/dist/{chunk-ULOW5HSH.js → chunk-Q5BWAPMT.js} +2 -2
- package/dist/{chunk-ULOW5HSH.js.map → chunk-Q5BWAPMT.js.map} +1 -1
- package/dist/{chunk-D3DMONAJ.js → chunk-XWG7WDAX.js} +138 -11
- package/dist/chunk-XWG7WDAX.js.map +1 -0
- package/dist/{chunk-K6BQBKIR.js → chunk-ZCTGVK5N.js} +10 -10
- package/dist/chunk-ZCTGVK5N.js.map +1 -0
- package/dist/cli/create-agent.js +17 -17
- package/dist/cli/create-agent.js.map +1 -1
- package/dist/cli/main.js +30 -30
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/yolo-daemon.js +16 -16
- package/dist/cli/yolo-daemon.js.map +1 -1
- package/dist/{goal-manager-KFBOAP4X.js → goal-manager-YO75O76E.js} +5 -5
- package/dist/guardian-agent-RX7Q4VOH.js +17 -0
- package/dist/index.js +95 -95
- package/dist/index.js.map +1 -1
- package/dist/{issue-store-QRDF3X55.js → issue-store-ERSBEOS2.js} +3 -3
- package/dist/{vibe-code-signatures-TGMQXYGO.js → vibe-code-signatures-Q44DRSPU.js} +2 -2
- package/dist/{vulnerability-signatures-GOVD4Q24.js → vulnerability-signatures-ZTAPN7JA.js} +2 -2
- package/dist/workers/agent-worker.js +7 -7
- package/package.json +1 -1
- package/dist/agent-smith-runner-QRVOEOBE.js.map +0 -1
- package/dist/chunk-4YSLDGBL.js.map +0 -1
- package/dist/chunk-ALA6733H.js.map +0 -1
- package/dist/chunk-D3DMONAJ.js.map +0 -1
- package/dist/chunk-K6BQBKIR.js.map +0 -1
- package/dist/chunk-KOFQ47YW.js.map +0 -1
- package/dist/chunk-N2AZH3EQ.js.map +0 -1
- package/dist/chunk-PBOVCPKE.js.map +0 -1
- package/dist/chunk-TSHZQKCM.js.map +0 -1
- package/dist/chunk-X2PABPBH.js.map +0 -1
- package/dist/guardian-agent-PULK546O.js +0 -17
- /package/dist/{agent-smith-W4HUCFGC.js.map → agent-smith-ETBGA5KG.js.map} +0 -0
- /package/dist/{chunk-7KHT2NKR.js.map → chunk-I7BSCFTW.js.map} +0 -0
- /package/dist/{chunk-GWSNINKX.js.map → chunk-JCYCDJHV.js.map} +0 -0
- /package/dist/{chunk-R7Z7OHTJ.js.map → chunk-PQXVQHJB.js.map} +0 -0
- /package/dist/{goal-manager-KFBOAP4X.js.map → goal-manager-YO75O76E.js.map} +0 -0
- /package/dist/{guardian-agent-PULK546O.js.map → guardian-agent-RX7Q4VOH.js.map} +0 -0
- /package/dist/{issue-store-QRDF3X55.js.map → issue-store-ERSBEOS2.js.map} +0 -0
- /package/dist/{vibe-code-signatures-TGMQXYGO.js.map → vibe-code-signatures-Q44DRSPU.js.map} +0 -0
- /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-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
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-
|
|
14
|
+
//# sourceMappingURL=agent-smith-ETBGA5KG.js.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AgentSmithSkill
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZCTGVK5N.js";
|
|
4
4
|
import {
|
|
5
5
|
getAIStatusMessage,
|
|
6
6
|
isAIAvailable,
|
|
7
7
|
runAIAnalysis
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-2YRZTA37.js";
|
|
9
9
|
import {
|
|
10
10
|
getWorkingDirectory
|
|
11
|
-
} from "./chunk-
|
|
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": "
|
|
138
|
-
"frontend-env-hunter": "
|
|
139
|
-
"hardcoded-localhost-hunter": "
|
|
140
|
-
"sql-injection-hunter": "
|
|
141
|
-
"dangeroushtml-hunter": "
|
|
142
|
-
"console-hunter": "
|
|
143
|
-
"any-hunter": "
|
|
144
|
-
"ts-ignore-hunter": "
|
|
145
|
-
"eslint-disable-hunter": "
|
|
146
|
-
"debugger-hunter": "
|
|
147
|
-
"force-flag-hunter": "
|
|
148
|
-
"async-useeffect-hunter": "
|
|
149
|
-
"async-foreach-hunter": "
|
|
150
|
-
"missing-await-hunter": "
|
|
151
|
-
"empty-catch-hunter": "
|
|
152
|
-
"floating-promise-hunter": "
|
|
153
|
-
"useeffect-abuse-hunter": "
|
|
154
|
-
"usestate-explosion-hunter": "
|
|
155
|
-
"index-key-hunter": "
|
|
156
|
-
"inline-object-hunter": "
|
|
157
|
-
"prop-drilling-hunter": "
|
|
158
|
-
"missing-loading-hunter": "
|
|
159
|
-
"missing-error-hunter": "
|
|
160
|
-
"missing-empty-hunter": "
|
|
161
|
-
"page-reload-hunter": "
|
|
162
|
-
"no-validation-hunter": "
|
|
163
|
-
"raw-error-hunter": "
|
|
164
|
-
"n-plus-one-hunter": "
|
|
165
|
-
"todo-hunter": "
|
|
166
|
-
"vibe-comment-hunter": "
|
|
167
|
-
"placeholder-hunter": "
|
|
168
|
-
"sleep-hack-hunter": "
|
|
169
|
-
"fallback-hunter": "
|
|
170
|
-
"purple-gradient-hunter": "
|
|
171
|
-
"star-icon-hunter": "
|
|
172
|
-
"generic-hero-hunter": "
|
|
173
|
-
"emoji-overflow-hunter": "
|
|
174
|
-
"inter-font-hunter": "
|
|
175
|
-
"giant-file": "
|
|
176
|
-
"state-explosion": "
|
|
177
|
-
"effect-hell": "
|
|
178
|
-
"cross-file": "
|
|
179
|
-
"resurrected": "
|
|
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] || "
|
|
181
|
+
return icons[category] || "[?]";
|
|
182
182
|
}
|
|
183
183
|
function getSeverityIcon(severity) {
|
|
184
|
-
return { critical: "
|
|
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(`
|
|
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(`
|
|
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(`|
|
|
381
|
-
lines.push(`|
|
|
382
|
-
lines.push(`|
|
|
383
|
-
lines.push(`|
|
|
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(`|
|
|
387
|
+
lines.push(`| [AI] AI found | ${aiFound.length} |`);
|
|
388
388
|
} else if (!isAIAvailable()) {
|
|
389
|
-
lines.push(`|
|
|
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("##
|
|
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("##
|
|
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("##
|
|
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("##
|
|
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("##
|
|
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: "
|
|
519
|
+
text: "No valid files found to scan."
|
|
520
520
|
}]
|
|
521
521
|
};
|
|
522
522
|
}
|
|
523
|
-
console.error("
|
|
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-
|
|
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-
|
|
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 "
|
|
129
|
+
return "[AI] AI-powered analysis enabled";
|
|
130
130
|
}
|
|
131
|
-
return "
|
|
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-
|
|
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-
|
|
5
|
+
} from "./chunk-NVH4CNK7.js";
|
|
6
6
|
import {
|
|
7
7
|
getGlobalMemoryStats
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-I7BSCFTW.js";
|
|
9
9
|
import {
|
|
10
10
|
getHistoricalInsights,
|
|
11
11
|
getMemoryStats,
|
|
12
12
|
getRecentIssues
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-HQKILHTM.js";
|
|
14
14
|
import {
|
|
15
15
|
getWorkingDirectory
|
|
16
|
-
} from "./chunk-
|
|
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(`
|
|
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(`
|
|
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
|
|
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("
|
|
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(
|
|
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(
|
|
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(
|
|
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-
|
|
1782
|
+
//# sourceMappingURL=chunk-43B2IFPT.js.map
|