wiggum-cli 0.3.2 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/dist/ai/agents/codebase-analyst.d.ts +3 -0
- package/dist/ai/agents/codebase-analyst.d.ts.map +1 -1
- package/dist/ai/agents/codebase-analyst.js +3 -0
- package/dist/ai/agents/codebase-analyst.js.map +1 -1
- package/dist/ai/agents/context-enricher.d.ts +11 -0
- package/dist/ai/agents/context-enricher.d.ts.map +1 -0
- package/dist/ai/agents/context-enricher.js +163 -0
- package/dist/ai/agents/context-enricher.js.map +1 -0
- package/dist/ai/agents/evaluator-optimizer.d.ts +13 -0
- package/dist/ai/agents/evaluator-optimizer.d.ts.map +1 -0
- package/dist/ai/agents/evaluator-optimizer.js +231 -0
- package/dist/ai/agents/evaluator-optimizer.js.map +1 -0
- package/dist/ai/agents/index.d.ts +21 -3
- package/dist/ai/agents/index.d.ts.map +1 -1
- package/dist/ai/agents/index.js +148 -86
- package/dist/ai/agents/index.js.map +1 -1
- package/dist/ai/agents/mcp-detector.d.ts +26 -0
- package/dist/ai/agents/mcp-detector.d.ts.map +1 -0
- package/dist/ai/agents/mcp-detector.js +186 -0
- package/dist/ai/agents/mcp-detector.js.map +1 -0
- package/dist/ai/agents/orchestrator.d.ts +3 -0
- package/dist/ai/agents/orchestrator.d.ts.map +1 -1
- package/dist/ai/agents/orchestrator.js +3 -0
- package/dist/ai/agents/orchestrator.js.map +1 -1
- package/dist/ai/agents/planning-orchestrator.d.ts +12 -0
- package/dist/ai/agents/planning-orchestrator.d.ts.map +1 -0
- package/dist/ai/agents/planning-orchestrator.js +133 -0
- package/dist/ai/agents/planning-orchestrator.js.map +1 -0
- package/dist/ai/agents/stack-researcher.d.ts +3 -0
- package/dist/ai/agents/stack-researcher.d.ts.map +1 -1
- package/dist/ai/agents/stack-researcher.js +3 -0
- package/dist/ai/agents/stack-researcher.js.map +1 -1
- package/dist/ai/agents/stack-utils.d.ts +11 -0
- package/dist/ai/agents/stack-utils.d.ts.map +1 -0
- package/dist/ai/agents/stack-utils.js +27 -0
- package/dist/ai/agents/stack-utils.js.map +1 -0
- package/dist/ai/agents/synthesis-agent.d.ts +11 -0
- package/dist/ai/agents/synthesis-agent.d.ts.map +1 -0
- package/dist/ai/agents/synthesis-agent.js +202 -0
- package/dist/ai/agents/synthesis-agent.js.map +1 -0
- package/dist/ai/agents/tech-researcher.d.ts +16 -0
- package/dist/ai/agents/tech-researcher.d.ts.map +1 -0
- package/dist/ai/agents/tech-researcher.js +208 -0
- package/dist/ai/agents/tech-researcher.js.map +1 -0
- package/dist/ai/agents/types.d.ts +127 -0
- package/dist/ai/agents/types.d.ts.map +1 -1
- package/dist/ai/agents/types.js +6 -0
- package/dist/ai/agents/types.js.map +1 -1
- package/dist/ai/enhancer.d.ts +4 -0
- package/dist/ai/enhancer.d.ts.map +1 -1
- package/dist/ai/enhancer.js +3 -0
- package/dist/ai/enhancer.js.map +1 -1
- package/dist/ai/index.d.ts +1 -1
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +14 -2
- package/dist/ai/index.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +20 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/utils/tracing.d.ts +5 -0
- package/dist/utils/tracing.d.ts.map +1 -1
- package/dist/utils/tracing.js +40 -1
- package/dist/utils/tracing.js.map +1 -1
- package/package.json +5 -2
- package/src/ai/agents/codebase-analyst.ts +3 -0
- package/src/ai/agents/context-enricher.ts +189 -0
- package/src/ai/agents/evaluator-optimizer.ts +277 -0
- package/src/ai/agents/index.ts +198 -111
- package/src/ai/agents/mcp-detector.test.ts +290 -0
- package/src/ai/agents/mcp-detector.ts +210 -0
- package/src/ai/agents/orchestrator.ts +3 -0
- package/src/ai/agents/planning-orchestrator.ts +140 -0
- package/src/ai/agents/stack-researcher.ts +3 -0
- package/src/ai/agents/stack-utils.ts +34 -0
- package/src/ai/agents/synthesis-agent.ts +240 -0
- package/src/ai/agents/tech-researcher.ts +262 -0
- package/src/ai/agents/types.ts +160 -0
- package/src/ai/enhancer.ts +6 -1
- package/src/ai/index.ts +26 -5
- package/src/commands/init.ts +20 -4
- package/src/utils/tracing.ts +44 -1
- package/tsconfig.json +1 -1
- package/vitest.config.ts +7 -0
package/README.md
CHANGED
|
@@ -253,10 +253,12 @@ wiggum init --provider anthropic
|
|
|
253
253
|
|
|
254
254
|
### AI Analysis Features
|
|
255
255
|
|
|
256
|
-
Wiggum
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
256
|
+
Wiggum uses a 4-phase multi-agent architecture:
|
|
257
|
+
|
|
258
|
+
1. **Planning Orchestrator:** Creates a focused analysis plan based on the detected stack
|
|
259
|
+
2. **Parallel Workers:** Context Enricher explores the codebase while Tech Researchers gather best practices (runs concurrently)
|
|
260
|
+
3. **Synthesis:** Merges worker results and detects essential MCP servers (Playwright, database)
|
|
261
|
+
4. **Evaluator-Optimizer:** QA loop that validates and improves the analysis (max 2 iterations)
|
|
260
262
|
|
|
261
263
|
## Configuration
|
|
262
264
|
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Codebase Analyst Agent
|
|
3
3
|
* Explores the codebase to understand its structure and patterns
|
|
4
|
+
*
|
|
5
|
+
* @deprecated Use runContextEnricher from context-enricher.ts instead.
|
|
6
|
+
* This agent is kept for backward compatibility.
|
|
4
7
|
*/
|
|
5
8
|
import { type LanguageModel } from 'ai';
|
|
6
9
|
import type { CodebaseAnalysis, CodebaseAnalystInput } from './types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codebase-analyst.d.ts","sourceRoot":"","sources":["../../../src/ai/agents/codebase-analyst.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"codebase-analyst.d.ts","sourceRoot":"","sources":["../../../src/ai/agents/codebase-analyst.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,IAAI,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AA8DzE;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,oBAAoB,EAC3B,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAmClC"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Codebase Analyst Agent
|
|
3
3
|
* Explores the codebase to understand its structure and patterns
|
|
4
|
+
*
|
|
5
|
+
* @deprecated Use runContextEnricher from context-enricher.ts instead.
|
|
6
|
+
* This agent is kept for backward compatibility.
|
|
4
7
|
*/
|
|
5
8
|
import { stepCountIs } from 'ai';
|
|
6
9
|
import { createExplorationTools } from '../tools.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codebase-analyst.js","sourceRoot":"","sources":["../../../src/ai/agents/codebase-analyst.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"codebase-analyst.js","sourceRoot":"","sources":["../../../src/ai/agents/codebase-analyst.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Enricher Worker (Phase 2)
|
|
3
|
+
* Explores the codebase to gather enriched context based on the analysis plan
|
|
4
|
+
*/
|
|
5
|
+
import { type LanguageModel } from 'ai';
|
|
6
|
+
import type { ContextEnricherInput, EnrichedContext } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Run the Context Enricher worker
|
|
9
|
+
*/
|
|
10
|
+
export declare function runContextEnricher(model: LanguageModel, modelId: string, input: ContextEnricherInput, verbose?: boolean): Promise<EnrichedContext>;
|
|
11
|
+
//# sourceMappingURL=context-enricher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-enricher.d.ts","sourceRoot":"","sources":["../../../src/ai/agents/context-enricher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,IAAI,CAAC;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAoDxE;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,oBAAoB,EAC3B,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,eAAe,CAAC,CAoD1B"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Enricher Worker (Phase 2)
|
|
3
|
+
* Explores the codebase to gather enriched context based on the analysis plan
|
|
4
|
+
*/
|
|
5
|
+
import { stepCountIs } from 'ai';
|
|
6
|
+
import { createExplorationTools } from '../tools.js';
|
|
7
|
+
import { isReasoningModel } from '../providers.js';
|
|
8
|
+
import { logger } from '../../utils/logger.js';
|
|
9
|
+
import { parseJsonSafe } from '../../utils/json-repair.js';
|
|
10
|
+
import { getTracedAI } from '../../utils/tracing.js';
|
|
11
|
+
import { detectProjectType } from './stack-utils.js';
|
|
12
|
+
/**
|
|
13
|
+
* System prompt for the Context Enricher worker
|
|
14
|
+
*/
|
|
15
|
+
const CONTEXT_ENRICHER_SYSTEM_PROMPT = `You are a Context Enricher worker. Your job is to explore specific areas of a codebase and answer specific questions.
|
|
16
|
+
|
|
17
|
+
## Your Mission
|
|
18
|
+
Based on the analysis plan, explore the codebase to:
|
|
19
|
+
1. Identify entry points and key files
|
|
20
|
+
2. Understand directory structure and purposes
|
|
21
|
+
3. Detect naming conventions
|
|
22
|
+
4. Find available commands (from package.json)
|
|
23
|
+
5. Answer the specific questions provided
|
|
24
|
+
|
|
25
|
+
## Tools Available
|
|
26
|
+
- searchCode: Search using ripgrep patterns
|
|
27
|
+
- readFile: Read file contents
|
|
28
|
+
- listDirectory: List directory structure
|
|
29
|
+
- getPackageInfo: Get package.json info
|
|
30
|
+
|
|
31
|
+
## Exploration Strategy
|
|
32
|
+
1. List the areas specified in the plan
|
|
33
|
+
2. Read package.json to understand scripts and dependencies
|
|
34
|
+
3. Search for patterns to answer the specific questions
|
|
35
|
+
4. Identify the project type based on structure
|
|
36
|
+
|
|
37
|
+
## Project Types
|
|
38
|
+
- MCP Server: Has @modelcontextprotocol dependencies
|
|
39
|
+
- REST API: Express/Fastify/Hono with route handlers
|
|
40
|
+
- React SPA: React with components, no server-side rendering
|
|
41
|
+
- Next.js App: Next.js with app or pages directory
|
|
42
|
+
- CLI Tool: Has bin entry in package.json
|
|
43
|
+
- Library: Published package without app entry
|
|
44
|
+
|
|
45
|
+
## Output Format
|
|
46
|
+
After exploration, output ONLY valid JSON:
|
|
47
|
+
{
|
|
48
|
+
"entryPoints": ["src/index.ts"],
|
|
49
|
+
"keyDirectories": {"src/routes": "API routes", "src/components": "UI components"},
|
|
50
|
+
"namingConventions": "camelCase files, PascalCase components",
|
|
51
|
+
"commands": {"test": "npm test", "build": "npm run build"},
|
|
52
|
+
"answeredQuestions": {"What is the auth strategy?": "NextAuth with JWT"},
|
|
53
|
+
"projectType": "Next.js App"
|
|
54
|
+
}`;
|
|
55
|
+
/**
|
|
56
|
+
* Run the Context Enricher worker
|
|
57
|
+
*/
|
|
58
|
+
export async function runContextEnricher(model, modelId, input, verbose = false) {
|
|
59
|
+
const tools = createExplorationTools(input.scanResult.projectRoot);
|
|
60
|
+
const prompt = `Explore this codebase and gather enriched context.
|
|
61
|
+
|
|
62
|
+
Project: ${input.scanResult.projectRoot}
|
|
63
|
+
|
|
64
|
+
## Areas to Explore
|
|
65
|
+
${input.areasToExplore.map(a => `- ${a}`).join('\n')}
|
|
66
|
+
|
|
67
|
+
## Questions to Answer
|
|
68
|
+
${input.questionsToAnswer.map(q => `- ${q}`).join('\n')}
|
|
69
|
+
|
|
70
|
+
Start by exploring the specified areas, then answer the questions and produce your analysis as JSON.`;
|
|
71
|
+
try {
|
|
72
|
+
const { generateText } = getTracedAI();
|
|
73
|
+
const result = await generateText({
|
|
74
|
+
model,
|
|
75
|
+
system: CONTEXT_ENRICHER_SYSTEM_PROMPT,
|
|
76
|
+
prompt,
|
|
77
|
+
tools,
|
|
78
|
+
stopWhen: stepCountIs(5),
|
|
79
|
+
maxOutputTokens: 3000,
|
|
80
|
+
...(isReasoningModel(modelId) ? {} : { temperature: 0.3 }),
|
|
81
|
+
experimental_telemetry: {
|
|
82
|
+
isEnabled: true,
|
|
83
|
+
metadata: {
|
|
84
|
+
agent: 'context-enricher',
|
|
85
|
+
projectRoot: input.scanResult.projectRoot,
|
|
86
|
+
areasCount: input.areasToExplore.length,
|
|
87
|
+
questionsCount: input.questionsToAnswer.length,
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
// Parse the response
|
|
92
|
+
const context = parseEnrichedContext(result.text, result.steps, verbose);
|
|
93
|
+
if (verbose) {
|
|
94
|
+
logger.info(`Context Enricher: Found ${context.entryPoints.length} entry points, answered ${Object.keys(context.answeredQuestions).length} questions`);
|
|
95
|
+
}
|
|
96
|
+
return context;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (verbose) {
|
|
100
|
+
logger.error(`Context Enricher error: ${error instanceof Error ? error.message : String(error)}`);
|
|
101
|
+
}
|
|
102
|
+
return getDefaultEnrichedContext(input);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Parse the enriched context from agent response
|
|
107
|
+
*/
|
|
108
|
+
function parseEnrichedContext(text, steps, verbose) {
|
|
109
|
+
// Try to get text from the result or steps
|
|
110
|
+
let textToParse = text;
|
|
111
|
+
if (!textToParse || textToParse.trim() === '') {
|
|
112
|
+
const stepsList = steps || [];
|
|
113
|
+
for (let i = stepsList.length - 1; i >= 0; i--) {
|
|
114
|
+
const step = stepsList[i];
|
|
115
|
+
if (step.text && step.text.trim() !== '') {
|
|
116
|
+
textToParse = step.text;
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (!textToParse || textToParse.trim() === '') {
|
|
122
|
+
if (verbose) {
|
|
123
|
+
logger.warn('Context Enricher: No text output found');
|
|
124
|
+
}
|
|
125
|
+
return getDefaultEnrichedContext();
|
|
126
|
+
}
|
|
127
|
+
// Use safe JSON parser with repair capabilities
|
|
128
|
+
const parsed = parseJsonSafe(textToParse);
|
|
129
|
+
if (!parsed) {
|
|
130
|
+
if (verbose) {
|
|
131
|
+
logger.warn('Context Enricher: Failed to parse JSON response');
|
|
132
|
+
}
|
|
133
|
+
return getDefaultEnrichedContext();
|
|
134
|
+
}
|
|
135
|
+
// Build result with defaults for missing fields
|
|
136
|
+
return {
|
|
137
|
+
entryPoints: parsed.entryPoints || ['src/index.ts'],
|
|
138
|
+
keyDirectories: parsed.keyDirectories || { src: 'Source code' },
|
|
139
|
+
namingConventions: parsed.namingConventions || 'camelCase',
|
|
140
|
+
commands: parsed.commands || { build: 'npm run build' },
|
|
141
|
+
answeredQuestions: parsed.answeredQuestions || {},
|
|
142
|
+
projectType: parsed.projectType || 'Unknown',
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get default enriched context when parsing fails
|
|
147
|
+
*/
|
|
148
|
+
function getDefaultEnrichedContext(input) {
|
|
149
|
+
const projectType = detectProjectType(input?.scanResult.stack);
|
|
150
|
+
return {
|
|
151
|
+
entryPoints: ['src/index.ts'],
|
|
152
|
+
keyDirectories: { src: 'Source code' },
|
|
153
|
+
namingConventions: 'camelCase',
|
|
154
|
+
commands: {
|
|
155
|
+
test: 'npm test',
|
|
156
|
+
build: 'npm run build',
|
|
157
|
+
dev: 'npm run dev',
|
|
158
|
+
},
|
|
159
|
+
answeredQuestions: {},
|
|
160
|
+
projectType,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=context-enricher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-enricher.js","sourceRoot":"","sources":["../../../src/ai/agents/context-enricher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAsB,MAAM,IAAI,CAAC;AAErD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD;;GAEG;AACH,MAAM,8BAA8B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuCrC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAoB,EACpB,OAAe,EACf,KAA2B,EAC3B,UAAmB,KAAK;IAExB,MAAM,KAAK,GAAG,sBAAsB,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAEnE,MAAM,MAAM,GAAG;;WAEN,KAAK,CAAC,UAAU,CAAC,WAAW;;;EAGrC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAGlD,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;qGAE8C,CAAC;IAEpG,IAAI,CAAC;QACH,MAAM,EAAE,YAAY,EAAE,GAAG,WAAW,EAAE,CAAC;QAEvC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,KAAK;YACL,MAAM,EAAE,8BAA8B;YACtC,MAAM;YACN,KAAK;YACL,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;YACxB,eAAe,EAAE,IAAI;YACrB,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;YAC1D,sBAAsB,EAAE;gBACtB,SAAS,EAAE,IAAI;gBACf,QAAQ,EAAE;oBACR,KAAK,EAAE,kBAAkB;oBACzB,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW;oBACzC,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM;oBACvC,cAAc,EAAE,KAAK,CAAC,iBAAiB,CAAC,MAAM;iBAC/C;aACF;SACF,CAAC,CAAC;QAEH,qBAAqB;QACrB,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEzE,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,2BAA2B,OAAO,CAAC,WAAW,CAAC,MAAM,2BAA2B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,MAAM,YAAY,CAAC,CAAC;QACzJ,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,CAAC,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpG,CAAC;QAED,OAAO,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAC3B,IAAY,EACZ,KAA2C,EAC3C,OAAgB;IAEhB,2CAA2C;IAC3C,IAAI,WAAW,GAAG,IAAI,CAAC;IAEvB,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9C,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACzC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;gBACxB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,yBAAyB,EAAE,CAAC;IACrC,CAAC;IAED,gDAAgD;IAChD,MAAM,MAAM,GAAG,aAAa,CAA2B,WAAW,CAAC,CAAC;IAEpE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,yBAAyB,EAAE,CAAC;IACrC,CAAC;IAED,gDAAgD;IAChD,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,CAAC,cAAc,CAAC;QACnD,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE;QAC/D,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,WAAW;QAC1D,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE;QACvD,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,EAAE;QACjD,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,SAAS;KAC7C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,yBAAyB,CAAC,KAA4B;IAC7D,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAE/D,OAAO;QACL,WAAW,EAAE,CAAC,cAAc,CAAC;QAC7B,cAAc,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE;QACtC,iBAAiB,EAAE,WAAW;QAC9B,QAAQ,EAAE;YACR,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,eAAe;YACtB,GAAG,EAAE,aAAa;SACnB;QACD,iBAAiB,EAAE,EAAE;QACrB,WAAW;KACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evaluator-Optimizer Agent (Phase 4)
|
|
3
|
+
* QA loop that validates and improves the analysis result
|
|
4
|
+
* Max 2 iterations to ensure quality without endless loops
|
|
5
|
+
*/
|
|
6
|
+
import { type LanguageModel } from 'ai';
|
|
7
|
+
import type { ScanResult } from '../../scanner/types.js';
|
|
8
|
+
import type { MultiAgentAnalysis } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Run the Evaluator-Optimizer QA loop
|
|
11
|
+
*/
|
|
12
|
+
export declare function runEvaluatorOptimizer(model: LanguageModel, modelId: string, result: MultiAgentAnalysis, scanResult: ScanResult, maxIterations?: number, verbose?: boolean): Promise<MultiAgentAnalysis>;
|
|
13
|
+
//# sourceMappingURL=evaluator-optimizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator-optimizer.d.ts","sourceRoot":"","sources":["../../../src/ai/agents/evaluator-optimizer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,IAAI,CAAC;AAExC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAoB,MAAM,YAAY,CAAC;AA2EvE;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,kBAAkB,EAC1B,UAAU,EAAE,UAAU,EACtB,aAAa,GAAE,MAAU,EACzB,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAqC7B"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evaluator-Optimizer Agent (Phase 4)
|
|
3
|
+
* QA loop that validates and improves the analysis result
|
|
4
|
+
* Max 2 iterations to ensure quality without endless loops
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { isReasoningModel } from '../providers.js';
|
|
8
|
+
import { logger } from '../../utils/logger.js';
|
|
9
|
+
import { getTracedAI } from '../../utils/tracing.js';
|
|
10
|
+
/**
|
|
11
|
+
* Quality threshold for passing evaluation (1-10 scale)
|
|
12
|
+
* Results with score >= this value skip optimization
|
|
13
|
+
*/
|
|
14
|
+
const QUALITY_THRESHOLD = 7;
|
|
15
|
+
/**
|
|
16
|
+
* Schema for evaluation output
|
|
17
|
+
*/
|
|
18
|
+
const evaluationSchema = z.object({
|
|
19
|
+
qualityScore: z.number().min(1).max(10).describe('Overall quality score from 1-10'),
|
|
20
|
+
hasEntryPoints: z.boolean().describe('Whether entry points are identified'),
|
|
21
|
+
hasImplementationGuidelines: z.boolean().describe('Whether implementation guidelines are provided'),
|
|
22
|
+
hasRelevantMcpServers: z.boolean().describe('Whether relevant MCP servers are recommended'),
|
|
23
|
+
specificIssues: z.array(z.string()).describe('Specific issues found in the analysis'),
|
|
24
|
+
improvementSuggestions: z.array(z.string()).describe('Suggestions for improving the analysis'),
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* Schema for optimizer output
|
|
28
|
+
*/
|
|
29
|
+
const optimizerOutputSchema = z.object({
|
|
30
|
+
improvedGuidelines: z.array(z.string()).describe('Improved implementation guidelines'),
|
|
31
|
+
additionalEntryPoints: z.array(z.string()).describe('Additional entry points to add (empty array if none)'),
|
|
32
|
+
additionalMcpServers: z.array(z.string()).describe('Additional MCP servers to recommend (empty array if none)'),
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* System prompt for the Evaluator
|
|
36
|
+
*/
|
|
37
|
+
const EVALUATOR_SYSTEM_PROMPT = `You are a QA Evaluator for AI-generated codebase analysis.
|
|
38
|
+
|
|
39
|
+
## Your Mission
|
|
40
|
+
Evaluate the analysis result for:
|
|
41
|
+
1. Completeness - Are all important areas covered?
|
|
42
|
+
2. Accuracy - Do the recommendations match the detected stack?
|
|
43
|
+
3. Actionability - Are the guidelines specific and useful?
|
|
44
|
+
4. MCP relevance - Are the right MCP servers recommended?
|
|
45
|
+
|
|
46
|
+
## Scoring Guidelines
|
|
47
|
+
- 9-10: Excellent, comprehensive, highly actionable
|
|
48
|
+
- 7-8: Good, covers main areas, useful guidelines
|
|
49
|
+
- 5-6: Adequate but missing some important details
|
|
50
|
+
- 3-4: Incomplete, vague, or partially incorrect
|
|
51
|
+
- 1-2: Poor, missing critical information
|
|
52
|
+
|
|
53
|
+
## Quality Checks
|
|
54
|
+
- Entry points should identify actual files, not just "src/"
|
|
55
|
+
- Guidelines should be specific (e.g., "Run npm test" not "Test your code")
|
|
56
|
+
- MCP servers should match the detected database and deployment
|
|
57
|
+
|
|
58
|
+
Be constructive but honest. If it's good, say so. If it needs work, explain why.`;
|
|
59
|
+
/**
|
|
60
|
+
* System prompt for the Optimizer
|
|
61
|
+
*/
|
|
62
|
+
const OPTIMIZER_SYSTEM_PROMPT = `You are an Optimizer that improves AI-generated codebase analysis based on evaluation feedback.
|
|
63
|
+
|
|
64
|
+
## Your Mission
|
|
65
|
+
Based on the evaluation feedback, improve:
|
|
66
|
+
1. Implementation guidelines - make them more specific and actionable
|
|
67
|
+
2. Entry points - add any obvious ones that were missed
|
|
68
|
+
3. MCP servers - add any that would be useful
|
|
69
|
+
|
|
70
|
+
## Guidelines for Improvement
|
|
71
|
+
- Keep guidelines to 5-10 words
|
|
72
|
+
- Start with action verbs
|
|
73
|
+
- Be specific to the detected stack
|
|
74
|
+
- Don't remove good content, only add or improve`;
|
|
75
|
+
/**
|
|
76
|
+
* Run the Evaluator-Optimizer QA loop
|
|
77
|
+
*/
|
|
78
|
+
export async function runEvaluatorOptimizer(model, modelId, result, scanResult, maxIterations = 2, verbose = false) {
|
|
79
|
+
let currentResult = result;
|
|
80
|
+
let iterations = 0;
|
|
81
|
+
while (iterations < maxIterations) {
|
|
82
|
+
// Evaluate current result
|
|
83
|
+
const evaluation = await evaluateResult(model, modelId, currentResult, scanResult, verbose);
|
|
84
|
+
if (verbose) {
|
|
85
|
+
logger.info(`Evaluator (iteration ${iterations + 1}): Score ${evaluation.qualityScore}/10`);
|
|
86
|
+
if (evaluation.specificIssues.length > 0) {
|
|
87
|
+
logger.info(`Issues: ${evaluation.specificIssues.join(', ')}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Check if quality meets threshold
|
|
91
|
+
if (evaluation.qualityScore >= QUALITY_THRESHOLD &&
|
|
92
|
+
evaluation.hasEntryPoints &&
|
|
93
|
+
evaluation.hasImplementationGuidelines) {
|
|
94
|
+
if (verbose) {
|
|
95
|
+
logger.info('Evaluator: Quality threshold met, skipping optimization');
|
|
96
|
+
}
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
// Optimize based on feedback
|
|
100
|
+
if (verbose) {
|
|
101
|
+
logger.info('Evaluator: Running optimizer to improve result');
|
|
102
|
+
}
|
|
103
|
+
currentResult = await optimizeResult(model, modelId, currentResult, evaluation, verbose);
|
|
104
|
+
iterations++;
|
|
105
|
+
}
|
|
106
|
+
return currentResult;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Evaluate the analysis result
|
|
110
|
+
*/
|
|
111
|
+
async function evaluateResult(model, modelId, result, scanResult, verbose) {
|
|
112
|
+
const prompt = `Evaluate this codebase analysis:
|
|
113
|
+
|
|
114
|
+
## Analysis Result
|
|
115
|
+
Project Type: ${result.codebaseAnalysis.projectContext.projectType}
|
|
116
|
+
Entry Points: ${result.codebaseAnalysis.projectContext.entryPoints.join(', ') || 'None'}
|
|
117
|
+
Key Directories: ${Object.keys(result.codebaseAnalysis.projectContext.keyDirectories).join(', ') || 'None'}
|
|
118
|
+
Guidelines: ${result.codebaseAnalysis.implementationGuidelines.length} items
|
|
119
|
+
- ${result.codebaseAnalysis.implementationGuidelines.slice(0, 3).join('\n- ')}
|
|
120
|
+
MCP Essential: ${result.mcpServers.essential.join(', ')}
|
|
121
|
+
MCP Recommended: ${result.mcpServers.recommended.join(', ') || 'None'}
|
|
122
|
+
|
|
123
|
+
## Original Project Context
|
|
124
|
+
Framework: ${scanResult.stack.framework?.name || 'Unknown'}
|
|
125
|
+
Database: ${scanResult.stack.database?.name || 'None detected'}
|
|
126
|
+
Testing: ${scanResult.stack.testing?.unit?.name || 'None detected'}
|
|
127
|
+
|
|
128
|
+
Evaluate the quality and completeness of this analysis.`;
|
|
129
|
+
try {
|
|
130
|
+
const { generateObject } = getTracedAI();
|
|
131
|
+
const { object: evaluation } = await generateObject({
|
|
132
|
+
model,
|
|
133
|
+
schema: evaluationSchema,
|
|
134
|
+
system: EVALUATOR_SYSTEM_PROMPT,
|
|
135
|
+
prompt,
|
|
136
|
+
...(isReasoningModel(modelId) ? {} : { temperature: 0.2 }),
|
|
137
|
+
experimental_telemetry: {
|
|
138
|
+
isEnabled: true,
|
|
139
|
+
metadata: {
|
|
140
|
+
agent: 'evaluator',
|
|
141
|
+
projectType: result.codebaseAnalysis.projectContext.projectType,
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
return evaluation;
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
if (verbose) {
|
|
149
|
+
logger.error(`Evaluator error: ${error instanceof Error ? error.message : String(error)}`);
|
|
150
|
+
}
|
|
151
|
+
// Return a passing evaluation on error to avoid blocking
|
|
152
|
+
return {
|
|
153
|
+
qualityScore: 7,
|
|
154
|
+
hasEntryPoints: result.codebaseAnalysis.projectContext.entryPoints.length > 0,
|
|
155
|
+
hasImplementationGuidelines: result.codebaseAnalysis.implementationGuidelines.length > 0,
|
|
156
|
+
hasRelevantMcpServers: result.mcpServers.essential.length > 0,
|
|
157
|
+
specificIssues: [],
|
|
158
|
+
improvementSuggestions: [],
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Optimize the result based on evaluation feedback
|
|
164
|
+
*/
|
|
165
|
+
async function optimizeResult(model, modelId, result, evaluation, verbose) {
|
|
166
|
+
const prompt = `Improve this codebase analysis based on the evaluation feedback.
|
|
167
|
+
|
|
168
|
+
## Current Analysis
|
|
169
|
+
Project Type: ${result.codebaseAnalysis.projectContext.projectType}
|
|
170
|
+
Entry Points: ${result.codebaseAnalysis.projectContext.entryPoints.join(', ')}
|
|
171
|
+
Current Guidelines:
|
|
172
|
+
${result.codebaseAnalysis.implementationGuidelines.map(g => `- ${g}`).join('\n')}
|
|
173
|
+
|
|
174
|
+
## Evaluation Feedback
|
|
175
|
+
Score: ${evaluation.qualityScore}/10
|
|
176
|
+
Issues: ${evaluation.specificIssues.join(', ') || 'None'}
|
|
177
|
+
Suggestions: ${evaluation.improvementSuggestions.join(', ') || 'None'}
|
|
178
|
+
|
|
179
|
+
Provide improved guidelines and any additional entry points or MCP servers.`;
|
|
180
|
+
try {
|
|
181
|
+
const { generateObject } = getTracedAI();
|
|
182
|
+
const { object: improvements } = await generateObject({
|
|
183
|
+
model,
|
|
184
|
+
schema: optimizerOutputSchema,
|
|
185
|
+
system: OPTIMIZER_SYSTEM_PROMPT,
|
|
186
|
+
prompt,
|
|
187
|
+
...(isReasoningModel(modelId) ? {} : { temperature: 0.3 }),
|
|
188
|
+
experimental_telemetry: {
|
|
189
|
+
isEnabled: true,
|
|
190
|
+
metadata: {
|
|
191
|
+
agent: 'optimizer',
|
|
192
|
+
previousScore: evaluation.qualityScore,
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
// Apply improvements to the result
|
|
197
|
+
const improved = {
|
|
198
|
+
...result,
|
|
199
|
+
codebaseAnalysis: {
|
|
200
|
+
...result.codebaseAnalysis,
|
|
201
|
+
implementationGuidelines: improvements.improvedGuidelines.length > 0
|
|
202
|
+
? improvements.improvedGuidelines
|
|
203
|
+
: result.codebaseAnalysis.implementationGuidelines,
|
|
204
|
+
projectContext: {
|
|
205
|
+
...result.codebaseAnalysis.projectContext,
|
|
206
|
+
entryPoints: improvements.additionalEntryPoints.length > 0
|
|
207
|
+
? [...new Set([...result.codebaseAnalysis.projectContext.entryPoints, ...improvements.additionalEntryPoints])]
|
|
208
|
+
: result.codebaseAnalysis.projectContext.entryPoints,
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
mcpServers: {
|
|
212
|
+
...result.mcpServers,
|
|
213
|
+
recommended: improvements.additionalMcpServers.length > 0
|
|
214
|
+
? [...new Set([...result.mcpServers.recommended, ...improvements.additionalMcpServers])]
|
|
215
|
+
: result.mcpServers.recommended,
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
if (verbose) {
|
|
219
|
+
logger.info(`Optimizer: Updated ${improvements.improvedGuidelines.length} guidelines`);
|
|
220
|
+
}
|
|
221
|
+
return improved;
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
if (verbose) {
|
|
225
|
+
logger.error(`Optimizer error: ${error instanceof Error ? error.message : String(error)}`);
|
|
226
|
+
}
|
|
227
|
+
// Return original result on error
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=evaluator-optimizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator-optimizer.js","sourceRoot":"","sources":["../../../src/ai/agents/evaluator-optimizer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD;;;GAGG;AACH,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B;;GAEG;AACH,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACnF,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IAC3E,2BAA2B,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;IACnG,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;IAC3F,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACrF,sBAAsB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,wCAAwC,CAAC;CAC/F,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IACtF,qBAAqB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,sDAAsD,CAAC;IAC3G,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,2DAA2D,CAAC;CAChH,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;iFAqBiD,CAAC;AAElF;;GAEG;AACH,MAAM,uBAAuB,GAAG;;;;;;;;;;;;iDAYiB,CAAC;AAElD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAoB,EACpB,OAAe,EACf,MAA0B,EAC1B,UAAsB,EACtB,gBAAwB,CAAC,EACzB,UAAmB,KAAK;IAExB,IAAI,aAAa,GAAG,MAAM,CAAC;IAC3B,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,OAAO,UAAU,GAAG,aAAa,EAAE,CAAC;QAClC,0BAA0B;QAC1B,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAE5F,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,wBAAwB,UAAU,GAAG,CAAC,YAAY,UAAU,CAAC,YAAY,KAAK,CAAC,CAAC;YAC5F,IAAI,UAAU,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzC,MAAM,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,IACE,UAAU,CAAC,YAAY,IAAI,iBAAiB;YAC5C,UAAU,CAAC,cAAc;YACzB,UAAU,CAAC,2BAA2B,EACtC,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;YACzE,CAAC;YACD,MAAM;QACR,CAAC;QAED,6BAA6B;QAC7B,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAChE,CAAC;QAED,aAAa,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QACzF,UAAU,EAAE,CAAC;IACf,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAC3B,KAAoB,EACpB,OAAe,EACf,MAA0B,EAC1B,UAAsB,EACtB,OAAgB;IAEhB,MAAM,MAAM,GAAG;;;gBAGD,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,WAAW;gBAClD,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;mBACpE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;cAC5F,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,MAAM;IACjE,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;iBAC5D,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;mBACpC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;;;aAGxD,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,IAAI,SAAS;YAC9C,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,IAAI,eAAe;WACnD,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,eAAe;;wDAEV,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,EAAE,cAAc,EAAE,GAAG,WAAW,EAAE,CAAC;QAEzC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,cAAc,CAAC;YAClD,KAAK;YACL,MAAM,EAAE,gBAAgB;YACxB,MAAM,EAAE,uBAAuB;YAC/B,MAAM;YACN,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;YAC1D,sBAAsB,EAAE;gBACtB,SAAS,EAAE,IAAI;gBACf,QAAQ,EAAE;oBACR,KAAK,EAAE,WAAW;oBAClB,WAAW,EAAE,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,WAAW;iBAChE;aACF;SACF,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,CAAC,oBAAoB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7F,CAAC;QAED,yDAAyD;QACzD,OAAO;YACL,YAAY,EAAE,CAAC;YACf,cAAc,EAAE,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YAC7E,2BAA2B,EAAE,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,MAAM,GAAG,CAAC;YACxF,qBAAqB,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;YAC7D,cAAc,EAAE,EAAE;YAClB,sBAAsB,EAAE,EAAE;SAC3B,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAC3B,KAAoB,EACpB,OAAe,EACf,MAA0B,EAC1B,UAA4B,EAC5B,OAAgB;IAEhB,MAAM,MAAM,GAAG;;;gBAGD,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,WAAW;gBAClD,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;;EAE3E,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;SAGvE,UAAU,CAAC,YAAY;UACtB,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;eACzC,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;;4EAEO,CAAC;IAE3E,IAAI,CAAC;QACH,MAAM,EAAE,cAAc,EAAE,GAAG,WAAW,EAAE,CAAC;QAEzC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,cAAc,CAAC;YACpD,KAAK;YACL,MAAM,EAAE,qBAAqB;YAC7B,MAAM,EAAE,uBAAuB;YAC/B,MAAM;YACN,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;YAC1D,sBAAsB,EAAE;gBACtB,SAAS,EAAE,IAAI;gBACf,QAAQ,EAAE;oBACR,KAAK,EAAE,WAAW;oBAClB,aAAa,EAAE,UAAU,CAAC,YAAY;iBACvC;aACF;SACF,CAAC,CAAC;QAEH,mCAAmC;QACnC,MAAM,QAAQ,GAAuB;YACnC,GAAG,MAAM;YACT,gBAAgB,EAAE;gBAChB,GAAG,MAAM,CAAC,gBAAgB;gBAC1B,wBAAwB,EAAE,YAAY,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;oBAClE,CAAC,CAAC,YAAY,CAAC,kBAAkB;oBACjC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,wBAAwB;gBACpD,cAAc,EAAE;oBACd,GAAG,MAAM,CAAC,gBAAgB,CAAC,cAAc;oBACzC,WAAW,EAAE,YAAY,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC;wBACxD,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,WAAW,EAAE,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC,CAAC;wBAC9G,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,WAAW;iBACvD;aACF;YACD,UAAU,EAAE;gBACV,GAAG,MAAM,CAAC,UAAU;gBACpB,WAAW,EAAE,YAAY,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC;oBACvD,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,GAAG,YAAY,CAAC,oBAAoB,CAAC,CAAC,CAAC;oBACxF,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW;aAClC;SACF,CAAC;QAEF,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,sBAAsB,YAAY,CAAC,kBAAkB,CAAC,MAAM,aAAa,CAAC,CAAC;QACzF,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,CAAC,oBAAoB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7F,CAAC;QAED,kCAAkC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Agents Index
|
|
3
|
-
*
|
|
3
|
+
* Multi-agent analysis with Orchestrator-Worker + Evaluator-Optimizer pattern
|
|
4
|
+
*
|
|
5
|
+
* Architecture:
|
|
6
|
+
* Phase 1: Planning Orchestrator (creates analysis plan)
|
|
7
|
+
* Phase 2: Parallel Workers (context enricher + tech researchers)
|
|
8
|
+
* Phase 3: Synthesis (merge results + MCP detection)
|
|
9
|
+
* Phase 4: Evaluator-Optimizer (QA loop)
|
|
4
10
|
*/
|
|
5
|
-
export type { CodebaseAnalysis, StackResearch, McpRecommendations, MultiAgentAnalysis, AgentCapabilities, AgentOptions, CodebaseAnalystInput, StackResearcherInput, OrchestratorInput, } from './types.js';
|
|
11
|
+
export type { AnalysisPlan, EnrichedContext, TechResearchResult, RalphMcpServers, EvaluationResult, ContextEnricherInput, TechResearcherInput, SynthesisInput, ProgressCallback, CodebaseAnalysis, StackResearch, McpRecommendations, MultiAgentAnalysis, AgentCapabilities, AgentOptions, CodebaseAnalystInput, StackResearcherInput, OrchestratorInput, } from './types.js';
|
|
12
|
+
export { runPlanningOrchestrator } from './planning-orchestrator.js';
|
|
13
|
+
export { runContextEnricher } from './context-enricher.js';
|
|
14
|
+
export { runTechResearcher, runTechResearchPool } from './tech-researcher.js';
|
|
15
|
+
export { detectRalphMcpServers, convertToLegacyMcpRecommendations } from './mcp-detector.js';
|
|
16
|
+
export { runSynthesisAgent } from './synthesis-agent.js';
|
|
17
|
+
export { runEvaluatorOptimizer } from './evaluator-optimizer.js';
|
|
18
|
+
export { detectProjectType } from './stack-utils.js';
|
|
6
19
|
export { runCodebaseAnalyst } from './codebase-analyst.js';
|
|
7
20
|
export { runStackResearcher } from './stack-researcher.js';
|
|
8
21
|
export { runOrchestrator, mergeAgentResults } from './orchestrator.js';
|
|
@@ -10,7 +23,12 @@ import type { LanguageModel } from 'ai';
|
|
|
10
23
|
import type { ScanResult } from '../../scanner/types.js';
|
|
11
24
|
import type { MultiAgentAnalysis, AgentOptions } from './types.js';
|
|
12
25
|
/**
|
|
13
|
-
* Run the full multi-agent analysis pipeline
|
|
26
|
+
* Run the full multi-agent analysis pipeline (new architecture)
|
|
27
|
+
*
|
|
28
|
+
* Phase 1: Planning Orchestrator - Creates focused analysis plan
|
|
29
|
+
* Phase 2: Parallel Workers - Context enricher + tech researchers run concurrently
|
|
30
|
+
* Phase 3: Synthesis - Merges results + detects MCPs
|
|
31
|
+
* Phase 4: Evaluator-Optimizer - QA loop (max 2 iterations)
|
|
14
32
|
*/
|
|
15
33
|
export declare function runMultiAgentAnalysis(model: LanguageModel, modelId: string, scanResult: ScanResult, options?: AgentOptions): Promise<MultiAgentAnalysis | null>;
|
|
16
34
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/agents/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/agents/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,YAAY,EAEV,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAEhB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,iCAAiC,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EACV,kBAAkB,EAElB,YAAY,EAEb,MAAM,YAAY,CAAC;AAUpB;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA8HpC"}
|