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,747 +1,747 @@
1
- /**
2
- * Tool Command Data Model - Type definitions and validation for tool executions
3
- *
4
- * Purpose:
5
- * - Define the structure and properties of tool commands and executions
6
- * - Provide validation functions for tool command data
7
- * - Handle tool execution lifecycle and state management
8
- */
9
-
10
- import { TOOL_STATUS, TOOL_NAMES, OPERATION_STATUS } from '../utilities/constants.js';
11
-
12
- /**
13
- * Tool Command data model
14
- * @typedef {Object} ToolCommand
15
- * @property {string} id - Unique command identifier
16
- * @property {string} toolId - Tool identifier (e.g., 'terminal', 'filesys')
17
- * @property {string} command - Command to execute
18
- * @property {Object} parameters - Command parameters
19
- * @property {string} status - Execution status (pending, executing, completed, failed)
20
- * @property {string} agentId - ID of agent executing the command
21
- * @property {string} conversationId - ID of parent conversation
22
- * @property {string} messageId - ID of parent message
23
- * @property {ToolExecution} execution - Execution details
24
- * @property {ToolMetadata} metadata - Command metadata
25
- * @property {string} createdAt - ISO timestamp of creation
26
- * @property {string} [startedAt] - ISO timestamp when execution started
27
- * @property {string} [completedAt] - ISO timestamp when execution completed
28
- * @property {number} priority - Command priority (1-5)
29
- * @property {number} timeout - Timeout in milliseconds
30
- * @property {number} retryCount - Number of retry attempts
31
- * @property {number} maxRetries - Maximum retry attempts allowed
32
- */
33
-
34
- /**
35
- * Tool Execution details
36
- * @typedef {Object} ToolExecution
37
- * @property {string} executionId - Unique execution identifier
38
- * @property {Object} input - Input parameters provided to tool
39
- * @property {Object} [output] - Tool execution output
40
- * @property {string} [error] - Error message if execution failed
41
- * @property {string} [errorCode] - Error code for programmatic handling
42
- * @property {number} executionTime - Time taken for execution (ms)
43
- * @property {number} memoryUsage - Memory usage during execution (bytes)
44
- * @property {number} cpuUsage - CPU usage percentage
45
- * @property {Object} metrics - Execution metrics and performance data
46
- * @property {ExecutionLog[]} logs - Execution logs and output
47
- * @property {Object} environment - Execution environment information
48
- * @property {string} [workingDirectory] - Working directory for execution
49
- * @property {Object} [environmentVariables] - Environment variables used
50
- */
51
-
52
- /**
53
- * Tool Metadata
54
- * @typedef {Object} ToolMetadata
55
- * @property {string} toolVersion - Version of the tool used
56
- * @property {string[]} capabilities - Tool capabilities used
57
- * @property {Object} configuration - Tool-specific configuration
58
- * @property {boolean} requiresAuth - Whether tool requires authentication
59
- * @property {string[]} dependencies - Tool dependencies
60
- * @property {Object} constraints - Execution constraints
61
- * @property {string[]} tags - Metadata tags
62
- * @property {Object} customFields - Custom metadata fields
63
- */
64
-
65
- /**
66
- * Execution Log entry
67
- * @typedef {Object} ExecutionLog
68
- * @property {string} id - Log entry identifier
69
- * @property {string} level - Log level (debug, info, warn, error)
70
- * @property {string} message - Log message
71
- * @property {string} timestamp - ISO timestamp
72
- * @property {Object} [data] - Additional log data
73
- * @property {string} [source] - Log source component
74
- */
75
-
76
- /**
77
- * Tool Definition
78
- * @typedef {Object} ToolDefinition
79
- * @property {string} id - Tool identifier
80
- * @property {string} name - Human-readable tool name
81
- * @property {string} description - Tool description
82
- * @property {string} version - Tool version
83
- * @property {ToolCapability[]} capabilities - Tool capabilities
84
- * @property {ParameterSchema} parameterSchema - Parameter validation schema
85
- * @property {Object} configuration - Default configuration
86
- * @property {string[]} requiredPermissions - Required permissions
87
- * @property {Object} constraints - Tool constraints and limits
88
- * @property {boolean} isAsync - Whether tool executes asynchronously
89
- * @property {number} defaultTimeout - Default timeout in milliseconds
90
- */
91
-
92
- /**
93
- * Tool Capability
94
- * @typedef {Object} ToolCapability
95
- * @property {string} id - Capability identifier
96
- * @property {string} name - Capability name
97
- * @property {string} description - Capability description
98
- * @property {string[]} commands - Supported commands
99
- * @property {Object} parameters - Capability-specific parameters
100
- * @property {Object} constraints - Capability constraints
101
- */
102
-
103
- /**
104
- * Parameter Schema
105
- * @typedef {Object} ParameterSchema
106
- * @property {Object} properties - Parameter definitions
107
- * @property {string[]} required - Required parameter names
108
- * @property {Object} additionalProperties - Additional property settings
109
- * @property {Object} examples - Example parameter sets
110
- */
111
-
112
- /**
113
- * Tool Command validation functions
114
- */
115
- export class ToolCommandValidator {
116
- /**
117
- * Validate tool command data structure
118
- * @param {Object} command - Tool command to validate
119
- * @returns {Object} Validation result
120
- */
121
- static validate(command) {
122
- const errors = [];
123
- const warnings = [];
124
-
125
- // Required fields
126
- if (!command.id || typeof command.id !== 'string') {
127
- errors.push('Command ID is required and must be a string');
128
- }
129
-
130
- if (!command.toolId || typeof command.toolId !== 'string') {
131
- errors.push('Tool ID is required and must be a string');
132
- }
133
-
134
- if (!command.command || typeof command.command !== 'string') {
135
- errors.push('Command is required and must be a string');
136
- }
137
-
138
- if (!command.agentId || typeof command.agentId !== 'string') {
139
- errors.push('Agent ID is required and must be a string');
140
- }
141
-
142
- // Tool ID validation
143
- if (command.toolId && !Object.values(TOOL_NAMES).includes(command.toolId) && !command.toolId.startsWith('custom_')) {
144
- warnings.push(`Unknown tool ID: ${command.toolId}`);
145
- }
146
-
147
- // Status validation
148
- if (command.status && !Object.values(TOOL_STATUS).includes(command.status)) {
149
- errors.push(`Invalid tool status: ${command.status}`);
150
- }
151
-
152
- // Parameters validation
153
- if (command.parameters && typeof command.parameters !== 'object') {
154
- errors.push('Parameters must be an object');
155
- }
156
-
157
- // Priority validation
158
- if (command.priority !== undefined) {
159
- if (typeof command.priority !== 'number' || command.priority < 1 || command.priority > 5) {
160
- errors.push('Priority must be a number between 1 and 5');
161
- }
162
- }
163
-
164
- // Timeout validation
165
- if (command.timeout !== undefined) {
166
- if (typeof command.timeout !== 'number' || command.timeout < 0) {
167
- errors.push('Timeout must be a non-negative number');
168
- }
169
-
170
- if (command.timeout > 3600000) { // 1 hour
171
- warnings.push('Timeout is very long (>1 hour)');
172
- }
173
- }
174
-
175
- // Retry validation
176
- if (command.retryCount !== undefined && typeof command.retryCount !== 'number') {
177
- errors.push('Retry count must be a number');
178
- }
179
-
180
- if (command.maxRetries !== undefined && typeof command.maxRetries !== 'number') {
181
- errors.push('Max retries must be a number');
182
- }
183
-
184
- if (command.retryCount && command.maxRetries && command.retryCount > command.maxRetries) {
185
- warnings.push('Retry count exceeds max retries');
186
- }
187
-
188
- // Execution validation
189
- if (command.execution) {
190
- const executionValidation = this.validateExecution(command.execution);
191
- errors.push(...executionValidation.errors);
192
- warnings.push(...executionValidation.warnings);
193
- }
194
-
195
- // Timestamp validation
196
- const timestampFields = ['createdAt', 'startedAt', 'completedAt'];
197
- timestampFields.forEach(field => {
198
- if (command[field] && !this.isValidTimestamp(command[field])) {
199
- errors.push(`Invalid timestamp for ${field}: ${command[field]}`);
200
- }
201
- });
202
-
203
- return {
204
- isValid: errors.length === 0,
205
- errors,
206
- warnings
207
- };
208
- }
209
-
210
- /**
211
- * Validate tool execution data
212
- * @param {Object} execution - Execution data to validate
213
- * @returns {Object} Validation result
214
- */
215
- static validateExecution(execution) {
216
- const errors = [];
217
- const warnings = [];
218
-
219
- if (!execution.executionId || typeof execution.executionId !== 'string') {
220
- errors.push('Execution ID is required and must be a string');
221
- }
222
-
223
- if (!execution.input || typeof execution.input !== 'object') {
224
- errors.push('Execution input is required and must be an object');
225
- }
226
-
227
- if (execution.executionTime !== undefined) {
228
- if (typeof execution.executionTime !== 'number' || execution.executionTime < 0) {
229
- errors.push('Execution time must be a non-negative number');
230
- }
231
- }
232
-
233
- if (execution.memoryUsage !== undefined) {
234
- if (typeof execution.memoryUsage !== 'number' || execution.memoryUsage < 0) {
235
- errors.push('Memory usage must be a non-negative number');
236
- }
237
- }
238
-
239
- if (execution.cpuUsage !== undefined) {
240
- if (typeof execution.cpuUsage !== 'number' || execution.cpuUsage < 0 || execution.cpuUsage > 100) {
241
- errors.push('CPU usage must be a number between 0 and 100');
242
- }
243
- }
244
-
245
- if (execution.logs && !Array.isArray(execution.logs)) {
246
- errors.push('Execution logs must be an array');
247
- }
248
-
249
- if (execution.logs) {
250
- execution.logs.forEach((log, index) => {
251
- if (!log.level || !log.message || !log.timestamp) {
252
- errors.push(`Log entry ${index} missing required fields`);
253
- }
254
- });
255
- }
256
-
257
- return { errors, warnings };
258
- }
259
-
260
- /**
261
- * Validate tool definition
262
- * @param {Object} toolDef - Tool definition to validate
263
- * @returns {Object} Validation result
264
- */
265
- static validateToolDefinition(toolDef) {
266
- const errors = [];
267
- const warnings = [];
268
-
269
- // Required fields
270
- if (!toolDef.id || typeof toolDef.id !== 'string') {
271
- errors.push('Tool ID is required and must be a string');
272
- }
273
-
274
- if (!toolDef.name || typeof toolDef.name !== 'string') {
275
- errors.push('Tool name is required and must be a string');
276
- }
277
-
278
- if (!toolDef.description || typeof toolDef.description !== 'string') {
279
- errors.push('Tool description is required and must be a string');
280
- }
281
-
282
- if (!toolDef.version || typeof toolDef.version !== 'string') {
283
- errors.push('Tool version is required and must be a string');
284
- }
285
-
286
- // Capabilities validation
287
- if (!toolDef.capabilities || !Array.isArray(toolDef.capabilities)) {
288
- errors.push('Tool capabilities are required and must be an array');
289
- }
290
-
291
- if (toolDef.capabilities && toolDef.capabilities.length === 0) {
292
- warnings.push('Tool has no capabilities defined');
293
- }
294
-
295
- // Parameter schema validation
296
- if (toolDef.parameterSchema && typeof toolDef.parameterSchema !== 'object') {
297
- errors.push('Parameter schema must be an object');
298
- }
299
-
300
- // Timeout validation
301
- if (toolDef.defaultTimeout !== undefined) {
302
- if (typeof toolDef.defaultTimeout !== 'number' || toolDef.defaultTimeout <= 0) {
303
- errors.push('Default timeout must be a positive number');
304
- }
305
- }
306
-
307
- return { errors, warnings };
308
- }
309
-
310
- /**
311
- * Validate command parameters against tool definition
312
- * @param {Object} parameters - Parameters to validate
313
- * @param {ParameterSchema} schema - Parameter schema
314
- * @returns {Object} Validation result
315
- */
316
- static validateParameters(parameters, schema) {
317
- const errors = [];
318
- const warnings = [];
319
-
320
- if (!schema || !schema.properties) {
321
- return { errors: [], warnings: ['No parameter schema provided'] };
322
- }
323
-
324
- // Check required parameters
325
- if (schema.required) {
326
- schema.required.forEach(paramName => {
327
- if (!(paramName in parameters)) {
328
- errors.push(`Required parameter missing: ${paramName}`);
329
- }
330
- });
331
- }
332
-
333
- // Validate parameter types and constraints
334
- Object.entries(parameters).forEach(([paramName, paramValue]) => {
335
- const paramDef = schema.properties[paramName];
336
-
337
- if (!paramDef) {
338
- if (!schema.additionalProperties) {
339
- warnings.push(`Unknown parameter: ${paramName}`);
340
- }
341
- return;
342
- }
343
-
344
- // Type validation
345
- if (paramDef.type) {
346
- const actualType = Array.isArray(paramValue) ? 'array' : typeof paramValue;
347
- if (actualType !== paramDef.type) {
348
- errors.push(`Parameter ${paramName} must be of type ${paramDef.type}, got ${actualType}`);
349
- }
350
- }
351
-
352
- // Range validation for numbers
353
- if (paramDef.type === 'number') {
354
- if (paramDef.minimum !== undefined && paramValue < paramDef.minimum) {
355
- errors.push(`Parameter ${paramName} must be >= ${paramDef.minimum}`);
356
- }
357
- if (paramDef.maximum !== undefined && paramValue > paramDef.maximum) {
358
- errors.push(`Parameter ${paramName} must be <= ${paramDef.maximum}`);
359
- }
360
- }
361
-
362
- // Length validation for strings
363
- if (paramDef.type === 'string') {
364
- if (paramDef.minLength !== undefined && paramValue.length < paramDef.minLength) {
365
- errors.push(`Parameter ${paramName} must be at least ${paramDef.minLength} characters`);
366
- }
367
- if (paramDef.maxLength !== undefined && paramValue.length > paramDef.maxLength) {
368
- errors.push(`Parameter ${paramName} must be at most ${paramDef.maxLength} characters`);
369
- }
370
- }
371
-
372
- // Enum validation
373
- if (paramDef.enum && !paramDef.enum.includes(paramValue)) {
374
- errors.push(`Parameter ${paramName} must be one of: ${paramDef.enum.join(', ')}`);
375
- }
376
- });
377
-
378
- return { errors, warnings };
379
- }
380
-
381
- /**
382
- * Check if a timestamp is valid ISO string
383
- * @param {string} timestamp - Timestamp to validate
384
- * @returns {boolean} True if valid
385
- */
386
- static isValidTimestamp(timestamp) {
387
- if (typeof timestamp !== 'string') return false;
388
- const date = new Date(timestamp);
389
- return date instanceof Date && !isNaN(date.getTime());
390
- }
391
- }
392
-
393
- /**
394
- * Tool Command factory functions
395
- */
396
- export class ToolCommandFactory {
397
- /**
398
- * Create a new tool command
399
- * @param {string} toolId - Tool identifier
400
- * @param {string} command - Command to execute
401
- * @param {Object} parameters - Command parameters
402
- * @param {Object} options - Additional options
403
- * @returns {ToolCommand} New tool command object
404
- */
405
- static create(toolId, command, parameters, options = {}) {
406
- const now = new Date().toISOString();
407
- const commandId = this.generateCommandId();
408
- const executionId = this.generateExecutionId();
409
-
410
- return {
411
- id: commandId,
412
- toolId,
413
- command,
414
- parameters: parameters || {},
415
- status: TOOL_STATUS.PENDING,
416
- agentId: options.agentId || '',
417
- conversationId: options.conversationId || '',
418
- messageId: options.messageId || '',
419
- execution: {
420
- executionId,
421
- input: { command, parameters },
422
- output: null,
423
- error: null,
424
- errorCode: null,
425
- executionTime: 0,
426
- memoryUsage: 0,
427
- cpuUsage: 0,
428
- metrics: {},
429
- logs: [],
430
- environment: options.environment || {},
431
- workingDirectory: options.workingDirectory || null,
432
- environmentVariables: options.environmentVariables || {}
433
- },
434
- metadata: this.createDefaultMetadata(options.metadata),
435
- createdAt: now,
436
- startedAt: null,
437
- completedAt: null,
438
- priority: options.priority || 3,
439
- timeout: options.timeout || 30000,
440
- retryCount: 0,
441
- maxRetries: options.maxRetries || 3
442
- };
443
- }
444
-
445
- /**
446
- * Create execution log entry
447
- * @param {string} level - Log level
448
- * @param {string} message - Log message
449
- * @param {Object} data - Additional log data
450
- * @returns {ExecutionLog} Log entry
451
- */
452
- static createLogEntry(level, message, data = null) {
453
- return {
454
- id: this.generateLogId(),
455
- level,
456
- message,
457
- timestamp: new Date().toISOString(),
458
- data,
459
- source: 'tool-execution'
460
- };
461
- }
462
-
463
- /**
464
- * Create default tool metadata
465
- * @param {Object} overrides - Metadata overrides
466
- * @returns {ToolMetadata} Default metadata
467
- */
468
- static createDefaultMetadata(overrides = {}) {
469
- return {
470
- toolVersion: '1.0.0',
471
- capabilities: [],
472
- configuration: {},
473
- requiresAuth: false,
474
- dependencies: [],
475
- constraints: {},
476
- tags: [],
477
- customFields: {},
478
- ...overrides
479
- };
480
- }
481
-
482
- /**
483
- * Generate unique command ID
484
- * @returns {string} Unique command ID
485
- */
486
- static generateCommandId() {
487
- const timestamp = Date.now().toString(36);
488
- const random = Math.random().toString(36).substr(2, 9);
489
- return `cmd_${timestamp}_${random}`;
490
- }
491
-
492
- /**
493
- * Generate unique execution ID
494
- * @returns {string} Unique execution ID
495
- */
496
- static generateExecutionId() {
497
- const timestamp = Date.now().toString(36);
498
- const random = Math.random().toString(36).substr(2, 9);
499
- return `exec_${timestamp}_${random}`;
500
- }
501
-
502
- /**
503
- * Generate unique log ID
504
- * @returns {string} Unique log ID
505
- */
506
- static generateLogId() {
507
- const timestamp = Date.now().toString(36);
508
- const random = Math.random().toString(36).substr(2, 6);
509
- return `log_${timestamp}_${random}`;
510
- }
511
- }
512
-
513
- /**
514
- * Tool Command utility functions
515
- */
516
- export class ToolCommandUtils {
517
- /**
518
- * Check if command is still pending
519
- * @param {ToolCommand} command - Command to check
520
- * @returns {boolean} True if pending
521
- */
522
- static isPending(command) {
523
- return command.status === TOOL_STATUS.PENDING;
524
- }
525
-
526
- /**
527
- * Check if command is currently executing
528
- * @param {ToolCommand} command - Command to check
529
- * @returns {boolean} True if executing
530
- */
531
- static isExecuting(command) {
532
- return command.status === TOOL_STATUS.EXECUTING;
533
- }
534
-
535
- /**
536
- * Check if command has completed successfully
537
- * @param {ToolCommand} command - Command to check
538
- * @returns {boolean} True if completed
539
- */
540
- static isCompleted(command) {
541
- return command.status === TOOL_STATUS.COMPLETED;
542
- }
543
-
544
- /**
545
- * Check if command has failed
546
- * @param {ToolCommand} command - Command to check
547
- * @returns {boolean} True if failed
548
- */
549
- static isFailed(command) {
550
- return command.status === TOOL_STATUS.FAILED;
551
- }
552
-
553
- /**
554
- * Check if command has timed out
555
- * @param {ToolCommand} command - Command to check
556
- * @returns {boolean} True if timed out
557
- */
558
- static isTimedOut(command) {
559
- if (!command.startedAt || command.status !== TOOL_STATUS.EXECUTING) {
560
- return false;
561
- }
562
-
563
- const startTime = new Date(command.startedAt);
564
- const now = new Date();
565
- const elapsed = now.getTime() - startTime.getTime();
566
-
567
- return elapsed > command.timeout;
568
- }
569
-
570
- /**
571
- * Calculate command execution time
572
- * @param {ToolCommand} command - Command to analyze
573
- * @returns {number|null} Execution time in milliseconds, null if not applicable
574
- */
575
- static getExecutionTime(command) {
576
- if (!command.startedAt) return null;
577
-
578
- const endTime = command.completedAt ? new Date(command.completedAt) : new Date();
579
- const startTime = new Date(command.startedAt);
580
-
581
- return endTime.getTime() - startTime.getTime();
582
- }
583
-
584
- /**
585
- * Get command progress information
586
- * @param {ToolCommand} command - Command to analyze
587
- * @returns {Object} Progress information
588
- */
589
- static getProgress(command) {
590
- const executionTime = this.getExecutionTime(command);
591
- const isTimedOut = this.isTimedOut(command);
592
-
593
- let progressPercentage = 0;
594
- if (command.status === TOOL_STATUS.COMPLETED) {
595
- progressPercentage = 100;
596
- } else if (command.status === TOOL_STATUS.EXECUTING && executionTime) {
597
- // Estimate progress based on execution time vs timeout
598
- progressPercentage = Math.min(95, (executionTime / command.timeout) * 100);
599
- }
600
-
601
- return {
602
- status: command.status,
603
- percentage: Math.round(progressPercentage),
604
- executionTime,
605
- isTimedOut,
606
- remainingTime: command.status === TOOL_STATUS.EXECUTING && executionTime
607
- ? Math.max(0, command.timeout - executionTime)
608
- : null
609
- };
610
- }
611
-
612
- /**
613
- * Extract key metrics from command execution
614
- * @param {ToolCommand} command - Command to analyze
615
- * @returns {Object} Execution metrics
616
- */
617
- static getMetrics(command) {
618
- const execution = command.execution || {};
619
- const progress = this.getProgress(command);
620
-
621
- return {
622
- executionTime: execution.executionTime || progress.executionTime || 0,
623
- memoryUsage: execution.memoryUsage || 0,
624
- cpuUsage: execution.cpuUsage || 0,
625
- status: command.status,
626
- retryCount: command.retryCount,
627
- priority: command.priority,
628
- logEntries: execution.logs ? execution.logs.length : 0,
629
- hasError: !!execution.error,
630
- errorCode: execution.errorCode || null
631
- };
632
- }
633
-
634
- /**
635
- * Format command for display
636
- * @param {ToolCommand} command - Command to format
637
- * @returns {Object} Formatted command data
638
- */
639
- static formatForDisplay(command) {
640
- const progress = this.getProgress(command);
641
- const metrics = this.getMetrics(command);
642
-
643
- return {
644
- id: command.id,
645
- toolId: command.toolId,
646
- command: command.command,
647
- status: command.status,
648
- progress: progress.percentage,
649
- executionTime: metrics.executionTime,
650
- createdAt: command.createdAt,
651
- startedAt: command.startedAt,
652
- completedAt: command.completedAt,
653
- hasError: metrics.hasError,
654
- retryCount: command.retryCount
655
- };
656
- }
657
-
658
- /**
659
- * Sanitize command for API responses
660
- * @param {ToolCommand} command - Command to sanitize
661
- * @returns {Object} Sanitized command data
662
- */
663
- static sanitize(command) {
664
- const sanitized = { ...command };
665
-
666
- // Remove sensitive execution data
667
- if (sanitized.execution) {
668
- delete sanitized.execution.environmentVariables;
669
- delete sanitized.execution.environment;
670
-
671
- // Truncate long logs
672
- if (sanitized.execution.logs && sanitized.execution.logs.length > 10) {
673
- sanitized.execution.logs = sanitized.execution.logs.slice(-10);
674
- }
675
- }
676
-
677
- // Remove sensitive parameters
678
- if (sanitized.parameters) {
679
- const sensitiveKeys = ['password', 'token', 'secret', 'key', 'auth'];
680
- Object.keys(sanitized.parameters).forEach(key => {
681
- if (sensitiveKeys.some(sensitive => key.toLowerCase().includes(sensitive))) {
682
- sanitized.parameters[key] = '[REDACTED]';
683
- }
684
- });
685
- }
686
-
687
- return sanitized;
688
- }
689
-
690
- /**
691
- * Create command summary for reporting
692
- * @param {ToolCommand[]} commands - Commands to summarize
693
- * @returns {Object} Command summary
694
- */
695
- static summarizeCommands(commands) {
696
- const summary = {
697
- total: commands.length,
698
- byStatus: {},
699
- byTool: {},
700
- totalExecutionTime: 0,
701
- averageExecutionTime: 0,
702
- successRate: 0,
703
- mostUsedTools: [],
704
- recentCommands: []
705
- };
706
-
707
- // Count by status
708
- Object.values(TOOL_STATUS).forEach(status => {
709
- summary.byStatus[status] = commands.filter(cmd => cmd.status === status).length;
710
- });
711
-
712
- // Count by tool
713
- commands.forEach(command => {
714
- summary.byTool[command.toolId] = (summary.byTool[command.toolId] || 0) + 1;
715
-
716
- const executionTime = this.getExecutionTime(command) || 0;
717
- summary.totalExecutionTime += executionTime;
718
- });
719
-
720
- // Calculate averages and rates
721
- if (commands.length > 0) {
722
- summary.averageExecutionTime = summary.totalExecutionTime / commands.length;
723
- const successfulCommands = summary.byStatus[TOOL_STATUS.COMPLETED] || 0;
724
- summary.successRate = (successfulCommands / commands.length) * 100;
725
- }
726
-
727
- // Most used tools
728
- summary.mostUsedTools = Object.entries(summary.byTool)
729
- .sort((a, b) => b[1] - a[1])
730
- .slice(0, 5)
731
- .map(([toolId, count]) => ({ toolId, count }));
732
-
733
- // Recent commands
734
- summary.recentCommands = commands
735
- .sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt))
736
- .slice(0, 10)
737
- .map(cmd => this.formatForDisplay(cmd));
738
-
739
- return summary;
740
- }
741
- }
742
-
743
- export default {
744
- ToolCommandValidator,
745
- ToolCommandFactory,
746
- ToolCommandUtils
1
+ /**
2
+ * Tool Command Data Model - Type definitions and validation for tool executions
3
+ *
4
+ * Purpose:
5
+ * - Define the structure and properties of tool commands and executions
6
+ * - Provide validation functions for tool command data
7
+ * - Handle tool execution lifecycle and state management
8
+ */
9
+
10
+ import { TOOL_STATUS, TOOL_NAMES } from '../utilities/constants.js';
11
+
12
+ /**
13
+ * Tool Command data model
14
+ * @typedef {Object} ToolCommand
15
+ * @property {string} id - Unique command identifier
16
+ * @property {string} toolId - Tool identifier (e.g., 'terminal', 'filesys')
17
+ * @property {string} command - Command to execute
18
+ * @property {Object} parameters - Command parameters
19
+ * @property {string} status - Execution status (pending, executing, completed, failed)
20
+ * @property {string} agentId - ID of agent executing the command
21
+ * @property {string} conversationId - ID of parent conversation
22
+ * @property {string} messageId - ID of parent message
23
+ * @property {ToolExecution} execution - Execution details
24
+ * @property {ToolMetadata} metadata - Command metadata
25
+ * @property {string} createdAt - ISO timestamp of creation
26
+ * @property {string} [startedAt] - ISO timestamp when execution started
27
+ * @property {string} [completedAt] - ISO timestamp when execution completed
28
+ * @property {number} priority - Command priority (1-5)
29
+ * @property {number} timeout - Timeout in milliseconds
30
+ * @property {number} retryCount - Number of retry attempts
31
+ * @property {number} maxRetries - Maximum retry attempts allowed
32
+ */
33
+
34
+ /**
35
+ * Tool Execution details
36
+ * @typedef {Object} ToolExecution
37
+ * @property {string} executionId - Unique execution identifier
38
+ * @property {Object} input - Input parameters provided to tool
39
+ * @property {Object} [output] - Tool execution output
40
+ * @property {string} [error] - Error message if execution failed
41
+ * @property {string} [errorCode] - Error code for programmatic handling
42
+ * @property {number} executionTime - Time taken for execution (ms)
43
+ * @property {number} memoryUsage - Memory usage during execution (bytes)
44
+ * @property {number} cpuUsage - CPU usage percentage
45
+ * @property {Object} metrics - Execution metrics and performance data
46
+ * @property {ExecutionLog[]} logs - Execution logs and output
47
+ * @property {Object} environment - Execution environment information
48
+ * @property {string} [workingDirectory] - Working directory for execution
49
+ * @property {Object} [environmentVariables] - Environment variables used
50
+ */
51
+
52
+ /**
53
+ * Tool Metadata
54
+ * @typedef {Object} ToolMetadata
55
+ * @property {string} toolVersion - Version of the tool used
56
+ * @property {string[]} capabilities - Tool capabilities used
57
+ * @property {Object} configuration - Tool-specific configuration
58
+ * @property {boolean} requiresAuth - Whether tool requires authentication
59
+ * @property {string[]} dependencies - Tool dependencies
60
+ * @property {Object} constraints - Execution constraints
61
+ * @property {string[]} tags - Metadata tags
62
+ * @property {Object} customFields - Custom metadata fields
63
+ */
64
+
65
+ /**
66
+ * Execution Log entry
67
+ * @typedef {Object} ExecutionLog
68
+ * @property {string} id - Log entry identifier
69
+ * @property {string} level - Log level (debug, info, warn, error)
70
+ * @property {string} message - Log message
71
+ * @property {string} timestamp - ISO timestamp
72
+ * @property {Object} [data] - Additional log data
73
+ * @property {string} [source] - Log source component
74
+ */
75
+
76
+ /**
77
+ * Tool Definition
78
+ * @typedef {Object} ToolDefinition
79
+ * @property {string} id - Tool identifier
80
+ * @property {string} name - Human-readable tool name
81
+ * @property {string} description - Tool description
82
+ * @property {string} version - Tool version
83
+ * @property {ToolCapability[]} capabilities - Tool capabilities
84
+ * @property {ParameterSchema} parameterSchema - Parameter validation schema
85
+ * @property {Object} configuration - Default configuration
86
+ * @property {string[]} requiredPermissions - Required permissions
87
+ * @property {Object} constraints - Tool constraints and limits
88
+ * @property {boolean} isAsync - Whether tool executes asynchronously
89
+ * @property {number} defaultTimeout - Default timeout in milliseconds
90
+ */
91
+
92
+ /**
93
+ * Tool Capability
94
+ * @typedef {Object} ToolCapability
95
+ * @property {string} id - Capability identifier
96
+ * @property {string} name - Capability name
97
+ * @property {string} description - Capability description
98
+ * @property {string[]} commands - Supported commands
99
+ * @property {Object} parameters - Capability-specific parameters
100
+ * @property {Object} constraints - Capability constraints
101
+ */
102
+
103
+ /**
104
+ * Parameter Schema
105
+ * @typedef {Object} ParameterSchema
106
+ * @property {Object} properties - Parameter definitions
107
+ * @property {string[]} required - Required parameter names
108
+ * @property {Object} additionalProperties - Additional property settings
109
+ * @property {Object} examples - Example parameter sets
110
+ */
111
+
112
+ /**
113
+ * Tool Command validation functions
114
+ */
115
+ export class ToolCommandValidator {
116
+ /**
117
+ * Validate tool command data structure
118
+ * @param {Object} command - Tool command to validate
119
+ * @returns {Object} Validation result
120
+ */
121
+ static validate(command) {
122
+ const errors = [];
123
+ const warnings = [];
124
+
125
+ // Required fields
126
+ if (!command.id || typeof command.id !== 'string') {
127
+ errors.push('Command ID is required and must be a string');
128
+ }
129
+
130
+ if (!command.toolId || typeof command.toolId !== 'string') {
131
+ errors.push('Tool ID is required and must be a string');
132
+ }
133
+
134
+ if (!command.command || typeof command.command !== 'string') {
135
+ errors.push('Command is required and must be a string');
136
+ }
137
+
138
+ if (!command.agentId || typeof command.agentId !== 'string') {
139
+ errors.push('Agent ID is required and must be a string');
140
+ }
141
+
142
+ // Tool ID validation
143
+ if (command.toolId && !Object.values(TOOL_NAMES).includes(command.toolId) && !command.toolId.startsWith('custom_')) {
144
+ warnings.push(`Unknown tool ID: ${command.toolId}`);
145
+ }
146
+
147
+ // Status validation
148
+ if (command.status && !Object.values(TOOL_STATUS).includes(command.status)) {
149
+ errors.push(`Invalid tool status: ${command.status}`);
150
+ }
151
+
152
+ // Parameters validation
153
+ if (command.parameters && typeof command.parameters !== 'object') {
154
+ errors.push('Parameters must be an object');
155
+ }
156
+
157
+ // Priority validation
158
+ if (command.priority !== undefined) {
159
+ if (typeof command.priority !== 'number' || command.priority < 1 || command.priority > 5) {
160
+ errors.push('Priority must be a number between 1 and 5');
161
+ }
162
+ }
163
+
164
+ // Timeout validation
165
+ if (command.timeout !== undefined) {
166
+ if (typeof command.timeout !== 'number' || command.timeout < 0) {
167
+ errors.push('Timeout must be a non-negative number');
168
+ }
169
+
170
+ if (command.timeout > 3600000) { // 1 hour
171
+ warnings.push('Timeout is very long (>1 hour)');
172
+ }
173
+ }
174
+
175
+ // Retry validation
176
+ if (command.retryCount !== undefined && typeof command.retryCount !== 'number') {
177
+ errors.push('Retry count must be a number');
178
+ }
179
+
180
+ if (command.maxRetries !== undefined && typeof command.maxRetries !== 'number') {
181
+ errors.push('Max retries must be a number');
182
+ }
183
+
184
+ if (command.retryCount && command.maxRetries && command.retryCount > command.maxRetries) {
185
+ warnings.push('Retry count exceeds max retries');
186
+ }
187
+
188
+ // Execution validation
189
+ if (command.execution) {
190
+ const executionValidation = this.validateExecution(command.execution);
191
+ errors.push(...executionValidation.errors);
192
+ warnings.push(...executionValidation.warnings);
193
+ }
194
+
195
+ // Timestamp validation
196
+ const timestampFields = ['createdAt', 'startedAt', 'completedAt'];
197
+ timestampFields.forEach(field => {
198
+ if (command[field] && !this.isValidTimestamp(command[field])) {
199
+ errors.push(`Invalid timestamp for ${field}: ${command[field]}`);
200
+ }
201
+ });
202
+
203
+ return {
204
+ isValid: errors.length === 0,
205
+ errors,
206
+ warnings
207
+ };
208
+ }
209
+
210
+ /**
211
+ * Validate tool execution data
212
+ * @param {Object} execution - Execution data to validate
213
+ * @returns {Object} Validation result
214
+ */
215
+ static validateExecution(execution) {
216
+ const errors = [];
217
+ const warnings = [];
218
+
219
+ if (!execution.executionId || typeof execution.executionId !== 'string') {
220
+ errors.push('Execution ID is required and must be a string');
221
+ }
222
+
223
+ if (!execution.input || typeof execution.input !== 'object') {
224
+ errors.push('Execution input is required and must be an object');
225
+ }
226
+
227
+ if (execution.executionTime !== undefined) {
228
+ if (typeof execution.executionTime !== 'number' || execution.executionTime < 0) {
229
+ errors.push('Execution time must be a non-negative number');
230
+ }
231
+ }
232
+
233
+ if (execution.memoryUsage !== undefined) {
234
+ if (typeof execution.memoryUsage !== 'number' || execution.memoryUsage < 0) {
235
+ errors.push('Memory usage must be a non-negative number');
236
+ }
237
+ }
238
+
239
+ if (execution.cpuUsage !== undefined) {
240
+ if (typeof execution.cpuUsage !== 'number' || execution.cpuUsage < 0 || execution.cpuUsage > 100) {
241
+ errors.push('CPU usage must be a number between 0 and 100');
242
+ }
243
+ }
244
+
245
+ if (execution.logs && !Array.isArray(execution.logs)) {
246
+ errors.push('Execution logs must be an array');
247
+ }
248
+
249
+ if (execution.logs) {
250
+ execution.logs.forEach((log, index) => {
251
+ if (!log.level || !log.message || !log.timestamp) {
252
+ errors.push(`Log entry ${index} missing required fields`);
253
+ }
254
+ });
255
+ }
256
+
257
+ return { errors, warnings };
258
+ }
259
+
260
+ /**
261
+ * Validate tool definition
262
+ * @param {Object} toolDef - Tool definition to validate
263
+ * @returns {Object} Validation result
264
+ */
265
+ static validateToolDefinition(toolDef) {
266
+ const errors = [];
267
+ const warnings = [];
268
+
269
+ // Required fields
270
+ if (!toolDef.id || typeof toolDef.id !== 'string') {
271
+ errors.push('Tool ID is required and must be a string');
272
+ }
273
+
274
+ if (!toolDef.name || typeof toolDef.name !== 'string') {
275
+ errors.push('Tool name is required and must be a string');
276
+ }
277
+
278
+ if (!toolDef.description || typeof toolDef.description !== 'string') {
279
+ errors.push('Tool description is required and must be a string');
280
+ }
281
+
282
+ if (!toolDef.version || typeof toolDef.version !== 'string') {
283
+ errors.push('Tool version is required and must be a string');
284
+ }
285
+
286
+ // Capabilities validation
287
+ if (!toolDef.capabilities || !Array.isArray(toolDef.capabilities)) {
288
+ errors.push('Tool capabilities are required and must be an array');
289
+ }
290
+
291
+ if (toolDef.capabilities && toolDef.capabilities.length === 0) {
292
+ warnings.push('Tool has no capabilities defined');
293
+ }
294
+
295
+ // Parameter schema validation
296
+ if (toolDef.parameterSchema && typeof toolDef.parameterSchema !== 'object') {
297
+ errors.push('Parameter schema must be an object');
298
+ }
299
+
300
+ // Timeout validation
301
+ if (toolDef.defaultTimeout !== undefined) {
302
+ if (typeof toolDef.defaultTimeout !== 'number' || toolDef.defaultTimeout <= 0) {
303
+ errors.push('Default timeout must be a positive number');
304
+ }
305
+ }
306
+
307
+ return { errors, warnings };
308
+ }
309
+
310
+ /**
311
+ * Validate command parameters against tool definition
312
+ * @param {Object} parameters - Parameters to validate
313
+ * @param {ParameterSchema} schema - Parameter schema
314
+ * @returns {Object} Validation result
315
+ */
316
+ static validateParameters(parameters, schema) {
317
+ const errors = [];
318
+ const warnings = [];
319
+
320
+ if (!schema || !schema.properties) {
321
+ return { errors: [], warnings: ['No parameter schema provided'] };
322
+ }
323
+
324
+ // Check required parameters
325
+ if (schema.required) {
326
+ schema.required.forEach(paramName => {
327
+ if (!(paramName in parameters)) {
328
+ errors.push(`Required parameter missing: ${paramName}`);
329
+ }
330
+ });
331
+ }
332
+
333
+ // Validate parameter types and constraints
334
+ Object.entries(parameters).forEach(([paramName, paramValue]) => {
335
+ const paramDef = schema.properties[paramName];
336
+
337
+ if (!paramDef) {
338
+ if (!schema.additionalProperties) {
339
+ warnings.push(`Unknown parameter: ${paramName}`);
340
+ }
341
+ return;
342
+ }
343
+
344
+ // Type validation
345
+ if (paramDef.type) {
346
+ const actualType = Array.isArray(paramValue) ? 'array' : typeof paramValue;
347
+ if (actualType !== paramDef.type) {
348
+ errors.push(`Parameter ${paramName} must be of type ${paramDef.type}, got ${actualType}`);
349
+ }
350
+ }
351
+
352
+ // Range validation for numbers
353
+ if (paramDef.type === 'number') {
354
+ if (paramDef.minimum !== undefined && paramValue < paramDef.minimum) {
355
+ errors.push(`Parameter ${paramName} must be >= ${paramDef.minimum}`);
356
+ }
357
+ if (paramDef.maximum !== undefined && paramValue > paramDef.maximum) {
358
+ errors.push(`Parameter ${paramName} must be <= ${paramDef.maximum}`);
359
+ }
360
+ }
361
+
362
+ // Length validation for strings
363
+ if (paramDef.type === 'string') {
364
+ if (paramDef.minLength !== undefined && paramValue.length < paramDef.minLength) {
365
+ errors.push(`Parameter ${paramName} must be at least ${paramDef.minLength} characters`);
366
+ }
367
+ if (paramDef.maxLength !== undefined && paramValue.length > paramDef.maxLength) {
368
+ errors.push(`Parameter ${paramName} must be at most ${paramDef.maxLength} characters`);
369
+ }
370
+ }
371
+
372
+ // Enum validation
373
+ if (paramDef.enum && !paramDef.enum.includes(paramValue)) {
374
+ errors.push(`Parameter ${paramName} must be one of: ${paramDef.enum.join(', ')}`);
375
+ }
376
+ });
377
+
378
+ return { errors, warnings };
379
+ }
380
+
381
+ /**
382
+ * Check if a timestamp is valid ISO string
383
+ * @param {string} timestamp - Timestamp to validate
384
+ * @returns {boolean} True if valid
385
+ */
386
+ static isValidTimestamp(timestamp) {
387
+ if (typeof timestamp !== 'string') return false;
388
+ const date = new Date(timestamp);
389
+ return date instanceof Date && !isNaN(date.getTime());
390
+ }
391
+ }
392
+
393
+ /**
394
+ * Tool Command factory functions
395
+ */
396
+ export class ToolCommandFactory {
397
+ /**
398
+ * Create a new tool command
399
+ * @param {string} toolId - Tool identifier
400
+ * @param {string} command - Command to execute
401
+ * @param {Object} parameters - Command parameters
402
+ * @param {Object} options - Additional options
403
+ * @returns {ToolCommand} New tool command object
404
+ */
405
+ static create(toolId, command, parameters, options = {}) {
406
+ const now = new Date().toISOString();
407
+ const commandId = this.generateCommandId();
408
+ const executionId = this.generateExecutionId();
409
+
410
+ return {
411
+ id: commandId,
412
+ toolId,
413
+ command,
414
+ parameters: parameters || {},
415
+ status: TOOL_STATUS.PENDING,
416
+ agentId: options.agentId || '',
417
+ conversationId: options.conversationId || '',
418
+ messageId: options.messageId || '',
419
+ execution: {
420
+ executionId,
421
+ input: { command, parameters },
422
+ output: null,
423
+ error: null,
424
+ errorCode: null,
425
+ executionTime: 0,
426
+ memoryUsage: 0,
427
+ cpuUsage: 0,
428
+ metrics: {},
429
+ logs: [],
430
+ environment: options.environment || {},
431
+ workingDirectory: options.workingDirectory || null,
432
+ environmentVariables: options.environmentVariables || {}
433
+ },
434
+ metadata: this.createDefaultMetadata(options.metadata),
435
+ createdAt: now,
436
+ startedAt: null,
437
+ completedAt: null,
438
+ priority: options.priority || 3,
439
+ timeout: options.timeout || 30000,
440
+ retryCount: 0,
441
+ maxRetries: options.maxRetries || 3
442
+ };
443
+ }
444
+
445
+ /**
446
+ * Create execution log entry
447
+ * @param {string} level - Log level
448
+ * @param {string} message - Log message
449
+ * @param {Object} data - Additional log data
450
+ * @returns {ExecutionLog} Log entry
451
+ */
452
+ static createLogEntry(level, message, data = null) {
453
+ return {
454
+ id: this.generateLogId(),
455
+ level,
456
+ message,
457
+ timestamp: new Date().toISOString(),
458
+ data,
459
+ source: 'tool-execution'
460
+ };
461
+ }
462
+
463
+ /**
464
+ * Create default tool metadata
465
+ * @param {Object} overrides - Metadata overrides
466
+ * @returns {ToolMetadata} Default metadata
467
+ */
468
+ static createDefaultMetadata(overrides = {}) {
469
+ return {
470
+ toolVersion: '1.0.0',
471
+ capabilities: [],
472
+ configuration: {},
473
+ requiresAuth: false,
474
+ dependencies: [],
475
+ constraints: {},
476
+ tags: [],
477
+ customFields: {},
478
+ ...overrides
479
+ };
480
+ }
481
+
482
+ /**
483
+ * Generate unique command ID
484
+ * @returns {string} Unique command ID
485
+ */
486
+ static generateCommandId() {
487
+ const timestamp = Date.now().toString(36);
488
+ const random = Math.random().toString(36).substr(2, 9);
489
+ return `cmd_${timestamp}_${random}`;
490
+ }
491
+
492
+ /**
493
+ * Generate unique execution ID
494
+ * @returns {string} Unique execution ID
495
+ */
496
+ static generateExecutionId() {
497
+ const timestamp = Date.now().toString(36);
498
+ const random = Math.random().toString(36).substr(2, 9);
499
+ return `exec_${timestamp}_${random}`;
500
+ }
501
+
502
+ /**
503
+ * Generate unique log ID
504
+ * @returns {string} Unique log ID
505
+ */
506
+ static generateLogId() {
507
+ const timestamp = Date.now().toString(36);
508
+ const random = Math.random().toString(36).substr(2, 6);
509
+ return `log_${timestamp}_${random}`;
510
+ }
511
+ }
512
+
513
+ /**
514
+ * Tool Command utility functions
515
+ */
516
+ export class ToolCommandUtils {
517
+ /**
518
+ * Check if command is still pending
519
+ * @param {ToolCommand} command - Command to check
520
+ * @returns {boolean} True if pending
521
+ */
522
+ static isPending(command) {
523
+ return command.status === TOOL_STATUS.PENDING;
524
+ }
525
+
526
+ /**
527
+ * Check if command is currently executing
528
+ * @param {ToolCommand} command - Command to check
529
+ * @returns {boolean} True if executing
530
+ */
531
+ static isExecuting(command) {
532
+ return command.status === TOOL_STATUS.EXECUTING;
533
+ }
534
+
535
+ /**
536
+ * Check if command has completed successfully
537
+ * @param {ToolCommand} command - Command to check
538
+ * @returns {boolean} True if completed
539
+ */
540
+ static isCompleted(command) {
541
+ return command.status === TOOL_STATUS.COMPLETED;
542
+ }
543
+
544
+ /**
545
+ * Check if command has failed
546
+ * @param {ToolCommand} command - Command to check
547
+ * @returns {boolean} True if failed
548
+ */
549
+ static isFailed(command) {
550
+ return command.status === TOOL_STATUS.FAILED;
551
+ }
552
+
553
+ /**
554
+ * Check if command has timed out
555
+ * @param {ToolCommand} command - Command to check
556
+ * @returns {boolean} True if timed out
557
+ */
558
+ static isTimedOut(command) {
559
+ if (!command.startedAt || command.status !== TOOL_STATUS.EXECUTING) {
560
+ return false;
561
+ }
562
+
563
+ const startTime = new Date(command.startedAt);
564
+ const now = new Date();
565
+ const elapsed = now.getTime() - startTime.getTime();
566
+
567
+ return elapsed > command.timeout;
568
+ }
569
+
570
+ /**
571
+ * Calculate command execution time
572
+ * @param {ToolCommand} command - Command to analyze
573
+ * @returns {number|null} Execution time in milliseconds, null if not applicable
574
+ */
575
+ static getExecutionTime(command) {
576
+ if (!command.startedAt) return null;
577
+
578
+ const endTime = command.completedAt ? new Date(command.completedAt) : new Date();
579
+ const startTime = new Date(command.startedAt);
580
+
581
+ return endTime.getTime() - startTime.getTime();
582
+ }
583
+
584
+ /**
585
+ * Get command progress information
586
+ * @param {ToolCommand} command - Command to analyze
587
+ * @returns {Object} Progress information
588
+ */
589
+ static getProgress(command) {
590
+ const executionTime = this.getExecutionTime(command);
591
+ const isTimedOut = this.isTimedOut(command);
592
+
593
+ let progressPercentage = 0;
594
+ if (command.status === TOOL_STATUS.COMPLETED) {
595
+ progressPercentage = 100;
596
+ } else if (command.status === TOOL_STATUS.EXECUTING && executionTime) {
597
+ // Estimate progress based on execution time vs timeout
598
+ progressPercentage = Math.min(95, (executionTime / command.timeout) * 100);
599
+ }
600
+
601
+ return {
602
+ status: command.status,
603
+ percentage: Math.round(progressPercentage),
604
+ executionTime,
605
+ isTimedOut,
606
+ remainingTime: command.status === TOOL_STATUS.EXECUTING && executionTime
607
+ ? Math.max(0, command.timeout - executionTime)
608
+ : null
609
+ };
610
+ }
611
+
612
+ /**
613
+ * Extract key metrics from command execution
614
+ * @param {ToolCommand} command - Command to analyze
615
+ * @returns {Object} Execution metrics
616
+ */
617
+ static getMetrics(command) {
618
+ const execution = command.execution || {};
619
+ const progress = this.getProgress(command);
620
+
621
+ return {
622
+ executionTime: execution.executionTime || progress.executionTime || 0,
623
+ memoryUsage: execution.memoryUsage || 0,
624
+ cpuUsage: execution.cpuUsage || 0,
625
+ status: command.status,
626
+ retryCount: command.retryCount,
627
+ priority: command.priority,
628
+ logEntries: execution.logs ? execution.logs.length : 0,
629
+ hasError: !!execution.error,
630
+ errorCode: execution.errorCode || null
631
+ };
632
+ }
633
+
634
+ /**
635
+ * Format command for display
636
+ * @param {ToolCommand} command - Command to format
637
+ * @returns {Object} Formatted command data
638
+ */
639
+ static formatForDisplay(command) {
640
+ const progress = this.getProgress(command);
641
+ const metrics = this.getMetrics(command);
642
+
643
+ return {
644
+ id: command.id,
645
+ toolId: command.toolId,
646
+ command: command.command,
647
+ status: command.status,
648
+ progress: progress.percentage,
649
+ executionTime: metrics.executionTime,
650
+ createdAt: command.createdAt,
651
+ startedAt: command.startedAt,
652
+ completedAt: command.completedAt,
653
+ hasError: metrics.hasError,
654
+ retryCount: command.retryCount
655
+ };
656
+ }
657
+
658
+ /**
659
+ * Sanitize command for API responses
660
+ * @param {ToolCommand} command - Command to sanitize
661
+ * @returns {Object} Sanitized command data
662
+ */
663
+ static sanitize(command) {
664
+ const sanitized = { ...command };
665
+
666
+ // Remove sensitive execution data
667
+ if (sanitized.execution) {
668
+ delete sanitized.execution.environmentVariables;
669
+ delete sanitized.execution.environment;
670
+
671
+ // Truncate long logs
672
+ if (sanitized.execution.logs && sanitized.execution.logs.length > 10) {
673
+ sanitized.execution.logs = sanitized.execution.logs.slice(-10);
674
+ }
675
+ }
676
+
677
+ // Remove sensitive parameters
678
+ if (sanitized.parameters) {
679
+ const sensitiveKeys = ['password', 'token', 'secret', 'key', 'auth'];
680
+ Object.keys(sanitized.parameters).forEach(key => {
681
+ if (sensitiveKeys.some(sensitive => key.toLowerCase().includes(sensitive))) {
682
+ sanitized.parameters[key] = '[REDACTED]';
683
+ }
684
+ });
685
+ }
686
+
687
+ return sanitized;
688
+ }
689
+
690
+ /**
691
+ * Create command summary for reporting
692
+ * @param {ToolCommand[]} commands - Commands to summarize
693
+ * @returns {Object} Command summary
694
+ */
695
+ static summarizeCommands(commands) {
696
+ const summary = {
697
+ total: commands.length,
698
+ byStatus: {},
699
+ byTool: {},
700
+ totalExecutionTime: 0,
701
+ averageExecutionTime: 0,
702
+ successRate: 0,
703
+ mostUsedTools: [],
704
+ recentCommands: []
705
+ };
706
+
707
+ // Count by status
708
+ Object.values(TOOL_STATUS).forEach(status => {
709
+ summary.byStatus[status] = commands.filter(cmd => cmd.status === status).length;
710
+ });
711
+
712
+ // Count by tool
713
+ commands.forEach(command => {
714
+ summary.byTool[command.toolId] = (summary.byTool[command.toolId] || 0) + 1;
715
+
716
+ const executionTime = this.getExecutionTime(command) || 0;
717
+ summary.totalExecutionTime += executionTime;
718
+ });
719
+
720
+ // Calculate averages and rates
721
+ if (commands.length > 0) {
722
+ summary.averageExecutionTime = summary.totalExecutionTime / commands.length;
723
+ const successfulCommands = summary.byStatus[TOOL_STATUS.COMPLETED] || 0;
724
+ summary.successRate = (successfulCommands / commands.length) * 100;
725
+ }
726
+
727
+ // Most used tools
728
+ summary.mostUsedTools = Object.entries(summary.byTool)
729
+ .sort((a, b) => b[1] - a[1])
730
+ .slice(0, 5)
731
+ .map(([toolId, count]) => ({ toolId, count }));
732
+
733
+ // Recent commands
734
+ summary.recentCommands = commands
735
+ .sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt))
736
+ .slice(0, 10)
737
+ .map(cmd => this.formatForDisplay(cmd));
738
+
739
+ return summary;
740
+ }
741
+ }
742
+
743
+ export default {
744
+ ToolCommandValidator,
745
+ ToolCommandFactory,
746
+ ToolCommandUtils
747
747
  };