onbuzz 4.9.13 → 4.10.0

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 (451) hide show
  1. package/node_modules/glob/README.md +31 -5
  2. package/node_modules/glob/dist/commonjs/glob.d.ts +8 -0
  3. package/node_modules/glob/dist/commonjs/glob.d.ts.map +1 -1
  4. package/node_modules/glob/dist/commonjs/glob.js +2 -1
  5. package/node_modules/glob/dist/commonjs/glob.js.map +1 -1
  6. package/node_modules/glob/dist/commonjs/index.min.js +3 -3
  7. package/node_modules/glob/dist/commonjs/index.min.js.map +4 -4
  8. package/node_modules/glob/dist/commonjs/pattern.d.ts +3 -0
  9. package/node_modules/glob/dist/commonjs/pattern.d.ts.map +1 -1
  10. package/node_modules/glob/dist/commonjs/pattern.js +4 -0
  11. package/node_modules/glob/dist/commonjs/pattern.js.map +1 -1
  12. package/node_modules/glob/dist/esm/glob.d.ts +8 -0
  13. package/node_modules/glob/dist/esm/glob.d.ts.map +1 -1
  14. package/node_modules/glob/dist/esm/glob.js +2 -1
  15. package/node_modules/glob/dist/esm/glob.js.map +1 -1
  16. package/node_modules/glob/dist/esm/index.min.js +3 -3
  17. package/node_modules/glob/dist/esm/index.min.js.map +4 -4
  18. package/node_modules/glob/dist/esm/pattern.d.ts +3 -0
  19. package/node_modules/glob/dist/esm/pattern.d.ts.map +1 -1
  20. package/node_modules/glob/dist/esm/pattern.js +4 -0
  21. package/node_modules/glob/dist/esm/pattern.js.map +1 -1
  22. package/node_modules/{@isaacs → glob/node_modules}/balanced-match/README.md +7 -10
  23. package/node_modules/{@isaacs → glob/node_modules}/balanced-match/package.json +7 -18
  24. package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/README.md +3 -6
  25. package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/commonjs/index.js +6 -4
  26. package/node_modules/glob/node_modules/brace-expansion/dist/commonjs/index.js.map +1 -0
  27. package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/esm/index.js +6 -4
  28. package/node_modules/glob/node_modules/brace-expansion/dist/esm/index.js.map +1 -0
  29. package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/package.json +11 -7
  30. package/node_modules/glob/node_modules/minimatch/README.md +76 -1
  31. package/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts +1 -1
  32. package/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map +1 -1
  33. package/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map +1 -1
  34. package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.d.ts +4 -2
  35. package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.d.ts.map +1 -1
  36. package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.js +309 -55
  37. package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.js.map +1 -1
  38. package/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map +1 -1
  39. package/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.js +2 -4
  40. package/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.js.map +1 -1
  41. package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.d.ts +1 -1
  42. package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.d.ts.map +1 -1
  43. package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.js +4 -4
  44. package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.js.map +1 -1
  45. package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.d.ts +81 -1
  46. package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.d.ts.map +1 -1
  47. package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.js +232 -134
  48. package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.js.map +1 -1
  49. package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.d.ts +1 -1
  50. package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.d.ts.map +1 -1
  51. package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.js +8 -8
  52. package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.js.map +1 -1
  53. package/node_modules/glob/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts +1 -1
  54. package/node_modules/glob/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map +1 -1
  55. package/node_modules/glob/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -1
  56. package/node_modules/glob/node_modules/minimatch/dist/esm/ast.d.ts +4 -2
  57. package/node_modules/glob/node_modules/minimatch/dist/esm/ast.d.ts.map +1 -1
  58. package/node_modules/glob/node_modules/minimatch/dist/esm/ast.js +309 -55
  59. package/node_modules/glob/node_modules/minimatch/dist/esm/ast.js.map +1 -1
  60. package/node_modules/glob/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map +1 -1
  61. package/node_modules/glob/node_modules/minimatch/dist/esm/brace-expressions.js +2 -4
  62. package/node_modules/glob/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -1
  63. package/node_modules/glob/node_modules/minimatch/dist/esm/escape.d.ts +1 -1
  64. package/node_modules/glob/node_modules/minimatch/dist/esm/escape.d.ts.map +1 -1
  65. package/node_modules/glob/node_modules/minimatch/dist/esm/escape.js +4 -4
  66. package/node_modules/glob/node_modules/minimatch/dist/esm/escape.js.map +1 -1
  67. package/node_modules/glob/node_modules/minimatch/dist/esm/index.d.ts +81 -1
  68. package/node_modules/glob/node_modules/minimatch/dist/esm/index.d.ts.map +1 -1
  69. package/node_modules/glob/node_modules/minimatch/dist/esm/index.js +232 -134
  70. package/node_modules/glob/node_modules/minimatch/dist/esm/index.js.map +1 -1
  71. package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.d.ts +1 -1
  72. package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.d.ts.map +1 -1
  73. package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.js +8 -8
  74. package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.js.map +1 -1
  75. package/node_modules/glob/node_modules/minimatch/package.json +17 -11
  76. package/node_modules/glob/package.json +10 -13
  77. package/node_modules/minipass/LICENSE.md +55 -0
  78. package/node_modules/minipass/dist/commonjs/index.d.ts +12 -16
  79. package/node_modules/minipass/dist/commonjs/index.d.ts.map +1 -1
  80. package/node_modules/minipass/dist/commonjs/index.js +13 -3
  81. package/node_modules/minipass/dist/commonjs/index.js.map +1 -1
  82. package/node_modules/minipass/dist/esm/index.d.ts +12 -16
  83. package/node_modules/minipass/dist/esm/index.d.ts.map +1 -1
  84. package/node_modules/minipass/dist/esm/index.js +3 -1
  85. package/node_modules/minipass/dist/esm/index.js.map +1 -1
  86. package/node_modules/minipass/package.json +9 -14
  87. package/node_modules/path-scurry/node_modules/lru-cache/README.md +96 -10
  88. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel-browser.d.ts.map +1 -0
  89. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel-browser.js.map +1 -0
  90. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel.d.ts +5 -0
  91. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel.js +7 -0
  92. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.d.ts +1400 -0
  93. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.d.ts.map +1 -0
  94. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.js +1726 -0
  95. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.js.map +1 -0
  96. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.min.js +2 -0
  97. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.min.js.map +7 -0
  98. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/perf.d.ts +12 -0
  99. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/perf.d.ts.map +1 -0
  100. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/perf.js +10 -0
  101. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/perf.js.map +1 -0
  102. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/diagnostics-channel-cjs.cjs.map +1 -0
  103. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/diagnostics-channel-cjs.d.cts.map +1 -0
  104. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/diagnostics-channel.d.ts +5 -0
  105. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/diagnostics-channel.js +7 -0
  106. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.d.ts +109 -32
  107. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.d.ts.map +1 -1
  108. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.js +334 -197
  109. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.js.map +1 -1
  110. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.min.js +1 -1
  111. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.min.js.map +4 -4
  112. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel-node.d.ts.map +1 -0
  113. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel-node.js.map +1 -0
  114. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel.d.ts +5 -0
  115. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel.js +9 -0
  116. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.d.ts +1400 -0
  117. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.d.ts.map +1 -0
  118. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.js +1726 -0
  119. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.js.map +1 -0
  120. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.min.js +2 -0
  121. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.min.js.map +7 -0
  122. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/perf.d.ts +12 -0
  123. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/perf.d.ts.map +1 -0
  124. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/perf.js +10 -0
  125. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/perf.js.map +1 -0
  126. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/perf.d.ts +12 -0
  127. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/perf.d.ts.map +1 -0
  128. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/perf.js +10 -0
  129. package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/perf.js.map +1 -0
  130. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/diagnostics-channel-browser.d.ts.map +1 -0
  131. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/diagnostics-channel-browser.js.map +1 -0
  132. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/diagnostics-channel.d.ts +5 -0
  133. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/diagnostics-channel.js +4 -0
  134. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.d.ts +1400 -0
  135. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.d.ts.map +1 -0
  136. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.js +1722 -0
  137. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.js.map +1 -0
  138. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.min.js +2 -0
  139. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.min.js.map +7 -0
  140. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/perf.d.ts +12 -0
  141. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/perf.d.ts.map +1 -0
  142. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/perf.js +7 -0
  143. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/perf.js.map +1 -0
  144. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/diagnostics-channel-esm.d.mts.map +1 -0
  145. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/diagnostics-channel-esm.mjs.map +1 -0
  146. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/diagnostics-channel.d.ts +5 -0
  147. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/diagnostics-channel.js +19 -0
  148. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.d.ts +109 -32
  149. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.d.ts.map +1 -1
  150. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.js +333 -196
  151. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.js.map +1 -1
  152. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.min.js +1 -1
  153. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.min.js.map +4 -4
  154. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/diagnostics-channel-node.d.ts.map +1 -0
  155. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/diagnostics-channel-node.js.map +1 -0
  156. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/diagnostics-channel.d.ts +5 -0
  157. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/diagnostics-channel.js +6 -0
  158. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.d.ts +1400 -0
  159. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.d.ts.map +1 -0
  160. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.js +1722 -0
  161. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.js.map +1 -0
  162. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.min.js +2 -0
  163. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.min.js.map +7 -0
  164. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/perf.d.ts +12 -0
  165. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/perf.d.ts.map +1 -0
  166. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/perf.js +7 -0
  167. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/perf.js.map +1 -0
  168. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/perf.d.ts +12 -0
  169. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/perf.d.ts.map +1 -0
  170. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/perf.js +7 -0
  171. package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/perf.js.map +1 -0
  172. package/node_modules/path-scurry/node_modules/lru-cache/package.json +71 -18
  173. package/node_modules/path-scurry/package.json +8 -24
  174. package/package.json +1 -1
  175. package/scripts/debug-balance-probe.mjs +35 -35
  176. package/scripts/push-image.sh +43 -43
  177. package/scripts/setup-acr.sh +65 -65
  178. package/scripts/verify-optional-deps.js +96 -1
  179. package/src/__tests__/composioCliFlags.test.js +239 -239
  180. package/src/analyzers/CSSAnalyzer.js +298 -297
  181. package/src/analyzers/ConfigValidator.js +691 -690
  182. package/src/analyzers/ESLintAnalyzer.js +320 -320
  183. package/src/analyzers/JavaScriptAnalyzer.js +260 -261
  184. package/src/analyzers/PrettierFormatter.js +246 -247
  185. package/src/analyzers/PythonAnalyzer.js +283 -283
  186. package/src/analyzers/SecurityAnalyzer.js +729 -729
  187. package/src/analyzers/SparrowAnalyzer.js +341 -341
  188. package/src/analyzers/TypeScriptAnalyzer.js +247 -247
  189. package/src/analyzers/__tests__/CSSAnalyzer.test.js +41 -41
  190. package/src/analyzers/__tests__/ConfigValidator.test.js +362 -362
  191. package/src/analyzers/__tests__/JavaScriptAnalyzer.test.js +40 -40
  192. package/src/analyzers/__tests__/PythonAnalyzer.test.js +205 -208
  193. package/src/analyzers/__tests__/SecurityAnalyzer.test.js +303 -303
  194. package/src/analyzers/__tests__/TypeScriptAnalyzer.test.js +187 -187
  195. package/src/analyzers/codeCloneDetector/analyzer.js +344 -344
  196. package/src/analyzers/codeCloneDetector/detector.js +250 -250
  197. package/src/analyzers/codeCloneDetector/index.js +194 -192
  198. package/src/analyzers/codeCloneDetector/parser.js +199 -199
  199. package/src/core/__tests__/agentPool.test.js +866 -866
  200. package/src/core/__tests__/agentPoolAutoResume.test.js +209 -209
  201. package/src/core/__tests__/agentPoolWakeOnMessage.test.js +315 -315
  202. package/src/core/__tests__/agentScheduler.emptyResponseChatStall.test.js +213 -213
  203. package/src/core/__tests__/agentScheduler.errorCategorisation.test.js +246 -246
  204. package/src/core/__tests__/agentScheduler.firstChunkTimeout.test.js +138 -138
  205. package/src/core/__tests__/agentScheduler.modeTransitions.test.js +233 -233
  206. package/src/core/__tests__/agentScheduler.nativePromptPick.test.js +319 -319
  207. package/src/core/__tests__/agentScheduler.taskLifecycleInstruction.test.js +78 -78
  208. package/src/core/__tests__/agentScheduler.visualizer.test.js +258 -258
  209. package/src/core/__tests__/flowCheckpointStore.test.js +140 -140
  210. package/src/core/__tests__/flowEndToEnd.test.js +565 -565
  211. package/src/core/__tests__/flowFieldMapping.test.js +188 -189
  212. package/src/core/__tests__/flowLintClientMirror.test.js +96 -98
  213. package/src/core/__tests__/flowSavePayload.test.js +170 -169
  214. package/src/core/__tests__/flowTemplates.test.js +311 -311
  215. package/src/core/__tests__/flowVersionStore.test.js +123 -123
  216. package/src/core/__tests__/messageProcessor.test.js +669 -669
  217. package/src/core/__tests__/stateManager.test.js +0 -1
  218. package/src/core/agentPool.js +2474 -2475
  219. package/src/core/agentScheduler.js +1 -4
  220. package/src/core/contextManager.js +708 -708
  221. package/src/core/flowExecutor.js +1510 -1510
  222. package/src/core/flowFieldMapping.js +136 -138
  223. package/src/core/messageProcessor.js +953 -954
  224. package/src/core/orchestrator.js +593 -595
  225. package/src/core/stateManager.js +1765 -1752
  226. package/src/index.js +1221 -1221
  227. package/src/interfaces/__tests__/archivedAgentDelete.test.js +207 -207
  228. package/src/interfaces/__tests__/bulkAgentRoute.test.js +361 -361
  229. package/src/interfaces/__tests__/imageServing.test.js +228 -228
  230. package/src/interfaces/__tests__/remoteSessionAuth.test.js +308 -308
  231. package/src/interfaces/__tests__/videoJobsRoutes.test.js +178 -179
  232. package/src/interfaces/__tests__/webServer.marketplace.test.js +629 -629
  233. package/src/interfaces/schedulerRoutes.js +50 -50
  234. package/src/interfaces/terminal/__tests__/smoke/connection.test.js +341 -350
  235. package/src/interfaces/terminal/__tests__/smoke/enhancements.test.js +156 -156
  236. package/src/interfaces/terminal/__tests__/smoke/imports.test.js +325 -330
  237. package/src/interfaces/terminal/__tests__/smoke/tools.test.js +385 -388
  238. package/src/interfaces/terminal/api/session.js +265 -266
  239. package/src/interfaces/terminal/api/websocket.js +496 -497
  240. package/src/interfaces/terminal/components/AgentCreator.js +691 -705
  241. package/src/interfaces/terminal/components/AgentEditor.js +676 -678
  242. package/src/interfaces/terminal/components/AgentSwitcher.js +331 -330
  243. package/src/interfaces/terminal/components/ErrorPanel.js +263 -264
  244. package/src/interfaces/terminal/components/Header.js +28 -28
  245. package/src/interfaces/terminal/components/Layout.js +598 -603
  246. package/src/interfaces/terminal/components/MessageList.js +280 -281
  247. package/src/interfaces/terminal/components/SettingsPanel.js +410 -415
  248. package/src/interfaces/terminal/components/StatusBar.js +2 -0
  249. package/src/interfaces/terminal/index.js +168 -168
  250. package/src/interfaces/terminal/state/useAgentControl.js +496 -496
  251. package/src/interfaces/terminal/state/useAgents.js +537 -537
  252. package/src/interfaces/terminal/state/useMessages.js +629 -630
  253. package/src/interfaces/terminal/state/useTools.js +554 -554
  254. package/src/interfaces/terminal/utils/debugLogger.js +44 -44
  255. package/src/interfaces/terminal/utils/settingsStorage.js +232 -232
  256. package/src/interfaces/webServer.js +7578 -7579
  257. package/src/interfaces/webServer.js.bak +7046 -7046
  258. package/src/modules/fileExplorer/__tests__/zipDownload.test.js +237 -237
  259. package/src/modules/fileExplorer/controller.js +470 -469
  260. package/src/modules/fileExplorer/routes.js +285 -286
  261. package/src/modules/widget/__tests__/isDisabled.test.js +41 -41
  262. package/src/modules/widget/__tests__/routes.test.js +677 -678
  263. package/src/modules/widget/__tests__/runtime.test.js +401 -401
  264. package/src/modules/widget/__tests__/versioning.test.js +309 -309
  265. package/src/modules/widget/__tests__/webComponentRuntime.test.js +565 -565
  266. package/src/modules/widget/__tests__/widgetTool.test.js +316 -316
  267. package/src/modules/widget/routes.js +435 -435
  268. package/src/modules/widget/runtime/bundle.js +640 -640
  269. package/src/modules/widget/runtime/webComponentBundle.js +470 -470
  270. package/src/modules/widget/schema.js +182 -181
  271. package/src/modules/widget/widgetTool.js +1389 -1389
  272. package/src/services/__tests__/agentActivityService.test.js +401 -402
  273. package/src/services/__tests__/benchmarkService.test.js +184 -184
  274. package/src/services/__tests__/contextInjectionService.test.js +246 -246
  275. package/src/services/__tests__/conversationQuery.test.js +721 -723
  276. package/src/services/__tests__/credentialVault.test.js +469 -469
  277. package/src/services/__tests__/discordService.integration.test.js +638 -639
  278. package/src/services/__tests__/flowContextService.test.js +590 -590
  279. package/src/services/__tests__/memoryService.test.js +1 -1
  280. package/src/services/__tests__/messageSource.test.js +380 -380
  281. package/src/services/__tests__/modelRouterNaming.test.js +111 -111
  282. package/src/services/__tests__/projectDetector.test.js +34 -34
  283. package/src/services/__tests__/promptService.test.js +242 -242
  284. package/src/services/__tests__/telegramService.test.js +941 -941
  285. package/src/services/__tests__/tokenCountingService.test.js +48 -48
  286. package/src/services/agentActivityService.js +419 -420
  287. package/src/services/aiService.js +2997 -3001
  288. package/src/services/apiKeyManager.js +359 -359
  289. package/src/services/benchmarkService.js +196 -196
  290. package/src/services/codebaseKnowledgeService.js +2 -2
  291. package/src/services/composioService.js +738 -738
  292. package/src/services/conversationCompactionService.js +1258 -1257
  293. package/src/services/credentialVault.js +685 -685
  294. package/src/services/discordService.js +792 -793
  295. package/src/services/embeddings/__tests__/azureCustomProvider.test.js +232 -232
  296. package/src/services/embeddings/__tests__/embeddingService.test.js +417 -417
  297. package/src/services/embeddings/__tests__/localProvider.test.js +263 -263
  298. package/src/services/embeddings/autoRecall.js +218 -219
  299. package/src/services/embeddings/indexers/__tests__/agentIndexer.test.js +232 -232
  300. package/src/services/embeddings/indexers/__tests__/memoryIndexer.test.js +418 -418
  301. package/src/services/embeddings/indexers/__tests__/reminisceIndexer.test.js +356 -357
  302. package/src/services/embeddings/indexers/__tests__/skillsIndexer.test.js +145 -145
  303. package/src/services/embeddings/indexers/__tests__/taskIndexer.test.js +146 -146
  304. package/src/services/embeddings/indexers/composioIndexer.js +279 -279
  305. package/src/services/embeddings/providerInterface.js +206 -206
  306. package/src/services/embeddings/providers/localProvider.js +11 -7
  307. package/src/services/embeddings/providers/openaiProvider.js +101 -101
  308. package/src/services/embeddings/vectorStore/inMemoryJsonStore.js +356 -356
  309. package/src/services/errorHandler.js +809 -809
  310. package/src/services/flowContextService.js +586 -586
  311. package/src/services/grounding/MockAdapter.js +125 -125
  312. package/src/services/modelRouterService.js +26 -31
  313. package/src/services/modelsService.js +322 -322
  314. package/src/services/ollamaService.js +452 -452
  315. package/src/services/projectDetector.js +403 -404
  316. package/src/services/promptService.js +418 -418
  317. package/src/services/qualityInspector.js +795 -795
  318. package/src/services/scheduleService.js +726 -726
  319. package/src/services/serviceRegistry.js +386 -386
  320. package/src/services/telegrafBot.js +174 -174
  321. package/src/services/telegramService.js +1972 -1972
  322. package/src/services/visualEditorBridge.js +1033 -1033
  323. package/src/services/visualEditorServer.js +1769 -1774
  324. package/src/services/whatsappService.js +667 -668
  325. package/src/tools/__tests__/agentCommunicationTool.findAgent.test.js +226 -226
  326. package/src/tools/__tests__/agentCommunicationTool.test.js +3 -3
  327. package/src/tools/__tests__/agentDelayTool.test.js +342 -342
  328. package/src/tools/__tests__/baseTool.test.js +3 -3
  329. package/src/tools/__tests__/codeMapTool.test.js +915 -915
  330. package/src/tools/__tests__/fileContentReplaceTool.test.js +309 -309
  331. package/src/tools/__tests__/fileTreeTool.test.js +274 -274
  332. package/src/tools/__tests__/filesystemTool.test.js +815 -815
  333. package/src/tools/__tests__/foundryWebSearchTool.test.js +252 -252
  334. package/src/tools/__tests__/imageTool.validator.test.js +194 -194
  335. package/src/tools/__tests__/jobDoneTool.test.js +580 -581
  336. package/src/tools/__tests__/memoryTool.forgetStale.test.js +272 -272
  337. package/src/tools/__tests__/memoryTool.reminisce.test.js +2 -2
  338. package/src/tools/__tests__/memoryTool.reminisceSemanticSearch.test.js +301 -301
  339. package/src/tools/__tests__/memoryTool.semanticSearch.test.js +405 -405
  340. package/src/tools/__tests__/memoryTool.teamPool.test.js +293 -293
  341. package/src/tools/__tests__/memoryTool.test.js +1 -1
  342. package/src/tools/__tests__/seekTool.test.js +282 -282
  343. package/src/tools/__tests__/skillsTool.search.test.js +164 -164
  344. package/src/tools/__tests__/skillsTool.test.js +226 -226
  345. package/src/tools/__tests__/staticAnalysisTool.test.js +509 -509
  346. package/src/tools/__tests__/taskManagerTool.discipline.test.js +137 -137
  347. package/src/tools/__tests__/taskManagerTool.search.test.js +143 -143
  348. package/src/tools/__tests__/taskManagerTool.test.js +866 -866
  349. package/src/tools/__tests__/terminalTool.test.js +448 -448
  350. package/src/tools/__tests__/toolShapeForgiveness.test.js +259 -260
  351. package/src/tools/__tests__/userPromptTool.test.js +297 -297
  352. package/src/tools/__tests__/videoTool.jobs.test.js +147 -147
  353. package/src/tools/__tests__/webTool.e2e.test.js +609 -603
  354. package/src/tools/__tests__/webTool.unit.test.js +195 -195
  355. package/src/tools/__tests__/webTool.visionModel.test.js +75 -75
  356. package/src/tools/agentCommunicationTool.js +8 -10
  357. package/src/tools/agentDelayTool.js +496 -497
  358. package/src/tools/asyncToolManager.js +602 -603
  359. package/src/tools/baseTool.js +12 -11
  360. package/src/tools/cloneDetectionTool.js +576 -581
  361. package/src/tools/codeMapTool.js +0 -6
  362. package/src/tools/composioTool.js +617 -617
  363. package/src/tools/dependencyResolverTool.js +1211 -1212
  364. package/src/tools/desktop/DesktopTool.js +629 -638
  365. package/src/tools/desktop/__tests__/DesktopTool.e2e.test.js +306 -306
  366. package/src/tools/desktop/__tests__/DesktopTool.test.js +507 -507
  367. package/src/tools/desktop/__tests__/osController.test.js +364 -364
  368. package/src/tools/desktop/osController.js +491 -491
  369. package/src/tools/docxTool.js +623 -623
  370. package/src/tools/excelTool.js +636 -636
  371. package/src/tools/fileContentReplaceTool.js +5 -7
  372. package/src/tools/fileSystemTool.js +12 -19
  373. package/src/tools/fileTreeTool.js +840 -840
  374. package/src/tools/foundryWebSearchTool.js +273 -273
  375. package/src/tools/helpTool.js +198 -198
  376. package/src/tools/imageTool.js +1397 -1397
  377. package/src/tools/importAnalyzerTool.js +1056 -1056
  378. package/src/tools/jobDoneTool.js +495 -495
  379. package/src/tools/memoryTool.js +1 -1
  380. package/src/tools/office/pres/__tests__/presSystem.test.js +365 -365
  381. package/src/tools/office/pres/archetypes/agenda.js +61 -61
  382. package/src/tools/office/pres/archetypes/bentoGrid.js +218 -219
  383. package/src/tools/office/pres/archetypes/bigStat.js +140 -142
  384. package/src/tools/office/pres/archetypes/closing.js +70 -70
  385. package/src/tools/office/pres/archetypes/hero.js +70 -70
  386. package/src/tools/office/pres/archetypes/productHero.js +93 -94
  387. package/src/tools/office/pres/archetypes/table.js +73 -74
  388. package/src/tools/office/pres/backgrounds/orb.js +66 -66
  389. package/src/tools/office/pres/components.js +422 -423
  390. package/src/tools/officeTool.js +441 -441
  391. package/src/tools/pdfTool.js +625 -627
  392. package/src/tools/platformControlTool.js +1081 -1081
  393. package/src/tools/seekTool.js +917 -918
  394. package/src/tools/skillsTool.js +1 -1
  395. package/src/tools/staticAnalysisTool.js +2143 -2146
  396. package/src/tools/taskManagerTool.js +3324 -3324
  397. package/src/tools/terminalTool.js +2615 -2618
  398. package/src/tools/videoTool.js +1303 -1303
  399. package/src/tools/visionTool.js +508 -508
  400. package/src/tools/visualEditorTool.js +1289 -1290
  401. package/src/tools/webTool.js +3368 -3368
  402. package/src/tools/whatsappTool.js +464 -464
  403. package/src/types/__tests__/agent.test.js +499 -499
  404. package/src/types/__tests__/contextReference.test.js +606 -606
  405. package/src/types/__tests__/conversation.test.js +555 -555
  406. package/src/types/__tests__/toolCommand.test.js +584 -584
  407. package/src/types/contextReference.js +974 -971
  408. package/src/types/conversation.js +729 -729
  409. package/src/types/toolCommand.js +746 -746
  410. package/src/utilities/__tests__/attachmentValidator.test.js +80 -80
  411. package/src/utilities/__tests__/auditReport.test.js +328 -328
  412. package/src/utilities/__tests__/directoryAccessManager.test.js +388 -388
  413. package/src/utilities/__tests__/jsonRepair.test.js +103 -104
  414. package/src/utilities/__tests__/modeTransitionReasons.test.js +105 -105
  415. package/src/utilities/__tests__/platformUtils.test.js +80 -87
  416. package/src/utilities/__tests__/structuredFileValidator.test.js +261 -263
  417. package/src/utilities/__tests__/toolConstants.test.js +92 -94
  418. package/src/utilities/__tests__/useIsTouchDevice.detect.test.js +114 -114
  419. package/src/utilities/__tests__/webUiUtilSync.test.js +117 -117
  420. package/src/utilities/attachmentValidator.js +284 -288
  421. package/src/utilities/authCache.js.backup-1779570472481 +121 -121
  422. package/src/utilities/browserStealth.js +631 -630
  423. package/src/utilities/configManager.js +616 -617
  424. package/src/utilities/directoryAccessManager.js +564 -565
  425. package/src/utilities/fileProcessor.js +308 -307
  426. package/src/utilities/humanBehavior.js +454 -453
  427. package/src/utilities/logger.js +479 -479
  428. package/src/utilities/structuredFileValidator.js +696 -699
  429. package/src/utilities/tagParser.js +5 -10
  430. package/src/utilities/userDataDir.js +308 -308
  431. package/node_modules/@isaacs/brace-expansion/dist/commonjs/index.js.map +0 -1
  432. package/node_modules/@isaacs/brace-expansion/dist/esm/index.js.map +0 -1
  433. package/node_modules/minipass/LICENSE +0 -15
  434. /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/LICENSE.md +0 -0
  435. /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/commonjs/index.d.ts +0 -0
  436. /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/commonjs/index.d.ts.map +0 -0
  437. /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/commonjs/index.js +0 -0
  438. /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/commonjs/index.js.map +0 -0
  439. /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/commonjs/package.json +0 -0
  440. /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/esm/index.d.ts +0 -0
  441. /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/esm/index.d.ts.map +0 -0
  442. /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/esm/index.js +0 -0
  443. /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/esm/index.js.map +0 -0
  444. /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/esm/package.json +0 -0
  445. /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/LICENSE +0 -0
  446. /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/commonjs/index.d.ts +0 -0
  447. /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/commonjs/index.d.ts.map +0 -0
  448. /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/commonjs/package.json +0 -0
  449. /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/esm/index.d.ts +0 -0
  450. /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/esm/index.d.ts.map +0 -0
  451. /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/esm/package.json +0 -0
