@browserbasehq/orca 3.1.0-patch.4 → 3.2.0-middleware.2

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 (495) hide show
  1. package/dist/cjs/lib/inference.d.ts +3 -1
  2. package/dist/cjs/lib/inference.js +4 -7
  3. package/dist/cjs/lib/inference.js.map +1 -1
  4. package/dist/cjs/lib/prompt.d.ts +1 -1
  5. package/dist/cjs/lib/prompt.js +24 -18
  6. package/dist/cjs/lib/prompt.js.map +1 -1
  7. package/dist/cjs/lib/utils.d.ts +1 -0
  8. package/dist/cjs/lib/utils.js +4 -0
  9. package/dist/cjs/lib/utils.js.map +1 -1
  10. package/dist/cjs/lib/v3/agent/AgentClient.d.ts +8 -0
  11. package/dist/cjs/lib/v3/agent/AgentClient.js +13 -0
  12. package/dist/cjs/lib/v3/agent/AgentClient.js.map +1 -1
  13. package/dist/cjs/lib/v3/agent/AgentProvider.js +0 -1
  14. package/dist/cjs/lib/v3/agent/AgentProvider.js.map +1 -1
  15. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js +6 -7
  16. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
  17. package/dist/cjs/lib/v3/agent/GoogleCUAClient.js +6 -7
  18. package/dist/cjs/lib/v3/agent/GoogleCUAClient.js.map +1 -1
  19. package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js +1 -0
  20. package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
  21. package/dist/cjs/lib/v3/agent/OpenAICUAClient.d.ts +10 -6
  22. package/dist/cjs/lib/v3/agent/OpenAICUAClient.js +107 -18
  23. package/dist/cjs/lib/v3/agent/OpenAICUAClient.js.map +1 -1
  24. package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.d.ts +4 -2
  25. package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.js +11 -12
  26. package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.js.map +1 -1
  27. package/dist/cjs/lib/v3/agent/tools/act.d.ts +1 -1
  28. package/dist/cjs/lib/v3/agent/tools/act.js +11 -4
  29. package/dist/cjs/lib/v3/agent/tools/act.js.map +1 -1
  30. package/dist/cjs/lib/v3/agent/tools/ariaTree.d.ts +8 -1
  31. package/dist/cjs/lib/v3/agent/tools/ariaTree.js +49 -22
  32. package/dist/cjs/lib/v3/agent/tools/ariaTree.js.map +1 -1
  33. package/dist/cjs/lib/v3/agent/tools/{search.js → braveSearch.js} +1 -1
  34. package/dist/cjs/lib/v3/agent/tools/braveSearch.js.map +1 -0
  35. package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.d.ts +13 -0
  36. package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.js +70 -0
  37. package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.js.map +1 -0
  38. package/dist/cjs/lib/v3/agent/tools/click.js +23 -31
  39. package/dist/cjs/lib/v3/agent/tools/click.js.map +1 -1
  40. package/dist/cjs/lib/v3/agent/tools/clickAndHold.js.map +1 -1
  41. package/dist/cjs/lib/v3/agent/tools/dragAndDrop.js +22 -30
  42. package/dist/cjs/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
  43. package/dist/cjs/lib/v3/agent/tools/extract.d.ts +2 -2
  44. package/dist/cjs/lib/v3/agent/tools/extract.js +7 -3
  45. package/dist/cjs/lib/v3/agent/tools/extract.js.map +1 -1
  46. package/dist/cjs/lib/v3/agent/tools/fillFormVision.js +30 -30
  47. package/dist/cjs/lib/v3/agent/tools/fillFormVision.js.map +1 -1
  48. package/dist/cjs/lib/v3/agent/tools/fillform.d.ts +7 -2
  49. package/dist/cjs/lib/v3/agent/tools/fillform.js +56 -45
  50. package/dist/cjs/lib/v3/agent/tools/fillform.js.map +1 -1
  51. package/dist/cjs/lib/v3/agent/tools/index.d.ts +19 -3
  52. package/dist/cjs/lib/v3/agent/tools/index.js +63 -11
  53. package/dist/cjs/lib/v3/agent/tools/index.js.map +1 -1
  54. package/dist/cjs/lib/v3/agent/tools/keys.d.ts +1 -1
  55. package/dist/cjs/lib/v3/agent/tools/keys.js.map +1 -1
  56. package/dist/cjs/lib/v3/agent/tools/screenshot.d.ts +8 -0
  57. package/dist/cjs/lib/v3/agent/tools/screenshot.js +32 -15
  58. package/dist/cjs/lib/v3/agent/tools/screenshot.js.map +1 -1
  59. package/dist/cjs/lib/v3/agent/tools/scroll.js +12 -0
  60. package/dist/cjs/lib/v3/agent/tools/scroll.js.map +1 -1
  61. package/dist/cjs/lib/v3/agent/tools/type.js +23 -31
  62. package/dist/cjs/lib/v3/agent/tools/type.js.map +1 -1
  63. package/dist/cjs/lib/v3/agent/tools/wait.js +6 -0
  64. package/dist/cjs/lib/v3/agent/tools/wait.js.map +1 -1
  65. package/dist/cjs/lib/v3/agent/utils/captchaSolver.d.ts +76 -0
  66. package/dist/cjs/lib/v3/agent/utils/captchaSolver.js +175 -0
  67. package/dist/cjs/lib/v3/agent/utils/captchaSolver.js.map +1 -0
  68. package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js +4 -0
  69. package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
  70. package/dist/cjs/lib/v3/agent/utils/variables.d.ts +5 -0
  71. package/dist/cjs/lib/v3/agent/utils/variables.js +9 -0
  72. package/dist/cjs/lib/v3/agent/utils/variables.js.map +1 -1
  73. package/dist/cjs/lib/v3/api.d.ts +2 -2
  74. package/dist/cjs/lib/v3/api.js +1 -1
  75. package/dist/cjs/lib/v3/api.js.map +1 -1
  76. package/dist/cjs/lib/v3/cache/ActCache.d.ts +0 -1
  77. package/dist/cjs/lib/v3/cache/ActCache.js +2 -18
  78. package/dist/cjs/lib/v3/cache/ActCache.js.map +1 -1
  79. package/dist/cjs/lib/v3/flowlogger/EventEmitter.d.ts +7 -0
  80. package/dist/cjs/lib/v3/flowlogger/EventEmitter.js +30 -0
  81. package/dist/cjs/lib/v3/flowlogger/EventEmitter.js.map +1 -0
  82. package/dist/cjs/lib/v3/flowlogger/EventSink.d.ts +44 -0
  83. package/dist/cjs/lib/v3/flowlogger/EventSink.js +217 -0
  84. package/dist/cjs/lib/v3/flowlogger/EventSink.js.map +1 -0
  85. package/dist/cjs/lib/v3/flowlogger/EventStore.d.ts +26 -0
  86. package/dist/cjs/lib/v3/flowlogger/EventStore.js +135 -0
  87. package/dist/cjs/lib/v3/flowlogger/EventStore.js.map +1 -0
  88. package/dist/cjs/lib/v3/flowlogger/FlowLogger.d.ts +99 -0
  89. package/dist/cjs/lib/v3/flowlogger/FlowLogger.js +591 -0
  90. package/dist/cjs/lib/v3/flowlogger/FlowLogger.js.map +1 -0
  91. package/dist/cjs/lib/v3/flowlogger/prettify.d.ts +6 -0
  92. package/dist/cjs/lib/v3/flowlogger/prettify.js +395 -0
  93. package/dist/cjs/lib/v3/flowlogger/prettify.js.map +1 -0
  94. package/dist/cjs/lib/v3/handlers/actHandler.js +1 -2
  95. package/dist/cjs/lib/v3/handlers/actHandler.js.map +1 -1
  96. package/dist/cjs/lib/v3/handlers/extractHandler.js +2 -2
  97. package/dist/cjs/lib/v3/handlers/extractHandler.js.map +1 -1
  98. package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js +43 -57
  99. package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
  100. package/dist/cjs/lib/v3/handlers/observeHandler.js +3 -3
  101. package/dist/cjs/lib/v3/handlers/observeHandler.js.map +1 -1
  102. package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +2 -5
  103. package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +130 -91
  104. package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
  105. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.d.ts +5 -0
  106. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +134 -14
  107. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  108. package/dist/cjs/lib/v3/index.d.ts +2 -1
  109. package/dist/cjs/lib/v3/launch/browserbase.d.ts +1 -1
  110. package/dist/cjs/lib/v3/launch/browserbase.js +4 -9
  111. package/dist/cjs/lib/v3/launch/browserbase.js.map +1 -1
  112. package/dist/cjs/lib/v3/llm/LLMProvider.d.ts +5 -2
  113. package/dist/cjs/lib/v3/llm/LLMProvider.js +14 -11
  114. package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
  115. package/dist/cjs/lib/v3/llm/aisdk.d.ts +3 -1
  116. package/dist/cjs/lib/v3/llm/aisdk.js +24 -28
  117. package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
  118. package/dist/cjs/lib/v3/runtimePaths.js +2 -1
  119. package/dist/cjs/lib/v3/runtimePaths.js.map +1 -1
  120. package/dist/cjs/lib/v3/shutdown/supervisor.js +2 -2
  121. package/dist/cjs/lib/v3/shutdown/supervisor.js.map +1 -1
  122. package/dist/cjs/lib/v3/timeoutConfig.d.ts +1 -1
  123. package/dist/cjs/lib/v3/timeoutConfig.js +5 -0
  124. package/dist/cjs/lib/v3/timeoutConfig.js.map +1 -1
  125. package/dist/cjs/lib/v3/types/private/cache.d.ts +0 -1
  126. package/dist/cjs/lib/v3/types/private/cache.js.map +1 -1
  127. package/dist/cjs/lib/v3/types/private/handlers.d.ts +1 -0
  128. package/dist/cjs/lib/v3/types/private/handlers.js.map +1 -1
  129. package/dist/cjs/lib/v3/types/private/shutdown.d.ts +1 -1
  130. package/dist/cjs/lib/v3/types/private/shutdown.js.map +1 -1
  131. package/dist/cjs/lib/v3/types/public/agent.d.ts +28 -3
  132. package/dist/cjs/lib/v3/types/public/agent.js +0 -1
  133. package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
  134. package/dist/cjs/lib/v3/types/public/api.d.ts +27 -7
  135. package/dist/cjs/lib/v3/types/public/api.js +42 -14
  136. package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
  137. package/dist/cjs/lib/v3/types/public/methods.d.ts +1 -0
  138. package/dist/cjs/lib/v3/types/public/methods.js.map +1 -1
  139. package/dist/cjs/lib/v3/types/public/model.d.ts +14 -3
  140. package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
  141. package/dist/cjs/lib/v3/types/public/options.d.ts +8 -0
  142. package/dist/cjs/lib/v3/types/public/options.js.map +1 -1
  143. package/dist/cjs/lib/v3/types/public/variables.d.ts +7 -0
  144. package/dist/cjs/lib/v3/types/public/variables.js +22 -0
  145. package/dist/cjs/lib/v3/types/public/variables.js.map +1 -0
  146. package/dist/cjs/lib/v3/understudy/cdp.d.ts +8 -13
  147. package/dist/cjs/lib/v3/understudy/cdp.js +180 -20
  148. package/dist/cjs/lib/v3/understudy/cdp.js.map +1 -1
  149. package/dist/cjs/lib/v3/understudy/context.d.ts +1 -0
  150. package/dist/cjs/lib/v3/understudy/context.js +148 -62
  151. package/dist/cjs/lib/v3/understudy/context.js.map +1 -1
  152. package/dist/cjs/lib/v3/understudy/frame.js +23 -6
  153. package/dist/cjs/lib/v3/understudy/frame.js.map +1 -1
  154. package/dist/cjs/lib/v3/understudy/page.d.ts +13 -0
  155. package/dist/cjs/lib/v3/understudy/page.js +85 -22
  156. package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
  157. package/dist/cjs/lib/v3/understudy/screenshotUtils.d.ts +0 -1
  158. package/dist/cjs/lib/v3/understudy/screenshotUtils.js +0 -18
  159. package/dist/cjs/lib/v3/understudy/screenshotUtils.js.map +1 -1
  160. package/dist/cjs/lib/v3/v3.d.ts +26 -3
  161. package/dist/cjs/lib/v3/v3.js +250 -180
  162. package/dist/cjs/lib/v3/v3.js.map +1 -1
  163. package/dist/cjs/tests/integration/agent-captcha-autosolve.spec.js +56 -0
  164. package/dist/cjs/tests/integration/agent-captcha-autosolve.spec.js.map +1 -0
  165. package/dist/cjs/tests/integration/agent-hybrid-mode.spec.js +6 -6
  166. package/dist/cjs/tests/integration/agent-hybrid-mode.spec.js.map +1 -1
  167. package/dist/cjs/tests/integration/cdp-session-detached.spec.js +1 -1
  168. package/dist/cjs/tests/integration/cdp-session-detached.spec.js.map +1 -1
  169. package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js +56 -0
  170. package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
  171. package/dist/cjs/tests/integration/context-addInitScript.spec.js +104 -11
  172. package/dist/cjs/tests/integration/context-addInitScript.spec.js.map +1 -1
  173. package/dist/cjs/tests/integration/flowLogger.spec.d.ts +1 -0
  174. package/dist/cjs/tests/integration/flowLogger.spec.js +714 -0
  175. package/dist/cjs/tests/integration/flowLogger.spec.js.map +1 -0
  176. package/dist/cjs/tests/integration/iframe-ctx-addInitScript-race.spec.d.ts +1 -0
  177. package/dist/cjs/tests/integration/iframe-ctx-addInitScript-race.spec.js +219 -0
  178. package/dist/cjs/tests/integration/iframe-ctx-addInitScript-race.spec.js.map +1 -0
  179. package/dist/cjs/tests/integration/page-extra-http-headers.spec.d.ts +1 -0
  180. package/dist/cjs/tests/integration/page-extra-http-headers.spec.js +85 -0
  181. package/dist/cjs/tests/integration/page-extra-http-headers.spec.js.map +1 -0
  182. package/dist/cjs/tests/integration/page-screenshot.spec.js +1 -1
  183. package/dist/cjs/tests/integration/page-screenshot.spec.js.map +1 -1
  184. package/dist/cjs/tests/integration/testUtils.d.ts +33 -0
  185. package/dist/cjs/tests/integration/testUtils.js +144 -0
  186. package/dist/cjs/tests/integration/testUtils.js.map +1 -1
  187. package/dist/cjs/tests/integration/timeouts.spec.js +278 -0
  188. package/dist/cjs/tests/integration/timeouts.spec.js.map +1 -1
  189. package/dist/cjs/tests/unit/agent-captcha-hooks.test.d.ts +1 -0
  190. package/dist/cjs/tests/unit/agent-captcha-hooks.test.js +285 -0
  191. package/dist/cjs/tests/unit/agent-captcha-hooks.test.js.map +1 -0
  192. package/dist/cjs/tests/unit/agent-execution-model.test.js +25 -3
  193. package/dist/cjs/tests/unit/agent-execution-model.test.js.map +1 -1
  194. package/dist/cjs/tests/unit/agent-system-prompt-variables.test.d.ts +1 -0
  195. package/dist/cjs/tests/unit/agent-system-prompt-variables.test.js +23 -0
  196. package/dist/cjs/tests/unit/agent-system-prompt-variables.test.js.map +1 -0
  197. package/dist/cjs/tests/unit/aisdk-reasoning-effort.test.d.ts +1 -0
  198. package/dist/cjs/tests/unit/aisdk-reasoning-effort.test.js +153 -0
  199. package/dist/cjs/tests/unit/aisdk-reasoning-effort.test.js.map +1 -0
  200. package/dist/cjs/tests/unit/api-client-observe-variables.test.d.ts +1 -0
  201. package/dist/cjs/tests/unit/api-client-observe-variables.test.js +86 -0
  202. package/dist/cjs/tests/unit/api-client-observe-variables.test.js.map +1 -0
  203. package/dist/cjs/tests/unit/api-variables-schema.test.d.ts +1 -0
  204. package/dist/cjs/tests/unit/api-variables-schema.test.js +37 -0
  205. package/dist/cjs/tests/unit/api-variables-schema.test.js.map +1 -0
  206. package/dist/cjs/tests/unit/browserbase-session-accessors.test.js +20 -0
  207. package/dist/cjs/tests/unit/browserbase-session-accessors.test.js.map +1 -1
  208. package/dist/cjs/tests/unit/captcha-solver.test.d.ts +1 -0
  209. package/dist/cjs/tests/unit/captcha-solver.test.js +154 -0
  210. package/dist/cjs/tests/unit/captcha-solver.test.js.map +1 -0
  211. package/dist/cjs/tests/unit/flowlogger-capturing-cdp.test.d.ts +1 -0
  212. package/dist/cjs/tests/unit/flowlogger-capturing-cdp.test.js +95 -0
  213. package/dist/cjs/tests/unit/flowlogger-capturing-cdp.test.js.map +1 -0
  214. package/dist/cjs/tests/unit/flowlogger-capturing-llm.test.d.ts +1 -0
  215. package/dist/cjs/tests/unit/flowlogger-capturing-llm.test.js +43 -0
  216. package/dist/cjs/tests/unit/flowlogger-capturing-llm.test.js.map +1 -0
  217. package/dist/cjs/tests/unit/flowlogger-eventstore.test.d.ts +1 -0
  218. package/dist/cjs/tests/unit/flowlogger-eventstore.test.js +250 -0
  219. package/dist/cjs/tests/unit/flowlogger-eventstore.test.js.map +1 -0
  220. package/dist/cjs/tests/unit/llm-middleware.test.d.ts +1 -0
  221. package/dist/cjs/tests/unit/llm-middleware.test.js +495 -0
  222. package/dist/cjs/tests/unit/llm-middleware.test.js.map +1 -0
  223. package/dist/cjs/tests/unit/model-deprecation.test.js +5 -8
  224. package/dist/cjs/tests/unit/model-deprecation.test.js.map +1 -1
  225. package/dist/cjs/tests/unit/openai-cua-client.test.d.ts +1 -0
  226. package/dist/cjs/tests/unit/openai-cua-client.test.js +71 -0
  227. package/dist/cjs/tests/unit/openai-cua-client.test.js.map +1 -0
  228. package/dist/cjs/tests/unit/page-extra-http-headers.test.d.ts +1 -0
  229. package/dist/cjs/tests/unit/page-extra-http-headers.test.js +92 -0
  230. package/dist/cjs/tests/unit/page-extra-http-headers.test.js.map +1 -0
  231. package/dist/cjs/tests/unit/prompt-observe-variables.test.d.ts +1 -0
  232. package/dist/cjs/tests/unit/prompt-observe-variables.test.js +19 -0
  233. package/dist/cjs/tests/unit/prompt-observe-variables.test.js.map +1 -0
  234. package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js +13 -1
  235. package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
  236. package/dist/cjs/tests/unit/public-api/public-types.test.js.map +1 -1
  237. package/dist/cjs/tests/unit/timeout-handlers.test.js +50 -0
  238. package/dist/cjs/tests/unit/timeout-handlers.test.js.map +1 -1
  239. package/dist/esm/lib/inference.d.ts +3 -1
  240. package/dist/esm/lib/inference.js +4 -7
  241. package/dist/esm/lib/inference.js.map +1 -1
  242. package/dist/esm/lib/prompt.d.ts +1 -1
  243. package/dist/esm/lib/prompt.js +24 -18
  244. package/dist/esm/lib/prompt.js.map +1 -1
  245. package/dist/esm/lib/utils.d.ts +1 -0
  246. package/dist/esm/lib/utils.js +3 -0
  247. package/dist/esm/lib/utils.js.map +1 -1
  248. package/dist/esm/lib/v3/agent/AgentClient.d.ts +8 -0
  249. package/dist/esm/lib/v3/agent/AgentClient.js +13 -0
  250. package/dist/esm/lib/v3/agent/AgentClient.js.map +1 -1
  251. package/dist/esm/lib/v3/agent/AgentProvider.js +0 -1
  252. package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -1
  253. package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +6 -7
  254. package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
  255. package/dist/esm/lib/v3/agent/GoogleCUAClient.js +6 -7
  256. package/dist/esm/lib/v3/agent/GoogleCUAClient.js.map +1 -1
  257. package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js +1 -0
  258. package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
  259. package/dist/esm/lib/v3/agent/OpenAICUAClient.d.ts +10 -6
  260. package/dist/esm/lib/v3/agent/OpenAICUAClient.js +107 -18
  261. package/dist/esm/lib/v3/agent/OpenAICUAClient.js.map +1 -1
  262. package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.d.ts +4 -2
  263. package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js +11 -12
  264. package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js.map +1 -1
  265. package/dist/esm/lib/v3/agent/tools/act.d.ts +1 -1
  266. package/dist/esm/lib/v3/agent/tools/act.js +11 -4
  267. package/dist/esm/lib/v3/agent/tools/act.js.map +1 -1
  268. package/dist/esm/lib/v3/agent/tools/ariaTree.d.ts +8 -1
  269. package/dist/esm/lib/v3/agent/tools/ariaTree.js +49 -22
  270. package/dist/esm/lib/v3/agent/tools/ariaTree.js.map +1 -1
  271. package/dist/esm/lib/v3/agent/tools/{search.js → braveSearch.js} +1 -1
  272. package/dist/esm/lib/v3/agent/tools/braveSearch.js.map +1 -0
  273. package/dist/esm/lib/v3/agent/tools/browserbaseSearch.d.ts +13 -0
  274. package/dist/esm/lib/v3/agent/tools/browserbaseSearch.js +66 -0
  275. package/dist/esm/lib/v3/agent/tools/browserbaseSearch.js.map +1 -0
  276. package/dist/esm/lib/v3/agent/tools/click.js +23 -31
  277. package/dist/esm/lib/v3/agent/tools/click.js.map +1 -1
  278. package/dist/esm/lib/v3/agent/tools/clickAndHold.js.map +1 -1
  279. package/dist/esm/lib/v3/agent/tools/dragAndDrop.js +22 -30
  280. package/dist/esm/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
  281. package/dist/esm/lib/v3/agent/tools/extract.d.ts +2 -2
  282. package/dist/esm/lib/v3/agent/tools/extract.js +7 -3
  283. package/dist/esm/lib/v3/agent/tools/extract.js.map +1 -1
  284. package/dist/esm/lib/v3/agent/tools/fillFormVision.js +30 -30
  285. package/dist/esm/lib/v3/agent/tools/fillFormVision.js.map +1 -1
  286. package/dist/esm/lib/v3/agent/tools/fillform.d.ts +7 -2
  287. package/dist/esm/lib/v3/agent/tools/fillform.js +56 -45
  288. package/dist/esm/lib/v3/agent/tools/fillform.js.map +1 -1
  289. package/dist/esm/lib/v3/agent/tools/index.d.ts +19 -3
  290. package/dist/esm/lib/v3/agent/tools/index.js +63 -11
  291. package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
  292. package/dist/esm/lib/v3/agent/tools/keys.d.ts +1 -1
  293. package/dist/esm/lib/v3/agent/tools/keys.js.map +1 -1
  294. package/dist/esm/lib/v3/agent/tools/screenshot.d.ts +8 -0
  295. package/dist/esm/lib/v3/agent/tools/screenshot.js +32 -15
  296. package/dist/esm/lib/v3/agent/tools/screenshot.js.map +1 -1
  297. package/dist/esm/lib/v3/agent/tools/scroll.js +12 -0
  298. package/dist/esm/lib/v3/agent/tools/scroll.js.map +1 -1
  299. package/dist/esm/lib/v3/agent/tools/type.js +23 -31
  300. package/dist/esm/lib/v3/agent/tools/type.js.map +1 -1
  301. package/dist/esm/lib/v3/agent/tools/wait.js +6 -0
  302. package/dist/esm/lib/v3/agent/tools/wait.js.map +1 -1
  303. package/dist/esm/lib/v3/agent/utils/captchaSolver.d.ts +76 -0
  304. package/dist/esm/lib/v3/agent/utils/captchaSolver.js +171 -0
  305. package/dist/esm/lib/v3/agent/utils/captchaSolver.js.map +1 -0
  306. package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js +4 -0
  307. package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
  308. package/dist/esm/lib/v3/agent/utils/variables.d.ts +5 -0
  309. package/dist/esm/lib/v3/agent/utils/variables.js +8 -0
  310. package/dist/esm/lib/v3/agent/utils/variables.js.map +1 -1
  311. package/dist/esm/lib/v3/api.d.ts +2 -2
  312. package/dist/esm/lib/v3/api.js +1 -1
  313. package/dist/esm/lib/v3/api.js.map +1 -1
  314. package/dist/esm/lib/v3/cache/ActCache.d.ts +0 -1
  315. package/dist/esm/lib/v3/cache/ActCache.js +2 -18
  316. package/dist/esm/lib/v3/cache/ActCache.js.map +1 -1
  317. package/dist/esm/lib/v3/flowlogger/EventEmitter.d.ts +7 -0
  318. package/dist/esm/lib/v3/flowlogger/EventEmitter.js +26 -0
  319. package/dist/esm/lib/v3/flowlogger/EventEmitter.js.map +1 -0
  320. package/dist/esm/lib/v3/flowlogger/EventSink.d.ts +44 -0
  321. package/dist/esm/lib/v3/flowlogger/EventSink.js +206 -0
  322. package/dist/esm/lib/v3/flowlogger/EventSink.js.map +1 -0
  323. package/dist/esm/lib/v3/flowlogger/EventStore.d.ts +26 -0
  324. package/dist/esm/lib/v3/flowlogger/EventStore.js +127 -0
  325. package/dist/esm/lib/v3/flowlogger/EventStore.js.map +1 -0
  326. package/dist/esm/lib/v3/flowlogger/FlowLogger.d.ts +99 -0
  327. package/dist/esm/lib/v3/flowlogger/FlowLogger.js +583 -0
  328. package/dist/esm/lib/v3/flowlogger/FlowLogger.js.map +1 -0
  329. package/dist/esm/lib/v3/flowlogger/prettify.d.ts +6 -0
  330. package/dist/esm/lib/v3/flowlogger/prettify.js +389 -0
  331. package/dist/esm/lib/v3/flowlogger/prettify.js.map +1 -0
  332. package/dist/esm/lib/v3/handlers/actHandler.js +1 -2
  333. package/dist/esm/lib/v3/handlers/actHandler.js.map +1 -1
  334. package/dist/esm/lib/v3/handlers/extractHandler.js +2 -2
  335. package/dist/esm/lib/v3/handlers/extractHandler.js.map +1 -1
  336. package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js +43 -57
  337. package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
  338. package/dist/esm/lib/v3/handlers/observeHandler.js +3 -3
  339. package/dist/esm/lib/v3/handlers/observeHandler.js.map +1 -1
  340. package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +2 -5
  341. package/dist/esm/lib/v3/handlers/v3AgentHandler.js +131 -92
  342. package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
  343. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.d.ts +5 -0
  344. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +134 -14
  345. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  346. package/dist/esm/lib/v3/index.d.ts +2 -1
  347. package/dist/esm/lib/v3/launch/browserbase.d.ts +1 -1
  348. package/dist/esm/lib/v3/launch/browserbase.js +4 -9
  349. package/dist/esm/lib/v3/launch/browserbase.js.map +1 -1
  350. package/dist/esm/lib/v3/llm/LLMProvider.d.ts +5 -2
  351. package/dist/esm/lib/v3/llm/LLMProvider.js +15 -12
  352. package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
  353. package/dist/esm/lib/v3/llm/aisdk.d.ts +3 -1
  354. package/dist/esm/lib/v3/llm/aisdk.js +24 -28
  355. package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
  356. package/dist/esm/lib/v3/runtimePaths.js +2 -1
  357. package/dist/esm/lib/v3/runtimePaths.js.map +1 -1
  358. package/dist/esm/lib/v3/shutdown/supervisor.js +2 -2
  359. package/dist/esm/lib/v3/shutdown/supervisor.js.map +1 -1
  360. package/dist/esm/lib/v3/timeoutConfig.d.ts +1 -1
  361. package/dist/esm/lib/v3/timeoutConfig.js +5 -0
  362. package/dist/esm/lib/v3/timeoutConfig.js.map +1 -1
  363. package/dist/esm/lib/v3/types/private/cache.d.ts +0 -1
  364. package/dist/esm/lib/v3/types/private/cache.js.map +1 -1
  365. package/dist/esm/lib/v3/types/private/handlers.d.ts +1 -0
  366. package/dist/esm/lib/v3/types/private/handlers.js.map +1 -1
  367. package/dist/esm/lib/v3/types/private/shutdown.d.ts +1 -1
  368. package/dist/esm/lib/v3/types/private/shutdown.js.map +1 -1
  369. package/dist/esm/lib/v3/types/public/agent.d.ts +28 -3
  370. package/dist/esm/lib/v3/types/public/agent.js +0 -1
  371. package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
  372. package/dist/esm/lib/v3/types/public/api.d.ts +27 -7
  373. package/dist/esm/lib/v3/types/public/api.js +37 -12
  374. package/dist/esm/lib/v3/types/public/api.js.map +1 -1
  375. package/dist/esm/lib/v3/types/public/methods.d.ts +1 -0
  376. package/dist/esm/lib/v3/types/public/methods.js.map +1 -1
  377. package/dist/esm/lib/v3/types/public/model.d.ts +14 -3
  378. package/dist/esm/lib/v3/types/public/model.js.map +1 -1
  379. package/dist/esm/lib/v3/types/public/options.d.ts +8 -0
  380. package/dist/esm/lib/v3/types/public/options.js.map +1 -1
  381. package/dist/esm/lib/v3/types/public/variables.d.ts +7 -0
  382. package/dist/esm/lib/v3/types/public/variables.js +19 -0
  383. package/dist/esm/lib/v3/types/public/variables.js.map +1 -0
  384. package/dist/esm/lib/v3/understudy/cdp.d.ts +8 -13
  385. package/dist/esm/lib/v3/understudy/cdp.js +181 -21
  386. package/dist/esm/lib/v3/understudy/cdp.js.map +1 -1
  387. package/dist/esm/lib/v3/understudy/context.d.ts +1 -0
  388. package/dist/esm/lib/v3/understudy/context.js +148 -62
  389. package/dist/esm/lib/v3/understudy/context.js.map +1 -1
  390. package/dist/esm/lib/v3/understudy/frame.js +23 -6
  391. package/dist/esm/lib/v3/understudy/frame.js.map +1 -1
  392. package/dist/esm/lib/v3/understudy/page.d.ts +13 -0
  393. package/dist/esm/lib/v3/understudy/page.js +87 -24
  394. package/dist/esm/lib/v3/understudy/page.js.map +1 -1
  395. package/dist/esm/lib/v3/understudy/screenshotUtils.d.ts +0 -1
  396. package/dist/esm/lib/v3/understudy/screenshotUtils.js +0 -17
  397. package/dist/esm/lib/v3/understudy/screenshotUtils.js.map +1 -1
  398. package/dist/esm/lib/v3/v3.d.ts +26 -3
  399. package/dist/esm/lib/v3/v3.js +250 -181
  400. package/dist/esm/lib/v3/v3.js.map +1 -1
  401. package/dist/esm/tests/integration/agent-captcha-autosolve.spec.d.ts +1 -0
  402. package/dist/esm/tests/integration/agent-captcha-autosolve.spec.js +54 -0
  403. package/dist/esm/tests/integration/agent-captcha-autosolve.spec.js.map +1 -0
  404. package/dist/esm/tests/integration/agent-hybrid-mode.spec.js +6 -6
  405. package/dist/esm/tests/integration/agent-hybrid-mode.spec.js.map +1 -1
  406. package/dist/esm/tests/integration/cdp-session-detached.spec.js +1 -1
  407. package/dist/esm/tests/integration/cdp-session-detached.spec.js.map +1 -1
  408. package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.d.ts +1 -0
  409. package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js +54 -0
  410. package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
  411. package/dist/esm/tests/integration/context-addInitScript.spec.js +104 -11
  412. package/dist/esm/tests/integration/context-addInitScript.spec.js.map +1 -1
  413. package/dist/esm/tests/integration/flowLogger.spec.d.ts +1 -0
  414. package/dist/esm/tests/integration/flowLogger.spec.js +712 -0
  415. package/dist/esm/tests/integration/flowLogger.spec.js.map +1 -0
  416. package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.d.ts +1 -0
  417. package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.js +217 -0
  418. package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.js.map +1 -0
  419. package/dist/esm/tests/integration/page-extra-http-headers.spec.d.ts +1 -0
  420. package/dist/esm/tests/integration/page-extra-http-headers.spec.js +83 -0
  421. package/dist/esm/tests/integration/page-extra-http-headers.spec.js.map +1 -0
  422. package/dist/esm/tests/integration/page-screenshot.spec.js +1 -1
  423. package/dist/esm/tests/integration/page-screenshot.spec.js.map +1 -1
  424. package/dist/esm/tests/integration/testUtils.d.ts +33 -0
  425. package/dist/esm/tests/integration/testUtils.js +138 -0
  426. package/dist/esm/tests/integration/testUtils.js.map +1 -1
  427. package/dist/esm/tests/integration/timeouts.spec.js +278 -0
  428. package/dist/esm/tests/integration/timeouts.spec.js.map +1 -1
  429. package/dist/esm/tests/unit/agent-captcha-hooks.test.d.ts +1 -0
  430. package/dist/esm/tests/unit/agent-captcha-hooks.test.js +283 -0
  431. package/dist/esm/tests/unit/agent-captcha-hooks.test.js.map +1 -0
  432. package/dist/esm/tests/unit/agent-execution-model.test.js +25 -3
  433. package/dist/esm/tests/unit/agent-execution-model.test.js.map +1 -1
  434. package/dist/esm/tests/unit/agent-system-prompt-variables.test.d.ts +1 -0
  435. package/dist/esm/tests/unit/agent-system-prompt-variables.test.js +21 -0
  436. package/dist/esm/tests/unit/agent-system-prompt-variables.test.js.map +1 -0
  437. package/dist/esm/tests/unit/aisdk-reasoning-effort.test.d.ts +1 -0
  438. package/dist/esm/tests/unit/aisdk-reasoning-effort.test.js +118 -0
  439. package/dist/esm/tests/unit/aisdk-reasoning-effort.test.js.map +1 -0
  440. package/dist/esm/tests/unit/api-client-observe-variables.test.d.ts +1 -0
  441. package/dist/esm/tests/unit/api-client-observe-variables.test.js +84 -0
  442. package/dist/esm/tests/unit/api-client-observe-variables.test.js.map +1 -0
  443. package/dist/esm/tests/unit/api-variables-schema.test.d.ts +1 -0
  444. package/dist/esm/tests/unit/api-variables-schema.test.js +35 -0
  445. package/dist/esm/tests/unit/api-variables-schema.test.js.map +1 -0
  446. package/dist/esm/tests/unit/browserbase-session-accessors.test.js +20 -0
  447. package/dist/esm/tests/unit/browserbase-session-accessors.test.js.map +1 -1
  448. package/dist/esm/tests/unit/captcha-solver.test.d.ts +1 -0
  449. package/dist/esm/tests/unit/captcha-solver.test.js +152 -0
  450. package/dist/esm/tests/unit/captcha-solver.test.js.map +1 -0
  451. package/dist/esm/tests/unit/flowlogger-capturing-cdp.test.d.ts +1 -0
  452. package/dist/esm/tests/unit/flowlogger-capturing-cdp.test.js +93 -0
  453. package/dist/esm/tests/unit/flowlogger-capturing-cdp.test.js.map +1 -0
  454. package/dist/esm/tests/unit/flowlogger-capturing-llm.test.d.ts +1 -0
  455. package/dist/esm/tests/unit/flowlogger-capturing-llm.test.js +41 -0
  456. package/dist/esm/tests/unit/flowlogger-capturing-llm.test.js.map +1 -0
  457. package/dist/esm/tests/unit/flowlogger-eventstore.test.d.ts +1 -0
  458. package/dist/esm/tests/unit/flowlogger-eventstore.test.js +248 -0
  459. package/dist/esm/tests/unit/flowlogger-eventstore.test.js.map +1 -0
  460. package/dist/esm/tests/unit/llm-middleware.test.d.ts +1 -0
  461. package/dist/esm/tests/unit/llm-middleware.test.js +460 -0
  462. package/dist/esm/tests/unit/llm-middleware.test.js.map +1 -0
  463. package/dist/esm/tests/unit/model-deprecation.test.js +5 -8
  464. package/dist/esm/tests/unit/model-deprecation.test.js.map +1 -1
  465. package/dist/esm/tests/unit/openai-cua-client.test.d.ts +1 -0
  466. package/dist/esm/tests/unit/openai-cua-client.test.js +69 -0
  467. package/dist/esm/tests/unit/openai-cua-client.test.js.map +1 -0
  468. package/dist/esm/tests/unit/page-extra-http-headers.test.d.ts +1 -0
  469. package/dist/esm/tests/unit/page-extra-http-headers.test.js +90 -0
  470. package/dist/esm/tests/unit/page-extra-http-headers.test.js.map +1 -0
  471. package/dist/esm/tests/unit/prompt-observe-variables.test.d.ts +1 -0
  472. package/dist/esm/tests/unit/prompt-observe-variables.test.js +17 -0
  473. package/dist/esm/tests/unit/prompt-observe-variables.test.js.map +1 -0
  474. package/dist/esm/tests/unit/public-api/llm-and-agents.test.js +13 -1
  475. package/dist/esm/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
  476. package/dist/esm/tests/unit/public-api/public-types.test.js.map +1 -1
  477. package/dist/esm/tests/unit/timeout-handlers.test.js +50 -0
  478. package/dist/esm/tests/unit/timeout-handlers.test.js.map +1 -1
  479. package/package.json +6 -4
  480. package/dist/cjs/lib/v3/agent/tools/search.js.map +0 -1
  481. package/dist/cjs/lib/v3/flowLogger.d.ts +0 -139
  482. package/dist/cjs/lib/v3/flowLogger.js +0 -881
  483. package/dist/cjs/lib/v3/flowLogger.js.map +0 -1
  484. package/dist/cjs/tests/unit/rerender-missing-shadows.test.js +0 -209
  485. package/dist/cjs/tests/unit/rerender-missing-shadows.test.js.map +0 -1
  486. package/dist/esm/lib/v3/agent/tools/search.js.map +0 -1
  487. package/dist/esm/lib/v3/flowLogger.d.ts +0 -139
  488. package/dist/esm/lib/v3/flowLogger.js +0 -868
  489. package/dist/esm/lib/v3/flowLogger.js.map +0 -1
  490. package/dist/esm/tests/unit/rerender-missing-shadows.test.js +0 -207
  491. package/dist/esm/tests/unit/rerender-missing-shadows.test.js.map +0 -1
  492. /package/dist/cjs/lib/v3/agent/tools/{search.d.ts → braveSearch.d.ts} +0 -0
  493. /package/dist/cjs/tests/{unit/rerender-missing-shadows.test.d.ts → integration/agent-captcha-autosolve.spec.d.ts} +0 -0
  494. /package/dist/{esm/tests/unit/rerender-missing-shadows.test.d.ts → cjs/tests/integration/chrome-newtab-page-tracking.spec.d.ts} +0 -0
  495. /package/dist/esm/lib/v3/agent/tools/{search.d.ts → braveSearch.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"timeouts.spec.js","sourceRoot":"","sources":["../../../../tests/integration/timeouts.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IACrC,IAAI,EAAM,CAAC;IAEX,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;QACzB,EAAE,GAAG,IAAI,EAAE,CAAC,mBAAmB,CAAC,CAAC;QACjC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;QACxB,MAAM,OAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC9C,2DAA2D;QAC3D,MAAM,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACxE,YAAY,CACb,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,MAAM,CACV,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CACpD,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAChE,YAAY,CACb,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../../lib/v3/v3.js\";\nimport { v3DynamicTestConfig } from \"./v3.dynamic.config.js\";\nimport { z } from \"zod\";\nimport { closeV3 } from \"./testUtils.js\";\n\ntest.describe(\"V3 hard timeouts\", () => {\n let v3: V3;\n\n test.beforeEach(async () => {\n v3 = new V3(v3DynamicTestConfig);\n await v3.init();\n });\n\n test.afterEach(async () => {\n await closeV3(v3);\n });\n\n test(\"observe() enforces timeoutMs\", async () => {\n // Tiny timeout to force the race to hit the timeout branch\n await expect(v3.observe(\"find something\", { timeout: 5 })).rejects.toThrow(\n /timed out/i,\n );\n });\n\n test(\"extract() enforces timeoutMs\", async () => {\n const schema = z.object({ title: z.string().optional() });\n await expect(\n v3.extract(\"Extract title\", schema, { timeout: 5 }),\n ).rejects.toThrow(/timed out/i);\n });\n\n test(\"act() enforces timeoutMs\", async () => {\n await expect(v3.act(\"do nothing\", { timeout: 5 })).rejects.toThrow(\n /timed out/i,\n );\n });\n});\n"]}
