wave-agent-sdk 0.0.7 → 0.0.10

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 (240) hide show
  1. package/dist/agent.d.ts +105 -24
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +438 -53
  4. package/dist/index.d.ts +4 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +4 -0
  7. package/dist/managers/aiManager.d.ts +18 -7
  8. package/dist/managers/aiManager.d.ts.map +1 -1
  9. package/dist/managers/aiManager.js +254 -142
  10. package/dist/managers/backgroundBashManager.d.ts.map +1 -1
  11. package/dist/managers/backgroundBashManager.js +11 -9
  12. package/dist/managers/hookManager.d.ts +6 -6
  13. package/dist/managers/hookManager.d.ts.map +1 -1
  14. package/dist/managers/hookManager.js +81 -39
  15. package/dist/managers/liveConfigManager.d.ts +95 -0
  16. package/dist/managers/liveConfigManager.d.ts.map +1 -0
  17. package/dist/managers/liveConfigManager.js +442 -0
  18. package/dist/managers/lspManager.d.ts +43 -0
  19. package/dist/managers/lspManager.d.ts.map +1 -0
  20. package/dist/managers/lspManager.js +326 -0
  21. package/dist/managers/messageManager.d.ts +41 -24
  22. package/dist/managers/messageManager.d.ts.map +1 -1
  23. package/dist/managers/messageManager.js +184 -73
  24. package/dist/managers/permissionManager.d.ts +66 -0
  25. package/dist/managers/permissionManager.d.ts.map +1 -0
  26. package/dist/managers/permissionManager.js +208 -0
  27. package/dist/managers/skillManager.d.ts +1 -0
  28. package/dist/managers/skillManager.d.ts.map +1 -1
  29. package/dist/managers/skillManager.js +2 -1
  30. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  31. package/dist/managers/slashCommandManager.js +4 -2
  32. package/dist/managers/subagentManager.d.ts +42 -6
  33. package/dist/managers/subagentManager.d.ts.map +1 -1
  34. package/dist/managers/subagentManager.js +213 -62
  35. package/dist/managers/toolManager.d.ts +38 -1
  36. package/dist/managers/toolManager.d.ts.map +1 -1
  37. package/dist/managers/toolManager.js +66 -2
  38. package/dist/services/aiService.d.ts +15 -5
  39. package/dist/services/aiService.d.ts.map +1 -1
  40. package/dist/services/aiService.js +446 -77
  41. package/dist/services/configurationService.d.ts +116 -0
  42. package/dist/services/configurationService.d.ts.map +1 -0
  43. package/dist/services/configurationService.js +585 -0
  44. package/dist/services/fileWatcher.d.ts +69 -0
  45. package/dist/services/fileWatcher.d.ts.map +1 -0
  46. package/dist/services/fileWatcher.js +212 -0
  47. package/dist/services/hook.d.ts +5 -40
  48. package/dist/services/hook.d.ts.map +1 -1
  49. package/dist/services/hook.js +47 -109
  50. package/dist/services/jsonlHandler.d.ts +71 -0
  51. package/dist/services/jsonlHandler.d.ts.map +1 -0
  52. package/dist/services/jsonlHandler.js +236 -0
  53. package/dist/services/memory.d.ts.map +1 -1
  54. package/dist/services/memory.js +33 -11
  55. package/dist/services/session.d.ts +116 -52
  56. package/dist/services/session.d.ts.map +1 -1
  57. package/dist/services/session.js +415 -143
  58. package/dist/tools/bashTool.d.ts.map +1 -1
  59. package/dist/tools/bashTool.js +77 -17
  60. package/dist/tools/deleteFileTool.d.ts.map +1 -1
  61. package/dist/tools/deleteFileTool.js +27 -1
  62. package/dist/tools/editTool.d.ts.map +1 -1
  63. package/dist/tools/editTool.js +33 -8
  64. package/dist/tools/lspTool.d.ts +6 -0
  65. package/dist/tools/lspTool.d.ts.map +1 -0
  66. package/dist/tools/lspTool.js +589 -0
  67. package/dist/tools/multiEditTool.d.ts.map +1 -1
  68. package/dist/tools/multiEditTool.js +30 -10
  69. package/dist/tools/readTool.d.ts.map +1 -1
  70. package/dist/tools/readTool.js +113 -3
  71. package/dist/tools/skillTool.js +2 -2
  72. package/dist/tools/todoWriteTool.d.ts.map +1 -1
  73. package/dist/tools/todoWriteTool.js +23 -0
  74. package/dist/tools/types.d.ts +11 -8
  75. package/dist/tools/types.d.ts.map +1 -1
  76. package/dist/tools/writeTool.d.ts.map +1 -1
  77. package/dist/tools/writeTool.js +30 -15
  78. package/dist/types/commands.d.ts +4 -1
  79. package/dist/types/commands.d.ts.map +1 -1
  80. package/dist/types/config.d.ts +4 -0
  81. package/dist/types/config.d.ts.map +1 -1
  82. package/dist/types/configuration.d.ts +69 -0
  83. package/dist/types/configuration.d.ts.map +1 -0
  84. package/dist/types/configuration.js +8 -0
  85. package/dist/types/core.d.ts +45 -0
  86. package/dist/types/core.d.ts.map +1 -1
  87. package/dist/types/environment.d.ts +83 -0
  88. package/dist/types/environment.d.ts.map +1 -0
  89. package/dist/types/environment.js +21 -0
  90. package/dist/types/fileSearch.d.ts +5 -0
  91. package/dist/types/fileSearch.d.ts.map +1 -0
  92. package/dist/types/fileSearch.js +1 -0
  93. package/dist/types/hooks.d.ts +18 -3
  94. package/dist/types/hooks.d.ts.map +1 -1
  95. package/dist/types/hooks.js +8 -8
  96. package/dist/types/index.d.ts +7 -0
  97. package/dist/types/index.d.ts.map +1 -1
  98. package/dist/types/index.js +7 -0
  99. package/dist/types/lsp.d.ts +90 -0
  100. package/dist/types/lsp.d.ts.map +1 -0
  101. package/dist/types/lsp.js +4 -0
  102. package/dist/types/messaging.d.ts +19 -12
  103. package/dist/types/messaging.d.ts.map +1 -1
  104. package/dist/types/permissions.d.ts +35 -0
  105. package/dist/types/permissions.d.ts.map +1 -0
  106. package/dist/types/permissions.js +12 -0
  107. package/dist/types/session.d.ts +15 -0
  108. package/dist/types/session.d.ts.map +1 -0
  109. package/dist/types/session.js +7 -0
  110. package/dist/types/skills.d.ts +1 -0
  111. package/dist/types/skills.d.ts.map +1 -1
  112. package/dist/types/tools.d.ts +35 -0
  113. package/dist/types/tools.d.ts.map +1 -0
  114. package/dist/types/tools.js +4 -0
  115. package/dist/utils/abortUtils.d.ts +34 -0
  116. package/dist/utils/abortUtils.d.ts.map +1 -0
  117. package/dist/utils/abortUtils.js +92 -0
  118. package/dist/utils/bashHistory.d.ts +4 -0
  119. package/dist/utils/bashHistory.d.ts.map +1 -1
  120. package/dist/utils/bashHistory.js +48 -30
  121. package/dist/utils/builtinSubagents.d.ts +7 -0
  122. package/dist/utils/builtinSubagents.d.ts.map +1 -0
  123. package/dist/utils/builtinSubagents.js +65 -0
  124. package/dist/utils/cacheControlUtils.d.ts +96 -0
  125. package/dist/utils/cacheControlUtils.d.ts.map +1 -0
  126. package/dist/utils/cacheControlUtils.js +324 -0
  127. package/dist/utils/commandPathResolver.d.ts +52 -0
  128. package/dist/utils/commandPathResolver.d.ts.map +1 -0
  129. package/dist/utils/commandPathResolver.js +145 -0
  130. package/dist/utils/configPaths.d.ts +85 -0
  131. package/dist/utils/configPaths.d.ts.map +1 -0
  132. package/dist/utils/configPaths.js +121 -0
  133. package/dist/utils/constants.d.ts +1 -13
  134. package/dist/utils/constants.d.ts.map +1 -1
  135. package/dist/utils/constants.js +2 -14
  136. package/dist/utils/convertMessagesForAPI.d.ts +2 -1
  137. package/dist/utils/convertMessagesForAPI.d.ts.map +1 -1
  138. package/dist/utils/convertMessagesForAPI.js +39 -18
  139. package/dist/utils/customCommands.d.ts.map +1 -1
  140. package/dist/utils/customCommands.js +66 -21
  141. package/dist/utils/fileSearch.d.ts +14 -0
  142. package/dist/utils/fileSearch.d.ts.map +1 -0
  143. package/dist/utils/fileSearch.js +88 -0
  144. package/dist/utils/fileUtils.d.ts +27 -0
  145. package/dist/utils/fileUtils.d.ts.map +1 -0
  146. package/dist/utils/fileUtils.js +145 -0
  147. package/dist/utils/globalLogger.d.ts +88 -0
  148. package/dist/utils/globalLogger.d.ts.map +1 -0
  149. package/dist/utils/globalLogger.js +120 -0
  150. package/dist/utils/largeOutputHandler.d.ts +15 -0
  151. package/dist/utils/largeOutputHandler.d.ts.map +1 -0
  152. package/dist/utils/largeOutputHandler.js +40 -0
  153. package/dist/utils/markdownParser.d.ts.map +1 -1
  154. package/dist/utils/markdownParser.js +1 -17
  155. package/dist/utils/mcpUtils.d.ts.map +1 -1
  156. package/dist/utils/mcpUtils.js +25 -3
  157. package/dist/utils/messageOperations.d.ts +20 -18
  158. package/dist/utils/messageOperations.d.ts.map +1 -1
  159. package/dist/utils/messageOperations.js +30 -38
  160. package/dist/utils/pathEncoder.d.ts +108 -0
  161. package/dist/utils/pathEncoder.d.ts.map +1 -0
  162. package/dist/utils/pathEncoder.js +279 -0
  163. package/dist/utils/subagentParser.d.ts +2 -2
  164. package/dist/utils/subagentParser.d.ts.map +1 -1
  165. package/dist/utils/subagentParser.js +12 -8
  166. package/dist/utils/tokenCalculation.d.ts +26 -0
  167. package/dist/utils/tokenCalculation.d.ts.map +1 -0
  168. package/dist/utils/tokenCalculation.js +36 -0
  169. package/dist/utils/tokenEstimator.d.ts +39 -0
  170. package/dist/utils/tokenEstimator.d.ts.map +1 -0
  171. package/dist/utils/tokenEstimator.js +55 -0
  172. package/package.json +6 -6
  173. package/src/agent.ts +586 -78
  174. package/src/index.ts +4 -0
  175. package/src/managers/aiManager.ts +341 -192
  176. package/src/managers/backgroundBashManager.ts +11 -9
  177. package/src/managers/hookManager.ts +102 -54
  178. package/src/managers/liveConfigManager.ts +634 -0
  179. package/src/managers/lspManager.ts +434 -0
  180. package/src/managers/messageManager.ts +258 -121
  181. package/src/managers/permissionManager.ts +276 -0
  182. package/src/managers/skillManager.ts +3 -1
  183. package/src/managers/slashCommandManager.ts +5 -3
  184. package/src/managers/subagentManager.ts +295 -76
  185. package/src/managers/toolManager.ts +95 -3
  186. package/src/services/aiService.ts +656 -84
  187. package/src/services/configurationService.ts +762 -0
  188. package/src/services/fileWatcher.ts +300 -0
  189. package/src/services/hook.ts +54 -144
  190. package/src/services/jsonlHandler.ts +303 -0
  191. package/src/services/memory.ts +34 -11
  192. package/src/services/session.ts +522 -173
  193. package/src/tools/bashTool.ts +94 -20
  194. package/src/tools/deleteFileTool.ts +38 -1
  195. package/src/tools/editTool.ts +44 -9
  196. package/src/tools/lspTool.ts +760 -0
  197. package/src/tools/multiEditTool.ts +41 -11
  198. package/src/tools/readTool.ts +127 -3
  199. package/src/tools/skillTool.ts +2 -2
  200. package/src/tools/todoWriteTool.ts +33 -1
  201. package/src/tools/types.ts +15 -9
  202. package/src/tools/writeTool.ts +43 -16
  203. package/src/types/commands.ts +6 -1
  204. package/src/types/config.ts +5 -0
  205. package/src/types/configuration.ts +73 -0
  206. package/src/types/core.ts +55 -0
  207. package/src/types/environment.ts +104 -0
  208. package/src/types/fileSearch.ts +4 -0
  209. package/src/types/hooks.ts +32 -16
  210. package/src/types/index.ts +7 -0
  211. package/src/types/lsp.ts +96 -0
  212. package/src/types/messaging.ts +21 -14
  213. package/src/types/permissions.ts +48 -0
  214. package/src/types/session.ts +20 -0
  215. package/src/types/skills.ts +1 -0
  216. package/src/types/tools.ts +38 -0
  217. package/src/utils/abortUtils.ts +118 -0
  218. package/src/utils/bashHistory.ts +55 -31
  219. package/src/utils/builtinSubagents.ts +71 -0
  220. package/src/utils/cacheControlUtils.ts +475 -0
  221. package/src/utils/commandPathResolver.ts +189 -0
  222. package/src/utils/configPaths.ts +163 -0
  223. package/src/utils/constants.ts +2 -17
  224. package/src/utils/convertMessagesForAPI.ts +44 -18
  225. package/src/utils/customCommands.ts +90 -22
  226. package/src/utils/fileSearch.ts +107 -0
  227. package/src/utils/fileUtils.ts +160 -0
  228. package/src/utils/globalLogger.ts +128 -0
  229. package/src/utils/largeOutputHandler.ts +55 -0
  230. package/src/utils/markdownParser.ts +1 -19
  231. package/src/utils/mcpUtils.ts +34 -3
  232. package/src/utils/messageOperations.ts +47 -53
  233. package/src/utils/pathEncoder.ts +394 -0
  234. package/src/utils/subagentParser.ts +13 -9
  235. package/src/utils/tokenCalculation.ts +43 -0
  236. package/src/utils/tokenEstimator.ts +68 -0
  237. package/dist/utils/configResolver.d.ts +0 -38
  238. package/dist/utils/configResolver.d.ts.map +0 -1
  239. package/dist/utils/configResolver.js +0 -106
  240. package/src/utils/configResolver.ts +0 -142
