wave-agent-sdk 0.5.0 → 0.6.2
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/dist/agent.d.ts +14 -11
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +64 -151
- package/dist/constants/subagents.d.ts +5 -0
- package/dist/constants/subagents.d.ts.map +1 -0
- package/dist/constants/subagents.js +4 -0
- package/dist/constants/tools.d.ts +4 -1
- package/dist/constants/tools.d.ts.map +1 -1
- package/dist/constants/tools.js +4 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/managers/aiManager.d.ts +2 -5
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +43 -48
- package/dist/managers/backgroundTaskManager.d.ts.map +1 -1
- package/dist/managers/backgroundTaskManager.js +63 -53
- package/dist/managers/foregroundTaskManager.d.ts.map +1 -1
- package/dist/managers/foregroundTaskManager.js +3 -2
- package/dist/managers/mcpManager.d.ts.map +1 -1
- package/dist/managers/messageManager.d.ts +13 -27
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +94 -89
- package/dist/managers/permissionManager.d.ts.map +1 -1
- package/dist/managers/permissionManager.js +25 -15
- package/dist/managers/planManager.d.ts +1 -1
- package/dist/managers/planManager.d.ts.map +1 -1
- package/dist/managers/planManager.js +2 -2
- package/dist/managers/reversionManager.d.ts.map +1 -1
- package/dist/managers/reversionManager.js +23 -2
- package/dist/managers/slashCommandManager.d.ts +3 -0
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +8 -3
- package/dist/managers/subagentManager.d.ts +8 -14
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +46 -112
- package/dist/managers/toolManager.d.ts +11 -0
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/managers/toolManager.js +20 -2
- package/dist/{constants/prompts.d.ts → prompts/index.d.ts} +17 -15
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +309 -0
- package/dist/services/aiService.d.ts +0 -1
- package/dist/services/aiService.d.ts.map +1 -1
- package/dist/services/aiService.js +4 -140
- package/dist/services/memory.d.ts +0 -3
- package/dist/services/memory.d.ts.map +1 -1
- package/dist/services/memory.js +0 -59
- package/dist/services/session.d.ts +15 -1
- package/dist/services/session.d.ts.map +1 -1
- package/dist/services/session.js +57 -1
- package/dist/services/taskManager.d.ts +25 -0
- package/dist/services/taskManager.d.ts.map +1 -0
- package/dist/services/taskManager.js +164 -0
- package/dist/tools/askUserQuestion.d.ts.map +1 -1
- package/dist/tools/askUserQuestion.js +39 -25
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +13 -11
- package/dist/tools/editTool.d.ts.map +1 -1
- package/dist/tools/editTool.js +2 -1
- package/dist/tools/exitPlanMode.d.ts.map +1 -1
- package/dist/tools/exitPlanMode.js +26 -2
- package/dist/tools/globTool.d.ts.map +1 -1
- package/dist/tools/globTool.js +8 -2
- package/dist/tools/grepTool.d.ts.map +1 -1
- package/dist/tools/grepTool.js +17 -6
- package/dist/tools/lsTool.d.ts.map +1 -1
- package/dist/tools/lsTool.js +3 -1
- package/dist/tools/readTool.d.ts.map +1 -1
- package/dist/tools/readTool.js +16 -1
- package/dist/tools/taskManagementTools.d.ts +6 -0
- package/dist/tools/taskManagementTools.d.ts.map +1 -0
- package/dist/tools/taskManagementTools.js +461 -0
- package/dist/tools/taskOutputTool.d.ts.map +1 -1
- package/dist/tools/taskOutputTool.js +32 -8
- package/dist/tools/taskStopTool.d.ts.map +1 -1
- package/dist/tools/taskStopTool.js +7 -1
- package/dist/tools/taskTool.d.ts.map +1 -1
- package/dist/tools/taskTool.js +37 -2
- package/dist/tools/types.d.ts +11 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/writeTool.d.ts.map +1 -1
- package/dist/tools/writeTool.js +9 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/messaging.d.ts +2 -18
- package/dist/types/messaging.d.ts.map +1 -1
- package/dist/types/processes.d.ts +16 -6
- package/dist/types/processes.d.ts.map +1 -1
- package/dist/types/tasks.d.ts +13 -0
- package/dist/types/tasks.d.ts.map +1 -0
- package/dist/types/tasks.js +1 -0
- package/dist/types/tools.d.ts +4 -1
- package/dist/types/tools.d.ts.map +1 -1
- package/dist/utils/builtinSubagents.d.ts.map +1 -1
- package/dist/utils/builtinSubagents.js +59 -44
- package/dist/utils/cacheControlUtils.d.ts.map +1 -1
- package/dist/utils/cacheControlUtils.js +18 -12
- package/dist/utils/constants.d.ts +0 -4
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +0 -4
- package/dist/utils/convertMessagesForAPI.js +2 -2
- package/dist/utils/editUtils.d.ts.map +1 -1
- package/dist/utils/editUtils.js +2 -2
- package/dist/utils/gitUtils.d.ts +7 -0
- package/dist/utils/gitUtils.d.ts.map +1 -0
- package/dist/utils/gitUtils.js +24 -0
- package/dist/utils/messageOperations.d.ts +3 -58
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +4 -146
- package/dist/utils/nameGenerator.d.ts +1 -1
- package/dist/utils/nameGenerator.d.ts.map +1 -1
- package/dist/utils/nameGenerator.js +19 -3
- package/package.json +1 -1
- package/src/agent.ts +86 -183
- package/src/constants/subagents.ts +4 -0
- package/src/constants/tools.ts +4 -1
- package/src/index.ts +1 -0
- package/src/managers/aiManager.ts +63 -70
- package/src/managers/backgroundTaskManager.ts +58 -54
- package/src/managers/foregroundTaskManager.ts +3 -2
- package/src/managers/mcpManager.ts +6 -3
- package/src/managers/messageManager.ts +126 -142
- package/src/managers/permissionManager.ts +32 -21
- package/src/managers/planManager.ts +2 -2
- package/src/managers/reversionManager.ts +26 -2
- package/src/managers/slashCommandManager.ts +12 -3
- package/src/managers/subagentManager.ts +60 -144
- package/src/managers/toolManager.ts +32 -2
- package/src/prompts/index.ts +366 -0
- package/src/services/aiService.ts +3 -145
- package/src/services/memory.ts +0 -72
- package/src/services/session.ts +73 -0
- package/src/services/taskManager.ts +195 -0
- package/src/tools/askUserQuestion.ts +51 -29
- package/src/tools/bashTool.ts +15 -17
- package/src/tools/editTool.ts +3 -1
- package/src/tools/exitPlanMode.ts +27 -3
- package/src/tools/globTool.ts +10 -2
- package/src/tools/grepTool.ts +17 -6
- package/src/tools/lsTool.ts +3 -1
- package/src/tools/readTool.ts +17 -1
- package/src/tools/taskManagementTools.ts +516 -0
- package/src/tools/taskOutputTool.ts +34 -12
- package/src/tools/taskStopTool.ts +7 -1
- package/src/tools/taskTool.ts +45 -1
- package/src/tools/types.ts +12 -0
- package/src/tools/writeTool.ts +9 -2
- package/src/types/index.ts +1 -0
- package/src/types/messaging.ts +1 -21
- package/src/types/processes.ts +18 -7
- package/src/types/tasks.ts +13 -0
- package/src/types/tools.ts +4 -1
- package/src/utils/builtinSubagents.ts +81 -45
- package/src/utils/cacheControlUtils.ts +26 -18
- package/src/utils/constants.ts +0 -5
- package/src/utils/convertMessagesForAPI.ts +2 -2
- package/src/utils/editUtils.ts +2 -6
- package/src/utils/gitUtils.ts +24 -0
- package/src/utils/messageOperations.ts +6 -229
- package/src/utils/nameGenerator.ts +20 -3
- package/dist/constants/prompts.d.ts.map +0 -1
- package/dist/constants/prompts.js +0 -118
- package/dist/tools/todoWriteTool.d.ts +0 -6
- package/dist/tools/todoWriteTool.d.ts.map +0 -1
- package/dist/tools/todoWriteTool.js +0 -220
- package/src/constants/prompts.ts +0 -155
- package/src/tools/todoWriteTool.ts +0 -257
|
@@ -8,20 +8,19 @@ import type {
|
|
|
8
8
|
ModelConfig,
|
|
9
9
|
Usage,
|
|
10
10
|
} from "../types/index.js";
|
|
11
|
-
import type { SessionData } from "../services/session.js";
|
|
12
11
|
import { AIManager } from "./aiManager.js";
|
|
13
12
|
import { MessageManager } from "./messageManager.js";
|
|
14
13
|
import { ToolManager } from "./toolManager.js";
|
|
15
14
|
import { HookManager } from "./hookManager.js";
|
|
16
|
-
import {
|
|
17
|
-
UserMessageParams,
|
|
18
|
-
type AgentToolBlockUpdateParams,
|
|
19
|
-
} from "../utils/messageOperations.js";
|
|
20
15
|
import {
|
|
21
16
|
addConsolidatedAbortListener,
|
|
22
17
|
createAbortPromise,
|
|
23
18
|
} from "../utils/abortUtils.js";
|
|
24
19
|
import { BackgroundTaskManager } from "./backgroundTaskManager.js";
|
|
20
|
+
import {
|
|
21
|
+
UserMessageParams,
|
|
22
|
+
type AgentToolBlockUpdateParams,
|
|
23
|
+
} from "../utils/messageOperations.js";
|
|
25
24
|
|
|
26
25
|
export interface SubagentManagerCallbacks {
|
|
27
26
|
// Granular subagent message callbacks (015-subagent-message-callbacks)
|
|
@@ -51,6 +50,11 @@ export interface SubagentManagerCallbacks {
|
|
|
51
50
|
) => void;
|
|
52
51
|
/** Triggered when subagent messages change */
|
|
53
52
|
onSubagentMessagesChange?: (subagentId: string, messages: Message[]) => void;
|
|
53
|
+
/** Triggered when subagent latest total tokens change */
|
|
54
|
+
onSubagentLatestTotalTokensChange?: (
|
|
55
|
+
subagentId: string,
|
|
56
|
+
tokens: number,
|
|
57
|
+
) => void;
|
|
54
58
|
}
|
|
55
59
|
|
|
56
60
|
export interface SubagentInstance {
|
|
@@ -61,14 +65,16 @@ export interface SubagentInstance {
|
|
|
61
65
|
toolManager: ToolManager;
|
|
62
66
|
status: "initializing" | "active" | "completed" | "error" | "aborted";
|
|
63
67
|
messages: Message[];
|
|
68
|
+
lastTools: string[]; // Track last two tool names
|
|
64
69
|
subagentType: string; // Store the subagent type for hook context
|
|
65
70
|
backgroundTaskId?: string; // ID of the background task if transitioned
|
|
71
|
+
onUpdate?: () => void; // Optional callback for real-time updates
|
|
66
72
|
}
|
|
67
73
|
|
|
68
74
|
export interface SubagentManagerOptions {
|
|
69
75
|
workdir: string;
|
|
70
76
|
parentToolManager: ToolManager;
|
|
71
|
-
|
|
77
|
+
taskManager: import("../services/taskManager.js").TaskManager;
|
|
72
78
|
callbacks?: SubagentManagerCallbacks; // Use SubagentManagerCallbacks instead of parentCallbacks
|
|
73
79
|
logger?: Logger;
|
|
74
80
|
getGatewayConfig: () => GatewayConfig;
|
|
@@ -87,7 +93,7 @@ export class SubagentManager {
|
|
|
87
93
|
|
|
88
94
|
private workdir: string;
|
|
89
95
|
private parentToolManager: ToolManager;
|
|
90
|
-
private
|
|
96
|
+
private taskManager: import("../services/taskManager.js").TaskManager;
|
|
91
97
|
private callbacks?: SubagentManagerCallbacks; // Use SubagentManagerCallbacks instead of parentCallbacks
|
|
92
98
|
private logger?: Logger;
|
|
93
99
|
private getGatewayConfig: () => GatewayConfig;
|
|
@@ -102,7 +108,7 @@ export class SubagentManager {
|
|
|
102
108
|
constructor(options: SubagentManagerOptions) {
|
|
103
109
|
this.workdir = options.workdir;
|
|
104
110
|
this.parentToolManager = options.parentToolManager;
|
|
105
|
-
this.
|
|
111
|
+
this.taskManager = options.taskManager;
|
|
106
112
|
this.callbacks = options.callbacks; // Store SubagentManagerCallbacks
|
|
107
113
|
this.logger = options.logger;
|
|
108
114
|
this.getGatewayConfig = options.getGatewayConfig;
|
|
@@ -168,6 +174,7 @@ export class SubagentManager {
|
|
|
168
174
|
subagent_type: string;
|
|
169
175
|
},
|
|
170
176
|
runInBackground?: boolean,
|
|
177
|
+
onUpdate?: () => void,
|
|
171
178
|
): Promise<SubagentInstance> {
|
|
172
179
|
if (!this.parentToolManager) {
|
|
173
180
|
throw new Error(
|
|
@@ -196,6 +203,7 @@ export class SubagentManager {
|
|
|
196
203
|
const aiManager = new AIManager({
|
|
197
204
|
messageManager,
|
|
198
205
|
toolManager,
|
|
206
|
+
taskManager: this.taskManager,
|
|
199
207
|
logger: this.logger,
|
|
200
208
|
workdir: this.workdir,
|
|
201
209
|
systemPrompt: configuration.systemPrompt,
|
|
@@ -239,22 +247,13 @@ export class SubagentManager {
|
|
|
239
247
|
toolManager,
|
|
240
248
|
status: "initializing",
|
|
241
249
|
messages: [],
|
|
250
|
+
lastTools: [], // Initialize lastTools
|
|
242
251
|
subagentType: parameters.subagent_type, // Store the subagent type
|
|
252
|
+
onUpdate,
|
|
243
253
|
};
|
|
244
254
|
|
|
245
255
|
this.instances.set(subagentId, instance);
|
|
246
256
|
|
|
247
|
-
// Create subagent block in parent message manager
|
|
248
|
-
this.parentMessageManager.addSubagentBlock(
|
|
249
|
-
subagentId,
|
|
250
|
-
configuration.name,
|
|
251
|
-
messageManager.getSessionId(),
|
|
252
|
-
configuration,
|
|
253
|
-
"active",
|
|
254
|
-
parameters,
|
|
255
|
-
runInBackground,
|
|
256
|
-
);
|
|
257
|
-
|
|
258
257
|
return instance;
|
|
259
258
|
}
|
|
260
259
|
|
|
@@ -278,9 +277,6 @@ export class SubagentManager {
|
|
|
278
277
|
|
|
279
278
|
// Set status to active and update parent
|
|
280
279
|
this.updateInstanceStatus(instance.subagentId, "active");
|
|
281
|
-
this.parentMessageManager.updateSubagentBlock(instance.subagentId, {
|
|
282
|
-
status: "active",
|
|
283
|
-
});
|
|
284
280
|
|
|
285
281
|
if (runInBackground && this.backgroundTaskManager) {
|
|
286
282
|
const taskId = this.backgroundTaskManager.generateId();
|
|
@@ -294,6 +290,11 @@ export class SubagentManager {
|
|
|
294
290
|
description: instance.configuration.description,
|
|
295
291
|
stdout: "",
|
|
296
292
|
stderr: "",
|
|
293
|
+
subagentId: instance.subagentId,
|
|
294
|
+
onStop: () => {
|
|
295
|
+
instance.aiManager.abortAIMessage();
|
|
296
|
+
this.cleanupInstance(instance.subagentId);
|
|
297
|
+
},
|
|
297
298
|
});
|
|
298
299
|
|
|
299
300
|
instance.backgroundTaskId = taskId;
|
|
@@ -331,9 +332,6 @@ export class SubagentManager {
|
|
|
331
332
|
return await this.internalExecute(instance, prompt, abortSignal);
|
|
332
333
|
} catch (error) {
|
|
333
334
|
this.updateInstanceStatus(instance.subagentId, "error");
|
|
334
|
-
this.parentMessageManager.updateSubagentBlock(instance.subagentId, {
|
|
335
|
-
status: "error",
|
|
336
|
-
});
|
|
337
335
|
throw error;
|
|
338
336
|
}
|
|
339
337
|
}
|
|
@@ -359,15 +357,15 @@ export class SubagentManager {
|
|
|
359
357
|
description: instance.configuration.description,
|
|
360
358
|
stdout: "",
|
|
361
359
|
stderr: "",
|
|
360
|
+
subagentId: instance.subagentId,
|
|
361
|
+
onStop: () => {
|
|
362
|
+
instance.aiManager.abortAIMessage();
|
|
363
|
+
this.cleanupInstance(instance.subagentId);
|
|
364
|
+
},
|
|
362
365
|
});
|
|
363
366
|
|
|
364
367
|
instance.backgroundTaskId = taskId;
|
|
365
368
|
|
|
366
|
-
// Update parent message manager to reflect background status
|
|
367
|
-
this.parentMessageManager.updateSubagentBlock(subagentId, {
|
|
368
|
-
runInBackground: true,
|
|
369
|
-
});
|
|
370
|
-
|
|
371
369
|
return taskId;
|
|
372
370
|
}
|
|
373
371
|
|
|
@@ -378,24 +376,18 @@ export class SubagentManager {
|
|
|
378
376
|
): Promise<string> {
|
|
379
377
|
// Set up consolidated abort handler to prevent listener accumulation
|
|
380
378
|
let abortCleanup: (() => void) | undefined;
|
|
381
|
-
if
|
|
379
|
+
// Only link to parent abort signal if NOT running in background
|
|
380
|
+
if (abortSignal && !instance.backgroundTaskId) {
|
|
382
381
|
abortCleanup = addConsolidatedAbortListener(abortSignal, [
|
|
383
382
|
() => {
|
|
384
383
|
// Update status to aborted
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
this.parentMessageManager.updateSubagentBlock(instance.subagentId, {
|
|
389
|
-
status: "aborted",
|
|
390
|
-
});
|
|
391
|
-
}
|
|
384
|
+
this.updateInstanceStatus(instance.subagentId, "aborted");
|
|
385
|
+
// Cleanup instance immediately on abort
|
|
386
|
+
this.cleanupInstance(instance.subagentId);
|
|
392
387
|
},
|
|
393
388
|
() => {
|
|
394
389
|
// Abort the AI execution
|
|
395
|
-
|
|
396
|
-
if (!instance.backgroundTaskId) {
|
|
397
|
-
instance.aiManager.abortAIMessage();
|
|
398
|
-
}
|
|
390
|
+
instance.aiManager.abortAIMessage();
|
|
399
391
|
},
|
|
400
392
|
]);
|
|
401
393
|
}
|
|
@@ -441,8 +433,6 @@ export class SubagentManager {
|
|
|
441
433
|
});
|
|
442
434
|
|
|
443
435
|
// If we have an abort signal, race against it using utilities to prevent listener accumulation
|
|
444
|
-
// BUT: If this is a background task, we DON'T want to race against the abort signal
|
|
445
|
-
// because the abort signal (Esc) should only stop the tool watching the task, not the task itself.
|
|
446
436
|
if (abortSignal && !instance.backgroundTaskId) {
|
|
447
437
|
await Promise.race([
|
|
448
438
|
executeAI,
|
|
@@ -470,9 +460,6 @@ export class SubagentManager {
|
|
|
470
460
|
|
|
471
461
|
// Update status to completed and update parent
|
|
472
462
|
this.updateInstanceStatus(instance.subagentId, "completed");
|
|
473
|
-
this.parentMessageManager.updateSubagentBlock(instance.subagentId, {
|
|
474
|
-
status: "completed",
|
|
475
|
-
});
|
|
476
463
|
|
|
477
464
|
// If this was transitioned to background, update the background task
|
|
478
465
|
if (instance.backgroundTaskId && this.backgroundTaskManager) {
|
|
@@ -576,98 +563,6 @@ export class SubagentManager {
|
|
|
576
563
|
this.instances.clear();
|
|
577
564
|
}
|
|
578
565
|
|
|
579
|
-
/**
|
|
580
|
-
* Restore subagent instances from saved session data
|
|
581
|
-
* This method is called during agent initialization to restore previous subagent states
|
|
582
|
-
*/
|
|
583
|
-
async restoreSubagentSessions(
|
|
584
|
-
subagentSessions: Array<{
|
|
585
|
-
sessionData: SessionData;
|
|
586
|
-
subagentId: string;
|
|
587
|
-
configuration: SubagentConfiguration;
|
|
588
|
-
}>,
|
|
589
|
-
): Promise<void> {
|
|
590
|
-
for (const { sessionData, subagentId, configuration } of subagentSessions) {
|
|
591
|
-
try {
|
|
592
|
-
// Use the configuration from the SubagentBlock
|
|
593
|
-
|
|
594
|
-
// Create the subagent instance without executing - just restore the state
|
|
595
|
-
|
|
596
|
-
// Create MessageManager for the restored subagent
|
|
597
|
-
const subagentCallbacks = this.createSubagentCallbacks(subagentId);
|
|
598
|
-
const messageManager = new MessageManager({
|
|
599
|
-
callbacks: subagentCallbacks,
|
|
600
|
-
workdir: this.workdir,
|
|
601
|
-
logger: this.logger,
|
|
602
|
-
sessionType: "subagent",
|
|
603
|
-
subagentType: configuration.name, // Use configuration name for restored sessions
|
|
604
|
-
memoryRuleManager: this.memoryRuleManager,
|
|
605
|
-
});
|
|
606
|
-
|
|
607
|
-
// Use the parent tool manager
|
|
608
|
-
const toolManager = this.parentToolManager;
|
|
609
|
-
|
|
610
|
-
// Determine model to use
|
|
611
|
-
let modelToUse: string;
|
|
612
|
-
const parentModelConfig = this.getModelConfig();
|
|
613
|
-
|
|
614
|
-
if (!configuration.model || configuration.model === "inherit") {
|
|
615
|
-
modelToUse = parentModelConfig.agentModel;
|
|
616
|
-
} else if (configuration.model === "fastModel") {
|
|
617
|
-
modelToUse = parentModelConfig.fastModel;
|
|
618
|
-
} else {
|
|
619
|
-
modelToUse = configuration.model;
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
// Create AIManager for the restored subagent
|
|
623
|
-
const aiManager = new AIManager({
|
|
624
|
-
messageManager,
|
|
625
|
-
toolManager,
|
|
626
|
-
logger: this.logger,
|
|
627
|
-
workdir: this.workdir,
|
|
628
|
-
systemPrompt: configuration.systemPrompt,
|
|
629
|
-
subagentType: configuration.name, // Use configuration name as subagent type for restored instances
|
|
630
|
-
hookManager: this.hookManager,
|
|
631
|
-
permissionManager: this.parentToolManager.getPermissionManager(),
|
|
632
|
-
getGatewayConfig: this.getGatewayConfig,
|
|
633
|
-
getModelConfig: () => ({
|
|
634
|
-
...parentModelConfig,
|
|
635
|
-
agentModel: modelToUse,
|
|
636
|
-
}),
|
|
637
|
-
getMaxInputTokens: this.getMaxInputTokens,
|
|
638
|
-
getLanguage: this.getLanguage,
|
|
639
|
-
callbacks: {
|
|
640
|
-
onUsageAdded: this.onUsageAdded,
|
|
641
|
-
},
|
|
642
|
-
});
|
|
643
|
-
|
|
644
|
-
// Create restored instance
|
|
645
|
-
const instance: SubagentInstance = {
|
|
646
|
-
subagentId,
|
|
647
|
-
configuration,
|
|
648
|
-
aiManager,
|
|
649
|
-
messageManager,
|
|
650
|
-
toolManager,
|
|
651
|
-
status: "completed", // Restored sessions are considered completed
|
|
652
|
-
messages: sessionData.messages,
|
|
653
|
-
subagentType: configuration.name, // Use configuration name as subagent type for restored instances
|
|
654
|
-
};
|
|
655
|
-
|
|
656
|
-
// IMPORTANT: Store instance in map BEFORE calling setMessages
|
|
657
|
-
// This ensures the callback can find the instance
|
|
658
|
-
this.instances.set(subagentId, instance);
|
|
659
|
-
|
|
660
|
-
messageManager.initializeFromSession(sessionData);
|
|
661
|
-
} catch (error) {
|
|
662
|
-
this.logger?.warn(
|
|
663
|
-
`Failed to restore subagent session ${subagentId}:`,
|
|
664
|
-
error,
|
|
665
|
-
);
|
|
666
|
-
// Continue with other sessions even if one fails
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
|
|
671
566
|
/**
|
|
672
567
|
* Create subagent callbacks for a specific subagent ID
|
|
673
568
|
* Extracted to reuse in both create and restore flows
|
|
@@ -710,6 +605,20 @@ export class SubagentManager {
|
|
|
710
605
|
},
|
|
711
606
|
|
|
712
607
|
onToolBlockUpdated: (params: AgentToolBlockUpdateParams) => {
|
|
608
|
+
// Track last two tool names when a tool starts running
|
|
609
|
+
if (params.stage === "running" && params.name) {
|
|
610
|
+
const instance = this.instances.get(subagentId);
|
|
611
|
+
if (instance) {
|
|
612
|
+
// Add to lastTools if it's different from the last one or we want to show duplicates
|
|
613
|
+
// Based on "ToolA, ToolB" requirement, we'll just keep the last two
|
|
614
|
+
instance.lastTools.push(params.name);
|
|
615
|
+
if (instance.lastTools.length > 2) {
|
|
616
|
+
instance.lastTools.shift();
|
|
617
|
+
}
|
|
618
|
+
instance.onUpdate?.();
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
|
|
713
622
|
// Forward tool block updates to parent via SubagentManager callbacks
|
|
714
623
|
if (this.callbacks?.onSubagentToolBlockUpdated) {
|
|
715
624
|
this.callbacks.onSubagentToolBlockUpdated(subagentId, params);
|
|
@@ -721,6 +630,8 @@ export class SubagentManager {
|
|
|
721
630
|
const instance = this.instances.get(subagentId);
|
|
722
631
|
if (instance) {
|
|
723
632
|
instance.messages = messages;
|
|
633
|
+
// Trigger the onUpdate callback if provided
|
|
634
|
+
instance.onUpdate?.();
|
|
724
635
|
// Forward subagent message changes to parent via callbacks
|
|
725
636
|
if (this.callbacks?.onSubagentMessagesChange) {
|
|
726
637
|
this.callbacks.onSubagentMessagesChange(subagentId, messages);
|
|
@@ -728,11 +639,16 @@ export class SubagentManager {
|
|
|
728
639
|
}
|
|
729
640
|
},
|
|
730
641
|
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
642
|
+
onLatestTotalTokensChange: (tokens: number) => {
|
|
643
|
+
const instance = this.instances.get(subagentId);
|
|
644
|
+
if (instance) {
|
|
645
|
+
// Trigger the onUpdate callback if provided
|
|
646
|
+
instance.onUpdate?.();
|
|
647
|
+
}
|
|
648
|
+
// Forward latest total tokens to parent via SubagentManager callbacks
|
|
649
|
+
if (this.callbacks?.onSubagentLatestTotalTokensChange) {
|
|
650
|
+
this.callbacks.onSubagentLatestTotalTokensChange(subagentId, tokens);
|
|
651
|
+
}
|
|
736
652
|
},
|
|
737
653
|
};
|
|
738
654
|
}
|
|
@@ -13,10 +13,15 @@ import { globTool } from "../tools/globTool.js";
|
|
|
13
13
|
import { grepTool } from "../tools/grepTool.js";
|
|
14
14
|
import { lsTool } from "../tools/lsTool.js";
|
|
15
15
|
import { readTool } from "../tools/readTool.js";
|
|
16
|
-
import { todoWriteTool } from "../tools/todoWriteTool.js";
|
|
17
16
|
import { lspTool } from "../tools/lspTool.js";
|
|
18
17
|
import { createTaskTool } from "../tools/taskTool.js";
|
|
19
18
|
import { createSkillTool } from "../tools/skillTool.js";
|
|
19
|
+
import {
|
|
20
|
+
taskCreateTool,
|
|
21
|
+
taskGetTool,
|
|
22
|
+
taskUpdateTool,
|
|
23
|
+
taskListTool,
|
|
24
|
+
} from "../tools/taskManagementTools.js";
|
|
20
25
|
import { McpManager } from "./mcpManager.js";
|
|
21
26
|
import { PermissionManager } from "./permissionManager.js";
|
|
22
27
|
import { ChatCompletionFunctionTool } from "openai/resources.js";
|
|
@@ -39,6 +44,8 @@ export interface ToolManagerOptions {
|
|
|
39
44
|
permissionManager?: PermissionManager;
|
|
40
45
|
/** Foreground task manager for backgrounding tasks */
|
|
41
46
|
foregroundTaskManager?: import("../types/processes.js").IForegroundTaskManager;
|
|
47
|
+
/** Task manager for task management */
|
|
48
|
+
taskManager?: import("../services/taskManager.js").TaskManager;
|
|
42
49
|
/** Reversion manager for file snapshots */
|
|
43
50
|
reversionManager?: ReversionManager;
|
|
44
51
|
/** Background task manager for background execution */
|
|
@@ -63,6 +70,7 @@ class ToolManager {
|
|
|
63
70
|
private permissionManager?: PermissionManager;
|
|
64
71
|
private foregroundTaskManager?: import("../types/processes.js").IForegroundTaskManager;
|
|
65
72
|
private reversionManager?: ReversionManager;
|
|
73
|
+
private taskManager?: import("../services/taskManager.js").TaskManager;
|
|
66
74
|
private backgroundTaskManager?: import("./backgroundTaskManager.js").BackgroundTaskManager;
|
|
67
75
|
private permissionMode?: PermissionMode;
|
|
68
76
|
private canUseToolCallback?: PermissionCallback;
|
|
@@ -72,6 +80,7 @@ class ToolManager {
|
|
|
72
80
|
this.lspManager = options.lspManager;
|
|
73
81
|
this.logger = options.logger;
|
|
74
82
|
this.permissionManager = options.permissionManager;
|
|
83
|
+
this.taskManager = options.taskManager;
|
|
75
84
|
this.foregroundTaskManager = options.foregroundTaskManager;
|
|
76
85
|
this.reversionManager = options.reversionManager;
|
|
77
86
|
this.backgroundTaskManager = options.backgroundTaskManager;
|
|
@@ -128,8 +137,11 @@ class ToolManager {
|
|
|
128
137
|
grepTool,
|
|
129
138
|
lsTool,
|
|
130
139
|
readTool,
|
|
131
|
-
todoWriteTool,
|
|
132
140
|
lspTool,
|
|
141
|
+
taskCreateTool,
|
|
142
|
+
taskGetTool,
|
|
143
|
+
taskUpdateTool,
|
|
144
|
+
taskListTool,
|
|
133
145
|
];
|
|
134
146
|
|
|
135
147
|
for (const tool of builtInTools) {
|
|
@@ -177,11 +189,13 @@ class ToolManager {
|
|
|
177
189
|
permissionMode: effectivePermissionMode,
|
|
178
190
|
canUseToolCallback: this.canUseToolCallback,
|
|
179
191
|
permissionManager: this.permissionManager,
|
|
192
|
+
taskManager: this.taskManager!,
|
|
180
193
|
reversionManager: this.reversionManager,
|
|
181
194
|
backgroundTaskManager: this.backgroundTaskManager,
|
|
182
195
|
foregroundTaskManager: this.foregroundTaskManager,
|
|
183
196
|
mcpManager: this.mcpManager,
|
|
184
197
|
lspManager: this.lspManager,
|
|
198
|
+
sessionId: context.sessionId,
|
|
185
199
|
};
|
|
186
200
|
|
|
187
201
|
this.logger?.debug("Executing tool with enhanced context", {
|
|
@@ -252,6 +266,13 @@ class ToolManager {
|
|
|
252
266
|
return [...builtInToolsConfig, ...mcpToolsConfig];
|
|
253
267
|
}
|
|
254
268
|
|
|
269
|
+
/**
|
|
270
|
+
* Get the list of registered tool plugins
|
|
271
|
+
*/
|
|
272
|
+
public getTools(): ToolPlugin[] {
|
|
273
|
+
return Array.from(this.tools.values());
|
|
274
|
+
}
|
|
275
|
+
|
|
255
276
|
/**
|
|
256
277
|
* Get the current permission mode
|
|
257
278
|
*/
|
|
@@ -278,6 +299,15 @@ class ToolManager {
|
|
|
278
299
|
public getPermissionManager(): PermissionManager | undefined {
|
|
279
300
|
return this.permissionManager;
|
|
280
301
|
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Get the task manager
|
|
305
|
+
*/
|
|
306
|
+
public getTaskManager():
|
|
307
|
+
| import("../services/taskManager.js").TaskManager
|
|
308
|
+
| undefined {
|
|
309
|
+
return this.taskManager;
|
|
310
|
+
}
|
|
281
311
|
}
|
|
282
312
|
|
|
283
313
|
// Export tool registry class and types
|