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.
Files changed (169) hide show
  1. package/dist/agent.d.ts +14 -11
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +64 -151
  4. package/dist/constants/subagents.d.ts +5 -0
  5. package/dist/constants/subagents.d.ts.map +1 -0
  6. package/dist/constants/subagents.js +4 -0
  7. package/dist/constants/tools.d.ts +4 -1
  8. package/dist/constants/tools.d.ts.map +1 -1
  9. package/dist/constants/tools.js +4 -1
  10. package/dist/index.d.ts +1 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +1 -0
  13. package/dist/managers/aiManager.d.ts +2 -5
  14. package/dist/managers/aiManager.d.ts.map +1 -1
  15. package/dist/managers/aiManager.js +43 -48
  16. package/dist/managers/backgroundTaskManager.d.ts.map +1 -1
  17. package/dist/managers/backgroundTaskManager.js +63 -53
  18. package/dist/managers/foregroundTaskManager.d.ts.map +1 -1
  19. package/dist/managers/foregroundTaskManager.js +3 -2
  20. package/dist/managers/mcpManager.d.ts.map +1 -1
  21. package/dist/managers/messageManager.d.ts +13 -27
  22. package/dist/managers/messageManager.d.ts.map +1 -1
  23. package/dist/managers/messageManager.js +94 -89
  24. package/dist/managers/permissionManager.d.ts.map +1 -1
  25. package/dist/managers/permissionManager.js +25 -15
  26. package/dist/managers/planManager.d.ts +1 -1
  27. package/dist/managers/planManager.d.ts.map +1 -1
  28. package/dist/managers/planManager.js +2 -2
  29. package/dist/managers/reversionManager.d.ts.map +1 -1
  30. package/dist/managers/reversionManager.js +23 -2
  31. package/dist/managers/slashCommandManager.d.ts +3 -0
  32. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  33. package/dist/managers/slashCommandManager.js +8 -3
  34. package/dist/managers/subagentManager.d.ts +8 -14
  35. package/dist/managers/subagentManager.d.ts.map +1 -1
  36. package/dist/managers/subagentManager.js +46 -112
  37. package/dist/managers/toolManager.d.ts +11 -0
  38. package/dist/managers/toolManager.d.ts.map +1 -1
  39. package/dist/managers/toolManager.js +20 -2
  40. package/dist/{constants/prompts.d.ts → prompts/index.d.ts} +17 -15
  41. package/dist/prompts/index.d.ts.map +1 -0
  42. package/dist/prompts/index.js +309 -0
  43. package/dist/services/aiService.d.ts +0 -1
  44. package/dist/services/aiService.d.ts.map +1 -1
  45. package/dist/services/aiService.js +4 -140
  46. package/dist/services/memory.d.ts +0 -3
  47. package/dist/services/memory.d.ts.map +1 -1
  48. package/dist/services/memory.js +0 -59
  49. package/dist/services/session.d.ts +15 -1
  50. package/dist/services/session.d.ts.map +1 -1
  51. package/dist/services/session.js +57 -1
  52. package/dist/services/taskManager.d.ts +25 -0
  53. package/dist/services/taskManager.d.ts.map +1 -0
  54. package/dist/services/taskManager.js +164 -0
  55. package/dist/tools/askUserQuestion.d.ts.map +1 -1
  56. package/dist/tools/askUserQuestion.js +39 -25
  57. package/dist/tools/bashTool.d.ts.map +1 -1
  58. package/dist/tools/bashTool.js +13 -11
  59. package/dist/tools/editTool.d.ts.map +1 -1
  60. package/dist/tools/editTool.js +2 -1
  61. package/dist/tools/exitPlanMode.d.ts.map +1 -1
  62. package/dist/tools/exitPlanMode.js +26 -2
  63. package/dist/tools/globTool.d.ts.map +1 -1
  64. package/dist/tools/globTool.js +8 -2
  65. package/dist/tools/grepTool.d.ts.map +1 -1
  66. package/dist/tools/grepTool.js +17 -6
  67. package/dist/tools/lsTool.d.ts.map +1 -1
  68. package/dist/tools/lsTool.js +3 -1
  69. package/dist/tools/readTool.d.ts.map +1 -1
  70. package/dist/tools/readTool.js +16 -1
  71. package/dist/tools/taskManagementTools.d.ts +6 -0
  72. package/dist/tools/taskManagementTools.d.ts.map +1 -0
  73. package/dist/tools/taskManagementTools.js +461 -0
  74. package/dist/tools/taskOutputTool.d.ts.map +1 -1
  75. package/dist/tools/taskOutputTool.js +32 -8
  76. package/dist/tools/taskStopTool.d.ts.map +1 -1
  77. package/dist/tools/taskStopTool.js +7 -1
  78. package/dist/tools/taskTool.d.ts.map +1 -1
  79. package/dist/tools/taskTool.js +37 -2
  80. package/dist/tools/types.d.ts +11 -0
  81. package/dist/tools/types.d.ts.map +1 -1
  82. package/dist/tools/writeTool.d.ts.map +1 -1
  83. package/dist/tools/writeTool.js +9 -1
  84. package/dist/types/index.d.ts +1 -0
  85. package/dist/types/index.d.ts.map +1 -1
  86. package/dist/types/index.js +1 -0
  87. package/dist/types/messaging.d.ts +2 -18
  88. package/dist/types/messaging.d.ts.map +1 -1
  89. package/dist/types/processes.d.ts +16 -6
  90. package/dist/types/processes.d.ts.map +1 -1
  91. package/dist/types/tasks.d.ts +13 -0
  92. package/dist/types/tasks.d.ts.map +1 -0
  93. package/dist/types/tasks.js +1 -0
  94. package/dist/types/tools.d.ts +4 -1
  95. package/dist/types/tools.d.ts.map +1 -1
  96. package/dist/utils/builtinSubagents.d.ts.map +1 -1
  97. package/dist/utils/builtinSubagents.js +59 -44
  98. package/dist/utils/cacheControlUtils.d.ts.map +1 -1
  99. package/dist/utils/cacheControlUtils.js +18 -12
  100. package/dist/utils/constants.d.ts +0 -4
  101. package/dist/utils/constants.d.ts.map +1 -1
  102. package/dist/utils/constants.js +0 -4
  103. package/dist/utils/convertMessagesForAPI.js +2 -2
  104. package/dist/utils/editUtils.d.ts.map +1 -1
  105. package/dist/utils/editUtils.js +2 -2
  106. package/dist/utils/gitUtils.d.ts +7 -0
  107. package/dist/utils/gitUtils.d.ts.map +1 -0
  108. package/dist/utils/gitUtils.js +24 -0
  109. package/dist/utils/messageOperations.d.ts +3 -58
  110. package/dist/utils/messageOperations.d.ts.map +1 -1
  111. package/dist/utils/messageOperations.js +4 -146
  112. package/dist/utils/nameGenerator.d.ts +1 -1
  113. package/dist/utils/nameGenerator.d.ts.map +1 -1
  114. package/dist/utils/nameGenerator.js +19 -3
  115. package/package.json +1 -1
  116. package/src/agent.ts +86 -183
  117. package/src/constants/subagents.ts +4 -0
  118. package/src/constants/tools.ts +4 -1
  119. package/src/index.ts +1 -0
  120. package/src/managers/aiManager.ts +63 -70
  121. package/src/managers/backgroundTaskManager.ts +58 -54
  122. package/src/managers/foregroundTaskManager.ts +3 -2
  123. package/src/managers/mcpManager.ts +6 -3
  124. package/src/managers/messageManager.ts +126 -142
  125. package/src/managers/permissionManager.ts +32 -21
  126. package/src/managers/planManager.ts +2 -2
  127. package/src/managers/reversionManager.ts +26 -2
  128. package/src/managers/slashCommandManager.ts +12 -3
  129. package/src/managers/subagentManager.ts +60 -144
  130. package/src/managers/toolManager.ts +32 -2
  131. package/src/prompts/index.ts +366 -0
  132. package/src/services/aiService.ts +3 -145
  133. package/src/services/memory.ts +0 -72
  134. package/src/services/session.ts +73 -0
  135. package/src/services/taskManager.ts +195 -0
  136. package/src/tools/askUserQuestion.ts +51 -29
  137. package/src/tools/bashTool.ts +15 -17
  138. package/src/tools/editTool.ts +3 -1
  139. package/src/tools/exitPlanMode.ts +27 -3
  140. package/src/tools/globTool.ts +10 -2
  141. package/src/tools/grepTool.ts +17 -6
  142. package/src/tools/lsTool.ts +3 -1
  143. package/src/tools/readTool.ts +17 -1
  144. package/src/tools/taskManagementTools.ts +516 -0
  145. package/src/tools/taskOutputTool.ts +34 -12
  146. package/src/tools/taskStopTool.ts +7 -1
  147. package/src/tools/taskTool.ts +45 -1
  148. package/src/tools/types.ts +12 -0
  149. package/src/tools/writeTool.ts +9 -2
  150. package/src/types/index.ts +1 -0
  151. package/src/types/messaging.ts +1 -21
  152. package/src/types/processes.ts +18 -7
  153. package/src/types/tasks.ts +13 -0
  154. package/src/types/tools.ts +4 -1
  155. package/src/utils/builtinSubagents.ts +81 -45
  156. package/src/utils/cacheControlUtils.ts +26 -18
  157. package/src/utils/constants.ts +0 -5
  158. package/src/utils/convertMessagesForAPI.ts +2 -2
  159. package/src/utils/editUtils.ts +2 -6
  160. package/src/utils/gitUtils.ts +24 -0
  161. package/src/utils/messageOperations.ts +6 -229
  162. package/src/utils/nameGenerator.ts +20 -3
  163. package/dist/constants/prompts.d.ts.map +0 -1
  164. package/dist/constants/prompts.js +0 -118
  165. package/dist/tools/todoWriteTool.d.ts +0 -6
  166. package/dist/tools/todoWriteTool.d.ts.map +0 -1
  167. package/dist/tools/todoWriteTool.js +0 -220
  168. package/src/constants/prompts.ts +0 -155
  169. 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
- parentMessageManager: MessageManager;
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 parentMessageManager: MessageManager;
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.parentMessageManager = options.parentMessageManager;
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 (abortSignal) {
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
- // Only update status if it's NOT a background task
386
- if (!instance.backgroundTaskId) {
387
- this.updateInstanceStatus(instance.subagentId, "aborted");
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
- // Only abort if it's NOT a background task
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
- onSessionIdChange: (newSessionId: string) => {
732
- // Update the subagent block with the new session ID
733
- this.parentMessageManager.updateSubagentBlock(subagentId, {
734
- sessionId: newSessionId,
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