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.
Files changed (140) hide show
  1. package/dist/agent.d.ts +3 -6
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +21 -21
  4. package/dist/index.d.ts +3 -2
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +3 -3
  7. package/dist/managers/aiManager.d.ts +4 -2
  8. package/dist/managers/aiManager.d.ts.map +1 -1
  9. package/dist/managers/aiManager.js +84 -47
  10. package/dist/managers/backgroundBashManager.d.ts +1 -1
  11. package/dist/managers/backgroundBashManager.d.ts.map +1 -1
  12. package/dist/{hooks/manager.d.ts → managers/hookManager.d.ts} +26 -7
  13. package/dist/managers/hookManager.d.ts.map +1 -0
  14. package/dist/{hooks/manager.js → managers/hookManager.js} +107 -17
  15. package/dist/managers/mcpManager.d.ts +1 -1
  16. package/dist/managers/mcpManager.d.ts.map +1 -1
  17. package/dist/managers/messageManager.d.ts +17 -4
  18. package/dist/managers/messageManager.d.ts.map +1 -1
  19. package/dist/managers/messageManager.js +13 -5
  20. package/dist/managers/skillManager.d.ts +1 -1
  21. package/dist/managers/skillManager.d.ts.map +1 -1
  22. package/dist/managers/slashCommandManager.d.ts +1 -1
  23. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  24. package/dist/managers/subagentManager.d.ts +7 -12
  25. package/dist/managers/subagentManager.d.ts.map +1 -1
  26. package/dist/managers/subagentManager.js +39 -45
  27. package/dist/managers/toolManager.d.ts +1 -1
  28. package/dist/managers/toolManager.d.ts.map +1 -1
  29. package/dist/services/aiService.d.ts +1 -1
  30. package/dist/services/aiService.d.ts.map +1 -1
  31. package/dist/services/aiService.js +8 -1
  32. package/dist/services/hook.d.ts +56 -0
  33. package/dist/services/hook.d.ts.map +1 -0
  34. package/dist/services/hook.js +276 -0
  35. package/dist/services/session.d.ts +1 -1
  36. package/dist/services/session.d.ts.map +1 -1
  37. package/dist/services/session.js +5 -4
  38. package/dist/tools/taskTool.d.ts.map +1 -1
  39. package/dist/tools/taskTool.js +7 -3
  40. package/dist/types/commands.d.ts +24 -0
  41. package/dist/types/commands.d.ts.map +1 -0
  42. package/dist/types/commands.js +5 -0
  43. package/dist/types/config.d.ts +13 -0
  44. package/dist/types/config.d.ts.map +1 -0
  45. package/dist/types/config.js +5 -0
  46. package/dist/types/core.d.ts +38 -0
  47. package/dist/types/core.d.ts.map +1 -0
  48. package/dist/{types.js → types/core.js} +4 -13
  49. package/dist/{hooks/types.d.ts → types/hooks.d.ts} +2 -1
  50. package/dist/types/hooks.d.ts.map +1 -0
  51. package/dist/types/index.d.ts +20 -0
  52. package/dist/types/index.d.ts.map +1 -0
  53. package/dist/types/index.js +21 -0
  54. package/dist/types/mcp.d.ts +28 -0
  55. package/dist/types/mcp.d.ts.map +1 -0
  56. package/dist/types/mcp.js +5 -0
  57. package/dist/types/messaging.d.ts +80 -0
  58. package/dist/types/messaging.d.ts.map +1 -0
  59. package/dist/types/messaging.js +5 -0
  60. package/dist/types/processes.d.ts +17 -0
  61. package/dist/types/processes.d.ts.map +1 -0
  62. package/dist/types/processes.js +5 -0
  63. package/dist/types/skills.d.ts +78 -0
  64. package/dist/types/skills.d.ts.map +1 -0
  65. package/dist/types/skills.js +17 -0
  66. package/dist/utils/configResolver.d.ts +1 -1
  67. package/dist/utils/configResolver.d.ts.map +1 -1
  68. package/dist/utils/configResolver.js +1 -1
  69. package/dist/utils/configValidator.d.ts +1 -1
  70. package/dist/utils/configValidator.d.ts.map +1 -1
  71. package/dist/utils/configValidator.js +1 -1
  72. package/dist/utils/convertMessagesForAPI.d.ts +1 -1
  73. package/dist/utils/convertMessagesForAPI.d.ts.map +1 -1
  74. package/dist/utils/customCommands.d.ts +1 -1
  75. package/dist/utils/customCommands.d.ts.map +1 -1
  76. package/dist/{hooks/matcher.d.ts → utils/hookMatcher.d.ts} +1 -1
  77. package/dist/utils/hookMatcher.d.ts.map +1 -0
  78. package/dist/utils/markdownParser.d.ts +1 -1
  79. package/dist/utils/markdownParser.d.ts.map +1 -1
  80. package/dist/utils/mcpUtils.d.ts +1 -1
  81. package/dist/utils/mcpUtils.d.ts.map +1 -1
  82. package/dist/utils/messageOperations.d.ts +6 -1
  83. package/dist/utils/messageOperations.d.ts.map +1 -1
  84. package/dist/utils/messageOperations.js +16 -0
  85. package/dist/utils/skillParser.d.ts +1 -1
  86. package/dist/utils/skillParser.d.ts.map +1 -1
  87. package/package.json +1 -1
  88. package/src/agent.ts +49 -43
  89. package/src/index.ts +3 -4
  90. package/src/managers/aiManager.ts +240 -158
  91. package/src/managers/backgroundBashManager.ts +1 -1
  92. package/src/{hooks/manager.ts → managers/hookManager.ts} +159 -26
  93. package/src/managers/mcpManager.ts +1 -1
  94. package/src/managers/messageManager.ts +36 -6
  95. package/src/managers/skillManager.ts +1 -1
  96. package/src/managers/slashCommandManager.ts +5 -1
  97. package/src/managers/subagentManager.ts +46 -53
  98. package/src/managers/toolManager.ts +1 -1
  99. package/src/services/aiService.ts +9 -2
  100. package/src/services/hook.ts +360 -0
  101. package/src/services/session.ts +6 -7
  102. package/src/tools/taskTool.ts +13 -5
  103. package/src/types/commands.ts +26 -0
  104. package/src/types/config.ts +14 -0
  105. package/src/types/core.ts +49 -0
  106. package/src/{hooks/types.ts → types/hooks.ts} +1 -0
  107. package/src/types/index.ts +23 -0
  108. package/src/types/mcp.ts +31 -0
  109. package/src/types/messaging.ts +103 -0
  110. package/src/types/processes.ts +18 -0
  111. package/src/types/skills.ts +91 -0
  112. package/src/utils/configResolver.ts +1 -1
  113. package/src/utils/configValidator.ts +5 -1
  114. package/src/utils/convertMessagesForAPI.ts +1 -1
  115. package/src/utils/customCommands.ts +1 -1
  116. package/src/utils/markdownParser.ts +1 -1
  117. package/src/utils/mcpUtils.ts +1 -1
  118. package/src/utils/messageOperations.ts +20 -1
  119. package/src/utils/skillParser.ts +1 -1
  120. package/dist/hooks/executor.d.ts +0 -56
  121. package/dist/hooks/executor.d.ts.map +0 -1
  122. package/dist/hooks/executor.js +0 -312
  123. package/dist/hooks/index.d.ts +0 -17
  124. package/dist/hooks/index.d.ts.map +0 -1
  125. package/dist/hooks/index.js +0 -14
  126. package/dist/hooks/manager.d.ts.map +0 -1
  127. package/dist/hooks/matcher.d.ts.map +0 -1
  128. package/dist/hooks/settings.d.ts +0 -46
  129. package/dist/hooks/settings.d.ts.map +0 -1
  130. package/dist/hooks/settings.js +0 -100
  131. package/dist/hooks/types.d.ts.map +0 -1
  132. package/dist/types.d.ts +0 -288
  133. package/dist/types.d.ts.map +0 -1
  134. package/src/hooks/executor.ts +0 -440
  135. package/src/hooks/index.ts +0 -52
  136. package/src/hooks/settings.ts +0 -129
  137. /package/dist/{hooks/types.js → types/hooks.js} +0 -0
  138. /package/dist/{hooks/matcher.js → utils/hookMatcher.js} +0 -0
  139. /package/src/{types.ts → types/index.ts.backup} +0 -0
  140. /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<{
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
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 "./hooks/index.js";
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, undefined, this.logger); // Initialize hooks manager
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
- // Execute UserPromptSubmit hooks before processing the prompt
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 "./hooks/index.js";
14
- export * from "./types.js";
14
+ export * from "./utils/hookMatcher.js";
15
+ export * from "./types/index.js";
15
16
  //# sourceMappingURL=index.d.ts.map
