wave-agent-sdk 0.0.5 → 0.0.7
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 +3 -6
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +24 -21
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/managers/aiManager.d.ts +4 -2
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +91 -53
- package/dist/managers/backgroundBashManager.d.ts +1 -1
- package/dist/managers/backgroundBashManager.d.ts.map +1 -1
- package/dist/{hooks/manager.d.ts → managers/hookManager.d.ts} +27 -16
- package/dist/managers/hookManager.d.ts.map +1 -0
- package/dist/{hooks/manager.js → managers/hookManager.js} +112 -17
- package/dist/managers/mcpManager.d.ts +1 -1
- package/dist/managers/mcpManager.d.ts.map +1 -1
- package/dist/managers/messageManager.d.ts +20 -15
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +19 -25
- package/dist/managers/skillManager.d.ts +1 -1
- package/dist/managers/skillManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.d.ts +1 -1
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +5 -2
- package/dist/managers/subagentManager.d.ts +7 -12
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +40 -46
- package/dist/managers/toolManager.d.ts +1 -1
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/services/aiService.d.ts +1 -1
- package/dist/services/aiService.d.ts.map +1 -1
- package/dist/services/aiService.js +8 -1
- package/dist/services/hook.d.ts +56 -0
- package/dist/services/hook.d.ts.map +1 -0
- package/dist/services/hook.js +276 -0
- package/dist/services/session.d.ts +1 -1
- package/dist/services/session.d.ts.map +1 -1
- package/dist/services/session.js +5 -4
- package/dist/tools/taskTool.d.ts.map +1 -1
- package/dist/tools/taskTool.js +7 -3
- package/dist/tools/todoWriteTool.d.ts.map +1 -1
- package/dist/tools/todoWriteTool.js +3 -10
- package/dist/types/commands.d.ts +24 -0
- package/dist/types/commands.d.ts.map +1 -0
- package/dist/types/commands.js +5 -0
- package/dist/types/config.d.ts +13 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +5 -0
- package/dist/types/core.d.ts +38 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/{types.js → types/core.js} +4 -13
- package/dist/{hooks/types.d.ts → types/hooks.d.ts} +2 -1
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/index.d.ts +20 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/mcp.d.ts +28 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +5 -0
- package/dist/types/messaging.d.ts +80 -0
- package/dist/types/messaging.d.ts.map +1 -0
- package/dist/types/messaging.js +9 -0
- package/dist/types/processes.d.ts +17 -0
- package/dist/types/processes.d.ts.map +1 -0
- package/dist/types/processes.js +5 -0
- package/dist/types/skills.d.ts +78 -0
- package/dist/types/skills.d.ts.map +1 -0
- package/dist/types/skills.js +17 -0
- package/dist/utils/configResolver.d.ts +1 -1
- package/dist/utils/configResolver.d.ts.map +1 -1
- package/dist/utils/configResolver.js +1 -1
- package/dist/utils/configValidator.d.ts +1 -1
- package/dist/utils/configValidator.d.ts.map +1 -1
- package/dist/utils/configValidator.js +1 -1
- package/dist/utils/convertMessagesForAPI.d.ts +1 -1
- package/dist/utils/convertMessagesForAPI.d.ts.map +1 -1
- package/dist/utils/convertMessagesForAPI.js +1 -8
- package/dist/utils/customCommands.d.ts +1 -1
- package/dist/utils/customCommands.d.ts.map +1 -1
- package/dist/{hooks/matcher.d.ts → utils/hookMatcher.d.ts} +2 -7
- package/dist/utils/hookMatcher.d.ts.map +1 -0
- package/dist/utils/markdownParser.d.ts +1 -1
- package/dist/utils/markdownParser.d.ts.map +1 -1
- package/dist/utils/mcpUtils.d.ts +1 -1
- package/dist/utils/mcpUtils.d.ts.map +1 -1
- package/dist/utils/messageOperations.d.ts +14 -21
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +37 -20
- package/dist/utils/skillParser.d.ts +1 -1
- package/dist/utils/skillParser.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/agent.ts +49 -43
- package/src/index.ts +3 -4
- package/src/managers/aiManager.ts +241 -160
- package/src/managers/backgroundBashManager.ts +1 -1
- package/src/{hooks/manager.ts → managers/hookManager.ts} +168 -56
- package/src/managers/mcpManager.ts +1 -1
- package/src/managers/messageManager.ts +44 -44
- package/src/managers/skillManager.ts +1 -1
- package/src/managers/slashCommandManager.ts +10 -7
- package/src/managers/subagentManager.ts +47 -54
- package/src/managers/toolManager.ts +1 -1
- package/src/services/aiService.ts +9 -2
- package/src/services/hook.ts +360 -0
- package/src/services/session.ts +6 -7
- package/src/tools/taskTool.ts +13 -5
- package/src/tools/todoWriteTool.ts +3 -11
- package/src/types/commands.ts +26 -0
- package/src/types/config.ts +14 -0
- package/src/types/core.ts +49 -0
- package/src/{hooks/types.ts → types/hooks.ts} +1 -0
- package/src/types/index.ts +23 -0
- package/src/types/mcp.ts +31 -0
- package/src/types/messaging.ts +102 -0
- package/src/types/processes.ts +18 -0
- package/src/types/skills.ts +91 -0
- package/src/utils/configResolver.ts +1 -1
- package/src/utils/configValidator.ts +5 -1
- package/src/utils/convertMessagesForAPI.ts +2 -10
- package/src/utils/customCommands.ts +1 -1
- package/src/{hooks/matcher.ts → utils/hookMatcher.ts} +1 -12
- package/src/utils/markdownParser.ts +1 -1
- package/src/utils/mcpUtils.ts +1 -1
- package/src/utils/messageOperations.ts +56 -42
- package/src/utils/skillParser.ts +1 -1
- package/dist/hooks/executor.d.ts +0 -56
- package/dist/hooks/executor.d.ts.map +0 -1
- package/dist/hooks/executor.js +0 -312
- package/dist/hooks/index.d.ts +0 -17
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js +0 -14
- package/dist/hooks/manager.d.ts.map +0 -1
- package/dist/hooks/matcher.d.ts.map +0 -1
- package/dist/hooks/settings.d.ts +0 -46
- package/dist/hooks/settings.d.ts.map +0 -1
- package/dist/hooks/settings.js +0 -100
- package/dist/hooks/types.d.ts.map +0 -1
- package/dist/types.d.ts +0 -288
- package/dist/types.d.ts.map +0 -1
- package/src/hooks/executor.ts +0 -440
- package/src/hooks/index.ts +0 -52
- package/src/hooks/settings.ts +0 -129
- package/src/types.ts +0 -357
- /package/dist/{hooks/types.js → types/hooks.js} +0 -0
- /package/dist/{hooks/matcher.js → utils/hookMatcher.js} +0 -0
|
@@ -4,18 +4,14 @@
|
|
|
4
4
|
* Central orchestrator for the hooks system. Handles configuration loading,
|
|
5
5
|
* validation, and hook execution across all supported events.
|
|
6
6
|
*/
|
|
7
|
-
import { HookConfigurationError, isValidHookEvent, isValidHookEventConfig, } from "
|
|
8
|
-
import { HookMatcher } from "
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
7
|
+
import { HookConfigurationError, isValidHookEvent, isValidHookEventConfig, } from "../types/hooks.js";
|
|
8
|
+
import { HookMatcher } from "../utils/hookMatcher.js";
|
|
9
|
+
import { executeCommand, isCommandSafe, loadMergedHooksConfig, } from "../services/hook.js";
|
|
10
|
+
import { MessageSource } from "../types/index.js";
|
|
11
11
|
export class HookManager {
|
|
12
|
-
constructor(workdir, matcher = new HookMatcher(),
|
|
12
|
+
constructor(workdir, matcher = new HookMatcher(), logger) {
|
|
13
13
|
this.workdir = workdir;
|
|
14
14
|
this.matcher = matcher;
|
|
15
|
-
// Create executor with logger if provided, or use passed executor, or create default
|
|
16
|
-
this.executor = logger
|
|
17
|
-
? new HookExecutor(logger)
|
|
18
|
-
: executor || new HookExecutor();
|
|
19
15
|
this.logger = logger;
|
|
20
16
|
}
|
|
21
17
|
/**
|
|
@@ -48,13 +44,15 @@ export class HookManager {
|
|
|
48
44
|
this.logger?.debug(`[HookManager] Loading configuration...`);
|
|
49
45
|
const mergedConfig = loadMergedHooksConfig(this.workdir);
|
|
50
46
|
this.logger?.debug(`[HookManager] Merged config result:`, mergedConfig);
|
|
51
|
-
this.configuration = mergedConfig;
|
|
52
|
-
// Validate the loaded configuration
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
47
|
+
this.configuration = mergedConfig || undefined;
|
|
48
|
+
// Validate the loaded configuration if it exists
|
|
49
|
+
if (mergedConfig) {
|
|
50
|
+
const validation = this.validatePartialConfiguration(mergedConfig);
|
|
51
|
+
if (!validation.valid) {
|
|
52
|
+
throw new HookConfigurationError("filesystem settings", validation.errors);
|
|
53
|
+
}
|
|
56
54
|
}
|
|
57
|
-
this.logger?.debug(`[HookManager] Configuration loaded successfully with ${Object.keys(mergedConfig).length} event types`);
|
|
55
|
+
this.logger?.debug(`[HookManager] Configuration loaded successfully with ${Object.keys(mergedConfig || {}).length} event types`);
|
|
58
56
|
}
|
|
59
57
|
catch (error) {
|
|
60
58
|
// If loading fails, start with undefined configuration (no hooks)
|
|
@@ -110,7 +108,7 @@ export class HookManager {
|
|
|
110
108
|
const hookCommand = config.hooks[commandIndex];
|
|
111
109
|
try {
|
|
112
110
|
this.logger?.debug(`[HookManager] Executing command ${commandIndex + 1}/${config.hooks.length} in configuration ${configIndex + 1}`);
|
|
113
|
-
const result = await
|
|
111
|
+
const result = await executeCommand(hookCommand.command, context);
|
|
114
112
|
results.push(result);
|
|
115
113
|
// Report individual command result
|
|
116
114
|
if (result.success) {
|
|
@@ -141,6 +139,103 @@ export class HookManager {
|
|
|
141
139
|
this.logger?.debug(`[HookManager] ${event} execution summary: ${summary}`);
|
|
142
140
|
return results;
|
|
143
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Process hook execution results and determine appropriate actions
|
|
144
|
+
* based on exit codes and hook event type
|
|
145
|
+
*/
|
|
146
|
+
processHookResults(event, results, messageManager, toolId, toolParameters) {
|
|
147
|
+
if (!messageManager || results.length === 0) {
|
|
148
|
+
return { shouldBlock: false };
|
|
149
|
+
}
|
|
150
|
+
// First pass: Check for any blocking errors (exit code 2)
|
|
151
|
+
// Blocking errors take precedence and stop all processing
|
|
152
|
+
for (const result of results) {
|
|
153
|
+
if (result.exitCode === 2) {
|
|
154
|
+
// Handle blocking error immediately and return
|
|
155
|
+
return this.handleBlockingError(event, result, messageManager, toolId, toolParameters);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Second pass: Process all non-blocking results
|
|
159
|
+
for (const result of results) {
|
|
160
|
+
if (result.exitCode === undefined) {
|
|
161
|
+
continue; // Skip results without exit codes
|
|
162
|
+
}
|
|
163
|
+
// Handle exit code interpretation
|
|
164
|
+
if (result.exitCode === 0) {
|
|
165
|
+
// Success case - handle stdout based on hook type
|
|
166
|
+
this.handleHookSuccess(event, result, messageManager);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
// Non-blocking error case (any exit code except 0 and 2)
|
|
170
|
+
this.handleNonBlockingError(result, messageManager);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return { shouldBlock: false };
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Handle successful hook execution (exit code 0)
|
|
177
|
+
*/
|
|
178
|
+
handleHookSuccess(event, result, messageManager) {
|
|
179
|
+
if (event === "UserPromptSubmit" && result.stdout?.trim()) {
|
|
180
|
+
// Inject stdout as user message context for UserPromptSubmit
|
|
181
|
+
messageManager.addUserMessage({
|
|
182
|
+
content: result.stdout.trim(),
|
|
183
|
+
source: MessageSource.HOOK,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
// For other hook types (PreToolUse, PostToolUse, Stop), ignore stdout
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Handle blocking error (exit code 2) - behavior varies by hook type
|
|
190
|
+
*/
|
|
191
|
+
handleBlockingError(event, result, messageManager, toolId, toolParameters) {
|
|
192
|
+
const errorMessage = result.stderr?.trim() || "Hook execution failed";
|
|
193
|
+
switch (event) {
|
|
194
|
+
case "UserPromptSubmit":
|
|
195
|
+
// Block prompt processing, show error to user, erase prompt
|
|
196
|
+
messageManager.addErrorBlock(errorMessage);
|
|
197
|
+
messageManager.removeLastUserMessage();
|
|
198
|
+
return {
|
|
199
|
+
shouldBlock: true,
|
|
200
|
+
errorMessage,
|
|
201
|
+
};
|
|
202
|
+
case "PreToolUse":
|
|
203
|
+
// Block tool execution and show error to Wave Agent via tool block
|
|
204
|
+
if (toolId) {
|
|
205
|
+
messageManager.updateToolBlock({
|
|
206
|
+
id: toolId,
|
|
207
|
+
parameters: toolParameters || "",
|
|
208
|
+
result: errorMessage,
|
|
209
|
+
success: false,
|
|
210
|
+
error: "Hook blocked tool execution",
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
return { shouldBlock: true };
|
|
214
|
+
case "PostToolUse":
|
|
215
|
+
// Show error to Wave Agent via user message and allow AI to continue
|
|
216
|
+
messageManager.addUserMessage({
|
|
217
|
+
content: errorMessage,
|
|
218
|
+
source: MessageSource.HOOK,
|
|
219
|
+
});
|
|
220
|
+
return { shouldBlock: false };
|
|
221
|
+
case "Stop":
|
|
222
|
+
// Show error to Wave Agent via user message and block stopping to continue conversation
|
|
223
|
+
messageManager.addUserMessage({
|
|
224
|
+
content: errorMessage,
|
|
225
|
+
source: MessageSource.HOOK,
|
|
226
|
+
});
|
|
227
|
+
return { shouldBlock: true, errorMessage };
|
|
228
|
+
default:
|
|
229
|
+
return { shouldBlock: false };
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Handle non-blocking error (other exit codes)
|
|
234
|
+
*/
|
|
235
|
+
handleNonBlockingError(result, messageManager) {
|
|
236
|
+
const errorMessage = result.stderr?.trim() || "Hook execution failed";
|
|
237
|
+
messageManager.addErrorBlock(errorMessage);
|
|
238
|
+
}
|
|
144
239
|
/**
|
|
145
240
|
* Check if hooks are configured for an event/tool combination
|
|
146
241
|
*/
|
|
@@ -347,7 +442,7 @@ export class HookManager {
|
|
|
347
442
|
}
|
|
348
443
|
// Validate commands
|
|
349
444
|
config.hooks.forEach((hookCommand, cmdIndex) => {
|
|
350
|
-
if (!
|
|
445
|
+
if (!isCommandSafe(hookCommand.command)) {
|
|
351
446
|
errors.push(`${prefix}.hooks[${cmdIndex}]: Command may be unsafe: ${hookCommand.command}`);
|
|
352
447
|
}
|
|
353
448
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ChatCompletionFunctionTool } from "openai/resources.js";
|
|
2
2
|
import type { ToolPlugin, ToolResult, ToolContext } from "../tools/types.js";
|
|
3
|
-
import type { Logger, McpServerConfig, McpConfig, McpTool, McpServerStatus } from "../types.js";
|
|
3
|
+
import type { Logger, McpServerConfig, McpConfig, McpTool, McpServerStatus } from "../types/index.js";
|
|
4
4
|
export interface McpManagerCallbacks {
|
|
5
5
|
onServersChange?: (servers: McpServerStatus[]) => void;
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpManager.d.ts","sourceRoot":"","sources":["../../src/managers/mcpManager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEjE,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,KAAK,EACV,MAAM,EACN,eAAe,EACf,SAAS,EACT,OAAO,EACP,eAAe,EAChB,MAAM,
|
|
1
|
+
{"version":3,"file":"mcpManager.d.ts","sourceRoot":"","sources":["../../src/managers/mcpManager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEjE,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,KAAK,EACV,MAAM,EACN,eAAe,EACf,SAAS,EACT,OAAO,EACP,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;CACxD;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,OAAO,GAAE,iBAAsB;IAK3C;;OAEG;IACG,UAAU,CACd,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,OAAe,GAC3B,OAAO,CAAC,IAAI,CAAC;IA4CV,kBAAkB,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAO/C,UAAU,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IA0CvC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrD,SAAS,IAAI,SAAS,GAAG,IAAI;IAI7B,aAAa,IAAI,eAAe,EAAE;IAIlC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIpD,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IASzE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO;IAyBzD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAgB7B,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4F7C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2BtD,oBAAoB,IAAI,OAAO,EAAE;IAW3B,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACtD,CAAC;IAoEI,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B;;OAEG;IACH,iBAAiB,IAAI,UAAU,EAAE;IAuBjC;;OAEG;IACH,iBAAiB,IAAI,0BAA0B,EAAE;IAIjD;;OAEG;IACG,wBAAwB,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC;IActB;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAIjC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type AgentToolBlockUpdateParams } from "../utils/messageOperations.js";
|
|
2
|
-
import type { Logger, Message, Usage } from "../types.js";
|
|
1
|
+
import { UserMessageParams, type AgentToolBlockUpdateParams } from "../utils/messageOperations.js";
|
|
2
|
+
import type { Logger, Message, Usage } from "../types/index.js";
|
|
3
3
|
import { ChatCompletionMessageFunctionToolCall } from "openai/resources.js";
|
|
4
4
|
export interface MessageManagerCallbacks {
|
|
5
5
|
onMessagesChange?: (messages: Message[]) => void;
|
|
@@ -7,10 +7,7 @@ export interface MessageManagerCallbacks {
|
|
|
7
7
|
onLatestTotalTokensChange?: (latestTotalTokens: number) => void;
|
|
8
8
|
onUserInputHistoryChange?: (history: string[]) => void;
|
|
9
9
|
onUsagesChange?: (usages: Usage[]) => void;
|
|
10
|
-
onUserMessageAdded?: (
|
|
11
|
-
path: string;
|
|
12
|
-
mimeType: string;
|
|
13
|
-
}>) => void;
|
|
10
|
+
onUserMessageAdded?: (params: UserMessageParams) => void;
|
|
14
11
|
onAssistantMessageAdded?: (content?: string, toolCalls?: ChatCompletionMessageFunctionToolCall[]) => void;
|
|
15
12
|
onToolBlockUpdated?: (params: AgentToolBlockUpdateParams) => void;
|
|
16
13
|
onDiffBlockAdded?: (filePath: string, diffResult: string) => void;
|
|
@@ -18,12 +15,15 @@ export interface MessageManagerCallbacks {
|
|
|
18
15
|
onCompressBlockAdded?: (insertIndex: number, content: string) => void;
|
|
19
16
|
onCompressionStateChange?: (isCompressing: boolean) => void;
|
|
20
17
|
onMemoryBlockAdded?: (content: string, success: boolean, type: "project" | "user", storagePath: string) => void;
|
|
21
|
-
onCustomCommandAdded?: (commandName: string, content: string, originalInput?: string) => void;
|
|
22
18
|
onAddCommandOutputMessage?: (command: string) => void;
|
|
23
19
|
onUpdateCommandOutputMessage?: (command: string, output: string) => void;
|
|
24
20
|
onCompleteCommandMessage?: (command: string, exitCode: number) => void;
|
|
25
|
-
onSubAgentBlockAdded?: (subagentId: string
|
|
26
|
-
|
|
21
|
+
onSubAgentBlockAdded?: (subagentId: string, parameters: {
|
|
22
|
+
description: string;
|
|
23
|
+
prompt: string;
|
|
24
|
+
subagent_type: string;
|
|
25
|
+
}) => void;
|
|
26
|
+
onSubAgentBlockUpdated?: (subagentId: string, messages: Message[], status: "active" | "completed" | "error" | "aborted") => void;
|
|
27
27
|
}
|
|
28
28
|
export interface MessageManagerOptions {
|
|
29
29
|
callbacks: MessageManagerCallbacks;
|
|
@@ -70,11 +70,7 @@ export declare class MessageManager {
|
|
|
70
70
|
initializeFromSession(sessionId: string, messages: Message[], latestTotalTokens: number): void;
|
|
71
71
|
addToInputHistory(input: string): void;
|
|
72
72
|
clearInputHistory(): void;
|
|
73
|
-
addUserMessage(
|
|
74
|
-
path: string;
|
|
75
|
-
mimeType: string;
|
|
76
|
-
}>): void;
|
|
77
|
-
addCustomCommandMessage(commandName: string, content: string, originalInput?: string): void;
|
|
73
|
+
addUserMessage(params: UserMessageParams): void;
|
|
78
74
|
addAssistantMessage(content?: string, toolCalls?: ChatCompletionMessageFunctionToolCall[], usage?: Usage): void;
|
|
79
75
|
updateToolBlock(params: AgentToolBlockUpdateParams): void;
|
|
80
76
|
addDiffBlock(filePath: string, diffResult: Array<{
|
|
@@ -91,7 +87,11 @@ export declare class MessageManager {
|
|
|
91
87
|
addCommandOutputMessage(command: string): void;
|
|
92
88
|
updateCommandOutputMessage(command: string, output: string): void;
|
|
93
89
|
completeCommandMessage(command: string, exitCode: number): void;
|
|
94
|
-
addSubagentBlock(subagentId: string, subagentName: string, status
|
|
90
|
+
addSubagentBlock(subagentId: string, subagentName: string, status: "active" | "completed" | "error" | undefined, subagentMessages: Message[] | undefined, parameters: {
|
|
91
|
+
description: string;
|
|
92
|
+
prompt: string;
|
|
93
|
+
subagent_type: string;
|
|
94
|
+
}): void;
|
|
95
95
|
updateSubagentBlock(subagentId: string, updates: Partial<{
|
|
96
96
|
status: "active" | "completed" | "error" | "aborted";
|
|
97
97
|
messages: Message[];
|
|
@@ -100,5 +100,10 @@ export declare class MessageManager {
|
|
|
100
100
|
* Trigger usage change callback with all usage data from assistant messages
|
|
101
101
|
*/
|
|
102
102
|
triggerUsageChange(): void;
|
|
103
|
+
/**
|
|
104
|
+
* Remove the last user message from the conversation
|
|
105
|
+
* Used for hook error handling when the user prompt needs to be erased
|
|
106
|
+
*/
|
|
107
|
+
removeLastUserMessage(): void;
|
|
103
108
|
}
|
|
104
109
|
//# sourceMappingURL=messageManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageManager.d.ts","sourceRoot":"","sources":["../../src/managers/messageManager.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"messageManager.d.ts","sourceRoot":"","sources":["../../src/managers/messageManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from "crypto";
|
|
2
|
-
import { addAssistantMessageToMessages, updateToolBlockInMessage, addErrorBlockToMessage, addDiffBlockToMessage, addUserMessageToMessages, extractUserInputHistory, addMemoryBlockToMessage, addCommandOutputMessage, updateCommandOutputInMessage, completeCommandInMessage, addSubagentBlockToMessage, updateSubagentBlockInMessage, } from "../utils/messageOperations.js";
|
|
2
|
+
import { addAssistantMessageToMessages, updateToolBlockInMessage, addErrorBlockToMessage, addDiffBlockToMessage, addUserMessageToMessages, extractUserInputHistory, addMemoryBlockToMessage, addCommandOutputMessage, updateCommandOutputInMessage, completeCommandInMessage, addSubagentBlockToMessage, updateSubagentBlockInMessage, removeLastUserMessage, } from "../utils/messageOperations.js";
|
|
3
3
|
import { cleanupExpiredSessions, getLatestSession, loadSession, saveSession, getSessionFilePath, } from "../services/session.js";
|
|
4
4
|
export class MessageManager {
|
|
5
5
|
constructor(options) {
|
|
@@ -60,7 +60,7 @@ export class MessageManager {
|
|
|
60
60
|
await cleanupExpiredSessions(this.workdir, this.sessionDir);
|
|
61
61
|
}
|
|
62
62
|
catch (error) {
|
|
63
|
-
|
|
63
|
+
this.logger?.warn("Failed to cleanup expired sessions:", error);
|
|
64
64
|
}
|
|
65
65
|
if (!restoreSessionId && !continueLastSession) {
|
|
66
66
|
return;
|
|
@@ -135,28 +135,13 @@ export class MessageManager {
|
|
|
135
135
|
this.setUserInputHistory([]);
|
|
136
136
|
}
|
|
137
137
|
// Encapsulated message operation functions
|
|
138
|
-
addUserMessage(
|
|
138
|
+
addUserMessage(params) {
|
|
139
139
|
const newMessages = addUserMessageToMessages({
|
|
140
140
|
messages: this.messages,
|
|
141
|
-
|
|
142
|
-
images,
|
|
143
|
-
});
|
|
144
|
-
this.setMessages(newMessages);
|
|
145
|
-
this.callbacks.onUserMessageAdded?.(content, images);
|
|
146
|
-
}
|
|
147
|
-
addCustomCommandMessage(commandName, content, originalInput) {
|
|
148
|
-
const newMessages = addUserMessageToMessages({
|
|
149
|
-
messages: this.messages,
|
|
150
|
-
content: "", // Empty content, as we will use CustomCommandBlock
|
|
151
|
-
customCommandBlock: {
|
|
152
|
-
type: "custom_command",
|
|
153
|
-
commandName,
|
|
154
|
-
content,
|
|
155
|
-
originalInput,
|
|
156
|
-
},
|
|
141
|
+
...params,
|
|
157
142
|
});
|
|
158
143
|
this.setMessages(newMessages);
|
|
159
|
-
this.callbacks.
|
|
144
|
+
this.callbacks.onUserMessageAdded?.(params);
|
|
160
145
|
}
|
|
161
146
|
addAssistantMessage(content, toolCalls, usage) {
|
|
162
147
|
const newMessages = addAssistantMessageToMessages(this.messages, content, toolCalls, usage);
|
|
@@ -166,14 +151,15 @@ export class MessageManager {
|
|
|
166
151
|
updateToolBlock(params) {
|
|
167
152
|
const newMessages = updateToolBlockInMessage({
|
|
168
153
|
messages: this.messages,
|
|
169
|
-
id: params.
|
|
170
|
-
parameters: params.
|
|
154
|
+
id: params.id,
|
|
155
|
+
parameters: params.parameters,
|
|
171
156
|
result: params.result,
|
|
172
157
|
success: params.success,
|
|
173
158
|
error: params.error,
|
|
174
159
|
isRunning: params.isRunning,
|
|
175
160
|
name: params.name,
|
|
176
161
|
shortResult: params.shortResult,
|
|
162
|
+
images: params.images,
|
|
177
163
|
compactParams: params.compactParams,
|
|
178
164
|
});
|
|
179
165
|
this.setMessages(newMessages);
|
|
@@ -264,7 +250,7 @@ export class MessageManager {
|
|
|
264
250
|
this.callbacks.onCompleteCommandMessage?.(command, exitCode);
|
|
265
251
|
}
|
|
266
252
|
// Subagent block methods
|
|
267
|
-
addSubagentBlock(subagentId, subagentName, status = "active", subagentMessages = []) {
|
|
253
|
+
addSubagentBlock(subagentId, subagentName, status = "active", subagentMessages = [], parameters) {
|
|
268
254
|
const params = {
|
|
269
255
|
messages: this.messages,
|
|
270
256
|
subagentId,
|
|
@@ -274,7 +260,7 @@ export class MessageManager {
|
|
|
274
260
|
};
|
|
275
261
|
const updatedMessages = addSubagentBlockToMessage(params);
|
|
276
262
|
this.setMessages(updatedMessages);
|
|
277
|
-
this.callbacks.onSubAgentBlockAdded?.(params.subagentId);
|
|
263
|
+
this.callbacks.onSubAgentBlockAdded?.(params.subagentId, parameters);
|
|
278
264
|
}
|
|
279
265
|
updateSubagentBlock(subagentId, updates) {
|
|
280
266
|
const updatedMessages = updateSubagentBlockInMessage(this.messages, subagentId, updates);
|
|
@@ -285,7 +271,7 @@ export class MessageManager {
|
|
|
285
271
|
status: updates.status || "active",
|
|
286
272
|
subagentMessages: updates.messages || [],
|
|
287
273
|
};
|
|
288
|
-
this.callbacks.onSubAgentBlockUpdated?.(params.subagentId, params.messages);
|
|
274
|
+
this.callbacks.onSubAgentBlockUpdated?.(params.subagentId, params.messages, params.status);
|
|
289
275
|
}
|
|
290
276
|
/**
|
|
291
277
|
* Trigger usage change callback with all usage data from assistant messages
|
|
@@ -299,4 +285,12 @@ export class MessageManager {
|
|
|
299
285
|
}
|
|
300
286
|
this.callbacks.onUsagesChange?.(usages);
|
|
301
287
|
}
|
|
288
|
+
/**
|
|
289
|
+
* Remove the last user message from the conversation
|
|
290
|
+
* Used for hook error handling when the user prompt needs to be erased
|
|
291
|
+
*/
|
|
292
|
+
removeLastUserMessage() {
|
|
293
|
+
const newMessages = removeLastUserMessage(this.messages);
|
|
294
|
+
this.setMessages(newMessages);
|
|
295
|
+
}
|
|
302
296
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SkillManagerOptions, SkillMetadata, Skill, SkillToolArgs, SkillInvocationContext } from "../types.js";
|
|
1
|
+
import type { SkillManagerOptions, SkillMetadata, Skill, SkillToolArgs, SkillInvocationContext } from "../types/index.js";
|
|
2
2
|
/**
|
|
3
3
|
* Manages skill discovery and loading
|
|
4
4
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillManager.d.ts","sourceRoot":"","sources":["../../src/managers/skillManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,KAAK,EAGL,aAAa,EACb,sBAAsB,EAEvB,MAAM,
|
|
1
|
+
{"version":3,"file":"skillManager.d.ts","sourceRoot":"","sources":["../../src/managers/skillManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,KAAK,EAGL,aAAa,EACb,sBAAsB,EAEvB,MAAM,mBAAmB,CAAC;AAG3B;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAS;IAExB,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,GAAE,mBAAwB;IAO7C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCjC;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,kBAAkB,IAAI,aAAa,EAAE;IAQrC;;;OAGG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAgBzD;;OAEG;YACW,cAAc;IAkB5B;;OAEG;YACW,uBAAuB;IAiFrC;;OAEG;YACW,oBAAoB;IAkBlC;;OAEG;IACG,YAAY,CAChB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,sBAAsB,CAAA;KAAE,CAAC;IAqCjE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAa9B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { MessageManager } from "./messageManager.js";
|
|
2
2
|
import type { AIManager } from "./aiManager.js";
|
|
3
|
-
import type { SlashCommand, CustomSlashCommand, Logger } from "../types.js";
|
|
3
|
+
import type { SlashCommand, CustomSlashCommand, Logger } from "../types/index.js";
|
|
4
4
|
export interface SlashCommandManagerOptions {
|
|
5
5
|
messageManager: MessageManager;
|
|
6
6
|
aiManager: AIManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slashCommandManager.d.ts","sourceRoot":"","sources":["../../src/managers/slashCommandManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"slashCommandManager.d.ts","sourceRoot":"","sources":["../../src/managers/slashCommandManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,MAAM,EACP,MAAM,mBAAmB,CAAC;AAkB3B,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,OAAO,EAAE,0BAA0B;IAU/C,OAAO,CAAC,yBAAyB;IAYjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwC1B;;OAEG;IACI,oBAAoB,IAAI,IAAI;IAWnC;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACI,WAAW,IAAI,YAAY,EAAE;IAIpC;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI9D;;OAEG;IACU,cAAc,CACzB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IAenB;;;OAGG;IACI,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG;QAClD,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf;IAeD;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI7C;;OAEG;IACI,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAI1E;;OAEG;IACI,iBAAiB,IAAI,kBAAkB,EAAE;IAIhD;;OAEG;YACW,+BAA+B;IA0E7C;;OAEG;IACI,mBAAmB,IAAI,IAAI;CAInC"}
|
|
@@ -181,11 +181,14 @@ export class SlashCommandManager {
|
|
|
181
181
|
const finalContent = bashResults.length > 0
|
|
182
182
|
? replaceBashCommandsWithOutput(processedContent, bashResults)
|
|
183
183
|
: processedContent;
|
|
184
|
-
// Add custom command
|
|
184
|
+
// Add custom command message to show the command being executed
|
|
185
185
|
const originalInput = args
|
|
186
186
|
? `/${commandName} ${args}`
|
|
187
187
|
: `/${commandName}`;
|
|
188
|
-
this.messageManager.
|
|
188
|
+
this.messageManager.addUserMessage({
|
|
189
|
+
content: originalInput,
|
|
190
|
+
customCommandContent: finalContent,
|
|
191
|
+
});
|
|
189
192
|
// Execute the AI conversation with custom configuration
|
|
190
193
|
await this.aiManager.sendAIMessage({
|
|
191
194
|
model: config?.model,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SubagentConfiguration } from "../utils/subagentParser.js";
|
|
2
|
-
import type { Message, Logger, GatewayConfig, ModelConfig, Usage } from "../types.js";
|
|
2
|
+
import type { Message, Logger, GatewayConfig, ModelConfig, Usage } from "../types/index.js";
|
|
3
3
|
import { AIManager } from "./aiManager.js";
|
|
4
4
|
import { MessageManager } from "./messageManager.js";
|
|
5
5
|
import { ToolManager } from "./toolManager.js";
|
|
@@ -10,7 +10,6 @@ export interface SubagentInstance {
|
|
|
10
10
|
messageManager: MessageManager;
|
|
11
11
|
toolManager: ToolManager;
|
|
12
12
|
status: "initializing" | "active" | "completed" | "error" | "aborted";
|
|
13
|
-
taskDescription: string;
|
|
14
13
|
messages: Message[];
|
|
15
14
|
}
|
|
16
15
|
export interface SubagentManagerOptions {
|
|
@@ -54,14 +53,18 @@ export declare class SubagentManager {
|
|
|
54
53
|
/**
|
|
55
54
|
* Create a new subagent instance with isolated managers
|
|
56
55
|
*/
|
|
57
|
-
createInstance(configuration: SubagentConfiguration,
|
|
56
|
+
createInstance(configuration: SubagentConfiguration, parameters: {
|
|
57
|
+
description: string;
|
|
58
|
+
prompt: string;
|
|
59
|
+
subagent_type: string;
|
|
60
|
+
}): Promise<SubagentInstance>;
|
|
58
61
|
/**
|
|
59
62
|
* Execute task using subagent instance
|
|
60
63
|
*
|
|
61
64
|
* IMPORTANT: This method automatically filters out the Task tool from allowedTools
|
|
62
65
|
* to prevent subagents from spawning other subagents (infinite recursion protection)
|
|
63
66
|
*/
|
|
64
|
-
executeTask(instance: SubagentInstance, prompt: string): Promise<string>;
|
|
67
|
+
executeTask(instance: SubagentInstance, prompt: string, abortSignal?: AbortSignal): Promise<string>;
|
|
65
68
|
/**
|
|
66
69
|
* Get instance by subagent ID
|
|
67
70
|
*/
|
|
@@ -74,14 +77,6 @@ export declare class SubagentManager {
|
|
|
74
77
|
* Add message to instance
|
|
75
78
|
*/
|
|
76
79
|
addMessageToInstance(subagentId: string, message: Message): void;
|
|
77
|
-
/**
|
|
78
|
-
* Abort a running subagent instance
|
|
79
|
-
*/
|
|
80
|
-
abortInstance(subagentId: string): boolean;
|
|
81
|
-
/**
|
|
82
|
-
* Abort all active subagent instances
|
|
83
|
-
*/
|
|
84
|
-
abortAllInstances(): void;
|
|
85
80
|
/**
|
|
86
81
|
* Clean up completed, errored, or aborted instances
|
|
87
82
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACN,aAAa,EACb,WAAW,EACX,KAAK,EACN,MAAM,
|
|
1
|
+
{"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACN,aAAa,EACb,WAAW,EACX,KAAK,EACN,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,cAAc,EAEf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,qBAAqB,CAAC;IACrC,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,cAAc,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;IACtE,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,WAAW,CAAC;IAC/B,oBAAoB,EAAE,cAAc,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACvC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,oBAAoB,CAAwC;IAEpE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,oBAAoB,CAAiB;IAC7C,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAC,CAAyB;gBAElC,OAAO,EAAE,sBAAsB;IAW3C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAY5D;;OAEG;IACH,iBAAiB,IAAI,qBAAqB,EAAE;IAS5C;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM;IAK/B;;OAEG;IACG,cAAc,CAClB,aAAa,EAAE,qBAAqB,EACpC,UAAU,EAAE;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;KACvB,GACA,OAAO,CAAC,gBAAgB,CAAC;IAsF5B;;;;;OAKG;IACG,WAAW,CACf,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,MAAM,CAAC;IAsGlB;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAIxD;;OAEG;IACH,oBAAoB,CAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,GACjC,IAAI;IAOP;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAOhE;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAYzC;;OAEG;IACH,kBAAkB,IAAI,gBAAgB,EAAE;IAOxC;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -49,7 +49,7 @@ export class SubagentManager {
|
|
|
49
49
|
/**
|
|
50
50
|
* Create a new subagent instance with isolated managers
|
|
51
51
|
*/
|
|
52
|
-
async createInstance(configuration,
|
|
52
|
+
async createInstance(configuration, parameters) {
|
|
53
53
|
if (!this.parentToolManager ||
|
|
54
54
|
!this.gatewayConfig ||
|
|
55
55
|
!this.modelConfig ||
|
|
@@ -106,12 +106,11 @@ export class SubagentManager {
|
|
|
106
106
|
messageManager,
|
|
107
107
|
toolManager,
|
|
108
108
|
status: "initializing",
|
|
109
|
-
taskDescription,
|
|
110
109
|
messages: [],
|
|
111
110
|
};
|
|
112
111
|
this.instances.set(subagentId, instance);
|
|
113
112
|
// Create subagent block in parent message manager
|
|
114
|
-
this.parentMessageManager.addSubagentBlock(subagentId, configuration.name, "active", []);
|
|
113
|
+
this.parentMessageManager.addSubagentBlock(subagentId, configuration.name, "active", [], parameters);
|
|
115
114
|
return instance;
|
|
116
115
|
}
|
|
117
116
|
/**
|
|
@@ -120,15 +119,29 @@ export class SubagentManager {
|
|
|
120
119
|
* IMPORTANT: This method automatically filters out the Task tool from allowedTools
|
|
121
120
|
* to prevent subagents from spawning other subagents (infinite recursion protection)
|
|
122
121
|
*/
|
|
123
|
-
async executeTask(instance, prompt) {
|
|
122
|
+
async executeTask(instance, prompt, abortSignal) {
|
|
124
123
|
try {
|
|
124
|
+
// Check if already aborted before starting
|
|
125
|
+
if (abortSignal?.aborted) {
|
|
126
|
+
throw new Error("Task was aborted before execution started");
|
|
127
|
+
}
|
|
125
128
|
// Set status to active and update parent
|
|
126
129
|
this.updateInstanceStatus(instance.subagentId, "active");
|
|
127
130
|
this.parentMessageManager.updateSubagentBlock(instance.subagentId, {
|
|
128
131
|
status: "active",
|
|
129
132
|
});
|
|
133
|
+
// Set up abort handler
|
|
134
|
+
if (abortSignal) {
|
|
135
|
+
abortSignal.addEventListener("abort", () => {
|
|
136
|
+
this.updateInstanceStatus(instance.subagentId, "aborted");
|
|
137
|
+
this.parentMessageManager.updateSubagentBlock(instance.subagentId, {
|
|
138
|
+
status: "aborted",
|
|
139
|
+
messages: instance.messages,
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
}
|
|
130
143
|
// Add the user's prompt as a message
|
|
131
|
-
instance.messageManager.addUserMessage(prompt);
|
|
144
|
+
instance.messageManager.addUserMessage({ content: prompt });
|
|
132
145
|
// Create allowed tools list - always exclude Task tool to prevent subagent recursion
|
|
133
146
|
let allowedTools = instance.configuration.tools;
|
|
134
147
|
// Always filter out the Task tool to prevent subagents from creating sub-subagents
|
|
@@ -141,12 +154,33 @@ export class SubagentManager {
|
|
|
141
154
|
allowedTools = allTools.filter((tool) => tool !== "Task");
|
|
142
155
|
}
|
|
143
156
|
// Execute the AI request with tool restrictions
|
|
144
|
-
|
|
157
|
+
// The AIManager will handle abort signals through its own abort controllers
|
|
158
|
+
// We need to abort the AI execution if the external abort signal is triggered
|
|
159
|
+
const executeAI = instance.aiManager.sendAIMessage({
|
|
145
160
|
allowedTools,
|
|
146
161
|
model: instance.configuration.model !== "inherit"
|
|
147
162
|
? instance.configuration.model
|
|
148
163
|
: undefined,
|
|
149
164
|
});
|
|
165
|
+
// If we have an abort signal, race against it
|
|
166
|
+
if (abortSignal) {
|
|
167
|
+
await Promise.race([
|
|
168
|
+
executeAI,
|
|
169
|
+
new Promise((_, reject) => {
|
|
170
|
+
if (abortSignal.aborted) {
|
|
171
|
+
reject(new Error("Task was aborted"));
|
|
172
|
+
}
|
|
173
|
+
abortSignal.addEventListener("abort", () => {
|
|
174
|
+
// Abort the AI execution
|
|
175
|
+
instance.aiManager.abortAIMessage();
|
|
176
|
+
reject(new Error("Task was aborted"));
|
|
177
|
+
});
|
|
178
|
+
}),
|
|
179
|
+
]);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
await executeAI;
|
|
183
|
+
}
|
|
150
184
|
// Get the latest messages to extract the response
|
|
151
185
|
const messages = instance.messageManager.getMessages();
|
|
152
186
|
const lastAssistantMessage = messages
|
|
@@ -198,44 +232,6 @@ export class SubagentManager {
|
|
|
198
232
|
instance.messages.push(message);
|
|
199
233
|
}
|
|
200
234
|
}
|
|
201
|
-
/**
|
|
202
|
-
* Abort a running subagent instance
|
|
203
|
-
*/
|
|
204
|
-
abortInstance(subagentId) {
|
|
205
|
-
const instance = this.instances.get(subagentId);
|
|
206
|
-
if (!instance) {
|
|
207
|
-
return false;
|
|
208
|
-
}
|
|
209
|
-
// Only abort active or initializing instances
|
|
210
|
-
if (instance.status !== "active" && instance.status !== "initializing") {
|
|
211
|
-
return false;
|
|
212
|
-
}
|
|
213
|
-
try {
|
|
214
|
-
// Abort the AI manager operations
|
|
215
|
-
instance.aiManager.abortAIMessage();
|
|
216
|
-
// Update status
|
|
217
|
-
this.updateInstanceStatus(subagentId, "aborted");
|
|
218
|
-
this.parentMessageManager.updateSubagentBlock(subagentId, {
|
|
219
|
-
status: "aborted",
|
|
220
|
-
messages: instance.messages,
|
|
221
|
-
});
|
|
222
|
-
this.logger?.debug(`Aborted subagent instance: ${subagentId}`);
|
|
223
|
-
return true;
|
|
224
|
-
}
|
|
225
|
-
catch (error) {
|
|
226
|
-
this.logger?.error(`Failed to abort subagent instance ${subagentId}:`, error);
|
|
227
|
-
return false;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* Abort all active subagent instances
|
|
232
|
-
*/
|
|
233
|
-
abortAllInstances() {
|
|
234
|
-
const activeInstances = this.getActiveInstances();
|
|
235
|
-
for (const instance of activeInstances) {
|
|
236
|
-
this.abortInstance(instance.subagentId);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
235
|
/**
|
|
240
236
|
* Clean up completed, errored, or aborted instances
|
|
241
237
|
*/
|
|
@@ -258,8 +254,6 @@ export class SubagentManager {
|
|
|
258
254
|
* Clean up all instances (for session end)
|
|
259
255
|
*/
|
|
260
256
|
cleanup() {
|
|
261
|
-
// Abort all active instances before cleanup
|
|
262
|
-
this.abortAllInstances();
|
|
263
257
|
this.instances.clear();
|
|
264
258
|
}
|
|
265
259
|
}
|