wave-agent-sdk 0.6.4 → 0.7.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.
Files changed (174) hide show
  1. package/dist/agent.d.ts +8 -0
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +49 -240
  4. package/dist/constants/tools.d.ts +0 -2
  5. package/dist/constants/tools.d.ts.map +1 -1
  6. package/dist/constants/tools.js +0 -2
  7. package/dist/core/plugin.d.ts +86 -0
  8. package/dist/core/plugin.d.ts.map +1 -0
  9. package/dist/core/plugin.js +164 -0
  10. package/dist/index.d.ts +1 -4
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +1 -5
  13. package/dist/managers/MemoryRuleManager.d.ts +3 -1
  14. package/dist/managers/MemoryRuleManager.d.ts.map +1 -1
  15. package/dist/managers/MemoryRuleManager.js +2 -1
  16. package/dist/managers/aiManager.d.ts +13 -23
  17. package/dist/managers/aiManager.d.ts.map +1 -1
  18. package/dist/managers/aiManager.js +59 -32
  19. package/dist/managers/backgroundTaskManager.d.ts +3 -1
  20. package/dist/managers/backgroundTaskManager.d.ts.map +1 -1
  21. package/dist/managers/backgroundTaskManager.js +2 -1
  22. package/dist/managers/bashManager.d.ts +4 -4
  23. package/dist/managers/bashManager.d.ts.map +1 -1
  24. package/dist/managers/bashManager.js +5 -2
  25. package/dist/managers/foregroundTaskManager.d.ts +3 -0
  26. package/dist/managers/foregroundTaskManager.d.ts.map +1 -1
  27. package/dist/managers/foregroundTaskManager.js +2 -1
  28. package/dist/managers/hookManager.d.ts +3 -3
  29. package/dist/managers/hookManager.d.ts.map +1 -1
  30. package/dist/managers/hookManager.js +20 -19
  31. package/dist/managers/liveConfigManager.d.ts +6 -13
  32. package/dist/managers/liveConfigManager.d.ts.map +1 -1
  33. package/dist/managers/liveConfigManager.js +50 -45
  34. package/dist/managers/lspManager.d.ts +4 -5
  35. package/dist/managers/lspManager.d.ts.map +1 -1
  36. package/dist/managers/lspManager.js +13 -12
  37. package/dist/managers/mcpManager.d.ts +3 -2
  38. package/dist/managers/mcpManager.d.ts.map +1 -1
  39. package/dist/managers/mcpManager.js +16 -15
  40. package/dist/managers/messageManager.d.ts +5 -7
  41. package/dist/managers/messageManager.d.ts.map +1 -1
  42. package/dist/managers/messageManager.js +12 -7
  43. package/dist/managers/permissionManager.d.ts +6 -4
  44. package/dist/managers/permissionManager.d.ts.map +1 -1
  45. package/dist/managers/permissionManager.js +39 -63
  46. package/dist/managers/planManager.d.ts +4 -6
  47. package/dist/managers/planManager.d.ts.map +1 -1
  48. package/dist/managers/planManager.js +18 -4
  49. package/dist/managers/pluginManager.d.ts +10 -22
  50. package/dist/managers/pluginManager.d.ts.map +1 -1
  51. package/dist/managers/pluginManager.js +27 -14
  52. package/dist/managers/reversionManager.d.ts +4 -3
  53. package/dist/managers/reversionManager.d.ts.map +1 -1
  54. package/dist/managers/reversionManager.js +5 -2
  55. package/dist/managers/skillManager.d.ts +3 -2
  56. package/dist/managers/skillManager.d.ts.map +1 -1
  57. package/dist/managers/skillManager.js +15 -14
  58. package/dist/managers/slashCommandManager.d.ts +9 -16
  59. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  60. package/dist/managers/slashCommandManager.js +21 -10
  61. package/dist/managers/subagentManager.d.ts +7 -17
  62. package/dist/managers/subagentManager.d.ts.map +1 -1
  63. package/dist/managers/subagentManager.js +41 -34
  64. package/dist/managers/toolManager.d.ts +15 -38
  65. package/dist/managers/toolManager.d.ts.map +1 -1
  66. package/dist/managers/toolManager.js +66 -56
  67. package/dist/prompts/index.d.ts +6 -3
  68. package/dist/prompts/index.d.ts.map +1 -1
  69. package/dist/prompts/index.js +8 -16
  70. package/dist/services/MarketplaceService.d.ts.map +1 -1
  71. package/dist/services/MarketplaceService.js +13 -0
  72. package/dist/services/aiService.d.ts +4 -0
  73. package/dist/services/aiService.d.ts.map +1 -1
  74. package/dist/services/aiService.js +47 -7
  75. package/dist/services/configurationService.d.ts.map +1 -1
  76. package/dist/services/configurationService.js +30 -11
  77. package/dist/services/taskManager.d.ts +3 -1
  78. package/dist/services/taskManager.d.ts.map +1 -1
  79. package/dist/services/taskManager.js +2 -1
  80. package/dist/tools/bashTool.js +2 -2
  81. package/dist/tools/editTool.d.ts.map +1 -1
  82. package/dist/tools/editTool.js +9 -1
  83. package/dist/tools/readTool.d.ts.map +1 -1
  84. package/dist/tools/readTool.js +2 -2
  85. package/dist/tools/skillTool.d.ts +2 -4
  86. package/dist/tools/skillTool.d.ts.map +1 -1
  87. package/dist/tools/skillTool.js +61 -61
  88. package/dist/tools/taskOutputTool.js +1 -1
  89. package/dist/tools/taskTool.d.ts +2 -4
  90. package/dist/tools/taskTool.d.ts.map +1 -1
  91. package/dist/tools/taskTool.js +192 -187
  92. package/dist/tools/types.d.ts +11 -1
  93. package/dist/tools/types.d.ts.map +1 -1
  94. package/dist/tools/writeTool.d.ts.map +1 -1
  95. package/dist/tools/writeTool.js +4 -2
  96. package/dist/types/marketplace.d.ts +8 -0
  97. package/dist/types/marketplace.d.ts.map +1 -1
  98. package/dist/types/permissions.d.ts +1 -1
  99. package/dist/types/permissions.d.ts.map +1 -1
  100. package/dist/types/permissions.js +1 -3
  101. package/dist/types/skills.d.ts +0 -2
  102. package/dist/types/skills.d.ts.map +1 -1
  103. package/dist/types/tools.d.ts +0 -15
  104. package/dist/types/tools.d.ts.map +1 -1
  105. package/dist/utils/container.d.ts +31 -0
  106. package/dist/utils/container.d.ts.map +1 -0
  107. package/dist/utils/container.js +79 -0
  108. package/dist/utils/containerSetup.d.ts +26 -0
  109. package/dist/utils/containerSetup.d.ts.map +1 -0
  110. package/dist/utils/containerSetup.js +165 -0
  111. package/dist/utils/editUtils.d.ts +0 -3
  112. package/dist/utils/editUtils.d.ts.map +1 -1
  113. package/dist/utils/editUtils.js +4 -3
  114. package/dist/utils/hookMatcher.d.ts +1 -1
  115. package/dist/utils/hookMatcher.d.ts.map +1 -1
  116. package/dist/utils/hookMatcher.js +2 -2
  117. package/dist/utils/openaiClient.js +2 -2
  118. package/dist/utils/stringUtils.d.ts +6 -0
  119. package/dist/utils/stringUtils.d.ts.map +1 -1
  120. package/dist/utils/stringUtils.js +8 -0
  121. package/package.json +1 -1
  122. package/src/agent.ts +60 -282
  123. package/src/constants/tools.ts +0 -2
  124. package/src/core/plugin.ts +224 -0
  125. package/src/index.ts +1 -6
  126. package/src/managers/MemoryRuleManager.ts +6 -1
  127. package/src/managers/aiManager.ts +83 -58
  128. package/src/managers/backgroundTaskManager.ts +5 -1
  129. package/src/managers/bashManager.ts +9 -4
  130. package/src/managers/foregroundTaskManager.ts +3 -0
  131. package/src/managers/hookManager.ts +21 -23
  132. package/src/managers/liveConfigManager.ts +57 -53
  133. package/src/managers/lspManager.ts +14 -19
  134. package/src/managers/mcpManager.ts +20 -20
  135. package/src/managers/messageManager.ts +19 -12
  136. package/src/managers/permissionManager.ts +45 -70
  137. package/src/managers/planManager.ts +26 -7
  138. package/src/managers/pluginManager.ts +37 -33
  139. package/src/managers/reversionManager.ts +5 -3
  140. package/src/managers/skillManager.ts +19 -20
  141. package/src/managers/slashCommandManager.ts +30 -25
  142. package/src/managers/subagentManager.ts +53 -53
  143. package/src/managers/toolManager.ts +91 -90
  144. package/src/prompts/index.ts +12 -24
  145. package/src/services/MarketplaceService.ts +13 -0
  146. package/src/services/aiService.ts +61 -15
  147. package/src/services/configurationService.ts +34 -13
  148. package/src/services/taskManager.ts +5 -1
  149. package/src/tools/bashTool.ts +2 -2
  150. package/src/tools/editTool.ts +9 -1
  151. package/src/tools/readTool.ts +2 -2
  152. package/src/tools/skillTool.ts +75 -71
  153. package/src/tools/taskOutputTool.ts +1 -1
  154. package/src/tools/taskTool.ts +224 -225
  155. package/src/tools/types.ts +12 -1
  156. package/src/tools/writeTool.ts +4 -2
  157. package/src/types/marketplace.ts +9 -0
  158. package/src/types/permissions.ts +0 -4
  159. package/src/types/skills.ts +0 -3
  160. package/src/types/tools.ts +0 -17
  161. package/src/utils/container.ts +92 -0
  162. package/src/utils/containerSetup.ts +256 -0
  163. package/src/utils/editUtils.ts +4 -3
  164. package/src/utils/hookMatcher.ts +2 -2
  165. package/src/utils/openaiClient.ts +2 -2
  166. package/src/utils/stringUtils.ts +9 -0
  167. package/dist/tools/deleteFileTool.d.ts +0 -6
  168. package/dist/tools/deleteFileTool.d.ts.map +0 -1
  169. package/dist/tools/deleteFileTool.js +0 -100
  170. package/dist/tools/multiEditTool.d.ts +0 -6
  171. package/dist/tools/multiEditTool.d.ts.map +0 -1
  172. package/dist/tools/multiEditTool.js +0 -246
  173. package/src/tools/deleteFileTool.ts +0 -127
  174. package/src/tools/multiEditTool.ts +0 -306
