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,453 +1,454 @@
1
- /**
2
- * Human Behavior Simulation Utility
3
- *
4
- * Provides human-like mouse movements, typing patterns, and action delays
5
- * to make browser automation less detectable by anti-bot systems.
6
- */
7
-
8
- import { createCursor } from 'ghost-cursor';
9
- import {
10
- TYPING_CONFIG,
11
- MOUSE_CONFIG,
12
- ACTION_DELAYS
13
- } from './stealthConstants.js';
14
-
15
- /**
16
- * Generate a random number within a range
17
- * @param {number} min - Minimum value
18
- * @param {number} max - Maximum value
19
- * @returns {number} Random number between min and max
20
- */
21
- function randomInRange(min, max) {
22
- return Math.floor(Math.random() * (max - min + 1)) + min;
23
- }
24
-
25
- /**
26
- * Sleep for a specified duration
27
- * @param {number} ms - Milliseconds to sleep
28
- * @returns {Promise<void>}
29
- */
30
- function sleep(ms) {
31
- return new Promise(resolve => setTimeout(resolve, ms));
32
- }
33
-
34
- /**
35
- * Create a human-like cursor controller for a page
36
- * @param {Page} page - Puppeteer page instance
37
- * @param {Object} options - Cursor options
38
- * @returns {Object} Ghost cursor instance with enhanced methods
39
- */
40
- export function createHumanCursor(page, options = {}) {
41
- const cursor = createCursor(page, {
42
- // Start position (center of viewport)
43
- start: {
44
- x: Math.floor(page.viewport()?.width || 1920) / 2,
45
- y: Math.floor(page.viewport()?.height || 1080) / 2
46
- }
47
- });
48
-
49
- // Wrap cursor with human-like enhancements
50
- return {
51
- /**
52
- * Move cursor to element with human-like motion
53
- * @param {string} selector - CSS selector
54
- * @param {Object} moveOptions - Movement options
55
- */
56
- async moveTo(selector, moveOptions = {}) {
57
- const {
58
- hesitate = true,
59
- hesitateMs = randomInRange(
60
- MOUSE_CONFIG.HESITATE_BEFORE_CLICK.MIN_MS,
61
- MOUSE_CONFIG.HESITATE_BEFORE_CLICK.MAX_MS
62
- )
63
- } = moveOptions;
64
-
65
- await cursor.move(selector);
66
-
67
- if (hesitate) {
68
- await sleep(hesitateMs);
69
- }
70
- },
71
-
72
- /**
73
- * Click element with human-like behavior
74
- * @param {string} selector - CSS selector
75
- * @param {Object} clickOptions - Click options
76
- */
77
- async click(selector, clickOptions = {}) {
78
- const {
79
- hesitate = true,
80
- moveFirst = true
81
- } = clickOptions;
82
-
83
- if (moveFirst) {
84
- await this.moveTo(selector, { hesitate });
85
- }
86
-
87
- // Random click duration
88
- const clickDelay = randomInRange(
89
- MOUSE_CONFIG.CLICK_DURATION.MIN_MS,
90
- MOUSE_CONFIG.CLICK_DURATION.MAX_MS
91
- );
92
-
93
- await cursor.click(selector, {
94
- hesitate: hesitate ? randomInRange(
95
- MOUSE_CONFIG.HESITATE_BEFORE_CLICK.MIN_MS,
96
- MOUSE_CONFIG.HESITATE_BEFORE_CLICK.MAX_MS
97
- ) : 0,
98
- waitForClick: clickDelay
99
- });
100
- },
101
-
102
- /**
103
- * Double click element with human-like behavior
104
- * @param {string} selector - CSS selector
105
- */
106
- async doubleClick(selector) {
107
- await this.moveTo(selector);
108
- await cursor.click(selector, { waitForClick: 50 });
109
- await sleep(randomInRange(50, 150));
110
- await cursor.click(selector, { waitForClick: 50 });
111
- },
112
-
113
- /**
114
- * Hover over element
115
- * @param {string} selector - CSS selector
116
- */
117
- async hover(selector) {
118
- await this.moveTo(selector, { hesitate: true });
119
- },
120
-
121
- /**
122
- * Random mouse movement within viewport (simulates idle behavior)
123
- * @param {number} duration - Duration in ms for random movements
124
- */
125
- async randomMovement(duration = 2000) {
126
- const startTime = Date.now();
127
- const viewport = page.viewport() || { width: 1920, height: 1080 };
128
-
129
- while (Date.now() - startTime < duration) {
130
- const x = randomInRange(100, viewport.width - 100);
131
- const y = randomInRange(100, viewport.height - 100);
132
-
133
- await cursor.moveTo({ x, y });
134
- await sleep(randomInRange(200, 500));
135
- }
136
- },
137
-
138
- // Expose original cursor for advanced use
139
- _cursor: cursor
140
- };
141
- }
142
-
143
- /**
144
- * Type text with human-like patterns
145
- * @param {Page} page - Puppeteer page instance
146
- * @param {string} selector - CSS selector for input field
147
- * @param {string} text - Text to type
148
- * @param {Object} options - Typing options
149
- */
150
- export async function humanType(page, selector, text, options = {}) {
151
- const {
152
- clearFirst = true,
153
- clickFirst = true,
154
- baseDelay = TYPING_CONFIG.BASE_DELAY_MS,
155
- randomDelay = TYPING_CONFIG.RANDOM_DELAY_MAX_MS,
156
- pauseProbability = TYPING_CONFIG.PAUSE_PROBABILITY,
157
- simulateTypos = false,
158
- typoProbability = TYPING_CONFIG.TYPO_PROBABILITY
159
- } = options;
160
-
161
- // Click to focus the field
162
- if (clickFirst) {
163
- await page.click(selector);
164
- await sleep(randomInRange(100, 200));
165
- }
166
-
167
- // Clear existing content using keyboard commands (triggers proper input events)
168
- // IMPORTANT: Setting element.value = '' directly does NOT trigger input events,
169
- // which breaks React/Vue/Angular forms and can be detected as bot behavior.
170
- if (clearFirst) {
171
- // Triple-click to select all text in the field (more human-like than Ctrl+A)
172
- await page.click(selector, { clickCount: 3 });
173
- await sleep(randomInRange(50, 100));
174
-
175
- // Delete selected text with Backspace (triggers input events)
176
- await page.keyboard.press('Backspace');
177
- await sleep(randomInRange(50, 100));
178
-
179
- // Dispatch input event to ensure framework state updates
180
- await page.evaluate((sel) => {
181
- const element = document.querySelector(sel);
182
- if (element) {
183
- element.dispatchEvent(new Event('input', { bubbles: true }));
184
- element.dispatchEvent(new Event('change', { bubbles: true }));
185
- }
186
- }, selector);
187
- await sleep(randomInRange(30, 80));
188
- }
189
-
190
- // Type each character with human-like timing
191
- for (let i = 0; i < text.length; i++) {
192
- const char = text[i];
193
-
194
- // Occasional typo simulation
195
- if (simulateTypos && Math.random() < typoProbability && char.match(/[a-z]/i)) {
196
- // Type wrong key
197
- const wrongChar = getAdjacentKey(char);
198
- await page.keyboard.type(wrongChar);
199
- await sleep(randomInRange(100, 200));
200
-
201
- // Pause (realize mistake)
202
- await sleep(randomInRange(200, 400));
203
-
204
- // Delete wrong character
205
- await page.keyboard.press('Backspace');
206
- await sleep(TYPING_CONFIG.TYPO_CORRECTION_DELAY_MS);
207
- }
208
-
209
- // Type the correct character
210
- await page.keyboard.type(char);
211
-
212
- // Calculate delay for next character
213
- let delay = baseDelay + randomInRange(0, randomDelay);
214
-
215
- // Add occasional pauses (thinking)
216
- if (Math.random() < pauseProbability) {
217
- delay += randomInRange(
218
- TYPING_CONFIG.PAUSE_DURATION.MIN_MS,
219
- TYPING_CONFIG.PAUSE_DURATION.MAX_MS
220
- );
221
- }
222
-
223
- // Slightly longer delay after punctuation or spaces
224
- if (['.', ',', '!', '?', ' ', '@'].includes(char)) {
225
- delay += randomInRange(30, 80);
226
- }
227
-
228
- await sleep(delay);
229
- }
230
-
231
- // Final event dispatch to ensure framework state is fully updated
232
- // Some frameworks (especially React with controlled inputs) need explicit events
233
- await page.evaluate((sel) => {
234
- const element = document.querySelector(sel);
235
- if (element) {
236
- // Dispatch events that frameworks listen for
237
- element.dispatchEvent(new Event('input', { bubbles: true }));
238
- element.dispatchEvent(new Event('change', { bubbles: true }));
239
- // Also dispatch blur and focus to trigger validation
240
- element.dispatchEvent(new FocusEvent('blur', { bubbles: true }));
241
- element.dispatchEvent(new FocusEvent('focus', { bubbles: true }));
242
- }
243
- }, selector);
244
- }
245
-
246
- /**
247
- * Get an adjacent key on QWERTY keyboard for typo simulation
248
- * @param {string} char - Original character
249
- * @returns {string} Adjacent character
250
- */
251
- function getAdjacentKey(char) {
252
- const keyboard = {
253
- 'q': ['w', 'a'], 'w': ['q', 'e', 's'], 'e': ['w', 'r', 'd'], 'r': ['e', 't', 'f'],
254
- 't': ['r', 'y', 'g'], 'y': ['t', 'u', 'h'], 'u': ['y', 'i', 'j'], 'i': ['u', 'o', 'k'],
255
- 'o': ['i', 'p', 'l'], 'p': ['o', 'l'],
256
- 'a': ['q', 's', 'z'], 's': ['a', 'w', 'd', 'x'], 'd': ['s', 'e', 'f', 'c'],
257
- 'f': ['d', 'r', 'g', 'v'], 'g': ['f', 't', 'h', 'b'], 'h': ['g', 'y', 'j', 'n'],
258
- 'j': ['h', 'u', 'k', 'm'], 'k': ['j', 'i', 'l'], 'l': ['k', 'o', 'p'],
259
- 'z': ['a', 's', 'x'], 'x': ['z', 's', 'd', 'c'], 'c': ['x', 'd', 'f', 'v'],
260
- 'v': ['c', 'f', 'g', 'b'], 'b': ['v', 'g', 'h', 'n'], 'n': ['b', 'h', 'j', 'm'],
261
- 'm': ['n', 'j', 'k']
262
- };
263
-
264
- const lowerChar = char.toLowerCase();
265
- const adjacent = keyboard[lowerChar];
266
-
267
- if (!adjacent) return char;
268
-
269
- const wrongChar = adjacent[Math.floor(Math.random() * adjacent.length)];
270
- return char === char.toUpperCase() ? wrongChar.toUpperCase() : wrongChar;
271
- }
272
-
273
- /**
274
- * Wait with human-like timing after an action
275
- * @param {string} actionType - Type of action (navigation, action, submit)
276
- * @returns {Promise<void>}
277
- */
278
- export async function humanWait(actionType = 'action') {
279
- let delay;
280
-
281
- switch (actionType) {
282
- case 'navigation':
283
- delay = randomInRange(
284
- ACTION_DELAYS.AFTER_NAVIGATION_MS.MIN,
285
- ACTION_DELAYS.AFTER_NAVIGATION_MS.MAX
286
- );
287
- break;
288
- case 'submit':
289
- case 'beforeSubmit':
290
- delay = randomInRange(
291
- ACTION_DELAYS.BEFORE_SUBMIT_MS.MIN,
292
- ACTION_DELAYS.BEFORE_SUBMIT_MS.MAX
293
- );
294
- break;
295
- case 'afterSubmit':
296
- delay = randomInRange(
297
- ACTION_DELAYS.AFTER_SUBMIT_MS.MIN,
298
- ACTION_DELAYS.AFTER_SUBMIT_MS.MAX
299
- );
300
- break;
301
- case 'scroll':
302
- delay = randomInRange(
303
- ACTION_DELAYS.SCROLL_PAUSE_MS.MIN,
304
- ACTION_DELAYS.SCROLL_PAUSE_MS.MAX
305
- );
306
- break;
307
- case 'action':
308
- default:
309
- delay = randomInRange(
310
- ACTION_DELAYS.BETWEEN_ACTIONS_MS.MIN,
311
- ACTION_DELAYS.BETWEEN_ACTIONS_MS.MAX
312
- );
313
- break;
314
- }
315
-
316
- await sleep(delay);
317
- }
318
-
319
- /**
320
- * Scroll page with human-like behavior
321
- * @param {Page} page - Puppeteer page instance
322
- * @param {Object} options - Scroll options
323
- */
324
- export async function humanScroll(page, options = {}) {
325
- const {
326
- direction = 'down',
327
- distance = 300,
328
- steps = 5
329
- } = options;
330
-
331
- const stepDistance = Math.floor(distance / steps);
332
- const scrollMultiplier = direction === 'up' ? -1 : 1;
333
-
334
- for (let i = 0; i < steps; i++) {
335
- // Add slight variation to each step
336
- const actualStep = stepDistance + randomInRange(-20, 20);
337
-
338
- await page.evaluate((y) => {
339
- window.scrollBy({ top: y, behavior: 'smooth' });
340
- }, actualStep * scrollMultiplier);
341
-
342
- // Random pause between scroll steps
343
- await sleep(randomInRange(50, 150));
344
- }
345
-
346
- // Pause after scrolling
347
- await humanWait('scroll');
348
- }
349
-
350
- /**
351
- * Scroll element into view with human-like behavior
352
- * @param {Page} page - Puppeteer page instance
353
- * @param {string} selector - CSS selector
354
- */
355
- export async function scrollToElement(page, selector) {
356
- await page.evaluate((sel) => {
357
- const element = document.querySelector(sel);
358
- if (element) {
359
- element.scrollIntoView({ behavior: 'smooth', block: 'center' });
360
- }
361
- }, selector);
362
-
363
- await humanWait('scroll');
364
- }
365
-
366
- /**
367
- * Fill a form with human-like behavior
368
- * @param {Page} page - Puppeteer page instance
369
- * @param {Object} fields - Form fields { selector: value }
370
- * @param {Object} options - Fill options
371
- */
372
- export async function humanFillForm(page, fields, options = {}) {
373
- const {
374
- cursor = null,
375
- tabBetweenFields = false
376
- } = options;
377
-
378
- const fieldEntries = Object.entries(fields);
379
-
380
- for (let i = 0; i < fieldEntries.length; i++) {
381
- const [selector, value] = fieldEntries[i];
382
-
383
- // Move to field (if cursor provided)
384
- if (cursor) {
385
- await cursor.click(selector);
386
- } else {
387
- await page.click(selector);
388
- }
389
-
390
- await humanWait('action');
391
-
392
- // Type the value
393
- await humanType(page, selector, value, {
394
- clearFirst: true,
395
- clickFirst: false // Already clicked
396
- });
397
-
398
- // Wait between fields
399
- if (i < fieldEntries.length - 1) {
400
- await humanWait('action');
401
-
402
- // Optionally use Tab to move to next field
403
- if (tabBetweenFields) {
404
- await page.keyboard.press('Tab');
405
- await sleep(randomInRange(100, 200));
406
- }
407
- }
408
- }
409
- }
410
-
411
- /**
412
- * Submit a form with human-like behavior
413
- * @param {Page} page - Puppeteer page instance
414
- * @param {string} submitSelector - CSS selector for submit button
415
- * @param {Object} options - Submit options
416
- */
417
- export async function humanSubmit(page, submitSelector, options = {}) {
418
- const { cursor = null, waitForNavigation = true } = options;
419
-
420
- // Pause before submit (human would review)
421
- await humanWait('beforeSubmit');
422
-
423
- // Click submit
424
- if (cursor) {
425
- await cursor.click(submitSelector);
426
- } else {
427
- await page.click(submitSelector);
428
- }
429
-
430
- // Wait for navigation if expected
431
- if (waitForNavigation) {
432
- try {
433
- await page.waitForNavigation({
434
- timeout: 10000,
435
- waitUntil: 'networkidle2'
436
- });
437
- } catch (e) {
438
- // Navigation might not happen (AJAX form)
439
- }
440
- }
441
-
442
- await humanWait('afterSubmit');
443
- }
444
-
445
- export default {
446
- createHumanCursor,
447
- humanType,
448
- humanWait,
449
- humanScroll,
450
- scrollToElement,
451
- humanFillForm,
452
- humanSubmit
453
- };
1
+ /**
2
+ * Human Behavior Simulation Utility
3
+ *
4
+ * Provides human-like mouse movements, typing patterns, and action delays
5
+ * to make browser automation less detectable by anti-bot systems.
6
+ */
7
+ /* global document, window, FocusEvent */
8
+
9
+ import { createCursor } from 'ghost-cursor';
10
+ import {
11
+ TYPING_CONFIG,
12
+ MOUSE_CONFIG,
13
+ ACTION_DELAYS
14
+ } from './stealthConstants.js';
15
+
16
+ /**
17
+ * Generate a random number within a range
18
+ * @param {number} min - Minimum value
19
+ * @param {number} max - Maximum value
20
+ * @returns {number} Random number between min and max
21
+ */
22
+ function randomInRange(min, max) {
23
+ return Math.floor(Math.random() * (max - min + 1)) + min;
24
+ }
25
+
26
+ /**
27
+ * Sleep for a specified duration
28
+ * @param {number} ms - Milliseconds to sleep
29
+ * @returns {Promise<void>}
30
+ */
31
+ function sleep(ms) {
32
+ return new Promise(resolve => setTimeout(resolve, ms));
33
+ }
34
+
35
+ /**
36
+ * Create a human-like cursor controller for a page
37
+ * @param {Page} page - Puppeteer page instance
38
+ * @param {Object} options - Cursor options
39
+ * @returns {Object} Ghost cursor instance with enhanced methods
40
+ */
41
+ export function createHumanCursor(page, _options = {}) {
42
+ const cursor = createCursor(page, {
43
+ // Start position (center of viewport)
44
+ start: {
45
+ x: Math.floor(page.viewport()?.width || 1920) / 2,
46
+ y: Math.floor(page.viewport()?.height || 1080) / 2
47
+ }
48
+ });
49
+
50
+ // Wrap cursor with human-like enhancements
51
+ return {
52
+ /**
53
+ * Move cursor to element with human-like motion
54
+ * @param {string} selector - CSS selector
55
+ * @param {Object} moveOptions - Movement options
56
+ */
57
+ async moveTo(selector, moveOptions = {}) {
58
+ const {
59
+ hesitate = true,
60
+ hesitateMs = randomInRange(
61
+ MOUSE_CONFIG.HESITATE_BEFORE_CLICK.MIN_MS,
62
+ MOUSE_CONFIG.HESITATE_BEFORE_CLICK.MAX_MS
63
+ )
64
+ } = moveOptions;
65
+
66
+ await cursor.move(selector);
67
+
68
+ if (hesitate) {
69
+ await sleep(hesitateMs);
70
+ }
71
+ },
72
+
73
+ /**
74
+ * Click element with human-like behavior
75
+ * @param {string} selector - CSS selector
76
+ * @param {Object} clickOptions - Click options
77
+ */
78
+ async click(selector, clickOptions = {}) {
79
+ const {
80
+ hesitate = true,
81
+ moveFirst = true
82
+ } = clickOptions;
83
+
84
+ if (moveFirst) {
85
+ await this.moveTo(selector, { hesitate });
86
+ }
87
+
88
+ // Random click duration
89
+ const clickDelay = randomInRange(
90
+ MOUSE_CONFIG.CLICK_DURATION.MIN_MS,
91
+ MOUSE_CONFIG.CLICK_DURATION.MAX_MS
92
+ );
93
+
94
+ await cursor.click(selector, {
95
+ hesitate: hesitate ? randomInRange(
96
+ MOUSE_CONFIG.HESITATE_BEFORE_CLICK.MIN_MS,
97
+ MOUSE_CONFIG.HESITATE_BEFORE_CLICK.MAX_MS
98
+ ) : 0,
99
+ waitForClick: clickDelay
100
+ });
101
+ },
102
+
103
+ /**
104
+ * Double click element with human-like behavior
105
+ * @param {string} selector - CSS selector
106
+ */
107
+ async doubleClick(selector) {
108
+ await this.moveTo(selector);
109
+ await cursor.click(selector, { waitForClick: 50 });
110
+ await sleep(randomInRange(50, 150));
111
+ await cursor.click(selector, { waitForClick: 50 });
112
+ },
113
+
114
+ /**
115
+ * Hover over element
116
+ * @param {string} selector - CSS selector
117
+ */
118
+ async hover(selector) {
119
+ await this.moveTo(selector, { hesitate: true });
120
+ },
121
+
122
+ /**
123
+ * Random mouse movement within viewport (simulates idle behavior)
124
+ * @param {number} duration - Duration in ms for random movements
125
+ */
126
+ async randomMovement(duration = 2000) {
127
+ const startTime = Date.now();
128
+ const viewport = page.viewport() || { width: 1920, height: 1080 };
129
+
130
+ while (Date.now() - startTime < duration) {
131
+ const x = randomInRange(100, viewport.width - 100);
132
+ const y = randomInRange(100, viewport.height - 100);
133
+
134
+ await cursor.moveTo({ x, y });
135
+ await sleep(randomInRange(200, 500));
136
+ }
137
+ },
138
+
139
+ // Expose original cursor for advanced use
140
+ _cursor: cursor
141
+ };
142
+ }
143
+
144
+ /**
145
+ * Type text with human-like patterns
146
+ * @param {Page} page - Puppeteer page instance
147
+ * @param {string} selector - CSS selector for input field
148
+ * @param {string} text - Text to type
149
+ * @param {Object} options - Typing options
150
+ */
151
+ export async function humanType(page, selector, text, options = {}) {
152
+ const {
153
+ clearFirst = true,
154
+ clickFirst = true,
155
+ baseDelay = TYPING_CONFIG.BASE_DELAY_MS,
156
+ randomDelay = TYPING_CONFIG.RANDOM_DELAY_MAX_MS,
157
+ pauseProbability = TYPING_CONFIG.PAUSE_PROBABILITY,
158
+ simulateTypos = false,
159
+ typoProbability = TYPING_CONFIG.TYPO_PROBABILITY
160
+ } = options;
161
+
162
+ // Click to focus the field
163
+ if (clickFirst) {
164
+ await page.click(selector);
165
+ await sleep(randomInRange(100, 200));
166
+ }
167
+
168
+ // Clear existing content using keyboard commands (triggers proper input events)
169
+ // IMPORTANT: Setting element.value = '' directly does NOT trigger input events,
170
+ // which breaks React/Vue/Angular forms and can be detected as bot behavior.
171
+ if (clearFirst) {
172
+ // Triple-click to select all text in the field (more human-like than Ctrl+A)
173
+ await page.click(selector, { clickCount: 3 });
174
+ await sleep(randomInRange(50, 100));
175
+
176
+ // Delete selected text with Backspace (triggers input events)
177
+ await page.keyboard.press('Backspace');
178
+ await sleep(randomInRange(50, 100));
179
+
180
+ // Dispatch input event to ensure framework state updates
181
+ await page.evaluate((sel) => {
182
+ const element = document.querySelector(sel);
183
+ if (element) {
184
+ element.dispatchEvent(new Event('input', { bubbles: true }));
185
+ element.dispatchEvent(new Event('change', { bubbles: true }));
186
+ }
187
+ }, selector);
188
+ await sleep(randomInRange(30, 80));
189
+ }
190
+
191
+ // Type each character with human-like timing
192
+ for (let i = 0; i < text.length; i++) {
193
+ const char = text[i];
194
+
195
+ // Occasional typo simulation
196
+ if (simulateTypos && Math.random() < typoProbability && char.match(/[a-z]/i)) {
197
+ // Type wrong key
198
+ const wrongChar = getAdjacentKey(char);
199
+ await page.keyboard.type(wrongChar);
200
+ await sleep(randomInRange(100, 200));
201
+
202
+ // Pause (realize mistake)
203
+ await sleep(randomInRange(200, 400));
204
+
205
+ // Delete wrong character
206
+ await page.keyboard.press('Backspace');
207
+ await sleep(TYPING_CONFIG.TYPO_CORRECTION_DELAY_MS);
208
+ }
209
+
210
+ // Type the correct character
211
+ await page.keyboard.type(char);
212
+
213
+ // Calculate delay for next character
214
+ let delay = baseDelay + randomInRange(0, randomDelay);
215
+
216
+ // Add occasional pauses (thinking)
217
+ if (Math.random() < pauseProbability) {
218
+ delay += randomInRange(
219
+ TYPING_CONFIG.PAUSE_DURATION.MIN_MS,
220
+ TYPING_CONFIG.PAUSE_DURATION.MAX_MS
221
+ );
222
+ }
223
+
224
+ // Slightly longer delay after punctuation or spaces
225
+ if (['.', ',', '!', '?', ' ', '@'].includes(char)) {
226
+ delay += randomInRange(30, 80);
227
+ }
228
+
229
+ await sleep(delay);
230
+ }
231
+
232
+ // Final event dispatch to ensure framework state is fully updated
233
+ // Some frameworks (especially React with controlled inputs) need explicit events
234
+ await page.evaluate((sel) => {
235
+ const element = document.querySelector(sel);
236
+ if (element) {
237
+ // Dispatch events that frameworks listen for
238
+ element.dispatchEvent(new Event('input', { bubbles: true }));
239
+ element.dispatchEvent(new Event('change', { bubbles: true }));
240
+ // Also dispatch blur and focus to trigger validation
241
+ element.dispatchEvent(new FocusEvent('blur', { bubbles: true }));
242
+ element.dispatchEvent(new FocusEvent('focus', { bubbles: true }));
243
+ }
244
+ }, selector);
245
+ }
246
+
247
+ /**
248
+ * Get an adjacent key on QWERTY keyboard for typo simulation
249
+ * @param {string} char - Original character
250
+ * @returns {string} Adjacent character
251
+ */
252
+ function getAdjacentKey(char) {
253
+ const keyboard = {
254
+ 'q': ['w', 'a'], 'w': ['q', 'e', 's'], 'e': ['w', 'r', 'd'], 'r': ['e', 't', 'f'],
255
+ 't': ['r', 'y', 'g'], 'y': ['t', 'u', 'h'], 'u': ['y', 'i', 'j'], 'i': ['u', 'o', 'k'],
256
+ 'o': ['i', 'p', 'l'], 'p': ['o', 'l'],
257
+ 'a': ['q', 's', 'z'], 's': ['a', 'w', 'd', 'x'], 'd': ['s', 'e', 'f', 'c'],
258
+ 'f': ['d', 'r', 'g', 'v'], 'g': ['f', 't', 'h', 'b'], 'h': ['g', 'y', 'j', 'n'],
259
+ 'j': ['h', 'u', 'k', 'm'], 'k': ['j', 'i', 'l'], 'l': ['k', 'o', 'p'],
260
+ 'z': ['a', 's', 'x'], 'x': ['z', 's', 'd', 'c'], 'c': ['x', 'd', 'f', 'v'],
261
+ 'v': ['c', 'f', 'g', 'b'], 'b': ['v', 'g', 'h', 'n'], 'n': ['b', 'h', 'j', 'm'],
262
+ 'm': ['n', 'j', 'k']
263
+ };
264
+
265
+ const lowerChar = char.toLowerCase();
266
+ const adjacent = keyboard[lowerChar];
267
+
268
+ if (!adjacent) return char;
269
+
270
+ const wrongChar = adjacent[Math.floor(Math.random() * adjacent.length)];
271
+ return char === char.toUpperCase() ? wrongChar.toUpperCase() : wrongChar;
272
+ }
273
+
274
+ /**
275
+ * Wait with human-like timing after an action
276
+ * @param {string} actionType - Type of action (navigation, action, submit)
277
+ * @returns {Promise<void>}
278
+ */
279
+ export async function humanWait(actionType = 'action') {
280
+ let delay;
281
+
282
+ switch (actionType) {
283
+ case 'navigation':
284
+ delay = randomInRange(
285
+ ACTION_DELAYS.AFTER_NAVIGATION_MS.MIN,
286
+ ACTION_DELAYS.AFTER_NAVIGATION_MS.MAX
287
+ );
288
+ break;
289
+ case 'submit':
290
+ case 'beforeSubmit':
291
+ delay = randomInRange(
292
+ ACTION_DELAYS.BEFORE_SUBMIT_MS.MIN,
293
+ ACTION_DELAYS.BEFORE_SUBMIT_MS.MAX
294
+ );
295
+ break;
296
+ case 'afterSubmit':
297
+ delay = randomInRange(
298
+ ACTION_DELAYS.AFTER_SUBMIT_MS.MIN,
299
+ ACTION_DELAYS.AFTER_SUBMIT_MS.MAX
300
+ );
301
+ break;
302
+ case 'scroll':
303
+ delay = randomInRange(
304
+ ACTION_DELAYS.SCROLL_PAUSE_MS.MIN,
305
+ ACTION_DELAYS.SCROLL_PAUSE_MS.MAX
306
+ );
307
+ break;
308
+ case 'action':
309
+ default:
310
+ delay = randomInRange(
311
+ ACTION_DELAYS.BETWEEN_ACTIONS_MS.MIN,
312
+ ACTION_DELAYS.BETWEEN_ACTIONS_MS.MAX
313
+ );
314
+ break;
315
+ }
316
+
317
+ await sleep(delay);
318
+ }
319
+
320
+ /**
321
+ * Scroll page with human-like behavior
322
+ * @param {Page} page - Puppeteer page instance
323
+ * @param {Object} options - Scroll options
324
+ */
325
+ export async function humanScroll(page, options = {}) {
326
+ const {
327
+ direction = 'down',
328
+ distance = 300,
329
+ steps = 5
330
+ } = options;
331
+
332
+ const stepDistance = Math.floor(distance / steps);
333
+ const scrollMultiplier = direction === 'up' ? -1 : 1;
334
+
335
+ for (let i = 0; i < steps; i++) {
336
+ // Add slight variation to each step
337
+ const actualStep = stepDistance + randomInRange(-20, 20);
338
+
339
+ await page.evaluate((y) => {
340
+ window.scrollBy({ top: y, behavior: 'smooth' });
341
+ }, actualStep * scrollMultiplier);
342
+
343
+ // Random pause between scroll steps
344
+ await sleep(randomInRange(50, 150));
345
+ }
346
+
347
+ // Pause after scrolling
348
+ await humanWait('scroll');
349
+ }
350
+
351
+ /**
352
+ * Scroll element into view with human-like behavior
353
+ * @param {Page} page - Puppeteer page instance
354
+ * @param {string} selector - CSS selector
355
+ */
356
+ export async function scrollToElement(page, selector) {
357
+ await page.evaluate((sel) => {
358
+ const element = document.querySelector(sel);
359
+ if (element) {
360
+ element.scrollIntoView({ behavior: 'smooth', block: 'center' });
361
+ }
362
+ }, selector);
363
+
364
+ await humanWait('scroll');
365
+ }
366
+
367
+ /**
368
+ * Fill a form with human-like behavior
369
+ * @param {Page} page - Puppeteer page instance
370
+ * @param {Object} fields - Form fields { selector: value }
371
+ * @param {Object} options - Fill options
372
+ */
373
+ export async function humanFillForm(page, fields, options = {}) {
374
+ const {
375
+ cursor = null,
376
+ tabBetweenFields = false
377
+ } = options;
378
+
379
+ const fieldEntries = Object.entries(fields);
380
+
381
+ for (let i = 0; i < fieldEntries.length; i++) {
382
+ const [selector, value] = fieldEntries[i];
383
+
384
+ // Move to field (if cursor provided)
385
+ if (cursor) {
386
+ await cursor.click(selector);
387
+ } else {
388
+ await page.click(selector);
389
+ }
390
+
391
+ await humanWait('action');
392
+
393
+ // Type the value
394
+ await humanType(page, selector, value, {
395
+ clearFirst: true,
396
+ clickFirst: false // Already clicked
397
+ });
398
+
399
+ // Wait between fields
400
+ if (i < fieldEntries.length - 1) {
401
+ await humanWait('action');
402
+
403
+ // Optionally use Tab to move to next field
404
+ if (tabBetweenFields) {
405
+ await page.keyboard.press('Tab');
406
+ await sleep(randomInRange(100, 200));
407
+ }
408
+ }
409
+ }
410
+ }
411
+
412
+ /**
413
+ * Submit a form with human-like behavior
414
+ * @param {Page} page - Puppeteer page instance
415
+ * @param {string} submitSelector - CSS selector for submit button
416
+ * @param {Object} options - Submit options
417
+ */
418
+ export async function humanSubmit(page, submitSelector, options = {}) {
419
+ const { cursor = null, waitForNavigation = true } = options;
420
+
421
+ // Pause before submit (human would review)
422
+ await humanWait('beforeSubmit');
423
+
424
+ // Click submit
425
+ if (cursor) {
426
+ await cursor.click(submitSelector);
427
+ } else {
428
+ await page.click(submitSelector);
429
+ }
430
+
431
+ // Wait for navigation if expected
432
+ if (waitForNavigation) {
433
+ try {
434
+ await page.waitForNavigation({
435
+ timeout: 10000,
436
+ waitUntil: 'networkidle2'
437
+ });
438
+ } catch {
439
+ // Navigation might not happen (AJAX form)
440
+ }
441
+ }
442
+
443
+ await humanWait('afterSubmit');
444
+ }
445
+
446
+ export default {
447
+ createHumanCursor,
448
+ humanType,
449
+ humanWait,
450
+ humanScroll,
451
+ scrollToElement,
452
+ humanFillForm,
453
+ humanSubmit
454
+ };