@defai.digital/ax-cli 2.7.0 → 3.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/.ax-cli/checkpoints/2025-11-20/checkpoint-2dd84869-e62d-46c8-9885-7e45f37f36e2.json +69 -0
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-484dc350-353f-4808-9ed1-ebb3cefdab37.json +24 -0
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-74a18b87-6172-4215-962b-44bb9f46a662.json +69 -0
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-870a5fb9-6e82-4ff2-8ec8-af4c251cc514.json +44 -0
- package/.ax-cli/checkpoints/2025-11-20/checkpoint-93946601-0e83-456c-ba47-def9713124dd.json +24 -0
- package/.ax-cli/checkpoints/metadata.json +62 -0
- package/README.md +87 -11
- package/dist/agent/context-manager.d.ts +2 -2
- package/dist/agent/context-manager.js +37 -15
- package/dist/agent/context-manager.js.map +1 -1
- package/dist/agent/dependency-resolver.d.ts +83 -0
- package/dist/agent/dependency-resolver.js +310 -0
- package/dist/agent/dependency-resolver.js.map +1 -0
- package/dist/agent/llm-agent.d.ts +111 -0
- package/dist/agent/llm-agent.js +625 -3
- package/dist/agent/llm-agent.js.map +1 -1
- package/dist/agent/specialized/analysis-agent.d.ts +11 -0
- package/dist/agent/specialized/analysis-agent.js +33 -0
- package/dist/agent/specialized/analysis-agent.js.map +1 -0
- package/dist/agent/specialized/debug-agent.d.ts +11 -0
- package/dist/agent/specialized/debug-agent.js +33 -0
- package/dist/agent/specialized/debug-agent.js.map +1 -0
- package/dist/agent/specialized/documentation-agent.d.ts +11 -0
- package/dist/agent/specialized/documentation-agent.js +33 -0
- package/dist/agent/specialized/documentation-agent.js.map +1 -0
- package/dist/agent/specialized/index.d.ts +11 -0
- package/dist/agent/specialized/index.js +12 -0
- package/dist/agent/specialized/index.js.map +1 -0
- package/dist/agent/specialized/performance-agent.d.ts +11 -0
- package/dist/agent/specialized/performance-agent.js +33 -0
- package/dist/agent/specialized/performance-agent.js.map +1 -0
- package/dist/agent/specialized/refactoring-agent.d.ts +11 -0
- package/dist/agent/specialized/refactoring-agent.js +33 -0
- package/dist/agent/specialized/refactoring-agent.js.map +1 -0
- package/dist/agent/specialized/testing-agent.d.ts +11 -0
- package/dist/agent/specialized/testing-agent.js +33 -0
- package/dist/agent/specialized/testing-agent.js.map +1 -0
- package/dist/agent/subagent-orchestrator.d.ts +128 -0
- package/dist/agent/subagent-orchestrator.js +388 -0
- package/dist/agent/subagent-orchestrator.js.map +1 -0
- package/dist/agent/subagent-types.d.ts +262 -0
- package/dist/agent/subagent-types.js +152 -0
- package/dist/agent/subagent-types.js.map +1 -0
- package/dist/agent/subagent.d.ts +88 -0
- package/dist/agent/subagent.js +426 -0
- package/dist/agent/subagent.js.map +1 -0
- package/dist/checkpoint/index.d.ts +9 -0
- package/dist/checkpoint/index.js +11 -0
- package/dist/checkpoint/index.js.map +1 -0
- package/dist/checkpoint/manager.d.ts +99 -0
- package/dist/checkpoint/manager.js +281 -0
- package/dist/checkpoint/manager.js.map +1 -0
- package/dist/checkpoint/storage.d.ts +31 -0
- package/dist/checkpoint/storage.js +265 -0
- package/dist/checkpoint/storage.js.map +1 -0
- package/dist/checkpoint/types.d.ts +111 -0
- package/dist/checkpoint/types.js +17 -0
- package/dist/checkpoint/types.js.map +1 -0
- package/dist/commands/cache.js +5 -3
- package/dist/commands/cache.js.map +1 -1
- package/dist/commands/memory.js +21 -16
- package/dist/commands/memory.js.map +1 -1
- package/dist/commands/plan.d.ts +43 -0
- package/dist/commands/plan.js +385 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/rewind.d.ts +19 -0
- package/dist/commands/rewind.js +221 -0
- package/dist/commands/rewind.js.map +1 -0
- package/dist/constants.d.ts +28 -0
- package/dist/constants.js +29 -0
- package/dist/constants.js.map +1 -1
- package/dist/hooks/use-enhanced-input.d.ts +5 -1
- package/dist/hooks/use-enhanced-input.js +23 -10
- package/dist/hooks/use-enhanced-input.js.map +1 -1
- package/dist/hooks/use-input-handler.d.ts +11 -1
- package/dist/hooks/use-input-handler.js +294 -2
- package/dist/hooks/use-input-handler.js.map +1 -1
- package/dist/llm/client.js +2 -1
- package/dist/llm/client.js.map +1 -1
- package/dist/llm/tools.d.ts +5 -0
- package/dist/llm/tools.js +57 -6
- package/dist/llm/tools.js.map +1 -1
- package/dist/mcp/client.d.ts +1 -0
- package/dist/mcp/client.js +30 -8
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/transports.d.ts +0 -1
- package/dist/mcp/transports.js +10 -7
- package/dist/mcp/transports.js.map +1 -1
- package/dist/planner/dependency-resolver.d.ts +72 -0
- package/dist/planner/dependency-resolver.js +272 -0
- package/dist/planner/dependency-resolver.js.map +1 -0
- package/dist/planner/index.d.ts +12 -0
- package/dist/planner/index.js +26 -0
- package/dist/planner/index.js.map +1 -0
- package/dist/planner/plan-generator.d.ts +74 -0
- package/dist/planner/plan-generator.js +244 -0
- package/dist/planner/plan-generator.js.map +1 -0
- package/dist/planner/plan-storage.d.ts +98 -0
- package/dist/planner/plan-storage.js +325 -0
- package/dist/planner/plan-storage.js.map +1 -0
- package/dist/planner/prompts/planning-prompt.d.ts +41 -0
- package/dist/planner/prompts/planning-prompt.js +289 -0
- package/dist/planner/prompts/planning-prompt.js.map +1 -0
- package/dist/planner/task-planner.d.ts +135 -0
- package/dist/planner/task-planner.js +493 -0
- package/dist/planner/task-planner.js.map +1 -0
- package/dist/planner/token-estimator.d.ts +63 -0
- package/dist/planner/token-estimator.js +295 -0
- package/dist/planner/token-estimator.js.map +1 -0
- package/dist/planner/types.d.ts +669 -0
- package/dist/planner/types.js +213 -0
- package/dist/planner/types.js.map +1 -0
- package/dist/schemas/api-schemas.js +4 -0
- package/dist/schemas/api-schemas.js.map +1 -1
- package/dist/schemas/confirmation-schemas.d.ts +5 -0
- package/dist/schemas/confirmation-schemas.js +7 -0
- package/dist/schemas/confirmation-schemas.js.map +1 -1
- package/dist/schemas/index.d.ts +4 -4
- package/dist/tools/bash-output.d.ts +25 -0
- package/dist/tools/bash-output.js +145 -0
- package/dist/tools/bash-output.js.map +1 -0
- package/dist/tools/bash.d.ts +46 -2
- package/dist/tools/bash.js +241 -42
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/search.js +34 -9
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/text-editor.d.ts +16 -0
- package/dist/tools/text-editor.js +37 -2
- package/dist/tools/text-editor.js.map +1 -1
- package/dist/ui/components/chat-history.d.ts +1 -0
- package/dist/ui/components/chat-history.js +125 -41
- package/dist/ui/components/chat-history.js.map +1 -1
- package/dist/ui/components/chat-input.js +10 -3
- package/dist/ui/components/chat-input.js.map +1 -1
- package/dist/ui/components/chat-interface.js +154 -45
- package/dist/ui/components/chat-interface.js.map +1 -1
- package/dist/ui/components/collapsible-tool-result.d.ts +26 -0
- package/dist/ui/components/collapsible-tool-result.js +172 -0
- package/dist/ui/components/collapsible-tool-result.js.map +1 -0
- package/dist/ui/components/command-suggestions.js +2 -1
- package/dist/ui/components/command-suggestions.js.map +1 -1
- package/dist/ui/components/confirmation-dialog.js +25 -36
- package/dist/ui/components/confirmation-dialog.js.map +1 -1
- package/dist/ui/components/index.d.ts +8 -0
- package/dist/ui/components/index.js +9 -0
- package/dist/ui/components/index.js.map +1 -1
- package/dist/ui/components/keyboard-hints.d.ts +35 -0
- package/dist/ui/components/keyboard-hints.js +134 -0
- package/dist/ui/components/keyboard-hints.js.map +1 -0
- package/dist/ui/components/loading-spinner.d.ts +2 -1
- package/dist/ui/components/loading-spinner.js +86 -34
- package/dist/ui/components/loading-spinner.js.map +1 -1
- package/dist/ui/components/phase-progress.d.ts +21 -0
- package/dist/ui/components/phase-progress.js +228 -0
- package/dist/ui/components/phase-progress.js.map +1 -0
- package/dist/ui/components/quick-actions.d.ts +12 -0
- package/dist/ui/components/quick-actions.js +122 -0
- package/dist/ui/components/quick-actions.js.map +1 -0
- package/dist/ui/components/reasoning-display.d.ts +0 -80
- package/dist/ui/components/reasoning-display.js +0 -83
- package/dist/ui/components/reasoning-display.js.map +1 -1
- package/dist/ui/components/status-bar.d.ts +25 -0
- package/dist/ui/components/status-bar.js +125 -0
- package/dist/ui/components/status-bar.js.map +1 -0
- package/dist/ui/components/subagent-monitor.d.ts +29 -0
- package/dist/ui/components/subagent-monitor.js +150 -0
- package/dist/ui/components/subagent-monitor.js.map +1 -0
- package/dist/ui/components/toast-notification.d.ts +123 -0
- package/dist/ui/components/toast-notification.js +143 -0
- package/dist/ui/components/toast-notification.js.map +1 -0
- package/dist/ui/components/welcome-panel.d.ts +10 -0
- package/dist/ui/components/welcome-panel.js +107 -0
- package/dist/ui/components/welcome-panel.js.map +1 -0
- package/dist/utils/background-task-manager.d.ts +95 -0
- package/dist/utils/background-task-manager.js +330 -0
- package/dist/utils/background-task-manager.js.map +1 -0
- package/dist/utils/confirmation-service.js +8 -3
- package/dist/utils/confirmation-service.js.map +1 -1
- package/dist/utils/history-manager.d.ts +1 -0
- package/dist/utils/history-manager.js +40 -5
- package/dist/utils/history-manager.js.map +1 -1
- package/dist/utils/json-utils.d.ts +7 -0
- package/dist/utils/json-utils.js +70 -2
- package/dist/utils/json-utils.js.map +1 -1
- package/dist/utils/message-optimizer.d.ts +1 -0
- package/dist/utils/message-optimizer.js +7 -1
- package/dist/utils/message-optimizer.js.map +1 -1
- package/dist/utils/project-analyzer.js +5 -2
- package/dist/utils/project-analyzer.js.map +1 -1
- package/dist/utils/settings-manager.js +12 -10
- package/dist/utils/settings-manager.js.map +1 -1
- package/dist/utils/text-utils.js +3 -3
- package/dist/utils/text-utils.js.map +1 -1
- package/dist/utils/token-counter.d.ts +5 -0
- package/dist/utils/token-counter.js +18 -3
- package/dist/utils/token-counter.js.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subagent Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Manages the lifecycle of subagents and coordinates parallel task execution.
|
|
5
|
+
* Handles spawning, delegation, dependency resolution, and result aggregation.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
import { Subagent } from './subagent.js';
|
|
9
|
+
import { SubagentRole, SubagentState } from './subagent-types.js';
|
|
10
|
+
import { DependencyResolver } from './dependency-resolver.js';
|
|
11
|
+
// Import specialized agents
|
|
12
|
+
import { TestingAgent } from './specialized/testing-agent.js';
|
|
13
|
+
import { DocumentationAgent } from './specialized/documentation-agent.js';
|
|
14
|
+
import { RefactoringAgent } from './specialized/refactoring-agent.js';
|
|
15
|
+
import { AnalysisAgent } from './specialized/analysis-agent.js';
|
|
16
|
+
import { DebugAgent } from './specialized/debug-agent.js';
|
|
17
|
+
import { PerformanceAgent } from './specialized/performance-agent.js';
|
|
18
|
+
/**
|
|
19
|
+
* SubagentOrchestrator manages multiple subagents
|
|
20
|
+
*/
|
|
21
|
+
export class SubagentOrchestrator extends EventEmitter {
|
|
22
|
+
subagents;
|
|
23
|
+
taskQueue;
|
|
24
|
+
results;
|
|
25
|
+
dependencyResolver;
|
|
26
|
+
activeCount;
|
|
27
|
+
config;
|
|
28
|
+
// Track event listeners for cleanup to prevent memory leaks
|
|
29
|
+
subagentListeners;
|
|
30
|
+
constructor(config) {
|
|
31
|
+
super();
|
|
32
|
+
this.config = {
|
|
33
|
+
maxConcurrentAgents: 5,
|
|
34
|
+
defaultTimeout: 300000,
|
|
35
|
+
autoCheckpoint: false,
|
|
36
|
+
verbose: false,
|
|
37
|
+
...config,
|
|
38
|
+
};
|
|
39
|
+
this.subagents = new Map();
|
|
40
|
+
this.taskQueue = [];
|
|
41
|
+
this.results = new Map();
|
|
42
|
+
this.dependencyResolver = new DependencyResolver();
|
|
43
|
+
this.activeCount = 0;
|
|
44
|
+
this.subagentListeners = new Map();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Spawn a new subagent with the specified role
|
|
48
|
+
*/
|
|
49
|
+
async spawn(role, config) {
|
|
50
|
+
// Check max concurrent agents limit
|
|
51
|
+
if (this.subagents.size >= this.config.maxConcurrentAgents) {
|
|
52
|
+
throw new Error(`Maximum concurrent agents limit (${this.config.maxConcurrentAgents}) reached`);
|
|
53
|
+
}
|
|
54
|
+
let subagent;
|
|
55
|
+
// Create specialized subagent based on role
|
|
56
|
+
switch (role) {
|
|
57
|
+
case SubagentRole.TESTING:
|
|
58
|
+
subagent = new TestingAgent(config);
|
|
59
|
+
break;
|
|
60
|
+
case SubagentRole.DOCUMENTATION:
|
|
61
|
+
subagent = new DocumentationAgent(config);
|
|
62
|
+
break;
|
|
63
|
+
case SubagentRole.REFACTORING:
|
|
64
|
+
subagent = new RefactoringAgent(config);
|
|
65
|
+
break;
|
|
66
|
+
case SubagentRole.ANALYSIS:
|
|
67
|
+
subagent = new AnalysisAgent(config);
|
|
68
|
+
break;
|
|
69
|
+
case SubagentRole.DEBUG:
|
|
70
|
+
subagent = new DebugAgent(config);
|
|
71
|
+
break;
|
|
72
|
+
case SubagentRole.PERFORMANCE:
|
|
73
|
+
subagent = new PerformanceAgent(config);
|
|
74
|
+
break;
|
|
75
|
+
case SubagentRole.GENERAL:
|
|
76
|
+
default:
|
|
77
|
+
subagent = new Subagent(SubagentRole.GENERAL, config);
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
// Register subagent using its own ID
|
|
81
|
+
this.subagents.set(subagent.id, subagent);
|
|
82
|
+
// Forward subagent events
|
|
83
|
+
this.forwardSubagentEvents(subagent.id, subagent);
|
|
84
|
+
this.emit('spawn', { id: subagent.id, role });
|
|
85
|
+
return subagent;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Alias for spawn() for backward compatibility
|
|
89
|
+
*/
|
|
90
|
+
async spawnSubagent(role, config) {
|
|
91
|
+
return this.spawn(role, config);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Forward events from subagent to orchestrator
|
|
95
|
+
* Stores listeners for proper cleanup to prevent memory leaks
|
|
96
|
+
*/
|
|
97
|
+
forwardSubagentEvents(id, subagent) {
|
|
98
|
+
// Create named handlers so we can remove them later
|
|
99
|
+
const handlers = new Map();
|
|
100
|
+
const taskStartedHandler = (data) => {
|
|
101
|
+
this.activeCount++;
|
|
102
|
+
this.emit('subagent-start', { subagentId: id, ...data });
|
|
103
|
+
};
|
|
104
|
+
handlers.set('task-started', taskStartedHandler);
|
|
105
|
+
subagent.on('task-started', taskStartedHandler);
|
|
106
|
+
const taskCompletedHandler = (data) => {
|
|
107
|
+
this.activeCount--;
|
|
108
|
+
this.results.set(data.taskId, data.result);
|
|
109
|
+
this.emit('subagent-complete', { subagentId: id, ...data });
|
|
110
|
+
};
|
|
111
|
+
handlers.set('task-completed', taskCompletedHandler);
|
|
112
|
+
subagent.on('task-completed', taskCompletedHandler);
|
|
113
|
+
const taskFailedHandler = (data) => {
|
|
114
|
+
this.activeCount--;
|
|
115
|
+
this.emit('subagent-error', { subagentId: id, ...data });
|
|
116
|
+
};
|
|
117
|
+
handlers.set('task-failed', taskFailedHandler);
|
|
118
|
+
subagent.on('task-failed', taskFailedHandler);
|
|
119
|
+
const progressHandler = (data) => {
|
|
120
|
+
this.emit('subagent-progress', { subagentId: id, ...data });
|
|
121
|
+
};
|
|
122
|
+
handlers.set('progress', progressHandler);
|
|
123
|
+
subagent.on('progress', progressHandler);
|
|
124
|
+
const toolExecutedHandler = (data) => {
|
|
125
|
+
this.emit('subagent-tool', { subagentId: id, ...data });
|
|
126
|
+
};
|
|
127
|
+
handlers.set('tool-executed', toolExecutedHandler);
|
|
128
|
+
subagent.on('tool-executed', toolExecutedHandler);
|
|
129
|
+
// Store handlers for cleanup
|
|
130
|
+
this.subagentListeners.set(id, handlers);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Delegate a task to a subagent with the specified role
|
|
134
|
+
*/
|
|
135
|
+
async delegateTask(task, role) {
|
|
136
|
+
// Determine role from task if not specified
|
|
137
|
+
const taskRole = role || this.inferRoleFromTask(task);
|
|
138
|
+
// Spawn subagent
|
|
139
|
+
const subagent = await this.spawnSubagent(taskRole);
|
|
140
|
+
try {
|
|
141
|
+
// Execute task
|
|
142
|
+
const result = await subagent.executeTask(task);
|
|
143
|
+
// Store result
|
|
144
|
+
this.results.set(task.id, result);
|
|
145
|
+
return result;
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
// Clean up subagent after task completion
|
|
149
|
+
await this.terminateSubagent(subagent.id);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Execute multiple tasks in parallel
|
|
154
|
+
*/
|
|
155
|
+
async executeParallel(tasks) {
|
|
156
|
+
// Validate dependencies
|
|
157
|
+
if (!this.dependencyResolver.validateDependencies(tasks)) {
|
|
158
|
+
throw new Error('Circular dependencies detected in tasks');
|
|
159
|
+
}
|
|
160
|
+
// Resolve dependencies and get execution batches
|
|
161
|
+
const batches = this.dependencyResolver.resolveDependencies(tasks);
|
|
162
|
+
const allResults = [];
|
|
163
|
+
// Execute batches sequentially, but tasks within each batch in parallel
|
|
164
|
+
for (const batch of batches) {
|
|
165
|
+
const batchTasks = batch
|
|
166
|
+
.map(taskId => tasks.find(t => t.id === taskId))
|
|
167
|
+
.filter((task) => task !== undefined);
|
|
168
|
+
// Skip empty batches (shouldn't happen with valid dependency resolution)
|
|
169
|
+
if (batchTasks.length === 0)
|
|
170
|
+
continue;
|
|
171
|
+
// Execute batch in parallel
|
|
172
|
+
const batchResults = await this.executeBatch(batchTasks);
|
|
173
|
+
allResults.push(...batchResults);
|
|
174
|
+
}
|
|
175
|
+
return allResults;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Execute a batch of tasks in parallel
|
|
179
|
+
*/
|
|
180
|
+
async executeBatch(tasks) {
|
|
181
|
+
const promises = tasks.map(async (task) => {
|
|
182
|
+
// Infer role from task
|
|
183
|
+
const role = this.inferRoleFromTask(task);
|
|
184
|
+
// Spawn and execute
|
|
185
|
+
const subagent = await this.spawnSubagent(role);
|
|
186
|
+
try {
|
|
187
|
+
const result = await subagent.executeTask(task);
|
|
188
|
+
this.results.set(task.id, result);
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
await this.terminateSubagent(subagent.id);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
// Execute all in parallel with fail-safe
|
|
196
|
+
const results = await Promise.allSettled(promises);
|
|
197
|
+
return results.map((r, i) => {
|
|
198
|
+
if (r.status === 'fulfilled') {
|
|
199
|
+
return r.value;
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
// Task failed - create a proper SubagentResult
|
|
203
|
+
const task = tasks[i];
|
|
204
|
+
const failedResult = {
|
|
205
|
+
id: `failed-${task.id}`,
|
|
206
|
+
taskId: task.id,
|
|
207
|
+
role: task.role,
|
|
208
|
+
success: false,
|
|
209
|
+
output: '',
|
|
210
|
+
error: r.reason?.message || 'Unknown error',
|
|
211
|
+
executionTime: 0,
|
|
212
|
+
status: {
|
|
213
|
+
id: `status-${task.id}`,
|
|
214
|
+
taskId: task.id,
|
|
215
|
+
role: task.role,
|
|
216
|
+
state: SubagentState.FAILED,
|
|
217
|
+
progress: 0,
|
|
218
|
+
startTime: new Date(),
|
|
219
|
+
endTime: new Date(),
|
|
220
|
+
error: r.reason?.message || 'Unknown error',
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
return failedResult;
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Infer subagent role from task description
|
|
229
|
+
*/
|
|
230
|
+
inferRoleFromTask(task) {
|
|
231
|
+
const desc = task.description.toLowerCase();
|
|
232
|
+
if (desc.includes('test') || desc.includes('testing')) {
|
|
233
|
+
return SubagentRole.TESTING;
|
|
234
|
+
}
|
|
235
|
+
if (desc.includes('document') || desc.includes('readme') || desc.includes('docs')) {
|
|
236
|
+
return SubagentRole.DOCUMENTATION;
|
|
237
|
+
}
|
|
238
|
+
if (desc.includes('refactor') || desc.includes('restructure')) {
|
|
239
|
+
return SubagentRole.REFACTORING;
|
|
240
|
+
}
|
|
241
|
+
if (desc.includes('analyze') || desc.includes('review') || desc.includes('audit')) {
|
|
242
|
+
return SubagentRole.ANALYSIS;
|
|
243
|
+
}
|
|
244
|
+
if (desc.includes('debug') || desc.includes('fix') || desc.includes('bug')) {
|
|
245
|
+
return SubagentRole.DEBUG;
|
|
246
|
+
}
|
|
247
|
+
if (desc.includes('performance') || desc.includes('optimize') || desc.includes('speed')) {
|
|
248
|
+
return SubagentRole.PERFORMANCE;
|
|
249
|
+
}
|
|
250
|
+
return SubagentRole.GENERAL;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Terminate a specific subagent by ID
|
|
254
|
+
* Properly removes event listeners to prevent memory leaks
|
|
255
|
+
*/
|
|
256
|
+
async terminateSubagent(subagentId) {
|
|
257
|
+
const subagent = this.subagents.get(subagentId);
|
|
258
|
+
if (!subagent) {
|
|
259
|
+
return; // Gracefully handle non-existent subagent
|
|
260
|
+
}
|
|
261
|
+
// Remove event listeners to prevent memory leaks
|
|
262
|
+
const handlers = this.subagentListeners.get(subagentId);
|
|
263
|
+
if (handlers) {
|
|
264
|
+
for (const [event, handler] of handlers) {
|
|
265
|
+
subagent.off(event, handler);
|
|
266
|
+
}
|
|
267
|
+
this.subagentListeners.delete(subagentId);
|
|
268
|
+
}
|
|
269
|
+
await subagent.terminate();
|
|
270
|
+
this.subagents.delete(subagentId);
|
|
271
|
+
this.emit('terminate', { id: subagentId });
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Terminate all subagents
|
|
275
|
+
* Properly removes all event listeners to prevent memory leaks
|
|
276
|
+
*/
|
|
277
|
+
async terminateAll() {
|
|
278
|
+
// Remove all event listeners before terminating
|
|
279
|
+
for (const [subagentId, subagent] of this.subagents) {
|
|
280
|
+
const handlers = this.subagentListeners.get(subagentId);
|
|
281
|
+
if (handlers) {
|
|
282
|
+
for (const [event, handler] of handlers) {
|
|
283
|
+
subagent.off(event, handler);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
this.subagentListeners.clear();
|
|
288
|
+
const terminatePromises = Array.from(this.subagents.values()).map((subagent) => subagent.terminate());
|
|
289
|
+
await Promise.all(terminatePromises);
|
|
290
|
+
this.subagents.clear();
|
|
291
|
+
this.activeCount = 0;
|
|
292
|
+
this.emit('all-terminated');
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Get result for a specific task
|
|
296
|
+
*/
|
|
297
|
+
getResult(taskId) {
|
|
298
|
+
return this.results.get(taskId);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Get all results
|
|
302
|
+
*/
|
|
303
|
+
getAllResults() {
|
|
304
|
+
return new Map(this.results);
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Get orchestrator status
|
|
308
|
+
*/
|
|
309
|
+
getStatus() {
|
|
310
|
+
return {
|
|
311
|
+
totalSubagents: this.subagents.size,
|
|
312
|
+
activeSubagents: this.activeCount,
|
|
313
|
+
completedTasks: this.results.size,
|
|
314
|
+
queuedTasks: this.taskQueue.length,
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Get list of active subagents
|
|
319
|
+
*/
|
|
320
|
+
getActiveSubagents() {
|
|
321
|
+
const active = [];
|
|
322
|
+
for (const [id, subagent] of this.subagents) {
|
|
323
|
+
const status = subagent.getStatus();
|
|
324
|
+
// Check if state is RUNNING (active)
|
|
325
|
+
if (status.state === SubagentState.RUNNING) {
|
|
326
|
+
active.push({
|
|
327
|
+
id,
|
|
328
|
+
role: status.role,
|
|
329
|
+
status: status,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return active;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Clear all results
|
|
337
|
+
*/
|
|
338
|
+
clearResults() {
|
|
339
|
+
this.results.clear();
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Get all active subagents (alias for tests)
|
|
343
|
+
*/
|
|
344
|
+
getActive() {
|
|
345
|
+
return Array.from(this.subagents.values());
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Monitor a specific subagent's status
|
|
349
|
+
*/
|
|
350
|
+
monitor(subagentId) {
|
|
351
|
+
const subagent = this.subagents.get(subagentId);
|
|
352
|
+
if (!subagent) {
|
|
353
|
+
return null;
|
|
354
|
+
}
|
|
355
|
+
return subagent.getStatus();
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Get orchestrator statistics
|
|
359
|
+
*/
|
|
360
|
+
getStats() {
|
|
361
|
+
const results = Array.from(this.results.values());
|
|
362
|
+
return {
|
|
363
|
+
activeAgents: this.subagents.size,
|
|
364
|
+
totalResults: results.length,
|
|
365
|
+
successfulTasks: results.filter(r => r.success).length,
|
|
366
|
+
failedTasks: results.filter(r => !r.success).length,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Spawn multiple subagents in parallel
|
|
371
|
+
*/
|
|
372
|
+
async spawnParallel(configs) {
|
|
373
|
+
return Promise.all(configs.map(({ role, config }) => this.spawn(role, config)));
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Send a message to a subagent
|
|
377
|
+
*/
|
|
378
|
+
async sendMessage(subagentId, message) {
|
|
379
|
+
const subagent = this.subagents.get(subagentId);
|
|
380
|
+
if (!subagent) {
|
|
381
|
+
throw new Error(`Subagent ${subagentId} not found`);
|
|
382
|
+
}
|
|
383
|
+
// Subagent will handle the message via receiveMessage method
|
|
384
|
+
// For now, just emit an event
|
|
385
|
+
this.emit('message-sent', { subagentId, message });
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
//# sourceMappingURL=subagent-orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-orchestrator.js","sourceRoot":"","sources":["../../src/agent/subagent-orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subagent System Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the autonomous subagent system that enables
|
|
5
|
+
* parallel task execution and specialized agent capabilities.
|
|
6
|
+
*/
|
|
7
|
+
import type { LLMToolCall } from '../llm/client.js';
|
|
8
|
+
/**
|
|
9
|
+
* Types of specialized agents available
|
|
10
|
+
*/
|
|
11
|
+
export declare enum SubagentRole {
|
|
12
|
+
/** General-purpose agent for any task */
|
|
13
|
+
GENERAL = "general",
|
|
14
|
+
/** Specialized in writing and running tests */
|
|
15
|
+
TESTING = "testing",
|
|
16
|
+
/** Specialized in generating documentation */
|
|
17
|
+
DOCUMENTATION = "documentation",
|
|
18
|
+
/** Specialized in code refactoring */
|
|
19
|
+
REFACTORING = "refactoring",
|
|
20
|
+
/** Specialized in code analysis and bug detection */
|
|
21
|
+
ANALYSIS = "analysis",
|
|
22
|
+
/** Specialized in debugging and error resolution */
|
|
23
|
+
DEBUG = "debug",
|
|
24
|
+
/** Specialized in performance optimization */
|
|
25
|
+
PERFORMANCE = "performance"
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Chat entry (from llm-agent.ts to avoid circular dependency)
|
|
29
|
+
*/
|
|
30
|
+
export interface ChatEntry {
|
|
31
|
+
type: 'user' | 'assistant' | 'tool_result' | 'tool_call';
|
|
32
|
+
content: string;
|
|
33
|
+
timestamp: Date;
|
|
34
|
+
toolCalls?: LLMToolCall[];
|
|
35
|
+
toolCall?: LLMToolCall;
|
|
36
|
+
toolResult?: {
|
|
37
|
+
success: boolean;
|
|
38
|
+
output?: string;
|
|
39
|
+
error?: string;
|
|
40
|
+
};
|
|
41
|
+
isStreaming?: boolean;
|
|
42
|
+
reasoningContent?: string;
|
|
43
|
+
isReasoningStreaming?: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Configuration for creating a subagent
|
|
47
|
+
*/
|
|
48
|
+
export interface SubagentConfig {
|
|
49
|
+
/** Role/specialization of the subagent */
|
|
50
|
+
role: SubagentRole;
|
|
51
|
+
/** Tools this subagent is allowed to use */
|
|
52
|
+
allowedTools: string[];
|
|
53
|
+
/** Maximum tool execution rounds */
|
|
54
|
+
maxToolRounds: number;
|
|
55
|
+
/** Number of conversation messages to include as context */
|
|
56
|
+
contextDepth: number;
|
|
57
|
+
/** Custom system prompt (overrides role-based prompt) */
|
|
58
|
+
customSystemPrompt?: string;
|
|
59
|
+
/** Execution timeout in milliseconds */
|
|
60
|
+
timeout?: number;
|
|
61
|
+
/** Priority level (higher = executed first) */
|
|
62
|
+
priority?: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Task to be executed by a subagent
|
|
66
|
+
*/
|
|
67
|
+
export interface SubagentTask {
|
|
68
|
+
/** Unique task identifier */
|
|
69
|
+
id: string;
|
|
70
|
+
/** Human-readable task description */
|
|
71
|
+
description: string;
|
|
72
|
+
/** Subagent role to use for this task */
|
|
73
|
+
role: SubagentRole;
|
|
74
|
+
/** Priority level (higher = executed first) */
|
|
75
|
+
priority: number;
|
|
76
|
+
/** Context to provide to the subagent */
|
|
77
|
+
context: SubagentContext;
|
|
78
|
+
/** IDs of tasks that must complete before this one */
|
|
79
|
+
dependencies?: string[];
|
|
80
|
+
/** Maximum tool rounds for this task */
|
|
81
|
+
maxToolRounds?: number;
|
|
82
|
+
/** Timeout in milliseconds */
|
|
83
|
+
timeout?: number;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Context provided to a subagent
|
|
87
|
+
*/
|
|
88
|
+
export interface SubagentContext {
|
|
89
|
+
/** File paths to include in context */
|
|
90
|
+
files?: string[];
|
|
91
|
+
/** Code snippets to include */
|
|
92
|
+
codeSnippets?: CodeSnippet[];
|
|
93
|
+
/** Relevant conversation history */
|
|
94
|
+
conversationHistory?: ChatEntry[];
|
|
95
|
+
/** Additional metadata */
|
|
96
|
+
metadata?: Record<string, unknown>;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Code snippet for context
|
|
100
|
+
*/
|
|
101
|
+
export interface CodeSnippet {
|
|
102
|
+
/** File path this snippet is from */
|
|
103
|
+
path: string;
|
|
104
|
+
/** The code content */
|
|
105
|
+
content: string;
|
|
106
|
+
/** Programming language */
|
|
107
|
+
language: string;
|
|
108
|
+
/** Starting line number */
|
|
109
|
+
startLine?: number;
|
|
110
|
+
/** Ending line number */
|
|
111
|
+
endLine?: number;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Execution state of a subagent
|
|
115
|
+
*/
|
|
116
|
+
export declare enum SubagentState {
|
|
117
|
+
/** Waiting to be started */
|
|
118
|
+
PENDING = "pending",
|
|
119
|
+
/** Currently executing */
|
|
120
|
+
RUNNING = "running",
|
|
121
|
+
/** Successfully completed */
|
|
122
|
+
COMPLETED = "completed",
|
|
123
|
+
/** Failed with error */
|
|
124
|
+
FAILED = "failed",
|
|
125
|
+
/** Cancelled by user or system */
|
|
126
|
+
CANCELLED = "cancelled"
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Status information for a subagent
|
|
130
|
+
*/
|
|
131
|
+
export interface SubagentStatus {
|
|
132
|
+
/** Subagent unique identifier */
|
|
133
|
+
id: string;
|
|
134
|
+
/** Task being executed */
|
|
135
|
+
taskId: string;
|
|
136
|
+
/** Subagent role */
|
|
137
|
+
role: SubagentRole;
|
|
138
|
+
/** Current execution state */
|
|
139
|
+
state: SubagentState;
|
|
140
|
+
/** Progress percentage (0-100) */
|
|
141
|
+
progress: number;
|
|
142
|
+
/** When execution started */
|
|
143
|
+
startTime: Date;
|
|
144
|
+
/** When execution ended (if completed/failed) */
|
|
145
|
+
endTime?: Date;
|
|
146
|
+
/** Error message if failed */
|
|
147
|
+
error?: string;
|
|
148
|
+
/** Current action being performed */
|
|
149
|
+
currentAction?: string;
|
|
150
|
+
/** Tools used so far */
|
|
151
|
+
toolsUsed?: string[];
|
|
152
|
+
/** Number of tool rounds used */
|
|
153
|
+
toolRoundsUsed?: number;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Result of subagent execution
|
|
157
|
+
*/
|
|
158
|
+
export interface SubagentResult {
|
|
159
|
+
/** Subagent identifier */
|
|
160
|
+
id: string;
|
|
161
|
+
/** Task identifier */
|
|
162
|
+
taskId: string;
|
|
163
|
+
/** Subagent role */
|
|
164
|
+
role: SubagentRole;
|
|
165
|
+
/** Whether execution was successful */
|
|
166
|
+
success: boolean;
|
|
167
|
+
/** Output/response from the subagent */
|
|
168
|
+
output: string;
|
|
169
|
+
/** Files modified */
|
|
170
|
+
filesModified?: string[];
|
|
171
|
+
/** Files created */
|
|
172
|
+
filesCreated?: string[];
|
|
173
|
+
/** Tool calls made during execution */
|
|
174
|
+
toolCalls?: LLMToolCall[];
|
|
175
|
+
/** Error message if failed */
|
|
176
|
+
error?: string;
|
|
177
|
+
/** Execution time in milliseconds */
|
|
178
|
+
executionTime: number;
|
|
179
|
+
/** Final status */
|
|
180
|
+
status: SubagentStatus;
|
|
181
|
+
/** Artifacts produced (file paths, URLs, etc) */
|
|
182
|
+
artifacts?: string[];
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Message sent to/from a subagent
|
|
186
|
+
*/
|
|
187
|
+
export interface SubagentMessage {
|
|
188
|
+
/** Message sender */
|
|
189
|
+
from: 'parent' | 'subagent';
|
|
190
|
+
/** Message recipient */
|
|
191
|
+
to: 'parent' | 'subagent';
|
|
192
|
+
/** Message type */
|
|
193
|
+
type: 'instruction' | 'progress' | 'result' | 'error' | 'cancellation';
|
|
194
|
+
/** Message content */
|
|
195
|
+
content: string;
|
|
196
|
+
/** Timestamp */
|
|
197
|
+
timestamp: Date;
|
|
198
|
+
/** Additional data */
|
|
199
|
+
data?: unknown;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Event emitted by subagent system
|
|
203
|
+
*/
|
|
204
|
+
export interface SubagentEvent {
|
|
205
|
+
/** Event type */
|
|
206
|
+
type: 'spawn' | 'start' | 'progress' | 'complete' | 'fail' | 'cancel';
|
|
207
|
+
/** Subagent ID */
|
|
208
|
+
subagentId: string;
|
|
209
|
+
/** Task ID */
|
|
210
|
+
taskId: string;
|
|
211
|
+
/** Event data */
|
|
212
|
+
data?: unknown;
|
|
213
|
+
/** Timestamp */
|
|
214
|
+
timestamp: Date;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Configuration for subagent orchestrator
|
|
218
|
+
*/
|
|
219
|
+
export interface OrchestratorConfig {
|
|
220
|
+
/** Maximum concurrent subagents */
|
|
221
|
+
maxConcurrentAgents: number;
|
|
222
|
+
/** Default timeout for subagents */
|
|
223
|
+
defaultTimeout: number;
|
|
224
|
+
/** Enable automatic checkpoint before spawning */
|
|
225
|
+
autoCheckpoint: boolean;
|
|
226
|
+
/** Enable detailed logging */
|
|
227
|
+
verbose: boolean;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Dependency graph node
|
|
231
|
+
*/
|
|
232
|
+
export interface DependencyNode {
|
|
233
|
+
/** Task ID */
|
|
234
|
+
taskId: string;
|
|
235
|
+
/** Tasks this depends on */
|
|
236
|
+
dependencies: string[];
|
|
237
|
+
/** Tasks that depend on this */
|
|
238
|
+
dependents: string[];
|
|
239
|
+
/** Execution level (0 = no dependencies) */
|
|
240
|
+
level: number;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Dependency graph
|
|
244
|
+
*/
|
|
245
|
+
export interface DependencyGraph {
|
|
246
|
+
/** All nodes in the graph */
|
|
247
|
+
nodes: Map<string, DependencyNode>;
|
|
248
|
+
/** Execution order (batches that can run in parallel) */
|
|
249
|
+
executionOrder: string[][];
|
|
250
|
+
/** Whether graph has cycles */
|
|
251
|
+
hasCycles: boolean;
|
|
252
|
+
/** Cycle details if any */
|
|
253
|
+
cycles?: string[][];
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Default subagent configuration by role
|
|
257
|
+
*/
|
|
258
|
+
export declare const DEFAULT_SUBAGENT_CONFIG: Record<SubagentRole, Partial<SubagentConfig>>;
|
|
259
|
+
/**
|
|
260
|
+
* System prompts for each subagent role
|
|
261
|
+
*/
|
|
262
|
+
export declare const SUBAGENT_SYSTEM_PROMPTS: Record<SubagentRole, string>;
|