@@ -9,28 +9,31 @@ import type {
9
9
  SkillDiscoveryResult,
10
10
  SkillToolArgs,
11
11
  SkillInvocationContext,
12
- Logger,
13
12
  } from "../types/index.js";
14
13
  import { parseSkillFile, formatSkillError } from "../utils/skillParser.js";
15
14
 
15
+ import { Container } from "../utils/container.js";
16
+ import { logger } from "../utils/globalLogger.js";
17
+
16
18
  /**
17
19
  * Manages skill discovery and loading
18
20
  */
19
21
  export class SkillManager {
20
22
  private personalSkillsPath: string;
21
23
  private scanTimeout: number;
22
- private logger?: Logger;
23
24
  private workdir: string;
24
25
 
25
26
  private skillMetadata = new Map<string, SkillMetadata>();
26
27
  private skillContent = new Map<string, Skill>();
27
28
  private initialized = false;
28
29
 
29
- constructor(options: SkillManagerOptions = {}) {
30
+ constructor(
31
+ private container: Container,
32
+ options: SkillManagerOptions = {},
33
+ ) {
30
34
  this.personalSkillsPath =
31
35
  options.personalSkillsPath || join(homedir(), ".wave", "skills");
32
36
  this.scanTimeout = options.scanTimeout || 5000;
33
- this.logger = options.logger;
34
37
  this.workdir = options.workdir || process.cwd();
35
38
  }
36
39
 
@@ -38,7 +41,7 @@ export class SkillManager {
38
41
  * Initialize the skill manager by discovering available skills
39
42
  */
40
43
  async initialize(): Promise<void> {
41
- this.logger?.debug("Initializing SkillManager...");
44
+ logger?.debug("Initializing SkillManager...");
42
45
 
43
46
  try {
44
47
  // Clear existing data before discovery
@@ -57,22 +60,18 @@ export class SkillManager {
57
60
 
58
61
  // Log any discovery errors
59
62
  if (discovery.errors.length > 0) {
60
- this.logger?.warn(
61
- `Found ${discovery.errors.length} skill discovery errors`,
62
- );
63
+ logger?.warn(`Found ${discovery.errors.length} skill discovery errors`);
63
64
  discovery.errors.forEach((error) => {
64
- this.logger?.warn(
65
- `Skill error in ${error.skillPath}: ${error.message}`,
66
- );
65
+ logger?.warn(`Skill error in ${error.skillPath}: ${error.message}`);
67
66
  });
68
67
  }
69
68
 
70
69
  this.initialized = true;
71
- this.logger?.debug(
70
+ logger?.debug(
72
71
  `SkillManager initialized with ${this.skillMetadata.size} skills`,
73
72
  );
74
73
  } catch (error) {
75
- this.logger?.error("Failed to initialize SkillManager:", error);
74
+ logger?.error("Failed to initialize SkillManager:", error);
76
75
  throw error;
77
76
  }
78
77
  }
@@ -107,11 +106,11 @@ export class SkillManager {
107
106
  // Return skill content that was loaded during initialization
108
107
  const skill = this.skillContent.get(skillName);
109
108
  if (skill) {
110
- this.logger?.debug(`Skill '${skillName}' retrieved from loaded content`);
109
+ logger?.debug(`Skill '${skillName}' retrieved from loaded content`);
111
110
  return skill;
112
111
  }
113
112
 
114
- this.logger?.debug(`Skill '${skillName}' not found`);
113
+ logger?.debug(`Skill '${skillName}' not found`);
115
114
  return null;
116
115
  }
117
116
 
@@ -155,7 +154,7 @@ export class SkillManager {
155
154
 
156
155
  try {
157
156
  const skillDirs = await this.findSkillDirectories(skillsPath);
158
- this.logger?.debug(
157
+ logger?.debug(
159
158
  `Found ${skillDirs.length} potential skill directories in ${skillsPath}`,
160
159
  );
161
160
 
@@ -211,7 +210,7 @@ export class SkillManager {
211
210
  }
212
211
  }
213
212
  } catch (error) {
214
- this.logger?.debug(
213
+ logger?.debug(
215
214
  `Could not scan ${skillsPath}: ${error instanceof Error ? error.message : String(error)}`,
216
215
  );
217
216
  // Not an error - the directory might not exist yet
@@ -249,7 +248,7 @@ export class SkillManager {
249
248
  ): Promise<{ content: string; context?: SkillInvocationContext }> {
250
249
  const { skill_name } = args;
251
250
 
252
- this.logger?.debug(`Invoking skill: ${skill_name}`);
251
+ logger?.debug(`Invoking skill: ${skill_name}`);
253
252
 
254
253
  try {
255
254
  // Load the skill
@@ -276,7 +275,7 @@ export class SkillManager {
276
275
  },
277
276
  };
278
277
  } catch (error) {
279
- this.logger?.error(`Failed to execute skill '${skill_name}':`, error);
278
+ logger?.error(`Failed to execute skill '${skill_name}':`, error);
280
279
  return {
281
280
  content: `❌ **Error executing skill**: ${error instanceof Error ? error.message : String(error)}`,
282
281
  };
@@ -328,7 +327,7 @@ export class SkillManager {
328
327
  });
329
328
  this.skillContent.set(skill.name, skill);
330
329
  }
331
- this.logger?.debug(
330
+ logger?.debug(
332
331
  `Registered ${skills.length} plugin skills. Total skills: ${this.skillMetadata.size}`,
333
332
  );
334
333
  }
@@ -2,11 +2,7 @@ import type { MessageManager } from "./messageManager.js";
2
2
  import type { AIManager } from "./aiManager.js";
3
3
  import type { BackgroundTaskManager } from "./backgroundTaskManager.js";
4
4
  import type { TaskManager } from "../services/taskManager.js";
5
- import type {
6
- SlashCommand,
7
- CustomSlashCommand,
8
- Logger,
9
- } from "../types/index.js";
5
+ import type { SlashCommand, CustomSlashCommand } from "../types/index.js";
10
6
  import { loadCustomSlashCommands } from "../utils/customCommands.js";
11
7
 
12
8
  import {
@@ -14,6 +10,7 @@ import {
14
10
  parseSlashCommandInput,
15
11
  hasParameterPlaceholders,
16
12
  } from "../utils/commandArgumentParser.js";
13
+ import { Container } from "../utils/container.js";
17
14
  import {
18
15
  BashCommandResult,
19
16
  parseBashCommands,
@@ -25,37 +22,45 @@ import { INIT_PROMPT } from "../prompts/index.js";
25
22
 
26
23
  const execAsync = promisify(exec);
27
24
 
25
+ import { logger } from "../utils/globalLogger.js";
26
+
28
27
  export interface SlashCommandManagerOptions {
29
- messageManager: MessageManager;
30
- aiManager: AIManager;
31
- backgroundTaskManager: BackgroundTaskManager;
32
- taskManager: TaskManager;
33
28
  workdir: string;
34
- logger?: Logger;
35
29
  }
36
30
 
37
31
  export class SlashCommandManager {
38
32
  private commands = new Map<string, SlashCommand>();
39
33
  private customCommands = new Map<string, CustomSlashCommand>();
40
- private messageManager: MessageManager;
41
- private aiManager: AIManager;
42
- private backgroundTaskManager: BackgroundTaskManager;
43
- private taskManager: TaskManager;
44
34
  private workdir: string;
45
- private logger?: Logger;
46
35
 
47
- constructor(options: SlashCommandManagerOptions) {
48
- this.messageManager = options.messageManager;
49
- this.aiManager = options.aiManager;
50
- this.backgroundTaskManager = options.backgroundTaskManager;
51
- this.taskManager = options.taskManager;
36
+ constructor(
37
+ private container: Container,
38
+ options: SlashCommandManagerOptions,
39
+ ) {
52
40
  this.workdir = options.workdir;
53
- this.logger = options.logger;
41
+ }
54
42
 
43
+ public initialize(): void {
55
44
  this.initializeBuiltinCommands();
56
45
  this.loadCustomCommands();
57
46
  }
58
47
 
48
+ private get messageManager(): MessageManager {
49
+ return this.container.get<MessageManager>("MessageManager")!;
50
+ }
51
+
52
+ private get aiManager(): AIManager {
53
+ return this.container.get<AIManager>("AIManager")!;
54
+ }
55
+
56
+ private get backgroundTaskManager(): BackgroundTaskManager {
57
+ return this.container.get<BackgroundTaskManager>("BackgroundTaskManager")!;
58
+ }
59
+
60
+ private get taskManager(): TaskManager {
61
+ return this.container.get<TaskManager>("TaskManager")!;
62
+ }
63
+
59
64
  private initializeBuiltinCommands(): void {
60
65
  // Register built-in clear command
61
66
  this.registerCommand({
@@ -148,9 +153,9 @@ export class SlashCommandManager {
148
153
  });
149
154
  }
150
155
 
151
- this.logger?.debug(`Loaded ${customCommands.length} custom commands`);
156
+ logger?.debug(`Loaded ${customCommands.length} custom commands`);
152
157
  } catch (error) {
153
- this.logger?.warn("Failed to load custom commands:", error);
158
+ logger?.warn("Failed to load custom commands:", error);
154
159
  }
155
160
  }
156
161
 
@@ -211,7 +216,7 @@ export class SlashCommandManager {
211
216
  });
212
217
  }
213
218
 
214
- this.logger?.debug(
219
+ logger?.debug(
215
220
  `Registered ${commands.length} commands from plugin '${pluginName}'`,
216
221
  );
217
222
  }
@@ -387,7 +392,7 @@ export class SlashCommandManager {
387
392
  allowedRules: config?.allowedTools,
388
393
  });
389
394
  } catch (error) {
390
- this.logger?.error(
395
+ logger?.error(
391
396
  `Failed to execute custom command '${commandName}':`,
392
397
  error,
393
398
  );
@@ -1,9 +1,7 @@
1
1
  import { randomUUID } from "crypto";
2
- import type { MemoryRuleManager } from "./MemoryRuleManager.js";
3
2
  import type { SubagentConfiguration } from "../utils/subagentParser.js";
4
3
  import type {
5
4
  Message,
6
- Logger,
7
5
  GatewayConfig,
8
6
  ModelConfig,
9
7
  Usage,
@@ -11,7 +9,6 @@ import type {
11
9
  import { AIManager } from "./aiManager.js";
12
10
  import { MessageManager } from "./messageManager.js";
13
11
  import { ToolManager } from "./toolManager.js";
14
- import { HookManager } from "./hookManager.js";
15
12
  import {
16
13
  addConsolidatedAbortListener,
17
14
  createAbortPromise,
@@ -22,6 +19,8 @@ import {
22
19
  type AgentToolBlockUpdateParams,
23
20
  } from "../utils/messageOperations.js";
24
21
 
22
+ import { Container } from "../utils/container.js";
23
+
25
24
  export interface SubagentManagerCallbacks {
26
25
  // Granular subagent message callbacks (015-subagent-message-callbacks)
27
26
  /** Triggered when subagent adds user message */
@@ -67,24 +66,20 @@ export interface SubagentInstance {
67
66
  messages: Message[];
68
67
  lastTools: string[]; // Track last two tool names
69
68
  subagentType: string; // Store the subagent type for hook context
69
+ description: string; // Store the AI-generated description
70
70
  backgroundTaskId?: string; // ID of the background task if transitioned
71
71
  onUpdate?: () => void; // Optional callback for real-time updates
72
72
  }
73
73
 
74
74
  export interface SubagentManagerOptions {
75
75
  workdir: string;
76
- parentToolManager: ToolManager;
77
- taskManager: import("../services/taskManager.js").TaskManager;
78
76
  callbacks?: SubagentManagerCallbacks; // Use SubagentManagerCallbacks instead of parentCallbacks
79
- logger?: Logger;
80
77
  getGatewayConfig: () => GatewayConfig;
81
78
  getModelConfig: () => ModelConfig;
82
79
  getMaxInputTokens: () => number;
83
80
  getLanguage: () => string | undefined;
84
- hookManager?: HookManager;
81
+ getEnvironmentVars?: () => Record<string, string>;
85
82
  onUsageAdded?: (usage: Usage) => void;
86
- backgroundTaskManager?: BackgroundTaskManager;
87
- memoryRuleManager?: MemoryRuleManager;
88
83
  }
89
84
 
90
85
  export class SubagentManager {
@@ -92,33 +87,25 @@ export class SubagentManager {
92
87
  private cachedConfigurations: SubagentConfiguration[] | null = null;
93
88
 
94
89
  private workdir: string;
95
- private parentToolManager: ToolManager;
96
- private taskManager: import("../services/taskManager.js").TaskManager;
97
90
  private callbacks?: SubagentManagerCallbacks; // Use SubagentManagerCallbacks instead of parentCallbacks
98
- private logger?: Logger;
99
91
  private getGatewayConfig: () => GatewayConfig;
100
92
  private getModelConfig: () => ModelConfig;
101
93
  private getMaxInputTokens: () => number;
102
94
  private getLanguage: () => string | undefined;
103
- private hookManager?: HookManager;
95
+ private getEnvironmentVars?: () => Record<string, string>;
104
96
  private onUsageAdded?: (usage: Usage) => void;
105
- private backgroundTaskManager?: BackgroundTaskManager;
106
- private memoryRuleManager?: MemoryRuleManager;
97
+ private container: Container;
107
98
 
108
- constructor(options: SubagentManagerOptions) {
99
+ constructor(container: Container, options: SubagentManagerOptions) {
100
+ this.container = container;
109
101
  this.workdir = options.workdir;
110
- this.parentToolManager = options.parentToolManager;
111
- this.taskManager = options.taskManager;
112
102
  this.callbacks = options.callbacks; // Store SubagentManagerCallbacks
113
- this.logger = options.logger;
114
103
  this.getGatewayConfig = options.getGatewayConfig;
115
104
  this.getModelConfig = options.getModelConfig;
116
105
  this.getMaxInputTokens = options.getMaxInputTokens;
117
106
  this.getLanguage = options.getLanguage;
118
- this.hookManager = options.hookManager;
107
+ this.getEnvironmentVars = options.getEnvironmentVars;
119
108
  this.onUsageAdded = options.onUsageAdded;
120
- this.backgroundTaskManager = options.backgroundTaskManager;
121
- this.memoryRuleManager = options.memoryRuleManager;
122
109
  }
123
110
 
124
111
  /**
@@ -176,40 +163,38 @@ export class SubagentManager {
176
163
  runInBackground?: boolean,
177
164
  onUpdate?: () => void,
178
165
  ): Promise<SubagentInstance> {
179
- if (!this.parentToolManager) {
166
+ const parentToolManager = this.container.get<ToolManager>("ToolManager");
167
+
168
+ if (!parentToolManager) {
180
169
  throw new Error(
181
- "SubagentManager not properly initialized - call initialize() first",
170
+ "SubagentManager not properly initialized - ToolManager not found in container",
182
171
  );
183
172
  }
184
173
 
185
174
  const subagentId = randomUUID();
186
175
 
176
+ // Create a child container for the subagent to isolate its managers
177
+ const subagentContainer = this.container.createChild();
178
+
187
179
  // Create isolated MessageManager for the subagent
188
180
  const subagentCallbacks = this.createSubagentCallbacks(subagentId);
189
181
 
190
- const messageManager = new MessageManager({
182
+ const messageManager = new MessageManager(subagentContainer, {
191
183
  callbacks: subagentCallbacks,
192
184
  workdir: this.workdir,
193
- logger: this.logger,
194
185
  sessionType: "subagent",
195
186
  subagentType: parameters.subagent_type,
196
- memoryRuleManager: this.memoryRuleManager,
197
187
  });
188
+ subagentContainer.register("MessageManager", messageManager);
198
189
 
199
190
  // Use the parent tool manager directly - tool restrictions will be handled by allowedTools parameter
200
- const toolManager = this.parentToolManager;
191
+ const toolManager = parentToolManager;
201
192
 
202
193
  // Create isolated AIManager for the subagent
203
- const aiManager = new AIManager({
204
- messageManager,
205
- toolManager,
206
- taskManager: this.taskManager,
207
- logger: this.logger,
194
+ const aiManager = new AIManager(subagentContainer, {
208
195
  workdir: this.workdir,
209
196
  systemPrompt: configuration.systemPrompt,
210
197
  subagentType: parameters.subagent_type, // Pass subagent type for hook context
211
- hookManager: this.hookManager,
212
- permissionManager: this.parentToolManager.getPermissionManager(),
213
198
  getGatewayConfig: this.getGatewayConfig,
214
199
  getModelConfig: () => {
215
200
  // Determine model dynamically each time
@@ -234,10 +219,12 @@ export class SubagentManager {
234
219
  },
235
220
  getMaxInputTokens: this.getMaxInputTokens,
236
221
  getLanguage: this.getLanguage,
222
+ getEnvironmentVars: this.getEnvironmentVars,
237
223
  callbacks: {
238
224
  onUsageAdded: this.onUsageAdded,
239
225
  },
240
226
  });
227
+ subagentContainer.register("AIManager", aiManager);
241
228
 
242
229
  const instance: SubagentInstance = {
243
230
  subagentId,
@@ -249,6 +236,7 @@ export class SubagentManager {
249
236
  messages: [],
250
237
  lastTools: [], // Initialize lastTools
251
238
  subagentType: parameters.subagent_type, // Store the subagent type
239
+ description: parameters.description, // Store the AI-generated description
252
240
  onUpdate,
253
241
  };
254
242
 
@@ -278,16 +266,20 @@ export class SubagentManager {
278
266
  // Set status to active and update parent
279
267
  this.updateInstanceStatus(instance.subagentId, "active");
280
268
 
281
- if (runInBackground && this.backgroundTaskManager) {
282
- const taskId = this.backgroundTaskManager.generateId();
269
+ const backgroundTaskManager = this.container.has("BackgroundTaskManager")
270
+ ? this.container.get<BackgroundTaskManager>("BackgroundTaskManager")
271
+ : undefined;
272
+
273
+ if (runInBackground && backgroundTaskManager) {
274
+ const taskId = backgroundTaskManager.generateId();
283
275
  const startTime = Date.now();
284
276
 
285
- this.backgroundTaskManager.addTask({
277
+ backgroundTaskManager.addTask({
286
278
  id: taskId,
287
279
  type: "subagent",
288
280
  status: "running",
289
281
  startTime,
290
- description: instance.configuration.description,
282
+ description: instance.description,
291
283
  stdout: "",
292
284
  stderr: "",
293
285
  subagentId: instance.subagentId,
@@ -307,7 +299,7 @@ export class SubagentManager {
307
299
  prompt,
308
300
  abortSignal,
309
301
  );
310
- const task = this.backgroundTaskManager?.getTask(taskId);
302
+ const task = backgroundTaskManager?.getTask(taskId);
311
303
  if (task) {
312
304
  task.status = "completed";
313
305
  task.stdout = result;
@@ -315,7 +307,7 @@ export class SubagentManager {
315
307
  task.runtime = task.endTime - startTime;
316
308
  }
317
309
  } catch (error) {
318
- const task = this.backgroundTaskManager?.getTask(taskId);
310
+ const task = backgroundTaskManager?.getTask(taskId);
319
311
  if (task) {
320
312
  task.status = "failed";
321
313
  task.stderr =
@@ -342,19 +334,23 @@ export class SubagentManager {
342
334
  throw new Error(`Subagent instance ${subagentId} not found`);
343
335
  }
344
336
 
345
- if (!this.backgroundTaskManager) {
337
+ const backgroundTaskManager = this.container.has("BackgroundTaskManager")
338
+ ? this.container.get<BackgroundTaskManager>("BackgroundTaskManager")
339
+ : undefined;
340
+
341
+ if (!backgroundTaskManager) {
346
342
  throw new Error("BackgroundTaskManager not available");
347
343
  }
348
344
 
349
- const taskId = this.backgroundTaskManager.generateId();
345
+ const taskId = backgroundTaskManager.generateId();
350
346
  const startTime = Date.now();
351
347
 
352
- this.backgroundTaskManager.addTask({
348
+ backgroundTaskManager.addTask({
353
349
  id: taskId,
354
350
  type: "subagent",
355
351
  status: "running",
356
352
  startTime,
357
- description: instance.configuration.description,
353
+ description: instance.description,
358
354
  stdout: "",
359
355
  stderr: "",
360
356
  subagentId: instance.subagentId,
@@ -461,11 +457,13 @@ export class SubagentManager {
461
457
  // Update status to completed and update parent
462
458
  this.updateInstanceStatus(instance.subagentId, "completed");
463
459
 
460
+ const backgroundTaskManager = this.container.has("BackgroundTaskManager")
461
+ ? this.container.get<BackgroundTaskManager>("BackgroundTaskManager")
462
+ : undefined;
463
+
464
464
  // If this was transitioned to background, update the background task
465
- if (instance.backgroundTaskId && this.backgroundTaskManager) {
466
- const task = this.backgroundTaskManager.getTask(
467
- instance.backgroundTaskId,
468
- );
465
+ if (instance.backgroundTaskId && backgroundTaskManager) {
466
+ const task = backgroundTaskManager.getTask(instance.backgroundTaskId);
469
467
  if (task) {
470
468
  task.status = "completed";
471
469
  task.stdout = response || "Task completed with no text response";
@@ -478,11 +476,13 @@ export class SubagentManager {
478
476
 
479
477
  return response || "Task completed with no text response";
480
478
  } catch (error) {
479
+ const backgroundTaskManager = this.container.has("BackgroundTaskManager")
480
+ ? this.container.get<BackgroundTaskManager>("BackgroundTaskManager")
481
+ : undefined;
482
+
481
483
  // If this was transitioned to background, update the background task with error
482
- if (instance.backgroundTaskId && this.backgroundTaskManager) {
483
- const task = this.backgroundTaskManager.getTask(
484
- instance.backgroundTaskId,
485
- );
484
+ if (instance.backgroundTaskId && backgroundTaskManager) {
485
+ const task = backgroundTaskManager.getTask(instance.backgroundTaskId);
486
486
  if (task) {
487
487
  task.status = "failed";
488
488
  task.stderr = error instanceof Error ? error.message : String(error);