linguclaw 0.4.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/LICENSE +21 -0
- package/README.md +161 -0
- package/dist/agent-system.d.ts +196 -0
- package/dist/agent-system.d.ts.map +1 -0
- package/dist/agent-system.js +738 -0
- package/dist/agent-system.js.map +1 -0
- package/dist/alphabeta.d.ts +54 -0
- package/dist/alphabeta.d.ts.map +1 -0
- package/dist/alphabeta.js +193 -0
- package/dist/alphabeta.js.map +1 -0
- package/dist/browser.d.ts +62 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +224 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +565 -0
- package/dist/cli.js.map +1 -0
- package/dist/code-parser.d.ts +39 -0
- package/dist/code-parser.d.ts.map +1 -0
- package/dist/code-parser.js +385 -0
- package/dist/code-parser.js.map +1 -0
- package/dist/config.d.ts +66 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +232 -0
- package/dist/config.js.map +1 -0
- package/dist/core/engine.d.ts +359 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +127 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/daemon.d.ts +29 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +212 -0
- package/dist/daemon.js.map +1 -0
- package/dist/email-receiver.d.ts +63 -0
- package/dist/email-receiver.d.ts.map +1 -0
- package/dist/email-receiver.js +553 -0
- package/dist/email-receiver.js.map +1 -0
- package/dist/git-integration.d.ts +180 -0
- package/dist/git-integration.d.ts.map +1 -0
- package/dist/git-integration.js +850 -0
- package/dist/git-integration.js.map +1 -0
- package/dist/inbox.d.ts +84 -0
- package/dist/inbox.d.ts.map +1 -0
- package/dist/inbox.js +198 -0
- package/dist/inbox.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/languages/cpp.d.ts +51 -0
- package/dist/languages/cpp.d.ts.map +1 -0
- package/dist/languages/cpp.js +930 -0
- package/dist/languages/cpp.js.map +1 -0
- package/dist/languages/csharp.d.ts +79 -0
- package/dist/languages/csharp.d.ts.map +1 -0
- package/dist/languages/csharp.js +1776 -0
- package/dist/languages/csharp.js.map +1 -0
- package/dist/languages/go.d.ts +50 -0
- package/dist/languages/go.d.ts.map +1 -0
- package/dist/languages/go.js +882 -0
- package/dist/languages/go.js.map +1 -0
- package/dist/languages/java.d.ts +47 -0
- package/dist/languages/java.d.ts.map +1 -0
- package/dist/languages/java.js +649 -0
- package/dist/languages/java.js.map +1 -0
- package/dist/languages/python.d.ts +47 -0
- package/dist/languages/python.d.ts.map +1 -0
- package/dist/languages/python.js +655 -0
- package/dist/languages/python.js.map +1 -0
- package/dist/languages/rust.d.ts +61 -0
- package/dist/languages/rust.d.ts.map +1 -0
- package/dist/languages/rust.js +1064 -0
- package/dist/languages/rust.js.map +1 -0
- package/dist/logger.d.ts +20 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +133 -0
- package/dist/logger.js.map +1 -0
- package/dist/longterm-memory.d.ts +47 -0
- package/dist/longterm-memory.d.ts.map +1 -0
- package/dist/longterm-memory.js +300 -0
- package/dist/longterm-memory.js.map +1 -0
- package/dist/memory.d.ts +42 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +274 -0
- package/dist/memory.js.map +1 -0
- package/dist/messaging.d.ts +103 -0
- package/dist/messaging.d.ts.map +1 -0
- package/dist/messaging.js +645 -0
- package/dist/messaging.js.map +1 -0
- package/dist/multi-provider.d.ts +69 -0
- package/dist/multi-provider.d.ts.map +1 -0
- package/dist/multi-provider.js +484 -0
- package/dist/multi-provider.js.map +1 -0
- package/dist/orchestrator.d.ts +65 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +441 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/plugins.d.ts +52 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +215 -0
- package/dist/plugins.js.map +1 -0
- package/dist/prism-orchestrator.d.ts +26 -0
- package/dist/prism-orchestrator.d.ts.map +1 -0
- package/dist/prism-orchestrator.js +191 -0
- package/dist/prism-orchestrator.js.map +1 -0
- package/dist/prism.d.ts +46 -0
- package/dist/prism.d.ts.map +1 -0
- package/dist/prism.js +188 -0
- package/dist/prism.js.map +1 -0
- package/dist/privacy.d.ts +23 -0
- package/dist/privacy.d.ts.map +1 -0
- package/dist/privacy.js +220 -0
- package/dist/privacy.js.map +1 -0
- package/dist/proactive.d.ts +30 -0
- package/dist/proactive.d.ts.map +1 -0
- package/dist/proactive.js +260 -0
- package/dist/proactive.js.map +1 -0
- package/dist/refactoring-engine.d.ts +100 -0
- package/dist/refactoring-engine.d.ts.map +1 -0
- package/dist/refactoring-engine.js +717 -0
- package/dist/refactoring-engine.js.map +1 -0
- package/dist/resilience.d.ts +43 -0
- package/dist/resilience.d.ts.map +1 -0
- package/dist/resilience.js +200 -0
- package/dist/resilience.js.map +1 -0
- package/dist/safety.d.ts +40 -0
- package/dist/safety.d.ts.map +1 -0
- package/dist/safety.js +133 -0
- package/dist/safety.js.map +1 -0
- package/dist/sandbox.d.ts +33 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +173 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/scheduler.d.ts +72 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +374 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/semantic-memory.d.ts +70 -0
- package/dist/semantic-memory.d.ts.map +1 -0
- package/dist/semantic-memory.js +430 -0
- package/dist/semantic-memory.js.map +1 -0
- package/dist/skills.d.ts +97 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +575 -0
- package/dist/skills.js.map +1 -0
- package/dist/static/dashboard.html +853 -0
- package/dist/static/hub.html +772 -0
- package/dist/static/index.html +818 -0
- package/dist/static/logo.svg +24 -0
- package/dist/static/workflow-editor.html +913 -0
- package/dist/tools.d.ts +67 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +303 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +295 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +90 -0
- package/dist/types.js.map +1 -0
- package/dist/web.d.ts +76 -0
- package/dist/web.d.ts.map +1 -0
- package/dist/web.js +2139 -0
- package/dist/web.js.map +1 -0
- package/dist/workflow-engine.d.ts +114 -0
- package/dist/workflow-engine.d.ts.map +1 -0
- package/dist/workflow-engine.js +855 -0
- package/dist/workflow-engine.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,738 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Advanced AI Agent System for LinguClaw
|
|
4
|
+
* Multi-agent collaboration with specialized agents
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.AgentOrchestrator = exports.TesterAgent = exports.ReviewerAgent = exports.CoderAgent = exports.ArchitectAgent = void 0;
|
|
8
|
+
const events_1 = require("events");
|
|
9
|
+
const logger_1 = require("./logger");
|
|
10
|
+
const semantic_memory_1 = require("./semantic-memory");
|
|
11
|
+
const logger = (0, logger_1.getLogger)();
|
|
12
|
+
// ============================================
|
|
13
|
+
// SPECIALIZED AGENTS
|
|
14
|
+
// ============================================
|
|
15
|
+
class ArchitectAgent {
|
|
16
|
+
id = 'architect-' + Date.now().toString(36);
|
|
17
|
+
name = 'System Architect';
|
|
18
|
+
type = 'architect';
|
|
19
|
+
status = 'idle';
|
|
20
|
+
capabilities = [
|
|
21
|
+
{
|
|
22
|
+
name: 'system_design',
|
|
23
|
+
description: 'Design system architecture and patterns',
|
|
24
|
+
priority: 1,
|
|
25
|
+
canExecute: (task) => task.type === 'design' || task.type === 'analyze',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'code_review',
|
|
29
|
+
description: 'Review code for architectural compliance',
|
|
30
|
+
priority: 2,
|
|
31
|
+
canExecute: (task) => task.type === 'review',
|
|
32
|
+
},
|
|
33
|
+
];
|
|
34
|
+
context;
|
|
35
|
+
memory;
|
|
36
|
+
llmProvider;
|
|
37
|
+
constructor(context, llmProvider) {
|
|
38
|
+
this.context = context;
|
|
39
|
+
this.llmProvider = llmProvider;
|
|
40
|
+
this.memory = {
|
|
41
|
+
shortTerm: [],
|
|
42
|
+
longTerm: new Map(),
|
|
43
|
+
conversations: [],
|
|
44
|
+
learnings: [],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async execute(task) {
|
|
48
|
+
this.status = 'working';
|
|
49
|
+
const startTime = Date.now();
|
|
50
|
+
try {
|
|
51
|
+
logger.info(`[${this.name}] Executing task: ${task.description}`);
|
|
52
|
+
let output = '';
|
|
53
|
+
const artifacts = [];
|
|
54
|
+
switch (task.type) {
|
|
55
|
+
case 'design':
|
|
56
|
+
output = await this.designSystem(task.context);
|
|
57
|
+
artifacts.push(...this.generateDesignArtifacts(task.context));
|
|
58
|
+
break;
|
|
59
|
+
case 'review':
|
|
60
|
+
output = await this.reviewArchitecture(task.context);
|
|
61
|
+
break;
|
|
62
|
+
case 'analyze':
|
|
63
|
+
output = await this.analyzeSystem(task.context);
|
|
64
|
+
break;
|
|
65
|
+
default:
|
|
66
|
+
throw new Error(`Task type ${task.type} not supported by ${this.name}`);
|
|
67
|
+
}
|
|
68
|
+
this.status = 'idle';
|
|
69
|
+
return {
|
|
70
|
+
taskId: task.id,
|
|
71
|
+
agentId: this.id,
|
|
72
|
+
success: true,
|
|
73
|
+
output,
|
|
74
|
+
artifacts,
|
|
75
|
+
metrics: {
|
|
76
|
+
duration: Date.now() - startTime,
|
|
77
|
+
tokensUsed: 0,
|
|
78
|
+
apiCalls: 0,
|
|
79
|
+
filesModified: artifacts.length,
|
|
80
|
+
linesChanged: 0,
|
|
81
|
+
complexity: 0,
|
|
82
|
+
},
|
|
83
|
+
errors: [],
|
|
84
|
+
warnings: [],
|
|
85
|
+
suggestions: [],
|
|
86
|
+
completedAt: new Date(),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
this.status = 'error';
|
|
91
|
+
return {
|
|
92
|
+
taskId: task.id,
|
|
93
|
+
agentId: this.id,
|
|
94
|
+
success: false,
|
|
95
|
+
output: '',
|
|
96
|
+
artifacts: [],
|
|
97
|
+
metrics: {
|
|
98
|
+
duration: Date.now() - startTime,
|
|
99
|
+
tokensUsed: 0,
|
|
100
|
+
apiCalls: 0,
|
|
101
|
+
filesModified: 0,
|
|
102
|
+
linesChanged: 0,
|
|
103
|
+
complexity: 0,
|
|
104
|
+
},
|
|
105
|
+
errors: [error.message],
|
|
106
|
+
warnings: [],
|
|
107
|
+
suggestions: [],
|
|
108
|
+
completedAt: new Date(),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async collaborate(message) {
|
|
113
|
+
this.memory.conversations.push(message);
|
|
114
|
+
logger.info(`[${this.name}] Received message from ${message.from}: ${message.content.substring(0, 100)}`);
|
|
115
|
+
}
|
|
116
|
+
async designSystem(context) {
|
|
117
|
+
const prompt = `
|
|
118
|
+
Design a system architecture for:
|
|
119
|
+
${JSON.stringify(context, null, 2)}
|
|
120
|
+
|
|
121
|
+
Consider:
|
|
122
|
+
1. Scalability
|
|
123
|
+
2. Maintainability
|
|
124
|
+
3. Security
|
|
125
|
+
4. Performance
|
|
126
|
+
5. Testing
|
|
127
|
+
|
|
128
|
+
Provide:
|
|
129
|
+
- Component diagram
|
|
130
|
+
- Data flow
|
|
131
|
+
- API design
|
|
132
|
+
- Database schema
|
|
133
|
+
- Deployment strategy
|
|
134
|
+
`;
|
|
135
|
+
// Simulated LLM call
|
|
136
|
+
return `System Architecture Design:
|
|
137
|
+
|
|
138
|
+
## Components
|
|
139
|
+
- Frontend: React with TypeScript
|
|
140
|
+
- Backend: Node.js/Express API
|
|
141
|
+
- Database: PostgreSQL with Redis cache
|
|
142
|
+
- Message Queue: RabbitMQ
|
|
143
|
+
- File Storage: S3
|
|
144
|
+
|
|
145
|
+
## Data Flow
|
|
146
|
+
1. Client requests → API Gateway
|
|
147
|
+
2. Authentication → JWT validation
|
|
148
|
+
3. Business logic → Service layer
|
|
149
|
+
4. Data persistence → Database
|
|
150
|
+
5. Caching → Redis
|
|
151
|
+
6. Async processing → Queue
|
|
152
|
+
|
|
153
|
+
## API Design
|
|
154
|
+
RESTful API with versioning (v1, v2)
|
|
155
|
+
GraphQL for complex queries
|
|
156
|
+
WebSocket for real-time features
|
|
157
|
+
|
|
158
|
+
## Database Schema
|
|
159
|
+
Users table, Projects table, Tasks table
|
|
160
|
+
Relationships: User has many Projects, Project has many Tasks
|
|
161
|
+
|
|
162
|
+
## Deployment
|
|
163
|
+
Docker containers orchestrated with Kubernetes
|
|
164
|
+
CI/CD pipeline with GitHub Actions
|
|
165
|
+
Monitoring with Prometheus and Grafana`;
|
|
166
|
+
}
|
|
167
|
+
async reviewArchitecture(context) {
|
|
168
|
+
return `Architecture Review:
|
|
169
|
+
|
|
170
|
+
Strengths:
|
|
171
|
+
- Clear separation of concerns
|
|
172
|
+
- Proper use of design patterns
|
|
173
|
+
- Good modularity
|
|
174
|
+
|
|
175
|
+
Recommendations:
|
|
176
|
+
1. Consider microservices for scalability
|
|
177
|
+
2. Add circuit breaker pattern for external calls
|
|
178
|
+
3. Implement event sourcing for audit trail
|
|
179
|
+
4. Use CQRS for complex read/write operations`;
|
|
180
|
+
}
|
|
181
|
+
async analyzeSystem(context) {
|
|
182
|
+
return `System Analysis:
|
|
183
|
+
|
|
184
|
+
Complexity Metrics:
|
|
185
|
+
- Cyclomatic complexity: Moderate
|
|
186
|
+
- Coupling: Low
|
|
187
|
+
- Cohesion: High
|
|
188
|
+
|
|
189
|
+
Potential Issues:
|
|
190
|
+
1. Tight coupling in module X
|
|
191
|
+
2. Missing error handling in module Y
|
|
192
|
+
3. Performance bottleneck in database queries
|
|
193
|
+
|
|
194
|
+
Improvements:
|
|
195
|
+
1. Refactor module X using dependency injection
|
|
196
|
+
2. Add comprehensive error handling
|
|
197
|
+
3. Implement query optimization and caching`;
|
|
198
|
+
}
|
|
199
|
+
generateDesignArtifacts(context) {
|
|
200
|
+
return [
|
|
201
|
+
{
|
|
202
|
+
type: 'doc',
|
|
203
|
+
path: 'architecture.md',
|
|
204
|
+
content: '# System Architecture\n\n## Overview\n...',
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
type: 'config',
|
|
208
|
+
path: 'docker-compose.yml',
|
|
209
|
+
content: 'version: "3.8"\nservices:\n api:\n ...',
|
|
210
|
+
},
|
|
211
|
+
];
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
exports.ArchitectAgent = ArchitectAgent;
|
|
215
|
+
class CoderAgent {
|
|
216
|
+
id = 'coder-' + Date.now().toString(36);
|
|
217
|
+
name = 'Code Implementer';
|
|
218
|
+
type = 'coder';
|
|
219
|
+
status = 'idle';
|
|
220
|
+
capabilities = [
|
|
221
|
+
{
|
|
222
|
+
name: 'implement',
|
|
223
|
+
description: 'Implement features and functionality',
|
|
224
|
+
priority: 1,
|
|
225
|
+
canExecute: (task) => task.type === 'implement',
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
name: 'refactor',
|
|
229
|
+
description: 'Refactor existing code',
|
|
230
|
+
priority: 2,
|
|
231
|
+
canExecute: (task) => task.type === 'refactor',
|
|
232
|
+
},
|
|
233
|
+
];
|
|
234
|
+
context;
|
|
235
|
+
memory;
|
|
236
|
+
llmProvider;
|
|
237
|
+
constructor(context, llmProvider) {
|
|
238
|
+
this.context = context;
|
|
239
|
+
this.llmProvider = llmProvider;
|
|
240
|
+
this.memory = {
|
|
241
|
+
shortTerm: [],
|
|
242
|
+
longTerm: new Map(),
|
|
243
|
+
conversations: [],
|
|
244
|
+
learnings: [],
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
async execute(task) {
|
|
248
|
+
this.status = 'working';
|
|
249
|
+
const startTime = Date.now();
|
|
250
|
+
try {
|
|
251
|
+
logger.info(`[${this.name}] Executing task: ${task.description}`);
|
|
252
|
+
let output = '';
|
|
253
|
+
const artifacts = [];
|
|
254
|
+
switch (task.type) {
|
|
255
|
+
case 'implement':
|
|
256
|
+
const impl = await this.implementFeature(task.context);
|
|
257
|
+
output = impl.description;
|
|
258
|
+
artifacts.push(...impl.code);
|
|
259
|
+
break;
|
|
260
|
+
case 'refactor':
|
|
261
|
+
const ref = await this.refactorCode(task.context);
|
|
262
|
+
output = ref.description;
|
|
263
|
+
artifacts.push(...ref.code);
|
|
264
|
+
break;
|
|
265
|
+
default:
|
|
266
|
+
throw new Error(`Task type ${task.type} not supported by ${this.name}`);
|
|
267
|
+
}
|
|
268
|
+
this.status = 'idle';
|
|
269
|
+
return {
|
|
270
|
+
taskId: task.id,
|
|
271
|
+
agentId: this.id,
|
|
272
|
+
success: true,
|
|
273
|
+
output,
|
|
274
|
+
artifacts,
|
|
275
|
+
metrics: {
|
|
276
|
+
duration: Date.now() - startTime,
|
|
277
|
+
tokensUsed: 0,
|
|
278
|
+
apiCalls: 0,
|
|
279
|
+
filesModified: artifacts.length,
|
|
280
|
+
linesChanged: artifacts.reduce((sum, a) => sum + a.content.split('\n').length, 0),
|
|
281
|
+
complexity: 0,
|
|
282
|
+
},
|
|
283
|
+
errors: [],
|
|
284
|
+
warnings: [],
|
|
285
|
+
suggestions: [],
|
|
286
|
+
completedAt: new Date(),
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
this.status = 'error';
|
|
291
|
+
return {
|
|
292
|
+
taskId: task.id,
|
|
293
|
+
agentId: this.id,
|
|
294
|
+
success: false,
|
|
295
|
+
output: '',
|
|
296
|
+
artifacts: [],
|
|
297
|
+
metrics: {
|
|
298
|
+
duration: Date.now() - startTime,
|
|
299
|
+
tokensUsed: 0,
|
|
300
|
+
apiCalls: 0,
|
|
301
|
+
filesModified: 0,
|
|
302
|
+
linesChanged: 0,
|
|
303
|
+
complexity: 0,
|
|
304
|
+
},
|
|
305
|
+
errors: [error.message],
|
|
306
|
+
warnings: [],
|
|
307
|
+
suggestions: [],
|
|
308
|
+
completedAt: new Date(),
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
async collaborate(message) {
|
|
313
|
+
this.memory.conversations.push(message);
|
|
314
|
+
}
|
|
315
|
+
async implementFeature(context) {
|
|
316
|
+
const feature = context.feature || 'New feature';
|
|
317
|
+
const language = context.language || 'typescript';
|
|
318
|
+
return {
|
|
319
|
+
description: `Implemented ${feature} in ${language}`,
|
|
320
|
+
code: [
|
|
321
|
+
{
|
|
322
|
+
type: 'code',
|
|
323
|
+
path: `src/${feature.toLowerCase().replace(/\s+/g, '-')}.ts`,
|
|
324
|
+
content: `export class ${feature.replace(/\s+/g, '')} {
|
|
325
|
+
constructor() {
|
|
326
|
+
// Implementation
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
execute() {
|
|
330
|
+
// Feature logic
|
|
331
|
+
return true;
|
|
332
|
+
}
|
|
333
|
+
}`,
|
|
334
|
+
language,
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
type: 'test',
|
|
338
|
+
path: `tests/${feature.toLowerCase().replace(/\s+/g, '-')}.test.ts`,
|
|
339
|
+
content: `import { ${feature.replace(/\s+/g, '')} } from '../src/${feature.toLowerCase().replace(/\s+/g, '-')}';
|
|
340
|
+
|
|
341
|
+
describe('${feature}', () => {
|
|
342
|
+
it('should execute successfully', () => {
|
|
343
|
+
const instance = new ${feature.replace(/\s+/g, '')}();
|
|
344
|
+
expect(instance.execute()).toBe(true);
|
|
345
|
+
});
|
|
346
|
+
});`,
|
|
347
|
+
language,
|
|
348
|
+
},
|
|
349
|
+
],
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
async refactorCode(context) {
|
|
353
|
+
const file = context.file || 'unknown';
|
|
354
|
+
return {
|
|
355
|
+
description: `Refactored ${file} for better maintainability`,
|
|
356
|
+
code: [
|
|
357
|
+
{
|
|
358
|
+
type: 'code',
|
|
359
|
+
path: file,
|
|
360
|
+
content: '// Refactored code\n// - Extracted functions\n// - Improved naming\n// - Added types',
|
|
361
|
+
},
|
|
362
|
+
],
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
exports.CoderAgent = CoderAgent;
|
|
367
|
+
class ReviewerAgent {
|
|
368
|
+
id = 'reviewer-' + Date.now().toString(36);
|
|
369
|
+
name = 'Code Reviewer';
|
|
370
|
+
type = 'reviewer';
|
|
371
|
+
status = 'idle';
|
|
372
|
+
capabilities = [
|
|
373
|
+
{
|
|
374
|
+
name: 'code_review',
|
|
375
|
+
description: 'Review code for quality and best practices',
|
|
376
|
+
priority: 1,
|
|
377
|
+
canExecute: (task) => task.type === 'review',
|
|
378
|
+
},
|
|
379
|
+
];
|
|
380
|
+
context;
|
|
381
|
+
memory;
|
|
382
|
+
llmProvider;
|
|
383
|
+
constructor(context, llmProvider) {
|
|
384
|
+
this.context = context;
|
|
385
|
+
this.llmProvider = llmProvider;
|
|
386
|
+
this.memory = {
|
|
387
|
+
shortTerm: [],
|
|
388
|
+
longTerm: new Map(),
|
|
389
|
+
conversations: [],
|
|
390
|
+
learnings: [],
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
async execute(task) {
|
|
394
|
+
this.status = 'working';
|
|
395
|
+
const startTime = Date.now();
|
|
396
|
+
try {
|
|
397
|
+
const review = await this.reviewCode(task.context);
|
|
398
|
+
this.status = 'idle';
|
|
399
|
+
return {
|
|
400
|
+
taskId: task.id,
|
|
401
|
+
agentId: this.id,
|
|
402
|
+
success: true,
|
|
403
|
+
output: review.summary,
|
|
404
|
+
artifacts: review.comments.map(c => ({
|
|
405
|
+
type: 'doc',
|
|
406
|
+
path: `review-${task.id}.md`,
|
|
407
|
+
content: c,
|
|
408
|
+
})),
|
|
409
|
+
metrics: {
|
|
410
|
+
duration: Date.now() - startTime,
|
|
411
|
+
tokensUsed: 0,
|
|
412
|
+
apiCalls: 0,
|
|
413
|
+
filesModified: 0,
|
|
414
|
+
linesChanged: 0,
|
|
415
|
+
complexity: 0,
|
|
416
|
+
},
|
|
417
|
+
errors: [],
|
|
418
|
+
warnings: review.warnings,
|
|
419
|
+
suggestions: review.suggestions,
|
|
420
|
+
completedAt: new Date(),
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
catch (error) {
|
|
424
|
+
this.status = 'error';
|
|
425
|
+
return {
|
|
426
|
+
taskId: task.id,
|
|
427
|
+
agentId: this.id,
|
|
428
|
+
success: false,
|
|
429
|
+
output: '',
|
|
430
|
+
artifacts: [],
|
|
431
|
+
metrics: {
|
|
432
|
+
duration: Date.now() - startTime,
|
|
433
|
+
tokensUsed: 0,
|
|
434
|
+
apiCalls: 0,
|
|
435
|
+
filesModified: 0,
|
|
436
|
+
linesChanged: 0,
|
|
437
|
+
complexity: 0,
|
|
438
|
+
},
|
|
439
|
+
errors: [error.message],
|
|
440
|
+
warnings: [],
|
|
441
|
+
suggestions: [],
|
|
442
|
+
completedAt: new Date(),
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
async collaborate(message) {
|
|
447
|
+
this.memory.conversations.push(message);
|
|
448
|
+
}
|
|
449
|
+
async reviewCode(context) {
|
|
450
|
+
return {
|
|
451
|
+
summary: 'Code review completed',
|
|
452
|
+
comments: [
|
|
453
|
+
'Consider adding more type annotations',
|
|
454
|
+
'Function is too long, consider splitting',
|
|
455
|
+
'Missing error handling',
|
|
456
|
+
],
|
|
457
|
+
warnings: [
|
|
458
|
+
'Potential null pointer exception',
|
|
459
|
+
'Hardcoded credentials detected',
|
|
460
|
+
],
|
|
461
|
+
suggestions: [
|
|
462
|
+
'Use const instead of let where possible',
|
|
463
|
+
'Add unit tests for edge cases',
|
|
464
|
+
'Consider using async/await for better readability',
|
|
465
|
+
],
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
exports.ReviewerAgent = ReviewerAgent;
|
|
470
|
+
class TesterAgent {
|
|
471
|
+
id = 'tester-' + Date.now().toString(36);
|
|
472
|
+
name = 'Test Engineer';
|
|
473
|
+
type = 'tester';
|
|
474
|
+
status = 'idle';
|
|
475
|
+
capabilities = [
|
|
476
|
+
{
|
|
477
|
+
name: 'test',
|
|
478
|
+
description: 'Generate and run tests',
|
|
479
|
+
priority: 1,
|
|
480
|
+
canExecute: (task) => task.type === 'test',
|
|
481
|
+
},
|
|
482
|
+
];
|
|
483
|
+
context;
|
|
484
|
+
memory;
|
|
485
|
+
llmProvider;
|
|
486
|
+
constructor(context, llmProvider) {
|
|
487
|
+
this.context = context;
|
|
488
|
+
this.llmProvider = llmProvider;
|
|
489
|
+
this.memory = {
|
|
490
|
+
shortTerm: [],
|
|
491
|
+
longTerm: new Map(),
|
|
492
|
+
conversations: [],
|
|
493
|
+
learnings: [],
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
async execute(task) {
|
|
497
|
+
this.status = 'working';
|
|
498
|
+
const startTime = Date.now();
|
|
499
|
+
try {
|
|
500
|
+
const tests = await this.generateTests(task.context);
|
|
501
|
+
this.status = 'idle';
|
|
502
|
+
return {
|
|
503
|
+
taskId: task.id,
|
|
504
|
+
agentId: this.id,
|
|
505
|
+
success: true,
|
|
506
|
+
output: `Generated ${tests.length} tests`,
|
|
507
|
+
artifacts: tests,
|
|
508
|
+
metrics: {
|
|
509
|
+
duration: Date.now() - startTime,
|
|
510
|
+
tokensUsed: 0,
|
|
511
|
+
apiCalls: 0,
|
|
512
|
+
filesModified: tests.length,
|
|
513
|
+
linesChanged: tests.reduce((sum, t) => sum + t.content.split('\n').length, 0),
|
|
514
|
+
complexity: 0,
|
|
515
|
+
},
|
|
516
|
+
errors: [],
|
|
517
|
+
warnings: [],
|
|
518
|
+
suggestions: [],
|
|
519
|
+
completedAt: new Date(),
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
catch (error) {
|
|
523
|
+
this.status = 'error';
|
|
524
|
+
return {
|
|
525
|
+
taskId: task.id,
|
|
526
|
+
agentId: this.id,
|
|
527
|
+
success: false,
|
|
528
|
+
output: '',
|
|
529
|
+
artifacts: [],
|
|
530
|
+
metrics: {
|
|
531
|
+
duration: Date.now() - startTime,
|
|
532
|
+
tokensUsed: 0,
|
|
533
|
+
apiCalls: 0,
|
|
534
|
+
filesModified: 0,
|
|
535
|
+
linesChanged: 0,
|
|
536
|
+
complexity: 0,
|
|
537
|
+
},
|
|
538
|
+
errors: [error.message],
|
|
539
|
+
warnings: [],
|
|
540
|
+
suggestions: [],
|
|
541
|
+
completedAt: new Date(),
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
async collaborate(message) {
|
|
546
|
+
this.memory.conversations.push(message);
|
|
547
|
+
}
|
|
548
|
+
async generateTests(context) {
|
|
549
|
+
const target = context.target || 'unknown';
|
|
550
|
+
return [
|
|
551
|
+
{
|
|
552
|
+
type: 'test',
|
|
553
|
+
path: `tests/${target}.test.ts`,
|
|
554
|
+
content: `describe('${target}', () => {
|
|
555
|
+
it('should handle normal case', () => {});
|
|
556
|
+
it('should handle edge case', () => {});
|
|
557
|
+
it('should handle error case', () => {});
|
|
558
|
+
});`,
|
|
559
|
+
},
|
|
560
|
+
];
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
exports.TesterAgent = TesterAgent;
|
|
564
|
+
// ============================================
|
|
565
|
+
// AGENT ORCHESTRATOR
|
|
566
|
+
// ============================================
|
|
567
|
+
class AgentOrchestrator extends events_1.EventEmitter {
|
|
568
|
+
agents = new Map();
|
|
569
|
+
tasks = new Map();
|
|
570
|
+
results = new Map();
|
|
571
|
+
messageQueue = [];
|
|
572
|
+
semanticMemory;
|
|
573
|
+
projectPath;
|
|
574
|
+
constructor(projectPath, memoryPath) {
|
|
575
|
+
super();
|
|
576
|
+
this.projectPath = projectPath;
|
|
577
|
+
this.semanticMemory = new semantic_memory_1.SemanticMemory(memoryPath);
|
|
578
|
+
}
|
|
579
|
+
async initialize() {
|
|
580
|
+
this.semanticMemory.init();
|
|
581
|
+
logger.info('Agent orchestrator initialized');
|
|
582
|
+
}
|
|
583
|
+
registerAgent(agent) {
|
|
584
|
+
this.agents.set(agent.id, agent);
|
|
585
|
+
this.emit('agent:registered', agent);
|
|
586
|
+
logger.info(`Agent registered: ${agent.name} (${agent.type})`);
|
|
587
|
+
}
|
|
588
|
+
createAgent(type, llmProvider) {
|
|
589
|
+
const context = {
|
|
590
|
+
projectPath: this.projectPath,
|
|
591
|
+
files: [],
|
|
592
|
+
dependencies: [],
|
|
593
|
+
recentCommits: [],
|
|
594
|
+
};
|
|
595
|
+
switch (type) {
|
|
596
|
+
case 'architect':
|
|
597
|
+
return new ArchitectAgent(context, llmProvider);
|
|
598
|
+
case 'coder':
|
|
599
|
+
return new CoderAgent(context, llmProvider);
|
|
600
|
+
case 'reviewer':
|
|
601
|
+
return new ReviewerAgent(context, llmProvider);
|
|
602
|
+
case 'tester':
|
|
603
|
+
return new TesterAgent(context, llmProvider);
|
|
604
|
+
default:
|
|
605
|
+
throw new Error(`Unknown agent type: ${type}`);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
async submitTask(task) {
|
|
609
|
+
const id = 'task-' + Date.now().toString(36) + '-' + Math.random().toString(36).slice(2, 6);
|
|
610
|
+
const fullTask = {
|
|
611
|
+
...task,
|
|
612
|
+
id,
|
|
613
|
+
subtasks: [],
|
|
614
|
+
};
|
|
615
|
+
this.tasks.set(id, fullTask);
|
|
616
|
+
this.emit('task:submitted', fullTask);
|
|
617
|
+
// Find best agent for task
|
|
618
|
+
const agent = this.findBestAgent(fullTask);
|
|
619
|
+
if (agent) {
|
|
620
|
+
fullTask.assignedTo = agent.id;
|
|
621
|
+
// Execute task
|
|
622
|
+
const result = await agent.execute(fullTask);
|
|
623
|
+
this.results.set(id, result);
|
|
624
|
+
this.emit('task:completed', result);
|
|
625
|
+
// Store in semantic memory
|
|
626
|
+
this.semanticMemory.store(id, `Task: ${task.description}\nResult: ${result.output}`, 'task', {
|
|
627
|
+
type: task.type,
|
|
628
|
+
success: result.success,
|
|
629
|
+
agent: agent.name,
|
|
630
|
+
timestamp: new Date().toISOString(),
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
else {
|
|
634
|
+
logger.warn(`No suitable agent found for task: ${task.description}`);
|
|
635
|
+
}
|
|
636
|
+
return id;
|
|
637
|
+
}
|
|
638
|
+
findBestAgent(task) {
|
|
639
|
+
let bestAgent;
|
|
640
|
+
let bestScore = -1;
|
|
641
|
+
for (const agent of this.agents.values()) {
|
|
642
|
+
let score = 0;
|
|
643
|
+
// Check capabilities
|
|
644
|
+
for (const cap of agent.capabilities) {
|
|
645
|
+
if (cap.canExecute(task)) {
|
|
646
|
+
score += cap.priority * 10;
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
// Check agent type match
|
|
650
|
+
if (this.typeMatchesTask(agent.type, task.type)) {
|
|
651
|
+
score += 5;
|
|
652
|
+
}
|
|
653
|
+
// Check if agent is idle
|
|
654
|
+
if (agent.status === 'idle') {
|
|
655
|
+
score += 3;
|
|
656
|
+
}
|
|
657
|
+
if (score > bestScore) {
|
|
658
|
+
bestScore = score;
|
|
659
|
+
bestAgent = agent;
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
return bestAgent;
|
|
663
|
+
}
|
|
664
|
+
typeMatchesTask(agentType, taskType) {
|
|
665
|
+
const mappings = {
|
|
666
|
+
architect: ['design', 'analyze'],
|
|
667
|
+
coder: ['implement', 'refactor'],
|
|
668
|
+
reviewer: ['review'],
|
|
669
|
+
tester: ['test'],
|
|
670
|
+
debugger: ['debug'],
|
|
671
|
+
optimizer: ['optimize'],
|
|
672
|
+
security: ['analyze'],
|
|
673
|
+
documenter: ['document'],
|
|
674
|
+
researcher: ['research'],
|
|
675
|
+
coordinator: [],
|
|
676
|
+
};
|
|
677
|
+
return mappings[agentType]?.includes(taskType) || false;
|
|
678
|
+
}
|
|
679
|
+
async broadcast(message) {
|
|
680
|
+
const fullMessage = {
|
|
681
|
+
...message,
|
|
682
|
+
id: 'msg-' + Date.now().toString(36),
|
|
683
|
+
timestamp: new Date(),
|
|
684
|
+
};
|
|
685
|
+
this.messageQueue.push(fullMessage);
|
|
686
|
+
for (const agent of this.agents.values()) {
|
|
687
|
+
await agent.collaborate(fullMessage);
|
|
688
|
+
}
|
|
689
|
+
this.emit('message:broadcast', fullMessage);
|
|
690
|
+
}
|
|
691
|
+
getAgentStatus() {
|
|
692
|
+
return Array.from(this.agents.values()).map(a => ({
|
|
693
|
+
id: a.id,
|
|
694
|
+
name: a.name,
|
|
695
|
+
type: a.type,
|
|
696
|
+
status: a.status,
|
|
697
|
+
}));
|
|
698
|
+
}
|
|
699
|
+
getTaskStatus(taskId) {
|
|
700
|
+
return this.results.get(taskId);
|
|
701
|
+
}
|
|
702
|
+
getAllTasks() {
|
|
703
|
+
return Array.from(this.tasks.values());
|
|
704
|
+
}
|
|
705
|
+
async runWorkflow(workflow) {
|
|
706
|
+
logger.info(`Starting workflow: ${workflow.name}`);
|
|
707
|
+
const results = [];
|
|
708
|
+
for (const step of workflow.steps) {
|
|
709
|
+
logger.info(`Executing workflow step: ${step.name}`);
|
|
710
|
+
// Create task from step
|
|
711
|
+
const taskId = await this.submitTask({
|
|
712
|
+
type: step.taskType,
|
|
713
|
+
priority: step.priority,
|
|
714
|
+
description: step.description,
|
|
715
|
+
context: step.context,
|
|
716
|
+
dependencies: step.dependencies,
|
|
717
|
+
estimatedTime: step.estimatedTime,
|
|
718
|
+
});
|
|
719
|
+
const result = this.results.get(taskId);
|
|
720
|
+
if (result) {
|
|
721
|
+
results.push(result);
|
|
722
|
+
if (!result.success && step.required) {
|
|
723
|
+
logger.error(`Required step failed: ${step.name}`);
|
|
724
|
+
break;
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
return {
|
|
729
|
+
name: workflow.name,
|
|
730
|
+
success: results.every(r => r.success),
|
|
731
|
+
results,
|
|
732
|
+
completedAt: new Date(),
|
|
733
|
+
};
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
exports.AgentOrchestrator = AgentOrchestrator;
|
|
737
|
+
exports.default = AgentOrchestrator;
|
|
738
|
+
//# sourceMappingURL=agent-system.js.map
|