@omaikit/agents 0.1.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/README.md +31 -0
- package/dist/agent.d.ts +31 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +30 -0
- package/dist/agent.js.map +1 -0
- package/dist/ai-provider/anthropic.d.ts +13 -0
- package/dist/ai-provider/anthropic.d.ts.map +1 -0
- package/dist/ai-provider/anthropic.js +85 -0
- package/dist/ai-provider/anthropic.js.map +1 -0
- package/dist/ai-provider/factory.d.ts +3 -0
- package/dist/ai-provider/factory.d.ts.map +1 -0
- package/dist/ai-provider/factory.js +22 -0
- package/dist/ai-provider/factory.js.map +1 -0
- package/dist/ai-provider/openai.d.ts +16 -0
- package/dist/ai-provider/openai.d.ts.map +1 -0
- package/dist/ai-provider/openai.js +252 -0
- package/dist/ai-provider/openai.js.map +1 -0
- package/dist/ai-provider/provider.d.ts +25 -0
- package/dist/ai-provider/provider.d.ts.map +1 -0
- package/dist/ai-provider/provider.js +2 -0
- package/dist/ai-provider/provider.js.map +1 -0
- package/dist/ai-provider/token-manager.d.ts +12 -0
- package/dist/ai-provider/token-manager.d.ts.map +1 -0
- package/dist/ai-provider/token-manager.js +63 -0
- package/dist/ai-provider/token-manager.js.map +1 -0
- package/dist/coder/code-parser.d.ts +23 -0
- package/dist/coder/code-parser.d.ts.map +1 -0
- package/dist/coder/code-parser.js +184 -0
- package/dist/coder/code-parser.js.map +1 -0
- package/dist/coder/coder.d.ts +79 -0
- package/dist/coder/coder.d.ts.map +1 -0
- package/dist/coder/coder.js +476 -0
- package/dist/coder/coder.js.map +1 -0
- package/dist/coder/dependency-resolver.d.ts +23 -0
- package/dist/coder/dependency-resolver.d.ts.map +1 -0
- package/dist/coder/dependency-resolver.js +94 -0
- package/dist/coder/dependency-resolver.js.map +1 -0
- package/dist/coder/language-handlers.d.ts +38 -0
- package/dist/coder/language-handlers.d.ts.map +1 -0
- package/dist/coder/language-handlers.js +264 -0
- package/dist/coder/language-handlers.js.map +1 -0
- package/dist/coder/linter-integration.d.ts +37 -0
- package/dist/coder/linter-integration.d.ts.map +1 -0
- package/dist/coder/linter-integration.js +200 -0
- package/dist/coder/linter-integration.js.map +1 -0
- package/dist/coder/prompt-templates.d.ts +13 -0
- package/dist/coder/prompt-templates.d.ts.map +1 -0
- package/dist/coder/prompt-templates.js +78 -0
- package/dist/coder/prompt-templates.js.map +1 -0
- package/dist/coder/quality-checker.d.ts +31 -0
- package/dist/coder/quality-checker.d.ts.map +1 -0
- package/dist/coder/quality-checker.js +264 -0
- package/dist/coder/quality-checker.js.map +1 -0
- package/dist/coder/syntax-validator.d.ts +21 -0
- package/dist/coder/syntax-validator.d.ts.map +1 -0
- package/dist/coder/syntax-validator.js +169 -0
- package/dist/coder/syntax-validator.js.map +1 -0
- package/dist/coder.d.ts +2 -0
- package/dist/coder.d.ts.map +1 -0
- package/dist/coder.js +2 -0
- package/dist/coder.js.map +1 -0
- package/dist/errors.d.ts +11 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +16 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +6 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +12 -0
- package/dist/logger.js.map +1 -0
- package/dist/manager/manager.d.ts +31 -0
- package/dist/manager/manager.d.ts.map +1 -0
- package/dist/manager/manager.js +162 -0
- package/dist/manager/manager.js.map +1 -0
- package/dist/memory/memory-store.d.ts +20 -0
- package/dist/memory/memory-store.d.ts.map +1 -0
- package/dist/memory/memory-store.js +68 -0
- package/dist/memory/memory-store.js.map +1 -0
- package/dist/planner/clarification-handler.d.ts +11 -0
- package/dist/planner/clarification-handler.d.ts.map +1 -0
- package/dist/planner/clarification-handler.js +60 -0
- package/dist/planner/clarification-handler.js.map +1 -0
- package/dist/planner/plan-parser.d.ts +11 -0
- package/dist/planner/plan-parser.d.ts.map +1 -0
- package/dist/planner/plan-parser.js +136 -0
- package/dist/planner/plan-parser.js.map +1 -0
- package/dist/planner/plan-validator.d.ts +29 -0
- package/dist/planner/plan-validator.d.ts.map +1 -0
- package/dist/planner/plan-validator.js +123 -0
- package/dist/planner/plan-validator.js.map +1 -0
- package/dist/planner/planner.d.ts +25 -0
- package/dist/planner/planner.d.ts.map +1 -0
- package/dist/planner/planner.js +334 -0
- package/dist/planner/planner.js.map +1 -0
- package/dist/planner/prompt-templates.d.ts +9 -0
- package/dist/planner/prompt-templates.d.ts.map +1 -0
- package/dist/planner/prompt-templates.js +168 -0
- package/dist/planner/prompt-templates.js.map +1 -0
- package/dist/planner.d.ts +2 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +2 -0
- package/dist/planner.js.map +1 -0
- package/dist/reviewer/reviewer.d.ts +29 -0
- package/dist/reviewer/reviewer.d.ts.map +1 -0
- package/dist/reviewer/reviewer.js +40 -0
- package/dist/reviewer/reviewer.js.map +1 -0
- package/dist/reviewer.d.ts +2 -0
- package/dist/reviewer.d.ts.map +1 -0
- package/dist/reviewer.js +2 -0
- package/dist/reviewer.js.map +1 -0
- package/dist/tester/coverage-analyzer.d.ts +9 -0
- package/dist/tester/coverage-analyzer.d.ts.map +1 -0
- package/dist/tester/coverage-analyzer.js +18 -0
- package/dist/tester/coverage-analyzer.js.map +1 -0
- package/dist/tester/coverage-validator.d.ts +10 -0
- package/dist/tester/coverage-validator.d.ts.map +1 -0
- package/dist/tester/coverage-validator.js +14 -0
- package/dist/tester/coverage-validator.js.map +1 -0
- package/dist/tester/framework-detector.d.ts +4 -0
- package/dist/tester/framework-detector.d.ts.map +1 -0
- package/dist/tester/framework-detector.js +26 -0
- package/dist/tester/framework-detector.js.map +1 -0
- package/dist/tester/prompt-templates.d.ts +6 -0
- package/dist/tester/prompt-templates.d.ts.map +1 -0
- package/dist/tester/prompt-templates.js +30 -0
- package/dist/tester/prompt-templates.js.map +1 -0
- package/dist/tester/test-executor.d.ts +11 -0
- package/dist/tester/test-executor.d.ts.map +1 -0
- package/dist/tester/test-executor.js +24 -0
- package/dist/tester/test-executor.js.map +1 -0
- package/dist/tester/test-parser.d.ts +10 -0
- package/dist/tester/test-parser.d.ts.map +1 -0
- package/dist/tester/test-parser.js +83 -0
- package/dist/tester/test-parser.js.map +1 -0
- package/dist/tester/test-patterns.d.ts +10 -0
- package/dist/tester/test-patterns.d.ts.map +1 -0
- package/dist/tester/test-patterns.js +65 -0
- package/dist/tester/test-patterns.js.map +1 -0
- package/dist/tester/tester.d.ts +56 -0
- package/dist/tester/tester.d.ts.map +1 -0
- package/dist/tester/tester.js +246 -0
- package/dist/tester/tester.js.map +1 -0
- package/dist/tester.d.ts +3 -0
- package/dist/tester.d.ts.map +1 -0
- package/dist/tester.js +2 -0
- package/dist/tester.js.map +1 -0
- package/dist/tools/default-registry.d.ts +3 -0
- package/dist/tools/default-registry.d.ts.map +1 -0
- package/dist/tools/default-registry.js +12 -0
- package/dist/tools/default-registry.js.map +1 -0
- package/dist/tools/edit.d.ts +4 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +95 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/read.d.ts +4 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +39 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/registry.d.ts +11 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +31 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search.d.ts +4 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +52 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/types.d.ts +37 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/utils.d.ts +10 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +76 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
/* eslint-disable max-lines */
|
|
2
|
+
/**
|
|
3
|
+
* Coder Agent - Code Generation
|
|
4
|
+
* Generates production-ready code from plan tasks
|
|
5
|
+
*/
|
|
6
|
+
import { Agent } from '../agent.js';
|
|
7
|
+
import { PromptTemplates } from './prompt-templates.js';
|
|
8
|
+
import { CodeParser } from './code-parser.js';
|
|
9
|
+
import { CodeWriter } from '@omaikit/analysis';
|
|
10
|
+
import { createProvider } from '../ai-provider/factory.js';
|
|
11
|
+
import { createDefaultToolRegistry } from '../tools/default-registry.js';
|
|
12
|
+
import { MemoryStore } from '../memory/memory-store.js';
|
|
13
|
+
import { loadConfig } from '@omaikit/config';
|
|
14
|
+
export class CoderAgent extends Agent {
|
|
15
|
+
name = 'coder';
|
|
16
|
+
version = '1.0.0';
|
|
17
|
+
promptTemplates;
|
|
18
|
+
codeParser;
|
|
19
|
+
codeWriter;
|
|
20
|
+
provider;
|
|
21
|
+
memoryStore;
|
|
22
|
+
cfg;
|
|
23
|
+
constructor(logger) {
|
|
24
|
+
super(logger);
|
|
25
|
+
this.promptTemplates = new PromptTemplates();
|
|
26
|
+
this.codeParser = new CodeParser();
|
|
27
|
+
this.codeWriter = new CodeWriter();
|
|
28
|
+
this.memoryStore = new MemoryStore();
|
|
29
|
+
this.cfg = loadConfig();
|
|
30
|
+
}
|
|
31
|
+
async init() {
|
|
32
|
+
this.logger.info('Initializing CoderAgent', { version: this.version });
|
|
33
|
+
try {
|
|
34
|
+
this.provider = createProvider();
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
this.logger.warn('Could not initialize AI provider, using mock mode');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Execute code generation for a task
|
|
42
|
+
*/
|
|
43
|
+
async execute(input) {
|
|
44
|
+
const startTime = Date.now();
|
|
45
|
+
const output = {
|
|
46
|
+
agentName: this.name,
|
|
47
|
+
status: 'success',
|
|
48
|
+
timestamp: new Date().toISOString(),
|
|
49
|
+
result: {
|
|
50
|
+
id: `cg-${Date.now()}`,
|
|
51
|
+
taskId: input.task.id,
|
|
52
|
+
prompt: '',
|
|
53
|
+
files: [],
|
|
54
|
+
},
|
|
55
|
+
metadata: {
|
|
56
|
+
durationMs: 0,
|
|
57
|
+
filesGenerated: 0,
|
|
58
|
+
totalLOC: 0,
|
|
59
|
+
syntaxErrors: 0,
|
|
60
|
+
lintingIssues: 0,
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
try {
|
|
64
|
+
await this.beforeExecute(input);
|
|
65
|
+
// Validate input
|
|
66
|
+
this.validateInput(input);
|
|
67
|
+
const fallbackLanguage = this.determineLanguage(input);
|
|
68
|
+
// Generate prompt
|
|
69
|
+
const prompt = await this.promptTemplates.generatePrompt(input.task, input.projectContext, input.plan);
|
|
70
|
+
const recentMemory = await this.memoryStore.readRecent(this.name, 3);
|
|
71
|
+
const memoryContext = this.memoryStore.formatRecent(recentMemory);
|
|
72
|
+
const reuseSection = this.buildReuseSection(input);
|
|
73
|
+
const finalPrompt = [
|
|
74
|
+
prompt,
|
|
75
|
+
memoryContext ? `## Recent Agent Memory\n${memoryContext}` : '',
|
|
76
|
+
reuseSection ? `## Reuse Opportunities\n${reuseSection}` : '',
|
|
77
|
+
]
|
|
78
|
+
.filter(Boolean)
|
|
79
|
+
.join('\n\n');
|
|
80
|
+
output.result.prompt = finalPrompt;
|
|
81
|
+
// Call LLM via AIProvider (would be injected)
|
|
82
|
+
// For now, return mock response
|
|
83
|
+
const llmResponse = await this.callLLM(finalPrompt, input, fallbackLanguage);
|
|
84
|
+
await this.memoryStore.append(this.name, {
|
|
85
|
+
timestamp: new Date().toISOString(),
|
|
86
|
+
prompt: finalPrompt,
|
|
87
|
+
response: llmResponse,
|
|
88
|
+
taskId: input.task.id,
|
|
89
|
+
});
|
|
90
|
+
// Parse generated code
|
|
91
|
+
const files = await this.codeParser.parse(llmResponse, {
|
|
92
|
+
taskTitle: input.task.title,
|
|
93
|
+
projectContext: input.projectContext,
|
|
94
|
+
fallbackLanguage,
|
|
95
|
+
});
|
|
96
|
+
this.logger.info('Code parsed', { fileCount: files.length });
|
|
97
|
+
const projectRoot = input.projectContext?.project?.rootPath || process.cwd();
|
|
98
|
+
const writtenPaths = await this.codeWriter.writeFiles(files, projectRoot);
|
|
99
|
+
// Prepare output
|
|
100
|
+
output.result.files = files;
|
|
101
|
+
output.result.metadata = {
|
|
102
|
+
generatedAt: new Date().toISOString(),
|
|
103
|
+
model: 'mock-model',
|
|
104
|
+
};
|
|
105
|
+
output.metadata.filesGenerated = files.length;
|
|
106
|
+
output.metadata.writtenPaths = writtenPaths;
|
|
107
|
+
output.metadata.totalLOC = files.reduce((sum, f) => sum + (f.content.split('\n').length || 0), 0);
|
|
108
|
+
output.metadata.syntaxErrors = 0;
|
|
109
|
+
output.metadata.lintingIssues = 0;
|
|
110
|
+
await this.afterExecute(output);
|
|
111
|
+
await this.memoryStore.clear(this.name);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
await this.onError(error);
|
|
115
|
+
output.status = 'failed';
|
|
116
|
+
output.error = {
|
|
117
|
+
code: 'CODER_ERROR',
|
|
118
|
+
message: error.message,
|
|
119
|
+
};
|
|
120
|
+
await this.memoryStore.append(this.name, {
|
|
121
|
+
timestamp: new Date().toISOString(),
|
|
122
|
+
prompt: output.result.prompt || '',
|
|
123
|
+
response: output.error.message,
|
|
124
|
+
taskId: input.task.id,
|
|
125
|
+
metadata: { status: 'failed' },
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
output.metadata.durationMs = Date.now() - startTime;
|
|
129
|
+
return output;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Validate output structure and correctness
|
|
133
|
+
*/
|
|
134
|
+
async validate(output) {
|
|
135
|
+
const issues = [];
|
|
136
|
+
let qualityScore = 100;
|
|
137
|
+
const result = output.result || {};
|
|
138
|
+
// Check required fields
|
|
139
|
+
if (!result.id) {
|
|
140
|
+
issues.push({
|
|
141
|
+
severity: 'error',
|
|
142
|
+
message: 'Missing result.id',
|
|
143
|
+
field: 'result.id',
|
|
144
|
+
});
|
|
145
|
+
qualityScore -= 25;
|
|
146
|
+
}
|
|
147
|
+
if (!result.taskId) {
|
|
148
|
+
issues.push({
|
|
149
|
+
severity: 'error',
|
|
150
|
+
message: 'Missing result.taskId',
|
|
151
|
+
field: 'result.taskId',
|
|
152
|
+
});
|
|
153
|
+
qualityScore -= 25;
|
|
154
|
+
}
|
|
155
|
+
if (!Array.isArray(result.files) || result.files.length === 0) {
|
|
156
|
+
issues.push({
|
|
157
|
+
severity: 'error',
|
|
158
|
+
message: 'No files generated',
|
|
159
|
+
field: 'result.files',
|
|
160
|
+
});
|
|
161
|
+
qualityScore -= 25;
|
|
162
|
+
}
|
|
163
|
+
// Check file structure
|
|
164
|
+
if (Array.isArray(result.files)) {
|
|
165
|
+
result.files.forEach((file, idx) => {
|
|
166
|
+
if (!file.path) {
|
|
167
|
+
issues.push({
|
|
168
|
+
severity: 'error',
|
|
169
|
+
message: `File ${idx} missing path`,
|
|
170
|
+
field: `result.files[${idx}].path`,
|
|
171
|
+
});
|
|
172
|
+
qualityScore -= 5;
|
|
173
|
+
}
|
|
174
|
+
if (!file.language) {
|
|
175
|
+
issues.push({
|
|
176
|
+
severity: 'error',
|
|
177
|
+
message: `File ${idx} missing language`,
|
|
178
|
+
field: `result.files[${idx}].language`,
|
|
179
|
+
});
|
|
180
|
+
qualityScore -= 5;
|
|
181
|
+
}
|
|
182
|
+
if (!file.content) {
|
|
183
|
+
issues.push({
|
|
184
|
+
severity: 'error',
|
|
185
|
+
message: `File ${idx} missing content`,
|
|
186
|
+
field: `result.files[${idx}].content`,
|
|
187
|
+
});
|
|
188
|
+
qualityScore -= 5;
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
isValid: issues.filter((i) => i.severity === 'error').length === 0,
|
|
194
|
+
issues,
|
|
195
|
+
warnings: [],
|
|
196
|
+
qualityScore: Math.max(0, qualityScore),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Check if agent can handle a task
|
|
201
|
+
*/
|
|
202
|
+
canHandle(task) {
|
|
203
|
+
// Coder handles feature, refactor, and bugfix tasks
|
|
204
|
+
return ['feature', 'refactor', 'bugfix'].includes(task.type);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Validate input structure
|
|
208
|
+
*/
|
|
209
|
+
validateInput(input) {
|
|
210
|
+
if (!input.task) {
|
|
211
|
+
throw new Error('Task is required');
|
|
212
|
+
}
|
|
213
|
+
if (!input.projectContext) {
|
|
214
|
+
throw new Error('Project context is required');
|
|
215
|
+
}
|
|
216
|
+
if (!input.task.id || !input.task.title) {
|
|
217
|
+
throw new Error('Task must have id and title');
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Determine target programming language
|
|
222
|
+
*/
|
|
223
|
+
determineLanguage(input) {
|
|
224
|
+
const candidates = [];
|
|
225
|
+
const addCandidate = (value) => {
|
|
226
|
+
if (typeof value === 'string') {
|
|
227
|
+
candidates.push(value);
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
const analysisLanguages = input.projectContext?.analysis?.languages;
|
|
231
|
+
if (Array.isArray(analysisLanguages)) {
|
|
232
|
+
analysisLanguages.forEach((lang) => addCandidate(lang));
|
|
233
|
+
}
|
|
234
|
+
const metadataLanguages = input.projectContext?.metadata?.languages;
|
|
235
|
+
if (Array.isArray(metadataLanguages)) {
|
|
236
|
+
metadataLanguages.forEach((lang) => addCandidate(lang));
|
|
237
|
+
}
|
|
238
|
+
const techStack = input.plan?.techStack;
|
|
239
|
+
if (Array.isArray(techStack)) {
|
|
240
|
+
techStack.forEach((entry) => addCandidate(entry));
|
|
241
|
+
}
|
|
242
|
+
const projectType = input.plan?.projectType;
|
|
243
|
+
addCandidate(projectType);
|
|
244
|
+
for (const candidate of candidates) {
|
|
245
|
+
const normalized = this.normalizeLanguage(candidate);
|
|
246
|
+
if (normalized) {
|
|
247
|
+
return normalized;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return 'typescript';
|
|
251
|
+
}
|
|
252
|
+
normalizeLanguage(value) {
|
|
253
|
+
const normalized = value.toLowerCase();
|
|
254
|
+
if (normalized.includes('golang') || normalized === 'go')
|
|
255
|
+
return 'go';
|
|
256
|
+
if (normalized.includes('typescript'))
|
|
257
|
+
return 'typescript';
|
|
258
|
+
if (normalized.includes('javascript'))
|
|
259
|
+
return 'javascript';
|
|
260
|
+
if (normalized.includes('python'))
|
|
261
|
+
return 'python';
|
|
262
|
+
if (normalized.includes('rust'))
|
|
263
|
+
return 'rust';
|
|
264
|
+
if (normalized.includes('c#') || normalized.includes('csharp'))
|
|
265
|
+
return 'csharp';
|
|
266
|
+
if (normalized.includes('php'))
|
|
267
|
+
return 'php';
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Call LLM to generate code
|
|
272
|
+
*/
|
|
273
|
+
async callLLM(prompt, input, fallbackLanguage) {
|
|
274
|
+
if (process.env.VITEST !== undefined) {
|
|
275
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
276
|
+
return this.getMockGeneratedCode(fallbackLanguage, input.task);
|
|
277
|
+
}
|
|
278
|
+
if (!this.provider) {
|
|
279
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
280
|
+
return this.getMockGeneratedCode(fallbackLanguage, input.task);
|
|
281
|
+
}
|
|
282
|
+
const toolRegistry = createDefaultToolRegistry();
|
|
283
|
+
const toolContext = this.buildToolContext(input);
|
|
284
|
+
if (!this.provider.generateCodex) {
|
|
285
|
+
throw new Error('AI provider does not support Codex responses API');
|
|
286
|
+
}
|
|
287
|
+
const response = await this.provider.generateCodex(prompt, {
|
|
288
|
+
model: this.cfg.coderModel,
|
|
289
|
+
maxTokens: undefined,
|
|
290
|
+
temperature: undefined,
|
|
291
|
+
tools: toolRegistry.getDefinitions(),
|
|
292
|
+
toolRegistry,
|
|
293
|
+
toolContext,
|
|
294
|
+
toolChoice: 'auto',
|
|
295
|
+
maxToolCalls: 3,
|
|
296
|
+
});
|
|
297
|
+
if (typeof response === 'string' &&
|
|
298
|
+
(response.startsWith('OPENAI_ECHO') || response.startsWith('ANTHROPIC_ECHO'))) {
|
|
299
|
+
return this.getMockGeneratedCode(fallbackLanguage, input.task);
|
|
300
|
+
}
|
|
301
|
+
return response;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Generate mock code for demonstration
|
|
305
|
+
*/
|
|
306
|
+
getMockGeneratedCode(language, task) {
|
|
307
|
+
const taskName = task.title.toLowerCase().replace(/\s+/g, '_');
|
|
308
|
+
switch (language) {
|
|
309
|
+
case 'python':
|
|
310
|
+
return `
|
|
311
|
+
"""
|
|
312
|
+
Generated module for: ${task.title}
|
|
313
|
+
"""
|
|
314
|
+
|
|
315
|
+
import logging
|
|
316
|
+
from typing import Any
|
|
317
|
+
|
|
318
|
+
logger = logging.getLogger(__name__)
|
|
319
|
+
|
|
320
|
+
def ${taskName}() -> Any:
|
|
321
|
+
"""${task.description}"""
|
|
322
|
+
try:
|
|
323
|
+
logger.info("Executing ${taskName}")
|
|
324
|
+
# Implementation goes here
|
|
325
|
+
return None
|
|
326
|
+
except Exception as e:
|
|
327
|
+
logger.error(f"Error in ${taskName}: {e}")
|
|
328
|
+
raise
|
|
329
|
+
`;
|
|
330
|
+
case 'go':
|
|
331
|
+
return `
|
|
332
|
+
package main
|
|
333
|
+
|
|
334
|
+
import (
|
|
335
|
+
"fmt"
|
|
336
|
+
"log"
|
|
337
|
+
)
|
|
338
|
+
|
|
339
|
+
// ${task.title}
|
|
340
|
+
func ${this.toPascalCase(taskName)}() error {
|
|
341
|
+
log.Println("Executing ${taskName}")
|
|
342
|
+
// Implementation goes here
|
|
343
|
+
return nil
|
|
344
|
+
}
|
|
345
|
+
`;
|
|
346
|
+
case 'rust':
|
|
347
|
+
return `
|
|
348
|
+
//! Generated module for: ${task.title}
|
|
349
|
+
|
|
350
|
+
use log::{info, error};
|
|
351
|
+
|
|
352
|
+
/// ${task.description}
|
|
353
|
+
pub async fn ${taskName}() -> Result<(), Box<dyn std::error::Error>> {
|
|
354
|
+
info!("Executing ${taskName}");
|
|
355
|
+
// Implementation goes here
|
|
356
|
+
Ok(())
|
|
357
|
+
}
|
|
358
|
+
`;
|
|
359
|
+
case 'csharp':
|
|
360
|
+
return `
|
|
361
|
+
using System;
|
|
362
|
+
using System.Logging;
|
|
363
|
+
|
|
364
|
+
namespace Generated
|
|
365
|
+
{
|
|
366
|
+
/// <summary>
|
|
367
|
+
/// ${task.title}
|
|
368
|
+
/// </summary>
|
|
369
|
+
public class ${this.toPascalCase(taskName)}
|
|
370
|
+
{
|
|
371
|
+
private static readonly ILogger Logger = LoggerFactory.CreateLogger<${this.toPascalCase(taskName)}>();
|
|
372
|
+
|
|
373
|
+
public static void Execute()
|
|
374
|
+
{
|
|
375
|
+
try
|
|
376
|
+
{
|
|
377
|
+
Logger.LogInformation("Executing ${taskName}");
|
|
378
|
+
// Implementation goes here
|
|
379
|
+
}
|
|
380
|
+
catch (Exception ex)
|
|
381
|
+
{
|
|
382
|
+
Logger.LogError(ex, "Error in ${taskName}");
|
|
383
|
+
throw;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
`;
|
|
389
|
+
case 'typescript':
|
|
390
|
+
default:
|
|
391
|
+
return `
|
|
392
|
+
/**
|
|
393
|
+
* ${task.title}
|
|
394
|
+
*
|
|
395
|
+
* ${task.description}
|
|
396
|
+
*/
|
|
397
|
+
|
|
398
|
+
import { Logger } from './logger';
|
|
399
|
+
|
|
400
|
+
const logger = new Logger('${taskName}');
|
|
401
|
+
|
|
402
|
+
export async function ${taskName}(): Promise<void> {
|
|
403
|
+
try {
|
|
404
|
+
logger.info('Executing ${taskName}');
|
|
405
|
+
// Implementation goes here
|
|
406
|
+
} catch (error) {
|
|
407
|
+
logger.error('Error in ${taskName}', { error });
|
|
408
|
+
throw error;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
export default ${taskName};
|
|
413
|
+
`;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Convert string to PascalCase
|
|
418
|
+
*/
|
|
419
|
+
toPascalCase(str) {
|
|
420
|
+
return str
|
|
421
|
+
.split('_')
|
|
422
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
423
|
+
.join('');
|
|
424
|
+
}
|
|
425
|
+
buildReuseSection(input) {
|
|
426
|
+
const rawSources = [
|
|
427
|
+
input.plan?.reuseOpportunities,
|
|
428
|
+
input.projectContext?.reuseOpportunities,
|
|
429
|
+
input.projectContext?.analysis?.reuseOpportunities,
|
|
430
|
+
input.projectContext?.analysis?.reuseSuggestions,
|
|
431
|
+
];
|
|
432
|
+
const items = rawSources.flatMap((value) => (Array.isArray(value) ? value : []));
|
|
433
|
+
const normalized = items
|
|
434
|
+
.map((item) => {
|
|
435
|
+
if (typeof item === 'string')
|
|
436
|
+
return item.trim();
|
|
437
|
+
if (item && typeof item === 'object') {
|
|
438
|
+
const description = item.description || item.summary;
|
|
439
|
+
const moduleName = item.module || item.moduleName;
|
|
440
|
+
if (description)
|
|
441
|
+
return String(description).trim();
|
|
442
|
+
if (moduleName)
|
|
443
|
+
return `Consider reusing module: ${String(moduleName).trim()}`;
|
|
444
|
+
}
|
|
445
|
+
return '';
|
|
446
|
+
})
|
|
447
|
+
.filter((item) => item.length > 0);
|
|
448
|
+
if (normalized.length === 0) {
|
|
449
|
+
return null;
|
|
450
|
+
}
|
|
451
|
+
return normalized.map((item) => `- ${item}`).join('\n');
|
|
452
|
+
}
|
|
453
|
+
async withTimeout(promise, timeoutMs) {
|
|
454
|
+
let timeoutId;
|
|
455
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
456
|
+
timeoutId = setTimeout(() => resolve(null), timeoutMs);
|
|
457
|
+
});
|
|
458
|
+
const result = await Promise.race([promise, timeoutPromise]);
|
|
459
|
+
if (timeoutId) {
|
|
460
|
+
clearTimeout(timeoutId);
|
|
461
|
+
}
|
|
462
|
+
return result;
|
|
463
|
+
}
|
|
464
|
+
buildToolContext(input) {
|
|
465
|
+
const rootPath = input.projectContext?.root ||
|
|
466
|
+
input.projectContext?.rootPath ||
|
|
467
|
+
input.projectContext?.project?.rootPath ||
|
|
468
|
+
process.cwd();
|
|
469
|
+
return {
|
|
470
|
+
rootPath,
|
|
471
|
+
cwd: process.cwd(),
|
|
472
|
+
logger: this.logger,
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
//# sourceMappingURL=coder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coder.js","sourceRoot":"","sources":["../../src/coder/coder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Resolver
|
|
3
|
+
* Resolves and tracks dependencies in generated code
|
|
4
|
+
*/
|
|
5
|
+
import type { CodeFile } from '@omaikit/models';
|
|
6
|
+
export declare class DependencyResolver {
|
|
7
|
+
private languageHandlers;
|
|
8
|
+
constructor();
|
|
9
|
+
init(): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Resolve dependencies for generated code files
|
|
12
|
+
*/
|
|
13
|
+
resolveDependencies(files: CodeFile[], projectContext: any): Promise<CodeFile[]>;
|
|
14
|
+
/**
|
|
15
|
+
* Detect circular dependencies in generated files
|
|
16
|
+
*/
|
|
17
|
+
private detectCircularDependencies;
|
|
18
|
+
/**
|
|
19
|
+
* Check if a dependency is internal (project-relative) or external (npm/package)
|
|
20
|
+
*/
|
|
21
|
+
private isInternalDependency;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=dependency-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.d.ts","sourceRoot":"","sources":["../../src/coder/dependency-resolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,gBAAgB,CAAmB;;IAMrC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;OAEG;IACG,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,cAAc,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IA4BtF;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA+ClC;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAc7B"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Resolver
|
|
3
|
+
* Resolves and tracks dependencies in generated code
|
|
4
|
+
*/
|
|
5
|
+
import { LanguageHandlers } from './language-handlers.js';
|
|
6
|
+
export class DependencyResolver {
|
|
7
|
+
languageHandlers;
|
|
8
|
+
constructor() {
|
|
9
|
+
this.languageHandlers = new LanguageHandlers();
|
|
10
|
+
}
|
|
11
|
+
async init() {
|
|
12
|
+
// Initialize dependency resolver
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Resolve dependencies for generated code files
|
|
16
|
+
*/
|
|
17
|
+
async resolveDependencies(files, projectContext) {
|
|
18
|
+
const filesWithDeps = files.map((file) => {
|
|
19
|
+
const handler = this.languageHandlers.getHandler(file.language);
|
|
20
|
+
const dependencies = handler.dependencyExtractor(file.content);
|
|
21
|
+
// Separate internal and external dependencies
|
|
22
|
+
const internalDeps = dependencies.filter((dep) => this.isInternalDependency(dep, projectContext));
|
|
23
|
+
const externalDeps = dependencies.filter((dep) => !this.isInternalDependency(dep, projectContext));
|
|
24
|
+
return {
|
|
25
|
+
...file,
|
|
26
|
+
dependencies: [...internalDeps, ...externalDeps],
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
// Check for circular dependencies
|
|
30
|
+
const circular = this.detectCircularDependencies(filesWithDeps);
|
|
31
|
+
if (circular.length > 0) {
|
|
32
|
+
console.warn('Circular dependencies detected:', circular);
|
|
33
|
+
}
|
|
34
|
+
return filesWithDeps;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Detect circular dependencies in generated files
|
|
38
|
+
*/
|
|
39
|
+
detectCircularDependencies(files) {
|
|
40
|
+
const graph = new Map();
|
|
41
|
+
// Build dependency graph
|
|
42
|
+
files.forEach((file) => {
|
|
43
|
+
graph.set(file.path, file.dependencies || []);
|
|
44
|
+
});
|
|
45
|
+
const cycles = [];
|
|
46
|
+
const visited = new Set();
|
|
47
|
+
const recursionStack = new Set();
|
|
48
|
+
const hasCycle = (node, path) => {
|
|
49
|
+
visited.add(node);
|
|
50
|
+
recursionStack.add(node);
|
|
51
|
+
path.push(node);
|
|
52
|
+
const neighbors = graph.get(node) || [];
|
|
53
|
+
for (const neighbor of neighbors) {
|
|
54
|
+
if (!visited.has(neighbor)) {
|
|
55
|
+
if (hasCycle(neighbor, [...path])) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else if (recursionStack.has(neighbor)) {
|
|
60
|
+
const cycleStart = path.indexOf(neighbor);
|
|
61
|
+
if (cycleStart !== -1) {
|
|
62
|
+
cycles.push([...path.slice(cycleStart), neighbor]);
|
|
63
|
+
}
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
recursionStack.delete(node);
|
|
68
|
+
return false;
|
|
69
|
+
};
|
|
70
|
+
// Check each node
|
|
71
|
+
Array.from(graph.keys()).forEach((node) => {
|
|
72
|
+
if (!visited.has(node)) {
|
|
73
|
+
hasCycle(node, []);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
return cycles;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check if a dependency is internal (project-relative) or external (npm/package)
|
|
80
|
+
*/
|
|
81
|
+
isInternalDependency(dep, projectContext) {
|
|
82
|
+
// Internal: starts with . or /
|
|
83
|
+
if (dep.startsWith('.') || dep.startsWith('/')) {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
// Check against known external packages
|
|
87
|
+
if (projectContext?.metadata?.dependencies) {
|
|
88
|
+
return !projectContext.metadata.dependencies.includes(dep);
|
|
89
|
+
}
|
|
90
|
+
// External packages don't start with . or / and don't have slashes early
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=dependency-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../src/coder/dependency-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language Handler Registry
|
|
3
|
+
* Provides language-specific code generation and validation support
|
|
4
|
+
*/
|
|
5
|
+
export interface LanguageHandler {
|
|
6
|
+
name: string;
|
|
7
|
+
extensions: string[];
|
|
8
|
+
syntaxValidator: (code: string) => boolean;
|
|
9
|
+
dependencyExtractor: (code: string) => string[];
|
|
10
|
+
linterConfig: Record<string, any>;
|
|
11
|
+
formatter: (code: string) => string;
|
|
12
|
+
errorHandlingPattern: string;
|
|
13
|
+
loggingPattern: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class LanguageHandlers {
|
|
16
|
+
private handlers;
|
|
17
|
+
constructor();
|
|
18
|
+
private registerDefaultHandlers;
|
|
19
|
+
register(handler: LanguageHandler): void;
|
|
20
|
+
getHandler(language: string): LanguageHandler;
|
|
21
|
+
supportedLanguages(): string[];
|
|
22
|
+
getHandlerByExtension(extension: string): LanguageHandler | undefined;
|
|
23
|
+
private validateTypeScript;
|
|
24
|
+
private validateJavaScript;
|
|
25
|
+
private validatePython;
|
|
26
|
+
private validateGo;
|
|
27
|
+
private validateRust;
|
|
28
|
+
private validateCsharp;
|
|
29
|
+
private validatePhp;
|
|
30
|
+
private extractTypeScriptDependencies;
|
|
31
|
+
private extractJavaScriptDependencies;
|
|
32
|
+
private extractPythonDependencies;
|
|
33
|
+
private extractGoDependencies;
|
|
34
|
+
private extractRustDependencies;
|
|
35
|
+
private extractCsharpDependencies;
|
|
36
|
+
private extractPhpDependencies;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=language-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-handlers.d.ts","sourceRoot":"","sources":["../../src/coder/language-handlers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IAChD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAA+B;;IAO/C,OAAO,CAAC,uBAAuB;IA4H/B,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAKxC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe;IAQ7C,kBAAkB,IAAI,MAAM,EAAE;IAI9B,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAKrE,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,6BAA6B;IAYrC,OAAO,CAAC,6BAA6B;IAQrC,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,yBAAyB;IAYjC,OAAO,CAAC,sBAAsB;CAgB/B"}
|