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.
Files changed (145) hide show
  1. package/dist/agent.d.ts +3 -6
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +24 -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 +91 -53
  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} +27 -16
  13. package/dist/managers/hookManager.d.ts.map +1 -0
  14. package/dist/{hooks/manager.js → managers/hookManager.js} +112 -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 +20 -15
  18. package/dist/managers/messageManager.d.ts.map +1 -1
  19. package/dist/managers/messageManager.js +19 -25
  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/slashCommandManager.js +5 -2
  25. package/dist/managers/subagentManager.d.ts +7 -12
  26. package/dist/managers/subagentManager.d.ts.map +1 -1
  27. package/dist/managers/subagentManager.js +40 -46
  28. package/dist/managers/toolManager.d.ts +1 -1
  29. package/dist/managers/toolManager.d.ts.map +1 -1
  30. package/dist/services/aiService.d.ts +1 -1
  31. package/dist/services/aiService.d.ts.map +1 -1
  32. package/dist/services/aiService.js +8 -1
  33. package/dist/services/hook.d.ts +56 -0
  34. package/dist/services/hook.d.ts.map +1 -0
  35. package/dist/services/hook.js +276 -0
  36. package/dist/services/session.d.ts +1 -1
  37. package/dist/services/session.d.ts.map +1 -1
  38. package/dist/services/session.js +5 -4
  39. package/dist/tools/taskTool.d.ts.map +1 -1
  40. package/dist/tools/taskTool.js +7 -3
  41. package/dist/tools/todoWriteTool.d.ts.map +1 -1
  42. package/dist/tools/todoWriteTool.js +3 -10
  43. package/dist/types/commands.d.ts +24 -0
  44. package/dist/types/commands.d.ts.map +1 -0
  45. package/dist/types/commands.js +5 -0
  46. package/dist/types/config.d.ts +13 -0
  47. package/dist/types/config.d.ts.map +1 -0
  48. package/dist/types/config.js +5 -0
  49. package/dist/types/core.d.ts +38 -0
  50. package/dist/types/core.d.ts.map +1 -0
  51. package/dist/{types.js → types/core.js} +4 -13
  52. package/dist/{hooks/types.d.ts → types/hooks.d.ts} +2 -1
  53. package/dist/types/hooks.d.ts.map +1 -0
  54. package/dist/types/index.d.ts +20 -0
  55. package/dist/types/index.d.ts.map +1 -0
  56. package/dist/types/index.js +21 -0
  57. package/dist/types/mcp.d.ts +28 -0
  58. package/dist/types/mcp.d.ts.map +1 -0
  59. package/dist/types/mcp.js +5 -0
  60. package/dist/types/messaging.d.ts +80 -0
  61. package/dist/types/messaging.d.ts.map +1 -0
  62. package/dist/types/messaging.js +9 -0
  63. package/dist/types/processes.d.ts +17 -0
  64. package/dist/types/processes.d.ts.map +1 -0
  65. package/dist/types/processes.js +5 -0
  66. package/dist/types/skills.d.ts +78 -0
  67. package/dist/types/skills.d.ts.map +1 -0
  68. package/dist/types/skills.js +17 -0
  69. package/dist/utils/configResolver.d.ts +1 -1
  70. package/dist/utils/configResolver.d.ts.map +1 -1
  71. package/dist/utils/configResolver.js +1 -1
  72. package/dist/utils/configValidator.d.ts +1 -1
  73. package/dist/utils/configValidator.d.ts.map +1 -1
  74. package/dist/utils/configValidator.js +1 -1
  75. package/dist/utils/convertMessagesForAPI.d.ts +1 -1
  76. package/dist/utils/convertMessagesForAPI.d.ts.map +1 -1
  77. package/dist/utils/convertMessagesForAPI.js +1 -8
  78. package/dist/utils/customCommands.d.ts +1 -1
  79. package/dist/utils/customCommands.d.ts.map +1 -1
  80. package/dist/{hooks/matcher.d.ts → utils/hookMatcher.d.ts} +2 -7
  81. package/dist/utils/hookMatcher.d.ts.map +1 -0
  82. package/dist/utils/markdownParser.d.ts +1 -1
  83. package/dist/utils/markdownParser.d.ts.map +1 -1
  84. package/dist/utils/mcpUtils.d.ts +1 -1
  85. package/dist/utils/mcpUtils.d.ts.map +1 -1
  86. package/dist/utils/messageOperations.d.ts +14 -21
  87. package/dist/utils/messageOperations.d.ts.map +1 -1
  88. package/dist/utils/messageOperations.js +37 -20
  89. package/dist/utils/skillParser.d.ts +1 -1
  90. package/dist/utils/skillParser.d.ts.map +1 -1
  91. package/package.json +1 -1
  92. package/src/agent.ts +49 -43
  93. package/src/index.ts +3 -4
  94. package/src/managers/aiManager.ts +241 -160
  95. package/src/managers/backgroundBashManager.ts +1 -1
  96. package/src/{hooks/manager.ts → managers/hookManager.ts} +168 -56
  97. package/src/managers/mcpManager.ts +1 -1
  98. package/src/managers/messageManager.ts +44 -44
  99. package/src/managers/skillManager.ts +1 -1
  100. package/src/managers/slashCommandManager.ts +10 -7
  101. package/src/managers/subagentManager.ts +47 -54
  102. package/src/managers/toolManager.ts +1 -1
  103. package/src/services/aiService.ts +9 -2
  104. package/src/services/hook.ts +360 -0
  105. package/src/services/session.ts +6 -7
  106. package/src/tools/taskTool.ts +13 -5
  107. package/src/tools/todoWriteTool.ts +3 -11
  108. package/src/types/commands.ts +26 -0
  109. package/src/types/config.ts +14 -0
  110. package/src/types/core.ts +49 -0
  111. package/src/{hooks/types.ts → types/hooks.ts} +1 -0
  112. package/src/types/index.ts +23 -0
  113. package/src/types/mcp.ts +31 -0
  114. package/src/types/messaging.ts +102 -0
  115. package/src/types/processes.ts +18 -0
  116. package/src/types/skills.ts +91 -0
  117. package/src/utils/configResolver.ts +1 -1
  118. package/src/utils/configValidator.ts +5 -1
  119. package/src/utils/convertMessagesForAPI.ts +2 -10
  120. package/src/utils/customCommands.ts +1 -1
  121. package/src/{hooks/matcher.ts → utils/hookMatcher.ts} +1 -12
  122. package/src/utils/markdownParser.ts +1 -1
  123. package/src/utils/mcpUtils.ts +1 -1
  124. package/src/utils/messageOperations.ts +56 -42
  125. package/src/utils/skillParser.ts +1 -1
  126. package/dist/hooks/executor.d.ts +0 -56
  127. package/dist/hooks/executor.d.ts.map +0 -1
  128. package/dist/hooks/executor.js +0 -312
  129. package/dist/hooks/index.d.ts +0 -17
  130. package/dist/hooks/index.d.ts.map +0 -1
  131. package/dist/hooks/index.js +0 -14
  132. package/dist/hooks/manager.d.ts.map +0 -1
  133. package/dist/hooks/matcher.d.ts.map +0 -1
  134. package/dist/hooks/settings.d.ts +0 -46
  135. package/dist/hooks/settings.d.ts.map +0 -1
  136. package/dist/hooks/settings.js +0 -100
  137. package/dist/hooks/types.d.ts.map +0 -1
  138. package/dist/types.d.ts +0 -288
  139. package/dist/types.d.ts.map +0 -1
  140. package/src/hooks/executor.ts +0 -440
  141. package/src/hooks/index.ts +0 -52
  142. package/src/hooks/settings.ts +0 -129
  143. package/src/types.ts +0 -357
  144. /package/dist/{hooks/types.js → types/hooks.js} +0 -0
  145. /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<{
@@ -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,18 @@ 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({
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 "./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;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
- // 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);
@@ -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
- for (const functionToolCall of toolCalls) {
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
- args: JSON.stringify(toolArgs, null, 2),
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
- args: JSON.stringify(toolArgs, null, 2),
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
- args: JSON.stringify(toolArgs, null, 2),
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
- // 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;
329
+ this.messageManager.addErrorBlock(error instanceof Error ? error.message : "Unknown error occurred");
338
330
  }
339
331
  finally {
340
- // Only clear loading state for the initial call
332
+ // Only execute Stop hooks for the initial call
341
333
  if (recursionDepth === 0) {
342
- this.setIsLoading(false);
343
- // Save session before executing Stop hooks
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
- // Execute Stop hooks when AI response cycle completes
346
- await this.executeStopHooks();
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,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,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 "./types.js";
8
- import { type IHookMatcher } from "./matcher.js";
9
- import { type IHookExecutor } from "./executor.js";
10
- import type { Logger } from "../types.js";
11
- export interface IHookManager {
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?: IHookMatcher, executor?: IHookExecutor, logger?: Logger);
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=manager.d.ts.map
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"}