@@ -14,6 +14,7 @@ export class SkillManager {
14
14
  options.personalSkillsPath || join(homedir(), ".wave", "skills");
15
15
  this.scanTimeout = options.scanTimeout || 5000;
16
16
  this.logger = options.logger;
17
+ this.workdir = options.workdir || process.cwd();
17
18
  }
18
19
  /**
19
20
  * Initialize the skill manager by discovering available skills
@@ -84,7 +85,7 @@ export class SkillManager {
84
85
  */
85
86
  async discoverSkills() {
86
87
  const personalCollection = await this.discoverSkillCollection(this.personalSkillsPath, "personal");
87
- const projectCollection = await this.discoverSkillCollection(process.cwd(), "project");
88
+ const projectCollection = await this.discoverSkillCollection(this.workdir, "project");
88
89
  return {
89
90
  personalSkills: personalCollection.skills,
90
91
  projectSkills: projectCollection.skills,
@@ -1 +1 @@
1
- {"version":3,"file":"slashCommandManager.d.ts","sourceRoot":"","sources":["../../src/managers/slashCommandManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,MAAM,EACP,MAAM,mBAAmB,CAAC;AAkB3B,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,OAAO,EAAE,0BAA0B;IAU/C,OAAO,CAAC,yBAAyB;IAYjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwC1B;;OAEG;IACI,oBAAoB,IAAI,IAAI;IAWnC;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACI,WAAW,IAAI,YAAY,EAAE;IAIpC;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI9D;;OAEG;IACU,cAAc,CACzB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IAenB;;;OAGG;IACI,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG;QAClD,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf;IAeD;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI7C;;OAEG;IACI,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAI1E;;OAEG;IACI,iBAAiB,IAAI,kBAAkB,EAAE;IAIhD;;OAEG;YACW,+BAA+B;IA0E7C;;OAEG;IACI,mBAAmB,IAAI,IAAI;CAInC"}
1
+ {"version":3,"file":"slashCommandManager.d.ts","sourceRoot":"","sources":["../../src/managers/slashCommandManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,MAAM,EACP,MAAM,mBAAmB,CAAC;AAkB3B,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,OAAO,EAAE,0BAA0B;IAU/C,OAAO,CAAC,yBAAyB;IAejC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwC1B;;OAEG;IACI,oBAAoB,IAAI,IAAI;IAWnC;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACI,WAAW,IAAI,YAAY,EAAE;IAIpC;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI9D;;OAEG;IACU,cAAc,CACzB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IAenB;;;OAGG;IACI,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG;QAClD,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf;IAeD;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI7C;;OAEG;IACI,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAI1E;;OAEG;IACI,iBAAiB,IAAI,kBAAkB,EAAE;IAIhD;;OAEG;YACW,+BAA+B;IAyE7C;;OAEG;IACI,mBAAmB,IAAI,IAAI;CAInC"}
@@ -20,9 +20,12 @@ export class SlashCommandManager {
20
20
  this.registerCommand({
21
21
  id: "clear",
22
22
  name: "clear",
23
- description: "Clear the chat session",
23
+ description: "Clear the chat session and terminal",
24
24
  handler: () => {
25
+ // Clear chat messages
25
26
  this.messageManager.clearMessages();
27
+ // Clear terminal screen
28
+ process.stdout.write("\x1Bc");
26
29
  },
27
30
  });
28
31
  }
@@ -192,7 +195,6 @@ export class SlashCommandManager {
192
195
  // Execute the AI conversation with custom configuration
193
196
  await this.aiManager.sendAIMessage({
194
197
  model: config?.model,
195
- allowedTools: config?.allowedTools,
196
198
  });
197
199
  }
198
200
  catch (error) {
@@ -1,8 +1,25 @@
1
1
  import type { SubagentConfiguration } from "../utils/subagentParser.js";
2
2
  import type { Message, Logger, GatewayConfig, ModelConfig, Usage } from "../types/index.js";
3
+ import type { SessionData } from "../services/session.js";
3
4
  import { AIManager } from "./aiManager.js";
4
5
  import { MessageManager } from "./messageManager.js";
5
6
  import { ToolManager } from "./toolManager.js";
7
+ import { HookManager } from "./hookManager.js";
8
+ import { UserMessageParams, type AgentToolBlockUpdateParams } from "../utils/messageOperations.js";
9
+ export interface SubagentManagerCallbacks {
10
+ /** Triggered when subagent adds user message */
11
+ onSubagentUserMessageAdded?: (subagentId: string, params: UserMessageParams) => void;
12
+ /** Triggered when subagent creates assistant message */
13
+ onSubagentAssistantMessageAdded?: (subagentId: string) => void;
14
+ /** Triggered during subagent content streaming updates */
15
+ onSubagentAssistantContentUpdated?: (subagentId: string, chunk: string, accumulated: string) => void;
16
+ /** Triggered during subagent reasoning streaming updates */
17
+ onSubagentAssistantReasoningUpdated?: (subagentId: string, chunk: string, accumulated: string) => void;
18
+ /** Triggered when subagent tool block is updated */
19
+ onSubagentToolBlockUpdated?: (subagentId: string, params: AgentToolBlockUpdateParams) => void;
20
+ /** Triggered when subagent messages change */
21
+ onSubagentMessagesChange?: (subagentId: string, messages: Message[]) => void;
22
+ }
6
23
  export interface SubagentInstance {
7
24
  subagentId: string;
8
25
  configuration: SubagentConfiguration;
@@ -11,15 +28,18 @@ export interface SubagentInstance {
11
28
  toolManager: ToolManager;
12
29
  status: "initializing" | "active" | "completed" | "error" | "aborted";
13
30
  messages: Message[];
31
+ subagentType: string;
14
32
  }
15
33
  export interface SubagentManagerOptions {
16
34
  workdir: string;
17
35
  parentToolManager: ToolManager;
18
36
  parentMessageManager: MessageManager;
37
+ callbacks?: SubagentManagerCallbacks;
19
38
  logger?: Logger;
20
- gatewayConfig: GatewayConfig;
21
- modelConfig: ModelConfig;
22
- tokenLimit: number;
39
+ getGatewayConfig: () => GatewayConfig;
40
+ getModelConfig: () => ModelConfig;
41
+ getTokenLimit: () => number;
42
+ hookManager?: HookManager;
23
43
  onUsageAdded?: (usage: Usage) => void;
24
44
  }
25
45
  export declare class SubagentManager {
@@ -28,10 +48,12 @@ export declare class SubagentManager {
28
48
  private workdir;
29
49
  private parentToolManager;
30
50
  private parentMessageManager;
51
+ private callbacks?;
31
52
  private logger?;
32
- private gatewayConfig;
33
- private modelConfig;
34
- private tokenLimit;
53
+ private getGatewayConfig;
54
+ private getModelConfig;
55
+ private getTokenLimit;
56
+ private hookManager?;
35
57
  private onUsageAdded?;
36
58
  constructor(options: SubagentManagerOptions);
37
59
  /**
@@ -89,5 +111,19 @@ export declare class SubagentManager {
89
111
  * Clean up all instances (for session end)
90
112
  */
91
113
  cleanup(): void;
114
+ /**
115
+ * Restore subagent instances from saved session data
116
+ * This method is called during agent initialization to restore previous subagent states
117
+ */
118
+ restoreSubagentSessions(subagentSessions: Array<{
119
+ sessionData: SessionData;
120
+ subagentId: string;
121
+ configuration: SubagentConfiguration;
122
+ }>): Promise<void>;
123
+ /**
124
+ * Create subagent callbacks for a specific subagent ID
125
+ * Extracted to reuse in both create and restore flows
126
+ */
127
+ private createSubagentCallbacks;
92
128
  }
93
129
  //# sourceMappingURL=subagentManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACN,aAAa,EACb,WAAW,EACX,KAAK,EACN,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,cAAc,EAEf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,qBAAqB,CAAC;IACrC,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,cAAc,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;IACtE,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,WAAW,CAAC;IAC/B,oBAAoB,EAAE,cAAc,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACvC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,oBAAoB,CAAwC;IAEpE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,oBAAoB,CAAiB;IAC7C,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAC,CAAyB;gBAElC,OAAO,EAAE,sBAAsB;IAW3C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAY5D;;OAEG;IACH,iBAAiB,IAAI,qBAAqB,EAAE;IAS5C;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM;IAK/B;;OAEG;IACG,cAAc,CAClB,aAAa,EAAE,qBAAqB,EACpC,UAAU,EAAE;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;KACvB,GACA,OAAO,CAAC,gBAAgB,CAAC;IAsF5B;;;;;OAKG;IACG,WAAW,CACf,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,MAAM,CAAC;IAsGlB;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAIxD;;OAEG;IACH,oBAAoB,CAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,GACjC,IAAI;IAOP;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAOhE;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAYzC;;OAEG;IACH,kBAAkB,IAAI,gBAAgB,EAAE;IAOxC;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { randomUUID } from "crypto";
2
2
  import { AIManager } from "./aiManager.js";
3
- import { MessageManager, } from "./messageManager.js";
3
+ import { MessageManager } from "./messageManager.js";
4
+ import { addConsolidatedAbortListener, createAbortPromise, } from "../utils/abortUtils.js";
4
5
  export class SubagentManager {
5
6
  constructor(options) {
6
7
  this.instances = new Map();
@@ -8,10 +9,12 @@ export class SubagentManager {
8
9
  this.workdir = options.workdir;
9
10
  this.parentToolManager = options.parentToolManager;
10
11
  this.parentMessageManager = options.parentMessageManager;
12
+ this.callbacks = options.callbacks; // Store SubagentManagerCallbacks
11
13
  this.logger = options.logger;
12
- this.gatewayConfig = options.gatewayConfig;
13
- this.modelConfig = options.modelConfig;
14
- this.tokenLimit = options.tokenLimit;
14
+ this.getGatewayConfig = options.getGatewayConfig;
15
+ this.getModelConfig = options.getModelConfig;
16
+ this.getTokenLimit = options.getTokenLimit;
17
+ this.hookManager = options.hookManager;
15
18
  this.onUsageAdded = options.onUsageAdded;
16
19
  }
17
20
  /**
@@ -50,38 +53,21 @@ export class SubagentManager {
50
53
  * Create a new subagent instance with isolated managers
51
54
  */
52
55
  async createInstance(configuration, parameters) {
53
- if (!this.parentToolManager ||
54
- !this.gatewayConfig ||
55
- !this.modelConfig ||
56
- !this.tokenLimit) {
56
+ if (!this.parentToolManager) {
57
57
  throw new Error("SubagentManager not properly initialized - call initialize() first");
58
58
  }
59
59
  const subagentId = randomUUID();
60
60
  // Create isolated MessageManager for the subagent
61
- const subagentCallbacks = {
62
- // These callbacks will be handled by the parent agent
63
- onMessagesChange: (messages) => {
64
- const instance = this.instances.get(subagentId);
65
- if (instance) {
66
- instance.messages = messages;
67
- // Update parent's subagent block with latest messages
68
- this.parentMessageManager.updateSubagentBlock(subagentId, {
69
- messages: messages,
70
- });
71
- }
72
- },
73
- };
61
+ const subagentCallbacks = this.createSubagentCallbacks(subagentId);
74
62
  const messageManager = new MessageManager({
75
63
  callbacks: subagentCallbacks,
76
64
  workdir: this.workdir,
77
65
  logger: this.logger,
66
+ sessionType: "subagent",
67
+ subagentType: parameters.subagent_type,
78
68
  });
79
69
  // Use the parent tool manager directly - tool restrictions will be handled by allowedTools parameter
80
70
  const toolManager = this.parentToolManager;
81
- // Determine model to use
82
- const modelToUse = configuration.model && configuration.model !== "inherit"
83
- ? configuration.model
84
- : this.modelConfig.agentModel;
85
71
  // Create isolated AIManager for the subagent
86
72
  const aiManager = new AIManager({
87
73
  messageManager,
@@ -89,12 +75,31 @@ export class SubagentManager {
89
75
  logger: this.logger,
90
76
  workdir: this.workdir,
91
77
  systemPrompt: configuration.systemPrompt,
92
- gatewayConfig: this.gatewayConfig,
93
- modelConfig: {
94
- ...this.modelConfig,
95
- agentModel: modelToUse,
78
+ subagentType: parameters.subagent_type, // Pass subagent type for hook context
79
+ hookManager: this.hookManager,
80
+ getGatewayConfig: this.getGatewayConfig,
81
+ getModelConfig: () => {
82
+ // Determine model dynamically each time
83
+ const parentModelConfig = this.getModelConfig();
84
+ let modelToUse;
85
+ if (!configuration.model || configuration.model === "inherit") {
86
+ // Use parent's agentModel for "inherit" or undefined
87
+ modelToUse = parentModelConfig.agentModel;
88
+ }
89
+ else if (configuration.model === "fastModel") {
90
+ // Use parent's fastModel for special "fastModel" value
91
+ modelToUse = parentModelConfig.fastModel;
92
+ }
93
+ else {
94
+ // Use specific model name
95
+ modelToUse = configuration.model;
96
+ }
97
+ return {
98
+ ...parentModelConfig,
99
+ agentModel: modelToUse,
100
+ };
96
101
  },
97
- tokenLimit: this.tokenLimit,
102
+ getTokenLimit: this.getTokenLimit,
98
103
  callbacks: {
99
104
  onUsageAdded: this.onUsageAdded,
100
105
  },
@@ -107,10 +112,11 @@ export class SubagentManager {
107
112
  toolManager,
108
113
  status: "initializing",
109
114
  messages: [],
115
+ subagentType: parameters.subagent_type, // Store the subagent type
110
116
  };
111
117
  this.instances.set(subagentId, instance);
112
118
  // Create subagent block in parent message manager
113
- this.parentMessageManager.addSubagentBlock(subagentId, configuration.name, "active", [], parameters);
119
+ this.parentMessageManager.addSubagentBlock(subagentId, configuration.name, messageManager.getSessionId(), configuration, "active", parameters);
114
120
  return instance;
115
121
  }
116
122
  /**
@@ -130,15 +136,22 @@ export class SubagentManager {
130
136
  this.parentMessageManager.updateSubagentBlock(instance.subagentId, {
131
137
  status: "active",
132
138
  });
133
- // Set up abort handler
139
+ // Set up consolidated abort handler to prevent listener accumulation
140
+ let abortCleanup;
134
141
  if (abortSignal) {
135
- abortSignal.addEventListener("abort", () => {
136
- this.updateInstanceStatus(instance.subagentId, "aborted");
137
- this.parentMessageManager.updateSubagentBlock(instance.subagentId, {
138
- status: "aborted",
139
- messages: instance.messages,
140
- });
141
- });
142
+ abortCleanup = addConsolidatedAbortListener(abortSignal, [
143
+ () => {
144
+ // Update status to aborted
145
+ this.updateInstanceStatus(instance.subagentId, "aborted");
146
+ this.parentMessageManager.updateSubagentBlock(instance.subagentId, {
147
+ status: "aborted",
148
+ });
149
+ },
150
+ () => {
151
+ // Abort the AI execution
152
+ instance.aiManager.abortAIMessage();
153
+ },
154
+ ]);
142
155
  }
143
156
  // Add the user's prompt as a message
144
157
  instance.messageManager.addUserMessage({ content: prompt });
@@ -155,31 +168,42 @@ export class SubagentManager {
155
168
  }
156
169
  // Execute the AI request with tool restrictions
157
170
  // The AIManager will handle abort signals through its own abort controllers
158
- // We need to abort the AI execution if the external abort signal is triggered
171
+ // Resolve model name for sendAIMessage
172
+ let resolvedModel;
173
+ if (instance.configuration.model &&
174
+ instance.configuration.model !== "inherit") {
175
+ if (instance.configuration.model === "fastModel") {
176
+ // Use parent's fastModel for special "fastModel" value
177
+ const parentModelConfig = this.getModelConfig();
178
+ resolvedModel = parentModelConfig.fastModel;
179
+ }
180
+ else {
181
+ // Use specific model name
182
+ resolvedModel = instance.configuration.model;
183
+ }
184
+ }
185
+ // For "inherit" or undefined, resolvedModel remains undefined (uses AIManager default)
159
186
  const executeAI = instance.aiManager.sendAIMessage({
160
187
  allowedTools,
161
- model: instance.configuration.model !== "inherit"
162
- ? instance.configuration.model
163
- : undefined,
188
+ model: resolvedModel,
164
189
  });
165
- // If we have an abort signal, race against it
166
- if (abortSignal) {
167
- await Promise.race([
168
- executeAI,
169
- new Promise((_, reject) => {
170
- if (abortSignal.aborted) {
171
- reject(new Error("Task was aborted"));
172
- }
173
- abortSignal.addEventListener("abort", () => {
174
- // Abort the AI execution
175
- instance.aiManager.abortAIMessage();
176
- reject(new Error("Task was aborted"));
177
- });
178
- }),
179
- ]);
190
+ try {
191
+ // If we have an abort signal, race against it using utilities to prevent listener accumulation
192
+ if (abortSignal) {
193
+ await Promise.race([
194
+ executeAI,
195
+ createAbortPromise(abortSignal, "Task was aborted"),
196
+ ]);
197
+ }
198
+ else {
199
+ await executeAI;
200
+ }
180
201
  }
181
- else {
182
- await executeAI;
202
+ finally {
203
+ // Clean up abort listeners to prevent memory leaks
204
+ if (abortCleanup) {
205
+ abortCleanup();
206
+ }
183
207
  }
184
208
  // Get the latest messages to extract the response
185
209
  const messages = instance.messageManager.getMessages();
@@ -192,11 +216,10 @@ export class SubagentManager {
192
216
  // Extract text content from the last assistant message
193
217
  const textBlocks = lastAssistantMessage.blocks.filter((block) => block.type === "text");
194
218
  const response = textBlocks.map((block) => block.content).join("\n");
195
- // Update status to completed and update parent with final messages
219
+ // Update status to completed and update parent
196
220
  this.updateInstanceStatus(instance.subagentId, "completed");
197
221
  this.parentMessageManager.updateSubagentBlock(instance.subagentId, {
198
222
  status: "completed",
199
- messages: messages,
200
223
  });
201
224
  return response || "Task completed with no text response";
202
225
  }
@@ -256,4 +279,132 @@ export class SubagentManager {
256
279
  cleanup() {
257
280
  this.instances.clear();
258
281
  }
282
+ /**
283
+ * Restore subagent instances from saved session data
284
+ * This method is called during agent initialization to restore previous subagent states
285
+ */
286
+ async restoreSubagentSessions(subagentSessions) {
287
+ for (const { sessionData, subagentId, configuration } of subagentSessions) {
288
+ try {
289
+ // Use the configuration from the SubagentBlock
290
+ // Create the subagent instance without executing - just restore the state
291
+ // Create MessageManager for the restored subagent
292
+ const subagentCallbacks = this.createSubagentCallbacks(subagentId);
293
+ const messageManager = new MessageManager({
294
+ callbacks: subagentCallbacks,
295
+ workdir: this.workdir,
296
+ logger: this.logger,
297
+ sessionType: "subagent",
298
+ subagentType: configuration.name, // Use configuration name for restored sessions
299
+ });
300
+ // Use the parent tool manager
301
+ const toolManager = this.parentToolManager;
302
+ // Determine model to use
303
+ let modelToUse;
304
+ const parentModelConfig = this.getModelConfig();
305
+ if (!configuration.model || configuration.model === "inherit") {
306
+ modelToUse = parentModelConfig.agentModel;
307
+ }
308
+ else if (configuration.model === "fastModel") {
309
+ modelToUse = parentModelConfig.fastModel;
310
+ }
311
+ else {
312
+ modelToUse = configuration.model;
313
+ }
314
+ // Create AIManager for the restored subagent
315
+ const aiManager = new AIManager({
316
+ messageManager,
317
+ toolManager,
318
+ logger: this.logger,
319
+ workdir: this.workdir,
320
+ systemPrompt: configuration.systemPrompt,
321
+ subagentType: configuration.name, // Use configuration name as subagent type for restored instances
322
+ hookManager: this.hookManager,
323
+ getGatewayConfig: this.getGatewayConfig,
324
+ getModelConfig: () => ({
325
+ ...parentModelConfig,
326
+ agentModel: modelToUse,
327
+ }),
328
+ getTokenLimit: this.getTokenLimit,
329
+ callbacks: {
330
+ onUsageAdded: this.onUsageAdded,
331
+ },
332
+ });
333
+ // Create restored instance
334
+ const instance = {
335
+ subagentId,
336
+ configuration,
337
+ aiManager,
338
+ messageManager,
339
+ toolManager,
340
+ status: "completed", // Restored sessions are considered completed
341
+ messages: sessionData.messages,
342
+ subagentType: configuration.name, // Use configuration name as subagent type for restored instances
343
+ };
344
+ // IMPORTANT: Store instance in map BEFORE calling setMessages
345
+ // This ensures the callback can find the instance
346
+ this.instances.set(subagentId, instance);
347
+ messageManager.initializeFromSession(sessionData);
348
+ }
349
+ catch (error) {
350
+ this.logger?.warn(`Failed to restore subagent session ${subagentId}:`, error);
351
+ // Continue with other sessions even if one fails
352
+ }
353
+ }
354
+ }
355
+ /**
356
+ * Create subagent callbacks for a specific subagent ID
357
+ * Extracted to reuse in both create and restore flows
358
+ */
359
+ createSubagentCallbacks(subagentId) {
360
+ return {
361
+ onUserMessageAdded: (params) => {
362
+ // Forward user message events to parent via SubagentManager callbacks
363
+ if (this.callbacks?.onSubagentUserMessageAdded) {
364
+ this.callbacks.onSubagentUserMessageAdded(subagentId, params);
365
+ }
366
+ },
367
+ onAssistantMessageAdded: () => {
368
+ // Forward assistant message events to parent via SubagentManager callbacks
369
+ if (this.callbacks?.onSubagentAssistantMessageAdded) {
370
+ this.callbacks.onSubagentAssistantMessageAdded(subagentId);
371
+ }
372
+ },
373
+ onAssistantContentUpdated: (chunk, accumulated) => {
374
+ // Forward assistant content updates to parent via SubagentManager callbacks
375
+ if (this.callbacks?.onSubagentAssistantContentUpdated) {
376
+ this.callbacks.onSubagentAssistantContentUpdated(subagentId, chunk, accumulated);
377
+ }
378
+ },
379
+ onAssistantReasoningUpdated: (chunk, accumulated) => {
380
+ // Forward assistant reasoning updates to parent via SubagentManager callbacks
381
+ if (this.callbacks?.onSubagentAssistantReasoningUpdated) {
382
+ this.callbacks.onSubagentAssistantReasoningUpdated(subagentId, chunk, accumulated);
383
+ }
384
+ },
385
+ onToolBlockUpdated: (params) => {
386
+ // Forward tool block updates to parent via SubagentManager callbacks
387
+ if (this.callbacks?.onSubagentToolBlockUpdated) {
388
+ this.callbacks.onSubagentToolBlockUpdated(subagentId, params);
389
+ }
390
+ },
391
+ // These callbacks will be handled by the parent agent
392
+ onMessagesChange: (messages) => {
393
+ const instance = this.instances.get(subagentId);
394
+ if (instance) {
395
+ instance.messages = messages;
396
+ // Forward subagent message changes to parent via callbacks
397
+ if (this.callbacks?.onSubagentMessagesChange) {
398
+ this.callbacks.onSubagentMessagesChange(subagentId, messages);
399
+ }
400
+ }
401
+ },
402
+ onSessionIdChange: (newSessionId) => {
403
+ // Update the subagent block with the new session ID
404
+ this.parentMessageManager.updateSubagentBlock(subagentId, {
405
+ sessionId: newSessionId,
406
+ });
407
+ },
408
+ };
409
+ }
259
410
  }
@@ -1,20 +1,35 @@
1
1
  import type { ToolContext, ToolPlugin, ToolResult } from "../tools/types.js";
2
2
  import { McpManager } from "./mcpManager.js";
3
+ import { PermissionManager } from "./permissionManager.js";
3
4
  import { ChatCompletionFunctionTool } from "openai/resources.js";
4
- import type { Logger } from "../types/index.js";
5
+ import type { Logger, PermissionMode, PermissionCallback, ILspManager } from "../types/index.js";
5
6
  import type { SubagentManager } from "./subagentManager.js";
6
7
  import type { SkillManager } from "./skillManager.js";
7
8
  export interface ToolManagerOptions {
8
9
  mcpManager: McpManager;
10
+ lspManager?: ILspManager;
9
11
  logger?: Logger;
12
+ /** Optional permission manager for handling tool permission checks */
13
+ permissionManager?: PermissionManager;
14
+ /** Permission mode for tool execution (defaults to "default") */
15
+ permissionMode?: PermissionMode;
16
+ /** Custom permission callback for tool usage */
17
+ canUseToolCallback?: PermissionCallback;
10
18
  }
11
19
  /**
12
20
  * Tool Manager
21
+ *
22
+ * Manages tool registration and execution with optional permission system integration.
23
+ * Supports both built-in tools and MCP (Model Context Protocol) tools.
13
24
  */
14
25
  declare class ToolManager {
15
26
  private tools;
16
27
  private mcpManager;
28
+ private lspManager?;
17
29
  private logger?;
30
+ private permissionManager?;
31
+ private permissionMode?;
32
+ private canUseToolCallback?;
18
33
  constructor(options: ToolManagerOptions);
19
34
  /**
20
35
  * Register a new tool
@@ -47,9 +62,31 @@ declare class ToolManager {
47
62
  subagentManager?: SubagentManager;
48
63
  skillManager?: SkillManager;
49
64
  }): void;
65
+ /**
66
+ * Execute a tool by name with the provided arguments and context
67
+ *
68
+ * Enhances the context with permission-related fields before execution:
69
+ * - permissionMode: The current permission mode (default or bypassPermissions)
70
+ * - canUseToolCallback: Custom permission callback if provided
71
+ * - permissionManager: The PermissionManager instance for permission checks
72
+ *
73
+ * @param name - Name of the tool to execute
74
+ * @param args - Arguments to pass to the tool
75
+ * @param context - Execution context for the tool
76
+ * @returns Promise resolving to the tool execution result
77
+ */
50
78
  execute(name: string, args: Record<string, unknown>, context: ToolContext): Promise<ToolResult>;
51
79
  list(): ToolPlugin[];
52
80
  getToolsConfig(): ChatCompletionFunctionTool[];
81
+ /**
82
+ * Get the current permission mode
83
+ */
84
+ getPermissionMode(): PermissionMode;
85
+ /**
86
+ * Set the permission mode
87
+ * @param mode - The new permission mode
88
+ */
89
+ setPermissionMode(mode: PermissionMode): void;
53
90
  }
54
91
  export { ToolManager };
55
92
  //# sourceMappingURL=toolManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolManager.d.ts","sourceRoot":"","sources":["../../src/managers/toolManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAc7E,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,cAAM,WAAW;IACf,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,OAAO,EAAE,kBAAkB;IAKvC;;OAEG;IACI,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIvC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACI,sBAAsB,CAAC,IAAI,CAAC,EAAE;QACnC,eAAe,CAAC,EAAE,eAAe,CAAC;QAClC,YAAY,CAAC,EAAE,YAAY,CAAC;KAC7B,GAAG,IAAI;IAgCF,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC;IA2BtB,IAAI,IAAI,UAAU,EAAE;IAMpB,cAAc,IAAI,0BAA0B,EAAE;CAO/C;AAGD,OAAO,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"toolManager.d.ts","sourceRoot":"","sources":["../../src/managers/toolManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAe7E,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EACV,MAAM,EACN,cAAc,EACd,kBAAkB,EAClB,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,iEAAiE;IACjE,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,gDAAgD;IAChD,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;CACzC;AAED;;;;;GAKG;AACH,cAAM,WAAW;IACf,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAC,CAAc;IACjC,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAC,CAAoB;IAC9C,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,kBAAkB,CAAC,CAAqB;gBAEpC,OAAO,EAAE,kBAAkB;IAUvC;;OAEG;IACI,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIvC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACI,sBAAsB,CAAC,IAAI,CAAC,EAAE;QACnC,eAAe,CAAC,EAAE,eAAe,CAAC;QAClC,YAAY,CAAC,EAAE,YAAY,CAAC;KAC7B,GAAG,IAAI;IAiCR;;;;;;;;;;;;OAYG;IACG,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC;IA2DtB,IAAI,IAAI,UAAU,EAAE;IAMpB,cAAc,IAAI,0BAA0B,EAAE;IAQ9C;;OAEG;IACI,iBAAiB,IAAI,cAAc;IAS1C;;;OAGG;IACI,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;CAGrD;AAGD,OAAO,EAAE,WAAW,EAAE,CAAC"}