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,464 +1,464 @@
1
- /**
2
- * WhatsApp Tool - Allows agents to access and process WhatsApp data
3
- *
4
- * Purpose:
5
- * - Read messages from allowed chats/groups
6
- * - Search across conversations
7
- * - Download and analyze media/files
8
- * - Get chat info and participant lists
9
- * - Filter by date ranges, keywords, media types
10
- */
11
-
12
- import { BaseTool } from './baseTool.js';
13
-
14
- class WhatsAppTool extends BaseTool {
15
- constructor(config = {}, logger = null) {
16
- super(config, logger);
17
- this.requiresProject = false;
18
- this.isAsync = false;
19
- this.timeout = config.timeout || 60000;
20
-
21
- // Injected dependency
22
- this.whatsappService = null;
23
- }
24
-
25
- /**
26
- * Set the WhatsApp service reference
27
- */
28
- setWhatsAppService(service) {
29
- this.whatsappService = service;
30
- }
31
-
32
- getDescription() {
33
- return `WhatsApp Tool: Access and process data from linked WhatsApp chats and groups.
34
-
35
- ## USAGE
36
-
37
- Read messages from a chat (by name):
38
- \`\`\`json
39
- {
40
- "toolId": "whatsapp",
41
- "parameters": {
42
- "action": "get-messages",
43
- "chatId": "Work Group",
44
- "limit": 30,
45
- "after": "2025-01-01",
46
- "before": "2025-03-01",
47
- "searchTerm": "meeting notes"
48
- }
49
- }
50
- \`\`\`
51
-
52
- Search across specific chats (by name or ID):
53
- \`\`\`json
54
- {
55
- "toolId": "whatsapp",
56
- "parameters": {
57
- "action": "search",
58
- "searchTerm": "project deadline",
59
- "chatIds": ["Work Group", "Alice"],
60
- "limit": 20,
61
- "after": "2025-02-01"
62
- }
63
- }
64
- \`\`\`
65
-
66
- List available chats (with optional filtering and pagination):
67
- \`\`\`json
68
- {
69
- "toolId": "whatsapp",
70
- "parameters": {
71
- "action": "list-chats",
72
- "filter": "work",
73
- "type": "group",
74
- "page": 1,
75
- "pageSize": 20,
76
- "unreadOnly": false
77
- }
78
- }
79
- \`\`\`
80
-
81
- Get chat info (participants, description):
82
- \`\`\`json
83
- {
84
- "toolId": "whatsapp",
85
- "parameters": {
86
- "action": "chat-info",
87
- "chatId": "Family Group"
88
- }
89
- }
90
- \`\`\`
91
-
92
- Download media from a message:
93
- \`\`\`json
94
- {
95
- "toolId": "whatsapp",
96
- "parameters": {
97
- "action": "get-media",
98
- "chatId": "Work Group",
99
- "messageId": "true_1234567890@g.us_ABCDEF"
100
- }
101
- }
102
- \`\`\`
103
-
104
- Check connection status:
105
- \`\`\`json
106
- {
107
- "toolId": "whatsapp",
108
- "parameters": {
109
- "action": "status"
110
- }
111
- }
112
- \`\`\`
113
-
114
- ## PARAMETERS
115
-
116
- - **action** (required): One of: \`list-chats\`, \`get-messages\`, \`search\`, \`chat-info\`, \`get-media\`, \`status\`
117
- - **chatId**: Chat/group name or ID (required for get-messages, chat-info, get-media). You can use the human-readable name (e.g. "Work Group") — it will be resolved automatically. If multiple chats match, you'll get suggestions.
118
- - **messageId**: Message ID (required for get-media)
119
- - **searchTerm**: Text to search for (required for search, optional for get-messages)
120
- - **chatIds**: Array of chat names or IDs to search in (optional for search — defaults to all allowed)
121
- - **filter**: Filter chat list by name substring (for list-chats)
122
- - **type**: Filter chat list by type: \`"group"\`, \`"individual"\`, or \`"all"\` (default, for list-chats)
123
- - **page**: Page number for paginated results, 1-based (default: 1, for list-chats)
124
- - **pageSize**: Number of chats per page (default: 20, for list-chats)
125
- - **unreadOnly**: Only show chats with unread messages (default: false, for list-chats)
126
- - **limit**: Max messages to return (default: 50, for get-messages/search)
127
- - **before**: ISO date string — only messages before this date
128
- - **after**: ISO date string — only messages after this date
129
-
130
- ## RECOMMENDED WORKFLOWS
131
-
132
- **Finding a chat by topic or name:**
133
- 1. Use \`list-chats\` with \`filter\` to search by name substring: \`"filter": "project"\` finds all chats with "project" in the name
134
- 2. Use \`type: "group"\` or \`type: "individual"\` to narrow down
135
- 3. If the user mentions a chat by name, you can skip list-chats and use the name directly as \`chatId\`
136
-
137
- **Reading a conversation:**
138
- 1. Use \`get-messages\` with the chat name directly: \`"chatId": "Work Group"\`
139
- 2. Use \`after\`/\`before\` to focus on a time window (e.g., last week, a specific date)
140
- 3. Use \`searchTerm\` to filter messages containing specific text within that chat
141
- 4. The response includes a \`mediaSummary\` — check it to know if there are files/images to inspect
142
-
143
- **Searching across chats:**
144
- 1. Use \`search\` with \`searchTerm\` to find messages across all allowed chats
145
- 2. Narrow with \`chatIds\` (names work) and date filters to reduce noise
146
- 3. Results are grouped by chat for easy scanning
147
-
148
- **Analyzing shared files and media:**
149
- 1. Messages with \`hasMedia: true\` include \`mediaType\`, \`mimetype\`, and optionally \`fileName\`
150
- 2. Use \`get-media\` with the message's \`id\` to download the file
151
- 3. The downloaded file path is returned — use the \`filesystem\` tool to read documents, or other tools (pdf, doc, spreadsheet) to parse them
152
- 4. Images can be described by reading the file path
153
-
154
- **Browsing many chats:**
155
- 1. Use \`list-chats\` with pagination: start with page 1, check \`pagination.hasMore\`
156
- 2. Use \`pageSize\` to control batch size (default 20)
157
- 3. Use \`unreadOnly: true\` to focus on active conversations
158
- 4. Combine filters: \`type: "group"\` + \`filter: "team"\` + \`page: 2\`
159
-
160
- ## NOTES
161
-
162
- - **You can use chat names directly** — no need to look up IDs first. E.g. \`"chatId": "Work Group"\` works. Partial names resolve if unique.
163
- - If a name matches multiple chats, you'll get an error listing the matches — use a more specific name or the exact ID.
164
- - Only chats granted access by the user in Settings are available. If you get an access denied error, ask the user to grant access.
165
- - If no access restrictions are set, all chats are accessible.
166
- - Media files are downloaded to a temp directory — use the returned \`filePath\` with other tools (filesystem, pdf, doc, spreadsheet) to read/analyze them.
167
- - Message types include: \`chat\`, \`image\`, \`video\`, \`audio\`, \`document\`, \`sticker\`, \`vcard\`, \`location\`.
168
- - For large searches, prefer narrowing by \`chatIds\` and date range to avoid slow responses.
169
- - Always check \`status\` first if unsure whether WhatsApp is connected.
170
- - The WhatsApp account must be linked by the user via Settings before this tool works.`;
171
- }
172
-
173
- getSupportedActions() {
174
- return ['list-chats', 'get-messages', 'search', 'chat-info', 'get-media', 'status'];
175
- }
176
-
177
- getRequiredParameters() {
178
- return ['action'];
179
- }
180
-
181
- getParameterSchema() {
182
- return {
183
- type: 'object',
184
- properties: {
185
- action: { type: 'string', enum: ['list-chats', 'get-messages', 'search', 'chat-info', 'get-media', 'status'] },
186
- chatId: { type: 'string' },
187
- messageId: { type: 'string' },
188
- searchTerm: { type: 'string' },
189
- chatIds: { type: 'array', items: { type: 'string' } },
190
- filter: { type: 'string' },
191
- type: { type: 'string', enum: ['all', 'group', 'individual'] },
192
- page: { type: 'number' },
193
- pageSize: { type: 'number' },
194
- unreadOnly: { type: 'boolean' },
195
- limit: { type: 'number' },
196
- before: { type: 'string' },
197
- after: { type: 'string' }
198
- },
199
- required: ['action']
200
- };
201
- }
202
-
203
- customValidateParameters(params) {
204
- const { action, chatId, messageId, searchTerm } = params;
205
- const errors = [];
206
-
207
- const needsChat = ['get-messages', 'chat-info', 'get-media'];
208
- if (needsChat.includes(action) && !chatId) {
209
- errors.push(`chatId is required for action "${action}"`);
210
- }
211
-
212
- if (action === 'get-media' && !messageId) {
213
- errors.push('messageId is required for action "get-media"');
214
- }
215
-
216
- if (action === 'search' && !searchTerm) {
217
- errors.push('searchTerm is required for action "search"');
218
- }
219
-
220
- if (params.limit != null && (params.limit < 1 || params.limit > 500)) {
221
- errors.push('limit must be between 1 and 500');
222
- }
223
-
224
- return errors.length > 0
225
- ? { valid: false, error: errors.join('; ') }
226
- : { valid: true };
227
- }
228
-
229
- parseParameters(content) {
230
- try {
231
- if (typeof content === 'string' && content.trim().startsWith('{')) {
232
- const parsed = JSON.parse(content);
233
- return parsed.parameters || parsed;
234
- }
235
- if (typeof content === 'object') {
236
- return content.parameters || content;
237
- }
238
- return { action: 'status' };
239
- } catch (error) {
240
- return { action: 'status', parseError: error.message };
241
- }
242
- }
243
-
244
- async execute(params, context) {
245
- // Reverse-forgiveness: accept plural {actions:[{...}]} envelope
246
- // (cross-tool unification).
247
- if (Array.isArray(params?.actions) && params.actions.length > 0) {
248
- const a = params.actions[0] || {};
249
- params = { ...params, ...a, action: a.type || a.action || params.action };
250
- }
251
-
252
- // Unwrap TagParser objects
253
- const unwrapped = {};
254
- for (const [key, value] of Object.entries(params)) {
255
- if (value && typeof value === 'object' && 'value' in value && !Array.isArray(value)) {
256
- unwrapped[key] = value.value;
257
- } else {
258
- unwrapped[key] = value;
259
- }
260
- }
261
- params = unwrapped;
262
-
263
- if (!this.whatsappService) {
264
- return {
265
- success: false,
266
- error: 'WhatsApp service is not available. The system may not have whatsapp-web.js installed.',
267
- guidance: 'Ask the user to install whatsapp-web.js: npm install whatsapp-web.js'
268
- };
269
- }
270
-
271
- const { action } = params;
272
-
273
- try {
274
- switch (action) {
275
- case 'status':
276
- return this._handleStatus();
277
-
278
- case 'list-chats':
279
- return await this._handleListChats(params);
280
-
281
- case 'get-messages':
282
- return await this._handleGetMessages(params);
283
-
284
- case 'search':
285
- return await this._handleSearch(params);
286
-
287
- case 'chat-info':
288
- return await this._handleChatInfo(params);
289
-
290
- case 'get-media':
291
- return await this._handleGetMedia(params);
292
-
293
- default:
294
- return {
295
- success: false,
296
- error: `Unknown action: ${action}`,
297
- guidance: 'Supported actions: list-chats, get-messages, search, chat-info, get-media, status'
298
- };
299
- }
300
- } catch (error) {
301
- let suggestion = null;
302
- if (error.message.includes('not connected')) {
303
- suggestion = 'The WhatsApp account is not linked. Ask the user to connect via Settings > WhatsApp.';
304
- } else if (error.message.includes('Access denied')) {
305
- suggestion = 'This chat is not in the allowed list. Ask the user to grant access in Settings > WhatsApp.';
306
- }
307
-
308
- return {
309
- success: false,
310
- action,
311
- error: error.message,
312
- ...(suggestion && { suggestion })
313
- };
314
- }
315
- }
316
-
317
- // ========================
318
- // Action handlers
319
- // ========================
320
-
321
- _handleStatus() {
322
- const status = this.whatsappService.getStatus();
323
- return {
324
- success: true,
325
- action: 'status',
326
- ...status,
327
- guidance: status.connected
328
- ? 'WhatsApp is connected and ready. Use list-chats to see available conversations.'
329
- : 'WhatsApp is not connected. Ask the user to link their account in Settings > WhatsApp.'
330
- };
331
- }
332
-
333
- async _handleListChats(params = {}) {
334
- const { filter, type, page, pageSize, unreadOnly } = params;
335
-
336
- const result = await this.whatsappService.listChats({
337
- filter,
338
- type: type || 'all',
339
- page: page || 1,
340
- pageSize: pageSize || 20,
341
- unreadOnly: unreadOnly || false
342
- });
343
-
344
- const { chats, pagination } = result;
345
- const allowed = chats.filter(c => c.allowed);
346
- const restricted = chats.filter(c => !c.allowed);
347
-
348
- let guidance;
349
- if (allowed.length === 0 && pagination.totalChats === 0) {
350
- guidance = filter
351
- ? `No chats match "${filter}". Try a different filter or remove it to see all chats.`
352
- : 'No accessible chats found. The user may need to grant access in Settings > WhatsApp.';
353
- } else {
354
- const parts = [`Showing ${allowed.length} chat(s)`];
355
- if (pagination.totalPages > 1) {
356
- parts.push(`(page ${pagination.page}/${pagination.totalPages})`);
357
- }
358
- parts.push('— use get-messages with a chat name to read messages.');
359
- if (pagination.hasMore) {
360
- parts.push(`Use page: ${pagination.page + 1} to see more.`);
361
- }
362
- guidance = parts.join(' ');
363
- }
364
-
365
- return {
366
- success: true,
367
- action: 'list-chats',
368
- totalChats: pagination.totalChats,
369
- accessibleChats: allowed.length,
370
- restrictedChats: restricted.length,
371
- chats: allowed,
372
- pagination,
373
- guidance
374
- };
375
- }
376
-
377
- async _handleGetMessages(params) {
378
- const { chatId, limit, before, after, searchTerm } = params;
379
-
380
- const result = await this.whatsappService.getMessages(chatId, {
381
- limit: limit || 50,
382
- before,
383
- after,
384
- searchTerm
385
- });
386
-
387
- // Summarize media in messages
388
- const mediaMessages = result.messages.filter(m => m.hasMedia);
389
- const mediaTypes = {};
390
- mediaMessages.forEach(m => {
391
- const type = m.mediaType || 'unknown';
392
- mediaTypes[type] = (mediaTypes[type] || 0) + 1;
393
- });
394
-
395
- return {
396
- success: true,
397
- action: 'get-messages',
398
- chatId,
399
- chatName: result.chatName,
400
- messageCount: result.messageCount,
401
- messages: result.messages,
402
- mediaSummary: {
403
- totalMedia: mediaMessages.length,
404
- byType: mediaTypes
405
- },
406
- guidance: mediaMessages.length > 0
407
- ? `Found ${mediaMessages.length} media messages. Use get-media with the message ID to download and analyze them.`
408
- : `Retrieved ${result.messageCount} messages from "${result.chatName}".`
409
- };
410
- }
411
-
412
- async _handleSearch(params) {
413
- const { searchTerm, chatIds, limit, before, after } = params;
414
-
415
- const result = await this.whatsappService.searchMessages(searchTerm, {
416
- chatIds,
417
- limit: limit || 30,
418
- before,
419
- after
420
- });
421
-
422
- return {
423
- success: true,
424
- action: 'search',
425
- searchTerm,
426
- totalMatches: result.totalMatches,
427
- chatsSearched: result.chatsSearched,
428
- results: result.results,
429
- guidance: result.totalMatches > 0
430
- ? `Found ${result.totalMatches} matches across ${result.results.length} chats. Narrow with date ranges or specific chatIds for better results.`
431
- : `No matches found for "${searchTerm}". Try broader terms or different date ranges.`
432
- };
433
- }
434
-
435
- async _handleChatInfo(params) {
436
- const { chatId } = params;
437
- const info = await this.whatsappService.getChatInfo(chatId);
438
-
439
- return {
440
- success: true,
441
- action: 'chat-info',
442
- ...info,
443
- guidance: info.isGroup
444
- ? `Group "${info.name}" has ${info.participantCount} participants. Use get-messages to read the conversation.`
445
- : `Individual chat with "${info.name}". Use get-messages to read messages.`
446
- };
447
- }
448
-
449
- async _handleGetMedia(params) {
450
- const { chatId, messageId } = params;
451
- const media = await this.whatsappService.getMedia(chatId, messageId);
452
-
453
- return {
454
- success: true,
455
- action: 'get-media',
456
- chatId,
457
- messageId,
458
- ...media,
459
- guidance: `Media downloaded to ${media.filePath}. You can use the filesystem tool to read/process this file.`
460
- };
461
- }
462
- }
463
-
464
- export default WhatsAppTool;
1
+ /**
2
+ * WhatsApp Tool - Allows agents to access and process WhatsApp data
3
+ *
4
+ * Purpose:
5
+ * - Read messages from allowed chats/groups
6
+ * - Search across conversations
7
+ * - Download and analyze media/files
8
+ * - Get chat info and participant lists
9
+ * - Filter by date ranges, keywords, media types
10
+ */
11
+
12
+ import { BaseTool } from './baseTool.js';
13
+
14
+ class WhatsAppTool extends BaseTool {
15
+ constructor(config = {}, logger = null) {
16
+ super(config, logger);
17
+ this.requiresProject = false;
18
+ this.isAsync = false;
19
+ this.timeout = config.timeout || 60000;
20
+
21
+ // Injected dependency
22
+ this.whatsappService = null;
23
+ }
24
+
25
+ /**
26
+ * Set the WhatsApp service reference
27
+ */
28
+ setWhatsAppService(service) {
29
+ this.whatsappService = service;
30
+ }
31
+
32
+ getDescription() {
33
+ return `WhatsApp Tool: Access and process data from linked WhatsApp chats and groups.
34
+
35
+ ## USAGE
36
+
37
+ Read messages from a chat (by name):
38
+ \`\`\`json
39
+ {
40
+ "toolId": "whatsapp",
41
+ "parameters": {
42
+ "action": "get-messages",
43
+ "chatId": "Work Group",
44
+ "limit": 30,
45
+ "after": "2025-01-01",
46
+ "before": "2025-03-01",
47
+ "searchTerm": "meeting notes"
48
+ }
49
+ }
50
+ \`\`\`
51
+
52
+ Search across specific chats (by name or ID):
53
+ \`\`\`json
54
+ {
55
+ "toolId": "whatsapp",
56
+ "parameters": {
57
+ "action": "search",
58
+ "searchTerm": "project deadline",
59
+ "chatIds": ["Work Group", "Alice"],
60
+ "limit": 20,
61
+ "after": "2025-02-01"
62
+ }
63
+ }
64
+ \`\`\`
65
+
66
+ List available chats (with optional filtering and pagination):
67
+ \`\`\`json
68
+ {
69
+ "toolId": "whatsapp",
70
+ "parameters": {
71
+ "action": "list-chats",
72
+ "filter": "work",
73
+ "type": "group",
74
+ "page": 1,
75
+ "pageSize": 20,
76
+ "unreadOnly": false
77
+ }
78
+ }
79
+ \`\`\`
80
+
81
+ Get chat info (participants, description):
82
+ \`\`\`json
83
+ {
84
+ "toolId": "whatsapp",
85
+ "parameters": {
86
+ "action": "chat-info",
87
+ "chatId": "Family Group"
88
+ }
89
+ }
90
+ \`\`\`
91
+
92
+ Download media from a message:
93
+ \`\`\`json
94
+ {
95
+ "toolId": "whatsapp",
96
+ "parameters": {
97
+ "action": "get-media",
98
+ "chatId": "Work Group",
99
+ "messageId": "true_1234567890@g.us_ABCDEF"
100
+ }
101
+ }
102
+ \`\`\`
103
+
104
+ Check connection status:
105
+ \`\`\`json
106
+ {
107
+ "toolId": "whatsapp",
108
+ "parameters": {
109
+ "action": "status"
110
+ }
111
+ }
112
+ \`\`\`
113
+
114
+ ## PARAMETERS
115
+
116
+ - **action** (required): One of: \`list-chats\`, \`get-messages\`, \`search\`, \`chat-info\`, \`get-media\`, \`status\`
117
+ - **chatId**: Chat/group name or ID (required for get-messages, chat-info, get-media). You can use the human-readable name (e.g. "Work Group") — it will be resolved automatically. If multiple chats match, you'll get suggestions.
118
+ - **messageId**: Message ID (required for get-media)
119
+ - **searchTerm**: Text to search for (required for search, optional for get-messages)
120
+ - **chatIds**: Array of chat names or IDs to search in (optional for search — defaults to all allowed)
121
+ - **filter**: Filter chat list by name substring (for list-chats)
122
+ - **type**: Filter chat list by type: \`"group"\`, \`"individual"\`, or \`"all"\` (default, for list-chats)
123
+ - **page**: Page number for paginated results, 1-based (default: 1, for list-chats)
124
+ - **pageSize**: Number of chats per page (default: 20, for list-chats)
125
+ - **unreadOnly**: Only show chats with unread messages (default: false, for list-chats)
126
+ - **limit**: Max messages to return (default: 50, for get-messages/search)
127
+ - **before**: ISO date string — only messages before this date
128
+ - **after**: ISO date string — only messages after this date
129
+
130
+ ## RECOMMENDED WORKFLOWS
131
+
132
+ **Finding a chat by topic or name:**
133
+ 1. Use \`list-chats\` with \`filter\` to search by name substring: \`"filter": "project"\` finds all chats with "project" in the name
134
+ 2. Use \`type: "group"\` or \`type: "individual"\` to narrow down
135
+ 3. If the user mentions a chat by name, you can skip list-chats and use the name directly as \`chatId\`
136
+
137
+ **Reading a conversation:**
138
+ 1. Use \`get-messages\` with the chat name directly: \`"chatId": "Work Group"\`
139
+ 2. Use \`after\`/\`before\` to focus on a time window (e.g., last week, a specific date)
140
+ 3. Use \`searchTerm\` to filter messages containing specific text within that chat
141
+ 4. The response includes a \`mediaSummary\` — check it to know if there are files/images to inspect
142
+
143
+ **Searching across chats:**
144
+ 1. Use \`search\` with \`searchTerm\` to find messages across all allowed chats
145
+ 2. Narrow with \`chatIds\` (names work) and date filters to reduce noise
146
+ 3. Results are grouped by chat for easy scanning
147
+
148
+ **Analyzing shared files and media:**
149
+ 1. Messages with \`hasMedia: true\` include \`mediaType\`, \`mimetype\`, and optionally \`fileName\`
150
+ 2. Use \`get-media\` with the message's \`id\` to download the file
151
+ 3. The downloaded file path is returned — use the \`filesystem\` tool to read documents, or other tools (pdf, doc, spreadsheet) to parse them
152
+ 4. Images can be described by reading the file path
153
+
154
+ **Browsing many chats:**
155
+ 1. Use \`list-chats\` with pagination: start with page 1, check \`pagination.hasMore\`
156
+ 2. Use \`pageSize\` to control batch size (default 20)
157
+ 3. Use \`unreadOnly: true\` to focus on active conversations
158
+ 4. Combine filters: \`type: "group"\` + \`filter: "team"\` + \`page: 2\`
159
+
160
+ ## NOTES
161
+
162
+ - **You can use chat names directly** — no need to look up IDs first. E.g. \`"chatId": "Work Group"\` works. Partial names resolve if unique.
163
+ - If a name matches multiple chats, you'll get an error listing the matches — use a more specific name or the exact ID.
164
+ - Only chats granted access by the user in Settings are available. If you get an access denied error, ask the user to grant access.
165
+ - If no access restrictions are set, all chats are accessible.
166
+ - Media files are downloaded to a temp directory — use the returned \`filePath\` with other tools (filesystem, pdf, doc, spreadsheet) to read/analyze them.
167
+ - Message types include: \`chat\`, \`image\`, \`video\`, \`audio\`, \`document\`, \`sticker\`, \`vcard\`, \`location\`.
168
+ - For large searches, prefer narrowing by \`chatIds\` and date range to avoid slow responses.
169
+ - Always check \`status\` first if unsure whether WhatsApp is connected.
170
+ - The WhatsApp account must be linked by the user via Settings before this tool works.`;
171
+ }
172
+
173
+ getSupportedActions() {
174
+ return ['list-chats', 'get-messages', 'search', 'chat-info', 'get-media', 'status'];
175
+ }
176
+
177
+ getRequiredParameters() {
178
+ return ['action'];
179
+ }
180
+
181
+ getParameterSchema() {
182
+ return {
183
+ type: 'object',
184
+ properties: {
185
+ action: { type: 'string', enum: ['list-chats', 'get-messages', 'search', 'chat-info', 'get-media', 'status'] },
186
+ chatId: { type: 'string' },
187
+ messageId: { type: 'string' },
188
+ searchTerm: { type: 'string' },
189
+ chatIds: { type: 'array', items: { type: 'string' } },
190
+ filter: { type: 'string' },
191
+ type: { type: 'string', enum: ['all', 'group', 'individual'] },
192
+ page: { type: 'number' },
193
+ pageSize: { type: 'number' },
194
+ unreadOnly: { type: 'boolean' },
195
+ limit: { type: 'number' },
196
+ before: { type: 'string' },
197
+ after: { type: 'string' }
198
+ },
199
+ required: ['action']
200
+ };
201
+ }
202
+
203
+ customValidateParameters(params) {
204
+ const { action, chatId, messageId, searchTerm } = params;
205
+ const errors = [];
206
+
207
+ const needsChat = ['get-messages', 'chat-info', 'get-media'];
208
+ if (needsChat.includes(action) && !chatId) {
209
+ errors.push(`chatId is required for action "${action}"`);
210
+ }
211
+
212
+ if (action === 'get-media' && !messageId) {
213
+ errors.push('messageId is required for action "get-media"');
214
+ }
215
+
216
+ if (action === 'search' && !searchTerm) {
217
+ errors.push('searchTerm is required for action "search"');
218
+ }
219
+
220
+ if (params.limit != null && (params.limit < 1 || params.limit > 500)) {
221
+ errors.push('limit must be between 1 and 500');
222
+ }
223
+
224
+ return errors.length > 0
225
+ ? { valid: false, error: errors.join('; ') }
226
+ : { valid: true };
227
+ }
228
+
229
+ parseParameters(content) {
230
+ try {
231
+ if (typeof content === 'string' && content.trim().startsWith('{')) {
232
+ const parsed = JSON.parse(content);
233
+ return parsed.parameters || parsed;
234
+ }
235
+ if (typeof content === 'object') {
236
+ return content.parameters || content;
237
+ }
238
+ return { action: 'status' };
239
+ } catch (error) {
240
+ return { action: 'status', parseError: error.message };
241
+ }
242
+ }
243
+
244
+ async execute(params) {
245
+ // Reverse-forgiveness: accept plural {actions:[{...}]} envelope
246
+ // (cross-tool unification).
247
+ if (Array.isArray(params?.actions) && params.actions.length > 0) {
248
+ const a = params.actions[0] || {};
249
+ params = { ...params, ...a, action: a.type || a.action || params.action };
250
+ }
251
+
252
+ // Unwrap TagParser objects
253
+ const unwrapped = {};
254
+ for (const [key, value] of Object.entries(params)) {
255
+ if (value && typeof value === 'object' && 'value' in value && !Array.isArray(value)) {
256
+ unwrapped[key] = value.value;
257
+ } else {
258
+ unwrapped[key] = value;
259
+ }
260
+ }
261
+ params = unwrapped;
262
+
263
+ if (!this.whatsappService) {
264
+ return {
265
+ success: false,
266
+ error: 'WhatsApp service is not available. The system may not have whatsapp-web.js installed.',
267
+ guidance: 'Ask the user to install whatsapp-web.js: npm install whatsapp-web.js'
268
+ };
269
+ }
270
+
271
+ const { action } = params;
272
+
273
+ try {
274
+ switch (action) {
275
+ case 'status':
276
+ return this._handleStatus();
277
+
278
+ case 'list-chats':
279
+ return await this._handleListChats(params);
280
+
281
+ case 'get-messages':
282
+ return await this._handleGetMessages(params);
283
+
284
+ case 'search':
285
+ return await this._handleSearch(params);
286
+
287
+ case 'chat-info':
288
+ return await this._handleChatInfo(params);
289
+
290
+ case 'get-media':
291
+ return await this._handleGetMedia(params);
292
+
293
+ default:
294
+ return {
295
+ success: false,
296
+ error: `Unknown action: ${action}`,
297
+ guidance: 'Supported actions: list-chats, get-messages, search, chat-info, get-media, status'
298
+ };
299
+ }
300
+ } catch (error) {
301
+ let suggestion = null;
302
+ if (error.message.includes('not connected')) {
303
+ suggestion = 'The WhatsApp account is not linked. Ask the user to connect via Settings > WhatsApp.';
304
+ } else if (error.message.includes('Access denied')) {
305
+ suggestion = 'This chat is not in the allowed list. Ask the user to grant access in Settings > WhatsApp.';
306
+ }
307
+
308
+ return {
309
+ success: false,
310
+ action,
311
+ error: error.message,
312
+ ...(suggestion && { suggestion })
313
+ };
314
+ }
315
+ }
316
+
317
+ // ========================
318
+ // Action handlers
319
+ // ========================
320
+
321
+ _handleStatus() {
322
+ const status = this.whatsappService.getStatus();
323
+ return {
324
+ success: true,
325
+ action: 'status',
326
+ ...status,
327
+ guidance: status.connected
328
+ ? 'WhatsApp is connected and ready. Use list-chats to see available conversations.'
329
+ : 'WhatsApp is not connected. Ask the user to link their account in Settings > WhatsApp.'
330
+ };
331
+ }
332
+
333
+ async _handleListChats(params = {}) {
334
+ const { filter, type, page, pageSize, unreadOnly } = params;
335
+
336
+ const result = await this.whatsappService.listChats({
337
+ filter,
338
+ type: type || 'all',
339
+ page: page || 1,
340
+ pageSize: pageSize || 20,
341
+ unreadOnly: unreadOnly || false
342
+ });
343
+
344
+ const { chats, pagination } = result;
345
+ const allowed = chats.filter(c => c.allowed);
346
+ const restricted = chats.filter(c => !c.allowed);
347
+
348
+ let guidance;
349
+ if (allowed.length === 0 && pagination.totalChats === 0) {
350
+ guidance = filter
351
+ ? `No chats match "${filter}". Try a different filter or remove it to see all chats.`
352
+ : 'No accessible chats found. The user may need to grant access in Settings > WhatsApp.';
353
+ } else {
354
+ const parts = [`Showing ${allowed.length} chat(s)`];
355
+ if (pagination.totalPages > 1) {
356
+ parts.push(`(page ${pagination.page}/${pagination.totalPages})`);
357
+ }
358
+ parts.push('— use get-messages with a chat name to read messages.');
359
+ if (pagination.hasMore) {
360
+ parts.push(`Use page: ${pagination.page + 1} to see more.`);
361
+ }
362
+ guidance = parts.join(' ');
363
+ }
364
+
365
+ return {
366
+ success: true,
367
+ action: 'list-chats',
368
+ totalChats: pagination.totalChats,
369
+ accessibleChats: allowed.length,
370
+ restrictedChats: restricted.length,
371
+ chats: allowed,
372
+ pagination,
373
+ guidance
374
+ };
375
+ }
376
+
377
+ async _handleGetMessages(params) {
378
+ const { chatId, limit, before, after, searchTerm } = params;
379
+
380
+ const result = await this.whatsappService.getMessages(chatId, {
381
+ limit: limit || 50,
382
+ before,
383
+ after,
384
+ searchTerm
385
+ });
386
+
387
+ // Summarize media in messages
388
+ const mediaMessages = result.messages.filter(m => m.hasMedia);
389
+ const mediaTypes = {};
390
+ mediaMessages.forEach(m => {
391
+ const type = m.mediaType || 'unknown';
392
+ mediaTypes[type] = (mediaTypes[type] || 0) + 1;
393
+ });
394
+
395
+ return {
396
+ success: true,
397
+ action: 'get-messages',
398
+ chatId,
399
+ chatName: result.chatName,
400
+ messageCount: result.messageCount,
401
+ messages: result.messages,
402
+ mediaSummary: {
403
+ totalMedia: mediaMessages.length,
404
+ byType: mediaTypes
405
+ },
406
+ guidance: mediaMessages.length > 0
407
+ ? `Found ${mediaMessages.length} media messages. Use get-media with the message ID to download and analyze them.`
408
+ : `Retrieved ${result.messageCount} messages from "${result.chatName}".`
409
+ };
410
+ }
411
+
412
+ async _handleSearch(params) {
413
+ const { searchTerm, chatIds, limit, before, after } = params;
414
+
415
+ const result = await this.whatsappService.searchMessages(searchTerm, {
416
+ chatIds,
417
+ limit: limit || 30,
418
+ before,
419
+ after
420
+ });
421
+
422
+ return {
423
+ success: true,
424
+ action: 'search',
425
+ searchTerm,
426
+ totalMatches: result.totalMatches,
427
+ chatsSearched: result.chatsSearched,
428
+ results: result.results,
429
+ guidance: result.totalMatches > 0
430
+ ? `Found ${result.totalMatches} matches across ${result.results.length} chats. Narrow with date ranges or specific chatIds for better results.`
431
+ : `No matches found for "${searchTerm}". Try broader terms or different date ranges.`
432
+ };
433
+ }
434
+
435
+ async _handleChatInfo(params) {
436
+ const { chatId } = params;
437
+ const info = await this.whatsappService.getChatInfo(chatId);
438
+
439
+ return {
440
+ success: true,
441
+ action: 'chat-info',
442
+ ...info,
443
+ guidance: info.isGroup
444
+ ? `Group "${info.name}" has ${info.participantCount} participants. Use get-messages to read the conversation.`
445
+ : `Individual chat with "${info.name}". Use get-messages to read messages.`
446
+ };
447
+ }
448
+
449
+ async _handleGetMedia(params) {
450
+ const { chatId, messageId } = params;
451
+ const media = await this.whatsappService.getMedia(chatId, messageId);
452
+
453
+ return {
454
+ success: true,
455
+ action: 'get-media',
456
+ chatId,
457
+ messageId,
458
+ ...media,
459
+ guidance: `Media downloaded to ${media.filePath}. You can use the filesystem tool to read/process this file.`
460
+ };
461
+ }
462
+ }
463
+
464
+ export default WhatsAppTool;