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,293 +1,293 @@
1
- /**
2
- * memoryTool team-pool tests (Phase 6c).
3
- *
4
- * Pins the publish / search / unpublish action contracts and the ACL
5
- * boundary (StateManager.getTeam lookup → membership check).
6
- *
7
- * Pins:
8
- * - publish-to-team: ACL refuses non-member; copies an existing
9
- * personal memory into the team's pool via indexer.publishToTeam.
10
- * - search-team: ACL refuses non-member; forwards to indexer.searchTeam.
11
- * - unpublish-from-team: ACL refuses non-member; forwards to
12
- * indexer.unpublishFromTeam.
13
- * - Without StateManager attached, all team actions fail cleanly
14
- * (defaulting open would be a privacy bug).
15
- * - Validation: publish needs id + teamId; search-team needs teamId + query.
16
- * - Memory-not-found on publish surfaces a useful error.
17
- * - Disabled embeddings → clean error, no indexer call.
18
- */
19
-
20
- import { jest, describe, test, expect, beforeEach } from '@jest/globals';
21
- import { createMockLogger } from '../../__test-utils__/mockFactories.js';
22
-
23
- const mockMemoryService = {
24
- initialize: jest.fn().mockResolvedValue(undefined),
25
- addMemory: jest.fn(),
26
- updateMemory: jest.fn(),
27
- appendToMemory: jest.fn(),
28
- deleteMemory: jest.fn(),
29
- listMemories: jest.fn(),
30
- readMemory: jest.fn(),
31
- searchMemories: jest.fn(),
32
- getMemoryStats: jest.fn(),
33
- };
34
- jest.unstable_mockModule('../../services/memoryService.js', () => ({
35
- getMemoryService: jest.fn(() => mockMemoryService),
36
- PLAN_TITLE_PREFIX: 'plan/',
37
- }));
38
-
39
- const mockIndexerInstance = {
40
- isEnabled: true,
41
- indexOne: jest.fn().mockResolvedValue({ indexed: true }),
42
- deleteOne: jest.fn().mockResolvedValue({ deleted: true }),
43
- indexMany: jest.fn(),
44
- backfill: jest.fn(),
45
- search: jest.fn().mockResolvedValue({ enabled: true, hits: [] }),
46
- publishToTeam: jest.fn().mockResolvedValue({ indexed: true }),
47
- unpublishFromTeam: jest.fn().mockResolvedValue({ deleted: true }),
48
- searchTeam: jest.fn().mockResolvedValue({ enabled: true, hits: [] }),
49
- teamStats: jest.fn().mockResolvedValue({ count: 0, enabled: true }),
50
- };
51
- jest.unstable_mockModule('../../services/embeddings/indexers/memoryIndexer.js', () => ({
52
- MemoryIndexer: jest.fn(() => mockIndexerInstance),
53
- memoryToText: () => '',
54
- }));
55
-
56
- jest.unstable_mockModule('../../services/embeddings/indexers/reminisceIndexer.js', () => ({
57
- ReminisceIndexer: jest.fn(() => ({ isEnabled: false })),
58
- messageToText: () => '',
59
- estimateMessageTokens: () => 0,
60
- }));
61
-
62
- const { default: MemoryTool } = await import('../memoryTool.js');
63
-
64
- function makeTool({
65
- embeddingsEnabled = true,
66
- team = { id: 'team-A', name: 'Team Alpha', memberAgentIds: ['agent-self', 'agent-other'] },
67
- withStateManager = true,
68
- } = {}) {
69
- const tool = new MemoryTool({}, createMockLogger());
70
- mockIndexerInstance.isEnabled = embeddingsEnabled;
71
- for (const fn of Object.values(mockIndexerInstance)) {
72
- if (typeof fn?.mockClear === 'function') fn.mockClear();
73
- }
74
- for (const fn of Object.values(mockMemoryService)) {
75
- if (typeof fn?.mockClear === 'function') fn.mockClear();
76
- }
77
- tool.aiService = { getEmbeddingService: () => ({ isEnabled: embeddingsEnabled }) };
78
- tool._memoryIndexer = null;
79
- if (withStateManager) {
80
- const stateManager = {
81
- getTeam: jest.fn(async (id) => (team && team.id === id ? team : null)),
82
- };
83
- tool.setStateManager(stateManager);
84
- return { tool, stateManager };
85
- }
86
- return { tool, stateManager: null };
87
- }
88
-
89
- const context = { agentId: 'agent-self' };
90
-
91
- // ─── validation ─────────────────────────────────────────────────────
92
-
93
- describe('memoryTool — team-pool validation', () => {
94
- test('publish-to-team requires both id and teamId', () => {
95
- const { tool } = makeTool();
96
- const v1 = tool.customValidateParameters({ actions: [{ type: 'publish-to-team', teamId: 'team-A' }] });
97
- const v2 = tool.customValidateParameters({ actions: [{ type: 'publish-to-team', id: 'mem-1' }] });
98
- const v3 = tool.customValidateParameters({ actions: [{ type: 'publish-to-team', id: 'mem-1', teamId: 'team-A' }] });
99
- expect(v1.valid).toBe(false);
100
- expect(v2.valid).toBe(false);
101
- expect(v3.valid).toBe(true);
102
- });
103
-
104
- test('search-team requires teamId and query', () => {
105
- const { tool } = makeTool();
106
- expect(tool.customValidateParameters({ actions: [{ type: 'search-team', query: 'q' }] }).valid).toBe(false);
107
- expect(tool.customValidateParameters({ actions: [{ type: 'search-team', teamId: 'team-A' }] }).valid).toBe(false);
108
- expect(tool.customValidateParameters({ actions: [{ type: 'search-team', teamId: 'team-A', query: 'q' }] }).valid).toBe(true);
109
- });
110
-
111
- test('unpublish-from-team requires id and teamId', () => {
112
- const { tool } = makeTool();
113
- expect(tool.customValidateParameters({ actions: [{ type: 'unpublish-from-team', id: 'mem-1' }] }).valid).toBe(false);
114
- expect(tool.customValidateParameters({ actions: [{ type: 'unpublish-from-team', teamId: 'team-A' }] }).valid).toBe(false);
115
- expect(tool.customValidateParameters({ actions: [{ type: 'unpublish-from-team', id: 'mem-1', teamId: 'team-A' }] }).valid).toBe(true);
116
- });
117
- });
118
-
119
- // ─── ACL ────────────────────────────────────────────────────────────
120
-
121
- describe('memoryTool — team-pool ACL', () => {
122
- test('non-member refused on publish-to-team', async () => {
123
- const { tool } = makeTool({
124
- team: { id: 'team-A', name: 'Team Alpha', memberAgentIds: ['agent-other'] }, // self not in
125
- });
126
- const r = await tool.execute(
127
- { actions: [{ type: 'publish-to-team', id: 'mem-1', teamId: 'team-A' }] },
128
- context,
129
- );
130
- expect(r.success).toBe(false);
131
- expect(r.error).toMatch(/Access denied/i);
132
- expect(mockIndexerInstance.publishToTeam).not.toHaveBeenCalled();
133
- });
134
-
135
- test('non-member refused on search-team', async () => {
136
- const { tool } = makeTool({
137
- team: { id: 'team-A', memberAgentIds: [] },
138
- });
139
- const r = await tool.execute(
140
- { actions: [{ type: 'search-team', teamId: 'team-A', query: 'q' }] },
141
- context,
142
- );
143
- expect(r.success).toBe(false);
144
- expect(r.error).toMatch(/Access denied/i);
145
- expect(mockIndexerInstance.searchTeam).not.toHaveBeenCalled();
146
- });
147
-
148
- test('non-member refused on unpublish-from-team', async () => {
149
- const { tool } = makeTool({
150
- team: { id: 'team-A', memberAgentIds: ['agent-other'] },
151
- });
152
- const r = await tool.execute(
153
- { actions: [{ type: 'unpublish-from-team', teamId: 'team-A', id: 'mem-1' }] },
154
- context,
155
- );
156
- expect(r.success).toBe(false);
157
- expect(r.error).toMatch(/Access denied/i);
158
- expect(mockIndexerInstance.unpublishFromTeam).not.toHaveBeenCalled();
159
- });
160
-
161
- test('unknown team → clean error', async () => {
162
- const { tool } = makeTool({ team: null });
163
- const r = await tool.execute(
164
- { actions: [{ type: 'publish-to-team', id: 'mem-1', teamId: 'team-unknown' }] },
165
- context,
166
- );
167
- expect(r.success).toBe(false);
168
- expect(r.error).toMatch(/Team not found/);
169
- });
170
-
171
- test('without StateManager attached, ALL team actions refuse (no default-open)', async () => {
172
- const { tool } = makeTool({ withStateManager: false });
173
- const r1 = await tool.execute(
174
- { actions: [{ type: 'publish-to-team', id: 'mem-1', teamId: 'team-A' }] },
175
- context,
176
- );
177
- const r2 = await tool.execute(
178
- { actions: [{ type: 'search-team', teamId: 'team-A', query: 'q' }] },
179
- context,
180
- );
181
- expect(r1.success).toBe(false);
182
- expect(r1.error).toMatch(/StateManager/);
183
- expect(r2.success).toBe(false);
184
- expect(r2.error).toMatch(/StateManager/);
185
- });
186
- });
187
-
188
- // ─── happy paths ────────────────────────────────────────────────────
189
-
190
- describe('memoryTool — team-pool happy paths', () => {
191
- test('publish-to-team: reads memory from agent\'s pool, calls indexer.publishToTeam with publishedBy', async () => {
192
- const { tool } = makeTool();
193
- const memory = { id: 'mem-1', title: 'Shared note', content: 'useful', createdAt: '2026-05-26T00:00:00Z' };
194
- mockMemoryService.readMemory.mockResolvedValue(memory);
195
-
196
- const r = await tool.execute(
197
- { actions: [{ type: 'publish-to-team', id: 'mem-1', teamId: 'team-A' }] },
198
- context,
199
- );
200
-
201
- expect(mockMemoryService.readMemory).toHaveBeenCalledWith('agent-self', 'mem-1');
202
- expect(mockIndexerInstance.publishToTeam).toHaveBeenCalledWith('team-A', memory, 'agent-self');
203
- expect(r.success).toBe(true);
204
- expect(r.action).toBe('publish-to-team');
205
- expect(r.teamId).toBe('team-A');
206
- expect(r.teamName).toBe('Team Alpha');
207
- expect(r.message).toMatch(/Published/);
208
- });
209
-
210
- test('publish-to-team: memory not found → clean error, no indexer call', async () => {
211
- const { tool } = makeTool();
212
- mockMemoryService.readMemory.mockResolvedValue(null);
213
- const r = await tool.execute(
214
- { actions: [{ type: 'publish-to-team', id: 'missing', teamId: 'team-A' }] },
215
- context,
216
- );
217
- expect(r.success).toBe(false);
218
- expect(r.error).toMatch(/not found/i);
219
- expect(mockIndexerInstance.publishToTeam).not.toHaveBeenCalled();
220
- });
221
-
222
- test('search-team: forwards query + topK + hybrid to indexer', async () => {
223
- const { tool } = makeTool();
224
- mockIndexerInstance.searchTeam.mockResolvedValue({
225
- enabled: true,
226
- hits: [
227
- { id: 'mem-1', score: 0.9, metadata: { title: 'team note', publishedBy: 'agent-other' } },
228
- ],
229
- });
230
-
231
- const r = await tool.execute(
232
- { actions: [{ type: 'search-team', teamId: 'team-A', query: 'docker tips', topK: 3, hybrid: false }] },
233
- context,
234
- );
235
-
236
- expect(mockIndexerInstance.searchTeam).toHaveBeenCalledWith(
237
- 'team-A', 'docker tips', { topK: 3, hybrid: false },
238
- );
239
- expect(r.success).toBe(true);
240
- expect(r.results).toHaveLength(1);
241
- expect(r.mode).toBe('semantic');
242
- });
243
-
244
- test('unpublish-from-team: forwards to indexer.unpublishFromTeam', async () => {
245
- const { tool } = makeTool();
246
- const r = await tool.execute(
247
- { actions: [{ type: 'unpublish-from-team', id: 'mem-1', teamId: 'team-A' }] },
248
- context,
249
- );
250
- expect(mockIndexerInstance.unpublishFromTeam).toHaveBeenCalledWith('team-A', 'mem-1');
251
- expect(r.success).toBe(true);
252
- expect(r.action).toBe('unpublish-from-team');
253
- });
254
-
255
- test('indexer error surfaces in the result without throwing', async () => {
256
- const { tool } = makeTool();
257
- mockMemoryService.readMemory.mockResolvedValue({ id: 'mem-1', title: 't', content: 'c' });
258
- mockIndexerInstance.publishToTeam.mockResolvedValue({ indexed: false, reason: 'error', error: 'rate-limited' });
259
-
260
- const r = await tool.execute(
261
- { actions: [{ type: 'publish-to-team', id: 'mem-1', teamId: 'team-A' }] },
262
- context,
263
- );
264
-
265
- expect(r.success).toBe(false);
266
- expect(r.error).toBe('rate-limited');
267
- });
268
- });
269
-
270
- // ─── disabled embeddings ────────────────────────────────────────────
271
-
272
- describe('memoryTool — team-pool when embeddings disabled', () => {
273
- test('publish-to-team: clean error, no ACL check (no point checking when no storage)', async () => {
274
- const { tool, stateManager } = makeTool({ embeddingsEnabled: false });
275
- const r = await tool.execute(
276
- { actions: [{ type: 'publish-to-team', id: 'mem-1', teamId: 'team-A' }] },
277
- context,
278
- );
279
- expect(r.success).toBe(false);
280
- expect(r.message).toMatch(/not enabled/i);
281
- expect(stateManager.getTeam).not.toHaveBeenCalled();
282
- });
283
-
284
- test('search-team: clean error', async () => {
285
- const { tool } = makeTool({ embeddingsEnabled: false });
286
- const r = await tool.execute(
287
- { actions: [{ type: 'search-team', teamId: 'team-A', query: 'q' }] },
288
- context,
289
- );
290
- expect(r.success).toBe(false);
291
- expect(r.message).toMatch(/not enabled/i);
292
- });
293
- });
1
+ /**
2
+ * memoryTool team-pool tests (Phase 6c).
3
+ *
4
+ * Pins the publish / search / unpublish action contracts and the ACL
5
+ * boundary (StateManager.getTeam lookup → membership check).
6
+ *
7
+ * Pins:
8
+ * - publish-to-team: ACL refuses non-member; copies an existing
9
+ * personal memory into the team's pool via indexer.publishToTeam.
10
+ * - search-team: ACL refuses non-member; forwards to indexer.searchTeam.
11
+ * - unpublish-from-team: ACL refuses non-member; forwards to
12
+ * indexer.unpublishFromTeam.
13
+ * - Without StateManager attached, all team actions fail cleanly
14
+ * (defaulting open would be a privacy bug).
15
+ * - Validation: publish needs id + teamId; search-team needs teamId + query.
16
+ * - Memory-not-found on publish surfaces a useful error.
17
+ * - Disabled embeddings → clean error, no indexer call.
18
+ */
19
+
20
+ import { jest, describe, test, expect } from '@jest/globals';
21
+ import { createMockLogger } from '../../__test-utils__/mockFactories.js';
22
+
23
+ const mockMemoryService = {
24
+ initialize: jest.fn().mockResolvedValue(undefined),
25
+ addMemory: jest.fn(),
26
+ updateMemory: jest.fn(),
27
+ appendToMemory: jest.fn(),
28
+ deleteMemory: jest.fn(),
29
+ listMemories: jest.fn(),
30
+ readMemory: jest.fn(),
31
+ searchMemories: jest.fn(),
32
+ getMemoryStats: jest.fn(),
33
+ };
34
+ jest.unstable_mockModule('../../services/memoryService.js', () => ({
35
+ getMemoryService: jest.fn(() => mockMemoryService),
36
+ PLAN_TITLE_PREFIX: 'plan/',
37
+ }));
38
+
39
+ const mockIndexerInstance = {
40
+ isEnabled: true,
41
+ indexOne: jest.fn().mockResolvedValue({ indexed: true }),
42
+ deleteOne: jest.fn().mockResolvedValue({ deleted: true }),
43
+ indexMany: jest.fn(),
44
+ backfill: jest.fn(),
45
+ search: jest.fn().mockResolvedValue({ enabled: true, hits: [] }),
46
+ publishToTeam: jest.fn().mockResolvedValue({ indexed: true }),
47
+ unpublishFromTeam: jest.fn().mockResolvedValue({ deleted: true }),
48
+ searchTeam: jest.fn().mockResolvedValue({ enabled: true, hits: [] }),
49
+ teamStats: jest.fn().mockResolvedValue({ count: 0, enabled: true }),
50
+ };
51
+ jest.unstable_mockModule('../../services/embeddings/indexers/memoryIndexer.js', () => ({
52
+ MemoryIndexer: jest.fn(() => mockIndexerInstance),
53
+ memoryToText: () => '',
54
+ }));
55
+
56
+ jest.unstable_mockModule('../../services/embeddings/indexers/reminisceIndexer.js', () => ({
57
+ ReminisceIndexer: jest.fn(() => ({ isEnabled: false })),
58
+ messageToText: () => '',
59
+ estimateMessageTokens: () => 0,
60
+ }));
61
+
62
+ const { default: MemoryTool } = await import('../memoryTool.js');
63
+
64
+ function makeTool({
65
+ embeddingsEnabled = true,
66
+ team = { id: 'team-A', name: 'Team Alpha', memberAgentIds: ['agent-self', 'agent-other'] },
67
+ withStateManager = true,
68
+ } = {}) {
69
+ const tool = new MemoryTool({}, createMockLogger());
70
+ mockIndexerInstance.isEnabled = embeddingsEnabled;
71
+ for (const fn of Object.values(mockIndexerInstance)) {
72
+ if (typeof fn?.mockClear === 'function') fn.mockClear();
73
+ }
74
+ for (const fn of Object.values(mockMemoryService)) {
75
+ if (typeof fn?.mockClear === 'function') fn.mockClear();
76
+ }
77
+ tool.aiService = { getEmbeddingService: () => ({ isEnabled: embeddingsEnabled }) };
78
+ tool._memoryIndexer = null;
79
+ if (withStateManager) {
80
+ const stateManager = {
81
+ getTeam: jest.fn(async (id) => (team && team.id === id ? team : null)),
82
+ };
83
+ tool.setStateManager(stateManager);
84
+ return { tool, stateManager };
85
+ }
86
+ return { tool, stateManager: null };
87
+ }
88
+
89
+ const context = { agentId: 'agent-self' };
90
+
91
+ // ─── validation ─────────────────────────────────────────────────────
92
+
93
+ describe('memoryTool — team-pool validation', () => {
94
+ test('publish-to-team requires both id and teamId', () => {
95
+ const { tool } = makeTool();
96
+ const v1 = tool.customValidateParameters({ actions: [{ type: 'publish-to-team', teamId: 'team-A' }] });
97
+ const v2 = tool.customValidateParameters({ actions: [{ type: 'publish-to-team', id: 'mem-1' }] });
98
+ const v3 = tool.customValidateParameters({ actions: [{ type: 'publish-to-team', id: 'mem-1', teamId: 'team-A' }] });
99
+ expect(v1.valid).toBe(false);
100
+ expect(v2.valid).toBe(false);
101
+ expect(v3.valid).toBe(true);
102
+ });
103
+
104
+ test('search-team requires teamId and query', () => {
105
+ const { tool } = makeTool();
106
+ expect(tool.customValidateParameters({ actions: [{ type: 'search-team', query: 'q' }] }).valid).toBe(false);
107
+ expect(tool.customValidateParameters({ actions: [{ type: 'search-team', teamId: 'team-A' }] }).valid).toBe(false);
108
+ expect(tool.customValidateParameters({ actions: [{ type: 'search-team', teamId: 'team-A', query: 'q' }] }).valid).toBe(true);
109
+ });
110
+
111
+ test('unpublish-from-team requires id and teamId', () => {
112
+ const { tool } = makeTool();
113
+ expect(tool.customValidateParameters({ actions: [{ type: 'unpublish-from-team', id: 'mem-1' }] }).valid).toBe(false);
114
+ expect(tool.customValidateParameters({ actions: [{ type: 'unpublish-from-team', teamId: 'team-A' }] }).valid).toBe(false);
115
+ expect(tool.customValidateParameters({ actions: [{ type: 'unpublish-from-team', id: 'mem-1', teamId: 'team-A' }] }).valid).toBe(true);
116
+ });
117
+ });
118
+
119
+ // ─── ACL ────────────────────────────────────────────────────────────
120
+
121
+ describe('memoryTool — team-pool ACL', () => {
122
+ test('non-member refused on publish-to-team', async () => {
123
+ const { tool } = makeTool({
124
+ team: { id: 'team-A', name: 'Team Alpha', memberAgentIds: ['agent-other'] }, // self not in
125
+ });
126
+ const r = await tool.execute(
127
+ { actions: [{ type: 'publish-to-team', id: 'mem-1', teamId: 'team-A' }] },
128
+ context,
129
+ );
130
+ expect(r.success).toBe(false);
131
+ expect(r.error).toMatch(/Access denied/i);
132
+ expect(mockIndexerInstance.publishToTeam).not.toHaveBeenCalled();
133
+ });
134
+
135
+ test('non-member refused on search-team', async () => {
136
+ const { tool } = makeTool({
137
+ team: { id: 'team-A', memberAgentIds: [] },
138
+ });
139
+ const r = await tool.execute(
140
+ { actions: [{ type: 'search-team', teamId: 'team-A', query: 'q' }] },
141
+ context,
142
+ );
143
+ expect(r.success).toBe(false);
144
+ expect(r.error).toMatch(/Access denied/i);
145
+ expect(mockIndexerInstance.searchTeam).not.toHaveBeenCalled();
146
+ });
147
+
148
+ test('non-member refused on unpublish-from-team', async () => {
149
+ const { tool } = makeTool({
150
+ team: { id: 'team-A', memberAgentIds: ['agent-other'] },
151
+ });
152
+ const r = await tool.execute(
153
+ { actions: [{ type: 'unpublish-from-team', teamId: 'team-A', id: 'mem-1' }] },
154
+ context,
155
+ );
156
+ expect(r.success).toBe(false);
157
+ expect(r.error).toMatch(/Access denied/i);
158
+ expect(mockIndexerInstance.unpublishFromTeam).not.toHaveBeenCalled();
159
+ });
160
+
161
+ test('unknown team → clean error', async () => {
162
+ const { tool } = makeTool({ team: null });
163
+ const r = await tool.execute(
164
+ { actions: [{ type: 'publish-to-team', id: 'mem-1', teamId: 'team-unknown' }] },
165
+ context,
166
+ );
167
+ expect(r.success).toBe(false);
168
+ expect(r.error).toMatch(/Team not found/);
169
+ });
170
+
171
+ test('without StateManager attached, ALL team actions refuse (no default-open)', async () => {
172
+ const { tool } = makeTool({ withStateManager: false });
173
+ const r1 = await tool.execute(
174
+ { actions: [{ type: 'publish-to-team', id: 'mem-1', teamId: 'team-A' }] },
175
+ context,
176
+ );
177
+ const r2 = await tool.execute(
178
+ { actions: [{ type: 'search-team', teamId: 'team-A', query: 'q' }] },
179
+ context,
180
+ );
181
+ expect(r1.success).toBe(false);
182
+ expect(r1.error).toMatch(/StateManager/);
183
+ expect(r2.success).toBe(false);
184
+ expect(r2.error).toMatch(/StateManager/);
185
+ });
186
+ });
187
+
188
+ // ─── happy paths ────────────────────────────────────────────────────
189
+
190
+ describe('memoryTool — team-pool happy paths', () => {
191
+ test('publish-to-team: reads memory from agent\'s pool, calls indexer.publishToTeam with publishedBy', async () => {
192
+ const { tool } = makeTool();
193
+ const memory = { id: 'mem-1', title: 'Shared note', content: 'useful', createdAt: '2026-05-26T00:00:00Z' };
194
+ mockMemoryService.readMemory.mockResolvedValue(memory);
195
+
196
+ const r = await tool.execute(
197
+ { actions: [{ type: 'publish-to-team', id: 'mem-1', teamId: 'team-A' }] },
198
+ context,
199
+ );
200
+
201
+ expect(mockMemoryService.readMemory).toHaveBeenCalledWith('agent-self', 'mem-1');
202
+ expect(mockIndexerInstance.publishToTeam).toHaveBeenCalledWith('team-A', memory, 'agent-self');
203
+ expect(r.success).toBe(true);
204
+ expect(r.action).toBe('publish-to-team');
205
+ expect(r.teamId).toBe('team-A');
206
+ expect(r.teamName).toBe('Team Alpha');
207
+ expect(r.message).toMatch(/Published/);
208
+ });
209
+
210
+ test('publish-to-team: memory not found → clean error, no indexer call', async () => {
211
+ const { tool } = makeTool();
212
+ mockMemoryService.readMemory.mockResolvedValue(null);
213
+ const r = await tool.execute(
214
+ { actions: [{ type: 'publish-to-team', id: 'missing', teamId: 'team-A' }] },
215
+ context,
216
+ );
217
+ expect(r.success).toBe(false);
218
+ expect(r.error).toMatch(/not found/i);
219
+ expect(mockIndexerInstance.publishToTeam).not.toHaveBeenCalled();
220
+ });
221
+
222
+ test('search-team: forwards query + topK + hybrid to indexer', async () => {
223
+ const { tool } = makeTool();
224
+ mockIndexerInstance.searchTeam.mockResolvedValue({
225
+ enabled: true,
226
+ hits: [
227
+ { id: 'mem-1', score: 0.9, metadata: { title: 'team note', publishedBy: 'agent-other' } },
228
+ ],
229
+ });
230
+
231
+ const r = await tool.execute(
232
+ { actions: [{ type: 'search-team', teamId: 'team-A', query: 'docker tips', topK: 3, hybrid: false }] },
233
+ context,
234
+ );
235
+
236
+ expect(mockIndexerInstance.searchTeam).toHaveBeenCalledWith(
237
+ 'team-A', 'docker tips', { topK: 3, hybrid: false },
238
+ );
239
+ expect(r.success).toBe(true);
240
+ expect(r.results).toHaveLength(1);
241
+ expect(r.mode).toBe('semantic');
242
+ });
243
+
244
+ test('unpublish-from-team: forwards to indexer.unpublishFromTeam', async () => {
245
+ const { tool } = makeTool();
246
+ const r = await tool.execute(
247
+ { actions: [{ type: 'unpublish-from-team', id: 'mem-1', teamId: 'team-A' }] },
248
+ context,
249
+ );
250
+ expect(mockIndexerInstance.unpublishFromTeam).toHaveBeenCalledWith('team-A', 'mem-1');
251
+ expect(r.success).toBe(true);
252
+ expect(r.action).toBe('unpublish-from-team');
253
+ });
254
+
255
+ test('indexer error surfaces in the result without throwing', async () => {
256
+ const { tool } = makeTool();
257
+ mockMemoryService.readMemory.mockResolvedValue({ id: 'mem-1', title: 't', content: 'c' });
258
+ mockIndexerInstance.publishToTeam.mockResolvedValue({ indexed: false, reason: 'error', error: 'rate-limited' });
259
+
260
+ const r = await tool.execute(
261
+ { actions: [{ type: 'publish-to-team', id: 'mem-1', teamId: 'team-A' }] },
262
+ context,
263
+ );
264
+
265
+ expect(r.success).toBe(false);
266
+ expect(r.error).toBe('rate-limited');
267
+ });
268
+ });
269
+
270
+ // ─── disabled embeddings ────────────────────────────────────────────
271
+
272
+ describe('memoryTool — team-pool when embeddings disabled', () => {
273
+ test('publish-to-team: clean error, no ACL check (no point checking when no storage)', async () => {
274
+ const { tool, stateManager } = makeTool({ embeddingsEnabled: false });
275
+ const r = await tool.execute(
276
+ { actions: [{ type: 'publish-to-team', id: 'mem-1', teamId: 'team-A' }] },
277
+ context,
278
+ );
279
+ expect(r.success).toBe(false);
280
+ expect(r.message).toMatch(/not enabled/i);
281
+ expect(stateManager.getTeam).not.toHaveBeenCalled();
282
+ });
283
+
284
+ test('search-team: clean error', async () => {
285
+ const { tool } = makeTool({ embeddingsEnabled: false });
286
+ const r = await tool.execute(
287
+ { actions: [{ type: 'search-team', teamId: 'team-A', query: 'q' }] },
288
+ context,
289
+ );
290
+ expect(r.success).toBe(false);
291
+ expect(r.message).toMatch(/not enabled/i);
292
+ });
293
+ });
@@ -1,5 +1,5 @@
1
1
  import { jest, describe, test, expect, beforeEach } from '@jest/globals';
2
- import { createMockLogger, createMockConfig } from '../../__test-utils__/mockFactories.js';
2
+ import { createMockLogger } from '../../__test-utils__/mockFactories.js';
3
3
 
4
4
  // Mock constants
5
5
  jest.unstable_mockModule('../../utilities/constants.js', () => ({