1
+ {"version":3,"file":"timeouts.spec.js","sourceRoot":"","sources":["../../../../tests/integration/timeouts.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../../lib/v3/v3.js\";\nimport { v3DynamicTestConfig } from \"./v3.dynamic.config.js\";\nimport { z } from \"zod\";\nimport { closeV3 } from \"./testUtils.js\";\nimport type { LLMClient } from \"../../lib/v3/llm/LLMClient.js\";\nimport { generateText } from \"ai\";\n\ntype AgentToolNameWithTimeout =\n | \"act\"\n | \"extract\"\n | \"fillForm\"\n | \"ariaTree\"\n | \"click\"\n | \"type\"\n | \"dragAndDrop\"\n | \"clickAndHold\"\n | \"fillFormVision\"\n | \"goto\"\n | \"navback\"\n | \"screenshot\"\n | \"scroll\"\n | \"keys\";\n\ntype ToolTimeoutTestModel = {\n provider: string;\n modelId: string;\n specificationVersion: \"v2\";\n supportedUrls: Record<string, RegExp[]>;\n doGenerate: () => Promise<{\n content: Array<{\n type: \"tool-call\";\n toolCallId: string;\n toolName: string;\n input: string;\n }>;\n finishReason: \"tool-calls\";\n usage: { inputTokens: number; outputTokens: number; totalTokens: number };\n warnings: [];\n }>;\n doStream: (_options: unknown) => Promise<never>;\n};\n\ntype ToolTimeoutTestLLMClient = LLMClient & {\n model: ToolTimeoutTestModel;\n};\n\nfunction createToolTimeoutTestLlmClient(\n toolName: AgentToolNameWithTimeout,\n toolInput: Record<string, unknown>,\n): ToolTimeoutTestLLMClient {\n const usage = {\n prompt_tokens: 0,\n completion_tokens: 0,\n reasoning_tokens: 0,\n cached_input_tokens: 0,\n total_tokens: 0,\n };\n let generateCallCount = 0;\n\n const model: ToolTimeoutTestModel = {\n provider: \"mock\",\n modelId: \"mock/tool-timeout-test\",\n specificationVersion: \"v2\",\n supportedUrls: {},\n doGenerate: async () => {\n generateCallCount += 1;\n if (generateCallCount === 1) {\n return {\n content: [\n {\n type: \"tool-call\",\n toolCallId: \"tool-1\",\n toolName,\n input: JSON.stringify(toolInput),\n },\n ],\n finishReason: \"tool-calls\",\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n warnings: [],\n };\n }\n\n return {\n content: [\n {\n type: \"tool-call\",\n toolCallId: \"done-1\",\n toolName: \"done\",\n input: JSON.stringify({ reasoning: \"done\", taskComplete: true }),\n },\n ],\n finishReason: \"tool-calls\",\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n warnings: [],\n };\n },\n doStream: async () => {\n throw new Error(\"doStream not implemented in timeout test model\");\n },\n };\n\n const llm = {\n type: \"openai\",\n modelName: \"openai/gpt-4.1-mini\",\n hasVision: false,\n clientOptions: {},\n model,\n getLanguageModel: () => model,\n generateText,\n createChatCompletion: async <T = unknown>(options: unknown): Promise<T> => {\n const responseModelName = (\n options as { options?: { response_model?: { name?: string } } }\n )?.options?.response_model?.name;\n\n if (responseModelName === \"act\") {\n return {\n data: {\n elementId: \"1-0\",\n description: \"click body\",\n method: \"click\",\n arguments: [],\n twoStep: false,\n },\n usage,\n } as T;\n }\n if (responseModelName === \"Observation\") {\n return { data: { elements: [] }, usage } as T;\n }\n if (responseModelName === \"Extraction\") {\n return { data: {}, usage } as T;\n }\n if (responseModelName === \"Metadata\") {\n return { data: { completed: true, progress: \"\" }, usage } as T;\n }\n return { data: {}, usage } as T;\n },\n };\n\n return llm as unknown as ToolTimeoutTestLLMClient;\n}\n\nfunction findToolOutput(\n stepEvents: Array<{\n toolCalls?: Array<{ toolName?: string }>;\n toolResults?: Array<{ output?: unknown }>;\n }>,\n toolName: string,\n) {\n for (const event of stepEvents) {\n if (!event.toolCalls || !event.toolResults) continue;\n const toolIndex = event.toolCalls.findIndex(\n (tc) => tc.toolName === toolName,\n );\n if (toolIndex !== -1) {\n return event.toolResults[toolIndex]?.output;\n }\n }\n return undefined;\n}\n\nasync function runAgentToolTimeoutScenario(\n toolName: AgentToolNameWithTimeout,\n toolInput: Record<string, unknown>,\n options?: { mode?: \"dom\" | \"hybrid\" },\n) {\n const llmClient = createToolTimeoutTestLlmClient(toolName, toolInput);\n const stepEvents: Array<{\n toolCalls?: Array<{ toolName?: string }>;\n toolResults?: Array<{ output?: unknown }>;\n }> = [];\n const v3 = new V3({\n ...v3DynamicTestConfig,\n experimental: true,\n llmClient,\n });\n await v3.init();\n try {\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n const agent = v3.agent({\n ...(options?.mode ? { mode: options.mode } : {}),\n });\n await agent.execute({\n instruction: `Use ${toolName} and then finish`,\n maxSteps: 2,\n toolTimeout: 1,\n callbacks: {\n onStepFinish: (event) => {\n stepEvents.push({\n toolCalls: event.toolCalls?.map((tc) => ({\n toolName: tc.toolName,\n })),\n toolResults: event.toolResults?.map((tr) => ({\n output: tr.output,\n })),\n });\n },\n },\n });\n const toolOutput = findToolOutput(stepEvents, toolName);\n if (!toolOutput) {\n throw new Error(`No tool output captured for ${toolName}`);\n }\n return { toolOutput };\n } finally {\n await closeV3(v3);\n }\n}\n\ntest.describe(\"V3 hard timeouts\", () => {\n let v3: V3;\n\n test.beforeEach(async () => {\n v3 = new V3(v3DynamicTestConfig);\n await v3.init();\n });\n\n test.afterEach(async () => {\n await closeV3(v3);\n });\n\n test(\"observe() enforces timeoutMs\", async () => {\n // Tiny timeout to force the race to hit the timeout branch\n await expect(v3.observe(\"find something\", { timeout: 5 })).rejects.toThrow(\n /timed out/i,\n );\n });\n\n test(\"extract() enforces timeoutMs\", async () => {\n const schema = z.object({ title: z.string().optional() });\n await expect(\n v3.extract(\"Extract title\", schema, { timeout: 5 }),\n ).rejects.toThrow(/timed out/i);\n });\n\n test(\"act() enforces timeoutMs\", async () => {\n await expect(v3.act(\"do nothing\", { timeout: 5 })).rejects.toThrow(\n /timed out/i,\n );\n });\n\n test(\"agent toolTimeout enforces timeout for act tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"act\", {\n action: \"click somewhere\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for extract tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"extract\", {\n instruction: \"extract the page title\",\n schema: { type: \"object\", properties: { title: { type: \"string\" } } },\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for fillForm tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"fillForm\", {\n fields: [{ action: \"type hello into name\" }],\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for ariaTree\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"ariaTree\", {});\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for goto tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"goto\", {\n url: \"https://example.com/slow\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for navback tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"navback\", {\n reasoningText: \"going back\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for screenshot tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"screenshot\", {});\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for scroll tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"scroll\", {\n direction: \"down\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for keys tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"keys\", {\n method: \"press\",\n value: \"Enter\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for click tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"click\",\n { describe: \"click element\", coordinates: [100, 100] },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for type tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"type\",\n {\n describe: \"type into field\",\n text: \"hello\",\n coordinates: [100, 100],\n },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for dragAndDrop tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"dragAndDrop\",\n {\n describe: \"drag element\",\n startCoordinates: [100, 100],\n endCoordinates: [200, 200],\n },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for clickAndHold tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"clickAndHold\",\n {\n describe: \"hold element\",\n coordinates: [100, 100],\n duration: 1000,\n },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for fillFormVision tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"fillFormVision\",\n {\n fields: [\n {\n action: \"type hello into name\",\n value: \"hello\",\n coordinates: { x: 100, y: 100 },\n },\n {\n action: \"type world into email\",\n value: \"world\",\n coordinates: { x: 100, y: 200 },\n },\n ],\n },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n});\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,283 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { CaptchaSolver } from "../../lib/v3/agent/utils/captchaSolver.js";
3
+ import { V3AgentHandler } from "../../lib/v3/handlers/v3AgentHandler.js";
4
+ const SOLVING_STARTED = "browserbase-solving-started";
5
+ const SOLVING_FINISHED = "browserbase-solving-finished";
6
+ const SOLVING_ERRORED = "browserbase-solving-errored";
7
+ class MockPage {
8
+ listeners = new Set();
9
+ captchaBoxes = [];
10
+ on(event, listener) {
11
+ if (event === "console") {
12
+ this.listeners.add(listener);
13
+ }
14
+ }
15
+ off(event, listener) {
16
+ if (event === "console") {
17
+ this.listeners.delete(listener);
18
+ }
19
+ }
20
+ emitConsole(text) {
21
+ const message = { text: () => text };
22
+ for (const listener of this.listeners) {
23
+ listener(message);
24
+ }
25
+ }
26
+ url() {
27
+ return "https://example.com";
28
+ }
29
+ async screenshot() {
30
+ return Buffer.from("fake-image");
31
+ }
32
+ async evaluate() {
33
+ return this.captchaBoxes;
34
+ }
35
+ mainFrame() {
36
+ return {
37
+ evaluate: async () => ({ w: 1288, h: 711 }),
38
+ };
39
+ }
40
+ }
41
+ class FakeCuaClient {
42
+ contextNotes = [];
43
+ preStepHook;
44
+ actionHandler;
45
+ executeImpl = vi.fn(async (options) => {
46
+ void options;
47
+ return {
48
+ success: true,
49
+ message: "ok",
50
+ actions: [],
51
+ completed: true,
52
+ };
53
+ });
54
+ captureScreenshot = vi.fn(async () => null);
55
+ setViewport = vi.fn();
56
+ setCurrentUrl = vi.fn();
57
+ setScreenshotProvider = vi.fn();
58
+ setSafetyConfirmationHandler = vi.fn();
59
+ setActionHandler(handler) {
60
+ this.actionHandler = handler;
61
+ }
62
+ setPreStepHook(handler) {
63
+ this.preStepHook = handler;
64
+ }
65
+ addContextNote(note) {
66
+ this.contextNotes.push(note);
67
+ }
68
+ async execute(options) {
69
+ return this.executeImpl(options);
70
+ }
71
+ }
72
+ let fakeCuaClient;
73
+ vi.mock("../../lib/v3/agent/AgentProvider", () => ({
74
+ AgentProvider: class {
75
+ constructor(logger) {
76
+ void logger;
77
+ }
78
+ getClient() {
79
+ return fakeCuaClient;
80
+ }
81
+ },
82
+ }));
83
+ import { V3CuaAgentHandler } from "../../lib/v3/handlers/v3CuaAgentHandler.js";
84
+ function collectUserMessages(messages) {
85
+ return messages.filter((message) => message.role === "user" && typeof message.content === "string");
86
+ }
87
+ describe("agent captcha hooks", () => {
88
+ let page;
89
+ let logs;
90
+ let logger;
91
+ beforeEach(() => {
92
+ page = new MockPage();
93
+ logs = [];
94
+ logger = (line) => {
95
+ logs.push(line);
96
+ };
97
+ fakeCuaClient = new FakeCuaClient();
98
+ });
99
+ it("blocks regular agent prepareStep until the solver finishes and injects one solved message", async () => {
100
+ const handler = new V3AgentHandler({
101
+ isCaptchaAutoSolveEnabled: true,
102
+ }, logger, {});
103
+ const solver = new CaptchaSolver();
104
+ solver.init(async () => page);
105
+ const userCallback = vi.fn(async (options) => options);
106
+ const prepareStep = handler.createPrepareStep(userCallback, solver);
107
+ const options = {
108
+ messages: [{ role: "user", content: "start" }],
109
+ };
110
+ await prepareStep(options);
111
+ page.emitConsole(SOLVING_STARTED);
112
+ const secondCall = prepareStep(options);
113
+ await Promise.resolve();
114
+ expect(userCallback).toHaveBeenCalledTimes(1);
115
+ page.emitConsole(SOLVING_FINISHED);
116
+ await secondCall;
117
+ expect(userCallback).toHaveBeenCalledTimes(2);
118
+ expect(collectUserMessages(options.messages).filter((message) => message.content.includes("automatically detected and solved"))).toHaveLength(1);
119
+ });
120
+ it("injects one error message when the regular agent solver errors", async () => {
121
+ const handler = new V3AgentHandler({
122
+ isCaptchaAutoSolveEnabled: true,
123
+ }, logger, {});
124
+ const solver = new CaptchaSolver();
125
+ solver.init(async () => page);
126
+ const prepareStep = handler.createPrepareStep(undefined, solver);
127
+ const options = {
128
+ messages: [{ role: "user", content: "start" }],
129
+ };
130
+ await prepareStep(options);
131
+ page.emitConsole(SOLVING_STARTED);
132
+ const pending = prepareStep(options);
133
+ page.emitConsole(SOLVING_ERRORED);
134
+ await pending;
135
+ expect(collectUserMessages(options.messages).filter((message) => message.content.includes("automatic captcha solver failed"))).toHaveLength(1);
136
+ });
137
+ it("pauses the CUA loop at prepareStep while Browserbase solves a captcha", async () => {
138
+ let secondPrepareStarted = false;
139
+ fakeCuaClient.executeImpl = vi.fn(async () => {
140
+ await fakeCuaClient.preStepHook?.();
141
+ page.emitConsole(SOLVING_STARTED);
142
+ const blockedPrepare = fakeCuaClient.preStepHook?.() ?? Promise.resolve();
143
+ secondPrepareStarted = true;
144
+ await blockedPrepare;
145
+ return {
146
+ success: true,
147
+ message: "ok",
148
+ actions: [],
149
+ completed: true,
150
+ };
151
+ });
152
+ const handler = new V3CuaAgentHandler({
153
+ context: {
154
+ awaitActivePage: async () => page,
155
+ },
156
+ bus: { emit: vi.fn() },
157
+ isCaptchaAutoSolveEnabled: true,
158
+ isAdvancedStealth: false,
159
+ configuredViewport: { width: 1288, height: 711 },
160
+ isAgentReplayActive: () => false,
161
+ updateMetrics: vi.fn(),
162
+ }, logger, {
163
+ modelName: "anthropic/claude-haiku-4-5-20251001",
164
+ clientOptions: { waitBetweenActions: 1 },
165
+ });
166
+ const execution = handler.execute({
167
+ instruction: "Describe the page briefly.",
168
+ highlightCursor: false,
169
+ });
170
+ await vi.waitFor(() => {
171
+ expect(secondPrepareStarted).toBe(true);
172
+ expect(logs.some((line) => line.message.includes("waiting for Browserbase to solve"))).toBe(true);
173
+ });
174
+ expect(logs.some((line) => line.message.includes("Captcha solved"))).toBe(false);
175
+ page.emitConsole(SOLVING_FINISHED);
176
+ await execution;
177
+ expect(fakeCuaClient.contextNotes).toEqual([
178
+ expect.stringContaining("automatically detected and solved"),
179
+ ]);
180
+ expect(logs.some((line) => line.message.includes("Captcha solved"))).toBe(true);
181
+ });
182
+ it("pauses CUA actions until the captcha solver finishes", async () => {
183
+ let actionStarted = false;
184
+ fakeCuaClient.executeImpl = vi.fn(async () => {
185
+ await fakeCuaClient.preStepHook?.();
186
+ page.emitConsole(SOLVING_STARTED);
187
+ const pendingAction = fakeCuaClient.actionHandler?.({ type: "screenshot" }) ??
188
+ Promise.resolve();
189
+ actionStarted = true;
190
+ await pendingAction;
191
+ return {
192
+ success: true,
193
+ message: "ok",
194
+ actions: [],
195
+ completed: true,
196
+ };
197
+ });
198
+ const handler = new V3CuaAgentHandler({
199
+ context: {
200
+ awaitActivePage: async () => page,
201
+ },
202
+ bus: { emit: vi.fn() },
203
+ isCaptchaAutoSolveEnabled: true,
204
+ isAdvancedStealth: false,
205
+ configuredViewport: { width: 1288, height: 711 },
206
+ isAgentReplayActive: () => false,
207
+ updateMetrics: vi.fn(),
208
+ }, logger, {
209
+ modelName: "anthropic/claude-haiku-4-5-20251001",
210
+ clientOptions: { waitBetweenActions: 1 },
211
+ });
212
+ const executeActionSpy = vi
213
+ .spyOn(handler, "executeAction")
214
+ .mockResolvedValue({ success: true });
215
+ vi.spyOn(handler, "captureAndSendScreenshot").mockResolvedValue(null);
216
+ const execution = handler.execute({
217
+ instruction: "Describe the page briefly.",
218
+ highlightCursor: false,
219
+ });
220
+ await vi.waitFor(() => {
221
+ expect(actionStarted).toBe(true);
222
+ });
223
+ expect(executeActionSpy).not.toHaveBeenCalled();
224
+ page.emitConsole(SOLVING_FINISHED);
225
+ await execution;
226
+ expect(executeActionSpy).toHaveBeenCalledTimes(1);
227
+ expect(fakeCuaClient.contextNotes).toEqual([
228
+ expect.stringContaining("automatically detected and solved"),
229
+ ]);
230
+ expect(logs.some((line) => line.message.includes("Captcha solved"))).toBe(true);
231
+ });
232
+ it("skips post-solve clicks on the captcha widget and injects another note", async () => {
233
+ page.captchaBoxes = [{ left: 0, top: 400, right: 140, bottom: 470 }];
234
+ fakeCuaClient.executeImpl = vi.fn(async () => {
235
+ await fakeCuaClient.preStepHook?.();
236
+ page.emitConsole(SOLVING_STARTED);
237
+ const blockedPrepare = fakeCuaClient.preStepHook?.() ?? Promise.resolve();
238
+ page.emitConsole(SOLVING_FINISHED);
239
+ await blockedPrepare;
240
+ await fakeCuaClient.actionHandler?.({
241
+ type: "click",
242
+ button: "left",
243
+ x: 63,
244
+ y: 436,
245
+ });
246
+ return {
247
+ success: true,
248
+ message: "ok",
249
+ actions: [],
250
+ completed: true,
251
+ };
252
+ });
253
+ const handler = new V3CuaAgentHandler({
254
+ context: {
255
+ awaitActivePage: async () => page,
256
+ },
257
+ bus: { emit: vi.fn() },
258
+ isCaptchaAutoSolveEnabled: true,
259
+ isAdvancedStealth: false,
260
+ configuredViewport: { width: 1288, height: 711 },
261
+ isAgentReplayActive: () => false,
262
+ updateMetrics: vi.fn(),
263
+ }, logger, {
264
+ modelName: "anthropic/claude-haiku-4-5-20251001",
265
+ clientOptions: { waitBetweenActions: 1 },
266
+ });
267
+ const executeActionSpy = vi
268
+ .spyOn(handler, "executeAction")
269
+ .mockResolvedValue({ success: true });
270
+ vi.spyOn(handler, "captureAndSendScreenshot").mockResolvedValue(null);
271
+ await handler.execute({
272
+ instruction: "Describe the page briefly.",
273
+ highlightCursor: false,
274
+ });
275
+ expect(executeActionSpy).not.toHaveBeenCalled();
276
+ expect(fakeCuaClient.contextNotes).toEqual([
277
+ expect.stringContaining("automatically detected and solved"),
278
+ expect.stringContaining("Original task: Describe the page briefly."),
279
+ ]);
280
+ expect(logs.some((line) => line.message.includes("Skipped click on solved captcha widget"))).toBe(true);
281
+ });
282
+ });
283
+ //# sourceMappingURL=agent-captcha-hooks.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-captcha-hooks.test.js","sourceRoot":"","sources":["../../../../tests/unit/agent-captcha-hooks.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAEzE,MAAM,eAAe,GAAG,6BAA6B,CAAC;AACtD,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;AACxD,MAAM,eAAe,GAAG,6BAA6B,CAAC;AAItD,MAAM,QAAQ;IACJ,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;IACxC,YAAY,GAKd,EAAE,CAAC;IAER,EAAE,CAAC,KAAa,EAAE,QAAyB;QACzC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,QAAyB;QAC1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;QACrC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,GAAG;QACD,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,YAAiB,CAAC;IAChC,CAAC;IAED,SAAS;QACP,OAAO;YACL,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;SAC5C,CAAC;IACJ,CAAC;CACF;AAED,MAAM,aAAa;IACV,YAAY,GAAa,EAAE,CAAC;IAC5B,WAAW,CAAuB;IAClC,aAAa,CAAsD;IACnE,WAAW,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,OAAgB,EAAE,EAAE;QACpD,KAAK,OAAO,CAAC;QACb,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,IAAI;SAChB,CAAC;IACJ,CAAC,CAAC,CAAC;IACI,iBAAiB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;IAC5C,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IACtB,aAAa,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IACxB,qBAAqB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAChC,4BAA4B,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAE9C,gBAAgB,CACd,OAA2D;QAE3D,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;IAC/B,CAAC;IAED,cAAc,CAAC,OAA4B;QACzC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;IAC7B,CAAC;IAED,cAAc,CAAC,IAAY;QACzB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAgB;QAM5B,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;CACF;AAED,IAAI,aAA4B,CAAC;AAEjC,EAAE,CAAC,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE,CAAC,CAAC;IACjD,aAAa,EAAE;QACb,YAAY,MAAe;YACzB,KAAK,MAAM,CAAC;QACd,CAAC;QAED,SAAS;YACP,OAAO,aAAa,CAAC;QACvB,CAAC;KACF;CACF,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAE/E,SAAS,mBAAmB,CAC1B,QAAmD;IAEnD,OAAO,QAAQ,CAAC,MAAM,CACpB,CAAC,OAAO,EAAgD,EAAE,CACxD,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CACjE,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,IAAc,CAAC;IACnB,IAAI,IAAe,CAAC;IACpB,IAAI,MAA+B,CAAC;IAEpC,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QACtB,IAAI,GAAG,EAAE,CAAC;QACV,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE;YAChB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC;QACF,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2FAA2F,EAAE,KAAK,IAAI,EAAE;QACzG,MAAM,OAAO,GAAG,IAAI,cAAc,CAChC;YACE,yBAAyB,EAAE,IAAI;SACvB,EACV,MAAM,EACN,EAAW,CACZ,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,IAAa,CAAC,CAAC;QAEvC,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,WAAW,GACf,OAMD,CAAC,iBAAiB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAE1C,MAAM,OAAO,GAAG;YACd,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;SAC/C,CAAC;QAEF,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAElC,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE9C,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;QACnC,MAAM,UAAU,CAAC;QAEjB,MAAM,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CACJ,mBAAmB,CACjB,OAAO,CAAC,QAAqD,CAC9D,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CACnB,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,mCAAmC,CAAC,CAC9D,CACF,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,OAAO,GAAG,IAAI,cAAc,CAChC;YACE,yBAAyB,EAAE,IAAI;SACvB,EACV,MAAM,EACN,EAAW,CACZ,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,IAAa,CAAC,CAAC;QAEvC,MAAM,WAAW,GACf,OAMD,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAEvC,MAAM,OAAO,GAAG;YACd,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;SAC/C,CAAC;QAEF,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAElC,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAClC,MAAM,OAAO,CAAC;QAEd,MAAM,CACJ,mBAAmB,CACjB,OAAO,CAAC,QAAqD,CAC9D,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CACnB,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAC5D,CACF,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,IAAI,oBAAoB,GAAG,KAAK,CAAC;QAEjC,aAAa,CAAC,WAAW,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YAC3C,MAAM,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;YAElC,MAAM,cAAc,GAAG,aAAa,CAAC,WAAW,EAAE,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1E,oBAAoB,GAAG,IAAI,CAAC;YAC5B,MAAM,cAAc,CAAC;YAErB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,EAAE;gBACX,SAAS,EAAE,IAAI;aAChB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CACnC;YACE,OAAO,EAAE;gBACP,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;aAClC;YACD,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;YACtB,yBAAyB,EAAE,IAAI;YAC/B,iBAAiB,EAAE,KAAK;YACxB,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;YAChD,mBAAmB,EAAE,GAAG,EAAE,CAAC,KAAK;YAChC,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;SACd,EACV,MAAM,EACN;YACE,SAAS,EAAE,qCAAqC;YAChD,aAAa,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE;SAChC,CACX,CAAC;QAEF,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;YAChC,WAAW,EAAE,4BAA4B;YACzC,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YACpB,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CACJ,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACjB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAC1D,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CACvE,KAAK,CACN,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;QACnC,MAAM,SAAS,CAAC;QAEhB,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;YACzC,MAAM,CAAC,gBAAgB,CAAC,mCAAmC,CAAC;SAC7D,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CACvE,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,IAAI,aAAa,GAAG,KAAK,CAAC;QAE1B,aAAa,CAAC,WAAW,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YAC3C,MAAM,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;YAElC,MAAM,aAAa,GACjB,aAAa,CAAC,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;gBACrD,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,aAAa,GAAG,IAAI,CAAC;YACrB,MAAM,aAAa,CAAC;YAEpB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,EAAE;gBACX,SAAS,EAAE,IAAI;aAChB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CACnC;YACE,OAAO,EAAE;gBACP,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;aAClC;YACD,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;YACtB,yBAAyB,EAAE,IAAI;YAC/B,iBAAiB,EAAE,KAAK;YACxB,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;YAChD,mBAAmB,EAAE,GAAG,EAAE,CAAC,KAAK;YAChC,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;SACd,EACV,MAAM,EACN;YACE,SAAS,EAAE,qCAAqC;YAChD,aAAa,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE;SAChC,CACX,CAAC;QACF,MAAM,gBAAgB,GAAG,EAAE;aACxB,KAAK,CACJ,OAEC,EACD,eAAe,CAChB;aACA,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEtE,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;YAChC,WAAW,EAAE,4BAA4B;YACzC,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YACpB,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAChD,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;QACnC,MAAM,SAAS,CAAC;QAEhB,MAAM,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;YACzC,MAAM,CAAC,gBAAgB,CAAC,mCAAmC,CAAC;SAC7D,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CACvE,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAErE,aAAa,CAAC,WAAW,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YAC3C,MAAM,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;YAElC,MAAM,cAAc,GAAG,aAAa,CAAC,WAAW,EAAE,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1E,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;YACnC,MAAM,cAAc,CAAC;YAErB,MAAM,aAAa,CAAC,aAAa,EAAE,CAAC;gBAClC,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,MAAM;gBACd,CAAC,EAAE,EAAE;gBACL,CAAC,EAAE,GAAG;aACP,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,EAAE;gBACX,SAAS,EAAE,IAAI;aAChB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,iBAAiB,CACnC;YACE,OAAO,EAAE;gBACP,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;aAClC;YACD,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;YACtB,yBAAyB,EAAE,IAAI;YAC/B,iBAAiB,EAAE,KAAK;YACxB,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;YAChD,mBAAmB,EAAE,GAAG,EAAE,CAAC,KAAK;YAChC,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;SACd,EACV,MAAM,EACN;YACE,SAAS,EAAE,qCAAqC;YAChD,aAAa,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE;SAChC,CACX,CAAC;QACF,MAAM,gBAAgB,GAAG,EAAE;aACxB,KAAK,CACJ,OAEC,EACD,eAAe,CAChB;aACA,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEtE,MAAM,OAAO,CAAC,OAAO,CAAC;YACpB,WAAW,EAAE,4BAA4B;YACzC,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAChD,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;YACzC,MAAM,CAAC,gBAAgB,CAAC,mCAAmC,CAAC;YAC5D,MAAM,CAAC,gBAAgB,CAAC,2CAA2C,CAAC;SACrE,CAAC,CAAC;QACH,MAAM,CACJ,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACjB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,wCAAwC,CAAC,CAChE,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport type { LogLine } from \"../../lib/v3/types/public/logs.js\";\nimport { CaptchaSolver } from \"../../lib/v3/agent/utils/captchaSolver.js\";\nimport { V3AgentHandler } from \"../../lib/v3/handlers/v3AgentHandler.js\";\n\nconst SOLVING_STARTED = \"browserbase-solving-started\";\nconst SOLVING_FINISHED = \"browserbase-solving-finished\";\nconst SOLVING_ERRORED = \"browserbase-solving-errored\";\n\ntype ConsoleListener = (message: { text: () => string }) => void;\n\nclass MockPage {\n private listeners = new Set<ConsoleListener>();\n public captchaBoxes: Array<{\n left: number;\n top: number;\n right: number;\n bottom: number;\n }> = [];\n\n on(event: string, listener: ConsoleListener): void {\n if (event === \"console\") {\n this.listeners.add(listener);\n }\n }\n\n off(event: string, listener: ConsoleListener): void {\n if (event === \"console\") {\n this.listeners.delete(listener);\n }\n }\n\n emitConsole(text: string): void {\n const message = { text: () => text };\n for (const listener of this.listeners) {\n listener(message);\n }\n }\n\n url(): string {\n return \"https://example.com\";\n }\n\n async screenshot(): Promise<Buffer> {\n return Buffer.from(\"fake-image\");\n }\n\n async evaluate<T>(): Promise<T> {\n return this.captchaBoxes as T;\n }\n\n mainFrame(): { evaluate: () => Promise<{ w: number; h: number }> } {\n return {\n evaluate: async () => ({ w: 1288, h: 711 }),\n };\n }\n}\n\nclass FakeCuaClient {\n public contextNotes: string[] = [];\n public preStepHook?: () => Promise<void>;\n public actionHandler?: (action: Record<string, unknown>) => Promise<void>;\n public executeImpl = vi.fn(async (options: unknown) => {\n void options;\n return {\n success: true,\n message: \"ok\",\n actions: [],\n completed: true,\n };\n });\n public captureScreenshot = vi.fn(async () => null);\n public setViewport = vi.fn();\n public setCurrentUrl = vi.fn();\n public setScreenshotProvider = vi.fn();\n public setSafetyConfirmationHandler = vi.fn();\n\n setActionHandler(\n handler: (action: Record<string, unknown>) => Promise<void>,\n ): void {\n this.actionHandler = handler;\n }\n\n setPreStepHook(handler: () => Promise<void>): void {\n this.preStepHook = handler;\n }\n\n addContextNote(note: string): void {\n this.contextNotes.push(note);\n }\n\n async execute(options: unknown): Promise<{\n success: boolean;\n message: string;\n actions: unknown[];\n completed: boolean;\n }> {\n return this.executeImpl(options);\n }\n}\n\nlet fakeCuaClient: FakeCuaClient;\n\nvi.mock(\"../../lib/v3/agent/AgentProvider\", () => ({\n AgentProvider: class {\n constructor(logger: unknown) {\n void logger;\n }\n\n getClient(): FakeCuaClient {\n return fakeCuaClient;\n }\n },\n}));\n\nimport { V3CuaAgentHandler } from \"../../lib/v3/handlers/v3CuaAgentHandler.js\";\n\nfunction collectUserMessages(\n messages: Array<{ role: string; content: unknown }>,\n): Array<{ role: \"user\"; content: string }> {\n return messages.filter(\n (message): message is { role: \"user\"; content: string } =>\n message.role === \"user\" && typeof message.content === \"string\",\n );\n}\n\ndescribe(\"agent captcha hooks\", () => {\n let page: MockPage;\n let logs: LogLine[];\n let logger: (line: LogLine) => void;\n\n beforeEach(() => {\n page = new MockPage();\n logs = [];\n logger = (line) => {\n logs.push(line);\n };\n fakeCuaClient = new FakeCuaClient();\n });\n\n it(\"blocks regular agent prepareStep until the solver finishes and injects one solved message\", async () => {\n const handler = new V3AgentHandler(\n {\n isCaptchaAutoSolveEnabled: true,\n } as never,\n logger,\n {} as never,\n );\n const solver = new CaptchaSolver();\n solver.init(async () => page as never);\n\n const userCallback = vi.fn(async (options) => options);\n const prepareStep = (\n handler as unknown as {\n createPrepareStep: (\n callback?: (options: Record<string, unknown>) => Promise<unknown>,\n captchaSolver?: CaptchaSolver,\n ) => (options: Record<string, unknown>) => Promise<unknown>;\n }\n ).createPrepareStep(userCallback, solver);\n\n const options = {\n messages: [{ role: \"user\", content: \"start\" }],\n };\n\n await prepareStep(options);\n page.emitConsole(SOLVING_STARTED);\n\n const secondCall = prepareStep(options);\n await Promise.resolve();\n expect(userCallback).toHaveBeenCalledTimes(1);\n\n page.emitConsole(SOLVING_FINISHED);\n await secondCall;\n\n expect(userCallback).toHaveBeenCalledTimes(2);\n expect(\n collectUserMessages(\n options.messages as Array<{ role: string; content: unknown }>,\n ).filter((message) =>\n message.content.includes(\"automatically detected and solved\"),\n ),\n ).toHaveLength(1);\n });\n\n it(\"injects one error message when the regular agent solver errors\", async () => {\n const handler = new V3AgentHandler(\n {\n isCaptchaAutoSolveEnabled: true,\n } as never,\n logger,\n {} as never,\n );\n const solver = new CaptchaSolver();\n solver.init(async () => page as never);\n\n const prepareStep = (\n handler as unknown as {\n createPrepareStep: (\n callback?: (options: Record<string, unknown>) => Promise<unknown>,\n captchaSolver?: CaptchaSolver,\n ) => (options: Record<string, unknown>) => Promise<unknown>;\n }\n ).createPrepareStep(undefined, solver);\n\n const options = {\n messages: [{ role: \"user\", content: \"start\" }],\n };\n\n await prepareStep(options);\n page.emitConsole(SOLVING_STARTED);\n\n const pending = prepareStep(options);\n page.emitConsole(SOLVING_ERRORED);\n await pending;\n\n expect(\n collectUserMessages(\n options.messages as Array<{ role: string; content: unknown }>,\n ).filter((message) =>\n message.content.includes(\"automatic captcha solver failed\"),\n ),\n ).toHaveLength(1);\n });\n\n it(\"pauses the CUA loop at prepareStep while Browserbase solves a captcha\", async () => {\n let secondPrepareStarted = false;\n\n fakeCuaClient.executeImpl = vi.fn(async () => {\n await fakeCuaClient.preStepHook?.();\n page.emitConsole(SOLVING_STARTED);\n\n const blockedPrepare = fakeCuaClient.preStepHook?.() ?? Promise.resolve();\n secondPrepareStarted = true;\n await blockedPrepare;\n\n return {\n success: true,\n message: \"ok\",\n actions: [],\n completed: true,\n };\n });\n\n const handler = new V3CuaAgentHandler(\n {\n context: {\n awaitActivePage: async () => page,\n },\n bus: { emit: vi.fn() },\n isCaptchaAutoSolveEnabled: true,\n isAdvancedStealth: false,\n configuredViewport: { width: 1288, height: 711 },\n isAgentReplayActive: () => false,\n updateMetrics: vi.fn(),\n } as never,\n logger,\n {\n modelName: \"anthropic/claude-haiku-4-5-20251001\",\n clientOptions: { waitBetweenActions: 1 },\n } as never,\n );\n\n const execution = handler.execute({\n instruction: \"Describe the page briefly.\",\n highlightCursor: false,\n });\n\n await vi.waitFor(() => {\n expect(secondPrepareStarted).toBe(true);\n expect(\n logs.some((line) =>\n line.message.includes(\"waiting for Browserbase to solve\"),\n ),\n ).toBe(true);\n });\n\n expect(logs.some((line) => line.message.includes(\"Captcha solved\"))).toBe(\n false,\n );\n\n page.emitConsole(SOLVING_FINISHED);\n await execution;\n\n expect(fakeCuaClient.contextNotes).toEqual([\n expect.stringContaining(\"automatically detected and solved\"),\n ]);\n expect(logs.some((line) => line.message.includes(\"Captcha solved\"))).toBe(\n true,\n );\n });\n\n it(\"pauses CUA actions until the captcha solver finishes\", async () => {\n let actionStarted = false;\n\n fakeCuaClient.executeImpl = vi.fn(async () => {\n await fakeCuaClient.preStepHook?.();\n page.emitConsole(SOLVING_STARTED);\n\n const pendingAction =\n fakeCuaClient.actionHandler?.({ type: \"screenshot\" }) ??\n Promise.resolve();\n actionStarted = true;\n await pendingAction;\n\n return {\n success: true,\n message: \"ok\",\n actions: [],\n completed: true,\n };\n });\n\n const handler = new V3CuaAgentHandler(\n {\n context: {\n awaitActivePage: async () => page,\n },\n bus: { emit: vi.fn() },\n isCaptchaAutoSolveEnabled: true,\n isAdvancedStealth: false,\n configuredViewport: { width: 1288, height: 711 },\n isAgentReplayActive: () => false,\n updateMetrics: vi.fn(),\n } as never,\n logger,\n {\n modelName: \"anthropic/claude-haiku-4-5-20251001\",\n clientOptions: { waitBetweenActions: 1 },\n } as never,\n );\n const executeActionSpy = vi\n .spyOn(\n handler as unknown as {\n executeAction: (action: Record<string, unknown>) => Promise<unknown>;\n },\n \"executeAction\",\n )\n .mockResolvedValue({ success: true });\n vi.spyOn(handler, \"captureAndSendScreenshot\").mockResolvedValue(null);\n\n const execution = handler.execute({\n instruction: \"Describe the page briefly.\",\n highlightCursor: false,\n });\n\n await vi.waitFor(() => {\n expect(actionStarted).toBe(true);\n });\n\n expect(executeActionSpy).not.toHaveBeenCalled();\n page.emitConsole(SOLVING_FINISHED);\n await execution;\n\n expect(executeActionSpy).toHaveBeenCalledTimes(1);\n expect(fakeCuaClient.contextNotes).toEqual([\n expect.stringContaining(\"automatically detected and solved\"),\n ]);\n expect(logs.some((line) => line.message.includes(\"Captcha solved\"))).toBe(\n true,\n );\n });\n\n it(\"skips post-solve clicks on the captcha widget and injects another note\", async () => {\n page.captchaBoxes = [{ left: 0, top: 400, right: 140, bottom: 470 }];\n\n fakeCuaClient.executeImpl = vi.fn(async () => {\n await fakeCuaClient.preStepHook?.();\n page.emitConsole(SOLVING_STARTED);\n\n const blockedPrepare = fakeCuaClient.preStepHook?.() ?? Promise.resolve();\n page.emitConsole(SOLVING_FINISHED);\n await blockedPrepare;\n\n await fakeCuaClient.actionHandler?.({\n type: \"click\",\n button: \"left\",\n x: 63,\n y: 436,\n });\n\n return {\n success: true,\n message: \"ok\",\n actions: [],\n completed: true,\n };\n });\n\n const handler = new V3CuaAgentHandler(\n {\n context: {\n awaitActivePage: async () => page,\n },\n bus: { emit: vi.fn() },\n isCaptchaAutoSolveEnabled: true,\n isAdvancedStealth: false,\n configuredViewport: { width: 1288, height: 711 },\n isAgentReplayActive: () => false,\n updateMetrics: vi.fn(),\n } as never,\n logger,\n {\n modelName: \"anthropic/claude-haiku-4-5-20251001\",\n clientOptions: { waitBetweenActions: 1 },\n } as never,\n );\n const executeActionSpy = vi\n .spyOn(\n handler as unknown as {\n executeAction: (action: Record<string, unknown>) => Promise<unknown>;\n },\n \"executeAction\",\n )\n .mockResolvedValue({ success: true });\n vi.spyOn(handler, \"captureAndSendScreenshot\").mockResolvedValue(null);\n\n await handler.execute({\n instruction: \"Describe the page briefly.\",\n highlightCursor: false,\n });\n\n expect(executeActionSpy).not.toHaveBeenCalled();\n expect(fakeCuaClient.contextNotes).toEqual([\n expect.stringContaining(\"automatically detected and solved\"),\n expect.stringContaining(\"Original task: Describe the page briefly.\"),\n ]);\n expect(\n logs.some((line) =>\n line.message.includes(\"Skipped click on solved captcha widget\"),\n ),\n ).toBe(true);\n });\n});\n"]}
@@ -4,7 +4,7 @@ import { extractTool } from "../../lib/v3/agent/tools/extract.js";
4
4
  import { fillFormTool } from "../../lib/v3/agent/tools/fillform.js";
5
5
  /**
6
6
  * Minimal mock of V3 that captures how tools pass `model` options
7
- * into v3.act(), v3.extract(), and v3.observe().
7
+ * into v3.act(), v3.extract(), and v3.observe(), plus observe variables.
8
8
  */
9
9
  function createMockV3() {
10
10
  const calls = [];
@@ -25,7 +25,11 @@ function createMockV3() {
25
25
  return { extraction: "data" };
26
26
  }),
27
27
  observe: vi.fn(async (_instruction, options) => {
28
- calls.push({ method: "observe", model: options?.model });
28
+ calls.push({
29
+ method: "observe",
30
+ model: options?.model,
31
+ variables: options?.variables,
32
+ });
29
33
  return [];
30
34
  }),
31
35
  calls,
@@ -65,7 +69,7 @@ describe("agent tools pass full executionModel config to v3 methods", () => {
65
69
  it("fillFormTool passes AgentModelConfig object to v3.observe()", async () => {
66
70
  const v3 = createMockV3();
67
71
  const tool = fillFormTool(v3, modelConfig);
68
- await tool.execute({ fields: [{ action: "type hello into name", value: "hello" }] }, {
72
+ await tool.execute({ fields: [{ action: "type hello into name" }] }, {
69
73
  toolCallId: "t3",
70
74
  messages: [],
71
75
  abortSignal: new AbortController().signal,
@@ -74,6 +78,24 @@ describe("agent tools pass full executionModel config to v3 methods", () => {
74
78
  expect(v3.calls[0].method).toBe("observe");
75
79
  expect(v3.calls[0].model).toBe(modelConfig);
76
80
  });
81
+ it("fillFormTool passes variables through to v3.observe()", async () => {
82
+ const v3 = createMockV3();
83
+ const variables = {
84
+ username: {
85
+ value: "john@example.com",
86
+ description: "The login email",
87
+ },
88
+ };
89
+ const tool = fillFormTool(v3, undefined, variables);
90
+ await tool.execute({ fields: [{ action: "type %username% into the email field" }] }, {
91
+ toolCallId: "t3-variables",
92
+ messages: [],
93
+ abortSignal: new AbortController().signal,
94
+ });
95
+ expect(v3.calls).toHaveLength(1);
96
+ expect(v3.calls[0].method).toBe("observe");
97
+ expect(v3.calls[0].variables).toBe(variables);
98
+ });
77
99
  it("actTool passes undefined when no executionModel is set", async () => {
78
100
  const v3 = createMockV3();
79
101
  const tool = actTool(v3, undefined);
@@ -1 +1 @@
1
- {"version":3,"file":"agent-execution-model.test.js","sourceRoot":"","sources":["../../../../tests/unit/agent-execution-model.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\nimport { actTool } from \"../../lib/v3/agent/tools/act.js\";\nimport { extractTool } from \"../../lib/v3/agent/tools/extract.js\";\nimport { fillFormTool } from \"../../lib/v3/agent/tools/fillform.js\";\nimport type { V3 } from \"../../lib/v3/v3.js\";\n\n/**\n * Minimal mock of V3 that captures how tools pass `model` options\n * into v3.act(), v3.extract(), and v3.observe().\n */\nfunction createMockV3() {\n const calls: { method: string; model: unknown }[] = [];\n\n const mock = {\n logger: vi.fn(),\n recordAgentReplayStep: vi.fn(),\n act: vi.fn(async (_instruction: unknown, options?: { model?: unknown }) => {\n calls.push({ method: \"act\", model: options?.model });\n return {\n success: true,\n message: \"ok\",\n actionDescription: \"clicked\",\n actions: [],\n };\n }),\n extract: vi.fn(\n async (\n _instruction: unknown,\n _schema: unknown,\n options?: { model?: unknown },\n ) => {\n calls.push({ method: \"extract\", model: options?.model });\n return { extraction: \"data\" };\n },\n ),\n observe: vi.fn(\n async (_instruction: unknown, options?: { model?: unknown }) => {\n calls.push({ method: \"observe\", model: options?.model });\n return [];\n },\n ),\n calls,\n };\n\n return mock as unknown as V3 & { calls: typeof calls };\n}\n\ndescribe(\"agent tools pass full executionModel config to v3 methods\", () => {\n const modelConfig = {\n modelName: \"openai/gpt-4o-mini\",\n apiKey: \"sk-test-key\",\n baseURL: \"https://custom.api\",\n };\n\n it(\"actTool passes AgentModelConfig object to v3.act()\", async () => {\n const v3 = createMockV3();\n const tool = actTool(v3, modelConfig);\n await tool.execute!(\n { action: \"click the button\" },\n {\n toolCallId: \"t1\",\n messages: [],\n abortSignal: new AbortController().signal,\n },\n );\n\n expect(v3.calls).toHaveLength(1);\n expect(v3.calls[0].method).toBe(\"act\");\n expect(v3.calls[0].model).toBe(modelConfig);\n });\n\n it(\"extractTool passes AgentModelConfig object to v3.extract()\", async () => {\n const v3 = createMockV3();\n const tool = extractTool(v3, modelConfig);\n await tool.execute!(\n { instruction: \"get the title\", schema: undefined },\n {\n toolCallId: \"t2\",\n messages: [],\n abortSignal: new AbortController().signal,\n },\n );\n\n expect(v3.calls).toHaveLength(1);\n expect(v3.calls[0].method).toBe(\"extract\");\n expect(v3.calls[0].model).toBe(modelConfig);\n });\n\n it(\"fillFormTool passes AgentModelConfig object to v3.observe()\", async () => {\n const v3 = createMockV3();\n const tool = fillFormTool(v3, modelConfig);\n await tool.execute!(\n { fields: [{ action: \"type hello into name\", value: \"hello\" }] },\n {\n toolCallId: \"t3\",\n messages: [],\n abortSignal: new AbortController().signal,\n },\n );\n\n expect(v3.calls).toHaveLength(1);\n expect(v3.calls[0].method).toBe(\"observe\");\n expect(v3.calls[0].model).toBe(modelConfig);\n });\n\n it(\"actTool passes undefined when no executionModel is set\", async () => {\n const v3 = createMockV3();\n const tool = actTool(v3, undefined);\n await tool.execute!(\n { action: \"click the button\" },\n {\n toolCallId: \"t4\",\n messages: [],\n abortSignal: new AbortController().signal,\n },\n );\n\n expect(v3.calls).toHaveLength(1);\n expect(v3.calls[0].model).toBeUndefined();\n });\n\n it(\"actTool passes plain string executionModel to v3.act()\", async () => {\n const v3 = createMockV3();\n const tool = actTool(v3, \"openai/gpt-4o-mini\");\n await tool.execute!(\n { action: \"click the button\" },\n {\n toolCallId: \"t5\",\n messages: [],\n abortSignal: new AbortController().signal,\n },\n );\n\n expect(v3.calls).toHaveLength(1);\n expect(v3.calls[0].model).toBe(\"openai/gpt-4o-mini\");\n });\n});\n\ndescribe(\"executionModel fallback logic\", () => {\n // This mirrors the resolution in V3.prepareAgentExecution (v3.ts:1682):\n // const resolvedExecutionModel = options?.executionModel ?? options?.model;\n function resolveExecutionModel(options?: {\n executionModel?: string | { modelName: string };\n model?: string | { modelName: string };\n }) {\n return options?.executionModel ?? options?.model;\n }\n\n it(\"prefers explicit executionModel over model\", () => {\n const result = resolveExecutionModel({\n executionModel: \"openai/gpt-4o-mini\",\n model: \"anthropic/claude-sonnet-4-20250514\",\n });\n expect(result).toBe(\"openai/gpt-4o-mini\");\n });\n\n it(\"falls back to model when executionModel is not set\", () => {\n const modelConfig = {\n modelName: \"anthropic/claude-sonnet-4-20250514\",\n apiKey: \"sk-test\",\n };\n const result = resolveExecutionModel({ model: modelConfig });\n expect(result).toBe(modelConfig);\n });\n\n it(\"returns undefined when neither is set\", () => {\n expect(resolveExecutionModel({})).toBeUndefined();\n expect(resolveExecutionModel(undefined)).toBeUndefined();\n });\n});\n"]}
1
+ {"version":3,"file":"agent-execution-model.test.js","sourceRoot":"","sources":["../../../../tests/unit/agent-execution-model.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\nimport { actTool } from \"../../lib/v3/agent/tools/act.js\";\nimport { extractTool } from \"../../lib/v3/agent/tools/extract.js\";\nimport { fillFormTool } from \"../../lib/v3/agent/tools/fillform.js\";\nimport type { V3 } from \"../../lib/v3/v3.js\";\n\n/**\n * Minimal mock of V3 that captures how tools pass `model` options\n * into v3.act(), v3.extract(), and v3.observe(), plus observe variables.\n */\nfunction createMockV3() {\n const calls: { method: string; model: unknown; variables?: unknown }[] = [];\n\n const mock = {\n logger: vi.fn(),\n recordAgentReplayStep: vi.fn(),\n act: vi.fn(async (_instruction: unknown, options?: { model?: unknown }) => {\n calls.push({ method: \"act\", model: options?.model });\n return {\n success: true,\n message: \"ok\",\n actionDescription: \"clicked\",\n actions: [],\n };\n }),\n extract: vi.fn(\n async (\n _instruction: unknown,\n _schema: unknown,\n options?: { model?: unknown },\n ) => {\n calls.push({ method: \"extract\", model: options?.model });\n return { extraction: \"data\" };\n },\n ),\n observe: vi.fn(\n async (\n _instruction: unknown,\n options?: { model?: unknown; variables?: unknown },\n ) => {\n calls.push({\n method: \"observe\",\n model: options?.model,\n variables: options?.variables,\n });\n return [];\n },\n ),\n calls,\n };\n\n return mock as unknown as V3 & { calls: typeof calls };\n}\n\ndescribe(\"agent tools pass full executionModel config to v3 methods\", () => {\n const modelConfig = {\n modelName: \"openai/gpt-4o-mini\",\n apiKey: \"sk-test-key\",\n baseURL: \"https://custom.api\",\n };\n\n it(\"actTool passes AgentModelConfig object to v3.act()\", async () => {\n const v3 = createMockV3();\n const tool = actTool(v3, modelConfig);\n await tool.execute!(\n { action: \"click the button\" },\n {\n toolCallId: \"t1\",\n messages: [],\n abortSignal: new AbortController().signal,\n },\n );\n\n expect(v3.calls).toHaveLength(1);\n expect(v3.calls[0].method).toBe(\"act\");\n expect(v3.calls[0].model).toBe(modelConfig);\n });\n\n it(\"extractTool passes AgentModelConfig object to v3.extract()\", async () => {\n const v3 = createMockV3();\n const tool = extractTool(v3, modelConfig);\n await tool.execute!(\n { instruction: \"get the title\", schema: undefined },\n {\n toolCallId: \"t2\",\n messages: [],\n abortSignal: new AbortController().signal,\n },\n );\n\n expect(v3.calls).toHaveLength(1);\n expect(v3.calls[0].method).toBe(\"extract\");\n expect(v3.calls[0].model).toBe(modelConfig);\n });\n\n it(\"fillFormTool passes AgentModelConfig object to v3.observe()\", async () => {\n const v3 = createMockV3();\n const tool = fillFormTool(v3, modelConfig);\n await tool.execute!(\n { fields: [{ action: \"type hello into name\" }] },\n {\n toolCallId: \"t3\",\n messages: [],\n abortSignal: new AbortController().signal,\n },\n );\n\n expect(v3.calls).toHaveLength(1);\n expect(v3.calls[0].method).toBe(\"observe\");\n expect(v3.calls[0].model).toBe(modelConfig);\n });\n\n it(\"fillFormTool passes variables through to v3.observe()\", async () => {\n const v3 = createMockV3();\n const variables = {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n };\n const tool = fillFormTool(v3, undefined, variables);\n await tool.execute!(\n { fields: [{ action: \"type %username% into the email field\" }] },\n {\n toolCallId: \"t3-variables\",\n messages: [],\n abortSignal: new AbortController().signal,\n },\n );\n\n expect(v3.calls).toHaveLength(1);\n expect(v3.calls[0].method).toBe(\"observe\");\n expect(v3.calls[0].variables).toBe(variables);\n });\n\n it(\"actTool passes undefined when no executionModel is set\", async () => {\n const v3 = createMockV3();\n const tool = actTool(v3, undefined);\n await tool.execute!(\n { action: \"click the button\" },\n {\n toolCallId: \"t4\",\n messages: [],\n abortSignal: new AbortController().signal,\n },\n );\n\n expect(v3.calls).toHaveLength(1);\n expect(v3.calls[0].model).toBeUndefined();\n });\n\n it(\"actTool passes plain string executionModel to v3.act()\", async () => {\n const v3 = createMockV3();\n const tool = actTool(v3, \"openai/gpt-4o-mini\");\n await tool.execute!(\n { action: \"click the button\" },\n {\n toolCallId: \"t5\",\n messages: [],\n abortSignal: new AbortController().signal,\n },\n );\n\n expect(v3.calls).toHaveLength(1);\n expect(v3.calls[0].model).toBe(\"openai/gpt-4o-mini\");\n });\n});\n\ndescribe(\"executionModel fallback logic\", () => {\n // This mirrors the resolution in V3.prepareAgentExecution (v3.ts:1682):\n // const resolvedExecutionModel = options?.executionModel ?? options?.model;\n function resolveExecutionModel(options?: {\n executionModel?: string | { modelName: string };\n model?: string | { modelName: string };\n }) {\n return options?.executionModel ?? options?.model;\n }\n\n it(\"prefers explicit executionModel over model\", () => {\n const result = resolveExecutionModel({\n executionModel: \"openai/gpt-4o-mini\",\n model: \"anthropic/claude-sonnet-4-20250514\",\n });\n expect(result).toBe(\"openai/gpt-4o-mini\");\n });\n\n it(\"falls back to model when executionModel is not set\", () => {\n const modelConfig = {\n modelName: \"anthropic/claude-sonnet-4-20250514\",\n apiKey: \"sk-test\",\n };\n const result = resolveExecutionModel({ model: modelConfig });\n expect(result).toBe(modelConfig);\n });\n\n it(\"returns undefined when neither is set\", () => {\n expect(resolveExecutionModel({})).toBeUndefined();\n expect(resolveExecutionModel(undefined)).toBeUndefined();\n });\n});\n"]}
@@ -0,0 +1,21 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { buildAgentSystemPrompt } from "../../lib/v3/agent/prompts/agentSystemPrompt.js";
3
+ describe("buildAgentSystemPrompt variables", () => {
4
+ it("includes variable descriptions when present", () => {
5
+ const prompt = buildAgentSystemPrompt({
6
+ url: "https://example.com",
7
+ executionInstruction: "Fill the form",
8
+ mode: "dom",
9
+ variables: {
10
+ username: {
11
+ value: "john@example.com",
12
+ description: "The login email",
13
+ },
14
+ password: "secret123",
15
+ },
16
+ });
17
+ expect(prompt).toContain('<variable name="username">The login email</variable>');
18
+ expect(prompt).toContain('<variable name="password" />');
19
+ });
20
+ });
21
+ //# sourceMappingURL=agent-system-prompt-variables.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-system-prompt-variables.test.js","sourceRoot":"","sources":["../../../../tests/unit/agent-system-prompt-variables.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAC;AAEzF,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,sBAAsB,CAAC;YACpC,GAAG,EAAE,qBAAqB;YAC1B,oBAAoB,EAAE,eAAe;YACrC,IAAI,EAAE,KAAK;YACX,SAAS,EAAE;gBACT,QAAQ,EAAE;oBACR,KAAK,EAAE,kBAAkB;oBACzB,WAAW,EAAE,iBAAiB;iBAC/B;gBACD,QAAQ,EAAE,WAAW;aACtB;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CACtB,sDAAsD,CACvD,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { buildAgentSystemPrompt } from \"../../lib/v3/agent/prompts/agentSystemPrompt.js\";\n\ndescribe(\"buildAgentSystemPrompt variables\", () => {\n it(\"includes variable descriptions when present\", () => {\n const prompt = buildAgentSystemPrompt({\n url: \"https://example.com\",\n executionInstruction: \"Fill the form\",\n mode: \"dom\",\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret123\",\n },\n });\n\n expect(prompt).toContain(\n '<variable name=\"username\">The login email</variable>',\n );\n expect(prompt).toContain('<variable name=\"password\" />');\n });\n});\n"]}