wave-agent-sdk 0.0.5 → 0.0.6
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 +21 -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 +84 -47
- 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} +26 -7
- package/dist/managers/hookManager.d.ts.map +1 -0
- package/dist/{hooks/manager.js → managers/hookManager.js} +107 -17
- package/dist/managers/mcpManager.d.ts +1 -1
- package/dist/managers/mcpManager.d.ts.map +1 -1
- package/dist/managers/messageManager.d.ts +17 -4
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +13 -5
- 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/subagentManager.d.ts +7 -12
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +39 -45
- 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/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 +5 -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/customCommands.d.ts +1 -1
- package/dist/utils/customCommands.d.ts.map +1 -1
- package/dist/{hooks/matcher.d.ts → utils/hookMatcher.d.ts} +1 -1
- 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 +6 -1
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +16 -0
- 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 +240 -158
- package/src/managers/backgroundBashManager.ts +1 -1
- package/src/{hooks/manager.ts → managers/hookManager.ts} +159 -26
- package/src/managers/mcpManager.ts +1 -1
- package/src/managers/messageManager.ts +36 -6
- package/src/managers/skillManager.ts +1 -1
- package/src/managers/slashCommandManager.ts +5 -1
- package/src/managers/subagentManager.ts +46 -53
- 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/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 +103 -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 +1 -1
- package/src/utils/customCommands.ts +1 -1
- package/src/utils/markdownParser.ts +1 -1
- package/src/utils/mcpUtils.ts +1 -1
- package/src/utils/messageOperations.ts +20 -1
- 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/dist/{hooks/types.js → types/hooks.js} +0 -0
- /package/dist/{hooks/matcher.js → utils/hookMatcher.js} +0 -0
- /package/src/{types.ts → types/index.ts.backup} +0 -0
- /package/src/{hooks/matcher.ts → utils/hookMatcher.ts} +0 -0
|
@@ -4,18 +4,13 @@
|
|
|
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 { loadMergedHooksConfig } from "./settings.js";
|
|
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";
|
|
11
10
|
export class HookManager {
|
|
12
|
-
constructor(workdir, matcher = new HookMatcher(),
|
|
11
|
+
constructor(workdir, matcher = new HookMatcher(), logger) {
|
|
13
12
|
this.workdir = workdir;
|
|
14
13
|
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
14
|
this.logger = logger;
|
|
20
15
|
}
|
|
21
16
|
/**
|
|
@@ -48,13 +43,15 @@ export class HookManager {
|
|
|
48
43
|
this.logger?.debug(`[HookManager] Loading configuration...`);
|
|
49
44
|
const mergedConfig = loadMergedHooksConfig(this.workdir);
|
|
50
45
|
this.logger?.debug(`[HookManager] Merged config result:`, mergedConfig);
|
|
51
|
-
this.configuration = mergedConfig;
|
|
52
|
-
// Validate the loaded configuration
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
46
|
+
this.configuration = mergedConfig || undefined;
|
|
47
|
+
// Validate the loaded configuration if it exists
|
|
48
|
+
if (mergedConfig) {
|
|
49
|
+
const validation = this.validatePartialConfiguration(mergedConfig);
|
|
50
|
+
if (!validation.valid) {
|
|
51
|
+
throw new HookConfigurationError("filesystem settings", validation.errors);
|
|
52
|
+
}
|
|
56
53
|
}
|
|
57
|
-
this.logger?.debug(`[HookManager] Configuration loaded successfully with ${Object.keys(mergedConfig).length} event types`);
|
|
54
|
+
this.logger?.debug(`[HookManager] Configuration loaded successfully with ${Object.keys(mergedConfig || {}).length} event types`);
|
|
58
55
|
}
|
|
59
56
|
catch (error) {
|
|
60
57
|
// If loading fails, start with undefined configuration (no hooks)
|
|
@@ -110,7 +107,7 @@ export class HookManager {
|
|
|
110
107
|
const hookCommand = config.hooks[commandIndex];
|
|
111
108
|
try {
|
|
112
109
|
this.logger?.debug(`[HookManager] Executing command ${commandIndex + 1}/${config.hooks.length} in configuration ${configIndex + 1}`);
|
|
113
|
-
const result = await
|
|
110
|
+
const result = await executeCommand(hookCommand.command, context);
|
|
114
111
|
results.push(result);
|
|
115
112
|
// Report individual command result
|
|
116
113
|
if (result.success) {
|
|
@@ -141,6 +138,99 @@ export class HookManager {
|
|
|
141
138
|
this.logger?.debug(`[HookManager] ${event} execution summary: ${summary}`);
|
|
142
139
|
return results;
|
|
143
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Process hook execution results and determine appropriate actions
|
|
143
|
+
* based on exit codes and hook event type
|
|
144
|
+
*/
|
|
145
|
+
processHookResults(event, results, messageManager, toolId, originalToolResult) {
|
|
146
|
+
if (!messageManager || results.length === 0) {
|
|
147
|
+
return { shouldBlock: false };
|
|
148
|
+
}
|
|
149
|
+
// First pass: Check for any blocking errors (exit code 2)
|
|
150
|
+
// Blocking errors take precedence and stop all processing
|
|
151
|
+
for (const result of results) {
|
|
152
|
+
if (result.exitCode === 2) {
|
|
153
|
+
// Handle blocking error immediately and return
|
|
154
|
+
return this.handleBlockingError(event, result, messageManager, toolId, originalToolResult);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Second pass: Process all non-blocking results
|
|
158
|
+
for (const result of results) {
|
|
159
|
+
if (result.exitCode === undefined) {
|
|
160
|
+
continue; // Skip results without exit codes
|
|
161
|
+
}
|
|
162
|
+
// Handle exit code interpretation
|
|
163
|
+
if (result.exitCode === 0) {
|
|
164
|
+
// Success case - handle stdout based on hook type
|
|
165
|
+
this.handleHookSuccess(event, result, messageManager);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
// Non-blocking error case (any exit code except 0 and 2)
|
|
169
|
+
this.handleNonBlockingError(result, messageManager);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return { shouldBlock: false };
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Handle successful hook execution (exit code 0)
|
|
176
|
+
*/
|
|
177
|
+
handleHookSuccess(event, result, messageManager) {
|
|
178
|
+
if (event === "UserPromptSubmit" && result.stdout?.trim()) {
|
|
179
|
+
// Inject stdout as user message context for UserPromptSubmit
|
|
180
|
+
messageManager.addUserMessage(result.stdout.trim());
|
|
181
|
+
}
|
|
182
|
+
// For other hook types (PreToolUse, PostToolUse, Stop), ignore stdout
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Handle blocking error (exit code 2) - behavior varies by hook type
|
|
186
|
+
*/
|
|
187
|
+
handleBlockingError(event, result, messageManager, toolId, originalToolResult) {
|
|
188
|
+
const errorMessage = result.stderr?.trim() || "Hook execution failed";
|
|
189
|
+
switch (event) {
|
|
190
|
+
case "UserPromptSubmit":
|
|
191
|
+
// Block prompt processing, show error to user, erase prompt
|
|
192
|
+
messageManager.addErrorBlock(errorMessage);
|
|
193
|
+
messageManager.removeLastUserMessage();
|
|
194
|
+
return {
|
|
195
|
+
shouldBlock: true,
|
|
196
|
+
errorMessage,
|
|
197
|
+
};
|
|
198
|
+
case "PreToolUse":
|
|
199
|
+
// Block tool execution and show error to Wave Agent via tool block
|
|
200
|
+
if (toolId) {
|
|
201
|
+
messageManager.updateToolBlock({
|
|
202
|
+
toolId,
|
|
203
|
+
result: errorMessage,
|
|
204
|
+
success: false,
|
|
205
|
+
error: "Hook blocked tool execution",
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
return { shouldBlock: true };
|
|
209
|
+
case "PostToolUse":
|
|
210
|
+
// Show error to Wave Agent via tool block, execution continues
|
|
211
|
+
if (toolId && originalToolResult !== undefined) {
|
|
212
|
+
messageManager.updateToolBlock({
|
|
213
|
+
toolId,
|
|
214
|
+
result: `${originalToolResult}\n\nHook feedback: ${errorMessage}`,
|
|
215
|
+
success: false,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
return { shouldBlock: false };
|
|
219
|
+
case "Stop":
|
|
220
|
+
// Show error to Wave Agent via user message and block stopping to continue conversation
|
|
221
|
+
messageManager.addUserMessage(errorMessage);
|
|
222
|
+
return { shouldBlock: true, errorMessage };
|
|
223
|
+
default:
|
|
224
|
+
return { shouldBlock: false };
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Handle non-blocking error (other exit codes)
|
|
229
|
+
*/
|
|
230
|
+
handleNonBlockingError(result, messageManager) {
|
|
231
|
+
const errorMessage = result.stderr?.trim() || "Hook execution failed";
|
|
232
|
+
messageManager.addErrorBlock(errorMessage);
|
|
233
|
+
}
|
|
144
234
|
/**
|
|
145
235
|
* Check if hooks are configured for an event/tool combination
|
|
146
236
|
*/
|
|
@@ -347,7 +437,7 @@ export class HookManager {
|
|
|
347
437
|
}
|
|
348
438
|
// Validate commands
|
|
349
439
|
config.hooks.forEach((hookCommand, cmdIndex) => {
|
|
350
|
-
if (!
|
|
440
|
+
if (!isCommandSafe(hookCommand.command)) {
|
|
351
441
|
errors.push(`${prefix}.hooks[${cmdIndex}]: Command may be unsafe: ${hookCommand.command}`);
|
|
352
442
|
}
|
|
353
443
|
});
|
|
@@ -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
1
|
import { type AgentToolBlockUpdateParams } from "../utils/messageOperations.js";
|
|
2
|
-
import type { Logger, Message, Usage } from "../types.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;
|
|
@@ -22,8 +22,12 @@ export interface MessageManagerCallbacks {
|
|
|
22
22
|
onAddCommandOutputMessage?: (command: string) => void;
|
|
23
23
|
onUpdateCommandOutputMessage?: (command: string, output: string) => void;
|
|
24
24
|
onCompleteCommandMessage?: (command: string, exitCode: number) => void;
|
|
25
|
-
onSubAgentBlockAdded?: (subagentId: string
|
|
26
|
-
|
|
25
|
+
onSubAgentBlockAdded?: (subagentId: string, parameters: {
|
|
26
|
+
description: string;
|
|
27
|
+
prompt: string;
|
|
28
|
+
subagent_type: string;
|
|
29
|
+
}) => void;
|
|
30
|
+
onSubAgentBlockUpdated?: (subagentId: string, messages: Message[], status: "active" | "completed" | "error" | "aborted") => void;
|
|
27
31
|
}
|
|
28
32
|
export interface MessageManagerOptions {
|
|
29
33
|
callbacks: MessageManagerCallbacks;
|
|
@@ -91,7 +95,11 @@ export declare class MessageManager {
|
|
|
91
95
|
addCommandOutputMessage(command: string): void;
|
|
92
96
|
updateCommandOutputMessage(command: string, output: string): void;
|
|
93
97
|
completeCommandMessage(command: string, exitCode: number): void;
|
|
94
|
-
addSubagentBlock(subagentId: string, subagentName: string, status
|
|
98
|
+
addSubagentBlock(subagentId: string, subagentName: string, status: "active" | "completed" | "error" | undefined, subagentMessages: Message[] | undefined, parameters: {
|
|
99
|
+
description: string;
|
|
100
|
+
prompt: string;
|
|
101
|
+
subagent_type: string;
|
|
102
|
+
}): void;
|
|
95
103
|
updateSubagentBlock(subagentId: string, updates: Partial<{
|
|
96
104
|
status: "active" | "completed" | "error" | "aborted";
|
|
97
105
|
messages: Message[];
|
|
@@ -100,5 +108,10 @@ export declare class MessageManager {
|
|
|
100
108
|
* Trigger usage change callback with all usage data from assistant messages
|
|
101
109
|
*/
|
|
102
110
|
triggerUsageChange(): void;
|
|
111
|
+
/**
|
|
112
|
+
* Remove the last user message from the conversation
|
|
113
|
+
* Used for hook error handling when the user prompt needs to be erased
|
|
114
|
+
*/
|
|
115
|
+
removeLastUserMessage(): void;
|
|
103
116
|
}
|
|
104
117
|
//# 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;
|
|
@@ -264,7 +264,7 @@ export class MessageManager {
|
|
|
264
264
|
this.callbacks.onCompleteCommandMessage?.(command, exitCode);
|
|
265
265
|
}
|
|
266
266
|
// Subagent block methods
|
|
267
|
-
addSubagentBlock(subagentId, subagentName, status = "active", subagentMessages = []) {
|
|
267
|
+
addSubagentBlock(subagentId, subagentName, status = "active", subagentMessages = [], parameters) {
|
|
268
268
|
const params = {
|
|
269
269
|
messages: this.messages,
|
|
270
270
|
subagentId,
|
|
@@ -274,7 +274,7 @@ export class MessageManager {
|
|
|
274
274
|
};
|
|
275
275
|
const updatedMessages = addSubagentBlockToMessage(params);
|
|
276
276
|
this.setMessages(updatedMessages);
|
|
277
|
-
this.callbacks.onSubAgentBlockAdded?.(params.subagentId);
|
|
277
|
+
this.callbacks.onSubAgentBlockAdded?.(params.subagentId, parameters);
|
|
278
278
|
}
|
|
279
279
|
updateSubagentBlock(subagentId, updates) {
|
|
280
280
|
const updatedMessages = updateSubagentBlockInMessage(this.messages, subagentId, updates);
|
|
@@ -285,7 +285,7 @@ export class MessageManager {
|
|
|
285
285
|
status: updates.status || "active",
|
|
286
286
|
subagentMessages: updates.messages || [],
|
|
287
287
|
};
|
|
288
|
-
this.callbacks.onSubAgentBlockUpdated?.(params.subagentId, params.messages);
|
|
288
|
+
this.callbacks.onSubAgentBlockUpdated?.(params.subagentId, params.messages, params.status);
|
|
289
289
|
}
|
|
290
290
|
/**
|
|
291
291
|
* Trigger usage change callback with all usage data from assistant messages
|
|
@@ -299,4 +299,12 @@ export class MessageManager {
|
|
|
299
299
|
}
|
|
300
300
|
this.callbacks.onUsagesChange?.(usages);
|
|
301
301
|
}
|
|
302
|
+
/**
|
|
303
|
+
* Remove the last user message from the conversation
|
|
304
|
+
* Used for hook error handling when the user prompt needs to be erased
|
|
305
|
+
*/
|
|
306
|
+
removeLastUserMessage() {
|
|
307
|
+
const newMessages = removeLastUserMessage(this.messages);
|
|
308
|
+
this.setMessages(newMessages);
|
|
309
|
+
}
|
|
302
310
|
}
|
|
@@ -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;IA2E7C;;OAEG;IACI,mBAAmB,IAAI,IAAI;CAInC"}
|
|
@@ -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,13 +119,27 @@ 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
144
|
instance.messageManager.addUserMessage(prompt);
|
|
132
145
|
// Create allowed tools list - always exclude Task tool to prevent subagent recursion
|
|
@@ -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
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ToolContext, ToolPlugin, ToolResult } from "../tools/types.js";
|
|
2
2
|
import { McpManager } from "./mcpManager.js";
|
|
3
3
|
import { ChatCompletionFunctionTool } from "openai/resources.js";
|
|
4
|
-
import type { Logger } from "../types.js";
|
|
4
|
+
import type { Logger } from "../types/index.js";
|
|
5
5
|
import type { SubagentManager } from "./subagentManager.js";
|
|
6
6
|
import type { SkillManager } from "./skillManager.js";
|
|
7
7
|
export interface ToolManagerOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolManager.d.ts","sourceRoot":"","sources":["../../src/managers/toolManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAc7E,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"toolManager.d.ts","sourceRoot":"","sources":["../../src/managers/toolManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAc7E,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,cAAM,WAAW;IACf,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,OAAO,EAAE,kBAAkB;IAKvC;;OAEG;IACI,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIvC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACI,sBAAsB,CAAC,IAAI,CAAC,EAAE;QACnC,eAAe,CAAC,EAAE,eAAe,CAAC;QAClC,YAAY,CAAC,EAAE,YAAY,CAAC;KAC7B,GAAG,IAAI;IAgCF,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC;IA2BtB,IAAI,IAAI,UAAU,EAAE;IAMpB,cAAc,IAAI,0BAA0B,EAAE;CAO/C;AAGD,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ChatCompletionMessageToolCall } from "openai/resources";
|
|
2
2
|
import { ChatCompletionMessageParam, ChatCompletionFunctionTool } from "openai/resources.js";
|
|
3
|
-
import type { GatewayConfig, ModelConfig } from "../types.js";
|
|
3
|
+
import type { GatewayConfig, ModelConfig } from "../types/index.js";
|
|
4
4
|
export interface CallAgentOptions {
|
|
5
5
|
gatewayConfig: GatewayConfig;
|
|
6
6
|
modelConfig: ModelConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiService.d.ts","sourceRoot":"","sources":["../../src/services/aiService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAEL,0BAA0B,EAC1B,0BAA0B,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"aiService.d.ts","sourceRoot":"","sources":["../../src/services/aiService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAEL,0BAA0B,EAC1B,0BAA0B,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA4DpE,MAAM,WAAW,gBAAgB;IAE/B,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IAGzB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,0BAA0B,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,6BAA6B,EAAE,CAAC;IAC7C,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAoH1B;AAED,MAAM,WAAW,uBAAuB;IAEtC,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IAGzB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CAuGjC"}
|
|
@@ -53,7 +53,14 @@ export async function callAgent(options) {
|
|
|
53
53
|
});
|
|
54
54
|
// Build system prompt content
|
|
55
55
|
let systemContent = systemPrompt ||
|
|
56
|
-
`You are an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user
|
|
56
|
+
`You are an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.
|
|
57
|
+
|
|
58
|
+
# Tool usage policy
|
|
59
|
+
- When doing file search, prefer to use the Task tool in order to reduce context usage.
|
|
60
|
+
- You should proactively use the Task tool with specialized agents when the task at hand matches the agent's description.
|
|
61
|
+
- You have the capability to call multiple tools in a single response. When multiple independent pieces of information are requested, batch your tool calls together for optimal performance. When making multiple bash tool calls, you MUST send a single message with multiple tools calls to run the calls in parallel. For example, if you need to run "git status" and "git diff", send a single message with two tool calls to run the calls in parallel.
|
|
62
|
+
|
|
63
|
+
`;
|
|
57
64
|
// Always add environment information
|
|
58
65
|
systemContent += `
|
|
59
66
|
|