@@ -1,604 +1,603 @@
1
- /**
2
- * AsyncToolManager - Manage long-running tool operations and status monitoring
3
- *
4
- * Purpose:
5
- * - Track async tool operations across the system
6
- * - Provide status monitoring and updates
7
- * - Handle operation timeouts and cleanup
8
- * - Coordinate between tools and message processor
9
- * - Enable operation cancellation and recovery
10
- */
11
-
12
- import EventEmitter from 'events';
13
- import {
14
- TOOL_STATUS,
15
- SYSTEM_DEFAULTS
16
- } from '../utilities/constants.js';
17
-
18
- class AsyncToolManager extends EventEmitter {
19
- constructor(config = {}, logger = null) {
20
- super();
21
-
22
- this.config = config;
23
- this.logger = logger;
24
-
25
- // Active operations tracking
26
- this.operations = new Map();
27
-
28
- // Operation history for debugging
29
- this.operationHistory = [];
30
-
31
- // Configuration
32
- this.maxConcurrentOperations = config.maxConcurrentOperations || 10;
33
- this.defaultTimeout = config.defaultTimeout || 300000; // 5 minutes
34
- this.cleanupInterval = config.cleanupInterval || 60000; // 1 minute
35
- this.maxHistorySize = config.maxHistorySize || 1000;
36
-
37
- // Status monitoring
38
- this.monitoringInterval = null;
39
- this.isShuttingDown = false;
40
-
41
- // Start monitoring
42
- this.startMonitoring();
43
-
44
- // Bind event handlers
45
- this.on('operation:started', this.handleOperationStarted.bind(this));
46
- this.on('operation:completed', this.handleOperationCompleted.bind(this));
47
- this.on('operation:failed', this.handleOperationFailed.bind(this));
48
- this.on('operation:timeout', this.handleOperationTimeout.bind(this));
49
- }
50
-
51
- /**
52
- * Start a new async operation
53
- * @param {string} toolId - Tool identifier
54
- * @param {string} agentId - Agent identifier
55
- * @param {Object} parameters - Operation parameters
56
- * @param {Object} context - Execution context
57
- * @returns {Promise<string>} Operation ID
58
- */
59
- async startOperation(toolId, agentId, parameters, context = {}) {
60
- if (this.operations.size >= this.maxConcurrentOperations) {
61
- throw new Error(`Maximum concurrent operations reached (${this.maxConcurrentOperations})`);
62
- }
63
-
64
- const operationId = this.generateOperationId();
65
- const operation = {
66
- id: operationId,
67
- toolId,
68
- agentId,
69
- parameters,
70
- context,
71
- status: TOOL_STATUS.PENDING,
72
- createdAt: new Date().toISOString(),
73
- startedAt: null,
74
- completedAt: null,
75
- timeout: context.timeout || this.defaultTimeout,
76
- result: null,
77
- error: null,
78
- progress: null,
79
- retryCount: 0,
80
- maxRetries: context.maxRetries || 0
81
- };
82
-
83
- this.operations.set(operationId, operation);
84
-
85
- this.logger?.info(`Async operation started: ${operationId}`, {
86
- toolId,
87
- agentId,
88
- parametersCount: Object.keys(parameters).length,
89
- timeout: operation.timeout
90
- });
91
-
92
- // Set timeout
93
- this.setOperationTimeout(operationId);
94
-
95
- // Emit event
96
- this.emit('operation:started', operation);
97
-
98
- return operationId;
99
- }
100
-
101
- /**
102
- * Update operation status
103
- * @param {string} operationId - Operation identifier
104
- * @param {string} status - New status
105
- * @param {Object} data - Additional data (result, error, progress)
106
- * @returns {boolean} Success status
107
- */
108
- updateOperation(operationId, status, data = {}) {
109
- const operation = this.operations.get(operationId);
110
- if (!operation) {
111
- this.logger?.warn(`Attempted to update unknown operation: ${operationId}`);
112
- return false;
113
- }
114
-
115
- const previousStatus = operation.status;
116
- operation.status = status;
117
-
118
- // Update timestamps
119
- if (status === TOOL_STATUS.EXECUTING && !operation.startedAt) {
120
- operation.startedAt = new Date().toISOString();
121
- }
122
-
123
- if (status === TOOL_STATUS.COMPLETED || status === TOOL_STATUS.FAILED) {
124
- operation.completedAt = new Date().toISOString();
125
- }
126
-
127
- // Update data
128
- if (data.result !== undefined) operation.result = data.result;
129
- if (data.error !== undefined) operation.error = data.error;
130
- if (data.progress !== undefined) operation.progress = data.progress;
131
-
132
- this.logger?.debug(`Operation status updated: ${operationId}`, {
133
- previousStatus,
134
- newStatus: status,
135
- hasResult: !!data.result,
136
- hasError: !!data.error,
137
- progress: data.progress
138
- });
139
-
140
- // Emit appropriate events
141
- switch (status) {
142
- case TOOL_STATUS.COMPLETED:
143
- this.emit('operation:completed', operation);
144
- break;
145
- case TOOL_STATUS.FAILED:
146
- this.emit('operation:failed', operation);
147
- break;
148
- case TOOL_STATUS.EXECUTING:
149
- this.emit('operation:progress', operation);
150
- break;
151
- }
152
-
153
- return true;
154
- }
155
-
156
- /**
157
- * Get operation status
158
- * @param {string} operationId - Operation identifier
159
- * @returns {Object|null} Operation details or null if not found
160
- */
161
- getOperation(operationId) {
162
- const operation = this.operations.get(operationId);
163
- if (!operation) return null;
164
-
165
- return {
166
- id: operation.id,
167
- toolId: operation.toolId,
168
- agentId: operation.agentId,
169
- status: operation.status,
170
- createdAt: operation.createdAt,
171
- startedAt: operation.startedAt,
172
- completedAt: operation.completedAt,
173
- result: operation.result,
174
- error: operation.error,
175
- progress: operation.progress,
176
- retryCount: operation.retryCount,
177
- executionTime: this.calculateExecutionTime(operation)
178
- };
179
- }
180
-
181
- /**
182
- * Get all operations for an agent
183
- * @param {string} agentId - Agent identifier
184
- * @returns {Array<Object>} Array of operation details
185
- */
186
- getAgentOperations(agentId) {
187
- const operations = [];
188
-
189
- for (const operation of this.operations.values()) {
190
- if (operation.agentId === agentId) {
191
- operations.push(this.getOperation(operation.id));
192
- }
193
- }
194
-
195
- return operations.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt));
196
- }
197
-
198
- /**
199
- * Cancel an operation
200
- * @param {string} operationId - Operation identifier
201
- * @param {string} reason - Cancellation reason
202
- * @returns {boolean} Success status
203
- */
204
- async cancelOperation(operationId, reason = 'Operation cancelled') {
205
- const operation = this.operations.get(operationId);
206
- if (!operation) return false;
207
-
208
- if (operation.status === TOOL_STATUS.COMPLETED || operation.status === TOOL_STATUS.FAILED) {
209
- this.logger?.warn(`Cannot cancel completed/failed operation: ${operationId}`);
210
- return false;
211
- }
212
-
213
- // Update status
214
- this.updateOperation(operationId, TOOL_STATUS.CANCELLED, {
215
- error: reason
216
- });
217
-
218
- // Clear timeout
219
- this.clearOperationTimeout(operationId);
220
-
221
- // Emit cancellation event
222
- this.emit('operation:cancelled', operation);
223
-
224
- // Move to history and cleanup
225
- await this.cleanupOperation(operationId);
226
-
227
- this.logger?.info(`Operation cancelled: ${operationId}`, { reason });
228
-
229
- return true;
230
- }
231
-
232
- /**
233
- * Retry a failed operation
234
- * @param {string} operationId - Operation identifier
235
- * @returns {Promise<boolean>} Success status
236
- */
237
- async retryOperation(operationId) {
238
- const operation = this.operations.get(operationId);
239
- if (!operation) return false;
240
-
241
- if (operation.status !== TOOL_STATUS.FAILED) {
242
- this.logger?.warn(`Cannot retry non-failed operation: ${operationId}`);
243
- return false;
244
- }
245
-
246
- if (operation.retryCount >= operation.maxRetries) {
247
- this.logger?.warn(`Maximum retries exceeded for operation: ${operationId}`);
248
- return false;
249
- }
250
-
251
- // Reset operation state
252
- operation.retryCount++;
253
- operation.status = TOOL_STATUS.PENDING;
254
- operation.startedAt = null;
255
- operation.completedAt = null;
256
- operation.error = null;
257
- operation.result = null;
258
-
259
- // Reset timeout
260
- this.setOperationTimeout(operationId);
261
-
262
- this.logger?.info(`Operation retry initiated: ${operationId}`, {
263
- retryCount: operation.retryCount,
264
- maxRetries: operation.maxRetries
265
- });
266
-
267
- this.emit('operation:retry', operation);
268
-
269
- return true;
270
- }
271
-
272
- /**
273
- * Get system-wide operation statistics
274
- * @returns {Object} Operation statistics
275
- */
276
- getStatistics() {
277
- const stats = {
278
- total: this.operations.size,
279
- byStatus: {},
280
- byTool: {},
281
- byAgent: {},
282
- averageExecutionTime: 0,
283
- oldestOperation: null,
284
- newestOperation: null
285
- };
286
-
287
- let totalExecutionTime = 0;
288
- let executionCount = 0;
289
- let oldestTime = null;
290
- let newestTime = null;
291
-
292
- for (const operation of this.operations.values()) {
293
- // Count by status
294
- stats.byStatus[operation.status] = (stats.byStatus[operation.status] || 0) + 1;
295
-
296
- // Count by tool
297
- stats.byTool[operation.toolId] = (stats.byTool[operation.toolId] || 0) + 1;
298
-
299
- // Count by agent
300
- stats.byAgent[operation.agentId] = (stats.byAgent[operation.agentId] || 0) + 1;
301
-
302
- // Calculate execution time
303
- const execTime = this.calculateExecutionTime(operation);
304
- if (execTime > 0) {
305
- totalExecutionTime += execTime;
306
- executionCount++;
307
- }
308
-
309
- // Track oldest/newest
310
- const createdTime = new Date(operation.createdAt).getTime();
311
- if (!oldestTime || createdTime < oldestTime) {
312
- oldestTime = createdTime;
313
- stats.oldestOperation = operation.id;
314
- }
315
- if (!newestTime || createdTime > newestTime) {
316
- newestTime = createdTime;
317
- stats.newestOperation = operation.id;
318
- }
319
- }
320
-
321
- stats.averageExecutionTime = executionCount > 0 ? Math.round(totalExecutionTime / executionCount) : 0;
322
-
323
- return stats;
324
- }
325
-
326
- /**
327
- * Clean up completed operations
328
- * @param {number} maxAge - Maximum age in milliseconds (default: 1 hour)
329
- * @returns {number} Number of operations cleaned up
330
- */
331
- async cleanupCompletedOperations(maxAge = 3600000) {
332
- const cutoffTime = Date.now() - maxAge;
333
- const toCleanup = [];
334
-
335
- for (const operation of this.operations.values()) {
336
- if ((operation.status === TOOL_STATUS.COMPLETED || operation.status === TOOL_STATUS.FAILED || operation.status === TOOL_STATUS.CANCELLED) &&
337
- new Date(operation.completedAt).getTime() < cutoffTime) {
338
- toCleanup.push(operation.id);
339
- }
340
- }
341
-
342
- for (const operationId of toCleanup) {
343
- await this.cleanupOperation(operationId);
344
- }
345
-
346
- this.logger?.debug(`Cleaned up ${toCleanup.length} completed operations`);
347
-
348
- return toCleanup.length;
349
- }
350
-
351
- /**
352
- * Start monitoring operations
353
- * @private
354
- */
355
- startMonitoring() {
356
- if (this.monitoringInterval) {
357
- clearInterval(this.monitoringInterval);
358
- }
359
-
360
- this.monitoringInterval = setInterval(() => {
361
- this.checkOperationTimeouts();
362
- this.cleanupCompletedOperations();
363
- }, this.cleanupInterval);
364
-
365
- this.logger?.info('Async tool manager monitoring started');
366
- }
367
-
368
- /**
369
- * Stop monitoring operations
370
- * @private
371
- */
372
- stopMonitoring() {
373
- if (this.monitoringInterval) {
374
- clearInterval(this.monitoringInterval);
375
- this.monitoringInterval = null;
376
- }
377
-
378
- this.logger?.info('Async tool manager monitoring stopped');
379
- }
380
-
381
- /**
382
- * Check for operation timeouts
383
- * @private
384
- */
385
- checkOperationTimeouts() {
386
- const now = Date.now();
387
-
388
- for (const operation of this.operations.values()) {
389
- if (operation.status === TOOL_STATUS.EXECUTING || operation.status === TOOL_STATUS.PENDING) {
390
- const createdTime = new Date(operation.createdAt).getTime();
391
- if (now - createdTime > operation.timeout) {
392
- this.handleOperationTimeout(operation);
393
- }
394
- }
395
- }
396
- }
397
-
398
- /**
399
- * Set timeout for operation
400
- * @private
401
- */
402
- setOperationTimeout(operationId) {
403
- const operation = this.operations.get(operationId);
404
- if (!operation) return;
405
-
406
- operation.timeoutHandle = setTimeout(() => {
407
- this.handleOperationTimeout(operation);
408
- }, operation.timeout);
409
- }
410
-
411
- /**
412
- * Clear timeout for operation
413
- * @private
414
- */
415
- clearOperationTimeout(operationId) {
416
- const operation = this.operations.get(operationId);
417
- if (operation && operation.timeoutHandle) {
418
- clearTimeout(operation.timeoutHandle);
419
- delete operation.timeoutHandle;
420
- }
421
- }
422
-
423
- /**
424
- * Generate unique operation ID
425
- * @private
426
- */
427
- generateOperationId() {
428
- const timestamp = Date.now().toString(36);
429
- const random = Math.random().toString(36).substr(2, 9);
430
- return `op-${timestamp}-${random}`;
431
- }
432
-
433
- /**
434
- * Calculate execution time for operation
435
- * @private
436
- */
437
- calculateExecutionTime(operation) {
438
- if (!operation.startedAt) return 0;
439
-
440
- const endTime = operation.completedAt
441
- ? new Date(operation.completedAt).getTime()
442
- : Date.now();
443
-
444
- return endTime - new Date(operation.startedAt).getTime();
445
- }
446
-
447
- /**
448
- * Move operation to history and remove from active
449
- * @private
450
- */
451
- async cleanupOperation(operationId) {
452
- const operation = this.operations.get(operationId);
453
- if (!operation) return;
454
-
455
- // Clear timeout
456
- this.clearOperationTimeout(operationId);
457
-
458
- // Add to history
459
- this.operationHistory.push({
460
- ...operation,
461
- executionTime: this.calculateExecutionTime(operation),
462
- cleanedUpAt: new Date().toISOString()
463
- });
464
-
465
- // Trim history if needed
466
- if (this.operationHistory.length > this.maxHistorySize) {
467
- this.operationHistory = this.operationHistory.slice(-this.maxHistorySize);
468
- }
469
-
470
- // Remove from active operations
471
- this.operations.delete(operationId);
472
-
473
- this.emit('operation:cleanup', { operationId, toolId: operation.toolId });
474
- }
475
-
476
- /**
477
- * Event handler for operation started
478
- * @private
479
- */
480
- handleOperationStarted(operation) {
481
- this.logger?.debug(`Operation started: ${operation.id}`, {
482
- toolId: operation.toolId,
483
- agentId: operation.agentId
484
- });
485
- }
486
-
487
- /**
488
- * Event handler for operation completed
489
- * @private
490
- */
491
- async handleOperationCompleted(operation) {
492
- this.logger?.info(`Operation completed: ${operation.id}`, {
493
- toolId: operation.toolId,
494
- agentId: operation.agentId,
495
- executionTime: this.calculateExecutionTime(operation)
496
- });
497
-
498
- // Schedule cleanup
499
- setTimeout(() => this.cleanupOperation(operation.id), 30000); // 30 seconds
500
- }
501
-
502
- /**
503
- * Event handler for operation failed
504
- * @private
505
- */
506
- async handleOperationFailed(operation) {
507
- this.logger?.error(`Operation failed: ${operation.id}`, {
508
- toolId: operation.toolId,
509
- agentId: operation.agentId,
510
- error: operation.error,
511
- executionTime: this.calculateExecutionTime(operation),
512
- retryCount: operation.retryCount
513
- });
514
-
515
- // Attempt retry if allowed
516
- if (operation.retryCount < operation.maxRetries) {
517
- setTimeout(() => this.retryOperation(operation.id), 5000); // 5 second delay
518
- } else {
519
- // Schedule cleanup
520
- setTimeout(() => this.cleanupOperation(operation.id), 60000); // 1 minute
521
- }
522
- }
523
-
524
- /**
525
- * Event handler for operation timeout
526
- * @private
527
- */
528
- async handleOperationTimeout(operation) {
529
- this.logger?.warn(`Operation timed out: ${operation.id}`, {
530
- toolId: operation.toolId,
531
- agentId: operation.agentId,
532
- timeout: operation.timeout,
533
- executionTime: this.calculateExecutionTime(operation)
534
- });
535
-
536
- this.updateOperation(operation.id, TOOL_STATUS.TIMEOUT, {
537
- error: `Operation timed out after ${operation.timeout}ms`
538
- });
539
-
540
- this.emit('operation:timeout', operation);
541
-
542
- // Schedule cleanup
543
- setTimeout(() => this.cleanupOperation(operation.id), 30000); // 30 seconds
544
- }
545
-
546
- /**
547
- * Graceful shutdown
548
- * @returns {Promise<void>}
549
- */
550
- async shutdown() {
551
- this.isShuttingDown = true;
552
-
553
- this.logger?.info('Shutting down async tool manager...');
554
-
555
- // Stop monitoring
556
- this.stopMonitoring();
557
-
558
- // Cancel all pending/executing operations
559
- const activeOperations = [];
560
- for (const operation of this.operations.values()) {
561
- if (operation.status === TOOL_STATUS.PENDING || operation.status === TOOL_STATUS.EXECUTING) {
562
- activeOperations.push(operation.id);
563
- }
564
- }
565
-
566
- for (const operationId of activeOperations) {
567
- await this.cancelOperation(operationId, 'System shutdown');
568
- }
569
-
570
- // Clear all remaining operations
571
- this.operations.clear();
572
-
573
- this.logger?.info(`Async tool manager shutdown complete. Cancelled ${activeOperations.length} operations.`);
574
- }
575
-
576
- /**
577
- * Get operation history
578
- * @param {Object} filters - Filtering options
579
- * @returns {Array<Object>} Filtered operation history
580
- */
581
- getOperationHistory(filters = {}) {
582
- let history = [...this.operationHistory];
583
-
584
- if (filters.agentId) {
585
- history = history.filter(op => op.agentId === filters.agentId);
586
- }
587
-
588
- if (filters.toolId) {
589
- history = history.filter(op => op.toolId === filters.toolId);
590
- }
591
-
592
- if (filters.status) {
593
- history = history.filter(op => op.status === filters.status);
594
- }
595
-
596
- if (filters.limit) {
597
- history = history.slice(-filters.limit);
598
- }
599
-
600
- return history.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt));
601
- }
602
- }
603
-
1
+ /**
2
+ * AsyncToolManager - Manage long-running tool operations and status monitoring
3
+ *
4
+ * Purpose:
5
+ * - Track async tool operations across the system
6
+ * - Provide status monitoring and updates
7
+ * - Handle operation timeouts and cleanup
8
+ * - Coordinate between tools and message processor
9
+ * - Enable operation cancellation and recovery
10
+ */
11
+
12
+ import EventEmitter from 'events';
13
+ import {
14
+ TOOL_STATUS
15
+ } from '../utilities/constants.js';
16
+
17
+ class AsyncToolManager extends EventEmitter {
18
+ constructor(config = {}, logger = null) {
19
+ super();
20
+
21
+ this.config = config;
22
+ this.logger = logger;
23
+
24
+ // Active operations tracking
25
+ this.operations = new Map();
26
+
27
+ // Operation history for debugging
28
+ this.operationHistory = [];
29
+
30
+ // Configuration
31
+ this.maxConcurrentOperations = config.maxConcurrentOperations || 10;
32
+ this.defaultTimeout = config.defaultTimeout || 300000; // 5 minutes
33
+ this.cleanupInterval = config.cleanupInterval || 60000; // 1 minute
34
+ this.maxHistorySize = config.maxHistorySize || 1000;
35
+
36
+ // Status monitoring
37
+ this.monitoringInterval = null;
38
+ this.isShuttingDown = false;
39
+
40
+ // Start monitoring
41
+ this.startMonitoring();
42
+
43
+ // Bind event handlers
44
+ this.on('operation:started', this.handleOperationStarted.bind(this));
45
+ this.on('operation:completed', this.handleOperationCompleted.bind(this));
46
+ this.on('operation:failed', this.handleOperationFailed.bind(this));
47
+ this.on('operation:timeout', this.handleOperationTimeout.bind(this));
48
+ }
49
+
50
+ /**
51
+ * Start a new async operation
52
+ * @param {string} toolId - Tool identifier
53
+ * @param {string} agentId - Agent identifier
54
+ * @param {Object} parameters - Operation parameters
55
+ * @param {Object} context - Execution context
56
+ * @returns {Promise<string>} Operation ID
57
+ */
58
+ async startOperation(toolId, agentId, parameters, context = {}) {
59
+ if (this.operations.size >= this.maxConcurrentOperations) {
60
+ throw new Error(`Maximum concurrent operations reached (${this.maxConcurrentOperations})`);
61
+ }
62
+
63
+ const operationId = this.generateOperationId();
64
+ const operation = {
65
+ id: operationId,
66
+ toolId,
67
+ agentId,
68
+ parameters,
69
+ context,
70
+ status: TOOL_STATUS.PENDING,
71
+ createdAt: new Date().toISOString(),
72
+ startedAt: null,
73
+ completedAt: null,
74
+ timeout: context.timeout || this.defaultTimeout,
75
+ result: null,
76
+ error: null,
77
+ progress: null,
78
+ retryCount: 0,
79
+ maxRetries: context.maxRetries || 0
80
+ };
81
+
82
+ this.operations.set(operationId, operation);
83
+
84
+ this.logger?.info(`Async operation started: ${operationId}`, {
85
+ toolId,
86
+ agentId,
87
+ parametersCount: Object.keys(parameters).length,
88
+ timeout: operation.timeout
89
+ });
90
+
91
+ // Set timeout
92
+ this.setOperationTimeout(operationId);
93
+
94
+ // Emit event
95
+ this.emit('operation:started', operation);
96
+
97
+ return operationId;
98
+ }
99
+
100
+ /**
101
+ * Update operation status
102
+ * @param {string} operationId - Operation identifier
103
+ * @param {string} status - New status
104
+ * @param {Object} data - Additional data (result, error, progress)
105
+ * @returns {boolean} Success status
106
+ */
107
+ updateOperation(operationId, status, data = {}) {
108
+ const operation = this.operations.get(operationId);
109
+ if (!operation) {
110
+ this.logger?.warn(`Attempted to update unknown operation: ${operationId}`);
111
+ return false;
112
+ }
113
+
114
+ const previousStatus = operation.status;
115
+ operation.status = status;
116
+
117
+ // Update timestamps
118
+ if (status === TOOL_STATUS.EXECUTING && !operation.startedAt) {
119
+ operation.startedAt = new Date().toISOString();
120
+ }
121
+
122
+ if (status === TOOL_STATUS.COMPLETED || status === TOOL_STATUS.FAILED) {
123
+ operation.completedAt = new Date().toISOString();
124
+ }
125
+
126
+ // Update data
127
+ if (data.result !== undefined) operation.result = data.result;
128
+ if (data.error !== undefined) operation.error = data.error;
129
+ if (data.progress !== undefined) operation.progress = data.progress;
130
+
131
+ this.logger?.debug(`Operation status updated: ${operationId}`, {
132
+ previousStatus,
133
+ newStatus: status,
134
+ hasResult: !!data.result,
135
+ hasError: !!data.error,
136
+ progress: data.progress
137
+ });
138
+
139
+ // Emit appropriate events
140
+ switch (status) {
141
+ case TOOL_STATUS.COMPLETED:
142
+ this.emit('operation:completed', operation);
143
+ break;
144
+ case TOOL_STATUS.FAILED:
145
+ this.emit('operation:failed', operation);
146
+ break;
147
+ case TOOL_STATUS.EXECUTING:
148
+ this.emit('operation:progress', operation);
149
+ break;
150
+ }
151
+
152
+ return true;
153
+ }
154
+
155
+ /**
156
+ * Get operation status
157
+ * @param {string} operationId - Operation identifier
158
+ * @returns {Object|null} Operation details or null if not found
159
+ */
160
+ getOperation(operationId) {
161
+ const operation = this.operations.get(operationId);
162
+ if (!operation) return null;
163
+
164
+ return {
165
+ id: operation.id,
166
+ toolId: operation.toolId,
167
+ agentId: operation.agentId,
168
+ status: operation.status,
169
+ createdAt: operation.createdAt,
170
+ startedAt: operation.startedAt,
171
+ completedAt: operation.completedAt,
172
+ result: operation.result,
173
+ error: operation.error,
174
+ progress: operation.progress,
175
+ retryCount: operation.retryCount,
176
+ executionTime: this.calculateExecutionTime(operation)
177
+ };
178
+ }
179
+
180
+ /**
181
+ * Get all operations for an agent
182
+ * @param {string} agentId - Agent identifier
183
+ * @returns {Array<Object>} Array of operation details
184
+ */
185
+ getAgentOperations(agentId) {
186
+ const operations = [];
187
+
188
+ for (const operation of this.operations.values()) {
189
+ if (operation.agentId === agentId) {
190
+ operations.push(this.getOperation(operation.id));
191
+ }
192
+ }
193
+
194
+ return operations.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt));
195
+ }
196
+
197
+ /**
198
+ * Cancel an operation
199
+ * @param {string} operationId - Operation identifier
200
+ * @param {string} reason - Cancellation reason
201
+ * @returns {boolean} Success status
202
+ */
203
+ async cancelOperation(operationId, reason = 'Operation cancelled') {
204
+ const operation = this.operations.get(operationId);
205
+ if (!operation) return false;
206
+
207
+ if (operation.status === TOOL_STATUS.COMPLETED || operation.status === TOOL_STATUS.FAILED) {
208
+ this.logger?.warn(`Cannot cancel completed/failed operation: ${operationId}`);
209
+ return false;
210
+ }
211
+
212
+ // Update status
213
+ this.updateOperation(operationId, TOOL_STATUS.CANCELLED, {
214
+ error: reason
215
+ });
216
+
217
+ // Clear timeout
218
+ this.clearOperationTimeout(operationId);
219
+
220
+ // Emit cancellation event
221
+ this.emit('operation:cancelled', operation);
222
+
223
+ // Move to history and cleanup
224
+ await this.cleanupOperation(operationId);
225
+
226
+ this.logger?.info(`Operation cancelled: ${operationId}`, { reason });
227
+
228
+ return true;
229
+ }
230
+
231
+ /**
232
+ * Retry a failed operation
233
+ * @param {string} operationId - Operation identifier
234
+ * @returns {Promise<boolean>} Success status
235
+ */
236
+ async retryOperation(operationId) {
237
+ const operation = this.operations.get(operationId);
238
+ if (!operation) return false;
239
+
240
+ if (operation.status !== TOOL_STATUS.FAILED) {
241
+ this.logger?.warn(`Cannot retry non-failed operation: ${operationId}`);
242
+ return false;
243
+ }
244
+
245
+ if (operation.retryCount >= operation.maxRetries) {
246
+ this.logger?.warn(`Maximum retries exceeded for operation: ${operationId}`);
247
+ return false;
248
+ }
249
+
250
+ // Reset operation state
251
+ operation.retryCount++;
252
+ operation.status = TOOL_STATUS.PENDING;
253
+ operation.startedAt = null;
254
+ operation.completedAt = null;
255
+ operation.error = null;
256
+ operation.result = null;
257
+
258
+ // Reset timeout
259
+ this.setOperationTimeout(operationId);
260
+
261
+ this.logger?.info(`Operation retry initiated: ${operationId}`, {
262
+ retryCount: operation.retryCount,
263
+ maxRetries: operation.maxRetries
264
+ });
265
+
266
+ this.emit('operation:retry', operation);
267
+
268
+ return true;
269
+ }
270
+
271
+ /**
272
+ * Get system-wide operation statistics
273
+ * @returns {Object} Operation statistics
274
+ */
275
+ getStatistics() {
276
+ const stats = {
277
+ total: this.operations.size,
278
+ byStatus: {},
279
+ byTool: {},
280
+ byAgent: {},
281
+ averageExecutionTime: 0,
282
+ oldestOperation: null,
283
+ newestOperation: null
284
+ };
285
+
286
+ let totalExecutionTime = 0;
287
+ let executionCount = 0;
288
+ let oldestTime = null;
289
+ let newestTime = null;
290
+
291
+ for (const operation of this.operations.values()) {
292
+ // Count by status
293
+ stats.byStatus[operation.status] = (stats.byStatus[operation.status] || 0) + 1;
294
+
295
+ // Count by tool
296
+ stats.byTool[operation.toolId] = (stats.byTool[operation.toolId] || 0) + 1;
297
+
298
+ // Count by agent
299
+ stats.byAgent[operation.agentId] = (stats.byAgent[operation.agentId] || 0) + 1;
300
+
301
+ // Calculate execution time
302
+ const execTime = this.calculateExecutionTime(operation);
303
+ if (execTime > 0) {
304
+ totalExecutionTime += execTime;
305
+ executionCount++;
306
+ }
307
+
308
+ // Track oldest/newest
309
+ const createdTime = new Date(operation.createdAt).getTime();
310
+ if (!oldestTime || createdTime < oldestTime) {
311
+ oldestTime = createdTime;
312
+ stats.oldestOperation = operation.id;
313
+ }
314
+ if (!newestTime || createdTime > newestTime) {
315
+ newestTime = createdTime;
316
+ stats.newestOperation = operation.id;
317
+ }
318
+ }
319
+
320
+ stats.averageExecutionTime = executionCount > 0 ? Math.round(totalExecutionTime / executionCount) : 0;
321
+
322
+ return stats;
323
+ }
324
+
325
+ /**
326
+ * Clean up completed operations
327
+ * @param {number} maxAge - Maximum age in milliseconds (default: 1 hour)
328
+ * @returns {number} Number of operations cleaned up
329
+ */
330
+ async cleanupCompletedOperations(maxAge = 3600000) {
331
+ const cutoffTime = Date.now() - maxAge;
332
+ const toCleanup = [];
333
+
334
+ for (const operation of this.operations.values()) {
335
+ if ((operation.status === TOOL_STATUS.COMPLETED || operation.status === TOOL_STATUS.FAILED || operation.status === TOOL_STATUS.CANCELLED) &&
336
+ new Date(operation.completedAt).getTime() < cutoffTime) {
337
+ toCleanup.push(operation.id);
338
+ }
339
+ }
340
+
341
+ for (const operationId of toCleanup) {
342
+ await this.cleanupOperation(operationId);
343
+ }
344
+
345
+ this.logger?.debug(`Cleaned up ${toCleanup.length} completed operations`);
346
+
347
+ return toCleanup.length;
348
+ }
349
+
350
+ /**
351
+ * Start monitoring operations
352
+ * @private
353
+ */
354
+ startMonitoring() {
355
+ if (this.monitoringInterval) {
356
+ clearInterval(this.monitoringInterval);
357
+ }
358
+
359
+ this.monitoringInterval = setInterval(() => {
360
+ this.checkOperationTimeouts();
361
+ this.cleanupCompletedOperations();
362
+ }, this.cleanupInterval);
363
+
364
+ this.logger?.info('Async tool manager monitoring started');
365
+ }
366
+
367
+ /**
368
+ * Stop monitoring operations
369
+ * @private
370
+ */
371
+ stopMonitoring() {
372
+ if (this.monitoringInterval) {
373
+ clearInterval(this.monitoringInterval);
374
+ this.monitoringInterval = null;
375
+ }
376
+
377
+ this.logger?.info('Async tool manager monitoring stopped');
378
+ }
379
+
380
+ /**
381
+ * Check for operation timeouts
382
+ * @private
383
+ */
384
+ checkOperationTimeouts() {
385
+ const now = Date.now();
386
+
387
+ for (const operation of this.operations.values()) {
388
+ if (operation.status === TOOL_STATUS.EXECUTING || operation.status === TOOL_STATUS.PENDING) {
389
+ const createdTime = new Date(operation.createdAt).getTime();
390
+ if (now - createdTime > operation.timeout) {
391
+ this.handleOperationTimeout(operation);
392
+ }
393
+ }
394
+ }
395
+ }
396
+
397
+ /**
398
+ * Set timeout for operation
399
+ * @private
400
+ */
401
+ setOperationTimeout(operationId) {
402
+ const operation = this.operations.get(operationId);
403
+ if (!operation) return;
404
+
405
+ operation.timeoutHandle = setTimeout(() => {
406
+ this.handleOperationTimeout(operation);
407
+ }, operation.timeout);
408
+ }
409
+
410
+ /**
411
+ * Clear timeout for operation
412
+ * @private
413
+ */
414
+ clearOperationTimeout(operationId) {
415
+ const operation = this.operations.get(operationId);
416
+ if (operation && operation.timeoutHandle) {
417
+ clearTimeout(operation.timeoutHandle);
418
+ delete operation.timeoutHandle;
419
+ }
420
+ }
421
+
422
+ /**
423
+ * Generate unique operation ID
424
+ * @private
425
+ */
426
+ generateOperationId() {
427
+ const timestamp = Date.now().toString(36);
428
+ const random = Math.random().toString(36).substr(2, 9);
429
+ return `op-${timestamp}-${random}`;
430
+ }
431
+
432
+ /**
433
+ * Calculate execution time for operation
434
+ * @private
435
+ */
436
+ calculateExecutionTime(operation) {
437
+ if (!operation.startedAt) return 0;
438
+
439
+ const endTime = operation.completedAt
440
+ ? new Date(operation.completedAt).getTime()
441
+ : Date.now();
442
+
443
+ return endTime - new Date(operation.startedAt).getTime();
444
+ }
445
+
446
+ /**
447
+ * Move operation to history and remove from active
448
+ * @private
449
+ */
450
+ async cleanupOperation(operationId) {
451
+ const operation = this.operations.get(operationId);
452
+ if (!operation) return;
453
+
454
+ // Clear timeout
455
+ this.clearOperationTimeout(operationId);
456
+
457
+ // Add to history
458
+ this.operationHistory.push({
459
+ ...operation,
460
+ executionTime: this.calculateExecutionTime(operation),
461
+ cleanedUpAt: new Date().toISOString()
462
+ });
463
+
464
+ // Trim history if needed
465
+ if (this.operationHistory.length > this.maxHistorySize) {
466
+ this.operationHistory = this.operationHistory.slice(-this.maxHistorySize);
467
+ }
468
+
469
+ // Remove from active operations
470
+ this.operations.delete(operationId);
471
+
472
+ this.emit('operation:cleanup', { operationId, toolId: operation.toolId });
473
+ }
474
+
475
+ /**
476
+ * Event handler for operation started
477
+ * @private
478
+ */
479
+ handleOperationStarted(operation) {
480
+ this.logger?.debug(`Operation started: ${operation.id}`, {
481
+ toolId: operation.toolId,
482
+ agentId: operation.agentId
483
+ });
484
+ }
485
+
486
+ /**
487
+ * Event handler for operation completed
488
+ * @private
489
+ */
490
+ async handleOperationCompleted(operation) {
491
+ this.logger?.info(`Operation completed: ${operation.id}`, {
492
+ toolId: operation.toolId,
493
+ agentId: operation.agentId,
494
+ executionTime: this.calculateExecutionTime(operation)
495
+ });
496
+
497
+ // Schedule cleanup
498
+ setTimeout(() => this.cleanupOperation(operation.id), 30000); // 30 seconds
499
+ }
500
+
501
+ /**
502
+ * Event handler for operation failed
503
+ * @private
504
+ */
505
+ async handleOperationFailed(operation) {
506
+ this.logger?.error(`Operation failed: ${operation.id}`, {
507
+ toolId: operation.toolId,
508
+ agentId: operation.agentId,
509
+ error: operation.error,
510
+ executionTime: this.calculateExecutionTime(operation),
511
+ retryCount: operation.retryCount
512
+ });
513
+
514
+ // Attempt retry if allowed
515
+ if (operation.retryCount < operation.maxRetries) {
516
+ setTimeout(() => this.retryOperation(operation.id), 5000); // 5 second delay
517
+ } else {
518
+ // Schedule cleanup
519
+ setTimeout(() => this.cleanupOperation(operation.id), 60000); // 1 minute
520
+ }
521
+ }
522
+
523
+ /**
524
+ * Event handler for operation timeout
525
+ * @private
526
+ */
527
+ async handleOperationTimeout(operation) {
528
+ this.logger?.warn(`Operation timed out: ${operation.id}`, {
529
+ toolId: operation.toolId,
530
+ agentId: operation.agentId,
531
+ timeout: operation.timeout,
532
+ executionTime: this.calculateExecutionTime(operation)
533
+ });
534
+
535
+ this.updateOperation(operation.id, TOOL_STATUS.TIMEOUT, {
536
+ error: `Operation timed out after ${operation.timeout}ms`
537
+ });
538
+
539
+ this.emit('operation:timeout', operation);
540
+
541
+ // Schedule cleanup
542
+ setTimeout(() => this.cleanupOperation(operation.id), 30000); // 30 seconds
543
+ }
544
+
545
+ /**
546
+ * Graceful shutdown
547
+ * @returns {Promise<void>}
548
+ */
549
+ async shutdown() {
550
+ this.isShuttingDown = true;
551
+
552
+ this.logger?.info('Shutting down async tool manager...');
553
+
554
+ // Stop monitoring
555
+ this.stopMonitoring();
556
+
557
+ // Cancel all pending/executing operations
558
+ const activeOperations = [];
559
+ for (const operation of this.operations.values()) {
560
+ if (operation.status === TOOL_STATUS.PENDING || operation.status === TOOL_STATUS.EXECUTING) {
561
+ activeOperations.push(operation.id);
562
+ }
563
+ }
564
+
565
+ for (const operationId of activeOperations) {
566
+ await this.cancelOperation(operationId, 'System shutdown');
567
+ }
568
+
569
+ // Clear all remaining operations
570
+ this.operations.clear();
571
+
572
+ this.logger?.info(`Async tool manager shutdown complete. Cancelled ${activeOperations.length} operations.`);
573
+ }
574
+
575
+ /**
576
+ * Get operation history
577
+ * @param {Object} filters - Filtering options
578
+ * @returns {Array<Object>} Filtered operation history
579
+ */
580
+ getOperationHistory(filters = {}) {
581
+ let history = [...this.operationHistory];
582
+
583
+ if (filters.agentId) {
584
+ history = history.filter(op => op.agentId === filters.agentId);
585
+ }
586
+
587
+ if (filters.toolId) {
588
+ history = history.filter(op => op.toolId === filters.toolId);
589
+ }
590
+
591
+ if (filters.status) {
592
+ history = history.filter(op => op.status === filters.status);
593
+ }
594
+
595
+ if (filters.limit) {
596
+ history = history.slice(-filters.limit);
597
+ }
598
+
599
+ return history.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt));
600
+ }
601
+ }
602
+
604
603
  export default AsyncToolManager;