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,420 +1,419 @@
1
- /**
2
- * AgentActivityService - Centralized service for determining agent scheduler activity
3
- *
4
- * Purpose:
5
- * - Single source of truth for "should this agent be active in scheduler"
6
- * - Eliminates scattered add/remove logic across codebase
7
- * - Provides clear, testable activation conditions
8
- * - Returns detailed reasons for debugging
9
- *
10
- * Architecture:
11
- * - Pure functions that inspect agent state
12
- * - No side effects (doesn't modify agent state)
13
- * - Scheduler queries this service each cycle instead of managing events
14
- */
15
-
16
- import {
17
- AGENT_MODES,
18
- AGENT_STATUS,
19
- AGENT_ACTIVITY_STATUS,
20
- TASK_STATUS,
21
- SCHEDULER_CONFIG
22
- } from '../utilities/constants.js';
23
-
24
- /**
25
- * Result of activity check
26
- * @typedef {Object} ActivityCheckResult
27
- * @property {boolean} active - Whether agent should be active in scheduler
28
- * @property {string} reason - Reason code from AGENT_ACTIVITY_STATUS
29
- * @property {string} [details] - Additional human-readable details
30
- */
31
-
32
- /**
33
- * Check if an agent has pending or in-progress tasks
34
- * @param {Object} agent - Agent object
35
- * @returns {boolean} True if agent has work to do
36
- */
37
- function hasPendingTasks(agent) {
38
- if (!agent.taskList || !agent.taskList.tasks || !Array.isArray(agent.taskList.tasks)) {
39
- return false;
40
- }
41
-
42
- return agent.taskList.tasks.some(task =>
43
- task.status === TASK_STATUS.PENDING || task.status === TASK_STATUS.IN_PROGRESS
44
- );
45
- }
46
-
47
- /**
48
- * Check if agent has queued messages of any type
49
- * @param {Object} agent - Agent object
50
- * @returns {{ hasMessages: boolean, counts: Object }} Message queue status
51
- */
52
- function getMessageQueueStatus(agent) {
53
- const queues = agent.messageQueues || {};
54
-
55
- const counts = {
56
- toolResults: Array.isArray(queues.toolResults) ? queues.toolResults.length : 0,
57
- interAgentMessages: Array.isArray(queues.interAgentMessages) ? queues.interAgentMessages.length : 0,
58
- userMessages: Array.isArray(queues.userMessages) ? queues.userMessages.length : 0
59
- };
60
-
61
- counts.total = counts.toolResults + counts.interAgentMessages + counts.userMessages;
62
-
63
- return {
64
- hasMessages: counts.total > 0,
65
- hasUserMessages: counts.userMessages > 0,
66
- hasInterAgentMessages: counts.interAgentMessages > 0,
67
- hasToolResults: counts.toolResults > 0,
68
- counts
69
- };
70
- }
71
-
72
- // TODO: Remove after 2026-02-10 if not proven as needed.
73
- // No longer called from shouldAgentBeActive AGENT mode uses task-based
74
- // scheduling (messages auto-create tasks at arrival), CHAT mode checks
75
- // messageQueues directly via getMessageQueueStatus().
76
- //
77
- // function hasUnprocessedIncomingMessages(agent) {
78
- // if (agent.incomingMessages && Array.isArray(agent.incomingMessages) && agent.incomingMessages.length > 0) {
79
- // return true;
80
- // }
81
- // if (agent.interAgentTracking && agent.interAgentTracking instanceof Map && agent.interAgentTracking.size > 0) {
82
- // const now = Date.now();
83
- // for (const tracking of agent.interAgentTracking.values()) {
84
- // if (tracking.lastReceived &&
85
- // (now - tracking.lastReceived) < SCHEDULER_CONFIG.RECENT_MESSAGE_THRESHOLD_MS &&
86
- // tracking.lastType === 'received') {
87
- // return true;
88
- // }
89
- // }
90
- // }
91
- // return false;
92
- // }
93
-
94
- /**
95
- * Check if agent is currently delayed
96
- * @param {Object} agent - Agent object
97
- * @returns {boolean} True if agent is delayed
98
- */
99
- function isAgentDelayed(agent) {
100
- if (!agent.delayEndTime) {
101
- return false;
102
- }
103
-
104
- return new Date() < new Date(agent.delayEndTime);
105
- }
106
-
107
- /**
108
- * Check if agent is currently paused
109
- * @param {Object} agent - Agent object
110
- * @returns {boolean} True if agent is paused
111
- */
112
- function isAgentPaused(agent) {
113
- // Check status-based pause
114
- if (agent.status === AGENT_STATUS.PAUSED) {
115
- // If pausedUntil is set, check if it's expired
116
- if (agent.pausedUntil) {
117
- return new Date() < new Date(agent.pausedUntil);
118
- }
119
- return true; // Paused indefinitely
120
- }
121
-
122
- // Check time-based pause
123
- if (agent.pausedUntil && new Date() < new Date(agent.pausedUntil)) {
124
- return true;
125
- }
126
-
127
- return false;
128
- }
129
-
130
- // TODO: Remove after 2026-02-10 if not proven as needed.
131
- // Job-done now clears the task list instead of switching mode.
132
- // The autonomousWorkComplete flag is still set for reference but
133
- // is no longer used as a scheduling condition.
134
- //
135
- // function hasAutonomousWorkComplete(agent) {
136
- // return agent.autonomousWorkComplete === true;
137
- // }
138
-
139
- /**
140
- * Centralized function to determine if an agent should be active in the scheduler
141
- *
142
- * This function encapsulates ALL logic for determining agent activity status.
143
- * It inspects the agent's current state and returns a decision with reason.
144
- *
145
- * @param {Object} agent - Full agent object from AgentPool
146
- * @returns {ActivityCheckResult} Activity decision with reason
147
- */
148
- export function shouldAgentBeActive(agent) {
149
- // 1. Basic existence check
150
- if (!agent) {
151
- return {
152
- active: false,
153
- reason: AGENT_ACTIVITY_STATUS.AGENT_NOT_FOUND,
154
- details: 'Agent object is null or undefined'
155
- };
156
- }
157
-
158
- // 2. Status check - agent must be active
159
- if (agent.status !== AGENT_STATUS.ACTIVE) {
160
- return {
161
- active: false,
162
- reason: AGENT_ACTIVITY_STATUS.AGENT_INACTIVE_STATUS,
163
- details: `Agent status is ${agent.status}, expected ${AGENT_STATUS.ACTIVE}`
164
- };
165
- }
166
-
167
- // Belt-and-suspenders: queued inbound work (user message, inter-agent
168
- // ping, tool result) overrides delay/pause. Inbound enqueue paths clear
169
- // delay/pause at arrival time via agentPool._wakeAgentForMessage, so in
170
- // the happy path a delayed agent never has queued messages. This guard
171
- // is a defensive second line: if anything bypasses the enqueue helpers
172
- // (persisted state loaded mid-delay, direct mutation in legacy code,
173
- // future paths) we still refuse to sideline an agent that has work to do.
174
- const _queueStatus = getMessageQueueStatus(agent);
175
- const _hasInboundWork = _queueStatus.hasUserMessages || _queueStatus.hasInterAgentMessages || _queueStatus.hasToolResults;
176
-
177
- // 3. Delay check
178
- if (isAgentDelayed(agent) && !_hasInboundWork) {
179
- return {
180
- active: false,
181
- reason: AGENT_ACTIVITY_STATUS.AGENT_DELAYED,
182
- details: `Agent delayed until ${agent.delayEndTime}`
183
- };
184
- }
185
-
186
- // 4. Pause check
187
- if (isAgentPaused(agent) && !_hasInboundWork) {
188
- return {
189
- active: false,
190
- reason: AGENT_ACTIVITY_STATUS.AGENT_PAUSED,
191
- details: agent.pausedUntil ? `Agent paused until ${agent.pausedUntil}` : 'Agent paused indefinitely'
192
- };
193
- }
194
-
195
- // 5. Awaiting user input check (credentials modal, user prompt, etc.)
196
- // Agent stays ACTIVE and visible to other agents, but scheduler skips it.
197
- if (agent.awaitingUserInput) {
198
- return {
199
- active: false,
200
- reason: AGENT_ACTIVITY_STATUS.AWAITING_USER_INPUT,
201
- details: `Agent awaiting user input: ${agent.awaitingUserInput.type || 'unknown'}`
202
- };
203
- }
204
-
205
- // 6. Stop request check
206
- if (agent.stopRequested) {
207
- return {
208
- active: false,
209
- reason: AGENT_ACTIVITY_STATUS.STOP_REQUESTED,
210
- details: 'Agent stop has been requested'
211
- };
212
- }
213
-
214
- // NOTE: JobDone clears the agent's task list but keeps agent in AGENT mode.
215
- // With no pending tasks, the agent becomes idle until new messages arrive
216
- // (which auto-create tasks in agentPool, re-activating the agent).
217
- // No need to check modeState processingInProgress flag and
218
- // agentProcessingLocks in the scheduler prevent concurrent processing.
219
-
220
- // 7. TTL (Time-to-Live) override check
221
- // If agent has TTL remaining, keep it active for one more processing cycle
222
- // This allows agents to react after clearing tasks (e.g., call job-done or create new tasks)
223
- if (agent.ttl !== null && agent.ttl !== undefined && agent.ttl > 0) {
224
- return {
225
- active: true,
226
- reason: AGENT_ACTIVITY_STATUS.HAS_TTL_REMAINING,
227
- details: `Agent has ${agent.ttl} TTL cycle(s) remaining`
228
- };
229
- }
230
-
231
- // 8. Mode-specific logic
232
-
233
- if (agent.mode === AGENT_MODES.AGENT) {
234
- // AGENT mode: active only if has pending tasks.
235
- // New messages auto-create tasks at arrival time (in agentPool),
236
- // so pending tasks is the single source of truth for scheduling.
237
- if (hasPendingTasks(agent)) {
238
- return {
239
- active: true,
240
- reason: AGENT_ACTIVITY_STATUS.HAS_PENDING_TASKS,
241
- details: `Agent has pending/in-progress tasks`
242
- };
243
- }
244
-
245
- // AGENT mode with no pending tasks = idle, waiting for new work
246
- return {
247
- active: false,
248
- reason: AGENT_ACTIVITY_STATUS.NO_PENDING_WORK,
249
- details: 'AGENT mode agent has no pending tasks'
250
- };
251
- }
252
-
253
- if (agent.mode === AGENT_MODES.CHAT) {
254
- // CHAT mode: active ONLY if has user messages or inter-agent messages
255
- // Tool results alone should NOT keep CHAT agents active
256
- const queueStatus = getMessageQueueStatus(agent);
257
-
258
- if (queueStatus.hasUserMessages) {
259
- return {
260
- active: true,
261
- reason: AGENT_ACTIVITY_STATUS.HAS_USER_MESSAGES,
262
- details: `Agent has ${queueStatus.counts.userMessages} user message(s) to process`
263
- };
264
- }
265
-
266
- if (queueStatus.hasInterAgentMessages) {
267
- return {
268
- active: true,
269
- reason: AGENT_ACTIVITY_STATUS.HAS_INTER_AGENT_MESSAGES,
270
- details: `Agent has ${queueStatus.counts.interAgentMessages} inter-agent message(s) to process`
271
- };
272
- }
273
-
274
- // CHAT mode with no user/inter-agent messages
275
- return {
276
- active: false,
277
- reason: AGENT_ACTIVITY_STATUS.CHAT_MODE_NO_MESSAGES,
278
- details: queueStatus.hasToolResults
279
- ? `CHAT mode - has ${queueStatus.counts.toolResults} tool results but no new messages`
280
- : 'CHAT mode - no messages to process'
281
- };
282
- }
283
-
284
- // Unknown mode
285
- return {
286
- active: false,
287
- reason: AGENT_ACTIVITY_STATUS.UNKNOWN_MODE,
288
- details: `Unknown agent mode: ${agent.mode}`
289
- };
290
- }
291
-
292
- /**
293
- * Get all agents that should currently be active
294
- *
295
- * @param {Map|Array} agents - Collection of agents (Map from AgentPool.agents or Array)
296
- * @returns {Array<{ agentId: string, sessionId: string, reason: string, details: string }>}
297
- */
298
- export function getActiveAgents(agents) {
299
- const agentArray = agents instanceof Map ? Array.from(agents.values()) : agents;
300
-
301
- return agentArray
302
- .map(agent => {
303
- const result = shouldAgentBeActive(agent);
304
- return {
305
- agent,
306
- agentId: agent.id,
307
- sessionId: agent.sessionId,
308
- ...result
309
- };
310
- })
311
- .filter(result => result.active);
312
- }
313
-
314
- /**
315
- * Get detailed activity status for all agents (for debugging/monitoring)
316
- *
317
- * @param {Map|Array} agents - Collection of agents
318
- * @returns {Array<Object>} Detailed status for each agent
319
- */
320
- export function getAllAgentActivityStatus(agents) {
321
- const agentArray = agents instanceof Map ? Array.from(agents.values()) : agents;
322
-
323
- return agentArray.map(agent => {
324
- const result = shouldAgentBeActive(agent);
325
- const queueStatus = getMessageQueueStatus(agent);
326
-
327
- return {
328
- agentId: agent.id,
329
- agentName: agent.name,
330
- mode: agent.mode,
331
- status: agent.status,
332
- active: result.active,
333
- reason: result.reason,
334
- details: result.details,
335
- queueCounts: queueStatus.counts,
336
- hasPendingTasks: hasPendingTasks(agent),
337
- isDelayed: isAgentDelayed(agent),
338
- isPaused: isAgentPaused(agent),
339
- isExecutingTools: isExecutingTools(agent),
340
- awaitingUserInput: agent.awaitingUserInput || null,
341
- stopRequested: agent.stopRequested || false,
342
- delayEndTime: agent.delayEndTime || null,
343
- pausedUntil: agent.pausedUntil || null
344
- };
345
- });
346
- }
347
-
348
- /**
349
- * Check if agent is currently executing tools
350
- * @param {Object} agent - Agent object
351
- * @returns {boolean} True if tools are being executed
352
- */
353
- function isExecutingTools(agent) {
354
- return agent.toolExecutionInProgress === true;
355
- }
356
-
357
- /**
358
- * Check if an agent should skip the current processing iteration
359
- * (but remain in the scheduler for future iterations)
360
- *
361
- * This is different from shouldAgentBeActive - an agent might be active
362
- * but should skip this particular iteration (e.g., still delayed but not removed)
363
- *
364
- * @param {Object} agent - Agent object
365
- * @returns {{ skip: boolean, reason: string }}
366
- */
367
- export function shouldSkipIteration(agent) {
368
- if (!agent) {
369
- return { skip: true, reason: 'Agent not found' };
370
- }
371
-
372
- // Belt-and-suspenders: a queued inbound message is a stronger signal
373
- // than any delay/pause. Inbound enqueue paths (addUserMessage,
374
- // addInterAgentMessage, addToolResult) call agentPool._wakeAgentForMessage
375
- // to clear delay/pause *before* queueing so in the happy path we never
376
- // reach this branch with a non-empty queue AND a live delay. But if
377
- // anything bypassed that (direct state mutation in tests, future code
378
- // paths, persisted state loaded mid-delay with pre-existing queue), we
379
- // still refuse to skip.
380
- const q = getMessageQueueStatus(agent);
381
- const hasInbound = q.hasUserMessages || q.hasInterAgentMessages || q.hasToolResults;
382
-
383
- // Skip if delayed (but don't remove - delay will expire)
384
- // This is also used for WebTool auto-delay to allow browser operations to complete
385
- if (isAgentDelayed(agent) && !hasInbound) {
386
- return { skip: true, reason: `Agent delayed until ${agent.delayEndTime}` };
387
- }
388
-
389
- // Skip if paused with expiration (but don't remove - pause will expire)
390
- if (agent.pausedUntil && new Date() < new Date(agent.pausedUntil) && !hasInbound) {
391
- return { skip: true, reason: `Agent paused until ${agent.pausedUntil}` };
392
- }
393
-
394
- return { skip: false, reason: null };
395
- }
396
-
397
- // Export helper functions for testing and direct use
398
- export {
399
- hasPendingTasks,
400
- getMessageQueueStatus,
401
- // hasUnprocessedIncomingMessages, // TODO: Remove after 2026-02-10
402
- isAgentDelayed,
403
- isAgentPaused,
404
- isExecutingTools,
405
- // hasAutonomousWorkComplete // TODO: Remove after 2026-02-10
406
- };
407
-
408
- export default {
409
- shouldAgentBeActive,
410
- getActiveAgents,
411
- getAllAgentActivityStatus,
412
- shouldSkipIteration,
413
- hasPendingTasks,
414
- getMessageQueueStatus,
415
- // hasUnprocessedIncomingMessages, // TODO: Remove after 2026-02-10
416
- isAgentDelayed,
417
- isAgentPaused,
418
- isExecutingTools,
419
- // hasAutonomousWorkComplete // TODO: Remove after 2026-02-10
420
- };
1
+ /**
2
+ * AgentActivityService - Centralized service for determining agent scheduler activity
3
+ *
4
+ * Purpose:
5
+ * - Single source of truth for "should this agent be active in scheduler"
6
+ * - Eliminates scattered add/remove logic across codebase
7
+ * - Provides clear, testable activation conditions
8
+ * - Returns detailed reasons for debugging
9
+ *
10
+ * Architecture:
11
+ * - Pure functions that inspect agent state
12
+ * - No side effects (doesn't modify agent state)
13
+ * - Scheduler queries this service each cycle instead of managing events
14
+ */
15
+
16
+ import {
17
+ AGENT_MODES,
18
+ AGENT_STATUS,
19
+ AGENT_ACTIVITY_STATUS,
20
+ TASK_STATUS
21
+ } from '../utilities/constants.js';
22
+
23
+ /**
24
+ * Result of activity check
25
+ * @typedef {Object} ActivityCheckResult
26
+ * @property {boolean} active - Whether agent should be active in scheduler
27
+ * @property {string} reason - Reason code from AGENT_ACTIVITY_STATUS
28
+ * @property {string} [details] - Additional human-readable details
29
+ */
30
+
31
+ /**
32
+ * Check if an agent has pending or in-progress tasks
33
+ * @param {Object} agent - Agent object
34
+ * @returns {boolean} True if agent has work to do
35
+ */
36
+ function hasPendingTasks(agent) {
37
+ if (!agent.taskList || !agent.taskList.tasks || !Array.isArray(agent.taskList.tasks)) {
38
+ return false;
39
+ }
40
+
41
+ return agent.taskList.tasks.some(task =>
42
+ task.status === TASK_STATUS.PENDING || task.status === TASK_STATUS.IN_PROGRESS
43
+ );
44
+ }
45
+
46
+ /**
47
+ * Check if agent has queued messages of any type
48
+ * @param {Object} agent - Agent object
49
+ * @returns {{ hasMessages: boolean, counts: Object }} Message queue status
50
+ */
51
+ function getMessageQueueStatus(agent) {
52
+ const queues = agent.messageQueues || {};
53
+
54
+ const counts = {
55
+ toolResults: Array.isArray(queues.toolResults) ? queues.toolResults.length : 0,
56
+ interAgentMessages: Array.isArray(queues.interAgentMessages) ? queues.interAgentMessages.length : 0,
57
+ userMessages: Array.isArray(queues.userMessages) ? queues.userMessages.length : 0
58
+ };
59
+
60
+ counts.total = counts.toolResults + counts.interAgentMessages + counts.userMessages;
61
+
62
+ return {
63
+ hasMessages: counts.total > 0,
64
+ hasUserMessages: counts.userMessages > 0,
65
+ hasInterAgentMessages: counts.interAgentMessages > 0,
66
+ hasToolResults: counts.toolResults > 0,
67
+ counts
68
+ };
69
+ }
70
+
71
+ // TODO: Remove after 2026-02-10 if not proven as needed.
72
+ // No longer called from shouldAgentBeActive AGENT mode uses task-based
73
+ // scheduling (messages auto-create tasks at arrival), CHAT mode checks
74
+ // messageQueues directly via getMessageQueueStatus().
75
+ //
76
+ // function hasUnprocessedIncomingMessages(agent) {
77
+ // if (agent.incomingMessages && Array.isArray(agent.incomingMessages) && agent.incomingMessages.length > 0) {
78
+ // return true;
79
+ // }
80
+ // if (agent.interAgentTracking && agent.interAgentTracking instanceof Map && agent.interAgentTracking.size > 0) {
81
+ // const now = Date.now();
82
+ // for (const tracking of agent.interAgentTracking.values()) {
83
+ // if (tracking.lastReceived &&
84
+ // (now - tracking.lastReceived) < SCHEDULER_CONFIG.RECENT_MESSAGE_THRESHOLD_MS &&
85
+ // tracking.lastType === 'received') {
86
+ // return true;
87
+ // }
88
+ // }
89
+ // }
90
+ // return false;
91
+ // }
92
+
93
+ /**
94
+ * Check if agent is currently delayed
95
+ * @param {Object} agent - Agent object
96
+ * @returns {boolean} True if agent is delayed
97
+ */
98
+ function isAgentDelayed(agent) {
99
+ if (!agent.delayEndTime) {
100
+ return false;
101
+ }
102
+
103
+ return new Date() < new Date(agent.delayEndTime);
104
+ }
105
+
106
+ /**
107
+ * Check if agent is currently paused
108
+ * @param {Object} agent - Agent object
109
+ * @returns {boolean} True if agent is paused
110
+ */
111
+ function isAgentPaused(agent) {
112
+ // Check status-based pause
113
+ if (agent.status === AGENT_STATUS.PAUSED) {
114
+ // If pausedUntil is set, check if it's expired
115
+ if (agent.pausedUntil) {
116
+ return new Date() < new Date(agent.pausedUntil);
117
+ }
118
+ return true; // Paused indefinitely
119
+ }
120
+
121
+ // Check time-based pause
122
+ if (agent.pausedUntil && new Date() < new Date(agent.pausedUntil)) {
123
+ return true;
124
+ }
125
+
126
+ return false;
127
+ }
128
+
129
+ // TODO: Remove after 2026-02-10 if not proven as needed.
130
+ // Job-done now clears the task list instead of switching mode.
131
+ // The autonomousWorkComplete flag is still set for reference but
132
+ // is no longer used as a scheduling condition.
133
+ //
134
+ // function hasAutonomousWorkComplete(agent) {
135
+ // return agent.autonomousWorkComplete === true;
136
+ // }
137
+
138
+ /**
139
+ * Centralized function to determine if an agent should be active in the scheduler
140
+ *
141
+ * This function encapsulates ALL logic for determining agent activity status.
142
+ * It inspects the agent's current state and returns a decision with reason.
143
+ *
144
+ * @param {Object} agent - Full agent object from AgentPool
145
+ * @returns {ActivityCheckResult} Activity decision with reason
146
+ */
147
+ export function shouldAgentBeActive(agent) {
148
+ // 1. Basic existence check
149
+ if (!agent) {
150
+ return {
151
+ active: false,
152
+ reason: AGENT_ACTIVITY_STATUS.AGENT_NOT_FOUND,
153
+ details: 'Agent object is null or undefined'
154
+ };
155
+ }
156
+
157
+ // 2. Status check - agent must be active
158
+ if (agent.status !== AGENT_STATUS.ACTIVE) {
159
+ return {
160
+ active: false,
161
+ reason: AGENT_ACTIVITY_STATUS.AGENT_INACTIVE_STATUS,
162
+ details: `Agent status is ${agent.status}, expected ${AGENT_STATUS.ACTIVE}`
163
+ };
164
+ }
165
+
166
+ // Belt-and-suspenders: queued inbound work (user message, inter-agent
167
+ // ping, tool result) overrides delay/pause. Inbound enqueue paths clear
168
+ // delay/pause at arrival time via agentPool._wakeAgentForMessage, so in
169
+ // the happy path a delayed agent never has queued messages. This guard
170
+ // is a defensive second line: if anything bypasses the enqueue helpers
171
+ // (persisted state loaded mid-delay, direct mutation in legacy code,
172
+ // future paths) we still refuse to sideline an agent that has work to do.
173
+ const _queueStatus = getMessageQueueStatus(agent);
174
+ const _hasInboundWork = _queueStatus.hasUserMessages || _queueStatus.hasInterAgentMessages || _queueStatus.hasToolResults;
175
+
176
+ // 3. Delay check
177
+ if (isAgentDelayed(agent) && !_hasInboundWork) {
178
+ return {
179
+ active: false,
180
+ reason: AGENT_ACTIVITY_STATUS.AGENT_DELAYED,
181
+ details: `Agent delayed until ${agent.delayEndTime}`
182
+ };
183
+ }
184
+
185
+ // 4. Pause check
186
+ if (isAgentPaused(agent) && !_hasInboundWork) {
187
+ return {
188
+ active: false,
189
+ reason: AGENT_ACTIVITY_STATUS.AGENT_PAUSED,
190
+ details: agent.pausedUntil ? `Agent paused until ${agent.pausedUntil}` : 'Agent paused indefinitely'
191
+ };
192
+ }
193
+
194
+ // 5. Awaiting user input check (credentials modal, user prompt, etc.)
195
+ // Agent stays ACTIVE and visible to other agents, but scheduler skips it.
196
+ if (agent.awaitingUserInput) {
197
+ return {
198
+ active: false,
199
+ reason: AGENT_ACTIVITY_STATUS.AWAITING_USER_INPUT,
200
+ details: `Agent awaiting user input: ${agent.awaitingUserInput.type || 'unknown'}`
201
+ };
202
+ }
203
+
204
+ // 6. Stop request check
205
+ if (agent.stopRequested) {
206
+ return {
207
+ active: false,
208
+ reason: AGENT_ACTIVITY_STATUS.STOP_REQUESTED,
209
+ details: 'Agent stop has been requested'
210
+ };
211
+ }
212
+
213
+ // NOTE: JobDone clears the agent's task list but keeps agent in AGENT mode.
214
+ // With no pending tasks, the agent becomes idle until new messages arrive
215
+ // (which auto-create tasks in agentPool, re-activating the agent).
216
+ // No need to check modeState processingInProgress flag and
217
+ // agentProcessingLocks in the scheduler prevent concurrent processing.
218
+
219
+ // 7. TTL (Time-to-Live) override check
220
+ // If agent has TTL remaining, keep it active for one more processing cycle
221
+ // This allows agents to react after clearing tasks (e.g., call job-done or create new tasks)
222
+ if (agent.ttl !== null && agent.ttl !== undefined && agent.ttl > 0) {
223
+ return {
224
+ active: true,
225
+ reason: AGENT_ACTIVITY_STATUS.HAS_TTL_REMAINING,
226
+ details: `Agent has ${agent.ttl} TTL cycle(s) remaining`
227
+ };
228
+ }
229
+
230
+ // 8. Mode-specific logic
231
+
232
+ if (agent.mode === AGENT_MODES.AGENT) {
233
+ // AGENT mode: active only if has pending tasks.
234
+ // New messages auto-create tasks at arrival time (in agentPool),
235
+ // so pending tasks is the single source of truth for scheduling.
236
+ if (hasPendingTasks(agent)) {
237
+ return {
238
+ active: true,
239
+ reason: AGENT_ACTIVITY_STATUS.HAS_PENDING_TASKS,
240
+ details: `Agent has pending/in-progress tasks`
241
+ };
242
+ }
243
+
244
+ // AGENT mode with no pending tasks = idle, waiting for new work
245
+ return {
246
+ active: false,
247
+ reason: AGENT_ACTIVITY_STATUS.NO_PENDING_WORK,
248
+ details: 'AGENT mode agent has no pending tasks'
249
+ };
250
+ }
251
+
252
+ if (agent.mode === AGENT_MODES.CHAT) {
253
+ // CHAT mode: active ONLY if has user messages or inter-agent messages
254
+ // Tool results alone should NOT keep CHAT agents active
255
+ const queueStatus = getMessageQueueStatus(agent);
256
+
257
+ if (queueStatus.hasUserMessages) {
258
+ return {
259
+ active: true,
260
+ reason: AGENT_ACTIVITY_STATUS.HAS_USER_MESSAGES,
261
+ details: `Agent has ${queueStatus.counts.userMessages} user message(s) to process`
262
+ };
263
+ }
264
+
265
+ if (queueStatus.hasInterAgentMessages) {
266
+ return {
267
+ active: true,
268
+ reason: AGENT_ACTIVITY_STATUS.HAS_INTER_AGENT_MESSAGES,
269
+ details: `Agent has ${queueStatus.counts.interAgentMessages} inter-agent message(s) to process`
270
+ };
271
+ }
272
+
273
+ // CHAT mode with no user/inter-agent messages
274
+ return {
275
+ active: false,
276
+ reason: AGENT_ACTIVITY_STATUS.CHAT_MODE_NO_MESSAGES,
277
+ details: queueStatus.hasToolResults
278
+ ? `CHAT mode - has ${queueStatus.counts.toolResults} tool results but no new messages`
279
+ : 'CHAT mode - no messages to process'
280
+ };
281
+ }
282
+
283
+ // Unknown mode
284
+ return {
285
+ active: false,
286
+ reason: AGENT_ACTIVITY_STATUS.UNKNOWN_MODE,
287
+ details: `Unknown agent mode: ${agent.mode}`
288
+ };
289
+ }
290
+
291
+ /**
292
+ * Get all agents that should currently be active
293
+ *
294
+ * @param {Map|Array} agents - Collection of agents (Map from AgentPool.agents or Array)
295
+ * @returns {Array<{ agentId: string, sessionId: string, reason: string, details: string }>}
296
+ */
297
+ export function getActiveAgents(agents) {
298
+ const agentArray = agents instanceof Map ? Array.from(agents.values()) : agents;
299
+
300
+ return agentArray
301
+ .map(agent => {
302
+ const result = shouldAgentBeActive(agent);
303
+ return {
304
+ agent,
305
+ agentId: agent.id,
306
+ sessionId: agent.sessionId,
307
+ ...result
308
+ };
309
+ })
310
+ .filter(result => result.active);
311
+ }
312
+
313
+ /**
314
+ * Get detailed activity status for all agents (for debugging/monitoring)
315
+ *
316
+ * @param {Map|Array} agents - Collection of agents
317
+ * @returns {Array<Object>} Detailed status for each agent
318
+ */
319
+ export function getAllAgentActivityStatus(agents) {
320
+ const agentArray = agents instanceof Map ? Array.from(agents.values()) : agents;
321
+
322
+ return agentArray.map(agent => {
323
+ const result = shouldAgentBeActive(agent);
324
+ const queueStatus = getMessageQueueStatus(agent);
325
+
326
+ return {
327
+ agentId: agent.id,
328
+ agentName: agent.name,
329
+ mode: agent.mode,
330
+ status: agent.status,
331
+ active: result.active,
332
+ reason: result.reason,
333
+ details: result.details,
334
+ queueCounts: queueStatus.counts,
335
+ hasPendingTasks: hasPendingTasks(agent),
336
+ isDelayed: isAgentDelayed(agent),
337
+ isPaused: isAgentPaused(agent),
338
+ isExecutingTools: isExecutingTools(agent),
339
+ awaitingUserInput: agent.awaitingUserInput || null,
340
+ stopRequested: agent.stopRequested || false,
341
+ delayEndTime: agent.delayEndTime || null,
342
+ pausedUntil: agent.pausedUntil || null
343
+ };
344
+ });
345
+ }
346
+
347
+ /**
348
+ * Check if agent is currently executing tools
349
+ * @param {Object} agent - Agent object
350
+ * @returns {boolean} True if tools are being executed
351
+ */
352
+ function isExecutingTools(agent) {
353
+ return agent.toolExecutionInProgress === true;
354
+ }
355
+
356
+ /**
357
+ * Check if an agent should skip the current processing iteration
358
+ * (but remain in the scheduler for future iterations)
359
+ *
360
+ * This is different from shouldAgentBeActive - an agent might be active
361
+ * but should skip this particular iteration (e.g., still delayed but not removed)
362
+ *
363
+ * @param {Object} agent - Agent object
364
+ * @returns {{ skip: boolean, reason: string }}
365
+ */
366
+ export function shouldSkipIteration(agent) {
367
+ if (!agent) {
368
+ return { skip: true, reason: 'Agent not found' };
369
+ }
370
+
371
+ // Belt-and-suspenders: a queued inbound message is a stronger signal
372
+ // than any delay/pause. Inbound enqueue paths (addUserMessage,
373
+ // addInterAgentMessage, addToolResult) call agentPool._wakeAgentForMessage
374
+ // to clear delay/pause *before* queueing — so in the happy path we never
375
+ // reach this branch with a non-empty queue AND a live delay. But if
376
+ // anything bypassed that (direct state mutation in tests, future code
377
+ // paths, persisted state loaded mid-delay with pre-existing queue), we
378
+ // still refuse to skip.
379
+ const q = getMessageQueueStatus(agent);
380
+ const hasInbound = q.hasUserMessages || q.hasInterAgentMessages || q.hasToolResults;
381
+
382
+ // Skip if delayed (but don't remove - delay will expire)
383
+ // This is also used for WebTool auto-delay to allow browser operations to complete
384
+ if (isAgentDelayed(agent) && !hasInbound) {
385
+ return { skip: true, reason: `Agent delayed until ${agent.delayEndTime}` };
386
+ }
387
+
388
+ // Skip if paused with expiration (but don't remove - pause will expire)
389
+ if (agent.pausedUntil && new Date() < new Date(agent.pausedUntil) && !hasInbound) {
390
+ return { skip: true, reason: `Agent paused until ${agent.pausedUntil}` };
391
+ }
392
+
393
+ return { skip: false, reason: null };
394
+ }
395
+
396
+ // Export helper functions for testing and direct use
397
+ export {
398
+ hasPendingTasks,
399
+ getMessageQueueStatus,
400
+ // hasUnprocessedIncomingMessages, // TODO: Remove after 2026-02-10
401
+ isAgentDelayed,
402
+ isAgentPaused,
403
+ isExecutingTools,
404
+ // hasAutonomousWorkComplete // TODO: Remove after 2026-02-10
405
+ };
406
+
407
+ export default {
408
+ shouldAgentBeActive,
409
+ getActiveAgents,
410
+ getAllAgentActivityStatus,
411
+ shouldSkipIteration,
412
+ hasPendingTasks,
413
+ getMessageQueueStatus,
414
+ // hasUnprocessedIncomingMessages, // TODO: Remove after 2026-02-10
415
+ isAgentDelayed,
416
+ isAgentPaused,
417
+ isExecutingTools,
418
+ // hasAutonomousWorkComplete // TODO: Remove after 2026-02-10
419
+ };