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
package/dist/agent.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { type MessageManagerCallbacks } from "./managers/messageManager.js";
|
|
2
2
|
import { type McpManagerCallbacks } from "./managers/mcpManager.js";
|
|
3
3
|
import { type BackgroundBashManagerCallbacks } from "./managers/backgroundBashManager.js";
|
|
4
|
-
import type { SlashCommand, CustomSlashCommand } from "./types.js";
|
|
5
|
-
import type { Message, Logger, McpServerStatus, Usage } from "./types.js";
|
|
4
|
+
import type { SlashCommand, CustomSlashCommand } from "./types/index.js";
|
|
5
|
+
import type { Message, Logger, McpServerStatus, Usage } from "./types/index.js";
|
|
6
6
|
/**
|
|
7
7
|
* Configuration options for Agent instances
|
|
8
8
|
*
|
|
@@ -65,6 +65,7 @@ export declare class Agent {
|
|
|
65
65
|
get sessionId(): string;
|
|
66
66
|
get messages(): Message[];
|
|
67
67
|
get usages(): Usage[];
|
|
68
|
+
get sessionFilePath(): string;
|
|
68
69
|
/**
|
|
69
70
|
* Rebuild usage array from messages containing usage metadata
|
|
70
71
|
* Called during session restoration to reconstruct usage tracking
|
|
@@ -155,10 +156,6 @@ export declare class Agent {
|
|
|
155
156
|
abortBashCommand(): void;
|
|
156
157
|
/** Interrupt slash command execution */
|
|
157
158
|
abortSlashCommand(): void;
|
|
158
|
-
/** Interrupt all subagent execution */
|
|
159
|
-
abortSubagents(): void;
|
|
160
|
-
/** Interrupt specific subagent execution */
|
|
161
|
-
abortSubagent(subagentId: string): boolean;
|
|
162
159
|
/** Destroy managers, clean up resources */
|
|
163
160
|
destroy(): Promise<void>;
|
|
164
161
|
sendMessage(content: string, images?: Array<{
|
package/dist/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,8BAA8B,CAAC;AAKtC,OAAO,EAAc,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEhF,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/agent.js
CHANGED
|
@@ -7,7 +7,7 @@ import { McpManager } from "./managers/mcpManager.js";
|
|
|
7
7
|
import { BashManager } from "./managers/bashManager.js";
|
|
8
8
|
import { BackgroundBashManager, } from "./managers/backgroundBashManager.js";
|
|
9
9
|
import { SlashCommandManager } from "./managers/slashCommandManager.js";
|
|
10
|
-
import { HookManager } from "./
|
|
10
|
+
import { HookManager } from "./managers/hookManager.js";
|
|
11
11
|
import { configResolver } from "./utils/configResolver.js";
|
|
12
12
|
import { configValidator } from "./utils/configValidator.js";
|
|
13
13
|
import { SkillManager } from "./managers/skillManager.js";
|
|
@@ -50,7 +50,7 @@ export class Agent {
|
|
|
50
50
|
mcpManager: this.mcpManager,
|
|
51
51
|
logger: this.logger,
|
|
52
52
|
}); // Initialize tool registry, pass MCP manager
|
|
53
|
-
this.hookManager = new HookManager(this.workdir, undefined,
|
|
53
|
+
this.hookManager = new HookManager(this.workdir, undefined, this.logger); // Initialize hooks manager
|
|
54
54
|
// Initialize MessageManager
|
|
55
55
|
this.messageManager = new MessageManager({
|
|
56
56
|
callbacks,
|
|
@@ -112,6 +112,9 @@ export class Agent {
|
|
|
112
112
|
get usages() {
|
|
113
113
|
return [...this._usages]; // Return copy to prevent external modification
|
|
114
114
|
}
|
|
115
|
+
get sessionFilePath() {
|
|
116
|
+
return this.messageManager.getTranscriptPath();
|
|
117
|
+
}
|
|
115
118
|
/**
|
|
116
119
|
* Rebuild usage array from messages containing usage metadata
|
|
117
120
|
* Called during session restoration to reconstruct usage tracking
|
|
@@ -287,10 +290,9 @@ export class Agent {
|
|
|
287
290
|
}
|
|
288
291
|
/** Unified interrupt method, interrupts both AI messages and command execution */
|
|
289
292
|
abortMessage() {
|
|
290
|
-
this.abortAIMessage();
|
|
293
|
+
this.abortAIMessage(); // This will abort tools including Task tool (subagents)
|
|
291
294
|
this.abortBashCommand();
|
|
292
295
|
this.abortSlashCommand();
|
|
293
|
-
this.abortSubagents();
|
|
294
296
|
}
|
|
295
297
|
/** Add to input history */
|
|
296
298
|
addToInputHistory(input) {
|
|
@@ -304,21 +306,12 @@ export class Agent {
|
|
|
304
306
|
abortSlashCommand() {
|
|
305
307
|
this.slashCommandManager.abortCurrentCommand();
|
|
306
308
|
}
|
|
307
|
-
/** Interrupt all subagent execution */
|
|
308
|
-
abortSubagents() {
|
|
309
|
-
this.subagentManager.abortAllInstances();
|
|
310
|
-
}
|
|
311
|
-
/** Interrupt specific subagent execution */
|
|
312
|
-
abortSubagent(subagentId) {
|
|
313
|
-
return this.subagentManager.abortInstance(subagentId);
|
|
314
|
-
}
|
|
315
309
|
/** Destroy managers, clean up resources */
|
|
316
310
|
async destroy() {
|
|
317
311
|
await this.messageManager.saveSession();
|
|
318
|
-
this.abortAIMessage();
|
|
312
|
+
this.abortAIMessage(); // This will abort tools including Task tool (subagents)
|
|
319
313
|
this.abortBashCommand();
|
|
320
314
|
this.abortSlashCommand();
|
|
321
|
-
this.abortSubagents();
|
|
322
315
|
// Cleanup background bash manager
|
|
323
316
|
this.backgroundBashManager.cleanup();
|
|
324
317
|
// Cleanup MCP connections
|
|
@@ -348,10 +341,15 @@ export class Agent {
|
|
|
348
341
|
// Handle normal AI message
|
|
349
342
|
// Add user message to history
|
|
350
343
|
this.addToInputHistory(content);
|
|
351
|
-
//
|
|
344
|
+
// Add user message first, will automatically sync to UI
|
|
345
|
+
this.messageManager.addUserMessage(content, images?.map((img) => ({
|
|
346
|
+
path: img.path,
|
|
347
|
+
mimeType: img.mimeType,
|
|
348
|
+
})));
|
|
349
|
+
// Execute UserPromptSubmit hooks after adding the user message
|
|
352
350
|
if (this.hookManager) {
|
|
353
351
|
try {
|
|
354
|
-
await this.hookManager.executeHooks("UserPromptSubmit", {
|
|
352
|
+
const hookResults = await this.hookManager.executeHooks("UserPromptSubmit", {
|
|
355
353
|
event: "UserPromptSubmit",
|
|
356
354
|
projectDir: this.workdir,
|
|
357
355
|
timestamp: new Date(),
|
|
@@ -361,17 +359,19 @@ export class Agent {
|
|
|
361
359
|
cwd: this.workdir,
|
|
362
360
|
userPrompt: content,
|
|
363
361
|
});
|
|
362
|
+
// Process hook results and determine if we should continue
|
|
363
|
+
const processResult = this.hookManager.processHookResults("UserPromptSubmit", hookResults, this.messageManager);
|
|
364
|
+
// If hook processing indicates we should block (exit code 2), stop here
|
|
365
|
+
if (processResult.shouldBlock) {
|
|
366
|
+
this.logger?.info("UserPromptSubmit hook blocked prompt processing with error:", processResult.errorMessage);
|
|
367
|
+
return; // Don't send to AI
|
|
368
|
+
}
|
|
364
369
|
}
|
|
365
370
|
catch (error) {
|
|
366
371
|
this.logger?.warn("UserPromptSubmit hooks execution failed:", error);
|
|
367
372
|
// Continue processing even if hooks fail
|
|
368
373
|
}
|
|
369
374
|
}
|
|
370
|
-
// Add user message, will automatically sync to UI
|
|
371
|
-
this.messageManager.addUserMessage(content, images?.map((img) => ({
|
|
372
|
-
path: img.path,
|
|
373
|
-
mimeType: img.mimeType,
|
|
374
|
-
})));
|
|
375
375
|
// Send AI message
|
|
376
376
|
await this.aiManager.sendAIMessage();
|
|
377
377
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from "./services/aiService.js";
|
|
2
2
|
export * from "./services/memory.js";
|
|
3
3
|
export * from "./services/session.js";
|
|
4
|
+
export * from "./services/hook.js";
|
|
4
5
|
export * from "./agent.js";
|
|
5
6
|
export * from "./utils/bashHistory.js";
|
|
6
7
|
export * from "./utils/convertMessagesForAPI.js";
|
|
@@ -10,6 +11,6 @@ export * from "./utils/messageOperations.js";
|
|
|
10
11
|
export * from "./utils/path.js";
|
|
11
12
|
export * from "./utils/stringUtils.js";
|
|
12
13
|
export * from "./utils/customCommands.js";
|
|
13
|
-
export * from "./
|
|
14
|
-
export * from "./types.js";
|
|
14
|
+
export * from "./utils/hookMatcher.js";
|
|
15
|
+
export * from "./types/index.js";
|
|
15
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AAGnC,cAAc,YAAY,CAAC;AAG3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AAGvC,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
export * from "./services/aiService.js";
|
|
3
3
|
export * from "./services/memory.js";
|
|
4
4
|
export * from "./services/session.js";
|
|
5
|
+
export * from "./services/hook.js";
|
|
5
6
|
// Export main agent
|
|
6
7
|
export * from "./agent.js";
|
|
7
8
|
// Export all utilities
|
|
@@ -13,7 +14,6 @@ export * from "./utils/messageOperations.js";
|
|
|
13
14
|
export * from "./utils/path.js";
|
|
14
15
|
export * from "./utils/stringUtils.js";
|
|
15
16
|
export * from "./utils/customCommands.js";
|
|
16
|
-
|
|
17
|
-
export * from "./hooks/index.js";
|
|
17
|
+
export * from "./utils/hookMatcher.js";
|
|
18
18
|
// Export types
|
|
19
|
-
export * from "./types.js";
|
|
19
|
+
export * from "./types/index.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { Logger, GatewayConfig, ModelConfig, Usage } from "../types.js";
|
|
1
|
+
import type { Logger, GatewayConfig, ModelConfig, Usage } from "../types/index.js";
|
|
2
2
|
import type { ToolManager } from "./toolManager.js";
|
|
3
3
|
import type { MessageManager } from "./messageManager.js";
|
|
4
4
|
import type { BackgroundBashManager } from "./backgroundBashManager.js";
|
|
5
|
-
import type { HookManager } from "
|
|
5
|
+
import type { HookManager } from "./hookManager.js";
|
|
6
6
|
export interface AIManagerCallbacks {
|
|
7
7
|
onCompressionStateChange?: (isCompressing: boolean) => void;
|
|
8
8
|
onUsageAdded?: (usage: Usage) => void;
|
|
@@ -54,10 +54,12 @@ export declare class AIManager {
|
|
|
54
54
|
}): Promise<void>;
|
|
55
55
|
/**
|
|
56
56
|
* Execute Stop hooks when AI response cycle completes
|
|
57
|
+
* @returns Promise<boolean> - true if should continue conversation, false if should stop
|
|
57
58
|
*/
|
|
58
59
|
private executeStopHooks;
|
|
59
60
|
/**
|
|
60
61
|
* Execute PreToolUse hooks before tool execution
|
|
62
|
+
* Returns true if hooks allow tool execution, false if blocked
|
|
61
63
|
*/
|
|
62
64
|
private executePreToolUseHooks;
|
|
63
65
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiManager.d.ts","sourceRoot":"","sources":["../../src/managers/aiManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"aiManager.d.ts","sourceRoot":"","sources":["../../src/managers/aiManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,MAAM,EACN,aAAa,EACb,WAAW,EACX,KAAK,EACN,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,MAAM,WAAW,kBAAkB;IACjC,wBAAwB,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5D,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,SAAS;IACb,SAAS,EAAE,OAAO,CAAS;IAClC,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,mBAAmB,CAAgC;IAC3D,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,qBAAqB,CAAC,CAAwB;IACtD,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAS;IAG9B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,gBAAgB;IAgBrC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,SAAS,CAAqB;IAEtC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAYvB,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAItC,cAAc,IAAI,IAAI;IAuB7B,OAAO,CAAC,qBAAqB;YAqBf,8BAA8B;IAoErC,gBAAgB,IAAI,OAAO;IAI3B,gBAAgB,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI;IAOxC,aAAa,CACxB,OAAO,GAAE;QACP,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,GACL,OAAO,CAAC,IAAI,CAAC;IAyShB;;;OAGG;YACW,gBAAgB;IAyD9B;;;OAGG;YACW,sBAAsB;IA0DpC;;OAEG;YACW,uBAAuB;CAyDtC"}
|
|
@@ -139,12 +139,22 @@ export class AIManager {
|
|
|
139
139
|
if (recursionDepth === 0 && this.isLoading) {
|
|
140
140
|
return;
|
|
141
141
|
}
|
|
142
|
-
//
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
142
|
+
// Only create new AbortControllers for the initial call (recursionDepth === 0)
|
|
143
|
+
// For recursive calls, reuse existing controllers to maintain abort signal
|
|
144
|
+
let abortController;
|
|
145
|
+
let toolAbortController;
|
|
146
|
+
if (recursionDepth === 0) {
|
|
147
|
+
// Create new AbortControllers for initial call
|
|
148
|
+
abortController = new AbortController();
|
|
149
|
+
this.abortController = abortController;
|
|
150
|
+
toolAbortController = new AbortController();
|
|
151
|
+
this.toolAbortController = toolAbortController;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
// Reuse existing controllers for recursive calls
|
|
155
|
+
abortController = this.abortController;
|
|
156
|
+
toolAbortController = this.toolAbortController;
|
|
157
|
+
}
|
|
148
158
|
// Only set loading state for the initial call
|
|
149
159
|
if (recursionDepth === 0) {
|
|
150
160
|
this.setIsLoading(true);
|
|
@@ -197,9 +207,9 @@ export class AIManager {
|
|
|
197
207
|
}
|
|
198
208
|
}
|
|
199
209
|
if (toolCalls.length > 0) {
|
|
200
|
-
|
|
210
|
+
// Execute all tools in parallel using Promise.all
|
|
211
|
+
const toolExecutionPromises = toolCalls.map(async (functionToolCall) => {
|
|
201
212
|
const toolId = functionToolCall.id || "";
|
|
202
|
-
// Execute tool
|
|
203
213
|
try {
|
|
204
214
|
// Check if already interrupted, skip tool execution if so
|
|
205
215
|
if (abortController.signal.aborted ||
|
|
@@ -236,7 +246,12 @@ export class AIManager {
|
|
|
236
246
|
});
|
|
237
247
|
try {
|
|
238
248
|
// Execute PreToolUse hooks before tool execution
|
|
239
|
-
await this.executePreToolUseHooks(toolName, toolArgs);
|
|
249
|
+
const shouldExecuteTool = await this.executePreToolUseHooks(toolName, toolArgs, toolId);
|
|
250
|
+
// If PreToolUse hooks blocked execution, skip tool execution
|
|
251
|
+
if (!shouldExecuteTool) {
|
|
252
|
+
this.logger?.info(`Tool ${toolName} execution blocked by PreToolUse hooks`);
|
|
253
|
+
return; // Skip this tool and return from this map function
|
|
254
|
+
}
|
|
240
255
|
// Create tool execution context
|
|
241
256
|
const context = {
|
|
242
257
|
abortSignal: toolAbortController.signal,
|
|
@@ -265,7 +280,7 @@ export class AIManager {
|
|
|
265
280
|
this.messageManager.addDiffBlock(toolResult.filePath, toolResult.diffResult);
|
|
266
281
|
}
|
|
267
282
|
// Execute PostToolUse hooks after successful tool completion
|
|
268
|
-
await this.executePostToolUseHooks(toolName, toolArgs, toolResult);
|
|
283
|
+
await this.executePostToolUseHooks(toolId, toolName, toolArgs, toolResult);
|
|
269
284
|
}
|
|
270
285
|
catch (toolError) {
|
|
271
286
|
const errorMessage = toolError instanceof Error
|
|
@@ -284,19 +299,14 @@ export class AIManager {
|
|
|
284
299
|
}
|
|
285
300
|
}
|
|
286
301
|
catch (parseError) {
|
|
287
|
-
// Check if it's a parsing error due to interruption
|
|
288
|
-
const isAborted = abortController.signal.aborted ||
|
|
289
|
-
toolAbortController.signal.aborted;
|
|
290
|
-
if (isAborted) {
|
|
291
|
-
// If interrupted, return directly without showing error
|
|
292
|
-
return;
|
|
293
|
-
}
|
|
294
302
|
const errorMessage = parseError instanceof Error
|
|
295
303
|
? parseError.message
|
|
296
304
|
: String(parseError);
|
|
297
305
|
this.messageManager.addErrorBlock(`Failed to parse tool arguments for ${functionToolCall.function?.name}: ${errorMessage}`);
|
|
298
306
|
}
|
|
299
|
-
}
|
|
307
|
+
});
|
|
308
|
+
// Wait for all tools to complete execution in parallel
|
|
309
|
+
await Promise.all(toolExecutionPromises);
|
|
300
310
|
}
|
|
301
311
|
// Handle token statistics and message compression
|
|
302
312
|
await this.handleTokenUsageAndCompression(result.usage, abortController);
|
|
@@ -304,10 +314,6 @@ export class AIManager {
|
|
|
304
314
|
if (toolCalls.length > 0) {
|
|
305
315
|
// Check interruption status
|
|
306
316
|
const isCurrentlyAborted = abortController.signal.aborted || toolAbortController.signal.aborted;
|
|
307
|
-
// AI service call ends, clear abort controller
|
|
308
|
-
this.abortController = null;
|
|
309
|
-
// Clear tool AbortController after tool execution completes
|
|
310
|
-
this.toolAbortController = null;
|
|
311
317
|
if (!isCurrentlyAborted) {
|
|
312
318
|
// Recursively call AI service, increment recursion depth, and pass same configuration
|
|
313
319
|
await this.sendAIMessage({
|
|
@@ -317,42 +323,47 @@ export class AIManager {
|
|
|
317
323
|
});
|
|
318
324
|
}
|
|
319
325
|
}
|
|
320
|
-
else {
|
|
321
|
-
// Clear abort controller when no tool operations
|
|
322
|
-
this.abortController = null;
|
|
323
|
-
this.toolAbortController = null;
|
|
324
|
-
}
|
|
325
326
|
}
|
|
326
327
|
catch (error) {
|
|
327
|
-
|
|
328
|
-
const isAborted = abortController.signal.aborted ||
|
|
329
|
-
toolAbortController.signal.aborted ||
|
|
330
|
-
(error instanceof Error &&
|
|
331
|
-
(error.name === "AbortError" || error.message.includes("aborted")));
|
|
332
|
-
if (!isAborted) {
|
|
333
|
-
this.messageManager.addErrorBlock(error instanceof Error ? error.message : "Unknown error occurred");
|
|
334
|
-
}
|
|
335
|
-
// Reset abort controller on error
|
|
336
|
-
this.abortController = null;
|
|
337
|
-
this.toolAbortController = null;
|
|
328
|
+
this.messageManager.addErrorBlock(error instanceof Error ? error.message : "Unknown error occurred");
|
|
338
329
|
}
|
|
339
330
|
finally {
|
|
340
|
-
// Only
|
|
331
|
+
// Only execute Stop hooks for the initial call
|
|
341
332
|
if (recursionDepth === 0) {
|
|
342
|
-
|
|
343
|
-
|
|
333
|
+
// Execute Stop hooks only if the operation was not aborted
|
|
334
|
+
const isCurrentlyAborted = abortController.signal.aborted || toolAbortController.signal.aborted;
|
|
335
|
+
if (!isCurrentlyAborted) {
|
|
336
|
+
const shouldContinue = await this.executeStopHooks();
|
|
337
|
+
// If Stop hooks indicate we should continue (due to blocking errors),
|
|
338
|
+
// restart the AI conversation cycle
|
|
339
|
+
if (shouldContinue) {
|
|
340
|
+
this.logger?.info("Stop hooks indicate issues need fixing, continuing conversation...");
|
|
341
|
+
// Restart the conversation to let AI fix the issues
|
|
342
|
+
// Use recursionDepth = 1 to prevent Stop hooks from running again in continuation
|
|
343
|
+
await this.sendAIMessage({
|
|
344
|
+
recursionDepth: 1,
|
|
345
|
+
model,
|
|
346
|
+
allowedTools,
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// Save session after all operations (including continuation) are complete
|
|
344
351
|
await this.messageManager.saveSession();
|
|
345
|
-
//
|
|
346
|
-
|
|
352
|
+
// Clear abort controllers and loading state after all operations are complete
|
|
353
|
+
this.abortController = null;
|
|
354
|
+
this.toolAbortController = null;
|
|
355
|
+
// Set loading to false at the very end, after all operations including continuation
|
|
356
|
+
this.setIsLoading(false);
|
|
347
357
|
}
|
|
348
358
|
}
|
|
349
359
|
}
|
|
350
360
|
/**
|
|
351
361
|
* Execute Stop hooks when AI response cycle completes
|
|
362
|
+
* @returns Promise<boolean> - true if should continue conversation, false if should stop
|
|
352
363
|
*/
|
|
353
364
|
async executeStopHooks() {
|
|
354
365
|
if (!this.hookManager)
|
|
355
|
-
return;
|
|
366
|
+
return false;
|
|
356
367
|
try {
|
|
357
368
|
const context = {
|
|
358
369
|
event: "Stop",
|
|
@@ -364,6 +375,16 @@ export class AIManager {
|
|
|
364
375
|
// Stop hooks don't need toolName, toolInput, toolResponse, or userPrompt
|
|
365
376
|
};
|
|
366
377
|
const results = await this.hookManager.executeHooks("Stop", context);
|
|
378
|
+
// Process hook results to handle exit codes and appropriate responses
|
|
379
|
+
let shouldContinue = false;
|
|
380
|
+
if (results.length > 0) {
|
|
381
|
+
const processResult = this.hookManager.processHookResults("Stop", results, this.messageManager);
|
|
382
|
+
// If hook processing indicates we should block (exit code 2), continue conversation
|
|
383
|
+
if (processResult.shouldBlock) {
|
|
384
|
+
this.logger?.info("Stop hook blocked stopping with error:", processResult.errorMessage);
|
|
385
|
+
shouldContinue = true;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
367
388
|
// Log hook execution results for debugging
|
|
368
389
|
if (results.length > 0) {
|
|
369
390
|
this.logger?.debug(`Executed ${results.length} Stop hook(s):`, results.map((r) => ({
|
|
@@ -374,18 +395,21 @@ export class AIManager {
|
|
|
374
395
|
stderr: r.stderr,
|
|
375
396
|
})));
|
|
376
397
|
}
|
|
398
|
+
return shouldContinue;
|
|
377
399
|
}
|
|
378
400
|
catch (error) {
|
|
379
401
|
// Hook execution errors should not interrupt the main workflow
|
|
380
402
|
this.logger?.error("Stop hook execution failed:", error);
|
|
403
|
+
return false;
|
|
381
404
|
}
|
|
382
405
|
}
|
|
383
406
|
/**
|
|
384
407
|
* Execute PreToolUse hooks before tool execution
|
|
408
|
+
* Returns true if hooks allow tool execution, false if blocked
|
|
385
409
|
*/
|
|
386
|
-
async executePreToolUseHooks(toolName, toolInput) {
|
|
410
|
+
async executePreToolUseHooks(toolName, toolInput, toolId) {
|
|
387
411
|
if (!this.hookManager)
|
|
388
|
-
return;
|
|
412
|
+
return true;
|
|
389
413
|
try {
|
|
390
414
|
const context = {
|
|
391
415
|
event: "PreToolUse",
|
|
@@ -398,6 +422,12 @@ export class AIManager {
|
|
|
398
422
|
toolInput,
|
|
399
423
|
};
|
|
400
424
|
const results = await this.hookManager.executeHooks("PreToolUse", context);
|
|
425
|
+
// Process hook results to handle exit codes and determine if tool should be blocked
|
|
426
|
+
let shouldContinue = true;
|
|
427
|
+
if (results.length > 0) {
|
|
428
|
+
const processResult = this.hookManager.processHookResults("PreToolUse", results, this.messageManager, toolId);
|
|
429
|
+
shouldContinue = !processResult.shouldBlock;
|
|
430
|
+
}
|
|
401
431
|
// Log hook execution results for debugging
|
|
402
432
|
if (results.length > 0) {
|
|
403
433
|
this.logger?.debug(`Executed ${results.length} PreToolUse hook(s) for ${toolName}:`, results.map((r) => ({
|
|
@@ -408,16 +438,18 @@ export class AIManager {
|
|
|
408
438
|
stderr: r.stderr,
|
|
409
439
|
})));
|
|
410
440
|
}
|
|
441
|
+
return shouldContinue;
|
|
411
442
|
}
|
|
412
443
|
catch (error) {
|
|
413
444
|
// Hook execution errors should not interrupt the main workflow
|
|
414
445
|
this.logger?.error("PreToolUse hook execution failed:", error);
|
|
446
|
+
return true; // Allow tool execution on hook errors
|
|
415
447
|
}
|
|
416
448
|
}
|
|
417
449
|
/**
|
|
418
450
|
* Execute PostToolUse hooks after tool completion
|
|
419
451
|
*/
|
|
420
|
-
async executePostToolUseHooks(toolName, toolInput, toolResponse) {
|
|
452
|
+
async executePostToolUseHooks(toolId, toolName, toolInput, toolResponse) {
|
|
421
453
|
if (!this.hookManager)
|
|
422
454
|
return;
|
|
423
455
|
try {
|
|
@@ -433,6 +465,11 @@ export class AIManager {
|
|
|
433
465
|
toolResponse,
|
|
434
466
|
};
|
|
435
467
|
const results = await this.hookManager.executeHooks("PostToolUse", context);
|
|
468
|
+
// Process hook results to handle exit codes and update tool results
|
|
469
|
+
if (results.length > 0) {
|
|
470
|
+
const originalToolResult = toolResponse?.content || "";
|
|
471
|
+
this.hookManager.processHookResults("PostToolUse", results, this.messageManager, toolId, originalToolResult);
|
|
472
|
+
}
|
|
436
473
|
// Log hook execution results for debugging
|
|
437
474
|
if (results.length > 0) {
|
|
438
475
|
this.logger?.debug(`Executed ${results.length} PostToolUse hook(s) for ${toolName}:`, results.map((r) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backgroundBashManager.d.ts","sourceRoot":"","sources":["../../src/managers/backgroundBashManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"backgroundBashManager.d.ts","sourceRoot":"","sources":["../../src/managers/backgroundBashManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,WAAW,8BAA8B;IAC7C,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;CACtD;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,CAAC,EAAE,8BAA8B,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAsC;IACpD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,4BAA4B;IAKjD,OAAO,CAAC,kBAAkB;IAInB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAsErD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIjD,YAAY,IAAI,eAAe,EAAE;IAIjC,SAAS,CACd,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,MAAM,GACd;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAiCrD,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAmD9B,OAAO,IAAI,IAAI;CAUvB"}
|
|
@@ -4,10 +4,10 @@
|
|
|
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 { type HookEvent, type HookConfiguration, type PartialHookConfiguration, type HookExecutionContext, type ExtendedHookExecutionContext, type HookExecutionResult, type ValidationResult } from "
|
|
8
|
-
import { type IHookMatcher } from "
|
|
9
|
-
import {
|
|
10
|
-
import type {
|
|
7
|
+
import { type HookEvent, type HookConfiguration, type PartialHookConfiguration, type HookExecutionContext, type ExtendedHookExecutionContext, type HookExecutionResult, type ValidationResult } from "../types/hooks.js";
|
|
8
|
+
import { type IHookMatcher } from "../utils/hookMatcher.js";
|
|
9
|
+
import type { Logger } from "../types/index.js";
|
|
10
|
+
import type { MessageManager } from "./messageManager.js";
|
|
11
11
|
export interface IHookManager {
|
|
12
12
|
loadConfiguration(userHooks?: PartialHookConfiguration, projectHooks?: PartialHookConfiguration): void;
|
|
13
13
|
loadConfigurationFromSettings(): void;
|
|
@@ -19,10 +19,9 @@ export interface IHookManager {
|
|
|
19
19
|
export declare class HookManager implements IHookManager {
|
|
20
20
|
private configuration;
|
|
21
21
|
private readonly matcher;
|
|
22
|
-
private readonly executor;
|
|
23
22
|
private readonly logger?;
|
|
24
23
|
private readonly workdir;
|
|
25
|
-
constructor(workdir: string, matcher?: IHookMatcher,
|
|
24
|
+
constructor(workdir: string, matcher?: IHookMatcher, logger?: Logger);
|
|
26
25
|
/**
|
|
27
26
|
* Load and merge hook configurations from user and project settings
|
|
28
27
|
* Project settings take precedence over user settings
|
|
@@ -37,6 +36,26 @@ export declare class HookManager implements IHookManager {
|
|
|
37
36
|
* Execute hooks for a specific event
|
|
38
37
|
*/
|
|
39
38
|
executeHooks(event: HookEvent, context: HookExecutionContext | ExtendedHookExecutionContext): Promise<HookExecutionResult[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Process hook execution results and determine appropriate actions
|
|
41
|
+
* based on exit codes and hook event type
|
|
42
|
+
*/
|
|
43
|
+
processHookResults(event: HookEvent, results: HookExecutionResult[], messageManager?: MessageManager, toolId?: string, originalToolResult?: string): {
|
|
44
|
+
shouldBlock: boolean;
|
|
45
|
+
errorMessage?: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Handle successful hook execution (exit code 0)
|
|
49
|
+
*/
|
|
50
|
+
private handleHookSuccess;
|
|
51
|
+
/**
|
|
52
|
+
* Handle blocking error (exit code 2) - behavior varies by hook type
|
|
53
|
+
*/
|
|
54
|
+
private handleBlockingError;
|
|
55
|
+
/**
|
|
56
|
+
* Handle non-blocking error (other exit codes)
|
|
57
|
+
*/
|
|
58
|
+
private handleNonBlockingError;
|
|
40
59
|
/**
|
|
41
60
|
* Check if hooks are configured for an event/tool combination
|
|
42
61
|
*/
|
|
@@ -87,4 +106,4 @@ export declare class HookManager implements IHookManager {
|
|
|
87
106
|
eventBreakdown: Record<HookEvent, number>;
|
|
88
107
|
};
|
|
89
108
|
}
|
|
90
|
-
//# sourceMappingURL=
|
|
109
|
+
//# sourceMappingURL=hookManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hookManager.d.ts","sourceRoot":"","sources":["../../src/managers/hookManager.ts"],"names":[],"mappings":"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"}
|