@@ -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;AAGtC,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;AAG1C,cAAc,kBAAkB,CAAC;AAGjC,cAAc,YAAY,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
- // Export hooks system
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 "../hooks/index.js";
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,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7E,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,mBAAmB,CAAC;AAGrD,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;IAkRhB;;OAEG;YACW,gBAAgB;IAmC9B;;OAEG;YACW,sBAAsB;IA0CpC;;OAEG;YACW,uBAAuB;CA2CtC"}
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
- // Create new AbortController
143
- const abortController = new AbortController();
144
- this.abortController = abortController;
145
- // Create separate AbortController for tool execution
146
- const toolAbortController = new AbortController();
147
- this.toolAbortController = toolAbortController;
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
- for (const functionToolCall of toolCalls) {
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
- // Check if error is due to user interrupt operation
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 clear loading state for the initial call
331
+ // Only execute Stop hooks for the initial call
341
332
  if (recursionDepth === 0) {
342
- this.setIsLoading(false);
343
- // Save session before executing Stop hooks
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
- // Execute Stop hooks when AI response cycle completes
346
- await this.executeStopHooks();
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,4 +1,4 @@
1
- import type { BackgroundShell } from "../types.js";
1
+ import type { BackgroundShell } from "../types/index.js";
2
2
  export interface BackgroundBashManagerCallbacks {
3
3
  onShellsChange?: (shells: BackgroundShell[]) => void;
4
4
  }
@@ -1 +1 @@
1
- {"version":3,"file":"backgroundBashManager.d.ts","sourceRoot":"","sources":["../../src/managers/backgroundBashManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,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"}
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 "./types.js";
8
- import { type IHookMatcher } from "./matcher.js";
9
- import { type IHookExecutor } from "./executor.js";
10
- import type { Logger } from "../types.js";
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, executor?: IHookExecutor, logger?: Logger);
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=manager.d.ts.map
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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"}