atlas-pipeline-mcp 1.0.0
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/.env.example +21 -0
- package/LICENSE +21 -0
- package/README.md +175 -0
- package/dist/mcp.d.ts +21 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +404 -0
- package/dist/mcp.js.map +1 -0
- package/dist/pipeline.d.ts +39 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +355 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/providers/index.d.ts +14 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +13 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/llm-provider.d.ts +71 -0
- package/dist/providers/llm-provider.d.ts.map +1 -0
- package/dist/providers/llm-provider.js +357 -0
- package/dist/providers/llm-provider.js.map +1 -0
- package/dist/server.d.ts +27 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +312 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/context.d.ts +23 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +363 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/critique.d.ts +40 -0
- package/dist/tools/critique.d.ts.map +1 -0
- package/dist/tools/critique.js +315 -0
- package/dist/tools/critique.js.map +1 -0
- package/dist/tools/decompose.d.ts +34 -0
- package/dist/tools/decompose.d.ts.map +1 -0
- package/dist/tools/decompose.js +328 -0
- package/dist/tools/decompose.js.map +1 -0
- package/dist/tools/git.d.ts +66 -0
- package/dist/tools/git.d.ts.map +1 -0
- package/dist/tools/git.js +333 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/intent.d.ts +24 -0
- package/dist/tools/intent.d.ts.map +1 -0
- package/dist/tools/intent.js +245 -0
- package/dist/tools/intent.js.map +1 -0
- package/dist/tools/ollama.d.ts +104 -0
- package/dist/tools/ollama.d.ts.map +1 -0
- package/dist/tools/ollama.js +299 -0
- package/dist/tools/ollama.js.map +1 -0
- package/dist/tools/optimize.d.ts +64 -0
- package/dist/tools/optimize.d.ts.map +1 -0
- package/dist/tools/optimize.js +302 -0
- package/dist/tools/optimize.js.map +1 -0
- package/dist/tools/variants.d.ts +49 -0
- package/dist/tools/variants.d.ts.map +1 -0
- package/dist/tools/variants.js +252 -0
- package/dist/tools/variants.js.map +1 -0
- package/dist/types.d.ts +447 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +25 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +117 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +279 -0
- package/dist/utils.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atlas Server - Optimization Tool
|
|
3
|
+
*
|
|
4
|
+
* Takes the best variant and critique, then produces an optimized final output:
|
|
5
|
+
* - Addresses identified issues
|
|
6
|
+
* - Applies performance improvements
|
|
7
|
+
* - Enhances readability and maintainability
|
|
8
|
+
* - Follows best practices
|
|
9
|
+
*/
|
|
10
|
+
import { getOllamaClient, PromptTemplates } from './ollama.js';
|
|
11
|
+
import { logger } from '../utils.js';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Optimization
|
|
14
|
+
// ============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* Optimize the best variant based on critique feedback
|
|
17
|
+
*/
|
|
18
|
+
export async function optimizeVariant(variant, critique) {
|
|
19
|
+
logger.debug({
|
|
20
|
+
variantId: variant.id,
|
|
21
|
+
qualityScore: critique.qualityScore,
|
|
22
|
+
issueCount: critique.issues.length
|
|
23
|
+
}, 'Starting optimization');
|
|
24
|
+
// If quality is already high and no critical issues, minimal optimization needed
|
|
25
|
+
if (critique.qualityScore >= 90 && !hasCriticalIssues(critique)) {
|
|
26
|
+
return createMinimalOptimization(variant, critique);
|
|
27
|
+
}
|
|
28
|
+
const client = getOllamaClient();
|
|
29
|
+
const prompt = buildOptimizationPrompt(variant, critique);
|
|
30
|
+
const response = await client.generateJson(prompt, {
|
|
31
|
+
systemPrompt: PromptTemplates.optimization,
|
|
32
|
+
temperature: 0.4,
|
|
33
|
+
maxTokens: 4096,
|
|
34
|
+
});
|
|
35
|
+
if (response.data) {
|
|
36
|
+
const optimizations = response.data.optimizations.map((opt) => ({
|
|
37
|
+
type: normalizeOptimizationType(opt.type),
|
|
38
|
+
description: opt.description,
|
|
39
|
+
impact: normalizeImpact(opt.impact),
|
|
40
|
+
}));
|
|
41
|
+
// Re-assess the optimized code
|
|
42
|
+
const finalMetrics = estimateFinalMetrics(critique.assessment, optimizations);
|
|
43
|
+
return {
|
|
44
|
+
content: response.data.optimizedContent,
|
|
45
|
+
optimizationsApplied: optimizations,
|
|
46
|
+
finalMetrics,
|
|
47
|
+
explanation: response.data.explanation,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// Fallback: return variant with minor adjustments
|
|
51
|
+
logger.warn('Optimization failed, using fallback');
|
|
52
|
+
return createMinimalOptimization(variant, critique);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Build the optimization prompt
|
|
56
|
+
*/
|
|
57
|
+
function buildOptimizationPrompt(variant, critique) {
|
|
58
|
+
const criticalIssues = critique.issues.filter((i) => i.severity === 'critical');
|
|
59
|
+
const majorIssues = critique.issues.filter((i) => i.severity === 'major');
|
|
60
|
+
const minorIssues = critique.issues.filter((i) => i.severity === 'minor');
|
|
61
|
+
return `Optimize this code based on the critique feedback.
|
|
62
|
+
|
|
63
|
+
## Original Code (Variant ${variant.label})
|
|
64
|
+
\`\`\`
|
|
65
|
+
${variant.content}
|
|
66
|
+
\`\`\`
|
|
67
|
+
|
|
68
|
+
## Approach
|
|
69
|
+
${variant.approach}
|
|
70
|
+
|
|
71
|
+
## Quality Assessment
|
|
72
|
+
- Correctness: ${critique.assessment.correctness}/100
|
|
73
|
+
- Performance: ${critique.assessment.performance}/100
|
|
74
|
+
- Maintainability: ${critique.assessment.maintainability}/100
|
|
75
|
+
- Security: ${critique.assessment.security}/100
|
|
76
|
+
- Best Practices: ${critique.assessment.bestPractices}/100
|
|
77
|
+
|
|
78
|
+
## Issues to Address
|
|
79
|
+
|
|
80
|
+
${criticalIssues.length > 0 ? `### Critical Issues (MUST FIX)
|
|
81
|
+
${criticalIssues.map((i) => `- ${i.description}${i.suggestedFix ? ` → ${i.suggestedFix}` : ''}`).join('\n')}` : ''}
|
|
82
|
+
|
|
83
|
+
${majorIssues.length > 0 ? `### Major Issues (Should Fix)
|
|
84
|
+
${majorIssues.map((i) => `- ${i.description}${i.suggestedFix ? ` → ${i.suggestedFix}` : ''}`).join('\n')}` : ''}
|
|
85
|
+
|
|
86
|
+
${minorIssues.length > 0 ? `### Minor Issues (Nice to Fix)
|
|
87
|
+
${minorIssues.map((i) => `- ${i.description}`).join('\n')}` : ''}
|
|
88
|
+
|
|
89
|
+
## Suggestions
|
|
90
|
+
${critique.suggestions.map((s) => `- ${s}`).join('\n')}
|
|
91
|
+
|
|
92
|
+
## Requirements
|
|
93
|
+
1. Fix ALL critical issues
|
|
94
|
+
2. Address major issues where possible
|
|
95
|
+
3. Improve the lowest-scoring assessment areas
|
|
96
|
+
4. Maintain the original functionality
|
|
97
|
+
5. Keep the code clean and readable
|
|
98
|
+
|
|
99
|
+
## Output Format
|
|
100
|
+
{
|
|
101
|
+
"optimizedContent": "The complete optimized code",
|
|
102
|
+
"optimizations": [
|
|
103
|
+
{
|
|
104
|
+
"type": "performance|readability|security|simplification|best_practice",
|
|
105
|
+
"description": "What was changed",
|
|
106
|
+
"impact": "low|medium|high"
|
|
107
|
+
}
|
|
108
|
+
],
|
|
109
|
+
"explanation": "Summary of optimizations and why they improve the code"
|
|
110
|
+
}`;
|
|
111
|
+
}
|
|
112
|
+
// ============================================================================
|
|
113
|
+
// Helpers
|
|
114
|
+
// ============================================================================
|
|
115
|
+
/**
|
|
116
|
+
* Check if critique has critical issues
|
|
117
|
+
*/
|
|
118
|
+
function hasCriticalIssues(critique) {
|
|
119
|
+
return critique.issues.some((i) => i.severity === 'critical');
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Create minimal optimization for already-good code
|
|
123
|
+
*/
|
|
124
|
+
function createMinimalOptimization(variant, critique) {
|
|
125
|
+
return {
|
|
126
|
+
content: variant.content,
|
|
127
|
+
optimizationsApplied: [{
|
|
128
|
+
type: 'best_practice',
|
|
129
|
+
description: 'Code quality verified, no significant changes needed',
|
|
130
|
+
impact: 'low',
|
|
131
|
+
}],
|
|
132
|
+
finalMetrics: critique.assessment,
|
|
133
|
+
explanation: `The solution (Variant ${variant.label}) scored ${critique.qualityScore}/100 and ` +
|
|
134
|
+
`requires no significant optimization. The approach "${variant.approach}" is solid.`,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Normalize optimization type
|
|
139
|
+
*/
|
|
140
|
+
function normalizeOptimizationType(type) {
|
|
141
|
+
const normalized = type.toLowerCase();
|
|
142
|
+
if (normalized.includes('perform'))
|
|
143
|
+
return 'performance';
|
|
144
|
+
if (normalized.includes('read') || normalized.includes('maintain'))
|
|
145
|
+
return 'readability';
|
|
146
|
+
if (normalized.includes('secur'))
|
|
147
|
+
return 'security';
|
|
148
|
+
if (normalized.includes('simpl'))
|
|
149
|
+
return 'simplification';
|
|
150
|
+
return 'best_practice';
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Normalize impact level
|
|
154
|
+
*/
|
|
155
|
+
function normalizeImpact(impact) {
|
|
156
|
+
const normalized = impact.toLowerCase();
|
|
157
|
+
if (normalized === 'high')
|
|
158
|
+
return 'high';
|
|
159
|
+
if (normalized === 'medium')
|
|
160
|
+
return 'medium';
|
|
161
|
+
return 'low';
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Estimate final metrics after optimizations
|
|
165
|
+
*/
|
|
166
|
+
function estimateFinalMetrics(original, optimizations) {
|
|
167
|
+
const improved = { ...original };
|
|
168
|
+
for (const opt of optimizations) {
|
|
169
|
+
const boost = opt.impact === 'high' ? 10 : opt.impact === 'medium' ? 5 : 2;
|
|
170
|
+
switch (opt.type) {
|
|
171
|
+
case 'performance':
|
|
172
|
+
improved.performance = Math.min(100, improved.performance + boost);
|
|
173
|
+
break;
|
|
174
|
+
case 'readability':
|
|
175
|
+
improved.maintainability = Math.min(100, improved.maintainability + boost);
|
|
176
|
+
break;
|
|
177
|
+
case 'security':
|
|
178
|
+
improved.security = Math.min(100, improved.security + boost);
|
|
179
|
+
break;
|
|
180
|
+
case 'simplification':
|
|
181
|
+
improved.maintainability = Math.min(100, improved.maintainability + boost);
|
|
182
|
+
improved.bestPractices = Math.min(100, improved.bestPractices + boost / 2);
|
|
183
|
+
break;
|
|
184
|
+
case 'best_practice':
|
|
185
|
+
improved.bestPractices = Math.min(100, improved.bestPractices + boost);
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return improved;
|
|
190
|
+
}
|
|
191
|
+
// ============================================================================
|
|
192
|
+
// Advanced Optimization Strategies
|
|
193
|
+
// ============================================================================
|
|
194
|
+
/**
|
|
195
|
+
* Apply multiple optimization passes
|
|
196
|
+
*/
|
|
197
|
+
export async function multiPassOptimization(variant, critique, maxPasses = 2) {
|
|
198
|
+
let currentContent = variant.content;
|
|
199
|
+
let currentCritique = critique;
|
|
200
|
+
const allOptimizations = [];
|
|
201
|
+
for (let pass = 0; pass < maxPasses; pass++) {
|
|
202
|
+
// Skip if already high quality
|
|
203
|
+
if (currentCritique.qualityScore >= 95) {
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
const currentVariant = {
|
|
207
|
+
...variant,
|
|
208
|
+
content: currentContent,
|
|
209
|
+
};
|
|
210
|
+
const result = await optimizeVariant(currentVariant, currentCritique);
|
|
211
|
+
currentContent = result.content;
|
|
212
|
+
allOptimizations.push(...result.optimizationsApplied);
|
|
213
|
+
// Update critique for next pass (simplified - in reality would re-critique)
|
|
214
|
+
currentCritique = {
|
|
215
|
+
...currentCritique,
|
|
216
|
+
qualityScore: Math.min(100, currentCritique.qualityScore + 10),
|
|
217
|
+
assessment: result.finalMetrics,
|
|
218
|
+
issues: currentCritique.issues.filter((i) => i.severity === 'minor'),
|
|
219
|
+
};
|
|
220
|
+
logger.debug({ pass: pass + 1, qualityScore: currentCritique.qualityScore }, 'Optimization pass complete');
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
content: currentContent,
|
|
224
|
+
optimizationsApplied: allOptimizations,
|
|
225
|
+
finalMetrics: currentCritique.assessment,
|
|
226
|
+
explanation: `Applied ${allOptimizations.length} optimizations across ${Math.min(maxPasses, allOptimizations.length > 0 ? maxPasses : 1)} passes.`,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Optimization presets for common scenarios
|
|
231
|
+
*/
|
|
232
|
+
export const OptimizationPresets = {
|
|
233
|
+
/**
|
|
234
|
+
* Focus on performance optimizations
|
|
235
|
+
*/
|
|
236
|
+
performance: {
|
|
237
|
+
focus: ['performance', 'simplification'],
|
|
238
|
+
minScoreThreshold: 70,
|
|
239
|
+
maxIterations: 2,
|
|
240
|
+
},
|
|
241
|
+
/**
|
|
242
|
+
* Focus on code quality and maintainability
|
|
243
|
+
*/
|
|
244
|
+
quality: {
|
|
245
|
+
focus: ['readability', 'best_practice'],
|
|
246
|
+
minScoreThreshold: 80,
|
|
247
|
+
maxIterations: 2,
|
|
248
|
+
},
|
|
249
|
+
/**
|
|
250
|
+
* Focus on security hardening
|
|
251
|
+
*/
|
|
252
|
+
security: {
|
|
253
|
+
focus: ['security'],
|
|
254
|
+
minScoreThreshold: 90,
|
|
255
|
+
maxIterations: 3,
|
|
256
|
+
},
|
|
257
|
+
/**
|
|
258
|
+
* Balanced optimization
|
|
259
|
+
*/
|
|
260
|
+
balanced: {
|
|
261
|
+
focus: ['performance', 'readability', 'security', 'best_practice'],
|
|
262
|
+
minScoreThreshold: 75,
|
|
263
|
+
maxIterations: 2,
|
|
264
|
+
},
|
|
265
|
+
};
|
|
266
|
+
/**
|
|
267
|
+
* Get optimization recommendations based on critique
|
|
268
|
+
*/
|
|
269
|
+
export function getOptimizationRecommendations(critique) {
|
|
270
|
+
const { assessment } = critique;
|
|
271
|
+
// Find weakest areas
|
|
272
|
+
const scores = Object.entries(assessment);
|
|
273
|
+
const weakest = scores.sort((a, b) => a[1] - b[1]).slice(0, 2);
|
|
274
|
+
// Determine best preset
|
|
275
|
+
if (critique.issues.some((i) => i.category === 'security' && i.severity === 'critical')) {
|
|
276
|
+
return {
|
|
277
|
+
preset: 'security',
|
|
278
|
+
reason: 'Critical security issues detected',
|
|
279
|
+
focusAreas: ['security'],
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
if (assessment.performance < 50) {
|
|
283
|
+
return {
|
|
284
|
+
preset: 'performance',
|
|
285
|
+
reason: 'Performance score is below threshold',
|
|
286
|
+
focusAreas: weakest.map(([area]) => area),
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
if (assessment.maintainability < 60 || assessment.bestPractices < 60) {
|
|
290
|
+
return {
|
|
291
|
+
preset: 'quality',
|
|
292
|
+
reason: 'Code quality needs improvement',
|
|
293
|
+
focusAreas: weakest.map(([area]) => area),
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
return {
|
|
297
|
+
preset: 'balanced',
|
|
298
|
+
reason: 'General optimization recommended',
|
|
299
|
+
focusAreas: weakest.map(([area]) => area),
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=optimize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize.js","sourceRoot":"","sources":["../../src/tools/optimize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atlas Server - Variant Generation Tool
|
|
3
|
+
*
|
|
4
|
+
* Generates multiple solution variants for a given task:
|
|
5
|
+
* - Different approaches with trade-offs
|
|
6
|
+
* - Pros and cons analysis
|
|
7
|
+
* - Use case recommendations
|
|
8
|
+
* - Diversity in implementation strategies
|
|
9
|
+
*/
|
|
10
|
+
import type { PipelineContext, DecompositionResult, SolutionVariant, VariantGenerationResult } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Generate multiple solution variants for a task
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateVariants(context: PipelineContext, decomposition: DecompositionResult, variantCount?: number): Promise<VariantGenerationResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Compare variants and rank them
|
|
17
|
+
*/
|
|
18
|
+
export declare function rankVariants(variants: SolutionVariant[], criteria: RankingCriteria): RankedVariant[];
|
|
19
|
+
export interface RankingCriteria {
|
|
20
|
+
/** Weight for simplicity (0-1) */
|
|
21
|
+
simplicityWeight: number;
|
|
22
|
+
/** Weight for performance (0-1) */
|
|
23
|
+
performanceWeight: number;
|
|
24
|
+
/** Weight for maintainability (0-1) */
|
|
25
|
+
maintainabilityWeight: number;
|
|
26
|
+
/** Weight for feature completeness (0-1) */
|
|
27
|
+
completenessWeight: number;
|
|
28
|
+
}
|
|
29
|
+
export interface RankedVariant extends SolutionVariant {
|
|
30
|
+
rank: number;
|
|
31
|
+
score: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Ensure variants are sufficiently diverse
|
|
35
|
+
*/
|
|
36
|
+
export declare function checkVariantDiversity(variants: SolutionVariant[]): {
|
|
37
|
+
isDiverse: boolean;
|
|
38
|
+
similarityScore: number;
|
|
39
|
+
suggestions: string[];
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Merge best aspects of multiple variants
|
|
43
|
+
*/
|
|
44
|
+
export declare function synthesizeBestAspects(variants: SolutionVariant[]): {
|
|
45
|
+
combinedPros: string[];
|
|
46
|
+
conflictingAspects: string[];
|
|
47
|
+
synthesis: string;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=variants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../src/tools/variants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACxB,MAAM,aAAa,CAAC;AAerB;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,eAAe,EACxB,aAAa,EAAE,mBAAmB,EAClC,YAAY,GAAE,MAA8B,GAC3C,OAAO,CAAC,uBAAuB,CAAC,CAqDlC;AA6GD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,eAAe,EAAE,EAC3B,QAAQ,EAAE,eAAe,GACxB,aAAa,EAAE,CAYjB;AAED,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,mCAAmC;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uCAAuC;IACvC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,4CAA4C;IAC5C,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAmDD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG;IAClE,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAmCA;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,eAAe,EAAE,GAC1B;IACD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB,CAyBA"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atlas Server - Variant Generation Tool
|
|
3
|
+
*
|
|
4
|
+
* Generates multiple solution variants for a given task:
|
|
5
|
+
* - Different approaches with trade-offs
|
|
6
|
+
* - Pros and cons analysis
|
|
7
|
+
* - Use case recommendations
|
|
8
|
+
* - Diversity in implementation strategies
|
|
9
|
+
*/
|
|
10
|
+
import { getOllamaClient, PromptTemplates } from './ollama.js';
|
|
11
|
+
import { logger, generateId } from '../utils.js';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Configuration
|
|
14
|
+
// ============================================================================
|
|
15
|
+
const DEFAULT_VARIANT_COUNT = 3;
|
|
16
|
+
const VARIANT_LABELS = ['A', 'B', 'C', 'D', 'E'];
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Variant Generation
|
|
19
|
+
// ============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Generate multiple solution variants for a task
|
|
22
|
+
*/
|
|
23
|
+
export async function generateVariants(context, decomposition, variantCount = DEFAULT_VARIANT_COUNT) {
|
|
24
|
+
logger.debug({ taskCount: decomposition.tasks.length, variantCount }, 'Starting variant generation');
|
|
25
|
+
const client = getOllamaClient();
|
|
26
|
+
const prompt = buildVariantPrompt(context, decomposition, variantCount);
|
|
27
|
+
const response = await client.generateJson(prompt, {
|
|
28
|
+
systemPrompt: PromptTemplates.variantGeneration,
|
|
29
|
+
temperature: 0.7, // Higher temp for creative diversity
|
|
30
|
+
maxTokens: 4096,
|
|
31
|
+
});
|
|
32
|
+
if (response.data) {
|
|
33
|
+
const variants = response.data.variants.map((v, index) => ({
|
|
34
|
+
id: generateId(),
|
|
35
|
+
label: VARIANT_LABELS[index] ?? `V${index + 1}`,
|
|
36
|
+
content: v.content,
|
|
37
|
+
approach: v.approach,
|
|
38
|
+
tradeoffs: {
|
|
39
|
+
pros: v.pros,
|
|
40
|
+
cons: v.cons,
|
|
41
|
+
},
|
|
42
|
+
useCase: v.useCase,
|
|
43
|
+
}));
|
|
44
|
+
const recommendedIndex = Math.min(Math.max(0, response.data.recommendedIndex), variants.length - 1);
|
|
45
|
+
return {
|
|
46
|
+
variants,
|
|
47
|
+
recommendedVariantId: variants[recommendedIndex]?.id ?? variants[0]?.id ?? '',
|
|
48
|
+
recommendationReason: response.data.recommendationReason,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// Fallback: generate single variant
|
|
52
|
+
logger.warn('Variant generation failed, using fallback');
|
|
53
|
+
return fallbackVariant(context, decomposition);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Build the variant generation prompt
|
|
57
|
+
*/
|
|
58
|
+
function buildVariantPrompt(context, decomposition, variantCount) {
|
|
59
|
+
const { intent, projectInfo, codeSnippets } = context;
|
|
60
|
+
let prompt = `Generate ${variantCount} different solution variants for this task.
|
|
61
|
+
|
|
62
|
+
## Task Summary
|
|
63
|
+
${decomposition.summary}
|
|
64
|
+
|
|
65
|
+
## Subtasks
|
|
66
|
+
${decomposition.tasks.map((t) => `- [${t.type}] ${t.description} (${t.complexity} complexity)`).join('\n')}
|
|
67
|
+
|
|
68
|
+
## Intent
|
|
69
|
+
- Type: ${intent.primaryIntent}
|
|
70
|
+
- Keywords: ${intent.keywords.join(', ')}
|
|
71
|
+
`;
|
|
72
|
+
if (projectInfo) {
|
|
73
|
+
prompt += `
|
|
74
|
+
## Project Context
|
|
75
|
+
- Languages: ${projectInfo.languages.join(', ')}
|
|
76
|
+
- Frameworks: ${projectInfo.frameworks.join(', ')}
|
|
77
|
+
`;
|
|
78
|
+
}
|
|
79
|
+
if (codeSnippets.length > 0) {
|
|
80
|
+
prompt += `
|
|
81
|
+
## Existing Code Context
|
|
82
|
+
${codeSnippets[0] ? `\`\`\`${codeSnippets[0].language}\n${codeSnippets[0].content.substring(0, 800)}\n\`\`\`` : ''}
|
|
83
|
+
`;
|
|
84
|
+
}
|
|
85
|
+
prompt += `
|
|
86
|
+
## Requirements
|
|
87
|
+
Generate ${variantCount} meaningfully different solutions. Each should:
|
|
88
|
+
1. Take a different approach or make different trade-offs
|
|
89
|
+
2. Be complete and production-ready
|
|
90
|
+
3. Include clear pros and cons
|
|
91
|
+
4. Specify the best use case
|
|
92
|
+
|
|
93
|
+
## Output Format
|
|
94
|
+
{
|
|
95
|
+
"variants": [
|
|
96
|
+
{
|
|
97
|
+
"approach": "Brief description of the approach",
|
|
98
|
+
"content": "The complete solution code or text",
|
|
99
|
+
"pros": ["advantage 1", "advantage 2"],
|
|
100
|
+
"cons": ["disadvantage 1", "disadvantage 2"],
|
|
101
|
+
"useCase": "When to use this approach"
|
|
102
|
+
}
|
|
103
|
+
],
|
|
104
|
+
"recommendedIndex": 0,
|
|
105
|
+
"recommendationReason": "Why this variant is recommended for most cases"
|
|
106
|
+
}`;
|
|
107
|
+
return prompt;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Fallback variant when LLM fails
|
|
111
|
+
*/
|
|
112
|
+
function fallbackVariant(context, decomposition) {
|
|
113
|
+
const variant = {
|
|
114
|
+
id: generateId(),
|
|
115
|
+
label: 'A',
|
|
116
|
+
content: `// Solution for: ${decomposition.summary}
|
|
117
|
+
//
|
|
118
|
+
// Tasks:
|
|
119
|
+
${decomposition.tasks.map((t) => `// - ${t.description}`).join('\n')}
|
|
120
|
+
//
|
|
121
|
+
// Implementation needed based on the specific requirements.
|
|
122
|
+
// This is a placeholder for the actual solution.
|
|
123
|
+
|
|
124
|
+
function solution() {
|
|
125
|
+
// TODO: Implement based on task breakdown
|
|
126
|
+
throw new Error('Not implemented');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export { solution };`,
|
|
130
|
+
approach: 'Standard implementation approach',
|
|
131
|
+
tradeoffs: {
|
|
132
|
+
pros: ['Straightforward implementation', 'Easy to understand'],
|
|
133
|
+
cons: ['May need refinement', 'Generic approach'],
|
|
134
|
+
},
|
|
135
|
+
useCase: 'General purpose implementation',
|
|
136
|
+
};
|
|
137
|
+
return {
|
|
138
|
+
variants: [variant],
|
|
139
|
+
recommendedVariantId: variant.id,
|
|
140
|
+
recommendationReason: 'Single fallback variant generated',
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
// ============================================================================
|
|
144
|
+
// Variant Analysis
|
|
145
|
+
// ============================================================================
|
|
146
|
+
/**
|
|
147
|
+
* Compare variants and rank them
|
|
148
|
+
*/
|
|
149
|
+
export function rankVariants(variants, criteria) {
|
|
150
|
+
return variants
|
|
151
|
+
.map((variant) => ({
|
|
152
|
+
variant,
|
|
153
|
+
score: calculateVariantScore(variant, criteria),
|
|
154
|
+
}))
|
|
155
|
+
.sort((a, b) => b.score - a.score)
|
|
156
|
+
.map((item, index) => ({
|
|
157
|
+
...item.variant,
|
|
158
|
+
rank: index + 1,
|
|
159
|
+
score: item.score,
|
|
160
|
+
}));
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Calculate score for a variant based on criteria
|
|
164
|
+
*/
|
|
165
|
+
function calculateVariantScore(variant, criteria) {
|
|
166
|
+
let score = 50; // Base score
|
|
167
|
+
// Adjust based on pros/cons ratio
|
|
168
|
+
const prosConsRatio = variant.tradeoffs.pros.length /
|
|
169
|
+
Math.max(1, variant.tradeoffs.cons.length);
|
|
170
|
+
score += Math.min(20, prosConsRatio * 10);
|
|
171
|
+
// Adjust based on code length (simple heuristic)
|
|
172
|
+
const codeLength = variant.content.length;
|
|
173
|
+
if (codeLength < 500) {
|
|
174
|
+
score += criteria.simplicityWeight * 15;
|
|
175
|
+
}
|
|
176
|
+
else if (codeLength > 2000) {
|
|
177
|
+
score -= criteria.simplicityWeight * 10;
|
|
178
|
+
}
|
|
179
|
+
// Check for performance keywords
|
|
180
|
+
const performanceKeywords = ['efficient', 'optimized', 'fast', 'cached', 'lazy'];
|
|
181
|
+
const hasPerformanceFeatures = performanceKeywords.some((kw) => variant.content.toLowerCase().includes(kw) ||
|
|
182
|
+
variant.approach.toLowerCase().includes(kw));
|
|
183
|
+
if (hasPerformanceFeatures) {
|
|
184
|
+
score += criteria.performanceWeight * 15;
|
|
185
|
+
}
|
|
186
|
+
// Check for maintainability indicators
|
|
187
|
+
const maintainabilityKeywords = ['modular', 'clean', 'documented', 'typed', 'tested'];
|
|
188
|
+
const hasMaintainabilityFeatures = maintainabilityKeywords.some((kw) => variant.approach.toLowerCase().includes(kw));
|
|
189
|
+
if (hasMaintainabilityFeatures) {
|
|
190
|
+
score += criteria.maintainabilityWeight * 15;
|
|
191
|
+
}
|
|
192
|
+
return Math.min(100, Math.max(0, score));
|
|
193
|
+
}
|
|
194
|
+
// ============================================================================
|
|
195
|
+
// Variant Diversity
|
|
196
|
+
// ============================================================================
|
|
197
|
+
/**
|
|
198
|
+
* Ensure variants are sufficiently diverse
|
|
199
|
+
*/
|
|
200
|
+
export function checkVariantDiversity(variants) {
|
|
201
|
+
if (variants.length < 2) {
|
|
202
|
+
return {
|
|
203
|
+
isDiverse: true,
|
|
204
|
+
similarityScore: 0,
|
|
205
|
+
suggestions: [],
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
// Simple diversity check based on approach descriptions
|
|
209
|
+
const approaches = variants.map((v) => v.approach.toLowerCase());
|
|
210
|
+
const uniqueWords = new Set();
|
|
211
|
+
const allWords = [];
|
|
212
|
+
for (const approach of approaches) {
|
|
213
|
+
const words = approach.split(/\s+/).filter((w) => w.length > 3);
|
|
214
|
+
words.forEach((w) => uniqueWords.add(w));
|
|
215
|
+
allWords.push(...words);
|
|
216
|
+
}
|
|
217
|
+
const diversityRatio = uniqueWords.size / Math.max(1, allWords.length);
|
|
218
|
+
const isDiverse = diversityRatio > 0.5;
|
|
219
|
+
const suggestions = [];
|
|
220
|
+
if (!isDiverse) {
|
|
221
|
+
suggestions.push('Consider approaches with different paradigms (functional vs OOP)');
|
|
222
|
+
suggestions.push('Explore trade-offs between simplicity and features');
|
|
223
|
+
suggestions.push('Consider different libraries or built-in alternatives');
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
isDiverse,
|
|
227
|
+
similarityScore: 1 - diversityRatio,
|
|
228
|
+
suggestions,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Merge best aspects of multiple variants
|
|
233
|
+
*/
|
|
234
|
+
export function synthesizeBestAspects(variants) {
|
|
235
|
+
const allPros = variants.flatMap((v) => v.tradeoffs.pros);
|
|
236
|
+
const allCons = variants.flatMap((v) => v.tradeoffs.cons);
|
|
237
|
+
// Find unique pros
|
|
238
|
+
const uniquePros = [...new Set(allPros)];
|
|
239
|
+
// Find conflicts (aspects that are pros in some variants but cons in others)
|
|
240
|
+
const conflictingAspects = uniquePros.filter((pro) => allCons.some((con) => con.toLowerCase().includes(pro.toLowerCase().split(' ')[0] ?? '')));
|
|
241
|
+
const synthesis = `A synthesized solution could combine:
|
|
242
|
+
${uniquePros.slice(0, 5).map((p) => `- ${p}`).join('\n')}
|
|
243
|
+
|
|
244
|
+
While being mindful of:
|
|
245
|
+
${conflictingAspects.slice(0, 3).map((c) => `- ${c}`).join('\n') || '- No major conflicts identified'}`;
|
|
246
|
+
return {
|
|
247
|
+
combinedPros: uniquePros,
|
|
248
|
+
conflictingAspects,
|
|
249
|
+
synthesis,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=variants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variants.js","sourceRoot":"","sources":["../../src/tools/variants.ts"],"names":[],"mappings":"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"}
|