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.
- package/dist/agent.d.ts +8 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +49 -240
- package/dist/constants/tools.d.ts +0 -2
- package/dist/constants/tools.d.ts.map +1 -1
- package/dist/constants/tools.js +0 -2
- package/dist/core/plugin.d.ts +86 -0
- package/dist/core/plugin.d.ts.map +1 -0
- package/dist/core/plugin.js +164 -0
- package/dist/index.d.ts +1 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -5
- package/dist/managers/MemoryRuleManager.d.ts +3 -1
- package/dist/managers/MemoryRuleManager.d.ts.map +1 -1
- package/dist/managers/MemoryRuleManager.js +2 -1
- package/dist/managers/aiManager.d.ts +13 -23
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +59 -32
- package/dist/managers/backgroundTaskManager.d.ts +3 -1
- package/dist/managers/backgroundTaskManager.d.ts.map +1 -1
- package/dist/managers/backgroundTaskManager.js +2 -1
- package/dist/managers/bashManager.d.ts +4 -4
- package/dist/managers/bashManager.d.ts.map +1 -1
- package/dist/managers/bashManager.js +5 -2
- package/dist/managers/foregroundTaskManager.d.ts +3 -0
- package/dist/managers/foregroundTaskManager.d.ts.map +1 -1
- package/dist/managers/foregroundTaskManager.js +2 -1
- package/dist/managers/hookManager.d.ts +3 -3
- package/dist/managers/hookManager.d.ts.map +1 -1
- package/dist/managers/hookManager.js +20 -19
- package/dist/managers/liveConfigManager.d.ts +6 -13
- package/dist/managers/liveConfigManager.d.ts.map +1 -1
- package/dist/managers/liveConfigManager.js +50 -45
- package/dist/managers/lspManager.d.ts +4 -5
- package/dist/managers/lspManager.d.ts.map +1 -1
- package/dist/managers/lspManager.js +13 -12
- package/dist/managers/mcpManager.d.ts +3 -2
- package/dist/managers/mcpManager.d.ts.map +1 -1
- package/dist/managers/mcpManager.js +16 -15
- package/dist/managers/messageManager.d.ts +5 -7
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +12 -7
- package/dist/managers/permissionManager.d.ts +6 -4
- package/dist/managers/permissionManager.d.ts.map +1 -1
- package/dist/managers/permissionManager.js +39 -63
- package/dist/managers/planManager.d.ts +4 -6
- package/dist/managers/planManager.d.ts.map +1 -1
- package/dist/managers/planManager.js +18 -4
- package/dist/managers/pluginManager.d.ts +10 -22
- package/dist/managers/pluginManager.d.ts.map +1 -1
- package/dist/managers/pluginManager.js +27 -14
- package/dist/managers/reversionManager.d.ts +4 -3
- package/dist/managers/reversionManager.d.ts.map +1 -1
- package/dist/managers/reversionManager.js +5 -2
- package/dist/managers/skillManager.d.ts +3 -2
- package/dist/managers/skillManager.d.ts.map +1 -1
- package/dist/managers/skillManager.js +15 -14
- package/dist/managers/slashCommandManager.d.ts +9 -16
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +21 -10
- package/dist/managers/subagentManager.d.ts +7 -17
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +41 -34
- package/dist/managers/toolManager.d.ts +15 -38
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/managers/toolManager.js +66 -56
- package/dist/prompts/index.d.ts +6 -3
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +8 -16
- package/dist/services/MarketplaceService.d.ts.map +1 -1
- package/dist/services/MarketplaceService.js +13 -0
- package/dist/services/aiService.d.ts +4 -0
- package/dist/services/aiService.d.ts.map +1 -1
- package/dist/services/aiService.js +47 -7
- package/dist/services/configurationService.d.ts.map +1 -1
- package/dist/services/configurationService.js +30 -11
- package/dist/services/taskManager.d.ts +3 -1
- package/dist/services/taskManager.d.ts.map +1 -1
- package/dist/services/taskManager.js +2 -1
- package/dist/tools/bashTool.js +2 -2
- package/dist/tools/editTool.d.ts.map +1 -1
- package/dist/tools/editTool.js +9 -1
- package/dist/tools/readTool.d.ts.map +1 -1
- package/dist/tools/readTool.js +2 -2
- package/dist/tools/skillTool.d.ts +2 -4
- package/dist/tools/skillTool.d.ts.map +1 -1
- package/dist/tools/skillTool.js +61 -61
- package/dist/tools/taskOutputTool.js +1 -1
- package/dist/tools/taskTool.d.ts +2 -4
- package/dist/tools/taskTool.d.ts.map +1 -1
- package/dist/tools/taskTool.js +192 -187
- package/dist/tools/types.d.ts +11 -1
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/writeTool.d.ts.map +1 -1
- package/dist/tools/writeTool.js +4 -2
- package/dist/types/marketplace.d.ts +8 -0
- package/dist/types/marketplace.d.ts.map +1 -1
- package/dist/types/permissions.d.ts +1 -1
- package/dist/types/permissions.d.ts.map +1 -1
- package/dist/types/permissions.js +1 -3
- package/dist/types/skills.d.ts +0 -2
- package/dist/types/skills.d.ts.map +1 -1
- package/dist/types/tools.d.ts +0 -15
- package/dist/types/tools.d.ts.map +1 -1
- package/dist/utils/container.d.ts +31 -0
- package/dist/utils/container.d.ts.map +1 -0
- package/dist/utils/container.js +79 -0
- package/dist/utils/containerSetup.d.ts +26 -0
- package/dist/utils/containerSetup.d.ts.map +1 -0
- package/dist/utils/containerSetup.js +165 -0
- package/dist/utils/editUtils.d.ts +0 -3
- package/dist/utils/editUtils.d.ts.map +1 -1
- package/dist/utils/editUtils.js +4 -3
- package/dist/utils/hookMatcher.d.ts +1 -1
- package/dist/utils/hookMatcher.d.ts.map +1 -1
- package/dist/utils/hookMatcher.js +2 -2
- package/dist/utils/openaiClient.js +2 -2
- package/dist/utils/stringUtils.d.ts +6 -0
- package/dist/utils/stringUtils.d.ts.map +1 -1
- package/dist/utils/stringUtils.js +8 -0
- package/package.json +1 -1
- package/src/agent.ts +60 -282
- package/src/constants/tools.ts +0 -2
- package/src/core/plugin.ts +224 -0
- package/src/index.ts +1 -6
- package/src/managers/MemoryRuleManager.ts +6 -1
- package/src/managers/aiManager.ts +83 -58
- package/src/managers/backgroundTaskManager.ts +5 -1
- package/src/managers/bashManager.ts +9 -4
- package/src/managers/foregroundTaskManager.ts +3 -0
- package/src/managers/hookManager.ts +21 -23
- package/src/managers/liveConfigManager.ts +57 -53
- package/src/managers/lspManager.ts +14 -19
- package/src/managers/mcpManager.ts +20 -20
- package/src/managers/messageManager.ts +19 -12
- package/src/managers/permissionManager.ts +45 -70
- package/src/managers/planManager.ts +26 -7
- package/src/managers/pluginManager.ts +37 -33
- package/src/managers/reversionManager.ts +5 -3
- package/src/managers/skillManager.ts +19 -20
- package/src/managers/slashCommandManager.ts +30 -25
- package/src/managers/subagentManager.ts +53 -53
- package/src/managers/toolManager.ts +91 -90
- package/src/prompts/index.ts +12 -24
- package/src/services/MarketplaceService.ts +13 -0
- package/src/services/aiService.ts +61 -15
- package/src/services/configurationService.ts +34 -13
- package/src/services/taskManager.ts +5 -1
- package/src/tools/bashTool.ts +2 -2
- package/src/tools/editTool.ts +9 -1
- package/src/tools/readTool.ts +2 -2
- package/src/tools/skillTool.ts +75 -71
- package/src/tools/taskOutputTool.ts +1 -1
- package/src/tools/taskTool.ts +224 -225
- package/src/tools/types.ts +12 -1
- package/src/tools/writeTool.ts +4 -2
- package/src/types/marketplace.ts +9 -0
- package/src/types/permissions.ts +0 -4
- package/src/types/skills.ts +0 -3
- package/src/types/tools.ts +0 -17
- package/src/utils/container.ts +92 -0
- package/src/utils/containerSetup.ts +256 -0
- package/src/utils/editUtils.ts +4 -3
- package/src/utils/hookMatcher.ts +2 -2
- package/src/utils/openaiClient.ts +2 -2
- package/src/utils/stringUtils.ts +9 -0
- package/dist/tools/deleteFileTool.d.ts +0 -6
- package/dist/tools/deleteFileTool.d.ts.map +0 -1
- package/dist/tools/deleteFileTool.js +0 -100
- package/dist/tools/multiEditTool.d.ts +0 -6
- package/dist/tools/multiEditTool.d.ts.map +0 -1
- package/dist/tools/multiEditTool.js +0 -246
- package/src/tools/deleteFileTool.ts +0 -127
- 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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
70
|
+
logger?.debug(
|
|
72
71
|
`SkillManager initialized with ${this.skillMetadata.size} skills`,
|
|
73
72
|
);
|
|
74
73
|
} catch (error) {
|
|
75
|
-
|
|
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
|
-
|
|
109
|
+
logger?.debug(`Skill '${skillName}' retrieved from loaded content`);
|
|
111
110
|
return skill;
|
|
112
111
|
}
|
|
113
112
|
|
|
114
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
this.taskManager = options.taskManager;
|
|
36
|
+
constructor(
|
|
37
|
+
private container: Container,
|
|
38
|
+
options: SlashCommandManagerOptions,
|
|
39
|
+
) {
|
|
52
40
|
this.workdir = options.workdir;
|
|
53
|
-
|
|
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
|
-
|
|
156
|
+
logger?.debug(`Loaded ${customCommands.length} custom commands`);
|
|
152
157
|
} catch (error) {
|
|
153
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
95
|
+
private getEnvironmentVars?: () => Record<string, string>;
|
|
104
96
|
private onUsageAdded?: (usage: Usage) => void;
|
|
105
|
-
private
|
|
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.
|
|
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
|
-
|
|
166
|
+
const parentToolManager = this.container.get<ToolManager>("ToolManager");
|
|
167
|
+
|
|
168
|
+
if (!parentToolManager) {
|
|
180
169
|
throw new Error(
|
|
181
|
-
"SubagentManager not properly initialized -
|
|
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 =
|
|
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
|
-
|
|
282
|
-
|
|
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
|
-
|
|
277
|
+
backgroundTaskManager.addTask({
|
|
286
278
|
id: taskId,
|
|
287
279
|
type: "subagent",
|
|
288
280
|
status: "running",
|
|
289
281
|
startTime,
|
|
290
|
-
description: instance.
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
345
|
+
const taskId = backgroundTaskManager.generateId();
|
|
350
346
|
const startTime = Date.now();
|
|
351
347
|
|
|
352
|
-
|
|
348
|
+
backgroundTaskManager.addTask({
|
|
353
349
|
id: taskId,
|
|
354
350
|
type: "subagent",
|
|
355
351
|
status: "running",
|
|
356
352
|
startTime,
|
|
357
|
-
description: instance.
|
|
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 &&
|
|
466
|
-
const task =
|
|
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 &&
|
|
483
|
-
const task =
|
|
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);
|