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
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,18 @@ 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({
|
|
346
|
+
content,
|
|
347
|
+
images: images?.map((img) => ({
|
|
348
|
+
path: img.path,
|
|
349
|
+
mimeType: img.mimeType,
|
|
350
|
+
})),
|
|
351
|
+
});
|
|
352
|
+
// Execute UserPromptSubmit hooks after adding the user message
|
|
352
353
|
if (this.hookManager) {
|
|
353
354
|
try {
|
|
354
|
-
await this.hookManager.executeHooks("UserPromptSubmit", {
|
|
355
|
+
const hookResults = await this.hookManager.executeHooks("UserPromptSubmit", {
|
|
355
356
|
event: "UserPromptSubmit",
|
|
356
357
|
projectDir: this.workdir,
|
|
357
358
|
timestamp: new Date(),
|
|
@@ -361,17 +362,19 @@ export class Agent {
|
|
|
361
362
|
cwd: this.workdir,
|
|
362
363
|
userPrompt: content,
|
|
363
364
|
});
|
|
365
|
+
// Process hook results and determine if we should continue
|
|
366
|
+
const processResult = this.hookManager.processHookResults("UserPromptSubmit", hookResults, this.messageManager);
|
|
367
|
+
// If hook processing indicates we should block (exit code 2), stop here
|
|
368
|
+
if (processResult.shouldBlock) {
|
|
369
|
+
this.logger?.info("UserPromptSubmit hook blocked prompt processing with error:", processResult.errorMessage);
|
|
370
|
+
return; // Don't send to AI
|
|
371
|
+
}
|
|
364
372
|
}
|
|
365
373
|
catch (error) {
|
|
366
374
|
this.logger?.warn("UserPromptSubmit hooks execution failed:", error);
|
|
367
375
|
// Continue processing even if hooks fail
|
|
368
376
|
}
|
|
369
377
|
}
|
|
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
378
|
// Send AI message
|
|
376
379
|
await this.aiManager.sendAIMessage();
|
|
377
380
|
}
|
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;IA0ShB;;;OAGG;YACW,gBAAgB;IAyD9B;;;OAGG;YACW,sBAAsB;IA2DpC;;OAEG;YACW,uBAAuB;CAsDtC"}
|
|
@@ -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);
|
|
@@ -172,6 +182,7 @@ export class AIManager {
|
|
|
172
182
|
const toolCalls = [];
|
|
173
183
|
if (result.tool_calls) {
|
|
174
184
|
for (const toolCall of result.tool_calls) {
|
|
185
|
+
this.logger?.debug("ToolCall", toolCall);
|
|
175
186
|
if (toolCall.type === "function") {
|
|
176
187
|
toolCalls.push(toolCall);
|
|
177
188
|
}
|
|
@@ -197,9 +208,9 @@ export class AIManager {
|
|
|
197
208
|
}
|
|
198
209
|
}
|
|
199
210
|
if (toolCalls.length > 0) {
|
|
200
|
-
|
|
211
|
+
// Execute all tools in parallel using Promise.all
|
|
212
|
+
const toolExecutionPromises = toolCalls.map(async (functionToolCall) => {
|
|
201
213
|
const toolId = functionToolCall.id || "";
|
|
202
|
-
// Execute tool
|
|
203
214
|
try {
|
|
204
215
|
// Check if already interrupted, skip tool execution if so
|
|
205
216
|
if (abortController.signal.aborted ||
|
|
@@ -228,15 +239,20 @@ export class AIManager {
|
|
|
228
239
|
const toolName = functionToolCall.function?.name || "";
|
|
229
240
|
const compactParams = this.generateCompactParams(toolName, toolArgs);
|
|
230
241
|
this.messageManager.updateToolBlock({
|
|
231
|
-
toolId,
|
|
232
|
-
|
|
242
|
+
id: toolId,
|
|
243
|
+
parameters: JSON.stringify(toolArgs, null, 2),
|
|
233
244
|
isRunning: true, // isRunning: true
|
|
234
245
|
name: toolName,
|
|
235
246
|
compactParams,
|
|
236
247
|
});
|
|
237
248
|
try {
|
|
238
249
|
// Execute PreToolUse hooks before tool execution
|
|
239
|
-
await this.executePreToolUseHooks(toolName, toolArgs);
|
|
250
|
+
const shouldExecuteTool = await this.executePreToolUseHooks(toolName, toolArgs, toolId);
|
|
251
|
+
// If PreToolUse hooks blocked execution, skip tool execution
|
|
252
|
+
if (!shouldExecuteTool) {
|
|
253
|
+
this.logger?.info(`Tool ${toolName} execution blocked by PreToolUse hooks`);
|
|
254
|
+
return; // Skip this tool and return from this map function
|
|
255
|
+
}
|
|
240
256
|
// Create tool execution context
|
|
241
257
|
const context = {
|
|
242
258
|
abortSignal: toolAbortController.signal,
|
|
@@ -247,8 +263,8 @@ export class AIManager {
|
|
|
247
263
|
const toolResult = await this.toolManager.execute(functionToolCall.function?.name || "", toolArgs, context);
|
|
248
264
|
// Update message state - tool execution completed
|
|
249
265
|
this.messageManager.updateToolBlock({
|
|
250
|
-
toolId,
|
|
251
|
-
|
|
266
|
+
id: toolId,
|
|
267
|
+
parameters: JSON.stringify(toolArgs, null, 2),
|
|
252
268
|
result: toolResult.content ||
|
|
253
269
|
(toolResult.error ? `Error: ${toolResult.error}` : ""),
|
|
254
270
|
success: toolResult.success,
|
|
@@ -265,15 +281,15 @@ export class AIManager {
|
|
|
265
281
|
this.messageManager.addDiffBlock(toolResult.filePath, toolResult.diffResult);
|
|
266
282
|
}
|
|
267
283
|
// Execute PostToolUse hooks after successful tool completion
|
|
268
|
-
await this.executePostToolUseHooks(toolName, toolArgs, toolResult);
|
|
284
|
+
await this.executePostToolUseHooks(toolId, toolName, toolArgs, toolResult);
|
|
269
285
|
}
|
|
270
286
|
catch (toolError) {
|
|
271
287
|
const errorMessage = toolError instanceof Error
|
|
272
288
|
? toolError.message
|
|
273
289
|
: String(toolError);
|
|
274
290
|
this.messageManager.updateToolBlock({
|
|
275
|
-
toolId,
|
|
276
|
-
|
|
291
|
+
id: toolId,
|
|
292
|
+
parameters: JSON.stringify(toolArgs, null, 2),
|
|
277
293
|
result: `Tool execution failed: ${errorMessage}`,
|
|
278
294
|
success: false,
|
|
279
295
|
error: errorMessage,
|
|
@@ -284,19 +300,14 @@ export class AIManager {
|
|
|
284
300
|
}
|
|
285
301
|
}
|
|
286
302
|
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
303
|
const errorMessage = parseError instanceof Error
|
|
295
304
|
? parseError.message
|
|
296
305
|
: String(parseError);
|
|
297
306
|
this.messageManager.addErrorBlock(`Failed to parse tool arguments for ${functionToolCall.function?.name}: ${errorMessage}`);
|
|
298
307
|
}
|
|
299
|
-
}
|
|
308
|
+
});
|
|
309
|
+
// Wait for all tools to complete execution in parallel
|
|
310
|
+
await Promise.all(toolExecutionPromises);
|
|
300
311
|
}
|
|
301
312
|
// Handle token statistics and message compression
|
|
302
313
|
await this.handleTokenUsageAndCompression(result.usage, abortController);
|
|
@@ -304,10 +315,6 @@ export class AIManager {
|
|
|
304
315
|
if (toolCalls.length > 0) {
|
|
305
316
|
// Check interruption status
|
|
306
317
|
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
318
|
if (!isCurrentlyAborted) {
|
|
312
319
|
// Recursively call AI service, increment recursion depth, and pass same configuration
|
|
313
320
|
await this.sendAIMessage({
|
|
@@ -317,42 +324,47 @@ export class AIManager {
|
|
|
317
324
|
});
|
|
318
325
|
}
|
|
319
326
|
}
|
|
320
|
-
else {
|
|
321
|
-
// Clear abort controller when no tool operations
|
|
322
|
-
this.abortController = null;
|
|
323
|
-
this.toolAbortController = null;
|
|
324
|
-
}
|
|
325
327
|
}
|
|
326
328
|
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;
|
|
329
|
+
this.messageManager.addErrorBlock(error instanceof Error ? error.message : "Unknown error occurred");
|
|
338
330
|
}
|
|
339
331
|
finally {
|
|
340
|
-
// Only
|
|
332
|
+
// Only execute Stop hooks for the initial call
|
|
341
333
|
if (recursionDepth === 0) {
|
|
342
|
-
|
|
343
|
-
|
|
334
|
+
// Execute Stop hooks only if the operation was not aborted
|
|
335
|
+
const isCurrentlyAborted = abortController.signal.aborted || toolAbortController.signal.aborted;
|
|
336
|
+
if (!isCurrentlyAborted) {
|
|
337
|
+
const shouldContinue = await this.executeStopHooks();
|
|
338
|
+
// If Stop hooks indicate we should continue (due to blocking errors),
|
|
339
|
+
// restart the AI conversation cycle
|
|
340
|
+
if (shouldContinue) {
|
|
341
|
+
this.logger?.info("Stop hooks indicate issues need fixing, continuing conversation...");
|
|
342
|
+
// Restart the conversation to let AI fix the issues
|
|
343
|
+
// Use recursionDepth = 1 to prevent Stop hooks from running again in continuation
|
|
344
|
+
await this.sendAIMessage({
|
|
345
|
+
recursionDepth: 1,
|
|
346
|
+
model,
|
|
347
|
+
allowedTools,
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
// Save session after all operations (including continuation) are complete
|
|
344
352
|
await this.messageManager.saveSession();
|
|
345
|
-
//
|
|
346
|
-
|
|
353
|
+
// Clear abort controllers and loading state after all operations are complete
|
|
354
|
+
this.abortController = null;
|
|
355
|
+
this.toolAbortController = null;
|
|
356
|
+
// Set loading to false at the very end, after all operations including continuation
|
|
357
|
+
this.setIsLoading(false);
|
|
347
358
|
}
|
|
348
359
|
}
|
|
349
360
|
}
|
|
350
361
|
/**
|
|
351
362
|
* Execute Stop hooks when AI response cycle completes
|
|
363
|
+
* @returns Promise<boolean> - true if should continue conversation, false if should stop
|
|
352
364
|
*/
|
|
353
365
|
async executeStopHooks() {
|
|
354
366
|
if (!this.hookManager)
|
|
355
|
-
return;
|
|
367
|
+
return false;
|
|
356
368
|
try {
|
|
357
369
|
const context = {
|
|
358
370
|
event: "Stop",
|
|
@@ -364,6 +376,16 @@ export class AIManager {
|
|
|
364
376
|
// Stop hooks don't need toolName, toolInput, toolResponse, or userPrompt
|
|
365
377
|
};
|
|
366
378
|
const results = await this.hookManager.executeHooks("Stop", context);
|
|
379
|
+
// Process hook results to handle exit codes and appropriate responses
|
|
380
|
+
let shouldContinue = false;
|
|
381
|
+
if (results.length > 0) {
|
|
382
|
+
const processResult = this.hookManager.processHookResults("Stop", results, this.messageManager);
|
|
383
|
+
// If hook processing indicates we should block (exit code 2), continue conversation
|
|
384
|
+
if (processResult.shouldBlock) {
|
|
385
|
+
this.logger?.info("Stop hook blocked stopping with error:", processResult.errorMessage);
|
|
386
|
+
shouldContinue = true;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
367
389
|
// Log hook execution results for debugging
|
|
368
390
|
if (results.length > 0) {
|
|
369
391
|
this.logger?.debug(`Executed ${results.length} Stop hook(s):`, results.map((r) => ({
|
|
@@ -374,18 +396,21 @@ export class AIManager {
|
|
|
374
396
|
stderr: r.stderr,
|
|
375
397
|
})));
|
|
376
398
|
}
|
|
399
|
+
return shouldContinue;
|
|
377
400
|
}
|
|
378
401
|
catch (error) {
|
|
379
402
|
// Hook execution errors should not interrupt the main workflow
|
|
380
403
|
this.logger?.error("Stop hook execution failed:", error);
|
|
404
|
+
return false;
|
|
381
405
|
}
|
|
382
406
|
}
|
|
383
407
|
/**
|
|
384
408
|
* Execute PreToolUse hooks before tool execution
|
|
409
|
+
* Returns true if hooks allow tool execution, false if blocked
|
|
385
410
|
*/
|
|
386
|
-
async executePreToolUseHooks(toolName, toolInput) {
|
|
411
|
+
async executePreToolUseHooks(toolName, toolInput, toolId) {
|
|
387
412
|
if (!this.hookManager)
|
|
388
|
-
return;
|
|
413
|
+
return true;
|
|
389
414
|
try {
|
|
390
415
|
const context = {
|
|
391
416
|
event: "PreToolUse",
|
|
@@ -398,6 +423,13 @@ export class AIManager {
|
|
|
398
423
|
toolInput,
|
|
399
424
|
};
|
|
400
425
|
const results = await this.hookManager.executeHooks("PreToolUse", context);
|
|
426
|
+
// Process hook results to handle exit codes and determine if tool should be blocked
|
|
427
|
+
let shouldContinue = true;
|
|
428
|
+
if (results.length > 0) {
|
|
429
|
+
const processResult = this.hookManager.processHookResults("PreToolUse", results, this.messageManager, toolId, // Pass toolId for proper PreToolUse blocking error handling
|
|
430
|
+
JSON.stringify(toolInput || {}, null, 2));
|
|
431
|
+
shouldContinue = !processResult.shouldBlock;
|
|
432
|
+
}
|
|
401
433
|
// Log hook execution results for debugging
|
|
402
434
|
if (results.length > 0) {
|
|
403
435
|
this.logger?.debug(`Executed ${results.length} PreToolUse hook(s) for ${toolName}:`, results.map((r) => ({
|
|
@@ -408,16 +440,18 @@ export class AIManager {
|
|
|
408
440
|
stderr: r.stderr,
|
|
409
441
|
})));
|
|
410
442
|
}
|
|
443
|
+
return shouldContinue;
|
|
411
444
|
}
|
|
412
445
|
catch (error) {
|
|
413
446
|
// Hook execution errors should not interrupt the main workflow
|
|
414
447
|
this.logger?.error("PreToolUse hook execution failed:", error);
|
|
448
|
+
return true; // Allow tool execution on hook errors
|
|
415
449
|
}
|
|
416
450
|
}
|
|
417
451
|
/**
|
|
418
452
|
* Execute PostToolUse hooks after tool completion
|
|
419
453
|
*/
|
|
420
|
-
async executePostToolUseHooks(toolName, toolInput, toolResponse) {
|
|
454
|
+
async executePostToolUseHooks(toolId, toolName, toolInput, toolResponse) {
|
|
421
455
|
if (!this.hookManager)
|
|
422
456
|
return;
|
|
423
457
|
try {
|
|
@@ -433,6 +467,10 @@ export class AIManager {
|
|
|
433
467
|
toolResponse,
|
|
434
468
|
};
|
|
435
469
|
const results = await this.hookManager.executeHooks("PostToolUse", context);
|
|
470
|
+
// Process hook results to handle exit codes and update tool results
|
|
471
|
+
if (results.length > 0) {
|
|
472
|
+
this.hookManager.processHookResults("PostToolUse", results, this.messageManager, toolId);
|
|
473
|
+
}
|
|
436
474
|
// Log hook execution results for debugging
|
|
437
475
|
if (results.length > 0) {
|
|
438
476
|
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,25 +4,16 @@
|
|
|
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 {
|
|
9
|
-
import {
|
|
10
|
-
import type {
|
|
11
|
-
export
|
|
12
|
-
loadConfiguration(userHooks?: PartialHookConfiguration, projectHooks?: PartialHookConfiguration): void;
|
|
13
|
-
loadConfigurationFromSettings(): void;
|
|
14
|
-
executeHooks(event: HookEvent, context: HookExecutionContext | ExtendedHookExecutionContext): Promise<HookExecutionResult[]>;
|
|
15
|
-
hasHooks(event: HookEvent, toolName?: string): boolean;
|
|
16
|
-
validateConfiguration(config: HookConfiguration): ValidationResult;
|
|
17
|
-
getConfiguration(): PartialHookConfiguration | undefined;
|
|
18
|
-
}
|
|
19
|
-
export declare class HookManager implements IHookManager {
|
|
7
|
+
import { type HookEvent, type HookConfiguration, type PartialHookConfiguration, type HookExecutionContext, type ExtendedHookExecutionContext, type HookExecutionResult, type ValidationResult } from "../types/hooks.js";
|
|
8
|
+
import { HookMatcher } from "../utils/hookMatcher.js";
|
|
9
|
+
import type { Logger } from "../types/index.js";
|
|
10
|
+
import type { MessageManager } from "./messageManager.js";
|
|
11
|
+
export declare class HookManager {
|
|
20
12
|
private configuration;
|
|
21
13
|
private readonly matcher;
|
|
22
|
-
private readonly executor;
|
|
23
14
|
private readonly logger?;
|
|
24
15
|
private readonly workdir;
|
|
25
|
-
constructor(workdir: string, matcher?:
|
|
16
|
+
constructor(workdir: string, matcher?: HookMatcher, logger?: Logger);
|
|
26
17
|
/**
|
|
27
18
|
* Load and merge hook configurations from user and project settings
|
|
28
19
|
* Project settings take precedence over user settings
|
|
@@ -37,6 +28,26 @@ export declare class HookManager implements IHookManager {
|
|
|
37
28
|
* Execute hooks for a specific event
|
|
38
29
|
*/
|
|
39
30
|
executeHooks(event: HookEvent, context: HookExecutionContext | ExtendedHookExecutionContext): Promise<HookExecutionResult[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Process hook execution results and determine appropriate actions
|
|
33
|
+
* based on exit codes and hook event type
|
|
34
|
+
*/
|
|
35
|
+
processHookResults(event: HookEvent, results: HookExecutionResult[], messageManager?: MessageManager, toolId?: string, toolParameters?: string): {
|
|
36
|
+
shouldBlock: boolean;
|
|
37
|
+
errorMessage?: string;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Handle successful hook execution (exit code 0)
|
|
41
|
+
*/
|
|
42
|
+
private handleHookSuccess;
|
|
43
|
+
/**
|
|
44
|
+
* Handle blocking error (exit code 2) - behavior varies by hook type
|
|
45
|
+
*/
|
|
46
|
+
private handleBlockingError;
|
|
47
|
+
/**
|
|
48
|
+
* Handle non-blocking error (other exit codes)
|
|
49
|
+
*/
|
|
50
|
+
private handleNonBlockingError;
|
|
40
51
|
/**
|
|
41
52
|
* Check if hooks are configured for an event/tool combination
|
|
42
53
|
*/
|
|
@@ -87,4 +98,4 @@ export declare class HookManager implements IHookManager {
|
|
|
87
98
|
eventBreakdown: Record<HookEvent, number>;
|
|
88
99
|
};
|
|
89
100
|
}
|
|
90
|
-
//# sourceMappingURL=
|
|
101
|
+
//# sourceMappingURL=hookManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hookManager.d.ts","sourceRoot":"","sources":["../../src/managers/hookManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EAItB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAMtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,qBAAa,WAAW;IACtB,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAG/B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,WAA+B,EACxC,MAAM,CAAC,EAAE,MAAM;IAOjB;;;OAGG;IACH,iBAAiB,CACf,SAAS,CAAC,EAAE,wBAAwB,EACpC,YAAY,CAAC,EAAE,wBAAwB,GACtC,IAAI;IAyBP;;;OAGG;IACH,6BAA6B,IAAI,IAAI;IAqCrC;;OAEG;IACG,YAAY,CAChB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,oBAAoB,GAAG,4BAA4B,GAC3D,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAqHjC;;;OAGG;IACH,kBAAkB,CAChB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,mBAAmB,EAAE,EAC9B,cAAc,CAAC,EAAE,cAAc,EAC/B,MAAM,CAAC,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,GACtB;QACD,WAAW,EAAE,OAAO,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;IAuCD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAezB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAwD3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAQ9B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAWtD;;OAEG;IACH,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,gBAAgB;IA8ClE;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAyCpC;;OAEG;IACH,gBAAgB,IAAI,wBAAwB,GAAG,SAAS;IAOxD;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAI1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAmDhC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA8BhC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAa/B;;OAEG;IACH,OAAO,CAAC,aAAa;IA4BrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqC3B;;OAEG;IACH,qBAAqB,IAAI;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;KAC3C;CA2CF"}
|